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