1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2018 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
,
76 g_object_set(GTK_MESSAGE_DIALOG (dialog
), "secondary-text", secondtext
, NULL
);
77 //gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), secondtext);
80 gtk_dialog_set_default_response(GTK_DIALOG (dialog
), GTK_RESPONSE_CANCEL
);
82 retval
= gtk_dialog_run (GTK_DIALOG (dialog
));
84 gtk_widget_destroy (dialog
);
97 gint
ui_dialog_msg_question(GtkWindow
*parent
, gchar
*title
, gchar
*message_format
, ...)
104 dialog
= gtk_message_dialog_new (GTK_WINDOW(parent
),
105 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
106 GTK_MESSAGE_QUESTION
,
114 va_start (args
, message_format
);
115 msg
= g_strdup_vprintf (message_format
, args
);
118 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog
), "%s", msg
);
123 gtk_dialog_set_default_response(GTK_DIALOG (dialog
), GTK_RESPONSE_NO
);
125 retval
= gtk_dialog_run (GTK_DIALOG (dialog
));
127 gtk_widget_destroy (dialog
);
133 ** open a info/error dialog for user information purpose
135 void ui_dialog_msg_infoerror(GtkWindow
*parent
, GtkMessageType type
, gchar
*title
, gchar
*message_format
, ...)
142 dialog
= gtk_message_dialog_new (GTK_WINDOW(parent
),
143 GTK_DIALOG_DESTROY_WITH_PARENT
,
152 va_start (args
, message_format
);
153 msg
= g_strdup_vprintf (message_format
, args
);
156 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog
), "%s", msg
);
161 gtk_dialog_run (GTK_DIALOG (dialog
));
162 gtk_widget_destroy (dialog
);
166 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
169 void ui_dialog_file_statistics(void)
171 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
172 GtkWidget
*label
, *widget
;
174 gint crow
, row
, count
;
176 dialog
= gtk_dialog_new_with_buttons (_("File statistics"),
177 GTK_WINDOW (GLOBALS
->mainwindow
),
183 gtk_window_set_default_size (GTK_WINDOW(dialog
), HB_MINWIDTH_LIST
, -1);
185 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
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);
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);
200 label
= make_label_group(NULL
);
201 tmpstr
= g_path_get_basename(GLOBALS
->xhb_filepath
);
202 gtk_label_set_text(GTK_LABEL(label
), tmpstr
);
204 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, 0, 3, 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);
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);
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);
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);
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);
251 gtk_widget_show_all(content_grid
);
254 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
256 if(result
== GTK_RESPONSE_ACCEPT
)
261 // cleanup and destroy
262 gtk_widget_destroy (dialog
);
267 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
269 struct dialog_currency_data
272 GtkWidget
*LB_currency
;
273 GtkWidget
*BT_change
;
274 Currency4217
*curfmt
;
277 static void ui_dialog_upgrade_choose_currency_change_action(GtkWidget
*widget
, gpointer user_data
)
279 struct dialog_currency_data
*data
= user_data
;
280 struct curSelectContext selectCtx
;
284 ui_cur_select_dialog_new(GTK_WINDOW(data
->window
), CUR_SELECT_MODE_BASE
, &selectCtx
);
285 if( selectCtx
.cur_4217
!= NULL
)
287 Currency4217
*curfmt
;
291 curfmt
= selectCtx
.cur_4217
;
293 DB( g_printf("- user selected: '%s' '%s'\n", curfmt
->curr_iso_code
, curfmt
->name
) );
295 data
->curfmt
= curfmt
;
299 g_snprintf(label
, 127, "%s - %s", curfmt
->curr_iso_code
, name
);
300 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
305 static void ui_dialog_upgrade_choose_currency_fill(struct dialog_currency_data
*data
)
312 cur
= da_cur_get (GLOBALS
->kcur
);
314 g_snprintf(label
, 127, "%s - %s", cur
->iso_code
, cur
->name
);
315 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
320 void ui_dialog_upgrade_choose_currency(void)
322 struct dialog_currency_data data
;
323 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
324 GtkWidget
*label
, *widget
;
327 dialog
= gtk_dialog_new_with_buttons (_("Upgrade"),
328 GTK_WINDOW (GLOBALS
->mainwindow
),
330 _("_Cancel"), GTK_RESPONSE_CANCEL
,
331 _("_OK"), GTK_RESPONSE_ACCEPT
,
334 data
.window
= dialog
;
336 widget
= gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog
), GTK_RESPONSE_ACCEPT
);
337 gtk_window_set_focus(GTK_WINDOW(dialog
), widget
);
339 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
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);
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);
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
,
360 gtk_grid_attach (GTK_GRID (group_grid
), label
, 0, row
, 3, 1);
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);
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);
378 g_signal_connect (G_OBJECT (data
.BT_change
), "clicked", G_CALLBACK (ui_dialog_upgrade_choose_currency_change_action
), &data
);
381 ui_dialog_upgrade_choose_currency_fill(&data
);
383 gtk_widget_show_all(content_grid
);
386 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
388 if(result
== GTK_RESPONSE_ACCEPT
)
391 if( data
.curfmt
!= NULL
)
393 hbfile_replace_basecurrency(data
.curfmt
);
397 // in any case set every accounts to base currency
399 list
= g_hash_table_get_values(GLOBALS
->h_acc
);
402 Account
*acc
= list
->data
;
404 account_set_currency(acc
, GLOBALS
->kcur
);
405 list
= g_list_next(list
);
409 // cleanup and destroy
410 gtk_widget_destroy (dialog
);
415 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
420 static void ui_file_chooser_add_filter(GtkFileChooser
*chooser
, gchar
*name
, gchar
*pattern
)
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
);
429 gboolean
ui_file_chooser_qif(GtkWindow
*parent
, gchar
**storage_ptr
)
434 DB( g_print("(homebank) chooser save qif\n") );
436 chooser
= gtk_file_chooser_dialog_new (
439 GTK_FILE_CHOOSER_ACTION_SAVE
,
440 _("_Cancel"), GTK_RESPONSE_CANCEL
,
441 _("_Save"), GTK_RESPONSE_ACCEPT
,
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"), "*");
450 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
452 gchar
*tmpfilename
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
454 *storage_ptr
= hb_filename_new_with_extension(tmpfilename
, "qif");
459 gtk_widget_destroy (chooser
);
467 ** open a file chooser dialog and store filename to GLOBALS if OK
469 gboolean
ui_file_chooser_csv(GtkWindow
*parent
, GtkFileChooserAction action
, gchar
**storage_ptr
, gchar
*name
)
477 DB( g_print("(hombank) csvfile chooser csv %d\n", action
) );
479 if( action
== GTK_FILE_CHOOSER_ACTION_OPEN
)
481 title
= _("Import from CSV");
483 path
= PREFS
->path_import
;
487 title
= _("Export as CSV");
489 path
= PREFS
->path_export
;
492 chooser
= gtk_file_chooser_dialog_new (title
,
494 action
, //GTK_FILE_CHOOSER_ACTION_OPEN,
495 _("_Cancel"), GTK_RESPONSE_CANCEL
,
496 button
, GTK_RESPONSE_ACCEPT
,
499 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser
), path
);
502 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(chooser
), name
);
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"), "*");
508 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
510 gchar
*tmpfilename
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
512 if( action
== GTK_FILE_CHOOSER_ACTION_SAVE
)
514 *storage_ptr
= hb_filename_new_with_extension(tmpfilename
, "csv");
519 *storage_ptr
= tmpfilename
;
524 gtk_widget_destroy (chooser
);
530 ** open a file chooser dialog and store filename to GLOBALS if OK
532 gboolean
ui_file_chooser_xhb(GtkFileChooserAction action
, gchar
**storage_ptr
)
539 DB( g_print("(ui-dialog) file chooser xhb %d\n", action
) );
541 if( action
== GTK_FILE_CHOOSER_ACTION_OPEN
)
543 title
= _("Open HomeBank file");
548 title
= _("Save HomeBank file as");
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
,
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"), "*");
563 if( action
== GTK_FILE_CHOOSER_ACTION_OPEN
)
565 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser
), PREFS
->path_hbfile
);
569 gchar
*basename
, *dirname
;
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);
575 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser
), dirname
);
576 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(chooser
), basename
);
583 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
585 *storage_ptr
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
589 gtk_widget_destroy (chooser
);
597 gboolean
ui_file_chooser_folder(GtkWindow
*parent
, gchar
*title
, gchar
**storage_ptr
)
602 DB( g_print("(ui-dialog) folder chooser\n") );
604 chooser
= gtk_file_chooser_dialog_new (title
,
606 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
,
607 _("_Cancel"), GTK_RESPONSE_CANCEL
,
608 _("_Open"), GTK_RESPONSE_ACCEPT
,
611 DB( g_print(" - set folder %s\n", *storage_ptr
) );
613 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(chooser
), *storage_ptr
);
616 if (gtk_dialog_run (GTK_DIALOG (chooser
)) == GTK_RESPONSE_ACCEPT
)
620 //nb: filename must be freed with g_free
621 filename
= gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser
));
623 DB( g_print("- folder %s\n", filename
) );
625 //todo: dangerous to do this here, review please !
626 g_free(*storage_ptr
);
627 *storage_ptr
= filename
;
629 DB( g_print("- folder stored: %s\n", *storage_ptr
) );
635 gtk_widget_destroy (chooser
);
643 ** request the user to save last change
645 gboolean
ui_dialog_msg_savechanges(GtkWidget
*widget
, gpointer user_data
)
647 gboolean retval
= TRUE
;
648 GtkWidget
*dialog
= NULL
;
651 if(GLOBALS
->changes_count
)
655 dialog
= gtk_message_dialog_new
657 GTK_WINDOW(GLOBALS
->mainwindow
),
658 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
662 _("Save changes to the file before closing?")
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
670 gtk_dialog_add_buttons (GTK_DIALOG(dialog
),
671 _("Close _without saving"), 0,
676 gtk_dialog_set_default_response(GTK_DIALOG( dialog
), 2);
678 result
= gtk_dialog_run( GTK_DIALOG( dialog
) );
679 gtk_widget_destroy( dialog
);
681 if(result
== 1 || result
== GTK_RESPONSE_DELETE_EVENT
)
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
);
703 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
706 gint
ui_dialog_export_pdf(GtkWindow
*parent
, gchar
**storage_ptr
)
708 GtkWidget
*dialog
, *content_area
, *content_grid
, *group_grid
;
709 GtkWidget
*label
, *widget
, *BT_folder
, *ST_name
;
713 dialog
= gtk_dialog_new_with_buttons (_("Export PDF"),
716 _("_Cancel"), GTK_RESPONSE_CANCEL
,
717 _("_Export"), GTK_RESPONSE_ACCEPT
,
720 gtk_window_set_default_size (GTK_WINDOW(dialog
), HB_MINWIDTH_LIST
, -1);
722 content_area
= gtk_dialog_get_content_area(GTK_DIALOG (dialog
));
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);
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);
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);
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);
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);
757 tmpstr
= g_path_get_dirname(*storage_ptr
);
758 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(BT_folder
), tmpstr
);
761 tmpstr
= g_path_get_basename(*storage_ptr
);
762 gtk_entry_set_text(GTK_ENTRY(ST_name
), tmpstr
);
766 gtk_widget_show_all(content_grid
);
769 gint result
= gtk_dialog_run (GTK_DIALOG (dialog
));
771 if(result
== GTK_RESPONSE_ACCEPT
)
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");
776 g_free(*storage_ptr
);
777 *storage_ptr
= g_build_filename(nufolder
, nufilename
, NULL
);
783 // cleanup and destroy
784 gtk_widget_destroy (dialog
);
793 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
799 GtkWidget
*srctreeview
;
804 static void ui_dialog_transaction_xfer_select_child_cb(GtkWidget
*radiobutton
, gpointer user_data
)
806 struct xfer_data
*data
;
807 GtkTreeSelection
*selection
;
808 gboolean btnew
, sensitive
;
812 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton
), GTK_TYPE_WINDOW
)), "inst_data");
814 DB( g_print("(import) account type toggle\n") );
816 btnew
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->radio
[0]));
817 gtk_widget_set_sensitive(data
->treeview
, btnew
^1);
819 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->treeview
));
820 count
= gtk_tree_selection_count_selected_rows(selection
);
823 sensitive
= (btnew
|| count
> 0) ? TRUE
: FALSE
;
825 DB( g_print("test count %d btnew %d sensitive %d\n", count
, btnew
, sensitive
) );
828 gtk_dialog_set_response_sensitive(GTK_DIALOG(data
->window
), GTK_RESPONSE_ACCEPT
, sensitive
);
832 static void ui_dialog_transaction_xfer_select_child_selection_cb(GtkTreeSelection
*treeselection
, gpointer user_data
)
834 ui_dialog_transaction_xfer_select_child_cb(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), NULL
);
838 Transaction
*ui_dialog_transaction_xfer_select_child(Transaction
*stxn
, GList
*matchlist
)
840 struct xfer_data data
;
841 GtkWidget
*window
, *content
, *mainvbox
, *vbox
, *sw
, *label
, *LB_several
;
842 GtkTreeModel
*newmodel
;
844 Transaction
*retval
= NULL
;
846 window
= gtk_dialog_new_with_buttons (
847 _("Select among possible transactions..."),
848 GTK_WINDOW (GLOBALS
->mainwindow
),
856 g_object_set_data(G_OBJECT(window
), "inst_data", (gpointer
)&data
);
857 data
.window
= window
;
859 //gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
860 gtk_window_set_default_size (GTK_WINDOW (window
), 800, 494);
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
);
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);
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);
880 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
881 gtk_box_pack_start (GTK_BOX (mainvbox
), vbox
, FALSE
, TRUE
, SPACING_SMALL
);
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);
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);
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);
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
899 gimp_label_set_attributes (GTK_LABEL (label
),
900 PANGO_ATTR_SCALE
, PANGO_SCALE_SMALL
,
902 gtk_box_pack_start (GTK_BOX (mainvbox
), label
, FALSE
, FALSE
, SPACING_SMALL
);
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
);
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);
914 /* populate source */
917 newmodel
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
.srctreeview
));
918 gtk_list_store_clear (GTK_LIST_STORE(newmodel
));
920 gtk_list_store_append (GTK_LIST_STORE(newmodel
), &newiter
);
922 gtk_list_store_set (GTK_LIST_STORE(newmodel
), &newiter
,
923 LST_DSPOPE_DATAS
, stxn
,
927 /* populate target */
928 newmodel
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
.treeview
));
929 gtk_list_store_clear (GTK_LIST_STORE(newmodel
));
931 GList
*tmplist
= g_list_first(matchlist
);
932 while (tmplist
!= NULL
)
934 Transaction
*tmp
= tmplist
->data
;
936 /* append to our treeview */
937 gtk_list_store_append (GTK_LIST_STORE(newmodel
), &newiter
);
939 gtk_list_store_set (GTK_LIST_STORE(newmodel
), &newiter
,
940 LST_DSPOPE_DATAS
, tmp
,
943 //DB( g_print(" - fill: %s %.2f %x\n", item->memo, item->amount, (unsigned int)item->same) );
945 tmplist
= g_list_next(tmplist
);
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
);
952 gtk_widget_show_all(mainvbox
);
955 gtk_widget_set_sensitive (data
.radio
[1], TRUE
);
956 if( g_list_length (matchlist
) <= 0 )
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
);
964 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
.radio
[1]), TRUE
);
965 gtk_widget_set_visible (LB_several
, TRUE
);
968 ui_dialog_transaction_xfer_select_child_cb(data
.radio
[0], NULL
);
971 gint result
= gtk_dialog_run (GTK_DIALOG (window
));
973 if(result
== GTK_RESPONSE_ACCEPT
)
977 bnew
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
.radio
[0]));
980 GtkTreeSelection
*selection
;
984 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(data
.treeview
));
985 if (gtk_tree_selection_get_selected(selection
, &model
, &iter
))
987 gtk_tree_model_get(model
, &iter
, LST_DSPOPE_DATAS
, &retval
, -1);
993 // cleanup and destroy
994 gtk_widget_destroy (window
);