gwenhywfar  4.3.3
w_listbox.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Fri Jul 09 2010
3  copyright : (C) 2010 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 
11 #define W_LISTBOX_MAX_TYPES 256
12 
13 
14 
15 static GWENHYWFAR_CB
18  int index,
19  int value,
20  int doSignal) {
21  GtkWidget *g;
22 
24  assert(g);
25 
26  switch(prop) {
28  gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
29  return 0;
30 
32  gtk_widget_grab_focus(GTK_WIDGET(g));
33  return 0;
34 
36  GtkTreePath *path;
37 
38  path=gtk_tree_path_new_from_indices(value, -1);
39  gtk_tree_view_set_cursor(GTK_TREE_VIEW(g), path, NULL, FALSE);
40  gtk_tree_path_free(path);
41  return 0;
42  }
43 
45  GtkTreeSelection *sel;
46 
47  sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(g));
48  if (sel) {
49  switch(value) {
51  gtk_tree_selection_set_mode(sel, GTK_SELECTION_NONE);
52  return 0;
54  gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
55  return 0;
57  gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
58  return 0;
59  }
60  DBG_ERROR(GWEN_LOGDOMAIN, "Unknown SelectionMode %d", value);
61  return GWEN_ERROR_INVALID;
62  }
63  break;
64  }
65 
67  GtkTreeViewColumn *col;
68 
69  col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
70  if (col) {
71  gtk_tree_view_column_set_fixed_width(col, value);
72  return 0;
73  }
74 
75  /* no width */
76  return GWEN_ERROR_INVALID;
77  }
78 
80  GtkTreeViewColumn *col;
81  int i;
82  int cols;
83 
84  /* remove sort indicator from all columns */
85  cols=GWEN_Widget_GetColumns(w);
86  for (i=0; i<cols; i++) {
87  col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
88  if (col) {
89  if (gtk_tree_view_column_get_sort_indicator(col)==TRUE)
90  gtk_tree_view_column_set_sort_indicator(col, FALSE);
91  }
92  }
93 
94  if (value!=GWEN_DialogSortDirection_None) {
95  /* set sort indicator on given column */
96  col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
97  if (col) {
98  switch(value) {
100  gtk_tree_view_column_set_sort_order(col, GTK_SORT_ASCENDING);
101  break;
103  gtk_tree_view_column_set_sort_order(col, GTK_SORT_DESCENDING);
104  break;
105  default:
106  break;
107  }
108  }
109  }
110 
111  return 0;
112  }
113 
115  GtkListStore *sto;
116 
117  sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
118  if (sto)
119  gtk_list_store_clear(sto);
120  return 0;
121  }
122 
124  /* NOOP, we use auto-sorting for now (TODO: figure out how to manually sort) */
125  return 0;
126 
127  default:
128  break;
129  }
130 
132  "Function is not appropriate for this type of widget (%s)",
134  return GWEN_ERROR_INVALID;
135 }
136 
137 
138 
139 
140 static GWENHYWFAR_CB
143  int index,
144  int defaultValue) {
145  GtkWidget *g;
146 
148  assert(g);
149 
150  switch(prop) {
152  return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
153 
155  return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
156  return 0;
157 
159  GtkTreePath *path=NULL;
160 
161  gtk_tree_view_get_cursor(GTK_TREE_VIEW(g), &path, NULL);
162  if (path!=NULL) {
163  gint *idxlist;
164 
165  idxlist=gtk_tree_path_get_indices(path);
166  if (idxlist!=NULL) {
167  int res;
168 
169  res=idxlist[0];
170  gtk_tree_path_free(path);
171  return res;
172  }
173  gtk_tree_path_free(path);
174  }
175 
176  /* no cursor */
177  return -1;
178  }
179 
181  GtkTreeViewColumn *col;
182 
183  col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
184  if (col)
185  return gtk_tree_view_column_get_width(col);
186 
187  /* no width */
188  return -1;
189  }
190 
192  GtkTreeViewColumn *col;
193 
194  col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
195  if (col) {
196  if (gtk_tree_view_column_get_sort_indicator(col)==TRUE) {
197  switch(gtk_tree_view_column_get_sort_order(col)) {
198  case GTK_SORT_ASCENDING:
200  case GTK_SORT_DESCENDING:
202  default:
203  break;
204  }
205  }
206  /*break; <- this is wrong here, isn't it? */
207  }
208 
210  }
211 
212  default:
213  break;
214  }
215 
217  "Function %d is not appropriate for this type of widget (%s)",
218  prop,
220  return defaultValue;
221 }
222 
223 
224 
225 static GWENHYWFAR_CB
228  int index,
229  const char *value,
230  int doSignal) {
231  GtkWidget *g;
232 
234  assert(g);
235 
236  switch(prop) {
238  int cols=0;
239  if (value && *value) {
240  int i;
241  int l;
242 
243  l=strlen(value);
244  cols=1;
245  for (i=0; i<l; i++) {
246  if (value[i]=='\t')
247  cols++;
248  }
249  }
250 
251  if (cols) {
252  GType types[W_LISTBOX_MAX_TYPES];
253  GtkListStore *sto;
254  int i;
255  const char *s;
256  GtkTreeViewColumn *col;
257  char *vcopy;
258  char *p;
259 
260  if (cols>W_LISTBOX_MAX_TYPES)
261  cols=W_LISTBOX_MAX_TYPES;
262  for (i=0; i<cols; i++)
263  types[i]=G_TYPE_STRING;
264  sto=gtk_list_store_newv(cols, types);
265  s=value;
266 
267  /* clear current headers in tree view */
268  while( (col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), 0)) )
269  gtk_tree_view_remove_column(GTK_TREE_VIEW(g), col);
270 
271  /* set new model */
272  gtk_tree_view_set_model(GTK_TREE_VIEW(g), GTK_TREE_MODEL(sto));
273 
274  /* insert new headers */
275  i=0;
276  vcopy=strdup(value);
277  p=vcopy;
278  while(*p && i<cols) {
279  char *pT;
280  GtkCellRenderer *renderer;
281 
282  pT=strchr(p, '\t');
283  if (pT)
284  *pT=0;
285 
286  renderer=gtk_cell_renderer_text_new();
287  col=gtk_tree_view_column_new();
288  gtk_tree_view_column_set_title(col, p);
289  gtk_tree_view_column_pack_start(col, renderer, TRUE);
290  gtk_tree_view_column_set_sort_column_id(col, i);
291  gtk_tree_view_column_set_resizable(col, TRUE);
292  gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);
293  gtk_tree_view_column_set_attributes(col, renderer, "text", i, NULL);
294 
295  gtk_tree_view_append_column(GTK_TREE_VIEW(g), col);
296 
297  if (pT)
298  p=pT+1;
299  else
300  /* no more tab, all columns done */
301  break;
302  i++;
303  }
304  free(vcopy);
305  GWEN_Widget_SetColumns(w, cols);
306  gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(g), TRUE);
307  }
308  else {
309  DBG_ERROR(GWEN_LOGDOMAIN, "No columns (empty title)");
310  return GWEN_ERROR_INVALID;
311  }
312 
313  return 0;
314  }
315 
317  GtkListStore *sto;
318 
319  sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
320  if (sto)
321  gtk_list_store_clear(sto);
322  return 0;
323  }
324 
326  GtkListStore *sto;
327 
328  sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
329  if (sto) {
330  GtkTreeIter iter;
331  int cols;
332  int i;
333  char *vcopy;
334  char *p;
335 
336  cols=GWEN_Widget_GetColumns(w);
337 
338  vcopy=strdup(value);
339  p=vcopy;
340  i=0;
341  gtk_list_store_append(sto, &iter);
342  while(*p && i<cols) {
343  char *pT;
344  GValue val={0};
345 
346  g_value_init(&val, G_TYPE_STRING);
347 
348  pT=strchr(p, '\t');
349  if (pT)
350  *pT=0;
351  g_value_set_string(&val, p);
352  gtk_list_store_set_value(sto, &iter, i, &val);
353  g_value_unset(&val);
354 
355  if (pT)
356  p=pT+1;
357  else
358  /* no more tabs, all columns done */
359  break;
360  i++;
361  }
362  free(vcopy);
363  }
364 
365  return 0;
366  }
367 
368  default:
369  break;
370  }
371 
373  "Function is not appropriate for this type of widget (%s)",
375  return GWEN_ERROR_INVALID;
376 }
377 
378 
379 
380 static GWENHYWFAR_CB
383  int index,
384  const char *defaultValue) {
385  GtkWidget *g;
386 
388  assert(g);
389 
390  switch(prop) {
392  GList *cols;
393 
394  cols=gtk_tree_view_get_columns(GTK_TREE_VIEW(g));
395  if (cols) {
396  GList *le;
397  GWEN_BUFFER *tbuf;
398  int cnt=0;
399 
400  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
401  le=g_list_first(cols);
402  while(le) {
403  const gchar *s;
404 
405  if (cnt)
406  GWEN_Buffer_AppendByte(tbuf, '\t');
407  s=gtk_tree_view_column_get_title(GTK_TREE_VIEW_COLUMN(le->data));
408  if (s && *s)
409  GWEN_Buffer_AppendString(tbuf, s);
410  cnt++;
411  le=g_list_next(le);
412  } /* while */
414  GWEN_Buffer_free(tbuf);
415 
416  g_list_free(cols);
418  }
419  return defaultValue;
420  }
421 
423  GtkTreePath *path;
424 
425  path=gtk_tree_path_new_from_indices(index, -1);
426  if (path!=NULL) {
427  GtkListStore *sto;
428  GtkTreeIter iter;
429 
430  sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
431  if (gtk_tree_model_get_iter(GTK_TREE_MODEL(sto), &iter, path)) {
432  GList *cols;
433 
434  cols=gtk_tree_view_get_columns(GTK_TREE_VIEW(g));
435  if (cols) {
436  GList *le;
437  GWEN_BUFFER *tbuf;
438  int cnt=0;
439 
440  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
441  le=g_list_first(cols);
442  while(le) {
443  gchar *s;
444 
445  if (cnt)
446  GWEN_Buffer_AppendByte(tbuf, '\t');
447  gtk_tree_model_get(GTK_TREE_MODEL(sto), &iter, cnt, &s, -1, NULL);
448  if (s) {
449  GWEN_Buffer_AppendString(tbuf, s);
450  g_free(s);
451  }
452  cnt++;
453  le=g_list_next(le);
454  } /* while */
456  GWEN_Buffer_free(tbuf);
457 
458  g_list_free(cols);
460  }
461  }
462 
463  gtk_tree_path_free(path);
464  }
465  return defaultValue;
466  }
467 
468  default:
469  break;
470  }
471 
473  "Function is not appropriate for this type of widget (%s)",
475  return defaultValue;
476 }
477 
478 
479 
480 static void Gtk2Gui_WListBox_CursorChanged_handler(GtkTreeView *g, gpointer data) {
481  GWEN_WIDGET *w;
482  int rv;
483 
484  w=data;
485  assert(w);
491  else if (rv==GWEN_DialogEvent_ResultReject)
493 }
494 
495 
496 
498  GtkWidget *g;
499  GtkWidget *gScroll;
500  uint32_t flags;
501  GWEN_WIDGET *wParent;
502  gulong changed_handler_id;
503 
504  flags=GWEN_Widget_GetFlags(w);
505  wParent=GWEN_Widget_Tree_GetParent(w);
506 
507  gScroll=gtk_scrolled_window_new(NULL, NULL);
508  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gScroll),
509  GTK_POLICY_AUTOMATIC,
510  GTK_POLICY_AUTOMATIC);
511  g=gtk_tree_view_new();
512  gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(g), TRUE);
513  gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(g), TRUE);
514  gtk_container_add(GTK_CONTAINER(gScroll), GTK_WIDGET(g));
515 
518 
523 
524  changed_handler_id=g_signal_connect(g,
525  "cursor-changed",
527  w);
528 
529  if (wParent)
530  GWEN_Widget_AddChildGuiWidget(wParent, w);
531 
532  return 0;
533 }
534 
535