1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
4 * This file is part of HomeBank.
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.
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.
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/>.
23 #include "gtk-chart.h"
24 #include "ui-widgets.h"
26 /****************************************************************************/
28 /****************************************************************************/
37 /* our global datas */
38 extern struct HomeBank
*GLOBALS
;
41 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
44 extern HbKvData CYA_FLT_RANGE
[];
47 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
49 //TODO: only WEIGHT & SCALE are used for now
51 gimp_label_set_attributes (GtkLabel
*label
,
54 PangoAttribute
*attr
= NULL
;
58 g_return_if_fail (GTK_IS_LABEL (label
));
60 attrs
= pango_attr_list_new ();
62 va_start (args
, label
);
66 PangoAttrType attr_type
= va_arg (args
, PangoAttrType
);
69 attr_type
= PANGO_ATTR_INVALID
;
73 case PANGO_ATTR_LANGUAGE
:
74 attr
= pango_attr_language_new (va_arg (args
, PangoLanguage
*));
77 case PANGO_ATTR_FAMILY
:
78 attr
= pango_attr_family_new (va_arg (args
, const gchar
*));
81 case PANGO_ATTR_STYLE
:
82 attr
= pango_attr_style_new (va_arg (args
, PangoStyle
));
85 case PANGO_ATTR_WEIGHT
:
86 attr
= pango_attr_weight_new (va_arg (args
, PangoWeight
));
89 case PANGO_ATTR_VARIANT
:
90 attr
= pango_attr_variant_new (va_arg (args
, PangoVariant
));
93 case PANGO_ATTR_STRETCH
:
94 attr
= pango_attr_stretch_new (va_arg (args
, PangoStretch
));
98 attr
= pango_attr_size_new (va_arg (args
, gint
));
101 case PANGO_ATTR_FONT_DESC
:
102 attr
= pango_attr_font_desc_new (va_arg (args
,
103 const PangoFontDescription
*));
106 case PANGO_ATTR_FOREGROUND
:
108 const PangoColor
*color
= va_arg (args
, const PangoColor
*);
110 attr
= pango_attr_foreground_new (color
->red
,
116 case PANGO_ATTR_BACKGROUND
:
118 const PangoColor
*color
= va_arg (args
, const PangoColor
*);
120 attr
= pango_attr_background_new (color
->red
,
126 case PANGO_ATTR_UNDERLINE
:
127 attr
= pango_attr_underline_new (va_arg (args
, PangoUnderline
));
130 case PANGO_ATTR_STRIKETHROUGH
:
131 attr
= pango_attr_strikethrough_new (va_arg (args
, gboolean
));
134 case PANGO_ATTR_RISE
:
135 attr
= pango_attr_rise_new (va_arg (args
, gint
));
138 case PANGO_ATTR_SCALE
:
139 attr
= pango_attr_scale_new (va_arg (args
, gdouble
));
143 //g_warning ("%s: invalid PangoAttribute type %d", G_STRFUNC, attr_type);
144 case PANGO_ATTR_INVALID
:
151 attr
->start_index
= 0;
152 attr
->end_index
= -1;
153 pango_attr_list_insert (attrs
, attr
);
160 gtk_label_set_attributes (label
, attrs
);
161 pango_attr_list_unref (attrs
);
165 void hb_widget_visible(GtkWidget
*widget
, gboolean visible
)
167 if(!GTK_IS_WIDGET(widget
))
172 gtk_widget_show(widget
);
176 gtk_widget_hide(widget
);
181 void ui_label_set_integer(GtkLabel
*label
, gint value
)
185 g_snprintf(buf
, 16, "%d", value
);
186 gtk_label_set_text (label
, buf
);
190 void ui_gtk_entry_tag_name_append(GtkEntry
*entry
, gchar
*tagname
)
192 GtkEntryBuffer
*buffer
;
196 text
= gtk_entry_get_text(entry
);
197 if( g_strstr_len(text
, -1, tagname
) == NULL
)
199 DB( g_print(" gtkentry append tagname '%'\n", tagname
) );
200 buffer
= gtk_entry_get_buffer(GTK_ENTRY(entry
));
203 len
= gtk_entry_buffer_get_length(buffer
);
204 DB( g_print("- add ' %s' %p %d\n", tagname
, buffer
, len
) );
206 gtk_entry_buffer_insert_text(buffer
, len
, " ", 1);
207 gtk_entry_buffer_insert_text(buffer
, len
+1, tagname
, -1);
214 void ui_gtk_entry_set_text(GtkWidget
*widget
, gchar
*text
)
216 DB( g_print(" set text to '%s'\n", text
) );
219 gtk_entry_set_text(GTK_ENTRY(widget
), text
);
221 gtk_entry_set_text(GTK_ENTRY(widget
), "");
224 void ui_gtk_entry_replace_text(GtkWidget
*widget
, gchar
**storage
)
228 DB( g_print(" storage is '%p' at '%p'\n", *storage
, storage
) );
230 /* free any previous string */
231 if( *storage
!= NULL
)
237 text
= gtk_entry_get_text(GTK_ENTRY(widget
));
238 *storage
= g_strdup(text
);
242 GtkWidget
*make_clicklabel(gchar
*id
, gchar
*str
)
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
);
253 return GTK_WIDGET(label
);
257 GtkWidget
*make_label_group(gchar
*str
)
259 GtkWidget
*label
= gtk_label_new (str
);
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);
268 GtkWidget
*make_label_widget(char *str
)
270 GtkWidget
*label
= gtk_label_new_with_mnemonic (str
);
272 gtk_widget_set_valign (label
, GTK_ALIGN_CENTER
);
273 gtk_widget_set_halign (label
, GTK_ALIGN_END
);
278 GtkWidget
*make_label(char *str
, gfloat xalign
, gfloat yalign
)
280 GtkWidget
*label
= gtk_label_new_with_mnemonic (str
);
282 #if GTK_MINOR_VERSION >= 16
283 gtk_label_set_xalign(GTK_LABEL(label
), xalign
);
284 gtk_label_set_yalign(GTK_LABEL(label
), yalign
);
286 gtk_misc_set_alignment (GTK_MISC (label
), xalign
, yalign
);
295 GtkWidget
*make_text(gfloat xalign
)
299 entry
= gtk_entry_new ();
300 gtk_editable_set_editable (GTK_EDITABLE(entry
), FALSE
);
301 g_object_set(entry
, "xalign", xalign
, NULL
);
306 GtkWidget
*make_search(void)
310 search
= gtk_search_entry_new();
311 gtk_entry_set_placeholder_text(GTK_ENTRY(search
), _("Search...") );
321 GtkWidget
*make_string(GtkWidget
*label
)
325 entry
= gtk_entry_new ();
328 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), entry
);
334 GtkWidget
*make_image_button(gchar
*icon_name
, gchar
*tooltip_text
)
336 GtkWidget
*button
, *image
;
338 //todo 3.10 use gtk_button_new_from_icon_name
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
);
354 GtkWidget
*make_memo_entry(GtkWidget
*label
)
358 GtkEntryCompletion
*completion
;
361 store
= gtk_list_store_new (1, G_TYPE_STRING
);
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);
367 entry
= gtk_entry_new ();
368 gtk_entry_set_completion (GTK_ENTRY (entry
), completion
);
370 g_object_unref(store
);
373 //gtk_list_store_clear (GTK_LIST_STORE(store));
375 lmem
= list
= g_hash_table_get_keys(GLOBALS
->h_memo
);
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,
386 list
= g_list_next(list
);
392 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), entry
);
401 GtkWidget
*make_string_maxlength(GtkWidget
*label
, guint max_length
)
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
);
413 static void hb_amount_insert_text_handler (GtkEntry
*entry
, const gchar
*text
, gint length
, gint
*position
, gpointer data
)
415 GtkEditable
*editable
= GTK_EDITABLE(entry
);
416 gint i
, digits
, count
=0, dcpos
=-1;
419 DB( g_print("-----\ninsert_text-handler: instxt:%s pos:%d len:%d\n", text
, *position
, length
) );
421 digits
= gtk_spin_button_get_digits(GTK_SPIN_BUTTON(entry
));
423 // most common : only 1 char to be inserted
426 const gchar
*curtxt
= gtk_entry_get_text(entry
);
428 for (i
=0 ; curtxt
[i
]!='\0' ; i
++)
430 if(curtxt
[i
]==',' || curtxt
[i
]=='.')
433 DB( g_print(" dcpos:'%d'\n", dcpos
) );
435 clntxt
= g_new0 (gchar
, length
+1);
436 for (i
=0 ; i
< length
; i
++)
438 if( g_ascii_isdigit(text
[i
]) && ( (*position
<= dcpos
+ digits
) || dcpos
< 0) )
441 if( text
[i
]=='-' && *position
==0 ) /* minus sign only at position 0 */
444 if( dcpos
< 0 && (text
[i
]=='.' || text
[i
]==',') ) /* decimal separator if not in previous string */
445 clntxt
[count
++] = '.';
450 clntxt
[count
++] = text
[i
];
453 // less common: paste a full text
456 clntxt
= hb_string_dup_raw_amount_clean(text
, digits
);
457 count
= strlen(clntxt
);
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
);
470 g_signal_stop_emission_by_name (G_OBJECT (editable
), "insert-text");
474 GtkWidget
*make_amount(GtkWidget
*label
)
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
);
485 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
487 g_signal_connect(G_OBJECT(spinner
), "insert-text",
488 G_CALLBACK(hb_amount_insert_text_handler
),
495 GtkWidget
*make_exchange_rate(GtkWidget
*label
)
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
);
507 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
515 GtkWidget
*make_numeric(GtkWidget
*label
, gdouble min
, gdouble max
)
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
);
527 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
535 GtkWidget
*make_scale(GtkWidget
*label
)
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
);
544 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), scale
);
552 GtkWidget
*make_long(GtkWidget
*label
)
556 spinner
= make_numeric(label
, 0.0, G_MAXINT
);
561 GtkWidget
*make_year(GtkWidget
*label
)
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
);
573 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
579 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
582 gint
hbtk_radio_button_get_active (GtkContainer
*container
)
584 GList
*lchild
, *list
;
588 if(!GTK_IS_CONTAINER(container
))
591 lchild
= list
= gtk_container_get_children (container
);
592 for(i
=0;list
!= NULL
;i
++)
595 if(GTK_IS_TOGGLE_BUTTON(radio
))
597 if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio
)) == TRUE
)
603 list
= g_list_next(list
);
611 void hbtk_radio_button_set_active (GtkContainer
*container
, gint active
)
613 GList
*lchild
, *list
;
616 if(!GTK_IS_CONTAINER(container
))
619 lchild
= list
= gtk_container_get_children (container
);
620 radio
= g_list_nth_data (list
, active
);
621 if(radio
!= NULL
&& GTK_IS_TOGGLE_BUTTON(radio
))
623 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio
), TRUE
);
629 GtkWidget
*hbtk_radio_button_get_nth (GtkContainer
*container
, gint nth
)
631 GList
*lchild
, *list
;
634 if(!GTK_IS_CONTAINER(container
))
637 lchild
= list
= gtk_container_get_children (container
);
638 radio
= g_list_nth_data (list
, nth
);
640 return radio
; //may return NULL
644 void hbtk_radio_button_unblock_by_func(GtkContainer
*container
, GCallback c_handler
, gpointer data
)
646 GList
*lchild
, *list
;
650 if(!GTK_IS_CONTAINER(container
))
653 lchild
= list
= gtk_container_get_children (container
);
654 for(i
=0;list
!= NULL
;i
++)
657 if(GTK_IS_TOGGLE_BUTTON(radio
))
659 g_signal_handlers_unblock_by_func (radio
, c_handler
, data
);
661 list
= g_list_next(list
);
667 void hbtk_radio_button_block_by_func(GtkContainer
*container
, GCallback c_handler
, gpointer data
)
669 GList
*lchild
, *list
;
673 if(!GTK_IS_CONTAINER(container
))
676 lchild
= list
= gtk_container_get_children (container
);
677 for(i
=0;list
!= NULL
;i
++)
680 if(GTK_IS_TOGGLE_BUTTON(radio
))
682 g_signal_handlers_block_by_func (radio
, c_handler
, data
);
684 list
= g_list_next(list
);
690 void hbtk_radio_button_connect(GtkContainer
*container
, const gchar
*detailed_signal
, GCallback c_handler
, gpointer data
)
692 GList
*lchild
, *list
;
696 if(!GTK_IS_CONTAINER(container
))
699 lchild
= list
= gtk_container_get_children (container
);
700 for(i
=0;list
!= NULL
;i
++)
703 if(GTK_IS_TOGGLE_BUTTON(radio
))
705 g_signal_connect (radio
, "toggled", c_handler
, data
);
707 list
= g_list_next(list
);
714 GtkWidget
*hbtk_radio_button_new (gchar
**items
, gboolean buttonstyle
)
716 GtkWidget
*box
, *button
, *newbutton
;
719 box
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 0);
721 button
= gtk_radio_button_new_with_label (NULL
, _(items
[0]));
722 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button
), !buttonstyle
);
723 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
724 for (i
= 1; items
[i
] != NULL
; i
++)
726 newbutton
= gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button
), _(items
[i
]));
727 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (newbutton
), !buttonstyle
);
728 gtk_box_pack_start (GTK_BOX (box
), newbutton
, FALSE
, FALSE
, 0);
733 gtk_style_context_add_class (gtk_widget_get_style_context (box
), GTK_STYLE_CLASS_LINKED
);
734 gtk_style_context_add_class (gtk_widget_get_style_context (box
), GTK_STYLE_CLASS_RAISED
);
741 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
745 is_separator (GtkTreeModel
*model
,
753 gtk_tree_model_get (model
, iter
, 0, &txt
, -1);
755 retval
= *txt
== 0 ? TRUE
: FALSE
;
756 //path = gtk_tree_model_get_path (model, iter);
757 //result = gtk_tree_path_get_indices (path)[0] == 4;
758 //gtk_tree_path_free (path);
768 GtkWidget
*make_cycle(GtkWidget
*label
, gchar
**items
)
773 combobox
= gtk_combo_box_text_new ();
775 for (i
= 0; items
[i
] != NULL
; i
++)
778 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox
), _(items
[i
]));
780 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox
), "");
782 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
783 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox
), is_separator
, NULL
, NULL
);
786 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
792 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
795 #define HB_KV_BUFFER_MAX_LEN 8
796 #define HB_KV_ITEMS_MAX_LEN 32
798 gchar
*hbtk_get_label(HbKvData
*kvdata
, guint32 key
)
800 gchar
*retval
= NULL
;
803 for(i
=0;i
<HB_KV_ITEMS_MAX_LEN
;i
++)
805 HbKvData
*tmp
= &kvdata
[i
];
806 if( tmp
->name
== NULL
)
808 if( tmp
->key
== key
)
811 retval
= (gchar
*)_(tmp
->name
);
819 static gboolean
hbtk_combo_box_is_separator (GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer data
)
825 gtk_tree_model_get (model
, iter
, 0, &txt
, -1);
826 retval
= *txt
== 0 ? TRUE
: FALSE
;
834 guint32
hbtk_combo_box_get_active_id (GtkComboBoxText
*combobox
)
839 buf
= gtk_combo_box_get_active_id(GTK_COMBO_BOX(combobox
));
840 retval
= buf
!= NULL
? atoi(buf
) : 0;
846 void hbtk_combo_box_set_active_id (GtkComboBoxText
*combobox
, guint32 key
)
848 gchar buf
[HB_KV_BUFFER_MAX_LEN
];
850 g_snprintf(buf
, HB_KV_BUFFER_MAX_LEN
-1, "%d", key
);
851 gtk_combo_box_set_active_id(GTK_COMBO_BOX(combobox
), buf
);
855 void hbtk_combo_box_text_append (GtkComboBoxText
*combobox
, guint32 key
, gchar
*text
)
857 gchar buf
[HB_KV_BUFFER_MAX_LEN
];
859 g_snprintf(buf
, HB_KV_BUFFER_MAX_LEN
-1, "%d", key
);
860 gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox
), buf
, text
);
864 GtkWidget
*hbtk_combo_box_new (GtkWidget
*label
)
868 combobox
= gtk_combo_box_text_new();
871 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
877 GtkWidget
*hbtk_combo_box_new_with_data (GtkWidget
*label
, HbKvData
*kvdata
)
879 GtkWidget
*combobox
= hbtk_combo_box_new(label
);
885 for(i
=0;i
<HB_KV_ITEMS_MAX_LEN
;i
++)
888 if( tmp
->name
== NULL
)
890 if( *tmp
->name
!= 0 )
892 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox
), tmp
->key
, (gchar
*)_(tmp
->name
));
896 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox
), tmp
->key
, (gchar
*)"");
900 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
903 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox
), hbtk_combo_box_is_separator
, NULL
, NULL
);
909 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
912 set_sensitive (GtkCellLayout
*cell_layout
,
913 GtkCellRenderer
*cell
,
914 GtkTreeModel
*tree_model
,
922 path
= gtk_tree_model_get_path (tree_model
, iter
);
923 indices
= gtk_tree_path_get_indices (path
);
924 sensitive
= indices
[0] != FLT_RANGE_OTHER
;
925 gtk_tree_path_free (path
);
927 g_object_set (cell
, "sensitive", sensitive
, NULL
);
932 GtkWidget
*make_daterange(GtkWidget
*label
, guint dspmode
)
934 GtkWidget
*combobox
= hbtk_combo_box_new(label
);
935 GList
*renderers
, *list
;
936 HbKvData
*tmp
, *kvdata
= CYA_FLT_RANGE
;
939 for(i
=0;i
<HB_KV_ITEMS_MAX_LEN
;i
++)
942 if( tmp
->name
== NULL
)
945 if( (tmp
->key
== FLT_RANGE_OTHER
) )
947 if( dspmode
== DATE_RANGE_CUSTOM_DISABLE
)
949 renderers
= gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox
));
950 if(g_list_length(renderers
) == 1)
952 list
= g_list_first(renderers
);
953 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox
),
958 g_list_free(renderers
);
961 if( dspmode
== DATE_RANGE_CUSTOM_HIDE
)
963 //if hide, we do not show it
969 hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox
), tmp
->key
, (*tmp
->name
!= 0) ? (gchar
*)_(tmp
->name
) : (gchar
*)"");
972 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
973 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox
), hbtk_combo_box_is_separator
, NULL
, NULL
);
979 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
982 id ofx english french
983 ---------------------------------------------------------------------
984 0 -------- (none) (aucun)
985 1 -------- credit card carte de crédit
986 2 OFX_CHECK Check cheque
987 3 OFX_CASH Cash withdrawal retrait espece
988 4 OFX_XFER Transfer virement
989 5 -------- internal transfer virement compte
990 6 -------- (debit card) (carte de paiement
991 7 OFX_REPEATPMT Repeating payment/standing order Paiement recurrent/Virement auto.
993 8 OFX_PAYMENT Electronic payment télépaiement
994 9 OFX_DEP Deposit dépôt
995 10 OFX_FEE FI fee frais bancaires
998 OFX_DIRECTDEBIT Merchant initiated debit prelevement
999 OFX_OTHER Somer other type of transaction autre
1003 OFX_CREDIT Generic credit
1004 OFX_DEBIT Generic debit
1005 OFX_INT Interest earned or paid (Note: Depends on signage of amount)
1007 OFX_SRVCHG Service charge
1009 OFX_ATM ATM debit or credit (Note: Depends on signage of amount)
1010 OFX_POS Point of sale debit or credit (Note: Depends on signage of amount)
1013 -OFX_PAYMENT Electronic payment
1014 -OFX_CASH Cash withdrawal
1015 OFX_DIRECTDEP Direct deposit
1016 OFX_DIRECTDEBIT Merchant initiated debit
1017 -OFX_REPEATPMT Repeating payment/standing order
1018 OFX_OTHER Somer other type of transaction
1023 LST_PAYMODE_ICONNAME
,
1028 char *paymode_iconnames
[NUM_PAYMODE_MAX
] =
1044 char *paymode_label_names
[NUM_PAYMODE_MAX
] =
1051 N_("Internal transfer"),
1053 N_("Standing order"),
1054 N_("Electronic payment"),
1056 //TRANSLATORS: Financial institution fee
1061 /* nota: used in ui-filter */
1062 gchar
*get_paymode_icon_name(gint index
)
1064 if(index
>= NUM_PAYMODE_MAX
)
1067 return paymode_iconnames
[index
];
1072 ** Make a paymode combobox widget
1076 paymode_set_sensitive (GtkCellLayout
*cell_layout
,
1077 GtkCellRenderer
*cell
,
1078 GtkTreeModel
*tree_model
,
1086 path
= gtk_tree_model_get_path (tree_model
, iter
);
1087 indices
= gtk_tree_path_get_indices (path
);
1088 sensitive
= (indices
[0] == PAYMODE_INTXFER
) ? FALSE
: TRUE
;
1089 gtk_tree_path_free (path
);
1092 g_object_set (cell
, "sensitive", sensitive
, NULL
);
1097 static GtkWidget
*make_paymode_internal(GtkWidget
*label
, gboolean intxfer
)
1099 GtkListStore
*store
;
1101 GtkWidget
*combobox
;
1102 GtkCellRenderer
*renderer
, *r1
, *r2
;
1105 store
= gtk_list_store_new (
1111 combobox
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
1112 g_object_unref(store
);
1114 renderer
= r1
= gtk_cell_renderer_pixbuf_new();
1115 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
1116 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "icon-name", LST_PAYMODE_ICONNAME
);
1118 renderer
= r2
= gtk_cell_renderer_text_new();
1119 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
1120 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "text", LST_PAYMODE_LABEL
);
1123 if( intxfer
== FALSE
)
1125 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox
),
1127 paymode_set_sensitive
,
1129 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox
),
1131 paymode_set_sensitive
,
1135 //populate our combobox model
1136 for(i
=0;i
<NUM_PAYMODE_MAX
;i
++)
1138 gtk_list_store_append(store
, &iter
);
1139 gtk_list_store_set(store
, &iter
,
1140 LST_PAYMODE_ICONNAME
, paymode_iconnames
[i
],
1141 LST_PAYMODE_LABEL
, _(paymode_label_names
[i
]),
1145 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
1148 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
1155 GtkWidget
*make_paymode(GtkWidget
*label
)
1157 return make_paymode_internal(label
, TRUE
);
1160 GtkWidget
*make_paymode_nointxfer(GtkWidget
*label
)
1162 return make_paymode_internal(label
, FALSE
);
1166 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1168 #define NUM_NAINEX_MAX 3
1172 LST_NAINEX_ICONNAME
,
1177 char *nainex_iconnames
[NUM_NAINEX_MAX
] =
1184 extern gchar
*nainex_label_names
[];
1187 ** Make a nainex combobox widget
1189 GtkWidget
*make_nainex(GtkWidget
*label
)
1191 GtkListStore
*store
;
1193 GtkWidget
*combobox
;
1194 GtkCellRenderer
*renderer
;
1198 store
= gtk_list_store_new (
1205 combobox
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
1208 renderer
= gtk_cell_renderer_pixbuf_new();
1209 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
1210 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "icon-name", LST_NAINEX_ICONNAME
);
1212 renderer
= gtk_cell_renderer_text_new();
1213 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
1214 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "text", LST_NAINEX_LABEL
);
1216 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
1218 //populate our combobox model
1219 for(i
=0;i
<NUM_NAINEX_MAX
;i
++)
1221 gtk_list_store_append(store
, &iter
);
1222 gtk_list_store_set(store
, &iter
,
1223 LST_NAINEX_ICONNAME
, nainex_iconnames
[i
],
1224 LST_NAINEX_LABEL
, _(nainex_label_names
[i
]),
1227 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
1230 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);