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

Diff of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 104 by twoaday, Tue Nov 29 09:48:43 2005 UTC revision 128 by twoaday, Mon Dec 19 13:05:59 2005 UTC
# Line 18  Line 18 
18   * along with WinPT; if not, write to the Free Software Foundation,   * along with WinPT; if not, write to the Free Software Foundation,
19   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20   */   */
   
21  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
22  #include <config.h>  #include <config.h>
23  #endif  #endif
# Line 43  Line 42 
42  #include "wptKeyEdit.h"  #include "wptKeyEdit.h"
43  #include "wptRegistry.h"  #include "wptRegistry.h"
44    
45    /* Name and ID of the separator window. */
46  #define KM_SEPARATOR_ID                10000  #define KM_SEPARATOR_ID                10000
47  #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"  #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"
 //#define KM_SEPARATOR_HEIGHT            5  
48    
49    /* Virtual key codes. */
50    #ifndef VK_F
51    #define VK_F 70
52    #endif
53    #ifndef VK_A
54    #define VK_A 65
55    #endif
56    #ifndef VK_C
57    #define VK_C 67
58    #endif
59    #ifndef VK_P
60    #define VK_P 80
61    #endif
62    
63  static subclass_s keylist_proc;  static subclass_s keylist_proc;
 static int km_index = -1;  
64    
65  HIMAGELIST glob_imagelist;  HIMAGELIST glob_imagelist;
66    
# Line 64  struct km_info { Line 75  struct km_info {
75      HWND statbar;      HWND statbar;
76    
77      listview_ctrl_t lv;      listview_ctrl_t lv;
78        int             lv_idx;
79      int keylist_sortby;      int keylist_sortby;
80  };  };
81    
82    /* Toolbar button structure. */
83  struct mybuttons {  struct mybuttons {
84      long icon;      long icon;
85      long command;      long command;
# Line 82  struct mybuttons myb[] = { Line 95  struct mybuttons myb[] = {
95  };  };
96    
97    
98  #ifndef VK_F  /* Subclass the keylist listview control to allow extended commands. */
 #define VK_F 70  
 #endif  
 #ifndef VK_A  
 #define VK_A 65  
 #endif  
 #ifndef VK_C  
 #define VK_C 67  
 #endif  
 #ifndef VK_P  
 #define VK_P 80  
 #endif  
   
99  static BOOL CALLBACK  static BOOL CALLBACK
100  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
101  {  {
# Line 109  keylist_subclass_proc (HWND dlg, UINT ms Line 110  keylist_subclass_proc (HWND dlg, UINT ms
110          int virt_key = (int)wparam;          int virt_key = (int)wparam;
111          switch (virt_key) {          switch (virt_key) {
112          case VK_SPACE:          case VK_SPACE:
113              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_PROPS );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
114              break;              break;
115                    
116          case VK_DELETE:          case VK_DELETE:
117              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_DELETE );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
118              break;              break;
119                    
120          case VK_INSERT:          case VK_INSERT:
# Line 130  keylist_subclass_proc (HWND dlg, UINT ms Line 131  keylist_subclass_proc (HWND dlg, UINT ms
131          case VK_C:          case VK_C:
132              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL)) {
133                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);
                 km_index = listview_get_curr_pos (&lv);  
134                  km_clip_export (keylist_proc.dlg, &lv);                  km_clip_export (keylist_proc.dlg, &lv);
135              }              }
136              break;              break;
137    
138          case VK_P:          case VK_P:
139              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL))          
                 km_index = -1;  
140                  km_clip_import (keylist_proc.dlg);                  km_clip_import (keylist_proc.dlg);
             }  
141              break;              break;
142    
143          case VK_F:          case VK_F:
# Line 152  keylist_subclass_proc (HWND dlg, UINT ms Line 150  keylist_subclass_proc (HWND dlg, UINT ms
150          break;          break;
151      }      }
152            
153      return CallWindowProc( keylist_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
154  } /* keylist_subclass_proc */  }
155    
156    
157  static HWND  static HWND
158  load_toolbar (HWND dlg, struct km_info * kmi)  load_toolbar (HWND dlg, struct km_info *kmi)
159  {  {
160      HWND tbwnd;      HWND tbwnd;
161      TBSAVEPARAMS tbsp;      TBSAVEPARAMS tbsp;
# Line 175  load_toolbar (HWND dlg, struct km_info * Line 173  load_toolbar (HWND dlg, struct km_info *
173                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,
174                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);
175      if (tbwnd) {      if (tbwnd) {
176          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
177          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);
178                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);
179          ShowWindow (tbwnd, SW_SHOW);          ShowWindow (tbwnd, SW_SHOW);
# Line 185  load_toolbar (HWND dlg, struct km_info * Line 183  load_toolbar (HWND dlg, struct km_info *
183          tbsp.pszSubKey = "Software\\WinPT";          tbsp.pszSubKey = "Software\\WinPT";
184          tbsp.pszValueName = "KM_toolbar";          tbsp.pszValueName = "KM_toolbar";
185          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)
186              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]), (LONG)&tb_buttons[0]);              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]),
187                             (LONG)&tb_buttons[0]);
188       }       }
189       return tbwnd;       return tbwnd;
190  } /* load_toolbar */  }
191    
192    
193    /* Restore the width of the columns from the registry.
194       If no bitstring was found, the default size is used. */
195    int
196    restore_column_size (listview_ctrl_t hd)
197    {
198        WORD *buf;
199        HKEY root;
200        DWORD type;
201        DWORD size = hd->cols*sizeof (WORD), i;
202        LONG ec;
203    
204        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
205                           KEY_ALL_ACCESS, &root);
206        if (ec != ERROR_SUCCESS)
207            return -1;
208    
209        buf = new WORD[size/2];
210        if (!buf)
211            BUG (NULL);
212        ec = RegQueryValueEx (root, "KMColumnSize", NULL, &type,
213                              (BYTE*)buf, &size);
214        RegCloseKey (root);
215        if (ec != ERROR_SUCCESS) {
216            free_if_alloc (buf);
217            return -1;
218        }
219    
220        /* check for garbled values. */
221        for (i=0; i < size/2; i++) {
222            if (buf[i] > 512) {
223                free_if_alloc (buf);
224                return -1;
225            }
226        }
227        for (i=0; i < size/2; i++) {
228            LVCOLUMN lvc;
229    
230            memset (&lvc, 0, sizeof (lvc));
231            lvc.mask = LVCF_WIDTH;
232            lvc.cx = buf[i];
233            ListView_SetColumn (hd->ctrl, i, &lvc);
234        }
235        free_if_alloc (buf);
236        return 0;
237    }
238    
239    
240    /* Save the current column width to the registry. */
241    int
242    save_column_size (listview_ctrl_t hd)
243    {
244        WORD *buf;
245        HKEY root;
246        LONG ec;
247        int i;
248    
249        buf = new WORD[hd->cols];
250        if (!buf)
251            BUG (NULL);
252        for (i=0; i < hd->cols; i++) {
253            LVCOLUMN lvc;
254    
255            memset (&lvc, 0, sizeof (lvc));
256            lvc.mask = LVCF_WIDTH;
257            ListView_GetColumn (hd->ctrl, i, &lvc);
258            buf[i] = lvc.cx;
259        }
260    
261        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
262                           KEY_ALL_ACCESS, &root);
263        if (ec != ERROR_SUCCESS) {
264            free_if_alloc (buf);
265            return -1;
266        }
267    
268        ec = RegSetValueEx (root, "KMColumnSize", 0, REG_BINARY,
269                            (const BYTE*)buf, 2*hd->cols);
270        RegCloseKey (root);
271        free_if_alloc (buf);
272        return ec == ERROR_SUCCESS? 0 : -1;
273    }
274    
275    
276  /* Center window @dlg. */  /* Center window @dlg. */
277  static void  static void
278  do_center_window (HWND dlg, struct km_info * kmi)  do_center_window (HWND dlg, struct km_info *kmi)
279  {  {
280      RECT rect;      RECT rect;
281      char * p;      char *p;
282      int pos_x = 0, pos_y = 0;      int pos_x = 0;
283        int pos_y = 0;
284                    
285      /* Find bottom of keylist */      /* Find bottom of keylist */
286      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);
# Line 207  do_center_window (HWND dlg, struct km_in Line 290  do_center_window (HWND dlg, struct km_in
290    
291      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
292      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
293          free_if_alloc (p);          free_if_alloc (p);      
294          center_window (dlg, NULL);          center_window (dlg, NULL);
295          return;          return;
296      }      }
# Line 217  do_center_window (HWND dlg, struct km_in Line 300  do_center_window (HWND dlg, struct km_in
300      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
301      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
302          free_if_alloc (p);          free_if_alloc (p);
303          center_window(dlg, NULL);          center_window (dlg, NULL);
304          return;          return;
305      }      }
306      else if (p)      else if (p)
# Line 230  do_center_window (HWND dlg, struct km_in Line 313  do_center_window (HWND dlg, struct km_in
313            
314      if (pos_x < 0 || pos_y < 0)      if (pos_x < 0 || pos_y < 0)
315          pos_x = pos_y = 0;          pos_x = pos_y = 0;
316      if (pos_x > GetSystemMetrics (SM_CXSCREEN)      if (pos_x > GetSystemMetrics (SM_CXSCREEN)
317          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
318          pos_x = pos_y = 0;          pos_x = pos_y = 0;
319      }      }
# Line 239  do_center_window (HWND dlg, struct km_in Line 322  do_center_window (HWND dlg, struct km_in
322  }  }
323    
324    
325    /* Resize the key manager window with the information from @kmi. */
326  static void  static void
327  do_resize_window( HWND dlg, struct km_info *kmi)  do_resize_window (HWND dlg, struct km_info *kmi)
328  {  {
329      HWND h;      HWND h;
330      RECT rclient, rect;      RECT rclient, rect;
331      BOOL bRepaint = FALSE;      BOOL bRepaint = FALSE;
332    
333      /* Get rect of client area and make life easier */      /* Get rect of client area and make life easier */
334      GetClientRect( dlg, &rclient );      GetClientRect (dlg, &rclient);
335    
336      /* Move toolbar to the top of the window */      /* Move toolbar to the top of the window */
337      if (kmi->toolbar) {      if (kmi->toolbar) {
338          GetWindowRect(kmi->toolbar, &rect);          GetWindowRect (kmi->toolbar, &rect);
339          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
340          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
341    
342          rclient.top += rect.bottom - rect.top;          rclient.top += rect.bottom - rect.top;
343          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,
# Line 262  do_resize_window( HWND dlg, struct km_in Line 346  do_resize_window( HWND dlg, struct km_in
346    
347      /* Move statusbar to the bottom of the window */      /* Move statusbar to the bottom of the window */
348      if (kmi->statbar) {      if (kmi->statbar) {
349          GetWindowRect( kmi->statbar, &rect );          GetWindowRect (kmi->statbar, &rect);
350          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
351          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
352    
353          rclient.bottom -= rect.bottom - rect.top;          rclient.bottom -= rect.bottom - rect.top;
354          MoveWindow (kmi->statbar, 0, rclient.bottom, rclient.right - rclient.left,          MoveWindow (kmi->statbar, 0, rclient.bottom,
355                        rclient.right - rclient.left,
356                      rect.bottom - rect.top, bRepaint);                      rect.bottom - rect.top, bRepaint);
357      }      }
358    
359      // Obtain separator information and move it to the desired posistion      /* Obtain separator information and move it to the desired posistion */
360      if (kmi->ypercent_sep)      if (kmi->ypercent_sep)
361          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;
362      else      else
363          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);
364                    
365      // Don't move away      /* Don't move away */
366      if (kmi->ypos_sep+5 > rclient.bottom)      if (kmi->ypos_sep+5 > rclient.bottom)
367          kmi->ypos_sep = rclient.bottom - 5;          kmi->ypos_sep = rclient.bottom - 5;
368      if (kmi->ypos_sep < rclient.top)      if (kmi->ypos_sep < rclient.top)
369          kmi->ypos_sep = rclient.top;          kmi->ypos_sep = rclient.top;
370      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep, (rclient.right - rclient.left), 5, bRepaint);      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
371                    (rclient.right - rclient.left), 5, bRepaint);
372                    
373      // Place the keylist above the separator      /* Place the keylist above the separator */
374      h = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
375      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
376                  kmi->ypos_sep - rclient.top, bRepaint);                  kmi->ypos_sep - rclient.top, bRepaint);
377      rclient.top = kmi->ypos_sep + 5 + 8;      rclient.top = kmi->ypos_sep + 5 + 8;
378    
379      /* Place the group text and the group box below the separator */      /* Place the group text and the group box below the separator */
380      h = GetDlgItem( dlg, IDC_KEYMISC_GTEXT );      h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
381      MoveWindow( h, rclient.left, rclient.top, 100, 14, bRepaint);      MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
382      rclient.top += 18;      rclient.top += 18;
383    
384      h = GetDlgItem( dlg, IDC_KEYMISC_GROUP );      h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
385      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
386                  (rclient.bottom < rclient.top) ? 0 : rclient.bottom - rclient.top, bRepaint);                  (rclient.bottom < rclient.top) ?
387                    0 : rclient.bottom - rclient.top, bRepaint);
388            
389      /* Repaint the whole thing */      /* Repaint the whole thing */
390      InvalidateRect (dlg, NULL, TRUE);      InvalidateRect (dlg, NULL, TRUE);
391  } /* do_resize_window */  }
392    
393    
394    /* Return true if the clipboard contains an OpenPGP key. */
395    static bool
396    clip_contains_pgpkey (void)
397    {
398        char *ctxt;
399        bool val = false;
400    
401        ctxt = get_clip_text (NULL);
402        if (!ctxt || strlen (ctxt) < 512)
403            val = false;
404        else if (strstr (ctxt, "BEGIN PGP") && strstr (ctxt, "KEY BLOCK") &&
405                 strstr (ctxt, "END PGP"))
406            val = true;
407        free_if_alloc (ctxt);
408        return val;
409    }
410    
411    
412    /* Show a mini popup menu to import keys. */
413  static void  static void
414  do_create_minpopup (HWND dlg)  do_create_minpopup (HWND dlg)
415  {  {
# Line 312  do_create_minpopup (HWND dlg) Line 418  do_create_minpopup (HWND dlg)
418      char * s;      char * s;
419      POINT p;      POINT p;
420            
421      if (gpg_read_only)      if (gpg_read_only || !clip_contains_pgpkey ())
422          return;          return;
423      hm = CreatePopupMenu ();      hm = CreatePopupMenu ();
424      if (!hm)      if (!hm)
# Line 329  do_create_minpopup (HWND dlg) Line 435  do_create_minpopup (HWND dlg)
435      GetCursorPos (&p);      GetCursorPos (&p);
436      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);
437      DestroyMenu (hm);      DestroyMenu (hm);
438  } /* do_create_minpopup */  }
439    
440    
441    /* Reload the key cache if requested. */
442  static void  static void
443  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)
444  {  {
445      gpg_keycache_t cache;      gpg_keycache_t cache;
446    
447      if( keycache_get_reload( ) ) {      if (keycache_get_reload ()) {
448          keycache_reload( dlg );          keycache_reload (dlg);
449          keycache_set_reload( 0 );          keycache_set_reload (0);
450          cache = keycache_get_ctx( 1 );          cache = keycache_get_ctx (1);
451          if( !cache )          if (!cache)
452              BUG( dlg );              BUG (dlg);
453          keylist_reload( lv, cache, KEYLIST_LIST, KEY_SORT_USERID );          keylist_reload (lv, cache, KEYLIST_LIST, KEY_SORT_USERID);
454          km_complete_status_bar (sb, lv);          km_update_status_bar (sb, lv);
455      }      }
456  } /* do_check_cache */  }
457    
458    
459  long CALLBACK  long CALLBACK
460  separator_wnd_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )  separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
461  {  {
462      static POINT last_mouse_pos;      static POINT last_mouse_pos;
463      RECT rect;  
       
464      if (msg == WM_CREATE)      if (msg == WM_CREATE)
465          SetWindowLong (hwnd, GWL_USERDATA, (long)(((CREATESTRUCT*)lparam)->lpCreateParams));          SetWindowLong (hwnd, GWL_USERDATA,
466                           (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
467    
468      switch (msg) {      switch (msg) {
469      case WM_PAINT:      case WM_PAINT:
470          PAINTSTRUCT ps;          PAINTSTRUCT ps;
471            RECT rect;
472          HPEN hpen;          HPEN hpen;
473    
474          GetClientRect (hwnd, &rect);          GetClientRect (hwnd, &rect);
475          BeginPaint (hwnd, &ps);          BeginPaint (hwnd, &ps);
476    
477          // Background          /* Background */
478          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
479    
480          // The lines from the light into the dark          /* The lines from the light into the dark */
481          MoveToEx(ps.hdc, 0,0, NULL);          MoveToEx(ps.hdc, 0,0, NULL);
482          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {
483              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
484              LineTo(ps.hdc, rect.right, 0);              LineTo (ps.hdc, rect.right, 0);
485              DeleteObject(hpen);              DeleteObject (hpen);
486          }          }
487          MoveToEx(ps.hdc, 0, 1, NULL);          MoveToEx(ps.hdc, 0, 1, NULL);
488          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {
489               SelectObject(ps.hdc, (LPVOID)hpen);               SelectObject (ps.hdc, (LPVOID)hpen);
490               LineTo(ps.hdc, rect.right, rect.bottom);               LineTo (ps.hdc, rect.right, rect.bottom);
491               DeleteObject(hpen);               DeleteObject (hpen);
492           }           }
493    
494          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);
495          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {
496              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
497              LineTo(ps.hdc, rect.right, rect.bottom-1);              LineTo (ps.hdc, rect.right, rect.bottom-1);
498              DeleteObject(hpen);              DeleteObject (hpen);
499          }          }
500          MoveToEx(ps.hdc, 0, rect.bottom, NULL);          MoveToEx(ps.hdc, 0, rect.bottom, NULL);
501          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {
502              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
503              LineTo(ps.hdc, rect.right, rect.bottom);              LineTo (ps.hdc, rect.right, rect.bottom);
504              DeleteObject(hpen);              DeleteObject (hpen);
505          }          }
506    
507          EndPaint (hwnd, &ps);          EndPaint (hwnd, &ps);
508          return 0;          return 0;
509    
510      case WM_LBUTTONDOWN:      case WM_LBUTTONDOWN:
511          last_mouse_pos.x = LOWORD(lparam);          last_mouse_pos.x = LOWORD (lparam);
512          last_mouse_pos.y = HIWORD(lparam);          last_mouse_pos.y = HIWORD (lparam);
513          ClientToScreen (hwnd, &last_mouse_pos);          ClientToScreen (hwnd, &last_mouse_pos);
514          SetCapture (hwnd);          SetCapture (hwnd);
515          return 0;          return 0;
# Line 414  separator_wnd_proc( HWND hwnd, UINT msg, Line 522  separator_wnd_proc( HWND hwnd, UINT msg,
522          if (wparam == MK_LBUTTON) {          if (wparam == MK_LBUTTON) {
523              struct km_info *kmi;              struct km_info *kmi;
524              POINT p;              POINT p;
525                RECT r;
526    
527              if ((kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA)) == NULL)              kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA);
528                if (kmi == NULL)
529                  break;                  break;
530    
531              // Calculate mouse movement              /* Calculate mouse movement */
532              p.x = LOWORD(lparam);              p.x = LOWORD(lparam);
533              p.y = HIWORD(lparam);              p.y = HIWORD(lparam);
534              ClientToScreen (hwnd, &p);              ClientToScreen (hwnd, &p);
535    
536              GetWindowRect (hwnd, &rect);              GetWindowRect (hwnd, &r);
537              rect.top += (short)(p.y - last_mouse_pos.y);              r.top += (short)(p.y - last_mouse_pos.y);
538              rect.bottom += (short)(p.y - last_mouse_pos.y);              r.bottom += (short)(p.y - last_mouse_pos.y);
539    
540              last_mouse_pos.y = p.y;              last_mouse_pos.y = p.y;
541    
542              // Apply mouse movement to window. Beware the MoveWindow is relaive              /* Apply mouse movement to window. Beware the MoveWindow is relaive
543              // to parent NOT screen                 to parent NOT screen */
544              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&rect, 2);              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
545              kmi->ypos_sep = rect.top;              kmi->ypos_sep = r.top;
546              kmi->ypercent_sep = 0; // This forces do_resize_window to use abs. position              kmi->ypercent_sep = 0; /* This forces do_resize_window to use abs. position */
547              do_resize_window (GetParent(hwnd), kmi);              do_resize_window (GetParent(hwnd), kmi);
548              return 0;              return 0;
549          }          }
# Line 443  separator_wnd_proc( HWND hwnd, UINT msg, Line 553  separator_wnd_proc( HWND hwnd, UINT msg,
553  }  }
554    
555    
556    /* Register the separator window with @dlg as the parent window. */
557  static HWND  static HWND
558  regist_sep_wnd (HWND dlg, struct km_info * kmi)  regist_sep_wnd (HWND dlg, struct km_info * kmi)
559  {  {
# Line 466  regist_sep_wnd (HWND dlg, struct km_info Line 577  regist_sep_wnd (HWND dlg, struct km_info
577                          0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);                              0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);    
578      ShowWindow (h, SW_SHOW);      ShowWindow (h, SW_SHOW);
579      return h;      return h;
580  } /* regist_sep_wnd */  }
   
581    
582    
583  #define enable_button(hwnd, cid) \  #define enable_button(hwnd, cid) \
# Line 480  regist_sep_wnd (HWND dlg, struct km_info Line 590  regist_sep_wnd (HWND dlg, struct km_info
590  void  void
591  update_ui_items (HWND hwnd, listview_ctrl_t lv)  update_ui_items (HWND hwnd, listview_ctrl_t lv)
592  {  {
     int key_selected = 0, key_has_sec = 0;  
     int i, key_inv = 0;  
593      HWND hwnd_child;      HWND hwnd_child;
594      HMENU hmenu;      HMENU hmenu;
595        int key_selected = 0;
596        int key_has_sec = 0;
597        int key_inv = 0;
598        int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
599                             ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
600        int i, state=0;
601            
602      /* Get some states */      /* Get some states */
603      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),
# Line 493  update_ui_items (HWND hwnd, listview_ctr Line 607  update_ui_items (HWND hwnd, listview_ctr
607      if (key_selected) {      if (key_selected) {
608          i = listview_get_curr_pos (lv);          i = listview_get_curr_pos (lv);
609          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;
610          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED;          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
611                      km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
612      }      }
613    
614      /* Enable / disable toolbar buttons */      /* Enable / disable toolbar buttons */
# Line 504  update_ui_items (HWND hwnd, listview_ctr Line 619  update_ui_items (HWND hwnd, listview_ctr
619      enable_button (hwnd_child, ID_KEYMISC_EXPORT);      enable_button (hwnd_child, ID_KEYMISC_EXPORT);
620    
621      /* Enable / disable menu items */      /* Enable / disable menu items */
622        state = key_selected? MF_ENABLED : MF_DISABLED|MF_GRAYED;
623      hmenu = GetMenu (hwnd);      hmenu = GetMenu (hwnd);
624      set_menu_state (hmenu, ID_KEYMISC_EXPORT, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT, state);
625      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY, state);
626      set_menu_state (hmenu, ID_KEYMISC_REVCERT, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_REVCERT, state);
627      set_menu_state (hmenu, ID_KEYMISC_DELETE, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_DELETE, state);
628      set_menu_state (hmenu, ID_KEYMISC_PROPS, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_PROPS, state);
629        set_menu_state (hmenu, ID_KEYMISC_EDITKEY, state);
630        set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, state);
631      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);
632      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);  
633      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);      /* Disable some menu items when multiple keys are selected. */
634        if (listview_count_items (lv, 1) > 1) {
635            for (i=0; mult_resids[i] != 0; i++)
636                set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
637        }
638    }
639    
640    
641    /* Disable some context menu items when multiple keys are selected. */
642    static void
643    popup_multiple (HWND dlg, HMENU hm)
644    {
645        int resids[] = {
646            ID_KEYCTX_EDIT,
647            ID_KEYCTX_SIGN,
648            ID_KEYCTX_REV,
649            ID_KEYCTX_ENABLE,
650            ID_KEYCTX_DISABLE,
651            ID_KEYCTX_ADDKEY,
652            ID_KEYCTX_ADDPHOTO,
653            ID_KEYCTX_ADDUID,
654            ID_KEYCTX_ADDREV,
655            ID_KEYCTX_LISTSIGS,
656            ID_KEYCTX_MAXTRUST,
657            ID_KEYCTX_PROPS,
658            ID_KEYCTX_SENDMAIL,
659            0};
660        int i;
661        for (i=0; i < resids[i] != 0; i++)
662            set_menu_state (hm, resids[i], MF_GRAYED);
663  }  }
664    
665    
# Line 544  popup_gpg_readonly (HWND dlg, HMENU hm) Line 691  popup_gpg_readonly (HWND dlg, HMENU hm)
691  }  }
692    
693    
694    /* Change the 'Edit' menu based on the current state. */
695    static void
696    change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
697    {
698        enum item { EDIT_MENU = 1 };
699        int no_sel;
700    
701        if (id != EDIT_MENU)
702            return;
703    
704        if (!clip_contains_pgpkey ())
705            set_menu_state (hm, ID_KEYMISC_PASTE, MF_GRAYED);
706        else
707            set_menu_state (hm, ID_KEYMISC_PASTE, MF_ENABLED);
708        no_sel = listview_get_curr_pos (lv) == -1? 1 : 0;
709        set_menu_state (hm, ID_KEYMISC_DELETE2, no_sel? MF_GRAYED: MF_ENABLED);
710        set_menu_state (hm, ID_KEYMISC_COPY, no_sel? MF_GRAYED : MF_ENABLED);
711    }
712    
713    
714    
715    /* Show limited key menu entries when GPG is in read-only mode. */
716  static void  static void
717  menu_gpg_readonly (HWND dlg, HMENU hm, int id)  change_key_menu (HMENU hm, int id)
718  {  {
719      int key_resids[] = {      int key_resids[] = {
720          ID_KEYMISC_SIGN,          ID_KEYMISC_SIGN,
# Line 576  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 745  menu_gpg_readonly (HWND dlg, HMENU hm, i
745      case 0: return;      case 0: return;
746      case 3: resids = key_resids; break;      case 3: resids = key_resids; break;
747      case 1: resids = edit_resids;break;      case 1: resids = edit_resids;break;
748      default: resids = edit_resids; return;      default:resids = edit_resids; break;
749      }      }
750    
751      for (i=0; resids[i] != 0; i++)      for (i=0; resids[i] != 0; i++)
# Line 584  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 753  menu_gpg_readonly (HWND dlg, HMENU hm, i
753  }  }
754    
755    
756    /* Return a user-friendly name for a key derrived from
757       name. If @is_secret is 1, a secret key name will be generated. */
758  static char*  static char*
759  gen_export_filename (const char *keyid, int is_secret)  gen_export_filename (const char *keyid, int is_secret)
760  {  {
# Line 608  gen_export_filename (const char *keyid, Line 779  gen_export_filename (const char *keyid,
779  }  }
780    
781    
782    /* Reload a single key in the cache. */
783  static void  static void
784  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)
785  {  {
# Line 628  update_key (listview_ctrl_t lv, int pos, Line 800  update_key (listview_ctrl_t lv, int pos,
800  static HWND  static HWND
801  setup_status_bar (HWND dlg, listview_ctrl_t lv)  setup_status_bar (HWND dlg, listview_ctrl_t lv)
802  {        {      
803      HWND statbar;          HWND statbar;
804      RECT r;      RECT r;
805      int partpos[3];      int partpos[3];
806      int i;      int i;
# Line 643  setup_status_bar (HWND dlg, listview_ctr Line 815  setup_status_bar (HWND dlg, listview_ctr
815      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
816    
817      km_update_default_key_str (statbar);      km_update_default_key_str (statbar);
818      km_complete_status_bar (statbar, lv);      km_update_status_bar (statbar, lv);
819    
820      return statbar;      return statbar;
821  }  }
822    
823    
824    /* Translate all menu strings. */
825    static void
826    translate_menu_strings (HWND dlg)
827    {
828        HMENU menu;
829    
830        menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
831        set_menu_text_bypos (menu, 0, _("File"));
832        set_menu_text_bypos (menu, 1, _("Edit"));
833        set_menu_text_bypos (menu, 2, _("View"));
834        set_menu_text_bypos (menu, 3, _("Key"));
835        set_menu_text_bypos (menu, 4, _("Groups"));
836    
837        set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
838        set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));
839        set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */
840        set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));
841        set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));
842        set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));
843        set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));
844        set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));
845        set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));
846        set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));
847        set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));
848        set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));
849        set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));
850        set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));
851        set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
852        set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke"));
853        set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));
854        set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));
855        set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));
856        set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));
857        set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));
858        set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));
859        set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));
860        set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
861        set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));
862        set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));
863        set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));
864        set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));
865        set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );
866        set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));
867    
868        /* XXX: implement help code. */
869        set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
870    
871        SetMenu (dlg, menu);
872    }
873    
874    
875    /* Translate popup menu strings. */
876    static void
877    translate_popupmenu_strings (HMENU popup)
878    {
879        set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));
880        set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));
881        set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));
882        set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));
883        set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));
884        set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));
885        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));
886        set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));
887        set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));
888        set_menu_text (popup, ID_KEYCTX_PROPS, _("&Properties"));
889        set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));
890        set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));
891        set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke"));
892        set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));
893        set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));
894        set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));
895        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));
896        set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));
897        set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));
898        set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));
899    
900        set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
901        set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
902        set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
903        set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
904    
905        /* change popup texts */
906        set_menu_text_bypos (popup, 0, _("Key Attributes"));
907        set_menu_text_bypos (popup, 6, _("Add"));
908        set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
909    }
910    
911    
912    /* Dialog box procedure for the Key Manager. */
913  BOOL CALLBACK  BOOL CALLBACK
914  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
915  {  {
916      struct km_info *kmi;      struct km_info *kmi;
     /*static km_group_s *gc = NULL;*/  
     static HMENU menu = NULL;  
917      static int refresh_keys = 0;          static int refresh_keys = 0;    
918      INITCOMMONCONTROLSEX icex;      INITCOMMONCONTROLSEX icex;
919      HWND kl;      HWND kl;
920      HMENU hm;      HMENU hm;
921      gpg_keycache_t c;      gpg_keycache_t c;
922      gpgme_key_t key;      gpgme_key_t key;
     /*km_group_cb_s gcb; XXX */  
923      struct genkey_s genkey;      struct genkey_s genkey;
924      struct winpt_key_s k = {0};      struct winpt_key_s k = {0};
925      struct URL_ctx_s *url;      struct URL_ctx_s *url;
926      refresh_cache_s rcs = {0};      refresh_cache_s rcs = {0};
927      char keyid[48], uid[128], type[32], *name;      char keyid[48], uid[128], type[32], *name;
928      const char *t, * host;      const char *t, *host;
929      u16 port = 0;      u16 port = 0;
930      int idx = 0, i=0, rc;      int l_idx = 0, i=0, rc;
931    
932      if ((msg != WM_INITDIALOG)      if ((msg != WM_INITDIALOG)
933          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
# Line 679  keymanager_dlg_proc (HWND dlg, UINT msg, Line 937  keymanager_dlg_proc (HWND dlg, UINT msg,
937      case WM_INITDIALOG:      case WM_INITDIALOG:
938          kmi = new struct km_info;          kmi = new struct km_info;
939          memset (kmi, 0, sizeof (struct km_info));          memset (kmi, 0, sizeof (struct km_info));
940            kmi->lv_idx = -1;
941          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
942          icex.dwICC  = ICC_BAR_CLASSES;          icex.dwICC  = ICC_BAR_CLASSES;
943          InitCommonControlsEx (&icex);          InitCommonControlsEx (&icex);
944          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
945          imagelist_load (dlg);          imagelist_load (dlg);
946            translate_menu_strings (dlg);
947            SetWindowText (dlg, _("Key Manager"));
948    
949          SetWindowText( dlg, _("Key Manager") );          if (keyring_check_last_access ())
950          menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );              keycache_set_reload (1);
951          set_menu_text_bypos (menu, 0, _("File"));          if (keycache_get_reload ())
952          set_menu_text_bypos (menu, 1, _("Edit"));              keycache_reload (dlg);
953          set_menu_text_bypos (menu, 2, _("View"));          c = keycache_get_ctx (KEYCACHE_PUB);
954          set_menu_text_bypos (menu, 3, _("Key"));          if (!c)
955          set_menu_text_bypos (menu, 4, _("Groups"));              BUG (NULL);
956                    kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
         set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));  
         set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));  
         set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */  
         set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));  
         set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));  
         set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));  
         set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));  
         set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));  
         set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));  
         set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));  
         set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));  
         set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));  
         set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));  
         set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));  
         set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke"));  
         set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));  
         set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));  
         set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));  
         set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));  
         set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));  
         set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));  
         set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));  
         set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );  
         set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));  
         set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));  
         set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));  
         set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));  
         set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );  
         set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));  
   
         SetMenu (dlg, menu);  
         if( keyring_check_last_access() )  
             keycache_set_reload( 1 );  
         if( keycache_get_reload( ) )  
             keycache_reload( dlg );  
         c = keycache_get_ctx( KEYCACHE_PUB );  
         if( !c )  
             BUG( NULL );  
957          kmi->keylist_sortby = KEY_SORT_USERID;          kmi->keylist_sortby = KEY_SORT_USERID;
958          Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),          Header_SetImageList(ListView_GetHeader (kl), glob_imagelist);
959                              glob_imagelist);          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
960          kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);
                                 NULL, KEYLIST_LIST, kmi->keylist_sortby );  
961          /* init subclassing for the listview */          /* init subclassing for the listview */
         kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );  
962          keylist_proc.dlg = dlg;          keylist_proc.dlg = dlg;
963          keylist_proc.current = (WNDPROC)keylist_subclass_proc;          keylist_proc.current = (WNDPROC)keylist_subclass_proc;
964          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );
965          if( keylist_proc.old ) {          if (keylist_proc.old) {
966              if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {              if( !SetWindowLong (kl, GWL_WNDPROC, (LONG)keylist_proc.current)) {
967                  msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("Could not set keylist window procedure."),
968                  BUG( NULL );                           _("Key Manager"), MB_ERR);
969                    BUG (NULL);
970              }              }
971          }          }
         #if 0  
         km_groups_new( &gc, GetDlgItem( dlg, IDC_KEYMISC_GROUP ) );  
         km_groups_load( gc );  
         #endif  
         SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst, (LPCTSTR)IDI_WINPT));  
   
972          kmi->statbar = setup_status_bar (dlg, kmi->lv);          kmi->statbar = setup_status_bar (dlg, kmi->lv);
973          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
974          kmi->toolbar = load_toolbar (dlg, kmi);          kmi->toolbar = load_toolbar (dlg, kmi);
# Line 760  keymanager_dlg_proc (HWND dlg, UINT msg, Line 976  keymanager_dlg_proc (HWND dlg, UINT msg,
976          do_center_window (dlg, kmi);          do_center_window (dlg, kmi);
977          do_resize_window (dlg, kmi);          do_resize_window (dlg, kmi);
978          update_ui_items (dlg, kmi->lv);          update_ui_items (dlg, kmi->lv);
979                    restore_column_size (kmi->lv);
980    
981          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
982            SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
983                          (LPCTSTR)IDI_WINPT));
984          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
985          return TRUE;          return TRUE;
986                    
987      case WM_DESTROY:      case WM_DESTROY:
988            save_column_size (kmi->lv);
989          if (kmi->lv) {          if (kmi->lv) {
990              keylist_delete (kmi->lv);              keylist_delete (kmi->lv);
991              kmi->lv = NULL;                    kmi->lv = NULL;      
992                    }
993           /*          imagelist_destroy ();
994           if (gc) {  
995              km_groups_release (gc);          ltoa (kmi->pos_x, type, 10);
996              gc = NULL;          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
997          }*/          ltoa (kmi->pos_y, type, 10);
998         imagelist_destroy ();          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
999            
1000         char buf[32];          /* Remove runtime information. This should be the last action taken here. */
1001         ltoa (kmi->pos_x, buf, 10);          delete kmi; kmi = NULL;
1002         set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );          SetWindowLong (dlg, GWL_USERDATA, 0);
1003         ltoa (kmi->pos_y, buf, 10);          keycache_set_reload (refresh_keys);
1004         set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);          return FALSE;
1005         /* Remove runtime information. This should be the last action taken here. */  
1006         delete kmi; kmi = NULL;      case WM_MOVE:
        SetWindowLong (dlg, GWL_USERDATA, 0);  
        keycache_set_reload (refresh_keys);  
        return FALSE;  
   
     case WM_MOVE:        
         /* kmi->pos_x = (int)(short)LOWORD(lparam);  
            kmi->pos_y = (int)(short)HIWORD(lparam); */  
1007          RECT r;          RECT r;
1008          GetWindowRect (dlg, &r);          GetWindowRect (dlg, &r);
1009          kmi->pos_x = r.left;          kmi->pos_x = r.left;
# Line 803  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1016  keymanager_dlg_proc (HWND dlg, UINT msg,
1016          break;          break;
1017    
1018      case WM_NOTIFY:                  case WM_NOTIFY:            
1019          NMHDR * notify;          NMHDR *notify;
1020          POINT p;          POINT p;
1021          HMENU popup;          HMENU popup;
1022                    
1023          notify = (NMHDR *)lparam;          notify = (NMHDR *)lparam;
1024          if (notify == NULL)          if (!notify)
1025              break;              break;
1026          switch (notify->code)          switch (notify->code) {
         {  
1027          case TBN_QUERYDELETE:          case TBN_QUERYDELETE:
1028              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1029              return TRUE;              return TRUE;
1030                    
1031          case TBN_QUERYINSERT:          case TBN_QUERYINSERT:
1032              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1033              return TRUE;              return TRUE;
1034    
1035          case TBN_GETBUTTONINFO:          case TBN_GETBUTTONINFO:
# Line 886  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1098  keymanager_dlg_proc (HWND dlg, UINT msg,
1098              return TRUE;              return TRUE;
1099                            
1100          case LVN_ITEMCHANGED:          case LVN_ITEMCHANGED:
1101              if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */              if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
1102              {                  kmi->lv_idx = listview_get_curr_pos (kmi->lv);
1103                  update_ui_items (dlg, kmi->lv);                  update_ui_items (dlg, kmi->lv);
1104                  return TRUE;                  return TRUE;
1105              }              }
# Line 895  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1107  keymanager_dlg_proc (HWND dlg, UINT msg,
1107    
1108          case NM_RCLICK:          case NM_RCLICK:
1109              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1110                  if (listview_get_curr_pos (kmi->lv) == -1)                  l_idx =listview_get_curr_pos (kmi->lv);
1111                    if (l_idx == -1)
1112                      return TRUE; /* Popup only when a item was selected */                      return TRUE; /* Popup only when a item was selected */
1113                  do_check_cache (kmi->lv, dlg, kmi->statbar);                  do_check_cache (kmi->lv, dlg, kmi->statbar);
1114                  GetCursorPos (&p);                  GetCursorPos (&p);
1115                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
1116                  popup = GetSubMenu (hm, 0);                  popup = GetSubMenu (hm, 0);
1117                    translate_popupmenu_strings (popup);
1118    
1119                  set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));                  if (km_check_for_seckey (kmi->lv, l_idx, &i))
                 set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));  
                 set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));  
                 set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));  
                 set_menu_text (popup, ID_KEYCTX_PROPS, _("&Key Properties"));  
                 set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));  
                 set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));  
                 set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke"));  
                 set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));  
                 set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));  
                 set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));  
                 set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));  
                 set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));  
                 set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));  
                 set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));  
                 /* change popup texts */  
                 set_menu_text_bypos (popup, 0, _("Key Attributes"));  
                 set_menu_text_bypos (popup, 6, _("Add"));  
                 set_menu_text_bypos (popup, 19, _("Send to Keyserver"));  
                   
                 set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));  
                   
                 idx = listview_get_curr_pos (kmi->lv);  
                 if (km_check_for_seckey (kmi->lv, idx, &i))  
1120                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1121                  if (i == 0)                  if (i == 0)
1122                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1123                  if (!km_check_for_seckey (kmi->lv, idx, NULL)) {                  if (!km_check_for_seckey (kmi->lv, l_idx, NULL)) {
1124                      set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
1125                      set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1126                      set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);
1127                      set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1128                      set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
1129                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1130                  }                  }
1131                  else if( km_check_for_seckey (kmi->lv, idx, NULL)                  else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1132                        && km_key_is_v3 (kmi->lv, idx)) {                           km_key_is_v3 (kmi->lv, l_idx)) {
1133                      /* PGP 2 keys, version 3 have no no support for photo-id's,                      /* PGP 2 keys, version 3 have no no support for photo-id's,
1134                         designated revokers and secondary keys. */                         designated revokers and secondary keys. */
1135                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1136                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1137                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
1138                  }                  }
1139                  if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )                  if (km_get_key_status( kmi->lv, l_idx ) & KM_FLAG_DISABLED)
1140                      set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED);
1141                  else                  else
1142                      set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED);
1143                  if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)                  if (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED ||
1144                        km_get_key_status (kmi->lv, l_idx) & KM_FLAG_EXPIRED)
1145                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1146                  if (mapi_init())                  if (!clip_contains_pgpkey ())
1147                        set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1148                    if (mapi_init ())
1149                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1150                  /* Override 'Default Keyserver' with the actual name. */                  /* Override 'Default Keyserver' with the actual name. */
1151                  host = kserver_get_hostname (0, -1, &port);                  host = kserver_get_hostname (0, -1, &port);
1152                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);
1153                  popup_gpg_readonly (dlg, popup);                  popup_gpg_readonly (dlg, popup);
1154                    if (listview_count_items (kmi->lv, 1) > 1)
1155                        popup_multiple (dlg, popup);
1156                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
1157                  DestroyMenu (popup);                  DestroyMenu (popup);
1158                  DestroyMenu (hm);                  DestroyMenu (hm);
1159                  return TRUE;                  return TRUE;
1160              }              }
             #if 0 /* XXX */  
             if( notify->idFrom == IDC_KEYMISC_GROUP ) {  
                 HWND tree = GetDlgItem( dlg, IDC_KEYMISC_GROUP );  
                 if( TreeView_GetSelection( tree ) ) {  
                     GetCursorPos( &p );  
                     hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );  
                     popup = GetSubMenu( hm, 0 );  
                     if( km_index == -1 )  
                         set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );  
                     set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );  
                     set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );  
                     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );  
                     DestroyMenu( popup );  
                     DestroyMenu( hm );  
                     return TRUE;  
                 }  
             }  
             #endif  
1161              break;              break;
1162    
1163          case LVN_COLUMNCLICK:          case LVN_COLUMNCLICK:
1164              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1165                  NMLISTVIEW * nml = (LPNMLISTVIEW) lparam;                  NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1166                  int sortby = 0;                  int sortby = 0;
1167                  switch (nml->iSubItem) {                  switch (nft->iSubItem) {
1168                  case 0:  sortby = KEY_SORT_USERID; break;                  case 0:  sortby = KEY_SORT_USERID; break;
1169                  case 1:  sortby = KEY_SORT_KEYID; break;                  case 1:  sortby = KEY_SORT_KEYID; break;
1170                  case 2:  sortby = KEY_SORT_IS_SECRET; break;                  case 2:  sortby = KEY_SORT_IS_SECRET; break;
# Line 1016  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1186  keymanager_dlg_proc (HWND dlg, UINT msg,
1186              break;              break;
1187          }          }
1188          break;          break;
         }  
1189    
1190      case WM_WINDOWPOSCHANGING:      case WM_WINDOWPOSCHANGING:
1191          if (((WINDOWPOS*)lparam)->cx < 400)          if (((WINDOWPOS*)lparam)->cx < 400)
# Line 1030  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1199  keymanager_dlg_proc (HWND dlg, UINT msg,
1199          return TRUE;          return TRUE;
1200                    
1201      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
1202          if( LOWORD (wparam) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
1203              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1204          return FALSE;          return FALSE;
1205                    
1206      case WM_MENUSELECT:      case WM_MENUSELECT:
1207          menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));          change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1208            change_key_menu ((HMENU)lparam, LOWORD (wparam));
1209          break;          break;
1210    
1211      case WM_INITMENUPOPUP:      case WM_INITMENUPOPUP:
1212          if ((UINT)LOWORD (lparam) == 3) {          if ((UINT)LOWORD (lparam) == 3) {
1213              HMENU m = (HMENU)wparam;              HMENU h = (HMENU)wparam;
1214              set_menu_text_bypos (m, 0, _("New"));              set_menu_text_bypos (h, 0, _("New"));
1215          }          }
1216          return FALSE;          return FALSE;
1217    
1218      case WM_COMMAND:      case WM_COMMAND:
1219          if( gnupg_access_keyring( 1 ) ) {          /* Allow at least 'Exit' in such a case. */
1220              msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1221                msg_box (dlg, _("Could not access public keyring"),
1222                         _("Key Manager"), MB_ERR);
1223              return FALSE;              return FALSE;
1224          }          }
1225          do_check_cache( kmi->lv, dlg, kmi->statbar );          do_check_cache (kmi->lv, dlg, kmi->statbar);
1226          switch( LOWORD( wparam ) ) {          switch( LOWORD (wparam)) {
1227          case ID_KEYMISC_QUIT:          case ID_KEYMISC_QUIT:
1228              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1229              return TRUE;              return TRUE;
1230                            
1231          case ID_KEYMISC_MAIL:          case ID_KEYMISC_MAIL:
# Line 1067  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1239  keymanager_dlg_proc (HWND dlg, UINT msg,
1239              break;              break;
1240    
1241          case ID_KEYMISC_DELETE:          case ID_KEYMISC_DELETE:
1242              km_delete_keys (kmi->lv, dlg);          case ID_KEYMISC_DELETE2:
1243                if (!km_delete_keys (kmi->lv, dlg))
1244                    km_update_status_bar (kmi->statbar, kmi->lv);
1245              return TRUE;              return TRUE;
1246                            
1247          case ID_KEYMISC_SIGN:                  case ID_KEYMISC_SIGN:
1248              if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {              if (kmi->lv_idx == -1) {
1249                  msg_box( dlg, _("Please select a key."),  _("Key Manager"),                  msg_box (dlg, _("Please select a key."),  
1250                           MB_ERR );                           _("Key Manager"), MB_ERR);
1251                  return TRUE;;                  return TRUE;
1252              }              }
1253              if (km_check_key_status (kmi->lv, idx))              if (km_check_key_status (kmi->lv, kmi->lv_idx))
1254                  return TRUE;                  return TRUE;
1255              key = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1256              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1257              k.ctx = key;              k.ctx = key;
1258              k.keyid = keyid;              k.keyid = key->subkeys->keyid;
1259              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
1260                                keysign_dlg_proc, (LPARAM)&k,                                keysign_dlg_proc, (LPARAM)&k,
1261                                _("Key Signing"), IDS_WINPT_KEYSIGN);                                _("Key Signing"), IDS_WINPT_KEYSIGN);
1262              if (k.update)              if (k.update)
1263                  update_key (kmi->lv, idx, k.keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.keyid, 0);
1264              return TRUE;              return TRUE;
1265                            
1266          case ID_KEYMISC_REVCERT:          case ID_KEYMISC_REVCERT:
1267              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1268              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1269                  return TRUE;                  return TRUE;
1270              }              }
1271              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              listview_get_item_text (kmi->lv, kmi->lv_idx, 0, uid, sizeof uid-1);
1272              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, sizeof keyid-1);
1273              if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if ( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1274                  msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("There is no secret key available!"),
1275                            _("Key Manager"), MB_ERR);
1276                  return TRUE;                  return TRUE;
1277              }              }
1278                            
1279              {              {
1280                  char rinf[128];                  char state[64];
1281                  listview_get_item_text (kmi->lv, idx, 5, rinf, sizeof (rinf) -1);                  listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1282                  if (strchr (rinf, 'R')) {                                          state, sizeof (state) -1);
1283                    if( strchr (state, 'R' )) {
1284                      msg_box (dlg, _("Key already revoked!"),                      msg_box (dlg, _("Key already revoked!"),
1285                               _("Key Manager"), MB_INFO);                               _("Key Manager"), MB_INFO);
1286                      return TRUE;                      return TRUE;
# Line 1116  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1290  keymanager_dlg_proc (HWND dlg, UINT msg,
1290              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1291              k.key_pair = 1;              k.key_pair = 1;
1292              k.keyid = keyid;              k.keyid = keyid;
1293              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1294              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
1295                               key_revoke_dlg_proc, (LPARAM)&k,                               key_revoke_dlg_proc, (LPARAM)&k,
1296                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);
1297              return TRUE;              return TRUE;
1298                            
1299          case ID_KEYMISC_TRUSTPATH:          case ID_KEYMISC_TRUSTPATH:
1300              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1301              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1302                  return TRUE;                  return TRUE;
1303              }              }
1304              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              listview_get_item_text( kmi->lv, kmi->lv_idx, 0, uid, sizeof uid -1 );
1305              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );              listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, sizeof keyid -1 );
1306              if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1307                  msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );                  msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );
1308                  return FALSE;                  return TRUE;
1309              }              }
1310              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1311              k.keyid = keyid;              k.keyid = keyid;
# Line 1142  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1315  keymanager_dlg_proc (HWND dlg, UINT msg,
1315                                _("List Trust Path"), IDS_WINPT_KEYTRUST );                                _("List Trust Path"), IDS_WINPT_KEYTRUST );
1316              return TRUE;              return TRUE;
1317                            
1318          case ID_KEYMISC_CHECKSIGS:          case ID_KEYMISC_CHECKSIGS:          
1319              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1320              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1321                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1322              }              }
1323              listview_get_item_text (kmi->lv, idx, 0, uid, DIM (uid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 0, uid, DIM (uid)-1);
1324              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1325              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1326              k.keyid = keyid;              k.keyid = keyid;
1327              k.uid = uid;              k.uid = uid;
1328              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1329              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
1330                                keysig_dlg_proc, (LPARAM)&k,                                keysig_dlg_proc, (LPARAM)&k,
1331                                _("Key Signature List" ), IDS_WINPT_KEYSIG);                                _("Key Signature List" ), IDS_WINPT_KEYSIG);
1332              return TRUE;              return TRUE;
1333                            
1334          case ID_KEYMISC_PROPS:          case ID_KEYMISC_PROPS:      
1335              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
             if( idx == -1 ) {  
1336                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1337                  return FALSE;                  return TRUE;
1338              }              }
1339              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1340              listview_get_item_text (kmi->lv, idx, 2, type, DIM (type)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 2, type, DIM (type)-1);
1341              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1342              k.key_pair = 0;              k.key_pair = 0;
1343              k.keyid = keyid;              k.keyid = keyid;
1344              if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )              if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )
1345                  k.key_pair = 1;                  k.key_pair = 1;
1346              k.callback.ctl = kmi->lv;              k.callback.ctl = kmi->lv;
1347              k.callback.idx = idx;              k.callback.idx = kmi->lv_idx;
1348              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1349              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
1350                                keyprops_dlg_proc, (LPARAM)&k,                                keyprops_dlg_proc, (LPARAM)&k,
1351                                _("Key Properties"), IDS_WINPT_KEYPROPS );                                _("Key Properties"), IDS_WINPT_KEYPROPS );
1352              if (k.callback.new_val != 0) {              if (k.callback.new_val != 0) {
1353                  t = get_key_trust_str (k.callback.new_val);                  t = get_key_trust_str (k.callback.new_val);
1354                  listview_add_sub_item (kmi->lv, idx, 6, t);                  listview_add_sub_item (kmi->lv, kmi->lv_idx, 6, t);
1355              }              }
1356              return TRUE;              return TRUE;
1357                            
1358          case ID_KEYMISC_RECACHE:          case ID_KEYMISC_RECACHE:
1359              /* If there is already a reload request, don't bother the user with a message. */              /* If there is already a reload request, don't bother the user with a message. */
1360              if (keycache_get_reload () == 1)              if (keycache_get_reload() == 1)
1361                  idx = IDYES;                  l_idx = IDYES;
1362              else {              else {
1363                  char inf[256];                  char inf[256];
1364                  _snprintf (inf, sizeof (inf) -1,                  _snprintf (inf, sizeof (inf) -1,
1365                             _("This is only useful when the keyring has been "                             _("This is only useful when the keyring has been "
1366                               "modified (sign a key...).\n"                               "modified (sign a key...).\n"
1367                               "Do you really want to reload the keycache?"));                               "Do you really want to reload the keycache?"));
1368                  idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);                  l_idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);
1369              }              }
1370              if( idx == IDYES ) {              if (l_idx == IDYES) {
1371                  rcs.kr_reload = rcs.kr_update = 1;                  rcs.kr_reload = rcs.kr_update = 1;
1372                  rcs.tr_update = 0;                  rcs.tr_update = 0;
1373                  DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,                  DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
1374                                  keycache_dlg_proc, (LPARAM)&rcs );                                  keycache_dlg_proc, (LPARAM)&rcs);
1375                  c = keycache_get_ctx( 1 );                  c = keycache_get_ctx (1);
1376                  if( !c )                  if (!c)
1377                      BUG( dlg );                      BUG (dlg);
1378                  keylist_reload( kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID );                  keylist_reload (kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID);
1379                  refresh_keys = 0;                  refresh_keys = 0;
1380              }              }
1381              return TRUE;              return TRUE;
1382                            
1383          case ID_KEYMISC_REBUILD:          case ID_KEYMISC_REBUILD:
1384              name=NULL;              name = NULL;
1385              gpg_rebuild_cache (&name);              gpg_rebuild_cache (&name);
1386              if (name) {              if (name != NULL) {
1387                  char *p = strchr (name, '\n');                  char *line = strchr (name, '\n');
1388                  show_msg (dlg, 2000, p? name + (p-name)+1 : name);                  show_msg (dlg, 2000, line? name + (line-name)+1 : name);
1389                  free (name);                  safe_free (name);
1390              }              }
1391              return TRUE;              return TRUE;
1392                            
1393          case ID_KEYMISC_NEWKEY:          case ID_KEYMISC_NEWKEY:
1394              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1395              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1396                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1397                                IDS_WINPT_KEYGEN);                                IDS_WINPT_KEYGEN);
1398              if (genkey.newkey != NULL)              if (genkey.newkey != NULL) {
1399                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1400                    keylist_sort (kmi->lv, KEY_SORT_USERID);
1401                }
1402              return TRUE;              return TRUE;
1403    
1404          case ID_KEYMISC_CARDNEW:          case ID_KEYMISC_CARDNEW:
1405              if( !scard_support ) {              if (!scard_support) {
1406                  msg_box( dlg, _("Smart Card support is not available."), _("Key Manager"), MB_INFO );                  msg_box (dlg, _("Smart Card support is not available."),
1407                             _("Key Manager"), MB_INFO);
1408                  return TRUE;                  return TRUE;
1409              }              }
1410              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1411                                card_keygen_dlg_proc, 0, _("Card Key Generation"),                                card_keygen_dlg_proc, 0, _("Card Key Generation"),
1412                                IDS_WINPT_CARD_KEYGEN );                                IDS_WINPT_CARD_KEYGEN);
1413              /* XXX: use new code */              /* XXX: use new code */
1414              if( keycache_get_reload() )              if (keycache_get_reload ())
1415                  send_cmd_id( dlg, ID_KEYMISC_RECACHE );                  send_cmd_id (dlg, ID_KEYMISC_RECACHE);
1416              return TRUE;              return TRUE;
1417    
1418          case ID_KEYMISC_KEYWIZARD:          case ID_KEYMISC_KEYWIZARD:
1419              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1420              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1421                                keygen_wizard_dlg_proc, (LPARAM)&genkey, _("Key Generation Wizard"),                                keygen_wizard_dlg_proc, (LPARAM)&genkey,
1422                                  _("Key Generation Wizard"),
1423                                IDS_WINPT_KEYWIZARD);                                IDS_WINPT_KEYWIZARD);
1424              if (genkey.newkey != NULL)              if (genkey.newkey != NULL) {
1425                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1426                    keylist_sort (kmi->lv, KEY_SORT_USERID);
1427                }
1428              return TRUE;              return TRUE;
1429                            
1430          case ID_KEYMISC_SENDRECV:          case ID_KEYMISC_SENDRECV:
1431              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,              memset (&genkey, 0, sizeof (genkey));
1432                                keyserver_dlg_proc, 0, _("Keyserver Access"),              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1433                                IDS_WINPT_KEYSERVER );                                keyserver_dlg_proc, (LPARAM)&genkey, _("Keyserver Access"),
1434                                  IDS_WINPT_KEYSERVER);
1435                if (genkey.newkey != NULL) {
1436                    keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1437                    keylist_sort (kmi->lv, KEY_SORT_USERID);
1438                }
1439              return TRUE;              return TRUE;
1440                            
1441          case ID_KEYMISC_GPGPREFS:          case ID_KEYMISC_GPGPREFS:
# Line 1282  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1464  keymanager_dlg_proc (HWND dlg, UINT msg,
1464              break;              break;
1465                            
1466          case ID_KEYMISC_EXPORT:          case ID_KEYMISC_EXPORT:
1467              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
             if (idx == -1) {  
1468                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1469                  return TRUE;                  return TRUE;
1470              }              }
1471              if (listview_count_items (kmi->lv, 1) > 1)              if (listview_count_items (kmi->lv, 1) > 1)
1472                  name = m_strdup ("Exported_GPG_Keys.asc");                  name = m_strdup ("Exported_GPG_Keys.asc");
1473              else {              else {
1474                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1475                  name = gen_export_filename (keyid, 0);                  name = gen_export_filename (keyid, 0);
1476              }              }
1477              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
# Line 1301  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1482  keymanager_dlg_proc (HWND dlg, UINT msg,
1482              return TRUE;              return TRUE;
1483                            
1484          case ID_KEYMISC_EXPORT_PRIVKEY:          case ID_KEYMISC_EXPORT_PRIVKEY:
1485              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1486              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1487                  return TRUE;                  return TRUE;
1488              }              }
1489              if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1490                  msg_box( dlg, _("There is no corresponding secret key for this key."),                  msg_box (dlg, _("There is no corresponding secret key for this key."),
1491                          _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1492                  return TRUE;                  return TRUE;
1493              }              }
1494              if( listview_count_items( kmi->lv, 1 ) > 1 ) {              if (listview_count_items (kmi->lv, 1) > 1) {
1495                  msg_box( dlg, _("You can only export one secret key."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("You can only export one secret key."),
1496                             _("Key Manager"), MB_ERR);
1497                  return TRUE;                  return TRUE;
1498              }              }
1499              idx = msg_box( dlg,              i = msg_box (dlg,
1500                            _("This operation will export your *SECRET* key!\n\n"                            _("This operation will export your *SECRET* key!\n\n"
1501                              "Never send this key to ANYONE, it should be available\n"                              "Never send this key to ANYONE, it should be available\n"
1502                              "ONLY on your machine and you may use this function\n"                              "ONLY on your machine and you may use this function\n"
1503                              "to copy the key to a safe place.\n\n"                              "to copy the key to a safe place.\n\n"
1504                              "Do you really want to export the key?"),                              "Do you really want to export the key?"),
1505                            _("WARNING"), MB_INFO|MB_YESNO );                            _("WARNING"), MB_INFO|MB_YESNO);
1506              if( idx == IDYES ) {              if( i == IDYES ) {
1507                  idx = listview_get_curr_pos( kmi->lv );                  listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, sizeof (keyid)-8 );
                 listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof (keyid)-8 );  
1508                  name = gen_export_filename (keyid, 1);                  name = gen_export_filename (keyid, 1);
1509                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1510                  if (t != NULL)                            if (t != NULL)          
1511                      km_privkey_export (dlg, kmi->lv, t);                      km_privkey_export (dlg, kmi->lv, t);
1512              }              }
1513              return TRUE;              return TRUE;
1514    
1515          case ID_KEYMISC_INFO:          case ID_KEYMISC_INFO:
1516              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1517                                about_winpt_dlg_proc, 0, _("About WinPT"),                                about_winpt_dlg_proc, 0, _("About WinPT"),
1518                                IDS_WINPT_ABOUT );                                IDS_WINPT_ABOUT);
1519              break;              break;
1520    
1521          case ID_KEYMISC_HELP:          case ID_KEYMISC_HELP:
# Line 1348  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1528  keymanager_dlg_proc (HWND dlg, UINT msg,
1528                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );
1529              break;              break;
1530    
1531          case ID_KEYMISC_EDITKEY:          case ID_KEYMISC_EDITKEY:          
1532              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1)
             if (idx == -1)  
1533                  break;                  break;
1534              listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, sizeof (keyid)-1);
1535              /* XXX: pub/crd = secret key does not work */              /* XXX: pub/crd = secret key does not work */
1536              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1537              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1538              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1539              k.keyid = keyid;              k.keyid = keyid;
1540              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1541              k.flags = km_get_key_status (kmi->lv, idx);              k.flags = km_get_key_status (kmi->lv, kmi->lv_idx);
1542              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1543                                keyedit_main_dlg_proc, (LPARAM)&k,                                keyedit_main_dlg_proc, (LPARAM)&k,
1544                                _("Key Edit"), IDS_KEYCTX_EDIT);                                _("Key Edit"), IDS_KEYCTX_EDIT);
1545              if (k.update)              if (k.update)
1546                  update_key (kmi->lv,  idx, keyid, 1);                  update_key (kmi->lv,  kmi->lv_idx, keyid, 1);
1547              break;              break;
1548                            
1549          case ID_KEYMISC_COPY:          case ID_KEYMISC_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1550              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1551              break;              break;
1552                            
# Line 1377  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1555  keymanager_dlg_proc (HWND dlg, UINT msg,
1555              break;              break;
1556    
1557          case ID_KEYMISC_PASTE:          case ID_KEYMISC_PASTE:
             km_index = -1;  
1558              km_clip_import (dlg);              km_clip_import (dlg);
1559              break;              break;
1560                            
1561          case ID_KEYCTX_SETPREFKS:          case ID_KEYCTX_SETPREFKS:
1562              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM(keyid)-1);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM(keyid)-1);
1563              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1564              k.keyid = keyid;              k.keyid = keyid;
1565              keyedit_set_pref_keyserver (&k, dlg);              keyedit_set_pref_keyserver (&k, dlg);
# Line 1390  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1567  keymanager_dlg_proc (HWND dlg, UINT msg,
1567    
1568          case ID_KEYMISC_REFRESH_KEYS:          case ID_KEYMISC_REFRESH_KEYS:
1569              if (listview_count_items (kmi->lv, 1) == 0) {              if (listview_count_items (kmi->lv, 1) == 0) {
1570                  msg_box (dlg, _("No key was selected, select all by default."), _("Key Manager"), MB_INFO);                  msg_box (dlg, _("No key was selected, select all by default."),
1571                             _("Key Manager"), MB_INFO);
1572                  listview_select_all (kmi->lv);                  listview_select_all (kmi->lv);
1573              }              }
1574              km_refresh_from_keyserver (kmi->lv, dlg);              km_refresh_from_keyserver (kmi->lv, dlg);
# Line 1431  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1609  keymanager_dlg_proc (HWND dlg, UINT msg,
1609              break;              break;
1610    
1611          case ID_KEYCTX_ADDKEY:          case ID_KEYCTX_ADDKEY:
1612              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1613              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1614              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1615              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1616              k.keyid = keyid;              k.keyid = keyid;
1617              keyedit_add_subkey (&k, dlg, NULL);              keyedit_add_subkey (&k, dlg, NULL);
1618              if (k.update)              if (k.update)
1619                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1620              break;              break;
1621    
1622          case ID_KEYCTX_ADDUID:          case ID_KEYCTX_ADDUID:
1623              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1624              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1625              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1626              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1627              k.keyid = keyid;              k.keyid = keyid;
1628              keyedit_add_userid (&k, dlg, NULL);              keyedit_add_userid (&k, dlg, NULL);
1629              if (k.update)              if (k.update)
1630                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1631              break;              break;
1632    
1633          case ID_KEYCTX_ADDREV:          case ID_KEYCTX_ADDREV:
1634              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1635              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1636              k.keyid = keyid;              k.keyid = keyid;
1637              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1638              k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );              k.key_pair = km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL );
1639              keyedit_add_revoker (&k, dlg);              keyedit_add_revoker (&k, dlg);
1640              if (k.update)              if (k.update)
1641                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1642              break;              break;
1643    
1644          case ID_KEYCTX_ADDPHOTO:          case ID_KEYCTX_ADDPHOTO:
1645              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1646              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1647              k.keyid = keyid;              k.keyid = keyid;
1648              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1649              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1650              keyedit_add_photo (&k, dlg);              keyedit_add_photo (&k, dlg);
1651              if (k.update)              if (k.update)
1652                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1653              break;              break;
1654    
1655          case ID_KEYCTX_KS_NL:          case ID_KEYCTX_KS_NL:
# Line 1497  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1671  keymanager_dlg_proc (HWND dlg, UINT msg,
1671          case ID_KEYCTX_UID_COPY:          case ID_KEYCTX_UID_COPY:
1672              /* XXX: add generic function to support multiple selection              /* XXX: add generic function to support multiple selection
1673                      with a callback */                      with a callback */
1674              idx = listview_get_curr_pos( kmi->lv );              listview_get_item_text( kmi->lv, kmi->lv_idx, 0, uid, sizeof uid-1 );
             listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );  
1675              set_clip_text( NULL, uid, strlen( uid ) );              set_clip_text( NULL, uid, strlen( uid ) );
1676              break;              break;
1677    
1678          case ID_KEYCTX_KEYID_COPY:          case ID_KEYCTX_KEYID_COPY:
1679              idx = listview_get_curr_pos( kmi->lv );              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1);
1680              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              set_clip_text (NULL, uid, strlen (uid));
             set_clip_text( NULL, uid, strlen( uid ) );  
1681              break;              break;
1682    
1683          case ID_KEYCTX_FPR_COPY:          case ID_KEYCTX_FPR_COPY:
1684              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);        
             key = (gpgme_key_t) listview_get_item2 (kmi->lv, idx);          
1685              if (key) {              if (key) {
1686                  const char * s = get_key_fpr (key);                  t = get_key_fpr (key);
1687                  set_clip_text (NULL, s? s : "", s? strlen (s): 0);                  set_clip_text (NULL, t? t : "", t? strlen (t): 0);
1688              }              }
1689              break;              break;
1690    
1691          case ID_KEYCTX_KINFO_COPY:          case ID_KEYCTX_KINFO_COPY:
1692              idx = listview_get_curr_pos( kmi->lv );              listview_get_item_text( kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1 );
             listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );  
1693              km_set_clip_info( uid );                      km_set_clip_info( uid );        
1694              break;              break;
1695    
1696          case ID_KEYCTX_COPY:          case ID_KEYCTX_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1697              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1698              break;              break;
1699    
1700          case ID_KEYCTX_PASTE:            case ID_KEYCTX_PASTE:
             km_index = -1;  
1701              km_clip_import (dlg);              km_clip_import (dlg);
1702              break;              break;
1703    
1704          case ID_KEYCTX_DISABLE:          case ID_KEYCTX_DISABLE:
             idx = listview_get_curr_pos (kmi->lv);  
             km_enable_disable_key (kmi->lv, dlg, idx, 0);  
             break;  
   
1705          case ID_KEYCTX_ENABLE:          case ID_KEYCTX_ENABLE:
1706              idx = listview_get_curr_pos (kmi->lv);              i = LOWORD (wparam) == ID_KEYCTX_ENABLE? 1 : 0;
1707              km_enable_disable_key (kmi->lv, dlg, idx, 1);              listview_get_item_text (kmi->lv, kmi->lv_idx, KM_COL_KEYID,
1708                                        keyid, DIM (keyid)-1);
1709                rc = km_enable_disable_key (kmi->lv, dlg, kmi->lv_idx, i);
1710                if (!rc)
1711                    update_key (kmi->lv, kmi->lv_idx, keyid, 0);
1712                /* XXX: switching a key from disabled -> enabled. does not
1713                   change the validity field in the KM. */
1714              break;              break;
1715    
1716          case ID_KEYCTX_LISTSIGS:          case ID_KEYCTX_LISTSIGS:
# Line 1548  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1718  keymanager_dlg_proc (HWND dlg, UINT msg,
1718              break;              break;
1719    
1720          case ID_KEYCTX_MAXTRUST:          case ID_KEYCTX_MAXTRUST:
1721              idx = listview_get_curr_pos (kmi->lv);              listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1722              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              rc = km_set_implicit_trust (dlg, kmi->lv, kmi->lv_idx);
             rc = km_set_implicit_trust (dlg, kmi->lv, idx);  
1723              if (!rc)              if (!rc)
1724                  update_key (kmi->lv, idx, keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, keyid, 0);
1725              break;              break;
1726    
1727          case ID_KEYCTX_SETDEFKEY:          case ID_KEYCTX_SETDEFKEY:
1728              idx = listview_get_curr_pos (kmi->lv);              if (!km_check_key_status (kmi->lv, kmi->lv_idx)) {
1729              if (!km_check_key_status (kmi->lv, idx)) {                  listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
                 listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1730                  rc = set_gnupg_default_key (keyid);                  rc = set_gnupg_default_key (keyid);
1731                  if (rc)                  if (rc)
1732                      msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);                      msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1733                  km_update_default_key_str (kmi->statbar);                  km_update_default_key_str (kmi->statbar);
1734              }              }
1735              break;              break;
1736    
         #if 0 /* XXX */  
1737          case ID_GROUP_NEW:          case ID_GROUP_NEW:
             memset (&gcb, 0, sizeof (gcb));  
             gcb.gc = gc;  
             dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GROUP, glob_hwnd,  
                              group_manager_dlg_proc, (LPARAM)&gcb, _("New Group"),  
                              IDS_WINPT_GROUP);  
             if( gcb.use_name )  
                 treeview_add_item( GetDlgItem(dlg, IDC_KEYMISC_GROUP), NULL, gcb.name );  
             return TRUE;  
               
1738          case ID_GROUP_PASTE:          case ID_GROUP_PASTE:
             km_groups_add (gc, kmi->lv, km_index);  
             break;  
               
1739          case ID_GROUP_DELETE:          case ID_GROUP_DELETE:
1740              km_groups_del (gc);              /* XXX: Implement group manager. */
1741              break;              return TRUE;
         #endif  
1742          }          }
1743                    
1744          break;          break;
# Line 1592  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1746  keymanager_dlg_proc (HWND dlg, UINT msg,
1746            
1747      return FALSE;      return FALSE;
1748  }  }
   
   
   

Legend:
Removed from v.104  
changed lines
  Added in v.128

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26