2e5fae9e5eb875d18d29d19b9d2de43631d827ec
[gpgol.git] / src / olflange-dlgs.cpp
1 /* olflange-dlgs.cpp - New dialogs for Outlook.
2  *      Copyright (C) 2001 G Data Software AG, http://www.gdata.de
3  *      Copyright (C) 2004, 2005, 2006, 2007 g10 Code GmbH
4  * 
5  * This file is part of GpgOL.
6  * 
7  * GpgOL is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  * 
12  * GpgOL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU Lesser General Public License for more details.
16  * 
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <windows.h>
26 #include <prsht.h>
27
28 #include "mymapi.h"
29 #include "mymapitags.h"
30 #include "myexchext.h"
31 #include "common.h"
32 #include "display.h"
33 #include "ol-ext-callback.h"
34 #include "olflange-def.h"
35 #include "dialogs.h"
36
37
38 /* To avoid writing a dialog template for each language we use gettext
39    for the labels and hope that there is enough space in the dialog to
40    fit teh longest translation.  */
41 static void
42 set_labels (HWND dlg)
43 {
44   static struct { int itemid; const char *label; } labels[] = {
45     { IDC_ENCRYPT_DEFAULT,  N_("&Encrypt new messages by default")},
46     { IDC_SIGN_DEFAULT,     N_("&Sign new messages by default")},
47     { IDC_SMIME_DEFAULT,    N_("Use S/MIME by default")},
48     { IDC_ENABLE_SMIME,     N_("Enable the S/MIME support")},
49     { IDC_ENCRYPT_WITH_STANDARD_KEY, 
50                      N_("Also encrypt message with the default certificate")},
51     { IDC_PREVIEW_DECRYPT,  N_("Also decrypt in preview window")},
52     { IDC_PREFER_HTML,      N_("Show HTML view if possible")},
53
54     { IDC_G_PASSPHRASE,     N_("Passphrase")},
55     { IDC_T_PASSPHRASE_TTL, N_("Cache &passphrase for")}, 
56     { IDC_T_PASSPHRASE_MIN, N_("minutes")},
57
58     { IDC_GPG_OPTIONS,      N_("Ad&vanced..")},
59     { IDC_VERSION_INFO,  "Version "VERSION " ("__DATE__")"},
60     { 0, NULL}
61   };
62   int i;
63
64   for (i=0; labels[i].itemid; i++)
65     SetDlgItemText (dlg, labels[i].itemid, _(labels[i].label));
66
67 }  
68     
69
70 /* GPGOptionsDlgProc -
71    Handles the notifications sent for managing the options property page. */
72 bool 
73 GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
74 {
75   BOOL bMsgResult = FALSE;    
76   static LPNMHDR pnmhdr;
77   static HWND hWndPage;
78     
79   switch (uMsg) 
80     {
81     case WM_INITDIALOG:
82       {
83         HDC hdc = GetDC (hDlg);
84         if (hdc)
85           {
86             int bits_per_pixel = GetDeviceCaps (hdc, BITSPIXEL);
87             HBITMAP bitmap;
88                 
89             ReleaseDC (hDlg, hdc);      
90             if (bits_per_pixel > 15)
91               {
92                 bitmap = LoadBitmap (glob_hinst, MAKEINTRESOURCE(IDB_BANNER));
93                 if (bitmap)
94                   {
95                     HBITMAP old = (HBITMAP) SendDlgItemMessage
96                       (hDlg, IDC_BITMAP, STM_SETIMAGE,
97                        IMAGE_BITMAP, (LPARAM)bitmap);
98                     if (old)
99                       DeleteObject (old);       
100                   }     
101               }         
102           }
103         
104         EnableWindow (GetDlgItem (hDlg, IDC_ENCRYPT_TO),
105                       !!opt.enable_default_key);
106         EnableWindow (GetDlgItem (hDlg, IDC_SMIME_DEFAULT), 
107                       !!opt.enable_smime);
108         if (opt.enable_default_key)
109           CheckDlgButton (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY, BST_CHECKED);
110         set_labels (hDlg);
111       }
112       return TRUE;
113
114     case WM_LBUTTONDOWN:
115       {
116         int x = LOWORD (lParam);
117         int y = HIWORD (lParam);
118         RECT rect_banner = {0,0,0,0};
119         RECT rect_dlg = {0,0,0,0};
120         HWND bitmap;
121         
122         GetWindowRect (hDlg, &rect_dlg);
123         bitmap = GetDlgItem (hDlg, IDC_BITMAP);
124         if (bitmap)
125           GetWindowRect (bitmap, &rect_banner);
126
127         rect_banner.left   -= rect_dlg.left;
128         rect_banner.right  -= rect_dlg.left;
129         rect_banner.top    -= rect_dlg.top;
130         rect_banner.bottom -= rect_dlg.top;
131         
132         if (x >= rect_banner.left && x <= rect_banner.right
133             && y >= rect_banner.top && y <= rect_banner.bottom)
134           {
135             ShellExecute (NULL, "open",
136                           "http://www.g10code.com/p-gpgol.html",
137                           NULL, NULL, SW_SHOWNORMAL);   
138           }
139       }
140       break;
141
142     case WM_COMMAND:
143       if (HIWORD (wParam) == BN_CLICKED)
144         {
145           /* If dialog state has been changed, activate the confirm button. */
146           switch (wParam)
147             {
148             case IDC_ENCRYPT_WITH_STANDARD_KEY:
149             case IDC_PREFER_HTML:
150             case IDC_SIGN_DEFAULT:
151             case IDC_SMIME_DEFAULT:
152             case IDC_PREVIEW_DECRYPT:
153             case IDC_ENABLE_SMIME:
154               SendMessage (GetParent (hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
155               break;
156             }
157         }
158       if (HIWORD (wParam) == BN_CLICKED &&
159           LOWORD (wParam) == IDC_ENCRYPT_WITH_STANDARD_KEY) 
160         {
161           opt.enable_default_key = !opt.enable_default_key;
162           EnableWindow (GetDlgItem (hDlg, IDC_ENCRYPT_TO), 
163                         !!opt.enable_default_key);
164         }
165       if (HIWORD (wParam) == BN_CLICKED &&
166           LOWORD (wParam) == IDC_ENABLE_SMIME) 
167         {
168           opt.enable_smime = !opt.enable_smime;
169           EnableWindow (GetDlgItem (hDlg, IDC_SMIME_DEFAULT), 
170                         opt.enable_smime);
171         }
172       if (LOWORD (wParam) == IDC_GPG_OPTIONS)
173         config_dialog_box (hDlg);
174       break;
175         
176     case WM_NOTIFY:
177         pnmhdr = ((LPNMHDR) lParam);
178         switch (pnmhdr->code) {
179         case PSN_KILLACTIVE:
180             bMsgResult = FALSE;  /* allow this page to receive PSN_APPLY */
181             break;
182
183         case PSN_SETACTIVE: {
184             TCHAR s[30];
185             
186             if (opt.default_key && *opt.default_key)            
187                 SetDlgItemText (hDlg, IDC_ENCRYPT_TO, opt.default_key);
188             else
189                 SetDlgItemText (hDlg, IDC_ENCRYPT_TO, "");
190             wsprintf (s, "%d", opt.passwd_ttl/60);
191             SendDlgItemMessage (hDlg, IDC_TIME_PHRASES, WM_SETTEXT,
192                                0, (LPARAM) s);
193             hWndPage = pnmhdr->hwndFrom;   // to be used in WM_COMMAND
194             SendDlgItemMessage (hDlg, IDC_ENCRYPT_DEFAULT, BM_SETCHECK, 
195                                 !!opt.encrypt_default, 0L);
196             SendDlgItemMessage (hDlg, IDC_SIGN_DEFAULT, BM_SETCHECK, 
197                                 !!opt.sign_default, 0L);
198             SendDlgItemMessage (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY,
199                                 BM_SETCHECK, opt.enable_default_key, 0L);
200             SendDlgItemMessage (hDlg, IDC_SMIME_DEFAULT, BM_SETCHECK, 
201                                 !!opt.smime_default, 0L);
202             SendDlgItemMessage (hDlg, IDC_ENABLE_SMIME, BM_SETCHECK,
203                                 !!opt.enable_smime, 0L);
204             SendDlgItemMessage (hDlg, IDC_PREVIEW_DECRYPT, BM_SETCHECK,
205                                 !!opt.preview_decrypt, 0L);
206             SendDlgItemMessage (hDlg, IDC_PREFER_HTML, BM_SETCHECK,
207                                 !!opt.prefer_html, 0L);
208             bMsgResult = FALSE;  /* accepts activation */
209             break; }
210                 
211         case PSN_APPLY: {
212             TCHAR s[201];
213             
214             opt.enable_default_key = !!SendDlgItemMessage
215               (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY, BM_GETCHECK, 0, 0L);
216
217             GetDlgItemText (hDlg, IDC_ENCRYPT_TO, s, 200);
218             if (strlen (s) > 0 && strchr (s, ' ')) 
219               {
220                 if (opt.enable_default_key)
221                   {
222                     MessageBox (hDlg,_("The default certificate may not"
223                                        " contain any spaces."),
224                                 "GpgOL", MB_ICONERROR|MB_OK);
225                     bMsgResult = PSNRET_INVALID_NOCHANGEPAGE;
226                     break;
227                   }
228               }
229             set_default_key (s);
230  
231             SendDlgItemMessage (hDlg, IDC_TIME_PHRASES, WM_GETTEXT,
232                                 20, (LPARAM)s);         
233             opt.passwd_ttl = (int)atol (s)*60;
234                 
235             opt.encrypt_default = !!SendDlgItemMessage
236               (hDlg, IDC_ENCRYPT_DEFAULT, BM_GETCHECK, 0, 0L);
237             opt.sign_default = !!SendDlgItemMessage 
238               (hDlg, IDC_SIGN_DEFAULT, BM_GETCHECK, 0, 0L);
239             opt.enable_smime = !!SendDlgItemMessage
240               (hDlg, IDC_ENABLE_SMIME, BM_GETCHECK, 0, 0L);
241             if (opt.enable_smime)
242               {
243                 MessageBox (hDlg, 
244           _("You have enabled GpgOL's support for the S/MIME protocol.\n\n"
245             "New S/MIME messages are thus only viewable with GpgOL and "
246             "not anymore with Outlook's internal S/MIME support.  Those "
247             "message will even be unreadable by Outlook after GpgOL has "
248             "been deinstalled.  A tool to mitigate this problem will be "
249             "provided when GpgOL arrives at production quality status."),
250                             "GpgOL", MB_ICONWARNING|MB_OK);
251               }
252             opt.smime_default = !!SendDlgItemMessage
253               (hDlg, IDC_SMIME_DEFAULT, BM_GETCHECK, 0, 0L);
254             opt.preview_decrypt = !!SendDlgItemMessage
255               (hDlg, IDC_PREVIEW_DECRYPT, BM_GETCHECK, 0, 0L);
256             opt.prefer_html = !!SendDlgItemMessage
257               (hDlg, IDC_PREFER_HTML, BM_GETCHECK, 0, 0L);
258
259             write_options ();
260             bMsgResult = PSNRET_NOERROR;
261             break; }
262                 
263         case PSN_HELP: 
264           {
265             const char cpynotice[] = "Copyright (C) 2007 g10 Code GmbH";
266             const char en_notice[] = 
267       "GpgOL is a plugin for Outlook to allow encryption and\n"
268       "signing of messages using the OpenPGP and S/MIME standard.\n"
269       "It uses the GnuPG software (http://www.gnupg.org). Latest\n"
270       "release information are accessible by clicking on the logo.\n"
271       "\n"
272       "GpgOL is free software; you can redistribute it and/or\n"
273       "modify it under the terms of the GNU Lesser General Public\n"
274       "License as published by the Free Software Foundation; either\n"
275       "version 2.1 of the License, or (at your option) any later version.\n"
276       "\n"
277       "GpgOL is distributed in the hope that it will be useful,\n"
278       "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
279       "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
280       "GNU Lesser General Public License for more details.\n"
281       "\n"
282       "You should have received a copy of the GNU Lesser General Public "
283       "License\n"
284       "along with this program; if not, see <http://www.gnu.org/licenses/>.";
285
286             /* TRANSLATORS: See the source for the full english text.  */
287             const char notice_key[] = N_("-#GpgOLFullHelpText#-");
288             const char *notice;
289             char header[300];
290             char *buffer;
291             size_t nbuffer;
292
293             snprintf (header, sizeof header, _("This is GpgOL version %s"),
294                       PACKAGE_VERSION);
295             notice = _(notice_key);
296             if (!strcmp (notice, notice_key))
297               notice = en_notice;
298             nbuffer = strlen (header)+strlen (cpynotice)+strlen (notice)+20;
299             buffer = (char*)xmalloc (nbuffer);
300             snprintf (buffer, nbuffer, "%s\n%s\n\n%s\n",
301                       header, cpynotice, notice);
302             MessageBox (pnmhdr->hwndFrom, buffer, "GpgOL", MB_OK);
303             xfree (buffer);
304             bMsgResult = TRUE;
305             break; }
306           
307         default:
308             bMsgResult = FALSE;
309             break;          
310         }
311         SetWindowLong (hDlg, DWL_MSGRESULT, bMsgResult);
312         break;
313
314     default:
315         bMsgResult = FALSE;
316         break;          
317     }
318     return bMsgResult;
319 }