X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fui-widgets.c;h=cc7c28c8d85dd319be9020d318bce9d7a8ebfe63;hb=5499ff44ef50b751b58f27fd13594f7dd4f959b7;hp=85377b9d96b96b3bd47a697ae2190b2244bc7d2c;hpb=27f6e3b112df235c8e9afc9911b1f6bce208a001;p=chaz%2Fhomebank diff --git a/src/ui-widgets.c b/src/ui-widgets.c index 85377b9..cc7c28c 100644 --- a/src/ui-widgets.c +++ b/src/ui-widgets.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2014 Maxime DOYEN + * Copyright (C) 1995-2019 Maxime DOYEN * * This file is part of HomeBank. * @@ -41,9 +41,12 @@ extern struct HomeBank *GLOBALS; /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -extern gchar *CYA_FLT_RANGE[]; +extern HbKvData CYA_FLT_RANGE[]; +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +//TODO: only WEIGHT & SCALE are used for now void gimp_label_set_attributes (GtkLabel *label, ...) @@ -175,6 +178,39 @@ void hb_widget_visible(GtkWidget *widget, gboolean visible) } +void ui_label_set_integer(GtkLabel *label, gint value) +{ +gchar buf[16]; + + g_snprintf(buf, 16, "%d", value); + gtk_label_set_text (label, buf); +} + + +void ui_gtk_entry_tag_name_append(GtkEntry *entry, gchar *tagname) +{ +GtkEntryBuffer *buffer; +const gchar *text; +guint len; + + text = gtk_entry_get_text(entry); + if( g_strstr_len(text, -1, tagname) == NULL ) + { + DB( g_print(" gtkentry append tagname '%'\n", tagname) ); + buffer = gtk_entry_get_buffer(GTK_ENTRY(entry)); + if(buffer) + { + len = gtk_entry_buffer_get_length(buffer); + DB( g_print("- add ' %s' %p %d\n", tagname, buffer, len) ); + if(len > 0) + gtk_entry_buffer_insert_text(buffer, len, " ", 1); + gtk_entry_buffer_insert_text(buffer, len+1, tagname, -1); + } + } + +} + + void ui_gtk_entry_set_text(GtkWidget *widget, gchar *text) { DB( g_print(" set text to '%s'\n", text) ); @@ -185,17 +221,70 @@ void ui_gtk_entry_set_text(GtkWidget *widget, gchar *text) gtk_entry_set_text(GTK_ENTRY(widget), ""); } +void ui_gtk_entry_replace_text(GtkWidget *widget, gchar **storage) +{ +const gchar *text; -/* -** -*/ -GtkWidget *make_label(char *str, gfloat xalign, gfloat yalign) + DB( g_print(" storage is '%p' at '%p'\n", *storage, storage) ); + + /* free any previous string */ + if( *storage != NULL ) + { + g_free(*storage); + } + + *storage = NULL; + text = gtk_entry_get_text(GTK_ENTRY(widget)); + *storage = g_strdup(text); +} + + +GtkWidget *make_clicklabel(gchar *id, gchar *str) { GtkWidget *label; +gchar buffer[255]; + + g_snprintf(buffer, 254, "%s", id, str); + label = gtk_label_new(buffer); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + gtk_label_set_track_visited_links(GTK_LABEL(label), FALSE); + gtk_widget_set_halign(label, GTK_ALIGN_START); + + return GTK_WIDGET(label); +} + + +GtkWidget *make_label_group(gchar *str) +{ +GtkWidget *label = gtk_label_new (str); + + gtk_widget_set_valign (label, GTK_ALIGN_CENTER); + gtk_widget_set_halign (label, GTK_ALIGN_START); + gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1); + return label; +} - label = gtk_label_new_with_mnemonic (str); - gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign); +GtkWidget *make_label_widget(char *str) +{ +GtkWidget *label = gtk_label_new_with_mnemonic (str); + + gtk_widget_set_valign (label, GTK_ALIGN_CENTER); + gtk_widget_set_halign (label, GTK_ALIGN_END); + return label; +} + + +GtkWidget *make_label(char *str, gfloat xalign, gfloat yalign) +{ +GtkWidget *label = gtk_label_new_with_mnemonic (str); + + #if GTK_MINOR_VERSION >= 16 + gtk_label_set_xalign(GTK_LABEL(label), xalign); + gtk_label_set_yalign(GTK_LABEL(label), yalign); + #else + gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign); + #endif return label; } @@ -210,14 +299,22 @@ GtkWidget *entry; entry = gtk_entry_new (); gtk_editable_set_editable (GTK_EDITABLE(entry), FALSE); g_object_set(entry, "xalign", xalign, NULL); - - //entry = gtk_label_new(NULL); - //gtk_misc_set_padding (entry, 4, 2); - //gtk_misc_set_alignment(entry, xalign, 0.5); return entry; } +GtkWidget *make_search(void) +{ +GtkWidget *search; + + search = gtk_search_entry_new(); + gtk_entry_set_placeholder_text(GTK_ENTRY(search), _("Search...") ); + + return search; +} + + + /* ** */ @@ -233,6 +330,24 @@ GtkWidget *entry; return entry; } + +GtkWidget *make_image_button(gchar *icon_name, gchar *tooltip_text) +{ +GtkWidget *button, *image; + + //todo 3.10 use gtk_button_new_from_icon_name + + button = gtk_button_new(); + image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON); + g_object_set (button, "image", image, NULL); + if(tooltip_text != NULL) + gtk_widget_set_tooltip_text(button, tooltip_text); + + return button; +} + + + /* ** */ @@ -262,8 +377,11 @@ GList *lmem, *list; { GtkTreeIter iter; - gtk_list_store_append (GTK_LIST_STORE(store), &iter); - gtk_list_store_set (GTK_LIST_STORE(store), &iter, 0, list->data, -1); + //gtk_list_store_append (GTK_LIST_STORE(store), &iter); + //gtk_list_store_set (GTK_LIST_STORE(store), &iter, 0, list->data, -1); + gtk_list_store_insert_with_values(GTK_LIST_STORE(store), &iter, -1, + 0, list->data, + -1); list = g_list_next(list); } @@ -285,74 +403,88 @@ GtkWidget *make_string_maxlength(GtkWidget *label, guint max_length) GtkWidget *entry; entry = make_string(label); + gtk_entry_set_width_chars(GTK_ENTRY(entry), max_length+2); gtk_entry_set_max_length(GTK_ENTRY(entry), max_length); return entry; } - static void hb_amount_insert_text_handler (GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data) { GtkEditable *editable = GTK_EDITABLE(entry); -int i, count=0, dcpos=-1; -gchar *result = g_new0 (gchar, length+1); -const gchar *numtext; +gint i, digits, count=0, dcpos=-1; +gchar *clntxt; + + DB( g_print("-----\ninsert_text-handler: instxt:%s pos:%d len:%d\n", text, *position, length) ); - //g_message("insert_text-handler: text:%s - pos:%d - length:%d", text, *position, length); + digits = gtk_spin_button_get_digits(GTK_SPIN_BUTTON(entry)); - numtext = gtk_entry_get_text(entry); - for (i=0 ; numtext[i]!='\0' ; i++) + // most common : only 1 char to be inserted + if( length == 1 ) { - if(numtext[i]==',' || numtext[i]=='.') - dcpos = i; - } + const gchar *curtxt = gtk_entry_get_text(entry); + for (i=0 ; curtxt[i]!='\0' ; i++) + { + if(curtxt[i]==',' || curtxt[i]=='.') + dcpos = i; + } + DB( g_print(" dcpos:'%d'\n", dcpos) ); - //g_message("previous text='%s' dcpos:'%d'", numtext, dcpos); - for (i=0 ; i < length ; i++) - { - if( isdigit(text[i]) && ( (*position <= dcpos+2) || dcpos < 0) ) - goto inserttext; + clntxt = g_new0 (gchar, length+1); + for (i=0 ; i < length ; i++) + { + if( g_ascii_isdigit(text[i]) && ( (*position <= dcpos + digits) || dcpos < 0) ) + goto doinsert; - if( text[i]=='-' && *position==0 ) /* minus sign only at position 0 */ - goto inserttext; + if( text[i]=='-' && *position==0 ) /* minus sign only at position 0 */ + goto doinsert; - if( dcpos < 0 && (text[i]=='.' || text[i]==',') ) /* decimal separator if not in previous string */ - result[count++] = '.'; + if( dcpos < 0 && (text[i]=='.' || text[i]==',') ) /* decimal separator if not in previous string */ + clntxt[count++] = '.'; - continue; + continue; - inserttext: - result[count++] = text[i]; + doinsert: + clntxt[count++] = text[i]; + } } - - if (count > 0) { + // less common: paste a full text + else + { + clntxt = hb_string_dup_raw_amount_clean(text, digits); + count = strlen(clntxt); + } + + if (count > 0) + { + DB( g_print(" insert %d char '%s' at %d\n", count, clntxt, *position) ); g_signal_handlers_block_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data); - gtk_editable_insert_text (editable, result, count, position); + gtk_editable_insert_text (editable, clntxt, count, position); g_signal_handlers_unblock_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data); } - g_signal_stop_emission_by_name (G_OBJECT (editable), "insert_text"); - g_free (result); + g_free (clntxt); + + g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text"); } -/* -** -*/ + GtkWidget *make_amount(GtkWidget *label) { GtkWidget *spinner; GtkAdjustment *adj; - adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -G_MAXINT32, G_MAXINT32, 0.01, 1.0, 0.0); + //adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -G_MAXDOUBLE, G_MAXDOUBLE, 0.01, 1.0, 0.0); + adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -8589934588, 8589934588, 0.01, 1.0, 0.0); spinner = gtk_spin_button_new (adj, 1.0, 2); g_object_set(spinner, "xalign", 1.0, NULL); if(label) gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner); - g_signal_connect(G_OBJECT(spinner), "insert_text", + g_signal_connect(G_OBJECT(spinner), "insert-text", G_CALLBACK(hb_amount_insert_text_handler), NULL); @@ -360,13 +492,13 @@ GtkAdjustment *adj; } -GtkWidget *make_euro(GtkWidget *label) +GtkWidget *make_exchange_rate(GtkWidget *label) { GtkWidget *spinner; GtkAdjustment *adj; - adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -G_MAXINT32, G_MAXINT32, 0.01, 1.0, 0.0); - spinner = gtk_spin_button_new (adj, 1.0, 6); + adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 99999, 0.01, 1.0, 0.0); + spinner = gtk_spin_button_new (adj, 1.0, 8); //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE); g_object_set(spinner, "xalign", 1.0, NULL); @@ -404,7 +536,7 @@ GtkWidget *make_scale(GtkWidget *label) { GtkWidget *scale; - scale = gtk_hscale_new_with_range(GTK_CHART_MINBARW, GTK_CHART_MAXBARW, 1.0); + scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, GTK_CHART_MINBARW, GTK_CHART_SPANBARW, 1.0); gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE); gtk_range_set_value(GTK_RANGE(scale), GTK_CHART_BARW); @@ -444,75 +576,198 @@ GtkAdjustment *adj; } -static gboolean -is_separator (GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data) +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +gint hbtk_radio_button_get_active (GtkContainer *container) { - //GtkTreePath *path; - gboolean retval; - gchar *txt; +GList *lchild, *list; +GtkWidget *radio; +gint i, retval = 0; - gtk_tree_model_get (model, iter, 0, &txt, -1); + if(!GTK_IS_CONTAINER(container)) + return -1; - retval = *txt == 0 ? TRUE : FALSE; - //path = gtk_tree_model_get_path (model, iter); - //result = gtk_tree_path_get_indices (path)[0] == 4; - //gtk_tree_path_free (path); + lchild = list = gtk_container_get_children (container); + for(i=0;list != NULL;i++) + { + radio = list->data; + if(GTK_IS_TOGGLE_BUTTON(radio)) + { + if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)) == TRUE ) + { + retval = i; + break; + } + } + list = g_list_next(list); + } + g_list_free(lchild); + + return retval; +} - return retval; + +void hbtk_radio_button_set_active (GtkContainer *container, gint active) +{ +GList *lchild, *list; +GtkWidget *radio; + + if(!GTK_IS_CONTAINER(container)) + return; + + lchild = list = gtk_container_get_children (container); + radio = g_list_nth_data (list, active); + if(radio != NULL && GTK_IS_TOGGLE_BUTTON(radio)) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio), TRUE); + } + g_list_free(lchild); } -static void -set_sensitive (GtkCellLayout *cell_layout, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer data) + +GtkWidget *hbtk_radio_button_get_nth (GtkContainer *container, gint nth) { - GtkTreePath *path; - gint *indices; - gboolean sensitive; +GList *lchild, *list; +GtkWidget *radio; - path = gtk_tree_model_get_path (tree_model, iter); - indices = gtk_tree_path_get_indices (path); - sensitive = indices[0] != FLT_RANGE_OTHER; - gtk_tree_path_free (path); + if(!GTK_IS_CONTAINER(container)) + return NULL; - g_object_set (cell, "sensitive", sensitive, NULL); + lchild = list = gtk_container_get_children (container); + radio = g_list_nth_data (list, nth); + g_list_free(lchild); + return radio; //may return NULL } -GtkWidget *make_cycle(GtkWidget *label, gchar **items) +void hbtk_radio_button_unblock_by_func(GtkContainer *container, GCallback c_handler, gpointer data) { -GtkWidget *combobox; +GList *lchild, *list; +GtkWidget *radio; +gint i; + + if(!GTK_IS_CONTAINER(container)) + return; + + lchild = list = gtk_container_get_children (container); + for(i=0;list != NULL;i++) + { + radio = list->data; + if(GTK_IS_TOGGLE_BUTTON(radio)) + { + g_signal_handlers_unblock_by_func (radio, c_handler, data); + } + list = g_list_next(list); + } + g_list_free(lchild); +} + + +void hbtk_radio_button_block_by_func(GtkContainer *container, GCallback c_handler, gpointer data) +{ +GList *lchild, *list; +GtkWidget *radio; +gint i; + + if(!GTK_IS_CONTAINER(container)) + return; + + lchild = list = gtk_container_get_children (container); + for(i=0;list != NULL;i++) + { + radio = list->data; + if(GTK_IS_TOGGLE_BUTTON(radio)) + { + g_signal_handlers_block_by_func (radio, c_handler, data); + } + list = g_list_next(list); + } + g_list_free(lchild); +} + + +void hbtk_radio_button_connect(GtkContainer *container, const gchar *detailed_signal, GCallback c_handler, gpointer data) +{ +GList *lchild, *list; +GtkWidget *radio; +gint i; + + if(!GTK_IS_CONTAINER(container)) + return; + + lchild = list = gtk_container_get_children (container); + for(i=0;list != NULL;i++) + { + radio = list->data; + if(GTK_IS_TOGGLE_BUTTON(radio)) + { + g_signal_connect (radio, "toggled", c_handler, data); + } + list = g_list_next(list); + } + g_list_free(lchild); + +} + + +GtkWidget *hbtk_radio_button_new (gchar **items, gboolean buttonstyle) +{ +GtkWidget *box, *button, *newbutton; guint i; - combobox = gtk_combo_box_text_new (); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - for (i = 0; items[i] != NULL; i++) + button = gtk_radio_button_new_with_label (NULL, _(items[0])); + gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), !buttonstyle); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + for (i = 1; items[i] != NULL; i++) { - if(*items[i] != 0) - gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), _(items[i])); - else - gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), ""); + newbutton = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button), _(items[i])); + gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (newbutton), !buttonstyle); + gtk_box_pack_start (GTK_BOX (box), newbutton, FALSE, FALSE, 0); } - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); - gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL); - if(label) - gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox); + if(buttonstyle) + { + gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED); + gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED); + } + + return box; +} - return combobox; + +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +static gboolean +is_separator (GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + //GtkTreePath *path; + gboolean retval; + gchar *txt; + + gtk_tree_model_get (model, iter, 0, &txt, -1); + + retval = *txt == 0 ? TRUE : FALSE; + //path = gtk_tree_model_get_path (model, iter); + //result = gtk_tree_path_get_indices (path)[0] == 4; + //gtk_tree_path_free (path); + + //leak + g_free(txt); + + + return retval; } -GtkWidget *make_daterange(GtkWidget *label, gboolean custom) +GtkWidget *make_cycle(GtkWidget *label, gchar **items) { GtkWidget *combobox; -GList *renderers, *list; -GtkCellRenderer *renderer; -gchar **items = CYA_FLT_RANGE; guint i; combobox = gtk_combo_box_text_new (); @@ -525,244 +780,203 @@ guint i; gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), ""); } gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL); if(label) gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox); - // special stuffs - renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox)); - if(g_list_length(renderers) == 1 && custom == FALSE) - { - list = g_list_first(renderers); - renderer = list->data; - - - gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox), - renderer, - set_sensitive, - NULL, NULL); - } - g_list_free(renderers); - - gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL); - return combobox; } -/* -** -*/ -GtkWidget *make_radio(GtkWidget *label, gchar **items, GtkOrientation orientation) -{ -GtkWidget *box, *button; -//GSList *group; -guint i; +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ - if(orientation == GTK_ORIENTATION_HORIZONTAL) - box = gtk_hbox_new(FALSE, 0); - else - box = gtk_vbox_new (FALSE, 0); - - button = gtk_radio_button_new_with_label (NULL, _(items[0])); - gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); - for (i = 1; items[i] != NULL; i++) - { - button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button), _(items[i])); - gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); - } - return box; -} +#define HB_KV_BUFFER_MAX_LEN 8 +#define HB_KV_ITEMS_MAX_LEN 32 -gint radio_get_active (GtkContainer *container) +gchar *hbtk_get_label(HbKvData *kvdata, guint32 key) { -GList *list; -GtkWidget *radio; -gint i, retval = 0; +gchar *retval = NULL; +guint32 i; - list = gtk_container_get_children (container); - for(i=0;list != NULL;i++) + for(i=0;idata; - if(GTK_IS_TOGGLE_BUTTON(radio)) + HbKvData *tmp = &kvdata[i]; + if( tmp->name == NULL ) + break; + if( tmp->key == key ) { - if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)) == TRUE ) - { - retval = i; - break; - } + //#1820372 + retval = (gchar *)_(tmp->name); + break; } - list = g_list_next(list); } return retval; } -void radio_set_active (GtkContainer *container, gint active) +static gboolean hbtk_combo_box_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { -GList *list; -GtkWidget *radio; +//GtkTreePath *path; +gboolean retval; +gchar *txt; - if(!GTK_IS_CONTAINER(container)) - return; + gtk_tree_model_get (model, iter, 0, &txt, -1); + retval = *txt == 0 ? TRUE : FALSE; + //leak + g_free(txt); - list = gtk_container_get_children (container); - radio = g_list_nth_data (list, active); - if(radio != NULL && GTK_IS_TOGGLE_BUTTON(radio)) - { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio), TRUE); - } + return retval; } -/* -** -*/ -guint make_poparchive_populate(GtkComboBox *combobox, GList *srclist) +guint32 hbtk_combo_box_get_active_id (GtkComboBoxText *combobox) { -GtkTreeModel *model; -GtkTreeIter iter; -GList *list; -gint i; +const gchar* buf; +guint32 retval; + + buf = gtk_combo_box_get_active_id(GTK_COMBO_BOX(combobox)); + retval = buf != NULL ? atoi(buf) : 0; - //insert all glist item into treeview - model = gtk_combo_box_get_model(combobox); - gtk_list_store_clear(GTK_LIST_STORE(model)); + return retval; +} - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, "----", -1); - i=0; - list = g_list_first(srclist); - while (list != NULL) - { - Archive *entry = list->data; +void hbtk_combo_box_set_active_id (GtkComboBoxText *combobox, guint32 key) +{ +gchar buf[HB_KV_BUFFER_MAX_LEN]; - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, entry->wording, -1); + g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(combobox), buf); +} - //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) ); - i++; list = g_list_next(list); - } +void hbtk_combo_box_text_append (GtkComboBoxText *combobox, guint32 key, gchar *text) +{ +gchar buf[HB_KV_BUFFER_MAX_LEN]; - return i; + g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), buf, text); } -GtkWidget *make_poparchive(GtkWidget *label) +GtkWidget *hbtk_combo_box_new (GtkWidget *label) { -GtkListStore *store; GtkWidget *combobox; -GtkCellRenderer *renderer; - - //store - store = gtk_list_store_new (1, G_TYPE_STRING); - combobox = gtk_combo_box_new_with_model (GTK_TREE_MODEL(store)); - g_object_unref(store); - renderer = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 0, NULL); + combobox = gtk_combo_box_text_new(); + if(label) gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox); return combobox; } -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -/** - * free_combobox_icons: - * - * generic function to free combobox icons - * - */ -static void free_combobox_icons(GdkPixbuf **storage, guint max) +GtkWidget *hbtk_combo_box_new_with_data (GtkWidget *label, HbKvData *kvdata) { -guint i; +GtkWidget *combobox = hbtk_combo_box_new(label); +HbKvData *tmp; +gboolean hassep; +guint32 i; - for(i=0;iname == NULL ) + break; + if( *tmp->name != 0 ) + { + hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)_(tmp->name)); + } + else + { + hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)""); + hassep = TRUE; + } } + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + + if(hassep) + gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL); + + return combobox; } -/** - * load_combobox_icons: - * - * generic function to load combobox icons - * - */ -static void load_combobox_icons(gchar **filenames, GdkPixbuf **storage, guint max) -{ -//GError *error = NULL; -GtkWidget *cellview; -guint i; - cellview = gtk_cell_view_new (); +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ - for(i=0;iname == NULL ) + break; -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + if( (tmp->key == FLT_RANGE_OTHER) ) + { + if( dspmode == DATE_RANGE_CUSTOM_DISABLE ) + { + renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox)); + if(g_list_length(renderers) == 1) + { + list = g_list_first(renderers); + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox), + list->data, + set_sensitive, + NULL, NULL); + } + g_list_free(renderers); + } + else + if( dspmode == DATE_RANGE_CUSTOM_HIDE ) + { + //if hide, we do not show it + i++; + continue; + } + } -enum -{ - LST_PAYMODE_PIXBUF, - LST_PAYMODE_LABEL, - NUM_LST_PAYMODE -}; + hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (*tmp->name != 0) ? (gchar *)_(tmp->name) : (gchar *)""); + } -GdkPixbuf *paymode_icons[NUM_PAYMODE_MAX]; + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL); -char *paymode_pixbuf_names[NUM_PAYMODE_MAX] = -{ - "pm-none", - "pm-ccard", - "pm-check", - "pm-cash" , - "pm-transfer", - "pm-intransfer", - "pm-dcard", - "pm-standingorder", - "pm-epayment", - "pm-deposit", - "pm-fifee", - "pm-directdebit" -}; + return combobox; +} -char *paymode_label_names[NUM_PAYMODE_MAX] = -{ - N_("(none)"), - N_("Credit card"), - N_("Check"), - N_("Cash"), - N_("Transfer"), - N_("Internal transfer"), - N_("Debit card"), - N_("Standing order"), - N_("Electronic payment"), - N_("Deposit"), - N_("FI fee"), - N_("Direct Debit") -}; +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ /* id ofx english french @@ -804,57 +1018,126 @@ OFX_DIRECTDEBIT Merchant initiated debit OFX_OTHER Somer other type of transaction */ +enum +{ + LST_PAYMODE_ICONNAME, + LST_PAYMODE_LABEL, + NUM_LST_PAYMODE +}; -void load_paymode_icons(void) +char *paymode_iconnames[NUM_PAYMODE_MAX] = { - load_combobox_icons(paymode_pixbuf_names, paymode_icons, NUM_PAYMODE_MAX); -} + "pm-none", + "pm-ccard", + "pm-check", + "pm-cash" , + "pm-transfer", + "pm-intransfer", + "pm-dcard", + "pm-standingorder", + "pm-epayment", + "pm-deposit", + "pm-fifee", + "pm-directdebit" +}; +char *paymode_label_names[NUM_PAYMODE_MAX] = +{ + N_("(none)"), + N_("Credit card"), + N_("Check"), + N_("Cash"), + N_("Transfer"), + N_("Internal transfer"), + N_("Debit card"), + N_("Standing order"), + N_("Electronic payment"), + N_("Deposit"), + //TRANSLATORS: Financial institution fee + N_("FI fee"), + N_("Direct Debit") +}; -void free_paymode_icons(void) +/* nota: used in ui-filter */ +gchar *get_paymode_icon_name(gint index) { - free_combobox_icons(paymode_icons, NUM_PAYMODE_MAX); + if(index >= NUM_PAYMODE_MAX) + return NULL; + + return paymode_iconnames[index]; } /* ** Make a paymode combobox widget */ -GtkWidget *make_paymode(GtkWidget *label) + +static void +paymode_set_sensitive (GtkCellLayout *cell_layout, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data) { -GtkListStore *store; -GtkTreeIter iter; + GtkTreePath *path; + gint *indices; + gboolean sensitive; + + path = gtk_tree_model_get_path (tree_model, iter); + indices = gtk_tree_path_get_indices (path); + sensitive = (indices[0] == PAYMODE_INTXFER) ? FALSE : TRUE; + gtk_tree_path_free (path); + + + g_object_set (cell, "sensitive", sensitive, NULL); +} + + + +static GtkWidget *make_paymode_internal(GtkWidget *label, gboolean intxfer) +{ +GtkListStore *store; +GtkTreeIter iter; GtkWidget *combobox; -GtkCellRenderer *renderer; +GtkCellRenderer *renderer, *r1, *r2; guint i; - //store store = gtk_list_store_new ( NUM_LST_PAYMODE, - GDK_TYPE_PIXBUF, + G_TYPE_STRING, G_TYPE_STRING ); - //combobox combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); + g_object_unref(store); - //column 1 - renderer = gtk_cell_renderer_pixbuf_new(); + renderer = r1 = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "pixbuf", LST_PAYMODE_PIXBUF); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_PAYMODE_ICONNAME); - renderer = gtk_cell_renderer_text_new(); + renderer = r2 = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE); gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "text", LST_PAYMODE_LABEL); - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + + if( intxfer == FALSE ) + { + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox), + r1, + paymode_set_sensitive, + NULL, NULL); + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox), + r2, + paymode_set_sensitive, + NULL, NULL); + } //populate our combobox model for(i=0;i