Enhance Shortcut Mapper and make it translatable

This commit is contained in:
Don HO 2018-02-10 18:52:59 +01:00
parent 70f7287e58
commit fb17638de7
9 changed files with 316 additions and 190 deletions

View File

@ -447,6 +447,31 @@
<Item id="2232" name="啟用共用底線字"/> <Item id="2232" name="啟用共用底線字"/>
</SubDialog> </SubDialog>
</StyleConfig> </StyleConfig>
<ShortcutMapper title="快速鍵管理">
<Item id="2602" name="修改"/>
<Item id="2603" name="刪除"/>
<Item id="2606" name="清除"/>
<Item id="1" name="關閉"/>
<ColumnName name="名稱"/>
<ColumnShortcut name="快速鍵"/>
<ColumnCategory name="類別"/>
<ColumnPlugin name="外掛"/>
<MainMenuTab name="主選單"/>
<MacrosTab name="巨集"/>
<RunCommandsTab name="自訂指令"/>
<PluginCommandsTab name="外掛指令"/>
<ScintillaCommandsTab name="Scintilla 指令"/>
</ShortcutMapper>
<ShortcutMapperSubDialg title="快速鍵設定">
<Item id="1" name="確認"/>
<Item id="2" name="取消"/>
<Item id="5006" name="名稱"/>
<Item id="5008" name="增加"/>
<Item id="5009" name="移除"/>
<Item id="5010" name="套用"/>
<Item id="5007" name="這將會移除快速鍵"/>
<Item id="5012" name="快速鍵重複定義"/>
</ShortcutMapperSubDialg>
<UserDefine title="自訂程式語言"> <UserDefine title="自訂程式語言">
<Item id="20001" name="停靠面板"/> <Item id="20001" name="停靠面板"/>
<Item id="20002" name="重新命名"/> <Item id="20002" name="重新命名"/>

View File

@ -446,9 +446,33 @@
<Item id="2231" name="Enable global italic font style"/> <Item id="2231" name="Enable global italic font style"/>
<Item id="2232" name="Enable global underline font style"/> <Item id="2232" name="Enable global underline font style"/>
</SubDialog> </SubDialog>
</StyleConfig> </StyleConfig>
<ShortcutMapper title="Shortcut Mapper">
<Item id="2602" name="Modify"/>
<Item id="2603" name="Delete"/>
<Item id="2606" name="Clear"/>
<Item id="1" name="Close"/>
<ColumnName name="Name"/>
<ColumnShortcut name="Shortcut"/>
<ColumnCategory name="Category"/>
<ColumnPlugin name="Plugin"/>
<MainMenuTab name="Main menu"/>
<MacrosTab name="Macros"/>
<RunCommandsTab name="Run commands"/>
<PluginCommandsTab name="Plugin commands"/>
<ScintillaCommandsTab name="Scintilla commands"/>
</ShortcutMapper>
<ShortcutMapperSubDialg title="Shortcut">
<Item id="1" name="OK"/>
<Item id="2" name="Cancel"/>
<Item id="5006" name="Name"/>
<Item id="5008" name="Add"/>
<Item id="5009" name="Remove"/>
<Item id="5010" name="Apply"/>
<Item id="5007" name="This will remove the accelerator"/>
<Item id="5012" name="CONFLICT FOUND!"/>
</ShortcutMapperSubDialg>
<UserDefine title="User-Defined"> <UserDefine title="User-Defined">
<Item id="20001" name="Dock"/> <Item id="20001" name="Dock"/>
<Item id="20002" name="Rename"/> <Item id="20002" name="Rename"/>
@ -987,6 +1011,7 @@ Do you want to continue?"/>
<UDLNewNameError title="UDL Error" message="This name is used by another language, <UDLNewNameError title="UDL Error" message="This name is used by another language,
please give another one."/> please give another one."/>
<UDLRemoveCurrentLang title="Remove the current language" message="Are you sure?"/> <UDLRemoveCurrentLang title="Remove the current language" message="Are you sure?"/>
<SCMapperDoDeleteOrNot title="Are you sure?" message="Are you sure you want to delete this shortcut?"/>
<FindCharRangeValueError title="Range Value problem" message="You should type between from 0 to 255."/> <FindCharRangeValueError title="Range Value problem" message="You should type between from 0 to 255."/>
</MessageBox> </MessageBox>
<ClipboardHistory> <ClipboardHistory>

View File

@ -2458,7 +2458,6 @@ void Notepad_plus::command(int id)
GridState st = id==IDM_SETTING_SHORTCUT_MAPPER_MACRO?STATE_MACRO:id==IDM_SETTING_SHORTCUT_MAPPER_RUN?STATE_USER:STATE_MENU; GridState st = id==IDM_SETTING_SHORTCUT_MAPPER_MACRO?STATE_MACRO:id==IDM_SETTING_SHORTCUT_MAPPER_RUN?STATE_USER:STATE_MENU;
ShortcutMapper shortcutMapper; ShortcutMapper shortcutMapper;
shortcutMapper.init(_pPublicInterface->getHinst(), _pPublicInterface->getHSelf(), st); shortcutMapper.init(_pPublicInterface->getHinst(), _pPublicInterface->getHSelf(), st);
_nativeLangSpeaker.changeShortcutmapperLang(&shortcutMapper);
shortcutMapper.doDialog(_nativeLangSpeaker.isRTL()); shortcutMapper.doDialog(_nativeLangSpeaker.isRTL());
shortcutMapper.destroy(); shortcutMapper.destroy();
break; break;

View File

@ -29,28 +29,22 @@
#include "ShortcutMapper.h" #include "ShortcutMapper.h"
#include "Notepad_plus.h" #include "Notepad_plus.h"
#ifdef UNICODE
#define numToStr std::to_wstring
#else
#define numToStr std::to_string
#endif //UNICODE
using namespace std; using namespace std;
void ShortcutMapper::initTabs() { void ShortcutMapper::initTabs()
{
HWND hTab = _hTabCtrl = ::GetDlgItem(_hSelf, IDC_BABYGRID_TABBAR); HWND hTab = _hTabCtrl = ::GetDlgItem(_hSelf, IDC_BABYGRID_TABBAR);
TCITEM tie; TCITEM tie;
tie.mask = TCIF_TEXT; tie.mask = TCIF_TEXT;
tie.pszText = tabNames[0];
::SendMessage(hTab, TCM_INSERTITEM, 0, reinterpret_cast<LPARAM>(&tie)); for (size_t i = 0; i < _nbTab; ++i)
tie.pszText = tabNames[1]; {
::SendMessage(hTab, TCM_INSERTITEM, 1, reinterpret_cast<LPARAM>(&tie)); _tabNames[i] = getTabString(i);
tie.pszText = tabNames[2];
::SendMessage(hTab, TCM_INSERTITEM, 2, reinterpret_cast<LPARAM>(&tie)); tie.pszText = const_cast<LPWSTR>(_tabNames[i].c_str());
tie.pszText = tabNames[3]; ::SendMessage(hTab, TCM_INSERTITEM, i, reinterpret_cast<LPARAM>(&tie));
::SendMessage(hTab, TCM_INSERTITEM, 3, reinterpret_cast<LPARAM>(&tie)); }
tie.pszText = tabNames[4];
::SendMessage(hTab, TCM_INSERTITEM, 4, reinterpret_cast<LPARAM>(&tie));
TabCtrl_SetCurSel(_hTabCtrl, int(_currentState)); TabCtrl_SetCurSel(_hTabCtrl, int(_currentState));
@ -78,10 +72,29 @@ void ShortcutMapper::getClientRect(RECT & rc) const
rc.right -= NppParameters::getInstance()->_dpiManager.scaleX(5); rc.right -= NppParameters::getInstance()->_dpiManager.scaleX(5);
} }
void ShortcutMapper::translateTab(int index, const TCHAR * newname) { generic_string ShortcutMapper::getTabString(size_t i) const
if (index < 0 || index > 4) {
return; if (i >= _nbTab)
generic_strncpy(tabNames[index], newname, maxTabName); return TEXT("");
NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance()->getNativeLangSpeaker();
switch (i)
{
case 1:
return nativeLangSpeaker->getShortcutMapperLangStr("MacrosTab", TEXT("Macros"));
case 2:
return nativeLangSpeaker->getShortcutMapperLangStr("RunCommandsTab", TEXT("Run commands"));
case 3:
return nativeLangSpeaker->getShortcutMapperLangStr("PluginCommandsTab", TEXT("Plugin commands"));
case 4:
return nativeLangSpeaker->getShortcutMapperLangStr("ScintillaCommandsTab", TEXT("Scintilla commands"));
default: //0
return nativeLangSpeaker->getShortcutMapperLangStr("MainMenuTab", TEXT("Main menu"));
}
} }
void ShortcutMapper::initBabyGrid() { void ShortcutMapper::initBabyGrid() {
@ -122,6 +135,8 @@ void ShortcutMapper::initBabyGrid() {
_babygrid.setProtectColor(RGB(255,130,120)); _babygrid.setProtectColor(RGB(255,130,120));
_babygrid.setHighlightColorProtect(RGB(244,10,20)); _babygrid.setHighlightColorProtect(RGB(244,10,20));
_babygrid.setHighlightColorProtectNoFocus(RGB(230,194,190)); _babygrid.setHighlightColorProtectNoFocus(RGB(230,194,190));
NppParameters::getInstance()->getNativeLangSpeaker()->changeDlgLang(_hSelf, "ShortcutMapper");
} }
void ShortcutMapper::fillOutBabyGrid() void ShortcutMapper::fillOutBabyGrid()
@ -131,57 +146,82 @@ void ShortcutMapper::fillOutBabyGrid()
_babygrid.setInitialContent(true); _babygrid.setInitialContent(true);
size_t nbItems = 0; size_t nbItems = 0;
NativeLangSpeaker* nativeLangSpeaker = nppParam->getNativeLangSpeaker();
generic_string nameStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnName", TEXT("Name"));
generic_string shortcutStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnShortcut", TEXT("Shortcut"));
_babygrid.setText(0, 1, TEXT("Name")); _babygrid.setText(0, 1, nameStr.c_str());
_babygrid.setText(0, 2, TEXT("Shortcut")); _babygrid.setText(0, 2, shortcutStr.c_str());
switch(_currentState) { switch(_currentState)
case STATE_MENU: { {
case STATE_MENU:
{
nbItems = nppParam->getUserShortcuts().size(); nbItems = nppParam->getUserShortcuts().size();
_babygrid.setLineColNumber(nbItems, 3); _babygrid.setLineColNumber(nbItems, 3);
_babygrid.setText(0, 3, TEXT("Category")); generic_string categoryStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnCategory", TEXT("Category"));
break; } _babygrid.setText(0, 3, categoryStr.c_str());
case STATE_MACRO: { }
break;
case STATE_MACRO:
{
nbItems = nppParam->getMacroList().size(); nbItems = nppParam->getMacroList().size();
_babygrid.setLineColNumber(nbItems, 2); _babygrid.setLineColNumber(nbItems, 2);
break; } }
case STATE_USER: { break;
case STATE_USER:
{
nbItems = nppParam->getUserCommandList().size(); nbItems = nppParam->getUserCommandList().size();
_babygrid.setLineColNumber(nbItems, 2); _babygrid.setLineColNumber(nbItems, 2);
break; } }
case STATE_PLUGIN: { break;
case STATE_PLUGIN:
{
nbItems = nppParam->getPluginCommandList().size(); nbItems = nppParam->getPluginCommandList().size();
_babygrid.setLineColNumber(nbItems, 3); _babygrid.setLineColNumber(nbItems, 3);
_babygrid.setText(0, 3, TEXT("Plugin")); generic_string pluginStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnPlugin", TEXT("Plugin"));
break; } _babygrid.setText(0, 3, pluginStr.c_str());
case STATE_SCINTILLA: { }
break;
case STATE_SCINTILLA:
{
nbItems = nppParam->getScintillaKeyList().size(); nbItems = nppParam->getScintillaKeyList().size();
_babygrid.setLineColNumber(nbItems, 2); _babygrid.setLineColNumber(nbItems, 2);
break; } }
break;
} }
bool isMarker = false; bool isMarker = false;
switch(_currentState) { switch(_currentState)
case STATE_MENU: { {
case STATE_MENU:
{
vector<CommandShortcut> & cshortcuts = nppParam->getUserShortcuts(); vector<CommandShortcut> & cshortcuts = nppParam->getUserShortcuts();
for(size_t i = 0; i < nbItems; ++i) for (size_t i = 0; i < nbItems; ++i)
{ {
if (findKeyConflicts(nullptr, cshortcuts[i].getKeyCombo(), i)) if (findKeyConflicts(nullptr, cshortcuts[i].getKeyCombo(), i))
isMarker = _babygrid.setMarker(true); isMarker = _babygrid.setMarker(true);
_babygrid.setText(i+1, 1, cshortcuts[i].getName()); _babygrid.setText(i + 1, 1, cshortcuts[i].getName());
if (cshortcuts[i].isEnabled()) //avoid empty strings for better performance if (cshortcuts[i].isEnabled()) //avoid empty strings for better performance
_babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str()); _babygrid.setText(i + 1, 2, cshortcuts[i].toString().c_str());
_babygrid.setText(i+1, 3, cshortcuts[i].getCategory()); _babygrid.setText(i + 1, 3, cshortcuts[i].getCategory());
if (isMarker) if (isMarker)
isMarker = _babygrid.setMarker(false); isMarker = _babygrid.setMarker(false);
} }
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), true); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), true);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), true); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), true);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), false); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), false);
break; } }
case STATE_MACRO: { break;
case STATE_MACRO:
{
vector<MacroShortcut> & cshortcuts = nppParam->getMacroList(); vector<MacroShortcut> & cshortcuts = nppParam->getMacroList();
for(size_t i = 0; i < nbItems; ++i) for(size_t i = 0; i < nbItems; ++i)
{ {
@ -199,8 +239,11 @@ void ShortcutMapper::fillOutBabyGrid()
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), shouldBeEnabled);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), shouldBeEnabled);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), shouldBeEnabled);
break; } }
case STATE_USER: { break;
case STATE_USER:
{
vector<UserCommand> & cshortcuts = nppParam->getUserCommandList(); vector<UserCommand> & cshortcuts = nppParam->getUserCommandList();
for(size_t i = 0; i < nbItems; ++i) for(size_t i = 0; i < nbItems; ++i)
{ {
@ -218,8 +261,11 @@ void ShortcutMapper::fillOutBabyGrid()
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), shouldBeEnabled);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), shouldBeEnabled);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), shouldBeEnabled);
break; } }
case STATE_PLUGIN: { break;
case STATE_PLUGIN:
{
vector<PluginCmdShortcut> & cshortcuts = nppParam->getPluginCommandList(); vector<PluginCmdShortcut> & cshortcuts = nppParam->getPluginCommandList();
for(size_t i = 0; i < nbItems; ++i) for(size_t i = 0; i < nbItems; ++i)
{ {
@ -238,8 +284,11 @@ void ShortcutMapper::fillOutBabyGrid()
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), shouldBeEnabled);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), shouldBeEnabled); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), shouldBeEnabled);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), false); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), false);
break; } }
case STATE_SCINTILLA: { break;
case STATE_SCINTILLA:
{
vector<ScintillaKeyMap> & cshortcuts = nppParam->getScintillaKeyList(); vector<ScintillaKeyMap> & cshortcuts = nppParam->getScintillaKeyList();
for(size_t i = 0; i < nbItems; ++i) for(size_t i = 0; i < nbItems; ++i)
{ {
@ -266,14 +315,15 @@ void ShortcutMapper::fillOutBabyGrid()
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), true); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_MODIFY), true);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), false); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_CLEAR), false);
::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), false); ::EnableWindow(::GetDlgItem(_hSelf, IDM_BABYGRID_DELETE), false);
break; } }
break;
} }
if (nbItems > 0)
//restore the last view if (nbItems > 0) //restore the last view
_babygrid.setLastView(_lastHomeRow[_currentState], _lastCursorRow[_currentState]); _babygrid.setLastView(_lastHomeRow[_currentState], _lastCursorRow[_currentState]);
else else //clear the info area
//clear the info area
::SendDlgItemMessage(_hSelf, IDC_BABYGRID_INFO, WM_SETTEXT, 0, 0); ::SendDlgItemMessage(_hSelf, IDC_BABYGRID_INFO, WM_SETTEXT, 0, 0);
_babygrid.setInitialContent(false); _babygrid.setInitialContent(false);
} }
@ -295,32 +345,42 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
{ {
for (const HFONT & hFont : _hGridFonts) for (const HFONT & hFont : _hGridFonts)
::DeleteObject(hFont); ::DeleteObject(hFont);
_hGridFonts.clear(); _hGridFonts.clear();
_hGridFonts.shrink_to_fit(); _hGridFonts.shrink_to_fit();
break;
} }
break;
case WM_NOTIFY: { case WM_NOTIFY:
{
NMHDR nmh = *((NMHDR*)lParam); NMHDR nmh = *((NMHDR*)lParam);
if (nmh.hwndFrom == _hTabCtrl) { if (nmh.hwndFrom == _hTabCtrl)
if (nmh.code == TCN_SELCHANGE) { {
if (nmh.code == TCN_SELCHANGE)
{
//save the current view //save the current view
_lastHomeRow[_currentState] = _babygrid.getHomeRow(); _lastHomeRow[_currentState] = _babygrid.getHomeRow();
_lastCursorRow[_currentState] = _babygrid.getSelectedRow(); _lastCursorRow[_currentState] = _babygrid.getSelectedRow();
int index = TabCtrl_GetCurSel(_hTabCtrl); int index = TabCtrl_GetCurSel(_hTabCtrl);
switch (index) {
switch (index)
{
case 0: case 0:
_currentState = STATE_MENU; _currentState = STATE_MENU;
break; break;
case 1: case 1:
_currentState = STATE_MACRO; _currentState = STATE_MACRO;
break; break;
case 2: case 2:
_currentState = STATE_USER; _currentState = STATE_USER;
break; break;
case 3: case 3:
_currentState = STATE_PLUGIN; _currentState = STATE_PLUGIN;
break; break;
case 4: case 4:
_currentState = STATE_SCINTILLA; _currentState = STATE_SCINTILLA;
break; break;
@ -328,7 +388,8 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
fillOutBabyGrid(); fillOutBabyGrid();
} }
} }
break; } }
break;
case NPPM_INTERNAL_FINDKEYCONFLICTS: case NPPM_INTERNAL_FINDKEYCONFLICTS:
{ {
@ -339,6 +400,7 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
const bool isConflict = findKeyConflicts(&conflictInfo, *reinterpret_cast<KeyCombo*>(wParam), _babygrid.getSelectedRow() - 1); const bool isConflict = findKeyConflicts(&conflictInfo, *reinterpret_cast<KeyCombo*>(wParam), _babygrid.getSelectedRow() - 1);
*reinterpret_cast<bool*>(lParam) = isConflict; *reinterpret_cast<bool*>(lParam) = isConflict;
if (isConflict) if (isConflict)
::SendDlgItemMessage(_hSelf, IDC_BABYGRID_INFO, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(conflictInfo.c_str())); ::SendDlgItemMessage(_hSelf, IDC_BABYGRID_INFO, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(conflictInfo.c_str()));
else else
@ -381,8 +443,8 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
csc.clear(); csc.clear();
shortcuts[row - 1] = csc; shortcuts[row - 1] = csc;
//shortcut was altered //shortcut was altered
nppParam->addUserModifiedIndex(row-1); nppParam->addUserModifiedIndex(row - 1);
//save the current view //save the current view
_lastHomeRow[_currentState] = _babygrid.getHomeRow(); _lastHomeRow[_currentState] = _babygrid.getHomeRow();
_lastCursorRow[_currentState] = _babygrid.getSelectedRow(); _lastCursorRow[_currentState] = _babygrid.getSelectedRow();
@ -393,8 +455,9 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
//Notify current Accelerator class to update everything //Notify current Accelerator class to update everything
nppParam->getAccelerator()->updateShortcuts(); nppParam->getAccelerator()->updateShortcuts();
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
break;
} }
break;
case STATE_MACRO: case STATE_MACRO:
{ {
//Get MacroShortcut corresponding to row //Get MacroShortcut corresponding to row
@ -412,15 +475,16 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
//Notify current Accelerator class to update everything //Notify current Accelerator class to update everything
nppParam->getAccelerator()->updateShortcuts(); nppParam->getAccelerator()->updateShortcuts();
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
break;
} }
break;
case STATE_USER: case STATE_USER:
{ {
//Get UserCommand corresponding to row //Get UserCommand corresponding to row
vector<UserCommand> & shortcuts = nppParam->getUserCommandList(); vector<UserCommand> & shortcuts = nppParam->getUserCommandList();
UserCommand ucmd = shortcuts[row - 1]; UserCommand ucmd = shortcuts[row - 1];
ucmd.clear(); ucmd.clear();
//shortcut was altered //shortcut was altered
shortcuts[row - 1] = ucmd; shortcuts[row - 1] = ucmd;
@ -434,8 +498,9 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
//Notify current Accelerator class to update everything //Notify current Accelerator class to update everything
nppParam->getAccelerator()->updateShortcuts(); nppParam->getAccelerator()->updateShortcuts();
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
break;
} }
break;
case STATE_PLUGIN: case STATE_PLUGIN:
{ {
//Get PluginCmdShortcut corresponding to row //Get PluginCmdShortcut corresponding to row
@ -443,9 +508,9 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
PluginCmdShortcut pcsc = shortcuts[row - 1]; PluginCmdShortcut pcsc = shortcuts[row - 1];
pcsc.clear(); pcsc.clear();
//shortcut was altered //shortcut was altered
nppParam->addPluginModifiedIndex(row-1); nppParam->addPluginModifiedIndex(row - 1);
shortcuts[row - 1] = pcsc; shortcuts[row - 1] = pcsc;
//save the current view //save the current view
_lastHomeRow[_currentState] = _babygrid.getHomeRow(); _lastHomeRow[_currentState] = _babygrid.getHomeRow();
_lastCursorRow[_currentState] = _babygrid.getSelectedRow(); _lastCursorRow[_currentState] = _babygrid.getSelectedRow();
@ -464,18 +529,23 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
::SendMessage(_hParent, NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED, cmdID, reinterpret_cast<LPARAM>(&shortcut)); ::SendMessage(_hParent, NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED, cmdID, reinterpret_cast<LPARAM>(&shortcut));
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
break;
} }
break;
case STATE_SCINTILLA: case STATE_SCINTILLA:
{ {
// Do nothing // Do nothing
break;
} }
break;
} }
if (not isModified) if (not isModified)
::SendMessage(_hSelf, WM_COMMAND, MAKEWPARAM(IDD_BABYGRID_ID1, BGN_ROWCHANGED), row); ::SendMessage(_hSelf, WM_COMMAND, MAKEWPARAM(IDD_BABYGRID_ID1, BGN_ROWCHANGED), row);
return TRUE; return TRUE;
} }
case IDM_BABYGRID_MODIFY : case IDM_BABYGRID_MODIFY :
{ {
if (_babygrid.getNumberRows() < 1) if (_babygrid.getNumberRows() < 1)
@ -496,7 +566,7 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
if (csc.doDialog() != -1 && prevcsc != csc) if (csc.doDialog() != -1 && prevcsc != csc)
{ {
//shortcut was altered //shortcut was altered
nppParam->addUserModifiedIndex(row-1); nppParam->addUserModifiedIndex(row - 1);
shortcuts[row - 1] = csc; shortcuts[row - 1] = csc;
//save the current view //save the current view
@ -510,8 +580,8 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
nppParam->getAccelerator()->updateShortcuts(); nppParam->getAccelerator()->updateShortcuts();
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
} }
break;
} }
break;
case STATE_MACRO: case STATE_MACRO:
{ {
@ -535,8 +605,8 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
nppParam->getAccelerator()->updateShortcuts(); nppParam->getAccelerator()->updateShortcuts();
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
} }
break;
} }
break;
case STATE_USER: case STATE_USER:
{ {
@ -546,7 +616,7 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
ucmd.init(_hInst, _hSelf); ucmd.init(_hInst, _hSelf);
UserCommand prevucmd = ucmd; UserCommand prevucmd = ucmd;
if (ucmd.doDialog() != -1 && prevucmd != ucmd) if (ucmd.doDialog() != -1 && prevucmd != ucmd)
{ {
//shortcut was altered //shortcut was altered
shortcuts[row - 1] = ucmd; shortcuts[row - 1] = ucmd;
@ -561,8 +631,8 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
nppParam->getAccelerator()->updateShortcuts(); nppParam->getAccelerator()->updateShortcuts();
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
} }
break;
} }
break;
case STATE_PLUGIN: case STATE_PLUGIN:
{ {
@ -574,7 +644,7 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
if (pcsc.doDialog() != -1 && prevpcsc != pcsc) if (pcsc.doDialog() != -1 && prevpcsc != pcsc)
{ {
//shortcut was altered //shortcut was altered
nppParam->addPluginModifiedIndex(row-1); nppParam->addPluginModifiedIndex(row - 1);
shortcuts[row - 1] = pcsc; shortcuts[row - 1] = pcsc;
//save the current view //save the current view
@ -596,20 +666,20 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
::SendMessage(_hParent, NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED, cmdID, reinterpret_cast<LPARAM>(&shortcut)); ::SendMessage(_hParent, NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED, cmdID, reinterpret_cast<LPARAM>(&shortcut));
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
} }
break;
} }
break;
case STATE_SCINTILLA: case STATE_SCINTILLA:
{ {
//Get ScintillaKeyMap corresponding to row //Get ScintillaKeyMap corresponding to row
vector<ScintillaKeyMap> & shortcuts = nppParam->getScintillaKeyList(); vector<ScintillaKeyMap> & shortcuts = nppParam->getScintillaKeyList();
ScintillaKeyMap skm = shortcuts[row - 1], prevskm = shortcuts[row-1]; ScintillaKeyMap skm = shortcuts[row - 1], prevskm = shortcuts[row - 1];
skm.init(_hInst, _hSelf); skm.init(_hInst, _hSelf);
if (skm.doDialog() != -1 && prevskm != skm) if (skm.doDialog() != -1 && prevskm != skm)
{ {
//shortcut was altered //shortcut was altered
nppParam->addScintillaModifiedIndex(row-1); nppParam->addScintillaModifiedIndex(row - 1);
shortcuts[row-1] = skm; shortcuts[row - 1] = skm;
//save the current view //save the current view
_lastHomeRow[_currentState] = _babygrid.getHomeRow(); _lastHomeRow[_currentState] = _babygrid.getHomeRow();
@ -623,11 +693,13 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
nppParam->getScintillaAccelerator()->updateKeys(); nppParam->getScintillaAccelerator()->updateKeys();
nppParam->setShortcutDirty(); nppParam->setShortcutDirty();
} }
break;
} }
break;
} }
if (not isModified) if (not isModified)
::SendMessage(_hSelf, WM_COMMAND, MAKEWPARAM(IDD_BABYGRID_ID1, BGN_ROWCHANGED), row); ::SendMessage(_hSelf, WM_COMMAND, MAKEWPARAM(IDD_BABYGRID_ID1, BGN_ROWCHANGED), row);
return TRUE; return TRUE;
} }
@ -636,9 +708,15 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
if (_babygrid.getNumberRows() < 1) if (_babygrid.getNumberRows() < 1)
return TRUE; return TRUE;
if (::MessageBox(_hSelf, TEXT("Are you sure you want to delete this shortcut?"), TEXT("Are you sure?"), MB_OKCANCEL) == IDOK) NppParameters *nppParam = NppParameters::getInstance();
int res = nppParam->getNativeLangSpeaker()->messageBox("SCMapperDoDeleteOrNot",
_hSelf,
TEXT("Are you sure you want to delete this shortcut?"),
TEXT("Are you sure?"),
MB_OKCANCEL);
if (res == IDOK)
{ {
NppParameters *nppParam = NppParameters::getInstance();
const int row = _babygrid.getSelectedRow(); const int row = _babygrid.getSelectedRow();
int shortcutIndex = row-1; int shortcutIndex = row-1;
DWORD cmdID = 0; DWORD cmdID = 0;
@ -675,21 +753,21 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
--_lastCursorRow[_currentState]; --_lastCursorRow[_currentState];
fillOutBabyGrid(); fillOutBabyGrid();
// preparing to remove from menu // preparing to remove from menu
posBase = 6; posBase = 6;
nbElem = theMacros.size(); nbElem = theMacros.size();
HMENU m = reinterpret_cast<HMENU>(::SendMessage(_hParent, NPPM_INTERNAL_GETMENU, 0, 0)); HMENU m = reinterpret_cast<HMENU>(::SendMessage(_hParent, NPPM_INTERNAL_GETMENU, 0, 0));
hMenu = ::GetSubMenu(m, MENUINDEX_MACRO); hMenu = ::GetSubMenu(m, MENUINDEX_MACRO);
modifCmd = IDM_SETTING_SHORTCUT_MAPPER_MACRO; modifCmd = IDM_SETTING_SHORTCUT_MAPPER_MACRO;
for (size_t i = shortcutIndex ; i < nbElem ; ++i) //lower the IDs of the remaining items so there are no gaps for (size_t i = shortcutIndex; i < nbElem; ++i) //lower the IDs of the remaining items so there are no gaps
{ {
MacroShortcut ms = theMacros[i]; MacroShortcut ms = theMacros[i];
ms.setID(ms.getID() - 1); //shift all IDs ms.setID(ms.getID() - 1); //shift all IDs
theMacros[i] = ms; theMacros[i] = ms;
} }
break;
} }
break;
case STATE_USER: case STATE_USER:
{ {
@ -709,21 +787,21 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
--_lastCursorRow[_currentState]; --_lastCursorRow[_currentState];
fillOutBabyGrid(); fillOutBabyGrid();
// preparing to remove from menu // preparing to remove from menu
posBase = 2; posBase = 2;
nbElem = theUserCmds.size(); nbElem = theUserCmds.size();
HMENU m = reinterpret_cast<HMENU>(::SendMessage(_hParent, NPPM_INTERNAL_GETMENU, 0, 0)); HMENU m = reinterpret_cast<HMENU>(::SendMessage(_hParent, NPPM_INTERNAL_GETMENU, 0, 0));
hMenu = ::GetSubMenu(m, MENUINDEX_RUN); hMenu = ::GetSubMenu(m, MENUINDEX_RUN);
modifCmd = IDM_SETTING_SHORTCUT_MAPPER_RUN; modifCmd = IDM_SETTING_SHORTCUT_MAPPER_RUN;
for (size_t i = shortcutIndex ; i < nbElem ; ++i) //lower the IDs of the remaining items so there are no gaps for (size_t i = shortcutIndex; i < nbElem; ++i) //lower the IDs of the remaining items so there are no gaps
{ {
UserCommand uc = theUserCmds[i]; UserCommand uc = theUserCmds[i];
uc.setID(uc.getID() - 1); //shift all IDs uc.setID(uc.getID() - 1); //shift all IDs
theUserCmds[i] = uc; theUserCmds[i] = uc;
} }
break;
} }
break;
} }
// updateShortcuts() will update all menu item - the menu items will be shifted // updateShortcuts() will update all menu item - the menu items will be shifted
@ -781,16 +859,23 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
_rightClickMenu.enableItem(IDM_BABYGRID_CLEAR, false); _rightClickMenu.enableItem(IDM_BABYGRID_CLEAR, false);
else else
_rightClickMenu.enableItem(IDM_BABYGRID_CLEAR, true); _rightClickMenu.enableItem(IDM_BABYGRID_CLEAR, true);
switch(_currentState) {
switch(_currentState)
{
case STATE_MACRO: case STATE_MACRO:
case STATE_USER: { case STATE_USER:
{
_rightClickMenu.enableItem(IDM_BABYGRID_DELETE, true); _rightClickMenu.enableItem(IDM_BABYGRID_DELETE, true);
break; } }
break;
case STATE_MENU: case STATE_MENU:
case STATE_PLUGIN: case STATE_PLUGIN:
case STATE_SCINTILLA: { case STATE_SCINTILLA:
{
_rightClickMenu.enableItem(IDM_BABYGRID_DELETE, false); _rightClickMenu.enableItem(IDM_BABYGRID_DELETE, false);
break; } }
break;
} }
} }
@ -824,34 +909,38 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
{ {
vector<CommandShortcut> & vShortcuts = nppParam->getUserShortcuts(); vector<CommandShortcut> & vShortcuts = nppParam->getUserShortcuts();
findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex); findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex);
break;
} }
break;
case STATE_MACRO: case STATE_MACRO:
{ {
vector<MacroShortcut> & vShortcuts = nppParam->getMacroList(); vector<MacroShortcut> & vShortcuts = nppParam->getMacroList();
findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex); findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex);
break;
} }
break;
case STATE_USER: case STATE_USER:
{ {
vector<UserCommand> & vShortcuts = nppParam->getUserCommandList(); vector<UserCommand> & vShortcuts = nppParam->getUserCommandList();
findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex); findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex);
break;
} }
break;
case STATE_PLUGIN: case STATE_PLUGIN:
{ {
vector<PluginCmdShortcut> & vShortcuts = nppParam->getPluginCommandList(); vector<PluginCmdShortcut> & vShortcuts = nppParam->getPluginCommandList();
findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex); findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyCombo(), currentIndex);
break;
} }
break;
case STATE_SCINTILLA: case STATE_SCINTILLA:
{ {
vector<ScintillaKeyMap> & vShortcuts = nppParam->getScintillaKeyList(); vector<ScintillaKeyMap> & vShortcuts = nppParam->getScintillaKeyList();
size_t sciCombos = vShortcuts[currentIndex].getSize(); size_t sciCombos = vShortcuts[currentIndex].getSize();
for (size_t sciIndex = 0; sciIndex < sciCombos; ++sciIndex) for (size_t sciIndex = 0; sciIndex < sciCombos; ++sciIndex)
findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyComboByIndex(sciIndex), currentIndex); findKeyConflicts(&conflictInfo, vShortcuts[currentIndex].getKeyComboByIndex(sciIndex), currentIndex);
break;
} }
break;
} }
if (conflictInfo.empty()) if (conflictInfo.empty())
@ -861,13 +950,16 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM
return TRUE; return TRUE;
} }
} //switch (HIWORD(wParam)) }
} }
} //switch (LOWORD(wParam)) }
} }
default: default:
return FALSE; return FALSE;
} //switch (message)
}
return FALSE; return FALSE;
} }
@ -905,9 +997,9 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
{ {
if (not keyConflictLocation->empty()) if (not keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += TEXT("\r\n");
*keyConflictLocation += tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += TEXT(" | ");
*keyConflictLocation += numToStr(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += TEXT(" ");
*keyConflictLocation += vShortcuts[itemIndex].getName(); *keyConflictLocation += vShortcuts[itemIndex].getName();
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += TEXT(" ( ");
@ -939,9 +1031,9 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
{ {
if (not keyConflictLocation->empty()) if (not keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += TEXT("\r\n");
*keyConflictLocation += tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += TEXT(" | ");
*keyConflictLocation += numToStr(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += TEXT(" ");
*keyConflictLocation += vShortcuts[itemIndex].getName(); *keyConflictLocation += vShortcuts[itemIndex].getName();
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += TEXT(" ( ");
@ -973,9 +1065,9 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
{ {
if (not keyConflictLocation->empty()) if (not keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += TEXT("\r\n");
*keyConflictLocation += tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += TEXT(" | ");
*keyConflictLocation += numToStr(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += TEXT(" ");
*keyConflictLocation += vShortcuts[itemIndex].getName(); *keyConflictLocation += vShortcuts[itemIndex].getName();
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += TEXT(" ( ");
@ -1007,9 +1099,9 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
{ {
if (not keyConflictLocation->empty()) if (not keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += TEXT("\r\n");
*keyConflictLocation += tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += TEXT(" | ");
*keyConflictLocation += numToStr(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += TEXT(" ");
*keyConflictLocation += vShortcuts[itemIndex].getName(); *keyConflictLocation += vShortcuts[itemIndex].getName();
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += TEXT(" ( ");
@ -1044,9 +1136,9 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
{ {
if (not keyConflictLocation->empty()) if (not keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += TEXT("\r\n");
*keyConflictLocation += tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += TEXT(" | ");
*keyConflictLocation += numToStr(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
if (sciIndex > 0) if (sciIndex > 0)
*keyConflictLocation += TEXT("* "); *keyConflictLocation += TEXT("* ");
else else
@ -1060,8 +1152,8 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
} }
} }
break; break;
} //case STATE_SCINTILLA }
} //switch (gridState) }
} //for (...) }
return retIsConflict; return retIsConflict;
} }

View File

@ -37,13 +37,7 @@ enum GridState {STATE_MENU, STATE_MACRO, STATE_USER, STATE_PLUGIN, STATE_SCINTIL
class ShortcutMapper : public StaticDialog { class ShortcutMapper : public StaticDialog {
public: public:
ShortcutMapper() : _currentState(STATE_MENU), StaticDialog() { ShortcutMapper() : _currentState(STATE_MENU), StaticDialog() {};
generic_strncpy(tabNames[0], TEXT("Main menu"), maxTabName);
generic_strncpy(tabNames[1], TEXT("Macros"), maxTabName);
generic_strncpy(tabNames[2], TEXT("Run commands"), maxTabName);
generic_strncpy(tabNames[3], TEXT("Plugin commands"), maxTabName);
generic_strncpy(tabNames[4], TEXT("Scintilla commands"), maxTabName);
};
~ShortcutMapper() {}; ~ShortcutMapper() {};
void init(HINSTANCE hInst, HWND parent, GridState initState = STATE_MENU) { void init(HINSTANCE hInst, HWND parent, GridState initState = STATE_MENU) {
@ -64,7 +58,6 @@ public:
::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_SHORTCUTMAPPER_DLG), _hParent, dlgProc, reinterpret_cast<LPARAM>(this)); ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_SHORTCUTMAPPER_DLG), _hParent, dlgProc, reinterpret_cast<LPARAM>(this));
}; };
void getClientRect(RECT & rc) const; void getClientRect(RECT & rc) const;
void translateTab(int index, const TCHAR * newname);
bool findKeyConflicts(__inout_opt generic_string * const keyConflictLocation, bool findKeyConflicts(__inout_opt generic_string * const keyConflictLocation,
const KeyCombo & itemKeyCombo, const size_t & itemIndex) const; const KeyCombo & itemKeyCombo, const size_t & itemIndex) const;
@ -73,14 +66,14 @@ protected :
INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
private: private:
static const int maxTabName = 64;
BabyGridWrapper _babygrid; BabyGridWrapper _babygrid;
ContextMenu _rightClickMenu; ContextMenu _rightClickMenu;
GridState _currentState; GridState _currentState;
HWND _hTabCtrl = nullptr; HWND _hTabCtrl = nullptr;
TCHAR tabNames[5][maxTabName]; const static int _nbTab = 5;
generic_string _tabNames[_nbTab];
//save/restore the last view //save/restore the last view
std::vector<size_t> _lastHomeRow; std::vector<size_t> _lastHomeRow;
@ -101,6 +94,7 @@ private:
void initTabs(); void initTabs();
void initBabyGrid(); void initBabyGrid();
void fillOutBabyGrid(); void fillOutBabyGrid();
generic_string getTabString(size_t i) const;
bool isConflict(const KeyCombo & lhs, const KeyCombo & rhs) const bool isConflict(const KeyCombo & lhs, const KeyCombo & rhs) const
{ {

View File

@ -389,8 +389,13 @@ INT_PTR CALLBACK Shortcut::run_dlgProc(UINT Message, WPARAM wParam, LPARAM)
if (iFound != -1) if (iFound != -1)
::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_SETCURSEL, iFound, 0); ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_SETCURSEL, iFound, 0);
::ShowWindow(::GetDlgItem(_hSelf, IDC_WARNING_STATIC), isEnabled()?SW_HIDE:SW_SHOW);
// Hide this warning on startup
::ShowWindow(::GetDlgItem(_hSelf, IDC_WARNING_STATIC), SW_HIDE);
updateConflictState(); updateConflictState();
NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance()->getNativeLangSpeaker();
nativeLangSpeaker->changeDlgLang(_hSelf, "ShortcutMapperSubDialg");
goToCenter(); goToCenter();
return TRUE; return TRUE;
} }
@ -778,7 +783,8 @@ void ScintillaKeyMap::applyToCurrentIndex()
} }
void ScintillaKeyMap::validateDialog() { void ScintillaKeyMap::validateDialog()
{
bool valid = isValid(); //current combo valid? bool valid = isValid(); //current combo valid?
bool isDisabling = _keyCombo._key == 0; //true if this keycombo were to disable the shortcut bool isDisabling = _keyCombo._key == 0; //true if this keycombo were to disable the shortcut
bool isDisabled = !isEnabled(); //true if this shortcut already is bool isDisabled = !isEnabled(); //true if this shortcut already is
@ -846,6 +852,11 @@ INT_PTR CALLBACK ScintillaKeyMap::run_dlgProc(UINT Message, WPARAM wParam, LPARA
showCurrentSettings(); showCurrentSettings();
validateDialog(); validateDialog();
// Hide this warning on startup
::ShowWindow(::GetDlgItem(_hSelf, IDC_WARNING_STATIC), SW_HIDE);
NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance()->getNativeLangSpeaker();
nativeLangSpeaker->changeDlgLang(_hSelf, "ShortcutMapperSubDialg");
goToCenter(); goToCenter();
return TRUE; return TRUE;
} }
@ -856,19 +867,16 @@ INT_PTR CALLBACK ScintillaKeyMap::run_dlgProc(UINT Message, WPARAM wParam, LPARA
{ {
case IDC_CTRL_CHECK : case IDC_CTRL_CHECK :
_keyCombo._isCtrl = BST_CHECKED == ::SendDlgItemMessage(_hSelf, static_cast<int32_t>(wParam), BM_GETCHECK, 0, 0); _keyCombo._isCtrl = BST_CHECKED == ::SendDlgItemMessage(_hSelf, static_cast<int32_t>(wParam), BM_GETCHECK, 0, 0);
//applyToCurrentIndex();
validateDialog(); validateDialog();
return TRUE; return TRUE;
case IDC_ALT_CHECK : case IDC_ALT_CHECK :
_keyCombo._isAlt = BST_CHECKED == ::SendDlgItemMessage(_hSelf, static_cast<int32_t>(wParam), BM_GETCHECK, 0, 0); _keyCombo._isAlt = BST_CHECKED == ::SendDlgItemMessage(_hSelf, static_cast<int32_t>(wParam), BM_GETCHECK, 0, 0);
//applyToCurrentIndex();
validateDialog(); validateDialog();
return TRUE; return TRUE;
case IDC_SHIFT_CHECK : case IDC_SHIFT_CHECK :
_keyCombo._isShift = BST_CHECKED == ::SendDlgItemMessage(_hSelf, static_cast<int32_t>(wParam), BM_GETCHECK, 0, 0); _keyCombo._isShift = BST_CHECKED == ::SendDlgItemMessage(_hSelf, static_cast<int32_t>(wParam), BM_GETCHECK, 0, 0);
//applyToCurrentIndex();
validateDialog(); validateDialog();
return TRUE; return TRUE;
@ -935,7 +943,7 @@ INT_PTR CALLBACK ScintillaKeyMap::run_dlgProc(UINT Message, WPARAM wParam, LPARA
{ {
auto i = ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_GETCURSEL, 0, 0); auto i = ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_GETCURSEL, 0, 0);
_keyCombo._key = namedKeyArray[i].id; _keyCombo._key = namedKeyArray[i].id;
//applyToCurrentIndex(); ::ShowWindow(::GetDlgItem(_hSelf, IDC_WARNING_STATIC), isEnabled() ? SW_HIDE : SW_SHOW);
validateDialog(); validateDialog();
return TRUE; return TRUE;
} }

View File

@ -33,29 +33,24 @@
#define IDC_STATIC -1 #define IDC_STATIC -1
#endif #endif
IDD_SHORTCUT_DLG DIALOGEX 0, 0, 180, 102 IDD_SHORTCUT_DLG DIALOGEX 0, 0, 180, 105
STYLE DS_SETFONT | /*DS_MODALFRAME |*/ DS_FIXEDSYS | WS_POPUP | WS_CAPTION | STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW EXSTYLE WS_EX_TOOLWINDOW
CAPTION "Shortcut" CAPTION "Shortcut"
FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1
BEGIN BEGIN
CONTROL "CTRL",IDC_CTRL_CHECK,"Button",BS_AUTOCHECKBOX | CONTROL "CTRL",IDC_CTRL_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,30,33,10
WS_TABSTOP,12,30,33,10 CONTROL "ALT",IDC_ALT_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,51,28,10
CONTROL "ALT",IDC_ALT_CHECK,"Button",BS_AUTOCHECKBOX | CONTROL "SHIFT",IDC_SHIFT_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57,42,35,10
WS_TABSTOP,12,51,28,10 COMBOBOX IDC_KEY_COMBO,110,40,64,270,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "SHIFT",IDC_SHIFT_CHECK,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,57,42,35,10
COMBOBOX IDC_KEY_COMBO,110,40,64,270,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "OK",IDOK,32,74,50,14 PUSHBUTTON "OK",IDOK,32,74,50,14
PUSHBUTTON "Cancel",IDCANCEL,103,73,50,14 PUSHBUTTON "Cancel",IDCANCEL,103,73,50,14
LTEXT "+",IDC_STATIC,45,42,8,8 LTEXT "+",IDC_STATIC,45,42,8,8
LTEXT "+",IDC_STATIC,96,42,8,8 LTEXT "+",IDC_STATIC,96,42,8,8
EDITTEXT IDC_NAME_EDIT,56,9,118,14,ES_AUTOHSCROLL EDITTEXT IDC_NAME_EDIT,56,9,118,14,ES_AUTOHSCROLL
LTEXT "Name :",IDC_NAME_STATIC,15,12,34,8,0,WS_EX_RIGHT LTEXT "Name :",IDC_NAME_STATIC,15,12,34,8,0,WS_EX_RIGHT
LTEXT "This will disable the accelerator!",IDC_WARNING_STATIC,6,91,170,8 LTEXT "This will disable the accelerator",IDC_WARNING_STATIC,6,93,170,8
LTEXT "CONFLICT FOUND!",IDC_CONFLICT_STATIC,6,91,170,8 LTEXT "CONFLICT FOUND!",IDC_CONFLICT_STATIC,6,93,170,8
END END
IDD_SHORTCUTSCINT_DLG DIALOGEX 0, 0, 286, 114 IDD_SHORTCUTSCINT_DLG DIALOGEX 0, 0, 286, 114
@ -64,25 +59,20 @@ EXSTYLE WS_EX_TOOLWINDOW
CAPTION "Shortcut" CAPTION "Shortcut"
FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1
BEGIN BEGIN
CONTROL "CTRL",IDC_CTRL_CHECK,"Button",BS_AUTOCHECKBOX | CONTROL "CTRL",IDC_CTRL_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,27,33,10
WS_TABSTOP,114,27,33,10 CONTROL "ALT",IDC_ALT_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,48,28,10
CONTROL "ALT",IDC_ALT_CHECK,"Button",BS_AUTOCHECKBOX | CONTROL "SHIFT",IDC_SHIFT_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,39,35,10
WS_TABSTOP,114,48,28,10 COMBOBOX IDC_KEY_COMBO,212,37,64,270,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "SHIFT",IDC_SHIFT_CHECK,"Button",BS_AUTOCHECKBOX | PUSHBUTTON "Apply", IDC_BUTTON_APPLY, 210, 66, 48, 14
WS_TABSTOP,159,39,35,10 PUSHBUTTON "OK",IDOK,144,84,48,14
COMBOBOX IDC_KEY_COMBO,212,37,64,270,CBS_DROPDOWNLIST | PUSHBUTTON "Cancel",IDCANCEL,210,84,48,14
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "OK",IDOK,144,78,48,14
PUSHBUTTON "Cancel",IDCANCEL,210,78,48,14
LTEXT "+",IDC_STATIC,147,39,8,8 LTEXT "+",IDC_STATIC,147,39,8,8
LTEXT "+",IDC_STATIC,198,39,8,8 LTEXT "+",IDC_STATIC,198,39,8,8
EDITTEXT IDC_NAME_EDIT,158,6,118,14,ES_AUTOHSCROLL | ES_READONLY EDITTEXT IDC_NAME_EDIT,158,6,118,14,ES_AUTOHSCROLL | ES_READONLY
LTEXT "Name :",IDC_NAME_STATIC,117,9,34,8,0,WS_EX_RIGHT LTEXT "Name :",IDC_NAME_STATIC,117,9,34,8,0,WS_EX_RIGHT
LTEXT "This will remove the accelerator!",IDC_WARNING_STATIC,114,99,162,8 LTEXT "This will remove the accelerator",IDC_WARNING_STATIC,6,101,162,8
LTEXT "CONFLICT FOUND!",IDC_CONFLICT_STATIC,114,99,162,8 LTEXT "CONFLICT FOUND!",IDC_CONFLICT_STATIC,6,101,162,8
LISTBOX IDC_LIST_KEYS,6,6,90,72,LBS_NOINTEGRALHEIGHT | LISTBOX IDC_LIST_KEYS,6,6,90,72,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Add",IDC_BUTTON_ADD,6,84,42,14 PUSHBUTTON "Add",IDC_BUTTON_ADD,6,84,42,14
PUSHBUTTON "Remove",IDC_BUTTON_RMVE,56,84,40,14 PUSHBUTTON "Remove",IDC_BUTTON_RMVE,56,84,40,14
PUSHBUTTON "Apply",IDC_BUTTON_APPLY,210,60,48,14
END END

View File

@ -944,34 +944,27 @@ void NativeLangSpeaker::changeShortcutLang()
} }
void NativeLangSpeaker::changeShortcutmapperLang(ShortcutMapper * sm) generic_string NativeLangSpeaker::getShortcutMapperLangStr(const char *nodeName, const TCHAR *defaultStr) const
{ {
if (!_nativeLangA) return; if (!_nativeLangA) return defaultStr;
TiXmlNodeA *shortcuts = _nativeLangA->FirstChild("Dialog"); TiXmlNodeA *targetNode = _nativeLangA->FirstChild("Dialog");
if (!shortcuts) return; if (!targetNode) return defaultStr;
shortcuts = shortcuts->FirstChild("ShortcutMapper"); targetNode = targetNode->FirstChild("ShortcutMapper");
if (!shortcuts) return; if (!targetNode) return defaultStr;
for (TiXmlNodeA *childNode = shortcuts->FirstChildElement("Item"); targetNode = targetNode->FirstChild(nodeName);
childNode ; if (!targetNode) return defaultStr;
childNode = childNode->NextSibling("Item") )
const char *name = (targetNode->ToElement())->Attribute("name");
if (name && name[0])
{ {
TiXmlElementA *element = childNode->ToElement(); WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
int index; return wmc->char2wchar(name, _nativeLangEncoding);
if (element->Attribute("index", &index))
{
if (index > -1 && index < 5) //valid index only
{
const char *name = element->Attribute("name");
WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
const wchar_t * nameW = wmc->char2wchar(name, _nativeLangEncoding);
sm->translateTab(index, nameW);
}
}
} }
return defaultStr;
} }

View File

@ -60,7 +60,6 @@ public:
generic_string getNativeLangMenuString(int itemID) const; generic_string getNativeLangMenuString(int itemID) const;
void changeMenuLang(HMENU menuHandle, generic_string & pluginsTrans, generic_string & windowTrans); void changeMenuLang(HMENU menuHandle, generic_string & pluginsTrans, generic_string & windowTrans);
void changeShortcutLang(); void changeShortcutLang();
void changeShortcutmapperLang(ShortcutMapper * sm);
void changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText); void changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText);
void changeUserDefineLang(UserDefineDialog *userDefineDlg); void changeUserDefineLang(UserDefineDialog *userDefineDlg);
void changeUserDefineLangPopupDlg(HWND hDlg); void changeUserDefineLangPopupDlg(HWND hDlg);
@ -82,6 +81,7 @@ public:
return _nativeLangEncoding; return _nativeLangEncoding;
}; };
bool getMsgBoxLang(const char *msgBoxTagName, generic_string & title, generic_string & message); bool getMsgBoxLang(const char *msgBoxTagName, generic_string & title, generic_string & message);
generic_string getShortcutMapperLangStr(const char *nodeName, const TCHAR *defaultStr) const;
generic_string getProjectPanelLangMenuStr(const char * nodeName, int cmdID, const TCHAR *defaultStr) const; generic_string getProjectPanelLangMenuStr(const char * nodeName, int cmdID, const TCHAR *defaultStr) const;
generic_string getFileBrowserLangMenuStr(int cmdID, const TCHAR *defaultStr) const; generic_string getFileBrowserLangMenuStr(int cmdID, const TCHAR *defaultStr) const;
generic_string getAttrNameStr(const TCHAR *defaultStr, const char *nodeL1Name, const char *nodeL2Name = NULL) const; generic_string getAttrNameStr(const TCHAR *defaultStr, const char *nodeL1Name, const char *nodeL2Name = NULL) const;