29 #include <glib/gi18n.h> 31 #include "dialog-utils.h" 33 #include "gnc-recurrence.h" 34 #include "gnc-date-edit.h" 35 #include "Recurrence.h" 38 static QofLogModule log_module = GNC_MOD_GUI;
45 GtkComboBox *gcb_period;
46 GtkCheckButton *gcb_eom;
47 GtkSpinButton *gsb_mult;
48 GtkCheckButton *nth_weekday;
55 GNCRECURRENCE_CHANGED,
67 G_DEFINE_TYPE (GncRecurrence, gnc_recurrence, GTK_TYPE_BOX)
69 static UIPeriodType get_pt_ui(GncRecurrence *gr)
71 return (gtk_combo_box_get_active(gr->gcb_period));
75 static void set_pt_ui(GncRecurrence *gr, PeriodType pt)
87 case PERIOD_END_OF_MONTH:
88 case PERIOD_NTH_WEEKDAY:
89 case PERIOD_LAST_WEEKDAY:
98 gtk_combo_box_set_active(gr->gcb_period, idx);
100 gtk_toggle_button_set_active(
101 GTK_TOGGLE_BUTTON(gr->nth_weekday),
102 (pt == PERIOD_NTH_WEEKDAY || pt == PERIOD_LAST_WEEKDAY));
104 gtk_toggle_button_set_active(
105 GTK_TOGGLE_BUTTON(gr->gcb_eom),
106 (pt == PERIOD_END_OF_MONTH || pt == PERIOD_LAST_WEEKDAY));
111 is_ambiguous_relative(
const GDate *date)
116 d = g_date_get_day(date);
117 dim = g_date_get_days_in_month(
118 g_date_get_month(date), g_date_get_year(date));
119 return ((d - 1) / 7 == 3) && (dim - d < 7);
124 is_ambiguous_absolute(
const GDate *date)
126 return (g_date_is_last_of_month(date) &&
127 (g_date_get_day(date) < 31));
132 something_changed( GtkWidget *wid, gpointer d )
136 gboolean show_last, use_wd;
137 GncRecurrence *gr = GNC_RECURRENCE(d);
141 gnc_date_edit_get_gdate(GNC_DATE_EDIT(gr->gde_start), &start);
143 if (pt == GNCR_MONTH)
144 g_object_set(G_OBJECT(gr->nth_weekday),
"visible", TRUE, NULL);
147 g_object_set(G_OBJECT(gr->nth_weekday),
"visible", FALSE, NULL);
148 gtk_toggle_button_set_active(
149 GTK_TOGGLE_BUTTON(gr->nth_weekday), FALSE);
151 use_wd = gtk_toggle_button_get_active(
152 GTK_TOGGLE_BUTTON(gr->nth_weekday));
157 if (pt == GNCR_MONTH)
160 show_last = is_ambiguous_relative(&start);
162 show_last = is_ambiguous_absolute(&start);
167 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gr->gcb_eom), FALSE);
169 g_object_set(G_OBJECT(gr->gcb_eom),
"visible", show_last, NULL);
171 g_signal_emit_by_name(d,
"changed");
176 gnc_recurrence_init( GncRecurrence *gr )
183 recurrenceSet(&gr->recurrence, 1, PERIOD_MONTH, NULL, WEEKEND_ADJ_NONE);
186 gtk_widget_set_name (GTK_WIDGET(gr),
"gnc-id-recurrence");
189 builder = gtk_builder_new();
190 gnc_builder_add_from_file (builder,
"gnc-recurrence.glade",
"GCB_PeriodType_liststore");
191 gnc_builder_add_from_file (builder,
"gnc-recurrence.glade",
"GSB_Mult_Adj");
192 gnc_builder_add_from_file (builder,
"gnc-recurrence.glade",
"RecurrenceEntryVBox");
194 vb = GTK_BOX(gtk_builder_get_object (builder,
"RecurrenceEntryVBox"));
195 hb = GTK_BOX(gtk_builder_get_object (builder,
"Startdate_hbox"));
196 w = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
198 gtk_box_pack_start (GTK_BOX (hb), w, TRUE, TRUE, 0);
201 gtk_widget_set_no_show_all(GTK_WIDGET(gr->gde_start), TRUE);
202 gr->gcb_period = GTK_COMBO_BOX(gtk_builder_get_object (builder,
"GCB_PeriodType"));
203 gr->gsb_mult = GTK_SPIN_BUTTON(gtk_builder_get_object (builder,
"GSB_Mult"));
204 gr->gcb_eom = GTK_CHECK_BUTTON(gtk_builder_get_object (builder,
"GCB_EndOfMonth"));
205 gr->nth_weekday = GTK_CHECK_BUTTON(gtk_builder_get_object (builder,
"GCB_NthWeekday"));
206 gtk_widget_set_no_show_all(GTK_WIDGET(gr->gcb_eom), TRUE);
207 gtk_widget_set_no_show_all(GTK_WIDGET(gr->nth_weekday), TRUE);
209 gtk_container_add( GTK_CONTAINER(&gr->widget), GTK_WIDGET(vb) );
211 gnc_recurrence_set(gr, &gr->recurrence);
212 something_changed( GTK_WIDGET(gr), gr);
215 g_signal_connect( G_OBJECT(gr->gde_start),
"date_changed",
216 G_CALLBACK(something_changed), gr );
217 g_signal_connect( G_OBJECT(gr->gcb_period),
"changed",
218 G_CALLBACK(something_changed), gr );
219 g_signal_connect( G_OBJECT(gr->gsb_mult),
"value-changed",
220 G_CALLBACK(something_changed), gr );
221 g_signal_connect( G_OBJECT(gr->gcb_eom),
"toggled",
222 G_CALLBACK(something_changed), gr );
223 g_signal_connect( G_OBJECT(gr->nth_weekday),
"toggled",
224 G_CALLBACK(something_changed), gr );
226 gtk_widget_show_all( GTK_WIDGET(&gr->widget) );
228 gtk_builder_connect_signals(builder, gr);
229 g_object_unref(G_OBJECT(builder));
234 gnc_recurrence_set(GncRecurrence *gr,
const Recurrence *r)
240 g_return_if_fail(gr && r);
241 pt = recurrenceGetPeriodType(r);
242 mult = recurrenceGetMultiplier(r);
243 start = recurrenceGetDate(r);
245 gtk_spin_button_set_value(gr->gsb_mult, (gdouble) mult);
251 gnc_date_edit_set_time (GNC_DATE_EDIT(gr->gde_start), t);
259 gnc_recurrence_get(GncRecurrence *gr)
265 gboolean use_eom = FALSE, rel;
267 mult = (guint) gtk_spin_button_get_value_as_int(gr->gsb_mult);
268 gnc_date_edit_get_gdate(GNC_DATE_EDIT(gr->gde_start), &start);
269 period = get_pt_ui(gr);
280 rel = gtk_toggle_button_get_active(
281 GTK_TOGGLE_BUTTON(gr->nth_weekday));
284 if (is_ambiguous_relative(&start))
286 use_eom = gtk_toggle_button_get_active(
287 GTK_TOGGLE_BUTTON(gr->gcb_eom));
292 d = g_date_get_day(&start);
294 use_eom = ((d - 1) / 7 == 4);
297 pt = PERIOD_LAST_WEEKDAY;
298 else pt = PERIOD_NTH_WEEKDAY;
302 if (g_date_is_last_of_month(&start) &&
303 (g_date_get_day(&start) < 31))
306 use_eom = gtk_toggle_button_get_active(
307 GTK_TOGGLE_BUTTON(gr->gcb_eom));
312 use_eom = g_date_is_last_of_month(&start);
315 pt = PERIOD_END_OF_MONTH;
316 else pt = PERIOD_MONTH;
326 recurrenceSet(&gr->recurrence, mult, pt, &start, WEEKEND_ADJ_NONE);
327 return &gr->recurrence;
332 gnc_recurrence_finalize(GObject *o)
334 GncRecurrence *gr = GNC_RECURRENCE(o);
337 G_OBJECT_CLASS (gnc_recurrence_parent_class)->finalize (o);
342 gnc_recurrence_class_init( GncRecurrenceClass *klass )
344 GObjectClass *object_class;
346 object_class = G_OBJECT_CLASS (klass);
347 g_signal_new (
"changed",
348 G_OBJECT_CLASS_TYPE (object_class),
353 g_cclosure_marshal_VOID__VOID,
357 object_class->finalize = gnc_recurrence_finalize;
366 gr = g_object_new(gnc_recurrence_get_type(), NULL);
368 return GTK_WIDGET(gr);
Date and Time handling routines.
#define ENTER(format, args...)
Print a function entry debugging message.
All type declarations for the whole Gnucash engine.
#define LEAVE(format, args...)
Print a function exit debugging message.
time64 gnc_time(time64 *tbuf)
get the current time
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
time64 gnc_time64_get_day_start_gdate(const GDate *date)
The gnc_time64_get_day_start() routine will take the given time in GLib GDate format and adjust it to...