94
gchar *defbudget_getcsvbudgetstr(Category *item);
95
void defbudget_update(GtkWidget *treeview, gpointer user_data);
96
void defbudget_clear(GtkWidget *widget, gpointer user_data);
97
void defbudget_set(GtkWidget *widget, gpointer user_data);
98
void defbudget_get(GtkWidget *widget, gpointer user_data);
99
void defbudget_selection_change(GtkWidget *treeview, gpointer user_data);
100
void defbudget_toggle(GtkRadioButton *radiobutton, gpointer user_data);
101
void defbudget_selection(GtkTreeSelection *treeselection, gpointer user_data);
102
gboolean defbudget_cleanup(struct defbudget_data *data, gint result);
103
void defbudget_setup(struct defbudget_data *data);
94
static gchar *defbudget_getcsvbudgetstr(Category *item);
95
static void defbudget_update(GtkWidget *treeview, gpointer user_data);
96
static void defbudget_set(GtkWidget *widget, gpointer user_data);
97
static void defbudget_get(GtkWidget *widget, gpointer user_data);
98
static void defbudget_selection_change(GtkWidget *treeview, gpointer user_data);
99
static void defbudget_toggle(GtkRadioButton *radiobutton, gpointer user_data);
100
static void defbudget_selection(GtkTreeSelection *treeselection, gpointer user_data);
102
GtkWidget *defbudget_list_new(void);
108
gchar *defbudget_getcsvbudgetstr(Category *item)
107
static gchar *defbudget_getcsvbudgetstr(Category *item)
110
109
gchar *retval = NULL;
111
110
char buf[G_ASCII_DTOSTR_BUF_SIZE];
154
static gint defbudget_category_exists (GtkTreeModel *model, gchar *level, gchar *type, gchar *name, GtkTreeIter *return_iter)
156
GtkTreeIter iter, child;
164
valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
168
gtk_tree_model_get (model, &iter, LST_DEFCAT_DATAS, &entry, -1);
172
if(entry->name && g_ascii_strcasecmp(name, entry->name) == 0)
182
gint n_child = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(model), &iter);
183
gtk_tree_model_iter_children (GTK_TREE_MODEL(model), &child, &iter);
187
gtk_tree_model_get(GTK_TREE_MODEL(model), &child,
188
LST_DEFCAT_DATAS, &entry,
191
if(entry->name && g_ascii_strcasecmp(name, entry->name) == 0)
193
*return_iter = child;
198
gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &child);
203
valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
156
211
static void defbudget_load_csv( GtkWidget *widget, gpointer user_data)
203
258
DB( g_print(" read %s : %s : %s\n", str_array[0], str_array[1], str_array[2]) );
205
gint pos = defcategory_exists(model, str_array[0], str_array[1], str_array[2], &iter);
260
gint pos = defbudget_category_exists(model, str_array[0], str_array[1], str_array[2], &iter);
207
262
DB( g_print(" pos=%d\n", pos) );
318
374
//level 1: category
319
375
if( category->flags & GF_BUDGET )
321
type = category->flags & GF_CUSTOM ? ' ' : '*';
377
type = (category->flags & GF_CUSTOM) ? ' ' : '*';
323
379
outvalstr = defbudget_getcsvbudgetstr(category);
324
380
outstr = g_strdup_printf("1;%c;%s;%s", type, category->name, outvalstr);
325
DB( g_print("%s\n", outstr) );
381
DB( g_print("%s", outstr) );
326
382
g_io_channel_write_chars(io, outstr, -1, NULL, NULL);
328
384
g_free(outvalstr);
587
gboolean defbudget_cleanup(struct defbudget_data *data, gint result)
644
static gboolean defbudget_cleanup(struct defbudget_data *data, gint result)
589
646
gboolean doupdate = FALSE;
590
GList *s_list, *d_list;
593
648
DB( g_print("(defbudget) cleanup\n") );
595
if(result == GTK_RESPONSE_ACCEPT)
597
650
//do_application_specific_something ();
598
651
DB( g_print(" accept\n") );
600
s_list = g_list_first(data->tmp_list);
601
d_list = g_list_first(GLOBALS->cat_list);
602
while (s_list != NULL)
604
Category *s_item = s_list->data;
605
Category *d_item = d_list->data;
607
DB( g_printf(" slist %d, %s\n", s_item->key, s_item->name) );
608
DB( g_printf(" dlist %d, %s\n", d_item->key, d_item->name) );
610
/* copy flags & budget */
611
d_item->flags = s_item->flags;
614
d_item->budget[i] = s_item->budget[i];
617
s_list = g_list_next(s_list);
618
d_list = g_list_next(d_list);
621
653
GLOBALS->change += data->change;
625
655
DB( g_print(" free tmp_list\n") );
627
da_category_destroy(data->tmp_list);
644
670
data->change = 0;
645
671
data->cat = NULL;
647
/* first: clone our cat glist, its simpler later ! */
648
list = g_list_first(GLOBALS->cat_list);
651
Category *newitem = da_category_clone(list->data);
653
data->tmp_list = g_list_append(data->tmp_list, newitem);
655
//DB( g_printf(" clone_list (%d): %08x -> %08x\n", datalength, list->data, ptr) );
657
list = g_list_next(list);
660
populate_view_cat(data->LV_cat, data->tmp_list, FALSE);
674
ui_cat_listview_populate(data->LV_cat);
661
675
gtk_tree_view_expand_all (GTK_TREE_VIEW(data->LV_cat));
708
719
scrollwin = gtk_scrolled_window_new(NULL,NULL);
709
720
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
710
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
721
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
711
722
gtk_box_pack_start (GTK_BOX (vbox), scrollwin, TRUE, TRUE, 0);
712
723
treeview = (GtkWidget *)defbudget_list_new();
713
724
data.LV_cat = treeview;
781
792
spinner = make_amount(label);
782
793
data.spinner[i+1] = spinner;
783
data.spinner_hid[i+1] = g_signal_connect (spinner, "value-changed", G_CALLBACK (defbudget_get), (gpointer)i+1);
794
data.spinner_hid[i+1] = g_signal_connect (spinner, "value-changed", G_CALLBACK (defbudget_get), GINT_TO_POINTER(i+1));
784
795
gtk_table_attach_defaults (GTK_TABLE (table), spinner, col+1, col+2, row, row+1);
786
797
DB( g_print("(defbudget) %s, col=%d, row=%d", months[i], col, row) );
790
bbox = gtk_hbutton_box_new ();
801
bbox = gtk_hbox_new (FALSE, HB_BOX_SPACING);
791
802
gtk_box_pack_start (GTK_BOX (vbox), bbox, TRUE, TRUE, 0);
792
gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
803
//gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
793
804
gtk_box_set_spacing (GTK_BOX (bbox), HB_BOX_SPACING);
795
806
data.BT_import = gtk_button_new_with_mnemonic(_("_Import"));
868
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
872
** The function should return:
873
** a negative integer if the first value comes before the second,
874
** 0 if they are equal,
875
** or a positive integer if the first value comes after the second.
877
static gint defbudget_list_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata)
880
Category *entry1, *entry2;
881
gchar *name1, *name2;
883
gtk_tree_model_get(model, a, LST_DEFCAT_DATAS, &entry1, -1);
884
gtk_tree_model_get(model, b, LST_DEFCAT_DATAS, &entry2, -1);
886
result = (entry1->flags & GF_INCOME) - (entry2->flags & GF_INCOME);
889
name1 = entry1->name;
890
name2 = entry2->name;
891
if (name1 == NULL || name2 == NULL)
893
//if (name1 == NULL && name2 == NULL)
894
result = (name1 == NULL) ? -1 : 1;
898
result = g_utf8_collate(name1,name2);
906
** draw some text from the stored data structure
908
static void defbudget_text_cell_data_function (GtkTreeViewColumn *col,
909
GtkCellRenderer *renderer,
918
gtk_tree_model_get(model, iter, LST_DEFCAT_DATAS, &entry, -1);
921
name = g_strdup(_("(none)"));
927
type = (entry->flags & GF_INCOME) ? '+' : '-';
928
string = g_strdup_printf("%s ::(f=%d, %c)", name, entry->flags, type );
930
if(entry->flags & GF_BUDGET)
932
if( entry->parent == 0 )
933
string = g_markup_printf_escaped("<b>%s</b>", name);
935
string = g_markup_printf_escaped("<b><i>%s</i></b>", name);
939
if( entry->parent == 0 )
940
string = g_markup_printf_escaped("%s", name);
942
string = g_markup_printf_escaped("<i>%s</i>", name);
946
g_object_set(renderer, "markup", string, NULL);
954
GtkWidget *defbudget_list_new(void)
958
GtkCellRenderer *renderer;
959
GtkTreeViewColumn *column;
962
store = gtk_tree_store_new (
971
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DEFCAT_DATAS, defbudget_list_compare_func, NULL, NULL);
972
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), LST_DEFCAT_DATAS, GTK_SORT_ASCENDING);
976
view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
977
g_object_unref(store);
980
column = gtk_tree_view_column_new();
981
renderer = gtk_cell_renderer_text_new ();
982
gtk_tree_view_column_pack_start(column, renderer, TRUE);
983
gtk_tree_view_column_set_cell_data_func(column, renderer, defbudget_text_cell_data_function, GINT_TO_POINTER(1), NULL);
984
//gtk_tree_view_column_set_sort_column_id (column, LST_DEFACC_NAME);
985
gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
987
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
988
//gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);