]> Dogcows Code - chaz/homebank/blob - src/ui-dialogs.c
Merge branch 'upstream'
[chaz/homebank] / src / ui-dialogs.c
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 #include "homebank.h"
21
22 #include "ui-dialogs.h"
23 #include "list-operation.h"
24
25 #include "hb-currency.h"
26 #include "ui-currency.h"
27
28
29 /* = = = = = = = = = = */
30 /* = = = = = = = = = = = = = = = = = = = = */
31 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
32 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
33
34 /****************************************************************************/
35 /* Debug macros */
36 /****************************************************************************/
37 #define MYDEBUG 0
38
39 #if MYDEBUG
40 #define DB(x) (x);
41 #else
42 #define DB(x);
43 #endif
44
45 /* our global datas */
46 extern struct HomeBank *GLOBALS;
47 extern struct Preferences *PREFS;
48
49
50
51 /* = = = = = = = = = = = = = = = = = = = = */
52
53 /* Confirmation Alert dialog */
54
55 gint ui_dialog_msg_confirm_alert(GtkWindow *parent, gchar *title, gchar *secondtext, gchar *actionverb)
56 {
57 GtkWidget *dialog;
58 gint retval;
59
60 dialog = gtk_message_dialog_new (GTK_WINDOW(parent),
61 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
62 GTK_MESSAGE_WARNING,
63 GTK_BUTTONS_NONE,
64 title,
65 NULL
66 );
67
68 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
69 _("_Cancel"), GTK_RESPONSE_CANCEL,
70 actionverb, GTK_RESPONSE_OK,
71 NULL);
72
73 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
74 GTK_RESPONSE_OK,
75 GTK_RESPONSE_CANCEL,
76 -1);
77
78 if(secondtext)
79 {
80 g_object_set(GTK_MESSAGE_DIALOG (dialog), "secondary-text", secondtext, NULL);
81 //gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), secondtext);
82 }
83
84 gtk_dialog_set_default_response(GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
85
86 retval = gtk_dialog_run (GTK_DIALOG (dialog));
87
88 gtk_widget_destroy (dialog);
89
90 return retval;
91 }
92
93
94
95
96 /* Message dialog */
97
98
99
100
101 gint ui_dialog_msg_question(GtkWindow *parent, gchar *title, gchar *message_format, ...)
102 {
103 GtkWidget *dialog;
104 gchar* msg = NULL;
105 va_list args;
106 gint retval;
107
108 dialog = gtk_message_dialog_new (GTK_WINDOW(parent),
109 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
110 GTK_MESSAGE_QUESTION,
111 GTK_BUTTONS_YES_NO,
112 title,
113 NULL
114 );
115
116 if (message_format)
117 {
118 va_start (args, message_format);
119 msg = g_strdup_vprintf (message_format, args);
120 va_end (args);
121
122 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", msg);
123
124 g_free (msg);
125 }
126
127 gtk_dialog_set_default_response(GTK_DIALOG (dialog), GTK_RESPONSE_NO);
128
129 retval = gtk_dialog_run (GTK_DIALOG (dialog));
130
131 gtk_widget_destroy (dialog);
132
133 return retval;
134 }
135
136 /*
137 ** open a info/error dialog for user information purpose
138 */
139 void ui_dialog_msg_infoerror(GtkWindow *parent, GtkMessageType type, gchar *title, gchar *message_format, ...)
140 {
141 GtkWidget *dialog;
142 gchar* msg = NULL;
143 va_list args;
144
145
146 dialog = gtk_message_dialog_new (GTK_WINDOW(parent),
147 GTK_DIALOG_DESTROY_WITH_PARENT,
148 type,
149 GTK_BUTTONS_OK,
150 "%s",
151 title
152 );
153
154 if (message_format)
155 {
156 va_start (args, message_format);
157 msg = g_strdup_vprintf (message_format, args);
158 va_end (args);
159
160 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", msg);
161
162 g_free (msg);
163 }
164
165 gtk_dialog_run (GTK_DIALOG (dialog));
166 gtk_widget_destroy (dialog);
167 }
168
169
170 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
171
172
173 void ui_dialog_file_statistics(void)
174 {
175 GtkWidget *dialog, *content_area, *content_grid, *group_grid;
176 GtkWidget *label, *widget;
177 gchar *tmpstr;
178 gint crow, row, count;
179
180 dialog = gtk_dialog_new_with_buttons (_("File statistics"),
181 GTK_WINDOW (GLOBALS->mainwindow),
182 0,
183 _("_Close"),
184 GTK_RESPONSE_ACCEPT,
185 NULL);
186
187 gtk_window_set_default_size (GTK_WINDOW(dialog), HB_MINWIDTH_LIST, -1);
188
189 content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
190
191 content_grid = gtk_grid_new();
192 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
193 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
194 gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
195 gtk_box_pack_start (GTK_BOX (content_area), content_grid, TRUE, TRUE, 0);
196
197 crow = 0;
198 // group :: file title
199 group_grid = gtk_grid_new ();
200 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
201 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
202 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
203
204 label = make_label_group(NULL);
205 tmpstr = g_path_get_basename(GLOBALS->xhb_filepath);
206 gtk_label_set_text(GTK_LABEL(label), tmpstr);
207 g_free(tmpstr);
208 gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
209
210 row = 1;
211 label = make_label_widget(_("Account"));
212 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
213 widget = make_label(NULL, 1.0, 0.5);
214 count = da_acc_length ();
215 ui_label_set_integer(GTK_LABEL(widget), count);
216 gtk_widget_set_hexpand(widget, TRUE);
217 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
218
219 row++;
220 label = make_label_widget(_("Transaction"));
221 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
222 widget = make_label(NULL, 1.0, 0.5);
223 count = da_transaction_length();
224 ui_label_set_integer(GTK_LABEL(widget), count);
225 gtk_widget_set_hexpand(widget, TRUE);
226 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
227
228 row++;
229 label = make_label_widget(_("Payee"));
230 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
231 widget = make_label(NULL, 1.0, 0.5);
232 count = da_pay_length ();
233 ui_label_set_integer(GTK_LABEL(widget), count);
234 gtk_widget_set_hexpand(widget, TRUE);
235 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
236
237 row++;
238 label = make_label_widget(_("Category"));
239 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
240 widget = make_label(NULL, 1.0, 0.5);
241 count = da_cat_length ();
242 ui_label_set_integer(GTK_LABEL(widget), count);
243 gtk_widget_set_hexpand(widget, TRUE);
244 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
245
246 row++;
247 label = make_label_widget(_("Assignment"));
248 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
249 widget = make_label(NULL, 1.0, 0.5);
250 count = da_asg_length ();
251 ui_label_set_integer(GTK_LABEL(widget), count);
252 gtk_widget_set_hexpand(widget, TRUE);
253 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
254
255 gtk_widget_show_all(content_grid);
256
257 //wait for the user
258 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
259
260 if(result == GTK_RESPONSE_ACCEPT)
261 {
262
263 }
264
265 // cleanup and destroy
266 gtk_widget_destroy (dialog);
267
268 }
269
270
271 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
272
273 struct dialog_currency_data
274 {
275 GtkWidget *window;
276 GtkWidget *LB_currency;
277 GtkWidget *BT_change;
278 Currency4217 *curfmt;
279 };
280
281 static void ui_dialog_upgrade_choose_currency_change_action(GtkWidget *widget, gpointer user_data)
282 {
283 struct dialog_currency_data *data = user_data;
284 struct curSelectContext selectCtx;
285
286 data->curfmt = NULL;
287
288 ui_cur_select_dialog_new(GTK_WINDOW(data->window), CUR_SELECT_MODE_BASE, &selectCtx);
289 if( selectCtx.cur_4217 != NULL )
290 {
291 Currency4217 *curfmt;
292 gchar label[128];
293 gchar *name;
294
295 curfmt = selectCtx.cur_4217;
296
297 DB( g_printf("- user selected: '%s' '%s'\n", curfmt->curr_iso_code, curfmt->name) );
298
299 data->curfmt = curfmt;
300
301 name = curfmt->name;
302
303 g_snprintf(label, 127, "%s - %s", curfmt->curr_iso_code, name);
304 gtk_label_set_text (GTK_LABEL(data->LB_currency), label);
305 }
306 }
307
308
309 static void ui_dialog_upgrade_choose_currency_fill(struct dialog_currency_data *data)
310 {
311 Currency *cur;
312 gchar label[128];
313
314 data->curfmt = NULL;
315
316 cur = da_cur_get (GLOBALS->kcur);
317
318 g_snprintf(label, 127, "%s - %s", cur->iso_code, cur->name);
319 gtk_label_set_text (GTK_LABEL(data->LB_currency), label);
320 }
321
322
323
324 void ui_dialog_upgrade_choose_currency(void)
325 {
326 struct dialog_currency_data data;
327 GtkWidget *dialog, *content_area, *content_grid, *group_grid;
328 GtkWidget *label, *widget;
329 gint crow, row;
330
331 dialog = gtk_dialog_new_with_buttons (_("Upgrade"),
332 GTK_WINDOW (GLOBALS->mainwindow),
333 0,
334 _("_Cancel"), GTK_RESPONSE_CANCEL,
335 _("_OK"), GTK_RESPONSE_ACCEPT,
336 NULL);
337
338 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
339 GTK_RESPONSE_ACCEPT,
340 GTK_RESPONSE_CANCEL,
341 -1);
342
343 data.window = dialog;
344
345 widget = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
346 gtk_window_set_focus(GTK_WINDOW(dialog), widget);
347
348 content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
349
350 content_grid = gtk_grid_new();
351 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
352 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
353 gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
354 gtk_box_pack_start (GTK_BOX (content_area), content_grid, TRUE, TRUE, 0);
355
356 crow = 0;
357 // group :: file title
358 group_grid = gtk_grid_new ();
359 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
360 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
361 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
362
363 row = 0;
364 label = make_label(_("Select a base currency"), 0, 0);
365 gimp_label_set_attributes(GTK_LABEL(label),
366 PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD,
367 PANGO_ATTR_SCALE, PANGO_SCALE_LARGE,
368 -1);
369 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 3, 1);
370
371 row++;
372 label = make_label(
373 _("Starting v5.1, HomeBank can manage several currencies\n" \
374 "if the currency below is not correct, please change it:"), 0, 0);
375 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 3, 1);
376
377 row++;
378 label = make_label_widget(_("Currency:"));
379 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
380 widget = make_label (NULL, 0, 0.5);
381 data.LB_currency = widget;
382 gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
383 widget = gtk_button_new_with_mnemonic (_("_Change"));
384 data.BT_change = widget;
385 gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
386
387 g_signal_connect (G_OBJECT (data.BT_change), "clicked", G_CALLBACK (ui_dialog_upgrade_choose_currency_change_action), &data);
388
389
390 ui_dialog_upgrade_choose_currency_fill(&data);
391
392 gtk_widget_show_all(content_grid);
393
394 //wait for the user
395 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
396
397 if(result == GTK_RESPONSE_ACCEPT)
398 {
399
400 if( data.curfmt != NULL )
401 {
402 hbfile_replace_basecurrency(data.curfmt);
403 }
404 }
405
406 // in any case set every accounts to base currency
407 GList *list;
408 list = g_hash_table_get_values(GLOBALS->h_acc);
409 while (list != NULL)
410 {
411 Account *acc = list->data;
412
413 account_set_currency(acc, GLOBALS->kcur);
414 list = g_list_next(list);
415 }
416 g_list_free(list);
417
418 // cleanup and destroy
419 gtk_widget_destroy (dialog);
420
421 }
422
423
424 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
425
426
427
428
429 static GtkFileFilter *ui_file_chooser_add_filter(GtkFileChooser *chooser, gchar *name, gchar *pattern)
430 {
431 GtkFileFilter *filter = gtk_file_filter_new ();
432 gtk_file_filter_set_name (filter, name);
433 gtk_file_filter_add_pattern (filter, pattern);
434 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(chooser), filter);
435
436 return filter;
437 }
438
439
440 gboolean ui_file_chooser_qif(GtkWindow *parent, gchar **storage_ptr)
441 {
442 GtkWidget *chooser;
443 gboolean retval;
444
445 DB( g_print("(homebank) chooser save qif\n") );
446
447 chooser = gtk_file_chooser_dialog_new (
448 _("Export as QIF"),
449 GTK_WINDOW(parent),
450 GTK_FILE_CHOOSER_ACTION_SAVE,
451 _("_Cancel"), GTK_RESPONSE_CANCEL,
452 _("_Save"), GTK_RESPONSE_ACCEPT,
453 NULL);
454
455 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
456 GTK_RESPONSE_ACCEPT,
457 GTK_RESPONSE_CANCEL,
458 -1);
459
460
461 //todo: change this ?
462 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), PREFS->path_export);
463 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("QIF files"), "*.[Qq][Ii][Ff]");
464 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("All files"), "*");
465
466 retval = FALSE;
467 if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
468 {
469 gchar *tmpfilename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
470
471 *storage_ptr = hb_filename_new_with_extension(tmpfilename, "qif");
472 g_free(tmpfilename);
473 retval = TRUE;
474 }
475
476 gtk_widget_destroy (chooser);
477
478 return retval;
479 }
480
481
482
483 /*
484 ** open a file chooser dialog and store filename to GLOBALS if OK
485 */
486 gboolean ui_file_chooser_csv(GtkWindow *parent, GtkFileChooserAction action, gchar **storage_ptr, gchar *name)
487 {
488 GtkWidget *chooser;
489 gchar *title;
490 gchar *button;
491 gboolean retval;
492 gchar *path;
493
494 DB( g_print("(hombank) csvfile chooser csv %d\n", action) );
495
496 if( action == GTK_FILE_CHOOSER_ACTION_OPEN )
497 {
498 title = _("Import from CSV");
499 button = _("_Open");
500 path = PREFS->path_import;
501 }
502 else
503 {
504 title = _("Export as CSV");
505 button = _("_Save");
506 path = PREFS->path_export;
507 }
508
509 chooser = gtk_file_chooser_dialog_new (title,
510 GTK_WINDOW(parent),
511 action, //GTK_FILE_CHOOSER_ACTION_OPEN,
512 _("_Cancel"), GTK_RESPONSE_CANCEL,
513 button, GTK_RESPONSE_ACCEPT,
514 NULL);
515
516 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
517 GTK_RESPONSE_ACCEPT,
518 GTK_RESPONSE_CANCEL,
519 -1);
520
521
522 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), path);
523
524 if(name != NULL)
525 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(chooser), name);
526
527 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("CSV files"), "*.[Cc][Ss][Vv]");
528 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("All files"), "*");
529
530 retval = FALSE;
531 if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
532 {
533 gchar *tmpfilename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
534
535 if( action == GTK_FILE_CHOOSER_ACTION_SAVE )
536 {
537 *storage_ptr = hb_filename_new_with_extension(tmpfilename, "csv");
538 g_free(tmpfilename);
539 }
540 else
541 {
542 *storage_ptr = tmpfilename;
543 }
544 retval = TRUE;
545 }
546
547 gtk_widget_destroy (chooser);
548
549 return retval;
550 }
551
552 /*
553 ** open a file chooser dialog and store filename to GLOBALS if OK
554 */
555 gboolean ui_file_chooser_xhb(GtkFileChooserAction action, gchar **storage_ptr, gboolean bakmode)
556 {
557 GtkWidget *chooser;
558 gchar *title;
559 gchar *button;
560 gboolean retval;
561
562 DB( g_print("(ui-dialog) file chooser xhb %d\n", action) );
563
564 if( action == GTK_FILE_CHOOSER_ACTION_OPEN )
565 {
566 title = (bakmode==FALSE) ? _("Open HomeBank file") : _("Open HomeBank backup file");
567 button = _("_Open");
568 }
569 else
570 {
571 title = _("Save HomeBank file as");
572 button = _("_Save");
573 }
574
575 chooser = gtk_file_chooser_dialog_new (title,
576 GTK_WINDOW(GLOBALS->mainwindow),
577 action, //GTK_FILE_CHOOSER_ACTION_OPEN,
578 _("_Cancel"), GTK_RESPONSE_CANCEL,
579 button, GTK_RESPONSE_ACCEPT,
580 NULL);
581
582 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
583 GTK_RESPONSE_ACCEPT,
584 GTK_RESPONSE_CANCEL,
585 -1);
586
587 if( bakmode == FALSE )
588 {
589 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("HomeBank files"), "*.[Xx][Hh][Bb]");
590 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("All files"), "*");
591 }
592 else
593 {
594 if( (action == GTK_FILE_CHOOSER_ACTION_OPEN) )
595 {
596 gchar *pattern;
597 GtkFileFilter *flt;
598
599 pattern = hb_filename_backup_get_filtername(GLOBALS->xhb_filepath);
600 flt = ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("File backup"), pattern);
601 gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser), flt);
602 g_free(pattern);
603
604 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("All backups"), "*.[Bb][Aa][Kk]");
605 }
606 }
607
608 if( action == GTK_FILE_CHOOSER_ACTION_OPEN )
609 {
610 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), PREFS->path_hbfile);
611 }
612 else /* save */
613 {
614 gchar *basename, *dirname;
615
616 basename = g_path_get_basename(GLOBALS->xhb_filepath);
617 dirname = g_path_get_dirname (GLOBALS->xhb_filepath);
618 //gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(chooser), GLOBALS->xhb_filepath);
619
620 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), dirname);
621 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(chooser), basename);
622
623 g_free(dirname);
624 g_free(basename);
625 }
626
627 retval = FALSE;
628 if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
629 {
630 *storage_ptr = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
631 retval = TRUE;
632 }
633
634 gtk_widget_destroy (chooser);
635
636 return retval;
637 }
638
639 /*
640 **
641 */
642 gboolean ui_file_chooser_folder(GtkWindow *parent, gchar *title, gchar **storage_ptr)
643 {
644 GtkWidget *chooser;
645 gboolean retval;
646
647 DB( g_print("(ui-dialog) folder chooser\n") );
648
649 chooser = gtk_file_chooser_dialog_new (title,
650 parent,
651 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
652 _("_Cancel"), GTK_RESPONSE_CANCEL,
653 _("_Open"), GTK_RESPONSE_ACCEPT,
654 NULL);
655
656 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
657 GTK_RESPONSE_ACCEPT,
658 GTK_RESPONSE_CANCEL,
659 -1);
660
661 DB( g_print(" - set folder %s\n", *storage_ptr) );
662
663 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(chooser), *storage_ptr);
664
665 retval = FALSE;
666 if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
667 {
668 gchar *filename;
669
670 //nb: filename must be freed with g_free
671 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
672
673 DB( g_print("- folder %s\n", filename) );
674
675 //todo: dangerous to do this here, review please !
676 g_free(*storage_ptr);
677 *storage_ptr = filename;
678
679 DB( g_print("- folder stored: %s\n", *storage_ptr) );
680
681
682 retval = TRUE;
683 }
684
685 gtk_widget_destroy (chooser);
686
687 return retval;
688 }
689
690
691
692 /*
693 ** request the user to save last change
694 */
695 gboolean ui_dialog_msg_savechanges(GtkWidget *widget, gpointer user_data)
696 {
697 gboolean retval = TRUE;
698 GtkWidget *dialog = NULL;
699
700
701 if(GLOBALS->changes_count)
702 {
703 gint result;
704
705 dialog = gtk_message_dialog_new
706 (
707 GTK_WINDOW(GLOBALS->mainwindow),
708 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
709 GTK_MESSAGE_WARNING,
710 //GTK_MESSAGE_INFO,
711 GTK_BUTTONS_NONE,
712 _("Save changes to the file before closing?")
713 );
714
715 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
716 _("If you don't save, changes will be permanently lost.\nNumber of changes: %d."),
717 GLOBALS->changes_count
718 );
719
720 gtk_dialog_add_buttons (GTK_DIALOG(dialog),
721 _("Close _without saving"), 0,
722 _("_Cancel"), 1,
723 _("_Save"), 2,
724 NULL);
725
726 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
727 0,
728 2,
729 1,
730 -1);
731
732 gtk_dialog_set_default_response(GTK_DIALOG( dialog ), 2);
733
734 result = gtk_dialog_run( GTK_DIALOG( dialog ) );
735 gtk_widget_destroy( dialog );
736
737 if(result == 1 || result == GTK_RESPONSE_DELETE_EVENT)
738 {
739 retval = FALSE;
740 }
741 else
742 {
743 if(result == 2)
744 {
745 DB( g_print(" + should quick save %s\n", GLOBALS->xhb_filepath) );
746 //todo: should migrate this
747 //#1720377 also backup
748 homebank_file_ensure_xhb(NULL);
749 homebank_backup_current_file();
750 homebank_save_xml(GLOBALS->xhb_filepath);
751 }
752 }
753
754 }
755 return retval;
756 }
757
758
759 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
760
761
762 gint ui_dialog_export_pdf(GtkWindow *parent, gchar **storage_ptr)
763 {
764 GtkWidget *dialog, *content_area, *content_grid, *group_grid;
765 GtkWidget *label, *widget, *BT_folder, *ST_name;
766 gchar *tmpstr;
767 gint crow, row;
768
769 dialog = gtk_dialog_new_with_buttons (_("Export as PDF"),
770 GTK_WINDOW (parent),
771 0,
772 _("_Cancel"), GTK_RESPONSE_CANCEL,
773 _("Export as _PDF"), GTK_RESPONSE_ACCEPT,
774 NULL);
775
776 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
777 GTK_RESPONSE_ACCEPT,
778 GTK_RESPONSE_CANCEL,
779 -1);
780
781
782 gtk_window_set_default_size (GTK_WINDOW(dialog), HB_MINWIDTH_LIST, -1);
783
784 content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
785
786 content_grid = gtk_grid_new();
787 gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
788 gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
789 gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
790 gtk_box_pack_start (GTK_BOX (content_area), content_grid, TRUE, TRUE, 0);
791
792 crow = 0;
793 // group :: file title
794 group_grid = gtk_grid_new ();
795 gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
796 gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
797 gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
798
799 row = 0;
800 widget = gtk_image_new_from_icon_name (ICONNAME_WARNING, GTK_ICON_SIZE_DIALOG);
801 gtk_grid_attach (GTK_GRID (group_grid), widget, 0, row, 1, 1);
802 label = gtk_label_new("This feature is still in development state,\n(maybe not stable) so use it at your own risk!");
803 gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
804
805 row++;
806 label = make_label_widget(_("Folder:"));
807 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
808 BT_folder = gtk_file_chooser_button_new (_("Pick a Folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
809 gtk_grid_attach (GTK_GRID (group_grid), BT_folder, 1, row, 1, 1);
810
811 row++;
812 label = make_label_widget(_("Filename:"));
813 gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
814 ST_name = make_string (label);
815 gtk_grid_attach (GTK_GRID (group_grid), ST_name, 1, row, 1, 1);
816
817
818 //setup
819 tmpstr = g_path_get_dirname(*storage_ptr);
820 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(BT_folder), tmpstr);
821 g_free(tmpstr);
822
823 tmpstr = g_path_get_basename(*storage_ptr);
824 gtk_entry_set_text(GTK_ENTRY(ST_name), tmpstr);
825 g_free(tmpstr);
826
827
828 gtk_widget_show_all(content_grid);
829
830 //wait for the user
831 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
832
833 if(result == GTK_RESPONSE_ACCEPT)
834 {
835 gchar *hostname;
836 //#300380 fixed export path problem (was always the export of preference)
837 //not to be used -- gchar *nufolder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(BT_folder));
838 gchar *urifolder = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(BT_folder));
839 gchar *nufolder = g_filename_from_uri(urifolder, &hostname, NULL);
840 gchar *nufilename = hb_filename_new_with_extension((gchar *)gtk_entry_get_text (GTK_ENTRY(ST_name)), "pdf");
841
842 g_free(*storage_ptr);
843 *storage_ptr = g_build_filename(nufolder, nufilename, NULL);
844
845 g_free(nufilename);
846 g_free(nufolder);
847 g_free(urifolder);
848 }
849
850 // cleanup and destroy
851 gtk_widget_destroy (dialog);
852
853 return result;
854 }
855
856
857
858
859
860 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
861
862 struct xfer_data
863 {
864 GtkWidget *window;
865 GtkWidget *radio[2];
866 GtkWidget *srctreeview;
867 GtkWidget *lb_several;
868 GtkWidget *treeview;
869 };
870
871
872 static void ui_dialog_transaction_xfer_select_child_cb(GtkWidget *radiobutton, gpointer user_data)
873 {
874 struct xfer_data *data;
875 GtkTreeSelection *selection;
876 gboolean btnew, sensitive;
877 gint count;
878
879 DB( g_print("(import) account type toggle\n") );
880
881 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton), GTK_TYPE_WINDOW)), "inst_data");
882
883 btnew = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->radio[0]));
884 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->treeview));
885 count = gtk_tree_selection_count_selected_rows(selection);
886
887 if(btnew)
888 gtk_tree_selection_unselect_all(selection);
889
890 sensitive = btnew^1;
891 gtk_widget_set_sensitive(data->lb_several, sensitive);
892 gtk_widget_set_sensitive(data->treeview, sensitive);
893
894 sensitive = (btnew || count > 0) ? TRUE : FALSE;
895 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_ACCEPT, sensitive);
896
897 DB( g_print("test count %d btnew %d sensitive %d\n", count, btnew, sensitive) );
898
899 }
900
901 static void ui_dialog_transaction_xfer_select_child_selection_cb(GtkTreeSelection *treeselection, gpointer user_data)
902 {
903 ui_dialog_transaction_xfer_select_child_cb(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection)), NULL);
904 }
905
906
907 gint ui_dialog_transaction_xfer_select_child(GtkWindow *parent, Transaction *stxn, GList *matchlist, Transaction **child)
908 {
909 struct xfer_data data;
910 GtkWidget *window, *content, *mainvbox, *vbox, *sw, *label;
911 GtkTreeModel *newmodel;
912 GtkTreeIter newiter;
913
914 window = gtk_dialog_new_with_buttons (
915 _("Select among possible transactions..."),
916 parent,
917 0,
918 _("_Cancel"), GTK_RESPONSE_CANCEL,
919 _("_OK"), GTK_RESPONSE_ACCEPT,
920 NULL);
921
922 gtk_dialog_set_alternative_button_order (GTK_DIALOG(window),
923 GTK_RESPONSE_ACCEPT,
924 GTK_RESPONSE_CANCEL,
925 -1);
926
927 g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data);
928 data.window = window;
929
930 //gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
931 gtk_window_set_default_size (GTK_WINDOW (window), 800, 494);
932
933 content = gtk_dialog_get_content_area(GTK_DIALOG (window));
934 mainvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
935 gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0);
936 gtk_container_set_border_width (GTK_CONTAINER (mainvbox), SPACING_SMALL);
937
938 // source listview
939 sw = gtk_scrolled_window_new (NULL, NULL);
940 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
941 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
942 //gtk_widget_set_size_request(sw, -1, HB_MINWIDTH_LIST/2);
943
944 data.srctreeview = create_list_transaction(LIST_TXN_TYPE_DETAIL, PREFS->lst_ope_columns);
945 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(data.srctreeview)), GTK_SELECTION_NONE);
946 gtk_container_add (GTK_CONTAINER (sw), data.srctreeview);
947 gtk_box_pack_start (GTK_BOX (mainvbox), sw, TRUE, TRUE, 0);
948
949
950 // actions
951 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
952 gtk_box_pack_start (GTK_BOX (mainvbox), vbox, FALSE, TRUE, SPACING_SMALL);
953
954 label = make_label(_("Select an action:"), 0.0, 0.5);
955 gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
956 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
957
958 data.radio[0] = gtk_radio_button_new_with_label (NULL, _("create a new transaction"));
959 gtk_box_pack_start (GTK_BOX (vbox), data.radio[0], FALSE, FALSE, 0);
960
961 data.radio[1] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON (data.radio[0]), _("select an existing transaction"));
962 gtk_box_pack_start (GTK_BOX (vbox), data.radio[1], FALSE, FALSE, 0);
963
964
965 label = make_label(_(
966 "HomeBank has found some transaction that may be " \
967 "the associated transaction for the internal transfer."), 0.0, 0.5
968 );
969 data.lb_several = label;
970 gimp_label_set_attributes (GTK_LABEL (label),
971 PANGO_ATTR_SCALE, PANGO_SCALE_SMALL,
972 -1);
973 gtk_box_pack_start (GTK_BOX (mainvbox), label, FALSE, FALSE, SPACING_SMALL);
974
975 // target listview
976 sw = gtk_scrolled_window_new (NULL, NULL);
977 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
978 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
979
980 data.treeview = create_list_transaction(LIST_TXN_TYPE_DETAIL, PREFS->lst_ope_columns);
981 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(data.treeview)), GTK_SELECTION_SINGLE);
982 gtk_container_add (GTK_CONTAINER (sw), data.treeview);
983 gtk_box_pack_start (GTK_BOX (mainvbox), sw, TRUE, TRUE, 0);
984
985 /* populate source */
986 if( stxn != NULL )
987 {
988 newmodel = gtk_tree_view_get_model(GTK_TREE_VIEW(data.srctreeview));
989 gtk_list_store_clear (GTK_LIST_STORE(newmodel));
990
991 gtk_list_store_append (GTK_LIST_STORE(newmodel), &newiter);
992
993 gtk_list_store_set (GTK_LIST_STORE(newmodel), &newiter,
994 MODEL_TXN_POINTER, stxn,
995 -1);
996 }
997
998 /* populate target */
999 newmodel = gtk_tree_view_get_model(GTK_TREE_VIEW(data.treeview));
1000 gtk_list_store_clear (GTK_LIST_STORE(newmodel));
1001
1002 GList *tmplist = g_list_first(matchlist);
1003 while (tmplist != NULL)
1004 {
1005 Transaction *tmp = tmplist->data;
1006
1007 /* append to our treeview */
1008 gtk_list_store_append (GTK_LIST_STORE(newmodel), &newiter);
1009
1010 gtk_list_store_set (GTK_LIST_STORE(newmodel), &newiter,
1011 MODEL_TXN_POINTER, tmp,
1012 -1);
1013
1014 //DB( g_print(" - fill: %s %.2f %x\n", item->memo, item->amount, (unsigned int)item->same) );
1015
1016 tmplist = g_list_next(tmplist);
1017 }
1018
1019
1020 g_signal_connect (data.radio[0], "toggled", G_CALLBACK (ui_dialog_transaction_xfer_select_child_cb), NULL);
1021 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.treeview)), "changed", G_CALLBACK (ui_dialog_transaction_xfer_select_child_selection_cb), NULL);
1022
1023 gtk_widget_show_all(mainvbox);
1024
1025 //initialize
1026 gtk_widget_set_sensitive (data.radio[1], TRUE);
1027 if( g_list_length (matchlist) <= 0 )
1028 {
1029 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data.radio[0]), TRUE);
1030 gtk_widget_set_sensitive (data.radio[1], FALSE);
1031 gtk_widget_set_visible (data.lb_several, FALSE);
1032 }
1033 else
1034 {
1035 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data.radio[1]), TRUE);
1036 gtk_widget_set_visible (data.lb_several, TRUE);
1037 }
1038
1039 ui_dialog_transaction_xfer_select_child_cb(data.radio[0], NULL);
1040
1041 //wait for the user
1042 gint result = gtk_dialog_run (GTK_DIALOG (window));
1043
1044 *child = NULL;
1045 if(result == GTK_RESPONSE_ACCEPT)
1046 {
1047 gboolean bnew;
1048
1049 bnew = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data.radio[0]));
1050 if( bnew == FALSE )
1051 {
1052 GtkTreeSelection *selection;
1053 GtkTreeModel *model;
1054 GtkTreeIter iter;
1055
1056 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data.treeview));
1057 if (gtk_tree_selection_get_selected(selection, &model, &iter))
1058 {
1059 gtk_tree_model_get(model, &iter, MODEL_TXN_POINTER, child, -1);
1060 }
1061 }
1062 }
1063
1064 DB( g_print(" return %d child = %p\n", result, child) );
1065
1066
1067 // cleanup and destroy
1068 gtk_widget_destroy (window);
1069
1070 return result;
1071 }
1072
1073
1074
This page took 0.076106 seconds and 4 git commands to generate.