GnuCash  5.6-150-g038405b370+
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 
39 typedef 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 
58 void gnc_dialog_date_close_ok_cb (GtkWidget *widget, gpointer user_data);
59 
60 
61 void
62 gnc_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 
79  if (xaccAccountGetPlaceholder (acc))
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 
108 static void
109 fill_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 
120 gboolean
121 gnc_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 
183 static void
184 post_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 
195 gboolean
196 gnc_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 
325 gboolean
326 gnc_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
STRUCTS.
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
Definition: Account.cpp:4074
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
Definition: gnc-date.h:87