annotate src/win32/AcceleratorManager.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 ////////////////////////////////////////////////////////////////////////////////
rlm@1 2 // Copyright (C) 1998 by Thierry Maurel
rlm@1 3 // All rights reserved
rlm@1 4 //
rlm@1 5 // Distribute freely, except: don't remove my name from the source or
rlm@1 6 // documentation (don't take credit for my work), mark your changes (don't
rlm@1 7 // get me blamed for your possible bugs), don't alter or remove this
rlm@1 8 // notice.
rlm@1 9 // No warrantee of any kind, express or implied, is included with this
rlm@1 10 // software; use at your own risk, responsibility for damages (if any) to
rlm@1 11 // anyone resulting from the use of this software rests entirely with the
rlm@1 12 // user.
rlm@1 13 //
rlm@1 14 // Send bug reports, bug fixes, enhancements, requests, flames, etc., and
rlm@1 15 // I'll try to keep a version up to date. I can be reached as follows:
rlm@1 16 // tmaurel@caramail.com (or tmaurel@hol.fr)
rlm@1 17 //
rlm@1 18 ////////////////////////////////////////////////////////////////////////////////
rlm@1 19 // File : AcceleratorManager.cpp
rlm@1 20 // Project : AccelsEditor
rlm@1 21 ////////////////////////////////////////////////////////////////////////////////
rlm@1 22 // Version : 1.0 * Author : T.Maurel
rlm@1 23 // Date : 17.08.98
rlm@1 24 //
rlm@1 25 // Remarks : implementation of the CAcceleratorManager class.
rlm@1 26 //
rlm@1 27 ////////////////////////////////////////////////////////////////////////////////
rlm@1 28 // Modified by aquanull:
rlm@1 29 // All win32 registry stuff removed
rlm@1 30
rlm@1 31 #include "stdafx.h"
rlm@1 32 #include <windows.h> // MIIM_STRING
rlm@1 33 #include "resource.h"
rlm@1 34 #include "AcceleratorManager.h"
rlm@1 35 #include "CmdAccelOb.h"
rlm@1 36 #include "Reg.h"
rlm@1 37 #include "VBA.h"
rlm@1 38 //#include "../common/System.h"
rlm@1 39
rlm@1 40 CAcceleratorManager::CAcceleratorManager()
rlm@1 41 {
rlm@1 42 m_bAutoSave = FALSE;
rlm@1 43 m_pWndConnected = NULL;
rlm@1 44
rlm@1 45 m_bDefaultTable = false;
rlm@1 46 }
rlm@1 47
rlm@1 48 CAcceleratorManager::~CAcceleratorManager()
rlm@1 49 {
rlm@1 50 #if 0
rlm@1 51 if (m_bAutoSave)
rlm@1 52 {
rlm@1 53 bool bRet = Write();
rlm@1 54 if (!bRet)
rlm@1 55 systemMessage(0, "CAcceleratorManager::~CAcceleratorManager\nError in CAcceleratorManager::Write...");
rlm@1 56 }
rlm@1 57 #endif
rlm@1 58 Reset();
rlm@1 59 }
rlm@1 60
rlm@1 61 CAcceleratorManager & CAcceleratorManager::operator=(const CAcceleratorManager& accelmgr)
rlm@1 62 {
rlm@1 63 Reset();
rlm@1 64
rlm@1 65 CCmdAccelOb*pCmdAccel;
rlm@1 66 CCmdAccelOb*pNewCmdAccel;
rlm@1 67 WORD wKey;
rlm@1 68 // Copy the 2 tables : normal accel table...
rlm@1 69 POSITION pos = accelmgr.m_mapAccelTable.GetStartPosition();
rlm@1 70 while (pos != NULL)
rlm@1 71 {
rlm@1 72 accelmgr.m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 73 pNewCmdAccel = new CCmdAccelOb;
rlm@1 74 ASSERT(pNewCmdAccel != NULL);
rlm@1 75 *pNewCmdAccel = *pCmdAccel;
rlm@1 76 m_mapAccelTable.SetAt(wKey, pNewCmdAccel);
rlm@1 77 }
rlm@1 78 // ... and saved accel table.
rlm@1 79 pos = accelmgr.m_mapAccelTableSaved.GetStartPosition();
rlm@1 80 while (pos != NULL)
rlm@1 81 {
rlm@1 82 accelmgr.m_mapAccelTableSaved.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 83 pNewCmdAccel = new CCmdAccelOb;
rlm@1 84 ASSERT(pNewCmdAccel != NULL);
rlm@1 85 *pNewCmdAccel = *pCmdAccel;
rlm@1 86 m_mapAccelTableSaved.SetAt(wKey, pNewCmdAccel);
rlm@1 87 }
rlm@1 88
rlm@1 89 // The Strings-ID table
rlm@1 90 CString szKey;
rlm@1 91 pos = accelmgr.m_mapAccelString.GetStartPosition();
rlm@1 92 while (pos != NULL)
rlm@1 93 {
rlm@1 94 accelmgr.m_mapAccelString.GetNextAssoc(pos, szKey, wKey);
rlm@1 95 m_mapAccelString.SetAt(szKey, wKey);
rlm@1 96 }
rlm@1 97 m_bDefaultTable = accelmgr.m_bDefaultTable;
rlm@1 98
rlm@1 99 return *this;
rlm@1 100 }
rlm@1 101
rlm@1 102 //////////////////////////////////////////////////////////////////////
rlm@1 103 // Internal fcts
rlm@1 104 //
rlm@1 105 void CAcceleratorManager::Reset()
rlm@1 106 {
rlm@1 107 CCmdAccelOb*pCmdAccel;
rlm@1 108 WORD wKey;
rlm@1 109 POSITION pos = m_mapAccelTable.GetStartPosition();
rlm@1 110 while (pos != NULL)
rlm@1 111 {
rlm@1 112 m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 113 delete pCmdAccel;
rlm@1 114 }
rlm@1 115 m_mapAccelTable.RemoveAll();
rlm@1 116 m_mapAccelString.RemoveAll();
rlm@1 117
rlm@1 118 pos = m_mapAccelTableSaved.GetStartPosition();
rlm@1 119 while (pos != NULL)
rlm@1 120 {
rlm@1 121 m_mapAccelTableSaved.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 122 delete pCmdAccel;
rlm@1 123 }
rlm@1 124 m_mapAccelTableSaved.RemoveAll();
rlm@1 125 }
rlm@1 126
rlm@1 127 bool CAcceleratorManager::AddAccel(BYTE cVirt, WORD wIDCommand, WORD wKey, LPCTSTR szCommand, bool bLocked)
rlm@1 128 {
rlm@1 129 ASSERT(szCommand != NULL);
rlm@1 130
rlm@1 131 WORD wIDCmd;
rlm@1 132 if (m_mapAccelString.Lookup(szCommand, wIDCmd) == TRUE)
rlm@1 133 {
rlm@1 134 if (wIDCmd != wIDCommand)
rlm@1 135 return false;
rlm@1 136 }
rlm@1 137
rlm@1 138 CCmdAccelOb*pCmdAccel = NULL;
rlm@1 139 if (m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) == TRUE)
rlm@1 140 {
rlm@1 141 if (pCmdAccel->m_szCommand != szCommand)
rlm@1 142 {
rlm@1 143 return false;
rlm@1 144 }
rlm@1 145 CAccelsOb*pAccel;
rlm@1 146 POSITION pos = pCmdAccel->m_Accels.GetHeadPosition();
rlm@1 147 while (pos != NULL)
rlm@1 148 {
rlm@1 149 pAccel = pCmdAccel->m_Accels.GetNext(pos);
rlm@1 150 if (pAccel->m_cVirt == cVirt &&
rlm@1 151 pAccel->m_wKey == wKey)
rlm@1 152 return FALSE;
rlm@1 153 }
rlm@1 154 // Adding the accelerator
rlm@1 155 pCmdAccel->Add(cVirt, wKey, bLocked);
rlm@1 156 }
rlm@1 157 else
rlm@1 158 {
rlm@1 159 pCmdAccel = new CCmdAccelOb(cVirt, wIDCommand, wKey, szCommand, bLocked);
rlm@1 160 ASSERT(pCmdAccel != NULL);
rlm@1 161 m_mapAccelTable.SetAt(wIDCommand, pCmdAccel);
rlm@1 162 }
rlm@1 163 // 2nd table
rlm@1 164 m_mapAccelString.SetAt(szCommand, wIDCommand);
rlm@1 165 return true;
rlm@1 166 }
rlm@1 167
rlm@1 168 //////////////////////////////////////////////////////////////////////
rlm@1 169 // Debug fcts
rlm@1 170 //
rlm@1 171 #ifdef _DEBUG
rlm@1 172 void CAcceleratorManager::AssertValid() const
rlm@1 173 {}
rlm@1 174
rlm@1 175 void CAcceleratorManager::Dump(CDumpContext& dc) const
rlm@1 176 {
rlm@1 177 CCmdAccelOb*pCmdAccel;
rlm@1 178 WORD wKey;
rlm@1 179 dc << "CAcceleratorManager::Dump :\n";
rlm@1 180 dc << "m_mapAccelTable :\n";
rlm@1 181 POSITION pos = m_mapAccelTable.GetStartPosition();
rlm@1 182 while (pos != NULL)
rlm@1 183 {
rlm@1 184 m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 185 dc << "a CCmdAccelOb at 0x" << (void *)pCmdAccel << " = {\n";
rlm@1 186 dc << pCmdAccel;
rlm@1 187 dc << "}\n";
rlm@1 188 }
rlm@1 189 dc << "\nm_mapAccelTableSaved\n";
rlm@1 190 pos = m_mapAccelTableSaved.GetStartPosition();
rlm@1 191 while (pos != NULL)
rlm@1 192 {
rlm@1 193 m_mapAccelTableSaved.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 194 dc << "a CCmdAccelOb at 0x" << (void *)pCmdAccel << " = {\n";
rlm@1 195 dc << pCmdAccel;
rlm@1 196 dc << "}\n";
rlm@1 197 }
rlm@1 198 }
rlm@1 199
rlm@1 200 #endif
rlm@1 201
rlm@1 202 void CAcceleratorManager::Connect(CWnd*pWnd, bool bAutoSave)
rlm@1 203 {
rlm@1 204 ASSERT(m_pWndConnected == NULL);
rlm@1 205 m_pWndConnected = pWnd;
rlm@1 206 m_bAutoSave = bAutoSave;
rlm@1 207 }
rlm@1 208
rlm@1 209 //////////////////////////////////////////////////////////////////////
rlm@1 210 // Update the application's ACCELs table
rlm@1 211 //
rlm@1 212 bool CAcceleratorManager::UpdateWndTable()
rlm@1 213 {
rlm@1 214 int iLoop = 0;
rlm@1 215 CTypedPtrArray<CPtrArray, LPACCEL> arrayACCEL;
rlm@1 216
rlm@1 217 CCmdAccelOb*pCmdAccel;
rlm@1 218 WORD wKey;
rlm@1 219 LPACCEL pACCEL;
rlm@1 220 CAccelsOb* pAccelOb;
rlm@1 221 POSITION pos = m_mapAccelTable.GetStartPosition();
rlm@1 222 while (pos != NULL)
rlm@1 223 {
rlm@1 224 m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 225 POSITION pos = pCmdAccel->m_Accels.GetHeadPosition();
rlm@1 226 while (pos != NULL)
rlm@1 227 {
rlm@1 228 pAccelOb = pCmdAccel->m_Accels.GetNext(pos);
rlm@1 229
rlm@1 230 pACCEL = new ACCEL;
rlm@1 231 ASSERT(pACCEL != NULL);
rlm@1 232 pACCEL->fVirt = pAccelOb->m_cVirt;
rlm@1 233 pACCEL->key = pAccelOb->m_wKey;
rlm@1 234 pACCEL->cmd = pCmdAccel->m_wIDCommand;
rlm@1 235 arrayACCEL.Add(pACCEL);
rlm@1 236 }
rlm@1 237 }
rlm@1 238
rlm@1 239 int nAccel = arrayACCEL.GetSize();
rlm@1 240 LPACCEL lpAccel = (LPACCEL)LocalAlloc(LPTR, nAccel * sizeof(ACCEL));
rlm@1 241 if (!lpAccel)
rlm@1 242 {
rlm@1 243 for (iLoop = 0; iLoop < nAccel; iLoop++)
rlm@1 244 delete arrayACCEL.GetAt(iLoop);
rlm@1 245 arrayACCEL.RemoveAll();
rlm@1 246
rlm@1 247 return false;
rlm@1 248 }
rlm@1 249
rlm@1 250 for (iLoop = 0; iLoop < nAccel; iLoop++)
rlm@1 251 {
rlm@1 252 pACCEL = arrayACCEL.GetAt(iLoop);
rlm@1 253 lpAccel[iLoop].fVirt = pACCEL->fVirt;
rlm@1 254 lpAccel[iLoop].key = pACCEL->key;
rlm@1 255 lpAccel[iLoop].cmd = pACCEL->cmd;
rlm@1 256
rlm@1 257 delete pACCEL;
rlm@1 258 }
rlm@1 259 arrayACCEL.RemoveAll();
rlm@1 260
rlm@1 261 HACCEL hNewTable = CreateAcceleratorTable(lpAccel, nAccel);
rlm@1 262 if (!hNewTable)
rlm@1 263 {
rlm@1 264 ::LocalFree(lpAccel);
rlm@1 265 return false;
rlm@1 266 }
rlm@1 267 HACCEL hOldTable = theApp.hAccel;
rlm@1 268 if (!::DestroyAcceleratorTable(hOldTable))
rlm@1 269 {
rlm@1 270 ::LocalFree(lpAccel);
rlm@1 271 return false;
rlm@1 272 }
rlm@1 273 theApp.hAccel = hNewTable;
rlm@1 274 ::LocalFree(lpAccel);
rlm@1 275
rlm@1 276 UpdateMenu(GetMenu(*AfxGetApp()->m_pMainWnd));
rlm@1 277
rlm@1 278 return true;
rlm@1 279 }
rlm@1 280
rlm@1 281 //////////////////////////////////////////////////////////////////////
rlm@1 282 // Create/Destroy accelerators
rlm@1 283 //
rlm@1 284 bool CAcceleratorManager::DeleteAccel(BYTE cVirt, WORD wIDCommand, WORD wKey)
rlm@1 285 {
rlm@1 286 CCmdAccelOb*pCmdAccel = NULL;
rlm@1 287 if (m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) == TRUE)
rlm@1 288 {
rlm@1 289 POSITION pos = pCmdAccel->m_Accels.GetHeadPosition();
rlm@1 290 POSITION PrevPos;
rlm@1 291 CAccelsOb*pAccel = NULL;
rlm@1 292 while (pos != NULL)
rlm@1 293 {
rlm@1 294 PrevPos = pos;
rlm@1 295 pAccel = pCmdAccel->m_Accels.GetNext(pos);
rlm@1 296 if (pAccel->m_bLocked == true)
rlm@1 297 return false;
rlm@1 298
rlm@1 299 if (pAccel->m_cVirt == cVirt && pAccel->m_wKey == wKey)
rlm@1 300 {
rlm@1 301 pCmdAccel->m_Accels.RemoveAt(PrevPos);
rlm@1 302 delete pAccel;
rlm@1 303 return true;
rlm@1 304 }
rlm@1 305 }
rlm@1 306 }
rlm@1 307 return false;
rlm@1 308 }
rlm@1 309
rlm@1 310 bool CAcceleratorManager::DeleteEntry(WORD wIDCommand)
rlm@1 311 {
rlm@1 312 CCmdAccelOb*pCmdAccel = NULL;
rlm@1 313 VERIFY(m_mapAccelTable.Lookup(wIDCommand, pCmdAccel) == TRUE);
rlm@1 314
rlm@1 315 CAccelsOb*pAccel;
rlm@1 316 POSITION pos = pCmdAccel->m_Accels.GetHeadPosition();
rlm@1 317 while (pos != NULL)
rlm@1 318 {
rlm@1 319 pAccel = pCmdAccel->m_Accels.GetNext(pos);
rlm@1 320 if (pAccel->m_bLocked == true)
rlm@1 321 return false;
rlm@1 322 }
rlm@1 323 m_mapAccelString.RemoveKey(pCmdAccel->m_szCommand);
rlm@1 324 m_mapAccelTable.RemoveKey(wIDCommand);
rlm@1 325 delete pCmdAccel;
rlm@1 326
rlm@1 327 return true;
rlm@1 328 }
rlm@1 329
rlm@1 330 bool CAcceleratorManager::DeleteEntry(LPCTSTR szCommand)
rlm@1 331 {
rlm@1 332 ASSERT(szCommand != NULL);
rlm@1 333
rlm@1 334 WORD wIDCommand;
rlm@1 335 if (m_mapAccelString.Lookup(szCommand, wIDCommand) == TRUE)
rlm@1 336 {
rlm@1 337 return DeleteEntry(wIDCommand);
rlm@1 338 }
rlm@1 339 return true;
rlm@1 340 }
rlm@1 341
rlm@1 342 bool CAcceleratorManager::SetAccel(BYTE cVirt, WORD wIDCommand, WORD wKey, LPCTSTR szCommand, bool bLocked)
rlm@1 343 {
rlm@1 344 ASSERT(szCommand != NULL);
rlm@1 345
rlm@1 346 return AddAccel(cVirt, wIDCommand, wKey, szCommand, bLocked);
rlm@1 347 }
rlm@1 348
rlm@1 349 bool CAcceleratorManager::AddCommandAccel(WORD wIDCommand, LPCTSTR szCommand, bool bLocked)
rlm@1 350 {
rlm@1 351 ASSERT(szCommand != NULL);
rlm@1 352
rlm@1 353 ASSERT(m_pWndConnected != NULL);
rlm@1 354 HACCEL hOriginalTable = theApp.hAccel;
rlm@1 355
rlm@1 356 int nAccel = ::CopyAcceleratorTable(hOriginalTable, NULL, 0);
rlm@1 357 LPACCEL lpAccel = (LPACCEL)LocalAlloc(LPTR, (nAccel) * sizeof(ACCEL));
rlm@1 358 if (!lpAccel)
rlm@1 359 return false;
rlm@1 360 ::CopyAcceleratorTable(hOriginalTable, lpAccel, nAccel);
rlm@1 361
rlm@1 362 bool bRet = false;
rlm@1 363 for (int i = 0; i < nAccel; i++)
rlm@1 364 {
rlm@1 365 if (lpAccel[i].cmd == wIDCommand)
rlm@1 366 bRet = AddAccel(lpAccel[i].fVirt, wIDCommand, lpAccel[i].key, szCommand, bLocked);
rlm@1 367 }
rlm@1 368 ::LocalFree(lpAccel);
rlm@1 369 return bRet;
rlm@1 370 }
rlm@1 371
rlm@1 372 bool CAcceleratorManager::CreateEntry(WORD wIDCommand, LPCTSTR szCommand)
rlm@1 373 {
rlm@1 374 ASSERT(szCommand != NULL);
rlm@1 375
rlm@1 376 WORD wIDDummy;
rlm@1 377 if (m_mapAccelString.Lookup(szCommand, wIDDummy) == TRUE)
rlm@1 378 return false;
rlm@1 379
rlm@1 380 CCmdAccelOb*pCmdAccel = new CCmdAccelOb(wIDCommand, szCommand);
rlm@1 381 ASSERT(pCmdAccel != NULL);
rlm@1 382 m_mapAccelTable.SetAt(wIDCommand, pCmdAccel);
rlm@1 383 m_mapAccelString.SetAt(szCommand, wIDCommand);
rlm@1 384
rlm@1 385 return false;
rlm@1 386 }
rlm@1 387
rlm@1 388 //////////////////////////////////////////////////////////////////////
rlm@1 389 // Get a string from the ACCEL definition
rlm@1 390 //
rlm@1 391 bool CAcceleratorManager::GetStringFromACCEL(ACCEL*pACCEL, CString& szAccel)
rlm@1 392 {
rlm@1 393 ASSERT(pACCEL != NULL);
rlm@1 394
rlm@1 395 CAccelsOb accel(pACCEL);
rlm@1 396 accel.GetString(szAccel);
rlm@1 397
rlm@1 398 if (szAccel.IsEmpty())
rlm@1 399 return false;
rlm@1 400 else
rlm@1 401 return true;
rlm@1 402 }
rlm@1 403
rlm@1 404 bool CAcceleratorManager::GetStringFromACCEL(BYTE cVirt, WORD nCode, CString& szAccel)
rlm@1 405 {
rlm@1 406 CAccelsOb accel(cVirt, nCode);
rlm@1 407 accel.GetString(szAccel);
rlm@1 408
rlm@1 409 if (szAccel.IsEmpty())
rlm@1 410 return false;
rlm@1 411 else
rlm@1 412 return true;
rlm@1 413 }
rlm@1 414
rlm@1 415 void CAcceleratorManager::UpdateMenu(HMENU menu)
rlm@1 416 {
rlm@1 417 int count = GetMenuItemCount(menu);
rlm@1 418
rlm@1 419 OSVERSIONINFO info = {0};
rlm@1 420 info.dwOSVersionInfoSize = sizeof(info);
rlm@1 421 GetVersionEx(&info);
rlm@1 422
rlm@1 423 if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
rlm@1 424 {
rlm@1 425 MENUITEMINFO info = {0};
rlm@1 426 info.cbSize = sizeof(info) - sizeof(HBITMAP);
rlm@1 427 info.fMask = MIIM_ID | MIIM_SUBMENU;
rlm@1 428 for (int i = 0; i < count; i++)
rlm@1 429 {
rlm@1 430 GetMenuItemInfo(menu, i, TRUE, &info);
rlm@1 431
rlm@1 432 if (info.hSubMenu != NULL)
rlm@1 433 {
rlm@1 434 UpdateMenu(info.hSubMenu);
rlm@1 435 }
rlm@1 436 else
rlm@1 437 {
rlm@1 438 if (info.wID != (UINT)-1)
rlm@1 439 {
rlm@1 440 char ss[128];
rlm@1 441 MENUITEMINFO info2 = {0};
rlm@1 442 info2.cbSize = sizeof(info2) - sizeof(HBITMAP); // FIXME: why?
rlm@1 443 info2.fMask = MIIM_STRING;
rlm@1 444 info2.dwTypeData = ss;
rlm@1 445 info2.cch = 128;
rlm@1 446 GetMenuItemInfo(menu, i, MF_BYPOSITION, &info2);
rlm@1 447
rlm@1 448 CString str(ss);
rlm@1 449 int index = str.Find('\t');
rlm@1 450 if (index != -1)
rlm@1 451 str = str.Left(index);
rlm@1 452
rlm@1 453 WORD command = info.wID;
rlm@1 454
rlm@1 455 CCmdAccelOb *o;
rlm@1 456 if (m_mapAccelTable.Lookup(command, o))
rlm@1 457 {
rlm@1 458 if (o->m_Accels.GetCount())
rlm@1 459 {
rlm@1 460 POSITION pos = o->m_Accels.GetHeadPosition();
rlm@1 461 CAccelsOb *accel = o->m_Accels.GetNext(pos);
rlm@1 462
rlm@1 463 CString s;
rlm@1 464 accel->GetString(s);
rlm@1 465 str += "\t";
rlm@1 466 str += s;
rlm@1 467 }
rlm@1 468 }
rlm@1 469 if (str != ss)
rlm@1 470 ModifyMenu(menu, i, MF_BYPOSITION | MF_STRING, info.wID, str);
rlm@1 471 }
rlm@1 472 }
rlm@1 473 }
rlm@1 474 }
rlm@1 475 else
rlm@1 476 {
rlm@1 477 MENUITEMINFO info = {0};
rlm@1 478 info.cbSize = sizeof(info);
rlm@1 479 info.fMask = MIIM_ID | MIIM_SUBMENU;
rlm@1 480 for (int i = 0; i < count; i++)
rlm@1 481 {
rlm@1 482 GetMenuItemInfo(menu, i, TRUE, &info);
rlm@1 483
rlm@1 484 if (info.hSubMenu != NULL)
rlm@1 485 {
rlm@1 486 UpdateMenu(info.hSubMenu);
rlm@1 487 }
rlm@1 488 else
rlm@1 489 {
rlm@1 490 if (info.wID != (WORD)-1)
rlm@1 491 {
rlm@1 492 wchar_t ss[128];
rlm@1 493 wchar_t str[512];
rlm@1 494 MENUITEMINFOW info2 = {0};
rlm@1 495 info2.cbSize = sizeof(info2);
rlm@1 496 info2.fMask = MIIM_STRING;
rlm@1 497 info2.dwTypeData = ss;
rlm@1 498 info2.cch = 128;
rlm@1 499 GetMenuItemInfoW(menu, i, MF_BYPOSITION, &info2);
rlm@1 500
rlm@1 501 wcscpy(str, ss);
rlm@1 502
rlm@1 503 wchar_t *p = wcschr(str, '\t');
rlm@1 504 if (p)
rlm@1 505 *p = 0;
rlm@1 506
rlm@1 507 CCmdAccelOb *o;
rlm@1 508 WORD command = info.wID;
rlm@1 509 if (m_mapAccelTable.Lookup(command, o))
rlm@1 510 {
rlm@1 511 if (o->m_Accels.GetCount())
rlm@1 512 {
rlm@1 513 POSITION pos = o->m_Accels.GetHeadPosition();
rlm@1 514
rlm@1 515 CAccelsOb *accel = o->m_Accels.GetNext(pos);
rlm@1 516
rlm@1 517 CString s;
rlm@1 518 accel->GetString(s);
rlm@1 519
rlm@1 520 wchar_t temp[128];
rlm@1 521 temp[0] = '\t';
rlm@1 522 temp[1] = 0;
rlm@1 523 wcscat(str, temp);
rlm@1 524 p = temp;
rlm@1 525 for (const char *sp = s; *sp; sp++)
rlm@1 526 *p++ = *sp;
rlm@1 527 *p = 0;
rlm@1 528 wcscat(str, temp);
rlm@1 529 }
rlm@1 530 }
rlm@1 531 if (wcscmp(str, ss))
rlm@1 532 ModifyMenuW(menu, i, MF_BYPOSITION | MF_STRING, info.wID, str);
rlm@1 533 }
rlm@1 534 }
rlm@1 535 }
rlm@1 536 }
rlm@1 537 }
rlm@1 538
rlm@1 539 //////////////////////////////////////////////////////////////////////
rlm@1 540 // In/Out to the registry
rlm@1 541 //
rlm@1 542 bool CAcceleratorManager::Load()
rlm@1 543 {
rlm@1 544 // ASSERT(szRegKey != NULL);
rlm@1 545
rlm@1 546 // m_hRegKey = hRegKey;
rlm@1 547 // m_szRegKey = szRegKey;
rlm@1 548
rlm@1 549 DWORD data[2048/sizeof(DWORD)];
rlm@1 550
rlm@1 551 DWORD len = sizeof(data);
rlm@1 552 if (regQueryBinaryValue("keyboard", (char *)data, len))
rlm@1 553 {
rlm@1 554 int count = len/sizeof(DWORD);
rlm@1 555
rlm@1 556 CCmdAccelOb*pCmdAccel;
rlm@1 557 CAccelsOb* pAccel;
rlm@1 558 DWORD dwIDAccelData, dwAccelData;
rlm@1 559 BOOL bExistID;
rlm@1 560 int iIndex = 0;
rlm@1 561 if (count)
rlm@1 562 {
rlm@1 563 WORD wKey;
rlm@1 564 POSITION pos = m_mapAccelTable.GetStartPosition();
rlm@1 565
rlm@1 566 while (pos != NULL)
rlm@1 567 {
rlm@1 568 m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 569 pCmdAccel->DeleteUserAccels();
rlm@1 570 }
rlm@1 571
rlm@1 572 while (iIndex < count)
rlm@1 573 {
rlm@1 574 dwIDAccelData = data[iIndex++];
rlm@1 575
rlm@1 576 WORD wIDCommand = LOWORD(dwIDAccelData);
rlm@1 577 bExistID = m_mapAccelTable.Lookup(wIDCommand, pCmdAccel);
rlm@1 578
rlm@1 579 if (bExistID)
rlm@1 580 {
rlm@1 581 pCmdAccel->DeleteUserAccels();
rlm@1 582 }
rlm@1 583 for (int j = 0; j < HIWORD(dwIDAccelData) && iIndex < count; j++)
rlm@1 584 {
rlm@1 585 dwAccelData = data[iIndex++];
rlm@1 586 if (bExistID)
rlm@1 587 {
rlm@1 588 pAccel = new CAccelsOb;
rlm@1 589 ASSERT(pAccel != NULL);
rlm@1 590 pAccel->SetData(dwAccelData);
rlm@1 591 pCmdAccel->Add(pAccel);
rlm@1 592 }
rlm@1 593 }
rlm@1 594 }
rlm@1 595 }
rlm@1 596 UpdateWndTable();
rlm@1 597 return true;
rlm@1 598 }
rlm@1 599 return false;
rlm@1 600 }
rlm@1 601
rlm@1 602 bool CAcceleratorManager::Write()
rlm@1 603 {
rlm@1 604 CDWordArray AccelsDatasArray;
rlm@1 605 CDWordArray CmdDatasArray;
rlm@1 606
rlm@1 607 int iCount = 0;
rlm@1 608 CCmdAccelOb*pCmdAccel;
rlm@1 609 CAccelsOb* pAccel;
rlm@1 610 DWORD dwAccelData;
rlm@1 611
rlm@1 612 WORD wKey;
rlm@1 613 POSITION pos = m_mapAccelTable.GetStartPosition();
rlm@1 614 while (pos != NULL)
rlm@1 615 {
rlm@1 616 m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 617 CmdDatasArray.RemoveAll();
rlm@1 618
rlm@1 619 POSITION pos = pCmdAccel->m_Accels.GetHeadPosition();
rlm@1 620 while (pos != NULL)
rlm@1 621 {
rlm@1 622 pAccel = pCmdAccel->m_Accels.GetNext(pos);
rlm@1 623 // if (!pAccel->m_bLocked) {
rlm@1 624 dwAccelData = pAccel->GetData();
rlm@1 625 CmdDatasArray.Add(dwAccelData);
rlm@1 626 // }
rlm@1 627 }
rlm@1 628
rlm@1 629 if (CmdDatasArray.GetSize() > 0)
rlm@1 630 {
rlm@1 631 CmdDatasArray.InsertAt(0, MAKELONG(pCmdAccel->m_wIDCommand, CmdDatasArray.GetSize()));
rlm@1 632
rlm@1 633 AccelsDatasArray.Append(CmdDatasArray);
rlm@1 634 iCount++;
rlm@1 635 }
rlm@1 636 }
rlm@1 637 // AccelsDatasArray.InsertAt(0, MAKELONG(65535, iCount));
rlm@1 638
rlm@1 639 int count = AccelsDatasArray.GetSize();
rlm@1 640 DWORD *data = (DWORD *)malloc(count * sizeof(DWORD));
rlm@1 641 ASSERT(data != NULL);
rlm@1 642
rlm@1 643 for (int index = 0; index < count; index++)
rlm@1 644 data[index] = AccelsDatasArray[index];
rlm@1 645
rlm@1 646 regSetBinaryValue("keyboard", (char *)data, count*sizeof(DWORD));
rlm@1 647
rlm@1 648 AccelsDatasArray.RemoveAll();
rlm@1 649 CmdDatasArray.RemoveAll();
rlm@1 650
rlm@1 651 free(data);
rlm@1 652
rlm@1 653 return true;
rlm@1 654 }
rlm@1 655
rlm@1 656 //////////////////////////////////////////////////////////////////////
rlm@1 657 // Defaults values management.
rlm@1 658 //
rlm@1 659 bool CAcceleratorManager::CreateDefaultTable()
rlm@1 660 {
rlm@1 661 if (m_bDefaultTable)
rlm@1 662 return false;
rlm@1 663
rlm@1 664 CCmdAccelOb*pCmdAccel;
rlm@1 665 CCmdAccelOb*pNewCmdAccel;
rlm@1 666
rlm@1 667 CAccelsOb*pAccel;
rlm@1 668 CAccelsOb*pNewAccel;
rlm@1 669
rlm@1 670 WORD wKey;
rlm@1 671 POSITION pos = m_mapAccelTable.GetStartPosition();
rlm@1 672 while (pos != NULL)
rlm@1 673 {
rlm@1 674 m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
rlm@1 675 pNewCmdAccel = new CCmdAccelOb;
rlm@1 676 ASSERT(pNewCmdAccel != NULL);
rlm@1 677
rlm@1 678 POSITION pos = pCmdAccel->m_Accels.GetHeadPosition();
rlm@1 679 while (pos != NULL)
rlm@1 680 {
rlm@1 681 pAccel = pCmdAccel->m_Accels.GetNext(pos);
rlm@1 682 if (!pAccel->m_bLocked)
rlm@1 683 {
rlm@1 684 pNewAccel = new CAccelsOb;
rlm@1 685 ASSERT(pNewAccel != NULL);
rlm@1 686
rlm@1 687 *pNewAccel = *pAccel;
rlm@1 688 pNewCmdAccel->m_Accels.AddTail(pNewAccel);
rlm@1 689 }
rlm@1 690 }
rlm@1 691 if (pNewCmdAccel->m_Accels.GetCount() != 0)
rlm@1 692 {
rlm@1 693 pNewCmdAccel->m_wIDCommand = pCmdAccel->m_wIDCommand;
rlm@1 694 pNewCmdAccel->m_szCommand = pCmdAccel->m_szCommand;
rlm@1 695
rlm@1 696 m_mapAccelTableSaved.SetAt(wKey, pNewCmdAccel);
rlm@1 697 }
rlm@1 698 else
rlm@1 699 delete pNewCmdAccel;
rlm@1 700 }
rlm@1 701
rlm@1 702 m_bDefaultTable = true;
rlm@1 703 return true;
rlm@1 704 }
rlm@1 705
rlm@1 706 #include "mainwnd.h"
rlm@1 707 bool CAcceleratorManager::Default()
rlm@1 708 {
rlm@1 709 /// this is NYI for some reason, so the "Reset All" button doesn't work
rlm@1 710
rlm@1 711 #if 0
rlm@1 712 // still doesn't work:
rlm@1 713 Reset();
rlm@1 714 regDeleteValue("keyboard");
rlm@1 715 regDeleteValue("keyboardCount");
rlm@1 716 Connect((MainWnd *)theApp.m_pMainWnd);
rlm@1 717 extern void winAccelAddCommands(CAcceleratorManager& mgr);
rlm@1 718 Load();
rlm@1 719 CreateDefaultTable();
rlm@1 720 winAccelAddCommands(*this);
rlm@1 721 UpdateWndTable();
rlm@1 722 Write();
rlm@1 723 UpdateMenu(theApp.menu);
rlm@1 724 m_pWndConnected = NULL;
rlm@1 725 #endif
rlm@1 726
rlm@1 727 return true;
rlm@1 728 }
rlm@1 729