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="6338" name="僅符合整個單字"/>
<Item id="6339" name="使用搜尋對話框的設定"/>
<Item id="6340" name="高亮度延伸至另一視窗"/>
<Item id="6329" name="高亮度顯示相契合的 xml/html 標示 (tag)"/>
<Item id="6327" name="啟動"/>
<Item id="6328" name="高亮度顯示屬性 (tag attributes)"/>

View File

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

View File

@ -700,6 +700,7 @@
<Item id="6332" name="Case sensible"/>
<Item id="6338" name="Mot entier uniquement"/>
<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="6327" name="Activer"/>
<Item id="6328" name="Les attributs de tag"/>

View File

@ -37,15 +37,21 @@
using namespace std;
// Only for 2 main Scintilla editors
BOOL Notepad_plus::notify(SCNotification *notification)
{
//Important, keep track of which element generated the message
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);
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;
TBHDR * tabNotification = (TBHDR*) notification;
switch (notification->nmhdr.code)
@ -485,7 +491,10 @@ BOOL Notepad_plus::notify(SCNotification *notification)
_pEditView->marginClick(notification->position, notification->modifiers);
if (_pDocMap)
_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)
{
@ -692,6 +701,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
case SCN_UPDATEUI:
{
NppParameters *nppParam = NppParameters::getInstance();
NppGUI & nppGui = const_cast<NppGUI &>(nppParam->getNppGUI());
// replacement for obsolete custom SCN_SCROLLED
if (notification->updated & SC_UPDATE_V_SCROLL)
@ -705,13 +715,21 @@ BOOL Notepad_plus::notify(SCNotification *notification)
if (nppParam->_isFindReplacing)
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;
}
braceMatch();
NppGUI & nppGui = const_cast<NppGUI &>(nppParam->getNppGUI());
if (nppGui._enableTagsMatchHilite)
{
XmlMatchedTagsHighlighter xmlTagMatchHiliter(_pEditView);
@ -723,7 +741,10 @@ BOOL Notepad_plus::notify(SCNotification *notification)
if (nppGui._disableSmartHiliteTmp)
nppGui._disableSmartHiliteTmp = false;
else
_smartHighlighter.highlightView(notifyView);
{
ScintillaEditView * anbotherView = isFromPrimary ? &_subEditView : &_mainEditView;
_smartHighlighter.highlightView(notifyView, anbotherView);
}
}
updateStatusBar();
@ -799,7 +820,8 @@ BOOL Notepad_plus::notify(SCNotification *notification)
case SCN_ZOOM:
{
_smartHighlighter.highlightView(notifyView);
ScintillaEditView * unfocusView = isFromPrimary ? &_subEditView : &_mainEditView;
_smartHighlighter.highlightView(notifyView, unfocusView);
break;
}

View File

@ -4031,6 +4031,15 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
else if (!lstrcmp(val, TEXT("no")))
_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);
}
// <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);
GUIConfigElement->SetAttribute(TEXT("matchCase"), _nppGUI._smartHiliteCaseSensitive ? 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("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" />

View File

@ -750,6 +750,7 @@ struct NppGUI final
bool _smartHiliteCaseSensitive = false;
bool _smartHiliteWordOnly = true;
bool _smartHiliteUseFindSettings = false;
bool _smartHiliteOnAnotherView = false;
bool _disableSmartHiliteTmp = false;
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);
}
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;
if (!isCreated() && not findReplaceInfo._txt2find)
return nbProcessed;
if ((op == ProcessReplaceAll) && (*_ppEditView)->getCurrentBuffer()->isReadOnly())
ScintillaEditView *pEditView = *_ppEditView;
if (view2Process)
pEditView = view2Process;
if ((op == ProcessReplaceAll) && pEditView->getCurrentBuffer()->isReadOnly())
return nbProcessed;
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 (_env->_doPurge) {
(*_ppEditView)->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE);
pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE);
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;
//Initial range for searching
(*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags);
pEditView->execute(SCI_SETSEARCHFLAGS, flags);
bool findAllFileNameAdded = false;
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 (targetStart == -1 || targetStart == -2)
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
break;
@ -1757,9 +1761,9 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
findAllFileNameAdded = true;
}
auto lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart);
int lend = static_cast<int32_t>((*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber));
int lstart = static_cast<int32_t>((*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber));
auto lineNumber = pEditView->execute(SCI_LINEFROMPOSITION, targetStart);
int lend = static_cast<int32_t>(pEditView->execute(SCI_GETLINEENDPOSITION, lineNumber));
int lstart = static_cast<int32_t>(pEditView->execute(SCI_POSITIONFROMLINE, lineNumber));
int nbChar = lend - lstart;
// use the static buffer
@ -1771,7 +1775,7 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
int start_mark = targetStart - 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;
line += TEXT("\r\n");
@ -1796,9 +1800,9 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
findAllFileNameAdded = true;
}
auto lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart);
int lend = static_cast<int32_t>((*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber));
int lstart = static_cast<int32_t>((*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber));
auto lineNumber = pEditView->execute(SCI_LINEFROMPOSITION, targetStart);
int lend = static_cast<int32_t>(pEditView->execute(SCI_GETLINEENDPOSITION, lineNumber));
int lstart = static_cast<int32_t>(pEditView->execute(SCI_POSITIONFROMLINE, lineNumber));
int nbChar = lend - lstart;
// use the static buffer
@ -1810,7 +1814,7 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
int start_mark = targetStart - 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;
line += TEXT("\r\n");
@ -1834,9 +1838,9 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
{
int replacedLength;
if (isRegExp)
replacedLength = (*_ppEditView)->replaceTargetRegExMode(pTextReplace);
replacedLength = pEditView->replaceTargetRegExMode(pTextReplace);
else
replacedLength = (*_ppEditView)->replaceTarget(pTextReplace);
replacedLength = pEditView->replaceTarget(pTextReplace);
replaceDelta = replacedLength - foundTextLen;
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.
if (foundTextLen > 0)
{
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE);
pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
}
if (_env->_doMarkLine)
{
auto lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart);
auto state = (*_ppEditView)->execute(SCI_MARKERGET, lineNumber);
auto lineNumber = pEditView->execute(SCI_LINEFROMPOSITION, targetStart);
auto state = pEditView->execute(SCI_MARKERGET, lineNumber);
if (!(state & (1 << MARK_BOOKMARK)))
(*_ppEditView)->execute(SCI_MARKERADD, lineNumber, MARK_BOOKMARK);
pEditView->execute(SCI_MARKERADD, lineNumber, MARK_BOOKMARK);
}
break;
}
@ -1870,8 +1874,8 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
// See comment by ProcessMarkAll
if (foundTextLen > 0)
{
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, colourStyleID);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
pEditView->execute(SCI_SETINDICATORCURRENT, colourStyleID);
pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
}
break;
}
@ -1881,8 +1885,8 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
// See comment by ProcessMarkAll
if (foundTextLen > 0)
{
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_SMART);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_SMART);
pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
}
break;
}
@ -1892,8 +1896,8 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
// See comment by ProcessMarkAll
if (foundTextLen > 0)
{
(*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_INC);
(*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_INC);
pEditView->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen);
}
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 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 findAllIn(InWhat op);

View File

@ -37,20 +37,97 @@ SmartHighlighter::SmartHighlighter(FindReplaceDlg * pFRDlg)
//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
pHighlightView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART);
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
// If nothing selected, dont mark anything
if (pHighlightView->execute(SCI_GETSELECTIONEMPTY) == 1)
{
if (nppGUI._smartHiliteOnAnotherView && unfocusView && unfocusView->isVisible()
&& unfocusView->getCurrentBufferID() != pHighlightView->getCurrentBufferID())
{
unfocusView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART);
}
return;
}
auto curPos = pHighlightView->execute(SCI_GETCURRENTPOS);
auto range = pHighlightView->getSelection();
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
// Determine mode for SmartHighlighting
bool isWordOnly = true;
bool isCaseSensentive = true;
@ -84,57 +161,19 @@ void SmartHighlighter::highlightView(ScintillaEditView * pHighlightView)
char * text2Find = new char[textlen];
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();
UINT cp = static_cast<UINT>(pHighlightView->execute(SCI_GETCODEPAGE));
const TCHAR * text2FindW = wmc->char2wchar(text2Find, cp);
searchText = text2FindW;
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));
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);
}
}
highlightViewWithWord(pHighlightView, text2FindW);
// restore the original targets to avoid conflicts with the search/replace functions
pHighlightView->execute(SCI_SETTARGETRANGE, originalStartPos, originalEndPos);
if (nppGUI._smartHiliteOnAnotherView && unfocusView && unfocusView->isVisible()
&& unfocusView->getCurrentBufferID() != pHighlightView->getCurrentBufferID())
{
// Clear marks
unfocusView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART);
highlightViewWithWord(unfocusView, text2FindW);
}
delete[] text2Find;
}

View File

@ -28,13 +28,17 @@
#ifndef SMARTHIGHLIGHTER_H
#define SMARTHIGHLIGHTER_H
#include "Common.h"
class ScintillaEditView;
class FindReplaceDlg;
class SmartHighlighter {
public:
explicit SmartHighlighter(FindReplaceDlg * pFRDlg);
void highlightView(ScintillaEditView * pHighlightView);
void highlightView(ScintillaEditView * pHighlightView, ScintillaEditView * unfocusView);
void highlightViewWithWord(ScintillaEditView * pHighlightView, const generic_string & word2Hilite);
private:
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
FONT 8, "MS Shell Dlg", 0, 0, 0x1
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 "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 "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
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_SMARTHILITEWHOLEWORDONLY, BM_SETCHECK, nppGUI._smartHiliteWordOnly, 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_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_SMARTHILITEWHOLEWORDONLY), 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());
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_SMARTHILITEWHOLEWORDONLY), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEUSEFINDSETTINGS), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITEANOTHERRVIEW), nppGUI._enableSmartHilite);
HWND grandParent = ::GetParent(_hParent);
::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0);
return TRUE;
@ -1997,6 +2000,14 @@ INT_PTR CALLBACK Highlighting::run_dlgProc(UINT message, WPARAM wParam, LPARAM/*
::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0);
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:
{

View File

@ -186,6 +186,7 @@
#define IDC_WORKSPACEFILEEXT_STATIC (IDD_PREFERENCE_SETTING_BOX + 37)
#define IDC_CHECK_SMARTHILITEWHOLEWORDONLY (IDD_PREFERENCE_SETTING_BOX + 38)
#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.
#define IDC_CHECK_REMEMBEREDITVIEWPERFILE (IDD_PREFERENCE_SETTING_BOX + 41)