]> Dogcows Code - chaz/homebank/blobdiff - src/ui-payee.c
import homebank-5.1.2
[chaz/homebank] / src / ui-payee.c
index dfc35e3504782e03f12198ae210d0057e4754fdf..5c6dbfb59013dcf127cc8214b0c09f07504c2f9a 100644 (file)
@@ -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.
  *
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 #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;
 }
 
This page took 0.055144 seconds and 4 git commands to generate.