/[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 12 by twoaday, Thu Apr 14 12:56:25 2005 UTC revision 304 by twoaday, Wed Mar 21 10:59:31 2007 UTC
# Line 1  Line 1 
 /* wptListView.cpp - Dynamic list view control  
  *      Copyright (C) 2000-2004 Timo Schulz  
  *      Copyright (C) 2004 Andreas Jobs  
  *  
  * This file is part of WinPT.  
  *  
  * WinPT is free software; you can redistribute it and/or  
  * modify it under the terms of the GNU General Public License  
  * as published by the Free Software Foundation; either version 2  
  * of the License, or (at your option) any later version.  
  *    
  * WinPT is distributed in the hope that it will be useful,  
  * but WITHOUT ANY WARRANTY; without even the implied warranty of  
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  
  * 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  
  */  
   
 #include <stdio.h>  
 #include <windows.h>  
 #include <commctrl.h>  
   
 #include "wptCommonCtl.h"  
 #include "wptW32API.h"  
 #include "wptVersion.h"  
 #include "wptErrors.h"  
 #include "wptTypes.h"  
 #include "wptGPG.h"  
 #include "wptKeylist.h"  
 #include "../resource.h"  
   
   
 int  
 listview_new( listview_ctrl_t *ctx )  
 {  
     struct listview_ctrl_s *c;  
   
     c = new struct listview_ctrl_s;  
     if( !c )  
         BUG( NULL );  
     c->cols = 0;  
     c->items = 0;  
     c->ctrl = NULL;      
     *ctx = c;  
     return 0;  
 } /* listview_new */  
   
   
 void  
 listview_release( listview_ctrl_t ctx )  
 {  
     if( ctx ) {  
         ctx->cols = 0;  
         ctx->ctrl = NULL;  
         ctx->items = 0;  
         delete ctx;  
         ctx = NULL;  
     }  
 } /* listview_release */  
   
   
 int  
 listview_add_column( listview_ctrl_t ctx, listview_column_t col )  
 {        
     int rc = 0;  
     LV_COLUMN lvc;  
   
     memset( &lvc, 0, sizeof lvc );  
     lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;  
     lvc.pszText = col->fieldname;  
     lvc.cx = col->width;  
     lvc.fmt = LVCFMT_LEFT;  
     lvc.iSubItem = col->pos;  
     if( ListView_InsertColumn( ctx->ctrl, col->pos, &lvc ) == -1 )  
         rc = 1;  
     ctx->cols++;  
     return rc;  
 } /* listview_add_column */  
   
   
 int  
 listview_add_item_pos (listview_ctrl_t ctx, int pos)  
 {  
     int rc = 0;  
     LV_ITEM lvi;  
   
     memset (&lvi, 0, sizeof lvi);  
     lvi.iItem = pos;  
     rc = ListView_InsertItem (ctx->ctrl, &lvi);  
     if (rc == -1)  
         rc = 1;  
     ctx->items++;  
     return rc;  
 }  
   
   
 int  
 listview_add_item( listview_ctrl_t ctx, const char *text )  
 {  
     int rc = 0;  
     LV_ITEM lvi;  
   
     memset( &lvi, 0, sizeof lvi );  
     lvi.mask = LVIF_TEXT;  
     lvi.pszText = (char *)text;  
     rc = ListView_InsertItem( ctx->ctrl, &lvi );  
     if( rc == -1 )  
         rc = 1;  
     ctx->items++;  
     return rc;  
 } /* listview_add_item */  
   
   
 int  
 listview_add_item2( listview_ctrl_t ctx, const char * text, void * magic )  
 {  
     int rc = 0;  
     LV_ITEM lvi;  
   
     memset( &lvi, 0, sizeof lvi );  
     lvi.mask = LVIF_TEXT | LVIF_PARAM;  
     lvi.pszText = (char *)text;  
     lvi.lParam = (LPARAM)magic;  
     rc = ListView_InsertItem( ctx->ctrl, &lvi );  
     if( rc == -1 )  
         rc = 1;  
     ctx->items++;  
     return rc;  
 } /* listview_add_item2 */  
   
   
 void  
 listview_add_sub_item( listview_ctrl_t ctx, int pos, int col, const char *text )  
 {        
     ListView_SetItemText( ctx->ctrl, pos, col, (char *)text );  
 } /* listview_add_sub_item */  
   
   
 int  
 listview_count_items( listview_ctrl_t ctx, int curr_sel )  
 {        
     int n;  
   
     n = curr_sel? ListView_GetSelectedCount( ctx->ctrl ) :      
                   ListView_GetItemCount( ctx->ctrl );  
     return n;  
 } /* listview_count_items */  
   
   
 int  
 listview_del_item( listview_ctrl_t ctx, int pos )  
 {  
     int rc = 0;  
   
     if( ListView_DeleteItem( ctx->ctrl, pos ) == -1 )  
         rc = 1;  
     return rc;  
 } /* listview_del_item */  
   
   
 int  
 listview_del_items( listview_ctrl_t ctx )  
 {        
     int n;  
   
     /* delete all selected entries */  
     for( n = 0;  n < listview_count_items( ctx, 0 ); n++ ) {  
         if ( listview_get_item_state( ctx, n ) )  
             listview_del_item( ctx, n );          
     }  
     return 0;  
 } /* listview_del_items */  
   
   
 int  
 listview_del_all( listview_ctrl_t ctx )  
 {        
     int rc = 0;  
   
     if( ListView_DeleteAllItems( ctx->ctrl ) == FALSE )  
         rc = 1;  
     return rc;  
 } /* listview_del_all */  
   
   
 int  
 listview_get_item_state( listview_ctrl_t ctx, int pos )  
 {        
     return ListView_GetItemState( ctx->ctrl, pos, LVIS_SELECTED );  
 } /* listview_get_item_state */  
   
   
 int  
 listview_sort_items( listview_ctrl_t ctx, int sortby, listview_cmp sort_cb )  
 {        
     HWND hheader;  
     HDITEM hdi;  
     int idx;  
   
     ListView_SortItems (ctx->ctrl, sort_cb, sortby);  
     hheader = ListView_GetHeader (ctx->ctrl);  
     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);  
     }  
   
     switch (sortby & ~KEYLIST_SORT_DESC) {  
     case GPGME_ATTR_USERID:    idx = 0; break;  
     case GPGME_ATTR_KEYID:     idx = 1; break;  
     case GPGME_ATTR_IS_SECRET: idx = 2; break;  
     case GPGME_ATTR_LEN:       idx = 3; break;  
     case GPGME_ATTR_VALIDITY:  idx = 5; break;  
     case GPGME_ATTR_OTRUST:    idx = 6; break;  
     case GPGME_ATTR_CREATED:   idx = 7; break;  
     case GPGME_ATTR_ALGO:      idx = 8; break;  
     default:                   idx = 0; break;  
     }  
   
     /* Set image to currently sorted field */  
     memset (&hdi, 0, sizeof(hdi));  
     hdi.mask = HDI_IMAGE | HDI_FORMAT;  
     Header_GetItem (hheader, idx, &hdi);  
     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);  
     return 0;  
 } /* listview_sort_items */  
   
   
 int  
 listview_get_curr_pos( listview_ctrl_t ctx )  
 {        
     return ListView_GetNextItem( ctx->ctrl, -1, LVNI_SELECTED );  
 } /* listview_get_curr_pos */  
   
   
 int  
 listview_get_item_text (listview_ctrl_t ctx, int pos, int col, char *text,  
                         int maxbytes)  
 {  
     if (pos == -1) {  
         pos = listview_get_curr_pos (ctx);  
         if (pos == -1)  
             return -1;  
     }  
     ListView_GetItemText (ctx->ctrl, pos, col, text, maxbytes);  
     return 0;  
 } /* listview_get_item_text */  
   
   
 void  
 listview_set_ext_style( listview_ctrl_t ctx )  
 {        
     ListView_SetExtendedListViewStyle( ctx->ctrl, LVS_EX_FULLROWSELECT );  
 } /* listview_set_ext_style */  
   
   
 int  
 listview_set_column_order( listview_ctrl_t ctx, int *array )  
 {        
     return ListView_SetColumnOrderArray( ctx->ctrl, ctx->cols, array );  
 } /* listview_set_column_order */  
   
   
 void  
 listview_select_all (listview_ctrl_t ctx)  
 {        
     ListView_SetItemState( ctx->ctrl, -1, LVIS_SELECTED, LVIS_SELECTED );  
 } /* listview_select_all */  
   
   
 void  
 listview_select_one (listview_ctrl_t ctx, int pos)  
 {  
     ListView_SetItemState (ctx->ctrl, pos, LVIS_SELECTED|LVIS_FOCUSED, LVIS_FOCUSED|LVIS_SELECTED);  
 }  
   
   
 int  
 listview_find (listview_ctrl_t ctx, const char * str)  
 {  
     LVFINDINFO inf;  
     int pos;  
   
     memset (&inf, 0, sizeof inf);  
     inf.flags = LVFI_STRING|LVFI_PARTIAL;  
     inf.psz = str;  
     pos = ListView_FindItem (ctx->ctrl, -1, &inf);  
     return pos;  
 }  
   
 /** 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 );  
   
     return 0;  
 } /* treeview_add_item */  
1    /* wptListView.cpp - Dynamic list view control
2     *      Copyright (C) 2000-2007 Timo Schulz
3     *      Copyright (C) 2004 Andreas Jobs
4     *
5     * This file is part of WinPT.
6     *
7     * WinPT is free software; you can redistribute it and/or
8     * modify it under the terms of the GNU General Public License
9     * as published by the Free Software Foundation; either version 2
10     * of the License, or (at your option) any later version.
11     *  
12     * WinPT is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15     * General Public License for more details.
16     */
17    #ifdef HAVE_CONFIG_H
18    #include <config.h>
19    #endif
20    
21    #include <stdio.h>
22    #include <windows.h>
23    #include <commctrl.h>
24    
25    #include "wptCommonCtl.h"
26    #include "wptW32API.h"
27    #include "wptVersion.h"
28    #include "wptErrors.h"
29    #include "wptTypes.h"
30    #include "wptGPG.h"
31    #include "wptKeylist.h"
32    #include "wptUTF8.h"
33    #include "resource.h"
34    
35    
36    void
37    listview_new (listview_ctrl_t *ctx, HWND ctrl)
38    {
39        struct listview_ctrl_s *c;
40    
41        c = new struct listview_ctrl_s;
42        if (!c)
43            BUG (NULL);
44        memset (c, 0, sizeof *c);
45        c->ctrl = ctrl? ctrl : NULL;
46        c->hil = NULL;
47        *ctx = c;
48    }
49    
50    
51    void
52    listview_release (listview_ctrl_t ctx)
53    {
54        if (!ctx)
55            return;
56    
57        ctx->cols = 0;
58        ctx->ctrl = NULL;
59        ctx->items = 0;
60        if (ctx->hil)
61            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
80    listview_add_column (listview_ctrl_t ctx, listview_column_t col)
81    {      
82        int rc = 0;
83        LV_COLUMN lvc;
84    
85        memset (&lvc, 0, sizeof lvc);
86        lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
87        lvc.pszText = col->fieldname;
88        lvc.cx = col->width;
89        lvc.fmt = LVCFMT_LEFT;
90        lvc.iSubItem = col->pos;
91        if (ListView_InsertColumn (ctx->ctrl, col->pos, &lvc) == -1)
92            rc = 1;
93        ctx->cols++;
94        return rc;
95    }
96    
97    
98    int
99    listview_add_item_pos (listview_ctrl_t ctx, int pos)
100    {
101        int rc = 0;
102        LV_ITEM lvi;
103    
104        memset (&lvi, 0, sizeof lvi);
105        lvi.iItem = pos;
106        if (ListView_InsertItem (ctx->ctrl, &lvi) != pos)
107            rc = -1;
108        ctx->items++;
109        return rc;
110    }
111    
112    
113    int
114    listview_add_item (listview_ctrl_t ctx, const char *text)
115    {
116        int rc = 0;
117        LV_ITEM lvi;
118    
119        memset (&lvi, 0, sizeof lvi);
120        lvi.mask = LVIF_TEXT;
121        lvi.pszText = (char *)text;
122        rc = ListView_InsertItem (ctx->ctrl, &lvi);
123        if( rc == -1 )
124            rc = 1;
125        ctx->items++;
126        return rc;
127    }
128    
129    
130    int
131    listview_add_item_image (listview_ctrl_t ctx, const char *text, int image)
132    {
133        int rc = 0;
134        LV_ITEM lvi;
135    
136        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;
156        lvi.pszText = (char *)text;
157        lvi.lParam = (LPARAM)magic;
158        rc = ListView_InsertItem (ctx->ctrl, &lvi);
159        if (rc == -1)
160            rc = 1;
161        ctx->items++;
162        return rc;
163    }
164    
165    
166    void*
167    listview_get_item2 (listview_ctrl_t ctx, int pos)
168    {
169        LVITEM lvi;
170    
171        memset (&lvi, 0, sizeof lvi);
172        lvi.mask = LVIF_PARAM;
173        lvi.iItem = pos;
174        ListView_GetItem (ctx->ctrl, &lvi);
175        return (void*)lvi.lParam;
176    }
177    
178    
179    int
180    listview_set_item2 (listview_ctrl_t ctx, int pos, void *magic)
181    {
182        LVITEM lvi;
183    
184        memset (&lvi, 0, sizeof (lvi));
185        lvi.mask = LVIF_PARAM;
186        lvi.iItem = pos;
187        lvi.lParam = (LPARAM)magic;
188        if (ListView_SetItem (ctx->ctrl, &lvi) == -1)
189            return 1;
190        return 0;
191    }
192    
193    
194    void
195    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);
198    }
199    
200    
201    int
202    listview_count_items( listview_ctrl_t ctx, int curr_sel )
203    {      
204        int n;
205    
206        n = curr_sel? ListView_GetSelectedCount( ctx->ctrl ) :    
207                      ListView_GetItemCount( ctx->ctrl );
208        return n;
209    }
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
222    listview_del_item (listview_ctrl_t ctx, int pos)
223    {
224        int rc = 0;
225    
226        if (ListView_DeleteItem (ctx->ctrl, pos) == -1)
227            rc = 1;
228        return rc;
229    }
230    
231    
232    /* Delete all selected items in @ctx. */
233    int
234    listview_del_sel_items (listview_ctrl_t ctx)
235    {      
236        int i, n;
237    
238        n = listview_count_items (ctx, 0);
239        for (i = n;  i > -1; i--) {
240            if (listview_get_item_state (ctx, i))
241                listview_del_item (ctx, i);
242        }
243        return 0;
244    }
245    
246    
247    int
248    listview_del_all_items (listview_ctrl_t ctx)
249    {      
250        int rc = 0;
251    
252        if (ListView_DeleteAllItems (ctx->ctrl) == FALSE)
253            rc = 1;
254        return rc;
255    }
256    
257    
258    /* Return the index of the selected item.
259       Support both selections and checkboxes. */
260    int
261    listview_get_selected_item (listview_ctrl_t lv)
262    {
263        int pos, i;
264        
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
279    listview_get_item_state (listview_ctrl_t ctx, int pos)
280    {
281        int ret;
282        if (ctx->ext_chkbox)
283            ret = ListView_GetCheckState (ctx->ctrl, pos);
284        else
285            ret = ListView_GetItemState (ctx->ctrl, pos, LVIS_SELECTED);
286        return ret;
287    }
288    
289    
290    int
291    listview_sort_items (listview_ctrl_t ctx, int sortby, listview_cmp sort_cb)
292    {
293        ListView_SortItems (ctx->ctrl, sort_cb, sortby);
294        return 0;
295    }
296    
297    
298    int
299    listview_get_curr_pos (listview_ctrl_t ctx)
300    {      
301        return ListView_GetNextItem( ctx->ctrl, -1, LVNI_SELECTED );
302    }
303    
304    
305    int
306    listview_get_item_text (listview_ctrl_t ctx, int pos, int col, char *text,
307                            int maxbytes)
308    {
309        if (pos == -1) {
310            pos = listview_get_curr_pos (ctx);
311            if (pos == -1)
312                return -1;
313        }
314        ListView_GetItemText (ctx->ctrl, pos, col, text, maxbytes);
315        return 0;
316    }
317    
318    
319    /* Use extended style with checkboxes for each item. */
320    void
321    listview_set_chkbox_style (listview_ctrl_t ctx)
322    {
323        ListView_SetExtendedListViewStyle (ctx->ctrl, LVS_EX_CHECKBOXES);
324        ctx->ext_chkbox = 1;
325    }
326    
327    
328    /* Use extended style to select the entire row. */
329    void
330    listview_set_ext_style (listview_ctrl_t ctx)
331    {      
332        ListView_SetExtendedListViewStyle (ctx->ctrl, LVS_EX_FULLROWSELECT);
333    }
334    
335    
336    int
337    listview_set_column_order( listview_ctrl_t ctx, int *array )
338    {      
339        return ListView_SetColumnOrderArray( ctx->ctrl, ctx->cols, array );
340    }
341    
342    
343    void
344    listview_select_all (listview_ctrl_t ctx)
345    {      
346        ListView_SetItemState( ctx->ctrl, -1, LVIS_SELECTED, LVIS_SELECTED );
347    }
348    
349    
350    void
351    listview_deselect_all (listview_ctrl_t ctx)
352    {
353        ListView_SetItemState (ctx->ctrl, -1, ~LVNI_SELECTED, LVNI_SELECTED);
354    }
355    
356    
357    void
358    listview_select_one (listview_ctrl_t ctx, int pos)
359    {
360        ListView_SetItemState (ctx->ctrl, pos, LVIS_SELECTED|LVIS_FOCUSED,
361                                                LVIS_FOCUSED|LVIS_SELECTED);
362    }
363    
364    
365    void
366    listview_scroll (listview_ctrl_t ctx, int oldpos, int newpos)
367    {    
368        const int size=14;
369        
370        if (oldpos == -1)
371            oldpos = 0;
372        //log_box ("debug", 0, "oldpos=%d newpos=%d diff=%d",
373                    //oldpos, newpos, newpos-oldpos);
374        ListView_Scroll (ctx->ctrl, 0, (newpos-oldpos)*size);
375    }
376    
377    
378    static int
379    listview_find_substr (listview_ctrl_t ctx, const char *str)
380    {
381        char buf[256];
382        int i, n, fnd = 0;
383    
384        /* We assume the first column contains text. */
385        n = listview_count_items (ctx, 0);
386        for (i = 0; i < n; i++) {
387            listview_get_item_text (ctx, i, 0, buf, DIM (buf)-1);
388            if (stristr (buf, str)) {
389                fnd = 1;
390                break;
391            }
392        }
393        if (!fnd)
394            i = -1; /* not found */
395        return i;
396    }
397    
398    
399    int
400    listview_find (listview_ctrl_t ctx, const char *str, int substr)
401    {
402        LVFINDINFO inf;
403        int pos;
404    
405        /* XXX: allow to make a substring search. */
406        memset (&inf, 0, sizeof (inf));
407        inf.flags = LVFI_STRING|LVFI_PARTIAL;
408        inf.psz = str;
409        pos = ListView_FindItem (ctx->ctrl, -1, &inf);
410        if (pos == -1 && substr)
411            pos = listview_find_substr (ctx, str);
412        return pos;
413    }
414    
415    
416    void
417    listview_setview (listview_ctrl_t ctx, DWORD view)
418    {
419        DWORD style = GetWindowLong (ctx->ctrl, GWL_STYLE);
420        if ((style & LVS_TYPEMASK) != view)
421            SetWindowLong (ctx->ctrl, GWL_STYLE, (style & ~LVS_TYPEMASK) | view);
422    }
423    
424    
425    void
426    listview_set_image_list (listview_ctrl_t ctx, int cx, int cy,
427                             HICON *ico, DWORD nicons)
428    {
429        HIMAGELIST hil;
430        DWORD i;
431    
432        if (cx <= 0 || cy <= 0)
433            cx = cy = 16; /* default size. */
434    
435        hil = ImageList_Create (cx, cy, ILC_COLOR8|ILC_MASK, nicons, 1);
436        ImageList_SetBkColor (hil, CLR_NONE);
437        for (i=0; i < nicons; i++)
438            ImageList_AddIcon (hil, ico[i]);    
439        ListView_SetImageList (ctx->ctrl, hil, LVSIL_SMALL);    
440    }

Legend:
Removed from v.12  
changed lines
  Added in v.304

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26