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