1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2016 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/>.
25 #include "list_operation.h"
26 #include "gtk-chart.h"
27 #include "gtk-dateentry.h"
29 #include "dsp_mainwindow.h"
30 #include "ui-account.h"
32 #include "ui-category.h"
33 #include "ui-filter.h"
34 #include "ui-transaction.h"
37 /****************************************************************************/
39 /****************************************************************************/
48 /* our global datas */
49 extern struct HomeBank
*GLOBALS
;
50 extern struct Preferences
*PREFS
;
54 static void ui_reptime_action_viewlist(GtkAction
*action
, gpointer user_data
);
55 //static void ui_reptime_action_viewcolumn(GtkAction *action, gpointer user_data);
56 static void ui_reptime_action_viewline(GtkAction
*action
, gpointer user_data
);
57 static void ui_reptime_action_detail(GtkAction
*action
, gpointer user_data
);
58 //static void ui_reptime_action_filter(GtkAction *action, gpointer user_data);
59 static void ui_reptime_action_refresh(GtkAction
*action
, gpointer user_data
);
60 static void ui_reptime_action_export(GtkAction
*action
, gpointer user_data
);
62 static void ui_reptime_list_set_cur(GtkTreeView
*treeview
, guint32 kcur
);
65 static GtkActionEntry entries
[] = {
66 { "List" , ICONNAME_HB_VIEW_LIST
, N_("List") , NULL
, N_("View results as list") , G_CALLBACK (ui_reptime_action_viewlist
) },
67 { "Line" , ICONNAME_HB_VIEW_LINE
, N_("Line") , NULL
, N_("View results as lines") , G_CALLBACK (ui_reptime_action_viewline
) },
68 // { "Column" , ICONNAME_HB_VIEW_COLUMN, N_("Column") , NULL, N_("View results as column"), G_CALLBACK (ui_reptime_action_viewcolumn) },
70 // { "Filter" , ICONNAME_HB_FILTER , N_("Filter") , NULL, N_("Edit the filter"), G_CALLBACK (ui_reptime_action_filter) },
71 { "Refresh" , ICONNAME_REFRESH
, N_("Refresh"), NULL
, N_("Refresh results"), G_CALLBACK (ui_reptime_action_refresh
) },
73 { "Export" , ICONNAME_HB_FILE_EXPORT
, N_("Export") , NULL
, N_("Export as CSV"), G_CALLBACK (ui_reptime_action_export
) },
75 static guint n_entries
= G_N_ELEMENTS (entries
);
77 static GtkToggleActionEntry toggle_entries
[] = {
78 { "Detail", ICONNAME_HB_OPE_SHOW
, /* name, icon-name */
79 N_("Detail"), NULL
, /* label, accelerator */
80 N_("Toggle detail"), /* tooltip */
81 G_CALLBACK (ui_reptime_action_detail
),
82 FALSE
}, /* is_active */
85 static guint n_toggle_entries
= G_N_ELEMENTS (toggle_entries
);
88 static const gchar
*ui_info
=
90 " <toolbar name='ToolBar'>"
91 " <toolitem action='List'/>"
92 " <toolitem action='Line'/>"
93 //" <toolitem action='Column'/>"
95 " <toolitem action='Detail'/>"
97 //" <toolitem action='Filter'/>"
98 " <toolitem action='Refresh'/>"
100 " <toolitem action='Export'/>"
105 static void ui_reptime_date_change(GtkWidget
*widget
, gpointer user_data
);
106 static void ui_reptime_range_change(GtkWidget
*widget
, gpointer user_data
);
107 static void ui_reptime_detail(GtkWidget
*widget
, gpointer user_data
);
108 static void ui_reptime_update(GtkWidget
*widget
, gpointer user_data
);
109 static void ui_reptime_export_csv(GtkWidget
*widget
, gpointer user_data
);
110 static void ui_reptime_compute(GtkWidget
*widget
, gpointer user_data
);
111 static void ui_reptime_sensitive(GtkWidget
*widget
, gpointer user_data
);
112 static void ui_reptime_toggle_detail(GtkWidget
*widget
, gpointer user_data
);
113 static void ui_reptime_toggle_minor(GtkWidget
*widget
, gpointer user_data
);
114 static void ui_reptime_update_daterange(GtkWidget
*widget
, gpointer user_data
);
115 static GtkWidget
*ui_list_reptime_create(void);
117 static gint
ui_list_reptime_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
);
121 gchar
*CYA_TIMESELECT
[] = { N_("Account"), N_("Category"), N_("Payee"), NULL
};
125 gchar
*CYA_VIEWBY
[] = { N_("Day"), N_("Week"), N_("Month"), N_("Quarter"), N_("Year"), NULL
};
127 //extern gchar *CYA_FLT_SELECT[];
129 gchar
*CYA_ABMONTHS
[] =
146 /* action functions -------------------- */
148 static void ui_reptime_action_viewlist(GtkAction
*action
, gpointer user_data
)
150 struct ui_reptime_data
*data
= user_data
;
152 data
->charttype
= CHART_TYPE_NONE
;
153 gtk_notebook_set_current_page(GTK_NOTEBOOK(data
->GR_result
), 0);
154 ui_reptime_sensitive(data
->window
, NULL
);
157 static void ui_reptime_action_viewline(GtkAction
*action
, gpointer user_data
)
159 struct ui_reptime_data
*data
= user_data
;
161 data
->charttype
= CHART_TYPE_LINE
;
162 gtk_notebook_set_current_page(GTK_NOTEBOOK(data
->GR_result
), 1);
163 ui_reptime_sensitive(data
->window
, NULL
);
164 ui_reptime_update(data
->window
, NULL
);
168 /*static void ui_reptime_action_viewcolumn(GtkAction *action, gpointer user_data)
170 struct ui_reptime_data *data = user_data;
172 data->charttype = CHART_TYPE_COL;
173 gtk_notebook_set_current_page(GTK_NOTEBOOK(data->GR_result), 1);
174 ui_reptime_sensitive(data->window, NULL);
175 ui_reptime_update(data->window, NULL);
180 static void ui_reptime_action_detail(GtkAction
*action
, gpointer user_data
)
182 struct ui_reptime_data
*data
= user_data
;
184 ui_reptime_toggle_detail(data
->window
, NULL
);
188 static void ui_reptime_action_filter(GtkAction *action, gpointer user_data)
190 struct ui_reptime_data *data = user_data;
193 //create_deffilter_window(data->filter, TRUE);
195 if(create_deffilter_window(data->filter, TRUE) != GTK_RESPONSE_REJECT)
196 ui_reptime_compute(data->window, NULL);
200 static void ui_reptime_action_refresh(GtkAction
*action
, gpointer user_data
)
202 struct ui_reptime_data
*data
= user_data
;
204 ui_reptime_compute(data
->window
, NULL
);
207 static void ui_reptime_action_export(GtkAction
*action
, gpointer user_data
)
209 struct ui_reptime_data
*data
= user_data
;
211 ui_reptime_export_csv(data
->window
, NULL
);
216 /* ======================== */
221 ** ============================================================================
228 ** return the month list position correponding to the passed date
230 static gint
DateInMonth(guint32 from
, guint32 opedate
)
232 GDate
*date1
, *date2
;
236 // this return sometimes -1, -2 which is wrong
238 date1
= g_date_new_julian(from
);
239 date2
= g_date_new_julian(opedate
);
241 pos
= ((g_date_get_year(date2
) - g_date_get_year(date1
)) * 12) + g_date_get_month(date2
) - g_date_get_month(date1
);
243 //g_print(" from=%d-%d ope=%d-%d => %d\n", g_date_get_month(date1), g_date_get_year(date1), g_date_get_month(date2), g_date_get_year(date2), pos);
251 static gint
DateInQuarter(guint32 from
, guint32 opedate
)
253 GDate
*date1
, *date2
;
257 // this return sometimes -1, -2 which is wrong
259 date1
= g_date_new_julian(from
);
260 date2
= g_date_new_julian(opedate
);
262 pos
= (((g_date_get_year(date2
) - g_date_get_year(date1
)) * 12) + g_date_get_month(date2
) - g_date_get_month(date1
))/3;
264 DB( g_print(" from=%d-%d ope=%d-%d => %d\n", g_date_get_month(date1
), g_date_get_year(date1
), g_date_get_month(date2
), g_date_get_year(date2
), pos
) );
272 ** return the year list position correponding to the passed date
274 static gint
DateInYear(guint32 from
, guint32 opedate
)
277 gint year_from
, year_ope
, pos
;
279 date
= g_date_new_julian(from
);
280 year_from
= g_date_get_year(date
);
281 g_date_set_julian(date
, opedate
);
282 year_ope
= g_date_get_year(date
);
285 pos
= year_ope
- year_from
;
287 //g_print(" from=%d ope=%d => %d\n", year_from, year_ope, pos);
292 static void ui_reptime_date_change(GtkWidget
*widget
, gpointer user_data
)
294 struct ui_reptime_data
*data
;
296 DB( g_print("\n[reptime] date change\n") );
298 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
300 data
->filter
->mindate
= gtk_date_entry_get_date(GTK_DATE_ENTRY(data
->PO_mindate
));
301 data
->filter
->maxdate
= gtk_date_entry_get_date(GTK_DATE_ENTRY(data
->PO_maxdate
));
303 // set min/max date for both widget
304 gtk_date_entry_set_maxdate(GTK_DATE_ENTRY(data
->PO_mindate
), data
->filter
->maxdate
);
305 gtk_date_entry_set_mindate(GTK_DATE_ENTRY(data
->PO_maxdate
), data
->filter
->mindate
);
307 g_signal_handler_block(data
->CY_range
, data
->handler_id
[HID_REPTIME_RANGE
]);
308 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_range
), FLT_RANGE_OTHER
);
309 g_signal_handler_unblock(data
->CY_range
, data
->handler_id
[HID_REPTIME_RANGE
]);
311 ui_reptime_compute(widget
, NULL
);
312 ui_reptime_update_daterange(widget
, NULL
);
317 static void ui_reptime_update_quickdate(GtkWidget
*widget
, gpointer user_data
)
319 struct ui_reptime_data
*data
;
321 DB( g_print("\n[reptime] update quickdate\n") );
323 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
325 g_signal_handler_block(data
->PO_mindate
, data
->handler_id
[HID_REPTIME_MINDATE
]);
326 g_signal_handler_block(data
->PO_maxdate
, data
->handler_id
[HID_REPTIME_MAXDATE
]);
328 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_mindate
), data
->filter
->mindate
);
329 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_maxdate
), data
->filter
->maxdate
);
331 g_signal_handler_unblock(data
->PO_mindate
, data
->handler_id
[HID_REPTIME_MINDATE
]);
332 g_signal_handler_unblock(data
->PO_maxdate
, data
->handler_id
[HID_REPTIME_MAXDATE
]);
337 static void ui_reptime_range_change(GtkWidget
*widget
, gpointer user_data
)
339 struct ui_reptime_data
*data
;
342 DB( g_print("\n[reptime] range change\n") );
344 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
346 range
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_range
));
348 if(range
!= FLT_RANGE_OTHER
)
350 filter_preset_daterange_set(data
->filter
, range
, data
->accnum
);
352 ui_reptime_update_quickdate(widget
, NULL
);
354 ui_reptime_compute(widget
, NULL
);
355 ui_reptime_update_daterange(widget
, NULL
);
360 static void ui_reptime_update_daterange(GtkWidget
*widget
, gpointer user_data
)
362 struct ui_reptime_data
*data
;
365 DB( g_print("\n[reptime] update daterange\n") );
367 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
369 daterange
= filter_daterange_text_get(data
->filter
);
370 gtk_label_set_markup(GTK_LABEL(data
->TX_daterange
), daterange
);
375 static void ui_reptime_detail(GtkWidget
*widget
, gpointer user_data
)
377 struct ui_reptime_data
*data
;
378 guint active
= GPOINTER_TO_INT(user_data
);
379 guint tmpfor
, tmpslice
;
388 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
390 DB( g_print("\n[reptime] detail\n") );
392 tmpfor
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_for
));
393 tmpslice
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_view
));
394 showall
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_all
));
399 case FOR_REPTIME_ACCOUNT
:
400 selkey
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
402 case FOR_REPTIME_CATEGORY
:
403 selkey
= ui_cat_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_cat
));
405 case FOR_REPTIME_PAYEE
:
406 selkey
= ui_pay_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_pay
));
410 //DB( g_print(" for=%d, view by=%d :: key=%d\n", tmpfor, tmpslice, selkey) );
412 //get our min max date
413 from
= data
->filter
->mindate
;
414 //to = data->filter->maxdate;
416 /* clear and detach our model */
417 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_detail
));
418 gtk_list_store_clear (GTK_LIST_STORE(model
));
422 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
423 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_detail
), NULL
); /* Detach model from view */
425 /* fill in the model */
426 list
= g_queue_peek_head_link(data
->txn_queue
);
429 Transaction
*ope
= list
->data
;
431 gboolean include
= FALSE
;
433 //DB( g_print(" get %s\n", ope->ope_Word) );
437 case FOR_REPTIME_ACCOUNT
:
438 if( selkey
== ope
->kacc
)
441 case FOR_REPTIME_CATEGORY
:
445 if( ope
->flags
& OF_SPLIT
)
447 guint nbsplit
= da_splits_count(ope
->splits
);
450 for(i
=0;i
<nbsplit
;i
++)
452 split
= ope
->splits
[i
];
453 catentry
= da_cat_get(split
->kcat
);
454 if(catentry
!= NULL
) //#1340142
456 if( selkey
== catentry
->parent
|| selkey
== catentry
->key
)
464 catentry
= da_cat_get(ope
->kcat
);
465 if(catentry
!= NULL
) //#1340142
467 if( selkey
== catentry
->parent
|| selkey
== catentry
->key
)
474 case FOR_REPTIME_PAYEE
:
475 if( selkey
== ope
->kpay
)
480 if( include
== TRUE
|| showall
== TRUE
)
485 case GROUPBY_REPTIME_DAY
:
486 pos
= ope
->date
- from
;
489 case GROUPBY_REPTIME_WEEK
:
490 pos
= (ope
->date
- from
)/7;
493 case GROUPBY_REPTIME_MONTH
:
494 pos
= DateInMonth(from
, ope
->date
);
497 case GROUPBY_REPTIME_QUARTER
:
498 pos
= DateInQuarter(from
, ope
->date
);
501 case GROUPBY_REPTIME_YEAR
:
502 pos
= DateInYear(from
, ope
->date
);
506 DB( g_print("** pos=%d\n", pos
) );
512 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
513 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
514 LST_DSPOPE_DATAS
, ope
,
521 list
= g_list_next(list
);
524 /* Re-attach model to view */
525 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_detail
), model
);
526 g_object_unref(model
);
528 gtk_tree_view_columns_autosize( GTK_TREE_VIEW(data
->LV_detail
) );
534 static void ui_reptime_update(GtkWidget
*widget
, gpointer user_data
)
536 struct ui_reptime_data
*data
;
543 DB( g_print("\n[reptime] update\n") );
545 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
548 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_report
));
550 tmpfor
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_for
));
551 //tmpslice = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_view));
553 // ensure not exp & inc for piechart
554 page
= gtk_notebook_get_current_page(GTK_NOTEBOOK(data
->GR_result
));
556 DB( g_print(" page %d\n\n", page
) );
557 //DB( g_print(" tmpslice %d\n\n", tmpslice) );
560 //column = LST_REPTIME_POS;
561 //DB( g_print(" sort on column %d\n\n", column) );
562 //gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), column, GTK_SORT_DESCENDING);
564 gtk_chart_show_legend(GTK_CHART(data
->RE_line
), FALSE
, FALSE
);
565 gtk_chart_show_xval(GTK_CHART(data
->RE_line
), TRUE
);
567 ////TRANSLATORS: example 'Expense by Category'
568 title
= g_strdup_printf(_("%s Over Time"), _(CYA_TIMESELECT
[tmpfor
]) );
569 gtk_chart_set_datas(GTK_CHART(data
->RE_line
), model
, LST_REPTIME_AMOUNT
, title
, NULL
);
574 DB( g_print(" change chart type to %d\n", data
->charttype
) );
575 gtk_chart_set_type (GTK_CHART(data
->RE_line
), data
->charttype
);
576 gtk_chart_set_showmono(GTK_CHART(data
->RE_line
), TRUE
);
581 static void ui_reptime_export_csv(GtkWidget
*widget
, gpointer user_data
)
583 struct ui_reptime_data
*data
;
587 gchar
*filename
= NULL
;
589 gchar
*outstr
, *name
;
592 DB( g_print("\n[reptime] export csv\n") );
594 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
596 tmpfor
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_for
));
598 name
= g_strdup_printf("hb-reptime_%s.csv", CYA_TIMESELECT
[tmpfor
]);
600 if( ui_file_chooser_csv(GTK_WINDOW(data
->window
), GTK_FILE_CHOOSER_ACTION_SAVE
, &filename
, name
) == TRUE
)
602 DB( g_print(" + filename is %s\n", filename
) );
604 io
= g_io_channel_new_file(filename
, "w", NULL
);
608 outstr
= g_strdup_printf("%s;%s;\n", _("Time slice"), _("Amount"));
609 g_io_channel_write_chars(io
, outstr
, -1, NULL
, NULL
);
611 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_report
));
612 valid
= gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model
), &iter
);
619 gtk_tree_model_get (model
, &iter
,
620 //LST_REPTIME_KEY, i,
621 LST_REPTIME_TITLE
, &name
,
622 LST_REPTIME_AMOUNT
, &amount
,
626 outstr
= g_strdup_printf("%s;%.2f\n", name
, amount
);
627 g_io_channel_write_chars(io
, outstr
, -1, NULL
, NULL
);
629 DB( g_print("%s", outstr
) );
633 valid
= gtk_tree_model_iter_next(GTK_TREE_MODEL(model
), &iter
);
636 g_io_channel_unref (io
);
648 static void ui_reptime_update_for(GtkWidget
*widget
, gpointer user_data
)
650 struct ui_reptime_data
*data
;
654 DB( g_print("\n[reptime] update for\n") );
656 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
658 tmpfor
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_for
));
660 visible
= tmpfor
== 0 ? TRUE
: FALSE
;
661 hb_widget_visible(data
->LB_acc
, visible
);
662 hb_widget_visible(data
->PO_acc
, visible
);
664 visible
= tmpfor
== 1 ? TRUE
: FALSE
;
665 hb_widget_visible(data
->LB_cat
, visible
);
666 hb_widget_visible(data
->PO_cat
, visible
);
668 visible
= tmpfor
== 2 ? TRUE
: FALSE
;
669 hb_widget_visible(data
->LB_pay
, visible
);
670 hb_widget_visible(data
->PO_pay
, visible
);
676 static void ui_reptime_for(GtkWidget
*widget
, gpointer user_data
)
678 struct ui_reptime_data
*data
;
680 DB( g_print("\n[reptime] for\n") );
682 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
684 ui_reptime_update_for(widget
, data
);
686 ui_reptime_compute(widget
, data
);
690 static void ui_reptime_compute(GtkWidget
*widget
, gpointer user_data
)
692 struct ui_reptime_data
*data
;
693 gint tmpfor
, tmpslice
;
698 gdouble cumulation
, average
;
705 GDate
*date1
, *date2
;
709 DB( g_print("\n[reptime] compute\n") );
711 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
713 tmpfor
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_for
));
714 tmpslice
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_view
));
715 cumul
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_cumul
));
716 showall
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_all
));
723 case FOR_REPTIME_ACCOUNT
:
724 selkey
= ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_acc
));
726 data
->accnum
= selkey
;
728 case FOR_REPTIME_CATEGORY
:
729 selkey
= ui_cat_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_cat
));
731 case FOR_REPTIME_PAYEE
:
732 selkey
= ui_pay_comboboxentry_get_key(GTK_COMBO_BOX(data
->PO_pay
));
736 DB( g_print(" for=%d, view by=%d :: key=%d\n", tmpfor
, tmpslice
, selkey
) );
739 //filter_preset_daterange_set(data->filter, data->filter->range, data->accnum);
740 //ui_reptime_update_quickdate(widget, NULL);
742 //get our min max date
743 from
= data
->filter
->mindate
;
744 to
= data
->filter
->maxdate
;
745 if(to
< from
) return;
747 g_queue_free (data
->txn_queue
);
748 data
->txn_queue
= hbfile_transaction_get_partial(data
->filter
->mindate
, data
->filter
->maxdate
);
751 /* count number or results */
754 case GROUPBY_REPTIME_DAY
:
755 n_result
= 1 + (to
- from
);
757 case GROUPBY_REPTIME_WEEK
:
758 n_result
= 1 + ((to
- from
) / 7);
760 case GROUPBY_REPTIME_MONTH
:
761 date1
= g_date_new_julian(from
);
762 date2
= g_date_new_julian(to
);
763 n_result
= 1 + ((g_date_get_year(date2
) - g_date_get_year(date1
)) * 12) + g_date_get_month(date2
) - g_date_get_month(date1
);
767 case GROUPBY_REPTIME_QUARTER
:
768 date1
= g_date_new_julian(from
);
769 date2
= g_date_new_julian(to
);
770 n_result
= 1 + (((g_date_get_year(date2
) - g_date_get_year(date1
)) * 12) + g_date_get_month(date2
) - g_date_get_month(date1
))/3;
774 case GROUPBY_REPTIME_YEAR
:
775 date1
= g_date_new_julian(from
);
776 date2
= g_date_new_julian(to
);
777 n_result
= 1 + g_date_get_year(date2
) - g_date_get_year(date1
);
785 DB( g_print(" %s :: n_result=%d\n", CYA_TIMESELECT
[tmpfor
], n_result
) );
787 /* allocate some memory */
789 tmp_amount
= g_malloc0((n_result
+2) * sizeof(gdouble
));
796 kcur
= GLOBALS
->kcur
;
797 if( (tmpfor
== FOR_REPTIME_ACCOUNT
) && (showall
== FALSE
) )
799 Account
*acc
= da_acc_get(selkey
);
807 ui_reptime_list_set_cur(GTK_TREE_VIEW(data
->LV_report
), kcur
);
808 gtk_chart_set_currency(GTK_CHART(data
->RE_line
), kcur
);
810 /* compute the results */
811 list
= g_queue_peek_head_link(data
->txn_queue
);
814 Transaction
*ope
= list
->data
;
815 gboolean include
= FALSE
;
818 DB( g_print("** testing '%s', cat=%d==> %d\n", ope
->wording
, ope
->kcat
, filter_test(data
->filter
, ope
)) );
820 // add usage of payee or category
823 case FOR_REPTIME_ACCOUNT
:
824 if( selkey
== ope
->kacc
)
827 case FOR_REPTIME_CATEGORY
:
831 if( ope
->flags
& OF_SPLIT
)
833 guint nbsplit
= da_splits_count(ope
->splits
);
836 for(i
=0;i
<nbsplit
;i
++)
838 split
= ope
->splits
[i
];
839 catentry
= da_cat_get(split
->kcat
);
840 if(catentry
!= NULL
) //#1340142
842 if( selkey
== catentry
->parent
|| selkey
== catentry
->key
)
849 catentry
= da_cat_get(ope
->kcat
);
850 if(catentry
!= NULL
) //#1340142
852 if( selkey
== catentry
->parent
|| selkey
== catentry
->key
)
859 case FOR_REPTIME_PAYEE
:
860 if( selkey
== ope
->kpay
)
865 if( include
== TRUE
|| showall
== TRUE
)
872 case GROUPBY_REPTIME_DAY
:
873 pos
= ope
->date
- from
;
876 case GROUPBY_REPTIME_WEEK
:
877 pos
= (ope
->date
- from
)/7;
880 case GROUPBY_REPTIME_MONTH
:
881 pos
= DateInMonth(from
, ope
->date
);
884 case GROUPBY_REPTIME_QUARTER
:
885 pos
= DateInQuarter(from
, ope
->date
);
888 case GROUPBY_REPTIME_YEAR
:
889 pos
= DateInYear(from
, ope
->date
);
895 if( tmpfor
== FOR_REPTIME_CATEGORY
&& ope
->flags
& OF_SPLIT
)
897 guint nbsplit
= da_splits_count(ope
->splits
);
901 for(i
=0;i
<nbsplit
;i
++)
903 split
= ope
->splits
[i
];
904 catentry
= da_cat_get(split
->kcat
);
905 if(catentry
!= NULL
) //#1340142
907 if( selkey
== catentry
->parent
|| selkey
== catentry
->key
)
908 trn_amount
+= split
->amount
;
913 trn_amount
= ope
->amount
;
915 trn_amount
= hb_amount_base(trn_amount
, ope
->kcur
);
917 DB( g_print("** pos=%d will add %.2f to \n", pos
, trn_amount
) );
919 tmp_amount
[pos
] += trn_amount
;
923 list
= g_list_next(list
);
926 /* clear and detach our model */
927 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_report
));
928 gtk_list_store_clear (GTK_LIST_STORE(model
));
929 g_object_ref(model
); /* Make sure the model stays with us after the tree view unrefs it */
930 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_report
), NULL
); /* Detach model from view */
934 /* insert into the treeview */
935 for(i
=0, id
=0; i
<n_result
; i
++)
937 gchar
*name
, *fullcatname
;
946 DB( g_print("try to insert item %d\n", i
) );
948 /* get the result name */
951 case GROUPBY_REPTIME_DAY
:
952 date
= g_date_new_julian (from
+ i
);
953 g_date_strftime (buffer
, 63, PREFS
->date_format
, date
);
958 case GROUPBY_REPTIME_WEEK
:
959 date
= g_date_new_julian(from
);
960 g_date_add_days(date
, i
*7);
961 //g_snprintf(buffer, 63, "%d-%02d", g_date_get_year(date), g_date_get_month(date));
962 g_snprintf(buffer
, 63, "%d-%d", g_date_get_year(date
), g_date_get_monday_week_of_year(date
));
967 case GROUPBY_REPTIME_MONTH
:
968 date
= g_date_new_julian(from
);
969 g_date_add_months(date
, i
);
970 //g_snprintf(buffer, 63, "%d-%02d", g_date_get_year(date), g_date_get_month(date));
971 g_snprintf(buffer
, 63, "%d-%s", g_date_get_year(date
), _(CYA_ABMONTHS
[g_date_get_month(date
)]));
976 case GROUPBY_REPTIME_QUARTER
:
977 date
= g_date_new_julian(from
);
978 g_date_add_months(date
, i
*3);
979 //g_snprintf(buffer, 63, "%d-%02d", g_date_get_year(date), g_date_get_month(date));
980 g_snprintf(buffer
, 63, "%d-%d", g_date_get_year(date
), ((g_date_get_month(date
)-1)/3)+1);
985 case GROUPBY_REPTIME_YEAR
:
986 date
= g_date_new_julian(from
);
987 g_date_add_years(date
, i
);
988 g_snprintf(buffer
, 63, "%d", g_date_get_year(date
));
994 cumulation
+= tmp_amount
[i
];
995 value
= cumul
== TRUE
? cumulation
: tmp_amount
[i
];
998 //DB( g_print(" inserting %2d, '%s', %9.2f\n", i, name, value) );
1000 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
1001 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
1002 LST_REPTIME_POS
, id
++,
1004 LST_REPTIME_TITLE
, name
,
1005 LST_REPTIME_AMOUNT
, value
,
1008 g_free(fullcatname
);
1011 /* update column 0 title */
1012 GtkTreeViewColumn
*column
= gtk_tree_view_get_column( GTK_TREE_VIEW(data
->LV_report
), 0);
1013 gtk_tree_view_column_set_title(column
, _(CYA_VIEWBY
[tmpslice
]));
1015 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_report
));
1017 /* Re-attach model to view */
1018 gtk_tree_view_set_model(GTK_TREE_VIEW(data
->LV_report
), model
);
1019 g_object_unref(model
);
1026 average
= cumulation
/ n_result
;
1028 hb_strfmon(buf
, 127, average
, kcur
, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_minor
)) );
1030 ////TRANSLATORS: count of transaction in balancedrawn / count of total transaction under abalancedrawn amount threshold
1031 info
= g_strdup_printf(_("Average: %s"), buf
);
1032 gtk_label_set_text(GTK_LABEL(data
->TX_info
), info
);
1037 /* free our memory */
1040 ui_reptime_update(widget
, user_data
);
1049 ** update sensitivity
1051 static void ui_reptime_sensitive(GtkWidget
*widget
, gpointer user_data
)
1053 struct ui_reptime_data
*data
;
1058 DB( g_print("\n[reptime] sensitive\n") );
1060 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1062 active
= gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_report
)), NULL
, NULL
);
1064 page
= gtk_notebook_get_current_page(GTK_NOTEBOOK(data
->GR_result
));
1066 sensitive
= page
== 0 ? active
: FALSE
;
1067 // gtk_widget_set_sensitive(data->TB_buttons[ACTION_REPBUDGET_DETAIL], sensitive);
1068 gtk_action_set_sensitive(gtk_ui_manager_get_action(data
->ui
, "/ToolBar/Detail"), sensitive
);
1070 sensitive
= page
== 0 ? FALSE
: TRUE
;
1071 gtk_widget_set_sensitive(data
->LB_zoomx
, sensitive
);
1072 gtk_widget_set_sensitive(data
->RG_zoomx
, sensitive
);
1077 static void ui_reptime_detail_onRowActivated (GtkTreeView
*treeview
,
1079 GtkTreeViewColumn
*col
,
1082 struct ui_reptime_data
*data
;
1083 Transaction
*active_txn
;
1086 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview
), GTK_TYPE_WINDOW
)), "inst_data");
1088 DB( g_print ("\n[reptime] A detail row has been double-clicked!\n") );
1090 active_txn
= list_txn_get_active_transaction(GTK_TREE_VIEW(data
->LV_detail
));
1093 Transaction
*old_txn
, *new_txn
;
1095 old_txn
= da_transaction_clone (active_txn
);
1096 new_txn
= active_txn
;
1097 result
= deftransaction_external_edit(GTK_WINDOW(data
->window
), old_txn
, new_txn
);
1099 if(result
== GTK_RESPONSE_ACCEPT
)
1102 GLOBALS
->changes_count
++;
1103 ui_reptime_compute(data
->window
, NULL
);
1106 da_transaction_free (old_txn
);
1111 static void ui_reptime_update_detail(GtkWidget
*widget
, gpointer user_data
)
1113 struct ui_reptime_data
*data
;
1115 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1119 GtkTreeSelection
*treeselection
;
1120 GtkTreeModel
*model
;
1124 treeselection
= gtk_tree_view_get_selection (GTK_TREE_VIEW(data
->LV_report
));
1126 if (gtk_tree_selection_get_selected(treeselection
, &model
, &iter
))
1128 gtk_tree_model_get(model
, &iter
, LST_REPTIME_KEY
, &key
, -1);
1130 DB( g_print(" - active is %d\n", key
) );
1132 ui_reptime_detail(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), GINT_TO_POINTER(key
));
1137 gtk_widget_show(data
->GR_detail
);
1140 gtk_widget_hide(data
->GR_detail
);
1146 static void ui_reptime_toggle_detail(GtkWidget
*widget
, gpointer user_data
)
1148 struct ui_reptime_data
*data
;
1150 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1154 DB( g_print("(stats) toggledetail to %d\n", data
->detail
) );
1156 ui_reptime_update_detail(widget
, user_data
);
1160 static void ui_reptime_zoomx_callback(GtkWidget
*widget
, gpointer user_data
)
1162 struct ui_reptime_data
*data
;
1165 DB( g_print("\n[reptime] zoomx\n") );
1167 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1169 value
= gtk_range_get_value(GTK_RANGE(data
->RG_zoomx
));
1171 DB( g_print(" + scale is %.2f\n", value
) );
1173 gtk_chart_set_barw(GTK_CHART(data
->RE_line
), value
);
1179 static void ui_reptime_toggle_minor(GtkWidget
*widget
, gpointer user_data
)
1181 struct ui_reptime_data
*data
;
1183 DB( g_print("\n[reptime] toggle\n") );
1185 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1187 GLOBALS
->minor
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_minor
));
1189 //hbfile_update(data->LV_acc, (gpointer)4);
1190 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data
->LV_report
));
1192 gtk_chart_show_minor(GTK_CHART(data
->RE_line
), GLOBALS
->minor
);
1197 static void ui_reptime_toggle_showall(GtkWidget
*widget
, gpointer user_data
)
1199 struct ui_reptime_data
*data
;
1202 DB( g_print("\n[reptime] toggle\n") );
1204 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
1206 showall
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_all
));
1208 gtk_widget_set_sensitive(GTK_WIDGET(data
->PO_acc
), showall
^1);
1209 gtk_widget_set_sensitive(GTK_WIDGET(data
->PO_cat
), showall
^1);
1210 gtk_widget_set_sensitive(GTK_WIDGET(data
->PO_pay
), showall
^1);
1212 ui_reptime_compute(widget
, data
);
1221 static void ui_reptime_setup(struct ui_reptime_data
*data
, guint32 accnum
)
1223 DB( g_print("\n[reptime] setup\n") );
1225 data
->txn_queue
= g_queue_new ();
1227 data
->filter
= da_filter_malloc();
1228 filter_default_all_set(data
->filter
);
1232 /* 3.4 : make int transfer out of stats */
1233 data
->filter
->option
[FILTER_PAYMODE
] = 1;
1234 data
->filter
->paymode
[PAYMODE_INTXFER
] = FALSE
;
1236 filter_preset_daterange_set(data
->filter
, PREFS
->date_range_rep
, data
->accnum
);
1238 g_signal_handler_block(data
->PO_mindate
, data
->handler_id
[HID_REPTIME_MINDATE
]);
1239 g_signal_handler_block(data
->PO_maxdate
, data
->handler_id
[HID_REPTIME_MAXDATE
]);
1241 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_mindate
), data
->filter
->mindate
);
1242 gtk_date_entry_set_date(GTK_DATE_ENTRY(data
->PO_maxdate
), data
->filter
->maxdate
);
1244 g_signal_handler_unblock(data
->PO_mindate
, data
->handler_id
[HID_REPTIME_MINDATE
]);
1245 g_signal_handler_unblock(data
->PO_maxdate
, data
->handler_id
[HID_REPTIME_MAXDATE
]);
1248 DB( g_print(" populate\n") );
1249 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_acc
), GLOBALS
->h_acc
, ACC_LST_INSERT_REPORT
);
1250 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_acc
), accnum
);
1252 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_pay
), GLOBALS
->h_pay
);
1253 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data
->PO_pay
), 0);
1255 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data
->PO_cat
), GLOBALS
->h_cat
);
1256 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->PO_cat
), 0);
1258 DB( g_print(" all ok\n") );
1264 static void ui_reptime_selection(GtkTreeSelection
*treeselection
, gpointer user_data
)
1266 GtkTreeModel
*model
;
1270 DB( g_print("\n[reptime] selection\n") );
1272 if (gtk_tree_selection_get_selected(treeselection
, &model
, &iter
))
1274 gtk_tree_model_get(model
, &iter
, LST_REPTIME_KEY
, &key
, -1);
1278 DB( g_print(" - active is %d\n", key
) );
1280 ui_reptime_detail(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), GINT_TO_POINTER(key
));
1281 ui_reptime_sensitive(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
1288 static gboolean
ui_reptime_dispose(GtkWidget
*widget
, GdkEvent
*event
, gpointer user_data
)
1290 struct ui_reptime_data
*data
= user_data
;
1291 struct WinGeometry
*wg
;
1293 DB( g_print("\n[reptime] dispose\n") );
1295 g_queue_free (data
->txn_queue
);
1297 da_filter_free(data
->filter
);
1301 //store position and size
1302 wg
= &PREFS
->tme_wg
;
1303 gtk_window_get_position(GTK_WINDOW(widget
), &wg
->l
, &wg
->t
);
1304 gtk_window_get_size(GTK_WINDOW(widget
), &wg
->w
, &wg
->h
);
1306 DB( g_print(" window: l=%d, t=%d, w=%d, h=%d\n", wg
->l
, wg
->t
, wg
->w
, wg
->h
) );
1310 //enable define windows
1311 GLOBALS
->define_off
--;
1312 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_SENSITIVE
));
1317 // the window creation
1318 GtkWidget
*ui_reptime_window_new(guint32 accnum
)
1320 struct ui_reptime_data
*data
;
1321 struct WinGeometry
*wg
;
1322 GtkWidget
*window
, *mainvbox
, *hbox
, *vbox
, *notebook
, *treeview
;
1323 GtkWidget
*label
, *widget
, *table
;
1326 GtkActionGroup
*actions
;
1328 GError
*error
= NULL
;
1330 data
= g_malloc0(sizeof(struct ui_reptime_data
));
1331 if(!data
) return NULL
;
1333 DB( g_print("\n[reptime] new\n") );
1336 //disable define windows
1337 GLOBALS
->define_off
++;
1338 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(2));
1340 /* create window, etc */
1341 window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
1342 data
->window
= window
;
1344 //store our window private data
1345 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)data
);
1347 gtk_window_set_title (GTK_WINDOW (window
), _("Trend Time Report"));
1349 //set the window icon
1350 gtk_window_set_icon_name(GTK_WINDOW (window
), ICONNAME_HB_REP_TIME
);
1354 mainvbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
1355 gtk_container_add (GTK_CONTAINER (window
), mainvbox
);
1357 hbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 0);
1358 gtk_box_pack_start (GTK_BOX (mainvbox
), hbox
, TRUE
, TRUE
, 0);
1361 table
= gtk_grid_new ();
1362 gtk_widget_set_hexpand (GTK_WIDGET(table
), FALSE
);
1363 gtk_box_pack_start (GTK_BOX (hbox
), table
, FALSE
, FALSE
, 0);
1365 gtk_container_set_border_width (GTK_CONTAINER (table
), SPACING_SMALL
);
1366 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
1367 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
1370 label
= make_label_group(_("Display"));
1371 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
1374 label
= make_label_widget(_("_For:"));
1375 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1376 widget
= make_cycle(label
, CYA_TIMESELECT
);
1377 data
->CY_for
= widget
;
1378 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1381 label
= make_label_widget(_("A_ccount:"));
1382 data
->LB_acc
= label
;
1383 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1384 widget
= ui_acc_comboboxentry_new(label
);
1385 data
->PO_acc
= widget
;
1386 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1389 label
= make_label_widget(_("_Category:"));
1390 data
->LB_cat
= label
;
1391 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1392 widget
= ui_cat_comboboxentry_new(label
);
1393 data
->PO_cat
= widget
;
1394 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1397 label
= make_label_widget(_("_Payee:"));
1398 data
->LB_pay
= label
;
1399 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1400 widget
= ui_pay_comboboxentry_new(label
);
1401 data
->PO_pay
= widget
;
1402 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1405 widget
= gtk_check_button_new_with_mnemonic (_("Select _all"));
1406 data
->CM_all
= widget
;
1407 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1410 widget
= gtk_check_button_new_with_mnemonic (_("_Cumulate"));
1411 data
->CM_cumul
= widget
;
1412 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1415 label
= make_label_widget(_("_View by:"));
1416 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1417 widget
= make_cycle(label
, CYA_VIEWBY
);
1418 data
->CY_view
= widget
;
1419 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1422 widget
= gtk_check_button_new_with_mnemonic (_("Euro _minor"));
1423 data
->CM_minor
= widget
;
1424 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1427 label
= make_label_widget(_("_Zoom X:"));
1428 data
->LB_zoomx
= label
;
1429 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1430 widget
= make_scale(label
);
1431 data
->RG_zoomx
= widget
;
1432 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
1436 widget
= gtk_separator_new(GTK_ORIENTATION_HORIZONTAL
);
1437 gtk_grid_attach (GTK_GRID (table
), widget
, 0, row
, 3, 1);
1440 label
= make_label_group(_("Date filter"));
1441 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
1444 label
= make_label_widget(_("_Range:"));
1445 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1446 data
->CY_range
= make_daterange(label
, FALSE
);
1447 gtk_grid_attach (GTK_GRID (table
), data
->CY_range
, 2, row
, 1, 1);
1450 label
= make_label_widget(_("_From:"));
1451 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1452 data
->PO_mindate
= gtk_date_entry_new();
1453 gtk_grid_attach (GTK_GRID (table
), data
->PO_mindate
, 2, row
, 1, 1);
1456 label
= make_label_widget(_("_To:"));
1457 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
1458 data
->PO_maxdate
= gtk_date_entry_new();
1459 gtk_grid_attach (GTK_GRID (table
), data
->PO_maxdate
, 2, row
, 1, 1);
1462 //part: info + report
1463 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
1464 gtk_box_pack_start (GTK_BOX (hbox
), vbox
, TRUE
, TRUE
, 0);
1467 actions
= gtk_action_group_new ("Account");
1470 gtk_action_group_set_translation_domain(actions
, GETTEXT_PACKAGE
);
1472 // data to action callbacks is set here (data)
1473 gtk_action_group_add_actions (actions
, entries
, n_entries
, data
);
1475 gtk_action_group_add_toggle_actions (actions
,
1476 toggle_entries
, n_toggle_entries
,
1480 /* set which action should have priority in the toolbar */
1481 action
= gtk_action_group_get_action(actions
, "List");
1482 g_object_set(action
, "is_important", TRUE
, NULL
);
1484 action
= gtk_action_group_get_action(actions
, "Line");
1485 g_object_set(action
, "is_important", TRUE
, NULL
);
1487 /*action = gtk_action_group_get_action(actions, "Column");
1488 g_object_set(action, "is_important", TRUE, NULL);*/
1490 action
= gtk_action_group_get_action(actions
, "Detail");
1491 g_object_set(action
, "is_important", TRUE
, NULL
);
1493 action
= gtk_action_group_get_action(actions
, "Refresh");
1494 g_object_set(action
, "is_important", TRUE
, NULL
);
1497 ui
= gtk_ui_manager_new ();
1498 gtk_ui_manager_insert_action_group (ui
, actions
, 0);
1499 gtk_window_add_accel_group (GTK_WINDOW (window
), gtk_ui_manager_get_accel_group (ui
));
1501 if (!gtk_ui_manager_add_ui_from_string (ui
, ui_info
, -1, &error
))
1503 g_message ("building UI failed: %s", error
->message
);
1504 g_error_free (error
);
1508 data
->actions
= actions
;
1511 data
->TB_bar
= gtk_ui_manager_get_widget (ui
, "/ToolBar");
1512 gtk_box_pack_start (GTK_BOX (vbox
), data
->TB_bar
, FALSE
, FALSE
, 0);
1515 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
1516 gtk_container_set_border_width (GTK_CONTAINER(hbox
), SPACING_SMALL
);
1517 gtk_box_pack_start (GTK_BOX (vbox
), hbox
, FALSE
, FALSE
, 0);
1519 label
= gtk_label_new(NULL
);
1520 data
->TX_info
= label
;
1521 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
1523 widget
= make_label(NULL
, 0.5, 0.5);
1524 gimp_label_set_attributes (GTK_LABEL (widget
), PANGO_ATTR_SCALE
, PANGO_SCALE_SMALL
, -1);
1525 data
->TX_daterange
= widget
;
1526 gtk_box_pack_start (GTK_BOX (hbox
), widget
, TRUE
, TRUE
, 0);
1530 notebook
= gtk_notebook_new();
1531 data
->GR_result
= notebook
;
1532 gtk_widget_show(notebook
);
1533 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook
), FALSE
);
1534 gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook
), FALSE
);
1536 gtk_box_pack_start (GTK_BOX (vbox
), notebook
, TRUE
, TRUE
, 0);
1539 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
1540 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, NULL
);
1542 widget
= gtk_scrolled_window_new (NULL
, NULL
);
1543 //gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW (widget), GTK_CORNER_TOP_RIGHT);
1544 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (widget
), GTK_SHADOW_ETCHED_IN
);
1545 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (widget
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1546 treeview
= ui_list_reptime_create();
1547 data
->LV_report
= treeview
;
1548 gtk_container_add (GTK_CONTAINER(widget
), treeview
);
1549 gtk_box_pack_start (GTK_BOX (vbox
), widget
, TRUE
, TRUE
, 0);
1552 widget
= gtk_scrolled_window_new (NULL
, NULL
);
1553 data
->GR_detail
= widget
;
1554 //gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW (widget), GTK_CORNER_TOP_RIGHT);
1555 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (widget
), GTK_SHADOW_ETCHED_IN
);
1556 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (widget
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1557 treeview
= create_list_transaction(LIST_TXN_TYPE_DETAIL
, PREFS
->lst_ope_columns
);
1558 data
->LV_detail
= treeview
;
1559 gtk_container_add (GTK_CONTAINER(widget
), treeview
);
1561 gtk_box_pack_start (GTK_BOX (vbox
), widget
, TRUE
, TRUE
, 0);
1565 widget
= gtk_chart_new(CHART_TYPE_LINE
);
1566 data
->RE_line
= widget
;
1567 //gtk_chart_set_minor_prefs(GTK_CHART(widget), PREFS->euro_value, PREFS->minor_cur.suffix_symbol);
1568 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), widget
, NULL
);
1570 //todo:should move this
1571 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_minor
), GLOBALS
->minor
);
1573 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_view
), 1);
1575 /* attach our minor to treeview */
1576 g_object_set_data(G_OBJECT(gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_report
))), "minor", (gpointer
)data
->CM_minor
);
1577 g_object_set_data(G_OBJECT(gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_detail
))), "minor", (gpointer
)data
->CM_minor
);
1581 /* signal connect */
1582 g_signal_connect (window
, "delete-event", G_CALLBACK (ui_reptime_dispose
), (gpointer
)data
);
1584 g_signal_connect (data
->CM_cumul
, "toggled", G_CALLBACK (ui_reptime_compute
), NULL
);
1586 g_signal_connect (data
->CM_minor
, "toggled", G_CALLBACK (ui_reptime_toggle_minor
), NULL
);
1588 data
->handler_id
[HID_REPTIME_MINDATE
] = g_signal_connect (data
->PO_mindate
, "changed", G_CALLBACK (ui_reptime_date_change
), (gpointer
)data
);
1589 data
->handler_id
[HID_REPTIME_MAXDATE
] = g_signal_connect (data
->PO_maxdate
, "changed", G_CALLBACK (ui_reptime_date_change
), (gpointer
)data
);
1591 data
->handler_id
[HID_REPTIME_RANGE
] = g_signal_connect (data
->CY_range
, "changed", G_CALLBACK (ui_reptime_range_change
), NULL
);
1593 g_signal_connect (data
->CY_for
, "changed", G_CALLBACK (ui_reptime_for
), (gpointer
)data
);
1594 data
->handler_id
[HID_REPTIME_VIEW
] = g_signal_connect (data
->CY_view
, "changed", G_CALLBACK (ui_reptime_compute
), (gpointer
)data
);
1596 //setup, init and show window
1597 ui_reptime_setup(data
, accnum
);
1599 g_signal_connect (data
->CM_all
, "toggled", G_CALLBACK (ui_reptime_toggle_showall
), NULL
);
1600 g_signal_connect (data
->PO_acc
, "changed", G_CALLBACK (ui_reptime_compute
), NULL
);
1601 g_signal_connect (data
->PO_cat
, "changed", G_CALLBACK (ui_reptime_compute
), NULL
);
1602 g_signal_connect (data
->PO_pay
, "changed", G_CALLBACK (ui_reptime_compute
), NULL
);
1604 g_signal_connect (data
->RG_zoomx
, "value-changed", G_CALLBACK (ui_reptime_zoomx_callback
), NULL
);
1607 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_report
)), "changed", G_CALLBACK (ui_reptime_selection
), NULL
);
1609 g_signal_connect (GTK_TREE_VIEW(data
->LV_detail
), "row-activated", G_CALLBACK (ui_reptime_detail_onRowActivated
), NULL
);
1613 if(PREFS
->toolbar_style
== 0)
1614 gtk_toolbar_unset_style(GTK_TOOLBAR(data
->TB_bar
));
1616 gtk_toolbar_set_style(GTK_TOOLBAR(data
->TB_bar
), PREFS
->toolbar_style
-1);
1618 //setup, init and show window
1619 wg
= &PREFS
->tme_wg
;
1620 gtk_window_move(GTK_WINDOW(window
), wg
->l
, wg
->t
);
1621 gtk_window_resize(GTK_WINDOW(window
), wg
->w
, wg
->h
);
1623 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_view
), GROUPBY_REPTIME_MONTH
);
1625 gtk_widget_show_all (window
);
1628 if( PREFS
->euro_active
)
1629 gtk_widget_show(data
->CM_minor
);
1631 gtk_widget_hide(data
->CM_minor
);
1633 ui_reptime_update_for(window
, data
);
1634 //gtk_widget_hide(data->GR_detail);
1638 ui_reptime_sensitive(window
, NULL
);
1639 ui_reptime_update_detail(window
, NULL
);
1641 DB( g_print("range: %d\n", PREFS
->date_range_rep
) );
1643 if( PREFS
->date_range_rep
!= 0)
1644 gtk_combo_box_set_active(GTK_COMBO_BOX(data
->CY_range
), PREFS
->date_range_rep
);
1646 ui_reptime_compute(window
, NULL
);
1652 ** ============================================================================
1656 static void ui_reptime_amount_cell_data_function (GtkTreeViewColumn
*col
,
1657 GtkCellRenderer
*renderer
,
1658 GtkTreeModel
*model
,
1664 gchar buf
[G_ASCII_DTOSTR_BUF_SIZE
];
1665 guint32 kcur
= GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(gtk_tree_view_column_get_tree_view(col
)), "kcur_data"));
1667 gtk_tree_model_get(model
, iter
, GPOINTER_TO_INT(user_data
), &value
, -1);
1671 hb_strfmon(buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, value
, kcur
, GLOBALS
->minor
);
1673 color
= get_normal_color_amount(value
);
1675 g_object_set(renderer
,
1676 "foreground", color
,
1681 g_object_set(renderer
, "text", "", NULL
);
1686 static GtkTreeViewColumn
*amount_list_ui_reptime_column(gchar
*name
, gint id
)
1688 GtkTreeViewColumn
*column
;
1689 GtkCellRenderer
*renderer
;
1691 column
= gtk_tree_view_column_new();
1692 gtk_tree_view_column_set_title(column
, name
);
1693 renderer
= gtk_cell_renderer_text_new ();
1694 g_object_set(renderer
, "xalign", 1.0, NULL
);
1695 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1696 gtk_tree_view_column_set_cell_data_func(column
, renderer
, ui_reptime_amount_cell_data_function
, GINT_TO_POINTER(id
), NULL
);
1697 gtk_tree_view_column_set_alignment (column
, 0.5);
1698 //gtk_tree_view_column_set_sort_column_id (column, id);
1703 static void ui_reptime_list_set_cur(GtkTreeView
*treeview
, guint32 kcur
)
1705 g_object_set_data(G_OBJECT(treeview
), "kcur_data", GUINT_TO_POINTER(kcur
));
1711 ** create our statistic list
1713 static GtkWidget
*ui_list_reptime_create(void)
1715 GtkListStore
*store
;
1717 GtkCellRenderer
*renderer
;
1718 GtkTreeViewColumn
*column
;
1720 /* create list store */
1721 store
= gtk_list_store_new(
1730 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
1731 g_object_unref(store
);
1733 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view
), PREFS
->grid_lines
);
1736 column
= gtk_tree_view_column_new();
1737 gtk_tree_view_column_set_title(column
, _("Time slice"));
1738 renderer
= gtk_cell_renderer_text_new ();
1739 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1740 //gtk_tree_view_column_set_cell_data_func(column, renderer, ope_result_cell_data_function, NULL, NULL);
1741 gtk_tree_view_column_add_attribute(column
, renderer
, "text", LST_REPTIME_TITLE
);
1742 //gtk_tree_view_column_set_sort_column_id (column, LST_REPTIME_NAME);
1743 gtk_tree_view_column_set_resizable(column
, TRUE
);
1744 gtk_tree_view_column_set_alignment (column
, 0.5);
1745 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1747 /* column: Amount */
1748 column
= amount_list_ui_reptime_column(_("Amount"), LST_REPTIME_AMOUNT
);
1749 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1751 /* column last: empty */
1752 column
= gtk_tree_view_column_new();
1753 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
1756 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_REPTIME_POS
, ui_list_reptime_compare_func
, GINT_TO_POINTER(LST_REPTIME_POS
), NULL
);
1757 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store
), LST_REPTIME_AMOUNT
, ui_list_reptime_compare_func
, GINT_TO_POINTER(LST_REPTIME_AMOUNT
), NULL
);
1762 static gint
ui_list_reptime_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
1764 gint sortcol
= GPOINTER_TO_INT(userdata
);
1769 gtk_tree_model_get(model
, a
,
1770 LST_REPTIME_POS
, &pos1
,
1773 gtk_tree_model_get(model
, b
,
1774 LST_REPTIME_POS
, &pos2
,
1778 if(pos1 == -1) return(1);
1779 if(pos2 == -1) return(-1);
1782 if(sortcol
== LST_REPTIME_POS
)
1783 retval
= pos2
- pos1
;
1785 retval
= (ABS(val1
) - ABS(val2
)) > 0 ? 1 : -1;
1787 //DB( g_print(" sort %d=%d or %.2f=%.2f :: %d\n", pos1,pos2, val1, val2, ret) );