Optimize switching programming language performance for large files

Fix #16106, close #16109
This commit is contained in:
Don Ho 2025-01-26 08:31:12 +01:00
parent 706d7ae6de
commit b2152d983e
3 changed files with 49 additions and 28 deletions

View File

@ -3872,39 +3872,31 @@ BOOL Notepad_plus::processTabSwitchAccel(MSG* msg) const
void Notepad_plus::setLanguage(LangType langType) void Notepad_plus::setLanguage(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;
unsigned long MODEVENTMASK_ON = NppParameters::getInstance().getScintillaModEventMask(); unsigned long MODEVENTMASK_ON = NppParameters::getInstance().getScintillaModEventMask();
if (bothActive())
{
if (_mainEditView.getCurrentBufferID() == _subEditView.getCurrentBufferID())
{
reset = true;
_subEditView.saveCurrentPos();
prev = _subEditView.execute(SCI_GETDOCPOINTER);
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_OFF);
_subEditView.execute(SCI_SETDOCPOINTER, 0, 0);
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_ON);
}
}
if (reset) if (bothActive() && (_mainEditView.getCurrentBufferID() == _subEditView.getCurrentBufferID()))
{ {
_mainEditView.getCurrentBuffer()->setLangType(langType); // Add logic to prevent changing a language when a document is shared between two views
// If so, release one document
_subEditView.saveCurrentPos();
Document subPrev = _subEditView.execute(SCI_GETDOCPOINTER);
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_OFF);
_subEditView.execute(SCI_SETDOCPOINTER, 0, 0);
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_ON);
_mainEditView.setLanguage(langType);
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_OFF);
_subEditView.execute(SCI_SETDOCPOINTER, 0, subPrev);
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_ON);
_subEditView.maintainStateForNpc();
_subEditView.setCRLF();
_subEditView.restoreCurrentPosPreStep();
} }
else else
{ {
_pEditView->getCurrentBuffer()->setLangType(langType); _pEditView->setLanguage(langType);
}
if (reset)
{
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_OFF);
_subEditView.execute(SCI_SETDOCPOINTER, 0, prev);
_subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_ON);
_subEditView.restoreCurrentPosPreStep();
} }
} }

View File

@ -1707,6 +1707,34 @@ void ScintillaEditView::setNpcAndCcUniEOL(long color)
redraw(); redraw();
} }
void ScintillaEditView::setLanguage(LangType langType)
{
unsigned long MODEVENTMASK_ON = NppParameters::getInstance().getScintillaModEventMask();
if (_currentBuffer->getLastLangType() != -1)
{
saveCurrentPos();
Document prev = execute(SCI_GETDOCPOINTER);
execute(SCI_SETMODEVENTMASK, MODEVENTMASK_OFF);
execute(SCI_SETDOCPOINTER, 0, getBlankDocument());
execute(SCI_SETMODEVENTMASK, MODEVENTMASK_ON);
_currentBuffer->setLangType(langType);
execute(SCI_SETMODEVENTMASK, MODEVENTMASK_OFF);
execute(SCI_SETDOCPOINTER, 0, prev);
execute(SCI_SETMODEVENTMASK, MODEVENTMASK_ON);
maintainStateForNpc();
setCRLF();
restoreCurrentPosPreStep();
}
else
{
_currentBuffer->setLangType(langType);
}
}
void ScintillaEditView::defineDocType(LangType typeDoc) void ScintillaEditView::defineDocType(LangType typeDoc)
{ {
StyleArray & stylers = NppParameters::getInstance().getMiscStylerArray(); StyleArray & stylers = NppParameters::getInstance().getMiscStylerArray();

View File

@ -845,6 +845,7 @@ public:
typeDoc == L_ASN1 || typeDoc == L_GDSCRIPT); typeDoc == L_ASN1 || typeDoc == L_GDSCRIPT);
}; };
void setLanguage(LangType langType);
void defineDocType(LangType typeDoc); //setup stylers for active document void defineDocType(LangType typeDoc); //setup stylers for active document
void addCustomWordChars(); void addCustomWordChars();