rlm@1: // AccelEditor.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "AccelEditor.h" rlm@1: #include "CmdAccelOb.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AccelEditor dialog rlm@1: rlm@1: AccelEditor::AccelEditor(CWnd *pParent, CMenu *pMenu, CAcceleratorManager *pExtMgr) rlm@1: : ResizeDlg(AccelEditor::IDD, pParent), m_pMenuSrc(pMenu), m_pExtMgr(pExtMgr) rlm@1: { rlm@1: //{{AFX_DATA_INIT(AccelEditor) rlm@1: // NOTE: the ClassWizard will add member initialization here rlm@1: //}}AFX_DATA_INIT rlm@1: } rlm@1: rlm@1: BOOL AccelEditor::IsModified() const rlm@1: { rlm@1: return m_modified; rlm@1: } rlm@1: rlm@1: const CAcceleratorManager &AccelEditor::GetResultMangager() const rlm@1: { rlm@1: return m_result; rlm@1: } rlm@1: rlm@1: void AccelEditor::DoDataExchange(CDataExchange *pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(AccelEditor) rlm@1: DDX_Control(pDX, IDC_CURRENTS, m_currents); rlm@1: DDX_Control(pDX, IDC_ALREADY_AFFECTED, m_alreadyAffected); rlm@1: DDX_Control(pDX, IDC_COMMANDS, m_commands); rlm@1: DDX_Control(pDX, IDC_EDIT_KEY, m_key); rlm@1: DDX_Control(pDX, IDC_ACCELEDIT_AUTOTIMEOUT, m_timeout); rlm@1: DDX_Control(pDX, IDC_ACCELEDIT_PROGRESSBAR, m_progress); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(AccelEditor, CDialog) rlm@1: //{{AFX_MSG_MAP(AccelEditor) rlm@1: ON_BN_CLICKED(ID_OK, &AccelEditor::OnOk) rlm@1: ON_BN_CLICKED(ID_CANCEL, &AccelEditor::OnCancel) rlm@1: ON_BN_CLICKED(IDC_ACCELEDIT_APPLY, &AccelEditor::OnApply) rlm@1: ON_BN_CLICKED(IDC_RESET, &AccelEditor::OnReset) rlm@1: ON_BN_CLICKED(IDC_ASSIGN, &AccelEditor::OnAssign) rlm@1: ON_BN_CLICKED(IDC_REMOVE, &AccelEditor::OnRemove) rlm@1: ON_BN_CLICKED(IDC_ACCELEDIT_REPLACE, &AccelEditor::OnReplace) rlm@1: ON_CONTROL(EN_CHANGE, IDC_EDIT_KEY, &AccelEditor::OnKeyboardEditChange) rlm@1: ON_CONTROL(EN_KILLFOCUS, IDC_EDIT_KEY, &AccelEditor::OnKeyboardEditKillfocus) rlm@1: ON_CONTROL(EN_SETFOCUS, IDC_ACCELEDIT_AUTOTIMEOUT, &AccelEditor::OnTimeoutEditSetfocus) rlm@1: ON_CONTROL(EN_KILLFOCUS, IDC_ACCELEDIT_AUTOTIMEOUT, &AccelEditor::OnTimeoutEditKillfocus) rlm@1: ON_NOTIFY(TVN_SELCHANGED, IDC_COMMANDS, &AccelEditor::OnTvnSelchangedCommands) rlm@1: //ON_NOTIFY(LVN_ITEMCHANGED, IDC_CURRENTS, &AccelEditor::OnListItemChanged) rlm@1: ON_NOTIFY(NM_DBLCLK, IDC_CURRENTS, &AccelEditor::OnListDblClick) rlm@1: ON_NOTIFY(NM_CLICK, IDC_CURRENTS, &AccelEditor::OnListClick) rlm@1: ON_WM_TIMER() rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // AccelEditor message handlers rlm@1: rlm@1: BOOL AccelEditor::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: DIALOG_SIZER_START(sz) rlm@1: DIALOG_SIZER_ENTRY(ID_OK, DS_MoveX) rlm@1: DIALOG_SIZER_ENTRY(ID_CANCEL, DS_MoveX) rlm@1: DIALOG_SIZER_ENTRY(IDC_ACCELEDIT_APPLY, DS_MoveX) rlm@1: DIALOG_SIZER_ENTRY(IDC_ASSIGN, DS_MoveX) rlm@1: DIALOG_SIZER_ENTRY(IDC_REMOVE, DS_MoveX) rlm@1: DIALOG_SIZER_ENTRY(IDC_ACCELEDIT_REPLACE, DS_MoveX) rlm@1: DIALOG_SIZER_ENTRY(IDC_COMMANDS, DS_SizeX | DS_SizeY) rlm@1: DIALOG_SIZER_ENTRY(IDC_CURRENTS, DS_MoveX | DS_SizeY) rlm@1: DIALOG_SIZER_ENTRY(IDC_EDIT_KEY, DS_MoveX | DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_EDIT_KEY, DS_MoveX | DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_STATIC2, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_STATIC3, DS_MoveX | DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_STATIC4, DS_MoveX | DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_STATIC5, DS_MoveX | DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_ACCELEDIT_AUTOTIMEOUT, DS_SizeX | DS_MoveY) rlm@1: DIALOG_SIZER_END() rlm@1: SetData(sz, rlm@1: TRUE, rlm@1: HKEY_CURRENT_USER, rlm@1: "Software\\Emulators\\VisualBoyAdvance\\Viewer\\AccelEditor", rlm@1: NULL); rlm@1: rlm@1: if (m_pExtMgr) rlm@1: m_result = m_mgr = *m_pExtMgr; rlm@1: rlm@1: m_currents.SetExtendedStyle(LVS_EX_FULLROWSELECT); rlm@1: m_currents.InsertColumn(0, "Keys"); rlm@1: m_currents.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER); rlm@1: InitCommands(); rlm@1: m_autoMode = AUTO_REPLACE; rlm@1: m_modified = FALSE; rlm@1: m_timeoutValue = 1000; rlm@1: CString timeoutStr; rlm@1: timeoutStr.Format("%d", m_timeoutValue); rlm@1: m_timeout.SetWindowText(timeoutStr); rlm@1: m_progress.SetPos(0); rlm@1: rlm@1: GetDlgItem(IDC_ACCELEDIT_APPLY)->EnableWindow(FALSE); rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void AccelEditor::AddCommandsFromTable() rlm@1: { rlm@1: POSITION pos = m_mgr.m_mapAccelString.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: CString command; rlm@1: WORD wID; rlm@1: m_mgr.m_mapAccelString.GetNextAssoc(pos, command, wID); rlm@1: int nPos = command.Find('\\'); rlm@1: rlm@1: if (nPos == 0) // skip menu commands rlm@1: { rlm@1: continue; rlm@1: } rlm@1: rlm@1: HTREEITEM newItem = TVI_ROOT; rlm@1: #if 0 rlm@1: /* rlm@1: while (nPos != -1) rlm@1: { rlm@1: newItem = m_commands.InsertItem(command.Left(nPos), newItem); rlm@1: command.Delete(0, nPos + 1); rlm@1: nPos = command.Find('\\'); rlm@1: } rlm@1: */ rlm@1: #endif rlm@1: newItem = m_commands.InsertItem(command, newItem); rlm@1: m_commands.SetItemData(newItem, wID); rlm@1: m_hItems.AddTail(newItem); rlm@1: } rlm@1: } rlm@1: rlm@1: // recursive calls rlm@1: void AccelEditor::AddCommandsFromMenu(CMenu *pMenu, HTREEITEM hParent) rlm@1: { rlm@1: UINT nIndexMax = pMenu->GetMenuItemCount(); rlm@1: for (UINT nIndex = 0; nIndex < nIndexMax; ++nIndex) rlm@1: { rlm@1: UINT nID = pMenu->GetMenuItemID(nIndex); rlm@1: if (nID == 0) rlm@1: continue; // menu separator or invalid cmd - ignore it rlm@1: rlm@1: if (nID == (UINT)-1) rlm@1: { rlm@1: // possibly a submenu rlm@1: CMenu *pSubMenu = pMenu->GetSubMenu(nIndex); rlm@1: if (pSubMenu != NULL) rlm@1: { rlm@1: CString tempStr; rlm@1: pMenu->GetMenuString(nIndex, tempStr, MF_BYPOSITION); rlm@1: tempStr.Remove('&'); rlm@1: HTREEITEM newItem = m_commands.InsertItem(tempStr, hParent); rlm@1: AddCommandsFromMenu(pSubMenu, newItem); rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: // normal menu item rlm@1: // generate the strings rlm@1: CString command; rlm@1: pMenu->GetMenuString(nIndex, command, MF_BYPOSITION); rlm@1: int nPos = command.ReverseFind('\t'); rlm@1: if (nPos != -1) rlm@1: { rlm@1: command.Delete(nPos, command.GetLength() - nPos); rlm@1: } rlm@1: command.Remove('&'); rlm@1: HTREEITEM newItem = m_commands.InsertItem(command, hParent); rlm@1: m_commands.SetItemData(newItem, nID); rlm@1: m_hItems.AddTail(newItem); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void AccelEditor::InitCommands() rlm@1: { rlm@1: m_commands.DeleteAllItems(); rlm@1: m_hItems.RemoveAll(); rlm@1: m_alreadyAffected.SetWindowText(""); rlm@1: rlm@1: AddCommandsFromMenu(m_pMenuSrc, TVI_ROOT); rlm@1: AddCommandsFromTable(); rlm@1: } rlm@1: rlm@1: BOOL AccelEditor::PreTranslateMessage(MSG *pMsg) rlm@1: { rlm@1: CWnd *pFocus = GetFocus(); rlm@1: if (pFocus == &m_currents) rlm@1: { rlm@1: if (pMsg->message == WM_KEYDOWN) rlm@1: { rlm@1: switch (pMsg->wParam) rlm@1: { rlm@1: case VK_ESCAPE: rlm@1: m_currents.SetItemState(-1, 0, LVIS_SELECTED); rlm@1: CheckListSelections(); rlm@1: break; rlm@1: case VK_RETURN: rlm@1: case VK_INSERT: rlm@1: // kludge to workaround CKeyboardEdit::PreTranslateMessage() rlm@1: break; rlm@1: case VK_DELETE: rlm@1: case VK_BACK: rlm@1: OnRemove(); rlm@1: break; rlm@1: case VK_F6: rlm@1: case VK_LEFT: rlm@1: m_commands.SetFocus(); rlm@1: break; rlm@1: case VK_RIGHT: rlm@1: GetDlgItem(ID_OK)->SetFocus(); rlm@1: default: rlm@1: return ResizeDlg::PreTranslateMessage(pMsg); rlm@1: } rlm@1: return TRUE; rlm@1: } rlm@1: else if (pMsg->message == WM_KEYUP) // kludge to workaround CKeyboardEdit::PreTranslateMessage() rlm@1: { rlm@1: switch (pMsg->wParam) rlm@1: { rlm@1: case VK_RETURN: rlm@1: OnEdit(); rlm@1: break; rlm@1: case VK_INSERT: rlm@1: OnNew(); rlm@1: break; rlm@1: default: rlm@1: return ResizeDlg::PreTranslateMessage(pMsg); rlm@1: } rlm@1: return TRUE; rlm@1: } rlm@1: } rlm@1: else if (pFocus == &m_commands) rlm@1: { rlm@1: if (pMsg->message == WM_KEYDOWN) rlm@1: { rlm@1: switch (pMsg->wParam) rlm@1: { rlm@1: case VK_F6: rlm@1: m_currents.SetFocus(); rlm@1: break; rlm@1: case VK_RIGHT: rlm@1: if (!m_commands.ItemHasChildren(m_commands.GetSelectedItem())) rlm@1: { rlm@1: m_currents.SetFocus(); rlm@1: break; rlm@1: } rlm@1: // fall through rlm@1: default: rlm@1: return ResizeDlg::PreTranslateMessage(pMsg); rlm@1: } rlm@1: return TRUE; rlm@1: } rlm@1: } rlm@1: rlm@1: return ResizeDlg::PreTranslateMessage(pMsg); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnOk() rlm@1: { rlm@1: OnApply(); rlm@1: // OnTimeoutEditKillfocus(); rlm@1: EndDialog(TRUE); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnCancel() rlm@1: { rlm@1: // OnTimeoutEditKillfocus(); rlm@1: // EndDialog(m_modified); rlm@1: EndDialog(FALSE); // this allows the caller to cancel even if the user has Apply'ed rlm@1: } rlm@1: rlm@1: void AccelEditor::OnApply() rlm@1: { rlm@1: m_result = m_mgr; rlm@1: GetDlgItem(IDC_ACCELEDIT_APPLY)->EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnReset() rlm@1: { rlm@1: m_mgr.Default(); /// FIXME accelerator reset NYI rlm@1: systemMessage( rlm@1: 0, rlm@1: "The \"Reset All Accelerators\" feature is currently unimplemented.\nYou can achieve the same result by closing VBA, opening up your \"vba.ini\" file, deleting the line that starts with \"keyboard\", then reopening VBA."); rlm@1: InitCommands(); // update the listboxes. rlm@1: } rlm@1: rlm@1: void AccelEditor::OnAssign() rlm@1: { rlm@1: if (CheckAffected()) rlm@1: return; rlm@1: rlm@1: // get the currently selected group rlm@1: HTREEITEM hItem = m_commands.GetSelectedItem(); rlm@1: if (hItem == NULL) rlm@1: return; // abort rlm@1: rlm@1: // Get the object who manage the accels list, associated to the command. rlm@1: WORD wIDCommand = LOWORD(m_commands.GetItemData(hItem)); rlm@1: rlm@1: CCmdAccelOb *pCmdAccel; rlm@1: if (m_mgr.m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) != TRUE) rlm@1: return; rlm@1: rlm@1: WORD wKey; rlm@1: bool bCtrl, bAlt, bShift; rlm@1: if (!m_key.GetAccelKey(wKey, bCtrl, bAlt, bShift)) rlm@1: return; // no valid key, abort rlm@1: rlm@1: BYTE cVirt = 0; rlm@1: if (bCtrl) rlm@1: cVirt |= FCONTROL; rlm@1: if (bAlt) rlm@1: cVirt |= FALT; rlm@1: if (bShift) rlm@1: cVirt |= FSHIFT; rlm@1: rlm@1: cVirt |= FVIRTKEY; rlm@1: rlm@1: // Create the new key... rlm@1: CAccelsOb *pAccel = new CAccelsOb(cVirt, wKey, false); rlm@1: ASSERT(pAccel != NULL); rlm@1: // ...and add in the list. rlm@1: pCmdAccel->m_Accels.AddTail(pAccel); rlm@1: rlm@1: // Update the listbox. rlm@1: CString szBuffer; rlm@1: pAccel->GetString(szBuffer); rlm@1: rlm@1: int index = m_currents.GetNextItem(-1, LVNI_SELECTED); rlm@1: if (index < 0) rlm@1: index = 0; rlm@1: m_currents.InsertItem(index, szBuffer); rlm@1: m_currents.SetItemData(index, reinterpret_cast(pAccel)); rlm@1: m_currents.SetItemState(-1, 0, LVIS_SELECTED); // deselect other items first rlm@1: m_currents.SetItemState(index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); rlm@1: GetDlgItem(IDC_REMOVE)->EnableWindow(TRUE); rlm@1: GetDlgItem(IDC_ACCELEDIT_REPLACE)->EnableWindow(TRUE); rlm@1: rlm@1: // Reset the key editor. rlm@1: // m_key.ResetKey(); rlm@1: rlm@1: m_modified = TRUE; rlm@1: GetDlgItem(IDC_ACCELEDIT_APPLY)->EnableWindow(TRUE); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnRemove() rlm@1: { rlm@1: // Some controls rlm@1: POSITION selected = m_currents.GetFirstSelectedItemPosition(); rlm@1: if (selected == NULL) rlm@1: return; rlm@1: rlm@1: HTREEITEM hItem = m_commands.GetSelectedItem(); rlm@1: if (hItem == NULL) rlm@1: return; rlm@1: rlm@1: // Ref to the ID command rlm@1: WORD wIDCommand = LOWORD(m_commands.GetItemData(hItem)); rlm@1: rlm@1: // Run through the accels, and control if it can be deleted. rlm@1: CCmdAccelOb *pCmdAccel; rlm@1: if (m_mgr.m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) == TRUE) rlm@1: { rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: POSITION PrevPos; rlm@1: while (pos != NULL) rlm@1: { rlm@1: PrevPos = pos; rlm@1: CAccelsOb *pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: do rlm@1: { rlm@1: int indexCurrent = m_currents.GetNextSelectedItem(selected); rlm@1: CAccelsOb *pAccelCurrent = reinterpret_cast(m_currents.GetItemData(indexCurrent)); rlm@1: if (pAccel == pAccelCurrent) rlm@1: { rlm@1: if (!pAccel->m_bLocked) rlm@1: { rlm@1: // not locked, so we delete the key rlm@1: pCmdAccel->m_Accels.RemoveAt(PrevPos); rlm@1: delete pAccel; rlm@1: // and update the listboxes/key editor/static text rlm@1: m_currents.DeleteItem(indexCurrent); rlm@1: m_modified = TRUE; rlm@1: break; rlm@1: } rlm@1: else rlm@1: { rlm@1: systemMessage(0, "Unable to remove this locked accelerator: ", m_currents.GetItemText(indexCurrent, KEY_COLUMN)); rlm@1: m_currents.SetItemState(indexCurrent, 0, LVIS_SELECTED); // deselect it rlm@1: break; rlm@1: } rlm@1: } rlm@1: } rlm@1: while (selected != NULL); rlm@1: rlm@1: selected = m_currents.GetFirstSelectedItemPosition(); rlm@1: if (selected == NULL) // the normal exit of this function rlm@1: { rlm@1: m_currents.SetItemState(m_currents.GetNextItem(-1, LVIS_FOCUSED), LVIS_SELECTED, LVIS_SELECTED); rlm@1: if (m_currents.GetSelectedCount() == 0) rlm@1: { rlm@1: GetDlgItem(IDC_REMOVE)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_ACCELEDIT_REPLACE)->EnableWindow(FALSE); rlm@1: } rlm@1: GetDlgItem(IDC_ACCELEDIT_APPLY)->EnableWindow(m_modified); rlm@1: return; rlm@1: } rlm@1: } rlm@1: systemMessage(0, "internal error (AccelEditor::Remove : pAccel unavailable)"); rlm@1: return; rlm@1: } rlm@1: systemMessage(0, "internal error (AccelEditor::Remove : Lookup failed)"); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnReplace() rlm@1: { rlm@1: if (CheckAffected()) rlm@1: return; rlm@1: OnRemove(); rlm@1: OnAssign(); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnNew() rlm@1: { rlm@1: m_autoMode = AUTO_NEW; rlm@1: m_key.SetFocus(); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnEdit() rlm@1: { rlm@1: m_autoMode = AUTO_REPLACE; rlm@1: m_key.SetFocus(); rlm@1: } rlm@1: rlm@1: BOOL AccelEditor::CheckAffected() rlm@1: { rlm@1: m_alreadyAffected.SetWindowText(""); rlm@1: rlm@1: WORD wKey; rlm@1: bool bCtrl, bAlt, bShift; rlm@1: if (!m_key.GetAccelKey(wKey, bCtrl, bAlt, bShift)) rlm@1: return TRUE; // no valid key, abort rlm@1: rlm@1: POSITION posItem = m_hItems.GetHeadPosition(); rlm@1: while (posItem != NULL) rlm@1: { rlm@1: HTREEITEM hItem = m_hItems.GetNext(posItem); rlm@1: WORD wIDCommand2 = LOWORD(m_commands.GetItemData(hItem)); rlm@1: rlm@1: CCmdAccelOb *pCmdAccel; rlm@1: m_mgr.m_mapAccelTable.Lookup(wIDCommand2, pCmdAccel); rlm@1: rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: CAccelsOb *pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: if (pAccel->IsEqual(wKey, bCtrl, bAlt, bShift)) rlm@1: { rlm@1: // the key is already affected (in the same or other command) rlm@1: // (the parts that were commented out allow for a one-to-many mapping, rlm@1: // which is only disabled because the MFC stuff that automagically activates the commands rlm@1: // doesn't seem to be capable of activating more than one command per accelerator...) rlm@1: m_alreadyAffected.SetWindowText(pCmdAccel->m_szCommand); rlm@1: return TRUE; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: return FALSE; rlm@1: } rlm@1: rlm@1: BOOL AccelEditor::CheckJammed() rlm@1: { rlm@1: WORD jam; rlm@1: if (m_key.GetJamKey(jam)) rlm@1: { rlm@1: // these go first, or the timer would be set again rlm@1: m_key.ResetKey(); rlm@1: m_key.SetWindowText("Interrupted"); rlm@1: if (m_currents.IsWindowEnabled()) rlm@1: m_currents.SetFocus(); rlm@1: else rlm@1: m_commands.SetFocus(); rlm@1: return TRUE; rlm@1: } rlm@1: return FALSE; rlm@1: } rlm@1: rlm@1: BOOL AccelEditor::CheckListSelections() rlm@1: { rlm@1: BOOL result = m_currents.GetFirstSelectedItemPosition() ? TRUE : FALSE; rlm@1: rlm@1: GetDlgItem(IDC_REMOVE)->EnableWindow(result); rlm@1: GetDlgItem(IDC_ACCELEDIT_REPLACE)->EnableWindow(result); rlm@1: rlm@1: return result; rlm@1: } rlm@1: rlm@1: void AccelEditor::OnTvnSelchangedCommands(NMHDR *pNMHDR, LRESULT *pResult) rlm@1: { rlm@1: // LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); rlm@1: rlm@1: // TODO: Add your control notification handler code here rlm@1: // Check if some commands exist. rlm@1: HTREEITEM hItem = m_commands.GetSelectedItem(); rlm@1: if (hItem == NULL) rlm@1: return; rlm@1: rlm@1: m_currents.DeleteAllItems(); rlm@1: rlm@1: WORD wIDCommand = LOWORD(m_commands.GetItemData(hItem)); rlm@1: CCmdAccelOb *pCmdAccel; rlm@1: if (m_mgr.m_mapAccelTable.Lookup(wIDCommand, pCmdAccel)) rlm@1: { rlm@1: CAccelsOb *pAccel; rlm@1: CString szBuffer; rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: rlm@1: // Add the keys to the 'currents keys' listbox. rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: pAccel->GetString(szBuffer); rlm@1: int index = m_currents.InsertItem(m_currents.GetItemCount(), szBuffer); rlm@1: // and a pointer to the accel object. rlm@1: m_currents.SetItemData(index, (DWORD)pAccel); rlm@1: } rlm@1: rlm@1: m_currents.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); rlm@1: GetDlgItem(IDC_ASSIGN)->EnableWindow(TRUE); rlm@1: m_currents.EnableWindow(TRUE); rlm@1: } rlm@1: else rlm@1: { rlm@1: GetDlgItem(IDC_ASSIGN)->EnableWindow(FALSE); rlm@1: m_currents.EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: // Init the key editor rlm@1: // m_pKey->ResetKey(); rlm@1: // m_alreadyAffected.SetWindowText(""); rlm@1: rlm@1: CheckListSelections(); rlm@1: rlm@1: *pResult = 0; rlm@1: } rlm@1: rlm@1: /* rlm@1: void AccelEditor::OnListItemChanged(NMHDR *pNMHDR, LRESULT *pResult) rlm@1: { rlm@1: NMLISTVIEW *pNMListView = reinterpret_cast(pNMHDR); rlm@1: if (pNMListView->uChanged == LVIF_STATE) rlm@1: { rlm@1: if ((pNMListView->uOldState & LVIS_SELECTED) && !(pNMListView->uNewState & LVIS_SELECTED)) rlm@1: { rlm@1: } rlm@1: } rlm@1: rlm@1: *pResult = 0; rlm@1: } rlm@1: */ rlm@1: rlm@1: void AccelEditor::OnListClick(NMHDR *pNMHDR, LRESULT *pResult) rlm@1: { rlm@1: CheckListSelections(); rlm@1: *pResult = 0; rlm@1: } rlm@1: rlm@1: void AccelEditor::OnListDblClick(NMHDR *pNMHDR, LRESULT *pResult) rlm@1: { rlm@1: if (m_currents.GetFirstSelectedItemPosition()) rlm@1: OnEdit(); rlm@1: else rlm@1: OnNew(); rlm@1: *pResult = 0; rlm@1: } rlm@1: rlm@1: void AccelEditor::OnKeyboardEditChange() rlm@1: { rlm@1: if (!m_key.IsDefined()) rlm@1: return; rlm@1: rlm@1: // if (CheckJammed()) rlm@1: // return; rlm@1: rlm@1: OnKeyboardEditKillfocus(); rlm@1: CheckAffected(); rlm@1: if (m_timeoutValue == 0) rlm@1: return; rlm@1: rlm@1: m_progress.SetRange32(0, m_timeoutValue); rlm@1: SetTimer(1, 50, NULL); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnKeyboardEditKillfocus() rlm@1: { rlm@1: KillTimer(1); rlm@1: m_timer = 0; rlm@1: m_progress.SetPos(0); rlm@1: m_progress.SetBarColor(RGB(128, 0, 255)); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnTimeoutEditSetfocus() rlm@1: { rlm@1: m_timeout.PostMessage(EM_SETSEL, 0, -1); rlm@1: } rlm@1: rlm@1: void AccelEditor::OnTimeoutEditKillfocus() rlm@1: { rlm@1: CString str; rlm@1: m_timeout.GetWindowText(str); rlm@1: m_timeoutValue = atoi(str); rlm@1: m_autoMode = AUTO_REPLACE; rlm@1: } rlm@1: rlm@1: void AccelEditor::OnTimer(UINT_PTR nIDEvent) rlm@1: { rlm@1: if (nIDEvent == 1) rlm@1: { rlm@1: m_timer += 50; rlm@1: if (m_timer >= m_timeoutValue) rlm@1: { rlm@1: m_progress.SetPos(m_timeoutValue); rlm@1: m_progress.SetBarColor(RGB(255, 255, 0)); rlm@1: if (m_autoMode == AUTO_NEW) rlm@1: { rlm@1: OnAssign(); rlm@1: } rlm@1: else rlm@1: { rlm@1: OnReplace(); rlm@1: } rlm@1: if (m_currents.IsWindowEnabled()) rlm@1: m_currents.SetFocus(); rlm@1: else rlm@1: m_commands.SetFocus(); rlm@1: return; rlm@1: } rlm@1: UINT green = (m_timer * 255 / m_timeoutValue) ; rlm@1: m_progress.SetBarColor(RGB(128 + green / 2, green, 255 - green)); rlm@1: m_progress.SetPos(m_timer); rlm@1: } rlm@1: } rlm@1: