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-assist-start.h"
23 #include "dsp-mainwindow.h"
24 #include "ui-currency.h"
35 /* our global datas */
36 extern struct HomeBank
*GLOBALS
;
38 extern HbKvData CYA_ACC_TYPE
[];
40 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
44 on_assistant_apply (GtkWidget
*widget
, gpointer user_data
)
46 struct assist_start_data
*data
= user_data
;
50 DB( g_print("\n[ui-start] apply\n") );
54 gchar
*owner
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_owner
));
57 hbfile_change_owner(g_strdup(owner
));
58 GLOBALS
->changes_count
++;
61 if( data
->curfmt
!= NULL
)
63 hbfile_replace_basecurrency(data
->curfmt
);
66 /* load preset categories */
67 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_load
)))
69 if(data
->pathfilename
!= NULL
)
72 category_load_csv(data
->pathfilename
, &error
);
73 //DB( g_print(" -> loaded=%d\n", ok) );
77 /* initialise an account */
78 item
= da_acc_malloc();
80 gchar
*txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_name
));
83 item
->name
= g_strdup(txt
);
84 //#1837838 remove extra lead/tail space
85 g_strstrip(item
->name
);
88 item
->kcur
= GLOBALS
->kcur
;
89 item
->type
= hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data
->CY_type
));
91 item
->number
= g_strdup(gtk_entry_get_text(GTK_ENTRY(data
->ST_number
)));
93 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_initial
));
94 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_initial
));
95 item
->initial
= value
;
97 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_minimum
));
98 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_minimum
));
99 item
->minimum
= value
;
102 GLOBALS
->changes_count
++;
104 //our global list has changed, so update the treeview
105 //todo: #1693998 crappy to do this here
106 account_compute_balances ();
107 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_TITLE
+UF_SENSITIVE
+UF_BALANCE
+UF_REFRESHALL
));
112 on_assistant_close_cancel (GtkWidget
*widget
, gpointer user_data
)
114 struct assist_start_data
*data
= user_data
;
116 DB( g_print("\n[ui-start] close/cancel\n") );
119 //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
120 gtk_widget_destroy (data
->window
);
122 g_free(data
->pathfilename
);
129 on_assistant_prepare (GtkWidget
*widget
, GtkWidget
*page
, gpointer user_data
)
131 struct assist_start_data
*data
= user_data
;
132 gint current_page
, n_pages
;
135 DB( g_print("\n[ui-start] prepare\n") );
138 current_page
= gtk_assistant_get_current_page (GTK_ASSISTANT (widget
));
139 n_pages
= gtk_assistant_get_n_pages (GTK_ASSISTANT (widget
));
141 title
= g_strdup_printf (_("New HomeBank file (%d of %d)"), current_page
+ 1, n_pages
);
142 gtk_window_set_title (GTK_WINDOW (widget
), title
);
146 switch( current_page
)
150 gchar
**langs
= (gchar
**)g_get_language_names ();
151 gchar
*txt
= g_strjoinv(", ", langs
);
153 DB( g_print("%s\n", txt
) );;
155 gtk_label_set_label(GTK_LABEL(data
->TX_lang
), txt
);
160 data
->pathfilename
= category_find_preset(&lang
);
161 if(data
->pathfilename
!= NULL
)
163 gtk_label_set_label(GTK_LABEL(data
->TX_file
), lang
);
164 gtk_widget_show(data
->CM_load
);
165 gtk_widget_show(data
->ok_image
);
166 gtk_widget_hide(data
->ko_image
);
167 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_load
), TRUE
);
171 gtk_widget_hide(data
->CM_load
);
172 gtk_label_set_label(GTK_LABEL(data
->TX_file
), _("Not found"));
173 gtk_widget_show(data
->ko_image
);
174 gtk_widget_hide(data
->ok_image
);
175 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_load
), FALSE
);
189 on_entry_changed (GtkWidget
*widget
, gpointer data
)
191 GtkAssistant
*assistant
= GTK_ASSISTANT (data
);
192 GtkWidget
*current_page
;
196 page_number
= gtk_assistant_get_current_page (assistant
);
197 current_page
= gtk_assistant_get_nth_page (assistant
, page_number
);
198 //#1837838: complete space or leadin/trialin space is possible
199 text
= g_strdup(gtk_entry_get_text (GTK_ENTRY (widget
)));
202 if (strlen(text
) > 0)
203 gtk_assistant_set_page_complete (assistant
, current_page
, TRUE
);
205 gtk_assistant_set_page_complete (assistant
, current_page
, FALSE
);
211 static void ui_start_assistant_property_change_action(GtkWidget
*widget
, gpointer user_data
)
213 struct assist_start_data
*data
;
214 struct curSelectContext selectCtx
;
216 DB( g_print("\n[ui-start] property_change_action\n") );
218 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
221 ui_cur_select_dialog_new(GTK_WINDOW(data
->window
), CUR_SELECT_MODE_BASE
, &selectCtx
);
222 if( selectCtx
.cur_4217
!= NULL
)
224 Currency4217
*curfmt
;
228 curfmt
= selectCtx
.cur_4217
;
230 DB( g_printf("- user selected: '%s' '%s'\n", curfmt
->curr_iso_code
, curfmt
->name
) );
232 data
->curfmt
= curfmt
;
236 g_snprintf(label
, 127, "%s - %s", curfmt
->curr_iso_code
, name
);
237 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
243 ui_start_assistant_property_fill (GtkWidget
*assistant
, struct assist_start_data
*data
)
248 DB( g_print("\n[ui-start] property_fill\n") );
251 gtk_entry_set_text(GTK_ENTRY(data
->ST_owner
), g_get_real_name ());
253 cur
= da_cur_get (GLOBALS
->kcur
);
255 g_snprintf(label
, 127, "%s - %s", cur
->iso_code
, cur
->name
);
256 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
262 ui_start_assistant_property_create (GtkWidget
*assistant
, struct assist_start_data
*data
)
264 GtkWidget
*table
, *label
, *widget
;
267 table
= gtk_grid_new ();
268 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
269 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
270 //gtk_container_set_border_width (GTK_CONTAINER (table), SPACING_MEDIUM);
271 gtk_widget_set_valign (table
, GTK_ALIGN_CENTER
);
274 label
= make_label_widget(_("_Owner:"));
275 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
276 widget
= make_string(label
);
277 data
->ST_owner
= widget
;
278 gtk_widget_set_hexpand(widget
, TRUE
);
279 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 2, 1);
282 label
= make_label_widget(_("Currency:"));
283 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
284 widget
= make_label (NULL
, 0, 0.5);
285 data
->LB_currency
= widget
;
286 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
287 widget
= gtk_button_new_with_mnemonic (_("_Change"));
288 data
->BT_change
= widget
;
289 gtk_grid_attach (GTK_GRID (table
), widget
, 3, row
, 1, 1);
291 g_signal_connect (G_OBJECT (data
->ST_owner
), "changed", G_CALLBACK (on_entry_changed
), assistant
);
292 g_signal_connect (G_OBJECT (data
->BT_change
), "clicked", G_CALLBACK (ui_start_assistant_property_change_action
), data
);
295 gtk_widget_show_all (table
);
296 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), table
);
298 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), table
, _("File properties"));
299 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), table
, GTK_ASSISTANT_PAGE_INTRO
);
304 ui_start_assistant_create_page2 (GtkWidget
*assistant
, struct assist_start_data
*data
)
306 GtkWidget
*box
, *hbox
, *label
, *table
, *widget
;
309 box
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
310 gtk_container_set_border_width (GTK_CONTAINER (box
), SPACING_MEDIUM
);
312 table
= gtk_grid_new ();
313 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
314 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
*2);
315 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
*2);
317 gtk_box_pack_start (GTK_BOX (box
), table
, TRUE
, TRUE
, 0);
320 label
= make_label_group(_("System detection"));
321 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
324 label
= make_label_widget(_("Languages:"));
325 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
326 widget
= make_label(NULL
, 0.0, 0.5);
327 data
->TX_lang
= widget
;
328 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
331 label
= make_label_widget(_("Preset file:"));
332 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
333 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
334 gtk_grid_attach (GTK_GRID (table
), hbox
, 2, row
, 1, 1);
336 widget
= gtk_image_new_from_icon_name(ICONNAME_HB_FILE_VALID
, GTK_ICON_SIZE_LARGE_TOOLBAR
);
337 data
->ok_image
= widget
;
338 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
340 widget
= gtk_image_new_from_icon_name(ICONNAME_HB_FILE_INVALID
, GTK_ICON_SIZE_LARGE_TOOLBAR
);
341 data
->ko_image
= widget
;
342 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
344 widget
= make_label(NULL
, 0.0, 0.5);
345 data
->TX_file
= widget
;
346 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
349 widget
= gtk_check_button_new_with_mnemonic (_("Initialize my categories with this file"));
350 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
351 data
->CM_load
= widget
;
352 gtk_grid_attach (GTK_GRID (table
), widget
, 1, row
, 3, 1);
354 gtk_widget_show_all (box
);
356 gtk_widget_hide(data
->ok_image
);
357 gtk_widget_hide(data
->ko_image
);
359 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), box
);
360 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), box
, TRUE
);
361 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), box
, _("Preset categories"));
366 ui_start_assistant_create_page3 (GtkWidget
*assistant
, struct assist_start_data
*data
)
368 GtkWidget
*box
, *label
, *widget
, *table
;
371 box
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
372 gtk_container_set_border_width (GTK_CONTAINER (box
), SPACING_MEDIUM
);
375 table
= gtk_grid_new ();
376 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
377 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
378 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
379 gtk_box_pack_start (GTK_BOX (box
), table
, TRUE
, TRUE
, 0);
382 label
= make_label_group(_("Information"));
383 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
386 label
= make_label_widget(_("_Name:"));
387 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
388 widget
= make_string(label
);
389 data
->ST_name
= widget
;
390 gtk_widget_set_hexpand(widget
, TRUE
);
391 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
393 g_signal_connect (G_OBJECT (widget
), "changed",
394 G_CALLBACK (on_entry_changed
), assistant
);
398 label
= make_label_widget(_("_Type:"));
399 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
400 //widget = make_cycle(label, CYA_ACC_TYPE);
401 widget
= hbtk_combo_box_new_with_data(label
, CYA_ACC_TYPE
);
402 data
->CY_type
= widget
;
403 gtk_widget_set_hexpand(widget
, TRUE
);
404 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
407 label
= make_label_widget(_("N_umber:"));
408 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
409 widget
= make_string(label
);
410 data
->ST_number
= widget
;
411 gtk_widget_set_hexpand(widget
, TRUE
);
412 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
418 label
= make_label_group(_("Balances"));
419 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
422 label
= make_label_widget(_("_Initial:"));
423 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
424 widget
= make_amount(label
);
425 data
->ST_initial
= widget
;
426 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
429 label
= make_label_widget(_("_Overdrawn at:"));
430 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
431 widget
= make_amount(label
);
432 data
->ST_minimum
= widget
;
433 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
435 gtk_widget_show_all (box
);
436 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), box
);
438 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), box
, _("Create an account"));
443 ui_start_assistant_create_page4 (GtkWidget
*assistant
, struct assist_start_data
*data
)
448 label
= gtk_label_new (_("This is a confirmation page, press 'Apply' to apply changes"));
450 gtk_widget_show (label
);
451 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), label
);
452 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), label
, GTK_ASSISTANT_PAGE_CONFIRM
);
453 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), label
, TRUE
);
454 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), label
, _("Confirmation"));
464 ui_start_assistant (void)
466 struct assist_start_data
*data
;
467 GtkWidget
*assistant
, *page
;
469 DB( g_print("\n[ui-start] new\n") );
472 data
= g_malloc0(sizeof(struct assist_start_data
));
473 if(!data
) return NULL
;
475 assistant
= gtk_assistant_new ();
476 data
->window
= assistant
;
478 //store our window private data
479 g_object_set_data(G_OBJECT(assistant
), "inst_data", (gpointer
)data
);
480 //DB( g_print("** (import) window=%x, inst_data=%x\n", assistant, data) );
482 gtk_window_set_default_size (GTK_WINDOW (assistant
), 400, -1);
484 gtk_window_set_modal(GTK_WINDOW (assistant
), TRUE
);
485 gtk_window_set_transient_for(GTK_WINDOW(assistant
), GTK_WINDOW(GLOBALS
->mainwindow
));
487 ui_start_assistant_property_create (assistant
, data
);
488 ui_start_assistant_create_page2 (assistant
, data
);
489 ui_start_assistant_create_page3 (assistant
, data
);
490 ui_start_assistant_create_page4 (assistant
, data
);
492 ui_start_assistant_property_fill(assistant
, data
);
494 page
= gtk_assistant_get_nth_page(GTK_ASSISTANT (assistant
), 0);
495 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), page
, TRUE
);
498 g_signal_connect (G_OBJECT (assistant
), "cancel",
499 G_CALLBACK (on_assistant_close_cancel
), data
);
500 g_signal_connect (G_OBJECT (assistant
), "close",
501 G_CALLBACK (on_assistant_close_cancel
), data
);
502 g_signal_connect (G_OBJECT (assistant
), "apply",
503 G_CALLBACK (on_assistant_apply
), data
);
504 g_signal_connect (G_OBJECT (assistant
), "prepare",
505 G_CALLBACK (on_assistant_prepare
), data
);
507 gtk_widget_show (assistant
);