]> Dogcows Code - chaz/homebank/blobdiff - src/ui-widgets.c
import homebank-5.2.7
[chaz/homebank] / src / ui-widgets.c
index 85377b9d96b96b3bd47a697ae2190b2244bc7d2c..14248e3a10894cc08577ec806aba79aa95799c89 100644 (file)
@@ -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 hbtk_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 '%s'\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];
 
-       label = gtk_label_new_with_mnemonic (str);
-       gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign);
+       g_snprintf(buffer, 254, "<a href=\"%s\">%s</a>", 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;
+}
+
+
+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,226 +576,232 @@ GtkAdjustment *adj;
 }
 
 
-static gboolean
-is_separator (GtkTreeModel *model,
-             GtkTreeIter  *iter,
-             gpointer      data)
+GtkWidget *
+create_popover (GtkWidget       *parent,
+                GtkWidget       *child,
+                GtkPositionType  pos)
 {
-  //GtkTreePath *path;
-  gboolean retval;
-  gchar *txt;
+GtkWidget *popover;
 
-       gtk_tree_model_get (model, iter, 0, &txt, -1);
+       popover = gtk_popover_new (parent);
+       gtk_popover_set_position (GTK_POPOVER (popover), pos);
+       gtk_container_add (GTK_CONTAINER (popover), child);
+       gtk_widget_show (child);
 
-       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);
+       gtk_widget_set_margin_start (child, SPACING_POPOVER);
+       gtk_widget_set_margin_end (child, SPACING_POPOVER);
+       gtk_widget_set_margin_top (child, SPACING_POPOVER);
+       gtk_widget_set_margin_bottom (child, SPACING_POPOVER);
 
-  return retval;
+       return popover;
 }
 
-static void
-set_sensitive (GtkCellLayout   *cell_layout,
-              GtkCellRenderer *cell,
-              GtkTreeModel    *tree_model,
-              GtkTreeIter     *iter,
-              gpointer         data)
-{
-  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] != FLT_RANGE_OTHER;  
-  gtk_tree_path_free (path);
 
-  g_object_set (cell, "sensitive", sensitive, NULL);
-}
+/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
 
-GtkWidget *make_cycle(GtkWidget *label, gchar **items)
+gint hbtk_radio_button_get_active (GtkContainer *container)
 {
-GtkWidget *combobox;
-guint i;
+GList *lchild, *list;
+GtkWidget *radio;
+gint i, retval = 0;
 
-       combobox = gtk_combo_box_text_new ();
+       if(!GTK_IS_CONTAINER(container))
+               return -1;
 
-       for (i = 0; items[i] != NULL; i++)
+       lchild = list = gtk_container_get_children (container);
+       for(i=0;list != 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), "");
+               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);
        }
-       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);
-
-       return combobox;
+       g_list_free(lchild);
+       
+       return retval;
 }
 
 
-GtkWidget *make_daterange(GtkWidget *label, gboolean custom)
+void hbtk_radio_button_set_active (GtkContainer *container, gint active)
 {
-GtkWidget *combobox;
-GList *renderers, *list;
-GtkCellRenderer *renderer;
-gchar **items = CYA_FLT_RANGE;
-guint i;
+GList *lchild, *list;
+GtkWidget *radio;
 
-       combobox = gtk_combo_box_text_new ();
+       if(!GTK_IS_CONTAINER(container))
+               return;
 
-       for (i = 0; items[i] != NULL; i++)
+       lchild = list = gtk_container_get_children (container);
+       radio = g_list_nth_data (list, active);
+       if(radio != NULL && GTK_IS_TOGGLE_BUTTON(radio))
        {
-               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), "");
+               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio), TRUE);
        }
-       gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
+       g_list_free(lchild);
+}
 
-       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);
+GtkWidget *hbtk_radio_button_get_nth (GtkContainer *container, gint nth)
+{
+GList *lchild, *list;
+GtkWidget *radio;
 
-       gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL);
+       if(!GTK_IS_CONTAINER(container))
+               return NULL;
 
-       return combobox;
+       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_radio(GtkWidget *label, gchar **items, GtkOrientation orientation)
+void hbtk_radio_button_unblock_by_func(GtkContainer *container, GCallback c_handler, gpointer data)
 {
-GtkWidget *box, *button;
-//GSList *group;
-guint i;
+GList *lchild, *list;
+GtkWidget *radio;
+gint i;
 
-       if(orientation == GTK_ORIENTATION_HORIZONTAL)
-               box = gtk_hbox_new(FALSE, 0);
-       else
-               box = gtk_vbox_new (FALSE, 0);
+       if(!GTK_IS_CONTAINER(container))
+               return;
 
-    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++)
+       lchild = list = gtk_container_get_children (container);
+       for(i=0;list != 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);
+               radio = list->data;
+               if(GTK_IS_TOGGLE_BUTTON(radio))
+               {
+                       g_signal_handlers_unblock_by_func (radio, c_handler, data);
+               }
+               list = g_list_next(list);
        }
-       return box;
+       g_list_free(lchild);
 }
 
 
-gint radio_get_active (GtkContainer *container)
+void hbtk_radio_button_block_by_func(GtkContainer *container, GCallback c_handler, gpointer data)
 {
-GList *list;
+GList *lchild, *list;
 GtkWidget *radio;
-gint i, retval = 0;
+gint i;
+
+       if(!GTK_IS_CONTAINER(container))
+               return;
 
-       list = gtk_container_get_children (container);
+       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;
-                       }
+                       g_signal_handlers_block_by_func (radio, c_handler, data);
                }
                list = g_list_next(list);
        }
-       return retval;
+       g_list_free(lchild);
 }
 
 
-void radio_set_active (GtkContainer *container, gint active)
+void hbtk_radio_button_connect(GtkContainer *container, const gchar *detailed_signal, GCallback c_handler, gpointer data)
 {
-GList *list;
+GList *lchild, *list;
 GtkWidget *radio;
+gint i;
 
        if(!GTK_IS_CONTAINER(container))
                return;
 
-       list = gtk_container_get_children (container);
-       radio = g_list_nth_data (list, active);
-       if(radio != NULL && GTK_IS_TOGGLE_BUTTON(radio))
+       lchild = list = gtk_container_get_children (container);
+       for(i=0;list != NULL;i++)
        {
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio), TRUE);
+               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);
+
 }
 
 
-/*
-**
-*/
-guint make_poparchive_populate(GtkComboBox *combobox, GList *srclist)
+GtkWidget *hbtk_radio_button_new (gchar **items, gboolean buttonstyle)
 {
-GtkTreeModel *model;
-GtkTreeIter  iter;
-GList *list;
-gint i;
+GtkWidget *box, *button, *newbutton;
+guint i;
 
-       //insert all glist item into treeview
-       model  = gtk_combo_box_get_model(combobox);
-       gtk_list_store_clear(GTK_LIST_STORE(model));
+       box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
-       gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-       gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, "----", -1);
+    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++)
+       {
+               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);
+       }
 
-       i=0;
-       list = g_list_first(srclist);
-       while (list != NULL)
+       if(buttonstyle)
        {
-       Archive *entry = list->data;
+               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;
+}
 
-               gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-               gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, entry->wording, -1);
 
-               //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
+/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
-               i++; list = g_list_next(list);
-       }
 
-       return i;
+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_poparchive(GtkWidget *label)
+GtkWidget *make_cycle(GtkWidget *label, gchar **items)
 {
-GtkListStore *store;
 GtkWidget *combobox;
-GtkCellRenderer    *renderer;
+guint i;
 
-       //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 ();
+
+       for (i = 0; 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), "");
+       }
+       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);
@@ -671,98 +809,195 @@ GtkCellRenderer    *renderer;
        return combobox;
 }
 
+
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
-/**
- * free_combobox_icons:
- *
- * generic function to free combobox icons
- *
- */
-static void free_combobox_icons(GdkPixbuf **storage, guint max)
+
+#define HB_KV_BUFFER_MAX_LEN   8
+#define HB_KV_ITEMS_MAX_LEN            32
+
+gchar *hbtk_get_label(HbKvData *kvdata, guint32 key)
 {
-guint i;
+gchar *retval = NULL;
+guint32 i;
 
-       for(i=0;i<max;i++)
+       for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
        {
-               if(storage[i] != NULL)
-                       g_object_unref(storage[i]);
+       HbKvData *tmp = &kvdata[i];
+               if( tmp->name == NULL )
+                       break;
+               if( tmp->key == key )
+               {
+                       //#1820372
+                       retval = (gchar *)_(tmp->name);
+                       break;
+               }
        }
+       return retval;
 }
 
-/**
- * load_combobox_icons:
- *
- * generic function to load combobox icons
- *
- */
-static void load_combobox_icons(gchar **filenames, GdkPixbuf **storage, guint max)
+
+static gboolean hbtk_combo_box_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 {
-//GError        *error = NULL;
-GtkWidget *cellview;
-guint i;
+//GtkTreePath *path;
+gboolean retval;
+gchar *txt;
 
-       cellview = gtk_cell_view_new ();
+       gtk_tree_model_get (model, iter, 0, &txt, -1);
+       retval = *txt == 0 ? TRUE : FALSE;
+       //leak
+       g_free(txt);
+
+       return retval;
+}
 
-       for(i=0;i<max;i++)
-       {
-               storage[i] = gtk_widget_render_icon (cellview, filenames[i], GTK_ICON_SIZE_BUTTON, NULL);
-               #if MYDEBUG == 1
-               if( !storage[i] )
-                       g_print("cannot found a private stock %s\n", filenames[i]);
-               #endif
-       }
 
-       gtk_widget_destroy (cellview);
+guint32 hbtk_combo_box_get_active_id (GtkComboBoxText *combobox)
+{
+const gchar* buf;
+guint32 retval;
+       
+       buf = gtk_combo_box_get_active_id(GTK_COMBO_BOX(combobox));
+       retval = buf != NULL ? atoi(buf) : 0;
+
+       return retval;
 }
 
 
+void hbtk_combo_box_set_active_id (GtkComboBoxText *combobox, guint32 key)
+{
+gchar buf[HB_KV_BUFFER_MAX_LEN];
 
+       g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
+       gtk_combo_box_set_active_id(GTK_COMBO_BOX(combobox), buf);
+}
 
 
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
+void hbtk_combo_box_text_append (GtkComboBoxText *combobox, guint32 key, gchar *text)
+{
+gchar buf[HB_KV_BUFFER_MAX_LEN];
 
-enum
+       g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
+       gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), buf, text);
+}
+
+
+GtkWidget *hbtk_combo_box_new (GtkWidget *label)
 {
-       LST_PAYMODE_PIXBUF,
-       LST_PAYMODE_LABEL,
-       NUM_LST_PAYMODE
-};
+GtkWidget *combobox;
+
+       combobox = gtk_combo_box_text_new();
+       
+       if(label)
+               gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
+
+       return combobox;
+}
 
-GdkPixbuf *paymode_icons[NUM_PAYMODE_MAX];
 
-char *paymode_pixbuf_names[NUM_PAYMODE_MAX] =
+GtkWidget *hbtk_combo_box_new_with_data (GtkWidget *label, HbKvData *kvdata)
 {
-       "pm-none",
-       "pm-ccard",
-       "pm-check",
-       "pm-cash" ,
-       "pm-transfer",
-       "pm-intransfer",
-       "pm-dcard",
-       "pm-standingorder",
-       "pm-epayment",
-       "pm-deposit",
-       "pm-fifee",
-       "pm-directdebit"
-};
+GtkWidget *combobox = hbtk_combo_box_new(label);
+HbKvData *tmp;
+gboolean hassep;
+guint32 i;
 
-char *paymode_label_names[NUM_PAYMODE_MAX] =
+       hassep = FALSE;
+       for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
+       {
+               tmp = &kvdata[i];
+               if( tmp->name == 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;
+}
+
+
+/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
+
+static void
+set_sensitive (GtkCellLayout   *cell_layout,
+              GtkCellRenderer *cell,
+              GtkTreeModel    *tree_model,
+              GtkTreeIter     *iter,
+              gpointer         data)
 {
-       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")
-};
+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] != FLT_RANGE_OTHER;  
+       gtk_tree_path_free (path);
+
+       g_object_set (cell, "sensitive", sensitive, NULL);
+}
+
+
+
+GtkWidget *make_daterange(GtkWidget *label, guint dspmode)
+{
+GtkWidget *combobox = hbtk_combo_box_new(label);
+GList *renderers, *list;
+HbKvData *tmp, *kvdata = CYA_FLT_RANGE;
+guint32 i;
+
+       for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
+       {
+               tmp = &kvdata[i];
+               if( tmp->name == 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;
+                       }
+               }
+
+               hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (*tmp->name != 0) ? (gchar *)_(tmp->name) : (gchar *)"");
+       }
+
+       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);
+
+       return combobox;
+}
+
+
+/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
 /*
 id  ofx                        english                           french
@@ -804,57 +1039,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<NUM_PAYMODE_MAX;i++)
        {
                gtk_list_store_append(store, &iter);
                gtk_list_store_set(store, &iter,
-                       LST_PAYMODE_PIXBUF, paymode_icons[i],
+                       LST_PAYMODE_ICONNAME, paymode_iconnames[i],
                        LST_PAYMODE_LABEL, _(paymode_label_names[i]),
                        -1);
        }
@@ -867,44 +1171,38 @@ guint i;
        return combobox;
 }
 
+
+
+GtkWidget *make_paymode(GtkWidget *label)
+{
+       return make_paymode_internal(label, TRUE);
+}
+
+GtkWidget *make_paymode_nointxfer(GtkWidget *label)
+{
+       return make_paymode_internal(label, FALSE);
+}
+
+
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
 #define NUM_NAINEX_MAX 3
 
 enum
 {
-       LST_NAINEX_PIXBUF,
+       LST_NAINEX_ICONNAME,
        LST_NAINEX_LABEL,
        NUM_LST_NAINEX
 };
 
-GdkPixbuf *nainex_icons[NUM_NAINEX_MAX];
-
-char *nainex_pixbuf_names[NUM_NAINEX_MAX] =
+char *nainex_iconnames[NUM_NAINEX_MAX] =
 {
        "flt-inactive",
        "flt-include",
        "flt-exclude",
 };
 
-char *nainex_label_names[NUM_NAINEX_MAX] =
-{
-       N_("Inactive"),
-       N_("Include"),
-       N_("Exclude")
-};
-
-void load_nainex_icons(void)
-{
-       load_combobox_icons(nainex_pixbuf_names, nainex_icons, NUM_NAINEX_MAX);
-}
-
-
-void free_nainex_icons(void)
-{
-       free_combobox_icons(nainex_icons, NUM_NAINEX_MAX);
-}
-
+extern gchar *nainex_label_names[];
 
 /*
 ** Make a nainex combobox widget
@@ -920,7 +1218,7 @@ guint i;
        //store
        store = gtk_list_store_new (
                NUM_LST_NAINEX,
-               GDK_TYPE_PIXBUF,
+               G_TYPE_STRING,
                G_TYPE_STRING
                );
 
@@ -930,7 +1228,7 @@ guint i;
        //column 1
        renderer = 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_NAINEX_PIXBUF);
+       gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_NAINEX_ICONNAME);
 
        renderer = gtk_cell_renderer_text_new();
        gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
@@ -943,7 +1241,7 @@ guint i;
        {
                gtk_list_store_append(store, &iter);
                gtk_list_store_set(store, &iter,
-                       LST_NAINEX_PIXBUF, nainex_icons[i],
+                       LST_NAINEX_ICONNAME, nainex_iconnames[i],
                        LST_NAINEX_LABEL, _(nainex_label_names[i]),
                        -1);
        }
This page took 0.04684 seconds and 4 git commands to generate.