From 84430809df2f6607a3bc5b9f05866149842f2bd9 Mon Sep 17 00:00:00 2001 From: Udo Hoffmann Date: Sat, 15 Aug 2020 13:21:01 +0200 Subject: [PATCH] Add back hovered blue underlined URLs Fix #8654, close #8713 --- PowerEditor/installer/nativeLang/english.xml | 1 + PowerEditor/src/Notepad_plus.cpp | 31 ++++++++------ PowerEditor/src/Parameters.cpp | 19 +++------ PowerEditor/src/Parameters.h | 10 ++--- .../src/WinControls/Preference/preference.rc | 12 +++--- .../WinControls/Preference/preferenceDlg.cpp | 40 +++++++++---------- .../WinControls/Preference/preference_rc.h | 1 + scintilla/include/Scintilla.h | 1 + scintilla/src/EditView.cxx | 4 +- scintilla/src/Indicator.cxx | 2 +- scintilla/src/Indicator.h | 2 +- 11 files changed, 62 insertions(+), 61 deletions(-) diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml index c2284e3f..3a8695b9 100644 --- a/PowerEditor/installer/nativeLang/english.xml +++ b/PowerEditor/installer/nativeLang/english.xml @@ -1018,6 +1018,7 @@ You can define several column markers by using white space to separate the diffe + diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index e79c75f6..7b477deb 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -2503,15 +2503,15 @@ void Notepad_plus::addHotSpot(ScintillaEditView* view) ScintillaEditView* pView = view ? view : _pEditView; int urlAction = (NppParameters::getInstance()).getNppGUI()._styleURL; - LPARAM indicStyle = (urlAction == 2) ? INDIC_PLAIN : INDIC_HIDDEN; - + LPARAM indicStyle = (urlAction == urlNoUnderLineFg) || (urlAction == urlNoUnderLineBg) ? INDIC_HIDDEN : INDIC_PLAIN; + LPARAM indicHoverStyle = (urlAction == urlNoUnderLineBg) || (urlAction == urlUnderLineBg) ? INDIC_FULLBOX : INDIC_EXPLORERLINK; LPARAM indicStyleCur = pView->execute(SCI_INDICGETSTYLE, URL_INDIC); LPARAM indicHoverStyleCur = pView->execute(SCI_INDICGETHOVERSTYLE, URL_INDIC); - if ((indicStyleCur != indicStyle) || (indicHoverStyleCur != INDIC_FULLBOX)) + if ((indicStyleCur != indicStyle) || (indicHoverStyleCur != indicHoverStyle)) { pView->execute(SCI_INDICSETSTYLE, URL_INDIC, indicStyle); - pView->execute(SCI_INDICSETHOVERSTYLE, URL_INDIC, INDIC_FULLBOX); + pView->execute(SCI_INDICSETHOVERSTYLE, URL_INDIC, indicHoverStyle); pView->execute(SCI_INDICSETALPHA, URL_INDIC, 70); pView->execute(SCI_INDICSETFLAGS, URL_INDIC, SC_INDICFLAG_VALUEFORE); } @@ -2521,25 +2521,32 @@ void Notepad_plus::addHotSpot(ScintillaEditView* view) pView->getVisibleStartAndEndPosition(&startPos, &endPos); if (startPos >= endPos) return; pView->execute(SCI_SETINDICATORCURRENT, URL_INDIC); - pView->execute(SCI_INDICATORCLEARRANGE, startPos, endPos - startPos); - if (!urlAction) return; + if (urlAction == urlDisable) + { + pView->execute(SCI_INDICATORCLEARRANGE, startPos, endPos - startPos); + return; + } LRESULT indicFore = pView->execute(SCI_STYLEGETFORE, STYLE_DEFAULT); + pView->execute(SCI_SETINDICATORVALUE, indicFore); + pView->execute(SCI_SETSEARCHFLAGS, SCFIND_REGEXP|SCFIND_POSIX); pView->execute(SCI_SETTARGETRANGE, startPos, endPos); int posFound = static_cast(pView->execute(SCI_SEARCHINTARGET, strlen(URL_REG_EXPR), reinterpret_cast(URL_REG_EXPR))); while (posFound != -1 && posFound != -2) { - int start = int(pView->execute(SCI_GETTARGETSTART)); int end = int(pView->execute(SCI_GETTARGETEND)); - int foundTextLen = end - start; - pView->execute(SCI_SETINDICATORCURRENT, URL_INDIC); - pView->execute(SCI_SETINDICATORVALUE, indicFore); - pView->execute(SCI_INDICATORFILLRANGE, start, foundTextLen); - pView->execute(SCI_SETTARGETRANGE, posFound + foundTextLen, endPos); + int foundTextLen = end - posFound; + if (posFound > startPos) + pView->execute(SCI_INDICATORCLEARRANGE, startPos, posFound - startPos); + pView->execute(SCI_INDICATORFILLRANGE, posFound, foundTextLen); + startPos = posFound + foundTextLen; + pView->execute(SCI_SETTARGETRANGE, startPos, endPos); posFound = static_cast(pView->execute(SCI_SEARCHINTARGET, strlen(URL_REG_EXPR), reinterpret_cast(URL_REG_EXPR))); } + if (endPos > startPos) + pView->execute(SCI_INDICATORCLEARRANGE, startPos, endPos - startPos); } bool Notepad_plus::isConditionExprLine(int lineNumber) diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 2593e0b4..f51845b7 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -4394,12 +4394,9 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) const TCHAR* val = n->Value(); if (val) { - if (!lstrcmp(val, TEXT("1"))) - _nppGUI._styleURL = 1; - else if (!lstrcmp(val, TEXT("2"))) - _nppGUI._styleURL = 2; - else - _nppGUI._styleURL = 0; + int const i = generic_atoi (val); + if ((i >= urlMin) && (i <= urlMax)) + _nppGUI._styleURL = urlMode(i); } } } @@ -5811,15 +5808,11 @@ void NppParameters::createXmlTreeFromGUIParams() // 2 { - const TCHAR *pStr = TEXT("0"); - if (_nppGUI._styleURL == 1) - pStr = TEXT("1"); - else if (_nppGUI._styleURL == 2) - pStr = TEXT("2"); - + TCHAR szStr [12] = TEXT("0"); + generic_itoa(_nppGUI._styleURL, szStr, 10); TiXmlElement *GUIConfigElement = (newGUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); GUIConfigElement->SetAttribute(TEXT("name"), TEXT("URL")); - GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + GUIConfigElement->InsertEndChild(TiXmlText(szStr)); } // diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 70bc61a5..3dd28103 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -92,6 +92,9 @@ enum BackupFeature {bak_none = 0, bak_simple = 1, bak_verbose = 2}; enum OpenSaveDirSetting {dir_followCurrent = 0, dir_last = 1, dir_userDef = 2}; enum MultiInstSetting {monoInst = 0, multiInstOnSession = 1, multiInst = 2}; enum writeTechnologyEngine {defaultTechnology = 0, directWriteTechnology = 1}; +enum urlMode {urlDisable = 0, urlNoUnderLineFg, urlUnderLineFg, urlNoUnderLineBg, urlUnderLineBg, + urlMin = urlDisable, + urlMax = urlUnderLineBg}; const int LANG_INDEX_INSTR = 0; const int LANG_INDEX_INSTR2 = 1; @@ -843,12 +846,7 @@ struct NppGUI final writeTechnologyEngine _writeTechnologyEngine = defaultTechnology; bool _isWordCharDefault = true; std::string _customWordChars; - - // 0 : do nothing - // 1 : don't draw underline - // 2 : draw underline - int _styleURL = 2; - + urlMode _styleURL = urlUnderLineFg; NewDocDefaultSettings _newDocDefaultSettings; diff --git a/PowerEditor/src/WinControls/Preference/preference.rc b/PowerEditor/src/WinControls/Preference/preference.rc index 88edcbd4..1542c95d 100644 --- a/PowerEditor/src/WinControls/Preference/preference.rc +++ b/PowerEditor/src/WinControls/Preference/preference.rc @@ -130,15 +130,17 @@ BEGIN CONTROL "Use DirectWrite (May improve rendering special characters, need to restart Notepad++)",IDC_CHECK_DIRECTWRITE_ENABLE, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,188,377,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 - COMBOBOX IDC_COMBO_FILEUPDATECHOICE,267, 60,140,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Update silently",IDC_CHECK_UPDATESILENTLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,76,140,10 - CONTROL "Scroll to the last line after update",IDC_CHECK_UPDATEGOTOEOF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,88,140,10 + CONTROL "Enable fullbox mode",IDC_CHECK_CLICKABLELINK_FULLBOXMODE, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,41,140,10 + + COMBOBOX IDC_COMBO_FILEUPDATECHOICE,267, 73,140,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Update silently",IDC_CHECK_UPDATESILENTLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,89,140,10 + CONTROL "Scroll to the last line after update",IDC_CHECK_UPDATEGOTOEOF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,101,140,10 EDITTEXT IDC_EDIT_SESSIONFILEEXT,381,135,34,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT_WORKSPACEFILEEXT,381,152,34,14,ES_AUTOHSCROLL GROUPBOX "Document Switcher (Ctrl+TAB)",IDC_DOCUMENTSWITCHER_STATIC,37,4,155,39,BS_CENTER - GROUPBOX "Clickable Link Settings",IDC_CLICKABLELINK_STATIC,259,4,155,39,BS_CENTER + GROUPBOX "Clickable Link Settings",IDC_CLICKABLELINK_STATIC,259,4,155,52,BS_CENTER GROUPBOX "Document Peeker",IDC_DOCUMENTPEEK_STATIC,37,47,155,39,BS_CENTER - GROUPBOX "File Status Auto-Detection",IDC_FILEAUTODETECTION_STATIC,259,47,155,60,BS_CENTER + GROUPBOX "File Status Auto-Detection",IDC_FILEAUTODETECTION_STATIC,259,60,155,60,BS_CENTER RTEXT "Session file ext.:",IDC_SESSIONFILEEXT_STATIC,271,138,108,8 RTEXT "Workspace file ext.:",IDC_WORKSPACEFILEEXT_STATIC,271,155,108,8 END diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp index a996f751..11488677 100644 --- a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -919,26 +919,15 @@ INT_PTR CALLBACK SettingsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM) ::ShowWindow(::GetDlgItem(_hSelf, IDC_CHECK_AUTOUPDATE), nppGUI._doesExistUpdater?SW_SHOW:SW_HIDE); - BOOL linkEnable = FALSE; - BOOL dontUnderline = FALSE; - BOOL dontUnderlineState = FALSE; - if (nppGUI._styleURL == 1) - { - linkEnable = TRUE; - dontUnderline = TRUE; - dontUnderlineState = TRUE; - - } - else if (nppGUI._styleURL == 2) - { - linkEnable = TRUE; - dontUnderline = FALSE; - dontUnderlineState = TRUE; - } - + BOOL linkEnable = nppGUI._styleURL != urlDisable; + BOOL dontUnderline = (nppGUI._styleURL == urlNoUnderLineFg) || (nppGUI._styleURL == urlNoUnderLineBg); + BOOL roundBoxMode = (nppGUI._styleURL == urlNoUnderLineBg) || (nppGUI._styleURL == urlUnderLineBg); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_ENABLE, BM_SETCHECK, linkEnable, 0); ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE, BM_SETCHECK, dontUnderline, 0); - ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE), dontUnderlineState); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_FULLBOXMODE, BM_SETCHECK, roundBoxMode, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE), linkEnable); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_CLICKABLELINK_FULLBOXMODE), linkEnable); ::SendDlgItemMessage(_hSelf, IDC_EDIT_SESSIONFILEEXT, WM_SETTEXT, 0, reinterpret_cast(nppGUI._definedSessionExt.c_str())); ::SendDlgItemMessage(_hSelf, IDC_EDIT_WORKSPACEFILEEXT, WM_SETTEXT, 0, reinterpret_cast(nppGUI._definedWorkspaceExt.c_str())); @@ -1010,19 +999,28 @@ INT_PTR CALLBACK SettingsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM) { bool isChecked = isCheckedOrNot(IDC_CHECK_CLICKABLELINK_ENABLE); if (!isChecked) + { ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE, BM_SETCHECK, BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_FULLBOXMODE, BM_SETCHECK, BST_UNCHECKED, 0); + } ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE), isChecked); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_CLICKABLELINK_FULLBOXMODE), isChecked); - nppGUI._styleURL = isChecked?2:0; + nppGUI._styleURL = isChecked ? urlUnderLineFg : urlDisable; HWND grandParent = ::GetParent(_hParent); ::SendMessage(grandParent, NPPM_INTERNAL_UPDATECLICKABLELINKS, 0, 0); } return TRUE; case IDC_CHECK_CLICKABLELINK_NOUNDERLINE: + case IDC_CHECK_CLICKABLELINK_FULLBOXMODE: { - bool isChecked = isCheckedOrNot(IDC_CHECK_CLICKABLELINK_NOUNDERLINE); - nppGUI._styleURL = isChecked?1:2; + bool isNoUnderline = isCheckedOrNot(IDC_CHECK_CLICKABLELINK_NOUNDERLINE); + bool isRoundBoxMode = isCheckedOrNot(IDC_CHECK_CLICKABLELINK_FULLBOXMODE); + if (isRoundBoxMode) + nppGUI._styleURL = isNoUnderline ? urlNoUnderLineBg : urlUnderLineBg; + else + nppGUI._styleURL = isNoUnderline ? urlNoUnderLineFg : urlUnderLineFg; HWND grandParent = ::GetParent(_hParent); ::SendMessage(grandParent, NPPM_INTERNAL_UPDATECLICKABLELINKS, 0, 0); } diff --git a/PowerEditor/src/WinControls/Preference/preference_rc.h b/PowerEditor/src/WinControls/Preference/preference_rc.h index b98faceb..2eb66cce 100644 --- a/PowerEditor/src/WinControls/Preference/preference_rc.h +++ b/PowerEditor/src/WinControls/Preference/preference_rc.h @@ -209,6 +209,7 @@ #define IDC_CHECK_ENABLEDOCPEEKONMAP (IDD_PREFERENCE_SETTING_BOX + 46) #define IDC_COMBO_FILEUPDATECHOICE (IDD_PREFERENCE_SETTING_BOX + 47) #define IDC_CHECK_DIRECTWRITE_ENABLE (IDD_PREFERENCE_SETTING_BOX + 49) + #define IDC_CHECK_CLICKABLELINK_FULLBOXMODE (IDD_PREFERENCE_SETTING_BOX + 50) #define IDD_PREFERENCE_NEWDOCSETTING_BOX 6400 //(IDD_PREFERENCE_BOX + 400) #define IDC_FORMAT_GB_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 1) diff --git a/scintilla/include/Scintilla.h b/scintilla/include/Scintilla.h index 4e20a190..f8f9035a 100644 --- a/scintilla/include/Scintilla.h +++ b/scintilla/include/Scintilla.h @@ -293,6 +293,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define INDIC_POINTCHARACTER 19 #define INDIC_GRADIENT 20 #define INDIC_GRADIENTCENTRE 21 +#define INDIC_EXPLORERLINK 22 #define INDIC_CONTAINER 8 #define INDIC_IME 32 #define INDIC_IME_MAX 35 diff --git a/scintilla/src/EditView.cxx b/scintilla/src/EditView.cxx index 887e7754..0cebe407 100644 --- a/scintilla/src/EditView.cxx +++ b/scintilla/src/EditView.cxx @@ -1814,11 +1814,11 @@ void EditView::DrawForeground(Surface *surface, const EditModel &model, const Vi ((model.hoverIndicatorPos >= ts.start + posLineStart) && (model.hoverIndicatorPos <= ts.end() + posLineStart)); if (hover) { - if (indicator.sacHover.style == INDIC_TEXTFORE) { + if ((indicator.sacHover.style == INDIC_TEXTFORE) || (indicator.sacHover.style == INDIC_EXPLORERLINK)) { textFore = indicator.sacHover.fore; } } else { - if (indicator.sacNormal.style == INDIC_TEXTFORE) { + if ((indicator.sacNormal.style == INDIC_TEXTFORE) || (indicator.sacNormal.style == INDIC_EXPLORERLINK)) { if (indicator.Flags() & SC_INDICFLAG_VALUEFORE) textFore = ColourDesired(indicatorValue & SC_INDICVALUEMASK); else diff --git a/scintilla/src/Indicator.cxx b/scintilla/src/Indicator.cxx index 5210c7eb..3032bae3 100644 --- a/scintilla/src/Indicator.cxx +++ b/scintilla/src/Indicator.cxx @@ -212,7 +212,7 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r }; surface->Polygon(pts, std::size(pts), sacDraw.fore, sacDraw.fore); } - } else { // Either INDIC_PLAIN or unknown + } else { // Either INDIC_PLAIN, INDIC_EXPLORERLINK or unknown surface->MoveTo(irc.left, ymid); surface->LineTo(irc.right, ymid); } diff --git a/scintilla/src/Indicator.h b/scintilla/src/Indicator.h index 7e6f40b9..8f2bb8c4 100644 --- a/scintilla/src/Indicator.h +++ b/scintilla/src/Indicator.h @@ -43,7 +43,7 @@ public: return !(sacNormal == sacHover); } bool OverridesTextFore() const noexcept { - return sacNormal.style == INDIC_TEXTFORE || sacHover.style == INDIC_TEXTFORE; + return sacNormal.style == INDIC_TEXTFORE || sacHover.style == INDIC_TEXTFORE || sacNormal.style == INDIC_EXPLORERLINK || sacHover.style == INDIC_EXPLORERLINK; } int Flags() const noexcept { return attributes;