]> Dogcows Code - chaz/homebank/blob - src/ui-archive.c
fc49e20ddf2869025f17036592d7c70fc8a46143
[chaz/homebank] / src / ui-archive.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2018 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 "ui-archive.h"
24 #include "ui-account.h"
25 #include "ui-category.h"
26 #include "ui-payee.h"
27 #include "ui-split.h"
28
29 #include "gtk-dateentry.h"
30
31 /****************************************************************************/
32 /* Debug macros */
33 /****************************************************************************/
34 #define MYDEBUG 0
35
36 #if MYDEBUG
37 #define DB(x) (x);
38 #else
39 #define DB(x);
40 #endif
41
42 /* our global datas */
43 extern struct HomeBank *GLOBALS;
44 extern struct Preferences *PREFS;
45
46
47 gchar *CYA_ARCHIVE_TYPE[] = {
48 N_("Scheduled"),
49 N_("Template"),
50 NULL
51 };
52
53
54 gchar *CYA_UNIT[] = { N_("Day"), N_("Week"), N_("Month"), N_("Year"), NULL };
55
56 gchar *CYA_SCHED_WEEKEND[] = { N_("Possible"), N_("Before"), N_("After"), NULL };
57
58 extern gchar *CYA_TXN_STATUS[];
59
60 static GtkWidget *ui_arc_listview_new(void);
61
62
63
64
65 static void ui_arc_listview_populate(GtkWidget *view, gint type)
66 {
67 GtkTreeModel *model;
68 GtkTreeIter iter;
69 GList *list;
70 gint i;
71
72 DB( g_print("ui_arc_listview_populate()\n") );
73
74 DB( g_print(" - type=%d\n", type) );
75
76
77 //insert all glist item into treeview
78 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
79
80
81 gtk_list_store_clear (GTK_LIST_STORE(model));
82
83 i=0;
84 list = g_list_first(GLOBALS->arc_list);
85 while (list != NULL)
86 {
87 Archive *item = list->data;
88
89 if( (type == ARC_TYPE_SCHEDULED) && !(item->flags & OF_AUTO) )
90 goto next;
91
92 if( (type == ARC_TYPE_TEMPLATE) && (item->flags & OF_AUTO) )
93 goto next;
94
95 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
96 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
97 LST_DEFARC_DATAS, item, //data struct
98 LST_DEFARC_OLDPOS, i, //oldpos
99 -1);
100
101 //DB( g_print(" populate_treeview: %d %08x\n", i, list->data) );
102 next:
103 i++; list = g_list_next(list);
104 }
105
106 }
107
108
109 static void ui_arc_listview_select_by_pointer(GtkTreeView *treeview, gpointer user_data)
110 {
111 GtkTreeModel *model;
112 GtkTreeIter iter;
113 GtkTreeSelection *selection;
114 gboolean valid;
115 Archive *arc = user_data;
116
117 model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
118 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
119
120 valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
121 while (valid)
122 {
123 Archive *tmp_arc;
124
125 gtk_tree_model_get (model, &iter, LST_DEFARC_DATAS, &tmp_arc, -1);
126 if( arc == tmp_arc )
127 {
128 gtk_tree_selection_select_iter (selection, &iter);
129 break;
130 }
131
132 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
133 }
134 }
135
136
137 /*
138 **
139 ** The function should return:
140 ** a negative integer if the first value comes before the second,
141 ** 0 if they are equal,
142 ** or a positive integer if the first value comes after the second.
143 */
144 static gint ui_arc_listview_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata)
145 {
146 gint sortcol = GPOINTER_TO_INT(userdata);
147 Archive *entry1, *entry2;
148 gint retval = 0;
149
150 gtk_tree_model_get(model, a, LST_DEFARC_DATAS, &entry1, -1);
151 gtk_tree_model_get(model, b, LST_DEFARC_DATAS, &entry2, -1);
152
153 switch (sortcol)
154 {
155 case LST_DEFARC_SORT_MEMO:
156 retval = (entry1->flags & GF_INCOME) - (entry2->flags & GF_INCOME);
157 if(!retval)
158 {
159 retval = hb_string_utf8_compare(entry1->memo, entry2->memo);
160 }
161 break;
162 case LST_DEFARC_SORT_PAYEE:
163 {
164 Payee *p1, *p2;
165
166 p1 = da_pay_get(entry1->kpay);
167 p2 = da_pay_get(entry2->kpay);
168 if( p1 != NULL && p2 != NULL )
169 {
170 retval = hb_string_utf8_compare(p1->name, p2->name);
171 }
172 }
173 break;
174 default:
175 g_return_val_if_reached(0);
176 }
177 return retval;
178 }
179
180
181 /*
182 **
183 */
184 static void ui_arc_listview_auto_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
185 {
186 Archive *item;
187 gchar *iconname = NULL;
188
189 // get the transaction
190 gtk_tree_model_get(model, iter, LST_DEFARC_DATAS, &item, -1);
191
192 iconname = ( item->flags & OF_AUTO ) ? ICONNAME_HB_OPE_AUTO : NULL;
193
194 g_object_set(renderer, "icon-name", iconname, NULL);
195 }
196
197
198 /*
199 ** draw some text from the stored data structure
200 */
201 static void ui_arc_listview_cell_data_function_memo (GtkTreeViewColumn *col,
202 GtkCellRenderer *renderer,
203 GtkTreeModel *model,
204 GtkTreeIter *iter,
205 gpointer user_data)
206 {
207 Archive *item;
208 gchar *name;
209
210 gtk_tree_model_get(model, iter, LST_DEFARC_DATAS, &item, -1);
211
212 name = item->memo;
213
214 g_object_set(renderer, "text", name, NULL);
215 }
216
217
218
219 static void ui_arc_listview_cell_data_function_payee (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
220 {
221 Archive *arc;
222 Payee *pay;
223
224 gtk_tree_model_get(model, iter,
225 LST_DEFARC_DATAS, &arc,
226 -1);
227
228 if(arc)
229 {
230
231 pay = da_pay_get(arc->kpay);
232
233 if(pay != NULL)
234 g_object_set(renderer, "text", pay->name, NULL);
235 }
236 else
237 g_object_set(renderer, "text", NULL, NULL);
238
239 }
240
241 /*
242 **
243 */
244 static GtkWidget *ui_arc_listview_new(void)
245 {
246 GtkListStore *store;
247 GtkWidget *view;
248 GtkCellRenderer *renderer;
249 GtkTreeViewColumn *column;
250
251 //store
252 store = gtk_list_store_new (
253 NUM_LST_DEFARC,
254 G_TYPE_POINTER,
255 G_TYPE_UINT,
256 G_TYPE_BOOLEAN
257 );
258
259 //treeview
260 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
261 g_object_unref(store);
262
263 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), PREFS->grid_lines);
264
265 /* column: Memo */
266 renderer = gtk_cell_renderer_text_new ();
267 g_object_set(renderer,
268 "ellipsize", PANGO_ELLIPSIZE_END,
269 "ellipsize-set", TRUE,
270 NULL);
271
272 column = gtk_tree_view_column_new();
273 gtk_tree_view_column_set_title(column, _("Memo"));
274 gtk_tree_view_column_pack_start(column, renderer, TRUE);
275 gtk_tree_view_column_set_cell_data_func(column, renderer, ui_arc_listview_cell_data_function_memo, GINT_TO_POINTER(LST_DEFARC_SORT_MEMO), NULL);
276 gtk_tree_view_column_set_sort_column_id (column, LST_DEFARC_SORT_MEMO);
277 gtk_tree_view_column_set_alignment (column, 0.5);
278 gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST);
279 gtk_tree_view_column_set_resizable(column, TRUE);
280 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
281
282 /* column: Payee */
283 renderer = gtk_cell_renderer_text_new ();
284 g_object_set(renderer,
285 "ellipsize", PANGO_ELLIPSIZE_END,
286 "ellipsize-set", TRUE,
287 NULL);
288 column = gtk_tree_view_column_new();
289 gtk_tree_view_column_set_title(column, _("Payee"));
290 gtk_tree_view_column_pack_start(column, renderer, TRUE);
291 gtk_tree_view_column_set_cell_data_func(column, renderer, ui_arc_listview_cell_data_function_payee, GINT_TO_POINTER(LST_DEFARC_SORT_PAYEE), NULL);
292 gtk_tree_view_column_set_resizable(column, TRUE);
293 //gtk_tree_view_column_add_attribute(column, renderer, "text", 1);
294 gtk_tree_view_column_set_sort_column_id (column, LST_DEFARC_SORT_PAYEE);
295 gtk_tree_view_column_set_alignment (column, 0.5);
296 gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST);
297 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
298
299
300 /* column: Scheduled icon */
301 column = gtk_tree_view_column_new();
302 renderer = gtk_cell_renderer_pixbuf_new ();
303 //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1);
304 gtk_tree_view_column_pack_start(column, renderer, TRUE);
305 gtk_tree_view_column_set_cell_data_func(column, renderer, ui_arc_listview_auto_cell_data_function, NULL, NULL);
306 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
307
308
309 //sortable
310 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DEFARC_SORT_MEMO, ui_arc_listview_compare_func, GINT_TO_POINTER(LST_DEFARC_SORT_MEMO), NULL);
311 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), LST_DEFARC_SORT_PAYEE, ui_arc_listview_compare_func, GINT_TO_POINTER(LST_DEFARC_SORT_PAYEE), NULL);
312
313
314 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), LST_DEFARC_SORT_MEMO, GTK_SORT_ASCENDING);
315
316 //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
317 //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
318
319 return(view);
320 }
321
322
323 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
324
325
326
327 /*
328 ** add an empty new account to our temp GList and treeview
329 */
330 static void ui_arc_manage_add(GtkWidget *widget, gpointer user_data)
331 {
332 struct ui_arc_manage_data *data;
333 GtkTreeModel *model;
334 GtkTreeIter iter;
335 Archive *item;
336 gint type;
337
338 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
339 DB( g_print("\n[ui_scheduled] add\n") );
340
341 model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_arc));
342
343 item = da_archive_malloc();
344 item->memo = g_strdup_printf(_("(template %d)"), g_list_length(GLOBALS->arc_list) + 1);
345 item->unit = 2;
346
347 type = radio_get_active(GTK_CONTAINER(data->RA_type)) == 1 ? ARC_TYPE_TEMPLATE : ARC_TYPE_SCHEDULED;
348 if( type == ARC_TYPE_SCHEDULED )
349 item->flags |= OF_AUTO;
350
351 GLOBALS->arc_list = g_list_append(GLOBALS->arc_list, item);
352
353 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
354 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
355 LST_DEFARC_DATAS, item,
356 LST_DEFARC_OLDPOS, 0,
357 -1);
358
359 gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc)), &iter);
360
361 data->change++;
362 }
363
364 /*
365 ** delete the selected account to our treeview and temp GList
366 */
367 static void ui_arc_manage_delete(GtkWidget *widget, gpointer user_data)
368 {
369 struct ui_arc_manage_data *data;
370 GtkTreeSelection *selection;
371 GtkTreeModel *model;
372 GtkTreeIter iter;
373 Archive *item;
374 gint result;
375
376 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
377 DB( g_print("\n[ui_scheduled] delete (data=%p)\n", data) );
378
379 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc));
380 //if true there is a selected node
381 if (gtk_tree_selection_get_selected(selection, &model, &iter))
382 {
383 gchar *title;
384 gchar *secondtext;
385
386 gtk_tree_model_get(model, &iter, LST_DEFARC_DATAS, &item, -1);
387
388 title = g_strdup_printf (
389 _("Are you sure you want to permanently delete '%s'?"), item->memo);
390
391 secondtext = _("If you delete a scheduled/template, it will be permanently lost.");
392
393 result = ui_dialog_msg_confirm_alert(
394 GTK_WINDOW(data->window),
395 title,
396 secondtext,
397 _("_Delete")
398 );
399
400 g_free(title);
401
402 if( result == GTK_RESPONSE_OK )
403 {
404 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
405
406 GLOBALS->arc_list = g_list_remove(GLOBALS->arc_list, item);
407
408 data->change++;
409
410 }
411 //DB( g_print(" delete =%08x (pos=%d)\n", entry, g_list_index(data->tmp_list, entry) ) );
412 }
413 }
414
415
416 /*
417 ** update the archive name everytime it changes
418 */
419 static void ui_arc_manage_rename(GtkWidget *widget, gpointer user_data)
420 {
421 struct ui_arc_manage_data *data;
422 GtkTreeSelection *selection;
423 GtkTreeModel *model;
424 GtkTreeIter iter;
425 gchar *txt;
426 Archive *item;
427
428 DB( g_print("\n[ui_scheduled] rename\n") );
429
430 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
431
432 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc));
433 //if true there is a selected node
434 if (gtk_tree_selection_get_selected(selection, &model, &iter))
435 {
436 gtk_tree_model_get(model, &iter, LST_DEFARC_DATAS, &item, -1);
437
438 DB( g_print(" -> %s\n", item->memo) );
439
440 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_word));
441 // ignore if entry is empty
442 if (txt && *txt)
443 {
444 g_free(item->memo);
445 item->memo = g_strdup(txt);
446 }
447
448 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_arc));
449
450 }
451
452 }
453
454
455
456
457 /*
458 ** set widgets contents from the selected account
459 */
460 static void ui_arc_manage_set(GtkWidget *widget, gpointer user_data)
461 {
462 struct ui_arc_manage_data *data;
463 GtkTreeSelection *selection;
464 GtkTreeModel *model;
465 GtkTreeIter iter;
466 Archive *item;
467
468 DB( g_print("\n[ui_scheduled] set\n") );
469
470 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
471
472 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc));
473 //if true there is a selected node
474 if (gtk_tree_selection_get_selected(selection, &model, &iter))
475 {
476 gtk_tree_model_get(model, &iter, LST_DEFARC_DATAS, &item, -1);
477
478 g_signal_handler_block(data->ST_word, data->handler_id[HID_ARC_MEMO]);
479 gtk_entry_set_text(GTK_ENTRY(data->ST_word), item->memo);
480 g_signal_handler_unblock(data->ST_word, data->handler_id[HID_ARC_MEMO]);
481
482 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), item->amount);
483
484 radio_set_active(GTK_CONTAINER(data->RA_status), item->status );
485
486
487 /*g_signal_handler_block(data->CM_valid, data->handler_id[HID_ARC_VALID]);
488 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_valid), (item->flags & OF_VALID) ? 1 : 0);
489 g_signal_handler_unblock(data->CM_valid, data->handler_id[HID_ARC_VALID]);
490
491 g_signal_handler_block(data->CM_remind, data->handler_id[HID_ARC_REMIND]);
492 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_remind), (item->flags & OF_REMIND) ? 1 : 0);
493 g_signal_handler_unblock(data->CM_remind, data->handler_id[HID_ARC_REMIND]);
494 */
495
496 gtk_combo_box_set_active(GTK_COMBO_BOX(data->NU_mode), item->paymode);
497
498 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_cheque), (item->flags & OF_CHEQ2) ? 1 : 0);
499
500 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), item->kcat);
501
502 DB( g_print(" -> set payee %d\n", item->kpay) );
503 ui_pay_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_pay), item->kpay);
504
505 DB( g_print(" -> PO_acc %d\n", item->kacc) );
506 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_acc), item->kacc);
507
508 DB( g_print(" -> PO_accto %d\n", item->kxferacc) );
509 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), item->kxferacc);
510
511 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_auto), (item->flags & OF_AUTO) ? 1 : 0);
512 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_every), item->every);
513 gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_unit), item->unit);
514 gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_next), item->nextdate);
515 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_limit), (item->flags & OF_LIMIT) ? 1 : 0);
516 DB( g_print("nb_limit = %d %g\n", item->limit, (gdouble)item->limit) );
517 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NB_limit), (gdouble)item->limit);
518 radio_set_active(GTK_CONTAINER(data->CY_weekend), item->weekend);
519 }
520 }
521
522
523 /*
524 ** get widgets contents to the selected account
525 */
526 static void ui_arc_manage_getlast(struct ui_arc_manage_data *data)
527 {
528 Archive *item;
529 gchar *txt;
530 gdouble value;
531 gint active;
532
533
534 DB( g_print("\n[ui_scheduled] getlast\n") );
535
536 item = data->lastarcitem;
537
538 if( item != NULL )
539 {
540 DB( g_print(" -> %s\n", item->memo) );
541
542 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_arc));
543
544 txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_word));
545 // ignore if entry is empty
546 if (txt && *txt)
547 {
548 g_free(item->memo);
549 item->memo = g_strdup(txt);
550 }
551
552 gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_amount));
553 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
554 item->amount = value;
555
556 item->paymode = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
557 item->kcat = ui_cat_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_grp));
558 item->kpay = ui_pay_comboboxentry_get_key_add_new(GTK_COMBO_BOX(data->PO_pay));
559 item->kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
560 item->kxferacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto));
561
562 item->status = radio_get_active(GTK_CONTAINER(data->RA_status));
563
564 //#1615245: moved here, after get combo entry key
565 if( item->paymode != PAYMODE_INTXFER )
566 {
567 //#677351: revert kxferacc to 0
568 item->kxferacc = 0;
569 }
570
571 /* flags */
572 //item->flags = 0;
573 item->flags &= (OF_SPLIT); //(split is set in hb_archive)
574
575 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cheque));
576 if(active == 1) item->flags |= OF_CHEQ2;
577
578 //active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_amount));
579 active = item->amount > 0 ? TRUE : FALSE;
580 if(active == TRUE) item->flags |= OF_INCOME;
581
582
583 /* -- automated -- */
584
585 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_auto));
586 if(active == 1) item->flags |= OF_AUTO;
587
588 gtk_spin_button_update(GTK_SPIN_BUTTON(data->NB_every));
589 item->every = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->NB_every));
590 item->unit = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_unit));
591 item->nextdate = gtk_date_entry_get_date(GTK_DATE_ENTRY(data->PO_next));
592
593 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_limit));
594 if(active == 1) item->flags |= OF_LIMIT;
595
596 gtk_spin_button_update(GTK_SPIN_BUTTON(data->NB_limit));
597 item->limit = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->NB_limit));
598
599 item->weekend = radio_get_active(GTK_CONTAINER(data->CY_weekend));
600
601 data->change++;
602 }
603 }
604
605
606 static void ui_arc_manage_update_accto(GtkWidget *widget, gpointer user_data)
607 {
608 struct ui_arc_manage_data *data;
609 guint kacc, kdst;
610
611 DB( g_print("\n\n[ui_scheduled] update accto\n") );
612
613 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
614
615 kacc = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc));
616 kdst = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_accto));
617
618 DB( g_print(" ksrc=%d, kdst=%d\n", kacc, kdst) );
619
620 ui_acc_comboboxentry_populate_except(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, kacc, ACC_LST_INSERT_NORMAL);
621
622 if( (kacc == 0) || (kacc == kdst) )
623 {
624 ui_acc_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_accto), 0);
625 }
626
627 }
628
629
630 /*
631 **
632 */
633 static void ui_arc_manage_paymode(GtkWidget *widget, gpointer user_data)
634 {
635 struct ui_arc_manage_data *data;
636 gint payment;
637 gint page;
638 gboolean sensitive;
639
640 DB( g_print("\n[ui_scheduled] paymode\n") );
641
642 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
643
644 //DB( g_print(" widget=%p, data=%p\n", widget, data) );
645
646
647 payment = gtk_combo_box_get_active(GTK_COMBO_BOX(data->NU_mode));
648 page = 0;
649
650 if(payment == PAYMODE_CHECK)
651 page = 1;
652
653 sensitive = page == 1 ? TRUE : FALSE;
654 hb_widget_visible(data->CM_cheque, sensitive);
655
656 if(payment == PAYMODE_INTXFER)
657 {
658 page = 2;
659 ui_arc_manage_update_accto(widget, user_data);
660 }
661
662 DB( g_print(" payment: %d, page: %d\n", payment, page) );
663
664 sensitive = page == 2 ? TRUE : FALSE;
665 hb_widget_visible(data->LB_accto, sensitive);
666 hb_widget_visible(data->PO_accto, sensitive);
667
668 DB( g_print(" visible: %d\n", sensitive) );
669
670 }
671
672 /*
673 **
674 */
675 static void ui_arc_manage_scheduled(GtkWidget *widget, gpointer user_data)
676 {
677 struct ui_arc_manage_data *data;
678 Archive *arcitem;
679 GtkTreeModel *model;
680 GtkTreeIter iter;
681 GtkTreePath *path;
682 gboolean selected, sensitive;
683
684 DB( g_print("\n[ui_scheduled] scheduled\n") );
685
686 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
687
688 sensitive = FALSE;
689
690
691 selected = gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc)), &model, &iter);
692 if(selected)
693 {
694 gtk_tree_model_get(model, &iter, LST_DEFARC_DATAS, &arcitem, -1);
695
696 arcitem->flags &= ~(OF_AUTO);
697 sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_auto)) ? TRUE : FALSE;
698 if(sensitive)
699 arcitem->flags |= OF_AUTO;
700 }
701
702
703
704 gtk_widget_set_sensitive(data->LB_next, sensitive);
705 gtk_widget_set_sensitive(data->PO_next, sensitive);
706
707 gtk_widget_set_sensitive(data->LB_every, sensitive);
708 gtk_widget_set_sensitive(data->NB_every, sensitive);
709
710 gtk_widget_set_sensitive(data->LB_weekend, sensitive);
711 gtk_widget_set_sensitive(data->CY_weekend, sensitive);
712
713 gtk_widget_set_sensitive(data->CY_unit, sensitive);
714 gtk_widget_set_sensitive(data->CM_limit, sensitive);
715
716 gtk_widget_set_sensitive(data->LB_posts, sensitive);
717
718
719 sensitive = (sensitive == TRUE) ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_limit)) : sensitive;
720 gtk_widget_set_sensitive(data->NB_limit, sensitive);
721
722 if(selected)
723 {
724 /* redraw the row to display/hide the icon */
725 path = gtk_tree_model_get_path(model, &iter);
726 gtk_tree_model_row_changed(model, path, &iter);
727 gtk_tree_path_free (path);
728
729 // gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_arc));
730 //gtk_widget_queue_draw (GTK_WIDGET(data->LV_arc));
731 }
732
733 }
734
735 static void ui_arc_manage_update_post_split(GtkWidget *widget, gdouble amount)
736 {
737 struct ui_arc_manage_data *data;
738 gboolean sensitive = TRUE;
739
740 DB( g_print("(ui_arc_manage) update _post_split\n") );
741
742 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
743
744 DB( g_print("- amount=%.2f\n", amount) );
745
746 data->lastarcitem->amount = amount;
747 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), amount);
748
749 data->lastarcitem->flags &= ~(OF_SPLIT); //First set flag that Splits are cleared
750
751 if (da_splits_count(data->lastarcitem->splits) > 0)
752 {
753 /* disable category if split is set */
754 data->lastarcitem->flags |= OF_SPLIT; //Then set flag that Splits are active
755 sensitive = FALSE;
756 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0);
757 }
758 gtk_widget_set_sensitive(data->ST_amount, sensitive);
759
760 //# 1416624 empty category when split
761 if( (data->lastarcitem->flags & (OF_SPLIT)) )
762 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0);
763 gtk_widget_set_sensitive(data->PO_grp, sensitive);
764
765 }
766
767
768 /*
769 ** update the widgets status and contents from action/selection value
770 */
771 static void ui_arc_manage_update(GtkWidget *widget, gpointer user_data)
772 {
773 struct ui_arc_manage_data *data;
774 GtkTreeModel *model;
775 GtkTreeIter iter;
776 gboolean selected, sensitive;
777 gboolean split_sensitive = TRUE;
778 Archive *arcitem;
779
780
781 DB( g_print("\n[ui_scheduled] update\n") );
782
783 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
784 //window = gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW);
785 //DB( g_print("\n[ui_scheduled] widget=%08lx, window=%08lx, inst_data=%08lx\n", treeview, window, data) );
786
787 //if true there is a selected node
788 selected = gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_arc)), &model, &iter);
789
790 DB( g_print(" selected = %d\n", selected) );
791
792 sensitive = (selected == TRUE) ? TRUE : FALSE;
793
794 gtk_widget_set_sensitive(data->GR_txnleft, sensitive);
795 gtk_widget_set_sensitive(data->LB_schedinsert, sensitive);
796
797 gtk_widget_set_sensitive(data->CM_auto, sensitive);
798
799 gtk_widget_set_sensitive(data->BT_rem, sensitive);
800
801 if(selected)
802 {
803 gtk_tree_model_get(model, &iter, LST_DEFARC_DATAS, &arcitem, -1);
804
805 if(data->lastarcitem != NULL && arcitem != data->lastarcitem)
806 {
807 DB( g_print(" -> should do a get for last selected (%s)\n", data->lastarcitem->memo) );
808 ui_arc_manage_getlast(data);
809 }
810 data->lastarcitem = arcitem;
811
812 if (da_splits_count(data->lastarcitem->splits) > 0)
813 {
814
815 data->lastarcitem->flags |= OF_SPLIT; //Then set flag that Splits are active
816 split_sensitive = FALSE;
817 ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), 0);
818 }
819
820 gtk_widget_set_sensitive(data->ST_amount, split_sensitive);
821 gtk_widget_set_sensitive(data->PO_grp, split_sensitive);
822
823 DB( g_print(" - call set\n") );
824 ui_arc_manage_set(widget, NULL);
825 }
826 else
827 {
828 data->lastarcitem = NULL;
829 }
830
831 //gtk_widget_set_sensitive(data->LB_schedinsert, sensitive);
832
833
834 DB( g_print(" - call scheduled\n") );
835 ui_arc_manage_scheduled(widget, NULL);
836 DB( g_print(" - call paymode\n") );
837 ui_arc_manage_paymode(widget,NULL);
838
839
840 }
841
842
843
844 /*
845 **
846 */
847 static void ui_arc_manage_toggleamount(GtkWidget *widget, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
848 {
849 struct ui_arc_manage_data *data;
850 gdouble value;
851
852 DB( g_print("\n[ui_scheduled] toggleamount\n") );
853
854 if(icon_pos == GTK_ENTRY_ICON_PRIMARY)
855 {
856
857 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
858
859 gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_amount));
860
861 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
862 value *= -1;
863 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value);
864
865 /*
866 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
867 type = gtk_widget_get_sensitive(data->CY_amount);
868
869 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), value * type);
870 */
871 }
872
873 }
874
875
876 static void defarchive_button_split_cb(GtkWidget *widget, gpointer user_data)
877 {
878 struct ui_arc_manage_data *data;
879 gdouble amount;
880
881 DB( g_print("\n[ui_scheduled] doing split\n") );
882
883 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
884
885 amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
886
887 ui_split_dialog(data->window, data->lastarcitem->splits, amount, &ui_arc_manage_update_post_split);
888
889 }
890
891
892 static void ui_arc_manage_selection(GtkTreeSelection *treeselection, gpointer user_data)
893 {
894 DB( g_print("\n[ui_scheduled] selection\n") );
895
896 DB( g_print(" - call update\n") );
897 ui_arc_manage_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection)), NULL);
898 }
899
900
901 static void ui_arc_manage_populate_listview(struct ui_arc_manage_data *data)
902 {
903 gint type;
904
905 DB( g_print("\n[ui_scheduled] populate listview\n") );
906
907 type = radio_get_active(GTK_CONTAINER(data->RA_type)) == 1 ? ARC_TYPE_TEMPLATE : ARC_TYPE_SCHEDULED;
908 ui_arc_listview_populate(data->LV_arc, type);
909 gtk_tree_view_expand_all (GTK_TREE_VIEW(data->LV_arc));
910 }
911
912
913
914
915 static gboolean ui_arc_manage_cleanup(struct ui_arc_manage_data *data, gint result)
916 {
917 gboolean doupdate = FALSE;
918
919 DB( g_print("\n[ui_scheduled] cleanup\n") );
920
921
922 if(data->lastarcitem != NULL)
923 {
924 DB( g_print(" -> should do a get for last selected (%s)\n", data->lastarcitem->memo) );
925 ui_arc_manage_getlast(data);
926 }
927
928 GLOBALS->arc_list = da_archive_sort(GLOBALS->arc_list);
929
930 GLOBALS->changes_count += data->change;
931
932 return doupdate;
933 }
934
935 /*
936 **
937 */
938 static void ui_arc_manage_setup(struct ui_arc_manage_data *data)
939 {
940
941 DB( g_print("\n[ui_scheduled] setup\n") );
942
943 //init GList
944 data->tmp_list = NULL; //hb-glist_clone_list(GLOBALS->arc_list, sizeof(struct _Archive));
945 data->change = 0;
946 data->lastarcitem = NULL;
947
948 //hb-glist_populate_treeview(data->tmp_list, data->LV_arc, LST_DEFARC_DATAS, LST_DEFARC_OLDPOS);
949
950 //insert all glist item into treeview
951 ui_arc_manage_populate_listview(data);
952
953 DB( g_print(" - populate boxentries\n") );
954
955 ui_pay_comboboxentry_populate(GTK_COMBO_BOX(data->PO_pay) , GLOBALS->h_pay);
956 ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data->PO_grp) , GLOBALS->h_cat);
957 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data->PO_acc) , GLOBALS->h_acc, ACC_LST_INSERT_NORMAL);
958 ui_acc_comboboxentry_populate(GTK_COMBO_BOX(data->PO_accto), GLOBALS->h_acc, ACC_LST_INSERT_NORMAL);
959 }
960
961
962 static GtkWidget *ui_arc_manage_create_left_txn(struct ui_arc_manage_data *data)
963 {
964 GtkWidget *group_grid, *hbox, *label, *widget, *image;
965 gint row;
966
967 // group :: Transaction detail
968 group_grid = gtk_grid_new ();
969 data->GR_txnleft = group_grid;
970 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
971 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
972
973 row = 0;
974 label = make_label_widget(_("_Amount:"));
975 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
976 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
977 gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 1, 1);
978
979 widget = make_amount(label);
980 data->ST_amount = widget;
981 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_PRIMARY, ICONNAME_HB_TOGGLE_SIGN);
982 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(widget), GTK_ENTRY_ICON_PRIMARY, _("Toggle amount sign"));
983 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
984
985 image = gtk_image_new_from_icon_name (ICONNAME_HB_BUTTON_SPLIT, GTK_ICON_SIZE_MENU);
986 widget = gtk_button_new();
987 g_object_set (widget, "image", image, NULL);
988 data->BT_split = widget;
989 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
990 gtk_widget_set_tooltip_text(widget, _("Transaction splits"));
991
992 row++;
993 label = make_label_widget(_("Pay_ment:"));
994 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
995 widget = make_paymode(label);
996 data->NU_mode = widget;
997 gtk_widget_set_halign (widget, GTK_ALIGN_START);
998 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
999
1000 row++;
1001 widget = gtk_check_button_new_with_mnemonic(_("Of notebook _2"));
1002 data->CM_cheque = widget;
1003 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1004
1005 /* info should be here some day */
1006
1007 row++;
1008 label = make_label_widget(_("A_ccount:"));
1009 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1010 widget = ui_acc_comboboxentry_new(label);
1011 data->PO_acc = widget;
1012 gtk_widget_set_hexpand (widget, TRUE);
1013 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1014
1015 row++;
1016 label = make_label_widget(_("_To account:"));
1017 data->LB_accto = label;
1018 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1019 widget = ui_acc_comboboxentry_new(label);
1020 data->PO_accto = widget;
1021 gtk_widget_set_hexpand (widget, TRUE);
1022 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1023
1024 row++;
1025 label = make_label_widget(_("_Payee:"));
1026 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1027 widget = ui_pay_comboboxentry_new(label);
1028 data->PO_pay = widget;
1029 gtk_widget_set_hexpand (widget, TRUE);
1030 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1031
1032 row++;
1033 label = make_label_widget(_("_Category:"));
1034 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1035 widget = ui_cat_comboboxentry_new(label);
1036 data->PO_grp = widget;
1037 gtk_widget_set_hexpand (widget, TRUE);
1038 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1039
1040 row++;
1041 label = make_label_widget(_("_Status:"));
1042 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1043 widget = make_radio(CYA_TXN_STATUS, TRUE, GTK_ORIENTATION_HORIZONTAL);
1044 data->RA_status = widget;
1045 gtk_widget_set_halign (widget, GTK_ALIGN_START);
1046 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1047
1048 row++;
1049 label = make_label_widget(_("_Memo:"));
1050 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
1051 widget = make_string(label);
1052 gtk_widget_set_hexpand (widget, TRUE);
1053 data->ST_word = widget;
1054 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
1055
1056 /* tags should be here some day */
1057
1058
1059 return group_grid;
1060 }
1061
1062
1063 static GtkWidget *ui_arc_manage_create_scheduling(struct ui_arc_manage_data *data)
1064 {
1065 GtkWidget *group_grid, *hbox, *label, *widget;
1066 gint row;
1067
1068 // group :: Scheduled insertion
1069 group_grid = gtk_grid_new ();
1070 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1071 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1072
1073 label = make_label_group(_("Scheduled insertion"));
1074 data->LB_schedinsert = label;
1075 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1076
1077 row = 1;
1078 widget = gtk_check_button_new_with_mnemonic(_("_Activate"));
1079 data->CM_auto = widget;
1080 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 2, 1);
1081
1082 row++;
1083 label = gtk_label_new_with_mnemonic (_("Next _date:"));
1084 data->LB_next = label;
1085 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1086 widget = gtk_date_entry_new();
1087 data->PO_next = widget;
1088 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1089
1090 row++;
1091 label = make_label_widget(_("Ever_y:"));
1092 data->LB_every = label;
1093 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1094
1095 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1096 gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1);
1097 widget = make_numeric(label, 1, 100);
1098 data->NB_every = widget;
1099 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1100 //label = gtk_label_new_with_mnemonic (_("_Unit:"));
1101 //gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1102 widget = make_cycle(label, CYA_UNIT);
1103 data->CY_unit = widget;
1104 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
1105
1106 row++;
1107 label = make_label_widget(_("Week end:"));
1108 data->LB_weekend = label;
1109 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
1110
1111 widget = make_radio(CYA_SCHED_WEEKEND, FALSE, GTK_ORIENTATION_HORIZONTAL);
1112 data->CY_weekend = widget;
1113 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1114
1115 row++;
1116 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
1117 gtk_grid_attach (GTK_GRID (group_grid), hbox, 1, row, 3, 1);
1118
1119 widget = gtk_check_button_new_with_mnemonic(_("_Stop after:"));
1120 data->CM_limit = widget;
1121 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1122
1123 widget = make_numeric(label, 1, 366);
1124 data->NB_limit = widget;
1125 gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
1126
1127 label = gtk_label_new_with_mnemonic (_("posts"));
1128 data->LB_posts = label;
1129 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1130
1131 return group_grid;
1132 }
1133
1134 static void ui_arc_manage_type_changed_cb (GtkToggleButton *button, gpointer user_data)
1135 {
1136 ui_arc_manage_populate_listview(user_data);
1137 //g_print(" toggle type=%d\n", gtk_toggle_button_get_active(button));
1138 }
1139
1140
1141 GtkWidget *ui_arc_manage_dialog (Archive *ext_arc)
1142 {
1143 struct ui_arc_manage_data data;
1144 GtkWidget *dialog, *content_area, *table, *bbox;
1145 GtkWidget *content_grid, *group_grid, *hgrid, *treeview, *scrollwin;
1146 GtkWidget *widget, *hpaned;
1147 gint w, h, row;
1148
1149 dialog = gtk_dialog_new_with_buttons (_("Manage scheduled/template transactions"),
1150 GTK_WINDOW(GLOBALS->mainwindow),
1151 0,
1152 _("_Close"),
1153 GTK_RESPONSE_ACCEPT,
1154 NULL);
1155
1156 data.window = dialog;
1157
1158 gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_ARCHIVE);
1159
1160 //set a nice dialog size
1161 gtk_window_get_size(GTK_WINDOW(GLOBALS->mainwindow), &w, &h);
1162 gtk_window_set_default_size (GTK_WINDOW(dialog), -1, h/PHI);
1163
1164
1165 //store our dialog private data
1166 g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)&data);
1167 DB( g_print("\n[ui_scheduled] dialog=%p, inst_data=%p\n", dialog, &data) );
1168
1169 //dialog content
1170 content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog)); // return a vbox
1171
1172 //our table
1173 table = gtk_grid_new ();
1174 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_MEDIUM);
1175 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
1176 g_object_set(table, "margin", SPACING_MEDIUM, NULL);
1177 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
1178
1179 row = 0;
1180 bbox = make_radio(CYA_ARCHIVE_TYPE, TRUE, GTK_ORIENTATION_HORIZONTAL);
1181 data.RA_type = bbox;
1182 gtk_widget_set_halign (bbox, GTK_ALIGN_CENTER);
1183 gtk_grid_attach (GTK_GRID (table), bbox, 0, row, 2, 1);
1184
1185 widget = radio_get_nth_widget(GTK_CONTAINER(bbox), 1);
1186 if(widget)
1187 g_signal_connect (widget, "toggled", G_CALLBACK (ui_arc_manage_type_changed_cb), &data);
1188
1189 row++;
1190 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
1191 //gtk_container_set_border_width (GTK_CONTAINER(hpaned), SPACING_MEDIUM);
1192 gtk_grid_attach (GTK_GRID (table), hpaned, 0, row, 2, 1);
1193
1194
1195 /* left area */
1196 hgrid = gtk_grid_new ();
1197 gtk_grid_set_row_spacing (GTK_GRID (hgrid), SPACING_SMALL);
1198 gtk_grid_set_column_spacing (GTK_GRID (hgrid), SPACING_MEDIUM);
1199 gtk_widget_set_margin_right(hgrid, SPACING_SMALL);
1200 gtk_paned_pack1 (GTK_PANED(hpaned), hgrid, FALSE, FALSE);
1201
1202 // listview
1203 scrollwin = gtk_scrolled_window_new(NULL,NULL);
1204 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
1205 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1206 treeview = (GtkWidget *)ui_arc_listview_new();
1207 data.LV_arc = treeview;
1208 gtk_widget_set_size_request(treeview, HB_MINWIDTH_LIST, -1);
1209 gtk_container_add(GTK_CONTAINER(scrollwin), treeview);
1210 gtk_widget_set_hexpand (scrollwin, TRUE);
1211 gtk_widget_set_vexpand (scrollwin, TRUE);
1212 gtk_grid_attach (GTK_GRID (hgrid), scrollwin, 0, 0, 2, 1);
1213
1214 widget = gtk_button_new_with_mnemonic(_("_Add"));
1215 data.BT_add = widget;
1216 gtk_grid_attach (GTK_GRID (hgrid), widget, 0, 1, 1, 1);
1217
1218 widget = gtk_button_new_with_mnemonic(_("_Delete"));
1219 data.BT_rem = widget;
1220 gtk_grid_attach (GTK_GRID (hgrid), widget, 1, 1, 1, 1);
1221
1222
1223 /* right area */
1224 content_grid = gtk_grid_new();
1225 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1226 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1227 //gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
1228 gtk_widget_set_margin_left(content_grid, SPACING_SMALL);
1229 gtk_paned_pack2 (GTK_PANED(hpaned), content_grid, FALSE, FALSE);
1230
1231 group_grid = ui_arc_manage_create_left_txn(&data);
1232 //gtk_widget_set_hexpand (GTK_WIDGET(group_grid), FALSE);
1233 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, 0, 1, 1);
1234
1235 /* sheduling */
1236 group_grid = ui_arc_manage_create_scheduling(&data);
1237 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, 1, 1, 1);
1238
1239 /* set default periodicity to month */
1240 //todo: move elsewhere
1241 gtk_combo_box_set_active(GTK_COMBO_BOX(data.CY_unit), 2);
1242
1243 gtk_widget_show_all(content_area);
1244 gtk_widget_hide(data.CM_cheque);
1245 gtk_widget_hide(data.PO_accto);
1246
1247 //connect all our signals
1248 g_signal_connect (dialog, "destroy", G_CALLBACK (gtk_widget_destroyed), &dialog);
1249
1250 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_arc)), "changed", G_CALLBACK (ui_arc_manage_selection), NULL);
1251 g_signal_connect (G_OBJECT (data.ST_amount), "icon-release", G_CALLBACK (ui_arc_manage_toggleamount), NULL);
1252
1253 g_signal_connect (G_OBJECT (data.BT_add), "clicked", G_CALLBACK (ui_arc_manage_add), NULL);
1254 g_signal_connect (G_OBJECT (data.BT_rem), "clicked", G_CALLBACK (ui_arc_manage_delete), NULL);
1255
1256 data.handler_id[HID_ARC_MEMO] = g_signal_connect (G_OBJECT (data.ST_word), "changed", G_CALLBACK (ui_arc_manage_rename), NULL);
1257 g_signal_connect (data.NU_mode, "changed", G_CALLBACK (ui_arc_manage_paymode), NULL);
1258 g_signal_connect (data.PO_acc, "changed", G_CALLBACK (ui_arc_manage_update_accto), NULL);
1259 //data.handler_id[HID_ARC_VALID] = g_signal_connect (data.CM_valid , "toggled", G_CALLBACK (ui_arc_manage_togglestatus), GINT_TO_POINTER(HID_ARC_VALID));
1260 //data.handler_id[HID_ARC_REMIND] = g_signal_connect (data.CM_remind, "toggled", G_CALLBACK (ui_arc_manage_togglestatus), GINT_TO_POINTER(HID_ARC_REMIND));
1261
1262 g_signal_connect (data.CM_auto, "toggled", G_CALLBACK (ui_arc_manage_scheduled), NULL);
1263 g_signal_connect (data.CM_limit, "toggled", G_CALLBACK (ui_arc_manage_scheduled), NULL);
1264
1265 g_signal_connect (G_OBJECT (data.BT_split), "clicked", G_CALLBACK (defarchive_button_split_cb), NULL);
1266
1267 //setup, init and show dialog
1268 ui_arc_manage_setup(&data);
1269 ui_arc_manage_update(data.LV_arc, NULL);
1270
1271 gtk_widget_show (dialog);
1272
1273 if(ext_arc != NULL)
1274 ui_arc_listview_select_by_pointer(GTK_TREE_VIEW(data.LV_arc), ext_arc);
1275
1276 //wait for the user
1277 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
1278
1279 switch (result)
1280 {
1281 case GTK_RESPONSE_ACCEPT:
1282 //do_application_specific_something ();
1283 break;
1284 default:
1285 //do_nothing_since_dialog_was_cancelled ();
1286 break;
1287 }
1288
1289 // cleanup and destroy
1290 ui_arc_manage_cleanup(&data, result);
1291 gtk_widget_destroy (dialog);
1292
1293 return NULL;
1294 }
1295
1296
This page took 0.095766 seconds and 4 git commands to generate.