OSDN Git Service

Rename appName szAppName in CProfile::SaveRegistry.
[xkeymacs/xkeymacs.git] / xkeymacs / key.cpp
1 // Key.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include "Key.h"\r
6 #include "keyboardlayout.h"\r
7 \r
8 #ifdef _DEBUG\r
9 #define new DEBUG_NEW\r
10 #undef THIS_FILE\r
11 static char THIS_FILE[] = __FILE__;\r
12 #endif\r
13 \r
14 /////////////////////////////////////////////////////////////////////////////\r
15 // CKey\r
16 \r
17 CKey::CKey(const int nKey, const int nKeyType, const HKEY_TYPE hkeyType)\r
18 {\r
19         m_nKey = nKey;\r
20         m_nKeyType = nKeyType;\r
21         m_nDroppableKey = 0;\r
22         m_nDroppableKeyType = NORMAL_KEY;\r
23         m_HkeyType = hkeyType;\r
24 }\r
25 \r
26 CKey::~CKey()\r
27 {\r
28 }\r
29 \r
30 \r
31 BEGIN_MESSAGE_MAP(CKey, CButton)\r
32         //{{AFX_MSG_MAP(CKey)\r
33         ON_WM_LBUTTONDOWN()\r
34         ON_WM_LBUTTONUP()\r
35         ON_WM_MOUSEMOVE()\r
36         //}}AFX_MSG_MAP\r
37 END_MESSAGE_MAP()\r
38 \r
39 /////////////////////////////////////////////////////////////////////////////\r
40 // CKey message handlers\r
41 \r
42 \r
43 \r
44 void CKey::DrawItem(const LPDRAWITEMSTRUCT lpDrawItemStruct) \r
45 {\r
46         static const COLORREF BLACK = RGB(0, 0, 0);\r
47         static const COLORREF RED = RGB(255, 0, 0);\r
48         static const COLORREF BLUE = RGB(0, 0, 255);\r
49 \r
50         COLORREF textcolor = BLACK;\r
51         UINT nEdge = EDGE_RAISED;\r
52         CRect textrect;\r
53         textrect.CopyRect(&lpDrawItemStruct->rcItem);\r
54 \r
55         switch (m_nKeyType) {\r
56         case NORMAL_KEY:\r
57                 nEdge = EDGE_RAISED;\r
58                 textcolor = BLACK;\r
59                 break;\r
60         case PUSHED_KEY:\r
61                 nEdge = EDGE_SUNKEN;\r
62                 textcolor = BLACK;\r
63                 textrect.OffsetRect(1, 1);\r
64                 break;\r
65         case DROPPABLE_KEY:\r
66                 nEdge = EDGE_SUNKEN;\r
67                 textcolor = BLUE;\r
68                 textrect.OffsetRect(1, 1);\r
69                 break;\r
70         case ORIGINAL_KEY:\r
71                 nEdge = EDGE_ETCHED;\r
72                 textcolor = BLACK;\r
73                 break;\r
74         case REMAPPED_KEY:\r
75                 nEdge = EDGE_RAISED;\r
76                 textcolor = RED;\r
77                 break;\r
78         case REMAPPED_PUSHED_KEY:\r
79                 nEdge = EDGE_SUNKEN;\r
80                 textcolor = RED;\r
81                 textrect.OffsetRect(1, 1);\r
82                 break;\r
83         default:\r
84                 ASSERT(0);\r
85                 break;\r
86         }\r
87 \r
88         CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);\r
89         CRect buttonrect;\r
90         buttonrect.CopyRect(&lpDrawItemStruct->rcItem);\r
91 \r
92         pDC->DrawEdge(buttonrect, nEdge, BF_RECT);\r
93         pDC->SetTextColor(textcolor);\r
94 \r
95         CString szWindowText;\r
96         GetWindowText(szWindowText);\r
97 \r
98         if (textcolor == RED) { // FW_BOLD\r
99                 LOGFONT logfont;\r
100                 GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(logfont), &logfont);\r
101                 logfont.lfWeight = FW_BOLD;\r
102 \r
103                 CFont font;\r
104                 font.CreateFontIndirect(&logfont);\r
105 \r
106                 pDC->SelectObject(&font);\r
107                 pDC->DrawText(szWindowText, textrect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);\r
108                 pDC->SelectStockObject(DEFAULT_GUI_FONT);\r
109         } else { // FW_NORMAL\r
110                 pDC->DrawText(szWindowText, textrect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);\r
111         }\r
112 }\r
113 \r
114 void CKey::SetKeyType(const int nKeyType)\r
115 {\r
116         if (m_nKeyType != nKeyType) {\r
117                 m_nKeyType = nKeyType;\r
118                 RedrawWindow();\r
119         }\r
120 }\r
121 \r
122 int CKey::GetKeyType()\r
123 {\r
124         return m_nKeyType;\r
125 }\r
126 \r
127 void CKey::OnLButtonDown(const UINT nFlags, const CPoint point) \r
128 {\r
129         switch (m_nKeyType) {\r
130         case NORMAL_KEY:\r
131                 SetKeyType(PUSHED_KEY);\r
132                 SetDraggingCursor();\r
133                 break;\r
134         case REMAPPED_KEY:\r
135                 SetKeyType(REMAPPED_PUSHED_KEY);\r
136                 break;\r
137         }\r
138 \r
139         CButton::OnLButtonDown(nFlags, point);\r
140 }\r
141 \r
142 void CKey::OnLButtonUp(const UINT nFlags, CPoint point) \r
143 {\r
144         if (m_nKeyType == PUSHED_KEY) {\r
145                 SetKeyType(NORMAL_KEY);\r
146         }\r
147 \r
148         CKeyboardLayout *parent = reinterpret_cast<CKeyboardLayout *>(GetParent());\r
149         ClientToScreen(&point);\r
150         if (m_nKeyType == REMAPPED_PUSHED_KEY) {\r
151                 if (m_nKey == parent->GetPointedKey(point)) {\r
152                         KeyboardLayout *pKeyboardLayout = parent->GetKeyboardLayout(m_nKey);\r
153                         if (pKeyboardLayout) {\r
154                                 CString szWindowText;\r
155                                 parent->GetDlgItem(pKeyboardLayout->nBaseControlID)->GetWindowText(szWindowText);\r
156                                 SetWindowText(szWindowText);\r
157 \r
158                                 parent->ToolTip()->UpdateTipText(parent->GetToolTipID(pKeyboardLayout->nToolTipID), this);\r
159 \r
160                                 ScanCodeMapping mapping = {{0, 0}, {pKeyboardLayout->scancode.nScanCode, pKeyboardLayout->scancode.nPrefix}};\r
161                                 parent->SetScanCodeMap(m_HkeyType, mapping);\r
162                         }\r
163                         SetKeyType(ORIGINAL_KEY);\r
164                 } else {\r
165                         SetKeyType(REMAPPED_KEY);\r
166                 }\r
167         }\r
168 \r
169         int nPointedKey = parent->GetPointedKey(point);\r
170         if (m_nDroppableKey && nPointedKey) {\r
171                 if (m_nDroppableKey != nPointedKey) {\r
172                         reinterpret_cast<CKey*>(parent->GetDlgItem(m_nDroppableKey))->SetKeyType(m_nDroppableKeyType);\r
173                         if (IsDroppableKey(nPointedKey)) {\r
174                                 m_nDroppableKey = nPointedKey;\r
175                         } else {\r
176                                 m_nDroppableKey = 0;\r
177                         }\r
178                 }\r
179 \r
180                 if (m_nDroppableKey) {\r
181                         KeyboardLayout *pKeyboardLayout = parent->GetKeyboardLayout(m_nDroppableKey);\r
182                         KeyboardLayout *pBaseKeyboardLayout = parent->GetKeyboardLayout(m_nKey);\r
183                         if (pKeyboardLayout && pBaseKeyboardLayout) {\r
184                                 CString szWindowText;\r
185                                 GetWindowText(szWindowText);\r
186                                 parent->GetDlgItem(pKeyboardLayout->nCurrentControlID)->SetWindowText(szWindowText);\r
187                                 parent->ToolTip()->UpdateTipText(parent->GetToolTipID(pBaseKeyboardLayout->nToolTipID), parent->GetDlgItem(pKeyboardLayout->nCurrentControlID));\r
188                                 reinterpret_cast<CKey *>(parent->GetDlgItem(pKeyboardLayout->nBaseControlID))->SetKeyType(NORMAL_KEY);\r
189                                 reinterpret_cast<CKey*>(parent->GetDlgItem(pKeyboardLayout->nCurrentControlID))->SetKeyType(REMAPPED_KEY);\r
190 \r
191                                 ScanCodeMapping mapping = {{pBaseKeyboardLayout->scancode.nScanCode, pBaseKeyboardLayout->scancode.nPrefix}, \r
192                                                                                         {pKeyboardLayout->scancode.nScanCode, pKeyboardLayout->scancode.nPrefix}};\r
193                                 parent->SetScanCodeMap(m_HkeyType, mapping);\r
194                         }\r
195                 }\r
196         }\r
197 \r
198         m_nDroppableKey = 0;\r
199         m_nDroppableKeyType = NORMAL_KEY;\r
200 \r
201         SetNormalCursor();\r
202 \r
203         CButton::OnLButtonUp(nFlags, point);\r
204 }\r
205 \r
206 void CKey::OnMouseMove(const UINT nFlags, CPoint point) \r
207 {\r
208         if (nFlags & MK_LBUTTON) {\r
209                 ClientToScreen(&point);\r
210                 CKeyboardLayout *parent = (CKeyboardLayout *)GetParent();\r
211                 if (m_nKeyType == PUSHED_KEY) {\r
212                         int nPointedKey = parent->GetPointedKey(point);\r
213                         if (nPointedKey) {\r
214                                 if (nPointedKey != m_nDroppableKey) {\r
215                                         if (m_nDroppableKey) {\r
216                                                 reinterpret_cast<CKey*>(parent->GetDlgItem(m_nDroppableKey))->SetKeyType(m_nDroppableKeyType);\r
217                                                 SetNoCursor();\r
218                                         }\r
219                                         if (IsDroppableKey(nPointedKey)) {\r
220                                                 m_nDroppableKey = nPointedKey;\r
221                                                 m_nDroppableKeyType = ((CKey*)parent->GetDlgItem(m_nDroppableKey))->GetKeyType();\r
222                                                 reinterpret_cast<CKey*>(parent->GetDlgItem(m_nDroppableKey))->SetKeyType(DROPPABLE_KEY);\r
223                                                 SetDraggingCursor();\r
224                                         }\r
225                                 }\r
226                         } else {\r
227                                 if (m_nDroppableKey) {\r
228                                         reinterpret_cast<CKey*>(parent->GetDlgItem(m_nDroppableKey))->SetKeyType(m_nDroppableKeyType);\r
229                                         m_nDroppableKey = 0;\r
230                                         m_nDroppableKeyType = NORMAL_KEY;\r
231                                         SetNoCursor();\r
232                                 }\r
233                         }\r
234                 }\r
235 \r
236                 if (m_nKeyType == REMAPPED_PUSHED_KEY) {\r
237                         if (m_nKey != parent->GetPointedKey(point)) {\r
238                                 SetKeyType(REMAPPED_KEY);\r
239                         }\r
240                 }\r
241                 if (m_nKeyType == REMAPPED_KEY) {\r
242                         if (m_nKey == parent->GetPointedKey(point)) {\r
243                                 SetKeyType(REMAPPED_PUSHED_KEY);\r
244                         }\r
245                 }\r
246         }\r
247         \r
248         CButton::OnMouseMove(nFlags, point);\r
249 }\r
250 \r
251 BOOL CKey::IsDroppableKey(const int nKey)\r
252 {\r
253         if (m_nKeyType != PUSHED_KEY\r
254          || !nKey) {\r
255                 return FALSE;\r
256         }\r
257 \r
258         KeyboardLayout *pKeyboardLayout = reinterpret_cast<CKeyboardLayout *>(GetParent())->GetKeyboardLayout(m_nKey, TRUE);\r
259         if (!pKeyboardLayout\r
260          || pKeyboardLayout->nBaseControlID == nKey\r
261          || pKeyboardLayout->nCurrentControlID == nKey) {\r
262                 return FALSE;\r
263         }\r
264         return TRUE;\r
265 }\r
266 \r
267 void CKey::SetDraggingCursor()\r
268 {\r
269         HCURSOR hCursor = (HCURSOR)LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_DRAG_CURSOR),\r
270                                                                                  IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);\r
271         ::SetCursor(hCursor);\r
272 }\r
273 \r
274 void CKey::SetNormalCursor()\r
275 {\r
276         HCURSOR hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW),\r
277                                                                                  IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);\r
278         ::SetCursor(hCursor);\r
279 }\r
280 \r
281 void CKey::SetNoCursor()\r
282 {\r
283         HCURSOR hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_NO),\r
284                                                                                  IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);\r
285         ::SetCursor(hCursor);\r
286 }\r