root/middleware-offline/trunk/_src/eidmw/dialogs/dialogsWin32/dlgWndAskPIN.cpp @ 5

Revision 5, 13.5 KB (checked in by vsilva, 9 years ago)

Initial comit

Line 
1/* ****************************************************************************
2
3 * eID Middleware Project.
4 * Copyright (C) 2008-2009 FedICT.
5 *
6 * This is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License version
8 * 3.0 as published by the Free Software Foundation.
9 *
10 * This software is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this software; if not, see
17 * http://www.gnu.org/licenses/.
18
19**************************************************************************** */
20
21#include "stdafx.h"
22#include "dlgWndAskPIN.h"
23#include <commctrl.h>
24#include "resource.h"
25#include "../langUtil.h"
26#include "Log.h"
27
28#define IDC_STATIC 0
29#define IDB_OK 1
30#define IDB_CANCEL 2
31#define IMG_SIZE 128
32#define IDC_EDIT 3
33#define IDB_KeypadStart 10
34#define IDB_KeypadEnd   21
35#define KP_BTN_SIZE 48
36#define KP_LBL_SIZE 24
37
38dlgWndAskPIN::dlgWndAskPIN( DlgPinInfo pinInfo, DlgPinUsage PinPusage, std::wstring & Header, std::wstring & PINName, bool UseKeypad, HWND Parent )
39:Win32Dialog(L"WndAskPIN")
40{
41        m_UseKeypad = UseKeypad;
42
43        PinResult[0] = ' ';
44        PinResult[1] = (char)0;
45
46        std::wstring tmpTitle = L"";
47
48        if( PinPusage == DLG_PIN_SIGN )
49                tmpTitle += GETSTRING_DLG(SigningWith);
50        else
51                tmpTitle += GETSTRING_DLG(Asking);
52
53        tmpTitle += L" ";
54        tmpTitle += PINName;
55
56        m_ulPinMinLen = pinInfo.ulMinLen;
57        m_ulPinMaxLen = pinInfo.ulMaxLen;
58
59        szHeader = Header.c_str();
60        szPIN = PINName.c_str();
61
62        int Height = 280;
63        if( m_UseKeypad )
64                Height = 480;
65
66        if( CreateWnd( tmpTitle.c_str() , 480, Height, 0, Parent ) )
67        {
68                RECT clientRect;
69                GetClientRect( m_hWnd, &clientRect );
70
71                TextFont = CreateFont( 16, 0, 0, 0, FW_DONTCARE, 0, 0, 0,
72                                DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
73                                DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"MS Shell Dlg" );
74
75                //OK Button
76                HWND hOkButton = CreateWindow(
77                        L"BUTTON", GETSTRING_DLG(Ok), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON, 
78                        clientRect.right - 160, clientRect.bottom - 36, 72, 24, 
79                        m_hWnd, (HMENU)IDB_OK, m_hInstance, NULL );
80                EnableWindow( hOkButton, false );
81
82                //Cancel Button
83                HWND hCancelButton = CreateWindow(
84                        L"BUTTON", GETSTRING_DLG(Cancel), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_TEXT, 
85                        clientRect.right - 80, clientRect.bottom - 36, 72, 24, 
86                        m_hWnd, (HMENU)IDB_CANCEL, m_hInstance, NULL );
87
88                m_KeypadHeight=0;
89
90                //Virtual Keypad
91                if( m_UseKeypad )
92                {
93                        int top = 60;
94                        int hMargin = 12;
95                        int vMargin = 12;
96                        int btnwidth = 48;
97                        int btnheight = 48;
98                        int totwidth = btnwidth*3 + 2*hMargin;
99                        int totheight = btnheight*4 +3*vMargin;
100                        int left = (clientRect.right - clientRect.left - totwidth)/2;
101                        m_KeypadHeight = top + totheight + 8;
102
103                        for( int i = 0; i < 4; i++ )
104                        {
105                                for( int  j = 0; j < 3; j++ )
106                                {
107                                        if( i == 3 && j == 0 )
108                                                continue;
109                                        HWND hOkButton = CreateWindow(
110                                                L"BUTTON", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_OWNERDRAW, //BS_FLAT,
111                                                left + ( btnwidth + hMargin )* j, top + ( btnheight + vMargin ) * i, btnwidth, btnheight, 
112                                                m_hWnd, (HMENU)(long long)(IDB_KeypadStart + 3*i + j ), m_hInstance, NULL );
113                                }
114                        }
115
116                        ImageKP_BTN[0] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_0) );
117                        ImageKP_BTN[1] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_1) );
118                        ImageKP_BTN[2] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_2) );
119                        ImageKP_BTN[3] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_3) );
120                        ImageKP_BTN[4] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_4) );
121                        ImageKP_BTN[5] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_5) );
122                        ImageKP_BTN[6] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_6) );
123                        ImageKP_BTN[7] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_7) );
124                        ImageKP_BTN[8] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_8) );
125                        ImageKP_BTN[9] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_9) );
126                        ImageKP_BTN[10] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_CE) );
127                        ImageKP_BTN[11] = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_KP_BTN) );
128
129                        CreateBitapMask( ImageKP_BTN[11], ImageKP_BTN_Mask );
130                        //MWLOG(LEV_DEBUG, MOD_DLG, L" dlgWndAskPIN : Virtual pinpad - LoadBitmap");
131                }
132
133                DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_PASSWORD;
134                if( pinInfo.ulFlags & PIN_FLAG_DIGITS )
135                        dwStyle |= ES_NUMBER;
136
137                LONG pinTop=0;
138                LONG pinLeft=clientRect.right/2 - 100 + 40;
139
140                if( m_UseKeypad )
141                        pinTop = clientRect.top + 20;
142                else
143                        pinTop = clientRect.bottom - 80;
144
145                HWND hTextEdit = CreateWindowEx( WS_EX_CLIENTEDGE,
146                        L"EDIT", L"", dwStyle, 
147                        pinLeft, pinTop, 160, 26, 
148                        m_hWnd, (HMENU)IDC_EDIT, m_hInstance, NULL );
149                SendMessage( hTextEdit, EM_LIMITTEXT, m_ulPinMaxLen, 0 );
150
151                HWND hStaticText = CreateWindow( 
152                        L"STATIC", szPIN, WS_CHILD | WS_VISIBLE | SS_RIGHT, 
153                        pinLeft-100, pinTop +4 , 96, 22, 
154                        m_hWnd, (HMENU)IDC_STATIC, m_hInstance, NULL );
155
156                SendMessage( hStaticText, WM_SETFONT, (WPARAM)TextFont, 0 );
157
158                SendMessage( hOkButton, WM_SETFONT, (WPARAM)TextFont, 0 );
159                SendMessage( hCancelButton, WM_SETFONT, (WPARAM)TextFont, 0 );
160
161                if( PinPusage == DLG_PIN_SIGN )
162                        ImagePIN = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_PINSIGN) );
163                else
164                        ImagePIN = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_PIN) );
165                CreateBitapMask( ImagePIN, ImagePIN_Mask );
166
167                SetFocus(GetDlgItem( m_hWnd, IDC_EDIT ));
168        }
169}
170
171dlgWndAskPIN::~dlgWndAskPIN()
172{
173        KillWindow( );
174}
175
176void dlgWndAskPIN::GetPinResult()
177{
178        wchar_t nameBuf[128];
179        long len = (long)SendMessage( GetDlgItem( m_hWnd, IDC_EDIT ), WM_GETTEXTLENGTH, 0, 0 );
180        if( len < 128 )
181        {
182                SendMessage( GetDlgItem( m_hWnd, IDC_EDIT ), WM_GETTEXT, (WPARAM)(sizeof(nameBuf)), (LPARAM)nameBuf );
183                wcscpy_s( PinResult, nameBuf );
184        }
185}
186
187LRESULT dlgWndAskPIN::ProcecEvent
188                        (       UINT            uMsg,                   // Message For This Window
189                                WPARAM          wParam,                 // Additional Message Information
190                                LPARAM          lParam )                // Additional Message Information
191{
192        PAINTSTRUCT ps;
193        RECT rect;
194
195        switch( uMsg )
196        { 
197                case WM_COMMAND:
198                {
199                        switch( LOWORD(wParam) )
200                        {
201                                case IDC_EDIT:
202                                {
203                                        if( EN_CHANGE == HIWORD(wParam) )
204                                        {
205                                                long len = (long)SendMessage( GetDlgItem( m_hWnd, IDC_EDIT ), WM_GETTEXTLENGTH, 0, 0 );
206                                                EnableWindow( GetDlgItem( m_hWnd, IDOK ), ( (unsigned int)len >= m_ulPinMinLen ) );
207                                        }
208                                        return TRUE;
209                                }
210
211                                case IDB_OK:
212                                        GetPinResult();
213                                        dlgResult = eIDMW::DLG_OK;
214                                        close();
215                                        return TRUE;
216
217                                case IDB_CANCEL:
218                                        dlgResult = eIDMW::DLG_CANCEL;
219                                        close();
220                                        return TRUE;
221
222                                default:
223                                        unsigned short tmp = LOWORD(wParam);
224                                        if( tmp >= IDB_KeypadStart && tmp < IDB_KeypadEnd ) // Keypad Buttons
225                                        {
226                                                wchar_t nameBuf[128];
227                                                SendMessage( GetDlgItem( m_hWnd, IDC_EDIT ), WM_GETTEXT, (WPARAM)(sizeof(nameBuf)), (LPARAM)nameBuf );
228                                                size_t iPos = wcslen( nameBuf );
229                                                if( iPos >= m_ulPinMaxLen )
230                                                        return TRUE;
231                                                if( tmp == IDB_KeypadEnd - 1 ) // Keypad Button 0
232                                                {
233                                                        nameBuf[ iPos++ ] = L'0';
234                                                }
235                                                else // Keypad Button 1 to 9
236                                                {
237                                                        nameBuf[ iPos++ ] = 49 + tmp - IDB_KeypadStart;
238                                                }
239                                                nameBuf[ iPos++ ] = NULL;
240                                                SendMessage( GetDlgItem( m_hWnd, IDC_EDIT ), WM_SETTEXT, 0, (LPARAM)nameBuf );
241                                                return TRUE;
242                                        }
243                                        if( tmp == IDB_KeypadEnd ) // Keypad Button CE
244                                        {
245                                                SendMessage( GetDlgItem( m_hWnd, IDC_EDIT ), WM_SETTEXT, 0, (LPARAM)"" );
246                                                //clear
247                                        }
248                                        return DefWindowProc( m_hWnd, uMsg, wParam, lParam );
249                        }
250                }
251
252                case WM_DRAWITEM:
253                {
254                        LPDRAWITEMSTRUCT lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
255                        if( lpDrawItem->CtlType & ODT_BUTTON )
256                        {
257                                //MWLOG(LEV_DEBUG, MOD_DLG, L" dlgWndAskPIN : Virtual pinpad - WM_DRAWITEM lParam=%x, wParam=%ld",lParam,wParam);
258                                //MWLOG(LEV_DEBUG, MOD_DLG, L" dlgWndAskPIN : Virtual pinpad - Entering WM_DRAWITEM lpDrawItem->hDC=%ld",lpDrawItem->hDC);
259
260                                FillRect( lpDrawItem->hDC, &lpDrawItem->rcItem, CreateSolidBrush( GetSysColor( COLOR_3DFACE ) ) );
261                                //MWLOG(LEV_DEBUG, MOD_DLG, L" dlgWndAskPIN : Virtual pinpad - WM_DRAWITEM top=%ld, bottom=%ld, left=%ld, right=%ld",
262                                        //lpDrawItem->rcItem.top,lpDrawItem->rcItem.bottom,lpDrawItem->rcItem.left,lpDrawItem->rcItem.right);
263
264                                HDC hdcMem = CreateCompatibleDC( lpDrawItem->hDC );
265                                SelectObject( hdcMem , ImageKP_BTN[11] );
266                                MaskBlt( lpDrawItem->hDC, (lpDrawItem->rcItem.right - KP_BTN_SIZE) / 2, (lpDrawItem->rcItem.bottom - KP_BTN_SIZE) / 2,
267                                        KP_BTN_SIZE, KP_BTN_SIZE, hdcMem, 0, 0,
268                                        ImageKP_BTN_Mask, 0, 0, MAKEROP4( SRCCOPY, 0x00AA0029 ) );
269
270                                unsigned int iNum = 0;
271                                if( lpDrawItem->CtlID == IDB_KeypadEnd )
272                                {
273                                        iNum = 10;
274                                }
275                                else if( lpDrawItem->CtlID >= IDB_KeypadStart && lpDrawItem->CtlID < IDB_KeypadEnd -2 )
276                                {
277                                        iNum = lpDrawItem->CtlID - IDB_KeypadStart +1;
278                                }
279                                //MWLOG(LEV_DEBUG, MOD_DLG, L" dlgWndAskPIN : Virtual pinpad - WM_DRAWITEM iNum=%ld",iNum);
280
281                                SelectObject( hdcMem , ImageKP_BTN[iNum] );
282                                BitBlt( lpDrawItem->hDC, (lpDrawItem->rcItem.right - KP_LBL_SIZE) / 2, (lpDrawItem->rcItem.bottom - KP_LBL_SIZE) / 2, 
283                                                KP_LBL_SIZE, KP_LBL_SIZE, hdcMem, 0, 0, SRCCOPY );
284                                DeleteDC(hdcMem);
285
286                                if( lpDrawItem->itemState & ODS_SELECTED )
287                                        DrawEdge( lpDrawItem->hDC, &lpDrawItem->rcItem, EDGE_RAISED, BF_RECT );
288                               
289                                if( lpDrawItem->itemState & ODS_HOTLIGHT )
290                                        DrawEdge( lpDrawItem->hDC, &lpDrawItem->rcItem, EDGE_SUNKEN, BF_RECT );
291                               
292                                if( lpDrawItem->itemState & ODS_FOCUS )
293                                {
294                                        GetClientRect( lpDrawItem->hwndItem, &rect );
295                                        rect.left += 2;
296                                        rect.right -= 2;
297                                        rect.top += 2;
298                                        rect.bottom -= 2;
299                                        DrawFocusRect( lpDrawItem->hDC, &rect );
300                                }
301                                //MWLOG(LEV_DEBUG, MOD_DLG, L" dlgWndAskPIN : Virtual pinpad - Leaving WM_DRAWITEM lpDrawItem->hDC=%ld",lpDrawItem->hDC);
302                                return TRUE;
303                        }
304                        break;
305                }
306
307                case WM_SIZE:
308                {
309                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_SIZE (wParam=%X, lParam=%X)",wParam,lParam);
310
311                        if( IsIconic( m_hWnd ) )
312                                return 0;
313                        break;
314                }
315
316                case WM_PAINT:
317                {
318                        //MWLOG(LEV_DEBUG, MOD_DLG, L" dlgWndAskPIN : WM_PAINT");
319                        m_hDC = BeginPaint( m_hWnd, &ps );
320
321                        HDC hdcMem;
322
323                        hdcMem = CreateCompatibleDC( m_hDC );
324
325                        HGDIOBJ oldObj = SelectObject( hdcMem , ImagePIN );
326
327                        GetClientRect( m_hWnd, &rect );
328                        MaskBlt( m_hDC, 4, m_KeypadHeight + 8,
329                                IMG_SIZE, IMG_SIZE,     hdcMem, 0, 0,
330                                ImagePIN_Mask, 0, 0, MAKEROP4( SRCCOPY, 0x00AA0029 ) );
331               
332                       
333                        SelectObject( hdcMem, oldObj );
334                        DeleteDC(hdcMem);
335
336                        if( m_UseKeypad )
337                        {
338                                GetClientRect( m_hWnd, &rect );
339                                rect.left += 8;
340                                rect.right -= 8;
341                                rect.top += 8;
342                                rect.bottom = m_KeypadHeight;
343
344                                DrawEdge( m_hDC, &rect, EDGE_RAISED, BF_RECT );
345                        }
346
347                        GetClientRect( m_hWnd, &rect );
348                        rect.left += IMG_SIZE + 16;
349                        rect.top = m_KeypadHeight + 8;
350                        rect.right -= 8;
351                        rect.bottom = rect.bottom - 40;
352                        SetBkColor( m_hDC, GetSysColor( COLOR_3DFACE ) );
353                        SelectObject( m_hDC, TextFont );
354                        DrawText( m_hDC, szHeader, -1, &rect, DT_WORDBREAK );
355
356                        EndPaint( m_hWnd, &ps );
357
358                        SetForegroundWindow( m_hWnd );
359
360                        return 0;
361                }
362
363                case WM_ACTIVATE:
364                {
365                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_ACTIVATE (wParam=%X, lParam=%X)",wParam,lParam);
366                        break;
367                }
368
369                case WM_NCACTIVATE:
370                {
371                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_NCACTIVATE (wParam=%X, lParam=%X)",wParam,lParam);
372
373                        //if( !IsIconic( m_hWnd ) && m_ModalHold && Active_hWnd == m_hWnd )
374                        //{
375                        //      ShowWindow( m_hWnd, SW_SHOW );
376                        //      SetFocus( m_hWnd );
377                        //      return 0;
378                        //}
379                        if(!wParam)
380                        {
381                                SetFocus( m_hWnd );
382                                return 0;
383                        }
384                        break;
385                }
386
387                case WM_SETFOCUS:
388                {
389                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_SETFOCUS (wParam=%X, lParam=%X)",wParam,lParam);
390                        break;
391                }
392
393                case WM_KILLFOCUS:
394                {
395                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_KILLFOCUS (wParam=%X, lParam=%X)",wParam,lParam);
396
397                        //if( !IsIconic( m_hWnd ) && m_ModalHold && Active_hWnd == m_hWnd )
398                        //{
399                        //      if( GetParent((HWND)wParam ) != m_hWnd )
400                        //      {
401                        //              SetFocus( m_hWnd );
402                        //              return 0;
403                        //      }
404                        //}
405                        break;
406                }
407
408                case WM_CREATE:
409                {
410                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_CREATE (wParam=%X, lParam=%X)",wParam,lParam);
411
412                        HMENU hSysMenu;
413
414                        hSysMenu = GetSystemMenu( m_hWnd, FALSE );
415                        EnableMenuItem( hSysMenu, 3, MF_BYPOSITION | MF_GRAYED );
416                        SendMessage( m_hWnd, DM_SETDEFID, (WPARAM) IDC_EDIT, (LPARAM) 0); 
417
418                        return DefWindowProc( (HWND)((CREATESTRUCT *)lParam)->lpCreateParams, uMsg, wParam, lParam );
419                }
420
421                case WM_CLOSE:
422                {
423                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_CLOSE (wParam=%X, lParam=%X)",wParam,lParam);
424
425                        if( IsIconic( m_hWnd ) )
426                                return DefWindowProc( m_hWnd, uMsg, wParam, lParam );
427
428                        ShowWindow( m_hWnd, SW_MINIMIZE );
429                        return 0;
430                }
431
432                case WM_DESTROY: 
433                {
434                        MWLOG(LEV_DEBUG, MOD_DLG, L"  --> dlgWndAskPIN::ProcecEvent WM_DESTROY (wParam=%X, lParam=%X)",wParam,lParam);
435                        break;
436                }
437
438                default:
439                {
440                        return DefWindowProc( m_hWnd, uMsg, wParam, lParam );
441                }
442        }
443        return DefWindowProc( m_hWnd, uMsg, wParam, lParam );
444}
Note: See TracBrowser for help on using the browser.