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 : CmdAccelOb.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 : rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // modified by the VBA-rr team rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "CmdAccelOb.h" rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: MAPVIRTKEYS mapVirtKeys[] = { rlm@1: { VK_LBUTTON, "LBUTTON" }, rlm@1: { VK_RBUTTON, "RBUTTON" }, rlm@1: { VK_CANCEL, "Cancel" }, rlm@1: { VK_MBUTTON, "MBUTTON" }, rlm@1: { VK_BACK, "Backspace" }, rlm@1: { VK_TAB, "Tab" }, rlm@1: { VK_CLEAR, "Clear" }, rlm@1: { VK_RETURN, "Enter" }, rlm@1: { VK_SHIFT, "Shift" }, rlm@1: { VK_LSHIFT, "LShift" }, rlm@1: { VK_RSHIFT, "RShift" }, rlm@1: { VK_CONTROL, "Control" }, rlm@1: { VK_LCONTROL, "LControl" }, rlm@1: { VK_RCONTROL, "RControl" }, rlm@1: { VK_MENU, "Alt" }, rlm@1: { VK_LMENU, "LAlt" }, rlm@1: { VK_RMENU, "RAlt" }, rlm@1: { VK_PAUSE, "Pause" }, rlm@1: { VK_CAPITAL, "Caps Lock" }, rlm@1: { VK_ESCAPE, "Escape" }, rlm@1: { VK_SPACE, "Space" }, rlm@1: { VK_PRIOR, "Prior" }, rlm@1: { VK_NEXT, "Next" }, rlm@1: { VK_END, "End" }, rlm@1: { VK_HOME, "Home" }, rlm@1: { VK_LEFT, "Left" }, rlm@1: { VK_UP, "Up" }, rlm@1: { VK_RIGHT, "Right" }, rlm@1: { VK_DOWN, "Down" }, rlm@1: { VK_SELECT, "Select" }, rlm@1: { VK_PRINT, "Print" }, rlm@1: { VK_EXECUTE, "Execute" }, rlm@1: { VK_SNAPSHOT, "Snapshot" }, rlm@1: { VK_INSERT, "Insert" }, rlm@1: { VK_DELETE, "Delete" }, rlm@1: { VK_HELP, "Help" }, rlm@1: { WORD('0'), "0" }, rlm@1: { WORD('1'), "1" }, rlm@1: { WORD('2'), "2" }, rlm@1: { WORD('3'), "3" }, rlm@1: { WORD('4'), "4" }, rlm@1: { WORD('5'), "5" }, rlm@1: { WORD('6'), "6" }, rlm@1: { WORD('7'), "7" }, rlm@1: { WORD('8'), "8" }, rlm@1: { WORD('9'), "9" }, rlm@1: { WORD('A'), "A" }, rlm@1: { WORD('B'), "B" }, rlm@1: { WORD('C'), "C" }, rlm@1: { WORD('D'), "D" }, rlm@1: { WORD('E'), "E" }, rlm@1: { WORD('F'), "F" }, rlm@1: { WORD('G'), "G" }, rlm@1: { WORD('H'), "H" }, rlm@1: { WORD('I'), "I" }, rlm@1: { WORD('J'), "J" }, rlm@1: { WORD('K'), "K" }, rlm@1: { WORD('L'), "L" }, rlm@1: { WORD('M'), "M" }, rlm@1: { WORD('N'), "N" }, rlm@1: { WORD('O'), "O" }, rlm@1: { WORD('P'), "P" }, rlm@1: { WORD('Q'), "Q" }, rlm@1: { WORD('R'), "R" }, rlm@1: { WORD('S'), "S" }, rlm@1: { WORD('T'), "T" }, rlm@1: { WORD('U'), "U" }, rlm@1: { WORD('V'), "V" }, rlm@1: { WORD('W'), "W" }, rlm@1: { WORD('X'), "X" }, rlm@1: { WORD('Y'), "Y" }, rlm@1: { WORD('Z'), "Z" }, rlm@1: { VK_LWIN, "LWIN" }, rlm@1: { VK_RWIN, "RWIN" }, rlm@1: { VK_APPS, "APPS" }, rlm@1: { VK_NUMPAD0, "NumPad0" }, rlm@1: { VK_NUMPAD1, "NumPad1" }, rlm@1: { VK_NUMPAD2, "NumPad2" }, rlm@1: { VK_NUMPAD3, "NumPad3" }, rlm@1: { VK_NUMPAD4, "NumPad4" }, rlm@1: { VK_NUMPAD5, "NumPad5" }, rlm@1: { VK_NUMPAD6, "NumPad6" }, rlm@1: { VK_NUMPAD7, "NumPad7" }, rlm@1: { VK_NUMPAD8, "NumPad8" }, rlm@1: { VK_NUMPAD9, "NumPad9" }, rlm@1: { VK_MULTIPLY, "NumpadMultiply" }, rlm@1: { VK_ADD, "NumpadAdd" }, rlm@1: { VK_SEPARATOR, "Separator" }, rlm@1: { VK_SUBTRACT, "NumpadSubtract" }, rlm@1: { VK_DECIMAL, "NumpadDecimal" }, rlm@1: { VK_DIVIDE, "NumpadDivide" }, rlm@1: { VK_F1, "F1" }, rlm@1: { VK_F2, "F2" }, rlm@1: { VK_F3, "F3" }, rlm@1: { VK_F4, "F4" }, rlm@1: { VK_F5, "F5" }, rlm@1: { VK_F6, "F6" }, rlm@1: { VK_F7, "F7" }, rlm@1: { VK_F8, "F8" }, rlm@1: { VK_F9, "F9" }, rlm@1: { VK_F10, "F10" }, rlm@1: { VK_F11, "F11" }, rlm@1: { VK_F12, "F12" }, rlm@1: { VK_F13, "F13" }, rlm@1: { VK_F14, "F14" }, rlm@1: { VK_F15, "F15" }, rlm@1: { VK_F16, "F16" }, rlm@1: { VK_F17, "F17" }, rlm@1: { VK_F18, "F18" }, rlm@1: { VK_F19, "F19" }, rlm@1: { VK_F20, "F20" }, rlm@1: { VK_F21, "F21" }, rlm@1: { VK_F22, "F22" }, rlm@1: { VK_F23, "F23" }, rlm@1: { VK_F24, "F24" }, rlm@1: { VK_NUMLOCK, "Num Lock" }, rlm@1: { VK_SCROLL, "Scroll Lock" }, rlm@1: { VK_ATTN, "Attention" }, rlm@1: { VK_CRSEL, "CRSEL" }, rlm@1: { VK_EXSEL, "EXSEL" }, rlm@1: { VK_EREOF, "EREOF" }, rlm@1: { VK_PLAY, "Play" }, rlm@1: { VK_ZOOM, "Zoom" }, rlm@1: { VK_NONAME, "No Name" }, rlm@1: { VK_PA1, "PA1" }, rlm@1: { VK_OEM_CLEAR, "Clear2" }, rlm@1: { VK_OEM_1, "Semicolon;" }, rlm@1: { VK_OEM_2, "Slash/" }, rlm@1: { VK_OEM_3, "Tilde~" }, rlm@1: { VK_OEM_4, "LBracket[" }, rlm@1: { VK_OEM_5, "Backslash\\" }, rlm@1: { VK_OEM_6, "RBracket]" }, rlm@1: { VK_OEM_7, "Apostrophe'" }, rlm@1: { VK_OEM_8, "OEM8" }, rlm@1: { VK_OEM_PLUS, "Plus+" }, rlm@1: { VK_OEM_MINUS, "Minus-" }, rlm@1: { VK_OEM_COMMA, "Comma," }, rlm@1: { VK_OEM_PERIOD, "Period." }, rlm@1: { VK_OEM_AX, "Apostrophe`" }, rlm@1: { VK_OEM_102, "<> or \\|" }, rlm@1: { VK_ICO_HELP, "ICO Help" }, rlm@1: { VK_ICO_00, "ICO 00" }, rlm@1: { VK_OEM_FJ_JISHO, "JISHO" }, rlm@1: { VK_OEM_FJ_MASSHOU, "MASSHOU" }, rlm@1: { VK_OEM_FJ_TOUROKU, "TOUROKU" }, rlm@1: { VK_OEM_FJ_LOYA, "LOYA" }, rlm@1: { VK_OEM_FJ_ROYA, "ROYA" }, rlm@1: { VK_OEM_NEC_EQUAL, "Numpad Equals" }, rlm@1: }; rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: MAPVIRTKEYS mapVirtSysKeys[] = { rlm@1: { FCONTROL, "Ctrl" }, rlm@1: { FALT, "Alt" }, rlm@1: { FSHIFT, "Shift" }, rlm@1: }; rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // helper fct for external access rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: TCHAR *mapVirtKeysStringFromWORD(WORD wKey) rlm@1: { rlm@1: for (int index = 0; index < sizeof(mapVirtKeys) / sizeof(mapVirtKeys[0]); index++) rlm@1: { rlm@1: if (mapVirtKeys[index].wKey == wKey) rlm@1: return mapVirtKeys[index].szKey; rlm@1: } rlm@1: return NULL; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: #define DEFAULT_ACCEL 0x01 rlm@1: #define USER_ACCEL 0x02 rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CAccelsOb::CAccelsOb() rlm@1: { rlm@1: m_cVirt = 0; rlm@1: m_wKey = 0; rlm@1: m_bLocked = false; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CAccelsOb::CAccelsOb(CAccelsOb *pFrom) rlm@1: { rlm@1: ASSERT(pFrom != NULL); rlm@1: rlm@1: m_cVirt = pFrom->m_cVirt; rlm@1: m_wKey = pFrom->m_wKey; rlm@1: m_bLocked = pFrom->m_bLocked; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CAccelsOb::CAccelsOb(BYTE cVirt, WORD wKey, bool bLocked) rlm@1: { rlm@1: m_cVirt = cVirt; rlm@1: m_wKey = wKey; rlm@1: m_bLocked = bLocked; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CAccelsOb::CAccelsOb(LPACCEL pACCEL) rlm@1: { rlm@1: ASSERT(pACCEL != NULL); rlm@1: rlm@1: m_cVirt = pACCEL->fVirt; rlm@1: m_wKey = pACCEL->key; rlm@1: m_bLocked = false; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CAccelsOb & CAccelsOb::operator=(const CAccelsOb &from) rlm@1: { rlm@1: m_cVirt = from.m_cVirt; rlm@1: m_wKey = from.m_wKey; rlm@1: m_bLocked = from.m_bLocked; rlm@1: rlm@1: return *this; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CAccelsOb::GetString(CString &szBuffer) rlm@1: { rlm@1: szBuffer = ""; rlm@1: rlm@1: // modifiers part rlm@1: for (int i = 0; i < sizetable(mapVirtSysKeys); i++) rlm@1: { rlm@1: if (m_cVirt & mapVirtSysKeys[i].wKey) rlm@1: { rlm@1: szBuffer += mapVirtSysKeys[i].szKey; rlm@1: if (m_wKey) rlm@1: szBuffer += "+"; rlm@1: } rlm@1: } rlm@1: rlm@1: // in case of the object is not assigned, we avoid error messages rlm@1: if (m_wKey == 0) rlm@1: return; rlm@1: rlm@1: // and virtual key part rlm@1: for (int i = 0; i < sizetable(mapVirtKeys); i++) rlm@1: { rlm@1: if (m_wKey == mapVirtKeys[i].wKey) rlm@1: { rlm@1: szBuffer += mapVirtKeys[i].szKey; rlm@1: return; rlm@1: } rlm@1: } rlm@1: rlm@1: AfxMessageBox("Internal error : (CAccelsOb::GetString) m_wKey invalid"); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: bool CAccelsOb::IsEqual(WORD wKey, bool bCtrl, bool bAlt, bool bShift) rlm@1: { rlm@1: bool m_bCtrl = (m_cVirt & FCONTROL) ? true : false; rlm@1: bool m_bAlt = (m_cVirt & FALT) ? true : false; rlm@1: bool m_bShift = (m_cVirt & FSHIFT) ? true : false; rlm@1: rlm@1: bool bRet = (bCtrl == m_bCtrl) && (bAlt == m_bAlt) && (bShift == m_bShift) && (m_wKey == wKey); rlm@1: rlm@1: return bRet; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: DWORD CAccelsOb::GetData() rlm@1: { rlm@1: BYTE cLocalCodes = 0; rlm@1: if (m_bLocked) rlm@1: cLocalCodes = DEFAULT_ACCEL; rlm@1: else rlm@1: cLocalCodes = USER_ACCEL; rlm@1: rlm@1: WORD bCodes = MAKEWORD(m_cVirt, cLocalCodes); rlm@1: return MAKELONG(m_wKey, bCodes); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: bool CAccelsOb::SetData(DWORD dwDatas) rlm@1: { rlm@1: m_wKey = LOWORD(dwDatas); rlm@1: rlm@1: WORD bCodes = HIWORD(dwDatas); rlm@1: m_cVirt = LOBYTE(bCodes); rlm@1: rlm@1: BYTE cLocalCodes = HIBYTE(bCodes); rlm@1: m_bLocked = (cLocalCodes == DEFAULT_ACCEL); rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: #ifdef _DEBUG rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CAccelsOb::AssertValid() const rlm@1: { rlm@1: CObject::AssertValid(); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CAccelsOb::Dump(CDumpContext &dc) const rlm@1: { rlm@1: dc << "\t\t"; rlm@1: CObject::Dump(dc); rlm@1: dc << "\t\tlocked=" << m_bLocked << ", cVirt=" << m_cVirt << ", wKey=" << m_wKey << "\n\n"; rlm@1: } rlm@1: rlm@1: #endif rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CCmdAccelOb::CCmdAccelOb() rlm@1: {} rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CCmdAccelOb::CCmdAccelOb(WORD wIDCommand, LPCTSTR szCommand) rlm@1: { rlm@1: ASSERT(szCommand != NULL); rlm@1: rlm@1: m_wIDCommand = wIDCommand; rlm@1: m_szCommand = szCommand; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CCmdAccelOb::CCmdAccelOb(BYTE cVirt, WORD wIDCommand, WORD wKey, LPCTSTR szCommand, bool bLocked) rlm@1: { rlm@1: ASSERT(szCommand != NULL); rlm@1: rlm@1: m_wIDCommand = wIDCommand; rlm@1: m_szCommand = szCommand; rlm@1: rlm@1: CAccelsOb *pAccel = new CAccelsOb(cVirt, wKey, bLocked); rlm@1: ASSERT(pAccel != NULL); rlm@1: m_Accels.AddTail(pAccel); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CCmdAccelOb::~CCmdAccelOb() rlm@1: { rlm@1: POSITION pos = m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: delete m_Accels.GetNext(pos); rlm@1: m_Accels.RemoveAll(); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CCmdAccelOb::Add(BYTE cVirt, WORD wKey, bool bLocked) rlm@1: { rlm@1: CAccelsOb *pAccel = new CAccelsOb(cVirt, wKey, bLocked); rlm@1: ASSERT(pAccel != NULL); rlm@1: m_Accels.AddTail(pAccel); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CCmdAccelOb::Add(CAccelsOb *pAccel) rlm@1: { rlm@1: ASSERT(pAccel != NULL); rlm@1: m_Accels.AddTail(pAccel); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: CCmdAccelOb & CCmdAccelOb::operator=(const CCmdAccelOb &from) rlm@1: { rlm@1: Reset(); rlm@1: rlm@1: m_wIDCommand = from.m_wIDCommand; rlm@1: m_szCommand = from.m_szCommand; rlm@1: rlm@1: CAccelsOb *pAccel; rlm@1: POSITION pos = from.m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = new CAccelsOb(from.m_Accels.GetNext(pos)); rlm@1: ASSERT(pAccel != NULL); rlm@1: m_Accels.AddTail(pAccel); rlm@1: } rlm@1: return *this; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CCmdAccelOb::DeleteUserAccels() rlm@1: { rlm@1: CAccelsOb *pAccel; rlm@1: POSITION prevPos; rlm@1: POSITION pos = m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: prevPos = pos; rlm@1: pAccel = m_Accels.GetNext(pos); rlm@1: if (!pAccel->m_bLocked) rlm@1: { rlm@1: delete pAccel; rlm@1: m_Accels.RemoveAt(prevPos); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CCmdAccelOb::Reset() rlm@1: { rlm@1: m_wIDCommand = 0; rlm@1: m_szCommand = "Empty command"; rlm@1: rlm@1: CAccelsOb *pAccel; rlm@1: POSITION pos = m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = m_Accels.GetNext(pos); rlm@1: delete pAccel; rlm@1: } rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: #ifdef _DEBUG rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CCmdAccelOb::AssertValid() const rlm@1: { rlm@1: // call base class function first rlm@1: CObject::AssertValid(); rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: // rlm@1: void CCmdAccelOb::Dump(CDumpContext &dc) const rlm@1: { rlm@1: // call base class function first rlm@1: dc << "\t"; rlm@1: CObject::Dump(dc); rlm@1: rlm@1: // now do the stuff for our specific class rlm@1: dc << "\tIDCommand = " << m_wIDCommand; rlm@1: dc << "\n\tszCommand = " << m_szCommand; rlm@1: dc << "\n\tAccelerators = {\n"; rlm@1: rlm@1: CAccelsOb *pAccel; rlm@1: POSITION pos = m_Accels.GetHeadPosition(); rlm@1: while (pos != NULL) rlm@1: { rlm@1: pAccel = m_Accels.GetNext(pos); rlm@1: dc << pAccel; rlm@1: } rlm@1: dc << "\t}\n"; rlm@1: } rlm@1: rlm@1: #endif