~mdoyen/homebank/5.2.x

« back to all changes in this revision

Viewing changes to src/list-scheduled.c

  • Committer: Maxime Doyen
  • Date: 2019-04-11 20:36:11 UTC
  • Revision ID: homebank@free.fr-20190411203611-pby791lywld1op5a
5.2.4 release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  HomeBank -- Free, easy, personal accounting for everyone.
 
2
 *  Copyright (C) 1995-2019 Maxime DOYEN
 
3
 *
 
4
 *  This file is part of HomeBank.
 
5
 *
 
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.
 
10
 *
 
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.
 
15
 *
 
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/>.
 
18
 */
 
19
 
 
20
 
 
21
#include "homebank.h"
 
22
 
 
23
#include "list-scheduled.h"
 
24
 
 
25
/****************************************************************************/
 
26
/* Debug macros                                                                                                                         */
 
27
/****************************************************************************/
 
28
#define MYDEBUG 0
 
29
 
 
30
#if MYDEBUG
 
31
#define DB(x) (x);
 
32
#else
 
33
#define DB(x);
 
34
#endif
 
35
 
 
36
/* our global datas */
 
37
extern struct HomeBank *GLOBALS;
 
38
extern struct Preferences *PREFS;
 
39
 
 
40
 
 
41
static void
 
42
sched_lateicon_cell_data_function (GtkTreeViewColumn *col,
 
43
                           GtkCellRenderer   *renderer,
 
44
                           GtkTreeModel      *model,
 
45
                           GtkTreeIter       *iter,
 
46
                           gpointer           user_data)
 
47
{
 
48
gchar *iconname = NULL;
 
49
gint nblate;
 
50
 
 
51
        gtk_tree_model_get(model, iter,
 
52
                LST_DSPUPC_NB_LATE, &nblate,
 
53
                -1);
 
54
 
 
55
        iconname = ( nblate > 0 ) ? ICONNAME_WARNING : NULL;
 
56
 
 
57
        g_object_set(renderer, "icon-name", iconname, NULL);
 
58
}
 
59
 
 
60
 
 
61
/*
 
62
** remaining cell function
 
63
*/
 
64
static void sched_latetext_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
65
{
 
66
Archive *arc;
 
67
gchar *markuptxt;
 
68
gchar *color;
 
69
gint nblate;
 
70
//gint weight;
 
71
 
 
72
        gtk_tree_model_get(model, iter,
 
73
                LST_DSPUPC_DATAS, &arc,
 
74
            LST_DSPUPC_NB_LATE, &nblate,
 
75
                -1);
 
76
 
 
77
        if(arc && nblate > 0)
 
78
        {
 
79
                markuptxt = g_strdup_printf(nblate < 10 ? "%d" : "+10", nblate);
 
80
 
 
81
                color = NULL;
 
82
                //weight = PANGO_WEIGHT_NORMAL;
 
83
 
 
84
                if(nblate > 0 && PREFS->custom_colors == TRUE)
 
85
                {
 
86
                        color = PREFS->color_warn;
 
87
                }
 
88
 
 
89
                g_object_set(renderer,
 
90
                        //"weight", weight,
 
91
                        "foreground",  color,
 
92
                        "text", markuptxt,
 
93
                        NULL);
 
94
 
 
95
                g_free(markuptxt);
 
96
        }
 
97
        else
 
98
                g_object_set(renderer, "text", NULL, NULL);
 
99
 
 
100
}
 
101
 
 
102
/*
 
103
** date cell function
 
104
*/
 
105
static void date_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
106
{
 
107
Archive *arc;
 
108
gchar buffer[256];
 
109
GDate *date;
 
110
 
 
111
        gtk_tree_model_get(model, iter,
 
112
                LST_DSPUPC_DATAS, &arc,
 
113
                -1);
 
114
 
 
115
        if(arc)
 
116
        {
 
117
                date = g_date_new_julian (arc->nextdate);
 
118
                g_date_strftime (buffer, 256-1, PREFS->date_format, date);
 
119
                g_date_free(date);
 
120
 
 
121
                //g_snprintf(buf, sizeof(buf), "%d", ope->ope_Date);
 
122
 
 
123
                g_object_set(renderer, "text", buffer, NULL);
 
124
 
 
125
        }
 
126
                else
 
127
                g_object_set(renderer, "text", NULL, NULL);
 
128
 
 
129
}
 
130
 
 
131
 
 
132
/*
 
133
** still cell function
 
134
*/
 
135
 
 
136
static void still_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
137
{
 
138
Archive *arc;
 
139
gchar *markuptxt;
 
140
 
 
141
        gtk_tree_model_get(model, iter,
 
142
            LST_DSPUPC_DATAS, &arc,
 
143
                -1);
 
144
 
 
145
        if(arc && (arc->flags & OF_LIMIT) )
 
146
        {
 
147
                markuptxt = g_strdup_printf("%d", arc->limit);
 
148
                g_object_set(renderer, "markup", markuptxt, NULL);
 
149
                g_free(markuptxt);
 
150
        }
 
151
        else
 
152
                g_object_set(renderer, "text", NULL, NULL);
 
153
}
 
154
 
 
155
 
 
156
/*
 
157
** payee cell function
 
158
*/
 
159
static void payee_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
160
{
 
161
Archive *arc;
 
162
Payee *pay;
 
163
 
 
164
        gtk_tree_model_get(model, iter,
 
165
                LST_DSPUPC_DATAS, &arc,
 
166
                -1);
 
167
 
 
168
        if(arc)
 
169
        {
 
170
 
 
171
                pay = da_pay_get(arc->kpay);
 
172
 
 
173
                if(pay != NULL)
 
174
                        g_object_set(renderer, "text", pay->name, NULL);
 
175
        }
 
176
                else
 
177
                g_object_set(renderer, "text", NULL, NULL);
 
178
 
 
179
}
 
180
 
 
181
/*
 
182
** memo cell function
 
183
*/
 
184
static void memo_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
185
{
 
186
Archive *arc;
 
187
gchar *memo;
 
188
gint weight;
 
189
 
 
190
        gtk_tree_model_get(model, iter,
 
191
                LST_DSPUPC_DATAS, &arc,
 
192
                LST_DSPUPC_MEMO, &memo,
 
193
                -1);
 
194
 
 
195
        weight = arc == NULL ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL;
 
196
 
 
197
        g_object_set(renderer, "weight", weight, "text", memo, NULL);
 
198
 
 
199
        //leak
 
200
        g_free(memo);
 
201
 
 
202
}
 
203
 
 
204
 
 
205
/*
 
206
** amount cell function
 
207
*/
 
208
static void amount_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
209
{
 
210
Archive *arc;
 
211
gdouble expense, income, amount;
 
212
gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
 
213
gint column = GPOINTER_TO_INT(user_data);
 
214
Account *acc;
 
215
gchar *color;
 
216
gint weight;
 
217
 
 
218
        gtk_tree_model_get(model, iter, 
 
219
            LST_DSPUPC_DATAS, &arc,
 
220
                LST_DSPUPC_ACCOUNT, &acc,
 
221
                LST_DSPUPC_EXPENSE, &expense,
 
222
            LST_DSPUPC_INCOME, &income,
 
223
            -1);
 
224
 
 
225
        amount = column == -1 ? expense : income;
 
226
                
 
227
        if( amount != 0.0)
 
228
        {
 
229
                if( acc != NULL )
 
230
                        hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, acc->kcur, GLOBALS->minor);
 
231
                else
 
232
                        hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, GLOBALS->kcur, GLOBALS->minor);
 
233
 
 
234
                color = get_normal_color_amount(amount);
 
235
 
 
236
                weight = arc == NULL ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL;
 
237
 
 
238
                g_object_set(renderer,
 
239
                        "weight", weight,
 
240
                        "foreground",  color,
 
241
                        "text", buf,
 
242
                        NULL);
 
243
        }
 
244
        else
 
245
        {
 
246
                g_object_set(renderer, "text", NULL, NULL);
 
247
        }
 
248
        
 
249
}
 
250
 
 
251
/*
 
252
** account cell function
 
253
*/
 
254
static void account_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
255
{
 
256
Account *acc;
 
257
gchar *name = NULL;
 
258
 
 
259
        gtk_tree_model_get(model, iter, 
 
260
                LST_DSPUPC_ACCOUNT, &acc,
 
261
                -1);
 
262
        /* 1378836 display acc or dstacc */
 
263
        if( acc != NULL )
 
264
        {
 
265
                name = acc->name;
 
266
        }
 
267
 
 
268
        g_object_set(renderer, "text", name, NULL);
 
269
 
 
270
}
 
271
 
 
272
 
 
273
static
 
274
gboolean list_account_selectionfunc(
 
275
GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data)
 
276
{
 
277
GtkTreeIter iter;
 
278
Archive *arc;
 
279
 
 
280
        if(gtk_tree_model_get_iter(model, &iter, path))
 
281
        {
 
282
                gtk_tree_model_get(model, &iter,
 
283
                        LST_DSPUPC_DATAS, &arc,
 
284
                    -1);
 
285
 
 
286
                if( arc == NULL )
 
287
                        return FALSE;
 
288
        }
 
289
 
 
290
        return TRUE;
 
291
}
 
292
 
 
293
 
 
294
static GtkTreeViewColumn *list_upcoming_get_column(GtkTreeView *treeview, gint uid)
 
295
{
 
296
GtkTreeViewColumn *retval = NULL;
 
297
guint i;
 
298
 
 
299
        for(i=0;i<gtk_tree_view_get_n_columns(treeview);i++)
 
300
        {
 
301
        GtkTreeViewColumn *column = gtk_tree_view_get_column(treeview, i);
 
302
 
 
303
                if(column)
 
304
                {
 
305
                        gint coluid = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(column), "uid"));
 
306
                        if( coluid == uid )
 
307
                                retval = column;
 
308
                }
 
309
        }
 
310
        return retval;  
 
311
}
 
312
 
 
313
 
 
314
static void list_upcoming_destroy(GtkTreeView *treeview, gpointer user_data)
 
315
{
 
316
GtkTreeViewColumn  *column;
 
317
 
 
318
        DB( g_print ("\n[list_upcoming] destroy\n") );
 
319
 
 
320
        column = list_upcoming_get_column(treeview, COL_DSPUPC_PAYEE);
 
321
        if( column )
 
322
        {
 
323
                PREFS->pnl_upc_col_pay_width = gtk_tree_view_column_get_width(column);
 
324
        }
 
325
        
 
326
        column = list_upcoming_get_column(treeview, COL_DSPUPC_MEMO);
 
327
        if( column )
 
328
        {
 
329
                PREFS->pnl_upc_col_mem_width = gtk_tree_view_column_get_width(column);
 
330
        }
 
331
 
 
332
        DB( g_print(" width payee:%d, memo:%d\n", PREFS->pnl_upc_col_pay_width, PREFS->pnl_upc_col_mem_width) );
 
333
 
 
334
}
 
335
 
 
336
 
 
337
GtkWidget *create_list_upcoming(void)
 
338
{
 
339
GtkListStore *store;
 
340
GtkWidget *view;
 
341
GtkCellRenderer    *renderer;
 
342
GtkTreeViewColumn  *column;
 
343
 
 
344
        DB( g_print ("\n[list_upcoming] create\n") );
 
345
 
 
346
        /* create list store */
 
347
        store = gtk_list_store_new(
 
348
                NUM_LST_DSPUPC,
 
349
                G_TYPE_POINTER, /* scheduled */
 
350
            G_TYPE_INT,         /* next (sort) */
 
351
                G_TYPE_POINTER, /* account */
 
352
            G_TYPE_STRING,      /* memo/total */
 
353
                G_TYPE_DOUBLE,  /* expense */
 
354
                G_TYPE_DOUBLE,  /* income */
 
355
                G_TYPE_INT              /* nb late */
 
356
                );
 
357
 
 
358
        //treeview
 
359
        view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
 
360
        g_object_unref(store);
 
361
 
 
362
        gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), PREFS->grid_lines);
 
363
        //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
 
364
        //                             COLUMN_DESCRIPTION);
 
365
 
 
366
        gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_SINGLE);
 
367
 
 
368
        /* column : Late */
 
369
        column = gtk_tree_view_column_new();
 
370
        //TRANSLATORS: title of list column to inform the scheduled transaction is Late
 
371
        gtk_tree_view_column_set_title(column, _("Late"));
 
372
 
 
373
        renderer = gtk_cell_renderer_pixbuf_new ();
 
374
    gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
375
        gtk_tree_view_column_set_cell_data_func(column, renderer, sched_lateicon_cell_data_function, NULL, NULL);
 
376
 
 
377
        renderer = gtk_cell_renderer_text_new ();
 
378
        g_object_set(renderer, "xalign", 1.0, NULL);
 
379
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
380
        gtk_tree_view_column_set_cell_data_func(column, renderer, sched_latetext_cell_data_function, NULL, NULL);
 
381
 
 
382
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPUPC_NB_LATE);
 
383
        gtk_tree_view_column_set_alignment (column, 0.5);
 
384
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
385
 
 
386
        /* column : Still (for limited scheduled) */
 
387
        column = gtk_tree_view_column_new();
 
388
        //TRANSLATORS: title of list column to inform how many occurence remain to post for limited scheduled txn
 
389
        gtk_tree_view_column_set_title(column, _("Still"));
 
390
 
 
391
        renderer = gtk_cell_renderer_text_new ();
 
392
        g_object_set(renderer, "xalign", 1.0, NULL);
 
393
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
394
        gtk_tree_view_column_set_cell_data_func(column, renderer, still_cell_data_function, NULL, NULL);
 
395
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPUPC_REMAINING);
 
396
        gtk_tree_view_column_set_alignment (column, 0.5);
 
397
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
398
        
 
399
        /* column: Next on */
 
400
        renderer = gtk_cell_renderer_text_new ();
 
401
 
 
402
        column = gtk_tree_view_column_new();
 
403
        gtk_tree_view_column_set_title(column, _("Next date"));
 
404
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
405
        gtk_tree_view_column_set_cell_data_func(column, renderer, date_cell_data_function, NULL, NULL);
 
406
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPUPC_DATE);
 
407
        gtk_tree_view_column_set_alignment (column, 0.5);
 
408
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
409
 
 
410
        /* column: Payee */
 
411
        renderer = gtk_cell_renderer_text_new ();
 
412
        g_object_set(renderer, 
 
413
                "ellipsize", PANGO_ELLIPSIZE_END,
 
414
            "ellipsize-set", TRUE,
 
415
            NULL);
 
416
        column = gtk_tree_view_column_new();
 
417
        g_object_set_data(G_OBJECT(column), "uid", GUINT_TO_POINTER(COL_DSPUPC_PAYEE));
 
418
        gtk_tree_view_column_set_title(column, _("Payee"));
 
419
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
420
        gtk_tree_view_column_set_cell_data_func(column, renderer, payee_cell_data_function, NULL, NULL);
 
421
        gtk_tree_view_column_set_resizable(column, TRUE);
 
422
        //gtk_tree_view_column_add_attribute(column, renderer, "text", 1);
 
423
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
 
424
        gtk_tree_view_column_set_alignment (column, 0.5);
 
425
        gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST/2);
 
426
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
427
 
 
428
        gtk_tree_view_column_set_fixed_width(column, PREFS->pnl_upc_col_pay_width);
 
429
 
 
430
        /* column: Memo */
 
431
        renderer = gtk_cell_renderer_text_new ();
 
432
        g_object_set(renderer, 
 
433
                "ellipsize", PANGO_ELLIPSIZE_END,
 
434
            "ellipsize-set", TRUE,
 
435
            NULL);
 
436
 
 
437
        column = gtk_tree_view_column_new();
 
438
        g_object_set_data(G_OBJECT(column), "uid", GUINT_TO_POINTER(COL_DSPUPC_MEMO));
 
439
        gtk_tree_view_column_set_title(column, _("Memo"));
 
440
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
441
        gtk_tree_view_column_set_cell_data_func(column, renderer, memo_cell_data_function, NULL, NULL);
 
442
        gtk_tree_view_column_set_resizable(column, TRUE);
 
443
        //gtk_tree_view_column_add_attribute(column, renderer, "text", 2);
 
444
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
 
445
        gtk_tree_view_column_set_alignment (column, 0.5);
 
446
        gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST/2);
 
447
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
448
 
 
449
        gtk_tree_view_column_set_fixed_width(column, PREFS->pnl_upc_col_mem_width);
 
450
 
 
451
        /* column: Amount */
 
452
        column = gtk_tree_view_column_new();
 
453
        gtk_tree_view_column_set_title(column, _("Expense"));
 
454
        renderer = gtk_cell_renderer_text_new ();
 
455
        g_object_set(renderer, "xalign", 1.0, NULL);
 
456
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
457
        gtk_tree_view_column_set_cell_data_func(column, renderer, amount_cell_data_function, GINT_TO_POINTER(-1), NULL);
 
458
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
 
459
        gtk_tree_view_column_set_alignment (column, 0.5);
 
460
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
461
 
 
462
        /* column: Amount */
 
463
        column = gtk_tree_view_column_new();
 
464
        gtk_tree_view_column_set_title(column, _("Income"));
 
465
        renderer = gtk_cell_renderer_text_new ();
 
466
        g_object_set(renderer, "xalign", 1.0, NULL);
 
467
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
468
        gtk_tree_view_column_set_cell_data_func(column, renderer, amount_cell_data_function, GINT_TO_POINTER(1), NULL);
 
469
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
 
470
        gtk_tree_view_column_set_alignment (column, 0.5);
 
471
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
472
 
 
473
        /* column: Account */
 
474
        renderer = gtk_cell_renderer_text_new ();
 
475
        /*g_object_set(renderer, 
 
476
                "ellipsize", PANGO_ELLIPSIZE_END,
 
477
            "ellipsize-set", TRUE,
 
478
            NULL);*/
 
479
 
 
480
        column = gtk_tree_view_column_new();
 
481
        g_object_set_data(G_OBJECT(column), "uid", GUINT_TO_POINTER(COL_DSPUPC_ACCOUNT));
 
482
        gtk_tree_view_column_set_title(column, _("Account"));
 
483
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
484
        gtk_tree_view_column_set_cell_data_func(column, renderer, account_cell_data_function, NULL, NULL);
 
485
        gtk_tree_view_column_set_resizable(column, TRUE);
 
486
        //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE);
 
487
        gtk_tree_view_column_set_alignment (column, 0.5);
 
488
        //gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST);
 
489
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
490
 
 
491
 
 
492
  /* column: empty */
 
493
        column = gtk_tree_view_column_new();
 
494
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
 
495
 
 
496
        gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), list_account_selectionfunc, NULL, NULL);
 
497
 
 
498
        
 
499
    /* set initial sort order */
 
500
    gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), LST_DSPUPC_NEXT, GTK_SORT_ASCENDING);
 
501
 
 
502
 
 
503
        g_signal_connect (view, "destroy", G_CALLBACK (list_upcoming_destroy), NULL);
 
504
 
 
505
 
 
506
        return(view);
 
507
}
 
508