?? shortcutmapper.cpp
字號:
/*
this file is part of notepad++
Copyright (C)2003 Don HO ( donho@altern.org )
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "ShortcutMapper.h"
#include "Notepad_plus.h"
void ShortcutMapper::initTabs() {
HWND hTab = _hTabCtrl = ::GetDlgItem(_hSelf, IDC_BABYGRID_TABBAR);
TCITEM tie;
tie.mask = TCIF_TEXT;
tie.pszText = tabNames[0];
::SendMessage(hTab, TCM_INSERTITEM, 0, (LPARAM)(&tie) );
tie.pszText = tabNames[1];
::SendMessage(hTab, TCM_INSERTITEM, 1, (LPARAM)(&tie) );
tie.pszText = tabNames[2];
::SendMessage(hTab, TCM_INSERTITEM, 2, (LPARAM)(&tie) );
tie.pszText = tabNames[3];
::SendMessage(hTab, TCM_INSERTITEM, 3, (LPARAM)(&tie) );
tie.pszText = tabNames[4];
::SendMessage(hTab, TCM_INSERTITEM, 4, (LPARAM)(&tie) );
}
void ShortcutMapper::translateTab(int index, const char * newname) {
if (index < 0 || index > 4)
return;
strncpy(tabNames[index], newname, maxTabName);
}
void ShortcutMapper::initBabyGrid() {
RECT rect;
getClientRect(rect);
_babygrid.init(_hInst, _hSelf, IDD_BABYGRID_ID1);
//_babygrid.reSizeTo(rect);
_babygrid.reSizeToWH(rect);
_babygrid.hideCursor();
_babygrid.makeColAutoWidth();
_babygrid.setColsNumbered(false);
_babygrid.setColWidth(0, 30);
_babygrid.setColWidth(1, 250);
}
void ShortcutMapper::fillOutBabyGrid()
{
NppParameters *nppParam = NppParameters::getInstance();
_babygrid.clear();
size_t nrItems = 0;
switch(_currentState) {
case STATE_MENU: {
nrItems = nppParam->getUserShortcuts().size();
_babygrid.setLineColNumber(nrItems, 2);
break; }
case STATE_MACRO: {
nrItems = nppParam->getMacroList().size();
_babygrid.setLineColNumber(nrItems, 2);
break; }
case STATE_USER: {
nrItems = nppParam->getUserCommandList().size();
_babygrid.setLineColNumber(nrItems, 2);
break; }
case STATE_PLUGIN: {
nrItems = nppParam->getPluginCommandList().size();
_babygrid.setLineColNumber(nrItems, 2);
break; }
case STATE_SCINTILLA: {
nrItems = nppParam->getScintillaKeyList().size();
_babygrid.setLineColNumber(nrItems, 2);
break; }
}
_babygrid.setText(0, 1, "Name");
_babygrid.setText(0, 2, "Shortcut");
switch(_currentState) {
case STATE_MENU: {
vector<CommandShortcut> & cshortcuts = nppParam->getUserShortcuts();
for(size_t i = 0; i < nrItems; i++) {
_babygrid.setText(i+1, 1, cshortcuts[i].getName());
_babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str());
}
break; }
case STATE_MACRO: {
vector<MacroShortcut> & cshortcuts = nppParam->getMacroList();
for(size_t i = 0; i < nrItems; i++) {
_babygrid.setText(i+1, 1, cshortcuts[i].getName());
_babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str());
}
break; }
case STATE_USER: {
vector<UserCommand> & cshortcuts = nppParam->getUserCommandList();
for(size_t i = 0; i < nrItems; i++) {
_babygrid.setText(i+1, 1, cshortcuts[i].getName());
_babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str());
}
break; }
case STATE_PLUGIN: {
vector<PluginCmdShortcut> & cshortcuts = nppParam->getPluginCommandList();
for(size_t i = 0; i < nrItems; i++) {
_babygrid.setText(i+1, 1, cshortcuts[i].getName());
_babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str());
}
break; }
case STATE_SCINTILLA: {
vector<ScintillaKeyMap> & cshortcuts = nppParam->getScintillaKeyList();
for(size_t i = 0; i < nrItems; i++) {
_babygrid.setText(i+1, 1, cshortcuts[i].getName());
_babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str());
}
break; }
}
}
BOOL CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG :
{
initBabyGrid();
initTabs();
fillOutBabyGrid();
_babygrid.display();
goToCenter();
return TRUE;
}
case WM_NOTIFY: {
NMHDR nmh = *((NMHDR*)lParam);
if (nmh.hwndFrom == _hTabCtrl) {
if (nmh.code == TCN_SELCHANGE) {
int index = TabCtrl_GetCurSel(_hTabCtrl);
switch (index) {
case 0:
_currentState = STATE_MENU;
break;
case 1:
_currentState = STATE_MACRO;
break;
case 2:
_currentState = STATE_USER;
break;
case 3:
_currentState = STATE_PLUGIN;
break;
case 4:
_currentState = STATE_SCINTILLA;
break;
}
fillOutBabyGrid();
}
}
break; }
case WM_COMMAND :
{
switch (LOWORD(wParam))
{
case IDCANCEL :
{
::EndDialog(_hSelf, -1);
return TRUE;
}
case IDOK :
{
::EndDialog(_hSelf, 0);
return TRUE;
}
case IDM_BABYGRID_MODIFY :
{
NppParameters *nppParam = NppParameters::getInstance();
int row = _babygrid.getSelectedRow();
switch(_currentState) {
case STATE_MENU: {
//Get CommandShortcut corresponding to row
vector<CommandShortcut> & shortcuts = nppParam->getUserShortcuts();
CommandShortcut csc = shortcuts[row - 1], prevcsc = shortcuts[row - 1];
csc.init(_hInst, _hSelf);
if (csc.doDialog() != -1 && prevcsc != csc) { //shortcut was altered
nppParam->addUserModifiedIndex(row-1);
shortcuts[row - 1] = csc;
_babygrid.setText(row, 2, csc.toString().c_str());
//Notify current Accelerator class to update everything
nppParam->getAccelerator()->updateShortcuts();
//::SendMessage(_hParent, NPPM_INTERNAL_CMDLIST_MODIFIED, (WPARAM)sc.c_str(), cmdID);
}
break; }
case STATE_MACRO: {
//Get MacroShortcut corresponding to row
vector<MacroShortcut> & shortcuts = nppParam->getMacroList();
MacroShortcut msc = shortcuts[row - 1], prevmsc = shortcuts[row - 1];
msc.init(_hInst, _hSelf);
if (msc.doDialog() != -1 && prevmsc != msc) { //shortcut was altered
shortcuts[row - 1] = msc;
_babygrid.setText(row, 1, msc.getName());
_babygrid.setText(row, 2, msc.toString().c_str());
//Notify current Accelerator class to update everything
nppParam->getAccelerator()->updateShortcuts();
//::SendMessage(_hParent, NPPM_INTERNAL_MACROLIST_MODIFIED, 0, 0);
}
break; }
case STATE_USER: {
//Get UserCommand corresponding to row
vector<UserCommand> & shortcuts = nppParam->getUserCommandList();
UserCommand ucmd = shortcuts[row - 1], prevucmd = shortcuts[row - 1];
ucmd.init(_hInst, _hSelf);
prevucmd = ucmd;
if (ucmd.doDialog() != -1 && prevucmd != ucmd) { //shortcut was altered
shortcuts[row - 1] = ucmd;
_babygrid.setText(row, 1, ucmd.getName());
_babygrid.setText(row, 2, ucmd.toString().c_str());
//Notify current Accelerator class to update everything
nppParam->getAccelerator()->updateShortcuts();
//::SendMessage(_hParent, NPPM_INTERNAL_USERCMDLIST_MODIFIED, 0, 0);
}
break; }
case STATE_PLUGIN: {
//Get PluginCmdShortcut corresponding to row
vector<PluginCmdShortcut> & shortcuts = nppParam->getPluginCommandList();
PluginCmdShortcut pcsc = shortcuts[row - 1], prevpcsc = shortcuts[row - 1];
pcsc.init(_hInst, _hSelf);
prevpcsc = pcsc;
if (pcsc.doDialog() != -1 && prevpcsc != pcsc) { //shortcut was altered
nppParam->addPluginModifiedIndex(row-1);
shortcuts[row - 1] = pcsc;
_babygrid.setText(row, 2, pcsc.toString().c_str());
//Notify current Accelerator class to update everything
nppParam->getAccelerator()->updateShortcuts();
//::SendMessage(_hParent, NPPM_INTERNAL_PLUGINCMDLIST_MODIFIED, 0, 0);
}
break; }
case STATE_SCINTILLA: {
//Get ScintillaKeyMap corresponding to row
vector<ScintillaKeyMap> & shortcuts = nppParam->getScintillaKeyList();
ScintillaKeyMap skm = shortcuts[row - 1], prevskm = shortcuts[row - 1];
skm.init(_hInst, _hSelf);
if (skm.doDialog() != -1 && prevskm != skm) { //shortcut was altered
nppParam->addScintillaModifiedIndex(row-1);
shortcuts[row - 1] = skm;
_babygrid.setText(row, 2, skm.toString().c_str());
//Notify current Accelerator class to update key
//nppParam->getScintillaAccelerator()->updateKeys();
nppParam->getScintillaAccelerator()->updateKey(prevskm, skm);
//::SendMessage(_hParent, NPPM_INTERNAL_BINDSCINTILLAKEY, scintillaSc.toKeyDef(), scintillaSc.getScintillaKey());
//::SendMessage(_hParent, NPPM_INTERNAL_CLEARSCINTILLAKEY, scintillaShortcuts[index].toKeyDef(), 0);
//::SendMessage(_hParent, NPPM_INTERNAL_SCINTILLAKEYMODIFIED, 0, 0);
}
break; }
}
return TRUE;
}
case IDM_BABYGRID_DELETE :
{
NppParameters *nppParam = NppParameters::getInstance();
if (::MessageBox(_hSelf, "Are you sure you want to delete this shortcut?", "Are you sure?", MB_OKCANCEL) == IDOK)
{
const int row = _babygrid.getSelectedRow();
int shortcutIndex = row-1;
DWORD cmdID;// = _pAccel->_pAccelArray[row-1].cmd;
// Menu data
size_t posBase;
size_t nbElem;
HMENU hMenu;
switch(_currentState) {
case STATE_MENU:
case STATE_PLUGIN:
case STATE_SCINTILLA: {
return FALSE; //this is bad
break; }
case STATE_MACRO: {
vector<MacroShortcut> & theMacros = nppParam->getMacroList();
vector<MacroShortcut>::iterator it = theMacros.begin();
cmdID = theMacros[shortcutIndex].getID();
theMacros.erase(it + shortcutIndex);
fillOutBabyGrid();
// preparing to remove from menu
posBase = 6;
nbElem = theMacros.size();
hMenu = ::GetSubMenu(::GetMenu(_hParent), MENUINDEX_MACRO);
for (size_t i = shortcutIndex ; i < nbElem ; i++) //lower the IDs of the remaining items so there are no gaps
{
MacroShortcut ms = theMacros[i];
ms.setID(ms.getID() - 1); //shift all IDs
theMacros[i] = ms;
}
//::SendMessage(_hParent, NPPM_INTERNAL_MACROLIST_MODIFIED, 0, 0);
break; }
case STATE_USER: {
vector<UserCommand> & theUserCmds = nppParam->getUserCommandList();
vector<UserCommand>::iterator it = theUserCmds.begin();
cmdID = theUserCmds[shortcutIndex].getID();
theUserCmds.erase(it + shortcutIndex);
fillOutBabyGrid();
// preparing to remove from menu
posBase = 2;
nbElem = theUserCmds.size();
hMenu = ::GetSubMenu(::GetMenu(_hParent), MENUINDEX_RUN);
for (size_t i = shortcutIndex ; i < nbElem ; i++) //lower the IDs of the remaining items so there are no gaps
{
UserCommand uc = theUserCmds[i];
uc.setID(uc.getID() - 1); //shift all IDs
theUserCmds[i] = uc;
}
//::SendMessage(_hParent, NPPM_INTERNAL_USERCMDLIST_MODIFIED, 0, 0);
break; }
}
// remove from menu
::RemoveMenu(hMenu, cmdID, MF_BYCOMMAND);
cmdID++;
if (nbElem == 0) {
::RemoveMenu(hMenu, posBase-1, MF_BYPOSITION); //remove separator
} else {
for (size_t i = shortcutIndex ; i < nbElem ; i++) //lower the IDs of the remaining menu items so there are no gaps
{
char cmdName[64];
::GetMenuString(hMenu, cmdID, cmdName, sizeof(cmdName), MF_BYCOMMAND);
::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID-1, cmdName); //update commandID
}
}
nppParam->getAccelerator()->updateShortcuts();
}
return TRUE;
}
case IDD_BABYGRID_ID1: {
if(HIWORD(wParam) == BGN_CELLDBCLICKED) //a cell was clicked in the properties grid
{
return ::SendMessage(_hSelf, WM_COMMAND, IDM_BABYGRID_MODIFY, LOWORD(lParam));
}
else if(HIWORD(wParam) == BGN_CELLRCLICKED) //a cell was clicked in the properties grid
{
POINT p;
::GetCursorPos(&p);
if (!_rightClickMenu.isCreated())
{
vector<MenuItemUnit> itemUnitArray;
itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_MODIFY, "Modify"));
itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_DELETE, "Delete"));
_rightClickMenu.create(_hSelf, itemUnitArray);
}
switch(_currentState) {
case STATE_MACRO:
case STATE_USER: {
_rightClickMenu.enableItem(IDM_BABYGRID_DELETE, true);
break; }
case STATE_MENU:
case STATE_PLUGIN:
case STATE_SCINTILLA: {
_rightClickMenu.enableItem(IDM_BABYGRID_DELETE, false);
break; }
}
_rightClickMenu.display(p);
return TRUE;
}
}
}
}
default:
return FALSE;
}
return FALSE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -