27 #include <glib/gi18n.h>
28 #include <glib/gprintf.h>
33 #include <gtk/gtkmain.h>
34 #include <gpe/pixmaps.h>
36 #include <gpe/pim-categories.h>
37 #include <gpe/pim-categories-ui.h>
38 #include <gpe/spacing.h>
44 #define _(String) gettext (String)
47 #define SHOW_DECIMAL_PLACES 2
49 static QofLogModule log_module = GPE_MOD_GUI;
78 check = qof_util_param_to_string (ent, param);
79 g_return_if_fail (check);
80 if (safe_strcmp(check, text_entry))
83 qof_util_param_set_string (ent, param, text_entry);
98 edit_ok_clicked(GtkWidget G_GNUC_UNUSED *widget, gpointer data)
103 GtkTextIter start, end;
108 g_return_if_fail(context);
109 ent = context->entity;
111 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (context->
text_view));
112 gtk_text_buffer_get_bounds (buf, &start, &end);
114 compare_cache (g_strdup(gtk_text_buffer_get_text (GTK_TEXT_BUFFER (buf),
115 &start, &end, FALSE)), ent,
116 qof_class_get_parameter (GPE_QOF_EXPENSES, EXP_NOTE));
118 compare_cache ( g_strdup (gtk_entry_get_text
120 qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_VENDOR));
122 compare_cache (g_strdup (gtk_entry_get_text
124 qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_CITY));
126 compare_cache (g_strdup (gtk_entry_get_text
128 qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_ATTENDEES));
130 compare_cache (g_strdup (ExpenseTypeasString
132 qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_TYPE));
134 compare_cache (g_strdup (ExpensePaymentasString
135 (gtk_combo_box_get_active(context->
payment_list))), ent,
136 qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_PAYMENT));
138 compare_cache (g_strdup (gtk_label_get_text (GTK_LABEL(context->
cat_label))),
139 ent, qof_class_get_parameter (GPE_QOF_EXPENSES, EXP_CATEGORY));
141 mnemonic = gtk_combo_box_get_active_text (context->
currency_list);
145 compare_cache (g_strdup_printf (
"%d", currency->
pq_code), ent,
146 qof_class_get_parameter (GPE_QOF_EXPENSES, EXP_CURRENCY));
147 gtk_widget_destroy(context->
window);
148 context->entity = NULL;
149 exp_refresh_list(context);
153 edit_cancel_clicked(GtkWidget G_GNUC_UNUSED *widget, gpointer data)
158 g_return_if_fail(context);
159 exp_refresh_list(context);
160 gtk_widget_destroy(context->
window);
161 context->entity = NULL;
165 edit_delete_clicked(GtkWidget G_GNUC_UNUSED *widget, gpointer data)
170 g_return_if_fail(context);
171 qof_event_gen (context->entity, QOF_EVENT_DESTROY, NULL);
172 qof_entity_release(context->entity);
173 exp_refresh_list(context);
174 gtk_widget_destroy(context->
window);
175 context->entity = NULL;
179 create_currency_list(gpointer G_GNUC_UNUSED key, gpointer value, gpointer user_data)
192 build_categories_string (
GSList * catlist)
199 if (!catlist) {
return g_strdup(
""); }
200 for (iter = catlist; iter; iter = iter->next)
202 id = GPOINTER_TO_INT(iter->data);
203 cat = gpe_pim_category_name (
id);
210 gchar *ns = g_strdup_printf (
"%s, %s", s, cat);
222 set_selected_category (GtkWidget G_GNUC_UNUSED *ui,
GSList *selected, gpointer user_data)
228 g_return_if_fail (context);
230 str = build_categories_string (selected);
233 gtk_label_set_markup (GTK_LABEL (context->
cat_label), str);
240 on_categories_clicked (GtkButton G_GNUC_UNUSED *button, gpointer user_data)
242 GtkWidget * G_GNUC_UNUSED w;
244 w = gpe_pim_categories_dialog (gpe_pim_categories_list (),
245 G_CALLBACK (set_selected_category), user_data);
249 cat_compare (gconstpointer gpe_cat, gconstpointer qof_name)
251 struct gpe_pim_category * c;
253 c = (
struct gpe_pim_category *) gpe_cat;
254 return safe_strcasecmp (gpe_pim_category_name (c->id), qof_name);
259 cat_populate (
const gchar * cat_name)
261 GSList * cat_list, *match;
265 cat_list = gpe_pim_categories_list();
269 match = g_slist_find_custom (cat_list, cat_name, cat_compare);
273 DEBUG (
"'%s' not found in GPE category list, adding.", cat_name);
274 gpe_pim_category_new (cat_name, &max_list);
279 edit_expense (GtkWidget G_GNUC_UNUSED *w,
GpeExpenseData *context)
281 GtkWidget *table, *top_vbox;
282 GtkWidget *viewport, *scrolled_window;
283 GtkWidget *buttonbox, *buttonok, *buttoncancel, *buttondelete;
284 GtkWidget *type_label, *payment_label, *currency_label;
285 GtkWidget *city_label, *vendor_label, *note_label, *attendees_label;
287 guint gpe_spacing, pos, i;
292 g_return_if_fail(context);
293 if(!context->entity) {
return; }
298 buttonok = gtk_button_new_from_stock (GTK_STOCK_SAVE);
299 buttoncancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
300 buttondelete = gtk_button_new_from_stock (GTK_STOCK_DELETE);
302 table = gtk_table_new(10, 6, FALSE);
303 top_vbox = gtk_vbox_new (FALSE, 0);
304 context->
text_view = gtk_text_view_new ();
305 buttonbox = gtk_hbox_new (FALSE, 0);
306 type_label = gtk_label_new (_(
"Type:"));
307 payment_label = gtk_label_new (_(
"Payment:"));
308 currency_label = gtk_label_new (_(
"Currency:"));
309 vendor_label = gtk_label_new(_(
"Vendor:"));
310 city_label = gtk_label_new(_(
"City:"));
311 note_label = gtk_label_new(_(
"Note:"));
312 attendees_label = gtk_label_new(_(
"Attendees"));
313 context->
categories = gtk_button_new_with_label (_(
"Category"));
315 context->
edit_type_list = GTK_COMBO_BOX(gtk_combo_box_new_text());
316 context->
currency_list = GTK_COMBO_BOX(gtk_combo_box_new_text());
317 context->
payment_list = GTK_COMBO_BOX(gtk_combo_box_new_text());
319 context->
city_entry = GTK_ENTRY (gtk_entry_new());
321 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
322 viewport = gtk_viewport_new(NULL, NULL);
324 context->
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
326 gtk_table_set_col_spacings (GTK_TABLE(table), gpe_spacing);
327 gtk_table_set_row_spacings (GTK_TABLE(table), gpe_spacing);
328 gtk_box_set_spacing (GTK_BOX(top_vbox), gpe_spacing);
330 gtk_window_set_default_size (GTK_WINDOW (context->
window), 240, 320);
331 gtk_window_set_title (GTK_WINDOW (context->
window), _(
"Expenses"));
333 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
334 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
335 gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
336 gtk_container_add (GTK_CONTAINER (viewport), table);
337 gtk_container_add (GTK_CONTAINER (scrolled_window), viewport);
339 gtk_container_set_border_width(GTK_CONTAINER(buttonbox), 0);
341 gtk_table_set_col_spacings (GTK_TABLE(table), gpe_spacing);
342 gtk_table_set_row_spacings (GTK_TABLE(table), gpe_spacing);
343 gtk_box_set_spacing (GTK_BOX(top_vbox), gpe_spacing);
345 gtk_signal_connect (GTK_OBJECT (buttonok),
"clicked",
346 GTK_SIGNAL_FUNC (edit_ok_clicked), context);
347 gtk_signal_connect (GTK_OBJECT (buttoncancel),
"clicked",
348 GTK_SIGNAL_FUNC (edit_cancel_clicked), context);
349 gtk_signal_connect (GTK_OBJECT (buttondelete),
"clicked",
350 GTK_SIGNAL_FUNC (edit_delete_clicked), context);
352 gtk_box_pack_start (GTK_BOX (buttonbox), buttondelete, TRUE, FALSE, 0);
353 gtk_box_pack_start (GTK_BOX (buttonbox), buttoncancel, TRUE, FALSE, 0);
354 gtk_box_pack_start (GTK_BOX (buttonbox), buttonok, TRUE, FALSE, 0);
356 gtk_misc_set_alignment (GTK_MISC (context->
cat_label), 0.0, 0.5);
357 gtk_misc_set_alignment (GTK_MISC (type_label), 0.0, 0.5);
358 gtk_misc_set_alignment (GTK_MISC (payment_label), 0.0, 0.5);
359 gtk_misc_set_alignment (GTK_MISC (currency_label), 0.0, 0.5);
360 gtk_misc_set_alignment (GTK_MISC (vendor_label), 0.0, 0.5);
361 gtk_misc_set_alignment (GTK_MISC (city_label), 0.0, 0.5);
362 gtk_misc_set_alignment (GTK_MISC (attendees_label), 0.0, 0.5);
365 param = qof_class_get_parameter(context->entity->e_type, EXP_TYPE);
366 i = ExpenseTypefromString(param->param_getfcn(context->entity, param));
369 if(i == Mileage) { mileage = TRUE; }
373 gtk_table_attach (GTK_TABLE(table), context->
categories, 0, 1, pos, pos+1,
374 GTK_FILL, GTK_FILL, 0, 0);
376 gtk_table_attach (GTK_TABLE(table), context->
cat_label, 2, 3, pos, pos+1,
377 GTK_FILL, GTK_FILL, 0, 0);
381 gtk_table_attach(GTK_TABLE(table), type_label, 0, 1, pos, pos+1,
382 GTK_FILL, GTK_FILL, 0, 0);
383 while(0 != safe_strcmp(ExpenseTypeasString(i),
""))
388 dgettext(LIBRARY_GETTEXT_PACKAGE, ExpenseTypeasString(i)));
389 check = qof_util_param_to_string(context->entity, param);
390 if(0 == safe_strcmp(check, ExpenseTypeasString(i)))
397 gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(context->
edit_type_list), 1,
398 3, pos, pos+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
403 gtk_table_attach(GTK_TABLE(table), payment_label, 0, 1, pos, pos+1,
404 GTK_FILL, GTK_FILL, 0, 0);
406 while((0 != safe_strcmp(ExpensePaymentasString(i),
"")) &&
410 dgettext(LIBRARY_GETTEXT_PACKAGE, ExpensePaymentasString(i)));
413 gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(context->
payment_list), 1,
414 3, pos, pos+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
419 gtk_table_attach(GTK_TABLE(table), currency_label, 0, 1, pos, pos+1,
420 GTK_FILL, GTK_FILL, 0, 0);
421 qof_currency_foreach(create_currency_list, context);
422 gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(context->
currency_list), 1,
423 3, pos, pos+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
427 gtk_table_attach(GTK_TABLE(table), vendor_label, 0, 1, pos, pos+1,
428 GTK_FILL, GTK_FILL, 0, 0);
429 gtk_table_attach(GTK_TABLE(table), GTK_WIDGET (context->
vendor_entry),
430 1, 5, pos, pos+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
433 gtk_table_attach(GTK_TABLE(table), city_label, 0, 1, pos, pos+1,
434 GTK_FILL, GTK_FILL, 0, 0);
435 gtk_table_attach(GTK_TABLE(table), GTK_WIDGET (context->
city_entry),
436 1, 5, pos, pos+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
439 gtk_table_attach(GTK_TABLE(table), attendees_label, 0, 1, pos, pos+1,
440 GTK_FILL, GTK_FILL, 0, 0);
441 gtk_table_attach(GTK_TABLE(table), GTK_WIDGET (context->
attendees_entry),
442 1, 5, pos, pos+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
445 gtk_table_attach(GTK_TABLE(table), note_label, 0, 1, pos, pos+1,
446 GTK_FILL, GTK_FILL, 0, 0);
447 gtk_table_attach(GTK_TABLE(table), context->
text_view, 1, 5, pos, pos+1,
448 GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
451 gtk_text_view_set_editable (GTK_TEXT_VIEW (context->
text_view), TRUE);
452 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (context->
text_view), GTK_WRAP_WORD_CHAR);
454 gtk_box_pack_start (GTK_BOX (top_vbox), scrolled_window, TRUE, TRUE, 0);
455 gtk_box_pack_start (GTK_BOX (top_vbox), buttonbox, FALSE, FALSE, 0);
457 gtk_container_add (GTK_CONTAINER (context->
window), top_vbox);
461 param = qof_class_get_parameter(context->entity->e_type, EXP_CATEGORY);
462 text = param->param_getfcn(context->entity, param);
467 PINFO (
"setting cat_label=%s", text);
468 gtk_label_set_markup (GTK_LABEL(context->
cat_label), text);
471 param = qof_class_get_parameter(context->entity->e_type, EXP_PAYMENT);
472 i = ExpensePaymentfromString(param->param_getfcn(context->entity, param));
475 param = qof_class_get_parameter(context->entity->e_type, EXP_VENDOR);
476 text = param->param_getfcn(context->entity, param);
477 if(text) { gtk_entry_set_text(context->
vendor_entry, text); }
479 param = qof_class_get_parameter(context->entity->e_type, EXP_CITY);
480 text = param->param_getfcn(context->entity, param);
481 if(text) { gtk_entry_set_text(context->
city_entry, text); }
483 param = qof_class_get_parameter(context->entity->e_type, EXP_CURRENCY);
487 int32_getter = (gint32 (*)(QofEntity*,
const QofParam*)) param->param_getfcn;
488 check = int32_getter(context->entity, param);
491 PINFO (
" currency=%d mnemonic=%s", check, currency->
mnemonic);
495 param = qof_class_get_parameter(context->entity->e_type, EXP_ATTENDEES);
496 text = param->param_getfcn(context->entity, param);
499 param = qof_class_get_parameter(context->entity->e_type, EXP_NOTE);
500 buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (context->
text_view));
501 text = param->param_getfcn(context->entity, param);
504 gtk_text_buffer_set_text(buf, text, strlen(text));
505 gtk_text_view_set_buffer(GTK_TEXT_VIEW (context->
text_view), buf);
508 g_signal_connect (G_OBJECT (context->
categories),
"clicked",
509 G_CALLBACK (on_categories_clicked), context);
510 gpe_set_window_icon (context->
window,
"icon");
511 gtk_widget_show_all(context->
window);
516 open_about_dialog (
void)
520 const gchar * authors[4] = {
"Neil Williams <linux@codehelp.co.uk>\n"
521 "Philip Blundell <philb@gnu.org>\n"
522 "Florian Boor <florian@kernelconcepts.de>\n"
525 ab = GTK_ABOUT_DIALOG( gtk_about_dialog_new() );
526 gtk_about_dialog_set_copyright(ab,
527 "Copyright 2005-2007 Neil Williams <linux@codehelp.co.uk>");
528 gtk_about_dialog_set_version(ab, VERSION);
529 gtk_about_dialog_set_comments(ab,
531 _(
"Expenses records for GPE. Supports payment types, "
532 "categories, expense types (mileage, meals, parking, etc.), "
533 "notes and currency selection."));
534 gtk_about_dialog_set_license (ab,
535 " This package is free software; you can redistribute it and/or modify\n"
536 " it under the terms of the GNU General Public License as published by\n"
537 " the Free Software Foundation; either version 3 of the License, or\n"
538 " (at your option) any later version.\n"
540 " This program is distributed in the hope that it will be useful,\n"
541 " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
542 " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
543 " GNU General Public License for more details.\n"
545 " You should have received a copy of the GNU General Public License\n"
546 " along with this program. If not, see <http://www.gnu.org/licenses/>.\n");
547 gtk_about_dialog_set_website (ab,
"http://gpe-expenses.sourceforge.net/");
548 gtk_about_dialog_set_authors (ab, authors);
549 gtk_about_dialog_set_translator_credits (ab, _(
"translator-credits"));
550 gtk_about_dialog_set_logo (ab, gpe_try_find_icon(
"icon", NULL));
551 gpe_set_window_icon(GTK_WIDGET(ab),
"icon");
552 gtk_dialog_run(GTK_DIALOG(ab));
553 gtk_widget_destroy (GTK_WIDGET(ab));
562 exp_show_entities(QofEntity *ent, gpointer data)
568 GtkTreeIter ent_data;
570 gchar *type, *symbol, *date_string, *dis_string;
574 g_return_if_fail(context);
577 param = qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_DATE);
578 qt = (QofTime*)param->param_getfcn (ent, param);
579 qd = qof_date_from_qtime (qt);
580 date_string = qof_date_print (qd, QOF_DATE_FORMAT_CE);
582 param = qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_TYPE);
583 dis_string = param->param_getfcn(ent, param);
584 type = dgettext(LIBRARY_GETTEXT_PACKAGE, dis_string);
587 if(0 == safe_strcmp(dis_string,
"Mileage"))
591 param = qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_DISTANCE);
592 unit = ExpenseDistancefromString(param->param_getfcn(ent, param));
596 case 0 : { symbol = _(
"mi");
break; }
598 case 1 : { symbol = _(
"km");
break; }
604 gint32 curr_code, (*int32_getter) (QofEntity *,
const QofParam *);
605 param = qof_class_get_parameter (GPE_QOF_EXPENSES, EXP_CURRENCY);
606 int32_getter = (gint32 (*)(QofEntity *,
const QofParam *))
608 curr_code = int32_getter (ent, param);
611 symbol = g_strdup(pqc->
symbol);
613 param = qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_AMOUNT);
615 amount = numeric_getter(ent, param);
616 d_amount = qof_numeric_to_double(amount);
618 gtk_list_store_append(context->
list_store, &ent_data);
619 gtk_list_store_set(context->
list_store, &ent_data,
620 COL_EXP_DATE, date_string,
622 COL_EXP_SYMBOL, symbol,
623 COL_EXP_AMOUNT, d_amount,
631 button_press_event (GtkWidget *widget, GdkEventButton *b, gpointer data)
633 GtkTreeViewColumn *col;
641 g_return_val_if_fail(context, FALSE);
646 if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
647 b->x, b->y, &path, &col, NULL, NULL))
649 GtkTreeView * treeview;
651 treeview = GTK_TREE_VIEW
652 (gtk_tree_view_new_with_model
654 gtk_tree_view_set_cursor (treeview, path, NULL, TRUE);
655 gtk_widget_grab_focus (GTK_WIDGET (treeview));
656 gtk_tree_model_get_iter (GTK_TREE_MODEL (context->
list_store),
658 gtk_tree_model_get(GTK_TREE_MODEL (context->
list_store),
659 &iter, COL_ENTITY, &ent, -1);
660 gtk_tree_model_get(GTK_TREE_MODEL (context->
list_store),
661 &iter, COL_EXP_AMOUNT, &amount, -1);
662 context->entity = ent;
663 gtk_tree_path_free (path);
682 change_date (GtkCellRendererText G_GNUC_UNUSED *cell,
683 gchar G_GNUC_UNUSED *path_string, gchar *new_text, gpointer data)
685 void (*time_setter) (QofEntity*, QofTime*);
692 g_return_if_fail(context);
693 ENTER (
" new_text=%s", new_text);
694 param = qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_DATE);
695 time_setter = (void(*)(QofEntity*, QofTime*))param->param_setfcn;
697 qd = qof_date_parse (new_text, QOF_DATE_FORMAT_CE);
698 qt = qof_date_to_qtime (qd);
699 qof_util_param_edit ((
QofInstance*)context->entity, param);
700 if ((time_setter && qof_time_is_valid (qt)))
701 time_setter (context->entity, qt);
702 qof_util_param_commit ((
QofInstance*)context->entity, param);
703 exp_refresh_list(context);
708 change_amount (GtkCellRendererText G_GNUC_UNUSED *cell,
709 gchar G_GNUC_UNUSED *path_string, gchar *new_text, gpointer data)
713 void (*numeric_setter) (QofEntity*,
QofNumeric);
714 void (*i32_setter) (QofEntity*, gint32);
726 g_return_if_fail(context);
729 param = qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_CURRENCY);
730 i32_setter = (void(*)(QofEntity*, gint32))param->param_setfcn;
733 DEBUG (
" sym=%s", lc.currency_symbol);
734 sy = g_strdup (lc.int_curr_symbol);
735 sy = g_strstrip (sy);
740 if(i32_setter != NULL) { i32_setter(context->entity, def_pq_code); }
741 param = qof_class_get_parameter(GPE_QOF_EXPENSES, EXP_AMOUNT);
742 numeric_setter = (void(*)(QofEntity*,
QofNumeric))param->param_setfcn;
744 precision = pow(10, SHOW_DECIMAL_PLACES);
745 amount = qof_numeric_zero();
746 d_amount = strtod(new_text, NULL);
747 amount = qof_numeric_from_double (d_amount, precision,
748 QOF_HOW_DENOM_EXACT | QOF_HOW_RND_ROUND);
749 numeric_char = qof_numeric_to_string(amount);
750 DEBUG (
" numeric_char=%s", numeric_char);
751 g_free(numeric_char);
753 if ((qof_numeric_check (amount) == QOF_ERROR_OK) && (numeric_setter))
755 qof_util_param_edit ((
QofInstance*)context->entity, param);
756 numeric_setter(context->entity, amount);
757 qof_util_param_commit ((
QofInstance*)context->entity, param);
761 qof_util_param_edit ((
QofInstance*)context->entity, param);
762 numeric_setter(context->entity, qof_numeric_zero ());
763 qof_util_param_commit ((
QofInstance*)context->entity, param);
765 exp_refresh_list(context);
770 rounding_func (GtkTreeViewColumn G_GNUC_UNUSED *tree_column,
771 GtkCellRenderer *cell, GtkTreeModel *tree_model,
772 GtkTreeIter *iter, gpointer data)
774 GtkCellRendererText *cell_text;
778 cell_text = (GtkCellRendererText *)cell;
781 g_free(cell_text->text);
782 gtk_tree_model_get(tree_model, iter, GPOINTER_TO_INT(data), &d, -1);
783 s = g_strdup_printf(
"%%.%i", SHOW_DECIMAL_PLACES);
784 s = g_strconcat(s,
"f", NULL);
785 cell_text->text = g_strdup_printf(s, d);
790 type_compare (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
791 gpointer G_GNUC_UNUSED user_data)
794 gchar *str_a, *str_b;
797 gtk_tree_model_get(model, a, COL_EXP_TYPE, &str_a, -1);
798 gtk_tree_model_get(model, b, COL_EXP_TYPE, &str_b, -1);
799 result = safe_strcmp(str_a, str_b);
812 date_compare (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
813 gpointer G_GNUC_UNUSED user_data)
815 QofTime *qt_a, *qt_b;
816 QofEntity * ent_a, * ent_b;
820 ent_a = ent_b = NULL;
822 gtk_tree_model_get(model, a, COL_ENTITY, &ent_a, -1);
823 gtk_tree_model_get(model, b, COL_ENTITY, &ent_b, -1);
824 param = qof_class_get_parameter (GPE_QOF_EXPENSES, EXP_DATE);
825 qt_a = param->param_getfcn (ent_a, param);
826 qt_b = param->param_getfcn (ent_b, param);
827 result = qof_time_cmp (qt_a, qt_b);
828 qof_time_free (qt_a);
829 qof_time_free (qt_b);
834 amount_compare (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
835 gpointer G_GNUC_UNUSED user_data)
838 gdouble *dbl_a, *dbl_b;
841 gtk_tree_model_get(model, a, COL_EXP_AMOUNT, &dbl_a, -1);
842 gtk_tree_model_get(model, b, COL_EXP_AMOUNT, &dbl_b, -1);
844 result = (dbl_a > dbl_b) ? 1 : -1;
852 GtkTreeSortable *sort;
854 GtkCellRenderer *date_rend, *type_rend, *symbol_rend, *amount_rend;
855 GtkTreeViewColumn *col;
857 scrolled = gtk_scrolled_window_new (NULL, NULL);
858 context->
list_store = gtk_list_store_new(COL_MAX, G_TYPE_STRING,
859 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_POINTER);
860 sort = GTK_TREE_SORTABLE (context->
list_store);
861 view = GTK_TREE_VIEW (gtk_tree_view_new_with_model
862 (GTK_TREE_MODEL (sort)));
864 date_rend = gtk_cell_renderer_text_new ();
865 col = gtk_tree_view_column_new_with_attributes ((_(
"Date")), date_rend,
866 "text", COL_EXP_DATE, NULL);
867 g_object_set(date_rend,
"editable", TRUE, NULL);
868 g_object_set(col,
"reorderable", TRUE, NULL);
869 g_object_set(col,
"sort-indicator", TRUE, NULL);
870 gtk_tree_view_column_set_sort_column_id(col, COL_EXP_DATE);
871 gtk_tree_sortable_set_sort_func (sort, COL_EXP_DATE, date_compare, NULL, NULL);
872 gtk_tree_view_column_set_expand(col, TRUE);
873 gtk_tree_view_column_set_clickable(col, TRUE);
874 gtk_tree_view_insert_column (GTK_TREE_VIEW (view), col, -1);
875 g_signal_connect(date_rend,
"edited",
876 (GCallback) change_date, context);
878 type_rend = gtk_cell_renderer_text_new ();
879 col = gtk_tree_view_column_new_with_attributes (_(
"Type"), type_rend,
880 "text", COL_EXP_TYPE, NULL);
881 gtk_tree_view_column_set_sort_column_id(col, COL_EXP_TYPE);
882 gtk_tree_sortable_set_sort_func (sort, COL_EXP_TYPE, type_compare, NULL, NULL);
883 gtk_tree_view_column_set_expand(col, TRUE);
884 gtk_tree_view_column_set_clickable(col, TRUE);
885 g_object_set(col,
"reorderable", TRUE, NULL);
886 g_object_set(col,
"sort-indicator", TRUE, NULL);
887 gtk_tree_view_insert_column (GTK_TREE_VIEW (view), col, -1);
889 symbol_rend = gtk_cell_renderer_text_new ();
890 col = gtk_tree_view_column_new_with_attributes (
"", symbol_rend,
891 "text", COL_EXP_SYMBOL, NULL);
892 gtk_tree_view_column_set_expand(col, TRUE);
893 gtk_tree_view_column_set_clickable(col, TRUE);
894 gtk_tree_view_insert_column (GTK_TREE_VIEW (view), col, -1);
896 amount_rend = gtk_cell_renderer_text_new ();
897 col = gtk_tree_view_column_new_with_attributes (_(
"Amount"), amount_rend,
898 "text", COL_EXP_AMOUNT, NULL);
899 g_object_set(amount_rend,
"editable", TRUE, NULL);
900 g_object_set(col,
"reorderable", TRUE, NULL);
901 g_object_set(col,
"sort-indicator", TRUE, NULL);
902 gtk_tree_view_column_set_sort_column_id(col, COL_EXP_AMOUNT);
903 gtk_tree_sortable_set_sort_func (sort, COL_EXP_AMOUNT, amount_compare, NULL, NULL);
904 gtk_tree_view_column_set_expand(col, TRUE);
905 gtk_tree_view_column_set_clickable(col, TRUE);
906 gtk_tree_view_insert_column (GTK_TREE_VIEW (view), col, -1);
907 gtk_tree_view_column_set_cell_data_func(col, amount_rend,
908 rounding_func, GINT_TO_POINTER(COL_EXP_AMOUNT), NULL);
909 g_signal_connect(amount_rend,
"edited",
910 (GCallback) change_amount, context);
912 g_signal_connect (G_OBJECT (view),
"button_press_event",
913 G_CALLBACK (button_press_event), context);
915 gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET(view));
916 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
917 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
918 gtk_tree_sortable_set_sort_column_id (sort, COL_EXP_DATE,
919 GTK_SORT_DESCENDING);
920 return GTK_WIDGET(scrolled);
928 qof_object_foreach(GPE_QOF_EXPENSES, context->
book, exp_show_entities, context);
932 open_new_expense (GtkWidget G_GNUC_UNUSED *w,
GpeExpenseData *context)
934 GtkTreeIter ent_data;
938 void (*i32_setter) (QofEntity*, gint32);
945 g_return_if_fail(context);
948 inst = (
QofInstance*)qof_object_new_instance(GPE_QOF_EXPENSES, book);
949 context->entity = &inst->entity;
952 DEBUG (
" sym=%s", lc.currency_symbol);
953 sy = g_strdup (lc.int_curr_symbol);
954 sy = g_strstrip (sy);
959 param = qof_class_get_parameter (GPE_QOF_EXPENSES, EXP_CURRENCY);
960 i32_setter = (void(*)(QofEntity*, gint32))param->param_setfcn;
961 qof_util_param_edit ((
QofInstance*)context->entity, param);
962 i32_setter(context->entity, def_pq_code);
963 qof_util_param_commit ((
QofInstance*)context->entity, param);
964 gtk_list_store_append(context->
list_store, &ent_data);
965 exp_refresh_list(context);
972 GtkToolItem *new_exp, *quit_exp, *about_exp, *item, *edit_exp;
973 toolbar = gtk_toolbar_new ();
974 gtk_toolbar_set_orientation (GTK_TOOLBAR (toolbar), GTK_ORIENTATION_HORIZONTAL);
976 new_exp = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
977 g_signal_connect(G_OBJECT(new_exp),
"clicked",
978 G_CALLBACK (open_new_expense), context);
979 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new_exp, -1);
981 edit_exp = gtk_tool_button_new_from_stock(GTK_STOCK_PROPERTIES);
982 g_signal_connect(G_OBJECT(edit_exp),
"clicked",
983 G_CALLBACK (edit_expense), context);
984 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), edit_exp, -1);
986 item = gtk_separator_tool_item_new();
987 gtk_tool_item_set_expand(GTK_TOOL_ITEM(item), FALSE);
988 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
990 about_exp = gtk_tool_button_new_from_stock(GTK_STOCK_ABOUT);
991 g_signal_connect(G_OBJECT(about_exp),
"clicked",
992 G_CALLBACK (open_about_dialog), NULL);
993 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), about_exp, -1);
995 item = gtk_separator_tool_item_new();
996 gtk_tool_item_set_expand(GTK_TOOL_ITEM(item), FALSE);
997 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
999 quit_exp = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
1000 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), quit_exp, -1);
1001 g_signal_connect (G_OBJECT (quit_exp),
"clicked",
1002 G_CALLBACK (gtk_main_quit), NULL);
1003 return GTK_WIDGET(toolbar);
1012 g_return_if_fail(context);
1014 vbox = gtk_vbox_new (FALSE, 0);
1016 gpe_pim_categories_init ();
1017 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1018 gtk_window_set_default_size (GTK_WINDOW (window), 240, 320);
1019 gtk_window_set_title (GTK_WINDOW (window), _(
"Expenses"));
1020 gpe_set_window_icon (window,
"icon");
1022 gtk_box_pack_start (GTK_BOX (vbox), set_toolbar(context), FALSE, FALSE, 0);
1023 g_signal_connect (G_OBJECT (window),
"delete-event",
1024 G_CALLBACK (gtk_main_quit), NULL);
1026 gtk_box_pack_start (GTK_BOX (vbox), set_list_view(context), TRUE, TRUE, 0);
1028 gtk_container_add (GTK_CONTAINER (window), vbox);
1029 gtk_widget_show_all (window);
1031 qof_object_foreach(GPE_QOF_EXPENSES, context->
book,
1032 exp_show_entities, context);