GnuCash c935c2f+
Loading...
Searching...
No Matches
dialog-date-close.c
1/*
2 * dialog-date-close.c -- Dialog to ask a question and request a date
3 * Copyright (C) 2002 Derek Atkins
4 * Author: Derek Atkins <warlord@MIT.EDU>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This program 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, contact:
18 *
19 * Free Software Foundation Voice: +1-617-542-5942
20 * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
21 * Boston, MA 02110-1301, USA gnu@gnu.org
22 */
23
24#include <config.h>
25
26#include <glib/gi18n.h>
27
28#include "dialog-utils.h"
29#include "qof.h"
30#include "gnc-gui-query.h"
31#include "gnc-ui.h"
32#include "gnc-ui-util.h"
33#include "gnc-date-edit.h"
34#include "gnc-account-sel.h"
35
36#include "business-gnome-utils.h"
37#include "dialog-date-close.h"
38
39typedef struct _dialog_date_close_window
40{
41 GtkWidget *dialog;
42 GtkWidget *date;
43 GtkWidget *post_date;
44 GtkWidget *acct_combo;
45 GtkWidget *memo_entry;
46 GtkWidget *question_check;
47 GncBillTerm *terms;
48 time64 *t, *t2;
49 GList * acct_types;
50 GList * acct_commodities;
51 QofBook *book;
52 Account *acct;
53 char **memo;
54 gboolean retval;
55 gboolean answer;
57
58void gnc_dialog_date_close_ok_cb (GtkWidget *widget, gpointer user_data);
59
60
61void
62gnc_dialog_date_close_ok_cb (GtkWidget *widget, gpointer user_data)
63{
64 DialogDateClose *ddc = user_data;
65
66 if (ddc->acct_combo)
67 {
68 Account *acc;
69
70 acc = gnc_account_sel_get_account( GNC_ACCOUNT_SEL(ddc->acct_combo) );
71
72 if (!acc)
73 {
74 gnc_error_dialog (GTK_WINDOW (ddc->dialog), "%s",
75 _("No Account selected. Please try again."));
76 return;
77 }
78
80 {
81 gnc_error_dialog (GTK_WINDOW (ddc->dialog), "%s",
82 _("Placeholder account selected. Please try again."));
83 return;
84 }
85
86 ddc->acct = acc;
87 }
88
89 if (ddc->post_date)
90 *ddc->t2 = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->post_date));
91
92 if (ddc->date)
93 {
94 if (ddc->terms)
95 *ddc->t = gncBillTermComputeDueDate (ddc->terms, *ddc->t2);
96 else
97 *ddc->t = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->date));
98 }
99
100 if (ddc->memo_entry && ddc->memo)
101 *(ddc->memo) = gtk_editable_get_chars (GTK_EDITABLE (ddc->memo_entry),
102 0, -1);
103 if (ddc->question_check)
104 ddc->answer = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ddc->question_check));
105 ddc->retval = TRUE;
106}
107
108static void
109fill_in_acct_info (DialogDateClose *ddc, gboolean set_default_acct)
110{
111 GNCAccountSel *gas = GNC_ACCOUNT_SEL (ddc->acct_combo);
112
113 /* How do I set the book? */
114 gnc_account_sel_set_acct_filters( gas, ddc->acct_types, ddc->acct_commodities );
115 gnc_account_sel_set_new_account_ability( gas, TRUE );
116 gnc_account_sel_set_new_account_modal( gas, TRUE );
117 gnc_account_sel_set_account( gas, ddc->acct, set_default_acct );
118}
119
120gboolean
121gnc_dialog_date_close_parented (GtkWidget *parent, const char *message,
122 const char *label_message,
123 gboolean ok_is_default,
124 /* Returned data ... */
125 time64 *t)
126{
127 DialogDateClose *ddc;
128 GtkWidget *date_box;
129 GtkLabel *label;
130 GtkBuilder *builder;
131 gboolean retval;
132
133 if (!message || !label_message || !t)
134 return FALSE;
135
136 ddc = g_new0 (DialogDateClose, 1);
137 ddc->t = t;
138
139 builder = gtk_builder_new();
140 gnc_builder_add_from_file (builder, "dialog-date-close.glade", "date_close_dialog");
141 ddc->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "date_close_dialog"));
142
143 // Set the name for this dialog so it can be easily manipulated with css
144 gtk_widget_set_name (GTK_WIDGET(ddc->dialog), "gnc-id-date-close");
145
146 date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_box"));
147 ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
148 gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
149 gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), *t);
150
151 if (parent)
152 gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
153
154 /* Set the labels */
155 label = GTK_LABEL (gtk_builder_get_object (builder, "msg_label"));
156 gtk_label_set_text (label, message);
157 label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
158 gtk_label_set_text (label, label_message);
159
160 /* Setup signals */
161 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ddc);
162
163 gtk_widget_show_all (ddc->dialog);
164
165 ddc->retval = FALSE;
166 while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
167 {
168 /* If response is OK but flag is not set, try again */
169 if (ddc->retval)
170 break;
171 }
172
173 g_object_unref(G_OBJECT(builder));
174
175 gtk_widget_destroy(ddc->dialog);
176 retval = ddc->retval;
177 g_list_free (ddc->acct_types);
178 g_free (ddc);
179
180 return retval;
181}
182
183static void
184post_date_changed_cb (GNCDateEdit *gde, gpointer d)
185{
186 DialogDateClose *ddc = d;
187 time64 post_date;
188 time64 due_date = 0;
189
190 post_date = gnc_date_edit_get_date (gde);
191 due_date = gncBillTermComputeDueDate (ddc->terms, post_date);
192 gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), due_date);
193}
194
195gboolean
196gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
197 const char *ddue_label_message,
198 const char *post_label_message,
199 const char *acct_label_message,
200 const char *question_check_message,
201 gboolean ok_is_default,
202 gboolean set_default_acct,
203 GList * acct_types, GList * acct_commodities,
204 QofBook *book, GncBillTerm *terms,
205 /* Returned Data... */
206 time64 *ddue, time64 *post,
207 char **memo, Account **acct, gboolean *answer)
208{
209 DialogDateClose *ddc;
210 GtkLabel *label;
211 GtkWidget *date_box;
212 GtkWidget *acct_box;
213 GtkBuilder *builder;
214 gboolean retval;
215
216 if (!message || !ddue_label_message || !post_label_message ||
217 !acct_label_message || !acct_types || !book || !ddue || !post || !acct)
218 return FALSE;
219 if (question_check_message && !answer)
220 return FALSE;
221
222 ddc = g_new0 (DialogDateClose, 1);
223 ddc->t = ddue;
224 ddc->t2 = post;
225 ddc->book = book;
226 ddc->acct_types = acct_types;
227 ddc->acct_commodities = acct_commodities;
228 ddc->acct = *acct;
229 ddc->memo = memo;
230 ddc->terms = terms;
231
232 builder = gtk_builder_new();
233 gnc_builder_add_from_file (builder, "dialog-date-close.glade", "date_account_dialog");
234 ddc->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "date_account_dialog"));
235 ddc->memo_entry = GTK_WIDGET(gtk_builder_get_object (builder, "memo_entry"));
236
237 // Set the name for this dialog so it can be easily manipulated with css
238 gtk_widget_set_name (GTK_WIDGET(ddc->dialog), "gnc-id-date-close");
239
240 acct_box = GTK_WIDGET(gtk_builder_get_object (builder, "acct_hbox"));
241 ddc->acct_combo = gnc_account_sel_new();
242 gtk_box_pack_start (GTK_BOX(acct_box), ddc->acct_combo, TRUE, TRUE, 0);
243
244 date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_hbox"));
245 ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
246 gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
247
248 date_box = GTK_WIDGET(gtk_builder_get_object (builder, "post_date_box"));
249 ddc->post_date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
250 gtk_box_pack_start (GTK_BOX(date_box), ddc->post_date, TRUE, TRUE, 0);
251
252 ddc->question_check = GTK_WIDGET(gtk_builder_get_object (builder, "question_check"));
253
254 if (parent)
255 gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
256
257
258 /* Set the labels */
259 label = GTK_LABEL (gtk_builder_get_object (builder, "top_msg_label"));
260 gtk_label_set_text (label, message);
261 label = GTK_LABEL (gtk_builder_get_object (builder, "date_label"));
262 gtk_label_set_text (label, ddue_label_message);
263 label = GTK_LABEL (gtk_builder_get_object (builder, "postdate_label"));
264 gtk_label_set_text (label, post_label_message);
265 label = GTK_LABEL (gtk_builder_get_object (builder, "acct_label"));
266 gtk_label_set_text (label, acct_label_message);
267
268 if (question_check_message)
269 {
270 gtk_label_set_text(GTK_LABEL(gtk_bin_get_child (GTK_BIN(ddc->question_check))), question_check_message);
271 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ddc->question_check), *answer);
272 }
273 else
274 {
275 gtk_widget_hide(ddc->question_check);
276 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder, "hide1")));
277 }
278
279
280 /* Set the post date widget */
281 gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->post_date), *post);
282
283 /* Deal with the terms handling of the due date */
284 if (terms)
285 {
286 g_signal_connect (G_OBJECT (ddc->post_date), "date_changed",
287 G_CALLBACK (post_date_changed_cb), ddc);
288 gtk_widget_set_sensitive (ddc->date, FALSE);
289 post_date_changed_cb (GNC_DATE_EDIT (ddc->post_date), ddc);
290 }
291 else
292 gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), *ddue);
293
294 /* Setup the account widget */
295 fill_in_acct_info (ddc, set_default_acct);
296
297 /* Setup signals */
298 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ddc);
299
300 gtk_widget_show_all (ddc->dialog);
301
302 /* Set the focus on the date widget */
303 gnc_date_grab_focus (GNC_DATE_EDIT (ddc->post_date));
304
305 ddc->retval = FALSE;
306 while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
307 {
308 /* If response is OK but flag is not set, try again */
309 if (ddc->retval)
310 break;
311 }
312
313 g_object_unref(G_OBJECT(builder));
314
315 gtk_widget_destroy(ddc->dialog);
316 retval = ddc->retval;
317 *acct = ddc->acct;
318 if (question_check_message)
319 *answer = ddc->answer;
320 g_free (ddc);
321
322 return retval;
323}
324
325gboolean
326gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
327 const char *date_label_message,
328 const char *acct_label_message,
329 gboolean ok_is_default,
330 GList * acct_types, QofBook *book,
331 /* Returned Data... */
332 time64 *date, Account **acct)
333{
334 DialogDateClose *ddc;
335 GtkLabel *label;
336 GtkWidget *date_box;
337 GtkWidget *acct_box;
338 GtkBuilder *builder;
339 gboolean retval;
340
341 if (!message || !date_label_message || !acct_label_message ||
342 !acct_types || !book || !date || !acct)
343 return FALSE;
344
345 ddc = g_new0 (DialogDateClose, 1);
346 ddc->t = date;
347 ddc->book = book;
348 ddc->acct_types = acct_types;
349 ddc->acct = *acct;
350
351 builder = gtk_builder_new();
352 gnc_builder_add_from_file (builder, "dialog-date-close.glade", "date_account_dialog");
353 ddc->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "date_account_dialog"));
354
355 // Set the name for this dialog so it can be easily manipulated with css
356 gtk_widget_set_name (GTK_WIDGET(ddc->dialog), "gnc-id-date-close");
357
358 acct_box = GTK_WIDGET(gtk_builder_get_object (builder, "acct_hbox"));
359 ddc->acct_combo = gnc_account_sel_new();
360 if (*acct)
361 gnc_account_sel_set_account (GNC_ACCOUNT_SEL(ddc->acct_combo), *acct, FALSE);
362 gtk_box_pack_start (GTK_BOX(acct_box), ddc->acct_combo, TRUE, TRUE, 0);
363
364 date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_hbox"));
365 ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
366 gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
367
368 if (parent)
369 gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
370
371
372 /* Set the labels */
373 label = GTK_LABEL (gtk_builder_get_object (builder, "top_msg_label"));
374 gtk_label_set_text (label, message);
375 label = GTK_LABEL (gtk_builder_get_object (builder, "date_label"));
376 gtk_label_set_text (label, date_label_message);
377 label = GTK_LABEL (gtk_builder_get_object (builder, "acct_label"));
378 gtk_label_set_text (label, acct_label_message);
379
380 /* Set the date widget */
381 gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), *date);
382
383 /* Setup the account widget */
384 fill_in_acct_info (ddc, FALSE);
385
386 /* Setup signals */
387 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ddc);
388
389 gtk_widget_show_all (ddc->dialog);
390
391 gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "postdate_label")));
392 gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "post_date_box")));
393 gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "memo_entry")));
394 gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "memo_label")));
395
396 ddc->retval = FALSE;
397 while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
398 {
399 /* If response is OK but flag is not set, try again */
400 if (ddc->retval)
401 break;
402 }
403
404 g_object_unref(G_OBJECT(builder));
405
406 gtk_widget_destroy(ddc->dialog);
407 retval = ddc->retval;
408 *acct = ddc->acct;
409 g_free (ddc);
410
411 return retval;
412}
utility functions for the GnuCash UI
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
Definition gnc-date.h:87
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
Definition Account.cpp:4119
STRUCTS.
QofBook reference.
Definition qofbook-p.hpp:47