GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
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 <[email protected]>
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 [email protected]
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 
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  Timespec *ts, *ts2;
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 (ddc->dialog, "%s",
75  _("No Account selected. Please try again."));
76  return;
77  }
78 
79  if (xaccAccountGetPlaceholder (acc))
80  {
81  gnc_error_dialog (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->ts2) = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (ddc->post_date));
91 
92  if (ddc->date)
93  {
94  if (ddc->terms)
95  *(ddc->ts) = gncBillTermComputeDueDate (ddc->terms, *(ddc->ts2));
96  else
97  *(ddc->ts) = gnc_date_edit_get_date_ts (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  Timespec *ts)
126 {
127  DialogDateClose *ddc;
128  GtkWidget *date_box;
129  GtkLabel *label;
130  GtkBuilder *builder;
131  gboolean retval;
132 
133  if (!message || !label_message || !ts)
134  return FALSE;
135 
136  ddc = g_new0 (DialogDateClose, 1);
137  ddc->ts = ts;
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  date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_box"));
144  ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
145  gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
146  gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *ts);
147 
148  if (parent)
149  gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
150 
151  /* Set the labels */
152  label = GTK_LABEL (gtk_builder_get_object (builder, "msg_label"));
153  gtk_label_set_text (label, message);
154  label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
155  gtk_label_set_text (label, label_message);
156 
157  /* Setup signals */
158  gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ddc);
159 
160  gtk_widget_show_all (ddc->dialog);
161 
162  ddc->retval = FALSE;
163  while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
164  {
165  /* If response is OK but flag is not set, try again */
166  if (ddc->retval)
167  break;
168  }
169 
170  g_object_unref(G_OBJECT(builder));
171 
172  gtk_widget_destroy(ddc->dialog);
173  retval = ddc->retval;
174  g_list_free (ddc->acct_types);
175  g_free (ddc);
176 
177  return retval;
178 }
179 
180 static void
181 post_date_changed_cb (GNCDateEdit *gde, gpointer d)
182 {
183  DialogDateClose *ddc = d;
184  Timespec post_date;
185  Timespec due_date;
186 
187  post_date = gnc_date_edit_get_date_ts (gde);
188  due_date = gncBillTermComputeDueDate (ddc->terms, post_date);
189  gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), due_date);
190 }
191 
192 gboolean
193 gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
194  const char *ddue_label_message,
195  const char *post_label_message,
196  const char *acct_label_message,
197  const char *question_check_message,
198  gboolean ok_is_default,
199  gboolean set_default_acct,
200  GList * acct_types, GList * acct_commodities,
201  QofBook *book, GncBillTerm *terms,
202  /* Returned Data... */
203  Timespec *ddue, Timespec *post,
204  char **memo, Account **acct, gboolean *answer)
205 {
206  DialogDateClose *ddc;
207  GtkLabel *label;
208  GtkWidget *date_box;
209  GtkWidget *acct_box;
210  GtkBuilder *builder;
211  gboolean retval;
212 
213  if (!message || !ddue_label_message || !post_label_message ||
214  !acct_label_message || !acct_types || !book || !ddue || !post || !acct)
215  return FALSE;
216  if (question_check_message && !answer)
217  return FALSE;
218 
219  ddc = g_new0 (DialogDateClose, 1);
220  ddc->ts = ddue;
221  ddc->ts2 = post;
222  ddc->book = book;
223  ddc->acct_types = acct_types;
224  ddc->acct_commodities = acct_commodities;
225  ddc->acct = *acct;
226  ddc->memo = memo;
227  ddc->terms = terms;
228 
229  builder = gtk_builder_new();
230  gnc_builder_add_from_file (builder, "dialog-date-close.glade", "Date Account Dialog");
231  ddc->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Date Account Dialog"));
232  ddc->memo_entry = GTK_WIDGET(gtk_builder_get_object (builder, "memo_entry"));
233 
234  acct_box = GTK_WIDGET(gtk_builder_get_object (builder, "acct_hbox"));
235  ddc->acct_combo = gnc_account_sel_new();
236  gtk_box_pack_start (GTK_BOX(acct_box), ddc->acct_combo, TRUE, TRUE, 0);
237 
238  date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_hbox"));
239  ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
240  gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
241 
242  date_box = GTK_WIDGET(gtk_builder_get_object (builder, "post_date_box"));
243  ddc->post_date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
244  gtk_box_pack_start (GTK_BOX(date_box), ddc->post_date, TRUE, TRUE, 0);
245 
246  ddc->question_check = GTK_WIDGET(gtk_builder_get_object (builder, "question_check"));
247 
248  if (parent)
249  gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
250 
251 
252  /* Set the labels */
253  label = GTK_LABEL (gtk_builder_get_object (builder, "top_msg_label"));
254  gtk_label_set_text (label, message);
255  label = GTK_LABEL (gtk_builder_get_object (builder, "date_label"));
256  gtk_label_set_text (label, ddue_label_message);
257  label = GTK_LABEL (gtk_builder_get_object (builder, "postdate_label"));
258  gtk_label_set_text (label, post_label_message);
259  label = GTK_LABEL (gtk_builder_get_object (builder, "acct_label"));
260  gtk_label_set_text (label, acct_label_message);
261 
262  if (question_check_message)
263  {
264  gtk_label_set_text(GTK_LABEL(GTK_BIN(ddc->question_check)->child), question_check_message);
265  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ddc->question_check), *answer);
266  }
267  else
268  {
269  gtk_widget_hide(ddc->question_check);
270  gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object (builder, "hide1")));
271  }
272 
273 
274  /* Set the post date widget */
275  gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->post_date), *post);
276 
277  /* Deal with the terms handling of the due date */
278  if (terms)
279  {
280  g_signal_connect (G_OBJECT (ddc->post_date), "date_changed",
281  G_CALLBACK (post_date_changed_cb), ddc);
282  gtk_widget_set_sensitive (ddc->date, FALSE);
283  post_date_changed_cb (GNC_DATE_EDIT (ddc->post_date), ddc);
284  }
285  else
286  gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *ddue);
287 
288  /* Setup the account widget */
289  fill_in_acct_info (ddc, set_default_acct);
290 
291  /* Setup signals */
292  gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ddc);
293 
294  gtk_widget_show_all (ddc->dialog);
295 
296  /* Set the focus on the date widget */
297  gnc_date_grab_focus (GNC_DATE_EDIT (ddc->post_date));
298 
299  ddc->retval = FALSE;
300  while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
301  {
302  /* If response is OK but flag is not set, try again */
303  if (ddc->retval)
304  break;
305  }
306 
307  g_object_unref(G_OBJECT(builder));
308 
309  gtk_widget_destroy(ddc->dialog);
310  retval = ddc->retval;
311  *acct = ddc->acct;
312  if (question_check_message)
313  *answer = ddc->answer;
314  g_free (ddc);
315 
316  return retval;
317 }
318 
319 gboolean
320 gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
321  const char *date_label_message,
322  const char *acct_label_message,
323  gboolean ok_is_default,
324  GList * acct_types, QofBook *book,
325  /* Returned Data... */
326  Timespec *date, Account **acct)
327 {
328  DialogDateClose *ddc;
329  GtkLabel *label;
330  GtkWidget *date_box;
331  GtkWidget *acct_box;
332  GtkBuilder *builder;
333  gboolean retval;
334 
335  if (!message || !date_label_message || !acct_label_message ||
336  !acct_types || !book || !date || !acct)
337  return FALSE;
338 
339  ddc = g_new0 (DialogDateClose, 1);
340  ddc->ts = date;
341  ddc->book = book;
342  ddc->acct_types = acct_types;
343  ddc->acct = *acct;
344 
345  builder = gtk_builder_new();
346  gnc_builder_add_from_file (builder, "dialog-date-close.glade", "Date Account Dialog");
347  ddc->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Date Account Dialog"));
348 
349  acct_box = GTK_WIDGET(gtk_builder_get_object (builder, "acct_hbox"));
350  ddc->acct_combo = gnc_account_sel_new();
351  if (*acct)
352  gnc_account_sel_set_account (GNC_ACCOUNT_SEL(ddc->acct_combo), *acct, FALSE);
353  gtk_box_pack_start (GTK_BOX(acct_box), ddc->acct_combo, TRUE, TRUE, 0);
354 
355  date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_hbox"));
356  ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
357  gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
358 
359  if (parent)
360  gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
361 
362 
363  /* Set the labels */
364  label = GTK_LABEL (gtk_builder_get_object (builder, "top_msg_label"));
365  gtk_label_set_text (label, message);
366  label = GTK_LABEL (gtk_builder_get_object (builder, "date_label"));
367  gtk_label_set_text (label, date_label_message);
368  label = GTK_LABEL (gtk_builder_get_object (builder, "acct_label"));
369  gtk_label_set_text (label, acct_label_message);
370 
371  /* Set the date widget */
372  gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *date);
373 
374  /* Setup the account widget */
375  fill_in_acct_info (ddc, FALSE);
376 
377  /* Setup signals */
378  gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ddc);
379 
380  gtk_widget_show_all (ddc->dialog);
381 
382  gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "postdate_label")));
383  gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "post_date_box")));
384  gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "memo_entry")));
385  gtk_widget_hide (GTK_WIDGET(gtk_builder_get_object (builder, "memo_label")));
386 
387  ddc->retval = FALSE;
388  while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
389  {
390  /* If response is OK but flag is not set, try again */
391  if (ddc->retval)
392  break;
393  }
394 
395  g_object_unref(G_OBJECT(builder));
396 
397  gtk_widget_destroy(ddc->dialog);
398  retval = ddc->retval;
399  *acct = ddc->acct;
400  g_free (ddc);
401 
402  return retval;
403 }
utility functions for the GnuCash UI
Use a 64-bit unsigned int timespec.
Definition: gnc-date.h:299
gboolean xaccAccountGetPlaceholder(const Account *acc)
Definition: Account.c:3912