1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
4 * This file is part of HomeBank.
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.
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.
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/>.
22 #include "ui-dialogs.h"
23 #include "list-operation.h"
25 #include "hb-currency.h"
26 #include "ui-currency.h"
29 /* = = = = = = = = = = */
30 /* = = = = = = = = = = = = = = = = = = = = */
31 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
32 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
34 /****************************************************************************/
36 /****************************************************************************/
45 /* our global datas */
46 extern struct HomeBank
*GLOBALS
;
47 extern struct Preferences
*PREFS
;
51 /* = = = = = = = = = = = = = = = = = = = = */
53 /* Confirmation Alert dialog */
55 gint
ui_dialog_msg_confirm_alert(GtkWindow
*parent
, gchar
*title
, gchar
*secondtext
, gchar
*actionverb
)
60 dialog
= gtk_message_dialog_new (GTK_WINDOW(parent
),
61 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
68 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
69 _("_Cancel"), GTK_RESPONSE_CANCEL
,
70 actionverb
, GTK_RESPONSE_OK
,
73 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog
),
80 g_object_set(GTK_MESSAGE_DIALOG (dialog
), "secondary-text", secondtext
, NULL
);
81 //gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), secondtext);
84 gtk_dialog_set_default_response(GTK_DIALOG (dialog
), GTK_RESPONSE_CANCEL
);
86 retval
= gtk_dialog_run (GTK_DIALOG (dialog
));
88 gtk_widget_destroy (dialog
);
101 gint
ui_dialog_msg_question(GtkWindow
*parent
, gchar
*title
, gchar
*message_format
, ...)
108 dialog
= gtk_message_dialog_new (GTK_WINDOW(parent
),
109 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
110 GTK_MESSAGE_QUESTION
,
118 va_start (args
, message_format
);
119 msg
= g_strdup_vprintf (message_format
, args
);
122 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog
), "%s", msg
);
127 gtk_dialog_set_default_response(GTK_DIALOG (dialog
), GTK_RESPONSE_NO
);
129 retval
= gtk_dialog_run (GTK_DIALOG (dialog
));
131 gtk_widget_destroy (dialog
);
137 ** open a info/error dialog for user information purpose
139 void ui_dialog_msg_infoerror(GtkWindow
*parent
, GtkMessageType type
, gchar
*title
, gchar
*message_format
, ...)
146 dialog
= gtk_message_dialog_new (GTK_WINDOW(parent
),
147 GTK_DIALOG_DESTROY_WITH_PARENT
,
156 va_start (args
, message_format
);
157 msg
= g_strdup_vprintf (message_format
, args
);
160 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog
), "%s", msg
);
165 gtk_dialog_run (GTK_DIALOG (dialog
));
166 gtk_widget_destroy (dialog
);
170 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
173 void ui_dialog_file_statistics(void)
175 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
176 GtkWidget
*label
, *widget
;
178 gint crow
, row
, count
;
180 dialog
= gtk_dialog_new_with_buttons (_("File statistics"),
181 GTK_WINDOW (GLOBALS
->mainwindow
),
187 gtk_window_set_default_size (GTK_WINDOW(dialog
), HB_MINWIDTH_LIST
, -1);
189 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
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);
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);
204 label
= make_label_group(NULL
);
205 tmpstr
= g_path_get_basename(GLOBALS
->xhb_filepath
);
206 gtk_label_set_text(GTK_LABEL(label
), tmpstr
);
208 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 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);
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);
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);
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);
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);
255 gtk_widget_show_all(content_grid
);
258 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
260 if(result
== GTK_RESPONSE_ACCEPT
)
265 // cleanup and destroy
266 gtk_widget_destroy (dialog
);
271 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
273 struct dialog_currency_data
276 GtkWidget
*LB_currency
;
277 GtkWidget
*BT_change
;
278 Currency4217
*curfmt
;
281 static void ui_dialog_upgrade_choose_currency_change_action(GtkWidget
*widget
, gpointer user_data
)
283 struct dialog_currency_data
*data
= user_data
;
284 struct curSelectContext selectCtx
;
288 ui_cur_select_dialog_new(GTK_WINDOW(data
->window
), CUR_SELECT_MODE_BASE
, &selectCtx
);
289 if( selectCtx
.cur_4217
!= NULL
)
291 Currency4217
*curfmt
;
295 curfmt
= selectCtx
.cur_4217
;
297 DB( g_printf("- user selected: '%s' '%s'\n", curfmt
->curr_iso_code
, curfmt
->name
) );
299 data
->curfmt
= curfmt
;
303 g_snprintf(label
, 127, "%s - %s", curfmt
->curr_iso_code
, name
);
304 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
309 static void ui_dialog_upgrade_choose_currency_fill(struct dialog_currency_data
*data
)
316 cur
= da_cur_get (GLOBALS
->kcur
);
318 g_snprintf(label
, 127, "%s - %s", cur
->iso_code
, cur
->name
);
319 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
324 void ui_dialog_upgrade_choose_currency(void)
326 struct dialog_currency_data data
;
327 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
328 GtkWidget
*label
, *widget
;
331 dialog
= gtk_dialog_new_with_buttons (_("Upgrade"),
332 GTK_WINDOW (GLOBALS
->mainwindow
),
334 _("_Cancel"), GTK_RESPONSE_CANCEL
,
335 _("_OK"), GTK_RESPONSE_ACCEPT
,
338 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog
),
343 data
.window
= dialog
;
345 widget
= gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog
), GTK_RESPONSE_ACCEPT
);
346 gtk_window_set_focus(GTK_WINDOW(dialog
), widget
);
348 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
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);
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);
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
,
369 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
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);
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);
387 g_signal_connect (G_OBJECT (data
.BT_change
), "clicked", G_CALLBACK (ui_dialog_upgrade_choose_currency_change_action
), &data
);
390 ui_dialog_upgrade_choose_currency_fill(&data
);
392 gtk_widget_show_all(content_grid
);
395 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
397 if(result
== GTK_RESPONSE_ACCEPT
)
400 if( data
.curfmt
!= NULL
)
402 hbfile_replace_basecurrency(data
.curfmt
);
406 // in any case set every accounts to base currency
408 list
= g_hash_table_get_values(GLOBALS
->h_acc
);
411 Account
*acc
= list
->data
;
413 account_set_currency(acc
, GLOBALS
->kcur
);
414 list
= g_list_next(list
);
418 // cleanup and destroy
419 gtk_widget_destroy (dialog
);
424 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
429 static GtkFileFilter
*ui_file_chooser_add_filter(GtkFileChooser
*chooser
, gchar
*name
, gchar
*pattern
)
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
);
440 gboolean
ui_file_chooser_qif(GtkWindow
*parent
, gchar
**storage_ptr
)
445 DB( g_print("(homebank) chooser save qif\n") );
447 chooser
= gtk_file_chooser_dialog_new (
450 GTK_FILE_CHOOSER_ACTION_SAVE
,
451 _("_Cancel"), GTK_RESPONSE_CANCEL
,
452 _("_Save"), GTK_RESPONSE_ACCEPT
,
455 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser
),
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"), "*");
467 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
469 gchar
*tmpfilename
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
471 *storage_ptr
= hb_filename_new_with_extension(tmpfilename
, "qif");
476 gtk_widget_destroy (chooser
);
484 ** open a file chooser dialog and store filename to GLOBALS if OK
486 gboolean
ui_file_chooser_csv(GtkWindow
*parent
, GtkFileChooserAction action
, gchar
**storage_ptr
, gchar
*name
)
494 DB( g_print("(hombank) csvfile chooser csv %d\n", action
) );
496 if( action
== GTK_FILE_CHOOSER_ACTION_OPEN
)
498 title
= _("Import from CSV");
500 path
= PREFS
->path_import
;
504 title
= _("Export as CSV");
506 path
= PREFS
->path_export
;
509 chooser
= gtk_file_chooser_dialog_new (title
,
511 action
, //GTK_FILE_CHOOSER_ACTION_OPEN,
512 _("_Cancel"), GTK_RESPONSE_CANCEL
,
513 button
, GTK_RESPONSE_ACCEPT
,
516 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser
),
522 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser
), path
);
525 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(chooser
), name
);
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"), "*");
531 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
533 gchar
*tmpfilename
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
535 if( action
== GTK_FILE_CHOOSER_ACTION_SAVE
)
537 *storage_ptr
= hb_filename_new_with_extension(tmpfilename
, "csv");
542 *storage_ptr
= tmpfilename
;
547 gtk_widget_destroy (chooser
);
553 ** open a file chooser dialog and store filename to GLOBALS if OK
555 gboolean
ui_file_chooser_xhb(GtkFileChooserAction action
, gchar
**storage_ptr
, gboolean bakmode
)
562 DB( g_print("(ui-dialog) file chooser xhb %d\n", action
) );
564 if( action
== GTK_FILE_CHOOSER_ACTION_OPEN
)
566 title
= (bakmode
==FALSE
) ? _("Open HomeBank file") : _("Open HomeBank backup file");
571 title
= _("Save HomeBank file as");
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
,
582 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser
),
587 if( bakmode
== FALSE
)
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"), "*");
594 if( (action
== GTK_FILE_CHOOSER_ACTION_OPEN
) )
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
);
604 ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser
), _("All backups"), "*.[Bb][Aa][Kk]");
608 if( action
== GTK_FILE_CHOOSER_ACTION_OPEN
)
610 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser
), PREFS
->path_hbfile
);
614 gchar
*basename
, *dirname
;
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);
620 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser
), dirname
);
621 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(chooser
), basename
);
628 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
630 *storage_ptr
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
634 gtk_widget_destroy (chooser
);
642 gboolean
ui_file_chooser_folder(GtkWindow
*parent
, gchar
*title
, gchar
**storage_ptr
)
647 DB( g_print("(ui-dialog) folder chooser\n") );
649 chooser
= gtk_file_chooser_dialog_new (title
,
651 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
,
652 _("_Cancel"), GTK_RESPONSE_CANCEL
,
653 _("_Open"), GTK_RESPONSE_ACCEPT
,
656 gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser
),
661 DB( g_print(" - set folder %s\n", *storage_ptr
) );
663 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(chooser
), *storage_ptr
);
666 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
670 //nb: filename must be freed with g_free
671 filename
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
673 DB( g_print("- folder %s\n", filename
) );
675 //todo: dangerous to do this here, review please !
676 g_free(*storage_ptr
);
677 *storage_ptr
= filename
;
679 DB( g_print("- folder stored: %s\n", *storage_ptr
) );
685 gtk_widget_destroy (chooser
);
693 ** request the user to save last change
695 gboolean
ui_dialog_msg_savechanges(GtkWidget
*widget
, gpointer user_data
)
697 gboolean retval
= TRUE
;
698 GtkWidget
*dialog
= NULL
;
701 if(GLOBALS
->changes_count
)
705 dialog
= gtk_message_dialog_new
707 GTK_WINDOW(GLOBALS
->mainwindow
),
708 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
712 _("Save changes to the file before closing?")
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
720 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
721 _("Close _without saving"), 0,
726 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog
),
732 gtk_dialog_set_default_response(GTK_DIALOG( dialog
), 2);
734 result
= gtk_dialog_run( GTK_DIALOG( dialog
) );
735 gtk_widget_destroy( dialog
);
737 if(result
== 1 || result
== GTK_RESPONSE_DELETE_EVENT
)
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
);
759 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
762 gint
ui_dialog_export_pdf(GtkWindow
*parent
, gchar
**storage_ptr
)
764 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
765 GtkWidget
*label
, *widget
, *BT_folder
, *ST_name
;
769 dialog
= gtk_dialog_new_with_buttons (_("Export as PDF"),
772 _("_Cancel"), GTK_RESPONSE_CANCEL
,
773 _("Export as _PDF"), GTK_RESPONSE_ACCEPT
,
776 gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog
),
782 gtk_window_set_default_size (GTK_WINDOW(dialog
), HB_MINWIDTH_LIST
, -1);
784 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
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);
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);
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);
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);
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);
819 tmpstr
= g_path_get_dirname(*storage_ptr
);
820 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(BT_folder
), tmpstr
);
823 tmpstr
= g_path_get_basename(*storage_ptr
);
824 gtk_entry_set_text(GTK_ENTRY(ST_name
), tmpstr
);
828 gtk_widget_show_all(content_grid
);
831 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
833 if(result
== GTK_RESPONSE_ACCEPT
)
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");
842 g_free(*storage_ptr
);
843 *storage_ptr
= g_build_filename(nufolder
, nufilename
, NULL
);
850 // cleanup and destroy
851 gtk_widget_destroy (dialog
);
860 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
866 GtkWidget
*srctreeview
;
867 GtkWidget
*lb_several
;
872 static void ui_dialog_transaction_xfer_select_child_cb(GtkWidget
*radiobutton
, gpointer user_data
)
874 struct xfer_data
*data
;
875 GtkTreeSelection
*selection
;
876 gboolean btnew
, sensitive
;
879 DB( g_print("(import) account type toggle\n") );
881 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton
), GTK_TYPE_WINDOW
)), "inst_data");
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
);
888 gtk_tree_selection_unselect_all(selection
);
891 gtk_widget_set_sensitive(data
->lb_several
, sensitive
);
892 gtk_widget_set_sensitive(data
->treeview
, sensitive
);
894 sensitive
= (btnew
|| count
> 0) ? TRUE
: FALSE
;
895 gtk_dialog_set_response_sensitive(GTK_DIALOG(data
->window
), GTK_RESPONSE_ACCEPT
, sensitive
);
897 DB( g_print("test count %d btnew %d sensitive %d\n", count
, btnew
, sensitive
) );
901 static void ui_dialog_transaction_xfer_select_child_selection_cb(GtkTreeSelection
*treeselection
, gpointer user_data
)
903 ui_dialog_transaction_xfer_select_child_cb(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
907 gint
ui_dialog_transaction_xfer_select_child(GtkWindow
*parent
, Transaction
*stxn
, GList
*matchlist
, Transaction
**child
)
909 struct xfer_data data
;
910 GtkWidget
*window
, *content
, *mainvbox
, *vbox
, *sw
, *label
;
911 GtkTreeModel
*newmodel
;
914 window
= gtk_dialog_new_with_buttons (
915 _("Select among possible transactions..."),
918 _("_Cancel"), GTK_RESPONSE_CANCEL
,
919 _("_OK"), GTK_RESPONSE_ACCEPT
,
922 gtk_dialog_set_alternative_button_order (GTK_DIALOG(window
),
927 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)&data
);
928 data
.window
= window
;
930 //gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
931 gtk_window_set_default_size (GTK_WINDOW (window
), 800, 494);
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
);
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);
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);
951 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
952 gtk_box_pack_start (GTK_BOX (mainvbox
), vbox
, FALSE
, TRUE
, SPACING_SMALL
);
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);
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);
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);
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
969 data
.lb_several
= label
;
970 gimp_label_set_attributes (GTK_LABEL (label
),
971 PANGO_ATTR_SCALE
, PANGO_SCALE_SMALL
,
973 gtk_box_pack_start (GTK_BOX (mainvbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
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
);
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);
985 /* populate source */
988 newmodel
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
.srctreeview
));
989 gtk_list_store_clear (GTK_LIST_STORE(newmodel
));
991 gtk_list_store_append (GTK_LIST_STORE(newmodel
), &newiter
);
993 gtk_list_store_set (GTK_LIST_STORE(newmodel
), &newiter
,
994 LST_DSPOPE_DATAS
, stxn
,
998 /* populate target */
999 newmodel
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
.treeview
));
1000 gtk_list_store_clear (GTK_LIST_STORE(newmodel
));
1002 GList
*tmplist
= g_list_first(matchlist
);
1003 while (tmplist
!= NULL
)
1005 Transaction
*tmp
= tmplist
->data
;
1007 /* append to our treeview */
1008 gtk_list_store_append (GTK_LIST_STORE(newmodel
), &newiter
);
1010 gtk_list_store_set (GTK_LIST_STORE(newmodel
), &newiter
,
1011 LST_DSPOPE_DATAS
, tmp
,
1014 //DB( g_print(" - fill: %s %.2f %x\n", item->memo, item->amount, (unsigned int)item->same) );
1016 tmplist
= g_list_next(tmplist
);
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
);
1023 gtk_widget_show_all(mainvbox
);
1026 gtk_widget_set_sensitive (data
.radio
[1], TRUE
);
1027 if( g_list_length (matchlist
) <= 0 )
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
);
1035 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
.radio
[1]), TRUE
);
1036 gtk_widget_set_visible (data
.lb_several
, TRUE
);
1039 ui_dialog_transaction_xfer_select_child_cb(data
.radio
[0], NULL
);
1042 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
1045 if(result
== GTK_RESPONSE_ACCEPT
)
1049 bnew
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
.radio
[0]));
1052 GtkTreeSelection
*selection
;
1053 GtkTreeModel
*model
;
1056 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.treeview
));
1057 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
1059 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, child
, -1);
1064 // cleanup and destroy
1065 gtk_widget_destroy (window
);