1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2014 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "list_operation.h"
25 /****************************************************************************/
27 /****************************************************************************/
36 /* our global datas */
37 extern struct HomeBank
*GLOBALS
;
38 extern struct Preferences
*PREFS
;
42 //extern gboolean minor_active;
43 extern GdkPixbuf
*paymode_icons
[];
45 /* This is not pretty. Of course you can also use a
46 * separate compare function for each sort ID value */
48 static gint
ope_sort_iter_compare_strings(gchar
*s1
, gchar
*s2
)
50 return hb_string_utf8_compare(s1
, s2
);
55 ope_sort_iter_compare_func (GtkTreeModel
*model
,
60 gint sortcol
= GPOINTER_TO_INT(userdata
);
62 Transaction
*ope1
, *ope2
;
65 gtk_tree_model_get(model
, a
, LST_DSPOPE_DATAS
, &ope1
, -1);
66 gtk_tree_model_get(model
, b
, LST_DSPOPE_DATAS
, &ope2
, -1);
70 case LST_DSPOPE_STATUS
:
71 if(!(retval
= (ope1
->flags
& OF_VALID
) - (ope2
->flags
& OF_VALID
) ) )
73 retval
= (ope1
->flags
& OF_REMIND
) - (ope2
->flags
& OF_REMIND
);
78 if(! (retval
= ope1
->date
- ope2
->date
) )
80 //g_print("sort on balance d1=%d, d2=%d %f %f\n", ope1->date, ope2->date, ope1->balance , ope2->balance);
82 tmpval
= ope1
->pos
- ope2
->pos
;
83 retval
= tmpval
> 0 ? 1 : -1;
85 //g_print("ret=%d\n", ret);
88 case LST_DSPOPE_ACCOUNT
:
92 a1
= da_acc_get(ope1
->kacc
);
93 a2
= da_acc_get(ope2
->kacc
);
94 if( a1
!= NULL
&& a2
!= NULL
)
96 retval
= ope_sort_iter_compare_strings(a1
->name
, a2
->name
);
101 case LST_DSPOPE_INFO
:
102 if(!(retval
= ope1
->paymode
- ope2
->paymode
))
104 retval
= ope_sort_iter_compare_strings(ope1
->info
, ope2
->info
);
108 case LST_DSPOPE_PAYEE
:
112 p1
= da_pay_get(ope1
->kpay
);
113 p2
= da_pay_get(ope2
->kpay
);
114 if( p1
!= NULL
&& p2
!= NULL
)
116 retval
= ope_sort_iter_compare_strings(p1
->name
, p2
->name
);
121 case LST_DSPOPE_WORDING
:
122 retval
= ope_sort_iter_compare_strings(ope1
->wording
, ope2
->wording
);
125 case LST_DSPOPE_AMOUNT
:
126 case LST_DSPOPE_EXPENSE
:
127 case LST_DSPOPE_INCOME
:
128 tmpval
= ope1
->amount
- ope2
->amount
;
129 retval
= tmpval
> 0 ? 1 : -1;
132 case LST_DSPOPE_CATEGORY
:
135 gchar
*name1
, *name2
;
137 c1
= da_cat_get(ope1
->kcat
);
138 c2
= da_cat_get(ope2
->kcat
);
139 if( c1
!= NULL
&& c2
!= NULL
)
141 name1
= da_cat_get_fullname(c1
);
142 name2
= da_cat_get_fullname(c2
);
143 retval
= ope_sort_iter_compare_strings(name1
, name2
);
150 case LST_DSPOPE_TAGS
:
154 t1
= transaction_tags_tostring(ope1
);
155 t2
= transaction_tags_tostring(ope2
);
156 retval
= ope_sort_iter_compare_strings(t1
, t2
);
163 g_return_val_if_reached(0);
170 ** date cell function
172 static void ope_status_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
175 GdkPixbuf
*pixbuf
= NULL
;
177 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &entry
, -1);
180 stat[0] = ( entry->ope_Flags & OF_ADDED ) ? data->istatus[2] : data->istatus[0];
181 stat[1] = ( entry->ope_Flags & OF_CHANGED) ? data->istatus[3] : data->istatus[0];
182 stat[2] = ( entry->ope_Flags & OF_VALID ) ? data->istatus[4] : data->istatus[0];
183 if( entry->ope_Flags & OF_REMIND ) stat[2] = data->istatus[1];
186 switch(GPOINTER_TO_INT(user_data
))
189 pixbuf
= ( entry
->flags
& OF_AUTO
) ? GLOBALS
->lst_pixbuf
[LST_PIXBUF_AUTO
] : ( entry
->flags
& OF_ADDED
) ? GLOBALS
->lst_pixbuf
[LST_PIXBUF_ADD
] : NULL
;
192 pixbuf
= ( entry
->flags
& OF_CHANGED
) ? GLOBALS
->lst_pixbuf
[LST_PIXBUF_EDIT
] : NULL
;
195 if( entry
->flags
& OF_VALID
)
196 pixbuf
= GLOBALS
->lst_pixbuf
[LST_PIXBUF_VALID
];
199 if( entry
->flags
& OF_REMIND
)
200 pixbuf
= GLOBALS
->lst_pixbuf
[LST_PIXBUF_REMIND
];
204 g_object_set(renderer
, "pixbuf", pixbuf
, NULL
);
209 ** account cell function
211 static void ope_account_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
216 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
218 acc
= da_acc_get(ope
->kacc
);
221 g_object_set(renderer
, "text", acc
->name
, NULL
);
224 g_object_set(renderer
, "text", "", NULL
);
228 ** date cell function
230 static void ope_date_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
236 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
240 date
= g_date_new_julian (ope
->date
);
241 g_date_strftime (buffer
, 256-1, PREFS
->date_format
, date
);
244 //g_snprintf(buf, sizeof(buf), "%d", ope->ope_Date);
246 g_object_set(renderer
, "text", buffer
, NULL
);
249 g_object_set(renderer
, "text", "????", NULL
);
253 ** info cell function
255 static void ope_info_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
259 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
261 switch(GPOINTER_TO_INT(user_data
))
264 g_object_set(renderer
, "pixbuf", paymode_icons
[ope
->paymode
], NULL
);
267 g_object_set(renderer
, "text", ope
->info
, NULL
);
273 ** payee cell function
275 static void ope_payee_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
280 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
282 pay
= da_pay_get(ope
->kpay
);
284 g_object_set(renderer
, "text", pay
->name
, NULL
);
286 g_object_set(renderer
, "text", "", NULL
);
290 ** tags cell function
292 static void ope_tags_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
297 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
299 if(ope
->tags
!= NULL
)
301 str
= transaction_tags_tostring(ope
);
302 g_object_set(renderer
, "text", str
, NULL
);
306 g_object_set(renderer
, "text", "", NULL
);
313 ** wording cell function
315 static void ope_wording_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
319 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
320 g_object_set(renderer
, "text", ope
->wording
, NULL
);
324 ** amount cell function
326 static void ope_amount_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
329 gint column
= GPOINTER_TO_INT(user_data
);
330 gchar buf
[G_ASCII_DTOSTR_BUF_SIZE
];
335 // get the transaction
336 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
337 if(column
== LST_DSPOPE_BALANCE
)
338 amount
= ope
->balance
;
340 amount
= ope
->amount
;
343 if(column
== LST_DSPOPE_INCOME
|| column
== LST_DSPOPE_EXPENSE
)
345 type
= (ope
->flags
& OF_INCOME
) ? LST_DSPOPE_INCOME
: LST_DSPOPE_EXPENSE
;
348 g_object_set(renderer
, "markup", NULL
, NULL
);
355 //mystrfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor);
357 //todo: optimize this
358 //store to a data set to the listview
359 //acc = da_acc_get(ope->kacc);
360 //hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, acc->kcur);
361 mystrfmon(buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, amount
, GLOBALS
->minor
);
362 color
= get_normal_color_amount(amount
);
364 g_object_set(renderer
,
375 ** category cell function
377 static void ope_category_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
383 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
385 if(ope
->flags
&OF_SPLIT
)
387 g_object_set(renderer
, "text", _("- split -"), NULL
);
391 cat
= da_cat_get(ope
->kcat
);
394 fullname
= da_cat_get_fullname(cat
);
395 g_object_set(renderer
, "text", fullname
, NULL
);
399 g_object_set(renderer
, "text", "", NULL
);
408 /* column 3: Infos */
409 static GtkTreeViewColumn
*info_list_transaction_column()
411 GtkTreeViewColumn
*column
;
412 GtkCellRenderer
*renderer
;
414 column
= gtk_tree_view_column_new();
415 gtk_tree_view_column_set_title(column
, _("Info"));
417 renderer
= gtk_cell_renderer_pixbuf_new ();
418 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
419 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_info_cell_data_function
, GINT_TO_POINTER(1), NULL
);
421 renderer
= gtk_cell_renderer_text_new ();
422 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
423 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_info_cell_data_function
, GINT_TO_POINTER(2), NULL
);
424 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_INFO
);
426 gtk_tree_view_column_set_resizable(column
, TRUE
);
427 gtk_tree_view_column_set_reorderable(column
, TRUE
);
428 gtk_tree_view_column_set_alignment (column
, 0.5);
434 /* column 4: Payee */
435 static GtkTreeViewColumn
*payee_list_transaction_column()
437 GtkTreeViewColumn
*column
;
438 GtkCellRenderer
*renderer
;
440 column
= gtk_tree_view_column_new();
441 gtk_tree_view_column_set_title(column
, _("Payee"));
442 renderer
= gtk_cell_renderer_text_new ();
443 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
444 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_payee_cell_data_function
, NULL
, NULL
);
445 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_PAYEE
);
446 gtk_tree_view_column_set_resizable(column
, TRUE
);
447 gtk_tree_view_column_set_reorderable(column
, TRUE
);
448 gtk_tree_view_column_set_alignment (column
, 0.5);
453 /* column 5: Wording */
454 static GtkTreeViewColumn
*wording_list_transaction_column()
456 GtkTreeViewColumn
*column
;
457 GtkCellRenderer
*renderer
;
459 column
= gtk_tree_view_column_new();
460 gtk_tree_view_column_set_title(column
, _("Memo"));
461 renderer
= gtk_cell_renderer_text_new ();
462 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
463 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_wording_cell_data_function
, NULL
, NULL
);
464 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_WORDING
);
465 gtk_tree_view_column_set_resizable(column
, TRUE
);
466 gtk_tree_view_column_set_reorderable(column
, TRUE
);
467 gtk_tree_view_column_set_alignment (column
, 0.5);
475 /* column 6/7: Amount/Expense/Income */
477 static GtkTreeViewColumn
*amount_list_transaction_column(gchar
*title
, gint id
)
479 GtkTreeViewColumn
*column
;
480 GtkCellRenderer
*renderer
;
482 column
= gtk_tree_view_column_new();
483 gtk_tree_view_column_set_title(column
, title
);
484 renderer
= gtk_cell_renderer_text_new ();
485 g_object_set(renderer
, "xalign", 1.0, NULL
);
486 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
487 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_amount_cell_data_function
, GINT_TO_POINTER(id
), NULL
);
488 gtk_tree_view_column_set_sort_column_id (column
, id
);
489 gtk_tree_view_column_set_resizable(column
, TRUE
);
490 gtk_tree_view_column_set_reorderable(column
, TRUE
);
491 gtk_tree_view_column_set_alignment (column
, 0.5);
499 /* column 8: Category */
500 static GtkTreeViewColumn
*category_list_transaction_column()
502 GtkTreeViewColumn
*column
;
503 GtkCellRenderer
*renderer
;
505 column
= gtk_tree_view_column_new();
506 gtk_tree_view_column_set_title(column
, _("Category"));
507 renderer
= gtk_cell_renderer_text_new ();
508 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
509 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_category_cell_data_function
, NULL
, NULL
);
510 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_CATEGORY
);
511 gtk_tree_view_column_set_resizable(column
, TRUE
);
512 gtk_tree_view_column_set_reorderable(column
, TRUE
);
513 gtk_tree_view_column_set_alignment (column
, 0.5);
519 static GtkTreeViewColumn
*tags_list_transaction_column()
521 GtkTreeViewColumn
*column
;
522 GtkCellRenderer
*renderer
;
524 column
= gtk_tree_view_column_new();
525 gtk_tree_view_column_set_title(column
, _("Tags"));
526 renderer
= gtk_cell_renderer_text_new ();
527 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
528 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_tags_cell_data_function
, NULL
, NULL
);
529 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_TAGS
);
530 gtk_tree_view_column_set_resizable(column
, TRUE
);
531 gtk_tree_view_column_set_reorderable(column
, TRUE
);
532 gtk_tree_view_column_set_alignment (column
, 0.5);
537 static GtkTreeViewColumn
*list_transaction_get_column(GList
*list
, gint search_id
)
539 GtkTreeViewColumn
*column
= NULL
;
543 tmp
= g_list_first(list
);
546 id
= gtk_tree_view_column_get_sort_column_id(tmp
->data
);
550 tmp
= g_list_next(tmp
);
557 guint
list_transaction_get_quicksearch_column_mask(GtkTreeView
*treeview
)
559 GtkTreeViewColumn
*column
;
564 for(n
=0; n
< NUM_LST_DSPOPE
-1 ; n
++ ) // -1 cause account not to be processed
566 column
= gtk_tree_view_get_column (treeview
, n
);
570 if( gtk_tree_view_column_get_visible(column
) )
572 id
= gtk_tree_view_column_get_sort_column_id (column
);
575 case LST_DSPOPE_WORDING
: mask
|= FLT_QSEARCH_MEMO
; break;
576 case LST_DSPOPE_INFO
: mask
|= FLT_QSEARCH_INFO
; break;
577 case LST_DSPOPE_PAYEE
: mask
|= FLT_QSEARCH_PAYEE
; break;
578 case LST_DSPOPE_CATEGORY
: mask
|= FLT_QSEARCH_CATEGORY
; break;
579 case LST_DSPOPE_TAGS
: mask
|= FLT_QSEARCH_TAGS
; break;
588 /* todo: something simpler to sort ? */
589 void list_transaction_sort_force(GtkTreeSortable
*sortable
, gpointer user_data
)
594 DB( g_print("list_transaction_sort_force\n") );
596 gtk_tree_sortable_get_sort_column_id(sortable
, &sort_column_id
, &order
);
597 DB( g_print(" - id %d order %d\n", sort_column_id
, order
) );
599 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(sortable
), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID
, order
);
600 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(sortable
), sort_column_id
, order
);
604 static void list_transaction_sort_column_changed(GtkTreeSortable
*sortable
, gpointer user_data
)
606 struct list_transaction_data
*data
= user_data
;
609 gboolean showBalance
;
611 gtk_tree_sortable_get_sort_column_id(sortable
, &id
, &order
);
613 DB( g_print("list_transaction_columns_changed %d %d\n", id
, order
) );
615 //here save the transaction list columnid and sort order
616 PREFS
->lst_ope_sort_id
= id
;
617 PREFS
->lst_ope_sort_order
= order
;
619 //manage visibility of balance column
620 //showBalance = (id == LST_DSPOPE_DATE && order == GTK_SORT_ASCENDING) ? data->tvc_is_visible : FALSE;
621 showBalance
= (id
== LST_DSPOPE_DATE
) ? data
->tvc_is_visible
: FALSE
;
622 gtk_tree_view_column_set_visible (data
->tvc_balance
, showBalance
);
626 static void list_transaction_set_columns(GtkTreeView
*treeview
, gint
*visibility
)
628 struct list_transaction_data
*data
;
629 GtkTreeViewColumn
*column
, *base
;
634 DB( g_print("(list_transaction_set_columns)\n") );
636 data
= g_object_get_data(G_OBJECT(treeview
), "inst_data");
638 list
= gtk_tree_view_get_columns( treeview
);
642 for(i
=0; i
< NUM_LST_DSPOPE
-1 ; i
++ ) // -1 cause account not to be processed
644 column
= list_transaction_get_column(list
, ABS(visibility
[i
]));
647 DB( g_print(" - pos:%d col:%d (%s)\n", i
, visibility
[i
], gtk_tree_view_column_get_title(column
)) );
649 gtk_tree_view_move_column_after(treeview
, column
, base
);
652 visible
= visibility
[i
] < 0 ? FALSE
: TRUE
;
653 gtk_tree_view_column_set_visible (column
, visible
);
654 if( ABS(visibility
[i
]) == LST_DSPOPE_BALANCE
)
656 data
->tvc_is_visible
= visible
;
667 static void list_transaction_destroy( GtkWidget
*widget
, gpointer user_data
)
669 struct list_transaction_data
*data
;
671 data
= g_object_get_data(G_OBJECT(widget
), "inst_data");
673 DB( g_print ("\n[list_transaction] destroy event occurred\n") );
676 DB( g_print(" - view=%p, inst_data=%p\n", widget
, data
) );
682 ** create our transaction list
683 ** Status, Date, Info, Payee, Wording, (Amount), Expense, Income, Category
685 GtkWidget
*create_list_transaction(gint type
, gboolean
*pref_columns
)
687 struct list_transaction_data
*data
;
690 GtkCellRenderer
*renderer
;
691 GtkTreeViewColumn
*column
, *col_acc
= NULL
;
694 data
= g_malloc0(sizeof(struct list_transaction_data
));
695 if(!data
) return NULL
;
697 /* create list store */
698 store
= gtk_list_store_new(
700 G_TYPE_POINTER
, /*only really used columns, other are fake */
701 G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
,
702 G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
,
703 G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
,
704 G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
,
705 G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
,
706 G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
,
707 G_TYPE_BOOLEAN
, G_TYPE_BOOLEAN
711 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
712 g_object_unref(store
);
714 //store our window private data
715 g_object_set_data(G_OBJECT(view
), "inst_data", (gpointer
)data
);
716 DB( g_print(" - view=%p, inst_data=%p\n", view
, data
) );
718 // connect our dispose function
719 g_signal_connect (view
, "destroy",
720 G_CALLBACK (list_transaction_destroy
), (gpointer
)data
);
722 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view
), PREFS
->rules_hint
);
723 //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
724 // COLUMN_DESCRIPTION);
726 if(type
== TRN_LIST_TYPE_BOOK
)
727 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view
)), GTK_SELECTION_MULTIPLE
);
729 /* column 1: Status */
730 column
= gtk_tree_view_column_new();
731 gtk_tree_view_column_set_title(column
, _("Status"));
733 renderer
= gtk_cell_renderer_pixbuf_new ();
734 gtk_cell_renderer_set_fixed_size(renderer
, GLOBALS
->lst_pixbuf_maxwidth
, -1);
735 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
736 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_status_cell_data_function
, GINT_TO_POINTER(1), NULL
);
738 renderer
= gtk_cell_renderer_pixbuf_new ();
739 gtk_cell_renderer_set_fixed_size(renderer
, GLOBALS
->lst_pixbuf_maxwidth
, -1);
740 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
741 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_status_cell_data_function
, GINT_TO_POINTER(2), NULL
);
743 renderer
= gtk_cell_renderer_pixbuf_new ();
744 gtk_cell_renderer_set_fixed_size(renderer
, GLOBALS
->lst_pixbuf_maxwidth
, -1);
745 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
746 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_status_cell_data_function
, GINT_TO_POINTER(3), NULL
);
748 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_STATUS
);
749 //gtk_tree_view_column_set_resizable(column, TRUE);
750 gtk_tree_view_column_set_alignment (column
, 0.5);
751 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
754 if(type
== TRN_LIST_TYPE_DETAIL
)
756 column
= gtk_tree_view_column_new();
758 gtk_tree_view_column_set_title(column
, _("Account"));
759 renderer
= gtk_cell_renderer_text_new ();
760 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
761 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_account_cell_data_function
, NULL
, NULL
);
762 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_ACCOUNT
);
763 gtk_tree_view_column_set_resizable(column
, TRUE
);
764 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
769 column
= gtk_tree_view_column_new();
770 gtk_tree_view_column_set_title(column
, _("Date"));
771 renderer
= gtk_cell_renderer_text_new ();
772 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
773 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_date_cell_data_function
, NULL
, NULL
);
774 gtk_tree_view_column_set_sort_column_id (column
, LST_DSPOPE_DATE
);
775 gtk_tree_view_column_set_resizable(column
, TRUE
);
776 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
779 column
= info_list_transaction_column();
780 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
782 column
= payee_list_transaction_column();
783 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
785 column
= wording_list_transaction_column();
786 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
788 column
= amount_list_transaction_column(_("Amount"), LST_DSPOPE_AMOUNT
);
789 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
791 column
= amount_list_transaction_column(_("Expense"), LST_DSPOPE_EXPENSE
);
792 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
794 column
= amount_list_transaction_column(_("Income"), LST_DSPOPE_INCOME
);
795 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
797 column
= category_list_transaction_column();
798 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
800 column
= tags_list_transaction_column();
801 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
803 if(type
!= TRN_LIST_TYPE_DETAIL
)
805 column
= amount_list_transaction_column(_("Balance"), LST_DSPOPE_BALANCE
);
806 data
->tvc_balance
= column
;
807 gtk_tree_view_column_set_clickable(column
, FALSE
);
808 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
811 /* column 9: empty */
812 column
= gtk_tree_view_column_new();
813 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
816 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
);
817 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
);
818 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
);
819 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
);
820 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
);
821 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
);
822 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
);
823 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
);
824 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
);
825 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
);
829 /* apply user preference for columns */
830 list_transaction_set_columns(GTK_TREE_VIEW(view
), pref_columns
);
832 /* force accoutn column for detail view */
833 if(type
== TRN_LIST_TYPE_DETAIL
)
835 gtk_tree_view_move_column_after(GTK_TREE_VIEW(view
), col_acc
, NULL
);
838 /* set initial sort order */
839 DB( g_print("set sort to %d %d\n", PREFS
->lst_ope_sort_id
, PREFS
->lst_ope_sort_order
) );
840 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), PREFS
->lst_ope_sort_id
, PREFS
->lst_ope_sort_order
);
844 if(type
== TRN_LIST_TYPE_BOOK
)
845 g_signal_connect (GTK_TREE_SORTABLE(store
), "sort-column-changed", G_CALLBACK (list_transaction_sort_column_changed
), data
);
851 /* ---------------------------------------------- */
854 ** account cell function
856 static void ope_importaccount_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
861 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
863 acc
= da_acc_get(ope
->kacc
);
868 dacc
= da_acc_get(acc
->imp_key
);
870 g_object_set(renderer
, "text", dacc
->name
, NULL
);
873 g_object_set(renderer
, "text", acc
->name
, NULL
);
879 ** amount cell function
881 static void ope_importamount_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
884 gchar buf
[G_ASCII_DTOSTR_BUF_SIZE
];
887 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
889 mystrfmon(buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, ope
->amount
, GLOBALS
->minor
);
890 //hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor);
892 color
= get_normal_color_amount(ope
->amount
);
894 g_object_set(renderer
,
904 static void ope_importstatus_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
907 GdkPixbuf
*pixbuf
= NULL
;
909 // get the transaction
910 gtk_tree_model_get(model
, iter
, LST_DSPOPE_DATAS
, &ope
, -1);
912 if( ope
->same
!= NULL
)
913 pixbuf
= GLOBALS
->lst_pixbuf
[LST_PIXBUF_WARNING
];
915 g_object_set(renderer
, "pixbuf", pixbuf
, NULL
);
920 ope_importfixed_toggled (GtkCellRendererToggle
*cell
,
924 GtkTreeModel
*model
= (GtkTreeModel
*)data
;
926 GtkTreePath
*path
= gtk_tree_path_new_from_string (path_str
);
929 /* get toggled iter */
930 gtk_tree_model_get_iter (model
, &iter
, path
);
931 gtk_tree_model_get (model
, &iter
, LST_OPE_IMPTOGGLE
, &fixed
, -1);
933 /* do something with the value */
937 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, LST_OPE_IMPTOGGLE
, fixed
, -1);
940 gtk_tree_path_free (path
);
944 ** create our transaction list
946 GtkWidget
*create_list_import_transaction(void)
950 GtkCellRenderer
*renderer
;
951 GtkTreeViewColumn
*column
;
953 /* create list store */
954 store
= gtk_list_store_new(
969 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
970 g_object_unref(store
);
972 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view
), TRUE
);
973 //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
974 // COLUMN_DESCRIPTION);
976 //gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE);
978 /* column: Selection */
979 renderer
= gtk_cell_renderer_toggle_new ();
981 g_signal_connect (renderer
, "toggled",
982 G_CALLBACK (ope_importfixed_toggled
), store
);
985 column
= gtk_tree_view_column_new_with_attributes (NULL
,
987 "active", LST_OPE_IMPTOGGLE
,
990 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
992 /* column: Duplicate */
993 column
= gtk_tree_view_column_new();
994 //gtk_tree_view_column_set_title(column, _("Import ?"));
995 renderer
= gtk_cell_renderer_pixbuf_new ();
996 gtk_cell_renderer_set_fixed_size(renderer
, GLOBALS
->lst_pixbuf_maxwidth
, -1);
997 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
998 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_importstatus_cell_data_function
, NULL
, NULL
);
999 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1002 /* column: Account */
1003 column
= gtk_tree_view_column_new();
1004 gtk_tree_view_column_set_title(column
, _("Account"));
1005 renderer
= gtk_cell_renderer_text_new ();
1006 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1007 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_importaccount_cell_data_function
, NULL
, NULL
);
1008 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE);
1009 gtk_tree_view_column_set_resizable(column
, TRUE
);
1010 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1014 column
= gtk_tree_view_column_new();
1015 gtk_tree_view_column_set_title(column
, _("Date"));
1016 renderer
= gtk_cell_renderer_text_new ();
1017 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1018 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_date_cell_data_function
, NULL
, NULL
);
1019 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE);
1020 gtk_tree_view_column_set_resizable(column
, TRUE
);
1021 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1024 /* column: Wording */
1025 column
= gtk_tree_view_column_new();
1026 gtk_tree_view_column_set_title(column
, _("Memo"));
1027 renderer
= gtk_cell_renderer_text_new ();
1028 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1029 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_wording_cell_data_function
, NULL
, NULL
);
1030 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_WORDING);
1031 gtk_tree_view_column_set_resizable(column
, TRUE
);
1032 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1034 /* column: Amount */
1035 column
= gtk_tree_view_column_new();
1036 gtk_tree_view_column_set_title(column
, _("Amount"));
1037 renderer
= gtk_cell_renderer_text_new ();
1038 g_object_set(renderer
, "xalign", 1.0, NULL
);
1039 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1040 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_importamount_cell_data_function
, NULL
, NULL
);
1041 gtk_tree_view_column_set_alignment (column
, 1.0);
1042 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_EXPENSE);
1043 gtk_tree_view_column_set_resizable(column
, TRUE
);
1044 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1047 column
= gtk_tree_view_column_new();
1048 gtk_tree_view_column_set_title(column
, _("Info"));
1050 renderer
= gtk_cell_renderer_pixbuf_new ();
1051 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1052 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_info_cell_data_function
, GINT_TO_POINTER(1), NULL
);
1054 renderer
= gtk_cell_renderer_text_new ();
1055 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1056 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_info_cell_data_function
, GINT_TO_POINTER(2), NULL
);
1057 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_INFO);
1058 gtk_tree_view_column_set_resizable(column
, TRUE
);
1059 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1063 column
= gtk_tree_view_column_new();
1064 gtk_tree_view_column_set_title(column
, _("Payee"));
1065 renderer
= gtk_cell_renderer_text_new ();
1066 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1067 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_payee_cell_data_function
, NULL
, NULL
);
1068 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_PAYEE);
1069 gtk_tree_view_column_set_resizable(column
, TRUE
);
1070 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1072 /* column : Category */
1074 column
= gtk_tree_view_column_new();
1075 gtk_tree_view_column_set_title(column
, _("Category"));
1076 renderer
= gtk_cell_renderer_text_new ();
1077 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1078 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ope_category_cell_data_function
, NULL
, NULL
);
1079 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_CATEGORY);
1080 gtk_tree_view_column_set_resizable(column
, TRUE
);
1081 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1085 /* column 6: empty */
1086 column
= gtk_tree_view_column_new();
1087 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);