Add smart highlighting extension to anothe view option

Add new option to enable smat highlighting extension to anothe view,
while both views are visible side by side.
This commit is contained in:
Don Ho 2016-10-28 11:47:36 +02:00
parent a82d9f9981
commit 3924190fb1
13 changed files with 186 additions and 90 deletions

View File

@ -717,6 +717,7 @@
<Item id="6332" name="區別大小寫"/> <Item id="6332" name="區別大小寫"/>
<Item id="6338" name="僅符合整個單字"/> <Item id="6338" name="僅符合整個單字"/>
<Item id="6339" name="使用搜尋對話框的設定"/> <Item id="6339" name="使用搜尋對話框的設定"/>
<Item id="6340" name="高亮度延伸至另一視窗"/>
<Item id="6329" name="高亮度顯示相契合的 xml/html 標示 (tag)"/> <Item id="6329" name="高亮度顯示相契合的 xml/html 標示 (tag)"/>
<Item id="6327" name="啟動"/> <Item id="6327" name="啟動"/>
<Item id="6328" name="高亮度顯示屬性 (tag attributes)"/> <Item id="6328" name="高亮度顯示屬性 (tag attributes)"/>

View File

@ -715,6 +715,7 @@
<Item id="6332" name="Match case"/> <Item id="6332" name="Match case"/>
<Item id="6338" name="Match whole word only"/> <Item id="6338" name="Match whole word only"/>
<Item id="6339" name="Use Find dialog settings"/> <Item id="6339" name="Use Find dialog settings"/>
<Item id="6340" name="Highlight another view"/>
<Item id="6329" name="Highlight Matching Tags"/> <Item id="6329" name="Highlight Matching Tags"/>
<Item id="6327" name="Enable"/> <Item id="6327" name="Enable"/>
<Item id="6328" name="Highlight tag attributes"/> <Item id="6328" name="Highlight tag attributes"/>

View File

@ -700,6 +700,7 @@
<Item id="6332" name="Case sensible"/> <Item id="6332" name="Case sensible"/>
<Item id="6338" name="Mot entier uniquement"/> <Item id="6338" name="Mot entier uniquement"/>
<Item id="6339" name="Utiliser les paramètres de Recherche"/> <Item id="6339" name="Utiliser les paramètres de Recherche"/>
<Item id="6340" name="Sur l'autre vue également"/>
<Item id="6329" name="Surligner les tags ouverture/fermeture"/> <Item id="6329" name="Surligner les tags ouverture/fermeture"/>
<Item id="6327" name="Activer"/> <Item id="6327" name="Activer"/>
<Item id="6328" name="Les attributs de tag"/> <Item id="6328" name="Les attributs de tag"/>

View File

@ -37,15 +37,21 @@
using namespace std; using namespace std;
// Only for 2 main Scintilla editors
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
bool isFromPrimary = (_mainEditView.getHSelf() == notification->nmhdr.hwndFrom || _mainDocTab.getHSelf() == notification->nmhdr.hwndFrom); bool isFromPrimary = (_mainEditView.getHSelf() == notification->nmhdr.hwndFrom || _mainDocTab.getHSelf() == notification->nmhdr.hwndFrom);
bool isFromSecondary = !isFromPrimary && (_subEditView.getHSelf() == notification->nmhdr.hwndFrom || _subDocTab.getHSelf() == notification->nmhdr.hwndFrom); bool isFromSecondary = !isFromPrimary && (_subEditView.getHSelf() == notification->nmhdr.hwndFrom || _subDocTab.getHSelf() == notification->nmhdr.hwndFrom);
ScintillaEditView * notifyView = isFromPrimary?&_mainEditView:&_subEditView;
ScintillaEditView * notifyView = nullptr;
if (isFromPrimary)
notifyView = &_mainEditView;
else if (isFromSecondary)
notifyView = &_subEditView;
else
return FALSE;
DocTabView *notifyDocTab = isFromPrimary?&_mainDocTab:&_subDocTab; DocTabView *notifyDocTab = isFromPrimary?&_mainDocTab:&_subDocTab;
TBHDR * tabNotification = (TBHDR*) notification; TBHDR * tabNotification = (TBHDR*) notification;
switch (notification->nmhdr.code) switch (notification->nmhdr.code)
@ -485,7 +491,10 @@ BOOL Notepad_plus::notify(SCNotification *notification)
_pEditView->marginClick(notification->position, notification->modifiers); _pEditView->marginClick(notification->position, notification->modifiers);
if (_pDocMap) if (_pDocMap)
_pDocMap->fold(lineClick, _pEditView->isFolded(lineClick)); _pDocMap->fold(lineClick, _pEditView->isFolded(lineClick));
_smartHighlighter.highlightView(_pEditView);
ScintillaEditView * unfocusView = isFromPrimary ? &_subEditView : &_mainEditView;
_smartHighlighter.highlightView(_pEditView, unfocusView);
} }
else if ((notification->margin == ScintillaEditView::_SC_MARGE_SYBOLE) && !notification->modifiers) else if ((notification->margin == ScintillaEditView::_SC_MARGE_SYBOLE) && !notification->modifiers)
{ {
@ -692,6 +701,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
case SCN_UPDATEUI: case SCN_UPDATEUI:
{ {
NppParameters *nppParam = NppParameters::getInstance(); NppParameters *nppParam = NppParameters::getInstance();
NppGUI & nppGui = const_cast<NppGUI &>(nppParam->getNppGUI());
// replacement for obsolete custom SCN_SCROLLED // replacement for obsolete custom SCN_SCROLLED
if (notification->updated & SC_UPDATE_V_SCROLL) if (notification->updated & SC_UPDATE_V_SCROLL)
@ -705,13 +715,21 @@ BOOL Notepad_plus::notify(SCNotification *notification)
if (nppParam->_isFindReplacing) if (nppParam->_isFindReplacing)
break; break;
if (notification->nmhdr.hwndFrom != _pEditView->getHSelf()) if (notification->nmhdr.hwndFrom != _pEditView->getHSelf()) // notification come from unfocus view - both views ae visible
{
//ScintillaEditView * unfocusView = isFromPrimary ? &_subEditView : &_mainEditView;
if (nppGui._smartHiliteOnAnotherView &&
_pEditView->getCurrentBufferID() != notifyView->getCurrentBufferID())
{
TCHAR selectedText[1024];
_pEditView->getGenericSelectedText(selectedText, sizeof(selectedText)/sizeof(TCHAR), false);
_smartHighlighter.highlightViewWithWord(notifyView, selectedText);
}
break; break;
}
braceMatch(); braceMatch();
NppGUI & nppGui = const_cast<NppGUI &>(nppParam->getNppGUI());
if (nppGui._enableTagsMatchHilite) if (nppGui._enableTagsMatchHilite)
{ {
XmlMatchedTagsHighlighter xmlTagMatchHiliter(_pEditView); XmlMatchedTagsHighlighter xmlTagMatchHiliter(_pEditView);
@ -723,7 +741,10 @@ BOOL Notepad_plus::notify(SCNotification *notification)
if (nppGui._disableSmartHiliteTmp) if (nppGui._disableSmartHiliteTmp)
nppGui._disableSmartHiliteTmp = false; nppGui._disableSmartHiliteTmp = false;
else else
_smartHighlighter.highlightView(notifyView); {
ScintillaEditView * anbotherView = isFromPrimary ? &_subEditView : &_mainEditView;
_smartHighlighter.highlightView(notifyView, anbotherView);
}
} }
updateStatusBar(); updateStatusBar();
@ -799,7 +820,8 @@ BOOL Notepad_plus::notify(SCNotification *notification)
case SCN_ZOOM: case SCN_ZOOM:
{ {
_smartHighlighter.highlightView(notifyView); ScintillaEditView * unfocusView = isFromPrimary ? &_subEditView : &_mainEditView;
_smartHighlighter.highlightView(notifyView, unfocusView);
break; break;
} }

View File

@ -4031,6 +4031,15 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
else if (!lstrcmp(val, TEXT("no"))) else if (!lstrcmp(val, TEXT("no")))
_nppGUI._smartHiliteUseFindSettings = false; _nppGUI._smartHiliteUseFindSettings = false;
} }
val = element->Attribute(TEXT("onAnotherView"));
if (val)
{
if (!lstrcmp(val, TEXT("yes")))
_nppGUI._smartHiliteOnAnotherView = true;
else if (!lstrcmp(val, TEXT("no")))
_nppGUI._smartHiliteOnAnotherView = false;
}
} }
} }
@ -5438,12 +5447,13 @@ void NppParameters::createXmlTreeFromGUIParams()
GUIConfigElement->SetAttribute(TEXT("searchEngineCustom"), _nppGUI._searchEngineCustom); GUIConfigElement->SetAttribute(TEXT("searchEngineCustom"), _nppGUI._searchEngineCustom);
} }
// <GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="yes" useFindSettings="no">yes</GUIConfig> // <GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="yes" useFindSettings="no" onAnotherView="no">yes</GUIConfig>
{ {
TiXmlElement *GUIConfigElement = insertGUIConfigBoolNode(newGUIRoot, TEXT("SmartHighLight"), _nppGUI._enableSmartHilite); TiXmlElement *GUIConfigElement = insertGUIConfigBoolNode(newGUIRoot, TEXT("SmartHighLight"), _nppGUI._enableSmartHilite);
GUIConfigElement->SetAttribute(TEXT("matchCase"), _nppGUI._smartHiliteCaseSensitive ? TEXT("yes") : TEXT("no")); GUIConfigElement->SetAttribute(TEXT("matchCase"), _nppGUI._smartHiliteCaseSensitive ? TEXT("yes") : TEXT("no"));
GUIConfigElement->SetAttribute(TEXT("wholeWordOnly"), _nppGUI._smartHiliteWordOnly ? TEXT("yes") : TEXT("no")); GUIConfigElement->SetAttribute(TEXT("wholeWordOnly"), _nppGUI._smartHiliteWordOnly ? TEXT("yes") : TEXT("no"));
GUIConfigElement->SetAttribute(TEXT("useFindSettings"), _nppGUI._smartHiliteUseFindSettings ? TEXT("yes") : TEXT("no")); GUIConfigElement->SetAttribute(TEXT("useFindSettings"), _nppGUI._smartHiliteUseFindSettings ? TEXT("yes") : TEXT("no"));
GUIConfigElement->SetAttribute(TEXT("onAnotherView"), _nppGUI._smartHiliteOnAnotherView ? TEXT("yes") : TEXT("no"));
} }
// <GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" /> // <GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" />

View File

@ -750,6 +750,7 @@ struct NppGUI final
bool _smartHiliteCaseSensitive = false; bool _smartHiliteCaseSensitive = false;
bool _smartHiliteWordOnly = true; bool _smartHiliteWordOnly = true;
bool _smartHiliteUseFindSettings = false; bool _smartHiliteUseFindSettings = false;
bool _smartHiliteOnAnotherView = false;
bool _disableSmartHiliteTmp = false; bool _disableSmartHiliteTmp = false;
bool _enableTagsMatchHilite = true; bool _enableTagsMatchHilite = true;

View File

@ -1631,14 +1631,18 @@ int FindReplaceDlg::processAll(ProcessOperation op, const FindOption *opt, bool
return processRange(op, findReplaceInfo, pFindersInfo, pOptions, colourStyleID); return processRange(op, findReplaceInfo, pFindersInfo, pOptions, colourStyleID);
} }
int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findReplaceInfo, const FindersInfo * pFindersInfo, const FindOption *opt, int colourStyleID) int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findReplaceInfo, const FindersInfo * pFindersInfo, const FindOption *opt, int colourStyleID, ScintillaEditView *view2Process)
{ {
int nbProcessed = 0; int nbProcessed = 0;
if (!isCreated() && not findReplaceInfo._txt2find) if (!isCreated() && not findReplaceInfo._txt2find)
return nbProcessed; return nbProcessed;
if ((op == ProcessReplaceAll) && (*_ppEditView)->getCurrentBuffer()->isReadOnly()) ScintillaEditView *pEditView = *_ppEditView;
if (view2Process)
pEditView = view2Process;
if ((op == ProcessReplaceAll) && pEditView->getCurrentBuffer()->isReadOnly())
return nbProcessed; return nbProcessed;
if (findReplaceInfo._startRange == findReplaceInfo._endRange) if (findReplaceInfo._startRange == findReplaceInfo._endRange)
@ -1710,9 +1714,9 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
if (op == ProcessMarkAll && colourStyleID == -1) //if marking, check if purging is needed if (op == ProcessMarkAll && colourStyleID == -1) //if marking, check if purging is needed
{ {
if (_env->_doPurge) { if (_env->_doPurge) {
(*_ppEditView)->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE); pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE);
if (_env->_doMarkLine) if (_env->_doMarkLine)
(*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_BOOKMARK); pEditView->execute(SCI_MARKERDELETEALL, MARK_BOOKMARK);
} }
} }
@ -1720,20 +1724,20 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
int targetEnd = 0; int targetEnd = 0;
//Initial range for searching //Initial range for searching
(*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); pEditView->execute(SCI_SETSEARCHFLAGS, flags);
bool findAllFileNameAdded = false; bool findAllFileNameAdded = false;
while (targetStart != -1 && targetStart != -2) while (targetStart != -1 && targetStart != -2)
{ {
targetStart = (*_ppEditView)->searchInTarget(pTextFind, stringSizeFind, findReplaceInfo._startRange, findReplaceInfo._endRange); targetStart = pEditView->searchInTarget(pTextFind, stringSizeFind, findReplaceInfo._startRange, findReplaceInfo._endRange);
// If we've not found anything, just break out of the loop // If we've not found anything, just break out of the loop
if (targetStart == -1 || targetStart == -2) if (targetStart == -1 || targetStart == -2)
break; break;
targetEnd = int((*_ppEditView)->execute(SCI_GETTARGETEND)); targetEnd = int(pEditView->execute(SCI_GETTARGETEND));
if (targetEnd > findReplaceInfo._endRange) { //we found a result but outside our range, therefore do not process it if (targetEnd > findReplaceInfo._endRange) { //we found a result but outside our range, therefore do not process it
break; break;
@ -1757,9 +1761,9 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
findAllFileNameAdded = true; findAllFileNameAdded = true;
} }
auto lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart); auto lineNumber = pEditView->execute(SCI_LINEFROMPOSITION, targetStart);
int lend = static_cast<int32_t>((*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber)); int lend = static_cast<int32_t>(pEditView->execute(SCI_GETLINEENDPOSITION, lineNumber));
int lstart = static_cast<int32_t>((*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber)); int lstart = static_cast<int32_t>(pEditView->execute(SCI_POSITIONFROMLINE, lineNumber));
int nbChar = lend - lstart; int nbChar = lend - lstart;
// use the static buffer // use the static buffer
@ -1771,7 +1775,7 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
int start_mark = targetStart - lstart; int start_mark = targetStart - lstart;
int end_mark = targetEnd - lstart; int end_mark = targetEnd - lstart;
(*_ppEditView)->getGenericText(lineBuf, 1024, lstart, lend, &start_mark, &end_mark); pEditView->getGenericText(lineBuf, 1024, lstart, lend, &start_mark, &end_mark);
generic_string line = lineBuf; generic_string line = lineBuf;
line += TEXT("\r\n"); line += TEXT("\r\n");
@ -1796,9 +1800,9 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
findAllFileNameAdded = true; findAllFileNameAdded = true;
} }
auto lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart); auto lineNumber = pEditView->execute(SCI_LINEFROMPOSITION, targetStart);
int lend = static_cast<int32_t>((*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber)); int lend = static_cast<int32_t>(pEditView->execute(SCI_GETLINEENDPOSITION, lineNumber));
int lstart = static_cast<int32_t>((*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber)); int lstart = static_cast<int32_t>(pEditView->execute(SCI_POSITIONFROMLINE, lineNumber));
int nbChar = lend - lstart; int nbChar = lend - lstart;
// use the static buffer // use the static buffer
@ -1810,7 +1814,7 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
int start_mark = targetStart - lstart; int start_mark = targetStart - lstart;
int end_mark = targetEnd - lstart; int end_mark = targetEnd - lstart;
(*_ppEditView)->getGenericText(lineBuf, 1024, lstart, lend, &start_mark, &end_mark); pEditView->getGenericText(lineBuf, 1024, lstart, lend, &start_mark, &end_mark);
generic_string line = lineBuf; generic_string line = lineBuf;
line += TEXT("\r\n"); line += TEXT("\r\n");
@ -1834,9 +1838,9 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
{ {
int replacedLength; int replacedLength;
if (isRegExp) if (isRegExp)
replacedLength = (*_ppEditView)->replaceTargetRegExMode(pTextReplace); replacedLength = pEditView->replaceTargetRegExMode(pTextReplace);
else else
replacedLength = (*_ppEditView)->replaceTarget(pTextReplace); replacedLength = pEditView->replaceTarget(pTextReplace);
replaceDelta = replacedLength - foundTextLen; replaceDelta = replacedLength - foundTextLen;
break; break;
@ -1850,17 +1854,17 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
// on the same line would simply not be shown. This may have been fixed in later version of Scintilla. // on the same line would simply not be shown. This may have been fixed in later version of Scintilla.
if (foundTextLen > 0) if (foundTextLen > 0)
{ {
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE); pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
} }
if (_env->_doMarkLine) if (_env->_doMarkLine)
{ {
auto lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart); auto lineNumber = pEditView->execute(SCI_LINEFROMPOSITION, targetStart);
auto state = (*_ppEditView)->execute(SCI_MARKERGET, lineNumber); auto state = pEditView->execute(SCI_MARKERGET, lineNumber);
if (!(state & (1 << MARK_BOOKMARK))) if (!(state & (1 << MARK_BOOKMARK)))
(*_ppEditView)->execute(SCI_MARKERADD, lineNumber, MARK_BOOKMARK); pEditView->execute(SCI_MARKERADD, lineNumber, MARK_BOOKMARK);
} }
break; break;
} }
@ -1870,8 +1874,8 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
// See comment by ProcessMarkAll // See comment by ProcessMarkAll
if (foundTextLen > 0) if (foundTextLen > 0)
{ {
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, colourStyleID); pEditView->execute(SCI_SETINDICATORCURRENT, colourStyleID);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
} }
break; break;
} }
@ -1881,8 +1885,8 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
// See comment by ProcessMarkAll // See comment by ProcessMarkAll
if (foundTextLen > 0) if (foundTextLen > 0)
{ {
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_SMART); pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_SMART);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
} }
break; break;
} }
@ -1892,8 +1896,8 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
// See comment by ProcessMarkAll // See comment by ProcessMarkAll
if (foundTextLen > 0) if (foundTextLen > 0)
{ {
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_INC); pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_INC);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
} }
break; break;
} }

View File

@ -255,7 +255,7 @@ public :
int processAll(ProcessOperation op, const FindOption *opt, bool isEntire = false, const FindersInfo *pFindersInfo = nullptr, int colourStyleID = -1); int processAll(ProcessOperation op, const FindOption *opt, bool isEntire = false, const FindersInfo *pFindersInfo = nullptr, int colourStyleID = -1);
int processRange(ProcessOperation op, FindReplaceInfo & findReplaceInfo, const FindersInfo *pFindersInfo, const FindOption *opt = NULL, int colourStyleID = -1); int processRange(ProcessOperation op, FindReplaceInfo & findReplaceInfo, const FindersInfo *pFindersInfo, const FindOption *opt = nullptr, int colourStyleID = -1, ScintillaEditView *view2Process = nullptr);
void replaceAllInOpenedDocs(); void replaceAllInOpenedDocs();
void findAllIn(InWhat op); void findAllIn(InWhat op);

View File

@ -37,20 +37,97 @@ SmartHighlighter::SmartHighlighter(FindReplaceDlg * pFRDlg)
//Nothing to do //Nothing to do
} }
void SmartHighlighter::highlightView(ScintillaEditView * pHighlightView) void SmartHighlighter::highlightViewWithWord(ScintillaEditView * pHighlightView, const generic_string & word2Hilite)
{
// save target locations for other search functions
auto originalStartPos = pHighlightView->execute(SCI_GETTARGETSTART);
auto originalEndPos = pHighlightView->execute(SCI_GETTARGETEND);
// Get the range of text visible and highlight everything in it
auto firstLine = static_cast<int>(pHighlightView->execute(SCI_GETFIRSTVISIBLELINE));
auto nbLineOnScreen = pHighlightView->execute(SCI_LINESONSCREEN);
auto nrLines = min(nbLineOnScreen, MAXLINEHIGHLIGHT) + 1;
auto lastLine = firstLine + nrLines;
int startPos = 0;
int endPos = 0;
auto currentLine = firstLine;
int prevDocLineChecked = -1; //invalid start
// Determine mode for SmartHighlighting
bool isWordOnly = true;
bool isCaseSensentive = true;
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
if (nppGUI._smartHiliteUseFindSettings)
{
// fetch find dialog's setting
NppParameters *nppParams = NppParameters::getInstance();
FindHistory &findHistory = nppParams->getFindHistory();
isWordOnly = findHistory._isMatchWord;
isCaseSensentive = findHistory._isMatchCase;
}
else
{
isWordOnly = nppGUI._smartHiliteWordOnly;
isCaseSensentive = nppGUI._smartHiliteCaseSensitive;
}
FindOption fo;
fo._isMatchCase = isCaseSensentive;
fo._isWholeWord = isWordOnly;
FindReplaceInfo frInfo;
frInfo._txt2find = word2Hilite.c_str();
for (; currentLine < lastLine; ++currentLine)
{
int docLine = static_cast<int>(pHighlightView->execute(SCI_DOCLINEFROMVISIBLE, currentLine));
if (docLine == prevDocLineChecked)
continue; //still on same line (wordwrap)
prevDocLineChecked = docLine;
startPos = static_cast<int>(pHighlightView->execute(SCI_POSITIONFROMLINE, docLine));
endPos = static_cast<int>(pHighlightView->execute(SCI_POSITIONFROMLINE, docLine + 1));
frInfo._startRange = startPos;
frInfo._endRange = endPos;
if (endPos == -1)
{ //past EOF
frInfo._endRange = pHighlightView->getCurrentDocLen() - 1;
_pFRDlg->processRange(ProcessMarkAll_2, frInfo, NULL, &fo, -1, pHighlightView);
break;
}
else
{
_pFRDlg->processRange(ProcessMarkAll_2, frInfo, NULL, &fo, -1, pHighlightView);
}
}
// restore the original targets to avoid conflicts with the search/replace functions
pHighlightView->execute(SCI_SETTARGETRANGE, originalStartPos, originalEndPos);
}
void SmartHighlighter::highlightView(ScintillaEditView * pHighlightView, ScintillaEditView * unfocusView)
{ {
// Clear marks // Clear marks
pHighlightView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART); pHighlightView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART);
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
// If nothing selected, dont mark anything // If nothing selected, dont mark anything
if (pHighlightView->execute(SCI_GETSELECTIONEMPTY) == 1) if (pHighlightView->execute(SCI_GETSELECTIONEMPTY) == 1)
{
if (nppGUI._smartHiliteOnAnotherView && unfocusView && unfocusView->isVisible()
&& unfocusView->getCurrentBufferID() != pHighlightView->getCurrentBufferID())
{
unfocusView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART);
}
return; return;
}
auto curPos = pHighlightView->execute(SCI_GETCURRENTPOS); auto curPos = pHighlightView->execute(SCI_GETCURRENTPOS);
auto range = pHighlightView->getSelection(); auto range = pHighlightView->getSelection();
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
// Determine mode for SmartHighlighting // Determine mode for SmartHighlighting
bool isWordOnly = true; bool isWordOnly = true;
bool isCaseSensentive = true; bool isCaseSensentive = true;
@ -84,57 +161,19 @@ void SmartHighlighter::highlightView(ScintillaEditView * pHighlightView)
char * text2Find = new char[textlen]; char * text2Find = new char[textlen];
pHighlightView->getSelectedText(text2Find, textlen, false); //do not expand selection (false) pHighlightView->getSelectedText(text2Find, textlen, false); //do not expand selection (false)
// save target locations for other search functions
auto originalStartPos = pHighlightView->execute(SCI_GETTARGETSTART);
auto originalEndPos = pHighlightView->execute(SCI_GETTARGETEND);
// Get the range of text visible and highlight everything in it
auto firstLine = static_cast<int>(pHighlightView->execute(SCI_GETFIRSTVISIBLELINE));
auto nbLineOnScreen = pHighlightView->execute(SCI_LINESONSCREEN);
auto nrLines = min(nbLineOnScreen, MAXLINEHIGHLIGHT ) + 1;
auto lastLine = firstLine + nrLines;
int startPos = 0;
int endPos = 0;
auto currentLine = firstLine;
int prevDocLineChecked = -1; //invalid start
FindOption fo;
fo._isMatchCase = isCaseSensentive;
fo._isWholeWord = isWordOnly;
const TCHAR * searchText = NULL;
WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
UINT cp = static_cast<UINT>(pHighlightView->execute(SCI_GETCODEPAGE)); UINT cp = static_cast<UINT>(pHighlightView->execute(SCI_GETCODEPAGE));
const TCHAR * text2FindW = wmc->char2wchar(text2Find, cp); const TCHAR * text2FindW = wmc->char2wchar(text2Find, cp);
searchText = text2FindW;
for(; currentLine < lastLine; ++currentLine) highlightViewWithWord(pHighlightView, text2FindW);
if (nppGUI._smartHiliteOnAnotherView && unfocusView && unfocusView->isVisible()
&& unfocusView->getCurrentBufferID() != pHighlightView->getCurrentBufferID())
{ {
int docLine = static_cast<int>(pHighlightView->execute(SCI_DOCLINEFROMVISIBLE, currentLine)); // Clear marks
if (docLine == prevDocLineChecked) unfocusView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART);
continue; //still on same line (wordwrap) highlightViewWithWord(unfocusView, text2FindW);
prevDocLineChecked = docLine;
startPos = static_cast<int>(pHighlightView->execute(SCI_POSITIONFROMLINE, docLine));
endPos = static_cast<int>(pHighlightView->execute(SCI_POSITIONFROMLINE, docLine + 1));
FindReplaceInfo frInfo;
frInfo._txt2find = searchText;
frInfo._startRange = startPos;
frInfo._endRange = endPos;
if (endPos == -1)
{ //past EOF
frInfo._endRange = pHighlightView->getCurrentDocLen() - 1;
_pFRDlg->processRange(ProcessMarkAll_2, frInfo, NULL, &fo);
break;
}
else
{
_pFRDlg->processRange(ProcessMarkAll_2, frInfo, NULL, &fo);
}
} }
// restore the original targets to avoid conflicts with the search/replace functions
pHighlightView->execute(SCI_SETTARGETRANGE, originalStartPos, originalEndPos);
delete[] text2Find; delete[] text2Find;
} }

View File

@ -28,13 +28,17 @@
#ifndef SMARTHIGHLIGHTER_H #ifndef SMARTHIGHLIGHTER_H
#define SMARTHIGHLIGHTER_H #define SMARTHIGHLIGHTER_H
#include "Common.h"
class ScintillaEditView; class ScintillaEditView;
class FindReplaceDlg; class FindReplaceDlg;
class SmartHighlighter { class SmartHighlighter {
public: public:
explicit SmartHighlighter(FindReplaceDlg * pFRDlg); explicit SmartHighlighter(FindReplaceDlg * pFRDlg);
void highlightView(ScintillaEditView * pHighlightView); void highlightView(ScintillaEditView * pHighlightView, ScintillaEditView * unfocusView);
void highlightViewWithWord(ScintillaEditView * pHighlightView, const generic_string & word2Hilite);
private: private:
FindReplaceDlg * _pFRDlg; FindReplaceDlg * _pFRDlg;
}; };

View File

@ -229,11 +229,12 @@ IDD_PREFERENCE_HILITE_BOX DIALOGEX 0, 0, 455, 185
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
FONT 8, "MS Shell Dlg", 0, 0, 0x1 FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN BEGIN
GROUPBOX "Smart Highlighting",IDC_SMARTHILITING_STATIC,147,21,155,67,BS_CENTER GROUPBOX "Smart Highlighting",IDC_SMARTHILITING_STATIC,147,21,155,81,BS_CENTER
CONTROL "Enable",IDC_CHECK_ENABLSMARTHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,31,142,10 CONTROL "Enable",IDC_CHECK_ENABLSMARTHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,31,142,10
CONTROL "Match case",IDC_CHECK_SMARTHILITECASESENSITIVE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,45,142,10 CONTROL "Match case",IDC_CHECK_SMARTHILITECASESENSITIVE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,45,142,10
CONTROL "Match whole word only",IDC_CHECK_SMARTHILITEWHOLEWORDONLY, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,58,142,10 CONTROL "Match whole word only",IDC_CHECK_SMARTHILITEWHOLEWORDONLY, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,58,142,10
CONTROL "Use Find dialog settings",IDC_CHECK_SMARTHILITEUSEFINDSETTINGS, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,72,142,10 CONTROL "Use Find dialog settings",IDC_CHECK_SMARTHILITEUSEFINDSETTINGS, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,72,142,10
CONTROL "Highlight another view",IDC_CHECK_SMARTHILITEANOTHERRVIEW, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,86,142,10
GROUPBOX "Highlight Matching Tags",IDC_TAGMATCHEDHILITE_STATIC,147,110,155,55,BS_CENTER GROUPBOX "Highlight Matching Tags",IDC_TAGMATCHEDHILITE_STATIC,147,110,155,55,BS_CENTER
CONTROL "Enable",IDC_CHECK_ENABLTAGSMATCHHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,120,140,10 CONTROL "Enable",IDC_CHECK_ENABLTAGSMATCHHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,155,120,140,10

View File

@ -1920,6 +1920,7 @@ INT_PTR CALLBACK Highlighting::run_dlgProc(UINT message, WPARAM wParam, LPARAM/*
::SendDlgItemMessage(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE, BM_SETCHECK, nppGUI._smartHiliteCaseSensitive, 0); ::SendDlgItemMessage(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE, BM_SETCHECK, nppGUI._smartHiliteCaseSensitive, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_SMARTHILITEWHOLEWORDONLY, BM_SETCHECK, nppGUI._smartHiliteWordOnly, 0); ::SendDlgItemMessage(_hSelf, IDC_CHECK_SMARTHILITEWHOLEWORDONLY, BM_SETCHECK, nppGUI._smartHiliteWordOnly, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_SMARTHILITEUSEFINDSETTINGS, BM_SETCHECK, nppGUI._smartHiliteUseFindSettings, 0); ::SendDlgItemMessage(_hSelf, IDC_CHECK_SMARTHILITEUSEFINDSETTINGS, BM_SETCHECK, nppGUI._smartHiliteUseFindSettings, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_SMARTHILITEANOTHERRVIEW, BM_SETCHECK, nppGUI._smartHiliteOnAnotherView, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLTAGSMATCHHILITE, BM_SETCHECK, nppGUI._enableTagsMatchHilite, 0); ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLTAGSMATCHHILITE, BM_SETCHECK, nppGUI._enableTagsMatchHilite, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLTAGATTRHILITE, BM_SETCHECK, nppGUI._enableTagAttrsHilite, 0); ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLTAGATTRHILITE, BM_SETCHECK, nppGUI._enableTagAttrsHilite, 0);
@ -1931,6 +1932,7 @@ INT_PTR CALLBACK Highlighting::run_dlgProc(UINT message, WPARAM wParam, LPARAM/*
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE), nppGUI._enableSmartHilite); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEWHOLEWORDONLY), nppGUI._enableSmartHilite); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEWHOLEWORDONLY), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEUSEFINDSETTINGS), nppGUI._enableSmartHilite); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEUSEFINDSETTINGS), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEANOTHERRVIEW), nppGUI._enableSmartHilite);
ETDTProc enableDlgTheme = reinterpret_cast<ETDTProc>(pNppParam->getEnableThemeDlgTexture()); ETDTProc enableDlgTheme = reinterpret_cast<ETDTProc>(pNppParam->getEnableThemeDlgTexture());
if (enableDlgTheme) if (enableDlgTheme)
@ -1954,6 +1956,7 @@ INT_PTR CALLBACK Highlighting::run_dlgProc(UINT message, WPARAM wParam, LPARAM/*
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE), nppGUI._enableSmartHilite); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEWHOLEWORDONLY), nppGUI._enableSmartHilite); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEWHOLEWORDONLY), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEUSEFINDSETTINGS), nppGUI._enableSmartHilite); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEUSEFINDSETTINGS), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEANOTHERRVIEW), nppGUI._enableSmartHilite);
HWND grandParent = ::GetParent(_hParent); HWND grandParent = ::GetParent(_hParent);
::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0); ::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0);
return TRUE; return TRUE;
@ -1997,6 +2000,14 @@ INT_PTR CALLBACK Highlighting::run_dlgProc(UINT message, WPARAM wParam, LPARAM/*
::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0); ::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0);
return TRUE; return TRUE;
} }
case IDC_CHECK_SMARTHILITEANOTHERRVIEW:
{
nppGUI._smartHiliteOnAnotherView = isCheckedOrNot(IDC_CHECK_SMARTHILITEANOTHERRVIEW);
HWND grandParent = ::GetParent(_hParent);
::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0);
return TRUE;
}
case IDC_CHECK_ENABLTAGSMATCHHILITE: case IDC_CHECK_ENABLTAGSMATCHHILITE:
{ {

View File

@ -186,6 +186,7 @@
#define IDC_WORKSPACEFILEEXT_STATIC (IDD_PREFERENCE_SETTING_BOX + 37) #define IDC_WORKSPACEFILEEXT_STATIC (IDD_PREFERENCE_SETTING_BOX + 37)
#define IDC_CHECK_SMARTHILITEWHOLEWORDONLY (IDD_PREFERENCE_SETTING_BOX + 38) #define IDC_CHECK_SMARTHILITEWHOLEWORDONLY (IDD_PREFERENCE_SETTING_BOX + 38)
#define IDC_CHECK_SMARTHILITEUSEFINDSETTINGS (IDD_PREFERENCE_SETTING_BOX + 39) #define IDC_CHECK_SMARTHILITEUSEFINDSETTINGS (IDD_PREFERENCE_SETTING_BOX + 39)
#define IDC_CHECK_SMARTHILITEANOTHERRVIEW (IDD_PREFERENCE_SETTING_BOX + 40)
//-- xFileEditViewHistoryParameterGUI: Additional Checkbox for enabling the history for restoring the edit view per file. //-- xFileEditViewHistoryParameterGUI: Additional Checkbox for enabling the history for restoring the edit view per file.
#define IDC_CHECK_REMEMBEREDITVIEWPERFILE (IDD_PREFERENCE_SETTING_BOX + 41) #define IDC_CHECK_REMEMBEREDITVIEWPERFILE (IDD_PREFERENCE_SETTING_BOX + 41)