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

Diff of /trunk/Src/wptListView.cpp

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

revision 36 by werner, Thu Oct 27 15:25:13 2005 UTC revision 351 by twoaday, Thu Dec 1 20:10:25 2011 UTC
# Line 1  Line 1 
1  /* wptListView.cpp - Dynamic list view control  /* wptListView.cpp - Dynamic list view control
2   *      Copyright (C) 2000-2005 Timo Schulz   *      Copyright (C) 2000-2007, 2009 Timo Schulz
3   *      Copyright (C) 2004 Andreas Jobs   *      Copyright (C) 2004 Andreas Jobs
4   *   *
5   * This file is part of WinPT.   * This file is part of WinPT.
# Line 13  Line 13 
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15   * General Public License for more details.   * General Public License for more details.
  *  
  * You should have received a copy of the GNU General Public License  
  * along with WinPT; if not, write to the Free Software Foundation,  
  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  
16   */   */
17  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
18  #include <config.h>  #include <config.h>
19  #endif  #endif
20    
21  #include <stdio.h>  #include <stdio.h>
 #include <stdio.h>  
22  #include <windows.h>  #include <windows.h>
23  #include <commctrl.h>  #include <commctrl.h>
24    
# Line 34  Line 29 
29  #include "wptTypes.h"  #include "wptTypes.h"
30  #include "wptGPG.h"  #include "wptGPG.h"
31  #include "wptKeylist.h"  #include "wptKeylist.h"
32  #include "../resource.h"  #include "wptUTF8.h"
33    #include "resource.h"
34    
35    
36  int  void
37  listview_new( listview_ctrl_t *ctx )  listview_new (listview_ctrl_t *ctx, HWND ctrl)
38  {  {
39      struct listview_ctrl_s *c;      struct listview_ctrl_s *c;
40    
41      c = new struct listview_ctrl_s;      c = new struct listview_ctrl_s;
42      if( !c )      if (!c)
43          BUG( NULL );          BUG (NULL);
44      c->cols = 0;      memset (c, 0, sizeof *c);
45      c->items = 0;      c->ctrl = ctrl? ctrl : NULL;
46      c->ctrl = NULL;          c->hil = NULL;
47      *ctx = c;      *ctx = c;
48      return 0;  }
 } /* listview_new */  
49    
50    
51  void  void
52  listview_release( listview_ctrl_t ctx )  listview_release (listview_ctrl_t ctx)
53  {  {
54      if( ctx ) {      if (!ctx)
55          ctx->cols = 0;          return;
56          ctx->ctrl = NULL;  
57          ctx->items = 0;      ctx->cols = 0;
58          delete ctx;      ctx->ctrl = NULL;
59          ctx = NULL;      ctx->items = 0;
60      }      if (ctx->hil)
61  } /* listview_release */          ImageList_Destroy (ctx->hil);
62        delete ctx;
63    }
64    
65    
66    int
67    listview_set_column_width (listview_ctrl_t ctx, int col, int width)
68    {
69        LVCOLUMN lvc;
70    
71        memset (&lvc, 0, sizeof (lvc));
72        lvc.mask = LVCF_WIDTH;
73        lvc.cx = width;
74        ListView_SetColumn (ctx->ctrl, col, &lvc);
75        return 0;
76    }
77    
78    
79  int  int
# Line 72  listview_add_column (listview_ctrl_t ctx Line 82  listview_add_column (listview_ctrl_t ctx
82      int rc = 0;      int rc = 0;
83      LV_COLUMN lvc;      LV_COLUMN lvc;
84    
85      memset( &lvc, 0, sizeof lvc );      memset (&lvc, 0, sizeof lvc);
86      lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;      lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
87      lvc.pszText = col->fieldname;      lvc.pszText = col->fieldname;
88      lvc.cx = col->width;      lvc.cx = col->width;
89      lvc.fmt = LVCFMT_LEFT;      lvc.fmt = LVCFMT_LEFT;
90      lvc.iSubItem = col->pos;      lvc.iSubItem = col->pos;
91      if( ListView_InsertColumn (ctx->ctrl, col->pos, &lvc) == -1)      if (ListView_InsertColumn (ctx->ctrl, col->pos, &lvc) == -1)
92          rc = 1;          rc = 1;
93      ctx->cols++;      ctx->cols++;
94      return rc;      return rc;
95  } /* listview_add_column */  }
96    
97    
98  int  int
# Line 93  listview_add_item_pos (listview_ctrl_t c Line 103  listview_add_item_pos (listview_ctrl_t c
103    
104      memset (&lvi, 0, sizeof lvi);      memset (&lvi, 0, sizeof lvi);
105      lvi.iItem = pos;      lvi.iItem = pos;
106      rc = ListView_InsertItem (ctx->ctrl, &lvi);      if (ListView_InsertItem (ctx->ctrl, &lvi) != pos)
107      if (rc == -1)          rc = -1;
         rc = 1;  
108      ctx->items++;      ctx->items++;
109      return rc;      return rc;
110  }  }
111    
112    
113  int  int
114  listview_add_item( listview_ctrl_t ctx, const char *text )  listview_add_item (listview_ctrl_t ctx, const char *text)
115  {  {
116      int rc = 0;      int rc = 0;
117      LV_ITEM lvi;      LV_ITEM lvi;
118    
119      memset( &lvi, 0, sizeof lvi );      memset (&lvi, 0, sizeof lvi);
120      lvi.mask = LVIF_TEXT;      lvi.mask = LVIF_TEXT;
121      lvi.pszText = (char *)text;      lvi.pszText = (char *)text;
122      rc = ListView_InsertItem( ctx->ctrl, &lvi );      rc = ListView_InsertItem (ctx->ctrl, &lvi);
123      if( rc == -1 )      if( rc == -1 )
124          rc = 1;          rc = 1;
125      ctx->items++;      ctx->items++;
126      return rc;      return rc;
127  } /* listview_add_item */  }
128    
129    
130  int  int
131  listview_add_item2 (listview_ctrl_t ctx, const char *text, void *magic)  listview_add_item_image (listview_ctrl_t ctx, const char *text, int image)
132  {  {
133      int rc = 0;      int rc = 0;
134      LV_ITEM lvi;      LV_ITEM lvi;
135    
136      memset( &lvi, 0, sizeof lvi );      memset( &lvi, 0, sizeof lvi );
137        lvi.mask = LVIF_TEXT | LVIF_IMAGE;
138        lvi.pszText = (char *)text;
139        lvi.iImage = image;
140        rc = ListView_InsertItem (ctx->ctrl, &lvi);
141        if (rc == -1)
142            rc = 1;
143        ctx->items++;
144        return rc;
145    }
146    
147    
148    int
149    listview_add_item2 (listview_ctrl_t ctx, const char *text, void *magic)
150    {
151        int rc = 0;
152        LVITEM lvi;
153    
154        memset (&lvi, 0, sizeof (lvi));
155      lvi.mask = LVIF_TEXT | LVIF_PARAM;      lvi.mask = LVIF_TEXT | LVIF_PARAM;
156      lvi.pszText = (char *)text;      lvi.pszText = (char *)text;
157      lvi.lParam = (LPARAM)magic;      lvi.lParam = (LPARAM)magic;
158      rc = ListView_InsertItem( ctx->ctrl, &lvi );      rc = ListView_InsertItem (ctx->ctrl, &lvi);
159      if( rc == -1 )      if (rc == -1)
160          rc = 1;          rc = 1;
161      ctx->items++;      ctx->items++;
162      return rc;      return rc;
163  } /* listview_add_item2 */  }
164    
165    
166  void*  void*
# Line 148  listview_get_item2 (listview_ctrl_t ctx, Line 175  listview_get_item2 (listview_ctrl_t ctx,
175      return (void*)lvi.lParam;      return (void*)lvi.lParam;
176  }  }
177    
178    
179  int  int
180  listview_set_item2 (listview_ctrl_t ctx, int pos, void *magic)  listview_set_item2 (listview_ctrl_t ctx, int pos, void *magic)
181  {  {
# Line 164  listview_set_item2 (listview_ctrl_t ctx, Line 192  listview_set_item2 (listview_ctrl_t ctx,
192    
193    
194  void  void
195  listview_add_sub_item( listview_ctrl_t ctx, int pos, int col, const char *text )  listview_add_sub_item (listview_ctrl_t ctx, int pos, int col, const char *text)
196  {        {
197      ListView_SetItemText( ctx->ctrl, pos, col, (char *)text );      ListView_SetItemText (ctx->ctrl, pos, col, (char*)text);
198  } /* listview_add_sub_item */  }
199    
200    
201  int  int
202  listview_count_items( listview_ctrl_t ctx, int curr_sel )  listview_count_items (listview_ctrl_t ctx, int curr_sel)
203  {        {      
204      int n;      int n;
205    
206      n = curr_sel? ListView_GetSelectedCount( ctx->ctrl ) :          n = curr_sel? ListView_GetSelectedCount( ctx->ctrl ) :    
207                    ListView_GetItemCount( ctx->ctrl );                    ListView_GetItemCount( ctx->ctrl );
208      return n;      return n;
209  } /* listview_count_items */  }
210    
211    
212    int
213    listview_del_column (listview_ctrl_t ctx, int pos)
214    {
215        ctx->cols--;
216        return ListView_DeleteColumn (ctx->ctrl, pos)? 0 : 1;
217    }
218    
219    
220    /* Delete a single item from @ctx at position @pos. */
221  int  int
222  listview_del_item( listview_ctrl_t ctx, int pos )  listview_del_item (listview_ctrl_t ctx, int pos)
223  {  {
224      int rc = 0;      int rc = 0;
225    
226      if( ListView_DeleteItem( ctx->ctrl, pos ) == -1 )      if (ListView_DeleteItem (ctx->ctrl, pos) == -1)
227          rc = 1;          rc = 1;
228      return rc;      return rc;
229  } /* listview_del_item */  }
230    
231    
232    /* Delete all selected items in @ctx. */
233  int  int
234  listview_del_items( listview_ctrl_t ctx )  listview_del_sel_items (listview_ctrl_t ctx)
235  {        {      
236      int i, n;      int i, n;
237    
     /* delete all selected entries */  
238      n = listview_count_items (ctx, 0);      n = listview_count_items (ctx, 0);
239      for( i = n;  i > 0; i-- ) {      for (i = n;  i > -1; i--) {
240          if ( listview_get_item_state( ctx, i ) )          if (listview_get_item_state (ctx, i))
241              listview_del_item( ctx, i );                      listview_del_item (ctx, i);
242      }      }
243      return 0;      return 0;
244  } /* listview_del_items */  }
245    
246    
247  int  int
248  listview_del_all( listview_ctrl_t ctx )  listview_del_all_items (listview_ctrl_t ctx)
249  {        {      
250      int rc = 0;      int rc = 0;
251    
252      if( ListView_DeleteAllItems( ctx->ctrl ) == FALSE )      if (ListView_DeleteAllItems (ctx->ctrl) == FALSE)
253          rc = 1;          rc = 1;
254      return rc;      return rc;
255  } /* listview_del_all */  }
256    
257    
258    /* Return the index of the selected item.
259       Support both selections and checkboxes. */
260  int  int
261  listview_get_item_state( listview_ctrl_t ctx, int pos )  listview_get_selected_item (listview_ctrl_t lv)
262  {        {
263      return ListView_GetItemState( ctx->ctrl, pos, LVIS_SELECTED );      int pos, i;
264  } /* listview_get_item_state */      
265        pos = listview_get_curr_pos (lv);
266        if (pos != -1)
267            return pos;
268        for (i=0; i < listview_count_items (lv, 0); i++) {
269            if (listview_get_item_state (lv, i))
270                return i;
271        }
272        return -1;
273    }
274    
275    
276    /* Return if the given element is selected or if the ext
277       style is used, if the checkbox is activated. */
278  int  int
279  listview_sort_items( listview_ctrl_t ctx, int sortby, listview_cmp sort_cb )  listview_get_item_state (listview_ctrl_t ctx, int pos)
280  {        {
281      HWND hheader;      int ret;
282      HDITEM hdi;      if (ctx->ext_chkbox)
283      int idx;          ret = ListView_GetCheckState (ctx->ctrl, pos);
284        else
285      ListView_SortItems (ctx->ctrl, sort_cb, sortby);          ret = ListView_GetItemState (ctx->ctrl, pos, LVIS_SELECTED);
286      hheader = ListView_GetHeader (ctx->ctrl);      return ret;
287      if (!hheader)  }
         return 0;  
   
     /* Remove image from all header fields */  
     memset (&hdi, 0, sizeof(hdi));  
   
     for (int i=0; i < 7; i++) {  
         hdi.mask = HDI_FORMAT;  
         Header_GetItem (hheader, i, &hdi);  
         hdi.fmt &= ~HDF_IMAGE;  
         Header_SetItem (hheader, i, &hdi);  
     }  
288    
     switch (sortby & ~KEYLIST_SORT_DESC) {  
     case KEY_SORT_USERID:    idx = 0; break;  
     case KEY_SORT_KEYID:     idx = 1; break;  
     case KEY_SORT_IS_SECRET: idx = 2; break;  
     case KEY_SORT_LEN:       idx = 3; break;  
     case KEY_SORT_VALIDITY:  idx = 5; break;  
     case KEY_SORT_OTRUST:    idx = 6; break;  
     case KEY_SORT_CREATED:   idx = 7; break;  
     case KEY_SORT_ALGO:      idx = 8; break;  
     default:                 idx = 0; break;  
     }  
289    
290      /* Set image to currently sorted field */  int
291      memset (&hdi, 0, sizeof(hdi));  listview_sort_items (listview_ctrl_t ctx, int sortby, listview_cmp sort_cb)
292      hdi.mask = HDI_IMAGE | HDI_FORMAT;  {
293      Header_GetItem (hheader, idx, &hdi);      ListView_SortItems (ctx->ctrl, sort_cb, sortby);
     hdi.fmt |= HDF_IMAGE | HDF_BITMAP_ON_RIGHT;  
     hdi.iImage = imagelist_getindex((sortby & KEYLIST_SORT_DESC) ?  
                                     IMI_SORT_DOWNARROW : IMI_SORT_UPARROW);  
     Header_SetItem (hheader, idx, &hdi);  
294      return 0;      return 0;
295  } /* listview_sort_items */  }
296    
297    
298  int  int
299  listview_get_curr_pos( listview_ctrl_t ctx )  listview_get_curr_pos (listview_ctrl_t ctx)
300  {        {      
301      return ListView_GetNextItem( ctx->ctrl, -1, LVNI_SELECTED );      return ListView_GetNextItem (ctx->ctrl, -1, LVNI_SELECTED);
302  } /* listview_get_curr_pos */  }
303    
304    
305  int  int
# Line 289  listview_get_item_text (listview_ctrl_t Line 313  listview_get_item_text (listview_ctrl_t
313      }      }
314      ListView_GetItemText (ctx->ctrl, pos, col, text, maxbytes);      ListView_GetItemText (ctx->ctrl, pos, col, text, maxbytes);
315      return 0;      return 0;
316  } /* listview_get_item_text */  }
317    
318    
319    /* Use extended style with checkboxes for each item. */
320  void  void
321  listview_set_ext_style( listview_ctrl_t ctx )  listview_set_chkbox_style (listview_ctrl_t ctx)
322  {        {
323      ListView_SetExtendedListViewStyle( ctx->ctrl, LVS_EX_FULLROWSELECT );      DWORD flag = LVS_EX_CHECKBOXES;
324  } /* listview_set_ext_style */      DWORD style;
325        style = ListView_GetExtendedListViewStyle (ctx->ctrl)|flag;    
326        ListView_SetExtendedListViewStyle (ctx->ctrl, style);
327        ctx->ext_chkbox = 1;
328    }
329    
330    
331    /* Use extended style to select the entire row. */
332    void
333    listview_set_ext_style (listview_ctrl_t ctx)
334    {
335        DWORD flag = LVS_EX_FULLROWSELECT;
336        DWORD style;
337        style = ListView_GetExtendedListViewStyle (ctx->ctrl)|flag;
338        ListView_SetExtendedListViewStyle (ctx->ctrl, style);
339    }
340    
341    
342    void
343    listview_set_grid_style (listview_ctrl_t ctx)
344    {
345        DWORD flag = LVS_EX_GRIDLINES;
346        DWORD style;
347        style = ListView_GetExtendedListViewStyle (ctx->ctrl)|flag;
348        ListView_SetExtendedListViewStyle (ctx->ctrl, style);
349    }
350    
351  int  int
352  listview_set_column_order( listview_ctrl_t ctx, int *array )  listview_set_column_order (listview_ctrl_t ctx, int *array)
353  {        {      
354      return ListView_SetColumnOrderArray( ctx->ctrl, ctx->cols, array );      return ListView_SetColumnOrderArray (ctx->ctrl, ctx->cols, array);
355  } /* listview_set_column_order */  }
356    
357    
358  void  void
359  listview_select_all (listview_ctrl_t ctx)  listview_select_all (listview_ctrl_t ctx)
360  {        {      
361      ListView_SetItemState( ctx->ctrl, -1, LVIS_SELECTED, LVIS_SELECTED );      ListView_SetItemState (ctx->ctrl, -1, LVIS_SELECTED, LVIS_SELECTED);
362  } /* listview_select_all */  }
363    
364    
365    void
366    listview_deselect_all (listview_ctrl_t ctx)
367    {
368        ListView_SetItemState (ctx->ctrl, -1, ~LVNI_SELECTED, LVNI_SELECTED);
369    }
370    
371    
372  void  void
373  listview_select_one (listview_ctrl_t ctx, int pos)  listview_select_one (listview_ctrl_t ctx, int pos)
374  {  {
375      ListView_SetItemState (ctx->ctrl, pos, LVIS_SELECTED|LVIS_FOCUSED, LVIS_FOCUSED|LVIS_SELECTED);      ListView_SetItemState (ctx->ctrl, pos, LVIS_SELECTED|LVIS_FOCUSED,
376                                                LVIS_FOCUSED|LVIS_SELECTED);
377  }  }
378    
379    
# Line 327  listview_scroll (listview_ctrl_t ctx, in Line 384  listview_scroll (listview_ctrl_t ctx, in
384            
385      if (oldpos == -1)      if (oldpos == -1)
386          oldpos = 0;          oldpos = 0;
     //log_box ("debug", 0, "oldpos=%d newpos=%d diff=%d", oldpos, newpos, newpos-oldpos);  
387      ListView_Scroll (ctx->ctrl, 0, (newpos-oldpos)*size);      ListView_Scroll (ctx->ctrl, 0, (newpos-oldpos)*size);
388  }  }
389    
390    
391    static int
392    listview_find_substr (listview_ctrl_t ctx, const char *str)
393    {
394        char buf[256];
395        int i, n, fnd = 0;
396    
397        /* We assume the first column contains text. */
398        n = listview_count_items (ctx, 0);
399        for (i = 0; i < n; i++) {
400            listview_get_item_text (ctx, i, 0, buf, DIM (buf)-1);
401            if (stristr (buf, str)) {
402                fnd = 1;
403                break;
404            }
405        }
406        if (!fnd)
407            i = -1; /* not found */
408        return i;
409    }
410    
411    
412  int  int
413  listview_find (listview_ctrl_t ctx, const char * str)  listview_find (listview_ctrl_t ctx, const char *str, int substr)
414  {  {
415      LVFINDINFO inf;      LVFINDINFO inf;
416      int pos;      int pos;
417    
418        /* XXX: allow to make a substring search. */
419      memset (&inf, 0, sizeof (inf));      memset (&inf, 0, sizeof (inf));
420      inf.flags = LVFI_STRING|LVFI_PARTIAL;      inf.flags = LVFI_STRING|LVFI_PARTIAL;
421      inf.psz = str;      inf.psz = str;
422      pos = ListView_FindItem (ctx->ctrl, -1, &inf);      pos = ListView_FindItem (ctx->ctrl, -1, &inf);
423        if (pos == -1 && substr)
424            pos = listview_find_substr (ctx, str);
425      return pos;      return pos;
426  }  }
427    
 /** Some functions to make the handling with TreeView Controls easier **/  
 int  
 treeview_add_item( HWND tree, HTREEITEM parent, const char *text )  
 {        
     TVINSERTSTRUCT tvis;  
           
     memset( &tvis, 0, sizeof tvis );  
     tvis.hParent = parent;  
     tvis.hInsertAfter = TVI_LAST;  
     tvis.item.mask = TVIF_TEXT;  
     tvis.item.pszText = (char *)text;  
     TreeView_InsertItem( tree, &tvis );  
428    
429      return 0;  void
430  } /* treeview_add_item */  listview_setview (listview_ctrl_t ctx, DWORD view)
431    {
432        DWORD style = GetWindowLong (ctx->ctrl, GWL_STYLE);
433        if ((style & LVS_TYPEMASK) != view)
434            SetWindowLong (ctx->ctrl, GWL_STYLE, (style & ~LVS_TYPEMASK) | view);
435    }
436    
437    
438    void
439    listview_set_image_list (listview_ctrl_t ctx, int cx, int cy,
440                             HICON *ico, DWORD nicons)
441    {
442        HIMAGELIST hil;
443    
444        if (cx <= 0 || cy <= 0)
445            cx = cy = 16; /* default size. */
446    
447        hil = ImageList_Create (cx, cy, ILC_COLOR8|ILC_MASK, nicons, 1);
448        ImageList_SetBkColor (hil, CLR_NONE);
449        for (DWORD i=0; i < nicons; i++)
450            ImageList_AddIcon (hil, ico[i]);    
451        (void)ListView_SetImageList (ctx->ctrl, hil, LVSIL_SMALL);    
452    }

Legend:
Removed from v.36  
changed lines
  Added in v.351

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26