1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2021 Maxime DOYEN
3 *
4 * This file is part of HomeBank.
5 *
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20
21 #include "homebank.h"
22
23 #include "gtk-chart.h"
24 #include "ui-widgets.h"
25
26 /****************************************************************************/
27 /* Debug macros */
28 /****************************************************************************/
29 #define MYDEBUG 0
30
31 #if MYDEBUG
32 #define DB(x) (x);
33 #else
34 #define DB(x);
35 #endif
36
37 /* our global datas */
38 extern struct HomeBank *GLOBALS;
39
40
41 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
42
43
44 extern HbKvData CYA_FLT_RANGE[];
45
46
47 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
48
49 //TODO: only WEIGHT & SCALE are used for now
50 void
gimp_label_set_attributes(GtkLabel * label,...)51 gimp_label_set_attributes (GtkLabel *label,
52 ...)
53 {
54 PangoAttribute *attr = NULL;
55 PangoAttrList *attrs;
56 va_list args;
57
58 g_return_if_fail (GTK_IS_LABEL (label));
59
60 attrs = pango_attr_list_new ();
61
62 va_start (args, label);
63
64 do
65 {
66 PangoAttrType attr_type = va_arg (args, PangoAttrType);
67
68 if (attr_type <= 0)
69 attr_type = PANGO_ATTR_INVALID;
70
71 switch (attr_type)
72 {
73 case PANGO_ATTR_LANGUAGE:
74 attr = pango_attr_language_new (va_arg (args, PangoLanguage *));
75 break;
76
77 case PANGO_ATTR_FAMILY:
78 attr = pango_attr_family_new (va_arg (args, const gchar *));
79 break;
80
81 case PANGO_ATTR_STYLE:
82 attr = pango_attr_style_new (va_arg (args, PangoStyle));
83 break;
84
85 case PANGO_ATTR_WEIGHT:
86 attr = pango_attr_weight_new (va_arg (args, PangoWeight));
87 break;
88
89 case PANGO_ATTR_VARIANT:
90 attr = pango_attr_variant_new (va_arg (args, PangoVariant));
91 break;
92
93 case PANGO_ATTR_STRETCH:
94 attr = pango_attr_stretch_new (va_arg (args, PangoStretch));
95 break;
96
97 case PANGO_ATTR_SIZE:
98 attr = pango_attr_size_new (va_arg (args, gint));
99 break;
100
101 case PANGO_ATTR_FONT_DESC:
102 attr = pango_attr_font_desc_new (va_arg (args,
103 const PangoFontDescription *));
104 break;
105
106 case PANGO_ATTR_FOREGROUND:
107 {
108 const PangoColor *color = va_arg (args, const PangoColor *);
109
110 attr = pango_attr_foreground_new (color->red,
111 color->green,
112 color->blue);
113 }
114 break;
115
116 case PANGO_ATTR_BACKGROUND:
117 {
118 const PangoColor *color = va_arg (args, const PangoColor *);
119
120 attr = pango_attr_background_new (color->red,
121 color->green,
122 color->blue);
123 }
124 break;
125
126 case PANGO_ATTR_UNDERLINE:
127 attr = pango_attr_underline_new (va_arg (args, PangoUnderline));
128 break;
129
130 case PANGO_ATTR_STRIKETHROUGH:
131 attr = pango_attr_strikethrough_new (va_arg (args, gboolean));
132 break;
133
134 case PANGO_ATTR_RISE:
135 attr = pango_attr_rise_new (va_arg (args, gint));
136 break;
137
138 case PANGO_ATTR_SCALE:
139 attr = pango_attr_scale_new (va_arg (args, gdouble));
140 break;
141
142 default:
143 //g_warning ("%s: invalid PangoAttribute type %d", G_STRFUNC, attr_type);
144 case PANGO_ATTR_INVALID:
145 attr = NULL;
146 break;
147 }
148
149 if (attr)
150 {
151 attr->start_index = 0;
152 attr->end_index = -1;
153 pango_attr_list_insert (attrs, attr);
154 }
155 }
156 while (attr);
157
158 va_end (args);
159
160 gtk_label_set_attributes (label, attrs);
161 pango_attr_list_unref (attrs);
162 }
163
164
hb_widget_set_margin(GtkWidget * widget,gint margin)165 void hb_widget_set_margin(GtkWidget *widget, gint margin)
166 {
167 gtk_widget_set_margin_start (widget, margin);
168 gtk_widget_set_margin_end (widget, margin);
169 gtk_widget_set_margin_top (widget, margin);
170 gtk_widget_set_margin_bottom (widget, margin);
171 }
172
173
hb_widget_visible(GtkWidget * widget,gboolean visible)174 void hb_widget_visible(GtkWidget *widget, gboolean visible)
175 {
176 if(!GTK_IS_WIDGET(widget))
177 return;
178
179 if(visible)
180 {
181 gtk_widget_show(widget);
182 }
183 else
184 {
185 gtk_widget_hide(widget);
186 }
187 }
188
189
ui_label_set_integer(GtkLabel * label,gint value)190 void ui_label_set_integer(GtkLabel *label, gint value)
191 {
192 gchar buf[16];
193
194 g_snprintf(buf, 16, "%d", value);
195 gtk_label_set_text (label, buf);
196 }
197
198
hbtk_entry_tag_name_append(GtkEntry * entry,gchar * tagname)199 void hbtk_entry_tag_name_append(GtkEntry *entry, gchar *tagname)
200 {
201 GtkEntryBuffer *buffer;
202 const gchar *text;
203 guint len;
204
205 text = gtk_entry_get_text(entry);
206 if( g_strstr_len(text, -1, tagname) == NULL )
207 {
208 DB( g_print(" gtkentry append tagname '%s'\n", tagname) );
209 buffer = gtk_entry_get_buffer(GTK_ENTRY(entry));
210 if(buffer)
211 {
212 len = gtk_entry_buffer_get_length(buffer);
213 DB( g_print("- add ' %s' %p %d\n", tagname, buffer, len) );
214 if(len > 0)
215 gtk_entry_buffer_insert_text(buffer, len, " ", 1);
216 gtk_entry_buffer_insert_text(buffer, len+1, tagname, -1);
217 }
218 }
219
220 }
221
222
hbtk_entry_set_text(GtkEntry * entry,gchar * text)223 void hbtk_entry_set_text(GtkEntry *entry, gchar *text)
224 {
225 //DB( g_print(" set text to '%s'\n", text) );
226 gtk_entry_set_text(GTK_ENTRY(entry), ( text != NULL ) ? text : "");
227 }
228
229
hbtk_entry_replace_text(GtkEntry * entry,gchar ** storage)230 void hbtk_entry_replace_text(GtkEntry *entry, gchar **storage)
231 {
232 const gchar *text;
233
234 DB( g_print(" storage is '%p' at '%p'\n", *storage, storage) );
235
236 /* free any previous string */
237 if( *storage != NULL )
238 {
239 g_free(*storage);
240 }
241
242 *storage = NULL;
243 text = gtk_entry_get_text(GTK_ENTRY(entry));
244 *storage = g_strdup(text);
245 }
246
247
248 // redraw a single row of a listview (not work with GTK_SELECTION_MULTIPLE)
249 void
hbtk_listview_redraw_selected_row(GtkTreeView * treeview)250 hbtk_listview_redraw_selected_row(GtkTreeView *treeview)
251 {
252 GtkTreeModel *model;
253 GtkTreeSelection *selection;
254 GtkTreeIter iter;
255 GtkTreePath *path;
256
257 selection = gtk_tree_view_get_selection(treeview);
258 if( gtk_tree_selection_get_selected(selection, &model, &iter) )
259 {
260 path = gtk_tree_model_get_path(model, &iter);
261 gtk_tree_model_row_changed(model, path, &iter);
262 gtk_tree_path_free (path);
263 }
264 }
265
266
267 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
268
269
make_clicklabel(gchar * id,gchar * str)270 GtkWidget *make_clicklabel(gchar *id, gchar *str)
271 {
272 GtkWidget *label;
273 gchar buffer[255];
274
275 g_snprintf(buffer, 254, "<a href=\"%s\">%s</a>", id, str);
276 label = gtk_label_new(buffer);
277 gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1);
278 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
279 gtk_label_set_track_visited_links(GTK_LABEL(label), FALSE);
280 gtk_widget_set_halign(label, GTK_ALIGN_START);
281
282 return GTK_WIDGET(label);
283 }
284
285
make_label_group(gchar * str)286 GtkWidget *make_label_group(gchar *str)
287 {
288 GtkWidget *label = gtk_label_new (str);
289
290 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
291 gtk_widget_set_halign (label, GTK_ALIGN_START);
292 gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
293 return label;
294 }
295
296
make_label_widget(char * str)297 GtkWidget *make_label_widget(char *str)
298 {
299 GtkWidget *label = gtk_label_new_with_mnemonic (str);
300
301 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
302 gtk_widget_set_halign (label, GTK_ALIGN_END);
303 return label;
304 }
305
306
make_label(char * str,gfloat xalign,gfloat yalign)307 GtkWidget *make_label(char *str, gfloat xalign, gfloat yalign)
308 {
309 GtkWidget *label = gtk_label_new_with_mnemonic (str);
310
311 #if( (GTK_MAJOR_VERSION == 3) && (GTK_MINOR_VERSION < 16) )
312 gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign);
313 #else
314 gtk_label_set_xalign(GTK_LABEL(label), xalign);
315 gtk_label_set_yalign(GTK_LABEL(label), yalign);
316 #endif
317 return label;
318 }
319
320
321 /*
322 **
323 */
make_text(gfloat xalign)324 GtkWidget *make_text(gfloat xalign)
325 {
326 GtkWidget *entry;
327
328 entry = gtk_entry_new ();
329 gtk_editable_set_editable (GTK_EDITABLE(entry), FALSE);
330 g_object_set(entry, "xalign", xalign, NULL);
331 return entry;
332 }
333
334
make_search(void)335 GtkWidget *make_search(void)
336 {
337 GtkWidget *search;
338
339 search = gtk_search_entry_new();
340 gtk_entry_set_placeholder_text(GTK_ENTRY(search), _("Search...") );
341
342 return search;
343 }
344
345
346
347 /*
348 **
349 */
make_string(GtkWidget * label)350 GtkWidget *make_string(GtkWidget *label)
351 {
352 GtkWidget *entry;
353
354 entry = gtk_entry_new ();
355
356 if(label)
357 gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry);
358
359 return entry;
360 }
361
362
363 GtkWidget *
hbtk_menubar_add_menu(GtkWidget * menubar,gchar * label,GtkWidget ** menuitem_ptr)364 hbtk_menubar_add_menu(GtkWidget *menubar, gchar *label, GtkWidget **menuitem_ptr)
365 {
366 GtkWidget *menu, *menuitem;
367
368 menu = gtk_menu_new();
369 menuitem = gtk_menu_item_new_with_mnemonic(label);
370 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
371 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
372 if(menuitem_ptr)
373 *menuitem_ptr = menuitem;
374 return menu;
375 }
376
377
378 GtkWidget *
hbtk_menu_add_menuitem(GtkWidget * menu,gchar * label)379 hbtk_menu_add_menuitem(GtkWidget *menu, gchar *label)
380 {
381 GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic(label);
382 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
383 return menuitem;
384 }
385
386
387 GtkWidget *
hbtk_toolbar_add_toolbutton(GtkToolbar * toolbar,gchar * icon_name,gchar * label,gchar * tooltip_text)388 hbtk_toolbar_add_toolbutton(GtkToolbar *toolbar, gchar *icon_name, gchar *label, gchar *tooltip_text)
389 {
390 GtkWidget *button = gtk_widget_new(GTK_TYPE_TOOL_BUTTON,
391 "icon-name", icon_name,
392 "label", label,
393 NULL);
394 if(tooltip_text != NULL)
395 gtk_widget_set_tooltip_text(button, tooltip_text);
396
397
398 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(button), -1);
399
400 return button;
401 }
402
403
make_image_toggle_button(gchar * icon_name,gchar * tooltip_text)404 GtkWidget *make_image_toggle_button(gchar *icon_name, gchar *tooltip_text)
405 {
406 GtkWidget *button, *image;
407
408 //todo 3.10 use gtk_button_new_from_icon_name
409
410 button = gtk_toggle_button_new();
411 image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
412 g_object_set (button, "image", image, NULL);
413 if(tooltip_text != NULL)
414 gtk_widget_set_tooltip_text(button, tooltip_text);
415
416 return button;
417 }
418
419
make_image_button(gchar * icon_name,gchar * tooltip_text)420 GtkWidget *make_image_button(gchar *icon_name, gchar *tooltip_text)
421 {
422 GtkWidget *button, *image;
423
424 //todo 3.10 use gtk_button_new_from_icon_name
425
426 button = gtk_button_new();
427 image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
428 g_object_set (button, "image", image, NULL);
429 if(tooltip_text != NULL)
430 gtk_widget_set_tooltip_text(button, tooltip_text);
431
432 return button;
433 }
434
435
436
437 /*
438 **
439 */
make_memo_entry(GtkWidget * label)440 GtkWidget *make_memo_entry(GtkWidget *label)
441 {
442 GtkListStore *store;
443 GtkWidget *entry;
444 GtkEntryCompletion *completion;
445 GList *lmem, *list;
446
447 store = gtk_list_store_new (1, G_TYPE_STRING);
448
449 completion = gtk_entry_completion_new ();
450 gtk_entry_completion_set_model (completion, GTK_TREE_MODEL(store));
451 gtk_entry_completion_set_text_column (completion, 0);
452
453 entry = gtk_entry_new ();
454 gtk_entry_set_completion (GTK_ENTRY (entry), completion);
455
456 g_object_unref(store);
457
458 //populate
459 //gtk_list_store_clear (GTK_LIST_STORE(store));
460
461 lmem = list = g_hash_table_get_keys(GLOBALS->h_memo);
462 while (list != NULL)
463 {
464 GtkTreeIter iter;
465
466 //gtk_list_store_append (GTK_LIST_STORE(store), &iter);
467 //gtk_list_store_set (GTK_LIST_STORE(store), &iter, 0, list->data, -1);
468 gtk_list_store_insert_with_values(GTK_LIST_STORE(store), &iter, -1,
469 0, list->data,
470 -1);
471
472 list = g_list_next(list);
473 }
474
475 g_list_free(lmem);
476
477 if(label)
478 gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry);
479
480 return entry;
481 }
482
483
484 /*
485 **
486 */
make_string_maxlength(GtkWidget * label,guint max_length)487 GtkWidget *make_string_maxlength(GtkWidget *label, guint max_length)
488 {
489 GtkWidget *entry;
490
491 entry = make_string(label);
492 gtk_entry_set_width_chars(GTK_ENTRY(entry), max_length+2);
493 gtk_entry_set_max_length(GTK_ENTRY(entry), max_length);
494
495 return entry;
496 }
497
498 /*
499 static void make_entry_numeric_insert_text_handler (GtkEntry *entry,
500 const gchar *text,
501 gint length,
502 gint *position,
503 gpointer data)
504 {
505 GtkEditable *editable = GTK_EDITABLE(entry);
506 int i, count=0;
507 gchar *result = g_new (gchar, length);
508
509 for (i=0; i < length; i++) {
510 if (!g_ascii_isdigit(text[i]))
511 continue;
512 result[count++] = text[i];
513 }
514
515 if (count > 0) {
516 g_signal_handlers_block_by_func (G_OBJECT (editable),
517 G_CALLBACK (make_entry_numeric_insert_text_handler),
518 data);
519 gtk_editable_insert_text (editable, result, count, position);
520 g_signal_handlers_unblock_by_func (G_OBJECT (editable),
521 G_CALLBACK (make_entry_numeric_insert_text_handler),
522 data);
523 }
524 g_signal_stop_emission_by_name (G_OBJECT (editable), "insert_text");
525
526 g_free (result);
527 }
528
529
530 GtkWidget *make_entry_numeric(GtkWidget *label, gint min, gint max)
531 {
532 GtkWidget *entry;
533
534 entry = make_string(label);
535 gtk_entry_set_text(GTK_ENTRY(entry), "1");
536
537 g_signal_connect(G_OBJECT(entry), "insert-text", G_CALLBACK(make_entry_numeric_insert_text_handler),
538 NULL);
539
540 return entry;
541 }*/
542
543
hb_amount_insert_text_handler(GtkEntry * entry,const gchar * text,gint length,gint * position,gpointer data)544 static void hb_amount_insert_text_handler (GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data)
545 {
546 GtkEditable *editable = GTK_EDITABLE(entry);
547 gint i, digits, count=0, dcpos=-1;
548 gchar *clntxt;
549
550 DB( g_print("-----\ninsert_text-handler: instxt:%s pos:%d len:%d\n", text, *position, length) );
551
552 digits = gtk_spin_button_get_digits(GTK_SPIN_BUTTON(entry));
553
554 // most common : only 1 char to be inserted
555 if( length == 1 )
556 {
557 const gchar *curtxt = gtk_entry_get_text(entry);
558
559 for (i=0 ; curtxt[i]!='\0' ; i++)
560 {
561 if(curtxt[i]==',' || curtxt[i]=='.')
562 dcpos = i;
563 }
564 DB( g_print(" dcpos:'%d'\n", dcpos) );
565
566 clntxt = g_new0 (gchar, length+1);
567 for (i=0 ; i < length ; i++)
568 {
569 if( g_ascii_isdigit(text[i]) && ( (*position <= dcpos + digits) || dcpos < 0) )
570 goto doinsert;
571
572 //5.4.3 + sign now authorized
573 if( (text[i]=='-' || text[i]=='+') && *position==0 ) /* -/+ sign only at position 0 */
574 goto doinsert;
575
576 if( dcpos < 0 && (text[i]=='.' || text[i]==',') ) /* decimal separator if not in previous string */
577 clntxt[count++] = '.';
578
579 continue;
580
581 doinsert:
582 clntxt[count++] = text[i];
583 }
584 }
585 // less common: paste a full text
586 else
587 {
588 clntxt = hb_string_dup_raw_amount_clean(text, digits);
589 count = strlen(clntxt);
590 }
591
592 if (count > 0)
593 {
594 DB( g_print(" insert %d char '%s' at %d\n", count, clntxt, *position) );
595 g_signal_handlers_block_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data);
596 gtk_editable_insert_text (editable, clntxt, count, position);
597 g_signal_handlers_unblock_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data);
598 }
599
600 g_free (clntxt);
601
602 g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text");
603 }
604
605
make_amount(GtkWidget * label)606 GtkWidget *make_amount(GtkWidget *label)
607 {
608 GtkWidget *spinner;
609 GtkAdjustment *adj;
610
611 //adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -G_MAXDOUBLE, G_MAXDOUBLE, 0.01, 1.0, 0.0);
612 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -8589934588, 8589934588, 0.01, 1.0, 0.0);
613 spinner = gtk_spin_button_new (adj, 1.0, 2);
614 g_object_set(spinner, "xalign", 1.0, NULL);
615
616 if(label)
617 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
618
619 g_signal_connect(G_OBJECT(spinner), "insert-text",
620 G_CALLBACK(hb_amount_insert_text_handler),
621 NULL);
622
623 return spinner;
624 }
625
626
make_exchange_rate(GtkWidget * label)627 GtkWidget *make_exchange_rate(GtkWidget *label)
628 {
629 GtkWidget *spinner;
630 GtkAdjustment *adj;
631
632 //#1871383 wish: increase exchange rate size
633 //adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 99999, 0.01, 1.0, 0.0);
634 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 999999, 0.01, 1.0, 0.0);
635 spinner = gtk_spin_button_new (adj, 1.0, 8);
636 //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
637 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
638 g_object_set(spinner, "xalign", 1.0, NULL);
639
640 if(label)
641 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
642
643 return spinner;
644 }
645
646 /*
647 **
648 */
make_numeric(GtkWidget * label,gdouble min,gdouble max)649 GtkWidget *make_numeric(GtkWidget *label, gdouble min, gdouble max)
650 {
651 GtkWidget *spinner;
652 GtkAdjustment *adj;
653
654 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, min, max, 1.0, 10.0, 0.0);
655 spinner = gtk_spin_button_new (adj, 0, 0);
656 //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
657 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
658 g_object_set(spinner, "xalign", 1.0, NULL);
659
660 if(label)
661 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
662
663 return spinner;
664 }
665
666 /*
667 **
668 */
make_scale(GtkWidget * label)669 GtkWidget *make_scale(GtkWidget *label)
670 {
671 GtkWidget *scale;
672
673 scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, GTK_CHART_MINBARW, GTK_CHART_SPANBARW, 1.0);
674 gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE);
675 gtk_range_set_value(GTK_RANGE(scale), GTK_CHART_BARW);
676
677 if(label)
678 gtk_label_set_mnemonic_widget (GTK_LABEL(label), scale);
679
680 return scale;
681 }
682
683 /*
684 **
685 */
make_long(GtkWidget * label)686 GtkWidget *make_long(GtkWidget *label)
687 {
688 GtkWidget *spinner;
689
690 spinner = make_numeric(label, 0.0, G_MAXINT);
691 return spinner;
692 }
693
694
make_year(GtkWidget * label)695 GtkWidget *make_year(GtkWidget *label)
696 {
697 GtkWidget *spinner;
698 GtkAdjustment *adj;
699
700 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 1900, 2200, 1.0, 10.0, 0.0);
701 spinner = gtk_spin_button_new (adj, 0, 0);
702 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
703 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
704 g_object_set(spinner, "xalign", 1.0, NULL);
705
706 if(label)
707 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
708
709 return spinner;
710 }
711
712
713 GtkWidget *
create_popover(GtkWidget * parent,GtkWidget * child,GtkPositionType pos)714 create_popover (GtkWidget *parent,
715 GtkWidget *child,
716 GtkPositionType pos)
717 {
718 GtkWidget *popover;
719
720 popover = gtk_popover_new (parent);
721 gtk_popover_set_position (GTK_POPOVER (popover), pos);
722 gtk_container_add (GTK_CONTAINER (popover), child);
723 gtk_widget_show (child);
724
725 hb_widget_set_margin(child, SPACING_POPOVER);
726
727 return popover;
728 }
729
730
731 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
732
733
hbtk_radio_button_get_active(GtkContainer * container)734 gint hbtk_radio_button_get_active (GtkContainer *container)
735 {
736 GList *lchild, *list;
737 GtkWidget *radio;
738 gint i, retval = 0;
739
740 if(!GTK_IS_CONTAINER(container))
741 return -1;
742
743 lchild = list = gtk_container_get_children (container);
744 for(i=0;list != NULL;i++)
745 {
746 radio = list->data;
747 if(GTK_IS_TOGGLE_BUTTON(radio))
748 {
749 if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)) == TRUE )
750 {
751 retval = i;
752 break;
753 }
754 }
755 list = g_list_next(list);
756 }
757 g_list_free(lchild);
758
759 return retval;
760 }
761
762
hbtk_radio_button_set_active(GtkContainer * container,gint active)763 void hbtk_radio_button_set_active (GtkContainer *container, gint active)
764 {
765 GList *lchild, *list;
766 GtkWidget *radio;
767
768 if(!GTK_IS_CONTAINER(container))
769 return;
770
771 lchild = list = gtk_container_get_children (container);
772 radio = g_list_nth_data (list, active);
773 if(radio != NULL && GTK_IS_TOGGLE_BUTTON(radio))
774 {
775 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio), TRUE);
776 }
777 g_list_free(lchild);
778 }
779
780
hbtk_radio_button_get_nth(GtkContainer * container,gint nth)781 GtkWidget *hbtk_radio_button_get_nth (GtkContainer *container, gint nth)
782 {
783 GList *lchild, *list;
784 GtkWidget *radio;
785
786 if(!GTK_IS_CONTAINER(container))
787 return NULL;
788
789 lchild = list = gtk_container_get_children (container);
790 radio = g_list_nth_data (list, nth);
791 g_list_free(lchild);
792 return radio; //may return NULL
793 }
794
795
hbtk_radio_button_unblock_by_func(GtkContainer * container,GCallback c_handler,gpointer data)796 void hbtk_radio_button_unblock_by_func(GtkContainer *container, GCallback c_handler, gpointer data)
797 {
798 GList *lchild, *list;
799 GtkWidget *radio;
800 gint i;
801
802 if(!GTK_IS_CONTAINER(container))
803 return;
804
805 lchild = list = gtk_container_get_children (container);
806 for(i=0;list != NULL;i++)
807 {
808 radio = list->data;
809 if(GTK_IS_TOGGLE_BUTTON(radio))
810 {
811 g_signal_handlers_unblock_by_func (radio, c_handler, data);
812 }
813 list = g_list_next(list);
814 }
815 g_list_free(lchild);
816 }
817
818
hbtk_radio_button_block_by_func(GtkContainer * container,GCallback c_handler,gpointer data)819 void hbtk_radio_button_block_by_func(GtkContainer *container, GCallback c_handler, gpointer data)
820 {
821 GList *lchild, *list;
822 GtkWidget *radio;
823 gint i;
824
825 if(!GTK_IS_CONTAINER(container))
826 return;
827
828 lchild = list = gtk_container_get_children (container);
829 for(i=0;list != NULL;i++)
830 {
831 radio = list->data;
832 if(GTK_IS_TOGGLE_BUTTON(radio))
833 {
834 g_signal_handlers_block_by_func (radio, c_handler, data);
835 }
836 list = g_list_next(list);
837 }
838 g_list_free(lchild);
839 }
840
841
hbtk_radio_button_connect(GtkContainer * container,const gchar * detailed_signal,GCallback c_handler,gpointer data)842 void hbtk_radio_button_connect(GtkContainer *container, const gchar *detailed_signal, GCallback c_handler, gpointer data)
843 {
844 GList *lchild, *list;
845 GtkWidget *radio;
846 gint i;
847
848 if(!GTK_IS_CONTAINER(container))
849 return;
850
851 lchild = list = gtk_container_get_children (container);
852 for(i=0;list != NULL;i++)
853 {
854 radio = list->data;
855 if(GTK_IS_TOGGLE_BUTTON(radio))
856 {
857 g_signal_connect (radio, "toggled", c_handler, data);
858 }
859 list = g_list_next(list);
860 }
861 g_list_free(lchild);
862
863 }
864
865
hbtk_radio_button_new(GtkOrientation orientation,gchar ** items,gboolean buttonstyle)866 GtkWidget *hbtk_radio_button_new (GtkOrientation orientation, gchar **items, gboolean buttonstyle)
867 {
868 GtkWidget *box, *button, *newbutton;
869 guint i;
870
871 box = gtk_box_new (orientation, 0);
872
873 button = gtk_radio_button_new_with_label (NULL, _(items[0]));
874 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), !buttonstyle);
875 gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
876 for (i = 1; items[i] != NULL; i++)
877 {
878 newbutton = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button), _(items[i]));
879 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (newbutton), !buttonstyle);
880 gtk_box_pack_start (GTK_BOX (box), newbutton, FALSE, FALSE, 0);
881 }
882
883 if(buttonstyle)
884 {
885 gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
886 gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
887 }
888
889 return box;
890 }
891
892
hbtk_radio_button_new_with_data(HbKivData * kivdata,gboolean buttonstyle)893 GtkWidget *hbtk_radio_button_new_with_data (HbKivData *kivdata, gboolean buttonstyle)
894 {
895 GtkWidget *box, *button, *image, *newbutton;
896 HbKivData *tmp = &kivdata[0];
897 guint i;
898
899 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
900
901 //button = gtk_radio_button_new_with_label (NULL, _(items[0]));
902 button = gtk_radio_button_new(NULL);
903 image = gtk_image_new_from_icon_name (tmp->iconname, GTK_ICON_SIZE_BUTTON);
904 g_object_set (button, "image", image, "tooltip-text", tmp->name, NULL);
905 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), !buttonstyle);
906 gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
907 for (i = 1; ; i++)
908 {
909 tmp = &kivdata[i];
910 if( tmp->name == NULL )
911 break;
912
913 //newbutton = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button), _(items[i]));
914 newbutton = gtk_radio_button_new_from_widget (GTK_RADIO_BUTTON (button));
915 image = gtk_image_new_from_icon_name (tmp->iconname, GTK_ICON_SIZE_BUTTON);
916 g_object_set (newbutton, "image", image, "tooltip-text", tmp->name, NULL);
917 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (newbutton), !buttonstyle);
918 gtk_box_pack_start (GTK_BOX (box), newbutton, FALSE, FALSE, 0);
919 }
920
921 if(buttonstyle)
922 {
923 gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
924 gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
925 }
926
927 return box;
928 }
929
930 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
931
932
933 static gboolean
is_separator(GtkTreeModel * model,GtkTreeIter * iter,gpointer data)934 is_separator (GtkTreeModel *model,
935 GtkTreeIter *iter,
936 gpointer data)
937 {
938 //GtkTreePath *path;
939 gboolean retval;
940 gchar *txt;
941
942 gtk_tree_model_get (model, iter, 0, &txt, -1);
943
944 retval = *txt == 0 ? TRUE : FALSE;
945 //path = gtk_tree_model_get_path (model, iter);
946 //result = gtk_tree_path_get_indices (path)[0] == 4;
947 //gtk_tree_path_free (path);
948
949 //leak
950 g_free(txt);
951
952
953 return retval;
954 }
955
956
make_cycle(GtkWidget * label,gchar ** items)957 GtkWidget *make_cycle(GtkWidget *label, gchar **items)
958 {
959 GtkWidget *combobox;
960 guint i;
961
962 combobox = gtk_combo_box_text_new ();
963
964 for (i = 0; items[i] != NULL; i++)
965 {
966 if(*items[i] != 0)
967 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), _(items[i]));
968 else
969 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), "");
970 }
971 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
972 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL);
973
974 if(label)
975 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
976
977 return combobox;
978 }
979
980
981 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
982
983
984 #define HB_KV_BUFFER_MAX_LEN 8
985 #define HB_KV_ITEMS_MAX_LEN 32
986
hbtk_get_label(HbKvData * kvdata,guint32 key)987 gchar *hbtk_get_label(HbKvData *kvdata, guint32 key)
988 {
989 gchar *retval = NULL;
990 guint32 i;
991
992 for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
993 {
994 HbKvData *tmp = &kvdata[i];
995 if( tmp->name == NULL )
996 break;
997 if( tmp->key == key )
998 {
999 //#1820372
1000 retval = (gchar *)_(tmp->name);
1001 break;
1002 }
1003 }
1004 return retval;
1005 }
1006
1007
hbtk_combo_box_is_separator(GtkTreeModel * model,GtkTreeIter * iter,gpointer data)1008 static gboolean hbtk_combo_box_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
1009 {
1010 //GtkTreePath *path;
1011 gboolean retval;
1012 gchar *txt;
1013
1014 gtk_tree_model_get (model, iter, 0, &txt, -1);
1015 retval = *txt == 0 ? TRUE : FALSE;
1016 //leak
1017 g_free(txt);
1018
1019 return retval;
1020 }
1021
1022
hbtk_combo_box_get_active_id(GtkComboBoxText * combobox)1023 guint32 hbtk_combo_box_get_active_id (GtkComboBoxText *combobox)
1024 {
1025 const gchar* buf;
1026 guint32 retval;
1027
1028 buf = gtk_combo_box_get_active_id(GTK_COMBO_BOX(combobox));
1029 retval = buf != NULL ? atoi(buf) : 0;
1030
1031 return retval;
1032 }
1033
1034
hbtk_combo_box_set_active_id(GtkComboBoxText * combobox,guint32 key)1035 void hbtk_combo_box_set_active_id (GtkComboBoxText *combobox, guint32 key)
1036 {
1037 gchar buf[HB_KV_BUFFER_MAX_LEN];
1038
1039 g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
1040 gtk_combo_box_set_active_id(GTK_COMBO_BOX(combobox), buf);
1041 }
1042
1043
hbtk_combo_box_text_append(GtkComboBoxText * combobox,guint32 key,gchar * text)1044 void hbtk_combo_box_text_append (GtkComboBoxText *combobox, guint32 key, gchar *text)
1045 {
1046 gchar buf[HB_KV_BUFFER_MAX_LEN];
1047
1048 g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
1049 gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), buf, text);
1050 }
1051
1052
hbtk_combo_box_new(GtkWidget * label)1053 GtkWidget *hbtk_combo_box_new (GtkWidget *label)
1054 {
1055 GtkWidget *combobox;
1056
1057 combobox = gtk_combo_box_text_new();
1058
1059 if(label)
1060 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1061
1062 return combobox;
1063 }
1064
1065
hbtk_combo_box_new_with_data(GtkWidget * label,HbKvData * kvdata)1066 GtkWidget *hbtk_combo_box_new_with_data (GtkWidget *label, HbKvData *kvdata)
1067 {
1068 GtkWidget *combobox = hbtk_combo_box_new(label);
1069 HbKvData *tmp;
1070 gboolean hassep;
1071 guint32 i;
1072
1073 hassep = FALSE;
1074 for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
1075 {
1076 tmp = &kvdata[i];
1077 if( tmp->name == NULL )
1078 break;
1079 if( *tmp->name != 0 )
1080 {
1081 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)_(tmp->name));
1082 }
1083 else
1084 {
1085 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)"");
1086 hassep = TRUE;
1087 }
1088 }
1089 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1090
1091 if(hassep)
1092 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL);
1093
1094 return combobox;
1095 }
1096
1097
1098 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1099
1100 static void
set_sensitive(GtkCellLayout * cell_layout,GtkCellRenderer * cell,GtkTreeModel * tree_model,GtkTreeIter * iter,gpointer data)1101 set_sensitive (GtkCellLayout *cell_layout,
1102 GtkCellRenderer *cell,
1103 GtkTreeModel *tree_model,
1104 GtkTreeIter *iter,
1105 gpointer data)
1106 {
1107 GtkTreePath *path;
1108 gint *indices;
1109 gboolean sensitive;
1110
1111 path = gtk_tree_model_get_path (tree_model, iter);
1112 indices = gtk_tree_path_get_indices (path);
1113 sensitive = indices[0] != FLT_RANGE_OTHER;
1114 gtk_tree_path_free (path);
1115
1116 g_object_set (cell, "sensitive", sensitive, NULL);
1117 }
1118
1119
1120
make_daterange(GtkWidget * label,guint dspmode)1121 GtkWidget *make_daterange(GtkWidget *label, guint dspmode)
1122 {
1123 GtkWidget *combobox = hbtk_combo_box_new(label);
1124 GList *renderers, *list;
1125 HbKvData *tmp, *kvdata = CYA_FLT_RANGE;
1126 guint32 i;
1127
1128 for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
1129 {
1130 tmp = &kvdata[i];
1131 if( tmp->name == NULL )
1132 break;
1133
1134 if( (tmp->key == FLT_RANGE_OTHER) )
1135 {
1136 if( dspmode == DATE_RANGE_CUSTOM_DISABLE )
1137 {
1138 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox));
1139 if(g_list_length(renderers) == 1)
1140 {
1141 list = g_list_first(renderers);
1142 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1143 list->data,
1144 set_sensitive,
1145 NULL, NULL);
1146 }
1147 g_list_free(renderers);
1148 }
1149 else
1150 if( dspmode == DATE_RANGE_CUSTOM_HIDE )
1151 {
1152 //if hide, we do not show it
1153 i++;
1154 continue;
1155 }
1156 }
1157
1158 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (*tmp->name != 0) ? (gchar *)_(tmp->name) : (gchar *)"");
1159 }
1160
1161 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1162 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL);
1163
1164 return combobox;
1165 }
1166
1167
1168 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1169
1170 /*
1171 id ofx english french
1172 ---------------------------------------------------------------------
1173 0 -------- (none) (aucun)
1174 1 -------- credit card carte de crédit
1175 2 OFX_CHECK Check cheque
1176 3 OFX_CASH Cash withdrawal retrait espece
1177 4 OFX_XFER Transfer virement
1178 5 -------- internal transfer virement compte
1179 6 -------- (debit card) (carte de paiement
1180 7 OFX_REPEATPMT Repeating payment/standing order Paiement recurrent/Virement auto.
1181
1182 8 OFX_PAYMENT Electronic payment télépaiement
1183 9 OFX_DEP Deposit dépôt
1184 10 OFX_FEE FI fee frais bancaires
1185
1186
1187 OFX_DIRECTDEBIT Merchant initiated debit prelevement
1188 OFX_OTHER Somer other type of transaction autre
1189
1190 other OFX values:
1191
1192 OFX_CREDIT Generic credit
1193 OFX_DEBIT Generic debit
1194 OFX_INT Interest earned or paid (Note: Depends on signage of amount)
1195 OFX_DIV Dividend
1196 OFX_SRVCHG Service charge
1197 -OFX_DEP Deposit
1198 OFX_ATM ATM debit or credit (Note: Depends on signage of amount)
1199 OFX_POS Point of sale debit or credit (Note: Depends on signage of amount)
1200 -OFX_XFER Transfer
1201 -OFX_CHECK Check
1202 -OFX_PAYMENT Electronic payment
1203 -OFX_CASH Cash withdrawal
1204 OFX_DIRECTDEP Direct deposit
1205 OFX_DIRECTDEBIT Merchant initiated debit
1206 -OFX_REPEATPMT Repeating payment/standing order
1207 OFX_OTHER Somer other type of transaction
1208 */
1209
1210 enum
1211 {
1212 LST_PAYMODE_KEY,
1213 LST_PAYMODE_ICONNAME,
1214 LST_PAYMODE_LABEL,
1215 NUM_LST_PAYMODE
1216 };
1217
1218
1219 HbKivData CYA_TXN_PAYMODE[NUM_PAYMODE_MAX] =
1220 {
1221 { PAYMODE_NONE, "pm-none", N_("(none)") },
1222 { PAYMODE_CCARD, "pm-ccard", N_("Credit card") },
1223 { PAYMODE_CHECK, "pm-check", N_("Check") },
1224 { PAYMODE_CASH, "pm-cash" , N_("Cash") },
1225 { PAYMODE_XFER, "pm-transfer", N_("Bank Transfer") },
1226 { PAYMODE_DCARD, "pm-dcard", N_("Debit card") },
1227 { PAYMODE_REPEATPMT, "pm-standingorder", N_("Standing order") },
1228 { PAYMODE_EPAYMENT, "pm-epayment", N_("Electronic payment") },
1229 { PAYMODE_DEPOSIT, "pm-deposit", N_("Deposit") },
1230 //TRANSLATORS: Financial institution fee
1231 { PAYMODE_FEE, "pm-fifee", N_("FI fee") },
1232 { PAYMODE_DIRECTDEBIT, "pm-directdebit", N_("Direct Debit") },
1233 { 0, NULL , NULL }
1234 };
1235
1236
1237 /* nota: used in ui-filter */
get_paymode_icon_name(guint32 key)1238 const gchar *get_paymode_icon_name(guint32 key)
1239 {
1240 const gchar *retval = NULL;
1241 HbKivData *kivdata = CYA_TXN_PAYMODE;
1242 guint32 i;
1243
1244 for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
1245 {
1246 HbKivData *tmp = &kivdata[i];
1247 if( tmp->name == NULL )
1248 break;
1249 if( tmp->key == key )
1250 {
1251 retval = tmp->iconname;
1252 break;
1253 }
1254 }
1255 return retval;
1256 }
1257
1258
paymode_combo_box_get_active(GtkComboBox * combo_box)1259 guint32 paymode_combo_box_get_active (GtkComboBox *combo_box)
1260 {
1261 GtkTreeModel *model;
1262 GtkTreeIter iter;
1263
1264 model = gtk_combo_box_get_model (combo_box);
1265
1266 if (gtk_combo_box_get_active_iter (combo_box, &iter))
1267 {
1268 gint key;
1269
1270 gtk_tree_model_get (model, &iter, LST_PAYMODE_KEY, &key, -1);
1271
1272 return (guint32)key;
1273 }
1274
1275
1276 return 0;
1277 }
1278
1279
paymode_combo_box_set_active(GtkComboBox * combo_box,guint32 active_key)1280 void paymode_combo_box_set_active (GtkComboBox *combo_box, guint32 active_key)
1281 {
1282 GtkTreeModel *model;
1283 GtkTreeIter iter;
1284
1285 model = gtk_combo_box_get_model (combo_box);
1286
1287 if (gtk_tree_model_get_iter_first (model, &iter))
1288 do {
1289 gint key;
1290
1291 gtk_tree_model_get (model, &iter, LST_PAYMODE_KEY, &key, -1);
1292
1293 if (key == (gint)active_key)
1294 {
1295 gtk_combo_box_set_active_iter (combo_box, &iter);
1296 break;
1297 }
1298 } while (gtk_tree_model_iter_next (model, &iter));
1299
1300 }
1301
1302
1303 /*
1304 ** Make a paymode combobox widget
1305 */
make_paymode_internal(GtkWidget * label,gboolean intxfer)1306 static GtkWidget *make_paymode_internal(GtkWidget *label, gboolean intxfer)
1307 {
1308 GtkListStore *store;
1309 GtkTreeIter iter;
1310 GtkWidget *combobox;
1311 GtkCellRenderer *renderer, *r1, *r2;
1312 HbKivData *tmp, *kvdata = CYA_TXN_PAYMODE;
1313 guint i;
1314
1315 store = gtk_list_store_new (
1316 NUM_LST_PAYMODE,
1317 G_TYPE_INT,
1318 G_TYPE_STRING,
1319 G_TYPE_STRING
1320 );
1321
1322 combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
1323 //leak
1324 g_object_unref(store);
1325
1326 renderer = r1 = gtk_cell_renderer_pixbuf_new();
1327 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1328 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_PAYMODE_ICONNAME);
1329
1330 renderer = r2 = gtk_cell_renderer_text_new();
1331 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1332 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "text", LST_PAYMODE_LABEL);
1333
1334 //populate our combobox model
1335 for(i=0;i<NUM_PAYMODE_MAX;i++)
1336 {
1337 tmp = &kvdata[i];
1338 if( tmp->name == NULL )
1339 break;
1340 gtk_list_store_append(store, &iter);
1341 gtk_list_store_set(store, &iter,
1342 LST_PAYMODE_KEY, tmp->key,
1343 LST_PAYMODE_ICONNAME, tmp->iconname,
1344 LST_PAYMODE_LABEL, _(tmp->name),
1345 -1);
1346 }
1347
1348 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1349
1350 if(label)
1351 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1352
1353 return combobox;
1354 }
1355
1356
1357
make_paymode(GtkWidget * label)1358 GtkWidget *make_paymode(GtkWidget *label)
1359 {
1360 return make_paymode_internal(label, TRUE);
1361 }
1362
make_paymode_nointxfer(GtkWidget * label)1363 GtkWidget *make_paymode_nointxfer(GtkWidget *label)
1364 {
1365 return make_paymode_internal(label, FALSE);
1366 }
1367
1368
1369 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1370
1371 #define NUM_NAINEX_MAX 3
1372
1373 enum
1374 {
1375 LST_NAINEX_ICONNAME,
1376 LST_NAINEX_LABEL,
1377 NUM_LST_NAINEX
1378 };
1379
1380 char *nainex_iconnames[NUM_NAINEX_MAX] =
1381 {
1382 "flt-inactive",
1383 "flt-include",
1384 "flt-exclude",
1385 };
1386
1387 extern gchar *nainex_label_names[];
1388
1389 /*
1390 ** Make a nainex combobox widget
1391 */
make_nainex(GtkWidget * label)1392 GtkWidget *make_nainex(GtkWidget *label)
1393 {
1394 GtkListStore *store;
1395 GtkTreeIter iter;
1396 GtkWidget *combobox;
1397 GtkCellRenderer *renderer;
1398 guint i;
1399
1400 //store
1401 store = gtk_list_store_new (
1402 NUM_LST_NAINEX,
1403 G_TYPE_STRING,
1404 G_TYPE_STRING
1405 );
1406
1407 //combobox
1408 combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
1409
1410 //column 1
1411 renderer = gtk_cell_renderer_pixbuf_new();
1412 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1413 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_NAINEX_ICONNAME);
1414
1415 renderer = gtk_cell_renderer_text_new();
1416 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1417 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "text", LST_NAINEX_LABEL);
1418
1419 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1420
1421 //populate our combobox model
1422 for(i=0;i<NUM_NAINEX_MAX;i++)
1423 {
1424 gtk_list_store_append(store, &iter);
1425 gtk_list_store_set(store, &iter,
1426 LST_NAINEX_ICONNAME, nainex_iconnames[i],
1427 LST_NAINEX_LABEL, _(nainex_label_names[i]),
1428 -1);
1429 }
1430 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1431
1432 if(label)
1433 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1434
1435 return combobox;
1436 }
1437
1438