1 /*  HomeBank -- Free, easy, personal accounting for everyone.
2  *  Copyright (C) 1995-2021 Maxime DOYEN
3  *
4  *  This file is part of HomeBank.
5  *
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.
10  *
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.
15  *
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/>.
18  */
19 
20 
21 #include "homebank.h"
22 
23 #include "ui-hbfile.h"
24 #include "ui-category.h"
25 
26 /****************************************************************************/
27 /* Debug macros                                                             */
28 /****************************************************************************/
29 #define MYDEBUG 0
30 
31 #if MYDEBUG
32 #define DB(x) (x);
33 #else
34 #define DB(x);
35 #endif
36 
37 /* our global datas */
38 extern struct HomeBank *GLOBALS;
39 
40 
41 
42 
43 
44 /*
45 ** get widgets contents from the selected account
46 */
defhbfile_get(GtkWidget * widget,gpointer user_data)47 static void defhbfile_get(GtkWidget *widget, gpointer user_data)
48 {
49 struct defhbfile_data *data;
50 gchar	*owner;
51 guint32	vehicle;
52 gint	smode, weekday, nbdays;
53 
54 	DB( g_print("(ui-hbfile) get\n") );
55 
56 	data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
57 
58 	// get values
59 	owner = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_owner));
60 	vehicle   = ui_cat_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_grp));
61 	if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->radio[0])) )
62 		smode = 0;
63 	else
64 		smode = 1;
65 	weekday = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NU_weekday));
66 	nbdays  = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NU_nbdays));
67 
68 	// check for changes
69 	if(strcasecmp(owner, GLOBALS->owner))
70 		data->change++;
71 	if(vehicle != GLOBALS->vehicle_category)
72 		data->change++;
73 	if(smode != GLOBALS->auto_smode)
74 		data->change++;
75 	if(weekday != GLOBALS->auto_weekday)
76 		data->change++;
77 	if(nbdays != GLOBALS->auto_nbdays)
78 		data->change++;
79 
80 	// update
81 	if (owner && *owner)
82 		hbfile_change_owner(g_strdup(owner));
83 
84 	GLOBALS->vehicle_category = vehicle;
85 	GLOBALS->auto_smode   = smode;
86 	GLOBALS->auto_weekday = weekday;
87 	GLOBALS->auto_nbdays  = nbdays;
88 
89 	DB( g_print(" -> owner %s\n", GLOBALS->owner) );
90 	DB( g_print(" -> ccgrp %d\n", GLOBALS->vehicle_category) );
91 	DB( g_print(" -> smode %d\n", GLOBALS->auto_smode) );
92 	DB( g_print(" -> weekday %d\n", GLOBALS->auto_weekday) );
93 	DB( g_print(" -> nbdays %d\n", GLOBALS->auto_nbdays) );
94 
95 }
96 
97 
98 /*
99 ** set widgets contents from the selected account
100 */
defhbfile_set(GtkWidget * widget,gpointer user_data)101 static void defhbfile_set(GtkWidget *widget, gpointer user_data)
102 {
103 struct defhbfile_data *data;
104 
105 	DB( g_print("(ui-hbfile) set\n") );
106 
107 	data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
108 
109 	DB( g_print(" -> ccgrp %d\n", GLOBALS->vehicle_category) );
110 	DB( g_print(" -> autoinsert %d\n", GLOBALS->auto_nbdays) );
111 
112 	if(GLOBALS->owner) gtk_entry_set_text(GTK_ENTRY(data->ST_owner), GLOBALS->owner);
113 	ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_grp), GLOBALS->vehicle_category);
114 
115 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->radio[GLOBALS->auto_smode]), TRUE);
116 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NU_nbdays), GLOBALS->auto_nbdays);
117 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->NU_weekday), GLOBALS->auto_weekday);
118 
119 
120 }
121 
defhbfile_toggle(GtkRadioButton * radiobutton,gpointer user_data)122 static void defhbfile_toggle(GtkRadioButton *radiobutton, gpointer user_data)
123 {
124 struct defhbfile_data *data;
125 gboolean sensitive;
126 
127 	data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton), GTK_TYPE_WINDOW)), "inst_data");
128 
129 	DB( g_print("\n(defhbfile_data) toggle\n") );
130 
131 	sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->radio[0]));
132 
133 	DB( g_print(" -> radio[0]=%d %s\n", sensitive, sensitive ? "add until" : "add every x") );
134 
135 	gtk_widget_set_sensitive (data->LB_nbdays, !sensitive);
136 	gtk_widget_set_sensitive (data->LB_weekday, sensitive);
137 
138 	gtk_widget_set_sensitive (data->NU_nbdays, !sensitive);
139 	gtk_widget_set_sensitive (data->NU_weekday, sensitive);
140 
141 }
142 
143 
144 /*
145 **
146 */
defhbfile_cleanup(struct defhbfile_data * data,gint result)147 static gboolean defhbfile_cleanup(struct defhbfile_data *data, gint result)
148 {
149 gboolean doupdate = FALSE;
150 
151 	DB( g_print("(ui-hbfile) cleanup\n") );
152 
153 	if(result == GTK_RESPONSE_ACCEPT)
154 	{
155 		defhbfile_get(data->ST_owner, NULL);
156 
157 
158 		DB( g_print(" -> GLOBAL change = %d\n", GLOBALS->changes_count) );
159 
160 		DB( g_print(" -> we update, change = %d\n", data->change) );
161 
162 
163 		GLOBALS->changes_count += data->change;
164 	}
165 	return doupdate;
166 }
167 
168 /*
169 **
170 */
defhbfile_setup(struct defhbfile_data * data)171 static void defhbfile_setup(struct defhbfile_data *data)
172 {
173 	DB( g_print("(ui-hbfile) setup\n") );
174 
175 	data->change = 0;
176 
177 	ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data->PO_grp), GLOBALS->h_cat);
178 
179 	defhbfile_set(data->ST_owner, NULL);
180 
181 }
182 
183 
create_defhbfile_dialog(void)184 GtkWidget *create_defhbfile_dialog (void)
185 {
186 struct defhbfile_data *data;
187 GtkWidget *dialog, *content_area, *content_grid, *group_grid;
188 GtkWidget *label, *widget;
189 gint crow, row;
190 
191 	data = g_malloc0(sizeof(struct defhbfile_data));
192 	if(!data) return NULL;
193 
194 	dialog = gtk_dialog_new_with_buttons (_("File properties"),
195 				GTK_WINDOW(GLOBALS->mainwindow),
196 				0,
197 				_("_Cancel"),
198 				GTK_RESPONSE_REJECT,
199 				_("_OK"),
200 				GTK_RESPONSE_ACCEPT,
201 				NULL);
202 
203 	//store our dialog private data
204 	g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)data);
205 	DB( g_print("(defaccount) dialog=%p, inst_data=%p\n", dialog, data) );
206 
207 	gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_PROPERTIES);
208 	gtk_window_set_resizable(GTK_WINDOW (dialog), FALSE);
209 
210 	content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));	// return a vbox
211 
212 	content_grid = gtk_grid_new();
213 	gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
214 	gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
215 	gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
216 	gtk_box_pack_start (GTK_BOX (content_area), content_grid, TRUE, TRUE, 0);
217 
218 	crow = 0;
219 	// group :: General
220     group_grid = gtk_grid_new ();
221 	gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
222 	gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
223 	gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
224 
225 	label = make_label_group(_("General"));
226 	gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
227 
228 	row = 1;
229 	label = make_label_widget(_("_Title:"));
230 	gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
231 	widget = make_string(label);
232 	data->ST_owner = widget;
233 	gtk_widget_set_hexpand(widget, TRUE);
234 	gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
235 
236 	// group :: Scheduled transaction
237     group_grid = gtk_grid_new ();
238 	gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
239 	gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
240 	gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
241 
242 	label = make_label_group(_("Scheduled transaction"));
243 	gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 4, 1);
244 
245 	row = 1;
246 	widget = gtk_radio_button_new_with_label (NULL, _("add until"));
247 	data->radio[0] = widget;
248 	gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
249 
250 	widget = make_numeric(NULL, 1, 28);
251 	data->NU_weekday = widget;
252 	gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
253 
254 	label = make_label(_("of each month (excluded)"), 0.0, 0.5);
255 	data->LB_weekday = label;
256 	gtk_grid_attach (GTK_GRID (group_grid), label, 3, row, 1, 1);
257 
258 	row++;
259 	widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON (data->radio[0]), _("add"));
260 	data->radio[1] = widget;
261 	gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1);
262 
263 	widget = make_numeric(NULL, 0, 366);
264 	data->NU_nbdays = widget;
265 	gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
266 
267 	//TRANSLATORS: there is a spinner on the left of this label, and so you have 0....x days in advance the current date
268 	label = make_label(_("days in advance the current date"), 0.0, 0.5);
269 	data->LB_nbdays = label;
270 	gtk_grid_attach (GTK_GRID (group_grid), label, 3, row, 1, 1);
271 
272 	// group :: Scheduled transaction
273     group_grid = gtk_grid_new ();
274 	gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
275 	gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
276 	gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
277 
278 	label = make_label_group(_("Vehicle cost"));
279 	gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
280 
281 	row = 1;
282 	label = make_label_widget(_("_Category:"));
283 	gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
284 	widget = ui_cat_comboboxentry_new(label);
285 	data->PO_grp = widget;
286 	gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
287 
288 
289 	//connect all our signals
290 	g_signal_connect (dialog, "destroy", G_CALLBACK (gtk_widget_destroyed), &dialog);
291 
292 	g_signal_connect (data->radio[0], "toggled", G_CALLBACK (defhbfile_toggle), NULL);
293 
294 
295 	//setup, init and show window
296 	defhbfile_setup(data);
297 	//defhbfile_update(data->LV_arc, NULL);
298 
299 	gtk_widget_show_all (dialog);
300 
301 	//wait for the user
302 	gint result = gtk_dialog_run (GTK_DIALOG (dialog));
303 
304 	// cleanup and destroy
305 	defhbfile_cleanup(data, result);
306 	gtk_widget_destroy (dialog);
307 
308 	g_free(data);
309 
310 	return dialog;
311 }
312