Revision: 4923 http://geany.svn.sourceforge.net/geany/?rev=4923&view=rev Author: eht16 Date: 2010-05-16 17:44:24 +0000 (Sun, 16 May 2010)
Log Message: ----------- Update Scintilla to version 2.11.
Modified Paths: -------------- trunk/ChangeLog trunk/geany.pc.in trunk/plugins/Makefile.am trunk/scintilla/AutoComplete.cxx trunk/scintilla/AutoComplete.h trunk/scintilla/CallTip.cxx trunk/scintilla/CallTip.h trunk/scintilla/CellBuffer.cxx trunk/scintilla/CellBuffer.h trunk/scintilla/Converter.h trunk/scintilla/Decoration.h trunk/scintilla/Document.cxx trunk/scintilla/Document.h trunk/scintilla/Editor.cxx trunk/scintilla/Editor.h trunk/scintilla/LexHTML.cxx trunk/scintilla/LexOthers.cxx trunk/scintilla/PlatGTK.cxx trunk/scintilla/PositionCache.cxx trunk/scintilla/PositionCache.h trunk/scintilla/RESearch.cxx trunk/scintilla/ScintillaBase.cxx trunk/scintilla/ScintillaGTK.cxx trunk/scintilla/Style.cxx trunk/scintilla/StyleContext.h trunk/scintilla/UniConversion.cxx trunk/scintilla/UniConversion.h trunk/scintilla/XPM.h trunk/scintilla/include/Scintilla.h trunk/scintilla/include/Scintilla.iface trunk/scintilla/include/ScintillaWidget.h trunk/src/Makefile.am trunk/src/plugindata.h trunk/wscript
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/ChangeLog 2010-05-16 17:44:24 UTC (rev 4923) @@ -11,6 +11,9 @@ * src/geanymenubuttonaction.c: Explicitly check for the type when iterating the action's proxies. For some reason on Windows, a GtkImageMenuItem proxy is created. + * geany.pc.in, wscript, plugins/Makefile.am, src/Makefile.am, + src/plugindata.h, scintilla/*, scintilla/include/*: + Update Scintilla to version 2.11.
2010-05-15 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/geany.pc.in =================================================================== --- trunk/geany.pc.in 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/geany.pc.in 2010-05-16 17:44:24 UTC (rev 4923) @@ -11,4 +11,4 @@ Requires: gtk+-2.0 >= 2.8.0 Version: @VERSION@ Libs: -L${libdir} -Cflags: -I${includedir}/geany -I${includedir}/geany/tagmanager -I${includedir}/geany/scintilla +Cflags: -DGTK -I${includedir}/geany -I${includedir}/geany/tagmanager -I${includedir}/geany/scintilla
Modified: trunk/plugins/Makefile.am =================================================================== --- trunk/plugins/Makefile.am 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/plugins/Makefile.am 2010-05-16 17:44:24 UTC (rev 4923) @@ -97,6 +97,7 @@
AM_CPPFLAGS = \ -DDATADIR="$(datadir)" \ + -DGTK \ -I$(top_srcdir)/src \ -I$(top_srcdir)/tagmanager/include \ -I$(top_srcdir)/scintilla/include \
Modified: trunk/scintilla/AutoComplete.cxx =================================================================== --- trunk/scintilla/AutoComplete.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/AutoComplete.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -43,12 +43,12 @@ } }
-bool AutoComplete::Active() { +bool AutoComplete::Active() const { return active; }
-void AutoComplete::Start(Window &parent, int ctrlID, - int position, Point location, int startLen_, +void AutoComplete::Start(Window &parent, int ctrlID, + int position, Point location, int startLen_, int lineHeight, bool unicodeMode) { if (active) { Cancel(); @@ -82,7 +82,7 @@ separator = separator_; }
-char AutoComplete::GetSeparator() { +char AutoComplete::GetSeparator() const { return separator; }
@@ -90,7 +90,7 @@ typesep = separator_; }
-char AutoComplete::GetTypesep() { +char AutoComplete::GetTypesep() const { return typesep; }
Modified: trunk/scintilla/AutoComplete.h =================================================================== --- trunk/scintilla/AutoComplete.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/AutoComplete.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -36,7 +36,7 @@ ~AutoComplete();
/// Is the auto completion list displayed? - bool Active(); + bool Active() const;
/// Display the auto completion list positioned to be near a character position void Start(Window &parent, int ctrlID, int position, Point location, @@ -52,11 +52,11 @@
/// The separator character is used when interpreting the list in SetList void SetSeparator(char separator_); - char GetSeparator(); + char GetSeparator() const;
/// The typesep character is used for seperating the word from the type void SetTypesep(char separator_); - char GetTypesep(); + char GetTypesep() const;
/// The list string contains a sequence of words separated by the separator character void SetList(const char *list);
Modified: trunk/scintilla/CallTip.cxx =================================================================== --- trunk/scintilla/CallTip.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/CallTip.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -68,7 +68,7 @@ }
// We ignore tabs unless a tab width has been set. -bool CallTip::IsTabCharacter(char ch) { +bool CallTip::IsTabCharacter(char ch) const { return (tabSize > 0) && (ch == '\t'); }
@@ -95,7 +95,7 @@ int maxEnd = 0; const int numEnds = 10; int ends[numEnds + 2]; - for (int i=0;i<len;i++) { + for (int i=0; i<len; i++) { if ((maxEnd < numEnds) && (IsArrowCharacter(s[i]) || IsTabCharacter(s[i])) ) { if (i > 0)
Modified: trunk/scintilla/CallTip.h =================================================================== --- trunk/scintilla/CallTip.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/CallTip.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -33,7 +33,7 @@ int posStart, int posEnd, int ytext, PRectangle rcClient, bool highlight, bool draw); int PaintContents(Surface *surfaceWindow, bool draw); - bool IsTabCharacter(char c); + bool IsTabCharacter(char c) const; int NextTabPos(int x);
public: @@ -61,7 +61,7 @@
/// Setup the calltip and return a rectangle of the area required. PRectangle CallTipStart(int pos, Point pt, const char *defn, - const char *faceName, int size, int codePage_, + const char *faceName, int size, int codePage_, int characterSet, Window &wParent);
void CallTipCancel();
Modified: trunk/scintilla/CellBuffer.cxx =================================================================== --- trunk/scintilla/CellBuffer.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/CellBuffer.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -197,7 +197,7 @@ // Insertions must be immediately after to coalesce currentAction++; } else if (at == removeAction) { - if ((lengthData == 1) || (lengthData == 2)){ + if ((lengthData == 1) || (lengthData == 2)) { if ((position + lengthData) == actPrevious->position) { ; // Backspace -> OK } else if (position == actPrevious->position) { @@ -349,7 +349,7 @@ lengthRetrieve, substance.Length()); return; } - + for (int i=0; i<lengthRetrieve; i++) { *buffer++ = substance.ValueAt(position + i); } @@ -359,7 +359,7 @@ return style.ValueAt(position); }
-const char *CellBuffer::BufferPointer() { +const char *CellBuffer::BufferPointer() { return substance.BufferPointer(); }
@@ -455,7 +455,7 @@ return lv.LineStart(line); }
-bool CellBuffer::IsReadOnly() { +bool CellBuffer::IsReadOnly() const { return readOnly; }
@@ -586,7 +586,7 @@ return collectingUndo; }
-bool CellBuffer::IsCollectingUndo() { +bool CellBuffer::IsCollectingUndo() const { return collectingUndo; }
Modified: trunk/scintilla/CellBuffer.h =================================================================== --- trunk/scintilla/CellBuffer.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/CellBuffer.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -170,7 +170,7 @@
const char *DeleteChars(int position, int deleteLength, bool &startSequence);
- bool IsReadOnly(); + bool IsReadOnly() const; void SetReadOnly(bool set);
/// The save point is a marker in the undo stack where the container has stated that @@ -183,7 +183,7 @@ void BasicDeleteChars(int position, int deleteLength);
bool SetUndoCollection(bool collectUndo); - bool IsCollectingUndo(); + bool IsCollectingUndo() const; void BeginUndoAction(); void EndUndoAction(); void AddUndoAction(int token, bool mayCoalesce);
Modified: trunk/scintilla/Converter.h =================================================================== --- trunk/scintilla/Converter.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/Converter.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -3,12 +3,7 @@ // Copyright 2004 by Neil Hodgson neilh@scintilla.org // The License.txt file describes the conditions under which this software may be distributed.
-#include <iconv.h> -#if GTK_MAJOR_VERSION >= 2 - typedef GIConv ConverterHandle; -#else - typedef iconv_t ConverterHandle; -#endif +typedef GIConv ConverterHandle; const ConverterHandle iconvhBad = (ConverterHandle)(-1); // Since various versions of iconv can not agree on whether the src argument // is char ** or const char ** provide a templatised adaptor. @@ -24,11 +19,7 @@ class Converter { ConverterHandle iconvh; void OpenHandle(const char *fullDestination, const char *charSetSource) { -#if GTK_MAJOR_VERSION >= 2 iconvh = g_iconv_open(fullDestination, charSetSource); -#else - iconvh = iconv_open(fullDestination, charSetSource); -#endif } bool Succeeded() const { return iconvh != iconvhBad; @@ -65,11 +56,7 @@ } void Close() { if (Succeeded()) { -#if GTK_MAJOR_VERSION >= 2 g_iconv_close(iconvh); -#else - iconv_close(iconvh); -#endif iconvh = iconvhBad; } } @@ -77,11 +64,7 @@ if (!Succeeded()) { return (size_t)(-1); } else { -#if GTK_MAJOR_VERSION >= 2 return iconv_adaptor(g_iconv, iconvh, src, srcleft, dst, dstleft); -#else - return iconv_adaptor(iconv, iconvh, src, srcleft, dst, dstleft); -#endif } } };
Modified: trunk/scintilla/Decoration.h =================================================================== --- trunk/scintilla/Decoration.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/Decoration.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -40,10 +40,10 @@ ~DecorationList();
void SetCurrentIndicator(int indicator); - int GetCurrentIndicator() { return currentIndicator; } + int GetCurrentIndicator() const { return currentIndicator; }
void SetCurrentValue(int value); - int GetCurrentValue() { return currentValue; } + int GetCurrentValue() const { return currentValue; }
// Returns true if some values may have changed bool FillRange(int &position, int value, int &fillLength);
Modified: trunk/scintilla/Document.cxx =================================================================== --- trunk/scintilla/Document.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/Document.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -10,6 +10,17 @@ #include <stdio.h> #include <ctype.h>
+#include <string> +#include <vector> + +// With Borland C++ 5.5, including <string> includes Windows.h leading to defining +// FindText to FindTextA which makes calls here to Document::FindText fail. +#ifdef __BORLANDC__ +#ifdef FindText +#undef FindText +#endif +#endif + #include "Platform.h"
#include "Scintilla.h" @@ -22,6 +33,7 @@ #include "Decoration.h" #include "Document.h" #include "RESearch.h" +#include "UniConversion.h"
#ifdef SCI_NAMESPACE using namespace Scintilla; @@ -140,13 +152,13 @@ NotifySavePoint(true); }
-int Document::GetMark(int line) { - return static_cast<LineMarkers*>(perLineData[ldMarkers])->MarkValue(line); +int Document::GetMark(int line) { + return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkValue(line); }
int Document::AddMark(int line, int markerNum) { if (line <= LinesTotal()) { - int prev = static_cast<LineMarkers*>(perLineData[ldMarkers])-> + int prev = static_cast<LineMarkers *>(perLineData[ldMarkers])-> AddMark(line, markerNum, LinesTotal()); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); @@ -160,20 +172,20 @@ unsigned int m = valueSet; for (int i = 0; m; i++, m >>= 1) if (m & 1) - static_cast<LineMarkers*>(perLineData[ldMarkers])-> + static_cast<LineMarkers *>(perLineData[ldMarkers])-> AddMark(line, i, LinesTotal()); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); }
void Document::DeleteMark(int line, int markerNum) { - static_cast<LineMarkers*>(perLineData[ldMarkers])->DeleteMark(line, markerNum, false); + static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, false); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); }
void Document::DeleteMarkFromHandle(int markerHandle) { - static_cast<LineMarkers*>(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle); + static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle); DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); mh.line = -1; NotifyModified(mh); @@ -181,15 +193,15 @@
void Document::DeleteAllMarks(int markerNum) { for (int line = 0; line < LinesTotal(); line++) { - static_cast<LineMarkers*>(perLineData[ldMarkers])->DeleteMark(line, markerNum, true); + static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, true); } DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); mh.line = -1; NotifyModified(mh); }
-int Document::LineFromHandle(int markerHandle) { - return static_cast<LineMarkers*>(perLineData[ldMarkers])->LineFromHandle(markerHandle); +int Document::LineFromHandle(int markerHandle) { + return static_cast<LineMarkers *>(perLineData[ldMarkers])->LineFromHandle(markerHandle); }
int Document::LineStart(int line) const { @@ -226,7 +238,7 @@ int startPosition = LineStart(line); int endLine = LineEnd(line); int startText = startPosition; - while (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\t' ) ) + while (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\t')) startText++; if (position == startText) return startPosition; @@ -235,7 +247,7 @@ }
int Document::SetLevel(int line, int level) { - int prev = static_cast<LineLevels*>(perLineData[ldLevels])->SetLevel(line, level, LinesTotal()); + int prev = static_cast<LineLevels *>(perLineData[ldLevels])->SetLevel(line, level, LinesTotal()); if (prev != level) { DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); @@ -246,12 +258,12 @@ return prev; }
-int Document::GetLevel(int line) { - return static_cast<LineLevels*>(perLineData[ldLevels])->GetLevel(line); +int Document::GetLevel(int line) { + return static_cast<LineLevels *>(perLineData[ldLevels])->GetLevel(line); }
-void Document::ClearLevels() { - static_cast<LineLevels*>(perLineData[ldLevels])->ClearLevels(); +void Document::ClearLevels() { + static_cast<LineLevels *>(perLineData[ldLevels])->ClearLevels(); }
static bool IsSubordinate(int levelStart, int levelTry) { @@ -437,7 +449,7 @@ while (posCheck < pos) { char mbstr[maxBytesInDBCSCharacter+1]; int i; - for(i=0;i<Platform::DBCSCharMaxLength();i++) { + for (i=0; i<Platform::DBCSCharMaxLength(); i++) { mbstr[i] = cb.CharAt(posCheck+i); } mbstr[i] = '\0'; @@ -739,7 +751,7 @@ if ((line >= 0) && (line < LinesTotal())) { int lineStart = LineStart(line); int length = Length(); - for (int i = lineStart;i < length;i++) { + for (int i = lineStart; i < length; i++) { char ch = cb.CharAt(i); if (ch == ' ') indent++; @@ -782,7 +794,7 @@ int column = 0; int line = LineFromPosition(pos); if ((line >= 0) && (line < LinesTotal())) { - for (int i = LineStart(line);i < pos;) { + for (int i = LineStart(line); i < pos;) { char ch = cb.CharAt(i); if (ch == '\t') { column = NextTab(column, tabInChars); @@ -969,7 +981,7 @@ while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) pos++; } - return MovePositionOutsideChar(pos, delta); + return MovePositionOutsideChar(pos, delta, true); }
/** @@ -1074,79 +1086,170 @@ return static_cast<char>(ch - 'A' + 'a'); }
+static bool GoodTrailByte(int v) { + return (v >= 0x80) && (v < 0xc0); +} + +size_t Document::ExtractChar(int pos, char *bytes) { + unsigned char ch = static_cast<unsigned char>(cb.CharAt(pos)); + size_t widthChar = UTF8CharLength(ch); + bytes[0] = ch; + for (size_t i=1; i<widthChar; i++) { + bytes[i] = cb.CharAt(pos+i); + if (!GoodTrailByte(static_cast<unsigned char>(bytes[i]))) { // Bad byte + widthChar = 1; + } + } + return widthChar; +} + +CaseFolderTable::CaseFolderTable() { + for (size_t iChar=0; iChar<sizeof(mapping); iChar++) { + mapping[iChar] = static_cast<char>(iChar); + } +} + +CaseFolderTable::~CaseFolderTable() { +} + +size_t CaseFolderTable::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) { + if (lenMixed > sizeFolded) { + return 0; + } else { + for (size_t i=0; i<lenMixed; i++) { + folded[i] = mapping[static_cast<unsigned char>(mixed[i])]; + } + return lenMixed; + } +} + +void CaseFolderTable::SetTranslation(char ch, char chTranslation) { + mapping[static_cast<unsigned char>(ch)] = chTranslation; +} + +void CaseFolderTable::StandardASCII() { + for (size_t iChar=0; iChar<sizeof(mapping); iChar++) { + if (iChar >= 'A' && iChar <= 'Z') { + mapping[iChar] = static_cast<char>(iChar - 'A' + 'a'); + } else { + mapping[iChar] = static_cast<char>(iChar); + } + } +} + +bool Document::MatchesWordOptions(bool word, bool wordStart, int pos, int length) { + return (!word && !wordStart) || + (word && IsWordAt(pos, pos + length)) || + (wordStart && IsWordStartAt(pos)); +} + /** * Find text in document, supporting both forward and backward * searches (just pass minPos > maxPos to do a backward search) * Has not been tested with backwards DBCS searches yet. */ -long Document::FindText(int minPos, int maxPos, const char *s, +long Document::FindText(int minPos, int maxPos, const char *search, bool caseSensitive, bool word, bool wordStart, bool regExp, int flags, - int *length) { + int *length, CaseFolder *pcf) { if (regExp) { if (!regex) regex = CreateRegexSearch(&charClass); - return regex->FindText(this, minPos, maxPos, s, caseSensitive, word, wordStart, flags, length); + return regex->FindText(this, minPos, maxPos, search, caseSensitive, word, wordStart, flags, length); } else {
- bool forward = minPos <= maxPos; - int increment = forward ? 1 : -1; + const bool forward = minPos <= maxPos; + const int increment = forward ? 1 : -1;
// Range endpoints should not be inside DBCS characters, but just in case, move them. - int startPos = MovePositionOutsideChar(minPos, increment, false); - int endPos = MovePositionOutsideChar(maxPos, increment, false); + const int startPos = MovePositionOutsideChar(minPos, increment, false); + const int endPos = MovePositionOutsideChar(maxPos, increment, false);
// Compute actual search ranges needed - int lengthFind = *length; - if (lengthFind == -1) - lengthFind = static_cast<int>(strlen(s)); - int endSearch = endPos; - if (startPos <= endPos) { - endSearch = endPos - lengthFind + 1; - } + const int lengthFind = (*length == -1) ? static_cast<int>(strlen(search)) : *length; + const int endSearch = (startPos <= endPos) ? endPos - lengthFind + 1 : endPos; + //Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind); - char firstChar = s[0]; - if (!caseSensitive) - firstChar = static_cast<char>(MakeUpperCase(firstChar)); + const int limitPos = Platform::Maximum(startPos, endPos); int pos = forward ? startPos : (startPos - 1); - while (forward ? (pos < endSearch) : (pos >= endSearch)) { - char ch = CharAt(pos); - if (caseSensitive) { - if (ch == firstChar) { - bool found = true; - if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; - for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { - ch = CharAt(pos + posMatch); - if (ch != s[posMatch]) - found = false; + if (caseSensitive) { + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + bool found = (pos + lengthFind) <= limitPos; + for (int indexSearch = 0; (indexSearch < lengthFind) && found; indexSearch++) { + found = CharAt(pos + indexSearch) == search[indexSearch]; + } + if (found && MatchesWordOptions(word, wordStart, pos, lengthFind)) { + return pos; + } + pos += increment; + if (dbcsCodePage && (pos >= 0)) { + // Have to use >= 0 as otherwise next statement would change + // -1 to 0 and make loop infinite. + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); + } + } + } else if (SC_CP_UTF8 == dbcsCodePage) { + const size_t maxBytesCharacter = 4; + const size_t maxFoldingExpansion = 4; + std::vector<char> searchThing(lengthFind * maxBytesCharacter * maxFoldingExpansion + 1); + const int lenSearch = pcf->Fold(&searchThing[0], searchThing.size(), search, lengthFind); + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + int widthFirstCharacter = 0; + int indexDocument = 0; + int indexSearch = 0; + bool characterMatches = true; + while (characterMatches && + ((pos + indexDocument) < limitPos) && + (indexSearch < lenSearch)) { + char bytes[maxBytesCharacter + 1]; + bytes[maxBytesCharacter] = 0; + const int widthChar = ExtractChar(pos + indexDocument, bytes); + if (!widthFirstCharacter) + widthFirstCharacter = widthChar; + char folded[maxBytesCharacter * maxFoldingExpansion + 1]; + const int lenFlat = pcf->Fold(folded, sizeof(folded), bytes, widthChar); + folded[lenFlat] = 0; + // Does folded match the buffer + characterMatches = 0 == memcmp(folded, &searchThing[0] + indexSearch, lenFlat); + indexDocument += widthChar; + indexSearch += lenFlat; + } + if (characterMatches && (indexSearch == static_cast<int>(lenSearch))) { + if (MatchesWordOptions(word, wordStart, pos, indexDocument)) { + *length = indexDocument; + return pos; } - if (found) { - if ((!word && !wordStart) || - (word && IsWordAt(pos, pos + lengthFind)) || - (wordStart && IsWordStartAt(pos))) - return pos; - } } - } else { - if (MakeUpperCase(ch) == firstChar) { - bool found = true; - if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; - for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { - ch = CharAt(pos + posMatch); - if (MakeUpperCase(ch) != MakeUpperCase(s[posMatch])) - found = false; + if (forward) { + pos += widthFirstCharacter; + } else { + pos--; + if (pos > 0) { + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); } - if (found) { - if ((!word && !wordStart) || - (word && IsWordAt(pos, pos + lengthFind)) || - (wordStart && IsWordStartAt(pos))) - return pos; - } } } - pos += increment; - if (dbcsCodePage && (pos >= 0)) { - // Ensure trying to match from start of character - pos = MovePositionOutsideChar(pos, increment, false); + } else { + CaseFolderTable caseFolder; + std::vector<char> searchThing(lengthFind + 1); + pcf->Fold(&searchThing[0], searchThing.size(), search, lengthFind); + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + bool found = (pos + lengthFind) <= limitPos; + for (int indexSearch = 0; (indexSearch < lengthFind) && found; indexSearch++) { + char ch = CharAt(pos + indexSearch); + char folded[2]; + pcf->Fold(folded, sizeof(folded), &ch, 1); + found = folded[0] == searchThing[indexSearch]; + } + if (found && MatchesWordOptions(word, wordStart, pos, lengthFind)) { + return pos; + } + pos += increment; + if (dbcsCodePage && (pos >= 0)) { + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); + } } } } @@ -1256,7 +1359,7 @@ }
int Document::SetLineState(int line, int state) { - int statePrevious = static_cast<LineState*>(perLineData[ldState])->SetLineState(line, state); + int statePrevious = static_cast<LineState *>(perLineData[ldState])->SetLineState(line, state); if (state != statePrevious) { DocModification mh(SC_MOD_CHANGELINESTATE, 0, 0, 0, 0, line); NotifyModified(mh); @@ -1264,59 +1367,59 @@ return statePrevious; }
-int Document::GetLineState(int line) { - return static_cast<LineState*>(perLineData[ldState])->GetLineState(line); +int Document::GetLineState(int line) { + return static_cast<LineState *>(perLineData[ldState])->GetLineState(line); }
-int Document::GetMaxLineState() { - return static_cast<LineState*>(perLineData[ldState])->GetMaxLineState(); +int Document::GetMaxLineState() { + return static_cast<LineState *>(perLineData[ldState])->GetMaxLineState(); }
StyledText Document::MarginStyledText(int line) { - LineAnnotation *pla = static_cast<LineAnnotation*>(perLineData[ldMargin]); - return StyledText(pla->Length(line), pla->Text(line), + LineAnnotation *pla = static_cast<LineAnnotation *>(perLineData[ldMargin]); + return StyledText(pla->Length(line), pla->Text(line), pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); }
void Document::MarginSetText(int line, const char *text) { - static_cast<LineAnnotation*>(perLineData[ldMargin])->SetText(line, text); + static_cast<LineAnnotation *>(perLineData[ldMargin])->SetText(line, text); DocModification mh(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line); NotifyModified(mh); }
void Document::MarginSetStyle(int line, int style) { - static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyle(line, style); + static_cast<LineAnnotation *>(perLineData[ldMargin])->SetStyle(line, style); }
void Document::MarginSetStyles(int line, const unsigned char *styles) { - static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyles(line, styles); + static_cast<LineAnnotation *>(perLineData[ldMargin])->SetStyles(line, styles); }
int Document::MarginLength(int line) const { - return static_cast<LineAnnotation*>(perLineData[ldMargin])->Length(line); + return static_cast<LineAnnotation *>(perLineData[ldMargin])->Length(line); }
void Document::MarginClearAll() { int maxEditorLine = LinesTotal(); - for (int l=0;l<maxEditorLine;l++) + for (int l=0; l<maxEditorLine; l++) MarginSetText(l, 0); // Free remaining data - static_cast<LineAnnotation*>(perLineData[ldMargin])->ClearAll(); + static_cast<LineAnnotation *>(perLineData[ldMargin])->ClearAll(); }
bool Document::AnnotationAny() const { - return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->AnySet(); + return static_cast<LineAnnotation *>(perLineData[ldAnnotation])->AnySet(); }
StyledText Document::AnnotationStyledText(int line) { - LineAnnotation *pla = static_cast<LineAnnotation*>(perLineData[ldAnnotation]); - return StyledText(pla->Length(line), pla->Text(line), + LineAnnotation *pla = static_cast<LineAnnotation *>(perLineData[ldAnnotation]); + return StyledText(pla->Length(line), pla->Text(line), pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); }
void Document::AnnotationSetText(int line, const char *text) { const int linesBefore = AnnotationLines(line); - static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetText(line, text); + static_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetText(line, text); const int linesAfter = AnnotationLines(line); DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line); mh.annotationLinesAdded = linesAfter - linesBefore; @@ -1324,27 +1427,27 @@ }
void Document::AnnotationSetStyle(int line, int style) { - static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyle(line, style); + static_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetStyle(line, style); }
void Document::AnnotationSetStyles(int line, const unsigned char *styles) { - static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyles(line, styles); + static_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetStyles(line, styles); }
int Document::AnnotationLength(int line) const { - return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Length(line); + return static_cast<LineAnnotation *>(perLineData[ldAnnotation])->Length(line); }
int Document::AnnotationLines(int line) const { - return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Lines(line); + return static_cast<LineAnnotation *>(perLineData[ldAnnotation])->Lines(line); }
void Document::AnnotationClearAll() { int maxEditorLine = LinesTotal(); - for (int l=0;l<maxEditorLine;l++) + for (int l=0; l<maxEditorLine; l++) AnnotationSetText(l, 0); // Free remaining data - static_cast<LineAnnotation*>(perLineData[ldAnnotation])->ClearAll(); + static_cast<LineAnnotation *>(perLineData[ldAnnotation])->ClearAll(); }
void Document::IncrementStyleClock() { @@ -1523,11 +1626,11 @@ int Document::ExtendStyleRange(int pos, int delta, bool singleLine) { int sStart = cb.StyleAt(pos); if (delta < 0) { - while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos)))) pos--; pos++; } else { - while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos)))) pos++; } return pos; @@ -1569,7 +1672,7 @@ int depth = 1; position = position + direction; while ((position >= 0) && (position < Length())) { - position = MovePositionOutsideChar(position, direction); + position = MovePositionOutsideChar(position, direction, true); char chAtPos = CharAt(position); char styAtPos = static_cast<char>(StyleAt(position) & stylingBitsMask); if ((position > GetEndStyled()) || (styAtPos == styBrace)) { @@ -1600,7 +1703,7 @@ bool caseSensitive, bool word, bool wordStart, int flags, int *length);
- virtual const char *SubstituteByPosition(Document* doc, const char *text, int *length); + virtual const char *SubstituteByPosition(Document *doc, const char *text, int *length);
private: RESearch search; @@ -1715,7 +1818,7 @@ return pos; }
-const char *BuiltinRegex::SubstituteByPosition(Document* doc, const char *text, int *length) { +const char *BuiltinRegex::SubstituteByPosition(Document *doc, const char *text, int *length) { delete []substituted; substituted = 0; DocumentIndexer di(doc, doc->Length()); @@ -1737,6 +1840,7 @@ case 'r': case 't': case 'v': + case '\': i++; } lenResult++; @@ -1780,6 +1884,9 @@ case 'v': *o++ = '\v'; break; + case '\': + *o++ = '\'; + break; default: *o++ = '\'; j--;
Modified: trunk/scintilla/Document.h =================================================================== --- trunk/scintilla/Document.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/Document.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -81,17 +81,17 @@ */ class RegexSearchBase { public: - virtual ~RegexSearchBase(){} + virtual ~RegexSearchBase() {}
- virtual long FindText(Document* doc, int minPos, int maxPos, const char *s, + virtual long FindText(Document *doc, int minPos, int maxPos, const char *s, bool caseSensitive, bool word, bool wordStart, int flags, int *length) = 0;
///@return String with the substitutions, must remain valid until the next call or destruction - virtual const char *SubstituteByPosition(Document* doc, const char *text, int *length) = 0; + virtual const char *SubstituteByPosition(Document *doc, const char *text, int *length) = 0; };
/// Factory function for RegexSearchBase -extern RegexSearchBase* CreateRegexSearch(CharClassify *charClassTable); +extern RegexSearchBase *CreateRegexSearch(CharClassify *charClassTable);
struct StyledText { size_t length; @@ -99,7 +99,7 @@ bool multipleStyles; size_t style; const unsigned char *styles; - StyledText( size_t length_, const char *text_, bool multipleStyles_, int style_, const unsigned char *styles_) : + StyledText(size_t length_, const char *text_, bool multipleStyles_, int style_, const unsigned char *styles_) : length(length_), text(text_), multipleStyles(multipleStyles_), style(style_), styles(styles_) { } // Return number of bytes from start to before '\n' or end of text. @@ -115,6 +115,24 @@ } };
+class CaseFolder { +public: + virtual ~CaseFolder() { + }; + virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) = 0; +}; + +class CaseFolderTable : public CaseFolder { +protected: + char mapping[256]; +public: + CaseFolderTable(); + virtual ~CaseFolderTable(); + virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed); + void SetTranslation(char ch, char chTranslation); + void StandardASCII(); +}; + /** */ class Document : PerLine { @@ -147,11 +165,11 @@ int lenWatchers;
// ldSize is not real data - it is for dimensions and loops - enum lineData { ldMarkers, ldLevels, ldState, ldMargin, ldAnnotation, ldSize }; + enum lineData { ldMarkers, ldLevels, ldState, ldMargin, ldAnnotation, ldSize }; PerLine *perLineData[ldSize];
bool matchesValid; - RegexSearchBase* regex; + RegexSearchBase *regex;
public: int stylingBits; @@ -254,9 +272,10 @@ int NextWordEnd(int pos, int delta); int Length() const { return cb.Length(); } void Allocate(int newSize) { cb.Allocate(newSize); } - long FindText(int minPos, int maxPos, const char *s, - bool caseSensitive, bool word, bool wordStart, bool regExp, int flags, int *length); - long FindText(int iMessage, unsigned long wParam, long lParam); + size_t ExtractChar(int pos, char *bytes); + bool MatchesWordOptions(bool word, bool wordStart, int pos, int length); + long FindText(int minPos, int maxPos, const char *search, bool caseSensitive, bool word, + bool wordStart, bool regExp, int flags, int *length, CaseFolder *pcf); const char *SubstituteByPosition(const char *text, int *length); int LinesTotal() const;
@@ -324,7 +343,7 @@ Document *pdoc; bool groupNeeded; public: - UndoGroup(Document *pdoc_, bool groupNeeded_=true) : + UndoGroup(Document *pdoc_, bool groupNeeded_=true) : pdoc(pdoc_), groupNeeded(groupNeeded_) { if (groupNeeded) { pdoc->BeginUndoAction();
Modified: trunk/scintilla/Editor.cxx =================================================================== --- trunk/scintilla/Editor.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/Editor.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -13,6 +13,7 @@ #include <string> #include <vector> #include <algorithm> +#include <memory>
// With Borland C++ 5.5, including <string> includes Windows.h leading to defining // FindText to FindTextA which makes calls here to Document::FindText fail. @@ -52,7 +53,7 @@ return whether this modification represents an operation that may reasonably be deferred (not done now OR [possibly] at all) */ -static bool CanDeferToLastStep(const DocModification& mh) { +static bool CanDeferToLastStep(const DocModification &mh) { if (mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) return true; // CAN skip if (!(mh.modificationType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO))) @@ -62,7 +63,7 @@ return false; // PRESUMABLY must do }
-static bool CanEliminate(const DocModification& mh) { +static bool CanEliminate(const DocModification &mh) { return (mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) != 0; } @@ -71,7 +72,7 @@ return whether this modification represents the FINAL step in a [possibly lengthy] multi-step Undo/Redo sequence */ -static bool IsLastStep(const DocModification& mh) { +static bool IsLastStep(const DocModification &mh) { return (mh.modificationType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO)) != 0 && (mh.modificationType & SC_MULTISTEPUNDOREDO) != 0 @@ -150,6 +151,7 @@ caretSticky = false; multipleSelection = false; additionalSelectionTyping = false; + multiPasteMode = SC_MULTIPASTE_ONCE; additionalCaretsBlink = true; additionalCaretsVisible = true; virtualSpaceOptions = SCVS_NONE; @@ -850,6 +852,12 @@ int delta = newPos.Position() - sel.MainCaret(); newPos = ClampPositionIntoDocument(newPos); newPos = MovePositionOutsideChar(newPos, delta); + if (!multipleSelection && sel.IsRectangular() && (selt == Selection::selStream)) { + // Can't turn into multiple selection so clear additional selections + InvalidateSelection(SelectionRange(newPos), true); + SelectionRange rangeMain = sel.RangeMain(); + sel.SetSelection(rangeMain); + } if (!sel.IsRectangular() && (selt == Selection::selRectangle)) { // Switching to rectangular SelectionRange rangeMain = sel.RangeMain(); @@ -908,7 +916,7 @@ */ void Editor::SetLastXChosen() { Point pt = PointMainCaret(); - lastXChosen = pt.x; + lastXChosen = pt.x + xOffset; }
void Editor::ScrollTo(int line, bool moveThumb) { @@ -955,12 +963,12 @@ Point pt = PointMainCaret(); if (pt.y < rcClient.top) { MovePositionTo(SPositionFromLocation( - Point(lastXChosen, rcClient.top)), + Point(lastXChosen - xOffset, rcClient.top)), Selection::noSel, ensureVisible); } else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) { int yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight; MovePositionTo(SPositionFromLocation( - Point(lastXChosen, rcClient.top + yOfLastLineFullyDisplayed)), + Point(lastXChosen - xOffset, rcClient.top + yOfLastLineFullyDisplayed)), Selection::noSel, ensureVisible); } } @@ -1495,7 +1503,7 @@
bool ValidStyledText(ViewStyle &vs, size_t styleOffset, const StyledText &st) { if (st.multipleStyles) { - for (size_t iStyle=0;iStyle<st.length; iStyle++) { + for (size_t iStyle=0; iStyle<st.length; iStyle++) { if (!vs.ValidStyle(styleOffset + st.styles[iStyle])) return false; } @@ -1824,6 +1832,7 @@ }
bool BadUTF(const char *s, int len, int &trailBytes) { + // For the rules: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 if (trailBytes) { trailBytes--; return false; @@ -1840,6 +1849,23 @@ if (len < 4) return true; if (GoodTrailByte(us[1]) && GoodTrailByte(us[2]) && GoodTrailByte(us[3])) { + if (*us == 0xf4) { + // Chcek if encoding a value beyond the last Unicode character 10FFFF + if (us[1] > 0x8f) { + return true; + } else if (us[1] == 0x8f) { + if (us[2] > 0xbf) { + return true; + } else if (us[2] == 0xbf) { + if (us[3] > 0xbf) { + return true; + } + } + } + } else if ((*us == 0xf0) && ((us[1] & 0xf0) == 0x80)) { + // Overlong + return true; + } trailBytes = 3; return false; } else { @@ -1850,6 +1876,22 @@ if (len < 3) return true; if (GoodTrailByte(us[1]) && GoodTrailByte(us[2])) { + if ((*us == 0xe0) && ((us[1] & 0xe0) == 0x80)) { + // Overlong + return true; + } + if ((*us == 0xed) && ((us[1] & 0xe0) == 0xa0)) { + // Surrogate + return true; + } + if ((*us == 0xef) && (us[1] == 0xbf) && (us[2] == 0xbe)) { + // U+FFFE + return true; + } + if ((*us == 0xef) && (us[1] == 0xbf) && (us[2] == 0xbf)) { + // U+FFFF + return true; + } trailBytes = 2; return false; } else { @@ -2018,8 +2060,8 @@ } lastSegItalics = false; } else if (isBadUTF) { - char hexits[3]; - sprintf(hexits, "%2X", ll->chars[charInLine] & 0xff); + char hexits[4]; + sprintf(hexits, "x%2X", ll->chars[charInLine] & 0xff); ll->positions[charInLine + 1] = surface->WidthText(ctrlCharsFont, hexits, istrlen(hexits)) + 3; } else { // Regular character @@ -2481,7 +2523,7 @@ surface->LineTo(rcSegment.left, rcSegment.bottom); surface->MoveTo(rcSegment.right, rcSegment.top); surface->LineTo(rcSegment.right, rcSegment.bottom); - if (subLine == ll->lines){ + if (subLine == ll->lines) { surface->MoveTo(rcSegment.left, rcSegment.top); surface->LineTo(rcSegment.right, rcSegment.top); } @@ -2787,8 +2829,9 @@ cc, 1, textBack, textFore); } } else if ((i == startseg) && (static_cast<unsigned char>(ll->chars[i]) >= 0x80) && IsUnicodeMode()) { - char hexits[3]; - sprintf(hexits, "%2X", ll->chars[i] & 0xff); + // A single byte >= 0x80 in UTF-8 is a bad byte and is displayed as its hex value + char hexits[4]; + sprintf(hexits, "x%2X", ll->chars[i] & 0xff); DrawTextBlob(surface, vsDraw, rcSegment, hexits, textBack, textFore, twoPhaseDraw); } else { // Normal text display @@ -2840,7 +2883,7 @@ } } } - if (ll->hsStart != -1 && vsDraw.hotspotUnderline && iDoc >= ll->hsStart && iDoc < ll->hsEnd ) { + if (ll->hsStart != -1 && vsDraw.hotspotUnderline && iDoc >= ll->hsStart && iDoc < ll->hsEnd) { PRectangle rcUL = rcSegment; rcUL.top = rcUL.top + vsDraw.maxAscent + 1; rcUL.bottom = rcUL.top + 1; @@ -3474,7 +3517,7 @@ vsPrint.showCaretLineBackground = false;
// Set colours for printing according to users settings - for (size_t sty = 0;sty < vsPrint.stylesSize;sty++) { + for (size_t sty = 0; sty < vsPrint.stylesSize; sty++) { if (printColourMode == SC_PRINT_INVERTLIGHT) { vsPrint.styles[sty].fore.desired = InvertedLight(vsPrint.styles[sty].fore.desired); vsPrint.styles[sty].back.desired = InvertedLight(vsPrint.styles[sty].back.desired); @@ -3529,7 +3572,7 @@
int nPrintPos = pfr->chrg.cpMin; int visibleLine = 0; - int widthPrint = pfr->rc.Width() - vsPrint.fixedColumnWidth; + int widthPrint = pfr->rc.right - pfr->rc.left - vsPrint.fixedColumnWidth; if (printWrapState == eWrapNone) widthPrint = LineLayout::wrapWidthInfinite;
@@ -3727,7 +3770,11 @@ if (wrapState != eWrapNone) { AutoSurface surface(this); if (surface) { - WrapOneLine(surface, pdoc->LineFromPosition(positionInsert)); + if (WrapOneLine(surface, pdoc->LineFromPosition(positionInsert))) { + SetScrollBars(); + SetVerticalScrollPos(); + Redraw(); + } } } } @@ -3787,6 +3834,38 @@ } }
+void Editor::InsertPaste(SelectionPosition selStart, const char *text, int len) { + if (multiPasteMode == SC_MULTIPASTE_ONCE) { + selStart = SelectionPosition(InsertSpace(selStart.Position(), selStart.VirtualSpace())); + if (pdoc->InsertString(selStart.Position(), text, len)) { + SetEmptySelection(selStart.Position() + len); + } + } else { + // SC_MULTIPASTE_EACH + for (size_t r=0; r<sel.Count(); r++) { + if (!RangeContainsProtected(sel.Range(r).Start().Position(), + sel.Range(r).End().Position())) { + int positionInsert = sel.Range(r).Start().Position(); + if (!sel.Range(r).Empty()) { + if (sel.Range(r).Length()) { + pdoc->DeleteChars(positionInsert, sel.Range(r).Length()); + sel.Range(r).ClearVirtualSpace(); + } else { + // Range is all virtual so collapse to start of virtual space + sel.Range(r).MinimizeVirtualSpace(); + } + } + positionInsert = InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); + if (pdoc->InsertString(positionInsert, text, len)) { + sel.Range(r).caret.SetPosition(positionInsert + len); + sel.Range(r).anchor.SetPosition(positionInsert + len); + } + sel.Range(r).ClearVirtualSpace(); + } + } + } +} + void Editor::ClearSelection() { if (!sel.IsRectangular()) FilterSelections(); @@ -3902,9 +3981,9 @@ }
void Editor::Clear() { - UndoGroup ug(pdoc); // If multiple selections, don't delete EOLS if (sel.Empty()) { + UndoGroup ug(pdoc, sel.Count() > 1); for (size_t r=0; r<sel.Count(); r++) { if (!RangeContainsProtected(sel.Range(r).caret.Position(), sel.Range(r).caret.Position() + 1)) { if (sel.Range(r).Start().VirtualSpace()) { @@ -4014,7 +4093,7 @@ NotifyParent(scn); }
-void Editor::NotifyStyleNeeded(Document*, void *, int endStyleNeeded) { +void Editor::NotifyStyleNeeded(Document *, void *, int endStyleNeeded) { NotifyStyleToNeeded(endStyleNeeded); }
@@ -4139,12 +4218,12 @@ }
// Notifications from document -void Editor::NotifyModifyAttempt(Document*, void *) { +void Editor::NotifyModifyAttempt(Document *, void *) { //Platform::DebugPrintf("** Modify Attempt\n"); NotifyModifyAttempt(); }
-void Editor::NotifySavePoint(Document*, void *, bool atSavePoint) { +void Editor::NotifySavePoint(Document *, void *, bool atSavePoint) { //Platform::DebugPrintf("** Save Point %s\n", atSavePoint ? "On" : "Off"); NotifySavePoint(atSavePoint); } @@ -4187,7 +4266,7 @@ } }
-void Editor::NotifyModified(Document*, DocModification mh, void *) { +void Editor::NotifyModified(Document *, DocModification mh, void *) { needUpdateUI = true; if (paintState == painting) { CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length)); @@ -4463,16 +4542,16 @@ int topStutterLine = topLine + caretYSlop; int bottomStutterLine = pdoc->LineFromPosition(PositionFromLocation( - Point(lastXChosen, direction * vs.lineHeight * LinesToScroll()))) + Point(lastXChosen - xOffset, direction * vs.lineHeight * LinesToScroll()))) - caretYSlop - 1;
if (stuttered && (direction < 0 && currentLine > topStutterLine)) { topLineNew = topLine; - newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * caretYSlop)); + newPos = PositionFromLocation(Point(lastXChosen - xOffset, vs.lineHeight * caretYSlop));
} else if (stuttered && (direction > 0 && currentLine < bottomStutterLine)) { topLineNew = topLine; - newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * (LinesToScroll() - caretYSlop))); + newPos = PositionFromLocation(Point(lastXChosen - xOffset, vs.lineHeight * (LinesToScroll() - caretYSlop)));
} else { Point pt = LocationFromPosition(sel.MainCaret()); @@ -4480,7 +4559,7 @@ topLineNew = Platform::Clamp( topLine + direction * LinesToScroll(), 0, MaxScrollPos()); newPos = PositionFromLocation( - Point(lastXChosen, pt.y + direction * (vs.lineHeight * LinesToScroll()))); + Point(lastXChosen - xOffset, pt.y + direction * (vs.lineHeight * LinesToScroll()))); }
if (topLineNew != topLine) { @@ -4493,14 +4572,36 @@ } }
-void Editor::ChangeCaseOfSelection(bool makeUpperCase) { +void Editor::ChangeCaseOfSelection(int caseMapping) { UndoGroup ug(pdoc); for (size_t r=0; r<sel.Count(); r++) { SelectionRange current = sel.Range(r); - pdoc->ChangeCase(Range(current.Start().Position(), current.End().Position()), - makeUpperCase); - // Automatic movement cuts off last character so reset to exactly the same as it was. - sel.Range(r) = current; + SelectionRange currentNoVS = current; + currentNoVS.ClearVirtualSpace(); + char *text = CopyRange(currentNoVS.Start().Position(), currentNoVS.End().Position()); + size_t rangeBytes = currentNoVS.Length(); + if (rangeBytes > 0) { + std::string sText(text, rangeBytes); + + std::string sMapped = CaseMapString(sText, caseMapping); + + if (sMapped != sText) { + size_t firstDifference = 0; + while (sMapped[firstDifference] == sText[firstDifference]) + firstDifference++; + size_t lastDifference = sMapped.size() - 1; + while (sMapped[lastDifference] == sText[lastDifference]) + lastDifference--; + size_t endSame = sMapped.size() - 1 - lastDifference; + pdoc->DeleteChars(currentNoVS.Start().Position() + firstDifference, + rangeBytes - firstDifference - endSame); + pdoc->InsertString(currentNoVS.Start().Position() + firstDifference, + sMapped.c_str() + firstDifference, lastDifference - firstDifference + 1); + // Automatic movement changes selection so reset to exactly the same as it was. + sel.Range(r) = current; + } + } + delete []text; } }
@@ -4613,10 +4714,10 @@ int subLine = (pt.y - ptStartLine.y) / vs.lineHeight; int commentLines = vs.annotationVisible ? pdoc->AnnotationLines(lineDoc) : 0; SelectionPosition posNew = SPositionFromLocation( - Point(lastXChosen, pt.y + direction * vs.lineHeight), false, false, UserVirtualSpace()); + Point(lastXChosen - xOffset, pt.y + direction * vs.lineHeight), false, false, UserVirtualSpace()); if ((direction > 0) && (subLine >= (cs.GetHeight(lineDoc) - 1 - commentLines))) { posNew = SPositionFromLocation( - Point(lastXChosen, pt.y + (commentLines + 1) * vs.lineHeight), false, false, UserVirtualSpace()); + Point(lastXChosen - xOffset, pt.y + (commentLines + 1) * vs.lineHeight), false, false, UserVirtualSpace()); } if (direction < 0) { // Line wrapping may lead to a location on the same line, so @@ -5094,10 +5195,10 @@ Duplicate(false); break; case SCI_LOWERCASE: - ChangeCaseOfSelection(false); + ChangeCaseOfSelection(cmLower); break; case SCI_UPPERCASE: - ChangeCaseOfSelection(true); + ChangeCaseOfSelection(cmUpper); break; case SCI_WORDPARTLEFT: MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(sel.MainCaret()), -1)); @@ -5205,7 +5306,7 @@ int indentation = pdoc->GetLineIndentation(lineCurrentPos); int indentationStep = pdoc->IndentSize(); pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep); - SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos)); + sel.Range(r) = SelectionRange(pdoc->GetLineIndentPosition(lineCurrentPos)); } else { int newColumn = ((pdoc->GetColumn(caretPosition) - 1) / pdoc->tabInChars) * pdoc->tabInChars; @@ -5244,6 +5345,31 @@ } }
+class CaseFolderASCII : public CaseFolderTable { +public: + CaseFolderASCII() { + StandardASCII(); + } + ~CaseFolderASCII() { + } + virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) { + if (lenMixed > sizeFolded) { + return 0; + } else { + for (size_t i=0; i<lenMixed; i++) { + folded[i] = mapping[static_cast<unsigned char>(mixed[i])]; + } + return lenMixed; + } + } +}; + + +CaseFolder *Editor::CaseFolderForEncoding() { + // Simple default that only maps ASCII upper case to lower case. + return new CaseFolderASCII(); +} + /** * Search of a text in the document, in the given range. * @return The position of the found text, -1 if not found. @@ -5255,13 +5381,15 @@
Sci_TextToFind *ft = reinterpret_cast<Sci_TextToFind *>(lParam); int lengthFound = istrlen(ft->lpstrText); + std::auto_ptr<CaseFolder> pcf(CaseFolderForEncoding()); int pos = pdoc->FindText(ft->chrg.cpMin, ft->chrg.cpMax, ft->lpstrText, (wParam & SCFIND_MATCHCASE) != 0, (wParam & SCFIND_WHOLEWORD) != 0, (wParam & SCFIND_WORDSTART) != 0, (wParam & SCFIND_REGEXP) != 0, wParam, - &lengthFound); + &lengthFound, + pcf.get()); if (pos != -1) { ft->chrgText.cpMin = pos; ft->chrgText.cpMax = pos + lengthFound; @@ -5298,6 +5426,7 @@ const char *txt = reinterpret_cast<char *>(lParam); int pos; int lengthFound = istrlen(txt); + std::auto_ptr<CaseFolder> pcf(CaseFolderForEncoding()); if (iMessage == SCI_SEARCHNEXT) { pos = pdoc->FindText(searchAnchor, pdoc->Length(), txt, (wParam & SCFIND_MATCHCASE) != 0, @@ -5305,7 +5434,8 @@ (wParam & SCFIND_WORDSTART) != 0, (wParam & SCFIND_REGEXP) != 0, wParam, - &lengthFound); + &lengthFound, + pcf.get()); } else { pos = pdoc->FindText(searchAnchor, 0, txt, (wParam & SCFIND_MATCHCASE) != 0, @@ -5313,9 +5443,9 @@ (wParam & SCFIND_WORDSTART) != 0, (wParam & SCFIND_REGEXP) != 0, wParam, - &lengthFound); + &lengthFound, + pcf.get()); } - if (pos != -1) { SetSelection(pos, pos + lengthFound); } @@ -5323,19 +5453,39 @@ return pos; }
+std::string Editor::CaseMapString(const std::string &s, int caseMapping) { + std::string ret(s); + for (size_t i=0; i<ret.size(); i++) { + switch (caseMapping) { + case cmUpper: + if (ret[i] >= 'a' && ret[i] <= 'z') + ret[i] = static_cast<char>(ret[i] - 'a' + 'A'); + break; + case cmLower: + if (ret[i] >= 'A' && ret[i] <= 'Z') + ret[i] = static_cast<char>(ret[i] - 'A' + 'a'); + break; + } + } + return ret; +} + /** * Search for text in the target range of the document. * @return The position of the found text, -1 if not found. */ long Editor::SearchInTarget(const char *text, int length) { int lengthFound = length; + + std::auto_ptr<CaseFolder> pcf(CaseFolderForEncoding()); int pos = pdoc->FindText(targetStart, targetEnd, text, (searchFlags & SCFIND_MATCHCASE) != 0, (searchFlags & SCFIND_WHOLEWORD) != 0, (searchFlags & SCFIND_WORDSTART) != 0, (searchFlags & SCFIND_REGEXP) != 0, searchFlags, - &lengthFound); + &lengthFound, + pcf.get()); if (pos != -1) { targetStart = pos; targetEnd = pos + lengthFound; @@ -5615,7 +5765,11 @@ } }
-static bool AllowVirtualSpace(int virtualSpaceOptions, bool rectangular) { +void Editor::MouseLeave() { + SetHotSpotRange(NULL); +} + +static bool AllowVirtualSpace(int virtualSpaceOptions, bool rectangular) { return ((virtualSpaceOptions & SCVS_USERACCESSIBLE) != 0) || (rectangular && ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) != 0)); } @@ -5745,7 +5899,7 @@ } } lastClickTime = curTime; - lastXChosen = pt.x; + lastXChosen = pt.x + xOffset; ShowCaretAtCurrentPosition(); }
@@ -5793,7 +5947,7 @@ } }
-void Editor::GetHotSpotRange(int& hsStart_, int& hsEnd_) { +void Editor::GetHotSpotRange(int &hsStart_, int &hsEnd_) { hsStart_ = hsStart; hsEnd_ = hsEnd; } @@ -5891,6 +6045,7 @@ if (vs.fixedColumnWidth > 0) { // There is a margin if (PointInSelMargin(pt)) { DisplayCursor(Window::cursorReverseArrow); + SetHotSpotRange(NULL); return; // No need to test for selection } } @@ -5968,7 +6123,7 @@ SetRectangularRange(); lastClickTime = curTime; lastClick = pt; - lastXChosen = pt.x; + lastXChosen = pt.x + xOffset; if (sel.selType == Selection::selStream) { SetLastXChosen(); } @@ -6257,6 +6412,24 @@ } }
+int Editor::GetTag(char *tagValue, int tagNumber) { + char name[3] = "\?"; + const char *text = 0; + int length = 0; + if ((tagNumber >= 1) && (tagNumber <= 9)) { + name[1] = static_cast<char>(tagNumber + '0'); + length = 2; + text = pdoc->SubstituteByPosition(name, &length); + } + if (tagValue) { + if (text) + memcpy(tagValue, text, length + 1); + else + *tagValue = '\0'; + } + return length; +} + int Editor::ReplaceTarget(bool replacePatterns, const char *text, int length) { UndoGroup ug(pdoc); if (length == -1) @@ -6303,11 +6476,11 @@ size_t textLength = appendLength / 2; char *text = new char[textLength]; size_t i; - for (i = 0;i < textLength;i++) { + for (i = 0; i < textLength; i++) { text[i] = buffer[i*2]; } pdoc->InsertString(CurrentPosition(), text, textLength); - for (i = 0;i < textLength;i++) { + for (i = 0; i < textLength; i++) { text[i] = buffer[i*2+1]; } pdoc->StartStyling(CurrentPosition(), static_cast<char>(0xff)); @@ -6641,6 +6814,9 @@ case SCI_GETSEARCHFLAGS: return searchFlags;
+ case SCI_GETTAG: + return GetTag(CharPtrFromSPtr(lParam), wParam); + case SCI_POSITIONBEFORE: return pdoc->MovePositionOutsideChar(wParam - 1, -1, true);
@@ -7127,9 +7303,11 @@ return wrapState;
case SCI_SETWRAPVISUALFLAGS: - wrapVisualFlags = wParam; - InvalidateStyleRedraw(); - ReconfigureScrollBars(); + if (wrapVisualFlags != static_cast<int>(wParam)) { + wrapVisualFlags = wParam; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + } break;
case SCI_GETWRAPVISUALFLAGS: @@ -7144,18 +7322,22 @@ return wrapVisualFlagsLocation;
case SCI_SETWRAPSTARTINDENT: - wrapVisualStartIndent = wParam; - InvalidateStyleRedraw(); - ReconfigureScrollBars(); + if (wrapVisualStartIndent != static_cast<int>(wParam)) { + wrapVisualStartIndent = wParam; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + } break;
case SCI_GETWRAPSTARTINDENT: return wrapVisualStartIndent;
case SCI_SETWRAPINDENTMODE: - wrapIndentMode = wParam; - InvalidateStyleRedraw(); - ReconfigureScrollBars(); + if (wrapIndentMode != static_cast<int>(wParam)) { + wrapIndentMode = wParam; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + } break;
case SCI_GETWRAPINDENTMODE: @@ -8261,6 +8443,13 @@ case SCI_GETADDITIONALSELECTIONTYPING: return additionalSelectionTyping;
+ case SCI_SETMULTIPASTE: + multiPasteMode = wParam; + break; + + case SCI_GETMULTIPASTE: + return multiPasteMode; + case SCI_SETADDITIONALCARETSBLINK: additionalCaretsBlink = wParam != 0; InvalidateCaret();
Modified: trunk/scintilla/Editor.h =================================================================== --- trunk/scintilla/Editor.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/Editor.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -142,6 +142,7 @@ bool caretSticky; bool multipleSelection; bool additionalSelectionTyping; + int multiPasteMode; bool additionalCaretsBlink; bool additionalCaretsVisible;
@@ -338,7 +339,7 @@ PRectangle rcLine, LineLayout *ll, int subLine); void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart, PRectangle rcLine, LineLayout *ll, int subLine); - void DrawBlockCaret(Surface *surface, ViewStyle &vsDraw, LineLayout *ll, int subLine, + void DrawBlockCaret(Surface *surface, ViewStyle &vsDraw, LineLayout *ll, int subLine, int xStart, int offset, int posCaret, PRectangle rcCaret, ColourAllocated caretColour); void DrawCarets(Surface *surface, ViewStyle &vsDraw, int line, int xStart, PRectangle rcLine, LineLayout *ll, int subLine); @@ -358,6 +359,7 @@ int InsertSpace(int position, unsigned int spaces); void AddChar(char ch); virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false); + void InsertPaste(SelectionPosition selStart, const char *text, int len); void ClearSelection(); void ClearAll(); void ClearDocumentStyle(); @@ -403,7 +405,9 @@ void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
void PageMove(int direction, Selection::selTypes sel=Selection::noSel, bool stuttered = false); - void ChangeCaseOfSelection(bool makeUpperCase); + enum { cmSame, cmUpper, cmLower } caseMap; + virtual std::string CaseMapString(const std::string &s, int caseMapping); + void ChangeCaseOfSelection(int caseMapping); void LineTranspose(); void Duplicate(bool forLine); virtual void CancelModes(); @@ -420,6 +424,7 @@
void Indent(bool forwards);
+ virtual CaseFolder *CaseFolderForEncoding(); long FindText(uptr_t wParam, sptr_t lParam); void SearchAnchor(); long SearchText(unsigned int iMessage, uptr_t wParam, sptr_t lParam); @@ -442,6 +447,7 @@ bool PointInSelMargin(Point pt); void LineSelection(int lineCurrent_, int lineAnchor_); void DwellEnd(bool mouseMoved); + void MouseLeave(); virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt); void ButtonMove(Point pt); void ButtonUp(Point pt, unsigned int curTime, bool ctrl); @@ -461,18 +467,19 @@
void SetAnnotationHeights(int start, int end); void SetDocPointer(Document *document); - + void SetAnnotationVisible(int visible);
void Expand(int &line, bool doExpand); void ToggleContraction(int line); void EnsureLineVisible(int lineDoc, bool enforcePolicy); + int GetTag(char *tagValue, int tagNumber); int ReplaceTarget(bool replacePatterns, const char *text, int length=-1);
bool PositionIsHotspot(int position); bool PointIsHotspot(Point pt); void SetHotSpotRange(Point *pt); - void GetHotSpotRange(int& hsStart, int& hsEnd); + void GetHotSpotRange(int &hsStart, int &hsEnd);
int CodePage() const; virtual bool ValidCodePage(int /* codePage */) const { return true; }
Modified: trunk/scintilla/LexHTML.cxx =================================================================== --- trunk/scintilla/LexHTML.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/LexHTML.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -76,12 +76,12 @@ char ch = static_cast<char>(styler.SafeGetCharAt(start + i)); if ((i == 0) && !IsAWordStart(ch)) break; - if ((i > 0) && !IsAWordChar(ch)) + if ((i > 0) && !IsAWordChar(ch)) break; s[i] = ch; } s[i] = '\0'; - + return s; }
@@ -494,7 +494,7 @@ if (strlen(blockType) == 0) { return ((ch == '%') && (chNext == '>')); } else if ((0 == strcmp(blockType, "inherit")) || - (0 == strcmp(blockType, "namespace")) || + (0 == strcmp(blockType, "namespace")) || (0 == strcmp(blockType, "include")) || (0 == strcmp(blockType, "page"))) { return ((ch == '/') && (chNext == '>')); @@ -507,6 +507,18 @@ } }
+static bool isDjangoBlockEnd(const int ch, const int chNext, const char *blockType) { + if (strlen(blockType) == 0) { + return 0; + } else if (0 == strcmp(blockType, "%")) { + return ((ch == '%') && (chNext == '}')); + } else if (0 == strcmp(blockType, "{")) { + return ((ch == '}') && (chNext == '}')); + } else { + return 0; + } +} + static bool isPHPStringState(int state) { return (state == SCE_HPHP_HSTRING) || @@ -583,6 +595,8 @@ int state = stateForPrintState(StateToPrint); char makoBlockType[200]; makoBlockType[0] = '\0'; + char djangoBlockType[2]; + djangoBlockType[0] = '\0';
// If inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen if (InTagState(state)) { @@ -612,8 +626,8 @@ // Default client and ASP scripting language is JavaScript lineState = eScriptJS << 8;
- // property asp.default.language - // Script in ASP code is initially assumed to be in JavaScript. + // property asp.default.language + // Script in ASP code is initially assumed to be in JavaScript. // To change this to VBScript set asp.default.language to 2. Python is 3. lineState |= styler.GetPropertyInt("asp.default.language", eScriptJS) << 4; } @@ -631,43 +645,47 @@ scriptLanguage = eScriptComment; }
- // property fold.html - // Folding is turned on or off for HTML and XML files with this option. + // property fold.html + // Folding is turned on or off for HTML and XML files with this option. // The fold option must also be on for folding to occur. const bool foldHTML = styler.GetPropertyInt("fold.html", 0) != 0;
const bool fold = foldHTML && styler.GetPropertyInt("fold", 0);
- // property fold.html.preprocessor - // Folding is turned on or off for scripts embedded in HTML files with this option. + // property fold.html.preprocessor + // Folding is turned on or off for scripts embedded in HTML files with this option. // The default is on. const bool foldHTMLPreprocessor = foldHTML && styler.GetPropertyInt("fold.html.preprocessor", 1);
const bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
- // property fold.hypertext.comment - // Allow folding for comments in scripts embedded in HTML. - // The default is off. + // property fold.hypertext.comment + // Allow folding for comments in scripts embedded in HTML. + // The default is off. const bool foldComment = fold && styler.GetPropertyInt("fold.hypertext.comment", 0) != 0;
- // property fold.hypertext.heredoc - // Allow folding for heredocs in scripts embedded in HTML. - // The default is off. + // property fold.hypertext.heredoc + // Allow folding for heredocs in scripts embedded in HTML. + // The default is off. const bool foldHeredoc = fold && styler.GetPropertyInt("fold.hypertext.heredoc", 0) != 0;
- // property html.tags.case.sensitive - // For XML and HTML, setting this property to 1 will make tags match in a case - // sensitive way which is the expected behaviour for XML and XHTML. + // property html.tags.case.sensitive + // For XML and HTML, setting this property to 1 will make tags match in a case + // sensitive way which is the expected behaviour for XML and XHTML. const bool caseSensitive = styler.GetPropertyInt("html.tags.case.sensitive", 0) != 0;
- // property lexer.xml.allow.scripts - // Set to 0 to disable scripts in XML. + // property lexer.xml.allow.scripts + // Set to 0 to disable scripts in XML. const bool allowScripts = styler.GetPropertyInt("lexer.xml.allow.scripts", 1) != 0;
- // property lexer.html.mako - // Set to 1 to enable the mako template language. + // property lexer.html.mako + // Set to 1 to enable the mako template language. const bool isMako = styler.GetPropertyInt("lexer.html.mako", 0) != 0;
+ // property lexer.html.django + // Set to 1 to enable the django template language. + const bool isDjango = styler.GetPropertyInt("lexer.html.django", 0) != 0; + const CharacterSet setHTMLWord(CharacterSet::setAlphaNum, ".-_:!#", 0x80, true); const CharacterSet setTagContinue(CharacterSet::setAlphaNum, ".-_:!#[", 0x80, true); const CharacterSet setAttributeContinue(CharacterSet::setAlphaNum, ".-_:!#/", 0x80, true); @@ -800,7 +818,7 @@ if (((ch == '\r' && chNext != '\n') || (ch == '\n')) && (!isMako || (0 != strcmp(makoBlockType, "%")))) { } - + // generic end of script processing else if ((inScriptType == eNonHtmlScript) && (ch == '<') && (chNext == '/')) { // Check if it's the end of the script tag (or any other HTML tag) @@ -886,13 +904,13 @@ }
// handle the start Mako template Python code - else if (isMako && scriptLanguage == eScriptNone && ((ch == '<' && chNext == '%') || + else if (isMako && scriptLanguage == eScriptNone && ((ch == '<' && chNext == '%') || (lineStartVisibleChars == 1 && ch == '%') || (ch == '$' && chNext == '{') || (ch == '<' && chNext == '/' && chNext2 == '%'))) { if (ch == '%') strcpy(makoBlockType, "%"); - else if (ch == '$') + else if (ch == '$') strcpy(makoBlockType, "{"); else if (chNext == '/') GetNextWord(styler, i+3, makoBlockType, sizeof(makoBlockType)); @@ -917,7 +935,7 @@ styler.ColourTo(i, SCE_H_ASP); if (foldHTMLPreprocessor && ch == '<') levelCurrent++; - + if (ch != '%' && ch != '$') { i += strlen(makoBlockType); visibleChars += strlen(makoBlockType); @@ -931,8 +949,33 @@ continue; }
+ // handle the start Django template code + else if (isDjango && scriptLanguage == eScriptNone && (ch == '{' && (chNext == '%' || chNext == '{'))) { + if (chNext == '%') + strcpy(djangoBlockType, "%"); + else + strcpy(djangoBlockType, "{"); + styler.ColourTo(i - 1, StateToPrint); + beforePreProc = state; + if (inScriptType == eNonHtmlScript) + inScriptType = eNonHtmlScriptPreProc; + else + inScriptType = eNonHtmlPreProc; + + i += 1; + visibleChars += 1; + state = SCE_HP_START; + scriptLanguage = eScriptPython; + styler.ColourTo(i, SCE_H_ASP); + if (foldHTMLPreprocessor && chNext == '%') + levelCurrent++; + + ch = static_cast<unsigned char>(styler.SafeGetCharAt(i)); + continue; + } + // handle the start of ASP pre-processor = Non-HTML - else if (!isMako && !isCommentASPState(state) && (ch == '<') && (chNext == '%') && !isPHPStringState(state)) { + else if (!isMako && !isDjango && !isCommentASPState(state) && (ch == '<') && (chNext == '%') && !isPHPStringState(state)) { styler.ColourTo(i - 1, StateToPrint); beforePreProc = state; if (inScriptType == eNonHtmlScript) @@ -998,8 +1041,8 @@ }
// handle the end of Mako Python code - else if (isMako && - ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && + else if (isMako && + ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && (scriptLanguage != eScriptNone) && stateAllowsTermination(state) && isMakoBlockEnd(ch, chNext, makoBlockType)) { if (state == SCE_H_ASPAT) { @@ -1030,8 +1073,37 @@ continue; }
+ // handle the end of Django template code + else if (isDjango && + ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && + (scriptLanguage != eScriptNone) && stateAllowsTermination(state) && + isDjangoBlockEnd(ch, chNext, djangoBlockType)) { + if (state == SCE_H_ASPAT) { + aspScript = segIsScriptingIndicator(styler, + styler.GetStartSegment(), i - 1, aspScript); + } + if (state == SCE_HP_WORD) { + classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType); + } else { + styler.ColourTo(i - 1, StateToPrint); + } + i += 1; + visibleChars += 1; + styler.ColourTo(i, SCE_H_ASP); + state = beforePreProc; + if (inScriptType == eNonHtmlScriptPreProc) + inScriptType = eNonHtmlScript; + else + inScriptType = eHtml; + if (foldHTMLPreprocessor) { + levelCurrent--; + } + scriptLanguage = eScriptNone; + continue; + } + // handle the end of a pre-processor = Non-HTML - else if ((!isMako && ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && + else if ((!isMako && !isDjango && ((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && (((scriptLanguage != eScriptNone) && stateAllowsTermination(state))) && (((ch == '%') || (ch == '?')) && (chNext == '>'))) || ((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) {
Modified: trunk/scintilla/LexOthers.cxx =================================================================== --- trunk/scintilla/LexOthers.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/LexOthers.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -37,6 +37,10 @@ return (ch >= '1') && (ch <= '9'); }
+static bool IsAlphabetic(int ch) { + return isascii(ch) && isalpha(ch); +} + static inline bool AtEOL(Accessor &styler, unsigned int i) { return (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); @@ -101,7 +105,7 @@ } return; // Check for Drive Change (Drive Change is internal command) - return if found - } else if ((isalpha(lineBuffer[offset])) && + } else if ((IsAlphabetic(lineBuffer[offset])) && (lineBuffer[offset + 1] == ':') && ((isspacechar(lineBuffer[offset + 2])) || (((lineBuffer[offset + 2] == '\')) && @@ -723,10 +727,10 @@ unsigned int linePos = 0; unsigned int startLine = startPos;
- // property lexer.props.allow.initial.spaces - // For properties files, set to 0 to style all lines that start with whitespace in the default style. - // This is not suitable for SciTE .properties files which use indentation for flow control but - // can be used for RFC2822 text where indentation is used for continuation lines. + // property lexer.props.allow.initial.spaces + // For properties files, set to 0 to style all lines that start with whitespace in the default style. + // This is not suitable for SciTE .properties files which use indentation for flow control but + // can be used for RFC2822 text where indentation is used for continuation lines. bool allowInitialSpaces = styler.GetPropertyInt("lexer.props.allow.initial.spaces", 1) != 0;
for (unsigned int i = startPos; i < startPos + length; i++) { @@ -961,17 +965,17 @@ } else if (strstart(lineBuffer, "Warning ")) { // Borland warning message return SCE_ERR_BORLAND; - } else if (strstr(lineBuffer, "at line " ) && - (strstr(lineBuffer, "at line " ) < (lineBuffer + lengthLine)) && + } else if (strstr(lineBuffer, "at line ") && + (strstr(lineBuffer, "at line ") < (lineBuffer + lengthLine)) && strstr(lineBuffer, "file ") && (strstr(lineBuffer, "file ") < (lineBuffer + lengthLine))) { // Lua 4 error message return SCE_ERR_LUA; - } else if (strstr(lineBuffer, " at " ) && - (strstr(lineBuffer, " at " ) < (lineBuffer + lengthLine)) && + } else if (strstr(lineBuffer, " at ") && + (strstr(lineBuffer, " at ") < (lineBuffer + lengthLine)) && strstr(lineBuffer, " line ") && (strstr(lineBuffer, " line ") < (lineBuffer + lengthLine)) && - (strstr(lineBuffer, " at " ) < (strstr(lineBuffer, " line ")))) { + (strstr(lineBuffer, " at ") < (strstr(lineBuffer, " line ")))) { // perl error message return SCE_ERR_PERL; } else if ((memcmp(lineBuffer, " at ", 6) == 0) && @@ -1065,7 +1069,7 @@ numstep = 1; // ch was ' ', handle as if it's a delphi errorline, only add 1 to i. else numstep = 2; // otherwise add 2. - for (j = i + numstep; j < lengthLine && isalpha(lineBuffer[j]) && chPos < sizeof(word) - 1; j++) + for (j = i + numstep; j < lengthLine && IsAlphabetic(lineBuffer[j]) && chPos < sizeof(word) - 1; j++) word[chPos++] = lineBuffer[j]; word[chPos] = 0; if (!CompareCaseInsensitive(word, "error") || !CompareCaseInsensitive(word, "warning") || @@ -1131,11 +1135,11 @@ styler.StartSegment(startPos); unsigned int linePos = 0;
- // property lexer.errorlist.value.separate - // For lines in the output pane that are matches from Find in Files or GCC-style - // diagnostics, style the path and line number separately from the rest of the - // line with style 21 used for the rest of the line. - // This allows matched text to be more easily distinguished from its location. + // property lexer.errorlist.value.separate + // For lines in the output pane that are matches from Find in Files or GCC-style + // diagnostics, style the path and line number separately from the rest of the + // line with style 21 used for the rest of the line. + // This allows matched text to be more easily distinguished from its location. bool valueSeparate = styler.GetPropertyInt("lexer.errorlist.value.separate", 0) != 0; for (unsigned int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; @@ -1252,13 +1256,13 @@ styler.ColourTo(lengthDoc-1, state); }
-static const char * const batchWordListDesc[] = { +static const char *const batchWordListDesc[] = { "Internal Commands", "External Commands", 0 };
-static const char * const emptyWordListDesc[] = { +static const char *const emptyWordListDesc[] = { 0 };
Modified: trunk/scintilla/PlatGTK.cxx =================================================================== --- trunk/scintilla/PlatGTK.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/PlatGTK.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -31,10 +31,7 @@ with gdk_string_extents. */ #define FAST_WAY
-#if GTK_MAJOR_VERSION >= 2 -#define USE_PANGO 1 #include "Converter.h" -#endif
#ifdef _MSC_VER // Ignore unreferenced local functions in GTK+ headers @@ -105,21 +102,16 @@ public: int ascent; GdkFont *pfont; -#ifdef USE_PANGO PangoFontDescription *pfd; int characterSet; -#endif FontHandle(GdkFont *pfont_) { et = singleByte; ascent = 0; pfont = pfont_; -#ifdef USE_PANGO pfd = 0; characterSet = -1; -#endif ResetWidths(et); } -#ifdef USE_PANGO FontHandle(PangoFontDescription *pfd_, int characterSet_) { et = singleByte; ascent = 0; @@ -128,16 +120,13 @@ characterSet = characterSet_; ResetWidths(et); } -#endif ~FontHandle() { if (pfont) gdk_font_unref(pfont); pfont = 0; -#ifdef USE_PANGO if (pfd) pango_font_description_free(pfd); pfd = 0; -#endif } void ResetWidths(encodingType et_) { et = et_; @@ -513,7 +502,6 @@ faceName[0] = '\0'; charset[0] = '\0';
-#ifdef USE_PANGO if (fontName[0] == '!') { PangoFontDescription *pfd = pango_font_description_new(); if (pfd) { @@ -524,7 +512,6 @@ return new FontHandle(pfd, characterSet); } } -#endif
GdkFont *newid = 0; // If name of the font begins with a '-', assume, that it is @@ -693,13 +680,11 @@ int y; bool inited; bool createdGC; -#ifdef USE_PANGO PangoContext *pcontext; PangoLayout *layout; Converter conv; int characterSet; void SetConverter(int characterSet_); -#endif public: SurfaceImpl(); virtual ~SurfaceImpl(); @@ -796,22 +781,16 @@ } }
-#ifdef USE_PANGO - void SurfaceImpl::SetConverter(int characterSet_) { if (characterSet != characterSet_) { characterSet = characterSet_; conv.Open("UTF-8", CharacterSetID(characterSet), false); } } -#endif
SurfaceImpl::SurfaceImpl() : et(singleByte), drawable(0), gc(0), ppixmap(0), x(0), y(0), inited(false), createdGC(false) -#ifdef USE_PANGO -, pcontext(0), layout(0), characterSet(-1) -#endif -{ +, pcontext(0), layout(0), characterSet(-1) { }
SurfaceImpl::~SurfaceImpl() { @@ -829,7 +808,6 @@ if (ppixmap) gdk_pixmap_unref(ppixmap); ppixmap = 0; -#ifdef USE_PANGO if (layout) g_object_unref(layout); layout = 0; @@ -838,7 +816,6 @@ pcontext = 0; conv.Close(); characterSet = -1; -#endif x = 0; y = 0; inited = false; @@ -849,34 +826,23 @@ return inited; }
-// The WindowID argument is only used for Pango builds -#ifdef USE_PANGO -#define WID_NAME wid -#else -#define WID_NAME -#endif - -void SurfaceImpl::Init(WindowID WID_NAME) { +void SurfaceImpl::Init(WindowID wid) { Release(); -#ifdef USE_PANGO PLATFORM_ASSERT(wid); pcontext = gtk_widget_create_pango_context(PWidget(wid)); PLATFORM_ASSERT(pcontext); layout = pango_layout_new(pcontext); PLATFORM_ASSERT(layout); -#endif inited = true; }
-void SurfaceImpl::Init(SurfaceID sid, WindowID WID_NAME) { +void SurfaceImpl::Init(SurfaceID sid, WindowID wid) { PLATFORM_ASSERT(sid); GdkDrawable *drawable_ = reinterpret_cast<GdkDrawable *>(sid); Release(); -#ifdef USE_PANGO PLATFORM_ASSERT(wid); pcontext = gtk_widget_create_pango_context(PWidget(wid)); layout = pango_layout_new(pcontext); -#endif drawable = drawable_; gc = gdk_gc_new(drawable_); // Ask for lines that do not paint the last pixel so is like Win32 @@ -885,18 +851,16 @@ inited = true; }
-void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_, WindowID WID_NAME) { +void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_, WindowID wid) { PLATFORM_ASSERT(surface_); Release(); SurfaceImpl *surfImpl = static_cast<SurfaceImpl *>(surface_); PLATFORM_ASSERT(surfImpl->drawable); -#ifdef USE_PANGO PLATFORM_ASSERT(wid); pcontext = gtk_widget_create_pango_context(PWidget(wid)); PLATFORM_ASSERT(pcontext); layout = pango_layout_new(pcontext); PLATFORM_ASSERT(layout); -#endif if (height > 0 && width > 0) ppixmap = gdk_pixmap_new(surfImpl->drawable, width, height, -1); drawable = ppixmap; @@ -1023,8 +987,6 @@ } }
-#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; @@ -1045,20 +1007,6 @@ return co & 0xff; }
-#endif - -#if GTK_MAJOR_VERSION < 2 -void SurfaceImpl::AlphaRectangle(PRectangle rc, int , ColourAllocated , int , ColourAllocated outline, int , int ) { - if (gc && drawable) { - // Can't use GdkPixbuf on GTK+ 1.x, so draw an outline rather than use alpha. - PenColour(outline); - gdk_draw_rectangle(drawable, gc, 0, - rc.left, rc.top, - rc.right - rc.left - 1, rc.bottom - rc.top - 1); - } -} -#else - static guint32 u32FromRGBA(guint8 r, guint8 g, guint8 b, guint8 a) { union { guint8 pixVal[4]; @@ -1082,9 +1030,9 @@ GdkPixbuf *pixalpha = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height);
guint32 valEmpty = u32FromRGBA(0,0,0,0); - guint32 valFill = u32FromRGBA(GetRValue(fill.AsLong()), + guint32 valFill = u32FromRGBA(GetRValue(fill.AsLong()), GetGValue(fill.AsLong()), GetBValue(fill.AsLong()), alphaFill); - guint32 valOutline = u32FromRGBA(GetRValue(outline.AsLong()), + guint32 valOutline = u32FromRGBA(GetRValue(outline.AsLong()), GetGValue(outline.AsLong()), GetBValue(outline.AsLong()), alphaOutline); guint32 *pixels = reinterpret_cast<guint32 *>(gdk_pixbuf_get_pixels(pixalpha)); int stride = gdk_pixbuf_get_rowstride(pixalpha) / 4; @@ -1114,8 +1062,6 @@ } }
-#endif - void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) { PenColour(back); gdk_draw_arc(drawable, gc, 1, @@ -1169,7 +1115,6 @@ return utfForm; }
-#ifdef USE_PANGO static char *UTF8FromIconv(const Converter &conv, const char *s, int &len) { if (conv) { char *utfForm = new char[len*3+1]; @@ -1254,8 +1199,6 @@ } }
-#endif - // On GTK+, wchar_t is 4 bytes
const int maxLengthTextRun = 10000; @@ -1265,7 +1208,6 @@ PenColour(fore); if (gc && drawable) { int xText = rc.left; -#ifdef USE_PANGO if (PFont(font_)->pfd) { char *utfForm = 0; bool useGFree = false; @@ -1301,7 +1243,6 @@ } return; } -#endif // Draw text as a series of segments to avoid limitations in X servers const int segmentLength = 1000; bool draw8bit = true; @@ -1376,8 +1317,6 @@ } }
-#ifdef USE_PANGO - class ClusterIterator { PangoLayoutIter *iter; PangoRectangle pos; @@ -1388,8 +1327,8 @@ int position; int distance; int curIndex; - ClusterIterator(PangoLayout *layout, int len) : lenPositions(len), finished(false), - positionStart(0), position(0), distance(0) { + ClusterIterator(PangoLayout *layout, int len) : lenPositions(len), finished(false), + positionStart(0), position(0), distance(0), curIndex(0) { iter = pango_layout_get_iter(layout); pango_layout_iter_get_cluster_extents(iter, NULL, &pos); } @@ -1397,7 +1336,7 @@ pango_layout_iter_free(iter); }
- void Next() { + void Next() { positionStart = position; if (pango_layout_iter_next_cluster(iter)) { pango_layout_iter_get_cluster_extents(iter, NULL, &pos); @@ -1412,12 +1351,9 @@ } };
-#endif - void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positions) { if (font_.GetID()) { int totalWidth = 0; -#ifdef USE_PANGO const int lenPositions = len; if (PFont(font_)->pfd) { if (len == 1) { @@ -1516,7 +1452,6 @@ } return; } -#endif GdkFont *gf = PFont(font_)->pfont; bool measure8bit = true; if (et != singleByte) { @@ -1577,7 +1512,6 @@
int SurfaceImpl::WidthText(Font &font_, const char *s, int len) { if (font_.GetID()) { -#ifdef USE_PANGO if (PFont(font_)->pfd) { char *utfForm = 0; pango_layout_set_font_description(layout, PFont(font_)->pfd); @@ -1612,7 +1546,6 @@ } return PANGO_PIXELS(pos.width); } -#endif if (et == UTF8) { GdkWChar wctext[maxLengthTextRun]; size_t wclen = UTF16FromUTF8(s, len, static_cast<wchar_t *>(static_cast<void *>(wctext)), @@ -1629,11 +1562,9 @@
int SurfaceImpl::WidthChar(Font &font_, char ch) { if (font_.GetID()) { -#ifdef USE_PANGO if (PFont(font_)->pfd) { return WidthText(font_, &ch, 1); } -#endif return gdk_char_width(PFont(font_)->pfont, ch); } else { return 1; @@ -1663,7 +1594,6 @@ #ifdef FAST_WAY FontMutexLock(); int ascent = PFont(font_)->ascent; -#ifdef USE_PANGO if ((ascent == 0) && (PFont(font_)->pfd)) { PangoFontMetrics *metrics = pango_context_get_metrics(pcontext, PFont(font_)->pfd, pango_context_get_language(pcontext)); @@ -1672,7 +1602,6 @@ pango_font_metrics_unref(metrics); ascent = PFont(font_)->ascent; } -#endif if ((ascent == 0) && (PFont(font_)->pfont)) { ascent = PFont(font_)->pfont->ascent; } @@ -1700,7 +1629,6 @@ return 1; #ifdef FAST_WAY
-#ifdef USE_PANGO if (PFont(font_)->pfd) { PangoFontMetrics *metrics = pango_context_get_metrics(pcontext, PFont(font_)->pfd, pango_context_get_language(pcontext)); @@ -1708,7 +1636,6 @@ pango_font_metrics_unref(metrics); return descent; } -#endif return PFont(font_)->pfont->descent; #else
@@ -1794,18 +1721,12 @@ }
void Window::SetPosition(PRectangle rc) { -#if 1 GtkAllocation alloc; alloc.x = rc.left; alloc.y = rc.top; alloc.width = rc.Width(); alloc.height = rc.Height(); gtk_widget_size_allocate(PWidget(wid), &alloc); -#else - - gtk_widget_set_uposition(wid, rc.left, rc.top); - gtk_widget_set_usize(wid, rc.right - rc.left, rc.bottom - rc.top); -#endif }
void Window::SetPositionRelative(PRectangle rc, Window relativeTo) { @@ -1831,21 +1752,8 @@ if (oy + sizey > screenHeight) oy = screenHeight - sizey;
-#if GTK_MAJOR_VERSION >= 2 gtk_window_move(GTK_WINDOW(PWidget(wid)), ox, oy); -#else - gtk_widget_set_uposition(PWidget(wid), ox, oy); -#endif
-#if 0 - - GtkAllocation alloc; - alloc.x = rc.left + ox; - alloc.y = rc.top + oy; - alloc.width = rc.right - rc.left; - alloc.height = rc.bottom - rc.top; - gtk_widget_size_allocate(wid, &alloc); -#endif gtk_widget_set_usize(PWidget(wid), sizex, sizey); }
@@ -1927,8 +1835,8 @@
gdk_window_get_origin(PWidget(wid)->window, &x_offset, &y_offset);
-// gtk 2.2+ -#if GTK_MAJOR_VERSION > 2 || (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 2) +#if GTK_CHECK_VERSION(2,2,0) + // GTK+ 2.2+ { GdkScreen* screen; gint monitor_num; @@ -1949,25 +1857,13 @@
struct ListImage { const char *xpm_data; -#if GTK_MAJOR_VERSION < 2 - GdkPixmap *pixmap; - GdkBitmap *bitmap; -#else GdkPixbuf *pixbuf; -#endif };
static void list_image_free(gpointer, gpointer value, gpointer) { ListImage *list_image = (ListImage *) value; -#if GTK_MAJOR_VERSION < 2 - if (list_image->pixmap) - gdk_pixmap_unref(list_image->pixmap); - if (list_image->bitmap) - gdk_bitmap_unref(list_image->bitmap); -#else if (list_image->pixbuf) gdk_pixbuf_unref (list_image->pixbuf); -#endif g_free(list_image); }
@@ -1977,24 +1873,17 @@ ListBox::~ListBox() { }
-#if GTK_MAJOR_VERSION >= 2 enum { PIXBUF_COLUMN, TEXT_COLUMN, N_COLUMNS }; -#endif
class ListBoxX : public ListBox { WindowID list; WindowID scroller; -#if GTK_MAJOR_VERSION < 2 - int current; -#endif void *pixhash; -#if GTK_MAJOR_VERSION >= 2 - GtkCellRenderer* pixbuf_renderer; -#endif + GtkCellRenderer* pixbuf_renderer; XPMSet xset; int desiredVisibleRows; unsigned int maxItemCharacters; @@ -2003,15 +1892,9 @@ CallBackAction doubleClickAction; void *doubleClickActionData;
- ListBoxX() : list(0), pixhash(NULL), + ListBoxX() : list(0), pixhash(NULL), pixbuf_renderer(0), desiredVisibleRows(5), maxItemCharacters(0), aveCharWidth(1), doubleClickAction(NULL), doubleClickActionData(NULL) { -#if GTK_MAJOR_VERSION < 2 - current = 0; -#endif -#if GTK_MAJOR_VERSION >= 2 - pixbuf_renderer = 0; -#endif } virtual ~ListBoxX() { if (pixhash) { @@ -2047,19 +1930,6 @@ return lb; }
-#if GTK_MAJOR_VERSION < 2 -static void UnselectionAC(GtkWidget *, gint, gint, - GdkEventButton *, gpointer p) { - int *pi = reinterpret_cast<int *>(p); - *pi = -1; -} -static void SelectionAC(GtkWidget *, gint row, gint, - GdkEventButton *, gpointer p) { - int *pi = reinterpret_cast<int *>(p); - *pi = row; -} -#endif - static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) { try { ListBoxX* lb = reinterpret_cast<ListBoxX*>(p); @@ -2074,7 +1944,6 @@ return FALSE; }
-#if GTK_MAJOR_VERSION >= 2 /* Change the active color to the selected color so the listbox uses the color scheme that it would use if it had the focus. */ static void StyleSet(GtkWidget *w, GtkStyle*, void*) { @@ -2097,7 +1966,6 @@ if (!gdk_color_equal(&style->text[GTK_STATE_SELECTED], &style->text[GTK_STATE_ACTIVE])) gtk_widget_modify_text(w, GTK_STATE_ACTIVE, &style->text[GTK_STATE_SELECTED]); } -#endif
void ListBoxX::Create(Window &, int, Point, int, bool) { wid = gtk_window_new(GTK_WINDOW_POPUP); @@ -2115,21 +1983,6 @@ gtk_container_add(GTK_CONTAINER(frame), PWidget(scroller)); gtk_widget_show(PWidget(scroller));
-#if GTK_MAJOR_VERSION < 2 - list = gtk_clist_new(1); - 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(wid), "select_row", - GTK_SIGNAL_FUNC(SelectionAC), ¤t); - gtk_signal_connect(GTK_OBJECT(wid), "button_press_event", - GTK_SIGNAL_FUNC(ButtonPress), this); - gtk_clist_set_shadow_type(GTK_CLIST(wid), GTK_SHADOW_NONE); -#else /* Tree and its model */ GtkListStore *store = gtk_list_store_new(N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); @@ -2153,7 +2006,7 @@ gtk_tree_view_column_pack_start(column, pixbuf_renderer, FALSE); gtk_tree_view_column_add_attribute(column, pixbuf_renderer, "pixbuf", PIXBUF_COLUMN); - + GtkCellRenderer* renderer = gtk_cell_renderer_text_new(); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_tree_view_column_pack_start(column, renderer, TRUE); @@ -2169,28 +2022,15 @@ gtk_widget_show(wid); g_signal_connect(G_OBJECT(wid), "button_press_event", G_CALLBACK(ButtonPress), this); -#endif gtk_widget_realize(PWidget(wid)); }
void ListBoxX::SetFont(Font &scint_font) { -#if GTK_MAJOR_VERSION < 2 - GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(PWidget(list))); - if (!gdk_font_equal(style->font, PFont(scint_font)->pfont)) { - style = gtk_style_copy(style); - gdk_font_unref(style->font); - style->font = PFont(scint_font)->pfont; - gdk_font_ref(style->font); - gtk_widget_set_style(GTK_WIDGET(PWidget(list)), style); - gtk_style_unref(style); - } -#else // Only do for Pango font as there have been crashes for GDK fonts if (Created() && PFont(scint_font)->pfd) { // Current font is Pango font gtk_widget_modify_font(PWidget(list), PFont(scint_font)->pfd); } -#endif }
void ListBoxX::SetAverageCharWidth(int width) { @@ -2218,13 +2058,6 @@
// First calculate height of the clist for our desired visible // row count otherwise it tries to expand to the total # of rows -#if GTK_MAJOR_VERSION < 2 - int ythickness = PWidget(list)->style->klass->ythickness; - height = (rows * GTK_CLIST(list)->row_height - + rows + 1 - + 2 * (ythickness - + GTK_CONTAINER(PWidget(list))->border_width)); -#else // Get cell height int row_width=0; int row_height=0; @@ -2236,7 +2069,6 @@ height = (rows * row_height + 2 * (ythickness + GTK_CONTAINER(PWidget(list))->border_width + 1)); -#endif gtk_widget_set_usize(GTK_WIDGET(PWidget(list)), -1, height);
// Get the size of the scroller because we set usize on the window @@ -2256,30 +2088,19 @@ }
int ListBoxX::CaretFromEdge() { -#if GTK_MAJOR_VERSION >= 2 gint renderer_width, renderer_height; gtk_cell_renderer_get_fixed_size(pixbuf_renderer, &renderer_width, &renderer_height); return 4 + renderer_width; -#endif - return 4 + xset.GetWidth(); }
void ListBoxX::Clear() { -#if GTK_MAJOR_VERSION < 2 - gtk_clist_clear(GTK_CLIST(list)); -#else GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); gtk_list_store_clear(GTK_LIST_STORE(model)); -#endif maxItemCharacters = 0; }
-#if GTK_MAJOR_VERSION < 2 -static void init_pixmap(ListImage *list_image, GtkWidget *window) { -#else static void init_pixmap(ListImage *list_image) { -#endif const char *textForm = list_image->xpm_data; const char * const * xpm_lineform = reinterpret_cast<const char * const *>(textForm); const char **xpm_lineformfromtext = 0; @@ -2294,28 +2115,10 @@ }
// Drop any existing pixmap/bitmap as data may have changed -#if GTK_MAJOR_VERSION < 2 - if (list_image->pixmap) - gdk_pixmap_unref(list_image->pixmap); - list_image->pixmap = NULL; - if (list_image->bitmap) - gdk_bitmap_unref(list_image->bitmap); - list_image->bitmap = NULL; - - list_image->pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL - , gtk_widget_get_colormap(window), &(list_image->bitmap), NULL - , (gchar **) xpm_lineform); - if (NULL == list_image->pixmap) { - if (list_image->bitmap) - gdk_bitmap_unref(list_image->bitmap); - list_image->bitmap = NULL; - } -#else if (list_image->pixbuf) gdk_pixbuf_unref(list_image->pixbuf); list_image->pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar**)xpm_lineform); -#endif delete []xpm_lineformfromtext; }
@@ -2327,16 +2130,6 @@ list_image = (ListImage *) g_hash_table_lookup((GHashTable *) pixhash , (gconstpointer) GINT_TO_POINTER(type)); } -#if GTK_MAJOR_VERSION < 2 - char * szs[] = { s, NULL }; - int rownum = gtk_clist_append(GTK_CLIST(list), szs); - if (list_image) { - if (NULL == list_image->pixmap) - init_pixmap(list_image, (GtkWidget *) list); - gtk_clist_set_pixtext(GTK_CLIST(list), rownum, 0, s, SPACING - , list_image->pixmap, list_image->bitmap); - } -#else GtkTreeIter iter; GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list))); @@ -2351,7 +2144,7 @@
gint pixbuf_width = gdk_pixbuf_get_width(list_image->pixbuf); gint renderer_height, renderer_width; - gtk_cell_renderer_get_fixed_size(pixbuf_renderer, + gtk_cell_renderer_get_fixed_size(pixbuf_renderer, &renderer_width, &renderer_height); if (pixbuf_width > renderer_width) gtk_cell_renderer_set_fixed_size(pixbuf_renderer, @@ -2364,7 +2157,6 @@ gtk_list_store_set(GTK_LIST_STORE(store), &iter, TEXT_COLUMN, s, -1); } -#endif size_t len = strlen(s); if (maxItemCharacters < len) maxItemCharacters = len; @@ -2372,24 +2164,12 @@
int ListBoxX::Length() { if (wid) -#if GTK_MAJOR_VERSION < 2 - return GTK_CLIST(list)->rows; -#else return gtk_tree_model_iter_n_children(gtk_tree_view_get_model (GTK_TREE_VIEW(list)), NULL); -#endif return 0; }
void ListBoxX::Select(int n) { -#if GTK_MAJOR_VERSION < 2 - if (n == -1) { - gtk_clist_unselect_row(GTK_CLIST(list), current, 0); - } else { - gtk_clist_select_row(GTK_CLIST(list), n, 0); - gtk_clist_moveto(GTK_CLIST(list), n, 0, 0.5, 0.5); - } -#else GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); GtkTreeSelection *selection = @@ -2437,13 +2217,9 @@ } else { gtk_tree_selection_unselect_all(selection); } -#endif }
int ListBoxX::GetSelection() { -#if GTK_MAJOR_VERSION < 2 - return current; -#else GtkTreeIter iter; GtkTreeModel *model; GtkTreeSelection *selection; @@ -2456,20 +2232,9 @@ return indices[0]; } return -1; -#endif }
int ListBoxX::Find(const char *prefix) { -#if GTK_MAJOR_VERSION < 2 - int count = Length(); - for (int i = 0; i < count; i++) { - char *s = 0; - gtk_clist_get_text(GTK_CLIST(list), i, 0, &s); - if (s && (0 == strncmp(prefix, s, strlen(prefix)))) { - return i; - } - } -#else GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); @@ -2484,32 +2249,17 @@ valid = gtk_tree_model_iter_next(model, &iter) != FALSE; i++; } -#endif return -1; }
void ListBoxX::GetValue(int n, char *value, int len) { char *text = NULL; -#if GTK_MAJOR_VERSION < 2 - GtkCellType type = gtk_clist_get_cell_type(GTK_CLIST(list), n, 0); - switch (type) { - case GTK_CELL_TEXT: - gtk_clist_get_text(GTK_CLIST(list), n, 0, &text); - break; - case GTK_CELL_PIXTEXT: - gtk_clist_get_pixtext(GTK_CLIST(list), n, 0, &text, NULL, NULL, NULL); - break; - default: - break; - } -#else GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); bool valid = gtk_tree_model_iter_nth_child(model, &iter, NULL, n) != FALSE; if (valid) { gtk_tree_model_get(model, &iter, TEXT_COLUMN, &text, -1); } -#endif if (text && len > 0) { strncpy(value, text, len); value[len - 1] = '\0'; @@ -2538,18 +2288,9 @@ (gconstpointer) GINT_TO_POINTER(type)); if (list_image) { // Drop icon already registered -#if GTK_MAJOR_VERSION < 2 - if (list_image->pixmap) - gdk_pixmap_unref(list_image->pixmap); - list_image->pixmap = 0; - if (list_image->bitmap) - gdk_bitmap_unref(list_image->bitmap); - list_image->bitmap = 0; -#else if (list_image->pixbuf) gdk_pixbuf_unref(list_image->pixbuf); list_image->pixbuf = NULL; -#endif list_image->xpm_data = xpm_data; } else { list_image = g_new0(ListImage, 1); @@ -2602,11 +2343,7 @@
void Menu::Destroy() { if (mid) -#if GTK_MAJOR_VERSION < 2 - gtk_object_unref(GTK_OBJECT(mid)); -#else g_object_unref(G_OBJECT(mid)); -#endif mid = 0; }
@@ -2624,12 +2361,8 @@ if ((pt.y + requisition.height) > screenHeight) { pt.y = screenHeight - requisition.height; } -#if GTK_MAJOR_VERSION >= 2 gtk_item_factory_popup(factory, pt.x - 4, pt.y - 4, 3, gtk_get_current_event_time()); -#else - gtk_item_factory_popup(factory, pt.x - 4, pt.y - 4, 3, 0); -#endif }
ElapsedTime::ElapsedTime() { @@ -2701,12 +2434,8 @@ #ifdef G_OS_WIN32 return "Lucida Console"; #else -#ifdef USE_PANGO return "!Sans"; -#else - return "lucidatypewriter"; #endif -#endif }
int Platform::DefaultFontSize() {
Modified: trunk/scintilla/PositionCache.cxx =================================================================== --- trunk/scintilla/PositionCache.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/PositionCache.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -10,6 +10,7 @@ #include <stdio.h> #include <ctype.h>
+#include <string> #include <vector>
#include "Platform.h" @@ -361,7 +362,8 @@ for (unsigned int j = 0; j<saeLen; j++) { if (val == selAndEdge[j]) { return; - } if (val < selAndEdge[j]) { + } + if (val < selAndEdge[j]) { for (unsigned int k = saeLen; k>j; k--) { selAndEdge[k] = selAndEdge[k-1]; } @@ -447,7 +449,7 @@ delete []selAndEdge; }
-int BreakFinder::First() { +int BreakFinder::First() const { return nextBreak; }
@@ -534,7 +536,7 @@ clock = clock_; if (s_ && positions_) { positions = new short[len + (len + 1) / 2]; - for (unsigned int i=0;i<len;i++) { + for (unsigned int i=0; i<len; i++) { positions[i] = static_cast<short>(positions_[i]); } memcpy(reinterpret_cast<char *>(positions + len), s_, len); @@ -557,7 +559,7 @@ unsigned int len_, int *positions_) const { if ((styleNumber == styleNumber_) && (len == len_) && (memcmp(reinterpret_cast<char *>(positions + len), s_, len)== 0)) { - for (unsigned int i=0;i<len;i++) { + for (unsigned int i=0; i<len; i++) { positions_[i] = positions[i]; } return true; @@ -579,7 +581,7 @@ return ret; }
-bool PositionCacheEntry::NewerThan(const PositionCacheEntry &other) { +bool PositionCacheEntry::NewerThan(const PositionCacheEntry &other) const { return clock > other.clock; }
@@ -603,7 +605,7 @@
void PositionCache::Clear() { if (!allClear) { - for (size_t i=0;i<size;i++) { + for (size_t i=0; i<size; i++) { pces[i].Clear(); } } @@ -647,7 +649,7 @@ if (clock > 60000) { // Since there are only 16 bits for the clock, wrap it round and // reset all cache entries so none get stuck with a high clock. - for (size_t i=0;i<size;i++) { + for (size_t i=0; i<size; i++) { pces[i].ResetClock(); } clock = 2;
Modified: trunk/scintilla/PositionCache.h =================================================================== --- trunk/scintilla/PositionCache.h 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/PositionCache.h 2010-05-16 17:44:24 UTC (rev 4923) @@ -93,7 +93,7 @@ }; void Invalidate(LineLayout::validLevel validity_); void SetLevel(int level_); - int GetLevel() { return level; } + int GetLevel() const { return level; } LineLayout *Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_, int linesOnScreen, int linesInDoc); void Dispose(LineLayout *ll); @@ -111,7 +111,7 @@ void Clear(); bool Retrieve(unsigned int styleNumber_, const char *s_, unsigned int len_, int *positions_) const; static int Hash(unsigned int styleNumber, const char *s, unsigned int len); - bool NewerThan(const PositionCacheEntry &other); + bool NewerThan(const PositionCacheEntry &other) const; void ResetClock(); };
@@ -138,7 +138,7 @@ public: BreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posLineStart_, bool utf8_, int xStart, bool breakForSelection); ~BreakFinder(); - int First(); + int First() const; int Next(); };
@@ -152,7 +152,7 @@ ~PositionCache(); void Clear(); void SetSize(size_t size_); - int GetSize() { return size; } + int GetSize() const { return size; } void MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned int styleNumber, const char *s, unsigned int len, int *positions); };
Modified: trunk/scintilla/RESearch.cxx =================================================================== --- trunk/scintilla/RESearch.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/RESearch.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -248,6 +248,7 @@ */
RESearch::RESearch(CharClassify *charClassTable) { + failure = 0; charClass = charClassTable; Init(); }
Modified: trunk/scintilla/ScintillaBase.cxx =================================================================== --- trunk/scintilla/ScintillaBase.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/ScintillaBase.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -10,6 +10,7 @@ #include <stdio.h> #include <ctype.h>
+#include <string> #include <vector>
#include "Platform.h" @@ -56,7 +57,7 @@ lexLanguage = SCLEX_CONTAINER; performingStyle = false; lexCurrent = 0; - for (int wl = 0;wl < numWordLists;wl++) + for (int wl = 0; wl < numWordLists; wl++) keyWordLists[wl] = new WordList; keyWordLists[numWordLists] = 0; #endif @@ -64,7 +65,7 @@
ScintillaBase::~ScintillaBase() { #ifdef SCI_LEXER - for (int wl = 0;wl < numWordLists;wl++) + for (int wl = 0; wl < numWordLists; wl++) delete keyWordLists[wl]; #endif } @@ -202,8 +203,8 @@ return Editor::KeyCommand(iMessage); }
-void ScintillaBase::AutoCompleteDoubleClick(void* p) { - ScintillaBase* sci = reinterpret_cast<ScintillaBase*>(p); +void ScintillaBase::AutoCompleteDoubleClick(void *p) { + ScintillaBase *sci = reinterpret_cast<ScintillaBase *>(p); sci->AutoCompleteCompleted(); }
Modified: trunk/scintilla/ScintillaGTK.cxx =================================================================== --- trunk/scintilla/ScintillaGTK.cxx 2010-05-16 17:43:35 UTC (rev 4922) +++ trunk/scintilla/ScintillaGTK.cxx 2010-05-16 17:44:24 UTC (rev 4923) @@ -56,9 +56,7 @@
#include "gtk/gtksignal.h" #include "gtk/gtkmarshal.h" -#if GLIB_MAJOR_VERSION >= 2 #include "scintilla-marshal.h" -#endif
#ifdef SCI_LEXER #include <glib.h> @@ -66,15 +64,7 @@ #include "ExternalLexer.h" #endif
-#define INTERNATIONAL_INPUT - -#if !PLAT_GTK_WIN32 || GTK_MAJOR_VERSION >= 2 -#define USE_CONVERTER -#endif - -#ifdef USE_CONVERTER #include "Converter.h" -#endif
#ifdef _MSC_VER // Constant conditional expressions are because of GTK+ headers @@ -87,11 +77,7 @@ #define USE_GTK_CLIPBOARD #endif
-#if GLIB_MAJOR_VERSION < 2 -#define OBJECT_CLASS GtkObjectClass -#else #define OBJECT_CLASS GObjectClass -#endif
#ifdef SCI_NAMESPACE using namespace Scintilla; @@ -135,17 +121,9 @@ CLIPFORMAT cfColumnSelect; #endif
-#ifdef INTERNATIONAL_INPUT
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.