📄 scintillaeditview.cpp
字号:
void ScintillaEditView::setKeywords(LangType langType, const char *keywords, int index)
{
std::string wordList;
wordList = (keywords)?keywords:"";
execute(SCI_SETKEYWORDS, index, (LPARAM)getCompleteKeywordList(wordList, langType, index));
}
void ScintillaEditView::setLexer(int lexerID, LangType langType, const char *lexerName, int whichList)
{
execute(SCI_SETLEXER, lexerID);
const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
makeStyle(lexerName, pKwArray);
if (whichList & LIST_0)
{
setKeywords(langType, pKwArray[LANG_INDEX_INSTR], LANG_INDEX_INSTR);
}
if (whichList & LIST_1)
{
setKeywords(langType, pKwArray[LANG_INDEX_INSTR2], LANG_INDEX_INSTR2);
}
if (whichList & LIST_2)
{
setKeywords(langType, pKwArray[LANG_INDEX_TYPE], LANG_INDEX_TYPE);
}
if (whichList & LIST_3)
{
setKeywords(langType, pKwArray[LANG_INDEX_TYPE2], LANG_INDEX_TYPE2);
}
if (whichList & LIST_4)
{
setKeywords(langType, pKwArray[LANG_INDEX_TYPE3], LANG_INDEX_TYPE3);
}
if (whichList & LIST_5)
{
setKeywords(langType, pKwArray[LANG_INDEX_TYPE4], LANG_INDEX_TYPE4);
}
if (whichList & LIST_6)
{
setKeywords(langType, pKwArray[LANG_INDEX_TYPE5], LANG_INDEX_TYPE5);
}
}
void ScintillaEditView::defineDocType(LangType typeDoc)
{
//setStyle(STYLE_DEFAULT, black, white, "Verdana", 0, 9);
StyleArray & stylers = _pParameter->getMiscStylerArray();
int iStyleDefault = stylers.getStylerIndexByID(STYLE_DEFAULT);
if (iStyleDefault != -1)
{
Style & styleDefault = stylers.getStyler(iStyleDefault);
setStyle(styleDefault._styleID, styleDefault._fgColor, styleDefault._bgColor, styleDefault._fontName, styleDefault._fontStyle, styleDefault._fontSize);
}
execute(SCI_STYLECLEARALL);
int iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE);
if (iFind != -1)
{
Style & styleFind = stylers.getStyler(iFind);
setStyle(styleFind._styleID, styleFind._fgColor, styleFind._bgColor, styleFind._fontName, styleFind._fontStyle, styleFind._fontSize);
}
iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_SELECT_STYLE);
if (iFind != -1)
{
Style & styleFind = stylers.getStyler(iFind);
setStyle(styleFind._styleID, styleFind._fgColor, styleFind._bgColor, styleFind._fontName, styleFind._fontStyle, styleFind._fontSize);
}
int caretWidth = 1;
// Il faut surtout faire un test ici avant d'ex閏uter SCI_SETCODEPAGE
// Sinon y'aura un soucis de performance!
if (isCJK())
{
if (getCurrentBuffer()._unicodeMode == uni8Bit)
execute(SCI_SETCODEPAGE, _codepage);
}
execute(SCI_SETSTYLEBITS, 5);
showMargin(_SC_MARGE_FOLDER, isNeededFolderMarge(typeDoc));
switch (typeDoc)
{
case L_C :
case L_CPP :
case L_JS:
case L_JAVA :
case L_RC :
case L_CS :
case L_TCL :
setCppLexer(typeDoc); break;
case L_FLASH :
case L_OBJC :
setObjCLexer(typeDoc); break;
case L_PHP :
case L_ASP :
case L_HTML :
case L_XML :
setXmlLexer(typeDoc); break;
case L_CSS :
setCssLexer(); break;
case L_LUA :
setLuaLexer(); break;
case L_MAKEFILE :
setMakefileLexer(); break;
case L_INI :
setIniLexer(); break;
case L_USER :
if (_buffers[_currentIndex]._userLangExt[0])
setUserLexer(_buffers[_currentIndex]._userLangExt);
else
setUserLexer();
break;
case L_NFO :
{
LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName("nfo");
COLORREF bg = black;
COLORREF fg = liteGrey;
if (pStyler)
{
int i = pStyler->getStylerIndexByName("DEFAULT");
if (i != -1)
{
Style & style = pStyler->getStyler(i);
bg = style._bgColor;
fg = style._fgColor;
}
}
setStyle(STYLE_DEFAULT, fg, bg, "MS LineDraw");
execute(SCI_STYLECLEARALL);
}
break;
case L_SQL :
setSqlLexer(); break;
case L_VB :
setVBLexer(); break;
case L_PASCAL :
setPascalLexer(); break;
case L_PERL :
setPerlLexer(); break;
case L_PYTHON :
setPythonLexer(); break;
case L_BATCH :
setBatchLexer(); break;
case L_TEX :
setTeXLexer(); break;
case L_NSIS :
setNsisLexer(); break;
case L_BASH :
setBashLexer(); break;
case L_FORTRAN :
setFortranLexer(); break;
case L_LISP :
setLispLexer(); break;
case L_SCHEME :
setShemeLexer(); break;
case L_ASM :
setAsmLexer(); break;
case L_DIFF :
setDiffLexer(); break;
case L_PROPS :
setPropsLexer(); break;
case L_PS :
setPostscriptLexer(); break;
case L_RUBY :
setRubyLexer(); break;
case L_SMALLTALK :
setSmalltalkLexer(); break;
case L_VHDL :
setVhdlLexer(); break;
case L_TXT :
default :
execute(SCI_SETLEXER, (_codepage == CP_CHINESE_TRADITIONAL)?SCLEX_MAKEFILE:SCLEX_NULL); break;
}
//All the global styles should put here
static int indexOfIndentGuide = stylers.getStylerIndexByID(STYLE_INDENTGUIDE);
if (indexOfIndentGuide != -1)
{
static Style & styleIG = stylers.getStyler(indexOfIndentGuide);
setStyle(styleIG._styleID, styleIG._fgColor, styleIG._bgColor, styleIG._fontName, styleIG._fontStyle, styleIG._fontSize);
}
static int indexOfBraceLight = stylers.getStylerIndexByID(STYLE_BRACELIGHT);
if (indexOfBraceLight != -1)
{
static Style & styleBL = stylers.getStyler(indexOfBraceLight);
setStyle(styleBL._styleID, styleBL._fgColor, styleBL._bgColor, styleBL._fontName, styleBL._fontStyle, styleBL._fontSize);
}
static int indexBadBrace = stylers.getStylerIndexByID(STYLE_BRACEBAD);
if (indexBadBrace != -1)
{
static Style & styleBB = stylers.getStyler(indexBadBrace);
setStyle(styleBB._styleID, styleBB._fgColor, styleBB._bgColor, styleBB._fontName, styleBB._fontStyle, styleBB._fontSize);
}
static int indexLineNumber = stylers.getStylerIndexByID(STYLE_LINENUMBER);
if (indexLineNumber != -1)
{
static Style & styleLN = stylers.getStyler(indexLineNumber);
setStyle(styleLN._styleID, styleLN._fgColor, styleLN._bgColor, styleLN._fontName, styleLN._fontStyle, styleLN._fontSize);
}
execute(SCI_SETTABWIDTH, ((NppParameters::getInstance())->getNppGUI())._tabSize);
execute(SCI_SETUSETABS, !((NppParameters::getInstance())->getNppGUI())._tabReplacedBySpace);
execute(SCI_COLOURISE, 0, -1);
}
char * ScintillaEditView::attatchDefaultDoc(int nb)
{
char title[10];
char nb_str[4];
strcat(strcpy(title, UNTITLED_STR), _itoa(nb, nb_str, 10));
// get the doc pointer attached (by default) on the view Scintilla
Document doc = execute(SCI_GETDOCPOINTER, 0, 0);
// create the entry for our list
_buffers.push_back(Buffer(doc, title));
// set current index to 0
_currentIndex = 0;
return _buffers[_currentIndex]._fullPathName;
}
int ScintillaEditView::findDocIndexByName(const char *fn) const
{
int index = -1;
for (int i = 0 ; i < int(_buffers.size()) ; i++)
{
if (!stricmp(_buffers[i]._fullPathName, fn))
{
index = i;
break;
}
}
return index;
}
void ScintillaEditView::saveCurrentPos(){ int displayedLine = static_cast<int>(execute(SCI_GETFIRSTVISIBLELINE)); int docLine = execute(SCI_DOCLINEFROMVISIBLE, displayedLine); int nbInvisibleLine = 0; //Calculate nb of invisible line for (int i = 0 ; i < docLine ; i++) if (execute(SCI_GETLINEVISIBLE, i) == FALSE) nbInvisibleLine++; Buffer & buf = _buffers[_currentIndex]; // the correct visible line number buf._pos._fistVisibleLine = docLine - nbInvisibleLine; buf._pos._startPos = static_cast<int>(execute(SCI_GETSELECTIONSTART)); buf._pos._endPos = static_cast<int>(execute(SCI_GETSELECTIONEND)); buf._pos._xOffset = static_cast<int>(execute(SCI_GETXOFFSET));}
void ScintillaEditView::restoreCurrentPos(const Position & prevPos){ int scroll2Top = 0 - (int(execute(SCI_GETLINECOUNT)) + 1); scroll(0, scroll2Top); Buffer & buf = _buffers[_currentIndex]; scroll(0, buf._pos._fistVisibleLine); execute(SCI_SETSELECTIONSTART, buf._pos._startPos); execute(SCI_SETSELECTIONEND, buf._pos._endPos); execute(SCI_SETXOFFSET, buf._pos._xOffset);}
//! \brief this method activates the doc and the corresponding sub tab
//! \brief return the index of previeus current doc
char * ScintillaEditView::activateDocAt(int index)
{
// before activating another document, we get the current position
// from the Scintilla view then save it to the current document
saveCurrentPos();
Position & prevDocPos = _buffers[_currentIndex]._pos;
// get foldStateIOnfo of current doc
std::vector<HeaderLineState> lineStateVector;
int maxLine = execute(SCI_GETLINECOUNT);
for (int line = 0; line < maxLine; line++)
{
int level = execute(SCI_GETFOLDLEVEL, line);
if (level & SC_FOLDLEVELHEADERFLAG)
{
bool expanded = (execute(SCI_GETFOLDEXPANDED, line) != 0);
lineStateVector.push_back(HeaderLineState(line, expanded));
}
}
// put the state into the future ex buffer
_buffers[_currentIndex]._foldState = lineStateVector;
// increase current doc ref count to 2
execute(SCI_ADDREFDOCUMENT, 0, _buffers[_currentIndex]._doc);
// change the doc, this operation will decrease
// the ref count of old current doc to 1
// then increase the new current doc to 2
execute(SCI_SETDOCPOINTER, 0, _buffers[index]._doc);
// Important : to avoid the leak of memory
// Now keep the ref counter of new current doc as 1
int refCtr = execute(SCI_RELEASEDOCUMENT, 0, _buffers[index]._doc);
// NOW WE TAKE NEW DOC AND WE THROW OUT THE OLD ONE
_currentIndex = index;
// restore the collapsed info
int nbLineState = _buffers[_currentIndex]._foldState.size();
for (int i = 0 ; i < nbLineState ; i++)
{
HeaderLineState &hls = _buffers[_currentIndex]._foldState[i];
bool expanded = (execute(SCI_GETFOLDEXPANDED, hls._headerLineNumber) != 0);
// set line to state folded
if (hls._isCollapsed && !expanded)
execute(SCI_TOGGLEFOLD, hls._headerLineNumber);
if (!hls._isCollapsed && expanded)
execute(SCI_TOGGLEFOLD, hls._headerLineNumber);
}
//if (isDocTypeDiff)
defineDocType(_buffers[_currentIndex]._lang);
restoreCurrentPos(prevDocPos);
execute(SCI_SETEOLMODE, _buffers[_currentIndex]._format);
return _buffers[_currentIndex]._fullPathName;
}
// this method creates a new doc ,and adds it into
// the end of the doc list and a last sub tab, then activate it
// it returns the name of this created doc (that's the current doc also)
char * ScintillaEditView::createNewDoc(const char *fn)
{
Document newDoc = execute(SCI_CREATEDOCUMENT);
_buffers.push_back(Buffer(newDoc, fn));
_buffers[_buffers.size()-1].checkIfReadOnlyFile();
return activateDocAt(int(_buffers.size())-1);
}
char * ScintillaEditView::createNewDoc(int nbNew)
{
char title[10];
char nb[4];
strcat(strcpy(title, UNTITLED_STR), _itoa(nbNew, nb, 10));
return createNewDoc(title);
}
void ScintillaEditView::collapse(int level2Collapse, bool mode)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -