/[winpt]/trunk/Src/wptFileManagerDlg.cpp
ViewVC logotype

Contents of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 328 - (show annotations)
Fri Sep 25 16:07:38 2009 UTC (15 years, 5 months ago) by twoaday
File size: 22565 byte(s)


1 /* wptFileMangerDlg.cpp - File Manager
2 * Copyright (C) 2001-2006, 2008-2009 Timo Schulz
3 *
4 * This file is part of WinPT.
5 *
6 * WinPT is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * WinPT 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 General Public License for more details.
15 */
16 #ifdef HAVE_CONFIG_H
17 #include <config.h>
18 #endif
19
20 #include <windows.h>
21 #include <commctrl.h>
22 #include <sys/stat.h>
23 #include <stdio.h>
24
25 #include "resource.h"
26 #include "wptCommonCtl.h"
27 #include "wptGPG.h"
28 #include "wptW32API.h"
29 #include "wptKeylist.h"
30 #include "wptErrors.h"
31 #include "wptContext.h" /* for passphrase_s */
32 #include "wptDlgs.h"
33 #include "wptTypes.h"
34 #include "wptNLS.h"
35 #include "wptVersion.h"
36 #include "wptFileManager.h"
37 #include "wptRegistry.h"
38 #include "wptCrypto.h"
39
40 #define FM_SEPARATOR_ID 10001
41
42 #define send_cmd_id(hwnd, id) \
43 PostMessage ((hwnd), WM_COMMAND, MAKEWPARAM((id), 0), 0)
44
45 static subclass_s filelist_proc;
46
47
48 int is_openpgp_ext (const char *name);
49
50 /* Return 1 if the selected file in the listview has a valid GPG extension. */
51 static int
52 is_openpgp_file (listview_ctrl_t lv)
53 {
54 char name[MAX_PATH+32];
55
56 listview_get_item_text (lv, listview_get_curr_pos (lv), FM_COL_NAME,
57 name, DIM (name)-1);
58 return is_openpgp_ext (name);
59 }
60
61
62 /* Dialog procedure for selecting recipients for encryption. */
63 BOOL CALLBACK
64 file_encrypt_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
65 {
66 static keylist_ctrl_t kl = NULL;
67 static fm_state_t c;
68 static keylist_t list = NULL;
69 gpg_keycache_t kc;
70 gpgme_ctx_t ctx;
71 int force_trust = 0;
72
73 switch (msg) {
74 case WM_INITDIALOG:
75 c = (fm_state_t)lparam;
76 if (!c)
77 BUG (0);
78 kc = keycache_get_ctx (KEYCACHE_PUB);
79 SetWindowText (dlg, _("File Encrypt"));
80 SetDlgItemText (dlg, IDC_ENCRYPT_ARMOR, _("&Text Output"));
81 SetDlgItemText (dlg, IDC_ENCRYPT_ANON, _("Anonymize (throw keyid)"));
82 SetDlgItemText (dlg, IDC_ENCRYPT_SIGN, _("&Select Key for signing"));
83 SetDlgItemText (dlg, IDC_ENCRYPT_OPTINF, _("Options"));
84 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
85
86 // TODO: support --hidden-recipient
87 EnableWindow (GetDlgItem (dlg, IDC_ENCRYPT_ANON), FALSE);
88
89 if (c->req_signer) {
90 EnableWindow (GetDlgItem (dlg, IDC_ENCRYPT_SIGN), TRUE);
91 seclist_init (dlg, IDC_ENCRYPT_SECLIST, KEYLIST_FLAG_SHORT, &list);
92 }
93 kl = keylist_load (GetDlgItem (dlg, IDC_ENCRYPT_LIST), kc, NULL,
94 KEYLIST_ENCRYPT_MIN|KEYLIST_FLAG_FILE,
95 KEY_SORT_USERID);
96 SetForegroundWindow (dlg);
97 return TRUE;
98
99 case WM_DESTROY:
100 seclist_destroy (&list);
101 if (kl) {
102 keylist_delete (kl);
103 kl = NULL;
104 }
105 balloon_msg_disable ();
106 break;
107
108 case WM_NOTIFY:
109 NMHDR *notify;
110 notify = (NMHDR *)lparam;
111 if (notify && notify->code == LVN_COLUMNCLICK
112 && notify->idFrom == IDC_ENCRYPT_LIST) {
113 NMLISTVIEW *p = (LPNMLISTVIEW) lparam;
114 int sortby = 0;
115
116 switch (p->iSubItem) {
117 case 0: sortby = KEY_SORT_USERID; break;
118 case 1: sortby = KEY_SORT_KEYID; break;
119 case 2: sortby = KEY_SORT_LEN; break;
120 case 4: sortby = KEY_SORT_VALIDITY; break;
121 default:sortby = KEY_SORT_USERID; break;
122 }
123 keylist_sort (kl, sortby);
124 }
125 break;
126
127 case WM_COMMAND:
128 if (HIWORD (wparam) == BN_CLICKED
129 && LOWORD (wparam) == IDC_ENCRYPT_SIGN) {
130 int req_signer = IsDlgButtonChecked (dlg, IDC_ENCRYPT_SIGN);
131 EnableWindow (GetDlgItem (dlg, IDC_ENCRYPT_SECLIST),
132 req_signer? TRUE : FALSE);
133 }
134 switch (LOWORD (wparam)) {
135 case IDOK:
136 ctx = c->ctx;
137 safe_free (c->recp);
138 c->recp = keylist_get_recipients (kl, &force_trust, &c->n_recp);
139 if (!c->n_recp) {
140 show_balloon_msg (GetDlgItem (dlg, IDC_ENCRYPT_LIST),
141 _("Please select at least one recipient."),
142 IDI_ERROR);
143 safe_free (c->recp);
144 c->recp = NULL;
145 c->cancel = 1;
146 return TRUE;
147 }
148 if (IsDlgButtonChecked (dlg, IDC_ENCRYPT_SIGN)) {
149 gpgme_key_t key;
150
151 if (seclist_select_key (dlg, IDC_ENCRYPT_SECLIST, &key))
152 return TRUE;
153 else
154 gpgme_signers_add (c->ctx, key);
155 }
156
157 if (IsDlgButtonChecked (dlg, IDC_ENCRYPT_ARMOR))
158 gpgme_set_armor (ctx, 1);
159 /* XXX: implement this
160 if (IsDlgButtonChecked (dlg, IDC_ENCRYPT_ANON))
161 ;
162 */
163 c->cancel = 0;
164 EndDialog (dlg, TRUE);
165 return TRUE;
166
167 case IDCANCEL:
168 c->cancel = 1;
169 EndDialog (dlg, FALSE);
170 return TRUE;
171 }
172 return TRUE;
173 }
174
175 return FALSE;
176 }
177
178
179 /* Dialog box procedure for importing keys. */
180 BOOL CALLBACK
181 file_import_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
182 {
183 static listview_ctrl_t lv = NULL;
184 static fm_state_t c;
185 static int is_revcert = 0, has_seckeys = 0;
186
187 switch (msg) {
188 case WM_INITDIALOG:
189 c = (fm_state_s *)lparam;
190 if (!c)
191 BUG (0);
192 ShowWindow (GetDlgItem (dlg, IDC_IMPORT_KEYMNGT), WS_DISABLED);
193 implist_build (&lv, GetDlgItem (dlg, IDC_IMPORT_KEYLIST));
194 implist_load (lv, c->import.is_clip? NULL: c->opaque,
195 &is_revcert, &has_seckeys);
196 if (!listview_count_items (lv, 0)) {
197 msg_box (dlg, _("No valid OpenPGP data found."), _("Key Import"), MB_ERR);
198 c->cancel = 1;
199 EndDialog (dlg, FALSE);
200 return TRUE;
201 }
202 else {
203 const char *fmt = _("%s contain(s) %d key(s).");
204 const char *name = c->import.is_clip? _("Clipboard") : _("File");
205 char *p = new char[strlen (fmt) + strlen (name) + 32 + 1];
206 if (!p)
207 BUG (NULL);
208 sprintf (p, fmt, name, listview_count_items (lv, 0));
209 SetDlgItemText (dlg, IDC_IMPORT_INFO, p);
210 free_if_alloc (p);
211 }
212 SetWindowText (dlg, _("Key Import"));
213 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
214 center_window (dlg, NULL);
215 SetForegroundWindow (dlg);
216 return TRUE;
217
218 case WM_DESTROY:
219 if (lv) {
220 listview_release (lv);
221 lv = NULL;
222 }
223 return FALSE;
224
225 case WM_COMMAND:
226 switch (LOWORD (wparam)) {
227 case IDC_IMPORT_DOIT:
228 /* Make sure the user knows the consequence if he/she imports
229 a key revocation certificate. */
230 if (is_revcert) {
231 int ret = msg_box (dlg, _("The file contains at least one revocation certificate.\n"
232 "If you contine the import, the key will be rendered useless.\n"
233 "Really proceed?"), _("Import"), MB_ICONWARNING|MB_YESNO);
234 if (ret == IDNO) {
235 c->cancel = 1;
236 EndDialog (dlg, FALSE);
237 return TRUE;
238 }
239 }
240 if (has_seckeys > 0) {
241 msg_box (dlg, _("Some of the imported keys are secret keys.\n\n"
242 "The ownertrust values of these keys must be\n"
243 "set manually via the Key Properties dialog."),
244 _("Import"), MB_INFO);
245 }
246 c->cancel = 0;
247 c->import.revcert = is_revcert? 1 : 0;
248 c->import.has_seckey = has_seckeys? 1 : 0;
249 EndDialog (dlg, TRUE);
250 return TRUE;
251
252 case IDCANCEL:
253 c->cancel = 1;
254 EndDialog (dlg, FALSE);
255 return TRUE;
256 }
257 break;
258 }
259
260 return FALSE;
261 }
262
263
264 /* Dialog box procedure for file signing. */
265 BOOL CALLBACK
266 file_sign_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
267 {
268 static fm_state_t c;
269 static keylist_ctrl_t kl;
270 gpg_keycache_t kc, sec_kc;
271 gpgme_key_t key;
272 int lv_idx;
273 char signer[32+1];
274
275 switch (msg) {
276 case WM_INITDIALOG:
277 c = (fm_state_s *)lparam;
278 if (!c)
279 BUG (0);
280 SetWindowText (dlg, _("File Sign"));
281 SetDlgItemText (dlg, IDC_FILE_SIG_ARMOR, _("&Text Output") );
282 SetDlgItemText (dlg, IDC_FILE_SIG_NORMAL, _("&Normal Signature"));
283 SetDlgItemText (dlg, IDC_FILE_SIG_DETACH, _("&Detached Signature"));
284 SetDlgItemText (dlg, IDC_FILE_SIG_CLEAR, _("&Cleartext Signature"));
285 SetDlgItemText (dlg, IDC_FILE_SIG_SIGINF, _("Signature mode"));
286 SetDlgItemText (dlg, IDC_FILE_SIG_OPTINF, _("Options"));
287 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
288 CheckDlgButton (dlg, IDC_FILE_SIG_DETACH, BST_CHECKED);
289 kc = keycache_get_ctx (KEYCACHE_PUB);
290 if (!kc)
291 BUG (dlg);
292 sec_kc = keycache_get_ctx (KEYCACHE_PRV);
293 if (!sec_kc)
294 BUG (dlg);
295 kl = keylist_load (GetDlgItem (dlg, IDC_FILE_SIG_LIST), kc, sec_kc,
296 KEYLIST_SIGN, KEY_SORT_USERID);
297 SetForegroundWindow (dlg);
298 return TRUE;
299
300 case WM_DESTROY:
301 if (kl) {
302 keylist_delete (kl);
303 kl = NULL;
304 }
305 return FALSE;
306
307 case WM_COMMAND:
308 switch (LOWORD (wparam)) {
309 case IDOK:
310 if (IsDlgButtonChecked (dlg, IDC_FILE_SIG_ARMOR))
311 gpgme_set_armor (c->ctx, 1);
312 if (IsDlgButtonChecked (dlg, IDC_FILE_SIG_NORMAL))
313 c->sigmode = GPGME_SIG_MODE_NORMAL;
314 else if (IsDlgButtonChecked (dlg, IDC_FILE_SIG_DETACH))
315 c->sigmode = GPGME_SIG_MODE_DETACH;
316 else if (IsDlgButtonChecked( dlg, IDC_FILE_SIG_CLEAR))
317 c->sigmode = GPGME_SIG_MODE_CLEAR;
318 else {
319 /* default is to produce detached signatures */
320 c->sigmode = GPGME_SIG_MODE_DETACH;
321 }
322 lv_idx = listview_get_selected_item (kl->lv);
323 if (lv_idx == -1) {
324 if (listview_count_items (kl->lv, 0) == 1)
325 lv_idx = 0;
326 else {
327 msg_box (dlg, _("Please select a key."), _("File Sign"), MB_ERR);
328 return FALSE;
329 }
330 }
331 listview_get_item_text (kl->lv, lv_idx, 1, signer, DIM (signer)-1);
332 if (get_seckey (signer, &key))
333 BUG (NULL);
334 gpgme_signers_clear (c->ctx);
335 gpgme_signers_add (c->ctx, key);
336 free_if_alloc (c->opaque);
337 c->opaque = m_strdup (signer); /* store for later use */
338 c->cancel = 0;
339 EndDialog (dlg, TRUE);
340 return TRUE;
341
342 case IDCANCEL:
343 c->cancel = 1;
344 EndDialog (dlg, FALSE);
345 return TRUE;
346 }
347 break;
348 }
349
350 return FALSE;
351 }
352
353
354 /* Setup status bar for the main window @dlg. */
355 static HWND
356 setup_status_bar (HWND dlg)
357 {
358 HWND statbar;
359 RECT r;
360 int partpos[3];
361 int i;
362
363 GetClientRect (dlg, &r);
364 for (i=1; i <= 3; i++)
365 partpos[i-1] = r.right/3*i;
366
367 statbar = CreateStatusWindow (WS_CHILD | WS_VISIBLE | CCS_BOTTOM,
368 "", dlg, FM_SEPARATOR_ID);
369 ShowWindow (statbar, SW_SHOW);
370 SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
371 return statbar;
372 }
373
374
375 /* Refresh the status bar text with the selected item from @lv. */
376 static void
377 update_status_bar (HWND statbar, listview_ctrl_t lv)
378 {
379 struct stat st;
380 char buf[128];
381 int i, n;
382 DWORD len = 0;
383
384 if (!lv) { /* flush */
385 SendMessage (statbar, SB_SETTEXT, 1, (LPARAM)"0 Byte");
386 SendMessage (statbar, SB_SETTEXT, 0, (LPARAM)_("0 Objects marked"));
387 return;
388 }
389 n = listview_count_items (lv, 1);
390 _snprintf (buf, DIM (buf)-1, _("%d Object(s) marked"), n);
391 SendMessage (statbar, SB_SETTEXT, 0, (LPARAM)buf);
392 if (!n)
393 return;
394 for (i=0; i < listview_count_items (lv, 0); i++) {
395 if (!listview_get_item_state (lv, i))
396 continue;
397 listview_get_item_text (lv, i, 1, buf, DIM (buf)-1);
398 if (stat (buf, &st) == 0)
399 len += st.st_size;
400 }
401 if (!len)
402 _snprintf (buf, DIM (buf)-1, "0 Byte");
403 else if (len < 1024)
404 _snprintf (buf, DIM (buf)-1, "%d Byte", len);
405 else if (st.st_size < 1048576)
406 _snprintf (buf, DIM (buf)-1, "%d KB", len/1024);
407 else
408 _snprintf (buf, DIM (buf)-1, "%d MB", len/1024/1024);
409 SendMessage (statbar, SB_SETTEXT, 1, (LPARAM)buf);
410 }
411
412 #ifndef VK_A
413 #define VK_A 65
414 #endif
415
416 /* Subclass procedure to detect common hotkeys. */
417 static BOOL CALLBACK
418 filelist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
419 {
420 switch (msg) {
421 case WM_KEYUP:
422 if ((int)wparam == VK_A) {
423 if (GetAsyncKeyState (VK_CONTROL)) {
424 struct listview_ctrl_s fm_lv;
425 fm_lv.ctrl = GetDlgItem (filelist_proc.dlg, IDC_FILE_LIST);
426 listview_select_all (&fm_lv);
427 }
428 }
429 break;
430 }
431 return CallWindowProc (filelist_proc.old, dlg, msg, wparam, lparam);
432 }
433
434
435 /* Enable or disabled menu entries from the dialog window @hwnd.
436 @lv is used to find out the state of the selected file entry. */
437 static void
438 update_ui_items (HWND hwnd, HMENU hm, bool is_popup, listview_ctrl_t lv)
439 {
440 int ids[2][7] = {
441 {ID_FILEMISC_SEND, ID_FILEMISC_DECRYPT, ID_FILEMISC_VERIFY,
442 ID_FILEMISC_ENCRYPT, ID_FILEMISC_SIGN, ID_FILEMISC_SIGNENC},
443 {ID_FILECTX_SEND, ID_FILECTX_DECRYPT, ID_FILECTX_VERIFY,
444 ID_FILECTX_ENCRYPT, ID_FILECTX_SIGN, ID_FILECTX_SIGNENC}
445 };
446 enum id_type_t { SEND, DECRYPT, VERIFY, ENCR, SIGN, SIGENC };
447 int pos, idx = is_popup? 1: 0;
448
449 pos = listview_get_curr_pos (lv);
450 if (fm_check_file_type (lv, pos, FM_DECRYPT))
451 set_menu_state (hm, ids[idx][SEND], MF_ENABLED);
452
453 if (fm_check_file_type (lv, pos, FM_ENCRYPT)) {
454 set_menu_state (hm, ids[idx][DECRYPT], MF_GRAYED|MF_DISABLED);
455 set_menu_state (hm, ids[idx][VERIFY], MF_GRAYED|MF_DISABLED);
456 set_menu_state (hm, ids[idx][ENCR], MF_ENABLED);
457 set_menu_state (hm, ids[idx][SIGN], MF_ENABLED);
458 set_menu_state (hm, ids[idx][SIGENC], MF_ENABLED);
459 }
460 if (fm_check_file_type (lv, pos, FM_DECRYPT)) {
461 set_menu_state (hm, ids[idx][ENCR], MF_GRAYED|MF_DISABLED);
462 set_menu_state (hm, ids[idx][SIGN], MF_GRAYED|MF_DISABLED);
463 set_menu_state (hm, ids[idx][SIGENC], MF_GRAYED|MF_DISABLED);
464 set_menu_state (hm, ids[idx][DECRYPT], MF_ENABLED);
465 }
466 if (fm_check_file_type (lv, pos, FM_VERIFY)) {
467 set_menu_state (hm, ids[idx][ENCR], MF_GRAYED|MF_DISABLED);
468 set_menu_state (hm, ids[idx][VERIFY], MF_ENABLED);
469 set_menu_state (hm, ids[idx][SIGN], MF_GRAYED|MF_DISABLED);
470 set_menu_state (hm, ids[idx][SIGENC], MF_GRAYED|MF_DISABLED);
471 }
472
473 /* disable all operation which need a secret key. */
474 if (!secret_key_available ()) {
475 set_menu_state (hm, ids[idx][DECRYPT], MF_GRAYED|MF_DISABLED);
476 set_menu_state (hm, ids[idx][SIGN], MF_GRAYED|MF_DISABLED);
477 set_menu_state (hm, ids[idx][SIGENC], MF_GRAYED|MF_DISABLED);
478 }
479 }
480
481
482 /* Dialog box procedure for the File Manager. */
483 BOOL CALLBACK
484 file_manager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
485 {
486 static fm_info_t fm = NULL;
487 static int always_ontop = 0;
488 char sel_fname[MAX_PATH+1];
489 HWND fl;
490
491 switch (msg) {
492 case WM_INITDIALOG:
493 always_ontop = get_reg_winpt_flag ("AlwaysOnTop");
494 if (always_ontop == -1)
495 always_ontop = 0;
496 SetWindowText (dlg, _("File Manager (use drag & drop to add files)"));
497 fm_build (&fm, GetDlgItem (dlg, IDC_FILE_LIST));
498 fm->menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_FILEMISC);
499 set_menu_text_bypos (fm->menu, 0, _("File"));
500 set_menu_text_bypos (fm->menu, 1, _("Edit"));
501 set_menu_text_bypos (fm->menu, 2, _("View"));
502 set_menu_text (fm->menu, ID_FILEMISC_OPEN, _("&Open...") );
503 set_menu_text (fm->menu, ID_FILEMISC_ENCRYPT, _("&Encrypt...") );
504 set_menu_text (fm->menu, ID_FILEMISC_DECRYPT, _("&Decrypt...") );
505 set_menu_text (fm->menu, ID_FILEMISC_SIGN, _("&Sign..."));
506 set_menu_text (fm->menu, ID_FILEMISC_SIGNENC, _("Sign && Encrypt..."));
507 set_menu_text (fm->menu, ID_FILEMISC_VERIFY, _("&Verify..."));
508 set_menu_text (fm->menu, ID_FILEMISC_SYMENC, _("S&ymmetric..."));
509 set_menu_text (fm->menu, ID_FILEMISC_IMPORT, _("&Import...") );
510 set_menu_text (fm->menu, ID_FILEMISC_EXPORT, _("E&xport...") );
511 set_menu_text (fm->menu, ID_FILEMISC_QUIT, _("Exit"));
512 set_menu_text (fm->menu, ID_FILEMISC_CLEAR, _("&Reset") );
513 set_menu_text (fm->menu, ID_FILEMISC_ONTOP, _("Always on Top"));
514 set_menu_text (fm->menu, ID_FILEMISC_SELALL, _("&Select All"));
515 set_menu_text (fm->menu, ID_FILEMISC_PREFS, _("&Preferences..."));
516 set_menu_text (fm->menu, ID_FILEMISC_LIST, _("&List Packets..."));
517
518 fl = GetDlgItem (dlg, IDC_FILE_LIST);
519 filelist_proc.dlg = dlg;
520 filelist_proc.current = (WNDPROC)filelist_subclass_proc;
521 filelist_proc.old = (WNDPROC)GetWindowLong (fl, GWL_WNDPROC);
522 if (filelist_proc.old) {
523 if (!SetWindowLong (fl, GWL_WNDPROC, (LONG)filelist_proc.current)) {
524 msg_box (dlg, "Could not set filelist window procedure.",
525 _("File Manager"), MB_ERR);
526 BUG (NULL);
527 }
528 }
529 SendMessage (dlg, WM_SETICON, (WPARAM)ICON_SMALL,
530 (LPARAM)LoadIcon (glob_hinst, (LPCTSTR)IDI_WINPT));
531 SetMenu (dlg, fm->menu);
532 if (!always_ontop)
533 set_menu_state (fm->menu, ID_FILEMISC_ONTOP, MFS_UNCHECKED);
534 else
535 center_window2 (dlg, NULL, HWND_TOPMOST);
536 center_window (dlg, NULL);
537 SetForegroundWindow (dlg);
538 fm->statbar = setup_status_bar (dlg);
539 filelist_proc.opaque = (void*)fm->statbar;
540 return TRUE;
541
542 case WM_DESTROY:
543 if (fm) {
544 fm_delete (fm);
545 fm = NULL;
546 }
547 set_reg_winpt_flag ("AlwaysOnTop", always_ontop);
548 return FALSE;
549
550 case WM_DROPFILES:
551 fm_add_dropped_files (fm, (HDROP)wparam);
552 return TRUE;
553
554 case WM_NOTIFY:
555 NMHDR *notify;
556 int pos;
557 HMENU hm;
558
559 notify = (NMHDR *)lparam;
560 if (notify && notify->code == LVN_COLUMNCLICK
561 && notify->idFrom == IDC_FILE_LIST) {
562 NMLISTVIEW *p = (LPNMLISTVIEW) lparam;
563 fm_sort (fm->lv, p->iSubItem);
564 }
565
566 if (notify && notify->code == NM_CLICK &&
567 notify->idFrom == IDC_FILE_LIST)
568 update_status_bar (fm->statbar, fm->lv);
569 if (notify && notify->code == NM_RCLICK
570 && notify->idFrom == IDC_FILE_LIST) {
571 POINT p;
572 HMENU popup;
573
574 /* If the selected file does not exist any longer,
575 delete the entry and supress the popup. */
576 pos = listview_get_curr_pos (fm->lv);
577 listview_get_item_text (fm->lv, pos, FM_COL_NAME,
578 sel_fname, DIM (sel_fname)-1);
579 if (file_exist_check (sel_fname) != 0) {
580 listview_del_item (fm->lv, pos);
581 break;
582 }
583
584 GetCursorPos (&p);
585 hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_FILEMISC_CTX));
586 popup = GetSubMenu (hm, 0);
587 set_menu_text (popup, ID_FILECTX_ENCRYPT, _("Encrypt"));
588 set_menu_text (popup, ID_FILECTX_DECRYPT, _("Decrypt"));
589 set_menu_text (popup, ID_FILECTX_SIGN, _("Sign"));
590 set_menu_text (popup, ID_FILECTX_SIGNENC, _("Sign && Encrypt"));
591 set_menu_text (popup, ID_FILECTX_VERIFY, _("Verify"));
592 set_menu_text (popup, ID_FILECTX_SEND, _("Send as Mail"));
593 set_menu_text (popup, ID_FILECTX_LIST, _("List Packets"));
594 if (!is_openpgp_file (fm->lv))
595 set_menu_state (popup, ID_FILECTX_LIST, MF_GRAYED|MF_DISABLED);
596 update_ui_items (dlg, popup, true, fm->lv);
597 TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
598 DestroyMenu (popup);
599 DestroyMenu (hm);
600 }
601 if (notify && notify->code == NM_CLICK
602 && notify->idFrom == IDC_FILE_LIST) {
603 hm = GetMenu (dlg);
604 pos = listview_get_curr_pos (fm->lv);
605 if (!fm_check_file_type (fm->lv, pos, FM_DECRYPT))
606 set_menu_state (hm, ID_FILEMISC_SEND, MF_GRAYED|MF_DISABLED);
607 else
608 set_menu_state (hm, ID_FILEMISC_SEND, MF_ENABLED);
609 }
610 if (notify && notify->code == LVN_ITEMCHANGED &&
611 ((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
612 update_ui_items (dlg, GetMenu (dlg), false, fm->lv);
613 update_status_bar (fm->statbar, fm->lv);
614 }
615 return TRUE;
616
617 case WM_COMMAND:
618 switch (LOWORD (wparam)) {
619 case IDCANCEL:
620 case ID_FILEMISC_QUIT:
621 EndDialog (dlg, TRUE);
622 return TRUE;
623
624 case ID_FILEMISC_SELALL:
625 listview_select_all (fm->lv);
626 break;
627
628 case ID_FILEMISC_ONTOP:
629 always_ontop ^= 1;
630 set_menu_state (fm->menu, ID_FILEMISC_ONTOP,
631 always_ontop == 0? MFS_UNCHECKED : MFS_CHECKED);
632 center_window2 (dlg, NULL,
633 always_ontop == 0? HWND_NOTOPMOST : HWND_TOPMOST);
634 break;
635
636 case ID_FILEMISC_SEND:
637 fm_send_file (fm->lv);
638 break;
639
640 case ID_FILEMISC_PREFS:
641 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_FILE_PREFS, dlg,
642 file_preferences_dlg_proc, 0);
643 break;
644
645 case ID_FILEMISC_LIST:
646 case ID_FILEMISC_ENCRYPT:
647 case ID_FILEMISC_SYMENC:
648 case ID_FILEMISC_DECRYPT:
649 case ID_FILEMISC_SIGN:
650 case ID_FILEMISC_SIGNENC:
651 case ID_FILEMISC_VERIFY:
652 fm_parse_files (fm->lv, dlg, LOWORD (wparam));
653 SetForegroundWindow (dlg);
654 return TRUE;
655
656 case ID_FILEMISC_CLEAR:
657 fm_reset (fm);
658 update_status_bar (fm->statbar, NULL);
659 return TRUE;
660
661 case ID_FILEMISC_OPEN:
662 fm_add_opened_files (fm, dlg);
663 return TRUE;
664
665 /* context menu entries */
666 case ID_FILECTX_ENCRYPT: send_cmd_id (dlg, ID_FILEMISC_ENCRYPT);break;
667 case ID_FILECTX_DECRYPT: send_cmd_id (dlg, ID_FILEMISC_DECRYPT);break;
668 case ID_FILECTX_SIGN: send_cmd_id (dlg, ID_FILEMISC_SIGN); break;
669 case ID_FILECTX_SIGNENC: send_cmd_id (dlg, ID_FILEMISC_SIGNENC);break;
670 case ID_FILECTX_VERIFY: send_cmd_id (dlg, ID_FILEMISC_VERIFY); break;
671 case ID_FILECTX_LIST: send_cmd_id (dlg, ID_FILEMISC_LIST); break;
672 case ID_FILECTX_SEND: send_cmd_id (dlg, ID_FILEMISC_SEND); break;
673 }
674 break;
675 }
676
677 return FALSE;
678 }
679
680
681 /* Dialog box procedure for the FM preferences. */
682 BOOL CALLBACK
683 file_preferences_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
684 {
685 switch (msg) {
686 case WM_INITDIALOG:
687 CheckDlgButton (dlg, IDC_FPREFS_PROGRESS,
688 reg_prefs.fm.progress? BST_CHECKED : BST_UNCHECKED);
689 SetForegroundWindow (dlg);
690 center_window (dlg, NULL);
691 break;
692
693 case WM_COMMAND:
694 switch (LOWORD (wparam)) {
695 case IDOK:
696 reg_prefs.fm.progress = IsDlgButtonChecked (dlg, IDC_FPREFS_PROGRESS)? 1 : 0;
697 set_reg_winpt_prefs (&reg_prefs);
698 EndDialog (dlg, TRUE);
699 break;
700
701 case IDCANCEL:
702 EndDialog (dlg, FALSE);
703 break;
704 }
705 break;
706 }
707
708 return FALSE;
709 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26