1 // Key.cpp : implementation file
\r
6 #include "keyboardlayout.h"
\r
9 #define new DEBUG_NEW
\r
11 static char THIS_FILE[] = __FILE__;
\r
14 /////////////////////////////////////////////////////////////////////////////
\r
17 CKey::CKey(const int nKey, const int nKeyType, const HKEY_TYPE hkeyType)
\r
20 m_nKeyType = nKeyType;
\r
21 m_nDroppableKey = 0;
\r
22 m_nDroppableKeyType = NORMAL_KEY;
\r
23 m_HkeyType = hkeyType;
\r
31 BEGIN_MESSAGE_MAP(CKey, CButton)
\r
32 //{{AFX_MSG_MAP(CKey)
\r
39 /////////////////////////////////////////////////////////////////////////////
\r
40 // CKey message handlers
\r
44 void CKey::DrawItem(const LPDRAWITEMSTRUCT lpDrawItemStruct)
\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
50 COLORREF textcolor = BLACK;
\r
51 UINT nEdge = EDGE_RAISED;
\r
53 textrect.CopyRect(&lpDrawItemStruct->rcItem);
\r
55 switch (m_nKeyType) {
\r
57 nEdge = EDGE_RAISED;
\r
61 nEdge = EDGE_SUNKEN;
\r
63 textrect.OffsetRect(1, 1);
\r
66 nEdge = EDGE_SUNKEN;
\r
68 textrect.OffsetRect(1, 1);
\r
71 nEdge = EDGE_ETCHED;
\r
75 nEdge = EDGE_RAISED;
\r
78 case REMAPPED_PUSHED_KEY:
\r
79 nEdge = EDGE_SUNKEN;
\r
81 textrect.OffsetRect(1, 1);
\r
88 CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
\r
90 buttonrect.CopyRect(&lpDrawItemStruct->rcItem);
\r
92 pDC->DrawEdge(buttonrect, nEdge, BF_RECT);
\r
93 pDC->SetTextColor(textcolor);
\r
95 CString szWindowText;
\r
96 GetWindowText(szWindowText);
\r
98 if (textcolor == RED) { // FW_BOLD
\r
100 GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(logfont), &logfont);
\r
101 logfont.lfWeight = FW_BOLD;
\r
104 font.CreateFontIndirect(&logfont);
\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
114 void CKey::SetKeyType(const int nKeyType)
\r
116 if (m_nKeyType != nKeyType) {
\r
117 m_nKeyType = nKeyType;
\r
122 int CKey::GetKeyType()
\r
127 void CKey::OnLButtonDown(const UINT nFlags, const CPoint point)
\r
129 switch (m_nKeyType) {
\r
131 SetKeyType(PUSHED_KEY);
\r
132 SetDraggingCursor();
\r
135 SetKeyType(REMAPPED_PUSHED_KEY);
\r
139 CButton::OnLButtonDown(nFlags, point);
\r
142 void CKey::OnLButtonUp(const UINT nFlags, CPoint point)
\r
144 if (m_nKeyType == PUSHED_KEY) {
\r
145 SetKeyType(NORMAL_KEY);
\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
158 parent->ToolTip()->UpdateTipText(parent->GetToolTipID(pKeyboardLayout->nToolTipID), this);
\r
160 ScanCodeMapping mapping = {{0, 0}, {pKeyboardLayout->scancode.nScanCode, pKeyboardLayout->scancode.nPrefix}};
\r
161 parent->SetScanCodeMap(m_HkeyType, mapping);
\r
163 SetKeyType(ORIGINAL_KEY);
\r
165 SetKeyType(REMAPPED_KEY);
\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
176 m_nDroppableKey = 0;
\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
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
198 m_nDroppableKey = 0;
\r
199 m_nDroppableKeyType = NORMAL_KEY;
\r
203 CButton::OnLButtonUp(nFlags, point);
\r
206 void CKey::OnMouseMove(const UINT nFlags, CPoint point)
\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
214 if (nPointedKey != m_nDroppableKey) {
\r
215 if (m_nDroppableKey) {
\r
216 reinterpret_cast<CKey*>(parent->GetDlgItem(m_nDroppableKey))->SetKeyType(m_nDroppableKeyType);
\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
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
236 if (m_nKeyType == REMAPPED_PUSHED_KEY) {
\r
237 if (m_nKey != parent->GetPointedKey(point)) {
\r
238 SetKeyType(REMAPPED_KEY);
\r
241 if (m_nKeyType == REMAPPED_KEY) {
\r
242 if (m_nKey == parent->GetPointedKey(point)) {
\r
243 SetKeyType(REMAPPED_PUSHED_KEY);
\r
248 CButton::OnMouseMove(nFlags, point);
\r
251 BOOL CKey::IsDroppableKey(const int nKey)
\r
253 if (m_nKeyType != PUSHED_KEY
\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
267 void CKey::SetDraggingCursor()
\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
274 void CKey::SetNormalCursor()
\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
281 void CKey::SetNoCursor()
\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