+static void list_txn_sort_column_changed(GtkTreeSortable *sortable, gpointer user_data)
+{
+struct list_txn_data *data = user_data;
+gint id;
+GtkSortType order;
+gboolean showBalance;
+
+ gtk_tree_sortable_get_sort_column_id(sortable, &id, &order);
+
+ DB( g_print("list_txn_columns_changed %d %d\n", id, order) );
+
+ //here save the transaction list columnid and sort order
+ PREFS->lst_ope_sort_id = id;
+ PREFS->lst_ope_sort_order = order;
+
+ //manage visibility of balance column
+ //showBalance = (id == LST_DSPOPE_DATE && order == GTK_SORT_ASCENDING) ? data->tvc_is_visible : FALSE;
+ showBalance = (id == LST_DSPOPE_DATE) ? data->tvc_is_visible : FALSE;
+ gtk_tree_view_column_set_visible (data->tvc_balance, showBalance);
+}
+
+
+static void
+list_txn_column_popup_menuitem_on_activate (GtkCheckMenuItem *checkmenuitem,
+ gpointer user_data)
+{
+GtkTreeViewColumn *column = user_data;
+
+ DB( g_print("toggled\n") );
+
+ gtk_tree_view_column_set_visible(column, gtk_check_menu_item_get_active(checkmenuitem) );
+}
+
+
+static gboolean list_txn_column_popup_callback ( GtkWidget *button,
+ GdkEventButton *ev,
+ gpointer user_data )
+{
+struct list_txn_data *data = user_data;
+GtkWidget *menu, *menuitem;
+GtkTreeViewColumn *column;
+gint i, col_id;
+
+
+ if( ev->button == 3 )
+ {
+ DB( g_print("should popup\n") );
+
+ menu = gtk_menu_new ();
+
+ //note: deactive this disable any menuitem action
+ g_signal_connect (menu, "selection-done", G_CALLBACK (gtk_widget_destroy), NULL);
+
+ for(i=0 ; i < NUM_LST_DSPOPE-1 ; i++ ) // -1 'caus: account and blank column
+ {
+ column = gtk_tree_view_get_column(GTK_TREE_VIEW(data->treeview), i);
+ if( column != NULL )
+ {
+ col_id = gtk_tree_view_column_get_sort_column_id (column);
+
+ if( (col_id == -1)
+ || (col_id == LST_DSPOPE_STATUS)
+ || (col_id == LST_DSPOPE_ACCOUNT)
+ || (col_id == LST_DSPOPE_DATE)
+ || (col_id == LST_DSPOPE_BALANCE)
+ )
+ continue;
+ //if( (data->tvc_is_visible == FALSE) && (col_id == LST_DSPOPE_BALANCE) )
+ // continue;
+
+ if( (data->list_type == LIST_TXN_TYPE_DETAIL) &&
+ ( (col_id == LST_DSPOPE_AMOUNT)
+ || (col_id == LST_DSPOPE_EXPENSE)
+ || (col_id == LST_DSPOPE_INCOME)
+ )
+ )
+ continue;
+
+ menuitem = gtk_check_menu_item_new_with_label ( gtk_tree_view_column_get_title (column) );
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), gtk_tree_view_column_get_visible (column) );
+ gtk_widget_show (menuitem);
+
+ g_signal_connect (menuitem, "activate",
+ G_CALLBACK (list_txn_column_popup_menuitem_on_activate), column);
+ }
+
+ }
+
+ gtk_menu_attach_to_widget (GTK_MENU (menu), button, NULL);
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+ ev->button, ev->time);
+ }
+
+ return FALSE;
+}
+
+
+
+static GtkTreeViewColumn *
+list_txn_column_amount_create(gint list_type, gchar *title, gint sortcolumnid, GtkTreeCellDataFunc func)
+{
+GtkTreeViewColumn *column;
+GtkCellRenderer *renderer;
+
+ renderer = gtk_cell_renderer_text_new ();
+ g_object_set(renderer, "xalign", 1.0, NULL);
+
+ column = gtk_tree_view_column_new_with_attributes(title, renderer, NULL);
+
+ gtk_tree_view_column_set_alignment (column, 0.5);
+ //gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sort_column_id (column, sortcolumnid);
+ if(list_type == LIST_TXN_TYPE_BOOK)
+ {
+ gtk_tree_view_column_set_reorderable(column, TRUE);
+ }
+ gtk_tree_view_column_set_cell_data_func(column, renderer, func, GINT_TO_POINTER(sortcolumnid), NULL);
+
+ return column;
+}
+
+
+static GtkTreeViewColumn *
+list_txn_column_text_create(gint list_type, gchar *title, gint sortcolumnid, GtkTreeCellDataFunc func, gpointer user_data)
+{
+GtkTreeViewColumn *column;
+GtkCellRenderer *renderer;
+
+ renderer = gtk_cell_renderer_text_new ();
+ /*g_object_set(renderer,
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ "ellipsize-set", TRUE,
+ NULL);*/
+
+ column = gtk_tree_view_column_new_with_attributes(title, renderer, NULL);
+
+ gtk_tree_view_column_set_alignment (column, 0.5);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+
+ gtk_tree_view_column_set_sort_column_id (column, sortcolumnid);
+ if(list_type == LIST_TXN_TYPE_BOOK)
+ {
+ gtk_tree_view_column_set_reorderable(column, TRUE);
+ gtk_tree_view_column_set_min_width (column, HB_MINWIDTH_COLUMN);
+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+ }
+ gtk_tree_view_column_set_cell_data_func(column, renderer, func, user_data, NULL);
+
+ return column;
+}
+
+
+static GtkTreeViewColumn *
+list_txn_column_info_create(gint list_type)