mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-09-23 18:08:10 +02:00
Finish Calltip.
Make AutoComplete class. AutoComplete uses XML data. Add exception handling (dumping filedata). Sync Project file with added files. git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@205 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
parent
7085e69724
commit
e6cfeedc0d
44
PowerEditor/src/MISC/Exception/Win32Exception.cpp
Normal file
44
PowerEditor/src/MISC/Exception/Win32Exception.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
//This code was retrieved from
|
||||||
|
//http://www.thunderguy.com/semicolon/2002/08/15/visual-c-exception-handling/3/
|
||||||
|
//(Visual C++ exception handling)
|
||||||
|
//By Bennett
|
||||||
|
//Formatting Slightly modified for N++
|
||||||
|
|
||||||
|
#include "Win32Exception.h"
|
||||||
|
#include "eh.h" //eehh... =]
|
||||||
|
|
||||||
|
Win32Exception::Win32Exception(const EXCEPTION_RECORD * info) {
|
||||||
|
_location = info->ExceptionAddress;
|
||||||
|
_code = info->ExceptionCode;
|
||||||
|
switch (info->ExceptionCode) {
|
||||||
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
|
_event = "Access violation";
|
||||||
|
break;
|
||||||
|
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
|
||||||
|
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
||||||
|
_event = "Division by zero";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_event = "Unlisted exception";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Win32Exception::installHandler() {
|
||||||
|
_set_se_translator(Win32Exception::translate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Win32Exception::translate(unsigned code, EXCEPTION_POINTERS * info) {
|
||||||
|
// Windows guarantees that *(info->ExceptionRecord) is valid
|
||||||
|
switch (code) {
|
||||||
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
|
throw Win32AccessViolation(info->ExceptionRecord);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw Win32Exception(info->ExceptionRecord);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Win32AccessViolation::Win32AccessViolation(const EXCEPTION_RECORD * info) : Win32Exception(info) {
|
||||||
|
_isWrite = info->ExceptionInformation[0] == 1;
|
||||||
|
_badAddress = reinterpret_cast<ExceptionAddress>(info->ExceptionInformation[1]);
|
||||||
|
}
|
42
PowerEditor/src/MISC/Exception/Win32Exception.h
Normal file
42
PowerEditor/src/MISC/Exception/Win32Exception.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
//This code was retrieved from
|
||||||
|
//http://www.thunderguy.com/semicolon/2002/08/15/visual-c-exception-handling/3/
|
||||||
|
//(Visual C++ exception handling)
|
||||||
|
//By Bennett
|
||||||
|
//Formatting Slightly modified for N++
|
||||||
|
|
||||||
|
#include "windows.h"
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
typedef const void* ExceptionAddress; // OK on Win32 platform
|
||||||
|
|
||||||
|
class Win32Exception : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void installHandler();
|
||||||
|
virtual const char* what() const { return _event; };
|
||||||
|
ExceptionAddress where() const { return _location; };
|
||||||
|
unsigned code() const { return _code; };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Win32Exception(const EXCEPTION_RECORD * info); //Constructor only accessible by exception handler
|
||||||
|
static void translate(unsigned code, EXCEPTION_POINTERS * info);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const char * _event;
|
||||||
|
ExceptionAddress _location;
|
||||||
|
unsigned int _code;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Win32AccessViolation: public Win32Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool isWrite() const { return _isWrite; };
|
||||||
|
ExceptionAddress badAddress() const { return _badAddress; };
|
||||||
|
private:
|
||||||
|
Win32AccessViolation(const EXCEPTION_RECORD * info);
|
||||||
|
|
||||||
|
bool _isWrite;
|
||||||
|
ExceptionAddress _badAddress;
|
||||||
|
|
||||||
|
friend void Win32Exception::translate(unsigned code, EXCEPTION_POINTERS* info);
|
||||||
|
};
|
@ -61,8 +61,10 @@ struct SortTaskListPred
|
|||||||
Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL),
|
Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL),
|
||||||
_pMainSplitter(NULL), _isfullScreen(false),
|
_pMainSplitter(NULL), _isfullScreen(false),
|
||||||
_recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false), _isRTL(false),
|
_recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false), _isRTL(false),
|
||||||
_linkTriggered(true), _isDocModifing(false), _isHotspotDblClicked(false), _isSaving(false), _sysMenuEntering(false)
|
_linkTriggered(true), _isDocModifing(false), _isHotspotDblClicked(false), _isSaving(false), _sysMenuEntering(false),
|
||||||
|
_autoCompleteMain(&_mainEditView), _autoCompleteSub(&_subEditView)
|
||||||
{
|
{
|
||||||
|
|
||||||
ZeroMemory(&_prevSelectedRange, sizeof(_prevSelectedRange));
|
ZeroMemory(&_prevSelectedRange, sizeof(_prevSelectedRange));
|
||||||
|
|
||||||
_winVersion = (NppParameters::getInstance())->getWinVersion();
|
_winVersion = (NppParameters::getInstance())->getWinVersion();
|
||||||
@ -1611,65 +1613,7 @@ string Notepad_plus::getLangDesc(LangType langType, bool shortDesc)
|
|||||||
return string(elc._desc);
|
return string(elc._desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int maxChar = 64;
|
string str2Show = ScintillaEditView::langNames[langType].longName;
|
||||||
static char langDescArray[][maxChar] = {
|
|
||||||
"Normal text", "Normal text file",
|
|
||||||
"PHP", "PHP Hypertext Preprocessor file",
|
|
||||||
"C", "C source file",
|
|
||||||
"C++", "C++ source file",
|
|
||||||
"C#", "C# source file",
|
|
||||||
"Objective-C", "Objective-C source file",
|
|
||||||
"Java", "Java source file",
|
|
||||||
"RC", "Windows Resource file",
|
|
||||||
"HTML", "Hyper Text Markup Language file",
|
|
||||||
"XML", "eXtensible Markup Language file",
|
|
||||||
"Makefile", "Makefile",
|
|
||||||
"Pascal", "Pascal source file",
|
|
||||||
"Batch", "Batch file",
|
|
||||||
"ini", "MS ini file",
|
|
||||||
"NFO", "MSDOS Style/ASCII Art",
|
|
||||||
"udf", "User Define File",
|
|
||||||
"ASP", "Active Server Pages script file",
|
|
||||||
"SQL", "Structured Query Language file",
|
|
||||||
"VB", "Visual Basic file",
|
|
||||||
"JavaScript", "JavaScript file",
|
|
||||||
"CSS", "Cascade Style Sheets File",
|
|
||||||
"Perl", "Perl source file",
|
|
||||||
"Python", "Python file",
|
|
||||||
"Lua", "Lua source File",
|
|
||||||
"TeX", "TeX file",
|
|
||||||
"Fortran", "Fortran source file",
|
|
||||||
"Shell", "Unix script file",
|
|
||||||
"Flash Action", "Flash Action script file",
|
|
||||||
"NSIS", "Nullsoft Scriptable Install System script file",
|
|
||||||
"TCL", "Tool Command Language file",
|
|
||||||
"Lisp", "List Processing language file",
|
|
||||||
"Scheme", "Scheme file",
|
|
||||||
"Assembly", "Assembly language source file",
|
|
||||||
"Diff", "Diff file",
|
|
||||||
"Properties file", "Properties file",
|
|
||||||
"Postscript", "Postscript file",
|
|
||||||
"Ruby", "Ruby file",
|
|
||||||
"Smalltalk", "Smalltalk file",
|
|
||||||
"VHDL", "VHSIC Hardware Description Language file",
|
|
||||||
"KiXtart", "KiXtart file",
|
|
||||||
"AutoIt", "AutoIt",
|
|
||||||
"CAML", "Categorical Abstract Machine Language",
|
|
||||||
"Ada", "Ada file",
|
|
||||||
"Verilog", "Verilog file",
|
|
||||||
"MATLAB", "MATrix LABoratory",
|
|
||||||
"Haskell", "Haskell",
|
|
||||||
"Inno", "Inno Setup script",
|
|
||||||
"Internal Search", "Internal Search",
|
|
||||||
"CMAKEFILE", "CMAKEFILE",
|
|
||||||
"YAML", "YAML Ain't Markup Language"
|
|
||||||
};
|
|
||||||
|
|
||||||
int index = (int(langType)) * 2 + (shortDesc?0:1);
|
|
||||||
if (index >= sizeof(langDescArray)/maxChar)
|
|
||||||
index = 0;
|
|
||||||
|
|
||||||
string str2Show = langDescArray[index];
|
|
||||||
|
|
||||||
if (langType == L_USER)
|
if (langType == L_USER)
|
||||||
{
|
{
|
||||||
@ -1683,125 +1627,6 @@ string Notepad_plus::getLangDesc(LangType langType, bool shortDesc)
|
|||||||
return str2Show;
|
return str2Show;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notepad_plus::getApiFileName(LangType langType, string &fn)
|
|
||||||
{
|
|
||||||
|
|
||||||
switch (langType)
|
|
||||||
{
|
|
||||||
case L_C: fn = "c"; break;
|
|
||||||
|
|
||||||
case L_CPP: fn = "cpp"; break;
|
|
||||||
|
|
||||||
case L_OBJC: fn = "objC"; break;
|
|
||||||
|
|
||||||
case L_JAVA: fn = "java"; break;
|
|
||||||
|
|
||||||
case L_CS : fn = "cs"; break;
|
|
||||||
|
|
||||||
case L_XML: fn = "xml"; break;
|
|
||||||
|
|
||||||
case L_JS: fn = "javascript"; break;
|
|
||||||
|
|
||||||
case L_PHP: fn = "php"; break;
|
|
||||||
|
|
||||||
case L_VB:
|
|
||||||
case L_ASP: fn = "vb"; break;
|
|
||||||
|
|
||||||
case L_CSS: fn = "css"; break;
|
|
||||||
|
|
||||||
case L_LUA: fn = "lua"; break;
|
|
||||||
|
|
||||||
case L_PERL: fn = "perl"; break;
|
|
||||||
|
|
||||||
case L_PASCAL: fn = "pascal"; break;
|
|
||||||
|
|
||||||
case L_PYTHON: fn = "python"; break;
|
|
||||||
|
|
||||||
case L_TEX : fn = "tex"; break;
|
|
||||||
|
|
||||||
case L_FORTRAN : fn = "fortran"; break;
|
|
||||||
|
|
||||||
case L_BASH : fn = "bash"; break;
|
|
||||||
|
|
||||||
case L_FLASH : fn = "flash"; break;
|
|
||||||
|
|
||||||
case L_NSIS : fn = "nsis"; break;
|
|
||||||
|
|
||||||
case L_TCL : fn = "tcl"; break;
|
|
||||||
|
|
||||||
case L_LISP : fn = "lisp"; break;
|
|
||||||
|
|
||||||
case L_SCHEME : fn = "scheme"; break;
|
|
||||||
|
|
||||||
case L_ASM :
|
|
||||||
fn = "asm"; break;
|
|
||||||
|
|
||||||
case L_DIFF :
|
|
||||||
fn = "diff"; break;
|
|
||||||
/*
|
|
||||||
case L_PROPS :
|
|
||||||
fn = "Properties file"; break;
|
|
||||||
*/
|
|
||||||
case L_PS :
|
|
||||||
fn = "postscript"; break;
|
|
||||||
|
|
||||||
case L_RUBY :
|
|
||||||
fn = "ruby"; break;
|
|
||||||
|
|
||||||
case L_SMALLTALK :
|
|
||||||
fn = "smalltalk"; break;
|
|
||||||
|
|
||||||
case L_VHDL :
|
|
||||||
fn = "vhdl"; break;
|
|
||||||
|
|
||||||
case L_KIX :
|
|
||||||
fn = "kix"; break;
|
|
||||||
|
|
||||||
case L_AU3 :
|
|
||||||
fn = "autoit"; break;
|
|
||||||
|
|
||||||
case L_CAML :
|
|
||||||
fn = "caml"; break;
|
|
||||||
|
|
||||||
case L_ADA :
|
|
||||||
fn = "ada"; break;
|
|
||||||
|
|
||||||
case L_VERILOG :
|
|
||||||
fn = "verilog"; break;
|
|
||||||
|
|
||||||
case L_MATLAB :
|
|
||||||
fn = "matlab"; break;
|
|
||||||
|
|
||||||
case L_HASKELL :
|
|
||||||
fn = "haskell"; break;
|
|
||||||
|
|
||||||
case L_INNO :
|
|
||||||
fn = "inno"; break;
|
|
||||||
|
|
||||||
case L_CMAKE :
|
|
||||||
fn = "cmake"; break;
|
|
||||||
|
|
||||||
case L_YAML :
|
|
||||||
fn = "yaml"; break;
|
|
||||||
|
|
||||||
case L_USER :
|
|
||||||
{
|
|
||||||
Buffer & currentBuf = _pEditView->getCurrentBuffer();
|
|
||||||
if (currentBuf.isUserDefineLangExt())
|
|
||||||
{
|
|
||||||
fn = currentBuf.getUserDefineLangName();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
if (langType >= L_EXTERNAL && langType < NppParameters::getInstance()->L_END)
|
|
||||||
fn = NppParameters::getInstance()->getELCFromIndex(langType - L_EXTERNAL)._name;
|
|
||||||
else
|
|
||||||
fn = "text";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL Notepad_plus::notify(SCNotification *notification)
|
BOOL Notepad_plus::notify(SCNotification *notification)
|
||||||
{
|
{
|
||||||
//Important, keep track of which element generated the message
|
//Important, keep track of which element generated the message
|
||||||
@ -2160,22 +1985,11 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||||||
case SCN_CHARADDED:
|
case SCN_CHARADDED:
|
||||||
{
|
{
|
||||||
charAdded(static_cast<char>(notification->ch));
|
charAdded(static_cast<char>(notification->ch));
|
||||||
static const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
|
|
||||||
|
|
||||||
char s[64];
|
AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub;
|
||||||
notifyView->getWordToCurrentPos(s, sizeof(s));
|
|
||||||
|
autoC->update(notification->ch);
|
||||||
|
|
||||||
if (strlen(s) >= nppGUI._autocFromLen)
|
|
||||||
{
|
|
||||||
if (nppGUI._autocStatus == nppGUI.autoc_word)
|
|
||||||
autoCompFromCurrentFile(false);
|
|
||||||
else if (nppGUI._autocStatus == nppGUI.autoc_func)
|
|
||||||
showAutoComp();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nppGUI._funcParams || _funcCalltip.isVisible()) {
|
|
||||||
_funcCalltip.updateCalltip(notification->ch);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2196,12 +2010,14 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SCN_UPDATEUI:
|
case SCN_UPDATEUI:
|
||||||
|
{
|
||||||
braceMatch();
|
braceMatch();
|
||||||
markSelectedText();
|
markSelectedText();
|
||||||
updateStatusBar();
|
updateStatusBar();
|
||||||
if (_funcCalltip.isVisible())
|
AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub;
|
||||||
_funcCalltip.updateCalltip(0);
|
autoC->update(0);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TTN_GETDISPINFO:
|
case TTN_GETDISPINFO:
|
||||||
{
|
{
|
||||||
@ -2303,12 +2119,8 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||||||
|
|
||||||
case SCN_CALLTIPCLICK:
|
case SCN_CALLTIPCLICK:
|
||||||
{
|
{
|
||||||
int dir = notification->position;
|
AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub;
|
||||||
if (dir == 1) {
|
autoC->callTipClick(notification->position);
|
||||||
_funcCalltip.showPrevOverload();
|
|
||||||
} else if (dir == 2) {
|
|
||||||
_funcCalltip.showNextOverload();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5036,167 +4848,24 @@ void Notepad_plus::checkUnicodeMenuItems(UniMode um) const
|
|||||||
::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, id, MF_BYCOMMAND);
|
::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, id, MF_BYCOMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isInList(string word, const vector<string> & wordArray)
|
void Notepad_plus::showAutoComp() {
|
||||||
{
|
bool isFromPrimary = _pEditView == &_mainEditView;
|
||||||
for (size_t i = 0 ; i < wordArray.size() ; i++)
|
AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub;
|
||||||
if (wordArray[i] == word)
|
autoC->showAutoComplete();
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
void Notepad_plus::autoCompFromCurrentFile(bool autoInsert)
|
|
||||||
{
|
|
||||||
int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
|
|
||||||
int startPos = int(_pEditView->execute(SCI_WORDSTARTPOSITION, curPos, true));
|
|
||||||
|
|
||||||
if (curPos == startPos)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const size_t bufSize = 256;
|
|
||||||
size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos);
|
|
||||||
if (len >= bufSize)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char beginChars[bufSize];
|
|
||||||
|
|
||||||
_pEditView->getText(beginChars, startPos, curPos);
|
|
||||||
|
|
||||||
string expr("\\<");
|
|
||||||
expr += beginChars;
|
|
||||||
expr += "[^ \\t.,;:\"()=<>'+!\\[\\]]*";
|
|
||||||
|
|
||||||
//::MessageBox(NULL, expr.c_str(), "", MB_OK);
|
|
||||||
|
|
||||||
int docLength = int(_pEditView->execute(SCI_GETLENGTH));
|
|
||||||
|
|
||||||
int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX;
|
|
||||||
|
|
||||||
_pEditView->execute(SCI_SETTARGETSTART, 0);
|
|
||||||
_pEditView->execute(SCI_SETTARGETEND, docLength);
|
|
||||||
_pEditView->execute(SCI_SETSEARCHFLAGS, flags);
|
|
||||||
|
|
||||||
vector<string> wordArray;
|
|
||||||
|
|
||||||
int posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str()));
|
|
||||||
|
|
||||||
while (posFind != -1)
|
|
||||||
{
|
|
||||||
int wordStart = int(_pEditView->execute(SCI_GETTARGETSTART));
|
|
||||||
int wordEnd = int(_pEditView->execute(SCI_GETTARGETEND));
|
|
||||||
|
|
||||||
size_t foundTextLen = wordEnd - wordStart;
|
|
||||||
|
|
||||||
if (foundTextLen < bufSize)
|
|
||||||
{
|
|
||||||
char w[bufSize];
|
|
||||||
_pEditView->getText(w, wordStart, wordEnd);
|
|
||||||
|
|
||||||
if (strcmp(w, beginChars))
|
|
||||||
if (!isInList(w, wordArray))
|
|
||||||
wordArray.push_back(w);
|
|
||||||
}
|
|
||||||
_pEditView->execute(SCI_SETTARGETSTART, wordEnd/*posFind + foundTextLen*/);
|
|
||||||
_pEditView->execute(SCI_SETTARGETEND, docLength);
|
|
||||||
posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str()));
|
|
||||||
}
|
|
||||||
if (wordArray.size() == 0) return;
|
|
||||||
|
|
||||||
if (wordArray.size() == 1 && autoInsert)
|
|
||||||
{
|
|
||||||
_pEditView->execute(SCI_SETTARGETSTART, startPos);
|
|
||||||
_pEditView->execute(SCI_SETTARGETEND, curPos);
|
|
||||||
_pEditView->execute(SCI_REPLACETARGETRE, wordArray[0].length(), (LPARAM)wordArray[0].c_str());
|
|
||||||
|
|
||||||
_pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sort(wordArray.begin(), wordArray.end());
|
|
||||||
|
|
||||||
string words("");
|
|
||||||
|
|
||||||
for (size_t i = 0 ; i < wordArray.size() ; i++)
|
|
||||||
{
|
|
||||||
words += wordArray[i];
|
|
||||||
if (i != wordArray.size()-1)
|
|
||||||
words += " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' '));
|
|
||||||
_pEditView->execute(SCI_AUTOCSETIGNORECASE, 3);
|
|
||||||
_pEditView->execute(SCI_AUTOCSHOW, curPos - startPos, WPARAM(words.c_str()));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notepad_plus::showAutoComp()
|
void Notepad_plus::autoCompFromCurrentFile(bool autoInsert) {
|
||||||
{
|
bool isFromPrimary = _pEditView == &_mainEditView;
|
||||||
int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
|
AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub;
|
||||||
int line = _pEditView->getCurrentLineNumber();
|
autoC->showWordComplete(autoInsert);
|
||||||
int debutLinePos = int(_pEditView->execute(SCI_POSITIONFROMLINE, line ));
|
|
||||||
int debutMotPos = curPos;
|
|
||||||
|
|
||||||
|
|
||||||
char c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1));
|
|
||||||
while ((debutMotPos>0)&&(debutMotPos>=debutLinePos)&&((isalnum(c))||(c=='_')))
|
|
||||||
{
|
|
||||||
debutMotPos--;
|
|
||||||
c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1));
|
|
||||||
}
|
|
||||||
LangType langType = _pEditView->getCurrentDocType();
|
|
||||||
if ((langType == L_RC) || (langType == L_HTML) || (langType == L_SQL))
|
|
||||||
{
|
|
||||||
int typeIndex = LANG_INDEX_INSTR;
|
|
||||||
|
|
||||||
const char *pKeywords = (NppParameters::getInstance())->getWordList(langType, typeIndex);
|
|
||||||
if (pKeywords)
|
|
||||||
{
|
|
||||||
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' '));
|
|
||||||
_pEditView->execute(SCI_AUTOCSETIGNORECASE, 3);
|
|
||||||
_pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pKeywords));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char nppPath[MAX_PATH];
|
|
||||||
strcpy(nppPath, _nppPath);
|
|
||||||
PathRemoveFileSpec(nppPath);
|
|
||||||
string fullFileName = nppPath;
|
|
||||||
string fileName;
|
|
||||||
getApiFileName(langType, fileName);
|
|
||||||
fileName += ".api";
|
|
||||||
fullFileName += "\\plugins\\APIs\\";
|
|
||||||
fullFileName += fileName;
|
|
||||||
|
|
||||||
FILE* f = fopen( fullFileName.c_str(), "r" );
|
|
||||||
|
|
||||||
if (f)
|
|
||||||
{
|
|
||||||
fseek( f, 0, SEEK_END );
|
|
||||||
size_t sz = ftell( f );
|
|
||||||
fseek( f, 0, SEEK_SET );
|
|
||||||
char* pData = new char[sz+1];
|
|
||||||
size_t nbChar = fread(pData, 1, sz, f);
|
|
||||||
pData[nbChar] = '\0';
|
|
||||||
fclose( f );
|
|
||||||
|
|
||||||
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n'));
|
|
||||||
_pEditView->execute(SCI_AUTOCSETIGNORECASE, 3);
|
|
||||||
_pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pData));
|
|
||||||
delete[] pData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notepad_plus::showFunctionComp() {
|
void Notepad_plus::showFunctionComp() {
|
||||||
//string langName;
|
bool isFromPrimary = _pEditView == &_mainEditView;
|
||||||
//LangType langType = _pEditView->getCurrentDocType();
|
AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub;
|
||||||
//getApiFileName(langType, langName);
|
autoC->showFunctionComplete();
|
||||||
//_funcCalltip.initCalltip(_pEditView, langName.c_str());
|
|
||||||
_funcCalltip.updateCalltip(0, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Notepad_plus::changeMenuLang(string & pluginsTrans, string & windowTrans)
|
void Notepad_plus::changeMenuLang(string & pluginsTrans, string & windowTrans)
|
||||||
{
|
{
|
||||||
if (!_nativeLang) return;
|
if (!_nativeLang) return;
|
||||||
@ -8379,4 +8048,83 @@ void Notepad_plus::markSelectedText()
|
|||||||
_findReplaceDlg.markAll2(text2Find);
|
_findReplaceDlg.markAll2(text2Find);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//ONLY CALL IN CASE OF EMERGENCY: EXCEPTION
|
||||||
|
//This function is destructive
|
||||||
|
bool Notepad_plus::emergency() {
|
||||||
|
const char * outdir = "C:\\N++RECOV";
|
||||||
|
bool status = false;
|
||||||
|
do {
|
||||||
|
if (::CreateDirectory(outdir, NULL) == FALSE && ::GetLastError() != ERROR_ALREADY_EXISTS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScintillaEditView * viewToRecover = &_mainEditView;
|
||||||
|
status |= dumpFiles(viewToRecover, outdir, "Main");
|
||||||
|
viewToRecover = &_subEditView;
|
||||||
|
status |= dumpFiles(viewToRecover, outdir, "Sub");
|
||||||
|
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Notepad_plus::dumpFiles(ScintillaEditView * viewToRecover, const char * outdir, const char * fileprefix) {
|
||||||
|
//start dumping unsaved files to recovery directory
|
||||||
|
bool somethingsaved = false;
|
||||||
|
bool somedirty = false;
|
||||||
|
size_t nrdocs = viewToRecover->getNbDoc();
|
||||||
|
bool skipfirst = viewToRecover->getCurrentDocIndex() == 0; //if cur doc is first, dont do setdocpointer or itll be deleted
|
||||||
|
char savePath[MAX_PATH] = {0};
|
||||||
|
|
||||||
|
int bufferSize = 2048;
|
||||||
|
char dataBuffer[2048+1] = {0}; //not too bug of a buffer, we dont know how much we've got here
|
||||||
|
|
||||||
|
FILE * dumpFile;
|
||||||
|
TextRange textRange;
|
||||||
|
textRange.lpstrText = dataBuffer;
|
||||||
|
//rescue primary
|
||||||
|
for(size_t i = 0; i < nrdocs; i++) {
|
||||||
|
Buffer & docbuf = viewToRecover->getBufferAt(i);
|
||||||
|
if (!docbuf.isDirty()) //skip saved documents
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
somedirty = true;
|
||||||
|
if (i != 0 || !skipfirst)
|
||||||
|
viewToRecover->execute(SCI_SETDOCPOINTER, 0, docbuf._doc);
|
||||||
|
|
||||||
|
const char * unitext = "";
|
||||||
|
if (docbuf.getUnicodeMode() != uni8Bit)
|
||||||
|
unitext = "_uni";
|
||||||
|
|
||||||
|
sprintf(savePath, "%s\\%s%03d%s.dump", outdir, fileprefix, i, unitext);
|
||||||
|
dumpFile = fopen(savePath, "wb");
|
||||||
|
if (!dumpFile) { //cannot create file, this is bad
|
||||||
|
::MessageBox(NULL, savePath, "Cannot dump file", MB_OK | MB_ICONWARNING);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//now it gets tricky, we have to have some allocated memory, we can only hope we have some
|
||||||
|
int size = viewToRecover->execute(SCI_GETLENGTH);
|
||||||
|
int saved = 0;
|
||||||
|
while(0 < size) {
|
||||||
|
if (size < bufferSize) {
|
||||||
|
bufferSize = size; //last piece of data smaller than buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
textRange.chrg.cpMin = saved;
|
||||||
|
textRange.chrg.cpMax = saved + bufferSize;
|
||||||
|
viewToRecover->execute(SCI_GETTEXTRANGE, 0, (LPARAM)&textRange);
|
||||||
|
size_t res = fwrite(dataBuffer, bufferSize, 1, dumpFile);
|
||||||
|
if (!res) //FAILURE!
|
||||||
|
break;
|
||||||
|
saved += bufferSize;
|
||||||
|
size -= bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
somethingsaved |= size==0;
|
||||||
|
fclose(dumpFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
return somethingsaved || !somedirty;
|
||||||
|
}
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
#include "RunMacroDlg.h"
|
#include "RunMacroDlg.h"
|
||||||
#include "DockingManager.h"
|
#include "DockingManager.h"
|
||||||
#include "Process.h"
|
#include "Process.h"
|
||||||
#include "FunctionCallTip.h"
|
#include "AutoCompletion.h"
|
||||||
|
|
||||||
#define NOTEPAD_PP_CLASS_NAME "Notepad++"
|
#define NOTEPAD_PP_CLASS_NAME "Notepad++"
|
||||||
|
|
||||||
@ -78,9 +78,6 @@ struct iconLocator {
|
|||||||
|
|
||||||
class FileDialog;
|
class FileDialog;
|
||||||
|
|
||||||
//Class assumes Scintilla makes sure calltip never gets displayed twice
|
|
||||||
|
|
||||||
|
|
||||||
class Notepad_plus : public Window {
|
class Notepad_plus : public Window {
|
||||||
enum comment_mode {cm_comment, cm_uncomment, cm_toggle};
|
enum comment_mode {cm_comment, cm_uncomment, cm_toggle};
|
||||||
public:
|
public:
|
||||||
@ -171,13 +168,15 @@ public:
|
|||||||
bool loadSession(Session & session);
|
bool loadSession(Session & session);
|
||||||
winVer getWinVersion() const {return _winVersion;};
|
winVer getWinVersion() const {return _winVersion;};
|
||||||
|
|
||||||
|
bool emergency();
|
||||||
private:
|
private:
|
||||||
static const char _className[32];
|
static const char _className[32];
|
||||||
char _nppPath[MAX_PATH];
|
char _nppPath[MAX_PATH];
|
||||||
Window *_pMainWindow;
|
Window *_pMainWindow;
|
||||||
DockingManager _dockingManager;
|
DockingManager _dockingManager;
|
||||||
|
|
||||||
FunctionCallTip _funcCalltip;
|
AutoCompletion _autoCompleteMain;
|
||||||
|
AutoCompletion _autoCompleteSub; //each Scintilla has its own autoComplete
|
||||||
|
|
||||||
TiXmlNode *_nativeLang, *_toolIcons;
|
TiXmlNode *_nativeLang, *_toolIcons;
|
||||||
|
|
||||||
@ -413,10 +412,10 @@ private:
|
|||||||
|
|
||||||
void setLangStatus(LangType langType){
|
void setLangStatus(LangType langType){
|
||||||
_statusBar.setText(getLangDesc(langType).c_str(), STATUSBAR_DOC_TYPE);
|
_statusBar.setText(getLangDesc(langType).c_str(), STATUSBAR_DOC_TYPE);
|
||||||
|
if (_pEditView == &_mainEditView)
|
||||||
string langName;
|
_autoCompleteMain.setLanguage(langType);
|
||||||
getApiFileName(langType, langName);
|
else
|
||||||
_funcCalltip.initCalltip(_pEditView, langName.c_str());
|
_autoCompleteSub.setLanguage(langType);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setDisplayFormat(formatType f) {
|
void setDisplayFormat(formatType f) {
|
||||||
@ -603,7 +602,6 @@ private:
|
|||||||
|
|
||||||
void showAutoComp();
|
void showAutoComp();
|
||||||
void autoCompFromCurrentFile(bool autoInsert = true);
|
void autoCompFromCurrentFile(bool autoInsert = true);
|
||||||
void getApiFileName(LangType langType, std::string &fn);
|
|
||||||
void showFunctionComp();
|
void showFunctionComp();
|
||||||
|
|
||||||
void changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText);
|
void changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText);
|
||||||
@ -753,6 +751,8 @@ private:
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool dumpFiles(ScintillaEditView * viewToRecover, const char * outdir, const char * fileprefix = ""); //helper func
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //NOTEPAD_PLUS_H
|
#endif //NOTEPAD_PLUS_H
|
||||||
|
@ -2013,59 +2013,21 @@ TiXmlNode * NppParameters::getChildElementByAttribut(TiXmlNode *pere, const char
|
|||||||
// 2 restes : L_H, L_USER
|
// 2 restes : L_H, L_USER
|
||||||
LangType NppParameters::getLangIDFromStr(const char *langName)
|
LangType NppParameters::getLangIDFromStr(const char *langName)
|
||||||
{
|
{
|
||||||
if (!strcmp("c", langName)) return L_C;
|
int lang = (int)L_TXT;
|
||||||
if (!strcmp("cpp", langName)) return L_CPP;
|
for(; lang < L_EXTERNAL; lang++) {
|
||||||
if (!strcmp("java", langName)) return L_JAVA;
|
const char * name = ScintillaEditView::langNames[lang].lexerName;
|
||||||
if (!strcmp("cs", langName)) return L_CS;
|
if (!strcmp(name, langName)) { //found lang?
|
||||||
if (!strcmp("objc", langName)) return L_OBJC;
|
return (LangType)lang;
|
||||||
if (!strcmp("rc", langName)) return L_RC;
|
}
|
||||||
if (!strcmp("html", langName)) return L_HTML;
|
}
|
||||||
if (!strcmp("javascript", langName)) return L_JS;
|
|
||||||
if (!strcmp("php", langName)) return L_PHP;
|
|
||||||
if (!strcmp("vb", langName)) return L_VB;
|
|
||||||
if (!strcmp("sql", langName)) return L_SQL;
|
|
||||||
if (!strcmp("xml", langName)) return L_XML;
|
|
||||||
if (!strcmp("asp", langName)) return L_ASP;
|
|
||||||
if (!strcmp("perl", langName)) return L_PERL;
|
|
||||||
if (!strcmp("pascal", langName)) return L_PASCAL;
|
|
||||||
if (!strcmp("python", langName)) return L_PYTHON;
|
|
||||||
if (!strcmp("css", langName)) return L_CSS;
|
|
||||||
if (!strcmp("lua", langName)) return L_LUA;
|
|
||||||
if (!strcmp("batch", langName)) return L_BATCH;
|
|
||||||
if (!strcmp("ini", langName)) return L_INI;
|
|
||||||
if (!strcmp("nfo", langName)) return L_NFO;
|
|
||||||
if (!strcmp("makefile", langName)) return L_MAKEFILE;
|
|
||||||
if (!strcmp("tex", langName)) return L_TEX;
|
|
||||||
if (!strcmp("fortran", langName)) return L_FORTRAN;
|
|
||||||
if (!strcmp("bash", langName)) return L_BASH;
|
|
||||||
if (!strcmp("actionscript", langName)) return L_FLASH;
|
|
||||||
if (!strcmp("nsis", langName)) return L_NSIS;
|
|
||||||
if (!strcmp("tcl", langName)) return L_TCL;
|
|
||||||
|
|
||||||
if (!strcmp("lisp", langName)) return L_LISP;
|
//Cannot find language, check if its an external one
|
||||||
if (!strcmp("scheme", langName)) return L_SCHEME;
|
|
||||||
if (!strcmp("asm", langName)) return L_ASM;
|
|
||||||
if (!strcmp("diff", langName)) return L_DIFF;
|
|
||||||
if (!strcmp("props", langName)) return L_PROPS;
|
|
||||||
if (!strcmp("postscript", langName)) return L_PS;
|
|
||||||
if (!strcmp("ruby", langName)) return L_RUBY;
|
|
||||||
if (!strcmp("smalltalk", langName)) return L_SMALLTALK;
|
|
||||||
if (!strcmp("vhdl", langName)) return L_VHDL;
|
|
||||||
|
|
||||||
if (!strcmp("caml", langName)) return L_CAML;
|
LangType l = (LangType)lang;
|
||||||
if (!strcmp("verilog", langName)) return L_VERILOG;
|
if (l == L_EXTERNAL) { //try find external lexer
|
||||||
if (!strcmp("kix", langName)) return L_KIX;
|
int id = _pSelf->getExternalLangIndexFromName(langName);
|
||||||
if (!strcmp("autoit", langName)) return L_AU3;
|
if (id != -1) return (LangType)(id + L_EXTERNAL);
|
||||||
if (!strcmp("ada", langName)) return L_ADA;
|
}
|
||||||
if (!strcmp("matlab", langName)) return L_MATLAB;
|
|
||||||
if (!strcmp("haskell", langName)) return L_HASKELL;
|
|
||||||
if (!strcmp("inno", langName)) return L_INNO;
|
|
||||||
if (!strcmp("searchResult", langName)) return L_SEARCHRESULT;
|
|
||||||
if (!strcmp("cmake", langName)) return L_CMAKE;
|
|
||||||
if (!strcmp("yaml", langName)) return L_YAML;
|
|
||||||
|
|
||||||
int id = _pSelf->getExternalLangIndexFromName(langName);
|
|
||||||
if (id != -1) return (LangType)(id + L_EXTERNAL);
|
|
||||||
|
|
||||||
return L_TXT;
|
return L_TXT;
|
||||||
}
|
}
|
||||||
|
@ -357,8 +357,11 @@ public:
|
|||||||
void addStyler(int styleID, TiXmlNode *styleNode);
|
void addStyler(int styleID, TiXmlNode *styleNode);
|
||||||
|
|
||||||
void addStyler(int styleID, char *styleName) {
|
void addStyler(int styleID, char *styleName) {
|
||||||
|
ZeroMemory(&_styleArray[_nbStyler], sizeof(Style));;
|
||||||
_styleArray[_nbStyler]._styleID = styleID;
|
_styleArray[_nbStyler]._styleID = styleID;
|
||||||
_styleArray[_nbStyler]._styleDesc = styleName;
|
_styleArray[_nbStyler]._styleDesc = styleName;
|
||||||
|
_styleArray[_nbStyler]._fgColor = black;
|
||||||
|
_styleArray[_nbStyler]._bgColor = white;
|
||||||
_nbStyler++;
|
_nbStyler++;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
311
PowerEditor/src/ScitillaComponent/AutoCompletion.cpp
Normal file
311
PowerEditor/src/ScitillaComponent/AutoCompletion.cpp
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
//this file is part of Notepad++
|
||||||
|
//Copyright (C)2008 Harry Bruin <harrybharry@users.sourceforge.net>
|
||||||
|
//
|
||||||
|
//This program is free software; you can redistribute it and/or
|
||||||
|
//modify it under the terms of the GNU General Public License
|
||||||
|
//as published by the Free Software Foundation; either
|
||||||
|
//version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
//This program is distributed in the hope that it will be useful,
|
||||||
|
//but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
//GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
//You should have received a copy of the GNU General Public License
|
||||||
|
//along with this program; if not, write to the Free Software
|
||||||
|
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
#include "AutoCompletion.h"
|
||||||
|
#include "Notepad_plus_msgs.h"
|
||||||
|
|
||||||
|
static bool isInList(string word, const vector<string> & wordArray)
|
||||||
|
{
|
||||||
|
for (size_t i = 0 ; i < wordArray.size() ; i++)
|
||||||
|
if (wordArray[i] == word)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
AutoCompletion::AutoCompletion(ScintillaEditView * pEditView) : _active(false), _pEditView(pEditView), _funcCalltip(pEditView),
|
||||||
|
_curLang(L_TXT), _XmlFile(NULL), _activeCompletion(CompletionNone),
|
||||||
|
_pXmlKeyword(NULL), _ignoreCase(true), _keyWords("")
|
||||||
|
{
|
||||||
|
//Do not load any language yet
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AutoCompletion::showAutoComplete() {
|
||||||
|
if (!_active)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
|
||||||
|
int line = _pEditView->getCurrentLineNumber();
|
||||||
|
int startLinePos = int(_pEditView->execute(SCI_POSITIONFROMLINE, line ));
|
||||||
|
int startWordPos = startLinePos;
|
||||||
|
|
||||||
|
int len = curPos-startLinePos;
|
||||||
|
char * lineBuffer = new char[len+1];
|
||||||
|
_pEditView->getText(lineBuffer, startLinePos, curPos);
|
||||||
|
//_pEditView->execute(SCI_GETTEXT, (WPARAM)len, (LPARAM)lineBuffer);
|
||||||
|
|
||||||
|
int offset = len-1;
|
||||||
|
int nrChars = 0;
|
||||||
|
char c;
|
||||||
|
while (offset>=0)
|
||||||
|
{
|
||||||
|
c = lineBuffer[offset];
|
||||||
|
if (isalnum(c) || c == '_') {
|
||||||
|
nrChars++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
offset--;
|
||||||
|
|
||||||
|
}
|
||||||
|
startWordPos = curPos-nrChars;
|
||||||
|
|
||||||
|
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n'));
|
||||||
|
_pEditView->execute(SCI_AUTOCSETIGNORECASE, _ignoreCase);
|
||||||
|
_pEditView->execute(SCI_AUTOCSHOW, curPos-startWordPos, WPARAM(_keyWords.c_str()));
|
||||||
|
|
||||||
|
_activeCompletion = CompletionAuto;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AutoCompletion::showWordComplete(bool autoInsert) {
|
||||||
|
if (!_active)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
|
||||||
|
int startPos = int(_pEditView->execute(SCI_WORDSTARTPOSITION, curPos, true));
|
||||||
|
|
||||||
|
if (curPos == startPos)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const size_t bufSize = 256;
|
||||||
|
size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos);
|
||||||
|
if (len >= bufSize)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
char beginChars[bufSize];
|
||||||
|
|
||||||
|
_pEditView->getText(beginChars, startPos, curPos);
|
||||||
|
|
||||||
|
string expr("\\<");
|
||||||
|
expr += beginChars;
|
||||||
|
expr += "[^ \\t.,;:\"()=<>'+!\\[\\]]*";
|
||||||
|
|
||||||
|
int docLength = int(_pEditView->execute(SCI_GETLENGTH));
|
||||||
|
|
||||||
|
int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX;
|
||||||
|
|
||||||
|
_pEditView->execute(SCI_SETTARGETSTART, 0);
|
||||||
|
_pEditView->execute(SCI_SETTARGETEND, docLength);
|
||||||
|
_pEditView->execute(SCI_SETSEARCHFLAGS, flags);
|
||||||
|
|
||||||
|
vector<string> wordArray;
|
||||||
|
|
||||||
|
int posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str()));
|
||||||
|
|
||||||
|
while (posFind != -1)
|
||||||
|
{
|
||||||
|
int wordStart = int(_pEditView->execute(SCI_GETTARGETSTART));
|
||||||
|
int wordEnd = int(_pEditView->execute(SCI_GETTARGETEND));
|
||||||
|
|
||||||
|
size_t foundTextLen = wordEnd - wordStart;
|
||||||
|
|
||||||
|
if (foundTextLen < bufSize)
|
||||||
|
{
|
||||||
|
char w[bufSize];
|
||||||
|
_pEditView->getText(w, wordStart, wordEnd);
|
||||||
|
|
||||||
|
if (strcmp(w, beginChars))
|
||||||
|
if (!isInList(w, wordArray))
|
||||||
|
wordArray.push_back(w);
|
||||||
|
}
|
||||||
|
_pEditView->execute(SCI_SETTARGETSTART, wordEnd/*posFind + foundTextLen*/);
|
||||||
|
_pEditView->execute(SCI_SETTARGETEND, docLength);
|
||||||
|
posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str()));
|
||||||
|
}
|
||||||
|
if (wordArray.size() == 0) return false;
|
||||||
|
|
||||||
|
if (wordArray.size() == 1 && autoInsert)
|
||||||
|
{
|
||||||
|
_pEditView->execute(SCI_SETTARGETSTART, startPos);
|
||||||
|
_pEditView->execute(SCI_SETTARGETEND, curPos);
|
||||||
|
_pEditView->execute(SCI_REPLACETARGETRE, wordArray[0].length(), (LPARAM)wordArray[0].c_str());
|
||||||
|
|
||||||
|
_pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
string words("");
|
||||||
|
|
||||||
|
for (size_t i = 0 ; i < wordArray.size() ; i++)
|
||||||
|
{
|
||||||
|
words += wordArray[i];
|
||||||
|
if (i != wordArray.size()-1)
|
||||||
|
words += " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' '));
|
||||||
|
_pEditView->execute(SCI_AUTOCSETIGNORECASE, _ignoreCase);
|
||||||
|
_pEditView->execute(SCI_AUTOCSHOW, curPos - startPos, WPARAM(words.c_str()));
|
||||||
|
|
||||||
|
_activeCompletion = CompletionWord;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AutoCompletion::showFunctionComplete() {
|
||||||
|
if (!_active)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_funcCalltip.updateCalltip(0, true)) {
|
||||||
|
_activeCompletion = CompletionFunc;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoCompletion::update(int character) {
|
||||||
|
if (!_active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
|
||||||
|
|
||||||
|
if (nppGUI._funcParams || _funcCalltip.isVisible()) {
|
||||||
|
if (_funcCalltip.updateCalltip(character)) { //calltip visible because triggered by autocomplete, set mode
|
||||||
|
_activeCompletion = CompletionFunc;
|
||||||
|
return; //only return in case of success, else autocomplete
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!character)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//If autocomplete already active, let Scintilla handle it
|
||||||
|
if (_pEditView->execute(SCI_AUTOCACTIVE) != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char s[64];
|
||||||
|
_pEditView->getWordToCurrentPos(s, sizeof(s));
|
||||||
|
|
||||||
|
if (strlen(s) >= nppGUI._autocFromLen)
|
||||||
|
{
|
||||||
|
if (nppGUI._autocStatus == nppGUI.autoc_word)
|
||||||
|
showWordComplete(false);
|
||||||
|
else if (nppGUI._autocStatus == nppGUI.autoc_func)
|
||||||
|
showAutoComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoCompletion::callTipClick(int direction) {
|
||||||
|
if (!_active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (direction == 1) {
|
||||||
|
_funcCalltip.showPrevOverload();
|
||||||
|
} else if (direction == 2) {
|
||||||
|
_funcCalltip.showNextOverload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AutoCompletion::setLanguage(LangType language) {
|
||||||
|
if (_curLang == language)
|
||||||
|
return true;
|
||||||
|
_curLang = language;
|
||||||
|
|
||||||
|
char path[MAX_PATH];
|
||||||
|
::GetModuleFileName(NULL, path, MAX_PATH);
|
||||||
|
PathRemoveFileSpec(path);
|
||||||
|
strcat(path, "\\plugins\\APIs\\");
|
||||||
|
strcat(path, getApiFileName());
|
||||||
|
strcat(path, ".xml");
|
||||||
|
|
||||||
|
_XmlFile = TiXmlDocument(path);
|
||||||
|
_active = _XmlFile.LoadFile();
|
||||||
|
|
||||||
|
TiXmlNode * pAutoNode = NULL;
|
||||||
|
if (_active) {
|
||||||
|
_active = false; //safety
|
||||||
|
TiXmlNode * pNode = _XmlFile.FirstChild("NotepadPlus");
|
||||||
|
if (!pNode)
|
||||||
|
return false;
|
||||||
|
pAutoNode = pNode = pNode->FirstChildElement("AutoComplete");
|
||||||
|
if (!pNode)
|
||||||
|
return false;
|
||||||
|
pNode = pNode->FirstChildElement("KeyWord");
|
||||||
|
if (!pNode)
|
||||||
|
return false;
|
||||||
|
_pXmlKeyword = reinterpret_cast<TiXmlElement *>(pNode);
|
||||||
|
if (!_pXmlKeyword)
|
||||||
|
return false;
|
||||||
|
_active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_active) { //try setting up environment
|
||||||
|
//setup defaults
|
||||||
|
_ignoreCase = true;
|
||||||
|
_funcCalltip._start = '(';
|
||||||
|
_funcCalltip._stop = ')';
|
||||||
|
_funcCalltip._param = ',';
|
||||||
|
_funcCalltip._terminal = ';';
|
||||||
|
|
||||||
|
TiXmlElement * pElem = pAutoNode->FirstChildElement("Environment");
|
||||||
|
if (pElem) {
|
||||||
|
const char * val = 0;
|
||||||
|
val = pElem->Attribute("ignoreCase");
|
||||||
|
if (val && !strcmp(val, "no"))
|
||||||
|
_ignoreCase = false;
|
||||||
|
val = pElem->Attribute("startFunc");
|
||||||
|
if (val && val[0])
|
||||||
|
_funcCalltip._start = val[0];
|
||||||
|
val = pElem->Attribute("stopFunc");
|
||||||
|
if (val && val[0])
|
||||||
|
_funcCalltip._stop = val[0];
|
||||||
|
val = pElem->Attribute("paramSeparator");
|
||||||
|
if (val && val[0])
|
||||||
|
_funcCalltip._param = val[0];
|
||||||
|
val = pElem->Attribute("terminal");
|
||||||
|
if (val && val[0])
|
||||||
|
_funcCalltip._terminal = val[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_active) {
|
||||||
|
_funcCalltip.setLanguageXML(_pXmlKeyword);
|
||||||
|
} else {
|
||||||
|
_funcCalltip.setLanguageXML(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
_keyWords = "";
|
||||||
|
if (_active) { //Cache the keywords
|
||||||
|
//Iterate through all keywords
|
||||||
|
TiXmlElement *funcNode = _pXmlKeyword;
|
||||||
|
const char * name = NULL;
|
||||||
|
for (; funcNode; funcNode = funcNode->NextSiblingElement("KeyWord") ) {
|
||||||
|
name = funcNode->Attribute("name");
|
||||||
|
if (!name) //malformed node
|
||||||
|
continue;
|
||||||
|
_keyWords.append(name);
|
||||||
|
_keyWords.append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _active;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * AutoCompletion::getApiFileName() {
|
||||||
|
if (_curLang == L_USER)
|
||||||
|
{
|
||||||
|
Buffer & currentBuf = _pEditView->getCurrentBuffer();
|
||||||
|
if (currentBuf.isUserDefineLangExt())
|
||||||
|
{
|
||||||
|
return currentBuf.getUserDefineLangName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_curLang >= L_EXTERNAL && _curLang < NppParameters::getInstance()->L_END)
|
||||||
|
return NppParameters::getInstance()->getELCFromIndex(_curLang - L_EXTERNAL)._name;
|
||||||
|
|
||||||
|
return ScintillaEditView::langNames[_curLang].lexerName;
|
||||||
|
|
||||||
|
}
|
57
PowerEditor/src/ScitillaComponent/AutoCompletion.h
Normal file
57
PowerEditor/src/ScitillaComponent/AutoCompletion.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
//this file is part of Notepad++
|
||||||
|
//Copyright (C)2008 Harry Bruin <harrybharry@users.sourceforge.net>
|
||||||
|
//
|
||||||
|
//This program is free software; you can redistribute it and/or
|
||||||
|
//modify it under the terms of the GNU General Public License
|
||||||
|
//as published by the Free Software Foundation; either
|
||||||
|
//version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
//This program is distributed in the hope that it will be useful,
|
||||||
|
//but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
//GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
//You should have received a copy of the GNU General Public License
|
||||||
|
//along with this program; if not, write to the Free Software
|
||||||
|
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
#ifndef AUTOCOMPLETION_H
|
||||||
|
#define AUTOCOMPLETION_H
|
||||||
|
|
||||||
|
#include "ScintillaEditView.h"
|
||||||
|
#include "FunctionCallTip.h"
|
||||||
|
#include "tinyxml.h"
|
||||||
|
|
||||||
|
class AutoCompletion {
|
||||||
|
public:
|
||||||
|
enum ActiveCompletion {CompletionNone = 0, CompletionAuto, CompletionWord, CompletionFunc};
|
||||||
|
AutoCompletion(ScintillaEditView * pEditView);
|
||||||
|
bool setLanguage(LangType language);
|
||||||
|
|
||||||
|
//AutoComplete from the list
|
||||||
|
bool showAutoComplete();
|
||||||
|
//WordCompletion from the current file
|
||||||
|
bool showWordComplete(bool autoInsert); //autoInsert true if completion should fill in the word on a single match
|
||||||
|
//Parameter display from the list
|
||||||
|
bool showFunctionComplete();
|
||||||
|
|
||||||
|
void update(int character);
|
||||||
|
void callTipClick(int direction);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _active;
|
||||||
|
ScintillaEditView * _pEditView;
|
||||||
|
LangType _curLang;
|
||||||
|
TiXmlDocument _XmlFile;
|
||||||
|
TiXmlElement * _pXmlKeyword;
|
||||||
|
ActiveCompletion _activeCompletion;
|
||||||
|
|
||||||
|
bool _ignoreCase;
|
||||||
|
|
||||||
|
std::string _keyWords;
|
||||||
|
|
||||||
|
FunctionCallTip _funcCalltip;
|
||||||
|
const char * getApiFileName();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //AUTOCOMPLETION_H
|
@ -1,3 +1,7 @@
|
|||||||
|
//this file is part of Notepad++
|
||||||
|
//Copyright (C)2008 Harry Bruin <harrybharry@users.sourceforge.net>
|
||||||
|
//
|
||||||
|
//This program is free software; you can redistribute it and/or
|
||||||
//modify it under the terms of the GNU General Public License
|
//modify it under the terms of the GNU General Public License
|
||||||
//as published by the Free Software Foundation; either
|
//as published by the Free Software Foundation; either
|
||||||
//version 2 of the License, or (at your option) any later version.
|
//version 2 of the License, or (at your option) any later version.
|
||||||
@ -39,59 +43,28 @@ bool stringEqualN(const char * first, const char * second, int n) {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void FunctionCallTip::setLanguageXML(TiXmlElement * pXmlKeyword) {
|
||||||
void FunctionCallTip::initCalltip(ScintillaEditView * editView, const char * language) {
|
if (isVisible())
|
||||||
_pEditView = editView;
|
close();
|
||||||
if (_langName)
|
_pXmlKeyword = pXmlKeyword;
|
||||||
delete [] _langName;
|
|
||||||
_langName = new char[strlen(language)+1];
|
|
||||||
strcpy(_langName, language);
|
|
||||||
_initialized = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FunctionCallTip::updateCalltip(int ch, bool needShown) {
|
bool FunctionCallTip::updateCalltip(int ch, bool needShown) {
|
||||||
if (!_initialized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!needShown && ch != _start && !isVisible()) //must be already visible
|
if (!needShown && ch != _start && !isVisible()) //must be already visible
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
_curPos = _pEditView->execute(SCI_GETCURRENTPOS);
|
_curPos = _pEditView->execute(SCI_GETCURRENTPOS);
|
||||||
|
|
||||||
//recalculate everything
|
//recalculate everything
|
||||||
if (!getCursorFunction()) { //cannot display calltip (anymore)
|
if (!getCursorFunction()) { //cannot display calltip (anymore)
|
||||||
close();
|
close();
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
showCalltip();
|
showCalltip();
|
||||||
return;
|
return true;
|
||||||
|
|
||||||
/*
|
|
||||||
switch (ch) {
|
|
||||||
case '(':
|
|
||||||
case 0: { //recalculate everything
|
|
||||||
if (!getCursorFunction()) { //cannot display calltip (anymore)
|
|
||||||
close();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
showCalltip();
|
|
||||||
return; }
|
|
||||||
case ')': { //close calltip
|
|
||||||
close();
|
|
||||||
return; }
|
|
||||||
case ',': { //show next param
|
|
||||||
_currentParam++;
|
|
||||||
showCalltip();
|
|
||||||
return; }
|
|
||||||
default: { //any other character: nothing to do
|
|
||||||
break; }
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FunctionCallTip::showNextOverload() {
|
void FunctionCallTip::showNextOverload() {
|
||||||
if (!_initialized)
|
|
||||||
return;
|
|
||||||
if (!isVisible())
|
if (!isVisible())
|
||||||
return;
|
return;
|
||||||
_currentOverload = (_currentOverload+1) % _currentNrOverloads;
|
_currentOverload = (_currentOverload+1) % _currentNrOverloads;
|
||||||
@ -99,8 +72,6 @@ void FunctionCallTip::showNextOverload() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FunctionCallTip::showPrevOverload() {
|
void FunctionCallTip::showPrevOverload() {
|
||||||
if (!_initialized)
|
|
||||||
return;
|
|
||||||
if (!isVisible())
|
if (!isVisible())
|
||||||
return;
|
return;
|
||||||
_currentOverload = _currentOverload > 0?(_currentOverload-1) : _currentNrOverloads-1;
|
_currentOverload = _currentOverload > 0?(_currentOverload-1) : _currentNrOverloads-1;
|
||||||
@ -108,8 +79,6 @@ void FunctionCallTip::showPrevOverload() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FunctionCallTip::close() {
|
void FunctionCallTip::close() {
|
||||||
if (!_initialized)
|
|
||||||
return;
|
|
||||||
if (!isVisible()) {
|
if (!isVisible()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -126,10 +95,6 @@ bool FunctionCallTip::getCursorFunction() {
|
|||||||
int offset = _curPos - startpos; //offset is cursor location, only stuff before cursor has influence
|
int offset = _curPos - startpos; //offset is cursor location, only stuff before cursor has influence
|
||||||
if (offset < 2) {
|
if (offset < 2) {
|
||||||
reset();
|
reset();
|
||||||
if (_funcName) {
|
|
||||||
delete [] _funcName;
|
|
||||||
_funcName = 0;
|
|
||||||
}
|
|
||||||
return false; //cannot be a func, need name and separator
|
return false; //cannot be a func, need name and separator
|
||||||
}
|
}
|
||||||
char * lineData = new char[len];
|
char * lineData = new char[len];
|
||||||
@ -222,11 +187,7 @@ bool FunctionCallTip::getCursorFunction() {
|
|||||||
_currentParam = curValue.param;
|
_currentParam = curValue.param;
|
||||||
|
|
||||||
if (!_funcName || !stringEqualN(_funcName, funcToken.token, strlen(_funcName))) { //check if we need to reload data
|
if (!_funcName || !stringEqualN(_funcName, funcToken.token, strlen(_funcName))) { //check if we need to reload data
|
||||||
if (_funcName)
|
res = loadFunction(funcToken.token);
|
||||||
delete [] _funcName;
|
|
||||||
_funcName = new char[strlen(funcToken.token) + 1]; //add the return type aswell
|
|
||||||
strcpy(_funcName, funcToken.token);
|
|
||||||
res = loadData();
|
|
||||||
} else {
|
} else {
|
||||||
res = true;
|
res = true;
|
||||||
}
|
}
|
||||||
@ -243,91 +204,75 @@ bool FunctionCallTip::getCursorFunction() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
CTF (CalltipFormat) file structure (ignore spaces).
|
Find function in XML structure and parse it
|
||||||
There MUST be a return type, however, may be empty string (or empty line even)
|
|
||||||
_no_ CR. ESC = 027 = 0x1B
|
|
||||||
(
|
|
||||||
NULL FunctionName LF
|
|
||||||
return value (ESC possibleparam)* LF
|
|
||||||
)*
|
|
||||||
NULL
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool FunctionCallTip::loadData() {
|
bool FunctionCallTip::loadFunction(const char * nameToFind) {
|
||||||
char filePath[MAX_PATH];
|
|
||||||
::GetModuleFileName(NULL, filePath, MAX_PATH);
|
|
||||||
PathRemoveFileSpec(filePath);
|
|
||||||
strcat(filePath, "\\plugins\\APIs\\");
|
|
||||||
strcat(filePath, _langName);
|
|
||||||
strcat(filePath, ".ctf");
|
|
||||||
|
|
||||||
FILE * ctfFile = fopen(filePath, "rb"); //CalltipFormat File
|
|
||||||
if (!ctfFile)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
//Copy all data, close with \n to be sure
|
|
||||||
fseek(ctfFile, 0, SEEK_END );
|
|
||||||
size_t fileSize = ftell(ctfFile);
|
|
||||||
fseek(ctfFile, 0, SEEK_SET );
|
|
||||||
char * fileData = new char[fileSize+1];
|
|
||||||
size_t nbChar = fread(fileData, 1, fileSize, ctfFile);
|
|
||||||
fileData[nbChar] = 0;
|
|
||||||
fclose(ctfFile);
|
|
||||||
|
|
||||||
//The functions should be ordered, but linear search because we cant access like array
|
//The functions should be ordered, but linear search because we cant access like array
|
||||||
size_t i = 0, location = 0;
|
_curFunction = NULL;
|
||||||
bool found = false;
|
//Iterate through all keywords and find the correct function keyword
|
||||||
int funcLen = strlen(_funcName);
|
TiXmlElement *funcNode = _pXmlKeyword;
|
||||||
fileSize -= funcLen; //if not enough is left, no need to keep searching
|
const char * name = NULL;
|
||||||
while(i < fileSize) {
|
for (; funcNode; funcNode = funcNode->NextSiblingElement("KeyWord") ) {
|
||||||
if (fileData[i] == 0) { //reached new function
|
name = funcNode->Attribute("name");
|
||||||
//case sensitive search
|
if (!name) //malformed node
|
||||||
if (stringEqualN(_funcName, fileData+i+1, funcLen)) { //found it
|
continue;
|
||||||
found = true;
|
int compVal = strcmp(name, nameToFind);
|
||||||
location = i + 2 + funcLen; //skip zero + LF + name of func (all known at this point)
|
if (!compVal) { //found it?
|
||||||
break;
|
const char * val = funcNode->Attribute("func");
|
||||||
}
|
if (val)
|
||||||
}
|
{
|
||||||
i++;
|
if (!strcmp(val, "yes")) {
|
||||||
}
|
//what we've been looking for
|
||||||
if (!found) {
|
_curFunction = funcNode;
|
||||||
delete [] fileData;
|
break;
|
||||||
return false;
|
} else {
|
||||||
}
|
//name matches, but not a function, abort the entire procedure
|
||||||
|
return false;
|
||||||
int argStart = location;
|
|
||||||
std::vector< pair<int, int> > overloadLocations; //start, length
|
|
||||||
while(fileData[location] != 0) { //keep reading each line of overloads untill next function is found
|
|
||||||
argStart = location;
|
|
||||||
while(fileData[location] != '\n') {
|
|
||||||
location++;
|
|
||||||
}
|
|
||||||
overloadLocations.push_back(pair<int, int>(argStart, location-argStart));
|
|
||||||
location++; //skip newline
|
|
||||||
}
|
|
||||||
|
|
||||||
_currentNrOverloads = overloadLocations.size();
|
|
||||||
_currentOverloads = new char*[_currentNrOverloads];
|
|
||||||
_params = new vector<int>[_currentNrOverloads];
|
|
||||||
|
|
||||||
int j = 0;
|
|
||||||
for(int i = 0; i < _currentNrOverloads; i++) {
|
|
||||||
pair<int, int> & cur = overloadLocations.at(i);
|
|
||||||
_currentOverloads[i] = new char[cur.second+1];
|
|
||||||
memcpy(_currentOverloads[i], fileData+cur.first, cur.second);
|
|
||||||
_currentOverloads[i][cur.second] = 0;
|
|
||||||
j = 0;
|
|
||||||
while(_currentOverloads[i][j] != 0) {
|
|
||||||
if (_currentOverloads[i][j] == 0x1B) {
|
|
||||||
_currentOverloads[i][j] = 0;
|
|
||||||
_params[i].push_back(j+1);
|
|
||||||
}
|
}
|
||||||
j++;
|
|
||||||
}
|
}
|
||||||
|
} else if (compVal > 0) { //too far, abort
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Nothing found
|
||||||
|
if (!_curFunction)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_funcName = name;
|
||||||
|
if (!_funcName) //this should not happen
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_retVals.clear();
|
||||||
|
_overloads.clear();
|
||||||
|
stringVec paramVec;
|
||||||
|
|
||||||
|
TiXmlElement *overloadNode = _curFunction->FirstChildElement("Overload");
|
||||||
|
TiXmlElement *paramNode = NULL;
|
||||||
|
for (; overloadNode ; overloadNode = overloadNode->NextSiblingElement("Overload") ) {
|
||||||
|
const char * retVal = overloadNode->Attribute("retVal");
|
||||||
|
if (!retVal)
|
||||||
|
continue; //malformed node
|
||||||
|
_retVals.push_back(retVal);
|
||||||
|
paramNode = overloadNode->FirstChildElement("Param");
|
||||||
|
for (; paramNode ; paramNode = paramNode->NextSiblingElement("Param") ) {
|
||||||
|
const char * param = paramNode->Attribute("name");
|
||||||
|
if (!param)
|
||||||
|
continue; //malformed node
|
||||||
|
paramVec.push_back(param);
|
||||||
|
}
|
||||||
|
_overloads.push_back(paramVec);
|
||||||
|
paramVec.clear();
|
||||||
|
|
||||||
|
_currentNrOverloads++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_currentNrOverloads = (int)_overloads.size();
|
||||||
|
|
||||||
|
if (_currentNrOverloads == 0) //malformed node
|
||||||
|
return false;
|
||||||
|
|
||||||
delete [] fileData;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -336,26 +281,40 @@ void FunctionCallTip::showCalltip() {
|
|||||||
//ASSERT
|
//ASSERT
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char * curOverloadText = _currentOverloads[_currentOverload];
|
|
||||||
int bytesNeeded = strlen(curOverloadText) + strlen(_funcName) + 5;//'retval funcName (params)\0'
|
//Check if the current overload still holds. If the current param exceeds amounti n overload, see if another one fits better (enough params)
|
||||||
size_t nrParams = _params[_currentOverload].size();
|
stringVec & params = _overloads.at(_currentOverload);
|
||||||
if (nrParams) {
|
size_t psize = params.size()+1, osize;
|
||||||
for(size_t i = 0; i < nrParams; i++) {
|
if ((size_t)_currentParam >= psize) {
|
||||||
bytesNeeded += strlen(curOverloadText+_params[_currentOverload][i]) + 2; //'param, '
|
osize = _overloads.size();
|
||||||
|
for(size_t i = 0; i < osize; i++) {
|
||||||
|
psize = _overloads.at(i).size()+1;
|
||||||
|
if ((size_t)_currentParam < psize) {
|
||||||
|
_currentOverload = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const char * curRetValText = _retVals.at(_currentOverload);
|
||||||
|
|
||||||
|
int bytesNeeded = strlen(curRetValText) + strlen(_funcName) + 5;//'retval funcName (params)\0'
|
||||||
|
size_t nrParams = params.size();
|
||||||
|
for(size_t i = 0; i < nrParams; i++) {
|
||||||
|
bytesNeeded += strlen(params.at(i)) + 2; //'param, '
|
||||||
|
}
|
||||||
|
|
||||||
if (_currentNrOverloads > 1) {
|
if (_currentNrOverloads > 1) {
|
||||||
bytesNeeded += 24; // /\00001 of 00003\/
|
bytesNeeded += 24; // /\00001 of 00003\/
|
||||||
}
|
}
|
||||||
char * textBuffer = new char[bytesNeeded];
|
char * textBuffer = new char[bytesNeeded];
|
||||||
|
//char langDepChar[4] = " "; //Language dependant characters, like '(', ')', ',' and ';'
|
||||||
textBuffer[0] = 0;
|
textBuffer[0] = 0;
|
||||||
|
|
||||||
if (_currentNrOverloads > 1) {
|
if (_currentNrOverloads > 1) {
|
||||||
sprintf(textBuffer, "\001%u of %u\002", _currentOverload+1, _currentNrOverloads);
|
sprintf(textBuffer, "\001%u of %u\002", _currentOverload+1, _currentNrOverloads);
|
||||||
}
|
}
|
||||||
|
|
||||||
strcat(textBuffer, curOverloadText);
|
strcat(textBuffer, curRetValText);
|
||||||
strcat(textBuffer, " ");
|
strcat(textBuffer, " ");
|
||||||
strcat(textBuffer, _funcName);
|
strcat(textBuffer, _funcName);
|
||||||
strcat(textBuffer, " (");
|
strcat(textBuffer, " (");
|
||||||
@ -365,9 +324,9 @@ void FunctionCallTip::showCalltip() {
|
|||||||
for(size_t i = 0; i < nrParams; i++) {
|
for(size_t i = 0; i < nrParams; i++) {
|
||||||
if (i == _currentParam) {
|
if (i == _currentParam) {
|
||||||
highlightstart = strlen(textBuffer);
|
highlightstart = strlen(textBuffer);
|
||||||
highlightend = highlightstart + strlen(curOverloadText+_params[_currentOverload][i]);
|
highlightend = highlightstart + strlen(params.at(i));
|
||||||
}
|
}
|
||||||
strcat(textBuffer, curOverloadText+_params[_currentOverload][i]);
|
strcat(textBuffer, params.at(i));
|
||||||
if (i < nrParams-1)
|
if (i < nrParams-1)
|
||||||
strcat(textBuffer, ", ");
|
strcat(textBuffer, ", ");
|
||||||
}
|
}
|
||||||
@ -389,36 +348,16 @@ void FunctionCallTip::showCalltip() {
|
|||||||
|
|
||||||
void FunctionCallTip::reset() {
|
void FunctionCallTip::reset() {
|
||||||
_currentOverload = 0;
|
_currentOverload = 0;
|
||||||
//_currentNrOverloads = 0;
|
|
||||||
_currentParam = 0;
|
_currentParam = 0;
|
||||||
_curPos = 0;
|
_curPos = 0;
|
||||||
_startPos = 0;
|
_startPos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FunctionCallTip::cleanup() {
|
void FunctionCallTip::cleanup() {
|
||||||
if (_currentOverloads) {
|
|
||||||
for(int i = 0; i < _currentNrOverloads; i++)
|
|
||||||
delete [] _currentOverloads[i];
|
|
||||||
_currentNrOverloads = 0;
|
|
||||||
delete [] _currentOverloads;
|
|
||||||
_currentOverloads = 0;
|
|
||||||
}
|
|
||||||
if(_funcName) {
|
|
||||||
delete [] _funcName;
|
|
||||||
_funcName = 0;
|
|
||||||
}
|
|
||||||
if (_params) {
|
|
||||||
delete [] _params;
|
|
||||||
_params = 0;
|
|
||||||
}
|
|
||||||
if (_langName) {
|
|
||||||
delete [] _langName;
|
|
||||||
_langName = 0;
|
|
||||||
}
|
|
||||||
reset();
|
reset();
|
||||||
|
_overloads.clear();
|
||||||
|
_currentNrOverloads = 0;
|
||||||
|
_retVals.clear();
|
||||||
|
_funcName = 0;
|
||||||
_pEditView = NULL;
|
_pEditView = NULL;
|
||||||
_currentOverload = 0;
|
|
||||||
_currentParam = 0;
|
|
||||||
_initialized = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//this file is part of notepad++
|
//this file is part of Notepad++
|
||||||
//Copyright (C)2008 Harry Bruin <harrybharry@users.sourceforge.net>
|
//Copyright (C)2008 Harry Bruin <harrybharry@users.sourceforge.net>
|
||||||
//
|
//
|
||||||
//This program is free software; you can redistribute it and/or
|
//This program is free software; you can redistribute it and/or
|
||||||
@ -20,30 +20,36 @@
|
|||||||
|
|
||||||
#include "ScintillaEditView.h"
|
#include "ScintillaEditView.h"
|
||||||
|
|
||||||
|
typedef std::vector<const char *> stringVec;
|
||||||
|
|
||||||
class FunctionCallTip {
|
class FunctionCallTip {
|
||||||
|
friend class AutoCompletion;
|
||||||
public:
|
public:
|
||||||
FunctionCallTip() : _pEditView(NULL), _langName(NULL), _currentOverloads(NULL), _funcName(NULL), _params(NULL), _initialized(false),
|
FunctionCallTip(ScintillaEditView * pEditView) : _pEditView(pEditView), _pXmlKeyword(NULL), _curPos(0), _startPos(0),
|
||||||
_start('('), _stop(')'), _param(','), _terminal(';') {};
|
_curFunction(NULL), _currentNrOverloads(0), _currentOverload(0),
|
||||||
|
_currentParam(0), _funcName(NULL),
|
||||||
|
_start('('), _stop(')'), _param(','), _terminal(';')
|
||||||
|
{};
|
||||||
~FunctionCallTip() {/* cleanup(); */};
|
~FunctionCallTip() {/* cleanup(); */};
|
||||||
void initCalltip(ScintillaEditView * editView, const char * language); //show the calltip
|
void setLanguageXML(TiXmlElement * pXmlKeyword); //set calltip keyword node
|
||||||
void updateCalltip(int ch, bool needShown = false); //Ch is character typed, or 0 if another event occured. NeedShown is true if calltip should be attempted to displayed
|
bool updateCalltip(int ch, bool needShown = false); //Ch is character typed, or 0 if another event occured. NeedShown is true if calltip should be attempted to displayed. Return true if calltip was made visible
|
||||||
void showNextOverload();
|
void showNextOverload(); //show next overlaoded parameters
|
||||||
void showPrevOverload();
|
void showPrevOverload(); //show prev overlaoded parameters
|
||||||
bool isVisible() { return _pEditView?_pEditView->execute(SCI_CALLTIPACTIVE) == TRUE:false; };
|
bool isVisible() { return _pEditView?_pEditView->execute(SCI_CALLTIPACTIVE) == TRUE:false; }; //true if calltip visible
|
||||||
void close(); //Close calltip if visible
|
void close(); //Close calltip if visible
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char * _langName; //current language
|
|
||||||
ScintillaEditView * _pEditView; //Scintilla to display calltip in
|
ScintillaEditView * _pEditView; //Scintilla to display calltip in
|
||||||
bool _initialized;
|
TiXmlElement * _pXmlKeyword; //current keyword node (first one)
|
||||||
|
|
||||||
int _curPos; //cursor position
|
int _curPos; //cursor position
|
||||||
int _startPos; //display start position
|
int _startPos; //display start position
|
||||||
|
|
||||||
char * _funcName; //current name of function
|
TiXmlElement * _curFunction; //current function element
|
||||||
char ** _currentOverloads; //pointer to list of strings each containing possible overload
|
//cache some XML values n stuff
|
||||||
vector<int> * _params; //array of vectors with offsets found for params
|
const char * _funcName; //name of function
|
||||||
|
stringVec _retVals; //vector of overload return values/types
|
||||||
|
vector<stringVec> _overloads; //vector of overload params (=vector)
|
||||||
int _currentNrOverloads; //current amount of overloads
|
int _currentNrOverloads; //current amount of overloads
|
||||||
int _currentOverload; //current chosen overload
|
int _currentOverload; //current chosen overload
|
||||||
int _currentParam; //current highlighted param
|
int _currentParam; //current highlighted param
|
||||||
@ -54,9 +60,10 @@ private:
|
|||||||
char _terminal;
|
char _terminal;
|
||||||
|
|
||||||
bool getCursorFunction(); //retrieve data about function at cursor. Returns true if a function was found. Calls loaddata if needed
|
bool getCursorFunction(); //retrieve data about function at cursor. Returns true if a function was found. Calls loaddata if needed
|
||||||
bool loadData(); //returns true if the function can be found
|
bool loadFunction(const char * nameToFind); //returns true if the function can be found
|
||||||
void showCalltip(); //display calltip based on current variables
|
void showCalltip(); //display calltip based on current variables
|
||||||
void reset(); //reset all vars in case function is invalidated
|
void reset(); //reset all vars in case function is invalidated
|
||||||
void cleanup(); //delete any leftovers
|
void cleanup(); //delete any leftovers
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif// FUNCTIONCALLTIP_H
|
#endif// FUNCTIONCALLTIP_H
|
||||||
|
@ -54,6 +54,61 @@ const int ScintillaEditView::_markersArray[][NB_FOLDER_STATE] = {
|
|||||||
{SC_MARK_BOXMINUS, SC_MARK_BOXPLUS, SC_MARK_VLINE, SC_MARK_LCORNER, SC_MARK_BOXPLUSCONNECTED, SC_MARK_BOXMINUSCONNECTED, SC_MARK_TCORNER}
|
{SC_MARK_BOXMINUS, SC_MARK_BOXPLUS, SC_MARK_VLINE, SC_MARK_LCORNER, SC_MARK_BOXPLUSCONNECTED, SC_MARK_BOXMINUSCONNECTED, SC_MARK_TCORNER}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Array with all the names of all languages
|
||||||
|
LanguageName ScintillaEditView::langNames[L_EXTERNAL+1] = {
|
||||||
|
{"normal", "Normal text", "Normal text file", L_TXT},
|
||||||
|
{"php", "PHP", "PHP Hypertext Preprocessor file", L_PHP},
|
||||||
|
{"c", "C", "C source file", L_C},
|
||||||
|
{"cpp", "C++", "C++ source file", L_CPP},
|
||||||
|
{"cs", "C#", "C# source file", L_CS},
|
||||||
|
{"objc", "Objective-C", "Objective-C source file", L_OBJC},
|
||||||
|
{"java", "Java", "Java source file", L_JAVA},
|
||||||
|
{"rc", "RC", "Windows Resource file", L_RC},
|
||||||
|
{"html", "HTML", "Hyper Text Markup Language file", L_HTML},
|
||||||
|
{"xml", "XML", "eXtensible Markup Language file", L_XML},
|
||||||
|
{"makefile", "Makefile", "Makefile", L_MAKEFILE},
|
||||||
|
{"pascal", "Pascal", "Pascal source file", L_PASCAL},
|
||||||
|
{"batch", "Batch", "Batch file", L_BATCH},
|
||||||
|
{"ini", "ini", "MS ini file", L_INI},
|
||||||
|
{"nfo", "NFO", "MSDOS Style/ASCII Art", L_NFO},
|
||||||
|
{"udf", "udf", "User Define File", L_USER},
|
||||||
|
{"asp", "ASP", "Active Server Pages script file", L_ASP},
|
||||||
|
{"sql", "SQL", "Structured Query Language file", L_SQL},
|
||||||
|
{"vb", "VB", "Visual Basic file", L_VB},
|
||||||
|
{"javascript", "JavaScript", "JavaScript file", L_JS},
|
||||||
|
{"css", "CSS", "Cascade Style Sheets File", L_CSS},
|
||||||
|
{"perl", "Perl", "Perl source file", L_PERL},
|
||||||
|
{"python", "Python", "Python file", L_PYTHON},
|
||||||
|
{"lua", "Lua", "Lua source File", L_LUA},
|
||||||
|
{"tex", "TeX", "TeX file", L_TEX},
|
||||||
|
{"fortran", "Fortran", "Fortran source file", L_FORTRAN},
|
||||||
|
{"bash", "Shell", "Unix script file", L_BASH},
|
||||||
|
{"actionscript","Flash Action", "Flash Action script file", L_FLASH}, //WARNING, was "flash"
|
||||||
|
{"nsis", "NSIS", "Nullsoft Scriptable Install System script file", L_NSIS},
|
||||||
|
{"tcl", "TCL", "Tool Command Language file", L_TCL},
|
||||||
|
{"lisp", "Lisp", "List Processing language file", L_LISP},
|
||||||
|
{"scheme", "Scheme", "Scheme file", L_SCHEME},
|
||||||
|
{"asm", "Assembly", "Assembly language source file", L_ASM},
|
||||||
|
{"diff", "Diff", "Diff file", L_DIFF},
|
||||||
|
{"props", "Properties file", "Properties file", L_PROPS},
|
||||||
|
{"postscript", "Postscript", "Postscript file", L_PS},
|
||||||
|
{"ruby", "Ruby", "Ruby file", L_RUBY},
|
||||||
|
{"smalltalk", "Smalltalk", "Smalltalk file", L_SMALLTALK},
|
||||||
|
{"vhdl", "VHDL", "VHSIC Hardware Description Language file", L_VHDL},
|
||||||
|
{"kix", "KiXtart", "KiXtart file", L_KIX},
|
||||||
|
{"autoit", "AutoIt", "AutoIt", L_AU3},
|
||||||
|
{"caml", "CAML", "Categorical Abstract Machine Language", L_CAML},
|
||||||
|
{"ada", "Ada", "Ada file", L_ADA},
|
||||||
|
{"verilog", "Verilog", "Verilog file", L_VERILOG},
|
||||||
|
{"matlab", "MATLAB", "MATrix LABoratory", L_MATLAB},
|
||||||
|
{"haskell", "Haskell", "Haskell", L_HASKELL},
|
||||||
|
{"inno", "Inno", "Inno Setup script", L_INNO},
|
||||||
|
{"searchResult","Internal Search", "Internal Search", L_SEARCHRESULT},
|
||||||
|
{"cmake", "CMAKEFILE", "CMAKEFILE", L_CMAKE},
|
||||||
|
{"yaml", "YAML", "YAML Ain't Markup Language", L_YAML},
|
||||||
|
{"ext", "External", "External", L_EXTERNAL}
|
||||||
|
};
|
||||||
|
|
||||||
//const int MASK_RED = 0xFF0000;
|
//const int MASK_RED = 0xFF0000;
|
||||||
//const int MASK_GREEN = 0x00FF00;
|
//const int MASK_GREEN = 0x00FF00;
|
||||||
//const int MASK_BLUE = 0x0000FF;
|
//const int MASK_BLUE = 0x0000FF;
|
||||||
@ -297,7 +352,7 @@ void ScintillaEditView::setXmlLexer(LangType type)
|
|||||||
for (int i = 0 ; i < 4 ; i++)
|
for (int i = 0 ; i < 4 ; i++)
|
||||||
execute(SCI_SETKEYWORDS, i, reinterpret_cast<LPARAM>(""));
|
execute(SCI_SETKEYWORDS, i, reinterpret_cast<LPARAM>(""));
|
||||||
|
|
||||||
makeStyle("xml");
|
makeStyle(type);
|
||||||
}
|
}
|
||||||
else if ((type == L_HTML) || (type == L_PHP) || (type == L_ASP))
|
else if ((type == L_HTML) || (type == L_PHP) || (type == L_ASP))
|
||||||
{
|
{
|
||||||
@ -307,7 +362,7 @@ void ScintillaEditView::setXmlLexer(LangType type)
|
|||||||
const char *htmlKeyWords =_pParameter->getWordList(L_HTML, LANG_INDEX_INSTR);
|
const char *htmlKeyWords =_pParameter->getWordList(L_HTML, LANG_INDEX_INSTR);
|
||||||
execute(SCI_SETKEYWORDS, 0, reinterpret_cast<LPARAM>(htmlKeyWords?htmlKeyWords:""));
|
execute(SCI_SETKEYWORDS, 0, reinterpret_cast<LPARAM>(htmlKeyWords?htmlKeyWords:""));
|
||||||
|
|
||||||
makeStyle("html");
|
makeStyle(type);
|
||||||
|
|
||||||
setEmbeddedJSLexer();
|
setEmbeddedJSLexer();
|
||||||
setPhpEmbeddedLexer();
|
setPhpEmbeddedLexer();
|
||||||
@ -318,7 +373,7 @@ void ScintillaEditView::setXmlLexer(LangType type)
|
|||||||
void ScintillaEditView::setEmbeddedJSLexer()
|
void ScintillaEditView::setEmbeddedJSLexer()
|
||||||
{
|
{
|
||||||
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||||
makeStyle("javascript", pKwArray);
|
makeStyle(L_JS, pKwArray);
|
||||||
|
|
||||||
std::string keywordList("");
|
std::string keywordList("");
|
||||||
if (pKwArray[LANG_INDEX_INSTR])
|
if (pKwArray[LANG_INDEX_INSTR])
|
||||||
@ -334,7 +389,7 @@ void ScintillaEditView::setEmbeddedJSLexer()
|
|||||||
void ScintillaEditView::setPhpEmbeddedLexer()
|
void ScintillaEditView::setPhpEmbeddedLexer()
|
||||||
{
|
{
|
||||||
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||||
makeStyle("php", pKwArray);
|
makeStyle(L_PHP, pKwArray);
|
||||||
|
|
||||||
std::string keywordList("");
|
std::string keywordList("");
|
||||||
if (pKwArray[LANG_INDEX_INSTR])
|
if (pKwArray[LANG_INDEX_INSTR])
|
||||||
@ -349,7 +404,7 @@ void ScintillaEditView::setPhpEmbeddedLexer()
|
|||||||
void ScintillaEditView::setEmbeddedAspLexer()
|
void ScintillaEditView::setEmbeddedAspLexer()
|
||||||
{
|
{
|
||||||
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||||
makeStyle("asp", pKwArray);
|
makeStyle(L_ASP, pKwArray);
|
||||||
|
|
||||||
std::string keywordList("");
|
std::string keywordList("");
|
||||||
if (pKwArray[LANG_INDEX_INSTR])
|
if (pKwArray[LANG_INDEX_INSTR])
|
||||||
@ -360,36 +415,11 @@ void ScintillaEditView::setEmbeddedAspLexer()
|
|||||||
execute(SCI_STYLESETEOLFILLED, SCE_HBA_DEFAULT, true);
|
execute(SCI_STYLESETEOLFILLED, SCE_HBA_DEFAULT, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditView::setUserLexer()
|
|
||||||
{
|
|
||||||
execute(SCI_SETLEXER, SCLEX_USER);
|
|
||||||
UserLangContainer & userLangContainer = *(_userDefineDlg._pCurrentUserLang);
|
|
||||||
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.ignoreCase", (LPARAM)(userLangContainer._isCaseIgnored?"1":"0"));
|
|
||||||
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentLineSymbol", (LPARAM)(userLangContainer._isCommentLineSymbol?"1":"0"));
|
|
||||||
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentSymbol", (LPARAM)(userLangContainer._isCommentSymbol?"1":"0"));
|
|
||||||
|
|
||||||
const char strArray[4][20] = {"userDefine.g1Prefix", "userDefine.g2Prefix", "userDefine.g3Prefix", "userDefine.g4Prefix"};
|
|
||||||
for (int i = 0 ; i < 4 ; i++)
|
|
||||||
execute(SCI_SETPROPERTY, (WPARAM)strArray[i], (LPARAM)(userLangContainer._isPrefix[i]?"1":"0"));
|
|
||||||
|
|
||||||
for (int i = 0 ; i < userLangContainer.getNbKeywordList() ; i++)
|
|
||||||
{
|
|
||||||
execute(SCI_SETKEYWORDS, i, reinterpret_cast<LPARAM>(userLangContainer._keywordLists[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0 ; i < userLangContainer._styleArray.getNbStyler() ; i++)
|
|
||||||
{
|
|
||||||
Style & style = userLangContainer._styleArray.getStyler(i);
|
|
||||||
setStyle(style);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaEditView::setUserLexer(const char *userLangName)
|
void ScintillaEditView::setUserLexer(const char *userLangName)
|
||||||
{
|
{
|
||||||
|
|
||||||
execute(SCI_SETLEXER, SCLEX_USER);
|
execute(SCI_SETLEXER, SCLEX_USER);
|
||||||
|
|
||||||
UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(userLangName);
|
UserLangContainer & userLangContainer = userLangName?NppParameters::getInstance()->getULCFromName(userLangName):*(_userDefineDlg._pCurrentUserLang);
|
||||||
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.ignoreCase", (LPARAM)(userLangContainer._isCaseIgnored?"1":"0"));
|
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.ignoreCase", (LPARAM)(userLangContainer._isCaseIgnored?"1":"0"));
|
||||||
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentLineSymbol", (LPARAM)(userLangContainer._isCommentLineSymbol?"1":"0"));
|
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentLineSymbol", (LPARAM)(userLangContainer._isCommentLineSymbol?"1":"0"));
|
||||||
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentSymbol", (LPARAM)(userLangContainer._isCommentSymbol?"1":"0"));
|
execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentSymbol", (LPARAM)(userLangContainer._isCommentSymbol?"1":"0"));
|
||||||
@ -443,7 +473,8 @@ void ScintillaEditView::setCppLexer(LangType langType)
|
|||||||
const char *cppTypes;
|
const char *cppTypes;
|
||||||
const char *doxygenKeyWords = _pParameter->getWordList(L_CPP, LANG_INDEX_TYPE2);
|
const char *doxygenKeyWords = _pParameter->getWordList(L_CPP, LANG_INDEX_TYPE2);
|
||||||
|
|
||||||
char *lexerName;
|
const char *lexerName = ScintillaEditView::langNames[langType].lexerName;
|
||||||
|
/*char *lexerName;
|
||||||
switch (langType)
|
switch (langType)
|
||||||
{
|
{
|
||||||
case L_C:
|
case L_C:
|
||||||
@ -469,7 +500,7 @@ void ScintillaEditView::setCppLexer(LangType langType)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
execute(SCI_SETLEXER, SCLEX_CPP);
|
execute(SCI_SETLEXER, SCLEX_CPP);
|
||||||
if (isCJK())
|
if (isCJK())
|
||||||
@ -487,7 +518,7 @@ void ScintillaEditView::setCppLexer(LangType langType)
|
|||||||
|
|
||||||
if (langType == L_JS)
|
if (langType == L_JS)
|
||||||
{
|
{
|
||||||
LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName("javascript");
|
LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName);
|
||||||
if (pStyler)
|
if (pStyler)
|
||||||
{
|
{
|
||||||
for (int i = 0 ; i < pStyler->getNbStyler() ; i++)
|
for (int i = 0 ; i < pStyler->getNbStyler() ; i++)
|
||||||
@ -519,7 +550,7 @@ void ScintillaEditView::setCppLexer(LangType langType)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||||
makeStyle(lexerName, pKwArray);
|
makeStyle(langType, pKwArray);
|
||||||
|
|
||||||
std::string instr1("");
|
std::string instr1("");
|
||||||
if (pKwArray[LANG_INDEX_INSTR])
|
if (pKwArray[LANG_INDEX_INSTR])
|
||||||
@ -544,11 +575,11 @@ void ScintillaEditView::setObjCLexer(LangType langType)
|
|||||||
|
|
||||||
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||||
|
|
||||||
const char *lexerName = "objc";
|
//const char *lexerName = "objc";
|
||||||
if (langType == L_FLASH)
|
//if (langType == L_FLASH)
|
||||||
lexerName = "actionscript";
|
// lexerName = "actionscript";
|
||||||
|
|
||||||
makeStyle(lexerName, pKwArray);
|
makeStyle(langType, pKwArray);
|
||||||
|
|
||||||
std::string objcInstr1Kwl("");
|
std::string objcInstr1Kwl("");
|
||||||
if (pKwArray[LANG_INDEX_INSTR])
|
if (pKwArray[LANG_INDEX_INSTR])
|
||||||
@ -584,13 +615,13 @@ void ScintillaEditView::setKeywords(LangType langType, const char *keywords, int
|
|||||||
execute(SCI_SETKEYWORDS, index, (LPARAM)getCompleteKeywordList(wordList, langType, index));
|
execute(SCI_SETKEYWORDS, index, (LPARAM)getCompleteKeywordList(wordList, langType, index));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditView::setLexer(int lexerID, LangType langType, const char *lexerName, int whichList)
|
void ScintillaEditView::setLexer(int lexerID, LangType langType, int whichList)
|
||||||
{
|
{
|
||||||
execute(SCI_SETLEXER, lexerID);
|
execute(SCI_SETLEXER, lexerID);
|
||||||
|
|
||||||
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||||
|
|
||||||
makeStyle(lexerName, pKwArray);
|
makeStyle(langType, pKwArray);
|
||||||
|
|
||||||
if (whichList & LIST_0)
|
if (whichList & LIST_0)
|
||||||
{
|
{
|
||||||
@ -628,6 +659,25 @@ void ScintillaEditView::setLexer(int lexerID, LangType langType, const char *lex
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScintillaEditView::makeStyle(LangType language, const char **keywordArray)
|
||||||
|
{
|
||||||
|
const char * lexerName = ScintillaEditView::langNames[language].lexerName;
|
||||||
|
LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName);
|
||||||
|
if (pStyler)
|
||||||
|
{
|
||||||
|
for (int i = 0 ; i < pStyler->getNbStyler() ; i++)
|
||||||
|
{
|
||||||
|
Style & style = pStyler->getStyler(i);
|
||||||
|
setStyle(style);
|
||||||
|
if (keywordArray)
|
||||||
|
{
|
||||||
|
if ((style._keywordClass != -1) && (style._keywords))
|
||||||
|
keywordArray[style._keywordClass] = style._keywords->c_str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ScintillaEditView::defineDocType(LangType typeDoc)
|
void ScintillaEditView::defineDocType(LangType typeDoc)
|
||||||
{
|
{
|
||||||
//setStyle(STYLE_DEFAULT, black, white, "Verdana", 0, 9);
|
//setStyle(STYLE_DEFAULT, black, white, "Verdana", 0, 9);
|
||||||
@ -1305,24 +1355,6 @@ void ScintillaEditView::expand(int &line, bool doExpand, bool force, int visLeve
|
|||||||
//recalcHorizontalScrollbar(); //Update scrollbar after folding
|
//recalcHorizontalScrollbar(); //Update scrollbar after folding
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditView::makeStyle(const char *lexerName, const char **keywordArray)
|
|
||||||
{
|
|
||||||
LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName);
|
|
||||||
if (pStyler)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < pStyler->getNbStyler() ; i++)
|
|
||||||
{
|
|
||||||
Style & style = pStyler->getStyler(i);
|
|
||||||
setStyle(style);
|
|
||||||
if (keywordArray)
|
|
||||||
{
|
|
||||||
if ((style._keywordClass != -1) && (style._keywords))
|
|
||||||
keywordArray[style._keywordClass] = style._keywords->c_str();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaEditView::performGlobalStyles()
|
void ScintillaEditView::performGlobalStyles()
|
||||||
{
|
{
|
||||||
StyleArray & stylers = _pParameter->getMiscStylerArray();
|
StyleArray & stylers = _pParameter->getMiscStylerArray();
|
||||||
|
@ -125,6 +125,13 @@ char * int2str(char *str, int strLen, int number, int base, int nbChiffre, bool
|
|||||||
|
|
||||||
typedef LRESULT (WINAPI *CallWindowProcFunc) (WNDPROC,HWND,UINT,WPARAM,LPARAM);
|
typedef LRESULT (WINAPI *CallWindowProcFunc) (WNDPROC,HWND,UINT,WPARAM,LPARAM);
|
||||||
|
|
||||||
|
struct LanguageName {
|
||||||
|
const char * lexerName;
|
||||||
|
const char * shortName;
|
||||||
|
const char * longName;
|
||||||
|
LangType LangID;
|
||||||
|
};
|
||||||
|
|
||||||
class ScintillaEditView : public Window
|
class ScintillaEditView : public Window
|
||||||
{
|
{
|
||||||
friend class Notepad_plus;
|
friend class Notepad_plus;
|
||||||
@ -493,8 +500,6 @@ public:
|
|||||||
return (execute(SCI_GETCARETLINEVISIBLE) != 0);
|
return (execute(SCI_GETCARETLINEVISIBLE) != 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void makeStyle(const char *lexerName, const char **keywordArray = NULL);
|
|
||||||
|
|
||||||
void performGlobalStyles();
|
void performGlobalStyles();
|
||||||
|
|
||||||
void expand(int &line, bool doExpand, bool force = false, int visLevels = 0, int level = -1);
|
void expand(int &line, bool doExpand, bool force = false, int visLevels = 0, int level = -1);
|
||||||
@ -618,6 +623,7 @@ public:
|
|||||||
execute(SCI_INDICATORCLEARRANGE, docStart, docEnd-docStart);
|
execute(SCI_INDICATORCLEARRANGE, docStart, docEnd-docStart);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static LanguageName ScintillaEditView::langNames[L_EXTERNAL+1];
|
||||||
protected:
|
protected:
|
||||||
static HINSTANCE _hLib;
|
static HINSTANCE _hLib;
|
||||||
static int _refCount;
|
static int _refCount;
|
||||||
@ -673,168 +679,168 @@ protected:
|
|||||||
|
|
||||||
bool _wrapRestoreNeeded;
|
bool _wrapRestoreNeeded;
|
||||||
|
|
||||||
|
//Lexers and Styling
|
||||||
|
const char * getCompleteKeywordList(std::string & kwl, LangType langType, int keywordIndex);
|
||||||
|
void setKeywords(LangType langType, const char *keywords, int index);
|
||||||
|
void setLexer(int lexerID, LangType langType, int whichList);
|
||||||
|
inline void makeStyle(LangType langType, const char **keywordArray = NULL);
|
||||||
void setStyle(Style styleToSet); //NOT by reference (style edited)
|
void setStyle(Style styleToSet); //NOT by reference (style edited)
|
||||||
void setSpecialStyle(Style & styleToSet); //by reference
|
void setSpecialStyle(Style & styleToSet); //by reference
|
||||||
void setSpecialIndicator(Style & styleToSet);
|
void setSpecialIndicator(Style & styleToSet);
|
||||||
void setCppLexer(LangType type);
|
//Complex lexers (same lexer, different language)
|
||||||
void setXmlLexer(LangType type);
|
void setXmlLexer(LangType type);
|
||||||
void setUserLexer();
|
void setCppLexer(LangType type);
|
||||||
void setUserLexer(const char *userLangName);
|
void setObjCLexer(LangType type);
|
||||||
|
void setUserLexer(const char *userLangName = NULL);
|
||||||
void setExternalLexer(LangType typeDoc);
|
void setExternalLexer(LangType typeDoc);
|
||||||
void setEmbeddedJSLexer();
|
void setEmbeddedJSLexer();
|
||||||
void setPhpEmbeddedLexer();
|
void setPhpEmbeddedLexer();
|
||||||
void setEmbeddedAspLexer();
|
void setEmbeddedAspLexer();
|
||||||
|
//Simple lexers
|
||||||
void setCssLexer() {
|
void setCssLexer() {
|
||||||
setLexer(SCLEX_CSS, L_CSS, "css", LIST_0 | LIST_1);
|
setLexer(SCLEX_CSS, L_CSS, LIST_0 | LIST_1);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setLuaLexer() {
|
void setLuaLexer() {
|
||||||
setLexer(SCLEX_LUA, L_LUA, "lua", LIST_0 | LIST_1 | LIST_2 | LIST_3);
|
setLexer(SCLEX_LUA, L_LUA, LIST_0 | LIST_1 | LIST_2 | LIST_3);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setMakefileLexer() {
|
void setMakefileLexer() {
|
||||||
execute(SCI_SETLEXER, SCLEX_MAKEFILE);
|
execute(SCI_SETLEXER, SCLEX_MAKEFILE);
|
||||||
makeStyle("makefile");
|
makeStyle(L_MAKEFILE);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setIniLexer() {
|
void setIniLexer() {
|
||||||
execute(SCI_SETLEXER, SCLEX_PROPERTIES);
|
execute(SCI_SETLEXER, SCLEX_PROPERTIES);
|
||||||
execute(SCI_STYLESETEOLFILLED, SCE_PROPS_SECTION, true);
|
execute(SCI_STYLESETEOLFILLED, SCE_PROPS_SECTION, true);
|
||||||
makeStyle("ini");
|
makeStyle(L_INI);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setObjCLexer(LangType type);
|
|
||||||
|
|
||||||
void setSqlLexer() {
|
void setSqlLexer() {
|
||||||
setLexer(SCLEX_SQL, L_SQL, "sql", LIST_0);
|
setLexer(SCLEX_SQL, L_SQL, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setBashLexer() {
|
void setBashLexer() {
|
||||||
setLexer(SCLEX_BASH, L_BASH, "bash", LIST_0);
|
setLexer(SCLEX_BASH, L_BASH, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setVBLexer() {
|
void setVBLexer() {
|
||||||
setLexer(SCLEX_VB, L_VB, "vb", LIST_0);
|
setLexer(SCLEX_VB, L_VB, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setPascalLexer() {
|
void setPascalLexer() {
|
||||||
setLexer(SCLEX_PASCAL, L_PASCAL, "pascal", LIST_0);
|
setLexer(SCLEX_PASCAL, L_PASCAL, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setPerlLexer() {
|
void setPerlLexer() {
|
||||||
setLexer(SCLEX_PERL, L_PERL, "perl", LIST_0);
|
setLexer(SCLEX_PERL, L_PERL, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setPythonLexer() {
|
void setPythonLexer() {
|
||||||
setLexer(SCLEX_PYTHON, L_PYTHON, "python", LIST_0);
|
setLexer(SCLEX_PYTHON, L_PYTHON, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setBatchLexer() {
|
void setBatchLexer() {
|
||||||
setLexer(SCLEX_BATCH, L_BATCH, "batch", LIST_0);
|
setLexer(SCLEX_BATCH, L_BATCH, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setTeXLexer() {
|
void setTeXLexer() {
|
||||||
for (int i = 0 ; i < 4 ; i++)
|
for (int i = 0 ; i < 4 ; i++)
|
||||||
execute(SCI_SETKEYWORDS, i, reinterpret_cast<LPARAM>(""));
|
execute(SCI_SETKEYWORDS, i, reinterpret_cast<LPARAM>(""));
|
||||||
setLexer(SCLEX_TEX, L_TEX, "tex", 0);
|
setLexer(SCLEX_TEX, L_TEX, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setNsisLexer() {
|
void setNsisLexer() {
|
||||||
setLexer(SCLEX_NSIS, L_NSIS, "nsis", LIST_0 | LIST_1 | LIST_2 | LIST_3);
|
setLexer(SCLEX_NSIS, L_NSIS, LIST_0 | LIST_1 | LIST_2 | LIST_3);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setFortranLexer() {
|
void setFortranLexer() {
|
||||||
setLexer(SCLEX_F77, L_FORTRAN, "fortran", LIST_0 | LIST_1 | LIST_2);
|
setLexer(SCLEX_F77, L_FORTRAN, LIST_0 | LIST_1 | LIST_2);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setLispLexer(){
|
void setLispLexer(){
|
||||||
setLexer(SCLEX_LISP, L_LISP, "lisp", LIST_0);
|
setLexer(SCLEX_LISP, L_LISP, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setSchemeLexer(){
|
void setSchemeLexer(){
|
||||||
setLexer(SCLEX_LISP, L_SCHEME, "lisp", LIST_0);
|
setLexer(SCLEX_LISP, L_SCHEME, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setAsmLexer(){
|
void setAsmLexer(){
|
||||||
setLexer(SCLEX_ASM, L_ASM, "asm", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5);
|
setLexer(SCLEX_ASM, L_ASM, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setDiffLexer(){
|
void setDiffLexer(){
|
||||||
setLexer(SCLEX_DIFF, L_DIFF, "diff", LIST_NONE);
|
setLexer(SCLEX_DIFF, L_DIFF, LIST_NONE);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setPropsLexer(){
|
void setPropsLexer(){
|
||||||
setLexer(SCLEX_PROPERTIES, L_PROPS, "props", LIST_NONE);
|
setLexer(SCLEX_PROPERTIES, L_PROPS, LIST_NONE);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setPostscriptLexer(){
|
void setPostscriptLexer(){
|
||||||
setLexer(SCLEX_PS, L_PS, "postscript", LIST_0 | LIST_1 | LIST_2 | LIST_3);
|
setLexer(SCLEX_PS, L_PS, LIST_0 | LIST_1 | LIST_2 | LIST_3);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setRubyLexer(){
|
void setRubyLexer(){
|
||||||
setLexer(SCLEX_RUBY, L_RUBY, "ruby", LIST_0);
|
setLexer(SCLEX_RUBY, L_RUBY, LIST_0);
|
||||||
execute(SCI_STYLESETEOLFILLED, SCE_RB_POD, true);
|
execute(SCI_STYLESETEOLFILLED, SCE_RB_POD, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setSmalltalkLexer(){
|
void setSmalltalkLexer(){
|
||||||
setLexer(SCLEX_SMALLTALK, L_SMALLTALK, "smalltalk", LIST_0);
|
setLexer(SCLEX_SMALLTALK, L_SMALLTALK, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setVhdlLexer(){
|
void setVhdlLexer(){
|
||||||
setLexer(SCLEX_VHDL, L_VHDL, "vhdl", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6);
|
setLexer(SCLEX_VHDL, L_VHDL, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setKixLexer(){
|
void setKixLexer(){
|
||||||
setLexer(SCLEX_KIX, L_KIX, "kix", LIST_0 | LIST_1 | LIST_2);
|
setLexer(SCLEX_KIX, L_KIX, LIST_0 | LIST_1 | LIST_2);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setAutoItLexer(){
|
void setAutoItLexer(){
|
||||||
setLexer(SCLEX_AU3, L_AU3, "autoit", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6);
|
setLexer(SCLEX_AU3, L_AU3, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setCamlLexer(){
|
void setCamlLexer(){
|
||||||
setLexer(SCLEX_CAML, L_CAML, "caml", LIST_0 | LIST_1 | LIST_2);
|
setLexer(SCLEX_CAML, L_CAML, LIST_0 | LIST_1 | LIST_2);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setAdaLexer(){
|
void setAdaLexer(){
|
||||||
setLexer(SCLEX_ADA, L_ADA, "ada", LIST_0);
|
setLexer(SCLEX_ADA, L_ADA, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setVerilogLexer(){
|
void setVerilogLexer(){
|
||||||
setLexer(SCLEX_VERILOG, L_VERILOG, "verilog", LIST_0 | LIST_1);
|
setLexer(SCLEX_VERILOG, L_VERILOG, LIST_0 | LIST_1);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setMatlabLexer(){
|
void setMatlabLexer(){
|
||||||
setLexer(SCLEX_MATLAB, L_MATLAB, "matlab", LIST_0);
|
setLexer(SCLEX_MATLAB, L_MATLAB, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setHaskellLexer(){
|
void setHaskellLexer(){
|
||||||
setLexer(SCLEX_HASKELL, L_HASKELL, "haskell", LIST_0);
|
setLexer(SCLEX_HASKELL, L_HASKELL, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setInnoLexer() {
|
void setInnoLexer() {
|
||||||
setLexer(SCLEX_INNOSETUP, L_INNO, "inno", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5);
|
setLexer(SCLEX_INNOSETUP, L_INNO, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setCmakeLexer() {
|
void setCmakeLexer() {
|
||||||
setLexer(SCLEX_CMAKE, L_CMAKE, "cmake", LIST_0 | LIST_1 | LIST_2);
|
setLexer(SCLEX_CMAKE, L_CMAKE, LIST_0 | LIST_1 | LIST_2);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setYamlLexer() {
|
void setYamlLexer() {
|
||||||
setLexer(SCLEX_YAML, L_YAML, "yaml", LIST_0);
|
setLexer(SCLEX_YAML, L_YAML, LIST_0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void setSearchResultLexer() {
|
void setSearchResultLexer() {
|
||||||
execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_HEARDER, true);
|
execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_HEARDER, true);
|
||||||
setLexer(SCLEX_SEARCHRESULT, L_SEARCHRESULT, "searchResult", LIST_1 | LIST_2 | LIST_3);
|
setLexer(SCLEX_SEARCHRESULT, L_SEARCHRESULT, LIST_1 | LIST_2 | LIST_3);
|
||||||
};
|
};
|
||||||
|
|
||||||
void defineMarker(int marker, int markerType, COLORREF fore, COLORREF back) {
|
|
||||||
execute(SCI_MARKERDEFINE, marker, markerType);
|
|
||||||
execute(SCI_MARKERSETFORE, marker, fore);
|
|
||||||
execute(SCI_MARKERSETBACK, marker, back);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool isNeededFolderMarge(LangType typeDoc) const {
|
bool isNeededFolderMarge(LangType typeDoc) const {
|
||||||
switch (typeDoc)
|
switch (typeDoc)
|
||||||
{
|
{
|
||||||
@ -855,6 +861,14 @@ protected:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
//END: Lexers and Styling
|
||||||
|
|
||||||
|
void defineMarker(int marker, int markerType, COLORREF fore, COLORREF back) {
|
||||||
|
execute(SCI_MARKERDEFINE, marker, markerType);
|
||||||
|
execute(SCI_MARKERSETFORE, marker, fore);
|
||||||
|
execute(SCI_MARKERSETBACK, marker, back);
|
||||||
|
};
|
||||||
|
|
||||||
bool isCJK() const {
|
bool isCJK() const {
|
||||||
return ((_codepage == CP_CHINESE_TRADITIONAL) || (_codepage == CP_CHINESE_SIMPLIFIED) ||
|
return ((_codepage == CP_CHINESE_TRADITIONAL) || (_codepage == CP_CHINESE_SIMPLIFIED) ||
|
||||||
(_codepage == CP_JAPANESE) || (_codepage == CP_KOREAN) || (_codepage == CP_GREEK));
|
(_codepage == CP_JAPANESE) || (_codepage == CP_KOREAN) || (_codepage == CP_GREEK));
|
||||||
@ -871,10 +885,6 @@ protected:
|
|||||||
default : return 0;
|
default : return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const char * getCompleteKeywordList(std::string & kwl, LangType langType, int keywordIndex);
|
|
||||||
void setKeywords(LangType langType, const char *keywords, int index);
|
|
||||||
void setLexer(int lexerID, LangType langType, const char *lexerName, int whichList);
|
|
||||||
|
|
||||||
bool expandWordSelection();
|
bool expandWordSelection();
|
||||||
void arrangeBuffers(UINT nItems, UINT *items);
|
void arrangeBuffers(UINT nItems, UINT *items);
|
||||||
|
@ -19,9 +19,8 @@
|
|||||||
#include "SysMsg.h"
|
#include "SysMsg.h"
|
||||||
#include "Process.h"
|
#include "Process.h"
|
||||||
|
|
||||||
#include <exception>
|
#include <exception> //default C++ esception
|
||||||
|
#include "Win32Exception.h" //Win32 exception
|
||||||
//const char localConfFile[] = "doLocalConf.xml";
|
|
||||||
|
|
||||||
typedef std::vector<const char*> ParamVector;
|
typedef std::vector<const char*> ParamVector;
|
||||||
void parseCommandLine(char * commandLine, ParamVector & paramVector) {
|
void parseCommandLine(char * commandLine, ParamVector & paramVector) {
|
||||||
@ -101,6 +100,8 @@ const char FLAG_READONLY[] = "-ro";
|
|||||||
const char FLAG_NOSESSION[] = "-nosession";
|
const char FLAG_NOSESSION[] = "-nosession";
|
||||||
const char FLAG_NOTABBAR[] = "-notabbar";
|
const char FLAG_NOTABBAR[] = "-notabbar";
|
||||||
|
|
||||||
|
void doException(Notepad_plus & notepad_plus_plus);
|
||||||
|
|
||||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdShow)
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdShow)
|
||||||
{
|
{
|
||||||
bool TheFirstOne = true;
|
bool TheFirstOne = true;
|
||||||
@ -225,6 +226,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdSh
|
|||||||
|
|
||||||
MSG msg;
|
MSG msg;
|
||||||
msg.wParam = 0;
|
msg.wParam = 0;
|
||||||
|
Win32Exception::installHandler();
|
||||||
try {
|
try {
|
||||||
notepad_plus_plus.init(hInstance, NULL, quotFileName.c_str(), &cmdLineParams);
|
notepad_plus_plus.init(hInstance, NULL, quotFileName.c_str(), &cmdLineParams);
|
||||||
|
|
||||||
@ -240,31 +242,48 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdSh
|
|||||||
{
|
{
|
||||||
if (::TranslateAccelerator(notepad_plus_plus.getHSelf(), notepad_plus_plus.getAccTable(), &msg) == 0)
|
if (::TranslateAccelerator(notepad_plus_plus.getHSelf(), notepad_plus_plus.getAccTable(), &msg) == 0)
|
||||||
{
|
{
|
||||||
try {
|
::TranslateMessage(&msg);
|
||||||
::TranslateMessage(&msg);
|
if (unicodeSupported)
|
||||||
if (unicodeSupported)
|
::DispatchMessageW(&msg);
|
||||||
::DispatchMessageW(&msg);
|
else
|
||||||
else
|
::DispatchMessage(&msg);
|
||||||
::DispatchMessage(&msg);
|
|
||||||
} catch(std::exception ex) {
|
|
||||||
::MessageBox(NULL, ex.what(), "Exception", MB_OK);
|
|
||||||
} catch(...) {
|
|
||||||
systemMessage("System Error");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch(int i) {
|
} catch(int i) {
|
||||||
if (i == 106901)
|
if (i == 106901)
|
||||||
::MessageBox(NULL, "Scintilla.init is failed!", "106901", MB_OK);
|
::MessageBox(NULL, "Scintilla.init is failed!", "Notepad++ Exception: 106901", MB_OK);
|
||||||
else {
|
else {
|
||||||
char str[50] = "God Damned Exception : ";
|
char str[50] = "God Damned Exception : ";
|
||||||
char code[10];
|
char code[10];
|
||||||
itoa(i, code, 10);
|
itoa(i, code, 10);
|
||||||
::MessageBox(NULL, strcat(str, code), "int exception", MB_OK);
|
::MessageBox(NULL, strcat(str, code), "Notepad++ Exception", MB_OK);
|
||||||
}
|
}
|
||||||
|
doException(notepad_plus_plus);
|
||||||
|
} catch(std::exception ex) {
|
||||||
|
::MessageBox(NULL, ex.what(), "C++ Exception", MB_OK);
|
||||||
|
doException(notepad_plus_plus);
|
||||||
|
} catch (const Win32Exception & ex) {
|
||||||
|
char message[1024]; //TODO: sane number
|
||||||
|
sprintf(message, "An exception occured. Notepad++ cannot recover and must be shut down.\r\nThe exception details are as follows:\r\n"
|
||||||
|
"Code:\t0x%08X\r\nType:\t%s\r\nException address: 0x%08X"
|
||||||
|
"\r\n\r\nNotepad++ will attempt to save any unsaved data. However, dataloss is very likely.",
|
||||||
|
ex.code(), ex.what(), ex.where());
|
||||||
|
::MessageBox(NULL, message, "Win32Exception", MB_OK | MB_ICONERROR);
|
||||||
|
doException(notepad_plus_plus);
|
||||||
|
} catch(...) { //this shouldnt ever have to happen
|
||||||
|
doException(notepad_plus_plus);
|
||||||
}
|
}
|
||||||
return (UINT)msg.wParam;
|
return (UINT)msg.wParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void doException(Notepad_plus & notepad_plus_plus) {
|
||||||
|
::MessageBox(NULL, "Notepad++ will attempt to save any unsaved data. However, dataloss is very likely.", "Recovery initiating", MB_OK | MB_ICONINFORMATION);
|
||||||
|
bool res = notepad_plus_plus.emergency();
|
||||||
|
if (res) {
|
||||||
|
::MessageBox(NULL, "Notepad++ was able to successfully recover some unsaved documents, or nothing to be saved could be found.\r\nYou can find the results at C:\\N++RECOV", "Recovery success", MB_OK | MB_ICONINFORMATION);
|
||||||
|
} else {
|
||||||
|
::MessageBox(NULL, "Unfortunatly, Notepad++ was not able to save your work. We are sorry for any lost data.", "Recovery failure", MB_OK | MB_ICONERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -19,10 +19,12 @@
|
|||||||
CharacterSet="2">
|
CharacterSet="2">
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/EHa"
|
||||||
Optimization="0"
|
Optimization="0"
|
||||||
AdditionalIncludeDirectories="..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip"
|
AdditionalIncludeDirectories="..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception"
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
||||||
MinimalRebuild="TRUE"
|
MinimalRebuild="TRUE"
|
||||||
|
ExceptionHandling="FALSE"
|
||||||
BasicRuntimeChecks="0"
|
BasicRuntimeChecks="0"
|
||||||
RuntimeLibrary="5"
|
RuntimeLibrary="5"
|
||||||
UsePrecompiledHeader="0"
|
UsePrecompiledHeader="0"
|
||||||
@ -188,10 +190,16 @@ IF NOT EXIST ..\bin\userDefineLang.xml COPY ..\src\userDefineLang.xml ..\bin\use
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\src\MISC\SysMsg\SysMsg.cpp">
|
RelativePath="..\src\MISC\SysMsg\SysMsg.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\Misc\Exception\Win32Exception.cpp">
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="ScintillaComponent"
|
Name="ScintillaComponent"
|
||||||
Filter="">
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\ScitillaComponent\AutoCompletion.cpp">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\ScitillaComponent\Buffer.cpp">
|
RelativePath="..\src\ScitillaComponent\Buffer.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -204,6 +212,9 @@ IF NOT EXIST ..\bin\userDefineLang.xml COPY ..\src\userDefineLang.xml ..\bin\use
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\src\ScitillaComponent\FindReplaceDlg.cpp">
|
RelativePath="..\src\ScitillaComponent\FindReplaceDlg.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\ScitillaComponent\FunctionCallTip.cpp">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\ScitillaComponent\GoToLineDlg.cpp">
|
RelativePath="..\src\ScitillaComponent\GoToLineDlg.cpp">
|
||||||
</File>
|
</File>
|
||||||
@ -397,10 +408,16 @@ IF NOT EXIST ..\bin\userDefineLang.xml COPY ..\src\userDefineLang.xml ..\bin\use
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\src\MISC\SysMsg\SysMsg.h">
|
RelativePath="..\src\MISC\SysMsg\SysMsg.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\Misc\Exception\Win32Exception.h">
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="ScintillaComponent"
|
Name="ScintillaComponent"
|
||||||
Filter="">
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\ScitillaComponent\AutoCompletion.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\ScitillaComponent\Buffer.h">
|
RelativePath="..\src\ScitillaComponent\Buffer.h">
|
||||||
</File>
|
</File>
|
||||||
@ -416,6 +433,9 @@ IF NOT EXIST ..\bin\userDefineLang.xml COPY ..\src\userDefineLang.xml ..\bin\use
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\src\ScitillaComponent\FindReplaceDlg.h">
|
RelativePath="..\src\ScitillaComponent\FindReplaceDlg.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\ScitillaComponent\FunctionCallTip.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\ScitillaComponent\GoToLineDlg.h">
|
RelativePath="..\src\ScitillaComponent\GoToLineDlg.h">
|
||||||
</File>
|
</File>
|
||||||
@ -871,4 +891,6 @@ IF NOT EXIST ..\bin\userDefineLang.xml COPY ..\src\userDefineLang.xml ..\bin\use
|
|||||||
</Filter>
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
</VisualStudioProject>
|
</VisualStudioProject>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user