X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Flist_operation.c;fp=src%2Flist_operation.c;h=9b05b5d3d5fbcf7bca2ee0920067edb56e93c550;hp=14ced53b0c3218d84eec8bf8131ee65b21ce8712;hb=996fa4ab9f6b836001f8ad0eecbfd3821687fea7;hpb=27f6e3b112df235c8e9afc9911b1f6bce208a001 diff --git a/src/list_operation.c b/src/list_operation.c index 14ced53..9b05b5d 100644 --- a/src/list_operation.c +++ b/src/list_operation.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. * @@ -38,21 +38,39 @@ extern struct HomeBank *GLOBALS; extern struct Preferences *PREFS; + +gchar *list_txn_column_label[] = { + "----", //datas + "----", //status + "----", //date + N_("Info" ), + N_("Payee" ), + N_("Memo" ), + N_("Amount" ), + N_("Expense" ), + N_("Income" ), + N_("Category"), + N_("Tags" ), + N_("Balance" ), + N_("Status"), + NULL +}; + + //debug //extern gboolean minor_active; -extern GdkPixbuf *paymode_icons[]; /* This is not pretty. Of course you can also use a * separate compare function for each sort ID value */ -static gint ope_sort_iter_compare_strings(gchar *s1, gchar *s2) +static gint list_txn_sort_iter_compare_strings(gchar *s1, gchar *s2) { return hb_string_utf8_compare(s1, s2); } static gint - ope_sort_iter_compare_func (GtkTreeModel *model, + list_txn_sort_iter_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) @@ -68,9 +86,9 @@ static gint switch (sortcol) { case LST_DSPOPE_STATUS: - if(!(retval = (ope1->flags & OF_VALID) - (ope2->flags & OF_VALID) ) ) + if(!(retval = (ope1->flags & OF_ADDED) - (ope2->flags & OF_ADDED) ) ) { - retval = (ope1->flags & OF_REMIND) - (ope2->flags & OF_REMIND); + retval = (ope1->flags & OF_CHANGED) - (ope2->flags & OF_CHANGED); } break; @@ -93,7 +111,7 @@ static gint a2 = da_acc_get(ope2->kacc); if( a1 != NULL && a2 != NULL ) { - retval = ope_sort_iter_compare_strings(a1->name, a2->name); + retval = list_txn_sort_iter_compare_strings(a1->name, a2->name); } } break; @@ -101,7 +119,7 @@ static gint case LST_DSPOPE_INFO: if(!(retval = ope1->paymode - ope2->paymode)) { - retval = ope_sort_iter_compare_strings(ope1->info, ope2->info); + retval = list_txn_sort_iter_compare_strings(ope1->info, ope2->info); } break; @@ -113,13 +131,17 @@ static gint p2 = da_pay_get(ope2->kpay); if( p1 != NULL && p2 != NULL ) { - retval = ope_sort_iter_compare_strings(p1->name, p2->name); + retval = list_txn_sort_iter_compare_strings(p1->name, p2->name); } } break; case LST_DSPOPE_WORDING: - retval = ope_sort_iter_compare_strings(ope1->wording, ope2->wording); + retval = list_txn_sort_iter_compare_strings(ope1->wording, ope2->wording); + break; + + case LST_DSPOPE_CLR: + retval = ope1->status - ope2->status; break; case LST_DSPOPE_AMOUNT: @@ -140,7 +162,7 @@ static gint { name1 = da_cat_get_fullname(c1); name2 = da_cat_get_fullname(c2); - retval = ope_sort_iter_compare_strings(name1, name2); + retval = list_txn_sort_iter_compare_strings(name1, name2); g_free(name2); g_free(name1); } @@ -153,7 +175,7 @@ static gint t1 = transaction_tags_tostring(ope1); t2 = transaction_tags_tostring(ope2); - retval = ope_sort_iter_compare_strings(t1, t2); + retval = list_txn_sort_iter_compare_strings(t1, t2); g_free(t1); g_free(t2); } @@ -166,13 +188,46 @@ static gint return retval; } +static void list_txn_eval_future(GtkCellRenderer *renderer, Transaction *txn) +{ + + //it seems we are not able to get a valid GdkRGBA + //nor to set/use the alpha + /*GdkRGBA *rgba; + g_object_get(renderer, "foreground-rgba", &rgba, NULL); + g_print("forcol: %p %f %f %f %f\n", rgba, rgba->red, rgba->green, rgba->blue, rgba->alpha); + rgba->red = 1.0; + rgba->alpha = 0.1; + g_object_set(renderer, "foreground-set", TRUE, + "foreground-rgba", rgba, + NULL); + gdk_rgba_free(rgba); + */ + + if(txn->date > GLOBALS->today) + { + g_object_set(renderer, + "scale-set", TRUE, + "scale", 0.8, + "style-set", TRUE, + "style", PANGO_STYLE_OBLIQUE, + NULL); + } + else + { + g_object_set(renderer, "scale-set", FALSE, "style-set", FALSE, + NULL); + } +} + + /* ** date cell function */ -static void ope_status_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_status_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *entry; -GdkPixbuf *pixbuf = NULL; +gchar *iconname = NULL; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &entry, -1); @@ -186,29 +241,29 @@ GdkPixbuf *pixbuf = NULL; switch(GPOINTER_TO_INT(user_data)) { case 1: - pixbuf = ( entry->flags & OF_AUTO ) ? GLOBALS->lst_pixbuf[LST_PIXBUF_AUTO] : ( entry->flags & OF_ADDED ) ? GLOBALS->lst_pixbuf[LST_PIXBUF_ADD] : NULL; + iconname = ( entry->flags & OF_AUTO ) ? ICONNAME_HB_OPE_AUTO : ( entry->flags & OF_ADDED ) ? ICONNAME_NEW : NULL; break; case 2: - pixbuf = ( entry->flags & OF_CHANGED ) ? GLOBALS->lst_pixbuf[LST_PIXBUF_EDIT] : NULL; + iconname = ( entry->flags & OF_CHANGED ) ? ICONNAME_HB_OPE_EDIT : NULL; break; - case 3: + /*case 3: if( entry->flags & OF_VALID ) - pixbuf = GLOBALS->lst_pixbuf[LST_PIXBUF_VALID]; + iconname = ICONNAME_HB_OPE_VALID; else { if( entry->flags & OF_REMIND ) - pixbuf = GLOBALS->lst_pixbuf[LST_PIXBUF_REMIND]; + iconname = ICONNAME_HB_OPE_REMIND; } - break; + break;*/ } - g_object_set(renderer, "pixbuf", pixbuf, NULL); + g_object_set(renderer, "icon-name", iconname, NULL); } /* ** account cell function */ -static void ope_account_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_account_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; Account *acc; @@ -227,19 +282,19 @@ Account *acc; /* ** date cell function */ -static void ope_date_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_date_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; gchar buffer[256]; -GDate *date; +GDate date; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); + list_txn_eval_future(renderer, ope); if(ope->date > 0) { - date = g_date_new_julian (ope->date); - g_date_strftime (buffer, 256-1, PREFS->date_format, date); - g_date_free(date); + g_date_set_julian (&date, ope->date); + g_date_strftime (buffer, 256-1, PREFS->date_format, &date); //g_snprintf(buf, sizeof(buf), "%d", ope->ope_Date); @@ -252,7 +307,7 @@ GDate *date; /* ** info cell function */ -static void ope_info_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_info_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; @@ -261,10 +316,11 @@ Transaction *ope; switch(GPOINTER_TO_INT(user_data)) { case 1: - g_object_set(renderer, "pixbuf", paymode_icons[ope->paymode], NULL); + g_object_set(renderer, "icon-name", get_paymode_icon_name(ope->paymode), NULL); break; case 2: - g_object_set(renderer, "text", ope->info, NULL); + list_txn_eval_future(renderer, ope); + g_object_set(renderer, "text", ope->info, NULL); break; } } @@ -272,29 +328,38 @@ Transaction *ope; /* ** payee cell function */ -static void ope_payee_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_payee_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; -Payee *pay; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); + list_txn_eval_future(renderer, ope); - pay = da_pay_get(ope->kpay); - if(pay != NULL) - g_object_set(renderer, "text", pay->name, NULL); + //#926782 + if(ope->paymode == PAYMODE_INTXFER) + { + Account *acc = da_acc_get(ope->kxferacc); + + g_object_set(renderer, "text", (acc != NULL) ? acc->name : "", NULL); + } else - g_object_set(renderer, "text", "", NULL); + { + Payee *pay = da_pay_get(ope->kpay); + + g_object_set(renderer, "text", pay != NULL ? pay->name : "", NULL); + } } /* ** tags cell function */ -static void ope_tags_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_tags_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; gchar *str; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); + list_txn_eval_future(renderer, ope); if(ope->tags != NULL) { @@ -312,18 +377,48 @@ gchar *str; /* ** wording cell function */ -static void ope_wording_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_wording_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); + list_txn_eval_future(renderer, ope); + g_object_set(renderer, "text", ope->wording, NULL); } + +/* +** clr cell function +*/ +static void list_txn_clr_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +{ +Transaction *ope; +gchar *iconname = NULL; +//const gchar *c = ""; + + gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); + switch(ope->status) + { + /*case TXN_STATUS_CLEARED: c = "c"; break; + case TXN_STATUS_RECONCILED: c = "R"; break; + case TXN_STATUS_REMIND: c = "!"; break;*/ + case TXN_STATUS_CLEARED: iconname = ICONNAME_HB_OPE_CLEARED; break; + case TXN_STATUS_RECONCILED: iconname = ICONNAME_HB_OPE_RECONCILED; break; + case TXN_STATUS_REMIND: iconname = ICONNAME_HB_OPE_REMIND; break; + + } + + //g_object_set(renderer, "text", c, NULL); + g_object_set(renderer, "icon-name", iconname, NULL); + +} + + /* ** amount cell function */ -static void ope_amount_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_amount_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; gint column = GPOINTER_TO_INT(user_data); @@ -334,12 +429,13 @@ gchar *color; // get the transaction gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); + list_txn_eval_future(renderer, ope); + if(column == LST_DSPOPE_BALANCE) amount = ope->balance; else amount = ope->amount; - if(column == LST_DSPOPE_INCOME || column == LST_DSPOPE_EXPENSE) { type = (ope->flags & OF_INCOME) ? LST_DSPOPE_INCOME : LST_DSPOPE_EXPENSE; @@ -351,21 +447,15 @@ gchar *color; } //if(amount != 0) - { - //mystrfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor); - - //todo: optimize this - //store to a data set to the listview - //acc = da_acc_get(ope->kacc); - //hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, acc->kcur); - mystrfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, GLOBALS->minor); + //{ + hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, ope->kcur, GLOBALS->minor); color = get_normal_color_amount(amount); g_object_set(renderer, "foreground", color, "text", buf, NULL); - } + //} } @@ -374,15 +464,16 @@ gchar *color; /* ** category cell function */ -static void ope_category_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) +static void list_txn_category_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; Category *cat; gchar *fullname; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); + list_txn_eval_future(renderer, ope); - if(ope->flags &OF_SPLIT) + if(ope->flags & OF_SPLIT) { g_object_set(renderer, "text", _("- split -"), NULL); } @@ -403,138 +494,31 @@ gchar *fullname; } - - -/* column 3: Infos */ -static GtkTreeViewColumn *info_list_transaction_column() -{ -GtkTreeViewColumn *column; -GtkCellRenderer *renderer; - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Info")); - - renderer = gtk_cell_renderer_pixbuf_new (); - gtk_tree_view_column_pack_start(column, renderer, FALSE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_info_cell_data_function, GINT_TO_POINTER(1), NULL); - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_info_cell_data_function, GINT_TO_POINTER(2), NULL); - gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_INFO); - - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_reorderable(column, TRUE); - gtk_tree_view_column_set_alignment (column, 0.5); - - return column; -} - - -/* column 4: Payee */ -static GtkTreeViewColumn *payee_list_transaction_column() -{ -GtkTreeViewColumn *column; -GtkCellRenderer *renderer; - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Payee")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_payee_cell_data_function, NULL, NULL); - gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_PAYEE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_reorderable(column, TRUE); - gtk_tree_view_column_set_alignment (column, 0.5); - - return column; -} - -/* column 5: Wording */ -static GtkTreeViewColumn *wording_list_transaction_column() -{ -GtkTreeViewColumn *column; -GtkCellRenderer *renderer; - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Memo")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_wording_cell_data_function, NULL, NULL); - gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_WORDING); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_reorderable(column, TRUE); - gtk_tree_view_column_set_alignment (column, 0.5); - - return column; -} - - - - -/* column 6/7: Amount/Expense/Income */ - -static GtkTreeViewColumn *amount_list_transaction_column(gchar *title, gint id) +/* = = = = = = = = = = = = = = = = */ +gboolean list_txn_column_id_isvisible(GtkTreeView *treeview, gint sort_id) { -GtkTreeViewColumn *column; -GtkCellRenderer *renderer; - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, title); - renderer = gtk_cell_renderer_text_new (); - g_object_set(renderer, "xalign", 1.0, NULL); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_amount_cell_data_function, GINT_TO_POINTER(id), NULL); - gtk_tree_view_column_set_sort_column_id (column, id); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_reorderable(column, TRUE); - gtk_tree_view_column_set_alignment (column, 0.5); - - return column; -} - - - +GtkTreeViewColumn *column; +gint n, id; -/* column 8: Category */ -static GtkTreeViewColumn *category_list_transaction_column() -{ -GtkTreeViewColumn *column; -GtkCellRenderer *renderer; + for(n=0; n < NUM_LST_DSPOPE-1 ; n++ ) // -1 cause account not to be processed + { + column = gtk_tree_view_get_column (treeview, n); + if(column == NULL) + continue; - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Category")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_category_cell_data_function, NULL, NULL); - gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_CATEGORY); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_reorderable(column, TRUE); - gtk_tree_view_column_set_alignment (column, 0.5); + if( gtk_tree_view_column_get_visible(column) ) + { + id = gtk_tree_view_column_get_sort_column_id (column); + if( sort_id == id ) + return TRUE; + } + } - return column; + return FALSE; } -/* column 9: Tags */ -static GtkTreeViewColumn *tags_list_transaction_column() -{ -GtkTreeViewColumn *column; -GtkCellRenderer *renderer; - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Tags")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_tags_cell_data_function, NULL, NULL); - gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_TAGS); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_reorderable(column, TRUE); - gtk_tree_view_column_set_alignment (column, 0.5); - - return column; -} -static GtkTreeViewColumn *list_transaction_get_column(GList *list, gint search_id) +static GtkTreeViewColumn *list_txn_get_column(GList *list, gint search_id) { GtkTreeViewColumn *column = NULL; GList *tmp; @@ -545,16 +529,17 @@ gint id; { id = gtk_tree_view_column_get_sort_column_id(tmp->data); if( search_id == id) + { column = tmp->data; - + break; + } tmp = g_list_next(tmp); } - return column; } -guint list_transaction_get_quicksearch_column_mask(GtkTreeView *treeview) +guint list_txn_get_quicksearch_column_mask(GtkTreeView *treeview) { GtkTreeViewColumn *column; guint n, mask; @@ -585,13 +570,24 @@ gint id; } -/* todo: something simpler to sort ? */ -void list_transaction_sort_force(GtkTreeSortable *sortable, gpointer user_data) +void list_txn_set_save_column_width(GtkTreeView *treeview, gboolean save_column_width) +{ +struct list_txn_data *data; + + data = g_object_get_data(G_OBJECT(treeview), "inst_data"); + if( data ) + { + data->save_column_width = save_column_width; + } +} + + +void list_txn_sort_force(GtkTreeSortable *sortable, gpointer user_data) { gint sort_column_id; GtkSortType order; - DB( g_print("list_transaction_sort_force\n") ); + DB( g_print("list_txn_sort_force\n") ); gtk_tree_sortable_get_sort_column_id(sortable, &sort_column_id, &order); DB( g_print(" - id %d order %d\n", sort_column_id, order) ); @@ -601,61 +597,119 @@ GtkSortType order; } -static void list_transaction_sort_column_changed(GtkTreeSortable *sortable, gpointer user_data) +static void list_txn_get_columns(GtkTreeView *treeview) { -struct list_transaction_data *data = user_data; -gint id; -GtkSortType order; -gboolean showBalance; +struct list_txn_data *data; +GtkTreeViewColumn *column; +gint i, col_id; + + DB( g_print("\n[list_txn] get columns order/width\n") ); - gtk_tree_sortable_get_sort_column_id(sortable, &id, &order); + data = g_object_get_data(G_OBJECT(treeview), "inst_data"); - DB( g_print("list_transaction_columns_changed %d %d\n", id, order) ); + DB( g_print(" nbcol=%d, nbsortid=%d\n", NUM_LST_DSPOPE, gtk_tree_view_get_n_columns (treeview)) ); + + for(i=0 ; i < NUM_LST_DSPOPE-1 ; i++ ) // -1 'caus: account and blank column + { + column = gtk_tree_view_get_column(treeview, i); + if(column != NULL) + { + col_id = gtk_tree_view_column_get_sort_column_id (column); + if( col_id >= 0 ) + { + gboolean visible; - //here save the transaction list columnid and sort order - PREFS->lst_ope_sort_id = id; - PREFS->lst_ope_sort_order = order; + visible = gtk_tree_view_column_get_visible (column); + if( col_id == LST_DSPOPE_BALANCE) //keep initial state of balance + visible = data->tvc_is_visible; - //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); + if( visible ) + PREFS->lst_ope_columns[i] = col_id; + else + PREFS->lst_ope_columns[i] = -col_id; + + PREFS->lst_ope_col_size[col_id-1] = gtk_tree_view_column_get_width(column); + + DB( g_print(" col-%2d => %2d '%s' w=%d\n", i, col_id, gtk_tree_view_column_get_title(column), PREFS->lst_ope_col_size[col_id-1] ) ); + } + else //should not occurs + PREFS->lst_ope_columns[i] = 0; + } + } } -static void list_transaction_set_columns(GtkTreeView *treeview, gint *visibility) +static void list_txn_set_columns(GtkTreeView *treeview, gint *col_id) { -struct list_transaction_data *data; +struct list_txn_data *data; GtkTreeViewColumn *column, *base; gboolean visible; GList *list; gint i = 0; +gint id; - DB( g_print("(list_transaction_set_columns)\n") ); - - data = g_object_get_data(G_OBJECT(treeview), "inst_data"); + DB( g_print("\n[list_txn] set columns order/width\n") ); + data = g_object_get_data(G_OBJECT(treeview), "inst_data"); + +#if MYDEBUG == 1 + DB( g_print("\n debug column sortid\n") ); + + for(i=0; i < NUM_LST_DSPOPE-1 ; i++ ) // -1 cause account not to be processed + { + DB( g_print(" - pos:%2d sortid:%2d\n", i, col_id[i]) ); + } +#endif + + + DB( g_print("\n apply column prefs\n") ); + list = gtk_tree_view_get_columns( treeview ); base = NULL; for(i=0; i < NUM_LST_DSPOPE-1 ; i++ ) // -1 cause account not to be processed { - column = list_transaction_get_column(list, ABS(visibility[i])); + /* hidden are stored as col_id negative */ + id = ABS(col_id[i]); + column = list_txn_get_column(list, id); + + //DB( g_print(" - get column %d %p\n", id, column) ); + if( column != NULL ) { - DB( g_print(" - pos:%d col:%d (%s)\n", i, visibility[i], gtk_tree_view_column_get_title(column)) ); + DB( g_print(" - pos:%2d sortid:%2d (%s)\n", i, col_id[i], gtk_tree_view_column_get_title(column)) ); gtk_tree_view_move_column_after(treeview, column, base); base = column; - visible = visibility[i] < 0 ? FALSE : TRUE; + visible = col_id[i] < 0 ? FALSE : TRUE; + + /* display exception for detail/import list */ + if(data->list_type != LIST_TXN_TYPE_BOOK) + { + if( id == LST_DSPOPE_AMOUNT ) + visible = TRUE; + + if( id == LST_DSPOPE_STATUS || id == LST_DSPOPE_EXPENSE || id == LST_DSPOPE_INCOME ) + visible = FALSE; + } + gtk_tree_view_column_set_visible (column, visible); - if( ABS(visibility[i]) == LST_DSPOPE_BALANCE) + if( id == LST_DSPOPE_BALANCE ) { data->tvc_is_visible = visible; } - + + if( id == LST_DSPOPE_INFO + || id == LST_DSPOPE_PAYEE + || id == LST_DSPOPE_WORDING + || id == LST_DSPOPE_CATEGORY + || id == LST_DSPOPE_TAGS + || id == LST_DSPOPE_ACCOUNT ) + { + gtk_tree_view_column_set_fixed_width( column, PREFS->lst_ope_col_size[id - 1]); + } } } @@ -664,40 +718,262 @@ gint i = 0; } -static void list_transaction_destroy( GtkWidget *widget, gpointer user_data ) +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) { -struct list_transaction_data *data; +GtkTreeViewColumn *column; +GtkCellRenderer *renderer; + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Info")); + + renderer = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_info_cell_data_function, GINT_TO_POINTER(1), NULL); + + renderer = gtk_cell_renderer_text_new (); + /*g_object_set(renderer, + "ellipsize", PANGO_ELLIPSIZE_END, + "ellipsize-set", TRUE, + NULL);*/ + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_info_cell_data_function, GINT_TO_POINTER(2), 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, LST_DSPOPE_INFO); + 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); + } + + return column; +} + + +static void list_txn_destroy( GtkWidget *widget, gpointer user_data ) +{ +struct list_txn_data *data; data = g_object_get_data(G_OBJECT(widget), "inst_data"); DB( g_print ("\n[list_transaction] destroy event occurred\n") ); - + if( data->save_column_width ) + { + list_txn_get_columns(GTK_TREE_VIEW(data->treeview)); + } + DB( g_print(" - view=%p, inst_data=%p\n", widget, data) ); g_free(data); } +Transaction *list_txn_get_active_transaction(GtkTreeView *treeview) +{ +GtkTreeModel *model; +GList *list; +Transaction *ope; + + ope = NULL; + + model = gtk_tree_view_get_model(treeview); + list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(treeview), &model); + + if(list != NULL) + { + GtkTreeIter iter; + + gtk_tree_model_get_iter(model, &iter, list->data); + gtk_tree_model_get(model, &iter, LST_DSPOPE_DATAS, &ope, -1); + } + + g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL); + g_list_free(list); + + return ope; +} + + /* ** create our transaction list ** Status, Date, Info, Payee, Wording, (Amount), Expense, Income, Category */ -GtkWidget *create_list_transaction(gint type, gboolean *pref_columns) +GtkWidget *create_list_transaction(gint list_type, gboolean *pref_columns) { -struct list_transaction_data *data; +struct list_txn_data *data; GtkListStore *store; -GtkWidget *view; +GtkWidget *treeview; GtkCellRenderer *renderer; -GtkTreeViewColumn *column, *col_acc = NULL; +GtkTreeViewColumn *column, *col_acc = NULL, *col_status = NULL; - data = g_malloc0(sizeof(struct list_transaction_data)); + data = g_malloc0(sizeof(struct list_txn_data)); if(!data) return NULL; + data->list_type = list_type; + data->save_column_width = FALSE; + /* create list store */ store = gtk_list_store_new( NUM_LST_DSPOPE, G_TYPE_POINTER, /*only really used columns, other are fake */ + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, @@ -708,131 +984,199 @@ GtkTreeViewColumn *column, *col_acc = NULL; ); //treeview - view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + data->treeview = treeview; g_object_unref(store); //store our window private data - g_object_set_data(G_OBJECT(view), "inst_data", (gpointer)data); - DB( g_print(" - view=%p, inst_data=%p\n", view, data) ); + g_object_set_data(G_OBJECT(treeview), "inst_data", (gpointer)data); + DB( g_print(" - treeview=%p, inst_data=%p\n", treeview, data) ); // connect our dispose function - g_signal_connect (view, "destroy", - G_CALLBACK (list_transaction_destroy), (gpointer)data); - - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), PREFS->rules_hint); + g_signal_connect (treeview, "destroy", G_CALLBACK (list_txn_destroy), (gpointer)data); + + gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview), PREFS->grid_lines); //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview), // COLUMN_DESCRIPTION); - if(type == TRN_LIST_TYPE_BOOK) - gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE); + if(list_type == LIST_TXN_TYPE_BOOK) + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), GTK_SELECTION_MULTIPLE); - /* column 1: Status */ + /* column 1: Changes */ column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Status")); + //gtk_tree_view_column_set_title(column, _("Status")); + col_status = column; renderer = gtk_cell_renderer_pixbuf_new (); - gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); + //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_status_cell_data_function, GINT_TO_POINTER(1), NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_status_cell_data_function, GINT_TO_POINTER(1), NULL); renderer = gtk_cell_renderer_pixbuf_new (); - gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); + //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_status_cell_data_function, GINT_TO_POINTER(2), NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_status_cell_data_function, GINT_TO_POINTER(2), NULL); renderer = gtk_cell_renderer_pixbuf_new (); - gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); + //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_status_cell_data_function, GINT_TO_POINTER(3), NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_status_cell_data_function, GINT_TO_POINTER(3), NULL); gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_STATUS); //gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_alignment (column, 0.5); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - if(type == TRN_LIST_TYPE_DETAIL) + if(list_type == LIST_TXN_TYPE_DETAIL) { - column = gtk_tree_view_column_new(); + column = list_txn_column_text_create(list_type, _("Account"), LST_DSPOPE_ACCOUNT, list_txn_account_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); col_acc = column; - gtk_tree_view_column_set_title(column, _("Account")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_account_cell_data_function, NULL, NULL); - gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_ACCOUNT); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); } - /* column 2: Date */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Date")); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_date_cell_data_function, NULL, NULL); + g_object_set(renderer, "xalign", 1.0, NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_date_cell_data_function, NULL, NULL); gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - - column = info_list_transaction_column(); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - column = payee_list_transaction_column(); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - column = wording_list_transaction_column(); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - column = amount_list_transaction_column(_("Amount"), LST_DSPOPE_AMOUNT); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - column = amount_list_transaction_column(_("Expense"), LST_DSPOPE_EXPENSE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - column = amount_list_transaction_column(_("Income"), LST_DSPOPE_INCOME); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - column = category_list_transaction_column(); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - column = tags_list_transaction_column(); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - if(type != TRN_LIST_TYPE_DETAIL) + //gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + + column = list_txn_column_info_create(list_type); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + column = list_txn_column_text_create(list_type, _("Payee"), LST_DSPOPE_PAYEE, list_txn_payee_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + column = list_txn_column_text_create(list_type, _("Memo"), LST_DSPOPE_WORDING, list_txn_wording_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + /* column status CLR */ + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Status")); + //renderer = gtk_cell_renderer_text_new (); + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + g_object_set(renderer, "xalign", 1.0, NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_clr_cell_data_function, NULL, NULL); + gtk_tree_view_column_set_reorderable(column, TRUE); + gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_CLR); + //gtk_tree_view_column_set_sort_indicator (column, FALSE); + //gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + + column = list_txn_column_amount_create(list_type, _("Amount"), LST_DSPOPE_AMOUNT, list_txn_amount_cell_data_function); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + column = list_txn_column_amount_create(list_type, _("Expense"), LST_DSPOPE_EXPENSE, list_txn_amount_cell_data_function); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + column = list_txn_column_amount_create(list_type, _("Income"), LST_DSPOPE_INCOME, list_txn_amount_cell_data_function); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + column = list_txn_column_text_create(list_type, _("Category"), LST_DSPOPE_CATEGORY, list_txn_category_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + column = list_txn_column_text_create(list_type, _("Tags"), LST_DSPOPE_TAGS, list_txn_tags_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); + + if(list_type == LIST_TXN_TYPE_BOOK) { - column = amount_list_transaction_column(_("Balance"), LST_DSPOPE_BALANCE); + column = list_txn_column_amount_create(list_type, _("Balance"), LST_DSPOPE_BALANCE, list_txn_amount_cell_data_function); data->tvc_balance = column; gtk_tree_view_column_set_clickable(column, FALSE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); } /* column 9: empty */ column = gtk_tree_view_column_new(); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); /* sort */ - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_STATUS , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_STATUS), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_DATE , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_DATE), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_INFO , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_INFO), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_PAYEE , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_PAYEE), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_WORDING , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_WORDING), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_AMOUNT , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_AMOUNT), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_EXPENSE , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_EXPENSE), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_INCOME , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_INCOME), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_CATEGORY, ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_CATEGORY), NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_TAGS , ope_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_TAGS), NULL); - - + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_STATUS , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_STATUS), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_DATE , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_DATE), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_INFO , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_INFO), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_PAYEE , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_PAYEE), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_WORDING , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_WORDING), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_AMOUNT , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_AMOUNT), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_EXPENSE , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_EXPENSE), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_INCOME , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_INCOME), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_CATEGORY, list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_CATEGORY), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_TAGS , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_TAGS), NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DSPOPE_CLR , list_txn_sort_iter_compare_func, GINT_TO_POINTER(LST_DSPOPE_CLR), NULL); /* apply user preference for columns */ - list_transaction_set_columns(GTK_TREE_VIEW(view), pref_columns); + list_txn_set_columns(GTK_TREE_VIEW(treeview), pref_columns); - /* force accoutn column for detail view */ - if(type == TRN_LIST_TYPE_DETAIL) + /* force account column for detail treeview */ + if(list_type == LIST_TXN_TYPE_DETAIL) { - gtk_tree_view_move_column_after(GTK_TREE_VIEW(view), col_acc, NULL); + gtk_tree_view_move_column_after(GTK_TREE_VIEW(treeview), col_acc, col_status); } /* set initial sort order */ @@ -841,13 +1185,15 @@ GtkTreeViewColumn *column, *col_acc = NULL; /* signals */ - if(type == TRN_LIST_TYPE_BOOK) - g_signal_connect (GTK_TREE_SORTABLE(store), "sort-column-changed", G_CALLBACK (list_transaction_sort_column_changed), data); + if(list_type == LIST_TXN_TYPE_BOOK) + g_signal_connect (GTK_TREE_SORTABLE(store), "sort-column-changed", G_CALLBACK (list_txn_sort_column_changed), data); - return(view); + return(treeview); } +/* ---------------------------------------------- */ +/* import list : soon obsolete */ /* ---------------------------------------------- */ /* @@ -881,38 +1227,36 @@ Account *acc, *dacc; static void ope_importamount_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; -gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; +gchar formatd_buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar *color; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); - mystrfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor); + //mystrfnum(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor); //hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor); + g_ascii_formatd(formatd_buf, G_ASCII_DTOSTR_BUF_SIZE-1, "%.2f", ope->amount); color = get_normal_color_amount(ope->amount); g_object_set(renderer, "foreground", color, - "text", buf, + "text", formatd_buf, NULL); } -/* -** -*/ + static void ope_importstatus_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { Transaction *ope; -GdkPixbuf *pixbuf = NULL; +gchar *iconname = NULL; // get the transaction gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); - if( ope->same != NULL ) - pixbuf = GLOBALS->lst_pixbuf[LST_PIXBUF_WARNING]; + iconname = ( ope->same != NULL ) ? ICONNAME_WARNING : NULL; - g_object_set(renderer, "pixbuf", pixbuf, NULL); + g_object_set(renderer, "icon-name", iconname, NULL); } @@ -943,10 +1287,10 @@ ope_importfixed_toggled (GtkCellRendererToggle *cell, /* ** create our transaction list */ -GtkWidget *create_list_import_transaction(void) +GtkWidget *create_list_import_transaction(gboolean enable_choose) { GtkListStore *store; -GtkWidget *view; +GtkWidget *treeview; GtkCellRenderer *renderer; GtkTreeViewColumn *column; @@ -966,38 +1310,40 @@ GtkTreeViewColumn *column; ); //treeview - view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE); + gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview), PREFS->grid_lines); //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview), // COLUMN_DESCRIPTION); //gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE); /* column: Selection */ - renderer = gtk_cell_renderer_toggle_new (); + if(enable_choose) + { + renderer = gtk_cell_renderer_toggle_new (); - g_signal_connect (renderer, "toggled", - G_CALLBACK (ope_importfixed_toggled), store); + g_signal_connect (renderer, "toggled", G_CALLBACK (ope_importfixed_toggled), store); - column = gtk_tree_view_column_new_with_attributes (NULL, - renderer, - "active", LST_OPE_IMPTOGGLE, - NULL); + column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "active", LST_OPE_IMPTOGGLE, + NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - /* column: Duplicate */ - column = gtk_tree_view_column_new(); - //gtk_tree_view_column_set_title(column, _("Import ?")); - renderer = gtk_cell_renderer_pixbuf_new (); - gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_importstatus_cell_data_function, NULL, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + /* column: Duplicate */ + column = gtk_tree_view_column_new(); + //gtk_tree_view_column_set_title(column, _("Import ?")); + renderer = gtk_cell_renderer_pixbuf_new (); + //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, ope_importstatus_cell_data_function, NULL, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + } + //#ifndef NOOFX /* column: Account */ column = gtk_tree_view_column_new(); @@ -1007,84 +1353,37 @@ GtkTreeViewColumn *column; gtk_tree_view_column_set_cell_data_func(column, renderer, ope_importaccount_cell_data_function, NULL, NULL); //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE); gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); //#endif /* column: Date */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Date")); renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_date_cell_data_function, NULL, NULL); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - - /* column: Wording */ - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Memo")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_wording_cell_data_function, NULL, NULL); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_WORDING); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - /* column: Amount */ - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Amount")); - renderer = gtk_cell_renderer_text_new (); g_object_set(renderer, "xalign", 1.0, NULL); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_importamount_cell_data_function, NULL, NULL); - gtk_tree_view_column_set_alignment (column, 1.0); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_EXPENSE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); - - /* column: Infos */ - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Info")); - - renderer = gtk_cell_renderer_pixbuf_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_info_cell_data_function, GINT_TO_POINTER(1), NULL); - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_info_cell_data_function, GINT_TO_POINTER(2), NULL); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_INFO); + gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_date_cell_data_function, NULL, NULL); + //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE); gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - /* column: Payee */ - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Payee")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_payee_cell_data_function, NULL, NULL); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_PAYEE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + column = list_txn_column_text_create(LIST_TXN_TYPE_IMPORT, _("Memo"), -1, list_txn_wording_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - /* column : Category */ + column = list_txn_column_amount_create(LIST_TXN_TYPE_IMPORT, _("Amount"), -1, ope_importamount_cell_data_function); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Category")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_category_cell_data_function, NULL, NULL); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_CATEGORY); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + column = list_txn_column_info_create(LIST_TXN_TYPE_IMPORT); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + column = list_txn_column_text_create(LIST_TXN_TYPE_IMPORT, _("Payee"), -1, list_txn_payee_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + column = list_txn_column_text_create(LIST_TXN_TYPE_IMPORT, _("Category"), -1, list_txn_category_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - /* column 6: empty */ column = gtk_tree_view_column_new(); - gtk_tree_view_append_column (GTK_TREE_VIEW(view), column); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - return(view); + return(treeview); }