~ubuntu-branches/debian/squeeze/homebank/squeeze

« back to all changes in this revision

Viewing changes to src/def_budget.c

  • Committer: Bazaar Package Importer
  • Author(s): Francesco Namuri
  • Date: 2009-03-12 11:15:55 UTC
  • mfrom: (1.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090312111555-p23eumideuqe5wzw
Tags: 4.0.2-2
debian/rules: added to clean target the deletion of another file generated
by the configuration (config.log).

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 
21
21
#include "homebank.h"
22
22
 
23
 
#include "def_lists.h"
24
 
#include "def_category.h"
 
23
#include "ui_category.h"
25
24
#include "def_budget.h"
 
25
#include "ui_category.h"
26
26
 
27
27
/****************************************************************************/
28
28
/* Debug macros                                                             */
91
91
"Dec"
92
92
};
93
93
 
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);
 
101
 
 
102
GtkWidget *defbudget_list_new(void);
104
103
 
105
104
/*
106
105
**
107
106
*/
108
 
gchar *defbudget_getcsvbudgetstr(Category *item)
 
107
static gchar *defbudget_getcsvbudgetstr(Category *item)
109
108
{
110
109
gchar *retval = NULL;
111
110
char buf[G_ASCII_DTOSTR_BUF_SIZE];
152
151
}
153
152
 
154
153
 
 
154
static gint defbudget_category_exists (GtkTreeModel *model, gchar *level, gchar *type, gchar *name, GtkTreeIter *return_iter)
 
155
{
 
156
GtkTreeIter  iter, child;
 
157
gboolean     valid;
 
158
Category *entry;
 
159
gint pos = 0;
 
160
 
 
161
    if(model == NULL)
 
162
                return 0;
 
163
 
 
164
    valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
 
165
 
 
166
    while (valid)
 
167
    {
 
168
                gtk_tree_model_get (model, &iter, LST_DEFCAT_DATAS, &entry, -1);
 
169
 
 
170
                if(*level == '1')
 
171
                {
 
172
                        if(entry->name && g_ascii_strcasecmp(name, entry->name) == 0)
 
173
                        {
 
174
                                *return_iter = iter;
 
175
                                return pos;
 
176
                        }
 
177
                }
 
178
                else
 
179
                {
 
180
                        if(*level == '2')
 
181
                        {
 
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);
 
184
                                while(n_child > 0)
 
185
                                {
 
186
 
 
187
                                        gtk_tree_model_get(GTK_TREE_MODEL(model), &child,
 
188
                                                LST_DEFCAT_DATAS, &entry,
 
189
                                                -1);
 
190
 
 
191
                                        if(entry->name && g_ascii_strcasecmp(name, entry->name) == 0)
 
192
                                        {
 
193
                                                *return_iter = child;
 
194
                                                return pos;
 
195
                                        }
 
196
 
 
197
                                        n_child--;
 
198
                                        gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &child);
 
199
                                        pos++;
 
200
                                }
 
201
                        }
 
202
                }
 
203
                valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
 
204
                pos++;
 
205
    }
 
206
 
 
207
        return 0;
 
208
}
 
209
 
155
210
 
156
211
static void defbudget_load_csv( GtkWidget *widget, gpointer user_data)
157
212
{
186
241
                                        break;
187
242
                                if( io_stat == G_IO_STATUS_NORMAL)
188
243
                                {
189
 
                                        if( tmpstr != "")
 
244
                                        if( tmpstr != NULL)
190
245
                                        {
191
246
                                        gchar **str_array;
192
247
 
202
257
                                                }
203
258
                                                DB( g_print(" read %s : %s : %s\n", str_array[0], str_array[1], str_array[2]) );
204
259
 
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);
206
261
 
207
262
                                                DB( g_print(" pos=%d\n", pos) );
208
263
 
258
313
                                }
259
314
 
260
315
                        }
 
316
                        
261
317
                        g_io_channel_unref (io);
262
318
 
263
319
                        if( error == TRUE )
318
374
                                //level 1: category
319
375
                                        if( category->flags & GF_BUDGET )
320
376
                                        {
321
 
                                                type = category->flags & GF_CUSTOM ? ' ' : '*';
 
377
                                                type = (category->flags & GF_CUSTOM) ? ' ' : '*';
322
378
 
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);
327
383
                                                g_free(outstr);
328
384
                                                g_free(outvalstr);
340
396
                                                if( outvalstr )
341
397
                                                {
342
398
                                                        outstr = g_strdup_printf("2; ;%s;%s\n", category->name, outvalstr);
343
 
                                                        DB( g_print("%s\n", outstr) );
 
399
                                                        DB( g_print("%s", outstr) );
344
400
                                                        g_io_channel_write_chars(io, outstr, -1, NULL, NULL);
345
401
                                                        g_free(outstr);
346
402
                                                }
371
427
/*
372
428
**
373
429
*/
374
 
void defbudget_update(GtkWidget *treeview, gpointer user_data)
 
430
static void defbudget_update(GtkWidget *treeview, gpointer user_data)
375
431
{
376
432
struct defbudget_data *data;
377
433
gboolean name, custom, sensitive;
415
471
/*
416
472
**
417
473
*/
418
 
void defbudget_clear(GtkWidget *widget, gpointer user_data)
 
474
static void defbudget_clear(GtkWidget *widget, gpointer user_data)
419
475
{
420
476
struct defbudget_data *data;
421
477
gint i;
446
502
/*
447
503
**
448
504
*/
449
 
void defbudget_set(GtkWidget *widget, gpointer user_data)
 
505
static void defbudget_set(GtkWidget *widget, gpointer user_data)
450
506
{
451
507
struct defbudget_data *data;
452
508
gint active;
480
536
/*
481
537
**
482
538
*/
483
 
void defbudget_get(GtkWidget *widget, gpointer user_data)
 
539
static void defbudget_get(GtkWidget *widget, gpointer user_data)
484
540
{
485
541
struct defbudget_data *data;
486
542
gboolean budget;
527
583
/*
528
584
**
529
585
*/
530
 
void defbudget_selection_change(GtkWidget *treeview, gpointer user_data)
 
586
static void defbudget_selection_change(GtkWidget *treeview, gpointer user_data)
531
587
{
532
588
struct defbudget_data *data;
533
589
 
540
596
GtkTreeIter iter;
541
597
 
542
598
        data->cat = NULL;
 
599
        
543
600
        if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_cat)), &model, &iter))
544
601
        {
545
602
        Category *item;
558
615
 
559
616
}
560
617
 
561
 
void defbudget_toggle(GtkRadioButton *radiobutton, gpointer user_data)
 
618
static void defbudget_toggle(GtkRadioButton *radiobutton, gpointer user_data)
562
619
{
563
620
 
564
621
struct defbudget_data *data;
567
624
 
568
625
        DB( g_print("(defbudget) toggle\n") );
569
626
 
570
 
        defbudget_get(GTK_WIDGET(radiobutton), (gpointer)FIELD_TYPE);
 
627
        defbudget_get(GTK_WIDGET(radiobutton), GINT_TO_POINTER(FIELD_TYPE));
571
628
 
572
629
        //data->custom ^= 1;
573
630
        defbudget_update(GTK_WIDGET(radiobutton), NULL);
584
641
/*
585
642
**
586
643
*/
587
 
gboolean defbudget_cleanup(struct defbudget_data *data, gint result)
 
644
static gboolean defbudget_cleanup(struct defbudget_data *data, gint result)
588
645
{
589
646
gboolean doupdate = FALSE;
590
 
GList *s_list, *d_list;
591
 
gint i;
592
647
 
593
648
        DB( g_print("(defbudget) cleanup\n") );
594
649
 
595
 
        if(result == GTK_RESPONSE_ACCEPT)
596
 
        {
597
650
                //do_application_specific_something ();
598
651
                DB( g_print(" accept\n") );
599
652
 
600
 
                s_list = g_list_first(data->tmp_list);
601
 
                d_list = g_list_first(GLOBALS->cat_list);
602
 
                while (s_list != NULL)
603
 
                {
604
 
                Category *s_item = s_list->data;
605
 
                Category *d_item = d_list->data;
606
 
 
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) );
609
 
 
610
 
                /* copy flags & budget */
611
 
                        d_item->flags = s_item->flags;
612
 
                        for(i=0;i<13;i++)
613
 
                        {
614
 
                                d_item->budget[i] = s_item->budget[i];
615
 
                        }
616
 
 
617
 
                        s_list = g_list_next(s_list);
618
 
                        d_list = g_list_next(d_list);
619
 
                }
620
 
 
621
653
                GLOBALS->change += data->change;
622
654
 
623
 
        }
624
 
 
625
655
        DB( g_print(" free tmp_list\n") );
626
656
 
627
 
        da_category_destroy(data->tmp_list);
628
 
 
629
 
 
630
657
        return doupdate;
631
658
}
632
659
 
634
661
/*
635
662
**
636
663
*/
637
 
void defbudget_setup(struct defbudget_data *data)
 
664
static void defbudget_setup(struct defbudget_data *data)
638
665
{
639
 
GList *list;
640
666
 
641
667
        DB( g_print("(defbudget) setup\n") );
642
668
 
644
670
        data->change = 0;
645
671
        data->cat = NULL;
646
672
 
647
 
        /* first: clone our cat glist, its simpler later ! */
648
 
        list = g_list_first(GLOBALS->cat_list);
649
 
        while (list != NULL)
650
 
        {
651
 
        Category *newitem = da_category_clone(list->data);
652
 
 
653
 
                data->tmp_list = g_list_append(data->tmp_list, newitem);
654
 
 
655
 
                //DB( g_printf(" clone_list (%d): %08x -> %08x\n", datalength, list->data, ptr) );
656
 
 
657
 
                list = g_list_next(list);
658
 
        }
659
 
 
660
 
        populate_view_cat(data->LV_cat, data->tmp_list, FALSE);
 
673
 
 
674
        ui_cat_listview_populate(data->LV_cat);
661
675
        gtk_tree_view_expand_all (GTK_TREE_VIEW(data->LV_cat));
662
676
}
663
677
 
674
688
 
675
689
        memset(&data, 0, sizeof(struct defbudget_data));
676
690
 
677
 
      window = gtk_dialog_new_with_buttons (_("Edit Budget"),
678
 
                                            //GTK_WINDOW (do_widget),
679
 
                                            NULL,
 
691
      window = gtk_dialog_new_with_buttons (_("Manage Budget"),
 
692
                                            GTK_WINDOW(GLOBALS->mainwindow),
680
693
                                            0,
681
 
                                            GTK_STOCK_CANCEL,
682
 
                                            GTK_RESPONSE_REJECT,
683
 
                                            GTK_STOCK_OK,
 
694
                                            GTK_STOCK_CLOSE,
684
695
                                            GTK_RESPONSE_ACCEPT,
685
696
                                            NULL);
686
697
 
707
718
        //listview
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;
780
791
 
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);
785
796
 
786
797
                DB( g_print("(defbudget) %s, col=%d, row=%d", months[i], col, row) );
787
798
        }
788
799
 
789
800
        // button box
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);
794
805
 
795
806
        data.BT_import = gtk_button_new_with_mnemonic(_("_Import"));
821
832
        //data.handler_id[FIELD_INITIAL]
822
833
        for(i=0;i<13;i++)
823
834
        {
824
 
                data.spinner_hid[i] = g_signal_connect (data.spinner[i], "value-changed", G_CALLBACK (defbudget_get), (gpointer)i);
 
835
                data.spinner_hid[i] = g_signal_connect (data.spinner[i], "value-changed", G_CALLBACK (defbudget_get), GINT_TO_POINTER(i));
825
836
        }
826
837
 
827
838
        //data.custom = FALSE;
853
864
 
854
865
        return NULL;
855
866
}
 
867
 
 
868
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
869
 
 
870
/*
 
871
**
 
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.
 
876
*/
 
877
static gint defbudget_list_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata)
 
878
{
 
879
gint result = 0;
 
880
Category *entry1, *entry2;
 
881
gchar *name1, *name2;
 
882
 
 
883
        gtk_tree_model_get(model, a, LST_DEFCAT_DATAS, &entry1, -1);
 
884
        gtk_tree_model_get(model, b, LST_DEFCAT_DATAS, &entry2, -1);
 
885
 
 
886
        result = (entry1->flags & GF_INCOME) - (entry2->flags & GF_INCOME);
 
887
        if(!result)
 
888
        {
 
889
                name1 = entry1->name;
 
890
                name2 = entry2->name;
 
891
        if (name1 == NULL || name2 == NULL)
 
892
        {
 
893
          //if (name1 == NULL && name2 == NULL)
 
894
          result = (name1 == NULL) ? -1 : 1;
 
895
        }
 
896
        else
 
897
        {
 
898
          result = g_utf8_collate(name1,name2);
 
899
        }
 
900
        }
 
901
        
 
902
    return result;
 
903
}
 
904
 
 
905
/*
 
906
** draw some text from the stored data structure
 
907
*/
 
908
static void defbudget_text_cell_data_function (GtkTreeViewColumn *col,
 
909
                                GtkCellRenderer *renderer,
 
910
                                GtkTreeModel *model,
 
911
                                GtkTreeIter *iter,
 
912
                                gpointer user_data)
 
913
{
 
914
Category *entry;
 
915
gchar *name;
 
916
gchar *string;
 
917
 
 
918
        gtk_tree_model_get(model, iter, LST_DEFCAT_DATAS, &entry, -1);
 
919
 
 
920
        if(entry->key == 0)
 
921
                name = g_strdup(_("(none)"));
 
922
        else
 
923
                name = entry->name;
 
924
 
 
925
        #if MYDEBUG
 
926
                gchar type;
 
927
                type = (entry->flags & GF_INCOME) ? '+' : '-';
 
928
                string = g_strdup_printf("%s ::(f=%d, %c)", name, entry->flags, type );
 
929
        #else
 
930
                if(entry->flags & GF_BUDGET)
 
931
                {
 
932
                        if( entry->parent == 0 )
 
933
                                string = g_markup_printf_escaped("<b>%s</b>", name);
 
934
                        else
 
935
                                string = g_markup_printf_escaped("<b><i>%s</i></b>", name);
 
936
                }
 
937
                else
 
938
                {
 
939
                        if( entry->parent == 0 )
 
940
                                string = g_markup_printf_escaped("%s", name);
 
941
                        else
 
942
                                string = g_markup_printf_escaped("<i>%s</i>", name);
 
943
                }
 
944
        #endif
 
945
 
 
946
        g_object_set(renderer, "markup", string, NULL);
 
947
 
 
948
        g_free(string);
 
949
}
 
950
 
 
951
/*
 
952
**
 
953
*/
 
954
GtkWidget *defbudget_list_new(void)
 
955
{
 
956
GtkTreeStore *store;
 
957
GtkWidget *view;
 
958
GtkCellRenderer    *renderer;
 
959
GtkTreeViewColumn  *column;
 
960
 
 
961
        //store
 
962
        store = gtk_tree_store_new (
 
963
                3,
 
964
                //NUM_LST_DEFCAT,
 
965
                G_TYPE_BOOLEAN,
 
966
                G_TYPE_POINTER,
 
967
                G_TYPE_UINT
 
968
                );
 
969
 
 
970
        //sortable
 
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);
 
973
 
 
974
 
 
975
        //treeview
 
976
        view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
 
977
        g_object_unref(store);
 
978
 
 
979
        /* column 1 */
 
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);
 
986
 
 
987
        gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
 
988
        //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
 
989
 
 
990
        return(view);
 
991
}
 
992
 
 
993
 
 
994