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 <gtk/gtk.h>
00027 #include <glib/gi18n.h>
00028 #include <time.h>
00029 #include <stdlib.h>
00030
00031 #include "dialog-utils.h"
00032 #include "gnc-date-edit.h"
00033 #include "qof.h"
00034 #include "gnc-ui.h"
00035
00036
00037
00038
00039
00040 typedef struct
00041 {
00042 GtkWidget * dialog;
00043
00044 gboolean focus_out;
00045
00046 GtkWidget * date_edit;
00047 GtkWidget * num_edit;
00048 } DupTransDialog;
00049
00050
00051
00052
00053
00054 static gboolean
00055 parse_num (const char *string, long int *num)
00056 {
00057 long int number;
00058
00059 if (string == NULL)
00060 return FALSE;
00061
00062 if (!gnc_strisnum(string))
00063 return FALSE;
00064
00065 number = strtol(string, NULL, 10);
00066
00067 if ((number == LONG_MIN) || (number == LONG_MAX))
00068 return FALSE;
00069
00070 if (num != NULL)
00071 *num = number;
00072
00073 return TRUE;
00074 }
00075
00076 static gboolean
00077 gnc_dup_trans_output_cb(GtkSpinButton *spinbutton,
00078 gpointer user_data)
00079 {
00080 gboolean is_number;
00081 long int num;
00082 gchar *txt = gtk_editable_get_chars(GTK_EDITABLE(spinbutton), 0, -1);
00083 is_number = parse_num(txt, &num);
00084 g_free(txt);
00085 if (!is_number)
00086 gtk_entry_set_text(GTK_ENTRY(spinbutton), "");
00087 return !is_number;
00088 }
00089
00090 static void
00091 gnc_dup_trans_dialog_create (GtkWidget * parent, DupTransDialog *dt_dialog,
00092 time_t date, const char *num_str)
00093 {
00094 GtkWidget *dialog;
00095 GladeXML *xml;
00096
00097 xml = gnc_glade_xml_new ("register.glade", "Duplicate Transaction Dialog");
00098
00099 dialog = glade_xml_get_widget (xml, "Duplicate Transaction Dialog");
00100 dt_dialog->dialog = dialog;
00101
00102
00103 if (parent != NULL)
00104 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
00105
00106
00107 {
00108 GtkWidget *date_edit;
00109 GtkWidget *hbox;
00110 GtkWidget *label;
00111
00112 date_edit = gnc_date_edit_new (date, FALSE, FALSE);
00113 gnc_date_activates_default(GNC_DATE_EDIT(date_edit), TRUE);
00114 hbox = glade_xml_get_widget (xml, "date_hbox");
00115 gtk_widget_show (date_edit);
00116
00117 label = glade_xml_get_widget (xml, "date_label");
00118 gnc_date_make_mnemonic_target (GNC_DATE_EDIT(date_edit), label);
00119
00120 gtk_box_pack_end (GTK_BOX (hbox), date_edit, TRUE, TRUE, 0);
00121 dt_dialog->date_edit = date_edit;
00122 }
00123
00124 {
00125 GtkWidget *num_spin;
00126 long int num;
00127
00128 num_spin = glade_xml_get_widget (xml, "num_spin");
00129 dt_dialog->num_edit = num_spin;
00130
00131 gtk_entry_set_activates_default(GTK_ENTRY(num_spin), TRUE);
00132 g_signal_connect(num_spin, "output",
00133 G_CALLBACK(gnc_dup_trans_output_cb), dt_dialog);
00134
00135 if (num_str && parse_num (num_str, &num))
00136 gtk_spin_button_set_value (GTK_SPIN_BUTTON (num_spin), num + 1);
00137 else
00138 gtk_entry_set_text (GTK_ENTRY (num_spin), "");
00139 }
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 gboolean
00154 gnc_dup_trans_dialog (GtkWidget * parent, time_t *date_p,
00155 const char *num, char **out_num)
00156 {
00157 DupTransDialog *dt_dialog;
00158 GNCDateEdit *gde;
00159 GtkWidget *entry;
00160 gboolean ok;
00161 gint result;
00162
00163 if (!date_p || !out_num)
00164 return FALSE;
00165
00166 dt_dialog = g_new0 (DupTransDialog, 1);
00167
00168 gnc_dup_trans_dialog_create (parent, dt_dialog, *date_p, num);
00169
00170 gde = GNC_DATE_EDIT (dt_dialog->date_edit);
00171 entry = gde->date_entry;
00172
00173 gtk_widget_grab_focus (entry);
00174
00175 result = gtk_dialog_run (GTK_DIALOG (dt_dialog->dialog));
00176
00177 if (result == GTK_RESPONSE_OK)
00178 {
00179 *date_p = gnc_date_edit_get_date (GNC_DATE_EDIT (dt_dialog->date_edit));
00180 *out_num = g_strdup (gtk_entry_get_text (GTK_ENTRY (dt_dialog->num_edit)));
00181 ok = TRUE;
00182 }
00183 else
00184 ok = FALSE;
00185
00186 gtk_widget_destroy(GTK_WIDGET(dt_dialog->dialog));
00187 g_free (dt_dialog);
00188
00189 return ok;
00190 }