1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2014 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"
34 /* our global datas */
35 extern struct HomeBank
*GLOBALS
;
37 extern gchar
*CYA_ACC_TYPE
[];
39 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
43 on_assistant_apply (GtkWidget
*widget
, gpointer user_data
)
45 struct assist_start_data
*data
= user_data
;
50 gchar
*owner
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_owner
));
53 hbfile_change_owner(g_strdup(owner
));
54 GLOBALS
->changes_count
++;
58 /* load preset categories */
59 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_load
)))
61 if(data
->pathfilename
!= NULL
)
64 category_load_csv(data
->pathfilename
, &error
);
65 //DB( g_print(" -> loaded=%d\n", ok) );
69 /* initialise an account */
70 item
= da_acc_malloc();
72 gchar
*txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_name
));
75 item
->name
= g_strdup(txt
);
78 item
->type
= gtk_combo_box_get_active(GTK_COMBO_BOX(data
->CY_type
));
80 item
->number
= g_strdup(gtk_entry_get_text(GTK_ENTRY(data
->ST_number
)));
82 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_initial
));
83 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_initial
));
84 item
->initial
= value
;
86 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_minimum
));
87 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_minimum
));
88 item
->minimum
= value
;
91 GLOBALS
->changes_count
++;
93 //our global list has changed, so update the treeview
94 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_TITLE
+UF_SENSITIVE
+UF_BALANCE
+UF_REFRESHALL
));
99 on_assistant_close_cancel (GtkWidget
*widget
, gpointer user_data
)
101 struct assist_start_data
*data
= user_data
;
103 //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
104 gtk_widget_destroy (data
->assistant
);
106 g_free(data
->pathfilename
);
113 on_assistant_prepare (GtkWidget
*widget
, GtkWidget
*page
, gpointer user_data
)
115 struct assist_start_data
*data
= user_data
;
116 gint current_page
, n_pages
;
119 current_page
= gtk_assistant_get_current_page (GTK_ASSISTANT (widget
));
120 n_pages
= gtk_assistant_get_n_pages (GTK_ASSISTANT (widget
));
122 title
= g_strdup_printf (_("New HomeBank file (%d of %d)"), current_page
+ 1, n_pages
);
123 gtk_window_set_title (GTK_WINDOW (widget
), title
);
127 switch( current_page
)
131 gchar
**langs
= (gchar
**)g_get_language_names ();
132 gchar
*txt
= g_strjoinv(", ", langs
);
134 DB( g_print("%s\n", txt
) );;
136 gtk_label_set_label(GTK_LABEL(data
->TX_lang
), txt
);
141 data
->pathfilename
= category_find_preset(&lang
);
142 if(data
->pathfilename
!= NULL
)
144 gtk_label_set_label(GTK_LABEL(data
->TX_file
), lang
);
145 gtk_widget_show(data
->CM_load
);
146 gtk_widget_show(data
->ok_image
);
147 gtk_widget_hide(data
->ko_image
);
148 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_load
), TRUE
);
152 gtk_widget_hide(data
->CM_load
);
153 gtk_label_set_label(GTK_LABEL(data
->TX_file
), _("Not found"));
154 gtk_widget_show(data
->ko_image
);
155 gtk_widget_hide(data
->ok_image
);
156 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_load
), FALSE
);
169 on_entry_changed (GtkWidget
*widget
, gpointer data
)
171 GtkAssistant
*assistant
= GTK_ASSISTANT (data
);
172 GtkWidget
*current_page
;
176 page_number
= gtk_assistant_get_current_page (assistant
);
177 current_page
= gtk_assistant_get_nth_page (assistant
, page_number
);
178 text
= gtk_entry_get_text (GTK_ENTRY (widget
));
181 gtk_assistant_set_page_complete (assistant
, current_page
, TRUE
);
183 gtk_assistant_set_page_complete (assistant
, current_page
, FALSE
);
187 ui_start_assistant_create_page1 (GtkWidget
*assistant
, struct assist_start_data
*data
)
189 GtkWidget
*box
, *label
, *entry
;
192 box
= gtk_hbox_new (FALSE
, HB_BOX_SPACING
);
193 gtk_container_set_border_width (GTK_CONTAINER (box
), HB_MAINBOX_SPACING
);
196 label
= gtk_label_new (_("Owner:"));
197 gtk_box_pack_start (GTK_BOX (box
), label
, FALSE
, FALSE
, 0);
199 entry
= gtk_entry_new ();
200 data
->ST_owner
= entry
;
201 gtk_box_pack_start (GTK_BOX (box
), entry
, TRUE
, TRUE
, 0);
202 g_signal_connect (G_OBJECT (entry
), "changed",
203 G_CALLBACK (on_entry_changed
), assistant
);
205 gtk_widget_show_all (box
);
206 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), box
);
208 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), box
, _("File properties"));
209 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), box
, GTK_ASSISTANT_PAGE_INTRO
);
211 pixbuf
= gtk_widget_render_icon (assistant
, GTK_STOCK_FILE
, GTK_ICON_SIZE_DIALOG
, NULL
);
212 gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant
), box
, pixbuf
);
213 g_object_unref (pixbuf
);
217 ui_start_assistant_create_page2 (GtkWidget
*assistant
, struct assist_start_data
*data
)
219 GtkWidget
*box
, *hbox
, *label
, *table
, *widget
, *alignment
;
223 box
= gtk_vbox_new (FALSE
, HB_BOX_SPACING
);
224 gtk_container_set_border_width (GTK_CONTAINER (box
), HB_MAINBOX_SPACING
);
226 table
= gtk_table_new (12, 3, FALSE
);
227 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
228 gtk_table_set_row_spacings (GTK_TABLE (table
), HB_TABROW_SPACING
*2);
229 gtk_table_set_col_spacings (GTK_TABLE (table
), HB_TABCOL_SPACING
*2);
231 // gtk_alignment_new(xalign, yalign, xscale, yscale)
232 alignment
= gtk_alignment_new(0.5, 0.5, 1.0, 0.0);
233 gtk_container_add(GTK_CONTAINER(alignment
), table
);
234 gtk_box_pack_start (GTK_BOX (box
), alignment
, TRUE
, TRUE
, 0);
237 label
= make_label(_("System detection"), 0.0, 0.5);
238 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
239 gtk_table_attach_defaults (GTK_TABLE (table
), label
, 0, 3, row
, row
+1);
242 label
= make_label("", 0.0, 0.5);
243 gtk_misc_set_padding (GTK_MISC (label
), HB_BOX_SPACING
, 0);
244 gtk_table_attach (GTK_TABLE (table
), label
, 0, 1, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
246 label
= make_label(_("Languages:"), 0.0, 0.5);
247 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
248 widget
= make_label(NULL
, 0.0, 0.5);
249 data
->TX_lang
= widget
;
250 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
253 label
= make_label(_("Preset file:"), 0.0, 0.5);
254 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
255 hbox
= gtk_hbox_new (FALSE
, HB_BOX_SPACING
);
256 gtk_table_attach (GTK_TABLE (table
), hbox
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
258 widget
= gtk_image_new_from_stock(GTK_STOCK_YES
, GTK_ICON_SIZE_BUTTON
);
259 data
->ok_image
= widget
;
260 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
262 widget
= gtk_image_new_from_stock(GTK_STOCK_NO
, GTK_ICON_SIZE_BUTTON
);
263 data
->ko_image
= widget
;
264 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
266 widget
= make_label(NULL
, 0.0, 0.5);
267 data
->TX_file
= widget
;
268 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
271 widget
= gtk_check_button_new_with_mnemonic (_("Initialize my categories with this file"));
272 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
273 data
->CM_load
= widget
;
274 gtk_table_attach (GTK_TABLE (table
), widget
, 1, 3, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
276 gtk_widget_show_all (box
);
278 gtk_widget_hide(data
->ok_image
);
279 gtk_widget_hide(data
->ko_image
);
281 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), box
);
282 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), box
, TRUE
);
283 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), box
, _("Preset categories"));
285 pixbuf
= gtk_widget_render_icon (assistant
, GTK_STOCK_FILE
, GTK_ICON_SIZE_DIALOG
, NULL
);
286 gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant
), box
, pixbuf
);
287 g_object_unref (pixbuf
);
291 ui_start_assistant_create_page3 (GtkWidget
*assistant
, struct assist_start_data
*data
)
293 GtkWidget
*box
, *label
, *widget
, *table
, *alignment
;
297 box
= gtk_vbox_new (FALSE
, HB_BOX_SPACING
);
298 gtk_container_set_border_width (GTK_CONTAINER (box
), HB_MAINBOX_SPACING
);
301 table
= gtk_table_new (12, 3, FALSE
);
302 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
303 gtk_table_set_row_spacings (GTK_TABLE (table
), HB_TABROW_SPACING
);
304 gtk_table_set_col_spacings (GTK_TABLE (table
), HB_TABCOL_SPACING
);
306 // gtk_alignment_new(xalign, yalign, xscale, yscale)
307 alignment
= gtk_alignment_new(0.5, 0.5, 1.0, 0.0);
308 gtk_container_add(GTK_CONTAINER(alignment
), table
);
309 gtk_box_pack_start (GTK_BOX (box
), alignment
, TRUE
, TRUE
, 0);
312 label
= make_label(_("Informations"), 0.0, 0.5);
313 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
314 gtk_table_attach_defaults (GTK_TABLE (table
), label
, 0, 3, row
, row
+1);
317 label
= make_label("", 0.0, 0.5);
318 gtk_misc_set_padding (GTK_MISC (label
), HB_BOX_SPACING
, 0);
319 gtk_table_attach (GTK_TABLE (table
), label
, 0, 1, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
321 label
= make_label(_("_Name:"), 0.0, 0.5);
322 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
323 widget
= make_string(label
);
324 data
->ST_name
= widget
;
325 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
327 g_signal_connect (G_OBJECT (widget
), "changed",
328 G_CALLBACK (on_entry_changed
), assistant
);
332 label
= make_label(_("_Type:"), 0.0, 0.5);
333 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
334 widget
= make_cycle(label
, CYA_ACC_TYPE
);
335 data
->CY_type
= widget
;
336 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
339 label
= make_label(_("N_umber:"), 0.0, 0.5);
340 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
341 widget
= make_string(label
);
342 data
->ST_number
= widget
;
343 gtk_table_attach (GTK_TABLE (table
), widget
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
351 label
= make_label(_("Balances"), 0.0, 0.5);
352 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
353 gtk_table_attach_defaults (GTK_TABLE (table
), label
, 0, 3, row
, row
+1);
356 label
= gtk_label_new_with_mnemonic (_("_Initial:"));
357 gtk_misc_set_alignment (GTK_MISC (label
), 0.0, 0.5);
358 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), 0, 0);
359 widget
= make_amount(label
);
360 data
->ST_initial
= widget
;
362 // gtk_alignment_new(xalign, yalign, xscale, yscale)
363 alignment
= gtk_alignment_new(0.0, 0.5, 0.33, 0.0);
364 gtk_container_add(GTK_CONTAINER(alignment
), widget
);
365 gtk_table_attach (GTK_TABLE (table
), alignment
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
368 label
= gtk_label_new_with_mnemonic (_("_Overdrawn at:"));
369 gtk_misc_set_alignment (GTK_MISC (label
), 0.0, 0.5);
370 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1, (GtkAttachOptions
) (GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
371 widget
= make_amount(label
);
372 data
->ST_minimum
= widget
;
374 // gtk_alignment_new(xalign, yalign, xscale, yscale)
375 alignment
= gtk_alignment_new(0.0, 0.5, 0.33, 0.0);
376 gtk_container_add(GTK_CONTAINER(alignment
), widget
);
377 gtk_table_attach (GTK_TABLE (table
), alignment
, 2, 3, row
, row
+1, (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), (GtkAttachOptions
) (0), 0, 0);
382 gtk_widget_show_all (box
);
383 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), box
);
385 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), box
, _("Create an account"));
387 pixbuf
= gtk_widget_render_icon (assistant
, GTK_STOCK_FILE
, GTK_ICON_SIZE_DIALOG
, NULL
);
388 gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant
), box
, pixbuf
);
389 g_object_unref (pixbuf
);
397 ui_start_assistant_create_page4 (GtkWidget
*assistant
, struct assist_start_data
*data
)
402 label
= gtk_label_new (_("This is a confirmation page, press 'Apply' to apply changes"));
404 gtk_widget_show (label
);
405 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), label
);
406 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), label
, GTK_ASSISTANT_PAGE_CONFIRM
);
407 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), label
, TRUE
);
408 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), label
, _("Confirmation"));
410 pixbuf
= gtk_widget_render_icon (assistant
, GTK_STOCK_FILE
, GTK_ICON_SIZE_DIALOG
, NULL
);
411 gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant
), label
, pixbuf
);
412 g_object_unref (pixbuf
);
420 ui_start_assistant (void)
422 struct assist_start_data
*data
;
423 GtkWidget
*assistant
, *page
;
425 data
= g_malloc0(sizeof(struct assist_start_data
));
426 if(!data
) return NULL
;
428 assistant
= gtk_assistant_new ();
429 data
->assistant
= assistant
;
431 //store our window private data
432 g_object_set_data(G_OBJECT(assistant
), "inst_data", (gpointer
)data
);
433 //DB( g_print("** (import) window=%x, inst_data=%x\n", assistant, data) );
435 gtk_window_set_default_size (GTK_WINDOW (assistant
), 400, -1);
437 gtk_window_set_modal(GTK_WINDOW (assistant
), TRUE
);
438 gtk_window_set_transient_for(GTK_WINDOW(assistant
), GTK_WINDOW(GLOBALS
->mainwindow
));
440 ui_start_assistant_create_page1 (assistant
, data
);
441 ui_start_assistant_create_page2 (assistant
, data
);
442 ui_start_assistant_create_page3 (assistant
, data
);
443 ui_start_assistant_create_page4 (assistant
, data
);
445 gtk_entry_set_text(GTK_ENTRY(data
->ST_owner
), g_get_real_name ());
446 page
= gtk_assistant_get_nth_page(GTK_ASSISTANT (assistant
), 0);
447 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), page
, TRUE
);
450 g_signal_connect (G_OBJECT (assistant
), "cancel",
451 G_CALLBACK (on_assistant_close_cancel
), data
);
452 g_signal_connect (G_OBJECT (assistant
), "close",
453 G_CALLBACK (on_assistant_close_cancel
), data
);
454 g_signal_connect (G_OBJECT (assistant
), "apply",
455 G_CALLBACK (on_assistant_apply
), data
);
456 g_signal_connect (G_OBJECT (assistant
), "prepare",
457 G_CALLBACK (on_assistant_prepare
), data
);
459 gtk_widget_show (assistant
);