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

Contents of /trunk/Src/wptListView.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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


1 /* wptListView.cpp - Dynamic list view control
2 * Copyright (C) 2000-2007, 2009 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 DWORD flag = LVS_EX_CHECKBOXES;
324 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
352 listview_set_column_order (listview_ctrl_t ctx, int *array)
353 {
354 return ListView_SetColumnOrderArray (ctx->ctrl, ctx->cols, array);
355 }
356
357
358 void
359 listview_select_all (listview_ctrl_t ctx)
360 {
361 ListView_SetItemState (ctx->ctrl, -1, LVIS_SELECTED, LVIS_SELECTED);
362 }
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
373 listview_select_one (listview_ctrl_t ctx, int pos)
374 {
375 ListView_SetItemState (ctx->ctrl, pos, LVIS_SELECTED|LVIS_FOCUSED,
376 LVIS_FOCUSED|LVIS_SELECTED);
377 }
378
379
380 void
381 listview_scroll (listview_ctrl_t ctx, int oldpos, int newpos)
382 {
383 const int size=14;
384
385 if (oldpos == -1)
386 oldpos = 0;
387 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
413 listview_find (listview_ctrl_t ctx, const char *str, int substr)
414 {
415 LVFINDINFO inf;
416 int pos;
417
418 /* XXX: allow to make a substring search. */
419 memset (&inf, 0, sizeof (inf));
420 inf.flags = LVFI_STRING|LVFI_PARTIAL;
421 inf.psz = str;
422 pos = ListView_FindItem (ctx->ctrl, -1, &inf);
423 if (pos == -1 && substr)
424 pos = listview_find_substr (ctx, str);
425 return pos;
426 }
427
428
429 void
430 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 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26