Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Auto complete ignore case bug and keywords with space is shown in multiple lines #2421

68 changes: 51 additions & 17 deletions PowerEditor/src/ScitillaComponent/AutoCompletion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include <shlwapi.h>
#include "AutoCompletion.h"
#include "Notepad_plus_msgs.h"

#include <iterator>
using namespace std;

static bool isInList(generic_string word, const vector<generic_string> & wordArray)
Expand All @@ -41,7 +41,6 @@ static bool isInList(generic_string word, const vector<generic_string> & wordArr
return false;
};


bool AutoCompletion::showApiComplete()
{
if (!_funcCompletionActive)
Expand All @@ -58,7 +57,7 @@ bool AutoCompletion::showApiComplete()
if (len >= _keyWordMaxLen)
return false;

_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' '));
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n'));
_pEditView->execute(SCI_AUTOCSETIGNORECASE, _ignoreCase);
_pEditView->showAutoComletion(curPos - startPos, _keyWords.c_str());

Expand Down Expand Up @@ -89,19 +88,33 @@ bool AutoCompletion::showApiAndWordComplete()
bool canStop = false;
for (size_t i = 0, kwlen = _keyWordArray.size(); i < kwlen; ++i)
{
if (_keyWordArray[i].compare(0, len, beginChars) == 0)

bool _ignoreCaseMatch = false;
if (_ignoreCase)
{
generic_string keytemp;
std::transform(_keyWordArray[i].begin(), _keyWordArray[i].end(), std::back_inserter(keytemp), ::tolower);
generic_string expr(beginChars);
generic_string beginchartmp;
std::transform(expr.begin(), expr.end(), std::back_inserter(beginchartmp), ::tolower);
_ignoreCaseMatch = (keytemp.compare(0, len, beginchartmp) == 0);
}

//if (_keyWordArray[i].compare(0, len, beginChars) == 0)
if (_ignoreCaseMatch || (_keyWordArray[i].compare(0, len, beginChars) == 0))
{
if (!isInList(_keyWordArray[i], wordArray))
wordArray.push_back(_keyWordArray[i]);
canStop = true;
}
else if (canStop) {
else if (canStop)
{
// Early out since no more strings will match
break;
}
}

sort(wordArray.begin(), wordArray.end());
sortKeyWords();

// Get word list
generic_string words;
Expand All @@ -110,10 +123,10 @@ bool AutoCompletion::showApiAndWordComplete()
{
words += wordArray[i];
if (i != len - 1)
words += TEXT(" ");
words += TEXT("\n");
}

_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' '));
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n'));
_pEditView->execute(SCI_AUTOCSETIGNORECASE, _ignoreCase);
_pEditView->showAutoComletion(curPos - startPos, words.c_str());
return true;
Expand All @@ -123,14 +136,21 @@ bool AutoCompletion::showApiAndWordComplete()
void AutoCompletion::getWordArray(vector<generic_string> & wordArray, TCHAR *beginChars)
{
const size_t bufSize = 256;

generic_string expr(TEXT("\\<"));
expr += beginChars;
//expr += TEXT("[^ \\t.,;:\"()=<>'+!\\[\\]]*");
expr += TEXT("[^ \\t\\n\\r.,;:\"()=<>'+!\\[\\]]+");

int docLength = int(_pEditView->execute(SCI_GETLENGTH));

int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX;

int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX ;

if(_ignoreCase)
{
flags = SCFIND_WORDSTART | SCFIND_REGEXP | SCFIND_POSIX ;
}



_pEditView->execute(SCI_SETSEARCHFLAGS, flags);
int posFind = _pEditView->searchInTarget(expr.c_str(), int(expr.length()), 0, docLength);
Expand Down Expand Up @@ -338,8 +358,7 @@ bool AutoCompletion::showWordComplete(bool autoInsert)
return true;
}

sort(wordArray.begin(), wordArray.end());

sortKeyWords();
// Get word list
generic_string words(TEXT(""));

Expand Down Expand Up @@ -849,13 +868,11 @@ bool AutoCompletion::setLanguage(LangType language) {
}
}
}

sort(_keyWordArray.begin(), _keyWordArray.end());

sortKeyWords();
for (size_t i = 0, len = _keyWordArray.size(); i < len; ++i)
{
_keyWords.append(_keyWordArray[i]);
_keyWords.append(TEXT(" "));
_keyWords.append(TEXT("\n"));
}
}
return _funcCompletionActive;
Expand Down Expand Up @@ -884,3 +901,20 @@ const TCHAR * AutoCompletion::getApiFileName()
return ScintillaEditView::langNames[_curLang].lexerName;

}
void AutoCompletion::sortKeyWords()
{
if (_ignoreCase)
{
std::sort(_keyWordArray.begin(), _keyWordArray.end(), [](const generic_string& lhs, const generic_string& rhs) {
generic_string first;
std::transform(lhs.begin(), lhs.end(), std::back_inserter(first), ::tolower);
generic_string second;
std::transform(rhs.begin(), rhs.end(), std::back_inserter(second), ::tolower);
return first < second;
});
}
else
{
std::sort(_keyWordArray.begin(), _keyWordArray.end());
}
}
2 changes: 1 addition & 1 deletion PowerEditor/src/ScitillaComponent/AutoCompletion.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class AutoCompletion {
void update(int character);
void callTipClick(int direction);
void getCloseTag(char *closeTag, size_t closeTagLen, size_t caretPos, bool isHTML);

void sortKeyWords();
private:
bool _funcCompletionActive = false;
ScintillaEditView * _pEditView = nullptr;
Expand Down