From b2152d983e3b20aed7f687ba1d9e916ae6065b24 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Sun, 26 Jan 2025 08:31:12 +0100 Subject: [PATCH] Optimize switching programming language performance for large files Fix #16106, close #16109 --- PowerEditor/src/Notepad_plus.cpp | 48 ++++++++----------- .../ScintillaComponent/ScintillaEditView.cpp | 28 +++++++++++ .../ScintillaComponent/ScintillaEditView.h | 1 + 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index e1e4ada7a..90b7c980d 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -3872,39 +3872,31 @@ BOOL Notepad_plus::processTabSwitchAccel(MSG* msg) const 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(); - if (bothActive()) + + if (bothActive() && (_mainEditView.getCurrentBufferID() == _subEditView.getCurrentBufferID())) { - 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) - { - _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 { - _pEditView->getCurrentBuffer()->setLangType(langType); - } - - if (reset) - { - _subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_OFF); - _subEditView.execute(SCI_SETDOCPOINTER, 0, prev); - _subEditView.execute(SCI_SETMODEVENTMASK, MODEVENTMASK_ON); - _subEditView.restoreCurrentPosPreStep(); + _pEditView->setLanguage(langType); } } diff --git a/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp index 021532f53..bba5ad04e 100644 --- a/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScintillaComponent/ScintillaEditView.cpp @@ -1707,6 +1707,34 @@ void ScintillaEditView::setNpcAndCcUniEOL(long color) 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) { StyleArray & stylers = NppParameters::getInstance().getMiscStylerArray(); diff --git a/PowerEditor/src/ScintillaComponent/ScintillaEditView.h b/PowerEditor/src/ScintillaComponent/ScintillaEditView.h index 0b61c14da..580e1d0c7 100644 --- a/PowerEditor/src/ScintillaComponent/ScintillaEditView.h +++ b/PowerEditor/src/ScintillaComponent/ScintillaEditView.h @@ -845,6 +845,7 @@ public: typeDoc == L_ASN1 || typeDoc == L_GDSCRIPT); }; + void setLanguage(LangType langType); void defineDocType(LangType typeDoc); //setup stylers for active document void addCustomWordChars();