]> Dogcows Code - chaz/homebank/blob - src/ui-widgets.c
Merge branch 'upstream'
[chaz/homebank] / src / ui-widgets.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 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 gchar *CYA_FLT_RANGE[];
45
46
47
48
49 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
50
51
52
53 void
54 gimp_label_set_attributes (GtkLabel *label,
55 ...)
56 {
57 PangoAttribute *attr = NULL;
58 PangoAttrList *attrs;
59 va_list args;
60
61 g_return_if_fail (GTK_IS_LABEL (label));
62
63 attrs = pango_attr_list_new ();
64
65 va_start (args, label);
66
67 do
68 {
69 PangoAttrType attr_type = va_arg (args, PangoAttrType);
70
71 if (attr_type <= 0)
72 attr_type = PANGO_ATTR_INVALID;
73
74 switch (attr_type)
75 {
76 case PANGO_ATTR_LANGUAGE:
77 attr = pango_attr_language_new (va_arg (args, PangoLanguage *));
78 break;
79
80 case PANGO_ATTR_FAMILY:
81 attr = pango_attr_family_new (va_arg (args, const gchar *));
82 break;
83
84 case PANGO_ATTR_STYLE:
85 attr = pango_attr_style_new (va_arg (args, PangoStyle));
86 break;
87
88 case PANGO_ATTR_WEIGHT:
89 attr = pango_attr_weight_new (va_arg (args, PangoWeight));
90 break;
91
92 case PANGO_ATTR_VARIANT:
93 attr = pango_attr_variant_new (va_arg (args, PangoVariant));
94 break;
95
96 case PANGO_ATTR_STRETCH:
97 attr = pango_attr_stretch_new (va_arg (args, PangoStretch));
98 break;
99
100 case PANGO_ATTR_SIZE:
101 attr = pango_attr_size_new (va_arg (args, gint));
102 break;
103
104 case PANGO_ATTR_FONT_DESC:
105 attr = pango_attr_font_desc_new (va_arg (args,
106 const PangoFontDescription *));
107 break;
108
109 case PANGO_ATTR_FOREGROUND:
110 {
111 const PangoColor *color = va_arg (args, const PangoColor *);
112
113 attr = pango_attr_foreground_new (color->red,
114 color->green,
115 color->blue);
116 }
117 break;
118
119 case PANGO_ATTR_BACKGROUND:
120 {
121 const PangoColor *color = va_arg (args, const PangoColor *);
122
123 attr = pango_attr_background_new (color->red,
124 color->green,
125 color->blue);
126 }
127 break;
128
129 case PANGO_ATTR_UNDERLINE:
130 attr = pango_attr_underline_new (va_arg (args, PangoUnderline));
131 break;
132
133 case PANGO_ATTR_STRIKETHROUGH:
134 attr = pango_attr_strikethrough_new (va_arg (args, gboolean));
135 break;
136
137 case PANGO_ATTR_RISE:
138 attr = pango_attr_rise_new (va_arg (args, gint));
139 break;
140
141 case PANGO_ATTR_SCALE:
142 attr = pango_attr_scale_new (va_arg (args, gdouble));
143 break;
144
145 default:
146 //g_warning ("%s: invalid PangoAttribute type %d", G_STRFUNC, attr_type);
147 case PANGO_ATTR_INVALID:
148 attr = NULL;
149 break;
150 }
151
152 if (attr)
153 {
154 attr->start_index = 0;
155 attr->end_index = -1;
156 pango_attr_list_insert (attrs, attr);
157 }
158 }
159 while (attr);
160
161 va_end (args);
162
163 gtk_label_set_attributes (label, attrs);
164 pango_attr_list_unref (attrs);
165 }
166
167
168 void hb_widget_visible(GtkWidget *widget, gboolean visible)
169 {
170 if(!GTK_IS_WIDGET(widget))
171 return;
172
173 if(visible)
174 {
175 gtk_widget_show(widget);
176 }
177 else
178 {
179 gtk_widget_hide(widget);
180 }
181 }
182
183
184 void ui_label_set_integer(GtkLabel *label, gint value)
185 {
186 gchar buf[16];
187
188 g_snprintf(buf, 16, "%d", value);
189 gtk_label_set_text (label, buf);
190 }
191
192
193 void ui_gtk_entry_tag_name_append(GtkEntry *entry, gchar *tagname)
194 {
195 GtkEntryBuffer *buffer;
196 const gchar *text;
197 guint len;
198
199 text = gtk_entry_get_text(entry);
200 if( g_strstr_len(text, -1, tagname) == NULL )
201 {
202 DB( g_print(" gtkentry append tagname '%'\n", tagname) );
203 buffer = gtk_entry_get_buffer(GTK_ENTRY(entry));
204 if(buffer)
205 {
206 len = gtk_entry_buffer_get_length(buffer);
207 DB( g_print("- add ' %s' %p %d\n", tagname, buffer, len) );
208 if(len > 0)
209 gtk_entry_buffer_insert_text(buffer, len, " ", 1);
210 gtk_entry_buffer_insert_text(buffer, len+1, tagname, -1);
211 }
212 }
213
214 }
215
216
217 void ui_gtk_entry_set_text(GtkWidget *widget, gchar *text)
218 {
219 DB( g_print(" set text to '%s'\n", text) );
220
221 if( text != NULL )
222 gtk_entry_set_text(GTK_ENTRY(widget), text);
223 else
224 gtk_entry_set_text(GTK_ENTRY(widget), "");
225 }
226
227 void ui_gtk_entry_replace_text(GtkWidget *widget, gchar **storage)
228 {
229 const gchar *text;
230
231 DB( g_print(" storage is '%p' at '%p'\n", *storage, storage) );
232
233 /* free any previous string */
234 if( *storage != NULL )
235 {
236 g_free(*storage);
237 }
238
239 *storage = NULL;
240 text = gtk_entry_get_text(GTK_ENTRY(widget));
241 *storage = g_strdup(text);
242 }
243
244
245 GtkWidget *make_clicklabel(gchar *id, gchar *str)
246 {
247 GtkWidget *label;
248 gchar buffer[255];
249
250 g_snprintf(buffer, 254, "<a href=\"%s\">%s</a>", id, str);
251 label = gtk_label_new(buffer);
252 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
253 gtk_label_set_track_visited_links(GTK_LABEL(label), FALSE);
254 gtk_widget_set_halign(label, GTK_ALIGN_START);
255
256 return GTK_WIDGET(label);
257 }
258
259
260 GtkWidget *make_label_group(gchar *str)
261 {
262 GtkWidget *label = gtk_label_new (str);
263
264 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
265 gtk_widget_set_halign (label, GTK_ALIGN_START);
266 gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
267 return label;
268 }
269
270
271 GtkWidget *make_label_widget(char *str)
272 {
273 GtkWidget *label = gtk_label_new_with_mnemonic (str);
274
275 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
276 gtk_widget_set_halign (label, GTK_ALIGN_END);
277 return label;
278 }
279
280
281 GtkWidget *make_label(char *str, gfloat xalign, gfloat yalign)
282 {
283 GtkWidget *label = gtk_label_new_with_mnemonic (str);
284
285 #if GTK_MINOR_VERSION >= 16
286 gtk_label_set_xalign(GTK_LABEL(label), xalign);
287 gtk_label_set_yalign(GTK_LABEL(label), yalign);
288 #else
289 gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign);
290 #endif
291 return label;
292 }
293
294
295 /*
296 **
297 */
298 GtkWidget *make_text(gfloat xalign)
299 {
300 GtkWidget *entry;
301
302 entry = gtk_entry_new ();
303 gtk_editable_set_editable (GTK_EDITABLE(entry), FALSE);
304 g_object_set(entry, "xalign", xalign, NULL);
305 return entry;
306 }
307
308
309 GtkWidget *make_search(void)
310 {
311 GtkWidget *search;
312
313 search = gtk_search_entry_new();
314 gtk_entry_set_placeholder_text(GTK_ENTRY(search), _("Search...") );
315
316 return search;
317 }
318
319
320
321 /*
322 **
323 */
324 GtkWidget *make_string(GtkWidget *label)
325 {
326 GtkWidget *entry;
327
328 entry = gtk_entry_new ();
329
330 if(label)
331 gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry);
332
333 return entry;
334 }
335
336
337 GtkWidget *make_image_button(gchar *icon_name, gchar *tooltip_text)
338 {
339 GtkWidget *button, *image;
340
341 //todo 3.10 use gtk_button_new_from_icon_name
342
343 button = gtk_button_new();
344 image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
345 g_object_set (button, "image", image, NULL);
346 if(tooltip_text != NULL)
347 gtk_widget_set_tooltip_text(button, tooltip_text);
348
349 return button;
350 }
351
352
353
354 /*
355 **
356 */
357 GtkWidget *make_memo_entry(GtkWidget *label)
358 {
359 GtkListStore *store;
360 GtkWidget *entry;
361 GtkEntryCompletion *completion;
362 GList *lmem, *list;
363
364 store = gtk_list_store_new (1, G_TYPE_STRING);
365
366 completion = gtk_entry_completion_new ();
367 gtk_entry_completion_set_model (completion, GTK_TREE_MODEL(store));
368 gtk_entry_completion_set_text_column (completion, 0);
369
370 entry = gtk_entry_new ();
371 gtk_entry_set_completion (GTK_ENTRY (entry), completion);
372
373 g_object_unref(store);
374
375 //populate
376 //gtk_list_store_clear (GTK_LIST_STORE(store));
377
378 lmem = list = g_hash_table_get_keys(GLOBALS->h_memo);
379 while (list != NULL)
380 {
381 GtkTreeIter iter;
382
383 //gtk_list_store_append (GTK_LIST_STORE(store), &iter);
384 //gtk_list_store_set (GTK_LIST_STORE(store), &iter, 0, list->data, -1);
385 gtk_list_store_insert_with_values(GTK_LIST_STORE(store), &iter, -1,
386 0, list->data,
387 -1);
388
389 list = g_list_next(list);
390 }
391
392 g_list_free(lmem);
393
394 if(label)
395 gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry);
396
397 return entry;
398 }
399
400
401 /*
402 **
403 */
404 GtkWidget *make_string_maxlength(GtkWidget *label, guint max_length)
405 {
406 GtkWidget *entry;
407
408 entry = make_string(label);
409 gtk_entry_set_width_chars(GTK_ENTRY(entry), max_length+2);
410 gtk_entry_set_max_length(GTK_ENTRY(entry), max_length);
411
412 return entry;
413 }
414
415
416
417 static void hb_amount_insert_text_handler (GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data)
418 {
419 GtkEditable *editable = GTK_EDITABLE(entry);
420 int i, count=0, dcpos=-1;
421 gchar *result = g_new0 (gchar, length+1);
422 int digits = 2;
423 const gchar *numtext;
424
425 //g_message("insert_text-handler: text:%s - pos:%d - length:%d", text, *position, length);
426
427 digits = gtk_spin_button_get_digits(GTK_SPIN_BUTTON(entry));
428 numtext = gtk_entry_get_text(entry);
429 for (i=0 ; numtext[i]!='\0' ; i++)
430 {
431 if(numtext[i]==',' || numtext[i]=='.')
432 dcpos = i;
433 }
434
435 //g_message("previous text='%s' dcpos:'%d'", numtext, dcpos);
436 for (i=0 ; i < length ; i++)
437 {
438 if( g_ascii_isdigit(text[i]) && ( (*position <= dcpos + digits) || dcpos < 0) )
439 goto inserttext;
440
441 if( text[i]=='-' && *position==0 ) /* minus sign only at position 0 */
442 goto inserttext;
443
444 if( dcpos < 0 && (text[i]=='.' || text[i]==',') ) /* decimal separator if not in previous string */
445 result[count++] = '.';
446
447 continue;
448
449 inserttext:
450 result[count++] = text[i];
451 }
452
453 if (count > 0) {
454 g_signal_handlers_block_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data);
455 gtk_editable_insert_text (editable, result, count, position);
456 g_signal_handlers_unblock_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data);
457 }
458 g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text");
459
460 g_free (result);
461 }
462
463 /*
464 **
465 */
466 GtkWidget *make_amount(GtkWidget *label)
467 {
468 GtkWidget *spinner;
469 GtkAdjustment *adj;
470
471 //adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -G_MAXDOUBLE, G_MAXDOUBLE, 0.01, 1.0, 0.0);
472 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -8589934588, 8589934588, 0.01, 1.0, 0.0);
473 spinner = gtk_spin_button_new (adj, 1.0, 2);
474 g_object_set(spinner, "xalign", 1.0, NULL);
475
476 if(label)
477 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
478
479 g_signal_connect(G_OBJECT(spinner), "insert-text",
480 G_CALLBACK(hb_amount_insert_text_handler),
481 NULL);
482
483 return spinner;
484 }
485
486
487 GtkWidget *make_exchange_rate(GtkWidget *label)
488 {
489 GtkWidget *spinner;
490 GtkAdjustment *adj;
491
492 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 99999, 0.01, 1.0, 0.0);
493 spinner = gtk_spin_button_new (adj, 1.0, 8);
494 //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
495 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
496 g_object_set(spinner, "xalign", 1.0, NULL);
497
498 if(label)
499 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
500
501 return spinner;
502 }
503
504 /*
505 **
506 */
507 GtkWidget *make_numeric(GtkWidget *label, gdouble min, gdouble max)
508 {
509 GtkWidget *spinner;
510 GtkAdjustment *adj;
511
512 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, min, max, 1.0, 10.0, 0.0);
513 spinner = gtk_spin_button_new (adj, 0, 0);
514 //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
515 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
516 g_object_set(spinner, "xalign", 1.0, NULL);
517
518 if(label)
519 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
520
521 return spinner;
522 }
523
524 /*
525 **
526 */
527 GtkWidget *make_scale(GtkWidget *label)
528 {
529 GtkWidget *scale;
530
531 scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, GTK_CHART_MINBARW, GTK_CHART_SPANBARW, 1.0);
532 gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE);
533 gtk_range_set_value(GTK_RANGE(scale), GTK_CHART_BARW);
534
535 if(label)
536 gtk_label_set_mnemonic_widget (GTK_LABEL(label), scale);
537
538 return scale;
539 }
540
541 /*
542 **
543 */
544 GtkWidget *make_long(GtkWidget *label)
545 {
546 GtkWidget *spinner;
547
548 spinner = make_numeric(label, 0.0, G_MAXINT);
549 return spinner;
550 }
551
552
553 GtkWidget *make_year(GtkWidget *label)
554 {
555 GtkWidget *spinner;
556 GtkAdjustment *adj;
557
558 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 1900, 2200, 1.0, 10.0, 0.0);
559 spinner = gtk_spin_button_new (adj, 0, 0);
560 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
561 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
562 g_object_set(spinner, "xalign", 1.0, NULL);
563
564 if(label)
565 gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
566
567 return spinner;
568 }
569
570
571 static gboolean
572 is_separator (GtkTreeModel *model,
573 GtkTreeIter *iter,
574 gpointer data)
575 {
576 //GtkTreePath *path;
577 gboolean retval;
578 gchar *txt;
579
580 gtk_tree_model_get (model, iter, 0, &txt, -1);
581
582 retval = *txt == 0 ? TRUE : FALSE;
583 //path = gtk_tree_model_get_path (model, iter);
584 //result = gtk_tree_path_get_indices (path)[0] == 4;
585 //gtk_tree_path_free (path);
586
587 //leak
588 g_free(txt);
589
590
591 return retval;
592 }
593
594 static void
595 set_sensitive (GtkCellLayout *cell_layout,
596 GtkCellRenderer *cell,
597 GtkTreeModel *tree_model,
598 GtkTreeIter *iter,
599 gpointer data)
600 {
601 GtkTreePath *path;
602 gint *indices;
603 gboolean sensitive;
604
605 path = gtk_tree_model_get_path (tree_model, iter);
606 indices = gtk_tree_path_get_indices (path);
607 sensitive = indices[0] != FLT_RANGE_OTHER;
608 gtk_tree_path_free (path);
609
610 g_object_set (cell, "sensitive", sensitive, NULL);
611 }
612
613
614 GtkWidget *make_cycle(GtkWidget *label, gchar **items)
615 {
616 GtkWidget *combobox;
617 guint i;
618
619 combobox = gtk_combo_box_text_new ();
620
621 for (i = 0; items[i] != NULL; i++)
622 {
623 if(*items[i] != 0)
624 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), _(items[i]));
625 else
626 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), "");
627 }
628 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
629 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL);
630
631 if(label)
632 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
633
634 return combobox;
635 }
636
637
638 GtkWidget *make_daterange(GtkWidget *label, gboolean custom)
639 {
640 GtkWidget *combobox;
641 GList *renderers, *list;
642 GtkCellRenderer *renderer;
643 gchar **items = CYA_FLT_RANGE;
644 guint i;
645
646 combobox = gtk_combo_box_text_new ();
647
648 for (i = 0; items[i] != NULL; i++)
649 {
650 if(*items[i] != 0)
651 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), _(items[i]));
652 else
653 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), "");
654 }
655 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
656
657 if(label)
658 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
659
660 // special stuffs
661 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox));
662 if(g_list_length(renderers) == 1 && custom == FALSE)
663 {
664 list = g_list_first(renderers);
665 renderer = list->data;
666
667
668 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
669 renderer,
670 set_sensitive,
671 NULL, NULL);
672 }
673 g_list_free(renderers);
674
675 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL);
676
677 return combobox;
678 }
679
680
681 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
682
683 #define HB_KV_BUFFER_MAX_LEN 8
684 #define HB_KV_ITEMS_MAX_LEN 32
685
686 gchar *hbtk_get_label(HbKvData *kvdata, guint32 key)
687 {
688 gchar *retval = NULL;
689 guint32 i;
690
691 for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
692 {
693 HbKvData *tmp = &kvdata[i];
694 if( tmp->name == NULL )
695 break;
696 if( tmp->key == key )
697 {
698 //#1820372
699 retval = (gchar *)_(tmp->name);
700 break;
701 }
702 }
703 return retval;
704 }
705
706
707 static gboolean hbtk_combo_box_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
708 {
709 //GtkTreePath *path;
710 gboolean retval;
711 gchar *txt;
712
713 gtk_tree_model_get (model, iter, 0, &txt, -1);
714 retval = *txt == 0 ? TRUE : FALSE;
715 //leak
716 g_free(txt);
717
718 return retval;
719 }
720
721
722 guint32 hbtk_combo_box_get_active_id (GtkComboBoxText *combobox)
723 {
724 const gchar* buf;
725 guint32 retval;
726
727 buf = gtk_combo_box_get_active_id(GTK_COMBO_BOX(combobox));
728 retval = buf != NULL ? atoi(buf) : 0;
729
730 return retval;
731 }
732
733
734 void hbtk_combo_box_set_active_id (GtkComboBoxText *combobox, guint32 key)
735 {
736 gchar buf[HB_KV_BUFFER_MAX_LEN];
737
738 g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
739 gtk_combo_box_set_active_id(GTK_COMBO_BOX(combobox), buf);
740 }
741
742
743 void hbtk_combo_box_text_append (GtkComboBoxText *combobox, guint32 key, gchar *text)
744 {
745 gchar buf[HB_KV_BUFFER_MAX_LEN];
746
747 g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
748 gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), buf, text);
749 }
750
751
752 GtkWidget *hbtk_combo_box_new (GtkWidget *label)
753 {
754 GtkWidget *combobox;
755
756 combobox = gtk_combo_box_text_new();
757
758 if(label)
759 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
760
761 return combobox;
762 }
763
764
765 GtkWidget *hbtk_combo_box_new_with_data (GtkWidget *label, HbKvData *kvdata)
766 {
767 GtkWidget *combobox = hbtk_combo_box_new(label);
768 HbKvData *tmp;
769 gboolean hassep;
770 guint32 i;
771
772 hassep = FALSE;
773 for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
774 {
775 tmp = &kvdata[i];
776 if( tmp->name == NULL )
777 break;
778 if( *tmp->name != 0 )
779 {
780 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)_(tmp->name));
781 }
782 else
783 {
784 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)"");
785 hassep = TRUE;
786 }
787 }
788 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
789
790 if(hassep)
791 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL);
792
793 return combobox;
794 }
795
796
797 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
798
799
800 gint hbtk_radio_get_active (GtkContainer *container)
801 {
802 GList *lchild, *list;
803 GtkWidget *radio;
804 gint i, retval = 0;
805
806 if(!GTK_IS_CONTAINER(container))
807 return -1;
808
809 lchild = list = gtk_container_get_children (container);
810 for(i=0;list != NULL;i++)
811 {
812 radio = list->data;
813 if(GTK_IS_TOGGLE_BUTTON(radio))
814 {
815 if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)) == TRUE )
816 {
817 retval = i;
818 break;
819 }
820 }
821 list = g_list_next(list);
822 }
823 g_list_free(lchild);
824
825 return retval;
826 }
827
828
829 void hbtk_radio_set_active (GtkContainer *container, gint active)
830 {
831 GList *lchild, *list;
832 GtkWidget *radio;
833
834 if(!GTK_IS_CONTAINER(container))
835 return;
836
837 lchild = list = gtk_container_get_children (container);
838 radio = g_list_nth_data (list, active);
839 if(radio != NULL && GTK_IS_TOGGLE_BUTTON(radio))
840 {
841 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio), TRUE);
842 }
843 g_list_free(lchild);
844 }
845
846
847 GtkWidget *hbtk_radio_get_nth (GtkContainer *container, gint nth)
848 {
849 GList *lchild, *list;
850 GtkWidget *radio;
851
852 if(!GTK_IS_CONTAINER(container))
853 return NULL;
854
855 lchild = list = gtk_container_get_children (container);
856 radio = g_list_nth_data (list, nth);
857 g_list_free(lchild);
858 return radio; //may return NULL
859 }
860
861
862 void hbtk_radio_connect(GtkContainer *container, const gchar *detailed_signal, GCallback c_handler, gpointer data)
863 {
864 GList *lchild, *list;
865 GtkWidget *radio;
866 gint i;
867
868 if(!GTK_IS_CONTAINER(container))
869 return;
870
871 lchild = list = gtk_container_get_children (container);
872 for(i=0;list != NULL;i++)
873 {
874 radio = list->data;
875 if(GTK_IS_TOGGLE_BUTTON(radio))
876 {
877 g_signal_connect (radio, "toggled", c_handler, data);
878 }
879 list = g_list_next(list);
880 }
881 g_list_free(lchild);
882
883 }
884
885
886 GtkWidget *hbtk_radio_new (gchar **items, gboolean buttonstyle)
887 {
888 GtkWidget *box, *button, *newbutton;
889 guint i;
890
891 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
892
893 button = gtk_radio_button_new_with_label (NULL, _(items[0]));
894 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), !buttonstyle);
895 gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
896 for (i = 1; items[i] != NULL; i++)
897 {
898 newbutton = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button), _(items[i]));
899 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (newbutton), !buttonstyle);
900 gtk_box_pack_start (GTK_BOX (box), newbutton, FALSE, FALSE, 0);
901 }
902
903 if(buttonstyle)
904 {
905 gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
906 gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
907 }
908
909 return box;
910 }
911
912
913 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
914
915 /*
916 id ofx english french
917 ---------------------------------------------------------------------
918 0 -------- (none) (aucun)
919 1 -------- credit card carte de crédit
920 2 OFX_CHECK Check cheque
921 3 OFX_CASH Cash withdrawal retrait espece
922 4 OFX_XFER Transfer virement
923 5 -------- internal transfer virement compte
924 6 -------- (debit card) (carte de paiement
925 7 OFX_REPEATPMT Repeating payment/standing order Paiement recurrent/Virement auto.
926
927 8 OFX_PAYMENT Electronic payment télépaiement
928 9 OFX_DEP Deposit dépôt
929 10 OFX_FEE FI fee frais bancaires
930
931
932 OFX_DIRECTDEBIT Merchant initiated debit prelevement
933 OFX_OTHER Somer other type of transaction autre
934
935 other OFX values:
936
937 OFX_CREDIT Generic credit
938 OFX_DEBIT Generic debit
939 OFX_INT Interest earned or paid (Note: Depends on signage of amount)
940 OFX_DIV Dividend
941 OFX_SRVCHG Service charge
942 -OFX_DEP Deposit
943 OFX_ATM ATM debit or credit (Note: Depends on signage of amount)
944 OFX_POS Point of sale debit or credit (Note: Depends on signage of amount)
945 -OFX_XFER Transfer
946 -OFX_CHECK Check
947 -OFX_PAYMENT Electronic payment
948 -OFX_CASH Cash withdrawal
949 OFX_DIRECTDEP Direct deposit
950 OFX_DIRECTDEBIT Merchant initiated debit
951 -OFX_REPEATPMT Repeating payment/standing order
952 OFX_OTHER Somer other type of transaction
953 */
954
955 enum
956 {
957 LST_PAYMODE_ICONNAME,
958 LST_PAYMODE_LABEL,
959 NUM_LST_PAYMODE
960 };
961
962 char *paymode_iconnames[NUM_PAYMODE_MAX] =
963 {
964 "pm-none",
965 "pm-ccard",
966 "pm-check",
967 "pm-cash" ,
968 "pm-transfer",
969 "pm-intransfer",
970 "pm-dcard",
971 "pm-standingorder",
972 "pm-epayment",
973 "pm-deposit",
974 "pm-fifee",
975 "pm-directdebit"
976 };
977
978 char *paymode_label_names[NUM_PAYMODE_MAX] =
979 {
980 N_("(none)"),
981 N_("Credit card"),
982 N_("Check"),
983 N_("Cash"),
984 N_("Transfer"),
985 N_("Internal transfer"),
986 N_("Debit card"),
987 N_("Standing order"),
988 N_("Electronic payment"),
989 N_("Deposit"),
990 //TRANSLATORS: Financial institution fee
991 N_("FI fee"),
992 N_("Direct Debit")
993 };
994
995 /* nota: used in ui-filter */
996 gchar *get_paymode_icon_name(gint index)
997 {
998 if(index >= NUM_PAYMODE_MAX)
999 return NULL;
1000
1001 return paymode_iconnames[index];
1002 }
1003
1004
1005 /*
1006 ** Make a paymode combobox widget
1007 */
1008
1009 static void
1010 paymode_set_sensitive (GtkCellLayout *cell_layout,
1011 GtkCellRenderer *cell,
1012 GtkTreeModel *tree_model,
1013 GtkTreeIter *iter,
1014 gpointer data)
1015 {
1016 GtkTreePath *path;
1017 gint *indices;
1018 gboolean sensitive;
1019
1020 path = gtk_tree_model_get_path (tree_model, iter);
1021 indices = gtk_tree_path_get_indices (path);
1022 sensitive = (indices[0] == PAYMODE_INTXFER) ? FALSE : TRUE;
1023 gtk_tree_path_free (path);
1024
1025
1026 g_object_set (cell, "sensitive", sensitive, NULL);
1027 }
1028
1029
1030
1031 static GtkWidget *make_paymode_internal(GtkWidget *label, gboolean intxfer)
1032 {
1033 GtkListStore *store;
1034 GtkTreeIter iter;
1035 GtkWidget *combobox;
1036 GtkCellRenderer *renderer, *r1, *r2;
1037 guint i;
1038
1039 store = gtk_list_store_new (
1040 NUM_LST_PAYMODE,
1041 G_TYPE_STRING,
1042 G_TYPE_STRING
1043 );
1044
1045 combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
1046 g_object_unref(store);
1047
1048 renderer = r1 = gtk_cell_renderer_pixbuf_new();
1049 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1050 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_PAYMODE_ICONNAME);
1051
1052 renderer = r2 = gtk_cell_renderer_text_new();
1053 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1054 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "text", LST_PAYMODE_LABEL);
1055
1056
1057 if( intxfer == FALSE )
1058 {
1059 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1060 r1,
1061 paymode_set_sensitive,
1062 NULL, NULL);
1063 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1064 r2,
1065 paymode_set_sensitive,
1066 NULL, NULL);
1067 }
1068
1069 //populate our combobox model
1070 for(i=0;i<NUM_PAYMODE_MAX;i++)
1071 {
1072 gtk_list_store_append(store, &iter);
1073 gtk_list_store_set(store, &iter,
1074 LST_PAYMODE_ICONNAME, paymode_iconnames[i],
1075 LST_PAYMODE_LABEL, _(paymode_label_names[i]),
1076 -1);
1077 }
1078
1079 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1080
1081 if(label)
1082 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1083
1084 return combobox;
1085 }
1086
1087
1088
1089 GtkWidget *make_paymode(GtkWidget *label)
1090 {
1091 return make_paymode_internal(label, TRUE);
1092 }
1093
1094 GtkWidget *make_paymode_nointxfer(GtkWidget *label)
1095 {
1096 return make_paymode_internal(label, FALSE);
1097 }
1098
1099
1100 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1101
1102 #define NUM_NAINEX_MAX 3
1103
1104 enum
1105 {
1106 LST_NAINEX_ICONNAME,
1107 LST_NAINEX_LABEL,
1108 NUM_LST_NAINEX
1109 };
1110
1111 char *nainex_iconnames[NUM_NAINEX_MAX] =
1112 {
1113 "flt-inactive",
1114 "flt-include",
1115 "flt-exclude",
1116 };
1117
1118 extern gchar *nainex_label_names[];
1119
1120 /*
1121 ** Make a nainex combobox widget
1122 */
1123 GtkWidget *make_nainex(GtkWidget *label)
1124 {
1125 GtkListStore *store;
1126 GtkTreeIter iter;
1127 GtkWidget *combobox;
1128 GtkCellRenderer *renderer;
1129 guint i;
1130
1131 //store
1132 store = gtk_list_store_new (
1133 NUM_LST_NAINEX,
1134 G_TYPE_STRING,
1135 G_TYPE_STRING
1136 );
1137
1138 //combobox
1139 combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
1140
1141 //column 1
1142 renderer = gtk_cell_renderer_pixbuf_new();
1143 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1144 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_NAINEX_ICONNAME);
1145
1146 renderer = gtk_cell_renderer_text_new();
1147 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1148 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "text", LST_NAINEX_LABEL);
1149
1150 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1151
1152 //populate our combobox model
1153 for(i=0;i<NUM_NAINEX_MAX;i++)
1154 {
1155 gtk_list_store_append(store, &iter);
1156 gtk_list_store_set(store, &iter,
1157 LST_NAINEX_ICONNAME, nainex_iconnames[i],
1158 LST_NAINEX_LABEL, _(nainex_label_names[i]),
1159 -1);
1160 }
1161 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1162
1163 if(label)
1164 gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1165
1166 return combobox;
1167 }
1168
This page took 0.084312 seconds and 4 git commands to generate.