X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fui-payee.c;fp=src%2Fui-payee.c;h=5c6dbfb59013dcf127cc8214b0c09f07504c2f9a;hp=dfc35e3504782e03f12198ae210d0057e4754fdf;hb=59c5e08a64798d4303ae7eb3a2713bc93d98fa7b;hpb=8988b3bef0760b4cab8144715cc3d8f55688861c diff --git a/src/ui-payee.c b/src/ui-payee.c index dfc35e3..5c6dbfb 100644 --- a/src/ui-payee.c +++ b/src/ui-payee.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2014 Maxime DOYEN + * Copyright (C) 1995-2016 Maxime DOYEN * * This file is part of HomeBank. * @@ -17,9 +17,11 @@ * along with this program. If not, see . */ + #include "homebank.h" #include "ui-payee.h" +#include "ui-category.h" #define MYDEBUG 0 @@ -31,6 +33,7 @@ /* our global datas */ extern struct HomeBank *GLOBALS; +extern struct Preferences *PREFS; /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ @@ -49,8 +52,9 @@ ui_pay_comboboxentry_get_name(GtkComboBox *entry_box) gchar *cbname; gchar *name = NULL; - cbname = (gchar *)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); + DB( g_print ("ui_pay_comboboxentry_get_name()\n") ); + cbname = (gchar *)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); if( cbname != NULL) { name = g_strdup(cbname); @@ -118,6 +122,22 @@ Payee *item; return 0; } + +Payee +*ui_pay_comboboxentry_get(GtkComboBox *entry_box) +{ +gchar *name; +Payee *item = NULL; + + DB( g_print ("ui_pay_comboboxentry_get()\n") ); + + name = (gchar *)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); + item = da_pay_get_by_name(name); + + return item; +} + + gboolean ui_pay_comboboxentry_set_active(GtkComboBox *entry_box, guint32 key) { @@ -136,9 +156,6 @@ Payee *item; return FALSE; } - - - /** * ui_pay_comboboxentry_add: * @@ -170,8 +187,10 @@ Payee *pay = value; if( ( pay->key != ctx->except_key ) ) { - gtk_list_store_append (GTK_LIST_STORE(ctx->model), &iter); - gtk_list_store_set (GTK_LIST_STORE(ctx->model), &iter, 0, pay->name, -1); + //gtk_list_store_append (GTK_LIST_STORE(ctx->model), &iter); + //gtk_list_store_set (GTK_LIST_STORE(ctx->model), &iter, 0, pay->name, -1); + gtk_list_store_insert_with_values(GTK_LIST_STORE(ctx->model), &iter, -1, + 0, pay->name, -1); } } @@ -193,36 +212,39 @@ void ui_pay_comboboxentry_populate_except(GtkComboBox *entry_box, GHashTable *hash, guint except_key) { GtkTreeModel *model; -GtkEntryCompletion *completion; +//GtkEntryCompletion *completion; struct payPopContext ctx; DB( g_print ("ui_pay_comboboxentry_populate\n") ); model = gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box)); - completion = gtk_entry_get_completion(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); + //completion = gtk_entry_get_completion(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); /* keep our model alive and detach from comboboxentry and completion */ - g_object_ref(model); - gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box), NULL); - gtk_entry_completion_set_model (completion, NULL); + //g_object_ref(model); + //gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box), NULL); + //gtk_entry_completion_set_model (completion, NULL); /* clear and populate */ ctx.model = model; ctx.except_key = except_key; gtk_list_store_clear (GTK_LIST_STORE(model)); - g_hash_table_foreach(hash, (GHFunc)ui_pay_comboboxentry_populate_ghfunc, &ctx); - /* reatach our model */ - gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box), model); - gtk_entry_completion_set_model (completion, model); - g_object_unref(model); + //gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(GTK_LIST_STORE(model)), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING); + + g_hash_table_foreach(hash, (GHFunc)ui_pay_comboboxentry_populate_ghfunc, &ctx); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); + /* reatach our model */ + //g_print("reattach\n"); + //gtk_combo_box_set_model(GTK_COMBO_BOX(entry_box), model); + //gtk_entry_completion_set_model (completion, model); + //g_object_unref(model); + } - static gint ui_pay_comboboxentry_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) { @@ -277,6 +299,8 @@ GtkWidget *comboboxentry; GtkEntryCompletion *completion; GtkCellRenderer *renderer; + DB( g_print ("ui_pay_comboboxentry_new()\n") ); + store = gtk_list_store_new (1, G_TYPE_STRING ); @@ -320,13 +344,13 @@ GtkCellRenderer *renderer; if(label) gtk_label_set_mnemonic_widget (GTK_LABEL(label), comboboxentry); - gtk_widget_set_size_request(comboboxentry, HB_MINWIDTH_COMBO, -1); + gtk_widget_set_size_request(comboboxentry, HB_MINWIDTH_LIST, -1); return comboboxentry; } -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ static void ui_pay_listview_toggled_cb (GtkCellRendererToggle *cell, @@ -352,17 +376,96 @@ ui_pay_listview_toggled_cb (GtkCellRendererToggle *cell, gtk_tree_path_free (path); } + static gint ui_pay_listview_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) { +gint sortcol = GPOINTER_TO_INT(userdata); Payee *entry1, *entry2; +gint retval = 0; + + gtk_tree_model_get(model, a, LST_DEFPAY_DATAS, &entry1, -1); + gtk_tree_model_get(model, b, LST_DEFPAY_DATAS, &entry2, -1); + + switch (sortcol) + { + case LST_DEFPAY_SORT_NAME: + retval = hb_string_utf8_compare(entry1->name, entry2->name); + break; + case LST_DEFPAY_SORT_USED: + retval = entry1->usage_count - entry2->usage_count; + break; + case LST_DEFPAY_SORT_DEFCAT: + { + Category *c1, *c2; + gchar *name1, *name2; + + c1 = da_cat_get(entry1->kcat); + c2 = da_cat_get(entry2->kcat); + if( c1 != NULL && c2 != NULL ) + { + name1 = da_cat_get_fullname(c1); + name2 = da_cat_get_fullname(c2); + retval = hb_string_utf8_compare(name1, name2); + g_free(name2); + g_free(name1); + } + } + break; + default: + g_return_val_if_reached(0); + } + + return retval; +} + + +static void +ui_pay_listview_count_cell_data_function (GtkTreeViewColumn *col, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ +Payee *entry; +gchar buffer[256]; + + gtk_tree_model_get(model, iter, LST_DEFPAY_DATAS, &entry, -1); + if(entry->usage_count > 0) + { + g_snprintf(buffer, 256-1, "%d", entry->usage_count); + g_object_set(renderer, "text", buffer, NULL); + } + else + g_object_set(renderer, "text", "", NULL); +} - gtk_tree_model_get(model, a, LST_DEFPAY_DATAS, &entry1, -1); - gtk_tree_model_get(model, b, LST_DEFPAY_DATAS, &entry2, -1); - return hb_string_utf8_compare(entry1->name, entry2->name); +static void +ui_pay_listview_defcat_cell_data_function (GtkTreeViewColumn *col, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ +Payee *entry; +Category *cat; +gchar *fullname; + + gtk_tree_model_get(model, iter, LST_DEFPAY_DATAS, &entry, -1); + + cat = da_cat_get(entry->kcat); + if( cat != NULL ) + { + fullname = da_cat_get_fullname(cat); + g_object_set(renderer, "text", fullname, NULL); + g_free(fullname); + } + else + g_object_set(renderer, "text", "", NULL); } + static void ui_pay_listview_name_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, @@ -384,7 +487,7 @@ gchar *string; name = entry->name; #if MYDEBUG - string = g_strdup_printf ("%d > %s [ft=%d im=%d]", entry->key, name, entry->filter, entry->imported); + string = g_strdup_printf ("%d > %s [ft=%d]", entry->key, name, entry->filter); g_object_set(renderer, "text", string, NULL); g_free(string); #else @@ -394,18 +497,17 @@ gchar *string; } - /* = = = = = = = = = = = = = = = = */ void ui_pay_listview_add(GtkTreeView *treeview, Payee *item) { +GtkTreeModel *model; +GtkTreeIter iter; + if( item->name != NULL ) { - GtkTreeModel *model; - GtkTreeIter iter; - model = gtk_tree_view_get_model(treeview); gtk_list_store_append (GTK_LIST_STORE(model), &iter); @@ -443,6 +545,8 @@ GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; + DB( g_print("ui_pay_listview_remove_selected() \n") ); + selection = gtk_tree_view_get_selection(treeview); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { @@ -456,10 +560,11 @@ static void ui_pay_listview_populate_ghfunc(gpointer key, gpointer value, GtkTre GtkTreeIter iter; Payee *item = value; - DB( g_print(" populate: %p\n", key) ); + //DB( g_print(" populate: %p\n", key) ); - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, + //gtk_list_store_append (GTK_LIST_STORE(model), &iter); + //gtk_list_store_set (GTK_LIST_STORE(model), &iter, + gtk_list_store_insert_with_values(GTK_LIST_STORE(model), &iter, -1, LST_DEFPAY_TOGGLE , FALSE, LST_DEFPAY_DATAS, item, -1); @@ -469,77 +574,193 @@ void ui_pay_listview_populate(GtkWidget *view) { GtkTreeModel *model; - model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); + DB( g_print("ui_pay_listview_populate \n") ); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_list_store_clear (GTK_LIST_STORE(model)); - g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */ - gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL); /* Detach model from view */ + //g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */ + //gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL); /* Detach model from view */ /* populate */ g_hash_table_foreach(GLOBALS->h_pay, (GHFunc)ui_pay_listview_populate_ghfunc, model); - gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); /* Re-attach model to view */ - g_object_unref(model); + //gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); /* Re-attach model to view */ + //g_object_unref(model); +} + + +static gboolean ui_pay_listview_search_equal_func (GtkTreeModel *model, + gint column, + const gchar *key, + GtkTreeIter *iter, + gpointer search_data) +{ + gboolean retval = TRUE; + gchar *normalized_string; + gchar *normalized_key; + gchar *case_normalized_string = NULL; + gchar *case_normalized_key = NULL; + Payee *item; + + //gtk_tree_model_get_value (model, iter, column, &value); + gtk_tree_model_get(model, iter, LST_DEFPAY_DATAS, &item, -1); + + if(item != NULL) + { + normalized_string = g_utf8_normalize (item->name, -1, G_NORMALIZE_ALL); + normalized_key = g_utf8_normalize (key, -1, G_NORMALIZE_ALL); + + if (normalized_string && normalized_key) + { + case_normalized_string = g_utf8_casefold (normalized_string, -1); + case_normalized_key = g_utf8_casefold (normalized_key, -1); + + if (strncmp (case_normalized_key, case_normalized_string, strlen (case_normalized_key)) == 0) + retval = FALSE; + } + + g_free (normalized_key); + g_free (normalized_string); + g_free (case_normalized_key); + g_free (case_normalized_string); + } + return retval; } GtkWidget * -ui_pay_listview_new(gboolean withtoggle) +ui_pay_listview_new(gboolean withtoggle, gboolean withcount) { GtkListStore *store; GtkWidget *treeview; GtkCellRenderer *renderer; GtkTreeViewColumn *column; - // create list store + DB( g_print("ui_pay_listview_new() \n") ); + store = gtk_list_store_new( NUM_LST_DEFPAY, G_TYPE_BOOLEAN, G_TYPE_POINTER ); - // treeview treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); - //gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); + gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview), PREFS->grid_lines); - // column 1: toggle + // column: toggle if( withtoggle == TRUE ) { renderer = gtk_cell_renderer_toggle_new (); column = gtk_tree_view_column_new_with_attributes (_("Visible"), - renderer, - "active", LST_DEFPAY_TOGGLE, - NULL); + renderer, "active", LST_DEFPAY_TOGGLE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - g_signal_connect (renderer, "toggled", + g_signal_connect (G_OBJECT(renderer), "toggled", G_CALLBACK (ui_pay_listview_toggled_cb), store); } - // column 2: name + // column: name renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, + "ellipsize", PANGO_ELLIPSIZE_END, + "ellipsize-set", TRUE, + NULL); + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, ui_pay_listview_name_cell_data_function, GINT_TO_POINTER(LST_DEFPAY_DATAS), NULL); + gtk_tree_view_column_set_alignment (column, 0.5); + gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST); + gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_NAME); + gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // column: usage + if( withcount == TRUE ) + { + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "xalign", 0.5, NULL); + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Usage")); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, ui_pay_listview_count_cell_data_function, GINT_TO_POINTER(LST_DEFPAY_DATAS), NULL); + gtk_tree_view_column_set_alignment (column, 0.5); + gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_USED); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + } + + // column: category + if( withtoggle == FALSE ) + { + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, + "ellipsize", PANGO_ELLIPSIZE_END, + "ellipsize-set", TRUE, + NULL); + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Default category")); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, ui_pay_listview_defcat_cell_data_function, GINT_TO_POINTER(LST_DEFPAY_DATAS), NULL); + gtk_tree_view_column_set_alignment (column, 0.5); + gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_DEFCAT); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + } + + gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview), ui_pay_listview_search_equal_func, NULL, NULL); + // treeview attribute - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), FALSE); - //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DEFPAY_DATAS, ui_pay_listview_compare_func, NULL, NULL); - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), LST_DEFPAY_DATAS, GTK_SORT_ASCENDING); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(treeview), withcount); + + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DEFPAY_SORT_NAME, ui_pay_listview_compare_func, GINT_TO_POINTER(LST_DEFPAY_SORT_NAME), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DEFPAY_SORT_USED, ui_pay_listview_compare_func, GINT_TO_POINTER(LST_DEFPAY_SORT_USED), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DEFPAY_SORT_DEFCAT, ui_pay_listview_compare_func, GINT_TO_POINTER(LST_DEFPAY_SORT_DEFCAT), NULL); + + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), LST_DEFPAY_SORT_NAME, GTK_SORT_ASCENDING); return treeview; } +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ +static void +ui_pay_manage_dialog_delete_unused( GtkWidget *widget, gpointer user_data) +{ +struct ui_pay_manage_dialog_data *data = user_data; +gboolean result; + + //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data"); + + DB( g_print("(ui_pay_manage_dialog) delete unused - data %p\n", data) ); + + result = ui_dialog_msg_confirm_alert( + GTK_WINDOW(data->window), + _("Delete unused payee"), + _("Are you sure you want to\npermanently delete unused payee?"), + _("_Delete") + ); + + if( result == GTK_RESPONSE_OK ) + { + GtkTreeModel *model; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_pay)); + gtk_list_store_clear (GTK_LIST_STORE(model)); + + payee_delete_unused(); + + ui_pay_listview_populate (data->LV_pay); + } +} -/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ /** * ui_pay_manage_dialog_load_csv: @@ -548,10 +769,10 @@ GtkTreeViewColumn *column; static void ui_pay_manage_dialog_load_csv( GtkWidget *widget, gpointer user_data) { -struct ui_pay_manage_dialog_data *data; +struct ui_pay_manage_dialog_data *data = user_data; gchar *filename = NULL; - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data"); + //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data"); DB( g_print("(ui_pay_manage_dialog) load csv - data %p\n", data) ); @@ -574,12 +795,12 @@ gchar *filename = NULL; static void ui_pay_manage_dialog_save_csv( GtkWidget *widget, gpointer user_data) { -struct ui_pay_manage_dialog_data *data; +struct ui_pay_manage_dialog_data *data = user_data; gchar *filename = NULL; DB( g_print("(ui_pay_manage_dialog) save csv\n") ); - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); + //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, NULL) == TRUE ) { @@ -618,7 +839,7 @@ gchar *name; } -static void ui_pay_manage_dialog_modify_entry_cb(GtkEditable *editable, gpointer user_data) +static void ui_pay_manage_dialog_edit_entry_cb(GtkEditable *editable, gpointer user_data) { GtkDialog *window = user_data; const gchar *buffer; @@ -628,16 +849,16 @@ const gchar *buffer; } -/* -** modify -*/ -static void ui_pay_manage_dialog_modify(GtkWidget *widget, gpointer user_data) +static void ui_pay_manage_dialog_edit(GtkWidget *dowidget, gpointer user_data) { struct ui_pay_manage_dialog_data *data; -GtkWidget *window, *content, *mainvbox, *getwidget; +GtkWidget *dialog, *content_area, *content_grid, *group_grid; +GtkWidget *label, *widget; +GtkWidget *ST_name, *PO_cat, *NU_mode; +gint crow, row; guint32 key; - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(dowidget, GTK_TYPE_WINDOW)), "inst_data"); DB( g_print("(defayee) modify %p\n", data) ); key = ui_pay_listview_get_selected_key(GTK_TREE_VIEW(data->LV_pay)); @@ -647,43 +868,92 @@ guint32 key; item = da_pay_get( key ); - window = gtk_dialog_new_with_buttons (_("Modify..."), + dialog = gtk_dialog_new_with_buttons (_("Edit..."), GTK_WINDOW (data->window), 0, - GTK_STOCK_CANCEL, + _("_Cancel"), GTK_RESPONSE_REJECT, - GTK_STOCK_OK, + _("_OK"), GTK_RESPONSE_ACCEPT, NULL); - content = gtk_dialog_get_content_area(GTK_DIALOG (window)); - mainvbox = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (mainvbox), HB_BOX_SPACING); - - getwidget = gtk_entry_new(); - gtk_box_pack_start (GTK_BOX (mainvbox), getwidget, TRUE, TRUE, 0); - gtk_widget_show_all(mainvbox); - - g_signal_connect (G_OBJECT (getwidget), "changed", G_CALLBACK (ui_pay_manage_dialog_modify_entry_cb), window); - - gtk_entry_set_text(GTK_ENTRY(getwidget), item->name); - gtk_widget_grab_focus (getwidget); - - gtk_entry_set_activates_default (GTK_ENTRY(getwidget), TRUE); - - gtk_dialog_set_default_response(GTK_DIALOG( window ), GTK_RESPONSE_ACCEPT); + content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog)); + + content_grid = gtk_grid_new(); + gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE); + gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL); + gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM); + gtk_box_pack_start (GTK_BOX (content_area), content_grid, TRUE, TRUE, 0); + + crow = 0; + // group :: General + group_grid = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL); + gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM); + gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1); + + //label = make_label_group(_("General")); + //gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1); + + row = 1; + label = make_label_widget(_("_Name:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1); + widget = gtk_entry_new(); + ST_name = widget; + gtk_widget_set_hexpand(widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1); + + // group :: Default + group_grid = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL); + gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM); + gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1); + + label = make_label_group(_("Default")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 4, 1); + + row = 1; + label = make_label_widget(_("_Category:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); + widget = ui_cat_comboboxentry_new(label); + PO_cat = widget; + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); + + row++; + label = make_label_widget(_("Pa_yment:")); + gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); + widget = make_paymode(label); + NU_mode = widget; + gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); + + //setup + gtk_entry_set_text(GTK_ENTRY(ST_name), item->name); + gtk_widget_grab_focus (ST_name); + gtk_entry_set_activates_default (GTK_ENTRY(ST_name), TRUE); + + ui_cat_comboboxentry_populate(GTK_COMBO_BOX(PO_cat), GLOBALS->h_cat); + ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(PO_cat), item->kcat); + + gtk_combo_box_set_active(GTK_COMBO_BOX(NU_mode), item->paymode); + + g_signal_connect (G_OBJECT (ST_name), "changed", G_CALLBACK (ui_pay_manage_dialog_edit_entry_cb), dialog); + + gtk_widget_show_all(content_grid); + + + gtk_dialog_set_default_response(GTK_DIALOG( dialog ), GTK_RESPONSE_ACCEPT); //wait for the user - gint result = gtk_dialog_run (GTK_DIALOG (window)); + gint result = gtk_dialog_run (GTK_DIALOG (dialog)); if(result == GTK_RESPONSE_ACCEPT) { const gchar *name; - name = gtk_entry_get_text(GTK_ENTRY(getwidget)); - - /* ignore if entry is empty */ + // 1: manage renaming + name = gtk_entry_get_text(GTK_ENTRY(ST_name)); + // ignore if item is empty if (name && *name) { if( payee_rename(item, name) ) @@ -694,7 +964,7 @@ guint32 key; } else { - ui_dialog_msg_infoerror(GTK_WINDOW(window), GTK_MESSAGE_ERROR, + ui_dialog_msg_infoerror(GTK_WINDOW(dialog), GTK_MESSAGE_ERROR, _("Error"), _("Cannot rename this Payee,\n" "from '%s' to '%s',\n" @@ -705,178 +975,188 @@ guint32 key; } } + + item->kcat = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(PO_cat)); + item->paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(NU_mode)); + } // cleanup and destroy - gtk_widget_destroy (window); + gtk_widget_destroy (dialog); } } -static void ui_pay_manage_dialog_move_entry_cb(GtkComboBox *widget, gpointer user_data) +static void ui_pay_manage_dialog_merge_entry_cb(GtkComboBox *widget, gpointer user_data) { GtkDialog *window = user_data; gchar *buffer; buffer = (gchar *)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (widget)))); - gtk_dialog_set_response_sensitive(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT, strlen(buffer) > 0 ? TRUE : FALSE); + gtk_dialog_set_response_sensitive(GTK_DIALOG(window), GTK_RESPONSE_OK, strlen(buffer) > 0 ? TRUE : FALSE); } -/* -** move -*/ -static void ui_pay_manage_dialog_move(GtkWidget *widget, gpointer user_data) +static void ui_pay_manage_dialog_merge(GtkWidget *widget, gpointer user_data) { struct ui_pay_manage_dialog_data *data; -GtkWidget *window, *content, *mainvbox; -GtkWidget *getwidget; +GtkWidget *dialog, *content, *mainvbox; +GtkWidget *getwidget, *togglebutton; GtkTreeSelection *selection; -GtkTreeModel *model; -GtkTreeIter iter; +GtkTreeModel *model; +GtkTreeIter iter; data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - DB( g_print("(defayee) move %p\n", data) ); + DB( g_print("(defayee) merge %p\n", data) ); - // get selection ... selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_pay)); //if true there is a selected node if (gtk_tree_selection_get_selected(selection, &model, &iter)) { - Payee *entry; - - gtk_tree_model_get(model, &iter, LST_DEFPAY_DATAS, &entry, -1); + Payee *srcpay; + gchar *title; + gchar *secondtext; + + gtk_tree_model_get(model, &iter, LST_DEFPAY_DATAS, &srcpay, -1); + + title = g_strdup_printf ( + _("Merge payee '%s'"), srcpay->name); + + dialog = gtk_message_dialog_new (GTK_WINDOW (data->window), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_NONE, + title, + NULL + ); + + gtk_dialog_add_buttons (GTK_DIALOG(dialog), + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("Merge"), GTK_RESPONSE_OK, + NULL); + + gtk_dialog_set_default_response(GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); + + content = gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG (dialog)); + mainvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL); + gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0); - window = gtk_dialog_new_with_buttons (_("Move to..."), - GTK_WINDOW (data->window), - 0, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL); + secondtext = _("Transactions assigned to this payee,\n" + "will be moved to the payee selected below."); - content = gtk_dialog_get_content_area(GTK_DIALOG (window)); - mainvbox = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (mainvbox), HB_BOX_SPACING); + g_object_set(GTK_MESSAGE_DIALOG (dialog), "secondary-text", secondtext, NULL); + g_free(title); getwidget = ui_pay_comboboxentry_new(NULL); - gtk_box_pack_start (GTK_BOX (mainvbox), getwidget, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (mainvbox), getwidget, FALSE, FALSE, 0); - //gtk_combo_box_set_active(GTK_COMBO_BOX(getwidget), oldpos); - gtk_dialog_set_response_sensitive(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT, FALSE); - - gtk_widget_show_all(mainvbox); + secondtext = g_strdup_printf ( + _("_Delete the payee '%s'"), srcpay->name); + togglebutton = gtk_check_button_new_with_mnemonic(secondtext); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton), TRUE); + g_free(secondtext); + gtk_box_pack_start (GTK_BOX (mainvbox), togglebutton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (getwidget), "changed", G_CALLBACK (ui_pay_manage_dialog_move_entry_cb), window); + //setup + //gtk_combo_box_set_active(GTK_COMBO_BOX(getwidget), oldpos); + g_signal_connect (G_OBJECT (getwidget), "changed", G_CALLBACK (ui_pay_manage_dialog_merge_entry_cb), dialog); + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE); - //data->tmp_list = g_list_sort(data->tmp_list, (GCompareFunc)ui_pay_manage_dialog_list_sort); - ui_pay_comboboxentry_populate_except(GTK_COMBO_BOX(getwidget), GLOBALS->h_pay, entry->key); + ui_pay_comboboxentry_populate_except(GTK_COMBO_BOX(getwidget), GLOBALS->h_pay, srcpay->key); gtk_widget_grab_focus (getwidget); + gtk_widget_show_all(mainvbox); + //wait for the user - gint result = gtk_dialog_run (GTK_DIALOG (window)); + gint result = gtk_dialog_run (GTK_DIALOG (dialog)); - if(result == GTK_RESPONSE_ACCEPT) + if(result == GTK_RESPONSE_OK) { - gint result; - gchar *npn; - - npn = ui_pay_comboboxentry_get_name(GTK_COMBO_BOX(getwidget)), - - result = ui_dialog_msg_question( - GTK_WINDOW(window), - _("Move this payee to another one ?"), - _("This will replace '%s' by '%s',\n" - "and then remove '%s'"), - entry->name, - npn, - entry->name, - NULL - ); - - if( result == GTK_RESPONSE_YES ) - { - Payee *payee; - guint newpayee; + GtkTreeModel *model; + Payee *payee; + guint dstpaykey; - newpayee = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(getwidget)); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_pay)); + gtk_list_store_clear (GTK_LIST_STORE(model)); - gtk_combo_box_get_active(GTK_COMBO_BOX(getwidget)); + dstpaykey = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(getwidget)); - DB( g_print(" -> should move %d - %s to %d - %s\n", entry->key, entry->name, newpayee, npn ) ); + payee_move(srcpay->key, dstpaykey); - payee_move(entry->key, newpayee); - // remove the old payee - da_pay_remove(entry->key); - ui_pay_listview_remove_selected(GTK_TREE_VIEW(data->LV_pay)); + // add the new payee to listview + payee = da_pay_get(dstpaykey); + if(payee) + ui_pay_listview_add(GTK_TREE_VIEW(data->LV_pay), payee); - // add the new payee to listview - payee = da_pay_get(newpayee); - if(payee) - ui_pay_listview_add(GTK_TREE_VIEW(data->LV_pay), payee); - data->change++; + // delete the old payee + if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton)) ) + { + DB( g_print(" -> delete %d '%s'\n", srcpay->key, srcpay->name ) ); + da_pay_remove(srcpay->key); + ui_pay_listview_remove_selected(GTK_TREE_VIEW(data->LV_pay)); } + + data->change++; + + ui_pay_listview_populate(data->LV_pay); } // cleanup and destroy - gtk_widget_destroy (window); - + gtk_widget_destroy (dialog); } } /* -** remove the selected payee to our treeview and temp GList +** delete the selected payee to our treeview and temp GList */ -static void ui_pay_manage_dialog_remove(GtkWidget *widget, gpointer user_data) +static void ui_pay_manage_dialog_delete(GtkWidget *widget, gpointer user_data) { struct ui_pay_manage_dialog_data *data; -guint32 key; Payee *item; +guint32 key; gint result; -gboolean do_remove; + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - DB( g_print("(ui_pay_manage_dialog) remove (data=%p)\n", data) ); + DB( g_print("(ui_pay_manage_dialog) delete (data=%p)\n", data) ); - do_remove = TRUE; key = ui_pay_listview_get_selected_key(GTK_TREE_VIEW(data->LV_pay)); if( key > 0 ) { - if( payee_is_used(key) == TRUE ) + gchar *title; + gchar *secondtext = NULL; + + item = da_pay_get(key); + + title = g_strdup_printf ( + _("Are you sure you want to permanently delete '%s'?"), item->name); + + if( item->usage_count > 0 ) { - item = da_pay_get(key); + secondtext = _("This payee is used.\n" + "Any transaction using that payee will be set to (no payee)"); + } - result = ui_dialog_msg_question( + result = ui_dialog_msg_confirm_alert( GTK_WINDOW(data->window), - _("Remove a payee ?"), - _("If you remove '%s', archive and transaction referencing this payee\n" - "will set place to 'no payee'"), - item->name, - NULL - ); - - if( result == GTK_RESPONSE_YES ) - { - payee_move(key, 0); - } - else if( result == GTK_RESPONSE_NO ) - { - do_remove = FALSE; - } - } + title, + secondtext, + _("_Delete") + ); + + g_free(title); - if( do_remove ) + if( result == GTK_RESPONSE_OK ) { - da_pay_remove(key); + payee_move(key, 0); ui_pay_listview_remove_selected(GTK_TREE_VIEW(data->LV_pay)); + da_pay_remove(key); data->change++; } @@ -884,9 +1164,6 @@ gboolean do_remove; } -/* -** -*/ static void ui_pay_manage_dialog_update(GtkWidget *treeview, gpointer user_data) { struct ui_pay_manage_dialog_data *data; @@ -900,9 +1177,9 @@ guint32 key; key = ui_pay_listview_get_selected_key(GTK_TREE_VIEW(data->LV_pay)); sensitive = (key > 0) ? TRUE : FALSE; - gtk_widget_set_sensitive(data->BT_mov, sensitive); - gtk_widget_set_sensitive(data->BT_mod, sensitive); - gtk_widget_set_sensitive(data->BT_rem, sensitive); + gtk_widget_set_sensitive(data->BT_edit, sensitive); + gtk_widget_set_sensitive(data->BT_merge, sensitive); + gtk_widget_set_sensitive(data->BT_delete, sensitive); } @@ -918,43 +1195,47 @@ static void ui_pay_manage_dialog_selection(GtkTreeSelection *treeselection, gpoi static void ui_pay_manage_dialog_onRowActivated (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, - gpointer userdata) + gpointer user_data) { GtkTreeModel *model; GtkTreeIter iter; + DB( g_print("ui_pay_manage_dialog_onRowActivated()\n") ); + + model = gtk_tree_view_get_model(treeview); gtk_tree_model_get_iter_first(model, &iter); if(gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), &iter) == FALSE) { - ui_pay_manage_dialog_modify(GTK_WIDGET(treeview), NULL); + ui_pay_manage_dialog_edit(GTK_WIDGET(treeview), NULL); } } -/* -** -*/ + GtkWidget *ui_pay_manage_dialog (void) { struct ui_pay_manage_dialog_data data; -GtkWidget *window, *content, *mainvbox, *treeview, *scrollwin, *vbox, *table; -GtkWidget *separator; -gint row; +GtkWidget *window, *content, *mainvbox, *bbox, *treeview, *scrollwin, *table; +GtkWidget *menu, *menuitem, *widget, *image; +gint w, h, row; window = gtk_dialog_new_with_buttons (_("Manage Payees"), GTK_WINDOW(GLOBALS->mainwindow), 0, - GTK_STOCK_CLOSE, + _("_Close"), GTK_RESPONSE_ACCEPT, NULL); data.window = window; data.change = 0; + gtk_window_set_icon_name(GTK_WINDOW (window), ICONNAME_HB_PAYEE); - //homebank_window_set_icon_from_file(GTK_WINDOW (window), "payee.svg"); - gtk_window_set_icon_name(GTK_WINDOW (window), HB_STOCK_PAYEE); + //set a nice dialog size + gtk_window_get_size(GTK_WINDOW(GLOBALS->mainwindow), &w, &h); + gtk_window_set_default_size (GTK_WINDOW(window), -1, h/PHI); + //store our window private data g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data); DB( g_print("(ui_pay_manage_dialog) window=%p, inst_data=%p\n", window, &data) ); @@ -964,61 +1245,82 @@ gint row; //window contents content = gtk_dialog_get_content_area(GTK_DIALOG (window)); - mainvbox = gtk_vbox_new (FALSE, HB_BOX_SPACING); + mainvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL); gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER(mainvbox), HB_MAINBOX_SPACING); + gtk_container_set_border_width (GTK_CONTAINER(mainvbox), SPACING_MEDIUM); //our table - table = gtk_table_new (2, 2, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), HB_TABROW_SPACING); - gtk_table_set_col_spacings (GTK_TABLE (table), HB_TABCOL_SPACING); + table = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL); + gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM); gtk_box_pack_start (GTK_BOX (mainvbox), table, TRUE, TRUE, 0); row = 0; + menu = gtk_menu_new (); + gtk_widget_set_halign (menu, GTK_ALIGN_END); + + menuitem = gtk_menu_item_new_with_mnemonic (_("_Import CSV")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_pay_manage_dialog_load_csv), &data); + + menuitem = gtk_menu_item_new_with_mnemonic (_("E_xport CSV")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_pay_manage_dialog_save_csv), &data); + + menuitem = gtk_separator_menu_item_new(); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + + menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete unused")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_pay_manage_dialog_delete_unused), &data); + + gtk_widget_show_all (menu); + + widget = gtk_menu_button_new(); + image = gtk_image_new_from_icon_name (ICONNAME_HB_BUTTON_MENU, GTK_ICON_SIZE_MENU); + + //gchar *thename; + //gtk_image_get_icon_name(image, &thename, NULL); + //g_print("the name is %s\n", thename); + + g_object_set (widget, "image", image, "popup", GTK_MENU(menu), NULL); + gtk_widget_set_halign (widget, GTK_ALIGN_END); + gtk_grid_attach (GTK_GRID (table), widget, 1, row, 1, 1); + + row++; data.ST_name = gtk_entry_new (); - gtk_table_attach (GTK_TABLE (table), data.ST_name, 0, 1, row, row+1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (0), 0, 0); - data.BT_add = gtk_button_new_from_stock(GTK_STOCK_ADD); - gtk_table_attach (GTK_TABLE (table), data.BT_add, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + gtk_entry_set_placeholder_text(GTK_ENTRY(data.ST_name), _("new payee") ); + gtk_widget_set_hexpand (data.ST_name, TRUE); + gtk_grid_attach (GTK_GRID (table), data.ST_name, 0, row, 2, 1); + //list row++; scrollwin = gtk_scrolled_window_new(NULL,NULL); - gtk_table_attach (GTK_TABLE (table), scrollwin, 0, 1, row, row+1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN); - //gtk_container_set_border_width (GTK_CONTAINER(scrollwin), 5); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - //treeview = (GtkWidget *)ui_pay_manage_dialog_list_new(FALSE); - treeview = ui_pay_listview_new(FALSE); - gtk_widget_set_size_request(treeview, HB_MINWIDTH_LIST, -1); - data.LV_pay = treeview; + gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrollwin), HB_MINHEIGHT_LIST); + treeview = ui_pay_listview_new(FALSE, TRUE); + data.LV_pay = treeview; gtk_container_add(GTK_CONTAINER(scrollwin), treeview); + gtk_widget_set_hexpand (scrollwin, TRUE); + gtk_widget_set_vexpand (scrollwin, TRUE); + gtk_grid_attach (GTK_GRID (table), scrollwin, 0, row, 2, 1); - vbox = gtk_vbox_new (FALSE, HB_BOX_SPACING); - gtk_table_attach (GTK_TABLE (table), vbox, 1, 2, row, row+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0); - - data.BT_rem = gtk_button_new_from_stock(GTK_STOCK_REMOVE); - gtk_box_pack_start (GTK_BOX (vbox), data.BT_rem, FALSE, FALSE, 0); - - data.BT_mod = gtk_button_new_from_stock(GTK_STOCK_EDIT); - //data.BT_mod = gtk_button_new_with_mnemonic(_("_Modify")); - gtk_box_pack_start (GTK_BOX (vbox), data.BT_mod, FALSE, FALSE, 0); - - data.BT_mov = gtk_button_new_with_mnemonic(_("_Move")); - gtk_box_pack_start (GTK_BOX (vbox), data.BT_mov, FALSE, FALSE, 0); - - separator = gtk_hseparator_new(); - gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, HB_BOX_SPACING); - + row++; + bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); + gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START); + gtk_box_set_spacing (GTK_BOX (bbox), SPACING_SMALL); + gtk_grid_attach (GTK_GRID (table), bbox, 0, row, 2, 1); - data.BT_import = gtk_button_new_with_mnemonic(_("_Import")); - //data.BT_import = gtk_button_new_from_stock(GTK_STOCK_OPEN); - gtk_box_pack_start (GTK_BOX (vbox), data.BT_import, FALSE, FALSE, 0); + data.BT_edit = gtk_button_new_with_mnemonic(_("_Edit")); + gtk_container_add (GTK_CONTAINER (bbox), data.BT_edit); - data.BT_export = gtk_button_new_with_mnemonic(_("E_xport")); - //data.BT_export = gtk_button_new_from_stock(GTK_STOCK_SAVE); - gtk_box_pack_start (GTK_BOX (vbox), data.BT_export, FALSE, FALSE, 0); + data.BT_merge = gtk_button_new_with_mnemonic(_("_Merge")); + gtk_container_add (GTK_CONTAINER (bbox), data.BT_merge); + data.BT_delete = gtk_button_new_with_mnemonic(_("_Delete")); + gtk_container_add (GTK_CONTAINER (bbox), data.BT_delete); //connect all our signals @@ -1027,20 +1329,15 @@ gint row; g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_pay)), "changed", G_CALLBACK (ui_pay_manage_dialog_selection), NULL); g_signal_connect (GTK_TREE_VIEW(data.LV_pay), "row-activated", G_CALLBACK (ui_pay_manage_dialog_onRowActivated), NULL); - g_signal_connect (G_OBJECT (data.BT_add), "clicked", G_CALLBACK (ui_pay_manage_dialog_add), NULL); - g_signal_connect (G_OBJECT (data.BT_mod), "clicked", G_CALLBACK (ui_pay_manage_dialog_modify), NULL); - g_signal_connect (G_OBJECT (data.BT_mov), "clicked", G_CALLBACK (ui_pay_manage_dialog_move), NULL); - g_signal_connect (G_OBJECT (data.BT_rem), "clicked", G_CALLBACK (ui_pay_manage_dialog_remove), NULL); - - g_signal_connect (G_OBJECT (data.BT_import), "clicked", G_CALLBACK (ui_pay_manage_dialog_load_csv), NULL); - g_signal_connect (G_OBJECT (data.BT_export), "clicked", G_CALLBACK (ui_pay_manage_dialog_save_csv), NULL); + g_signal_connect (G_OBJECT (data.BT_edit), "clicked", G_CALLBACK (ui_pay_manage_dialog_edit), NULL); + g_signal_connect (G_OBJECT (data.BT_merge), "clicked", G_CALLBACK (ui_pay_manage_dialog_merge), NULL); + g_signal_connect (G_OBJECT (data.BT_delete), "clicked", G_CALLBACK (ui_pay_manage_dialog_delete), NULL); //setup, init and show window + payee_fill_usage(); ui_pay_listview_populate(data.LV_pay); ui_pay_manage_dialog_update(data.LV_pay, NULL); - //gtk_window_resize(GTK_WINDOW(window), 200, 320); - gtk_widget_show_all (window); //wait for the user @@ -1056,11 +1353,12 @@ gint row; break; } - // cleanup and destroy - GLOBALS->changes_count += data.change; + gtk_widget_destroy (window); + GLOBALS->changes_count += data.change; + return NULL; }