diff -r 9ccb2c951aed -r 21c761a47bb3 include/Scintilla.h --- a/include/Scintilla.h Tue Jan 25 10:03:55 2011 +1100 +++ b/include/Scintilla.h Wed Jan 26 23:06:33 2011 -0600 @@ -124,6 +124,7 @@ #define SC_MARK_LEFTRECT 27 #define SC_MARK_AVAILABLE 28 #define SC_MARK_UNDERLINE 29 +#define SC_MARK_BACKFORE 3030 #define SC_MARK_CHARACTER 10000 #define SC_MARKNUM_FOLDEREND 25 #define SC_MARKNUM_FOLDEROPENMID 26 @@ -168,6 +169,7 @@ #define STYLE_CONTROLCHAR 36 #define STYLE_INDENTGUIDE 37 #define STYLE_CALLTIP 38 +#define STYLE_AUTOCOMPLETION 39 #define STYLE_LASTPREDEFINED 39 #define STYLE_MAX 255 #define SC_CHARSET_ANSI 0 diff -r 9ccb2c951aed -r 21c761a47bb3 src/AutoComplete.cxx --- a/src/AutoComplete.cxx Tue Jan 25 10:03:55 2011 +1100 +++ b/src/AutoComplete.cxx Wed Jan 26 23:06:33 2011 -0600 @@ -132,7 +132,7 @@ char item[maxItemLen]; int start = 0; // lower bound of the api array block to search int end = lb->Length() - 1; // upper bound of the api array block to search - while ((start <= end) && (location == -1)) { // Binary searching loop + while (lenWord && (start <= end) && (location == -1)) { // Binary searching loop int pivot = (start + end) / 2; lb->GetValue(pivot, item, maxItemLen); int cond; diff -r 9ccb2c951aed -r 21c761a47bb3 src/Document.cxx --- a/src/Document.cxx Tue Jan 25 10:03:55 2011 +1100 +++ b/src/Document.cxx Wed Jan 26 23:06:33 2011 -0600 @@ -1190,7 +1190,7 @@ if (pos > 0) { CharClassify::cc ccPos = WordCharClass(CharAt(pos)); return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) && - (ccPos != WordCharClass(CharAt(pos - 1))); + (ccPos != WordCharClass(CharAt(NextPosition(pos, -1)))); } return true; } @@ -1201,7 +1201,7 @@ */ bool Document::IsWordEndAt(int pos) { if (pos < Length()) { - CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1)); + CharClassify::cc ccPrev = WordCharClass(CharAt(NextPosition(pos, -1))); return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) && (ccPrev != WordCharClass(CharAt(pos))); } diff -r 9ccb2c951aed -r 21c761a47bb3 src/Editor.cxx --- a/src/Editor.cxx Tue Jan 25 10:03:55 2011 +1100 +++ b/src/Editor.cxx Wed Jan 26 23:06:33 2011 -0600 @@ -2620,7 +2620,8 @@ if (!overrideBackground) { int marks = pdoc->GetMark(line); for (int markBit = 0; (markBit < 32) && marks; markBit++) { - if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) && + if ((marks & 1) && ((vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) || + (vsDraw.markers[markBit].markType == SC_MARK_BACKFORE)) && (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { background = vsDraw.markers[markBit].back.allocated; overrideBackground = true; @@ -2840,6 +2841,15 @@ if (vsDraw.hotspotForegroundSet) textFore = vsDraw.hotspotForeground.allocated; } + + marks = pdoc->GetMark(line); + for (markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKFORE)) { + textFore = vsDraw.markers[markBit].fore.allocated; + } + marks >>= 1; + } + const int inSelection = hideSelection ? 0 : sel.CharacterInSelection(iDoc); if (inSelection && (vsDraw.selforeset)) { textFore = (inSelection == 1) ? vsDraw.selforeground.allocated : vsDraw.selAdditionalForeground.allocated; @@ -3051,7 +3061,8 @@ } marks = pdoc->GetMark(line); for (markBit = 0; (markBit < 32) && marks; markBit++) { - if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) { + if ((marks & 1) && ((vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) || + (vsDraw.markers[markBit].markType == SC_MARK_BACKFORE))) { SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); } else if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_UNDERLINE)) { PRectangle rcUnderline = rcSegment; @@ -3272,6 +3283,15 @@ rcCaret.right = rcCaret.left + vsDraw.caretWidth; } ColourAllocated caretColour = mainCaret ? vsDraw.caretcolour.allocated : vsDraw.additionalCaretColour.allocated; + + int marks = pdoc->GetMark(lineDoc); + for (int markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKFORE)) { + caretColour = vsDraw.markers[markBit].fore.allocated; + } + marks >>= 1; + } + if (drawBlockCaret) { DrawBlockCaret(surface, vsDraw, ll, subLine, xStart, offset, posCaret.Position(), rcCaret, caretColour); } else { diff -r 9ccb2c951aed -r 21c761a47bb3 src/LineMarker.cxx --- a/src/LineMarker.cxx Tue Jan 25 10:03:55 2011 +1100 +++ b/src/LineMarker.cxx Wed Jan 26 23:06:33 2011 -0600 @@ -155,7 +155,8 @@ surface->RectangleDraw(rcSmall, fore.allocated, back.allocated); } else if (markType == SC_MARK_EMPTY || markType == SC_MARK_BACKGROUND || - markType == SC_MARK_UNDERLINE || markType == SC_MARK_AVAILABLE) { + markType == SC_MARK_UNDERLINE || markType == SC_MARK_AVAILABLE || + markType == SC_MARK_BACKFORE) { // An invisible marker so don't draw anything } else if (markType == SC_MARK_VLINE) { diff -r 9ccb2c951aed -r 21c761a47bb3 src/ScintillaBase.cxx --- a/src/ScintillaBase.cxx Tue Jan 25 10:03:55 2011 +1100 +++ b/src/ScintillaBase.cxx Wed Jan 26 23:06:33 2011 -0600 @@ -220,7 +220,7 @@ } } ac.Start(wMain, idAutoComplete, sel.MainCaret(), PointMainCaret(), - lenEntered, vs.lineHeight, IsUnicodeMode()); + lenEntered, vs.styles[STYLE_AUTOCOMPLETION].lineHeight, IsUnicodeMode()); PRectangle rcClient = GetClientRectangle(); Point pt = LocationFromPosition(sel.MainCaret() - lenEntered); @@ -250,8 +250,8 @@ rcac.right = rcac.left + widthLB; rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcPopupBounds.bottom); ac.lb->SetPositionRelative(rcac, wMain); - ac.lb->SetFont(vs.styles[STYLE_DEFAULT].font); - unsigned int aveCharWidth = vs.styles[STYLE_DEFAULT].aveCharWidth; + ac.lb->SetFont(vs.styles[STYLE_AUTOCOMPLETION].font); + unsigned int aveCharWidth = vs.styles[STYLE_AUTOCOMPLETION].aveCharWidth; ac.lb->SetAverageCharWidth(aveCharWidth); ac.lb->SetDoubleClickAction(AutoCompleteDoubleClick, this); @@ -275,9 +275,7 @@ rcList.bottom = rcList.top + heightAlloced; ac.lb->SetPositionRelative(rcList, wMain); ac.Show(true); - if (lenEntered != 0) { - AutoCompleteMoveToCurrentWord(); - } + AutoCompleteMoveToCurrentWord(); } void ScintillaBase::AutoCompleteCancel() { @@ -299,7 +297,10 @@ char wordCurrent[1000]; int i; int startWord = ac.posStart - ac.startLen; - for (i = startWord; i < sel.MainCaret() && i - startWord < 1000; i++) + int endWord = sel.MainCaret(); + //if (ac.selectRestOfWord) + endWord = pdoc->ExtendWordSelect(endWord, 1, true); + for (i = startWord; i < endWord && i - startWord < 1000; i++) wordCurrent[i - startWord] = pdoc->CharAt(i); wordCurrent[Platform::Minimum(i - startWord, 999)] = '\0'; ac.Select(wordCurrent); diff -r 9ccb2c951aed -r 21c761a47bb3 src/ViewStyle.cxx --- a/src/ViewStyle.cxx Tue Jan 25 10:03:55 2011 +1100 +++ b/src/ViewStyle.cxx Wed Jan 26 23:06:33 2011 -0600 @@ -301,9 +301,9 @@ for (unsigned int i=0; i