diff options
Diffstat (limited to 'src/ScintillaBase.cxx')
-rw-r--r-- | src/ScintillaBase.cxx | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index 8d42f0b7b..bf81887f2 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -11,9 +11,9 @@ #include "Platform.h" #include "Scintilla.h" +#include "PropSet.h" #ifdef SCI_LEXER #include "SciLexer.h" -#include "PropSet.h" #include "Accessor.h" #include "WindowAccessor.h" #include "DocumentAccessor.h" @@ -60,6 +60,8 @@ void ScintillaBase::RefreshColourPalette(Palette &pal, bool want) { void ScintillaBase::AddCharUTF(char *s, unsigned int len) { bool acActiveBeforeCharAdded = ac.Active(); + if (!acActiveBeforeCharAdded || !ac.IsFillUpChar(*s)) + Editor::AddCharUTF(s, len); Editor::AddCharUTF(s, len); if (acActiveBeforeCharAdded) AutoCompleteChanged(s[0]); @@ -136,6 +138,9 @@ int ScintillaBase::KeyCommand(unsigned int iMessage) { case SCI_TAB: AutoCompleteCompleted(); return 0; + case SCI_NEWLINE: + AutoCompleteCompleted(); + return 0; default: ac.Cancel(); @@ -238,7 +243,9 @@ void ScintillaBase::AutoCompleteMoveToCurrentWord() { } void ScintillaBase::AutoCompleteChanged(char ch) { - if (currentPos <= ac.posStart - ac.startLen) { + if (ac.IsFillUpChar(ch)) { + AutoCompleteCompleted(ch); + } else if (currentPos <= ac.posStart - ac.startLen) { ac.Cancel(); } else if (ac.cancelAtStartPos && currentPos <= ac.posStart) { ac.Cancel(); @@ -249,20 +256,39 @@ void ScintillaBase::AutoCompleteChanged(char ch) { } } -void ScintillaBase::AutoCompleteCompleted() { +void ScintillaBase::AutoCompleteCompleted(char fillUp/*='\0'*/) { int item = ac.lb.GetSelection(); char selected[1000]; if (item != -1) { ac.lb.GetValue(item, selected, sizeof(selected)); } ac.Cancel(); - if (currentPos != ac.posStart) { - pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart); - } - SetEmptySelection(ac.posStart); - if (item != -1) { - pdoc->InsertString(currentPos, selected + ac.startLen); - SetEmptySelection(currentPos + strlen(selected + ac.startLen)); + + if (ac.ignoreCase) { + if (currentPos != ac.posStart) { + pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart); + } + SetEmptySelection(ac.posStart - ac.startLen); + pdoc->DeleteChars(ac.posStart - ac.startLen, ac.startLen); + if (item != -1) { + SString piece = selected; + if (fillUp) + piece += fillUp; + pdoc->InsertString(currentPos, piece.c_str()); + SetEmptySelection(currentPos + piece.length()); + } + } else { + if (currentPos != ac.posStart) { + pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart); + } + SetEmptySelection(ac.posStart); + if (item != -1) { + SString piece = selected + ac.startLen; + if (fillUp) + piece += fillUp; + pdoc->InsertString(currentPos, piece.c_str()); + SetEmptySelection(currentPos + piece.length()); + } } } @@ -366,6 +392,10 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP case SCI_AUTOCGETCANCELATSTART: return ac.cancelAtStartPos; + case SCI_AUTOCSETFILLUPS: + ac.SetFillUpChars(reinterpret_cast<char *>(lParam)); + break; + case SCI_CALLTIPSHOW: { AutoCompleteCancel(); if (!ct.wCallTip.Created()) { |