Enhancement of "Word characters list"

While double-clicking to select or searching with "Match whole word
only" option, the selected characters stop on non-word characters. With
this enhancement, users can include any non-word character into word
characters list, to change its default behaviour.
pull/2714/merge
Don HO 2017-01-15 22:16:17 +01:00
parent 035bcfeb22
commit 6a05bedd05
17 changed files with 431 additions and 73 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<NotepadPlus>
<Native-Langue name="正體中文" filename="chinese.xml" version="7.0">
<Native-Langue name="正體中文" filename="chinese.xml" version="7.3.1">
<Menu>
<Main>
<!-- Main Menu Entries -->
@ -827,6 +827,9 @@
<Item id="6252" name="起"/>
<Item id="6255" name="迄"/>
<Item id="6256" name="容許多行選取"/>
<Item id="6161" name="定義單字的字符 (Word character list)"/>
<Item id="6162" name="使用原始的單字字符集(建議使用)"/>
<Item id="6163" name="添加你的字符集(不建議選取如果你不了解這選項)"/>
</Delimiter>
<Cloud title="雲端">
@ -981,5 +984,16 @@
</FileMenu>
</Menus>
</ProjectManager>
<MiscStrings>
<word-chars-list-tip value="這允許你附加字符在當前單字字符集中,當滑鼠雙擊以進行選擇或以『僅符合整個單字』選項進行搜索。"/>
<word-chars-list-warning-begin value="警告:"/>
<!-- $INT_REPLACE$ is a place holder, don't translate it -->
<word-chars-list-space-warning value="$INT_REPLACE$ 空白字元(space)"/>
<!-- $INT_REPLACE$ is a place holder, don't translate it -->
<word-chars-list-tab-warning value="$INT_REPLACE$ 空白字元(TAB)"/>
<word-chars-list-warning-end value=" 在你的單字字符集中。"/>
<cloud-invalid-warning value="無效路徑"/>
<cloud-restart-warning value="請重新啟動 Notepad++ 以讓改變生效"/>
</MiscStrings>
</Native-Langue>
</NotepadPlus>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<NotepadPlus>
<Native-Langue name="English" filename="english.xml" version="7.0">
<Native-Langue name="English" filename="english.xml" version="7.3.1">
<Menu>
<Main>
<!-- Main Menu Entries -->
@ -828,6 +828,10 @@
<Item id="6252" name="Open"/>
<Item id="6255" name="Close"/>
<Item id="6256" name="Allow on several lines"/>
<Item id="6161" name="Word character list"/>
<Item id="6162" name="Use default Word character list as it is"/>
<Item id="6163" name="Add your character as part of word
(don't choose it unless you know what you're doing)"/>
</Delimiter>
<Cloud title="Cloud">
@ -983,5 +987,16 @@
</FileMenu>
</Menus>
</ProjectManager>
<MiscStrings>
<word-chars-list-tip value="This allows you to include additional character into current word characters while double clicking for selection or searching with &quot;Match whole word only&quot; option checked."/>
<word-chars-list-warning-begin value="Be aware: "/>
<!-- $INT_REPLACE$ is a place holder, don't translate it -->
<word-chars-list-space-warning value="$INT_REPLACE$ space(s)"/>
<!-- $INT_REPLACE$ is a place holder, don't translate it -->
<word-chars-list-tab-warning value="$INT_REPLACE$ TAB(s)"/>
<word-chars-list-warning-end value=" in your character list."/>
<cloud-invalid-warning value="Invalid path."/>
<cloud-restart-warning value="Please restart Notepad++ to take effect."/>
</MiscStrings>
</Native-Langue>
</NotepadPlus>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<NotepadPlus>
<Native-Langue name="Français" filename="french.xml" version="7.0">
<Native-Langue name="Français" filename="french.xml" version="7.3.1">
<Menu>
<Main>
<!-- Main Menu Entries -->
@ -810,6 +810,10 @@
<Item id="6252" name="Début"/>
<Item id="6255" name="Fin"/>
<Item id="6256" name="Sur plusieurs lignes"/>
<Item id="6161" name="Liste des caractère de mot"/>
<Item id="6162" name="Utiliser la liste originale des caractère de mot comme telle quelle"/>
<Item id="6163" name="Inclure les caractères comme la partie des caractères de mot
(Ne pas prendre cette option si tu ne sais pas ce qu'elle fait)"/>
</Delimiter>
<Cloud title="Cloud">
@ -967,5 +971,16 @@
</FileMenu>
</Menus>
</ProjectManager>
<MiscStrings>
<word-chars-list-tip value="Cela te permet d'inclure des caractères supplémentaires dans les caractères de mot courants, lors de double-cliquant pour la sélection ou la recherche avec l'option &quot;Mot entier uniquement&quot;."/>
<word-chars-list-warning-begin value="Attention : "/>
<!-- $INT_REPLACE$ is a place holder, don't translate it -->
<word-chars-list-space-warning value="$INT_REPLACE$ espace(s)"/>
<!-- $INT_REPLACE$ is a place holder, don't translate it -->
<word-chars-list-tab-warning value="$INT_REPLACE$ TAB(s)"/>
<word-chars-list-warning-end value=" dans la liste des caractères de mot."/>
<cloud-invalid-warning value="Chemin invalide."/>
<cloud-restart-warning value="Veuillez redémarrer Notepad++ afin que le changement prenne effet."/>
</MiscStrings>
</Native-Langue>
</NotepadPlus>

View File

@ -714,7 +714,7 @@ LRESULT Notepad_plus::init(HWND hwnd)
_dockingManager.setActiveTab(cti._cont, cti._activeTab);
}
retrieveDefaultWordChars();
retrieveDefaultWordChars(nppGUI._defaultWordChars);
//Load initial docs into doctab
loadBufferIntoView(_mainEditView.getCurrentBufferID(), MAIN_VIEW);
@ -6664,40 +6664,47 @@ bool Notepad_plus::undoStreamComment()
//return retVal;
}
void Notepad_plus::retrieveDefaultWordChars()
void Notepad_plus::retrieveDefaultWordChars(string & charList)
{
auto defaultCharListLen = _mainEditView.execute(SCI_GETWORDCHARS);
char *defaultCharList = new char[defaultCharListLen + 1];
_mainEditView.execute(SCI_GETWORDCHARS, 0, reinterpret_cast<LPARAM>(defaultCharList));
_defaultCharList = defaultCharList;
charList = defaultCharList;
delete[] defaultCharList;
}
void Notepad_plus::restoreDefaultWordChars()
{
_mainEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(_defaultCharList.c_str()));
_subEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(_defaultCharList.c_str()));
NppParameters *pNppParam = NppParameters::getInstance();
const NppGUI & nppGUI = pNppParam->getNppGUI();
_mainEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(nppGUI._defaultWordChars.c_str()));
_subEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(nppGUI._defaultWordChars.c_str()));
}
void Notepad_plus::addWordChars(const char *chars2add)
void Notepad_plus::setCustomWordChars()
{
size_t chars2addLen = strlen(chars2add);
if (not chars2addLen)
NppParameters *pNppParam = NppParameters::getInstance();
const NppGUI & nppGUI = pNppParam->getNppGUI();
_mainEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(nppGUI._customWordChars.c_str()));
_subEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(nppGUI._customWordChars.c_str()));
}
void Notepad_plus::addCustomWordChars()
{
NppParameters *pNppParam = NppParameters::getInstance();
const NppGUI & nppGUI = pNppParam->getNppGUI();
if (nppGUI._customWordChars.empty())
return;
auto oldCharListLen = _mainEditView.execute(SCI_GETWORDCHARS);
char *oldCharList = new char[oldCharListLen + 1];
_mainEditView.execute(SCI_GETWORDCHARS, 0, reinterpret_cast<LPARAM>(oldCharList));
string chars2addStr;
for (size_t i = 0; i < chars2addLen; ++i)
for (size_t i = 0; i < nppGUI._customWordChars.length(); ++i)
{
bool found = false;
char char2check = chars2add[i];
for (auto j = 0; j < oldCharListLen; ++j)
char char2check = nppGUI._customWordChars[i];
for (size_t j = 0; j < nppGUI._defaultWordChars.length(); ++j)
{
char wordChar = oldCharList[j];
char wordChar = nppGUI._defaultWordChars[j];
if (char2check == wordChar)
{
found = true;
@ -6712,15 +6719,10 @@ void Notepad_plus::addWordChars(const char *chars2add)
if (not chars2addStr.empty())
{
string newCharList = oldCharList;
string newCharList = nppGUI._defaultWordChars;
newCharList += chars2addStr;
//MessageBoxA(NULL, oldCharList, "AVANT", MB_OK);
_mainEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(newCharList.c_str()));
_subEditView.execute(SCI_SETWORDCHARS, 0, reinterpret_cast<LPARAM>(newCharList.c_str()));
//_mainEditView.execute(SCI_GETWORDCHARS, 0, (LPARAM)charList);
//MessageBoxA(NULL, charList, "APRES", MB_OK);
}
delete[] oldCharList;
}

View File

@ -643,10 +643,10 @@ private:
static bool deleteForward(ScintillaEditView *pCurrentView, BufferID targetBufID);
static bool selectBack(ScintillaEditView *pCurrentView, BufferID targetBufID);
void retrieveDefaultWordChars();
std::string _defaultCharList;
void addWordChars(const char *chars2add);
void retrieveDefaultWordChars(std::string & charList);
void addCustomWordChars();
void restoreDefaultWordChars();
void setCustomWordChars();
static int getRandomNumber(int rangeMax = -1)
{

View File

@ -1286,7 +1286,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case NPPM_INTERNAL_SETCARETWIDTH:
{
NppGUI & nppGUI = const_cast<NppGUI &>(pNppParam->getNppGUI());
const NppGUI & nppGUI = pNppParam->getNppGUI();
if (nppGUI._caretWidth < 4)
{
@ -1329,9 +1329,19 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
return TRUE;
}
case NPPM_INTERNAL_SETWORDCHARS:
{
const NppGUI & nppGUI = pNppParam->getNppGUI();
if (nppGUI._isWordCharDefault)
restoreDefaultWordChars();
else
addCustomWordChars();
return TRUE;
}
case NPPM_INTERNAL_SETMULTISELCTION:
{
NppGUI & nppGUI = const_cast<NppGUI &>(pNppParam->getNppGUI());
const NppGUI & nppGUI = pNppParam->getNppGUI();
_mainEditView.execute(SCI_SETMULTIPLESELECTION, nppGUI._enableMultiSelection);
_subEditView.execute(SCI_SETMULTIPLESELECTION, nppGUI._enableMultiSelection);
return TRUE;
@ -1339,7 +1349,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case NPPM_INTERNAL_SETCARETBLINKRATE:
{
NppGUI & nppGUI = const_cast<NppGUI &>(pNppParam->getNppGUI());
const NppGUI & nppGUI = pNppParam->getNppGUI();
_mainEditView.execute(SCI_SETCARETPERIOD, nppGUI._caretBlinkRate);
_subEditView.execute(SCI_SETCARETPERIOD, nppGUI._caretBlinkRate);
return TRUE;
@ -1459,13 +1469,13 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case NPPM_INTERNAL_GETCHECKDOCOPT:
{
return (LRESULT)(const_cast<NppGUI &>(pNppParam->getNppGUI()))._fileAutoDetection;
return (LRESULT)(pNppParam->getNppGUI())._fileAutoDetection;
}
case NPPM_INTERNAL_SETCHECKDOCOPT:
{
// If nothing is changed by user, then we allow to set this value
if ((const_cast<NppGUI &>(pNppParam->getNppGUI()))._fileAutoDetection == (const_cast<NppGUI &>(pNppParam->getNppGUI()))._fileAutoDetectionOriginalValue)
if ((const_cast<NppGUI &>(pNppParam->getNppGUI()))._fileAutoDetection == (pNppParam->getNppGUI())._fileAutoDetectionOriginalValue)
(const_cast<NppGUI &>(pNppParam->getNppGUI()))._fileAutoDetection = (ChangeDetect)wParam;
return TRUE;
}
@ -1753,7 +1763,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case WM_SYSCOMMAND:
{
NppGUI & nppgui = const_cast<NppGUI &>((pNppParam->getNppGUI()));
const NppGUI & nppgui = (pNppParam->getNppGUI());
if (((nppgui._isMinimizedToTray && !_isAdministrator) || _pPublicInterface->isPrelaunch()) && (wParam == SC_MINIMIZE))
{
if (nullptr == _pTrayIco)
@ -2035,7 +2045,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case NPPM_ISSTATUSBARHIDDEN:
{
NppGUI & nppGUI = const_cast<NppGUI &>(pNppParam->getNppGUI());
const NppGUI & nppGUI = pNppParam->getNppGUI();
return !nppGUI._statusBarShow;
}
@ -2220,7 +2230,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case WM_ENTERMENULOOP:
{
NppGUI & nppgui = const_cast<NppGUI &>((pNppParam->getNppGUI()));
const NppGUI & nppgui = pNppParam->getNppGUI();
if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering)
::SetMenu(hwnd, _mainMenuHandle);
@ -2229,7 +2239,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case WM_EXITMENULOOP:
{
NppGUI & nppgui = const_cast<NppGUI &>((pNppParam->getNppGUI()));
const NppGUI & nppgui = pNppParam->getNppGUI();
if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering)
::SetMenu(hwnd, NULL);
_sysMenuEntering = false;

View File

@ -4676,6 +4676,24 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
if (themePath != NULL && themePath[0])
_nppGUI._themeName.assign(themePath);
}
else if (!lstrcmp(nm, TEXT("wordCharList")))
{
const TCHAR * value = element->Attribute(TEXT("useDefault"));
if (value && value[0])
{
if (lstrcmp(value, TEXT("yes")) == 0)
_nppGUI._isWordCharDefault = true;
else if (lstrcmp(value, TEXT("no")) == 0)
_nppGUI._isWordCharDefault = false;
}
const TCHAR *charsAddedW = element->Attribute(TEXT("charsAdded"));
if (charsAddedW)
{
WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
_nppGUI._customWordChars = wmc->wchar2char(charsAddedW, SC_CP_UTF8);
}
}
else if (!lstrcmp(nm, TEXT("delimiterSelection")))
{
int leftmost = 0;
@ -5416,6 +5434,16 @@ void NppParameters::createXmlTreeFromGUIParams()
GUIConfigElement->SetAttribute(TEXT("path"), _nppGUI._themeName.c_str());
}
// <GUIConfig name="wordCharList" useDefault="yes" charsAdded=".$%" />
{
TiXmlElement *GUIConfigElement = (newGUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement();
GUIConfigElement->SetAttribute(TEXT("name"), TEXT("wordCharList"));
GUIConfigElement->SetAttribute(TEXT("useDefault"), _nppGUI._isWordCharDefault ? TEXT("yes") : TEXT("no"));
WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
const wchar_t* charsAddStr = wmc->char2wchar(_nppGUI._customWordChars.c_str(), SC_CP_UTF8);
GUIConfigElement->SetAttribute(TEXT("charsAdded"), charsAddStr);
}
// <GUIConfig name="delimiterSelection" leftmostDelimiter="40" rightmostDelimiter="41" delimiterSelectionOnEntireDocument="no" />
{
TiXmlElement *GUIConfigElement = (newGUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement();

View File

@ -760,6 +760,9 @@ struct NppGUI final
bool _delimiterSelectionOnEntireDocument = false;
bool _backSlashIsEscapeCharacterForSql = true;
bool _isWordCharDefault = true;
std::string _defaultWordChars;
std::string _customWordChars;
// 0 : do nothing
// 1 : don't draw underline

View File

@ -181,8 +181,8 @@ BEGIN
CONTROL "",IDC_OPENSAVEDIR_ALWAYSON_RADIO,"Button",BS_AUTORADIOBUTTON,118,89,11,10
EDITTEXT IDC_OPENSAVEDIR_ALWAYSON_EDIT,134,88,179,14,ES_AUTOHSCROLL
PUSHBUTTON "...",IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON,320,87,16,14
CONTROL "Use new style save dialog (without file extension feature)",IDC_OPENSAVEDIR_CHECK_USENEWSTYLESAVEDIALOG, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,145,250,10
CONTROL "Open all files of folder instead of launching Folder as Workspace on folder dropping",IDC_OPENSAVEDIR_CHECK_DRROPFOLDEROPENFILES, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,158,290,10
CONTROL "Use new style save dialog (without file extension feature)",IDC_OPENSAVEDIR_CHECK_USENEWSTYLESAVEDIALOG, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,145,250,10
CONTROL "Open all files of folder instead of launching Folder as Workspace on folder dropping",IDC_OPENSAVEDIR_CHECK_DRROPFOLDEROPENFILES, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,158,290,10
END
IDD_PREFERENCE_RECENTFILESHISTORY_BOX DIALOGEX 0, 0, 455, 185
@ -371,15 +371,23 @@ IDD_PREFERENCE_DELIMITERSETTINGS_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 "Delimiter selection settings (Ctrl + Mouse double click)",IDC_DELIMITERSETTINGS_GB_STATIC,89,44,268,89,BS_CENTER
RTEXT "Open",IDD_STATIC_OPENDELIMITER,117,67,34,8
EDITTEXT IDC_EDIT_OPENDELIMITER,156,65,14,14
LTEXT "bla bla bla bla bla bla",IDD_STATIC_BLABLA,172,67,56,8
LTEXT "bla bla bla bla bla bla bla bla bla bla bla bla",IDD_STATIC_BLABLA2NDLINE,132,87,126,8
EDITTEXT IDC_EDIT_CLOSEDELIMITER,237,65,14,14
LTEXT "Close",IDD_STATIC_CLOSEDELIMITER,252,67,47,8
GROUPBOX "Word character list",IDC_WORDCHARLIST_GB_STATIC,89,2,268,93,BS_CENTER
CONTROL "Use default Word character list as it is",IDC_RADIO_WORDCHAR_DEFAULT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,100,18,250,10
CONTROL "Add your character as part of word\r(don't choose it unless you know what you're doing)",IDC_RADIO_WORDCHAR_CUSTOM,
"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | WS_GROUP,100,32,250,20
EDITTEXT IDC_WORDCHAR_CUSTOM_EDIT,111,54,180,14,ES_AUTOHSCROLL
PUSHBUTTON "?",IDD_WORDCHAR_QUESTION_BUTTON,303,53,16,14
LTEXT "",IDD_STATIC_WORDCHAR_WARNING,111,70,210,8
GROUPBOX "Delimiter selection settings (Ctrl + Mouse double click)",IDC_DELIMITERSETTINGS_GB_STATIC,89,113,268,70,BS_CENTER
RTEXT "Open",IDD_STATIC_OPENDELIMITER,117,128,34,8
EDITTEXT IDC_EDIT_OPENDELIMITER,156,126,14,14
LTEXT "bla bla bla bla bla bla",IDD_STATIC_BLABLA,172,128,56,8
LTEXT "bla bla bla bla bla bla bla bla bla bla bla bla",IDD_STATIC_BLABLA2NDLINE,132,148,126,8
EDITTEXT IDC_EDIT_CLOSEDELIMITER,237,126,14,14
LTEXT "Close",IDD_STATIC_CLOSEDELIMITER,252,128,47,8
CONTROL "Allow on several lines",IDD_SEVERALLINEMODEON_CHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,109,160,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,166,160,10
END
IDD_PREFERENCE_SETTINGSONCLOUD_BOX DIALOGEX 0, 0, 455, 185
@ -391,7 +399,7 @@ BEGIN
CONTROL "Set your cloud location path here:",IDC_WITHCLOUD_RADIO,"Button",BS_AUTORADIOBUTTON,125,72,180,10
EDITTEXT IDC_CLOUDPATH_EDIT,134,88,179,14,ES_AUTOHSCROLL
PUSHBUTTON "...",IDD_CLOUDPATH_BROWSE_BUTTON,320,87,16,14
LTEXT "",IDC_SETTINGSONCLOUD_WARNING_STATIC,131,117,135,20
LTEXT "",IDC_SETTINGSONCLOUD_WARNING_STATIC,131,117,220,20
END
IDD_PREFERENCE_SEARCHENGINE_BOX DIALOGEX 0, 0, 455, 185

View File

@ -31,6 +31,7 @@
#include "preferenceDlg.h"
#include "lesDlgs.h"
#include "EncodingMapper.h"
#include "localization.h"
#define MyGetGValue(rgb) (LOBYTE((rgb)>>8))
@ -2888,6 +2889,142 @@ INT_PTR CALLBACK MultiInstDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
return FALSE;
}
void DelimiterSettingsDlg::detectSpace(const char *text2Check, int & nbSp, int & nbTab)
{
nbSp = nbTab = 0;
for (size_t i = 0; i < strlen(text2Check); ++i)
{
if (text2Check[i] == ' ')
++nbSp;
else if (text2Check[i] == '\t')
++nbTab;
}
}
HWND CreateToolTip(int toolID, HWND hDlg, HINSTANCE hInst, const PTSTR pszText)
{
if (!toolID || !hDlg || !pszText)
{
return NULL;
}
// Get the window of the tool.
HWND hwndTool = GetDlgItem(hDlg, toolID);
if (!hwndTool)
{
return NULL;
}
// Create the tooltip. g_hInst is the global instance handle.
HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
hDlg, NULL,
hInst, NULL);
if (!hwndTip)
{
return NULL;
}
// Associate the tooltip with the tool.
TOOLINFO toolInfo = { 0 };
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = hDlg;
toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
toolInfo.uId = (UINT_PTR)hwndTool;
toolInfo.lpszText = pszText;
if (!SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo))
{
DestroyWindow(hwndTip);
return NULL;
}
return hwndTip;
}
generic_string DelimiterSettingsDlg::getWarningText(size_t nbSp, size_t nbTab) const
{
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
generic_string msg;
if (nbSp && nbTab)
{
generic_string nbSpStr = std::to_wstring(nbSp);
generic_string nbTabStr = std::to_wstring(nbTab);
generic_string warnBegin = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-warning-begin");
generic_string space = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-space-warning");
generic_string tab = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-tab-warning");
generic_string warnEnd = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-warning-end");
if (not warnBegin.empty() && not space.empty() && not tab.empty() && not warnEnd.empty())
{
space = stringReplace(space, TEXT("$INT_REPLACE$"), nbSpStr);
tab = stringReplace(tab, TEXT("$INT_REPLACE$"), nbTabStr);
msg = warnBegin;
msg += space;
msg += TEXT(" && ");
msg += tab;
msg += warnEnd;
}
else
{
msg = TEXT("Be aware: ");
msg += nbSpStr;
msg += TEXT(" space(s) && ");
msg += std::to_wstring(nbTab);
msg += TEXT(" TAB(s) in your character list.");
}
}
else if (nbSp && not nbTab)
{
generic_string nbSpStr = std::to_wstring(nbSp);
generic_string warnBegin = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-warning-begin");
generic_string space = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-space-warning");
generic_string warnEnd = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-warning-end");
if (not warnBegin.empty() && not space.empty() && not warnEnd.empty())
{
space = stringReplace(space, TEXT("$INT_REPLACE$"), nbSpStr);
msg = warnBegin;
msg += space;
msg += warnEnd;
}
else
{
msg = TEXT("Be aware: ");
msg += std::to_wstring(nbSp);
msg += TEXT(" space(s) in your character list.");
}
}
else if (not nbSp && nbTab)
{
generic_string nbTabStr = std::to_wstring(nbTab);
generic_string warnBegin = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-warning-begin");
generic_string tab = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-tab-warning");
generic_string warnEnd = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-warning-end");
if (not warnBegin.empty() && not tab.empty() && not warnEnd.empty())
{
tab = stringReplace(tab, TEXT("$INT_REPLACE$"), nbTabStr);
msg = warnBegin;
msg += tab;
msg += warnEnd;
}
else
{
msg = TEXT("Be aware: ");
msg += std::to_wstring(nbTab);
msg += TEXT(" TAB(s) in your character list.");
}
}
else //(not nbSp && not nbTab)
{
// do nothing
}
return msg;
}
INT_PTR CALLBACK DelimiterSettingsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
NppGUI & nppGUI = const_cast<NppGUI &>((NppParameters::getInstance())->getNppGUI());
@ -2895,6 +3032,9 @@ INT_PTR CALLBACK DelimiterSettingsDlg::run_dlgProc(UINT message, WPARAM wParam,
{
case WM_INITDIALOG :
{
//
// Delimiter
//
TCHAR opener[2];
opener[0] = nppGUI._leftmostDelimiter;
opener[1] = '\0';
@ -2902,7 +3042,7 @@ INT_PTR CALLBACK DelimiterSettingsDlg::run_dlgProc(UINT message, WPARAM wParam,
closer[0] = nppGUI._rightmostDelimiter;
closer[1] = '\0';
bool onSeveralLines = nppGUI._delimiterSelectionOnEntireDocument;
::SendDlgItemMessage(_hSelf, IDC_EDIT_OPENDELIMITER, EM_LIMITTEXT, 1, 0);
::SendDlgItemMessage(_hSelf, IDC_EDIT_CLOSEDELIMITER, EM_LIMITTEXT, 1, 0);
::SendDlgItemMessage(_hSelf, IDC_EDIT_OPENDELIMITER, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(opener));
@ -2932,6 +3072,35 @@ INT_PTR CALLBACK DelimiterSettingsDlg::run_dlgProc(UINT message, WPARAM wParam,
::MoveWindow(::GetDlgItem(_hSelf, IDC_EDIT_CLOSEDELIMITER), p->x, p->y, _closerRect.right, _closerRect.bottom, TRUE);
::MoveWindow(::GetDlgItem(_hSelf, IDD_STATIC_CLOSEDELIMITER), p->x + _closerRect.right + 4, p->y + 4, _closerLabelRect.right, _closerLabelRect.bottom, TRUE);
//
// Word Char List
//
::SetDlgItemTextA(_hSelf, IDC_WORDCHAR_CUSTOM_EDIT, nppGUI._customWordChars.c_str());
::SendDlgItemMessage(_hSelf, IDC_RADIO_WORDCHAR_DEFAULT, BM_SETCHECK, nppGUI._isWordCharDefault ? BST_CHECKED : BST_UNCHECKED, 0);
::SendDlgItemMessage(_hSelf, IDC_RADIO_WORDCHAR_CUSTOM, BM_SETCHECK, not nppGUI._isWordCharDefault ? BST_CHECKED : BST_UNCHECKED, 0);
::EnableWindow(::GetDlgItem(_hSelf, IDC_WORDCHAR_CUSTOM_EDIT), not nppGUI._isWordCharDefault);
int nbSp = 0;
int nbTab = 0;
detectSpace(nppGUI._customWordChars.c_str(), nbSp, nbTab);
generic_string msg = getWarningText(nbSp, nbTab);
::SetDlgItemText(_hSelf, IDD_STATIC_WORDCHAR_WARNING, msg.c_str());
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
generic_string tip2show = pNativeSpeaker->getLocalizedStrFromID("word-chars-list-tip");
if (tip2show.empty())
tip2show = TEXT("This allows you to include additional character into current word characters while double clicking for selection or searching with \"Match whole word only\" option checked.");
_tip = CreateToolTip(IDD_WORDCHAR_QUESTION_BUTTON, _hSelf, _hInst, const_cast<PTSTR>(tip2show.c_str()));
if (_tip)
{
SendMessage(_tip, TTM_ACTIVATE, TRUE, 0);
SendMessage(_tip, TTM_SETMAXTIPWIDTH, 0, 200);
// Make tip stay 30 seconds
SendMessage(_tip, TTM_SETDELAYTIME, TTDT_AUTOPOP, MAKELPARAM((30000), (0)));
}
return TRUE;
}
@ -2972,6 +3141,24 @@ INT_PTR CALLBACK DelimiterSettingsDlg::run_dlgProc(UINT message, WPARAM wParam,
nppGUI._rightmostDelimiter = static_cast<char>(closer[0]);
return TRUE;
}
case IDC_WORDCHAR_CUSTOM_EDIT:
{
char customText[MAX_PATH];
::GetDlgItemTextA(_hSelf, IDC_WORDCHAR_CUSTOM_EDIT, customText, MAX_PATH-1);
nppGUI._customWordChars = customText;
int nbSp = 0;
int nbTab = 0;
detectSpace(customText, nbSp, nbTab);
generic_string msg = getWarningText(nbSp, nbTab);
::SetDlgItemText(_hSelf, IDD_STATIC_WORDCHAR_WARNING, msg.c_str());
if (not nppGUI._isWordCharDefault)
::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_SETWORDCHARS, 0, 0);
return TRUE;
}
default:
return FALSE;
}
@ -2994,6 +3181,26 @@ INT_PTR CALLBACK DelimiterSettingsDlg::run_dlgProc(UINT message, WPARAM wParam,
return TRUE;
}
case IDC_RADIO_WORDCHAR_DEFAULT:
{
//::SendDlgItemMessage(_hSelf, IDC_RADIO_WORDCHAR_DEFAULT, BM_SETCHECK, BST_CHECKED, 0);
::SendDlgItemMessage(_hSelf, IDC_RADIO_WORDCHAR_CUSTOM, BM_SETCHECK, BST_UNCHECKED, 0);
nppGUI._isWordCharDefault = true;
::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_SETWORDCHARS, 0, 0);
::EnableWindow(::GetDlgItem(_hSelf, IDC_WORDCHAR_CUSTOM_EDIT), not nppGUI._isWordCharDefault);
return TRUE;
}
case IDC_RADIO_WORDCHAR_CUSTOM:
{
::SendDlgItemMessage(_hSelf, IDC_RADIO_WORDCHAR_DEFAULT, BM_SETCHECK, BST_UNCHECKED, 0);
//::SendDlgItemMessage(_hSelf, IDC_RADIO_WORDCHAR_CUSTOM, BM_SETCHECK, BST_CHECKED, 0);
nppGUI._isWordCharDefault = false;
::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_SETWORDCHARS, 0, 0);
::EnableWindow(::GetDlgItem(_hSelf, IDC_WORDCHAR_CUSTOM_EDIT), not nppGUI._isWordCharDefault);
return TRUE;
}
default :
return FALSE;
}
@ -3019,12 +3226,19 @@ INT_PTR CALLBACK SettingsOnCloudDlg::run_dlgProc(UINT message, WPARAM wParam, LP
TCHAR inputDirExpanded[MAX_PATH] = {'\0'};
::SendDlgItemMessage(_hSelf, IDC_CLOUDPATH_EDIT, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(inputDir));
::ExpandEnvironmentStrings(inputDir, inputDirExpanded, MAX_PATH);
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
if (::PathFileExists(inputDirExpanded))
{
nppGUI._cloudPath = inputDirExpanded;
nppParams->setCloudChoice(inputDirExpanded);
generic_string message = nppParams->isCloudPathChanged() ? TEXT("Please restart Notepad++ to take effect.") : TEXT("");
generic_string message;
if (nppParams->isCloudPathChanged())
{
message = pNativeSpeaker->getLocalizedStrFromID("cloud-restart-warning");
if (message.empty())
message = TEXT("Please restart Notepad++ to take effect.");
}
::SetDlgItemText(_hSelf, IDC_SETTINGSONCLOUD_WARNING_STATIC, message.c_str());
}
else
@ -3032,7 +3246,9 @@ INT_PTR CALLBACK SettingsOnCloudDlg::run_dlgProc(UINT message, WPARAM wParam, LP
bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_WITHCLOUD_RADIO, BM_GETCHECK, 0, 0));
if (isChecked)
{
generic_string message = TEXT("Invalid path.");
generic_string message = pNativeSpeaker->getLocalizedStrFromID("cloud-invalid-warning");
if (message.empty())
message = TEXT("Invalid path.");
::SetDlgItemText(_hSelf, IDC_SETTINGSONCLOUD_WARNING_STATIC, message.c_str());
nppParams->removeCloudChoice();
}
@ -3075,7 +3291,14 @@ INT_PTR CALLBACK SettingsOnCloudDlg::run_dlgProc(UINT message, WPARAM wParam, LP
nppGUI._cloudPath = TEXT("");
nppParams->removeCloudChoice();
generic_string message = nppParams->isCloudPathChanged() ? TEXT("Please restart Notepad++ to take effect.") : TEXT("");
generic_string message;
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
if (nppParams->isCloudPathChanged())
{
message = pNativeSpeaker->getLocalizedStrFromID("cloud-restart-warning");
if (message.empty())
message = TEXT("Please restart Notepad++ to take effect.");
}
::SetDlgItemText(_hSelf, IDC_SETTINGSONCLOUD_WARNING_STATIC, message.c_str());
::SendDlgItemMessage(_hSelf, IDC_CLOUDPATH_EDIT, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(nppGUI._cloudPath.c_str()));
@ -3086,7 +3309,10 @@ INT_PTR CALLBACK SettingsOnCloudDlg::run_dlgProc(UINT message, WPARAM wParam, LP
case IDC_WITHCLOUD_RADIO:
{
generic_string message = TEXT("Invalid path.");
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
generic_string message = pNativeSpeaker->getLocalizedStrFromID("cloud-invalid-warning");
if (message.empty())
message = TEXT("Invalid path.");
::SetDlgItemText(_hSelf, IDC_SETTINGSONCLOUD_WARNING_STATIC, message.c_str());
::EnableWindow(::GetDlgItem(_hSelf, IDC_CLOUDPATH_EDIT), true);

View File

@ -189,11 +189,19 @@ class DelimiterSettingsDlg : public StaticDialog
{
public :
DelimiterSettingsDlg() {};
~DelimiterSettingsDlg() {
if (_tip)
::DestroyWindow(_tip);
};
private :
INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
POINT _singleLineModePoint, _multiLineModePoint;
RECT _closerRect, _closerLabelRect;
HWND _tip = nullptr;
INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
void detectSpace(const char *text2Check, int & nbSp, int & nbTab);
generic_string getWarningText(size_t nbSp, size_t nbTab) const;
};
class SettingsOnCloudDlg : public StaticDialog
@ -249,7 +257,6 @@ private :
void makeCategoryList();
int32_t getIndexFromName(const TCHAR *name) const;
void showDialogByIndex(size_t index) const;
//ControlsTab _ctrlTab;
WindowVector _wVector;
BarsDlg _barsDlg;
MarginsDlg _marginsDlg;

View File

@ -70,6 +70,14 @@
#define IDC_MONOINST_RADIO (IDD_PREFERENCE_MULTIINSTANCE_BOX + 4)
#define IDD_STATIC_RESTARTNOTE (IDD_PREFERENCE_MULTIINSTANCE_BOX + 5)
#define IDD_PREFERENCE_WORDCHARLIST_BOX 6160 //(IDD_PREFERENCE_BOX + 150)
#define IDC_WORDCHARLIST_GB_STATIC (IDD_PREFERENCE_WORDCHARLIST_BOX + 1)
#define IDC_RADIO_WORDCHAR_DEFAULT (IDD_PREFERENCE_WORDCHARLIST_BOX + 2)
#define IDC_RADIO_WORDCHAR_CUSTOM (IDD_PREFERENCE_WORDCHARLIST_BOX + 3)
#define IDC_WORDCHAR_CUSTOM_EDIT (IDD_PREFERENCE_WORDCHARLIST_BOX + 4)
#define IDD_WORDCHAR_QUESTION_BUTTON (IDD_PREFERENCE_WORDCHARLIST_BOX + 5)
#define IDD_STATIC_WORDCHAR_WARNING (IDD_PREFERENCE_WORDCHARLIST_BOX + 6)
#define IDD_PREFERENCE_MARGEIN_BOX 6200 //(IDD_PREFERENCE_BOX + 200)
#define IDC_FMS_GB_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 1)
#define IDC_RADIO_SIMPLE (IDD_PREFERENCE_MARGEIN_BOX + 2)

View File

@ -1,5 +1,5 @@
// This file is part of Notepad++ project
// Copyright (C)2003 Don HO <don.h@free.fr>
// Copyright (C)2017 Don HO <don.h@free.fr>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@ -30,8 +30,6 @@
#include <stdexcept>
#include "ToolTip.h"
INT_PTR CALLBACK dlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void ToolTip::init(HINSTANCE hInst, HWND hParent)
{
if (_hSelf == NULL)

View File

@ -1,5 +1,5 @@
// This file is part of Notepad++ project
// Copyright (C)2003 Don HO <don.h@free.fr>
// Copyright (C)2017 Don HO <don.h@free.fr>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@ -26,8 +26,7 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#ifndef __TOOLTIP_H__
#define __TOOLTIP_H__
#pragma once
#include <windows.h>
#include <commctrl.h>
@ -36,7 +35,7 @@
class ToolTip : public Window
{
public :
ToolTip() : _bTrackMouse(FALSE) {};
ToolTip() {};
void destroy(){
::DestroyWindow(_hSelf);
@ -52,15 +51,13 @@ public:
void Show(RECT rectTitle, const TCHAR* pszTitleText, int iXOff = 0, int iWidthOff = 0);
protected:
WNDPROC _defaultProc;
BOOL _bTrackMouse;
WNDPROC _defaultProc = nullptr;
BOOL _bTrackMouse = FALSE;
TOOLINFO _ti;
static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
return (((ToolTip *)(::GetWindowLongPtr(hwnd, GWLP_USERDATA)))->runProc(Message, wParam, lParam));
};
LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam);
void SendHitMessage();
};
#endif // __TOOLTIP_H__

View File

@ -142,7 +142,7 @@ void NativeLangSpeaker::init(TiXmlDocumentA *nativeLangDocRootA, bool loadIfEngl
}
}
generic_string NativeLangSpeaker::getSpecialMenuEntryName(const char *entryName)
generic_string NativeLangSpeaker::getSpecialMenuEntryName(const char *entryName) const
{
if (!_nativeLangA) return TEXT("");
TiXmlNodeA *mainMenu = _nativeLangA->FirstChild("Menu");
@ -173,7 +173,7 @@ generic_string NativeLangSpeaker::getSpecialMenuEntryName(const char *entryName)
return TEXT("");
}
generic_string NativeLangSpeaker::getNativeLangMenuString(int itemID)
generic_string NativeLangSpeaker::getNativeLangMenuString(int itemID) const
{
if (!_nativeLangA)
return TEXT("");
@ -207,6 +207,30 @@ generic_string NativeLangSpeaker::getNativeLangMenuString(int itemID)
return TEXT("");
}
generic_string NativeLangSpeaker::getLocalizedStrFromID(const char *strID) const
{
if (not _nativeLangA)
return TEXT("");
if (not strID)
return TEXT("");
TiXmlNodeA *node = _nativeLangA->FirstChild("MiscStrings");
if (not node) return TEXT("");
node = node->FirstChild(strID);
if (not node) return TEXT("");
TiXmlElementA *element = node->ToElement();
const char *value = element->Attribute("value");
if (not value) return TEXT("");
WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
return wmc->char2wchar(value, _nativeLangEncoding);
}
MenuPosition & getMenuPosition(const char *id)
{

View File

@ -56,8 +56,8 @@ public:
TiXmlNodeA * searchDlgNode(TiXmlNodeA *node, const char *dlgTagName);
bool changeDlgLang(HWND hDlg, const char *dlgTagName, char *title = NULL);
void changeLangTabDrapContextMenu(HMENU hCM);
generic_string getSpecialMenuEntryName(const char *entryName);
generic_string getNativeLangMenuString(int itemID);
generic_string getSpecialMenuEntryName(const char *entryName) const;
generic_string getNativeLangMenuString(int itemID) const;
void changeMenuLang(HMENU menuHandle, generic_string & pluginsTrans, generic_string & windowTrans);
void changeShortcutLang();
void changeShortcutmapperLang(ShortcutMapper * sm);
@ -85,6 +85,8 @@ public:
generic_string getProjectPanelLangMenuStr(const char * nodeName, int cmdID, const TCHAR *defaultStr) const;
//generic_string getFileBrowserLangMenuStr(const char * nodeName, int cmdID, const TCHAR *defaultStr) const;
generic_string getAttrNameStr(const TCHAR *defaultStr, const char *nodeL1Name, const char *nodeL2Name = NULL) const;
generic_string getLocalizedStrFromID(const char *strID) const;
int messageBox(const char *msgBoxTagName, HWND hWnd, const TCHAR *message, const TCHAR *title, int msgBoxType, int intInfo = 0, const TCHAR *strInfo = NULL);
private:
TiXmlNodeA *_nativeLangA;

View File

@ -410,6 +410,7 @@
#define NPPM_INTERNAL_RELOADSCROLLTOEND (NOTEPADPLUS_USER_INTERNAL + 42) // Used by Monitoring feature
#define NPPM_INTERNAL_FINDKEYCONFLICTS (NOTEPADPLUS_USER_INTERNAL + 43)
#define NPPM_INTERNAL_SCROLLBEYONDLASTLINE (NOTEPADPLUS_USER_INTERNAL + 44)
#define NPPM_INTERNAL_SETWORDCHARS (NOTEPADPLUS_USER_INTERNAL + 45)
//wParam: 0
//lParam: document new index