//////////////////////////////////////////////////////////////////////
// In/Out to the registry
//
bool CAcceleratorManager::Load()
{
//	ASSERT(szRegKey != NULL);

//	m_hRegKey  = hRegKey;
//	m_szRegKey = szRegKey;

	DWORD data[2048/sizeof(DWORD)];

	DWORD len = sizeof(data);
	if (regQueryBinaryValue("keyboard", (char *)data, len))
	{
		int count = len/sizeof(DWORD);

		CCmdAccelOb*pCmdAccel;
		CAccelsOb*  pAccel;
		DWORD       dwIDAccelData, dwAccelData;
		BOOL        bExistID;
		int         iIndex = 0;
		if (count)
		{
			WORD     wKey;
			POSITION pos = m_mapAccelTable.GetStartPosition();

			while (pos != NULL)
			{
				m_mapAccelTable.GetNextAssoc(pos, wKey, pCmdAccel);
				pCmdAccel->DeleteUserAccels();
			}

			while (iIndex < count)
			{
				dwIDAccelData = data[iIndex++];

				WORD wIDCommand = LOWORD(dwIDAccelData);
				bExistID = m_mapAccelTable.Lookup(wIDCommand, pCmdAccel);

				if (bExistID)
				{
					pCmdAccel->DeleteUserAccels();
				}
				for (int j = 0; j < HIWORD(dwIDAccelData) && iIndex < count; j++)
				{
					dwAccelData = data[iIndex++];
					if (bExistID)
					{
						pAccel = new CAccelsOb;
						ASSERT(pAccel != NULL);
						pAccel->SetData(dwAccelData);
						pCmdAccel->Add(pAccel);
					}
				}
			}
		}
		UpdateWndTable();
		return true;
	}
	return false;
}
//////////////////////////////////////////////////////////////////////
// In/Out to the registry
//////////////////////////////////////////////////////////////////////
//
//
bool CAcceleratorManager::Load(HKEY hRegKey, LPCTSTR szRegKey)
{
  ASSERT(szRegKey != NULL);
  HKEY hKey;

  m_hRegKey = hRegKey;
  m_szRegKey = szRegKey;

  LONG res = RegOpenKeyEx(hRegKey, szRegKey, 0L, KEY_ALL_ACCESS, &hKey);
  if(res == ERROR_SUCCESS) {
    DWORD data[2048/sizeof(DWORD)];

    DWORD dwType;
    DWORD len = sizeof(data);
    res = RegQueryValueEx(hKey, "keyboard", NULL, &dwType, 
                          (LPBYTE)data, &len);
    RegCloseKey(hKey);

    if(res == ERROR_SUCCESS) {
      int count = len/sizeof(DWORD);

      CCmdAccelOb* pCmdAccel;
      CAccelsOb* pAccel;
      DWORD dwIDAccelData, dwAccelData;

      int iIndex = 0;
      if(count) {
        while(iIndex < count) {
          dwIDAccelData = data[iIndex++];

          WORD wIDCommand = LOWORD(dwIDAccelData);
          CMapWordToCCmdAccelOb::iterator it = m_mapAccelTable.find(wIDCommand);
          bool bExistID = (it != m_mapAccelTable.end());

          if (bExistID) {
            pCmdAccel = it->second;
            pCmdAccel->DeleteUserAccels();
          }
          for (int j = 0; j < HIWORD(dwIDAccelData) && iIndex < count; j++) {
            dwAccelData = data[iIndex++];
            if (bExistID) {
              pAccel = new CAccelsOb;
              ASSERT(pAccel != NULL);
              pAccel->SetData(dwAccelData);
              pCmdAccel->Add(pAccel);
            }
          }
        }
      }
      UpdateWndTable();
      return true;
    }
    return false;
  }
  return true;
}
bool CAcceleratorManager::Default()
{
	/// this is NYI for some reason, so the "Reset All" button doesn't work

#if 0
	// still doesn't work:
    Reset();
    regDeleteValue("keyboard");
    regDeleteValue("keyboardCount");
    Connect((MainWnd *)theApp.m_pMainWnd);
    extern void winAccelAddCommands(CAcceleratorManager& mgr);
    Load();
    CreateDefaultTable();
    winAccelAddCommands(*this);
    UpdateWndTable();
    Write();
    UpdateMenu(theApp.menu);
    m_pWndConnected = NULL;
#endif

	return true;
}