From 1ae59a6f9ab3cff347dc78a70c1005f0e6ede5b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Tr=C3=B6ger?= Date: Wed, 21 Jun 2006 23:15:54 +0000 Subject: [PATCH] Updated Scintilla to version 1.70. git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@471 ea778897-0a13-0410-b9d1-a72fbfd435f5 --- ChangeLog | 1 + scintilla/Converter.h | 15 +- scintilla/Editor.cxx | 278 ++++++++++-------- scintilla/Editor.h | 10 +- scintilla/LexBash.cxx | 2 +- scintilla/LexHTML.cxx | 2 +- scintilla/LexSQL.cxx | 24 +- scintilla/LexTCL.cxx | 241 ++++++++------- scintilla/LineMarker.h | 4 + scintilla/PlatGTK.cxx | 78 +++-- scintilla/ScintillaBase.cxx | 2 +- scintilla/ScintillaGTK.cxx | 439 ++++++++++++++++------------ scintilla/ViewStyle.cxx | 14 +- scintilla/ViewStyle.h | 5 +- scintilla/include/HFacer.py | 10 +- scintilla/include/SciLexer.h | 15 +- scintilla/include/Scintilla.h | 5 + scintilla/include/ScintillaWidget.h | 4 + 18 files changed, 662 insertions(+), 487 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30744062..f427be3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ Added option in the preferences dialog to replace tabs by spaces when saving a file. Added option for default encoding for new files. + * scintilla/*: Updated Scintilla to version 1.70. 2006-06-20 Nick Treleaven diff --git a/scintilla/Converter.h b/scintilla/Converter.h index 09f213a6..7dc2e687 100644 --- a/scintilla/Converter.h +++ b/scintilla/Converter.h @@ -27,9 +27,9 @@ public: Converter() { iconvh = iconvhBad; } - Converter(const char *charSetDestination, const char *charSetSource) { + Converter(const char *charSetDestination, const char *charSetSource, bool transliterations) { iconvh = iconvhBad; - Open(charSetDestination, charSetSource); + Open(charSetDestination, charSetSource, transliterations); } ~Converter() { Close(); @@ -37,13 +37,18 @@ public: operator bool() const { return iconvh != iconvhBad; } - void Open(const char *charSetDestination, const char *charSetSource) { + void Open(const char *charSetDestination, const char *charSetSource, bool transliterations=true) { Close(); if (*charSetSource) { + char fullDest[200]; + strcpy(fullDest, charSetDestination); + if (transliterations) { + strcat(fullDest, "//TRANSLIT"); + } #if GTK_MAJOR_VERSION >= 2 - iconvh = g_iconv_open(charSetDestination, charSetSource); + iconvh = g_iconv_open(fullDest, charSetSource); #else - iconvh = iconv_open(charSetDestination, charSetSource); + iconvh = iconv_open(fullDest, charSetSource); #endif } } diff --git a/scintilla/Editor.cxx b/scintilla/Editor.cxx index 9df8b2e8..87a0391b 100644 --- a/scintilla/Editor.cxx +++ b/scintilla/Editor.cxx @@ -285,7 +285,7 @@ LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChar } else if (level == llcPage) { if (lineNumber == lineCaret) { pos = 0; - } else { + } else if (length > 1) { pos = 1 + (lineNumber % (length - 1)); } } else if (level == llcDocument) { @@ -328,7 +328,7 @@ void LineLayoutCache::Dispose(LineLayout *ll) { delete ll; } else { useCount--; - } + } } } @@ -429,9 +429,8 @@ Editor::Editor() { wrapState = eWrapNone; wrapWidth = LineLayout::wrapWidthInfinite; - docLineLastWrapped = -1; - docLastLineToWrap = -1; - backgroundWrapEnabled = true; + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; wrapVisualFlags = 0; wrapVisualFlagsLocation = 0; wrapVisualStartIndent = 0; @@ -1487,29 +1486,18 @@ void Editor::InvalidateCaret() { void Editor::UpdateSystemCaret() { } -void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) { - docLineStartWrapping = Platform::Minimum(docLineStartWrapping, pdoc->LinesTotal()-1); - docLineEndWrapping = Platform::Minimum(docLineEndWrapping, pdoc->LinesTotal()-1); - bool noWrap = (docLastLineToWrap == docLineLastWrapped); - if (docLineLastWrapped > (docLineStartWrapping - 1)) { - docLineLastWrapped = docLineStartWrapping - 1; - if (docLineLastWrapped < -1) - docLineLastWrapped = -1; +void Editor::NeedWrapping(int docLineStart, int docLineEnd) { + docLineStart = Platform::Clamp(docLineStart, 0, pdoc->LinesTotal()); + if (wrapStart > docLineStart) { + wrapStart = docLineStart; llc.Invalidate(LineLayout::llPositions); } - if (noWrap) { - docLastLineToWrap = docLineEndWrapping; - } else if (docLastLineToWrap < docLineEndWrapping) { - docLastLineToWrap = docLineEndWrapping + 1; + if (wrapEnd < docLineEnd) { + wrapEnd = docLineEnd; } - if (docLastLineToWrap < -1) - docLastLineToWrap = -1; - if (docLastLineToWrap >= pdoc->LinesTotal()) - docLastLineToWrap = pdoc->LinesTotal()-1; + wrapEnd = Platform::Clamp(wrapEnd, 0, pdoc->LinesTotal()); // Wrap lines during idle. - if ((wrapState != eWrapNone) && - backgroundWrapEnabled && - (docLastLineToWrap != docLineLastWrapped)) { + if ((wrapState != eWrapNone) && (wrapEnd != wrapStart)) { SetIdle(true); } } @@ -1518,33 +1506,33 @@ void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) { // fullwrap: if true, all lines which need wrapping will be done, // in this single call. // priorityWrapLineStart: If greater than zero, all lines starting from -// here to 100 lines past will be wrapped (even if there are +// here to 1 page + 100 lines past will be wrapped (even if there are // more lines under wrapping process in idle). -// If it is neither fullwrap, nor priorityWrap, then 100 lines will be +// If it is neither fullwrap, nor priorityWrap, then 1 page + 100 lines will be // wrapped, if there are any wrapping going on in idle. (Generally this // condition is called only from idler). // Return true if wrapping occurred. bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) { // If there are any pending wraps, do them during idle if possible. + int linesInOneCall = LinesOnScreen() + 100; if (wrapState != eWrapNone) { - if (docLineLastWrapped < docLastLineToWrap) { - if (!(backgroundWrapEnabled && SetIdle(true))) { - // Background wrapping is disabled, or idle processing - // not supported. A full wrap is required. + if (wrapStart < wrapEnd) { + if (!SetIdle(true)) { + // Idle processing not supported so full wrap required. fullWrap = true; } } if (!fullWrap && priorityWrapLineStart >= 0 && // .. and if the paint window is outside pending wraps - (((priorityWrapLineStart + 100) < docLineLastWrapped) || - (priorityWrapLineStart > docLastLineToWrap))) { + (((priorityWrapLineStart + linesInOneCall) < wrapStart) || + (priorityWrapLineStart > wrapEnd))) { // No priority wrap pending return false; } } int goodTopLine = topLine; bool wrapOccurred = false; - if (docLineLastWrapped < pdoc->LinesTotal()) { + if (wrapStart <= pdoc->LinesTotal()) { if (wrapState == eWrapNone) { if (wrapWidth != LineLayout::wrapWidthInfinite) { wrapWidth = LineLayout::wrapWidthInfinite; @@ -1553,8 +1541,11 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) { } wrapOccurred = true; } - docLineLastWrapped = 0x7ffffff; + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; } else { + if (wrapEnd >= pdoc->LinesTotal()) + wrapEnd = pdoc->LinesTotal(); //ElapsedTime et; int lineDocTop = cs.DocFromDisplay(topLine); int subLineTop = topLine - cs.DisplayFromDoc(lineDocTop); @@ -1568,44 +1559,42 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) { AutoSurface surface(this); if (surface) { bool priorityWrap = false; - int lastLineToWrap = docLastLineToWrap; - int firstLineToWrap = docLineLastWrapped; + int lastLineToWrap = wrapEnd; + int lineToWrap = wrapStart; if (!fullWrap) { if (priorityWrapLineStart >= 0) { // This is a priority wrap. - firstLineToWrap = priorityWrapLineStart; - lastLineToWrap = firstLineToWrap + 100; + lineToWrap = priorityWrapLineStart; + lastLineToWrap = priorityWrapLineStart + linesInOneCall; priorityWrap = true; } else { // This is idle wrap. - lastLineToWrap = docLineLastWrapped + 100; + lastLineToWrap = wrapStart + linesInOneCall; } - if (lastLineToWrap >= docLastLineToWrap) - lastLineToWrap = docLastLineToWrap; + if (lastLineToWrap >= wrapEnd) + lastLineToWrap = wrapEnd; } // else do a fullWrap. - // printf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, firstLineToWrap, lastLineToWrap); - // printf("Pending wraps: %d to %d\n", docLineLastWrapped, docLastLineToWrap); - while (firstLineToWrap < lastLineToWrap) { - firstLineToWrap++; - if (!priorityWrap) - docLineLastWrapped++; - if (firstLineToWrap < pdoc->LinesTotal()) { - AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap)); + // Platform::DebugPrintf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, lineToWrap, lastLineToWrap); + // Platform::DebugPrintf("Pending wraps: %d to %d\n", wrapStart, wrapEnd); + while (lineToWrap < lastLineToWrap) { + AutoLineLayout ll(llc, RetrieveLineLayout(lineToWrap)); int linesWrapped = 1; if (ll) { - LayoutLine(firstLineToWrap, surface, vs, ll, wrapWidth); + LayoutLine(lineToWrap, surface, vs, ll, wrapWidth); linesWrapped = ll->lines; } - if (cs.SetHeight(firstLineToWrap, linesWrapped)) { + if (cs.SetHeight(lineToWrap, linesWrapped)) { wrapOccurred = true; - } } + lineToWrap++; } + if (!priorityWrap) + wrapStart = lineToWrap; // If wrapping is done, bring it to resting position - if (docLineLastWrapped > docLastLineToWrap) { - docLineLastWrapped = -1; - docLastLineToWrap = -1; + if (wrapStart >= wrapEnd) { + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; } } goodTopLine = cs.DisplayFromDoc(lineDocTop); @@ -1721,7 +1710,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { rcSelMargin.left = rcSelMargin.right; rcSelMargin.right = rcSelMargin.left + vs.ms[margin].width; - if (vs.ms[margin].symbol) { + if (vs.ms[margin].style != SC_MARGIN_NUMBER) { /* alternate scheme: if (vs.ms[margin].mask & SC_MASK_FOLDERS) surface->FillRectangle(rcSelMargin, vs.styles[STYLE_DEFAULT].back.allocated); @@ -1732,8 +1721,21 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { if (vs.ms[margin].mask & SC_MASK_FOLDERS) // Required because of special way brush is created for selection margin surface->FillRectangle(rcSelMargin, *pixmapSelPattern); - else - surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated); + else { + ColourAllocated colour; + switch (vs.ms[margin].style) { + case SC_MARGIN_BACK: + colour = vs.styles[STYLE_DEFAULT].back.allocated; + break; + case SC_MARGIN_FORE: + colour = vs.styles[STYLE_DEFAULT].fore.allocated; + break; + default: + colour = vs.styles[STYLE_LINENUMBER].back.allocated; + break; + } + surface->FillRectangle(rcSelMargin, colour); + } } else { surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated); } @@ -1840,7 +1842,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { PRectangle rcMarker = rcSelMargin; rcMarker.top = yposScreen; rcMarker.bottom = yposScreen + vs.lineHeight; - if (!vs.ms[margin].symbol) { + if (vs.ms[margin].style == SC_MARGIN_NUMBER) { char number[100]; number[0] = '\0'; if (firstSubLine) @@ -2131,7 +2133,7 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou continue; } if (p > 0) { - if (wrapState == eWrapChar){ + if (wrapState == eWrapChar) { lastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1) - posLineStart; p = pdoc->MovePositionOutsideChar(p + 1 + posLineStart, 1) - posLineStart; @@ -2150,14 +2152,15 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou } } +ColourAllocated Editor::SelectionBackground(ViewStyle &vsDraw) { + return primarySelection ? vsDraw.selbackground.allocated : vsDraw.selbackground2.allocated; +} + ColourAllocated Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) { if (inSelection) { - if (vsDraw.selbackset) { - if (primarySelection) - return vsDraw.selbackground.allocated; - else - return vsDraw.selbackground2.allocated; + if (vsDraw.selbackset && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) { + return SelectionBackground(vsDraw); } } else { if ((vsDraw.edgeState == EDGE_BACKGROUND) && @@ -2209,7 +2212,7 @@ void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace, surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative); } }; - Relative rel = {surface, x0, xStraight?1:-1, y0, yStraight?1:-1}; + Relative rel = {surface, x0, xStraight ? 1 : -1, y0, yStraight ? 1 : -1}; // arrow head rel.MoveTo(xa, y); @@ -2225,6 +2228,12 @@ void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace, y - 2 * dy); } +static void SimpleAlphaRectangle(Surface *surface, PRectangle rc, ColourAllocated fill, int alpha) { + if (alpha != SC_ALPHA_NOALPHA) { + surface->AlphaRectangle(rc, 0, fill, alpha, fill, alpha, 0); + } +} + void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll, int line, int lineEnd, int xStart, int subLine, int subLineStart, bool overrideBackground, ColourAllocated background, @@ -2241,15 +2250,17 @@ void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, Lin bool eolInSelection = (subLine == (ll->lines - 1)) && (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd); - if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) { - if (primarySelection) - surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated); - else - surface->FillRectangle(rcSegment, vsDraw.selbackground2.allocated); - } else if (overrideBackground) { - surface->FillRectangle(rcSegment, background); + if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) { + surface->FillRectangle(rcSegment, SelectionBackground(vsDraw)); } else { - surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + if (overrideBackground) { + surface->FillRectangle(rcSegment, background); + } else { + surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + } + if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha != SC_ALPHA_NOALPHA)) { + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha); + } } rcSegment.left = xEol + vsDraw.aveCharWidth + xStart; @@ -2302,7 +2313,8 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis if (!overrideBackground) { int marks = pdoc->GetMark(line); for (int markBit = 0; (markBit < 32) && marks; markBit++) { - if ((marks & 1) && vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) && + (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { background = vsDraw.markers[markBit].back.allocated; overrideBackground = true; } @@ -2311,14 +2323,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis } if (!overrideBackground) { if (vsDraw.maskInLine) { - int marks = pdoc->GetMark(line) & vsDraw.maskInLine; - if (marks) { - for (int markBit = 0; (markBit < 32) && marks; markBit++) { - if ((marks & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) { + int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine; + if (marksMasked) { + for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) { + if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY) && + (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { overrideBackground = true; background = vsDraw.markers[markBit].back.allocated; } - marks >>= 1; + marksMasked >>= 1; } } } @@ -2646,6 +2659,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis xStart, subLine, subLineStart, overrideBackground, background, drawWrapMarkEnd, vsDraw.whitespaceForeground.allocated); } + if ((vsDraw.selAlpha != SC_ALPHA_NOALPHA) && (ll->selStart >= 0) && (ll->selEnd >= 0)) { + int startPosSel = (ll->selStart < posLineStart) ? posLineStart : ll->selStart; + int endPosSel = (ll->selEnd < (lineEnd + posLineStart)) ? ll->selEnd : (lineEnd + posLineStart); + if (startPosSel < endPosSel) { + rcSegment.left = xStart + ll->positions[startPosSel - posLineStart] - subLineStart; + rcSegment.right = xStart + ll->positions[endPosSel - posLineStart] - subLineStart; + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha); + } + } if (vsDraw.edgeState == EDGE_LINE) { int edgeX = theEdge * vsDraw.spaceWidth; @@ -2654,11 +2676,29 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis surface->FillRectangle(rcSegment, vsDraw.edgecolour.allocated); } - if (caret.active && vsDraw.showCaretLineBackground && (vsDraw.caretLineAlpha != SC_ALPHA_NOALPHA) && ll->containsCaret) { - rcSegment.left = xStart; - rcSegment.right = rcLine.right - 1; - surface->AlphaRectangle(rcSegment, 0, vsDraw.caretLineBackground.allocated, vsDraw.caretLineAlpha, - vsDraw.caretLineBackground.allocated, vsDraw.caretLineAlpha, 0); + // Draw any translucent whole line states + rcSegment.left = xStart; + rcSegment.right = rcLine.right - 1; + if (caret.active && vsDraw.showCaretLineBackground && ll->containsCaret) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.caretLineBackground.allocated, vsDraw.caretLineAlpha); + } + int marks = pdoc->GetMark(line); + for (int markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); + } + marks >>= 1; + } + if (vsDraw.maskInLine) { + int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine; + if (marksMasked) { + for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) { + if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); + } + marksMasked >>= 1; + } + } } } @@ -3076,7 +3116,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) { // Printing supports only the line number margin. int lineNumberIndex = -1; for (int margin = 0; margin < ViewStyle::margins; margin++) { - if ((!vsPrint.ms[margin].symbol) && (vsPrint.ms[margin].width > 0)) { + if ((vsPrint.ms[margin].style == SC_MARGIN_NUMBER) && (vsPrint.ms[margin].width > 0)) { lineNumberIndex = margin; } else { vsPrint.ms[margin].width = 0; @@ -3089,6 +3129,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) { // Don't show the selection when printing vsPrint.selbackset = false; vsPrint.selforeset = false; + vsPrint.selAlpha = SC_ALPHA_NOALPHA; vsPrint.whitespaceBackgroundSet = false; vsPrint.whitespaceForegroundSet = false; vsPrint.showCaretLineBackground = false; @@ -3675,19 +3716,8 @@ void Editor::CheckModificationForWrap(DocModification mh) { llc.Invalidate(LineLayout::llCheckTextAndStyle); if (wrapState != eWrapNone) { int lineDoc = pdoc->LineFromPosition(mh.position); - if (mh.linesAdded <= 0) { - AutoSurface surface(this); - AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); - if (surface && ll) { - LayoutLine(lineDoc, surface, vs, ll, wrapWidth); - if (cs.GetHeight(lineDoc) != ll->lines) { - NeedWrapping(lineDoc - 1, lineDoc + 1); - Redraw(); - } - } - } else { - NeedWrapping(lineDoc, lineDoc + 1 + mh.linesAdded); - } + int lines = Platform::Maximum(0, mh.linesAdded); + NeedWrapping(lineDoc, lineDoc + lines + 1); } } } @@ -3730,6 +3760,7 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) { InvalidateRange(mh.position, mh.position + mh.length); } } + llc.Invalidate(LineLayout::llCheckTextAndStyle); } else { // Move selection and brace highlights if (mh.modificationType & SC_MOD_INSERTTEXT) { @@ -4846,7 +4877,7 @@ void Editor::CopySelectionRange(SelectionText *ss) { text[size] = '\0'; } } - ss->Set(text, size + 1, pdoc->dbcsCodePage, + ss->Set(text, size + 1, pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, selType == selRectangle); } } @@ -5390,13 +5421,13 @@ bool Editor::Idle() { bool idleDone; - bool wrappingDone = (wrapState == eWrapNone) || (!backgroundWrapEnabled); + bool wrappingDone = wrapState == eWrapNone; if (!wrappingDone) { // Wrap lines during idle. WrapLines(false, -1); // No more wrapping - if (docLineLastWrapped == docLastLineToWrap) + if (wrapStart == wrapEnd) wrappingDone = true; } @@ -6318,16 +6349,16 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return pdoc->ExtendWordSelect(wParam, 1, lParam != 0); case SCI_SETWRAPMODE: - switch(wParam){ - case SC_WRAP_WORD: - wrapState = eWrapWord; - break; - case SC_WRAP_CHAR: - wrapState = eWrapChar; - break; - default: - wrapState = eWrapNone; - break; + switch (wParam) { + case SC_WRAP_WORD: + wrapState = eWrapWord; + break; + case SC_WRAP_CHAR: + wrapState = eWrapChar; + break; + default: + wrapState = eWrapNone; + break; } xOffset = 0; InvalidateStyleRedraw(); @@ -6478,8 +6509,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return pdoc->LineEnd(wParam); case SCI_SETCODEPAGE: - pdoc->dbcsCodePage = wParam; - InvalidateStyleRedraw(); + if (ValidCodePage(wParam)) { + pdoc->dbcsCodePage = wParam; + InvalidateStyleRedraw(); + } break; case SCI_GETCODEPAGE: @@ -6512,6 +6545,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { InvalidateStyleData(); RedrawSelMargin(); break; + case SCI_MARKERSETALPHA: + if (wParam <= MARKER_MAX) + vs.markers[wParam].alpha = lParam; + InvalidateStyleRedraw(); + break; case SCI_MARKERADD: { int markerID = pdoc->AddMark(wParam, lParam); return markerID; @@ -6559,14 +6597,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_SETMARGINTYPEN: if (ValidMargin(wParam)) { - vs.ms[wParam].symbol = (lParam == SC_MARGIN_SYMBOL); + vs.ms[wParam].style = lParam; InvalidateStyleRedraw(); } break; case SCI_GETMARGINTYPEN: if (ValidMargin(wParam)) - return vs.ms[wParam].symbol ? SC_MARGIN_SYMBOL : SC_MARGIN_NUMBER; + return vs.ms[wParam].style; else return 0; @@ -6850,6 +6888,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { InvalidateStyleRedraw(); break; + case SCI_SETSELALPHA: + vs.selAlpha = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETSELALPHA: + return vs.selAlpha; + case SCI_SETWHITESPACEFORE: vs.whitespaceForegroundSet = wParam != 0; vs.whitespaceForeground.desired = ColourDesired(lParam); diff --git a/scintilla/Editor.h b/scintilla/Editor.h index 9243d3a2..fe7be268 100644 --- a/scintilla/Editor.h +++ b/scintilla/Editor.h @@ -305,10 +305,10 @@ protected: // ScintillaBase subclass needs access to much of Editor // Wrapping support enum { eWrapNone, eWrapWord, eWrapChar } wrapState; - bool backgroundWrapEnabled; + enum { wrapLineLarge = 0x7ffffff }; int wrapWidth; - int docLineLastWrapped; - int docLastLineToWrap; + int wrapStart; + int wrapEnd; int wrapVisualFlags; int wrapVisualFlagsLocation; int wrapVisualStartIndent; @@ -377,7 +377,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void InvalidateCaret(); virtual void UpdateSystemCaret(); - void NeedWrapping(int docLineStartWrapping = 0, int docLineEndWrapping = 0x7ffffff); + void NeedWrapping(int docLineStart = 0, int docLineEnd = wrapLineLarge); bool WrapLines(bool fullWrap, int priorityWrapLineStart); void LinesJoin(); void LinesSplit(int pixelWidth); @@ -387,6 +387,7 @@ protected: // ScintillaBase subclass needs access to much of Editor LineLayout *RetrieveLineLayout(int lineNumber); void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width=LineLayout::wrapWidthInfinite); + ColourAllocated SelectionBackground(ViewStyle &vsDraw); ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll); void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight); void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourAllocated wrapColour); @@ -524,6 +525,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void GetHotSpotRange(int& hsStart, int& hsEnd); int CodePage() const; + virtual bool ValidCodePage(int /* codePage */) const { return true; } int WrapCount(int line); virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0; diff --git a/scintilla/LexBash.cxx b/scintilla/LexBash.cxx index fdbad440..e9c31d6b 100644 --- a/scintilla/LexBash.cxx +++ b/scintilla/LexBash.cxx @@ -259,7 +259,7 @@ static void ColouriseBashDoc(unsigned int startPos, int length, int initStyle, if (state == SCE_SH_DEFAULT) { if (ch == '\\') { // escaped character if (i < lengthDoc - 1) - i++; + i++; ch = chNext; chNext = chNext2; styler.ColourTo(i, SCE_SH_IDENTIFIER); diff --git a/scintilla/LexHTML.cxx b/scintilla/LexHTML.cxx index 95b78476..dad8fce4 100644 --- a/scintilla/LexHTML.cxx +++ b/scintilla/LexHTML.cxx @@ -687,7 +687,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty (ch == '<') && (chNext == '?') && !IsScriptCommentState(state) ) { - scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP); + scriptLanguage = segIsScriptingIndicator(styler, i + 2, i + 10, eScriptPHP); if (scriptLanguage != eScriptPHP && isStringState(state)) continue; styler.ColourTo(i - 1, StateToPrint); beforePreProc = state; diff --git a/scintilla/LexSQL.cxx b/scintilla/LexSQL.cxx index 19d81ebc..d8e14b9e 100644 --- a/scintilla/LexSQL.cxx +++ b/scintilla/LexSQL.cxx @@ -60,27 +60,7 @@ static void ColouriseSQLDoc(unsigned int startPos, int length, int initStyle, Wo bool sqlBackslashEscapes = styler.GetPropertyInt("sql.backslash.escapes", 0) != 0; bool sqlBackticksIdentifier = styler.GetPropertyInt("lexer.sql.backticks.identifier", 0) != 0; int styleBeforeDCKeyword = SCE_SQL_DEFAULT; - bool fold = styler.GetPropertyInt("fold") != 0; - int lineCurrent = styler.GetLine(startPos); - for (; sc.More(); sc.Forward()) { - // Fold based on indentation - if (sc.atLineStart) { - int spaceFlags = 0; - int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags); - int level = indentCurrent; - if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { - // Only non whitespace lines can be headers - int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags); - if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) { - level |= SC_FOLDLEVELHEADERFLAG; - } - } - if (fold) { - styler.SetLevel(lineCurrent, level); - } - } - // Determine if the current state should terminate. switch (sc.state) { case SCE_SQL_OPERATOR: @@ -242,6 +222,8 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldOnlyBegin = styler.GetPropertyInt("fold.sql.only.begin", 0) != 0; + unsigned int endPos = startPos + length; int visibleChars = 0; int lineCurrent = styler.GetLine(startPos); @@ -305,7 +287,7 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle, } else { s[j] = '\0'; } - if (strcmp(s, "if") == 0 || strcmp(s, "loop") == 0) { + if ((!foldOnlyBegin) && (strcmp(s, "if") == 0 || strcmp(s, "loop") == 0)) { if (endFound) { // ignore endFound = false; diff --git a/scintilla/LexTCL.cxx b/scintilla/LexTCL.cxx index 80bf51aa..c7821411 100644 --- a/scintilla/LexTCL.cxx +++ b/scintilla/LexTCL.cxx @@ -23,34 +23,36 @@ // Extended to accept accented characters static inline bool IsAWordChar(int ch) { return ch >= 0x80 || - (isalnum(ch) || ch == '_' || ch ==':'); // : name space separator + (isalnum(ch) || ch == '_' || ch ==':' || ch=='.'); // : name space separator } static inline bool IsAWordStart(int ch) { - return ch >= 0x80 || - (isalpha(ch) || ch == '_'); + return ch >= 0x80 || (ch ==':' || isalpha(ch) || ch == '_'); } static inline bool IsANumberChar(int ch) { // Not exactly following number definition (several dots are seen as OK, etc.) // but probably enough in most cases. return (ch < 0x80) && - (isdigit(ch) || toupper(ch) == 'E' || + (IsADigit(ch, 0x10) || toupper(ch) == 'E' || ch == '.' || ch == '-' || ch == '+'); } -static void ColouriseTCLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { +static void ColouriseTCLDoc(unsigned int startPos, int length, int , WordList *keywordlists[], Accessor &styler) { +#define isComment(s) (s==SCE_TCL_COMMENT || s==SCE_TCL_COMMENTLINE || s==SCE_TCL_COMMENT_BOX || s==SCE_TCL_BLOCK_COMMENT) bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool commentLevel = false; bool subBrace = false; // substitution begin with a brace ${.....} - enum tLineState {LS_DEFAULT, LS_OPEN_COMMENT, LS_OPEN_DOUBLE_QUOTE, LS_MASK_STATE = 0xf, + enum tLineState {LS_DEFAULT, LS_OPEN_COMMENT, LS_OPEN_DOUBLE_QUOTE, LS_COMMENT_BOX, LS_MASK_STATE = 0xf, LS_COMMAND_EXPECTED = 16, LS_BRACE_ONLY = 32 } lineState = LS_DEFAULT; bool prevSlash = false; int currentLevel = 0; bool expected = 0; - int subParen = 0; + bool subParen = 0; int currentLine = styler.GetLine(startPos); + if (currentLine > 0) + currentLine--; length += startPos - styler.LineStart(currentLine); // make sure lines overlap startPos = styler.LineStart(currentLine); @@ -77,77 +79,107 @@ static void ColouriseTCLDoc(unsigned int startPos, int length, int initStyle, Wo bool visibleChars = false; int previousLevel = currentLevel; - StyleContext sc(startPos, length, initStyle, styler); + StyleContext sc(startPos, length, SCE_TCL_DEFAULT, styler); for (; ; sc.Forward()) { - bool atEnd = !sc.More(); // make sure we process last word at end of file next: - if (subBrace) { + if (sc.ch=='\r' && sc.chNext == '\n') // only ignore \r on PC process on the mac + continue; + bool atEnd = !sc.More(); // make sure we coloured the last word + if (lineState != LS_DEFAULT) { + sc.SetState(SCE_TCL_DEFAULT); + if (lineState == LS_OPEN_COMMENT) + sc.SetState(SCE_TCL_COMMENTLINE); + else if (lineState == LS_OPEN_DOUBLE_QUOTE) + sc.SetState(SCE_TCL_IN_QUOTE); + else if (lineState == LS_COMMENT_BOX && (sc.ch == '#' || (sc.ch == ' ' && sc.chNext=='#'))) + sc.SetState(SCE_TCL_COMMENT_BOX); + lineState = LS_DEFAULT; + } + if (subBrace) { // ${ overrides every thing even \ except } if (sc.ch == '}') { subBrace = false; - sc.SetState(SCE_TCL_OPERATOR); // } + sc.SetState(SCE_TCL_OPERATOR); sc.ForwardSetState(SCE_TCL_DEFAULT); + goto next; } else sc.SetState(SCE_TCL_SUB_BRACE); if (!sc.atLineEnd) continue; } else if (sc.state == SCE_TCL_DEFAULT || sc.state ==SCE_TCL_OPERATOR) { - expected &= isspacechar(static_cast(sc.ch)) || IsAWordStart(sc.ch); + expected &= isspacechar(static_cast(sc.ch)) || IsAWordStart(sc.ch) || sc.ch =='#'; } else if (sc.state == SCE_TCL_SUBSTITUTION) { - if (sc.ch == '(') - subParen++; - else if (sc.ch == ')') { + switch(sc.ch) { + case '(': + subParen=true; + sc.SetState(SCE_TCL_OPERATOR); + sc.ForwardSetState(SCE_TCL_SUBSTITUTION); + continue; + case ')': + sc.SetState(SCE_TCL_OPERATOR); + subParen=false; + continue; + case '$': + continue; + case ',': + sc.SetState(SCE_TCL_OPERATOR); if (subParen) - subParen--; - else - sc.SetState(SCE_TCL_DEFAULT); // lets the code below fix it - } else if (!IsAWordChar(sc.ch)) { - sc.SetState(SCE_TCL_DEFAULT); - subParen = 0; - } - } - else - { - if (!IsAWordChar(sc.ch)) { - if (sc.state == SCE_TCL_IDENTIFIER || sc.state == SCE_TCL_MODIFIER || expected) { - char s[100]; - sc.GetCurrent(s, sizeof(s)); - bool quote = sc.state == SCE_TCL_IN_QUOTE; - if (commentLevel || expected) { - if (keywords.InList(s)) { - sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD); - } else if (keywords2.InList(s)) { - sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD2); - } else if (keywords3.InList(s)) { - sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD3); - } else if (keywords4.InList(s)) { - sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD4); - } else if (sc.GetRelative(-static_cast(strlen(s))-1) == '{' && - keywords5.InList(s) && sc.ch == '}') { // {keyword} exactly no spaces - sc.ChangeState(SCE_TCL_EXPAND); - } - if (keywords6.InList(s)) { - sc.ChangeState(SCE_TCL_WORD5); - } else if (keywords7.InList(s)) { - sc.ChangeState(SCE_TCL_WORD6); - } else if (keywords8.InList(s)) { - sc.ChangeState(SCE_TCL_WORD7); - } else if (keywords9.InList(s)) { - sc.ChangeState(SCE_TCL_WORD8); - } - } - expected = false; - sc.SetState(quote ? SCE_TCL_IN_QUOTE : SCE_TCL_DEFAULT); - } else if (sc.state == SCE_TCL_MODIFIER || sc.state == SCE_TCL_SUBSTITUTION) { + sc.ForwardSetState(SCE_TCL_SUBSTITUTION); + continue; + default : + // maybe spaces should be allowed ??? + if (!IsAWordChar(sc.ch)) { // probably the code is wrong sc.SetState(SCE_TCL_DEFAULT); + subParen = 0; } + break; + } + } else if (isComment(sc.state)) { + } else if (!IsAWordChar(sc.ch)) { + if ((sc.state == SCE_TCL_IDENTIFIER && expected) || sc.state == SCE_TCL_MODIFIER) { + char w[100]; + char *s=w; + sc.GetCurrent(w, sizeof(w)); + if (w[strlen(w)-1]=='\r') + w[strlen(w)-1]=0; + while(*s == ':') // ignore leading : like in ::set a 10 + ++s; + bool quote = sc.state == SCE_TCL_IN_QUOTE; + if (commentLevel || expected) { + if (keywords.InList(s)) { + sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD3); + } else if (keywords4.InList(s)) { + sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD4); + } else if (sc.GetRelative(-static_cast(strlen(s))-1) == '{' && + keywords5.InList(s) && sc.ch == '}') { // {keyword} exactly no spaces + sc.ChangeState(SCE_TCL_EXPAND); + } + if (keywords6.InList(s)) { + sc.ChangeState(SCE_TCL_WORD5); + } else if (keywords7.InList(s)) { + sc.ChangeState(SCE_TCL_WORD6); + } else if (keywords8.InList(s)) { + sc.ChangeState(SCE_TCL_WORD7); + } else if (keywords9.InList(s)) { + sc.ChangeState(SCE_TCL_WORD8); + } + } + expected = false; + sc.SetState(quote ? SCE_TCL_IN_QUOTE : SCE_TCL_DEFAULT); + } else if (sc.state == SCE_TCL_MODIFIER || sc.state == SCE_TCL_IDENTIFIER) { + sc.SetState(SCE_TCL_DEFAULT); } } if (atEnd) break; - if (sc.atLineEnd) { + if (sc.atLineEnd) { + lineState = LS_DEFAULT; currentLine = styler.GetLine(sc.currentPos); - if (foldComment && sc.state == SCE_TCL_COMMENTLINE) { + if (foldComment && sc.state!=SCE_TCL_COMMENT && isComment(sc.state)) { if (currentLevel == 0) { ++currentLevel; commentLevel = true; @@ -169,35 +201,39 @@ next: // Update the line state, so it can be seen by next line if (sc.state == SCE_TCL_IN_QUOTE) lineState = LS_OPEN_DOUBLE_QUOTE; - else if (prevSlash) { - if (sc.state == SCE_TCL_COMMENT || sc.state == SCE_TCL_COMMENTLINE) - lineState = LS_OPEN_COMMENT; + else { + if (prevSlash) { + if (isComment(sc.state)) + lineState = LS_OPEN_COMMENT; + } else if (sc.state == SCE_TCL_COMMENT_BOX) + lineState = LS_COMMENT_BOX; } styler.SetLineState(currentLine, (subBrace ? LS_BRACE_ONLY : 0) | (expected ? LS_COMMAND_EXPECTED : 0) | lineState); - sc.SetState(SCE_TCL_DEFAULT); + if (lineState == LS_COMMENT_BOX) + sc.ForwardSetState(SCE_TCL_COMMENT_BOX); + else if (lineState == LS_OPEN_DOUBLE_QUOTE) + sc.ForwardSetState(SCE_TCL_IN_QUOTE); + else + sc.ForwardSetState(SCE_TCL_DEFAULT); prevSlash = false; previousLevel = currentLevel; - lineState = LS_DEFAULT; - continue; + goto next; } if (prevSlash) { - prevSlash = (sc.state == SCE_TCL_COMMENT || sc.state == SCE_TCL_COMMENTLINE) && isspacechar(static_cast(sc.ch)); - continue; + prevSlash = false; + if (sc.ch == '#' && IsANumberChar(sc.chNext)) + sc.ForwardSetState(SCE_TCL_NUMBER); + continue; } - + prevSlash = sc.ch == '\\'; + if (isComment(sc.state)) + continue; if (sc.atLineStart) { visibleChars = false; - if (lineState == LS_OPEN_COMMENT) { - sc.SetState(SCE_TCL_COMMENT); - lineState = LS_DEFAULT; - continue; - } - if (lineState == LS_OPEN_DOUBLE_QUOTE) - sc.SetState(SCE_TCL_IN_QUOTE); - else + if (sc.state!=SCE_TCL_IN_QUOTE && !isComment(sc.state)) { sc.SetState(SCE_TCL_DEFAULT); expected = IsAWordStart(sc.ch)|| isspacechar(static_cast(sc.ch)); @@ -212,30 +248,32 @@ next: case SCE_TCL_IN_QUOTE: if (sc.ch == '"') { sc.ForwardSetState(SCE_TCL_DEFAULT); - visibleChars = true; // necessary for a " as the first and only character on a line + visibleChars = true; // necessary if a " is the first and only character on a line goto next; } else if (sc.ch == '[' || sc.ch == ']' || sc.ch == '$') { sc.SetState(SCE_TCL_OPERATOR); expected = sc.ch == '['; sc.ForwardSetState(SCE_TCL_IN_QUOTE); goto next; - } - prevSlash = sc.ch == '\\'; - continue; - case SCE_TCL_OPERATOR: + } + continue; + case SCE_TCL_OPERATOR: sc.SetState(SCE_TCL_DEFAULT); break; } if (sc.ch == '#') { if (visibleChars) { - if (sc.state != SCE_TCL_IN_QUOTE && expected) { + if (sc.state != SCE_TCL_IN_QUOTE && expected) sc.SetState(SCE_TCL_COMMENT); - expected = false; - } - } else - sc.SetState(SCE_TCL_COMMENTLINE); - } + } else { + sc.SetState(SCE_TCL_COMMENTLINE); + if (sc.chNext == '~') + sc.SetState(SCE_TCL_BLOCK_COMMENT); + if (sc.atLineStart && (sc.chNext == '#' || sc.chNext == '-')) + sc.SetState(SCE_TCL_COMMENT_BOX); + } + } if (!isspacechar(static_cast(sc.ch))) { visibleChars = true; @@ -243,15 +281,15 @@ next: if (sc.ch == '\\') { prevSlash = true; - continue; + continue; } // Determine if a new state should be entered. if (sc.state == SCE_TCL_DEFAULT) { - if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { - sc.SetState(SCE_TCL_NUMBER); - } else if (IsAWordStart(sc.ch) & expected) { + if (IsAWordStart(sc.ch)) { sc.SetState(SCE_TCL_IDENTIFIER); + } else if (IsADigit(sc.ch) && !IsAWordChar(sc.chPrev)) { + sc.SetState(SCE_TCL_NUMBER); } else { switch (sc.ch) { case '\"': @@ -267,10 +305,8 @@ next: --currentLevel; break; case '[': + expected = true; case ']': - sc.SetState(SCE_TCL_OPERATOR); - expected = true; - break; case '(': case ')': sc.SetState(SCE_TCL_OPERATOR); @@ -284,15 +320,24 @@ next: sc.SetState(SCE_TCL_SUBSTITUTION); } else { - sc.ForwardSetState(SCE_TCL_OPERATOR); // { - sc.ForwardSetState(SCE_TCL_SUB_BRACE); + sc.SetState(SCE_TCL_OPERATOR); // $ + sc.Forward(); // { + sc.ForwardSetState(SCE_TCL_SUB_BRACE); subBrace = true; } break; - case '-': - if (!IsADigit(sc.chNext)) - sc.SetState(SCE_TCL_MODIFIER); + case '#': + if ((isspacechar(static_cast(sc.chPrev))|| + isoperator(static_cast(sc.chPrev))) && IsADigit(sc.chNext,0x10)) + sc.SetState(SCE_TCL_NUMBER); break; + case '-': + sc.SetState(IsADigit(sc.chNext)? SCE_TCL_NUMBER: SCE_TCL_MODIFIER); + break; + default: + if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_TCL_OPERATOR); + } } } } diff --git a/scintilla/LineMarker.h b/scintilla/LineMarker.h index ef5924f7..8ebdce49 100644 --- a/scintilla/LineMarker.h +++ b/scintilla/LineMarker.h @@ -15,11 +15,13 @@ public: int markType; ColourPair fore; ColourPair back; + int alpha; XPM *pxpm; LineMarker() { markType = SC_MARK_CIRCLE; fore = ColourDesired(0,0,0); back = ColourDesired(0xff,0xff,0xff); + alpha = SC_ALPHA_NOALPHA; pxpm = NULL; } LineMarker(const LineMarker &) { @@ -27,6 +29,7 @@ public: markType = SC_MARK_CIRCLE; fore = ColourDesired(0,0,0); back = ColourDesired(0xff,0xff,0xff); + alpha = SC_ALPHA_NOALPHA; pxpm = NULL; } ~LineMarker() { @@ -37,6 +40,7 @@ public: markType = SC_MARK_CIRCLE; fore = ColourDesired(0,0,0); back = ColourDesired(0xff,0xff,0xff); + alpha = SC_ALPHA_NOALPHA; delete pxpm; pxpm = NULL; return *this; diff --git a/scintilla/PlatGTK.cxx b/scintilla/PlatGTK.cxx index e891e8df..a520b63b 100644 --- a/scintilla/PlatGTK.cxx +++ b/scintilla/PlatGTK.cxx @@ -794,7 +794,7 @@ const char *CharacterSetID(int characterSet) { void SurfaceImpl::SetConverter(int characterSet_) { if (characterSet != characterSet_) { characterSet = characterSet_; - conv.Open("UTF-8", CharacterSetID(characterSet)); + conv.Open("UTF-8", CharacterSetID(characterSet), false); } } #endif @@ -1016,6 +1016,8 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAl } } +#if GTK_MAJOR_VERSION >= 2 + // Plot a point into a guint32 buffer symetrically to all 4 qudrants static void AllFour(guint32 *pixels, int stride, int width, int height, int x, int y, guint32 val) { pixels[y*stride+x] = val; @@ -1036,6 +1038,8 @@ static unsigned int GetBValue(unsigned int co) { return co & 0xff; } +#endif + #if GTK_MAJOR_VERSION < 2 void SurfaceImpl::AlphaRectangle(PRectangle rc, int , ColourAllocated , int , ColourAllocated outline, int , int ) { if (gc && drawable) { @@ -1290,7 +1294,7 @@ void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, int ybase, const char int wclen; if (et == UTF8) { wclen = UCS2FromUTF8(s, len, - reinterpret_cast(wctext), maxLengthTextRun - 1); + static_cast(static_cast(wctext)), maxLengthTextRun - 1); } else { // dbcs, so convert using current locale char sMeasure[maxLengthTextRun]; memcpy(sMeasure, s, len); @@ -1396,7 +1400,7 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positi // Convert to UTF-8 so can ask Pango for widths, then // Loop through UTF-8 and DBCS forms, taking account of different // character byte lengths. - Converter convMeasure("UCS-2", CharacterSetID(characterSet)); + Converter convMeasure("UCS-2", CharacterSetID(characterSet), false); pango_layout_set_text(layout, utfForm, strlen(utfForm)); int i = 0; int utfIndex = 0; @@ -1465,7 +1469,7 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positi int wclen; if (et == UTF8) { wclen = UCS2FromUTF8(s, len, - reinterpret_cast(wctext), maxLengthTextRun - 1); + static_cast(static_cast(wctext)), maxLengthTextRun - 1); } else { // dbcsMode, so convert using current locale char sDraw[maxLengthTextRun]; memcpy(sDraw, s, len); @@ -1550,7 +1554,8 @@ int SurfaceImpl::WidthText(Font &font_, const char *s, int len) { #endif if (et == UTF8) { GdkWChar wctext[maxLengthTextRun]; - size_t wclen = UCS2FromUTF8(s, len, (wchar_t *)wctext, sizeof(wctext) / sizeof(GdkWChar) - 1); + size_t wclen = UCS2FromUTF8(s, len, static_cast(static_cast(wctext)), + sizeof(wctext) / sizeof(GdkWChar) - 1); wctext[wclen] = L'\0'; return gdk_text_width_wc(PFont(font_)->pfont, wctext, wclen); } else { @@ -1972,12 +1977,12 @@ static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) { scheme that it would use if it had the focus. */ static void StyleSet(GtkWidget *w, GtkStyle*, void*) { GtkStyle* style; - + g_return_if_fail(w != NULL); - + /* Copy the selected color to active. Note that the modify calls will cause recursive calls to this function after the value is updated and w->style to - be set to a new object */ + be set to a new object */ style = gtk_widget_get_style(w); if (style == NULL) return; @@ -2010,17 +2015,18 @@ void ListBoxX::Create(Window &, int, Point, int, bool) { #if GTK_MAJOR_VERSION < 2 list = gtk_clist_new(1); - gtk_widget_show(PWidget(list)); - gtk_container_add(GTK_CONTAINER(PWidget(scroller)), PWidget(list)); - gtk_clist_set_column_auto_resize(GTK_CLIST(PWidget(list)), 0, TRUE); - gtk_clist_set_selection_mode(GTK_CLIST(PWidget(list)), GTK_SELECTION_BROWSE); - gtk_signal_connect(GTK_OBJECT(PWidget(list)), "unselect_row", + GtkWidget *wid = PWidget(list); // No code inside the GTK_OBJECT macro + gtk_widget_show(wid); + gtk_container_add(GTK_CONTAINER(PWidget(scroller)), wid); + gtk_clist_set_column_auto_resize(GTK_CLIST(wid), 0, TRUE); + gtk_clist_set_selection_mode(GTK_CLIST(wid), GTK_SELECTION_BROWSE); + gtk_signal_connect(GTK_OBJECT(wid), "unselect_row", GTK_SIGNAL_FUNC(UnselectionAC), ¤t); - gtk_signal_connect(GTK_OBJECT(PWidget(list)), "select_row", + gtk_signal_connect(GTK_OBJECT(wid), "select_row", GTK_SIGNAL_FUNC(SelectionAC), ¤t); - gtk_signal_connect(GTK_OBJECT(PWidget(list)), "button_press_event", + gtk_signal_connect(GTK_OBJECT(wid), "button_press_event", GTK_SIGNAL_FUNC(ButtonPress), this); - gtk_clist_set_shadow_type(GTK_CLIST(PWidget(list)), GTK_SHADOW_NONE); + gtk_clist_set_shadow_type(GTK_CLIST(wid), GTK_SHADOW_NONE); #else /* Tree and its model */ GtkListStore *store = @@ -2054,11 +2060,12 @@ void ListBoxX::Create(Window &, int, Point, int, bool) { gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); if (g_object_class_find_property(G_OBJECT_GET_CLASS(list), "fixed-height-mode")) g_object_set(G_OBJECT(list), "fixed-height-mode", TRUE, NULL); - gtk_container_add(GTK_CONTAINER(PWidget(scroller)), PWidget(list)); - gtk_widget_show(PWidget(list)); - gtk_signal_connect(GTK_OBJECT(PWidget(list)), "button_press_event", - GTK_SIGNAL_FUNC(ButtonPress), this); + GtkWidget *wid = PWidget(list); // No code inside the G_OBJECT macro + gtk_container_add(GTK_CONTAINER(PWidget(scroller)), wid); + gtk_widget_show(wid); + g_signal_connect(G_OBJECT(wid), "button_press_event", + G_CALLBACK(ButtonPress), this); #endif gtk_widget_realize(PWidget(id)); } @@ -2478,7 +2485,11 @@ void Menu::CreatePopUp() { void Menu::Destroy() { if (id) +#if GTK_MAJOR_VERSION < 2 gtk_object_unref(GTK_OBJECT(id)); +#else + g_object_unref(G_OBJECT(id)); +#endif id = 0; } @@ -2573,8 +2584,11 @@ const char *Platform::DefaultFont() { #ifdef G_OS_WIN32 return "Lucida Console"; #else - - return "!Sans"; //fix for GTK2.8 until updating to sci 1.69 +#ifdef USE_PANGO + return "!Sans"; +#else + return "lucidatypewriter"; +#endif #endif } @@ -2582,7 +2596,6 @@ int Platform::DefaultFontSize() { #ifdef G_OS_WIN32 return 10; #else - return 12; #endif } @@ -2619,7 +2632,6 @@ bool Platform::IsDBCSLeadByte(int /* codePage */, char /* ch */) { return false; } -#if GTK_MAJOR_VERSION < 2 int Platform::DBCSCharLength(int, const char *s) { int bytes = mblen(s, MB_CUR_MAX); if (bytes >= 1) @@ -2627,24 +2639,6 @@ int Platform::DBCSCharLength(int, const char *s) { else return 1; } -#else -int Platform::DBCSCharLength(int codePage, const char *s) { - if (codePage == 999932) { - // Experimental and disabled code - change 999932 to 932 above to - // enable locale avoiding but expensive character length determination. - // Avoid locale with explicit use of iconv - Converter convMeasure("UCS-2", CharacterSetID(SC_CHARSET_SHIFTJIS)); - size_t lenChar = MultiByteLenFromIconv(convMeasure, s, strlen(s)); - return lenChar; - } else { - int bytes = mblen(s, MB_CUR_MAX); - if (bytes >= 1) - return bytes; - else - return 1; - } -} -#endif int Platform::DBCSCharMaxLength() { return MB_CUR_MAX; diff --git a/scintilla/ScintillaBase.cxx b/scintilla/ScintillaBase.cxx index 2d13efab..bcb0a77e 100644 --- a/scintilla/ScintillaBase.cxx +++ b/scintilla/ScintillaBase.cxx @@ -469,7 +469,7 @@ void ScintillaBase::Colourise(int start, int end) { int styleStart = 0; if (start > 0) - styleStart = styler.StyleAt(start - 1); + styleStart = styler.StyleAt(start - 1) & pdoc->stylingBitsMask; styler.SetCodePage(pdoc->dbcsCodePage); if (lexCurrent && (len > 0)) { // Should always succeed as null lexer should always be available diff --git a/scintilla/ScintillaGTK.cxx b/scintilla/ScintillaGTK.cxx index 63735d68..8aaedca4 100644 --- a/scintilla/ScintillaGTK.cxx +++ b/scintilla/ScintillaGTK.cxx @@ -46,7 +46,7 @@ #include "gtk/gtksignal.h" #include "gtk/gtkmarshal.h" -#if GTK_MAJOR_VERSION >= 2 +#if GLIB_MAJOR_VERSION >= 2 #include "scintilla-marshal.h" #endif @@ -73,10 +73,16 @@ #pragma warning(disable: 4505) #endif -#if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 2 +#if GTK_CHECK_VERSION(2,2,0) #define USE_GTK_CLIPBOARD #endif +#if GLIB_MAJOR_VERSION < 2 +#define OBJECT_CLASS GtkObjectClass +#else +#define OBJECT_CLASS GObjectClass +#endif + extern char *UTF8FromLatin1(const char *s, int &len); class ScintillaGTK : public ScintillaBase { @@ -107,6 +113,7 @@ class ScintillaGTK : public ScintillaBase { static GdkAtom atomUTF8; static GdkAtom atomString; static GdkAtom atomUriList; + static GdkAtom atomDROPFILES_DND; GdkAtom atomSought; #if PLAT_GTK_WIN32 @@ -140,8 +147,7 @@ class ScintillaGTK : public ScintillaBase { public: ScintillaGTK(_ScintillaObject *sci_); virtual ~ScintillaGTK(); - static void ClassInit(GtkObjectClass* object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class); - + static void ClassInit(OBJECT_CLASS* object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class); private: virtual void Initialise(); virtual void Finalise(); @@ -149,6 +155,7 @@ private: virtual void StartDrag(); int TargetAsUTF8(char *text); int EncodedFromUTF8(char *utf8, char *encoded); + virtual bool ValidCodePage(int codePage) const; public: // Public for scintilla_send_message virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); private: @@ -171,7 +178,6 @@ private: virtual void NotifyParent(SCNotification scn); void NotifyKey(int key, int modifiers); void NotifyURIDropped(const char *list); - bool UseInputMethod() const; const char *CharacterSetID() const; virtual int KeyDefault(int key, int modifiers); virtual void CopyToClipboard(const SelectionText &selectedText); @@ -222,12 +228,12 @@ private: static gint ScrollEvent(GtkWidget *widget, GdkEventScroll *event); #endif static gint Motion(GtkWidget *widget, GdkEventMotion *event); - gint KeyThis(GdkEventKey *event); - static gint KeyPress(GtkWidget *widget, GdkEventKey *event); - static gint KeyRelease(GtkWidget *widget, GdkEventKey *event); + gboolean KeyThis(GdkEventKey *event); + static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event); + static gboolean KeyRelease(GtkWidget *widget, GdkEventKey *event); #if GTK_MAJOR_VERSION >= 2 - static gint ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis); - gint ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose); + static gboolean ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis); + gboolean ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose); static void Commit(GtkIMContext *context, char *str, ScintillaGTK *sciThis); void CommitThis(char *str); static void PreeditChanged(GtkIMContext *context, ScintillaGTK *sciThis); @@ -235,7 +241,11 @@ private: #endif static gint StyleSetText(GtkWidget *widget, GtkStyle *previous, void*); static gint RealizeText(GtkWidget *widget, void*); +#if GLIB_MAJOR_VERSION < 2 static void Destroy(GtkObject *object); +#else + static void Destroy(GObject *object); +#endif static void SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data, guint time); static void SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data, @@ -277,7 +287,9 @@ enum { }; static gint scintilla_signals[LAST_SIGNAL] = { 0 }; -static GtkWidgetClass* parent_class = NULL; +#if GLIB_MAJOR_VERSION < 2 +static GtkWidgetClass *parent_class = NULL; +#endif enum { TARGET_STRING, @@ -291,6 +303,7 @@ GdkAtom ScintillaGTK::atomClipboard = 0; GdkAtom ScintillaGTK::atomUTF8 = 0; GdkAtom ScintillaGTK::atomString = 0; GdkAtom ScintillaGTK::atomUriList = 0; +GdkAtom ScintillaGTK::atomDROPFILES_DND = 0; static const GtkTargetEntry clipboardTargets[] = { { "text/uri-list", 0, TARGET_URI }, @@ -434,26 +447,35 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) { #else wPreedit = gtk_window_new(GTK_WINDOW_POPUP); wPreeditDraw = gtk_drawing_area_new(); - gtk_signal_connect(GTK_OBJECT(PWidget(wPreeditDraw)), "expose_event", - GtkSignalFunc(ExposePreedit), this); - gtk_container_add(GTK_CONTAINER(PWidget(wPreedit)), PWidget(wPreeditDraw)); + GtkWidget *predrw = PWidget(wPreeditDraw); // No code inside the G_OBJECT macro + g_signal_connect(G_OBJECT(predrw), "expose_event", + G_CALLBACK(ExposePreedit), this); + gtk_container_add(GTK_CONTAINER(PWidget(wPreedit)), predrw); gtk_widget_realize(PWidget(wPreedit)); - gtk_widget_realize(PWidget(wPreeditDraw)); - gtk_widget_show(PWidget(wPreeditDraw)); + gtk_widget_realize(predrw); + gtk_widget_show(predrw); im_context = gtk_im_multicontext_new(); - g_signal_connect(im_context, "commit", + g_signal_connect(G_OBJECT(im_context), "commit", G_CALLBACK(Commit), this); - g_signal_connect(im_context, "preedit_changed", + g_signal_connect(G_OBJECT(im_context), "preedit_changed", G_CALLBACK(PreeditChanged), this); gtk_im_context_set_client_window(im_context, widget->window); #endif #endif - gtk_signal_connect_after(GTK_OBJECT(PWidget(wText)), "style_set", + GtkWidget *widtxt = PWidget(wText); // // No code inside the G_OBJECT macro +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect_after(GTK_OBJECT(widtxt), "style_set", GtkSignalFunc(ScintillaGTK::StyleSetText), NULL); - gtk_signal_connect_after(GTK_OBJECT(PWidget(wText)), "realize", + gtk_signal_connect_after(GTK_OBJECT(widtxt), "realize", GtkSignalFunc(ScintillaGTK::RealizeText), NULL); - gtk_widget_realize(PWidget(wText)); +#else + g_signal_connect_after(G_OBJECT(widtxt), "style_set", + G_CALLBACK(ScintillaGTK::StyleSetText), NULL); + g_signal_connect_after(G_OBJECT(widtxt), "realize", + G_CALLBACK(ScintillaGTK::RealizeText), NULL); +#endif + gtk_widget_realize(widtxt); gtk_widget_realize(PWidget(scrollbarv)); gtk_widget_realize(PWidget(scrollbarh)); } @@ -691,30 +713,45 @@ void ScintillaGTK::Initialise() { wText = gtk_drawing_area_new(); gtk_widget_set_parent(PWidget(wText), PWidget(wMain)); - gtk_widget_show(PWidget(wText)); - gtk_signal_connect(GTK_OBJECT(PWidget(wText)), "expose_event", + GtkWidget *widtxt = PWidget(wText); // No code inside the G_OBJECT macro + gtk_widget_show(widtxt); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(GTK_OBJECT(widtxt), "expose_event", GtkSignalFunc(ScintillaGTK::ExposeText), this); - gtk_widget_set_events(PWidget(wText), GDK_EXPOSURE_MASK); +#else + g_signal_connect(G_OBJECT(widtxt), "expose_event", + G_CALLBACK(ScintillaGTK::ExposeText), this); +#endif + gtk_widget_set_events(widtxt, GDK_EXPOSURE_MASK); #if GTK_MAJOR_VERSION >= 2 // Avoid background drawing flash - gtk_widget_set_double_buffered(PWidget(wText), FALSE); + gtk_widget_set_double_buffered(widtxt, FALSE); #endif - gtk_drawing_area_size(GTK_DRAWING_AREA(PWidget(wText)), + gtk_drawing_area_size(GTK_DRAWING_AREA(widtxt), 100,100); - adjustmentv = gtk_adjustment_new(0.0, 0.0, 201.0, 1.0, 20.0, 20.0); scrollbarv = gtk_vscrollbar_new(GTK_ADJUSTMENT(adjustmentv)); GTK_WIDGET_UNSET_FLAGS(PWidget(scrollbarv), GTK_CAN_FOCUS); - gtk_signal_connect(GTK_OBJECT(adjustmentv), "value_changed", - GTK_SIGNAL_FUNC(ScrollSignal), this); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(adjustmentv, "value_changed", + GtkSignalFunc(ScrollSignal), this); +#else + g_signal_connect(G_OBJECT(adjustmentv), "value_changed", + G_CALLBACK(ScrollSignal), this); +#endif gtk_widget_set_parent(PWidget(scrollbarv), PWidget(wMain)); gtk_widget_show(PWidget(scrollbarv)); adjustmenth = gtk_adjustment_new(0.0, 0.0, 101.0, 1.0, 20.0, 20.0); scrollbarh = gtk_hscrollbar_new(GTK_ADJUSTMENT(adjustmenth)); GTK_WIDGET_UNSET_FLAGS(PWidget(scrollbarh), GTK_CAN_FOCUS); - gtk_signal_connect(GTK_OBJECT(adjustmenth), "value_changed", - GTK_SIGNAL_FUNC(ScrollHSignal), this); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(adjustmenth, "value_changed", + GtkSignalFunc(ScrollHSignal), this); +#else + g_signal_connect(G_OBJECT(adjustmenth), "value_changed", + G_CALLBACK(ScrollHSignal), this); +#endif gtk_widget_set_parent(PWidget(scrollbarh), PWidget(wMain)); gtk_widget_show(PWidget(scrollbarh)); @@ -752,8 +789,6 @@ void ScintillaGTK::StartDrag() { static const GtkTargetEntry targets[] = { { "UTF8_STRING", 0, TARGET_UTF8_STRING }, { "STRING", 0, TARGET_STRING }, - // { "TEXT", 0, TARGET_TEXT }, - // { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT }, }; static const gint n_targets = sizeof(targets) / sizeof(targets[0]); GtkTargetList *tl = gtk_target_list_new(targets, n_targets); @@ -765,10 +800,11 @@ void ScintillaGTK::StartDrag() { } #ifdef USE_CONVERTER -static char *ConvertText(int *lenResult, char *s, size_t len, const char *charSetDest, const char *charSetSource) { +static char *ConvertText(int *lenResult, char *s, size_t len, const char *charSetDest, + const char *charSetSource, bool transliterations) { *lenResult = 0; char *destForm = 0; - Converter conv(charSetDest, charSetSource); + Converter conv(charSetDest, charSetSource, transliterations); if (conv) { destForm = new char[len*3+1]; char *pin = s; @@ -816,7 +852,7 @@ int ScintillaGTK::TargetAsUTF8(char *text) { pdoc->GetCharRange(s, targetStart, targetLength); //~ fprintf(stderr, " \"%s\"\n", s); if (text) { - char *tmputf = ConvertText(&targetLength, s, targetLength, "UTF-8", charSetBuffer); + char *tmputf = ConvertText(&targetLength, s, targetLength, "UTF-8", charSetBuffer, false); memcpy(text, tmputf, targetLength); delete []tmputf; //~ fprintf(stderr, " \"%s\"\n", text); @@ -853,7 +889,7 @@ int ScintillaGTK::EncodedFromUTF8(char *utf8, char *encoded) { if (*charSetBuffer) { //~ fprintf(stderr, "Encode %s %d\n", charSetBuffer, inputLength); int outLength = 0; - char *tmpEncoded = ConvertText(&outLength, utf8, inputLength, charSetBuffer, "UTF-8"); + char *tmpEncoded = ConvertText(&outLength, utf8, inputLength, charSetBuffer, "UTF-8", true); if (tmpEncoded) { //~ fprintf(stderr, " \"%s\"\n", tmpEncoded); if (encoded) { @@ -874,6 +910,10 @@ int ScintillaGTK::EncodedFromUTF8(char *utf8, char *encoded) { return 0; } +bool ScintillaGTK::ValidCodePage(int codePage) const { + return codePage == 0 || codePage == SC_CP_UTF8 || codePage == SC_CP_DBCS; +} + sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { switch (iMessage) { @@ -1126,20 +1166,37 @@ void ScintillaGTK::ReconfigureScrollBars() { } void ScintillaGTK::NotifyChange() { +#if GLIB_MAJOR_VERSION < 2 gtk_signal_emit(GTK_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], Platform::LongFromTwoShorts(GetCtrlID(), SCEN_CHANGE), PWidget(wMain)); +#else + g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0, + Platform::LongFromTwoShorts(GetCtrlID(), SCEN_CHANGE), PWidget(wMain)); +#endif } void ScintillaGTK::NotifyFocus(bool focus) { +#if GLIB_MAJOR_VERSION < 2 gtk_signal_emit(GTK_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], - Platform::LongFromTwoShorts(GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain)); + Platform::LongFromTwoShorts + (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain)); +#else + g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0, + Platform::LongFromTwoShorts + (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain)); +#endif } void ScintillaGTK::NotifyParent(SCNotification scn) { scn.nmhdr.hwndFrom = PWidget(wMain); scn.nmhdr.idFrom = GetCtrlID(); +#if GLIB_MAJOR_VERSION < 2 gtk_signal_emit(GTK_OBJECT(sci), scintilla_signals[NOTIFY_SIGNAL], GetCtrlID(), &scn); +#else + g_signal_emit(G_OBJECT(sci), scintilla_signals[NOTIFY_SIGNAL], 0, + GetCtrlID(), &scn); +#endif } void ScintillaGTK::NotifyKey(int key, int modifiers) { @@ -1159,117 +1216,19 @@ void ScintillaGTK::NotifyURIDropped(const char *list) { NotifyParent(scn); } -bool ScintillaGTK::UseInputMethod() const { - switch (vs.styles[STYLE_DEFAULT].characterSet) { - case SC_CHARSET_CHINESEBIG5: - case SC_CHARSET_GB2312: - case SC_CHARSET_HANGUL: - case SC_CHARSET_SHIFTJIS: - case SC_CHARSET_JOHAB: - case SC_CHARSET_HEBREW: - case SC_CHARSET_ARABIC: - case SC_CHARSET_VIETNAMESE: - case SC_CHARSET_THAI: - return true; - default: - return false; - } -} - const char *CharacterSetID(int characterSet); const char *ScintillaGTK::CharacterSetID() const { return ::CharacterSetID(vs.styles[STYLE_DEFAULT].characterSet); } -#if GTK_MAJOR_VERSION >= 2 -#define IS_ACC(x) \ - ((x) >= 65103 && (x) <= 65111) -#define IS_CHAR(x) \ - ((x) >= 0 && (x) <= 128) - -#define IS_ACC_OR_CHAR(x) \ - (IS_CHAR(x) || IS_ACC(x)) - -static int MakeAccent(int key, int acc) { - const char *conv[] = { - "aeiounc AEIOUNC", - "ãeiõuñc~ÃEIÕUÑC", - "áéíóúnç'ÁÉÍÓÚNÇ", - "àèìòùnc`ÀÈÌÒÙNC", - "âêîôûnc^ÂÊÎÔÛNC", - "äëïöünc¨ÄËÏÖÜNC" - }; - int idx; - for (idx = 0; idx < 15; ++idx) { - if (char(key) == conv[0][idx]) { - break; - } - } - if (idx == 15) { - return key; - } - if (acc == GDK_dead_tilde) { // ~ - return int((unsigned char)(conv[1][idx])); - } else if (acc == GDK_dead_acute) { // ' - return int((unsigned char)(conv[2][idx])); - } else if (acc == GDK_dead_grave) { // ` - return int((unsigned char)(conv[3][idx])); - } else if (acc == GDK_dead_circumflex) { // ^ - return int((unsigned char)(conv[4][idx])); - } else if (acc == GDK_dead_diaeresis) { // " - return int((unsigned char)(conv[5][idx])); - } - return key; -} -#endif - int ScintillaGTK::KeyDefault(int key, int modifiers) { if (!(modifiers & SCI_CTRL) && !(modifiers & SCI_ALT)) { -#if GTK_MAJOR_VERSION >= 2 - if (!UseInputMethod()) { - char utfVal[4]="\0\0\0"; - wchar_t wcs[2]; - if (IS_CHAR(key) && IS_ACC(lastKey)) { - lastKey = key = MakeAccent(key, lastKey); - } - if (IS_ACC_OR_CHAR(key)) { - lastKey = key; - } - wcs[0] = gdk_keyval_to_unicode(key); - wcs[1] = 0; - UTF8FromUCS2(wcs, 1, utfVal, 3); - if (key <= 0xFE00) { - if (IsUnicodeMode()) { - AddCharUTF(utfVal,strlen(utfVal)); - return 1; - } else { - const char *source = CharacterSetID(); - if (*source) { - Converter conv(source, "UTF-8"); - if (conv) { - char localeVal[4]="\0\0\0"; - char *pin = utfVal; - size_t inLeft = strlen(utfVal); - char *pout = localeVal; - size_t outLeft = sizeof(localeVal); - size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); - if (conversions != ((size_t)(-1))) { - *pout = '\0'; - for (int i=0; localeVal[i]; i++) { - AddChar(localeVal[i]); - } - return 1; - } - } - } - } - } - } -#endif if (key < 256) { - AddChar(key); - return 1; + NotifyKey(key, modifiers); + return 0; + //~ AddChar(key); + //~ return 1; } else { // Pass up to container in case it is an accelerator NotifyKey(key, modifiers); @@ -1344,12 +1303,20 @@ void ScintillaGTK::CreateCallTipWindow(PRectangle rc) { if (!ct.wCallTip.Created()) { ct.wCallTip = gtk_window_new(GTK_WINDOW_POPUP); ct.wDraw = gtk_drawing_area_new(); - gtk_container_add(GTK_CONTAINER(PWidget(ct.wCallTip)), PWidget(ct.wDraw)); - gtk_signal_connect(GTK_OBJECT(PWidget(ct.wDraw)), "expose_event", + GtkWidget *widcdrw = PWidget(ct.wDraw); // // No code inside the G_OBJECT macro + gtk_container_add(GTK_CONTAINER(PWidget(ct.wCallTip)), widcdrw); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(GTK_OBJECT(widcdrw), "expose_event", GtkSignalFunc(ScintillaGTK::ExposeCT), &ct); - gtk_signal_connect(GTK_OBJECT(PWidget(ct.wDraw)), "button_press_event", + gtk_signal_connect(GTK_OBJECT(widcdrw), "button_press_event", GtkSignalFunc(ScintillaGTK::PressCT), static_cast(this)); - gtk_widget_set_events(PWidget(ct.wDraw), +#else + g_signal_connect(G_OBJECT(widcdrw), "expose_event", + G_CALLBACK(ScintillaGTK::ExposeCT), &ct); + g_signal_connect(G_OBJECT(widcdrw), "button_press_event", + G_CALLBACK(ScintillaGTK::PressCT), static_cast(this)); +#endif + gtk_widget_set_events(widcdrw, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); } gtk_drawing_area_size(GTK_DRAWING_AREA(PWidget(ct.wDraw)), @@ -1452,7 +1419,7 @@ void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, Selectio if (!IsUnicodeMode() && *charSetBuffer) { //fprintf(stderr, "Convert to locale %s\n", CharacterSetID()); // Convert to locale - dest = ConvertText(&len, selText.s, selText.len, charSetBuffer, "UTF-8"); + dest = ConvertText(&len, selText.s, selText.len, charSetBuffer, "UTF-8", true); selText.Set(dest, len, pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, selText.rectangular); } @@ -1485,7 +1452,7 @@ void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) { SetEmptySelection(currentPos + selText.len); } pdoc->EndUndoAction(); - EnsureCaretVisible(); + EnsureCaretVisible(); } } // else fprintf(stderr, "Target non string %d %d\n", (int)(selection_data->type), @@ -1495,7 +1462,7 @@ void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) { void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) { dragWasDropped = true; - if (selection_data->type == atomUriList) { + if (selection_data->type == atomUriList || selection_data->type == atomDROPFILES_DND) { char *ptr = new char[selection_data->length + 1]; ptr[selection_data->length] = '\0'; memcpy(ptr, selection_data->data, selection_data->length); @@ -1508,7 +1475,7 @@ void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) { DropAt(posDrop, selText.s, false, selText.rectangular); } } else if (selection_data->length > 0) { - fprintf(stderr, "ReceivedDrop other %p\n", static_cast(selection_data->type)); + //~ fprintf(stderr, "ReceivedDrop other %p\n", static_cast(selection_data->type)); } Redraw(); } @@ -1516,6 +1483,20 @@ void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) { void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text) { +#if PLAT_GTK_WIN32 + // Many native win32 programs require \n line endings, so make a copy of + // the clip text now with newlines converted. Use { } to hide symbols + // from code below + SelectionText *newline_normalized = NULL; + { + int tmpstr_len; + char *tmpstr = Document::TransformLineEnds(&tmpstr_len, text->s, text->len, SC_EOL_LF); + newline_normalized = new SelectionText(); + newline_normalized->Set(tmpstr, tmpstr_len, SC_CP_UTF8, 0, text->rectangular); + text = newline_normalized; + } +#endif + #if GTK_MAJOR_VERSION >= 2 // Convert text to utf8 if it isn't already SelectionText *converted = 0; @@ -1523,7 +1504,7 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se const char *charSet = ::CharacterSetID(text->characterSet); if (*charSet) { int new_len; - char* tmputf = ConvertText(&new_len, text->s, text->len, "UTF-8", charSet); + char* tmputf = ConvertText(&new_len, text->s, text->len, "UTF-8", charSet, false); converted = new SelectionText(); converted->Set(tmputf, new_len, SC_CP_UTF8, 0, text->rectangular); text = converted; @@ -1555,15 +1536,6 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se #else /* Gtk 1 */ char *selBuffer = text->s; -#if PLAT_GTK_WIN32 - - // Many native win32 programs require \n line endings, - // so make a copy of the clip text now with newlines converted - - int new_len; - char *tmpstr = Document::TransformLineEnds(&new_len, selBuffer, text->len, SC_EOL_LF); - selBuffer = tmpstr; -#endif char *tmputf = 0; if ((info == TARGET_UTF8_STRING) || (info == TARGET_STRING)) { int len = strlen(selBuffer); @@ -1575,14 +1547,14 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se if (text->codePage != SC_CP_UTF8) { // Convert to UTF-8 //fprintf(stderr, "Convert to UTF-8 from %s\n", charSetBuffer); - tmputf = ConvertText(&len, selBuffer, len, "UTF-8", charSetBuffer); + tmputf = ConvertText(&len, selBuffer, len, "UTF-8", charSetBuffer, false); selBuffer = tmputf; } } else if (info == TARGET_STRING) { if (text->codePage == SC_CP_UTF8) { //fprintf(stderr, "Convert to locale %s\n", charSetBuffer); // Convert to locale - tmputf = ConvertText(&len, selBuffer, len, charSetBuffer, "UTF-8"); + tmputf = ConvertText(&len, selBuffer, len, charSetBuffer, "UTF-8", true); selBuffer = tmputf; } } @@ -1617,10 +1589,11 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se } delete []tmputf; -#if PLAT_GTK_WIN32 - delete []tmpstr; -#endif #endif /* Gtk >= 2 */ + +#if PLAT_GTK_WIN32 + delete newline_normalized; +#endif } #ifdef USE_GTK_CLIPBOARD @@ -1971,14 +1944,12 @@ static int KeyTranslate(int keyIn) { } } -gint ScintillaGTK::KeyThis(GdkEventKey *event) { - //Platform::DebugPrintf("SC-key: %d %x [%s]\n", +gboolean ScintillaGTK::KeyThis(GdkEventKey *event) { + //fprintf(stderr, "SC-key: %d %x [%s]\n", // event->keyval, event->state, (event->length > 0) ? event->string : "empty"); #if GTK_MAJOR_VERSION >= 2 - if (UseInputMethod()) { - if (gtk_im_context_filter_keypress(im_context, event)) { - return 1; - } + if (gtk_im_context_filter_keypress(im_context, event)) { + return 1; } #endif if (!event->keyval) { @@ -1988,7 +1959,7 @@ gint ScintillaGTK::KeyThis(GdkEventKey *event) { bool shift = (event->state & GDK_SHIFT_MASK) != 0; bool ctrl = (event->state & GDK_CONTROL_MASK) != 0; bool alt = (event->state & GDK_MOD1_MASK) != 0; - int key = event->keyval; + guint key = event->keyval; if (ctrl && (key < 128)) key = toupper(key); else if (!ctrl && (key >= GDK_KP_Multiply && key <= GDK_KP_9)) @@ -2008,7 +1979,7 @@ gint ScintillaGTK::KeyThis(GdkEventKey *event) { bool added = KeyDown(key, shift, ctrl, alt, &consumed) != 0; if (!consumed) consumed = added; - //Platform::DebugPrintf("SK-key: %d %x %x\n",event->keyval, event->state, consumed); + //fprintf(stderr, "SK-key: %d %x %x\n",event->keyval, event->state, consumed); if (event->keyval == 0xffffff && event->length > 0) { ClearSelection(); if (pdoc->InsertString(CurrentPosition(), event->string)) { @@ -2018,22 +1989,22 @@ gint ScintillaGTK::KeyThis(GdkEventKey *event) { return consumed; } -gint ScintillaGTK::KeyPress(GtkWidget *widget, GdkEventKey *event) { +gboolean ScintillaGTK::KeyPress(GtkWidget *widget, GdkEventKey *event) { ScintillaGTK *sciThis = ScintillaFromWidget(widget); return sciThis->KeyThis(event); } -gint ScintillaGTK::KeyRelease(GtkWidget *, GdkEventKey * /*event*/) { +gboolean ScintillaGTK::KeyRelease(GtkWidget *, GdkEventKey * /*event*/) { //Platform::DebugPrintf("SC-keyrel: %d %x %3s\n",event->keyval, event->state, event->string); return FALSE; } #if GTK_MAJOR_VERSION >= 2 -gint ScintillaGTK::ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis) { +gboolean ScintillaGTK::ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis) { return sciThis->ExposePreeditThis(widget, ose); } -gint ScintillaGTK::ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose) { +gboolean ScintillaGTK::ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose) { gchar *str; gint cursor_pos; PangoAttrList *attrs; @@ -2067,8 +2038,32 @@ void ScintillaGTK::Commit(GtkIMContext *, char *str, ScintillaGTK *sciThis) { sciThis->CommitThis(str); } -void ScintillaGTK::CommitThis(char *str) { - AddCharUTF(str, strlen(str)); +void ScintillaGTK::CommitThis(char *utfVal) { + //~ fprintf(stderr, "Commit '%s'\n", utfVal); + if (IsUnicodeMode()) { + AddCharUTF(utfVal,strlen(utfVal)); + } else { + const char *source = CharacterSetID(); + if (*source) { + Converter conv(source, "UTF-8", true); + if (conv) { + char localeVal[4]="\0\0\0"; + char *pin = utfVal; + size_t inLeft = strlen(utfVal); + char *pout = localeVal; + size_t outLeft = sizeof(localeVal); + size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions != ((size_t)(-1))) { + *pout = '\0'; + for (int i=0; localeVal[i]; i++) { + AddChar(localeVal[i]); + } + } else { + fprintf(stderr, "Conversion failed '%s'\n", utfVal); + } + } + } + } } void ScintillaGTK::PreeditChanged(GtkIMContext *, ScintillaGTK *sciThis) { @@ -2121,7 +2116,12 @@ gint ScintillaGTK::RealizeText(GtkWidget *widget, void*) { return FALSE; } -void ScintillaGTK::Destroy(GtkObject* object) { +#if GLIB_MAJOR_VERSION < 2 +void ScintillaGTK::Destroy(GtkObject *object) +#else +void ScintillaGTK::Destroy(GObject *object) +#endif +{ ScintillaObject *scio = reinterpret_cast(object); // This avoids a double destruction if (!scio->pscin) @@ -2130,8 +2130,12 @@ void ScintillaGTK::Destroy(GtkObject* object) { //Platform::DebugPrintf("Destroying %x %x\n", sciThis, object); sciThis->Finalise(); +#if GLIB_MAJOR_VERSION < 2 if (GTK_OBJECT_CLASS(parent_class)->destroy) (* GTK_OBJECT_CLASS(parent_class)->destroy)(object); +#else + // IS ANYTHING NEEDED ? +#endif delete sciThis; scio->pscin = 0; @@ -2193,7 +2197,7 @@ gint ScintillaGTK::ExposeTextThis(GtkWidget * /*widget*/, GdkEventExpose *ose) { paintState = notPainting; if (rgnUpdate) { - g_free(rgnUpdate); + gdk_region_destroy(rgnUpdate); } rgnUpdate = 0; @@ -2446,6 +2450,7 @@ static void scintilla_init(ScintillaObject *sci); extern void Platform_Initialise(); extern void Platform_Finalise(); +#if GLIB_MAJOR_VERSION < 2 GtkType scintilla_get_type() { static GtkType scintilla_type = 0; @@ -2467,26 +2472,60 @@ GtkType scintilla_get_type() { return scintilla_type; } +#else +GType scintilla_get_type() { + static GType scintilla_type = 0; -void ScintillaGTK::ClassInit(GtkObjectClass* object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class) { + if (!scintilla_type) { + scintilla_type = g_type_from_name("Scintilla"); + if (!scintilla_type) { + static GTypeInfo scintilla_info = { + (guint16) sizeof (ScintillaClass), + NULL, //(GBaseInitFunc) + NULL, //(GBaseFinalizeFunc) + (GClassInitFunc) scintilla_class_init, + NULL, //(GClassFinalizeFunc) + NULL, //gconstpointer data + (guint16) sizeof (ScintillaObject), + 0, //n_preallocs + (GInstanceInitFunc) scintilla_init, + NULL //(GTypeValueTable*) + }; + + scintilla_type = g_type_register_static( + GTK_TYPE_CONTAINER, "Scintilla", &scintilla_info, (GTypeFlags) 0); + } + } + + return scintilla_type; +} +#endif + +void ScintillaGTK::ClassInit(OBJECT_CLASS* object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class) { +#if GLIB_MAJOR_VERSION >= 2 + Platform_Initialise(); +#endif atomClipboard = gdk_atom_intern("CLIPBOARD", FALSE); atomUTF8 = gdk_atom_intern("UTF8_STRING", FALSE); atomString = GDK_SELECTION_TYPE_STRING; atomUriList = gdk_atom_intern("text/uri-list", FALSE); + atomDROPFILES_DND = gdk_atom_intern("DROPFILES_DND", FALSE); // Define default signal handlers for the class: Could move more // of the signal handlers here (those that currently attached to wDraw // in Initialise() may require coordinate translation?) +#if GLIB_MAJOR_VERSION < 2 object_class->destroy = Destroy; - +#else + object_class->finalize = Destroy; +#endif widget_class->size_request = SizeRequest; widget_class->size_allocate = SizeAllocate; widget_class->expose_event = ExposeMain; #if GTK_MAJOR_VERSION < 2 widget_class->draw = Draw; #endif - widget_class->motion_notify_event = Motion; widget_class->button_press_event = Press; widget_class->button_release_event = MouseRelease; @@ -2519,19 +2558,21 @@ void ScintillaGTK::ClassInit(GtkObjectClass* object_class, GtkWidgetClass *widge container_class->forall = MainForAll; } -#if GTK_MAJOR_VERSION < 2 +#if GLIB_MAJOR_VERSION < 2 #define GTK_CLASS_TYPE(c) (c->type) #define SIG_MARSHAL gtk_marshal_NONE__INT_POINTER +#define MARSHAL_ARGUMENTS GTK_TYPE_INT, GTK_TYPE_POINTER #else #define SIG_MARSHAL scintilla_marshal_NONE__INT_POINTER +#define MARSHAL_ARGUMENTS G_TYPE_INT, G_TYPE_POINTER #endif -#define MARSHAL_ARGUMENTS GTK_TYPE_INT, GTK_TYPE_POINTER static void scintilla_class_init(ScintillaClass *klass) { - GtkObjectClass *object_class = (GtkObjectClass*) klass; + OBJECT_CLASS *object_class = (OBJECT_CLASS*) klass; GtkWidgetClass *widget_class = (GtkWidgetClass*) klass; GtkContainerClass *container_class = (GtkContainerClass*) klass; +#if GLIB_MAJOR_VERSION < 2 parent_class = (GtkWidgetClass*) gtk_type_class(gtk_container_get_type()); scintilla_signals[COMMAND_SIGNAL] = gtk_signal_new( @@ -2551,9 +2592,31 @@ static void scintilla_class_init(ScintillaClass *klass) { SIG_MARSHAL, GTK_TYPE_NONE, 2, MARSHAL_ARGUMENTS); -#if GTK_MAJOR_VERSION < 2 gtk_object_class_add_signals(object_class, reinterpret_cast(scintilla_signals), LAST_SIGNAL); +#else + GSignalFlags sigflags = GSignalFlags(G_SIGNAL_ACTION | G_SIGNAL_RUN_LAST); + scintilla_signals[COMMAND_SIGNAL] = g_signal_new( + "command", + G_TYPE_FROM_CLASS(object_class), + sigflags, + G_STRUCT_OFFSET(ScintillaClass, command), + NULL, //(GSignalAccumulator) + NULL, //(gpointer) + SIG_MARSHAL, + G_TYPE_NONE, + 2, MARSHAL_ARGUMENTS); + + scintilla_signals[NOTIFY_SIGNAL] = g_signal_new( + SCINTILLA_NOTIFY, + G_TYPE_FROM_CLASS(object_class), + sigflags, + G_STRUCT_OFFSET(ScintillaClass, notify), + NULL, + NULL, + SIG_MARSHAL, + G_TYPE_NONE, + 2, MARSHAL_ARGUMENTS); #endif klass->command = NULL; klass->notify = NULL; @@ -2567,7 +2630,11 @@ static void scintilla_init(ScintillaObject *sci) { } GtkWidget* scintilla_new() { +#if GLIB_MAJOR_VERSION < 2 return GTK_WIDGET(gtk_type_new(scintilla_get_type())); +#else + return GTK_WIDGET(g_object_new(scintilla_get_type(), NULL)); +#endif } void scintilla_set_id(ScintillaObject *sci, uptr_t id) { diff --git a/scintilla/ViewStyle.cxx b/scintilla/ViewStyle.cxx index f221af19..b4da30ac 100644 --- a/scintilla/ViewStyle.cxx +++ b/scintilla/ViewStyle.cxx @@ -17,7 +17,7 @@ #include "ViewStyle.h" MarginStyle::MarginStyle() : - symbol(false), width(16), mask(0xffffffff), sensitive(false) { + style(SC_MARGIN_SYMBOL), width(0), mask(0), sensitive(false) { } // A list of the fontnames - avoids wasting space in each style @@ -73,6 +73,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) { selbackset = source.selbackset; selbackground.desired = source.selbackground.desired; selbackground2.desired = source.selbackground2.desired; + selAlpha = source.selAlpha; foldmarginColourSet = source.foldmarginColourSet; foldmarginColour.desired = source.foldmarginColour.desired; @@ -141,6 +142,7 @@ void ViewStyle::Init() { selbackset = true; selbackground.desired = ColourDesired(0xc0, 0xc0, 0xc0); selbackground2.desired = ColourDesired(0xb0, 0xb0, 0xb0); + selAlpha = SC_ALPHA_NOALPHA; foldmarginColourSet = false; foldmarginColour.desired = ColourDesired(0xff, 0, 0); @@ -173,13 +175,13 @@ void ViewStyle::Init() { leftMarginWidth = 1; rightMarginWidth = 1; - ms[0].symbol = false; + ms[0].style = SC_MARGIN_NUMBER; ms[0].width = 0; ms[0].mask = 0; - ms[1].symbol = true; + ms[1].style = SC_MARGIN_SYMBOL; ms[1].width = 16; ms[1].mask = ~SC_MASK_FOLDERS; - ms[2].symbol = true; + ms[2].style = SC_MARGIN_SYMBOL; ms[2].width = 0; ms[2].mask = 0; fixedColumnWidth = leftMarginWidth; @@ -187,7 +189,7 @@ void ViewStyle::Init() { maskInLine = 0xffffffff; for (int margin=0; margin < margins; margin++) { fixedColumnWidth += ms[margin].width; - symbolMargin = symbolMargin || ms[margin].symbol; + symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER); if (ms[margin].width > 0) maskInLine &= ~ms[margin].mask; } @@ -258,7 +260,7 @@ void ViewStyle::Refresh(Surface &surface) { maskInLine = 0xffffffff; for (int margin=0; margin < margins; margin++) { fixedColumnWidth += ms[margin].width; - symbolMargin = symbolMargin || ms[margin].symbol; + symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER); if (ms[margin].width > 0) maskInLine &= ~ms[margin].mask; } diff --git a/scintilla/ViewStyle.h b/scintilla/ViewStyle.h index 90d50b1f..75f899d9 100644 --- a/scintilla/ViewStyle.h +++ b/scintilla/ViewStyle.h @@ -12,7 +12,7 @@ */ class MarginStyle { public: - bool symbol; + int style; int width; int mask; bool sensitive; @@ -53,6 +53,7 @@ public: bool selbackset; ColourPair selbackground; ColourPair selbackground2; + int selAlpha; bool whitespaceForegroundSet; ColourPair whitespaceForeground; bool whitespaceBackgroundSet; @@ -70,7 +71,7 @@ public: bool hotspotUnderline; bool hotspotSingleLine; /// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin - enum { margins=3 }; + enum { margins=5 }; int leftMarginWidth; ///< Spacing margin on left of text int rightMarginWidth; ///< Spacing margin on left of text bool symbolMargin; diff --git a/scintilla/include/HFacer.py b/scintilla/include/HFacer.py index 5f19ef94..8c780d51 100644 --- a/scintilla/include/HFacer.py +++ b/scintilla/include/HFacer.py @@ -67,6 +67,10 @@ def Regenerate(filename, genfn, definition): os.rename(tempname, filename) f = Face.Face() -f.ReadFromFile("Scintilla.iface") -Regenerate("Scintilla.h", printHFile, f) -Regenerate("SciLexer.h", printLexHFile, f) +try: + f.ReadFromFile("Scintilla.iface") + Regenerate("Scintilla.h", printHFile, f) + Regenerate("SciLexer.h", printLexHFile, f) + print "Maximum ID is", max(x for x in f.values if int(x) < 3000) +except: + raise diff --git a/scintilla/include/SciLexer.h b/scintilla/include/SciLexer.h index c921a8e6..92724cf7 100644 --- a/scintilla/include/SciLexer.h +++ b/scintilla/include/SciLexer.h @@ -90,7 +90,8 @@ #define SCLEX_FREEBASIC 75 #define SCLEX_INNOSETUP 76 #define SCLEX_OPAL 77 -#define SCLEX_OMS 78 +#define SCLEX_SPICE 78 +#define SCLEX_OMS 79 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -148,6 +149,8 @@ #define SCE_TCL_WORD6 17 #define SCE_TCL_WORD7 18 #define SCE_TCL_WORD8 19 +#define SCE_TCL_COMMENT_BOX 20 +#define SCE_TCL_BLOCK_COMMENT 21 #define SCE_H_DEFAULT 0 #define SCE_H_TAG 1 #define SCE_H_TAGUNKNOWN 2 @@ -819,6 +822,7 @@ #define SCE_AU3_SPECIAL 12 #define SCE_AU3_EXPAND 13 #define SCE_AU3_COMOBJ 14 +#define SCE_AU3_UDF 15 #define SCE_APDL_DEFAULT 0 #define SCE_APDL_COMMENT 1 #define SCE_APDL_COMMENTBLOCK 2 @@ -1055,6 +1059,15 @@ #define SCE_OPAL_PAR 7 #define SCE_OPAL_BOOL_CONST 8 #define SCE_OPAL_DEFAULT 32 +#define SCE_SPICE_DEFAULT 0 +#define SCE_SPICE_IDENTIFIER 1 +#define SCE_SPICE_KEYWORD 2 +#define SCE_SPICE_KEYWORD2 3 +#define SCE_SPICE_KEYWORD3 4 +#define SCE_SPICE_NUMBER 5 +#define SCE_SPICE_DELIMITER 6 +#define SCE_SPICE_VALUE 7 +#define SCE_SPICE_COMMENTLINE 8 #define SCLEX_ASP 29 #define SCLEX_PHP 30 //--Autogenerated -- end of section automatically generated from Scintilla.iface diff --git a/scintilla/include/Scintilla.h b/scintilla/include/Scintilla.h index 035ca04f..426c8d4e 100644 --- a/scintilla/include/Scintilla.h +++ b/scintilla/include/Scintilla.h @@ -138,8 +138,11 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_MARKERPREVIOUS 2048 #define SCI_MARKERDEFINEPIXMAP 2049 #define SCI_MARKERADDSET 2466 +#define SCI_MARKERSETALPHA 2476 #define SC_MARGIN_SYMBOL 0 #define SC_MARGIN_NUMBER 1 +#define SC_MARGIN_BACK 2 +#define SC_MARGIN_FORE 3 #define SCI_SETMARGINTYPEN 2240 #define SCI_GETMARGINTYPEN 2241 #define SCI_SETMARGINWIDTHN 2242 @@ -196,6 +199,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_STYLESETHOTSPOT 2409 #define SCI_SETSELFORE 2067 #define SCI_SETSELBACK 2068 +#define SCI_GETSELALPHA 2477 +#define SCI_SETSELALPHA 2478 #define SCI_SETCARETFORE 2069 #define SCI_ASSIGNCMDKEY 2070 #define SCI_CLEARCMDKEY 2071 diff --git a/scintilla/include/ScintillaWidget.h b/scintilla/include/ScintillaWidget.h index 7f47de7e..9d23ce2a 100644 --- a/scintilla/include/ScintillaWidget.h +++ b/scintilla/include/ScintillaWidget.h @@ -34,7 +34,11 @@ struct _ScintillaClass { void (* notify) (ScintillaObject *ttt); }; +#if GLIB_MAJOR_VERSION < 2 GtkType scintilla_get_type (void); +#else +GType scintilla_get_type (void); +#endif GtkWidget* scintilla_new (void); void scintilla_set_id (ScintillaObject *sci, uptr_t id); sptr_t scintilla_send_message (ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);