00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025
00026 #include <gnome.h>
00027 #include <glib/gi18n.h>
00028
00029 #include "dialog-utils.h"
00030 #include "qof.h"
00031 #include "gnc-gui-query.h"
00032 #include "gnc-ui.h"
00033 #include "gnc-ui-util.h"
00034 #include "gnc-date-edit.h"
00035 #include "gnc-account-sel.h"
00036
00037 #include "business-gnome-utils.h"
00038 #include "dialog-date-close.h"
00039
00040 typedef struct _dialog_date_close_window
00041 {
00042 GtkWidget *dialog;
00043 GtkWidget *date;
00044 GtkWidget *post_date;
00045 GtkWidget *acct_combo;
00046 GtkWidget *memo_entry;
00047 GtkWidget *question_check;
00048 GncBillTerm *terms;
00049 Timespec *ts, *ts2;
00050 GList * acct_types;
00051 GList * acct_commodities;
00052 QofBook *book;
00053 Account *acct;
00054 char **memo;
00055 gboolean retval;
00056 gboolean answer;
00057 } DialogDateClose;
00058
00059 void gnc_dialog_date_close_ok_cb (GtkWidget *widget, gpointer user_data);
00060
00061
00062 void
00063 gnc_dialog_date_close_ok_cb (GtkWidget *widget, gpointer user_data)
00064 {
00065 DialogDateClose *ddc = user_data;
00066
00067 if (ddc->acct_combo)
00068 {
00069 Account *acc;
00070
00071 acc = gnc_account_sel_get_account( GNC_ACCOUNT_SEL(ddc->acct_combo) );
00072
00073 if (!acc)
00074 {
00075 gnc_error_dialog (ddc->dialog, "%s",
00076 _("No Account selected. Please try again."));
00077 return;
00078 }
00079
00080 if (xaccAccountGetPlaceholder (acc))
00081 {
00082 gnc_error_dialog (ddc->dialog, "%s",
00083 _("Placeholder account selected. Please try again."));
00084 return;
00085 }
00086
00087 ddc->acct = acc;
00088 }
00089
00090 if (ddc->post_date)
00091 *(ddc->ts2) = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (ddc->post_date));
00092
00093 if (ddc->date)
00094 {
00095 if (ddc->terms)
00096 *(ddc->ts) = gncBillTermComputeDueDate (ddc->terms, *(ddc->ts2));
00097 else
00098 *(ddc->ts) = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (ddc->date));
00099 }
00100
00101 if (ddc->memo_entry && ddc->memo)
00102 *(ddc->memo) = gtk_editable_get_chars (GTK_EDITABLE (ddc->memo_entry),
00103 0, -1);
00104 if (ddc->question_check)
00105 ddc->answer = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ddc->question_check));
00106 ddc->retval = TRUE;
00107 }
00108
00109 static void
00110 fill_in_acct_info (DialogDateClose *ddc, gboolean set_default_acct)
00111 {
00112 GNCAccountSel *gas = GNC_ACCOUNT_SEL (ddc->acct_combo);
00113
00114
00115 gnc_account_sel_set_acct_filters( gas, ddc->acct_types, ddc->acct_commodities );
00116 gnc_account_sel_set_new_account_ability( gas, TRUE );
00117 gnc_account_sel_set_new_account_modal( gas, TRUE );
00118 gnc_account_sel_set_account( gas, ddc->acct, set_default_acct );
00119 }
00120
00121 static void
00122 build_date_close_window (GtkWidget *hbox, const char *message)
00123 {
00124 GtkWidget *pixmap = NULL;
00125 GtkWidget *label;
00126 GtkWidget *alignment;
00127 char *s;
00128
00129 s = gnome_program_locate_file (NULL,
00130 GNOME_FILE_DOMAIN_PIXMAP,
00131 "gnome-question.png", TRUE, NULL);
00132 if (s)
00133 {
00134 pixmap = gtk_image_new_from_file(s);
00135 g_free(s);
00136 }
00137
00138 if (pixmap)
00139 {
00140 gtk_box_pack_start (GTK_BOX(hbox), pixmap, FALSE, TRUE, 0);
00141 gtk_widget_show (pixmap);
00142 }
00143
00144 label = gtk_label_new (message);
00145 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
00146 gtk_misc_set_padding (GTK_MISC (label), GNOME_PAD, 0);
00147 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
00148 gtk_widget_show (label);
00149
00150
00151 if (pixmap)
00152 {
00153 alignment = gtk_alignment_new (0., 0., 0., 0.);
00154 gtk_widget_set_size_request (alignment, GNOME_PAD, -1);
00155 gtk_widget_show (alignment);
00156
00157 gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, FALSE, 0);
00158 }
00159 }
00160
00161 gboolean
00162 gnc_dialog_date_close_parented (GtkWidget *parent, const char *message,
00163 const char *label_message,
00164 gboolean ok_is_default,
00165
00166 Timespec *ts)
00167 {
00168 DialogDateClose *ddc;
00169 GtkWidget *date_box;
00170 GtkWidget *hbox;
00171 GtkWidget *label;
00172 GladeXML *xml;
00173 gboolean retval;
00174
00175 if (!message || !label_message || !ts)
00176 return FALSE;
00177
00178 ddc = g_new0 (DialogDateClose, 1);
00179 ddc->ts = ts;
00180
00181 xml = gnc_glade_xml_new ("date-close.glade", "Date Close Dialog");
00182 ddc->dialog = glade_xml_get_widget (xml, "Date Close Dialog");
00183 hbox = glade_xml_get_widget (xml, "the_hbox");
00184 label = glade_xml_get_widget (xml, "label");
00185
00186 date_box = glade_xml_get_widget (xml, "date_box");
00187 ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
00188 gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
00189
00190 if (parent)
00191 gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
00192
00193 build_date_close_window (hbox, message);
00194
00195 gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *ts);
00196 gtk_label_set_text (GTK_LABEL (label), label_message);
00197
00198
00199 glade_xml_signal_autoconnect_full( xml,
00200 gnc_glade_autoconnect_full_func,
00201 ddc);
00202
00203 gtk_widget_show_all (ddc->dialog);
00204
00205 ddc->retval = FALSE;
00206 while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
00207 {
00208
00209 if (ddc->retval)
00210 break;
00211 }
00212
00213 gtk_widget_destroy(ddc->dialog);
00214 retval = ddc->retval;
00215 g_list_free (ddc->acct_types);
00216 g_free (ddc);
00217
00218 return retval;
00219 }
00220
00221 static void
00222 post_date_changed_cb (GNCDateEdit *gde, gpointer d)
00223 {
00224 DialogDateClose *ddc = d;
00225 Timespec post_date;
00226 Timespec due_date;
00227
00228 post_date = gnc_date_edit_get_date_ts (gde);
00229 due_date = gncBillTermComputeDueDate (ddc->terms, post_date);
00230 gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), due_date);
00231 }
00232
00233 gboolean
00234 gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
00235 const char *ddue_label_message,
00236 const char *post_label_message,
00237 const char *acct_label_message,
00238 const char *question_check_message,
00239 gboolean ok_is_default,
00240 gboolean set_default_acct,
00241 GList * acct_types, GList * acct_commodities,
00242 QofBook *book, GncBillTerm *terms,
00243
00244 Timespec *ddue, Timespec *post,
00245 char **memo, Account **acct, gboolean *answer)
00246 {
00247 DialogDateClose *ddc;
00248 GtkWidget *hbox;
00249 GtkWidget *label;
00250 GtkWidget *date_box;
00251 GtkWidget *acct_box;
00252 GladeXML *xml;
00253 gboolean retval;
00254
00255 if (!message || !ddue_label_message || !post_label_message ||
00256 !acct_label_message || !acct_types || !book || !ddue || !post || !acct)
00257 return FALSE;
00258 if (question_check_message && !answer)
00259 return FALSE;
00260
00261 ddc = g_new0 (DialogDateClose, 1);
00262 ddc->ts = ddue;
00263 ddc->ts2 = post;
00264 ddc->book = book;
00265 ddc->acct_types = acct_types;
00266 ddc->acct_commodities = acct_commodities;
00267 ddc->acct = *acct;
00268 ddc->memo = memo;
00269 ddc->terms = terms;
00270
00271 xml = gnc_glade_xml_new ("date-close.glade", "Date Account Dialog");
00272 ddc->dialog = glade_xml_get_widget (xml, "Date Account Dialog");
00273 ddc->memo_entry = glade_xml_get_widget (xml, "memo_entry");
00274 hbox = glade_xml_get_widget (xml, "the_hbox");
00275
00276 acct_box = glade_xml_get_widget (xml, "acct_hbox");
00277 ddc->acct_combo = gnc_account_sel_new();
00278 gtk_box_pack_start (GTK_BOX(acct_box), ddc->acct_combo, TRUE, TRUE, 0);
00279
00280 date_box = glade_xml_get_widget (xml, "date_box");
00281 ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
00282 gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
00283
00284 date_box = glade_xml_get_widget (xml, "post_date_box");
00285 ddc->post_date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
00286 gtk_box_pack_start (GTK_BOX(date_box), ddc->post_date, TRUE, TRUE, 0);
00287
00288 ddc->question_check = glade_xml_get_widget(xml, "question_check");
00289
00290 if (parent)
00291 gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
00292
00293 build_date_close_window (hbox, message);
00294
00295
00296 label = glade_xml_get_widget (xml, "date_label");
00297 gtk_label_set_text (GTK_LABEL (label), ddue_label_message);
00298 label = glade_xml_get_widget (xml, "postdate_label");
00299 gtk_label_set_text (GTK_LABEL (label), post_label_message);
00300 label = glade_xml_get_widget (xml, "acct_label");
00301 gtk_label_set_text (GTK_LABEL (label), acct_label_message);
00302
00303 if (question_check_message)
00304 {
00305 gtk_label_set_text(GTK_LABEL(GTK_BIN(ddc->question_check)->child), question_check_message);
00306 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ddc->question_check), *answer);
00307 }
00308 else
00309 {
00310 gtk_widget_hide(ddc->question_check);
00311 gtk_widget_hide(glade_xml_get_widget(xml, "hide1"));
00312 }
00313
00314
00315
00316 gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->post_date), *post);
00317
00318
00319 if (terms)
00320 {
00321 g_signal_connect (G_OBJECT (ddc->post_date), "date_changed",
00322 G_CALLBACK (post_date_changed_cb), ddc);
00323 gtk_widget_set_sensitive (ddc->date, FALSE);
00324 post_date_changed_cb (GNC_DATE_EDIT (ddc->post_date), ddc);
00325 }
00326 else
00327 gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *ddue);
00328
00329
00330 fill_in_acct_info (ddc, set_default_acct);
00331
00332
00333 glade_xml_signal_autoconnect_full( xml,
00334 gnc_glade_autoconnect_full_func,
00335 ddc);
00336
00337 gtk_widget_show_all (ddc->dialog);
00338
00339
00340 gnc_date_grab_focus (GNC_DATE_EDIT (ddc->post_date));
00341
00342 ddc->retval = FALSE;
00343 while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
00344 {
00345
00346 if (ddc->retval)
00347 break;
00348 }
00349
00350 gtk_widget_destroy(ddc->dialog);
00351 retval = ddc->retval;
00352 *acct = ddc->acct;
00353 if (question_check_message)
00354 *answer = ddc->answer;
00355 g_free (ddc);
00356
00357 return retval;
00358 }
00359
00360 gboolean
00361 gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
00362 const char *date_label_message,
00363 const char *acct_label_message,
00364 gboolean ok_is_default,
00365 GList * acct_types, QofBook *book,
00366
00367 Timespec *date, Account **acct)
00368 {
00369 DialogDateClose *ddc;
00370 GtkWidget *hbox;
00371 GtkWidget *label;
00372 GtkWidget *date_box;
00373 GtkWidget *acct_box;
00374 GladeXML *xml;
00375 gboolean retval;
00376
00377 if (!message || !date_label_message || !acct_label_message ||
00378 !acct_types || !book || !date || !acct)
00379 return FALSE;
00380
00381 ddc = g_new0 (DialogDateClose, 1);
00382 ddc->ts = date;
00383 ddc->book = book;
00384 ddc->acct_types = acct_types;
00385 ddc->acct = *acct;
00386
00387 xml = gnc_glade_xml_new ("date-close.glade", "Date Account Dialog");
00388 ddc->dialog = glade_xml_get_widget (xml, "Date Account Dialog");
00389 hbox = glade_xml_get_widget (xml, "the_hbox");
00390
00391 acct_box = glade_xml_get_widget (xml, "acct_hbox");
00392 ddc->acct_combo = gnc_account_sel_new();
00393 if (*acct)
00394 gnc_account_sel_set_account (GNC_ACCOUNT_SEL(ddc->acct_combo), *acct, FALSE);
00395 gtk_box_pack_start (GTK_BOX(acct_box), ddc->acct_combo, TRUE, TRUE, 0);
00396
00397 date_box = glade_xml_get_widget (xml, "date_box");
00398 ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
00399 gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
00400
00401 if (parent)
00402 gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
00403
00404 build_date_close_window (hbox, message);
00405
00406
00407 label = glade_xml_get_widget (xml, "date_label");
00408 gtk_label_set_text (GTK_LABEL (label), date_label_message);
00409 label = glade_xml_get_widget (xml, "acct_label");
00410 gtk_label_set_text (GTK_LABEL (label), acct_label_message);
00411
00412
00413 gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *date);
00414
00415
00416 fill_in_acct_info (ddc, FALSE);
00417
00418
00419 glade_xml_signal_autoconnect_full( xml,
00420 gnc_glade_autoconnect_full_func,
00421 ddc);
00422
00423 gtk_widget_show_all (ddc->dialog);
00424
00425 gtk_widget_hide_all (glade_xml_get_widget (xml, "postdate_label"));
00426 gtk_widget_hide_all (glade_xml_get_widget (xml, "post_date"));
00427 gtk_widget_hide_all (glade_xml_get_widget (xml, "memo_entry"));
00428 gtk_widget_hide_all (glade_xml_get_widget (xml, "memo_label"));
00429
00430 ddc->retval = FALSE;
00431 while (gtk_dialog_run (GTK_DIALOG (ddc->dialog)) == GTK_RESPONSE_OK)
00432 {
00433
00434 if (ddc->retval)
00435 break;
00436 }
00437
00438 gtk_widget_destroy(ddc->dialog);
00439 retval = ddc->retval;
00440 *acct = ddc->acct;
00441 g_free (ddc);
00442
00443 return retval;
00444 }