OSDN Git Service

Use MAX_COMMAND and MAX_KEY_BIND.
[xkeymacs/xkeymacs.git] / xkeymacs / 109keyboard.cpp
1 // 109Keyboard.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include <Lmcons.h>\r
6 #include "xkeymacs.h"\r
7 #include "109Keyboard.h"\r
8 \r
9 #ifdef _DEBUG\r
10 #define new DEBUG_NEW\r
11 #undef THIS_FILE\r
12 static char THIS_FILE[] = __FILE__;\r
13 #endif\r
14 \r
15 /////////////////////////////////////////////////////////////////////////////\r
16 // C109Keyboard dialog\r
17 \r
18 \r
19 C109Keyboard::C109Keyboard(const HKEY_TYPE hkey_type, CWnd *const pParent /*=NULL*/)\r
20         : CDialog(C109Keyboard::IDD, pParent)\r
21 {\r
22         //{{AFX_DATA_INIT(C109Keyboard)\r
23                 // NOTE: the ClassWizard will add member initialization here\r
24         //}}AFX_DATA_INIT\r
25         m_HkeyType = hkey_type;\r
26 }\r
27 \r
28 \r
29 void C109Keyboard::DoDataExchange(CDataExchange *const pDX)\r
30 {\r
31         CDialog::DoDataExchange(pDX);\r
32         //{{AFX_DATA_MAP(C109Keyboard)\r
33                 // NOTE: the ClassWizard will add DDX and DDV calls here\r
34         //}}AFX_DATA_MAP\r
35 }\r
36 \r
37 \r
38 BEGIN_MESSAGE_MAP(C109Keyboard, CDialog)\r
39         //{{AFX_MSG_MAP(C109Keyboard)\r
40         ON_WM_DESTROY()\r
41         //}}AFX_MSG_MAP\r
42 END_MESSAGE_MAP()\r
43 \r
44 /////////////////////////////////////////////////////////////////////////////\r
45 // C109Keyboard message handlers\r
46 \r
47 BOOL C109Keyboard::OnInitDialog() \r
48 {\r
49         CDialog::OnInitDialog();\r
50         \r
51         CString szWindowText;\r
52         CString szFor;\r
53         switch (m_HkeyType) {\r
54         case CURRENT_USER:\r
55                 {\r
56                         TCHAR szUserName[UNLEN + 1] = {'0'};\r
57                         DWORD nSize = UNLEN + 1;\r
58                         if (GetUserName(szUserName, &nSize)) {\r
59                                 szFor.Format(IDS_FOR, szUserName);\r
60                         } else {\r
61                                 szFor.LoadString(IDS_FOR_LOGGED_ON_USER);\r
62                         }\r
63                 }\r
64                 break;\r
65         case LOCAL_MACHINE:\r
66                 szFor.LoadString(IDS_FOR_ANY_USER);\r
67                 break;\r
68         default:\r
69                 break;\r
70         }\r
71         this->GetWindowText(szWindowText);\r
72         this->SetWindowText(szWindowText + szFor);\r
73 \r
74         m_ToolTip.Create(this, TTS_ALWAYSTIP | TTS_NOPREFIX);\r
75         m_ToolTip.SetMaxTipWidth(0x100);        // Enable multiline\r
76 \r
77         CProfile::LoadScanCodeMap(m_HkeyType);\r
78         for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
79                 if (!GetDlgItem(KeyboardLayouts[i].nBaseControlID)\r
80                  || !GetDlgItem(KeyboardLayouts[i].nCurrentControlID)) {\r
81                         continue;\r
82                 }\r
83 \r
84                 KeyboardLayouts[i].pBaseKey = new CKey(KeyboardLayouts[i].nBaseControlID, NORMAL_KEY, m_HkeyType);\r
85                 KeyboardLayouts[i].pBaseKey->SubclassDlgItem(KeyboardLayouts[i].nBaseControlID, this);\r
86                 m_ToolTip.AddTool(GetDlgItem(KeyboardLayouts[i].nBaseControlID), CProfile::GetToolTipID(KeyboardLayouts[i].nToolTipID));\r
87 \r
88                 KeyboardLayouts[i].pCurrentKey = new CKey(KeyboardLayouts[i].nCurrentControlID, ORIGINAL_KEY, m_HkeyType);\r
89                 KeyboardLayouts[i].pCurrentKey->SubclassDlgItem(KeyboardLayouts[i].nCurrentControlID, this);\r
90                 m_ToolTip.AddTool(GetDlgItem(KeyboardLayouts[i].nCurrentControlID), CProfile::GetToolTipID(KeyboardLayouts[i].nToolTipID));\r
91 \r
92                 ScanCode current = {'\0'};\r
93                 if (CProfile::GetScanCodeMap(m_HkeyType, KeyboardLayouts[i].scancode, &current)) {\r
94                         KeyboardLayouts[i].pCurrentKey->SetKeyType(REMAPPED_KEY);\r
95 \r
96                         CString szWindowText;\r
97                         GetDlgItem(CProfile::GetBaseControlID(current))->GetWindowText(szWindowText);\r
98                         GetDlgItem(KeyboardLayouts[i].nCurrentControlID)->SetWindowText(szWindowText);\r
99 \r
100                         KeyboardLayout *pKeyboardLayout = CProfile::GetKeyboardLayouts(CProfile::GetBaseControlID(current));\r
101                         if (pKeyboardLayout) {\r
102                                 m_ToolTip.UpdateTipText(CProfile::GetToolTipID(pKeyboardLayout->nToolTipID), GetDlgItem(KeyboardLayouts[i].nCurrentControlID));\r
103                         }\r
104                 }\r
105         }\r
106 \r
107         return TRUE;  // return TRUE unless you set the focus to a control\r
108                       // EXCEPTION: OCX Property Pages should return FALSE\r
109 }\r
110 \r
111 void C109Keyboard::OnOK() \r
112 {\r
113         if (CProfile::LostKeyWarning(m_HkeyType) != IDCANCEL) {\r
114                 CProfile::SaveScanCodeMap(m_HkeyType);\r
115 \r
116                 CDialog::OnOK();\r
117         }\r
118 }\r
119 \r
120 void C109Keyboard::OnDestroy() \r
121 {\r
122         CDialog::OnDestroy();\r
123 \r
124         for (int i = 0; i < sizeof(KeyboardLayouts) / sizeof(KeyboardLayouts[0]); ++i) {\r
125                 if (!GetDlgItem(KeyboardLayouts[i].nBaseControlID)\r
126                  || !GetDlgItem(KeyboardLayouts[i].nCurrentControlID)) {\r
127                         continue;\r
128                 }\r
129 \r
130                 if (KeyboardLayouts[i].pBaseKey) {\r
131                         delete KeyboardLayouts[i].pBaseKey;\r
132                         KeyboardLayouts[i].pBaseKey = NULL;\r
133                 }\r
134                 if (KeyboardLayouts[i].pCurrentKey) {\r
135                         delete KeyboardLayouts[i].pCurrentKey;\r
136                         KeyboardLayouts[i].pCurrentKey = NULL;\r
137                 }\r
138         }\r
139 }\r
140 \r
141 BOOL C109Keyboard::PreTranslateMessage(MSG *const pMsg) \r
142 {\r
143         // TODO: Add your specialized code here and/or call the base class\r
144         switch (pMsg->message) {\r
145         case WM_LBUTTONDOWN:\r
146         case WM_LBUTTONUP:\r
147         case WM_MOUSEMOVE:\r
148                 m_ToolTip.RelayEvent(pMsg);\r
149                 break;\r
150         }\r
151 \r
152         return CDialog::PreTranslateMessage(pMsg);\r
153 }\r