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