/* HomeBank -- Free, easy, personal accounting for everyone.
- * Copyright (C) 1995-2017 Maxime DOYEN
+ * Copyright (C) 1995-2019 Maxime DOYEN
*
* This file is part of HomeBank.
*
#include "homebank.h"
#include "ui-dialogs.h"
-#include "list_operation.h"
+#include "list-operation.h"
#include "hb-currency.h"
#include "ui-currency.h"
actionverb, GTK_RESPONSE_OK,
NULL);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_CANCEL,
+ -1);
if(secondtext)
{
static void ui_dialog_upgrade_choose_currency_change_action(GtkWidget *widget, gpointer user_data)
{
struct dialog_currency_data *data = user_data;
-Currency4217 *curfmt;
+struct curSelectContext selectCtx;
data->curfmt = NULL;
- curfmt = ui_cur_select_dialog_new(GTK_WINDOW(data->window), CUR_SELECT_MODE_BASE);
- if( curfmt != NULL )
+ ui_cur_select_dialog_new(GTK_WINDOW(data->window), CUR_SELECT_MODE_BASE, &selectCtx);
+ if( selectCtx.cur_4217 != NULL )
{
+ Currency4217 *curfmt;
gchar label[128];
gchar *name;
+
+ curfmt = selectCtx.cur_4217;
DB( g_printf("- user selected: '%s' '%s'\n", curfmt->curr_iso_code, curfmt->name) );
_("_OK"), GTK_RESPONSE_ACCEPT,
NULL);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
data.window = dialog;
+ widget = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
+ gtk_window_set_focus(GTK_WINDOW(dialog), widget);
+
content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
content_grid = gtk_grid_new();
-static void ui_file_chooser_add_filter(GtkFileChooser *chooser, gchar *name, gchar *pattern)
+static GtkFileFilter *ui_file_chooser_add_filter(GtkFileChooser *chooser, gchar *name, gchar *pattern)
{
GtkFileFilter *filter = gtk_file_filter_new ();
gtk_file_filter_set_name (filter, name);
gtk_file_filter_add_pattern (filter, pattern);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(chooser), filter);
+
+ return filter;
}
_("_Save"), GTK_RESPONSE_ACCEPT,
NULL);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+
//todo: change this ?
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), PREFS->path_export);
ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("QIF files"), "*.[Qq][Ii][Ff]");
{
gchar *tmpfilename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
- *storage_ptr = hb_util_filename_new_with_extension(tmpfilename, "qif");
+ *storage_ptr = hb_filename_new_with_extension(tmpfilename, "qif");
g_free(tmpfilename);
retval = TRUE;
}
button, GTK_RESPONSE_ACCEPT,
NULL);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), path);
if(name != NULL)
if( action == GTK_FILE_CHOOSER_ACTION_SAVE )
{
- *storage_ptr = hb_util_filename_new_with_extension(tmpfilename, "csv");
+ *storage_ptr = hb_filename_new_with_extension(tmpfilename, "csv");
g_free(tmpfilename);
}
else
/*
** open a file chooser dialog and store filename to GLOBALS if OK
*/
-gboolean ui_file_chooser_xhb(GtkFileChooserAction action, gchar **storage_ptr)
+gboolean ui_file_chooser_xhb(GtkFileChooserAction action, gchar **storage_ptr, gboolean bakmode)
{
GtkWidget *chooser;
gchar *title;
if( action == GTK_FILE_CHOOSER_ACTION_OPEN )
{
- title = _("Open HomeBank file");
+ title = (bakmode==FALSE) ? _("Open HomeBank file") : _("Open HomeBank backup file");
button = _("_Open");
}
else
button, GTK_RESPONSE_ACCEPT,
NULL);
- ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("HomeBank files"), "*.[Xx][Hh][Bb]");
- ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("All files"), "*");
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ -1);
+ if( bakmode == FALSE )
+ {
+ ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("HomeBank files"), "*.[Xx][Hh][Bb]");
+ ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("All files"), "*");
+ }
+ else
+ {
+ if( (action == GTK_FILE_CHOOSER_ACTION_OPEN) )
+ {
+ gchar *pattern;
+ GtkFileFilter *flt;
+
+ pattern = hb_filename_backup_get_filtername(GLOBALS->xhb_filepath);
+ flt = ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("File backup"), pattern);
+ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser), flt);
+ g_free(pattern);
+
+ ui_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), _("All backups"), "*.[Bb][Aa][Kk]");
+ }
+ }
+
if( action == GTK_FILE_CHOOSER_ACTION_OPEN )
{
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), PREFS->path_hbfile);
_("_Open"), GTK_RESPONSE_ACCEPT,
NULL);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(chooser),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
DB( g_print(" - set folder %s\n", *storage_ptr) );
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(chooser), *storage_ptr);
_("_Save"), 2,
NULL);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
+ 0,
+ 2,
+ 1,
+ -1);
+
gtk_dialog_set_default_response(GTK_DIALOG( dialog ), 2);
- result = gtk_dialog_run( GTK_DIALOG( dialog ) );
- gtk_widget_destroy( dialog );
+ result = gtk_dialog_run( GTK_DIALOG( dialog ) );
+ gtk_widget_destroy( dialog );
- if(result == 1 || result == GTK_RESPONSE_DELETE_EVENT)
+ if(result == 1 || result == GTK_RESPONSE_DELETE_EVENT)
{
- retval = FALSE;
+ retval = FALSE;
}
else
{
- if(result == 2)
- {
- DB( g_print(" + should quick save %s\n", GLOBALS->xhb_filepath) );
- homebank_save_xml(GLOBALS->xhb_filepath);
- }
+ if(result == 2)
+ {
+ DB( g_print(" + should quick save %s\n", GLOBALS->xhb_filepath) );
+ //todo: should migrate this
+ //#1720377 also backup
+ homebank_file_ensure_xhb(NULL);
+ homebank_backup_current_file();
+ homebank_save_xml(GLOBALS->xhb_filepath);
+ }
}
+ }
+ return retval;
+}
+
+
+/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
+
+gint ui_dialog_export_pdf(GtkWindow *parent, gchar **storage_ptr)
+{
+GtkWidget *dialog, *content_area, *content_grid, *group_grid;
+GtkWidget *label, *widget, *BT_folder, *ST_name;
+gchar *tmpstr;
+gint crow, row;
+ dialog = gtk_dialog_new_with_buttons (_("Export as PDF"),
+ GTK_WINDOW (parent),
+ 0,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("Export as _PDF"), GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(dialog),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+
+ gtk_window_set_default_size (GTK_WINDOW(dialog), HB_MINWIDTH_LIST, -1);
+
+ content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));
+
+ content_grid = gtk_grid_new();
+ gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
+ gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
+ gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
+ gtk_box_pack_start (GTK_BOX (content_area), content_grid, TRUE, TRUE, 0);
+
+ crow = 0;
+ // group :: file title
+ group_grid = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
+ gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
+ gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
+
+ row = 0;
+ widget = gtk_image_new_from_icon_name (ICONNAME_WARNING, GTK_ICON_SIZE_DIALOG);
+ gtk_grid_attach (GTK_GRID (group_grid), widget, 0, row, 1, 1);
+ label = gtk_label_new("This feature is still in development state,\n(maybe not stable) so use it at your own risk!");
+ gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
+
+ row++;
+ label = make_label_widget(_("Folder:"));
+ gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
+ BT_folder = gtk_file_chooser_button_new (_("Pick a Folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+ gtk_grid_attach (GTK_GRID (group_grid), BT_folder, 1, row, 1, 1);
+
+ row++;
+ label = make_label_widget(_("Filename:"));
+ gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1);
+ ST_name = make_string (label);
+ gtk_grid_attach (GTK_GRID (group_grid), ST_name, 1, row, 1, 1);
+
+
+ //setup
+ tmpstr = g_path_get_dirname(*storage_ptr);
+ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(BT_folder), tmpstr);
+ g_free(tmpstr);
+
+ tmpstr = g_path_get_basename(*storage_ptr);
+ gtk_entry_set_text(GTK_ENTRY(ST_name), tmpstr);
+ g_free(tmpstr);
+
+
+ gtk_widget_show_all(content_grid);
+
+ //wait for the user
+ gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+
+ if(result == GTK_RESPONSE_ACCEPT)
+ {
+ gchar *hostname;
+ //#300380 fixed export path problem (was always the export of preference)
+ //not to be used -- gchar *nufolder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(BT_folder));
+ gchar *urifolder = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(BT_folder));
+ gchar *nufolder = g_filename_from_uri(urifolder, &hostname, NULL);
+ gchar *nufilename = hb_filename_new_with_extension((gchar *)gtk_entry_get_text (GTK_ENTRY(ST_name)), "pdf");
+
+ g_free(*storage_ptr);
+ *storage_ptr = g_build_filename(nufolder, nufilename, NULL);
+
+ g_free(nufilename);
+ g_free(nufolder);
+ g_free(urifolder);
}
- return retval;
+
+ // cleanup and destroy
+ gtk_widget_destroy (dialog);
+
+ return result;
}
+
+
+
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
struct xfer_data
GtkWidget *window;
GtkWidget *radio[2];
GtkWidget *srctreeview;
+ GtkWidget *lb_several;
GtkWidget *treeview;
};
GtkTreeSelection *selection;
gboolean btnew, sensitive;
gint count;
-
-
- data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton), GTK_TYPE_WINDOW)), "inst_data");
DB( g_print("(import) account type toggle\n") );
+
+ data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton), GTK_TYPE_WINDOW)), "inst_data");
btnew = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->radio[0]));
- gtk_widget_set_sensitive(data->treeview, btnew^1);
-
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->treeview));
count = gtk_tree_selection_count_selected_rows(selection);
+ if(btnew)
+ gtk_tree_selection_unselect_all(selection);
+
+ sensitive = btnew^1;
+ gtk_widget_set_sensitive(data->lb_several, sensitive);
+ gtk_widget_set_sensitive(data->treeview, sensitive);
sensitive = (btnew || count > 0) ? TRUE : FALSE;
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_ACCEPT, sensitive);
DB( g_print("test count %d btnew %d sensitive %d\n", count, btnew, sensitive) );
-
- gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_ACCEPT, sensitive);
-
}
static void ui_dialog_transaction_xfer_select_child_selection_cb(GtkTreeSelection *treeselection, gpointer user_data)
}
-Transaction *ui_dialog_transaction_xfer_select_child(Transaction *stxn, GList *matchlist)
+gint ui_dialog_transaction_xfer_select_child(GtkWindow *parent, Transaction *stxn, GList *matchlist, Transaction **child)
{
struct xfer_data data;
-GtkWidget *window, *content, *mainvbox, *vbox, *sw, *label, *LB_several;
+GtkWidget *window, *content, *mainvbox, *vbox, *sw, *label;
GtkTreeModel *newmodel;
GtkTreeIter newiter;
-Transaction *retval = NULL;
window = gtk_dialog_new_with_buttons (
_("Select among possible transactions..."),
- GTK_WINDOW (GLOBALS->mainwindow),
+ parent,
0,
- _("_Cancel"),
- GTK_RESPONSE_REJECT,
- _("_OK"),
- GTK_RESPONSE_ACCEPT,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_OK"), GTK_RESPONSE_ACCEPT,
NULL);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG(window),
+ GTK_RESPONSE_ACCEPT,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data);
data.window = window;
"HomeBank has found some transaction that may be " \
"the associated transaction for the internal transfer."), 0.0, 0.5
);
- LB_several = label;
+ data.lb_several = label;
gimp_label_set_attributes (GTK_LABEL (label),
PANGO_ATTR_SCALE, PANGO_SCALE_SMALL,
-1);
gtk_list_store_append (GTK_LIST_STORE(newmodel), &newiter);
gtk_list_store_set (GTK_LIST_STORE(newmodel), &newiter,
- LST_DSPOPE_DATAS, stxn,
+ MODEL_TXN_POINTER, stxn,
-1);
}
gtk_list_store_append (GTK_LIST_STORE(newmodel), &newiter);
gtk_list_store_set (GTK_LIST_STORE(newmodel), &newiter,
- LST_DSPOPE_DATAS, tmp,
+ MODEL_TXN_POINTER, tmp,
-1);
- //DB( g_print(" - fill: %s %.2f %x\n", item->wording, item->amount, (unsigned int)item->same) );
+ //DB( g_print(" - fill: %s %.2f %x\n", item->memo, item->amount, (unsigned int)item->same) );
tmplist = g_list_next(tmplist);
}
{
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data.radio[0]), TRUE);
gtk_widget_set_sensitive (data.radio[1], FALSE);
- gtk_widget_set_visible (LB_several, FALSE);
+ gtk_widget_set_visible (data.lb_several, FALSE);
}
else
{
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data.radio[1]), TRUE);
- gtk_widget_set_visible (LB_several, TRUE);
+ gtk_widget_set_visible (data.lb_several, TRUE);
}
ui_dialog_transaction_xfer_select_child_cb(data.radio[0], NULL);
//wait for the user
gint result = gtk_dialog_run (GTK_DIALOG (window));
+ *child = NULL;
if(result == GTK_RESPONSE_ACCEPT)
{
gboolean bnew;
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data.treeview));
if (gtk_tree_selection_get_selected(selection, &model, &iter))
{
- gtk_tree_model_get(model, &iter, LST_DSPOPE_DATAS, &retval, -1);
+ gtk_tree_model_get(model, &iter, MODEL_TXN_POINTER, child, -1);
}
}
-
}
+ DB( g_print(" return %d child = %p\n", result, child) );
+
+
// cleanup and destroy
gtk_widget_destroy (window);
- return retval;
+ return result;
}