Adjust lexing handling, restored performance in some cases,

temp. disable cloneview on updates.
Update lexer table to also contain lexerID.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@242 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
harrybharry 2008-06-18 13:12:54 +00:00
parent a06816432b
commit ed40c1f03b
6 changed files with 128 additions and 66 deletions

View File

@ -715,7 +715,26 @@ bool Notepad_plus::doReload(BufferID id, bool alert)
if (::MessageBox(_hSelf, "Do you want to reload the current file?", "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL) != IDYES) if (::MessageBox(_hSelf, "Do you want to reload the current file?", "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL) != IDYES)
return false; return false;
} }
return MainFileManager->reloadBuffer(id);
//In order to prevent Scintilla from restyling the entire document,
//an empty Document is inserted during reload if needed.
bool mainVisisble = (_mainEditView.getCurrentBufferID() == id);
bool subVisisble = (_subEditView.getCurrentBufferID() == id);
if (mainVisisble) {
_mainEditView.execute(SCI_SETDOCPOINTER, 0, 0);
}
if (subVisisble) {
_subEditView.execute(SCI_SETDOCPOINTER, 0, 0);
}
bool res = MainFileManager->reloadBuffer(id);
Buffer * pBuf = MainFileManager->getBufferByID(id);
if (mainVisisble) {
_mainEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument());
}
if (subVisisble) {
_subEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument());
}
return res;
} }
bool Notepad_plus::doSave(BufferID id, const char * filename, bool isCopy) bool Notepad_plus::doSave(BufferID id, const char * filename, bool isCopy)
@ -3993,6 +4012,29 @@ void Notepad_plus::command(int id)
} }
void Notepad_plus::setLanguage(int id, LangType langType) {
//Add logic to prevent changing a language when a document is shared between two views
//If so, release one document
bool reset = false;
Document prev = 0;
if (bothActive()) {
if (_mainEditView.getCurrentBufferID() == _subEditView.getCurrentBufferID()) {
reset = true;
prev = _subEditView.execute(SCI_GETDOCPOINTER);
_subEditView.execute(SCI_SETDOCPOINTER, 0, 0);
}
}
if (reset) {
_mainEditView.getCurrentBuffer()->setLangType(langType);
} else {
_pEditView->getCurrentBuffer()->setLangType(langType);
}
if (reset) {
_subEditView.execute(SCI_SETDOCPOINTER, 0, prev);
}
};
enum LangType Notepad_plus::menuID2LangType(int cmdID) enum LangType Notepad_plus::menuID2LangType(int cmdID)
{ {
switch (cmdID) switch (cmdID)

View File

@ -466,9 +466,7 @@ private:
void checkLangsMenu(int id) const ; void checkLangsMenu(int id) const ;
void setLanguage(int id, LangType langType) { void setLanguage(int id, LangType langType);
_pEditView->getCurrentBuffer()->setLangType(langType);
};
enum LangType menuID2LangType(int cmdID); enum LangType menuID2LangType(int cmdID);

View File

@ -376,7 +376,7 @@ BufferID FileManager::loadFile(const char * filename, Document doc) {
::GetFullPathName(filename, MAX_PATH, fullpath, NULL); ::GetFullPathName(filename, MAX_PATH, fullpath, NULL);
::GetLongPathName(fullpath, fullpath, MAX_PATH); ::GetLongPathName(fullpath, fullpath, MAX_PATH);
Utf8_16_Read UnicodeConvertor; //declare here so we can get information after loading is done Utf8_16_Read UnicodeConvertor; //declare here so we can get information after loading is done
if (loadFileData(doc, fullpath, &UnicodeConvertor)) { if (loadFileData(doc, fullpath, &UnicodeConvertor, L_TXT)) {
Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_REGULAR, fullpath); Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_REGULAR, fullpath);
BufferID id = (BufferID) newBuf; BufferID id = (BufferID) newBuf;
newBuf->_id = id; newBuf->_id = id;
@ -405,9 +405,16 @@ bool FileManager::reloadBuffer(BufferID id) {
Buffer * buf = getBufferByID(id); Buffer * buf = getBufferByID(id);
Document doc = buf->getDocument(); Document doc = buf->getDocument();
Utf8_16_Read UnicodeConvertor; Utf8_16_Read UnicodeConvertor;
bool res = loadFileData(doc, buf->getFilePath(), &UnicodeConvertor); bool res = loadFileData(doc, buf->getFilePath(), &UnicodeConvertor, buf->getLangType());
if (res) if (res) {
buf->setNeedsLexing(true); if (UnicodeConvertor.getNewBuf()) {
buf->determinateFormat(UnicodeConvertor.getNewBuf());
} else {
buf->determinateFormat("");
}
buf->setUnicodeMode(UnicodeConvertor.getEncoding());
// buf->setNeedsLexing(true);
}
return res; return res;
} }
@ -516,7 +523,7 @@ BufferID FileManager::bufferFromDocument(Document doc, bool dontIncrease, bool d
return id; return id;
} }
bool FileManager::loadFileData(Document doc, const char * filename, Utf8_16_Read * UnicodeConvertor) { bool FileManager::loadFileData(Document doc, const char * filename, Utf8_16_Read * UnicodeConvertor, LangType language) {
const int blockSize = 128 * 1024; //128 kB const int blockSize = 128 * 1024; //128 kB
char data[blockSize]; char data[blockSize];
@ -527,13 +534,20 @@ bool FileManager::loadFileData(Document doc, const char * filename, Utf8_16_Read
//Setup scratchtilla for new filedata //Setup scratchtilla for new filedata
_pscratchTilla->execute(SCI_SETDOCPOINTER, 0, doc); _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, doc);
_pscratchTilla->execute(SCI_CLEARALL); _pscratchTilla->execute(SCI_CLEARALL);
if (language < L_EXTERNAL) {
_pscratchTilla->execute(SCI_SETLEXER, ScintillaEditView::langNames[language].lexerID);
} else {
int id = language - L_EXTERNAL;
char * name = NppParameters::getInstance()->getELCFromIndex(id)._name;
_pscratchTilla->execute(SCI_SETLEXERLANGUAGE, 0, (LPARAM)name);
}
size_t lenFile = 0; size_t lenFile = 0;
size_t lenConvert = 0; //just in case conversion results in 0, but file not empty size_t lenConvert = 0; //just in case conversion results in 0, but file not empty
do { do {
lenFile = fread(data, 1, blockSize, fp); lenFile = fread(data, 1, blockSize, fp);
lenConvert = UnicodeConvertor->convert(data, lenFile); lenConvert = UnicodeConvertor->convert(data, lenFile);
_pscratchTilla->execute(SCI_ADDTEXT, lenConvert, (LPARAM)(UnicodeConvertor->getNewBuf())); _pscratchTilla->execute(SCI_APPENDTEXT, lenConvert, (LPARAM)(UnicodeConvertor->getNewBuf()));
} while (lenFile > 0); } while (lenFile > 0);
fclose(fp); fclose(fp);

View File

@ -108,7 +108,7 @@ private:
BufferID _nextBufferID; BufferID _nextBufferID;
size_t _nrBufs; size_t _nrBufs;
bool loadFileData(Document doc, const char * filename, Utf8_16_Read * UnicodeConvertor); bool loadFileData(Document doc, const char * filename, Utf8_16_Read * UnicodeConvertor, LangType language);
}; };
#define MainFileManager FileManager::getInstance() #define MainFileManager FileManager::getInstance()
@ -126,7 +126,7 @@ public :
//Destructor makes sure its purged //Destructor makes sure its purged
Buffer(FileManager * pManager, BufferID id, Document doc, DocFileStatus type, const char *fileName) //type must be either DOC_REGULAR or DOC_UNNAMED Buffer(FileManager * pManager, BufferID id, Document doc, DocFileStatus type, const char *fileName) //type must be either DOC_REGULAR or DOC_UNNAMED
: _pManager(pManager), _id(id), _isDirty(false), _doc(doc), _isFileReadOnly(false), _isUserReadOnly(false), _recentTag(-1), _references(0), : _pManager(pManager), _id(id), _isDirty(false), _doc(doc), _isFileReadOnly(false), _isUserReadOnly(false), _recentTag(-1), _references(0),
_canNotify(false), _timeStamp(0), _needLexer(true) _canNotify(false), _timeStamp(0)
{ {
NppParameters *pNppParamInst = NppParameters::getInstance(); NppParameters *pNppParamInst = NppParameters::getInstance();
const NewDocDefaultSettings & ndds = (pNppParamInst->getNppGUI()).getNewDocDefaultSettings(); const NewDocDefaultSettings & ndds = (pNppParamInst->getNppGUI()).getNewDocDefaultSettings();
@ -141,9 +141,13 @@ public :
checkFileState(); checkFileState();
_currentStatus = type; _currentStatus = type;
_isDirty = false; _isDirty = false;
_needLexer = false; //new buffers do not need lexing, Scintilla takes care of that
/*
if (type == DOC_UNNAMED) if (type == DOC_UNNAMED)
_needLexer = false; //empty document, no styling _needLexer = false; //empty document, no styling
*/
_canNotify = true; _canNotify = true;
}; };

View File

@ -57,57 +57,57 @@ const int ScintillaEditView::_markersArray[][NB_FOLDER_STATE] = {
//Array with all the names of all languages //Array with all the names of all languages
LanguageName ScintillaEditView::langNames[L_EXTERNAL+1] = { LanguageName ScintillaEditView::langNames[L_EXTERNAL+1] = {
{"normal", "Normal text", "Normal text file", L_TXT}, {"normal", "Normal text", "Normal text file", L_TXT, SCLEX_NULL},
{"php", "PHP", "PHP Hypertext Preprocessor file", L_PHP}, {"php", "PHP", "PHP Hypertext Preprocessor file", L_PHP, SCLEX_HTML},
{"c", "C", "C source file", L_C}, {"c", "C", "C source file", L_C, SCLEX_CPP},
{"cpp", "C++", "C++ source file", L_CPP}, {"cpp", "C++", "C++ source file", L_CPP, SCLEX_CPP},
{"cs", "C#", "C# source file", L_CS}, {"cs", "C#", "C# source file", L_CS, },
{"objc", "Objective-C", "Objective-C source file", L_OBJC}, {"objc", "Objective-C", "Objective-C source file", L_OBJC, },
{"java", "Java", "Java source file", L_JAVA}, {"java", "Java", "Java source file", L_JAVA, SCLEX_CPP},
{"rc", "RC", "Windows Resource file", L_RC}, {"rc", "RC", "Windows Resource file", L_RC, SCLEX_CPP},
{"html", "HTML", "Hyper Text Markup Language file", L_HTML}, {"html", "HTML", "Hyper Text Markup Language file", L_HTML, SCLEX_HTML},
{"xml", "XML", "eXtensible Markup Language file", L_XML}, {"xml", "XML", "eXtensible Markup Language file", L_XML, SCLEX_XML},
{"makefile", "Makefile", "Makefile", L_MAKEFILE}, {"makefile", "Makefile", "Makefile", L_MAKEFILE, SCLEX_MAKEFILE},
{"pascal", "Pascal", "Pascal source file", L_PASCAL}, {"pascal", "Pascal", "Pascal source file", L_PASCAL, SCLEX_PASCAL},
{"batch", "Batch", "Batch file", L_BATCH}, {"batch", "Batch", "Batch file", L_BATCH, SCLEX_BATCH},
{"ini", "ini", "MS ini file", L_INI}, {"ini", "ini", "MS ini file", L_INI, SCLEX_PROPERTIES},
{"nfo", "NFO", "MSDOS Style/ASCII Art", L_NFO}, {"nfo", "NFO", "MSDOS Style/ASCII Art", L_NFO, SCLEX_NULL},
{"udf", "udf", "User Define File", L_USER}, {"udf", "udf", "User Define File", L_USER, SCLEX_USER},
{"asp", "ASP", "Active Server Pages script file", L_ASP}, {"asp", "ASP", "Active Server Pages script file", L_ASP, SCLEX_HTML},
{"sql", "SQL", "Structured Query Language file", L_SQL}, {"sql", "SQL", "Structured Query Language file", L_SQL, SCLEX_SQL},
{"vb", "VB", "Visual Basic file", L_VB}, {"vb", "VB", "Visual Basic file", L_VB, SCLEX_VB},
{"javascript", "JavaScript", "JavaScript file", L_JS}, {"javascript", "JavaScript", "JavaScript file", L_JS, SCLEX_CPP},
{"css", "CSS", "Cascade Style Sheets File", L_CSS}, {"css", "CSS", "Cascade Style Sheets File", L_CSS, SCLEX_CSS},
{"perl", "Perl", "Perl source file", L_PERL}, {"perl", "Perl", "Perl source file", L_PERL, SCLEX_PERL},
{"python", "Python", "Python file", L_PYTHON}, {"python", "Python", "Python file", L_PYTHON, SCLEX_PYTHON},
{"lua", "Lua", "Lua source File", L_LUA}, {"lua", "Lua", "Lua source File", L_LUA, SCLEX_LUA},
{"tex", "TeX", "TeX file", L_TEX}, {"tex", "TeX", "TeX file", L_TEX, SCLEX_TEX},
{"fortran", "Fortran", "Fortran source file", L_FORTRAN}, {"fortran", "Fortran", "Fortran source file", L_FORTRAN, SCLEX_FORTRAN},
{"bash", "Shell", "Unix script file", L_BASH}, {"bash", "Shell", "Unix script file", L_BASH, SCLEX_BASH},
{"actionscript","Flash Action", "Flash Action script file", L_FLASH}, //WARNING, was "flash" {"actionscript","Flash Action", "Flash Action script file", L_FLASH, SCLEX_OBJC}, //WARNING, was "flash"
{"nsis", "NSIS", "Nullsoft Scriptable Install System script file", L_NSIS}, {"nsis", "NSIS", "Nullsoft Scriptable Install System script file", L_NSIS, SCLEX_NSIS},
{"tcl", "TCL", "Tool Command Language file", L_TCL}, {"tcl", "TCL", "Tool Command Language file", L_TCL, SCLEX_TCL},
{"lisp", "Lisp", "List Processing language file", L_LISP}, {"lisp", "Lisp", "List Processing language file", L_LISP, SCLEX_LISP},
{"scheme", "Scheme", "Scheme file", L_SCHEME}, {"scheme", "Scheme", "Scheme file", L_SCHEME, SCLEX_LISP},
{"asm", "Assembly", "Assembly language source file", L_ASM}, {"asm", "Assembly", "Assembly language source file", L_ASM, SCLEX_ASM},
{"diff", "Diff", "Diff file", L_DIFF}, {"diff", "Diff", "Diff file", L_DIFF, SCLEX_DIFF},
{"props", "Properties file", "Properties file", L_PROPS}, {"props", "Properties file", "Properties file", L_PROPS, SCLEX_PROPERTIES},
{"postscript", "Postscript", "Postscript file", L_PS}, {"postscript", "Postscript", "Postscript file", L_PS, SCLEX_PS},
{"ruby", "Ruby", "Ruby file", L_RUBY}, {"ruby", "Ruby", "Ruby file", L_RUBY, SCLEX_RUBY},
{"smalltalk", "Smalltalk", "Smalltalk file", L_SMALLTALK}, {"smalltalk", "Smalltalk", "Smalltalk file", L_SMALLTALK, SCLEX_SMALLTALK},
{"vhdl", "VHDL", "VHSIC Hardware Description Language file", L_VHDL}, {"vhdl", "VHDL", "VHSIC Hardware Description Language file", L_VHDL, SCLEX_VHDL},
{"kix", "KiXtart", "KiXtart file", L_KIX}, {"kix", "KiXtart", "KiXtart file", L_KIX, SCLEX_KIX},
{"autoit", "AutoIt", "AutoIt", L_AU3}, {"autoit", "AutoIt", "AutoIt", L_AU3, SCLEX_AU3},
{"caml", "CAML", "Categorical Abstract Machine Language", L_CAML}, {"caml", "CAML", "Categorical Abstract Machine Language", L_CAML, SCLEX_CAML},
{"ada", "Ada", "Ada file", L_ADA}, {"ada", "Ada", "Ada file", L_ADA, SCLEX_ADA},
{"verilog", "Verilog", "Verilog file", L_VERILOG}, {"verilog", "Verilog", "Verilog file", L_VERILOG, SCLEX_VERILOG},
{"matlab", "MATLAB", "MATrix LABoratory", L_MATLAB}, {"matlab", "MATLAB", "MATrix LABoratory", L_MATLAB, SCLEX_MATLAB},
{"haskell", "Haskell", "Haskell", L_HASKELL}, {"haskell", "Haskell", "Haskell", L_HASKELL, SCLEX_HASKELL},
{"inno", "Inno", "Inno Setup script", L_INNO}, {"inno", "Inno", "Inno Setup script", L_INNO, SCLEX_INNOSETUP},
{"searchResult","Internal Search", "Internal Search", L_SEARCHRESULT}, {"searchResult","Internal Search", "Internal Search", L_SEARCHRESULT, SCLEX_SEARCHRESULT},
{"cmake", "CMAKEFILE", "CMAKEFILE", L_CMAKE}, {"cmake", "CMAKEFILE", "CMAKEFILE", L_CMAKE, SCLEX_CMAKE},
{"yaml", "YAML", "YAML Ain't Markup Language", L_YAML}, {"yaml", "YAML", "YAML Ain't Markup Language", L_YAML, SCLEX_YAML},
{"ext", "External", "External", L_EXTERNAL} {"ext", "External", "External", L_EXTERNAL, SCLEX_NULL}
}; };
//const int MASK_RED = 0xFF0000; //const int MASK_RED = 0xFF0000;
@ -698,6 +698,7 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
} }
execute(SCI_STYLECLEARALL); execute(SCI_STYLECLEARALL);
int oldBits = execute(SCI_GETSTYLEBITSNEEDED);
int iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE); int iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE);
if (iFind != -1) if (iFind != -1)
@ -938,7 +939,8 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
execute(SCI_SETUSETABS, !((NppParameters::getInstance())->getNppGUI())._tabReplacedBySpace); execute(SCI_SETUSETABS, !((NppParameters::getInstance())->getNppGUI())._tabReplacedBySpace);
int bitsNeeded = execute(SCI_GETSTYLEBITSNEEDED); int bitsNeeded = execute(SCI_GETSTYLEBITSNEEDED);
execute(SCI_SETSTYLEBITS, bitsNeeded); if (oldBits != bitsNeeded)
execute(SCI_SETSTYLEBITS, bitsNeeded);
} }
BufferID ScintillaEditView::attachDefaultDoc() BufferID ScintillaEditView::attachDefaultDoc()
@ -1001,8 +1003,9 @@ void ScintillaEditView::restoreCurrentPos()
//! \brief this method activates the doc and the corresponding sub tab //! \brief this method activates the doc and the corresponding sub tab
//! \brief return the index of previeus current doc //! \brief return the index of previeus current doc
void ScintillaEditView::restyleBuffer() { void ScintillaEditView::restyleBuffer() {
int end = execute(SCI_GETENDSTYLED); //style up to the last styled byte.
execute(SCI_CLEARDOCUMENTSTYLE); execute(SCI_CLEARDOCUMENTSTYLE);
execute(SCI_COLOURISE, 0, -1); execute(SCI_COLOURISE, 0, end);
_currentBuffer->setNeedsLexing(false); _currentBuffer->setNeedsLexing(false);
} }

View File

@ -130,6 +130,7 @@ struct LanguageName {
const char * shortName; const char * shortName;
const char * longName; const char * longName;
LangType LangID; LangType LangID;
int lexerID;
}; };
class ScintillaEditView : public Window class ScintillaEditView : public Window