rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // Copyright (C) 1998 by Thierry Maurel rlm@1: // All rights reserved rlm@1: // rlm@1: // Distribute freely, except: don't remove my name from the source or rlm@1: // documentation (don't take credit for my work), mark your changes (don't rlm@1: // get me blamed for your possible bugs), don't alter or remove this rlm@1: // notice. rlm@1: // No warrantee of any kind, express or implied, is included with this rlm@1: // software; use at your own risk, responsibility for damages (if any) to rlm@1: // anyone resulting from the use of this software rests entirely with the rlm@1: // user. rlm@1: // rlm@1: // Send bug reports, bug fixes, enhancements, requests, flames, etc., and rlm@1: // I'll try to keep a version up to date. I can be reached as follows: rlm@1: // tmaurel@caramail.com (or tmaurel@hol.fr) rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // File : AcceleratorManager.cpp rlm@1: // Project : AccelsEditor rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // Version : 1.0 * Author : T.Maurel rlm@1: // Date : 17.08.98 rlm@1: // rlm@1: // Remarks : implementation of the CAcceleratorManager class. rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // Modified by aquanull: rlm@1: // All win32 registry stuff removed rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include // MIIM_STRING rlm@1: #include "resource.h" rlm@1: #include "AcceleratorManager.h" rlm@1: #include "CmdAccelOb.h" rlm@1: #include "Reg.h" rlm@1: #include "VBA.h" rlm@1: //#include "../common/System.h" rlm@1: rlm@1: CAcceleratorManager::CAcceleratorManager() rlm@1: { rlm@1: m_bAutoSave = FALSE; rlm@1: m_pWndConnected = NULL; rlm@1: rlm@1: m_bDefaultTable = false; rlm@1: } rlm@1: rlm@1: CAcceleratorManager::~CAcceleratorManager() rlm@1: { rlm@1: #if 0 rlm@1: if (m_bAutoSave) rlm@1: { rlm@1: bool bRet = Write(); rlm@1: if (!bRet) rlm@1: systemMessage(0, "CAcceleratorManager::~CAcceleratorManager\nError in CAcceleratorManager::Write..."); rlm@1: } rlm@1: #endif rlm@1: Reset(); rlm@1: } rlm@1: rlm@1: CAcceleratorManager & CAcceleratorManager::operator=(const CAcceleratorManager& accelmgr) rlm@1: { rlm@1: Reset(); rlm@1: rlm@1: CCmdAccelOb*pCmdAccel; rlm@1: CCmdAccelOb*pNewCmdAccel; rlm@1: WORD wKey; rlm@1: // Copy the 2 tables : normal accel table... rlm@1: POSITION pos = accelmgr.m_mapAccelTable.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: accelmgr.m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: pNewCmdAccel = new CCmdAccelOb; rlm@1: ASSERT(pNewCmdAccel != NULL); rlm@1: *pNewCmdAccel = *pCmdAccel; rlm@1: m_mapAccelTable.SetAt(wKey, pNewCmdAccel); rlm@1: } rlm@1: // ... and saved accel table. rlm@1: pos = accelmgr.m_mapAccelTableSaved.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: accelmgr.m_mapAccelTableSaved.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: pNewCmdAccel = new CCmdAccelOb; rlm@1: ASSERT(pNewCmdAccel != NULL); rlm@1: *pNewCmdAccel = *pCmdAccel; rlm@1: m_mapAccelTableSaved.SetAt(wKey, pNewCmdAccel); rlm@1: } rlm@1: rlm@1: // The Strings-ID table rlm@1: CString szKey; rlm@1: pos = accelmgr.m_mapAccelString.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: accelmgr.m_mapAccelString.GetNextAssoc(pos, szKey, wKey); rlm@1: m_mapAccelString.SetAt(szKey, wKey); rlm@1: } rlm@1: m_bDefaultTable = accelmgr.m_bDefaultTable; rlm@1: rlm@1: return *this; rlm@1: } rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // Internal fcts rlm@1: // rlm@1: void CAcceleratorManager::Reset() rlm@1: { rlm@1: CCmdAccelOb*pCmdAccel; rlm@1: WORD wKey; rlm@1: POSITION pos = m_mapAccelTable.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: delete pCmdAccel; rlm@1: } rlm@1: m_mapAccelTable.RemoveAll(); rlm@1: m_mapAccelString.RemoveAll(); rlm@1: rlm@1: pos = m_mapAccelTableSaved.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTableSaved.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: delete pCmdAccel; rlm@1: } rlm@1: m_mapAccelTableSaved.RemoveAll(); rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::AddAccel(BYTE cVirt, WORD wIDCommand, WORD wKey, LPCTSTR szCommand, bool bLocked) rlm@1: { rlm@1: ASSERT(szCommand != NULL); rlm@1: rlm@1: WORD wIDCmd; rlm@1: if (m_mapAccelString.Lookup(szCommand, wIDCmd) == TRUE) rlm@1: { rlm@1: if (wIDCmd != wIDCommand) rlm@1: return false; rlm@1: } rlm@1: rlm@1: CCmdAccelOb*pCmdAccel = NULL; rlm@1: if (m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) == TRUE) rlm@1: { rlm@1: if (pCmdAccel->m_szCommand != szCommand) rlm@1: { rlm@1: return false; rlm@1: } rlm@1: CAccelsOb*pAccel; rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: if (pAccel->m_cVirt == cVirt && rlm@1: pAccel->m_wKey == wKey) rlm@1: return FALSE; rlm@1: } rlm@1: // Adding the accelerator rlm@1: pCmdAccel->Add(cVirt, wKey, bLocked); rlm@1: } rlm@1: else rlm@1: { rlm@1: pCmdAccel = new CCmdAccelOb(cVirt, wIDCommand, wKey, szCommand, bLocked); rlm@1: ASSERT(pCmdAccel != NULL); rlm@1: m_mapAccelTable.SetAt(wIDCommand, pCmdAccel); rlm@1: } rlm@1: // 2nd table rlm@1: m_mapAccelString.SetAt(szCommand, wIDCommand); rlm@1: return true; rlm@1: } rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // Debug fcts rlm@1: // rlm@1: #ifdef _DEBUG rlm@1: void CAcceleratorManager::AssertValid() const rlm@1: {} rlm@1: rlm@1: void CAcceleratorManager::Dump(CDumpContext& dc) const rlm@1: { rlm@1: CCmdAccelOb*pCmdAccel; rlm@1: WORD wKey; rlm@1: dc << "CAcceleratorManager::Dump :\n"; rlm@1: dc << "m_mapAccelTable :\n"; rlm@1: POSITION pos = m_mapAccelTable.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: dc << "a CCmdAccelOb at 0x" << (void *)pCmdAccel << " = {\n"; rlm@1: dc << pCmdAccel; rlm@1: dc << "}\n"; rlm@1: } rlm@1: dc << "\nm_mapAccelTableSaved\n"; rlm@1: pos = m_mapAccelTableSaved.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTableSaved.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: dc << "a CCmdAccelOb at 0x" << (void *)pCmdAccel << " = {\n"; rlm@1: dc << pCmdAccel; rlm@1: dc << "}\n"; rlm@1: } rlm@1: } rlm@1: rlm@1: #endif rlm@1: rlm@1: void CAcceleratorManager::Connect(CWnd*pWnd, bool bAutoSave) rlm@1: { rlm@1: ASSERT(m_pWndConnected == NULL); rlm@1: m_pWndConnected = pWnd; rlm@1: m_bAutoSave = bAutoSave; rlm@1: } rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // Update the application's ACCELs table rlm@1: // rlm@1: bool CAcceleratorManager::UpdateWndTable() rlm@1: { rlm@1: int iLoop = 0; rlm@1: CTypedPtrArray arrayACCEL; rlm@1: rlm@1: CCmdAccelOb*pCmdAccel; rlm@1: WORD wKey; rlm@1: LPACCEL pACCEL; rlm@1: CAccelsOb* pAccelOb; rlm@1: POSITION pos = m_mapAccelTable.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccelOb = pCmdAccel->m_Accels.GetNext(pos); rlm@1: rlm@1: pACCEL = new ACCEL; rlm@1: ASSERT(pACCEL != NULL); rlm@1: pACCEL->fVirt = pAccelOb->m_cVirt; rlm@1: pACCEL->key = pAccelOb->m_wKey; rlm@1: pACCEL->cmd = pCmdAccel->m_wIDCommand; rlm@1: arrayACCEL.Add(pACCEL); rlm@1: } rlm@1: } rlm@1: rlm@1: int nAccel = arrayACCEL.GetSize(); rlm@1: LPACCEL lpAccel = (LPACCEL)LocalAlloc(LPTR, nAccel * sizeof(ACCEL)); rlm@1: if (!lpAccel) rlm@1: { rlm@1: for (iLoop = 0; iLoop < nAccel; iLoop++) rlm@1: delete arrayACCEL.GetAt(iLoop); rlm@1: arrayACCEL.RemoveAll(); rlm@1: rlm@1: return false; rlm@1: } rlm@1: rlm@1: for (iLoop = 0; iLoop < nAccel; iLoop++) rlm@1: { rlm@1: pACCEL = arrayACCEL.GetAt(iLoop); rlm@1: lpAccel[iLoop].fVirt = pACCEL->fVirt; rlm@1: lpAccel[iLoop].key = pACCEL->key; rlm@1: lpAccel[iLoop].cmd = pACCEL->cmd; rlm@1: rlm@1: delete pACCEL; rlm@1: } rlm@1: arrayACCEL.RemoveAll(); rlm@1: rlm@1: HACCEL hNewTable = CreateAcceleratorTable(lpAccel, nAccel); rlm@1: if (!hNewTable) rlm@1: { rlm@1: ::LocalFree(lpAccel); rlm@1: return false; rlm@1: } rlm@1: HACCEL hOldTable = theApp.hAccel; rlm@1: if (!::DestroyAcceleratorTable(hOldTable)) rlm@1: { rlm@1: ::LocalFree(lpAccel); rlm@1: return false; rlm@1: } rlm@1: theApp.hAccel = hNewTable; rlm@1: ::LocalFree(lpAccel); rlm@1: rlm@1: UpdateMenu(GetMenu(*AfxGetApp()->m_pMainWnd)); rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // Create/Destroy accelerators rlm@1: // rlm@1: bool CAcceleratorManager::DeleteAccel(BYTE cVirt, WORD wIDCommand, WORD wKey) rlm@1: { rlm@1: CCmdAccelOb*pCmdAccel = NULL; rlm@1: if (m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) == TRUE) rlm@1: { rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: POSITION PrevPos; rlm@1: CAccelsOb*pAccel = NULL; rlm@1: while (pos != NULL) rlm@1: { rlm@1: PrevPos = pos; rlm@1: pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: if (pAccel->m_bLocked == true) rlm@1: return false; rlm@1: rlm@1: if (pAccel->m_cVirt == cVirt && pAccel->m_wKey == wKey) rlm@1: { rlm@1: pCmdAccel->m_Accels.RemoveAt(PrevPos); rlm@1: delete pAccel; rlm@1: return true; rlm@1: } rlm@1: } rlm@1: } rlm@1: return false; rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::DeleteEntry(WORD wIDCommand) rlm@1: { rlm@1: CCmdAccelOb*pCmdAccel = NULL; rlm@1: VERIFY(m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) == TRUE); rlm@1: rlm@1: CAccelsOb*pAccel; rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: if (pAccel->m_bLocked == true) rlm@1: return false; rlm@1: } rlm@1: m_mapAccelString.RemoveKey(pCmdAccel->m_szCommand); rlm@1: m_mapAccelTable.RemoveKey(wIDCommand); rlm@1: delete pCmdAccel; rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::DeleteEntry(LPCTSTR szCommand) rlm@1: { rlm@1: ASSERT(szCommand != NULL); rlm@1: rlm@1: WORD wIDCommand; rlm@1: if (m_mapAccelString.Lookup(szCommand, wIDCommand) == TRUE) rlm@1: { rlm@1: return DeleteEntry(wIDCommand); rlm@1: } rlm@1: return true; rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::SetAccel(BYTE cVirt, WORD wIDCommand, WORD wKey, LPCTSTR szCommand, bool bLocked) rlm@1: { rlm@1: ASSERT(szCommand != NULL); rlm@1: rlm@1: return AddAccel(cVirt, wIDCommand, wKey, szCommand, bLocked); rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::AddCommandAccel(WORD wIDCommand, LPCTSTR szCommand, bool bLocked) rlm@1: { rlm@1: ASSERT(szCommand != NULL); rlm@1: rlm@1: ASSERT(m_pWndConnected != NULL); rlm@1: HACCEL hOriginalTable = theApp.hAccel; rlm@1: rlm@1: int nAccel = ::CopyAcceleratorTable(hOriginalTable, NULL, 0); rlm@1: LPACCEL lpAccel = (LPACCEL)LocalAlloc(LPTR, (nAccel) * sizeof(ACCEL)); rlm@1: if (!lpAccel) rlm@1: return false; rlm@1: ::CopyAcceleratorTable(hOriginalTable, lpAccel, nAccel); rlm@1: rlm@1: bool bRet = false; rlm@1: for (int i = 0; i < nAccel; i++) rlm@1: { rlm@1: if (lpAccel[i].cmd == wIDCommand) rlm@1: bRet = AddAccel(lpAccel[i].fVirt, wIDCommand, lpAccel[i].key, szCommand, bLocked); rlm@1: } rlm@1: ::LocalFree(lpAccel); rlm@1: return bRet; rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::CreateEntry(WORD wIDCommand, LPCTSTR szCommand) rlm@1: { rlm@1: ASSERT(szCommand != NULL); rlm@1: rlm@1: WORD wIDDummy; rlm@1: if (m_mapAccelString.Lookup(szCommand, wIDDummy) == TRUE) rlm@1: return false; rlm@1: rlm@1: CCmdAccelOb*pCmdAccel = new CCmdAccelOb(wIDCommand, szCommand); rlm@1: ASSERT(pCmdAccel != NULL); rlm@1: m_mapAccelTable.SetAt(wIDCommand, pCmdAccel); rlm@1: m_mapAccelString.SetAt(szCommand, wIDCommand); rlm@1: rlm@1: return false; rlm@1: } rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // Get a string from the ACCEL definition rlm@1: // rlm@1: bool CAcceleratorManager::GetStringFromACCEL(ACCEL*pACCEL, CString& szAccel) rlm@1: { rlm@1: ASSERT(pACCEL != NULL); rlm@1: rlm@1: CAccelsOb accel(pACCEL); rlm@1: accel.GetString(szAccel); rlm@1: rlm@1: if (szAccel.IsEmpty()) rlm@1: return false; rlm@1: else rlm@1: return true; rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::GetStringFromACCEL(BYTE cVirt, WORD nCode, CString& szAccel) rlm@1: { rlm@1: CAccelsOb accel(cVirt, nCode); rlm@1: accel.GetString(szAccel); rlm@1: rlm@1: if (szAccel.IsEmpty()) rlm@1: return false; rlm@1: else rlm@1: return true; rlm@1: } rlm@1: rlm@1: void CAcceleratorManager::UpdateMenu(HMENU menu) rlm@1: { rlm@1: int count = GetMenuItemCount(menu); rlm@1: rlm@1: OSVERSIONINFO info = {0}; rlm@1: info.dwOSVersionInfoSize = sizeof(info); rlm@1: GetVersionEx(&info); rlm@1: rlm@1: if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) rlm@1: { rlm@1: MENUITEMINFO info = {0}; rlm@1: info.cbSize = sizeof(info) - sizeof(HBITMAP); rlm@1: info.fMask = MIIM_ID | MIIM_SUBMENU; rlm@1: for (int i = 0; i < count; i++) rlm@1: { rlm@1: GetMenuItemInfo(menu, i, TRUE, &info); rlm@1: rlm@1: if (info.hSubMenu != NULL) rlm@1: { rlm@1: UpdateMenu(info.hSubMenu); rlm@1: } rlm@1: else rlm@1: { rlm@1: if (info.wID != (UINT)-1) rlm@1: { rlm@1: char ss[128]; rlm@1: MENUITEMINFO info2 = {0}; rlm@1: info2.cbSize = sizeof(info2) - sizeof(HBITMAP); // FIXME: why? rlm@1: info2.fMask = MIIM_STRING; rlm@1: info2.dwTypeData = ss; rlm@1: info2.cch = 128; rlm@1: GetMenuItemInfo(menu, i, MF_BYPOSITION, &info2); rlm@1: rlm@1: CString str(ss); rlm@1: int index = str.Find('\t'); rlm@1: if (index != -1) rlm@1: str = str.Left(index); rlm@1: rlm@1: WORD command = info.wID; rlm@1: rlm@1: CCmdAccelOb *o; rlm@1: if (m_mapAccelTable.Lookup(command, o)) rlm@1: { rlm@1: if (o->m_Accels.GetCount()) rlm@1: { rlm@1: POSITION pos = o->m_Accels.GetHeadPosition(); rlm@1: CAccelsOb *accel = o->m_Accels.GetNext(pos); rlm@1: rlm@1: CString s; rlm@1: accel->GetString(s); rlm@1: str += "\t"; rlm@1: str += s; rlm@1: } rlm@1: } rlm@1: if (str != ss) rlm@1: ModifyMenu(menu, i, MF_BYPOSITION | MF_STRING, info.wID, str); rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: MENUITEMINFO info = {0}; rlm@1: info.cbSize = sizeof(info); rlm@1: info.fMask = MIIM_ID | MIIM_SUBMENU; rlm@1: for (int i = 0; i < count; i++) rlm@1: { rlm@1: GetMenuItemInfo(menu, i, TRUE, &info); rlm@1: rlm@1: if (info.hSubMenu != NULL) rlm@1: { rlm@1: UpdateMenu(info.hSubMenu); rlm@1: } rlm@1: else rlm@1: { rlm@1: if (info.wID != (WORD)-1) rlm@1: { rlm@1: wchar_t ss[128]; rlm@1: wchar_t str[512]; rlm@1: MENUITEMINFOW info2 = {0}; rlm@1: info2.cbSize = sizeof(info2); rlm@1: info2.fMask = MIIM_STRING; rlm@1: info2.dwTypeData = ss; rlm@1: info2.cch = 128; rlm@1: GetMenuItemInfoW(menu, i, MF_BYPOSITION, &info2); rlm@1: rlm@1: wcscpy(str, ss); rlm@1: rlm@1: wchar_t *p = wcschr(str, '\t'); rlm@1: if (p) rlm@1: *p = 0; rlm@1: rlm@1: CCmdAccelOb *o; rlm@1: WORD command = info.wID; rlm@1: if (m_mapAccelTable.Lookup(command, o)) rlm@1: { rlm@1: if (o->m_Accels.GetCount()) rlm@1: { rlm@1: POSITION pos = o->m_Accels.GetHeadPosition(); rlm@1: rlm@1: CAccelsOb *accel = o->m_Accels.GetNext(pos); rlm@1: rlm@1: CString s; rlm@1: accel->GetString(s); rlm@1: rlm@1: wchar_t temp[128]; rlm@1: temp[0] = '\t'; rlm@1: temp[1] = 0; rlm@1: wcscat(str, temp); rlm@1: p = temp; rlm@1: for (const char *sp = s; *sp; sp++) rlm@1: *p++ = *sp; rlm@1: *p = 0; rlm@1: wcscat(str, temp); rlm@1: } rlm@1: } rlm@1: if (wcscmp(str, ss)) rlm@1: ModifyMenuW(menu, i, MF_BYPOSITION | MF_STRING, info.wID, str); rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // In/Out to the registry rlm@1: // rlm@1: bool CAcceleratorManager::Load() rlm@1: { rlm@1: // ASSERT(szRegKey != NULL); rlm@1: rlm@1: // m_hRegKey = hRegKey; rlm@1: // m_szRegKey = szRegKey; rlm@1: rlm@1: DWORD data[2048/sizeof(DWORD)]; rlm@1: rlm@1: DWORD len = sizeof(data); rlm@1: if (regQueryBinaryValue("keyboard", (char *)data, len)) rlm@1: { rlm@1: int count = len/sizeof(DWORD); rlm@1: rlm@1: CCmdAccelOb*pCmdAccel; rlm@1: CAccelsOb* pAccel; rlm@1: DWORD dwIDAccelData, dwAccelData; rlm@1: BOOL bExistID; rlm@1: int iIndex = 0; rlm@1: if (count) rlm@1: { rlm@1: WORD wKey; rlm@1: POSITION pos = m_mapAccelTable.GetStartPosition(); rlm@1: rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: pCmdAccel->DeleteUserAccels(); rlm@1: } rlm@1: rlm@1: while (iIndex < count) rlm@1: { rlm@1: dwIDAccelData = data[iIndex++]; rlm@1: rlm@1: WORD wIDCommand = LOWORD(dwIDAccelData); rlm@1: bExistID = m_mapAccelTable.Lookup(wIDCommand, pCmdAccel); rlm@1: rlm@1: if (bExistID) rlm@1: { rlm@1: pCmdAccel->DeleteUserAccels(); rlm@1: } rlm@1: for (int j = 0; j < HIWORD(dwIDAccelData) && iIndex < count; j++) rlm@1: { rlm@1: dwAccelData = data[iIndex++]; rlm@1: if (bExistID) rlm@1: { rlm@1: pAccel = new CAccelsOb; rlm@1: ASSERT(pAccel != NULL); rlm@1: pAccel->SetData(dwAccelData); rlm@1: pCmdAccel->Add(pAccel); rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: UpdateWndTable(); rlm@1: return true; rlm@1: } rlm@1: return false; rlm@1: } rlm@1: rlm@1: bool CAcceleratorManager::Write() rlm@1: { rlm@1: CDWordArray AccelsDatasArray; rlm@1: CDWordArray CmdDatasArray; rlm@1: rlm@1: int iCount = 0; rlm@1: CCmdAccelOb*pCmdAccel; rlm@1: CAccelsOb* pAccel; rlm@1: DWORD dwAccelData; rlm@1: rlm@1: WORD wKey; rlm@1: POSITION pos = m_mapAccelTable.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: CmdDatasArray.RemoveAll(); rlm@1: rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: // if (!pAccel->m_bLocked) { rlm@1: dwAccelData = pAccel->GetData(); rlm@1: CmdDatasArray.Add(dwAccelData); rlm@1: // } rlm@1: } rlm@1: rlm@1: if (CmdDatasArray.GetSize() > 0) rlm@1: { rlm@1: CmdDatasArray.InsertAt(0, MAKELONG(pCmdAccel->m_wIDCommand, CmdDatasArray.GetSize())); rlm@1: rlm@1: AccelsDatasArray.Append(CmdDatasArray); rlm@1: iCount++; rlm@1: } rlm@1: } rlm@1: // AccelsDatasArray.InsertAt(0, MAKELONG(65535, iCount)); rlm@1: rlm@1: int count = AccelsDatasArray.GetSize(); rlm@1: DWORD *data = (DWORD *)malloc(count * sizeof(DWORD)); rlm@1: ASSERT(data != NULL); rlm@1: rlm@1: for (int index = 0; index < count; index++) rlm@1: data[index] = AccelsDatasArray[index]; rlm@1: rlm@1: regSetBinaryValue("keyboard", (char *)data, count*sizeof(DWORD)); rlm@1: rlm@1: AccelsDatasArray.RemoveAll(); rlm@1: CmdDatasArray.RemoveAll(); rlm@1: rlm@1: free(data); rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // Defaults values management. rlm@1: // rlm@1: bool CAcceleratorManager::CreateDefaultTable() rlm@1: { rlm@1: if (m_bDefaultTable) rlm@1: return false; rlm@1: rlm@1: CCmdAccelOb*pCmdAccel; rlm@1: CCmdAccelOb*pNewCmdAccel; rlm@1: rlm@1: CAccelsOb*pAccel; rlm@1: CAccelsOb*pNewAccel; rlm@1: rlm@1: WORD wKey; rlm@1: POSITION pos = m_mapAccelTable.GetStartPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel); rlm@1: pNewCmdAccel = new CCmdAccelOb; rlm@1: ASSERT(pNewCmdAccel != NULL); rlm@1: rlm@1: POSITION pos = pCmdAccel->m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = pCmdAccel->m_Accels.GetNext(pos); rlm@1: if (!pAccel->m_bLocked) rlm@1: { rlm@1: pNewAccel = new CAccelsOb; rlm@1: ASSERT(pNewAccel != NULL); rlm@1: rlm@1: *pNewAccel = *pAccel; rlm@1: pNewCmdAccel->m_Accels.AddTail(pNewAccel); rlm@1: } rlm@1: } rlm@1: if (pNewCmdAccel->m_Accels.GetCount() != 0) rlm@1: { rlm@1: pNewCmdAccel->m_wIDCommand = pCmdAccel->m_wIDCommand; rlm@1: pNewCmdAccel->m_szCommand = pCmdAccel->m_szCommand; rlm@1: rlm@1: m_mapAccelTableSaved.SetAt(wKey, pNewCmdAccel); rlm@1: } rlm@1: else rlm@1: delete pNewCmdAccel; rlm@1: } rlm@1: rlm@1: m_bDefaultTable = true; rlm@1: return true; rlm@1: } rlm@1: rlm@1: #include "mainwnd.h" rlm@1: bool CAcceleratorManager::Default() rlm@1: { rlm@1: /// this is NYI for some reason, so the "Reset All" button doesn't work rlm@1: rlm@1: #if 0 rlm@1: // still doesn't work: rlm@1: Reset(); rlm@1: regDeleteValue("keyboard"); rlm@1: regDeleteValue("keyboardCount"); rlm@1: Connect((MainWnd *)theApp.m_pMainWnd); rlm@1: extern void winAccelAddCommands(CAcceleratorManager& mgr); rlm@1: Load(); rlm@1: CreateDefaultTable(); rlm@1: winAccelAddCommands(*this); rlm@1: UpdateWndTable(); rlm@1: Write(); rlm@1: UpdateMenu(theApp.menu); rlm@1: m_pWndConnected = NULL; rlm@1: #endif rlm@1: rlm@1: return true; rlm@1: } rlm@1: