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

Revision 91, 13.9 KB (checked in by vsilva, 9 years ago)

Fix getXML funciton; Fix some dialogs win32

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