Enhance Smart Highlighting feature

SmartHighlighting now highlights based on 3 modes:
1. whole word
2. any selection
3. same as find dialog setting.

Closes #2262
This commit is contained in:
Tiax 2016-09-09 19:31:46 +02:00 committed by Don Ho
parent 5f8ba93b78
commit d63170852e
6 changed files with 176 additions and 14 deletions

View File

@ -4032,6 +4032,31 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
}
}
else if (!lstrcmp(nm, TEXT("SmartHighLightMode")))
{
TiXmlNode *n = childNode->FirstChild();
if (n)
{
const TCHAR* val = n->Value();
if (val)
{
if (!lstrcmp(val, TEXT("1")))
{
_nppGUI._smartHiliteMode = NppGUI::SmartHiliteMode::anySelection;
}
else if (!lstrcmp(val, TEXT("2")))
{
_nppGUI._smartHiliteMode = NppGUI::SmartHiliteMode::findDialog;
}
else
{
_nppGUI._smartHiliteMode = NppGUI::SmartHiliteMode::wordOnly;
}
}
}
}
else if (!lstrcmp(nm, TEXT("TagsMatchHighLight")))
{
TiXmlNode *n = childNode->FirstChild();
@ -5077,6 +5102,7 @@ bool NppParameters::writeGUIParams()
bool menuBarExist = false;
bool smartHighLightExist = false;
bool smartHighLightCaseSensitiveExist = false;
bool smartHighLightModeExists = false;
bool tagsMatchHighLightExist = false;
bool caretExist = false;
bool ScintillaGlobalSettingsExist = false;
@ -5286,7 +5312,37 @@ bool NppParameters::writeGUIParams()
else
childNode->InsertEndChild(TiXmlText(pStr));
}
else if (!lstrcmp(nm, TEXT("SmartHighLightMode")))
{
smartHighLightModeExists = true;
const TCHAR *pStr;
switch (_nppGUI._smartHiliteMode)
{
case NppGUI::SmartHiliteMode::anySelection:
pStr = TEXT("1");
break;
case NppGUI::SmartHiliteMode::findDialog:
pStr = TEXT("2");
break;
default: // NppGUI::SmartHiliteMode::wordOnly
pStr = TEXT("0");
break;
}
TiXmlNode *n = childNode->FirstChild();
if (n)
{
n->SetValue(pStr);
}
else
{
childNode->InsertEndChild(TiXmlText(pStr));
}
}
else if (!lstrcmp(nm, TEXT("TagsMatchHighLight")))
{
tagsMatchHighLightExist = true;
@ -5612,6 +5668,25 @@ bool NppParameters::writeGUIParams()
{
insertGUIConfigBoolNode(GUIRoot, TEXT("SmartHighLightCaseSensitive"), _nppGUI._smartHiliteCaseSensitive);
}
if (!smartHighLightModeExists)
{
const TCHAR *pStr = TEXT("0");
if (_nppGUI._smartHiliteMode == 1)
{
pStr = TEXT("1");
}
else if (_nppGUI._smartHiliteMode == 2)
{
pStr = TEXT("2");
}
TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement();
GUIConfigElement->SetAttribute(TEXT("name"), TEXT("SmartHighLightMode"));
GUIConfigElement->InsertEndChild(TiXmlText(pStr));
}
if (!tagsMatchHighLightExist)
{
TiXmlElement * ele = insertGUIConfigBoolNode(GUIRoot, TEXT("TagsMatchHighLight"), _nppGUI._enableTagsMatchHilite);

View File

@ -747,6 +747,10 @@ struct NppGUI final
bool _maitainIndent = true;
bool _enableSmartHilite = true;
bool _smartHiliteCaseSensitive = false;
enum SmartHiliteMode { wordOnly = 0, anySelection = 1, findDialog = 2 };
SmartHiliteMode _smartHiliteMode = SmartHiliteMode::wordOnly;
bool _disableSmartHiliteTmp = false;
bool _enableTagsMatchHilite = true;
bool _enableTagAttrsHilite = true;

View File

@ -47,13 +47,40 @@ void SmartHighlighter::highlightView(ScintillaEditView * pHighlightView)
return;
auto curPos = pHighlightView->execute(SCI_GETCURRENTPOS);
auto wordStart = pHighlightView->execute(SCI_WORDSTARTPOSITION, curPos, true);
auto wordEnd = pHighlightView->execute(SCI_WORDENDPOSITION, wordStart, true);
auto range = pHighlightView->getSelection();
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
// Determine mode for SmartHighlighting
NppGUI::SmartHiliteMode mode = nppGUI._smartHiliteMode;
bool wordOnly;
if (mode == NppGUI::SmartHiliteMode::wordOnly)
{
wordOnly = true;
}
else if (mode == NppGUI::SmartHiliteMode::findDialog)
{
// fetch find dialog's setting
NppParameters *nppParams = NppParameters::getInstance();
FindHistory &findHistory = nppParams->getFindHistory();
wordOnly = findHistory._isMatchWord;
}
else
{
wordOnly = false;
}
// additional checks for wordOnly mode
// Make sure the "word" positions match the current selection
if (wordStart == wordEnd || wordStart != range.cpMin || wordEnd != range.cpMax)
return;
if (wordOnly)
{
auto wordStart = pHighlightView->execute(SCI_WORDSTARTPOSITION, curPos, true);
auto wordEnd = pHighlightView->execute(SCI_WORDENDPOSITION, wordStart, true);
if (wordStart == wordEnd || wordStart != range.cpMin || wordEnd != range.cpMax)
return;
}
int textlen = range.cpMax - range.cpMin + 1;
char * text2Find = new char[textlen];
@ -73,11 +100,9 @@ void SmartHighlighter::highlightView(ScintillaEditView * pHighlightView)
auto currentLine = firstLine;
int prevDocLineChecked = -1; //invalid start
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
FindOption fo;
fo._isMatchCase = nppGUI._smartHiliteCaseSensitive;
fo._isWholeWord = true;
fo._isWholeWord = wordOnly;
const TCHAR * searchText = NULL;

View File

@ -122,12 +122,13 @@ BEGIN
CONTROL "Enable MRU behaviour",IDC_CHECK_STYLEMRU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,45,28,140,10
CONTROL "Enable",IDC_CHECK_ENABLSMARTHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,45,57,142,10
CONTROL "Match case",IDC_CHECK_SMARTHILITECASESENSITIVE, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,45,71,142,10
CONTROL "Enable Notepad++ auto-updater",IDC_CHECK_AUTOUPDATE, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,37,100,150,10
CONTROL "Autodetect character encoding",IDC_CHECK_DETECTENCODING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,115,217,10
CONTROL "Auto-indent",IDC_CHECK_MAINTAININDENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,130,150,10
CONTROL "Minimize to system tray",IDC_CHECK_MIN2SYSTRAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,145,150,10
CONTROL "Show only filename in title bar",IDC_CHECK_SHORTTITLE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,37,160,217,10
CONTROL "Treat backslash as escape character for SQL",IDC_CHECK_BACKSLASHISESCAPECHARACTERFORSQL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,175,217,10
COMBOBOX IDC_COMBO_SMARTHILITEMODE, 45, 82, 142, 10, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "Enable Notepad++ auto-updater",IDC_CHECK_AUTOUPDATE, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,37,105,150,10
CONTROL "Autodetect character encoding",IDC_CHECK_DETECTENCODING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,120,217,10
CONTROL "Auto-indent",IDC_CHECK_MAINTAININDENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,135,150,10
CONTROL "Minimize to system tray",IDC_CHECK_MIN2SYSTRAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,150,150,10
CONTROL "Show only filename in title bar",IDC_CHECK_SHORTTITLE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,37,165,217,10
CONTROL "Treat backslash as escape character for SQL",IDC_CHECK_BACKSLASHISESCAPECHARACTERFORSQL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,180,217,10
CONTROL "Enable",IDC_CHECK_CLICKABLELINK_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,15,140,10
CONTROL "No underline",IDC_CHECK_CLICKABLELINK_NOUNDERLINE,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,28,140,10
@ -143,7 +144,7 @@ BEGIN
EDITTEXT IDC_EDIT_SESSIONFILEEXT,381,157,34,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_WORKSPACEFILEEXT,381,174,34,14,ES_AUTOHSCROLL
GROUPBOX "Document Switcher (Ctrl+TAB)",IDC_DOCUMENTSWITCHER_STATIC,37,4,155,39,BS_CENTER
GROUPBOX "Smart Highlighting",IDC_SMARTHILITING_STATIC,37,47,155,39,BS_CENTER
GROUPBOX "Smart Highlighting",IDC_SMARTHILITING_STATIC,37,47,155,52,BS_CENTER
GROUPBOX "Clickable Link Settings",IDC_CLICKABLELINK_STATIC,259,4,155,39,BS_CENTER
GROUPBOX "File Status Auto-Detection",IDC_FILEAUTODETECTION_STATIC,259,47,155,50,BS_CENTER
GROUPBOX "Highlight Matching Tags",IDC_TAGMATCHEDHILITE_STATIC,259,101,155,50,BS_CENTER

View File

@ -932,9 +932,29 @@ INT_PTR CALLBACK SettingsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLTAGATTRHILITE, BM_SETCHECK, nppGUI._enableTagAttrsHilite, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_HIGHLITENONEHTMLZONE, BM_SETCHECK, nppGUI._enableHiliteNonHTMLZone, 0);
::SendDlgItemMessage(_hSelf, IDC_COMBO_SMARTHILITEMODE, CB_ADDSTRING, 0, (LPARAM)TEXT("Match whole word only"));
::SendDlgItemMessage(_hSelf, IDC_COMBO_SMARTHILITEMODE, CB_ADDSTRING, 0, (LPARAM)TEXT("Match any selection"));
::SendDlgItemMessage(_hSelf, IDC_COMBO_SMARTHILITEMODE, CB_ADDSTRING, 0, (LPARAM)TEXT("Same as Find dialog"));
switch (nppGUI._smartHiliteMode)
{
case NppGUI::SmartHiliteMode::wordOnly:
::SendMessage(::GetDlgItem(_hSelf, IDC_COMBO_SMARTHILITEMODE), CB_SETCURSEL, 0, 0);
break;
case NppGUI::SmartHiliteMode::anySelection:
::SendMessage(::GetDlgItem(_hSelf, IDC_COMBO_SMARTHILITEMODE), CB_SETCURSEL, 1, 0);
break;
case NppGUI::SmartHiliteMode::findDialog:
::SendMessage(::GetDlgItem(_hSelf, IDC_COMBO_SMARTHILITEMODE), CB_SETCURSEL, 2, 0);
break;
}
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_ENABLTAGATTRHILITE), nppGUI._enableTagsMatchHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_HIGHLITENONEHTMLZONE), nppGUI._enableTagsMatchHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_COMBO_SMARTHILITEMODE), nppGUI._enableSmartHilite);
::SendDlgItemMessage(_hSelf, IDC_CHECK_SHORTTITLE, BM_SETCHECK, nppGUI._shortTitlebar, 0);
@ -1077,6 +1097,7 @@ INT_PTR CALLBACK SettingsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0);
}
::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_SMARTHILITECASESENSITIVE), nppGUI._enableSmartHilite);
::EnableWindow(::GetDlgItem(_hSelf, IDC_COMBO_SMARTHILITEMODE), nppGUI._enableSmartHilite);
return TRUE;
}
@ -1140,6 +1161,41 @@ INT_PTR CALLBACK SettingsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
nppGUI._backSlashIsEscapeCharacterForSql = isCheckedOrNot(IDC_CHECK_BACKSLASHISESCAPECHARACTERFORSQL);
return TRUE;
}
default:
switch (HIWORD(wParam))
{
case CBN_SELCHANGE:
{
switch (LOWORD(wParam))
{
case IDC_COMBO_SMARTHILITEMODE :
{
auto index = ::SendDlgItemMessage(_hSelf, IDC_COMBO_SMARTHILITEMODE, CB_GETCURSEL, 0, 0);
switch (index)
{
case 0:
nppGUI._smartHiliteMode = NppGUI::SmartHiliteMode::wordOnly;
break;
case 1:
nppGUI._smartHiliteMode = NppGUI::SmartHiliteMode::anySelection;
break;
case 2:
nppGUI._smartHiliteMode = NppGUI::SmartHiliteMode::findDialog;
break;
}
return TRUE;
}
default:
break;
}
}
}
}
}
}

View File

@ -184,6 +184,7 @@
#define IDC_CHECK_BACKSLASHISESCAPECHARACTERFORSQL (IDD_PREFERENCE_SETTING_BOX + 35)
#define IDC_EDIT_WORKSPACEFILEEXT (IDD_PREFERENCE_SETTING_BOX + 36)
#define IDC_WORKSPACEFILEEXT_STATIC (IDD_PREFERENCE_SETTING_BOX + 37)
#define IDC_COMBO_SMARTHILITEMODE (IDD_PREFERENCE_SETTING_BOX + 38)
//-- FLS: xFileEditViewHistoryParameterGUI: Additional Checkbox for enabling the history for restoring the edit view per file.
#define IDC_PREFERENCE_OFFSET_FLS 40
#define IDC_CHECK_REMEMBEREDITVIEWPERFILE (IDD_PREFERENCE_SETTING_BOX + IDC_PREFERENCE_OFFSET_FLS + 1)