29 #include "dialog-utils.h"
30 #include "gnc-recurrence.h"
31 #include "gnc-date-edit.h"
32 #include "Recurrence.h"
43 GtkComboBox *gcb_period;
44 GtkCheckButton *gcb_eom;
45 GtkSpinButton *gsb_mult;
46 GtkCheckButton *nth_weekday;
53 GtkVBoxClass parent_class;
59 GNCRECURRENCE_CHANGED,
71 static GObjectClass *parent_class = NULL;
76 return (gtk_combo_box_get_active(gr->gcb_period));
92 case PERIOD_END_OF_MONTH:
93 case PERIOD_NTH_WEEKDAY:
94 case PERIOD_LAST_WEEKDAY:
103 gtk_combo_box_set_active(gr->gcb_period, idx);
105 gtk_toggle_button_set_active(
106 GTK_TOGGLE_BUTTON(gr->nth_weekday),
107 (pt == PERIOD_NTH_WEEKDAY || pt == PERIOD_LAST_WEEKDAY));
109 gtk_toggle_button_set_active(
110 GTK_TOGGLE_BUTTON(gr->gcb_eom),
111 (pt == PERIOD_END_OF_MONTH || pt == PERIOD_LAST_WEEKDAY));
116 is_ambiguous_relative(
const GDate *date)
121 d = g_date_get_day(date);
122 dim = g_date_get_days_in_month(
123 g_date_get_month(date), g_date_get_year(date));
124 return ((d - 1) / 7 == 3) && (dim - d < 7);
129 is_ambiguous_absolute(
const GDate *date)
131 return (g_date_is_last_of_month(date) &&
132 (g_date_get_day(date) < 31));
137 something_changed( GtkWidget *wid, gpointer d )
141 gboolean show_last, use_wd;
146 gnc_date_edit_get_gdate(GNC_DATE_EDIT(gr->gde_start), &start);
148 if (pt == GNCR_MONTH)
149 g_object_set(G_OBJECT(gr->nth_weekday),
"visible", TRUE, NULL);
152 g_object_set(G_OBJECT(gr->nth_weekday),
"visible", FALSE, NULL);
153 gtk_toggle_button_set_active(
154 GTK_TOGGLE_BUTTON(gr->nth_weekday), FALSE);
156 use_wd = gtk_toggle_button_get_active(
157 GTK_TOGGLE_BUTTON(gr->nth_weekday));
162 if (pt == GNCR_MONTH)
165 show_last = is_ambiguous_relative(&start);
167 show_last = is_ambiguous_absolute(&start);
172 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gr->gcb_eom), FALSE);
174 g_object_set(G_OBJECT(gr->gcb_eom),
"visible", show_last, NULL);
176 g_signal_emit_by_name(d,
"changed");
188 recurrenceSet(&gr->recurrence, 1, PERIOD_MONTH, NULL, WEEKEND_ADJ_NONE);
191 builder = gtk_builder_new();
192 gnc_builder_add_from_file (builder,
"gnc-recurrence.glade",
"GCB_PeriodType_liststore");
193 gnc_builder_add_from_file (builder,
"gnc-recurrence.glade",
"GSB_Mult_Adj");
194 gnc_builder_add_from_file (builder,
"gnc-recurrence.glade",
"RecurrenceEntryVBox");
196 vb = GTK_VBOX(gtk_builder_get_object (builder,
"RecurrenceEntryVBox"));
197 hb = GTK_HBOX(gtk_builder_get_object (builder,
"Startdate_hbox"));
198 w = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
200 gtk_box_pack_start (GTK_BOX (hb), w, TRUE, TRUE, 0);
203 gtk_widget_set_no_show_all(GTK_WIDGET(gr->gde_start), TRUE);
204 gr->gcb_period = GTK_COMBO_BOX(gtk_builder_get_object (builder,
"GCB_PeriodType"));
205 gr->gsb_mult = GTK_SPIN_BUTTON(gtk_builder_get_object (builder,
"GSB_Mult"));
206 gr->gcb_eom = GTK_CHECK_BUTTON(gtk_builder_get_object (builder,
"GCB_EndOfMonth"));
207 gr->nth_weekday = GTK_CHECK_BUTTON(gtk_builder_get_object (builder,
"GCB_NthWeekday"));
208 gtk_widget_set_no_show_all(GTK_WIDGET(gr->gcb_eom), TRUE);
209 gtk_widget_set_no_show_all(GTK_WIDGET(gr->nth_weekday), TRUE);
211 gtk_container_add( GTK_CONTAINER(&gr->widget), GTK_WIDGET(vb) );
213 gnc_recurrence_set(gr, &gr->recurrence);
214 something_changed( GTK_WIDGET(gr), gr);
217 g_signal_connect( G_OBJECT(gr->gde_start),
"date_changed",
218 G_CALLBACK(something_changed), gr );
219 g_signal_connect( G_OBJECT(gr->gcb_period),
"changed",
220 G_CALLBACK(something_changed), gr );
221 g_signal_connect( G_OBJECT(gr->gsb_mult),
"value-changed",
222 G_CALLBACK(something_changed), gr );
223 g_signal_connect( G_OBJECT(gr->gcb_eom),
"toggled",
224 G_CALLBACK(something_changed), gr );
225 g_signal_connect( G_OBJECT(gr->nth_weekday),
"toggled",
226 G_CALLBACK(something_changed), gr );
228 gtk_widget_show_all( GTK_WIDGET(&gr->widget) );
230 gtk_builder_connect_signals(builder, gr);
231 g_object_unref(G_OBJECT(builder));
242 g_return_if_fail(gr && r);
243 pt = recurrenceGetPeriodType(r);
244 mult = recurrenceGetMultiplier(r);
245 start = recurrenceGetDate(r);
247 gtk_spin_button_set_value(gr->gsb_mult, (gdouble) mult);
253 gnc_date_edit_set_time (GNC_DATE_EDIT(gr->gde_start), t);
267 gboolean use_eom = FALSE, rel;
269 mult = (guint) gtk_spin_button_get_value_as_int(gr->gsb_mult);
270 gnc_date_edit_get_gdate(GNC_DATE_EDIT(gr->gde_start), &start);
271 period = get_pt_ui(gr);
282 rel = gtk_toggle_button_get_active(
283 GTK_TOGGLE_BUTTON(gr->nth_weekday));
286 if (is_ambiguous_relative(&start))
288 use_eom = gtk_toggle_button_get_active(
289 GTK_TOGGLE_BUTTON(gr->gcb_eom));
294 d = g_date_get_day(&start);
296 use_eom = ((d - 1) / 7 == 4);
299 pt = PERIOD_LAST_WEEKDAY;
300 else pt = PERIOD_NTH_WEEKDAY;
304 if (g_date_is_last_of_month(&start) &&
305 (g_date_get_day(&start) < 31))
308 use_eom = gtk_toggle_button_get_active(
309 GTK_TOGGLE_BUTTON(gr->gcb_eom));
314 use_eom = g_date_is_last_of_month(&start);
317 pt = PERIOD_END_OF_MONTH;
318 else pt = PERIOD_MONTH;
328 recurrenceSet(&gr->recurrence, mult, pt, &start, WEEKEND_ADJ_NONE);
329 return &gr->recurrence;
334 gnc_recurrence_finalize(GObject *o)
339 G_OBJECT_CLASS (parent_class)->finalize (o);
346 GObjectClass *object_class;
348 object_class = G_OBJECT_CLASS (klass);
349 g_signal_new (
"changed",
350 G_OBJECT_CLASS_TYPE (object_class),
355 g_cclosure_marshal_VOID__VOID,
359 parent_class = g_type_class_peek_parent (klass);
360 object_class->finalize = gnc_recurrence_finalize;
365 gnc_recurrence_get_type()
367 static GType type = 0;
370 static GTypeInfo typeinfo =
374 (GClassInitFunc)gnc_recurrence_class_init,
378 (GInstanceInitFunc)gnc_recurrence_init
381 type = g_type_register_static (GTK_TYPE_VBOX,
"GncRecurrence",
394 gr = g_object_new(gnc_recurrence_get_type(), NULL);
396 return GTK_WIDGET(gr);
405 GtkScrolledWindow widget;
411 GtkButton *buttRemove;
420 GtkScrolledWindowClass parent_class;
427 GNCRECURRENCECOMP_CHANGED,
432 static void grc_changed(GtkWidget *w, gpointer data)
434 g_signal_emit_by_name(data,
"changed");
441 gtk_box_pack_start(GTK_BOX(grc->vbox), GTK_WIDGET(gr),
443 g_signal_connect( G_OBJECT(gr),
"changed",
444 G_CALLBACK(grc_changed), grc );
447 gtk_widget_set_sensitive(GTK_WIDGET(grc->buttRemove), (grc->num_rec > 1));
448 g_signal_emit_by_name(G_OBJECT(grc),
"changed");
456 GList *children, *last;
460 children = gtk_container_get_children(GTK_CONTAINER(grc->vbox));
461 last = g_list_last(children);
462 gtk_widget_destroy(GTK_WIDGET(last->data));
463 g_list_free(children);
464 g_signal_emit_by_name(G_OBJECT(grc),
"changed");
467 gtk_widget_set_sensitive(GTK_WIDGET(grc->buttRemove), (grc->num_rec > 1));
472 static void addClicked(GtkButton *b, gpointer data)
477 gr = GNC_RECURRENCE(gnc_recurrence_new());
478 addRecurrence(grc, gr);
482 static void removeClicked(GtkButton *b, gpointer data)
486 if (grc->num_rec > 1)
487 removeRecurrence(grc);
496 g_return_if_fail(grc);
498 while (grc->num_rec > 0)
499 removeRecurrence(grc);
501 for (iter = rlist; iter; iter = iter->next)
505 gnc_recurrence_set(gr, (
Recurrence *)iter->data);
506 addRecurrence(grc, gr);
514 GList *rlist = NULL, *children;
518 children = gtk_container_get_children(GTK_CONTAINER(grc->vbox));
519 for (i = 0; i < g_list_length(children); i++)
523 gr = GNC_RECURRENCE(g_list_nth_data(children, i));
524 r = gnc_recurrence_get(gr);
525 rlist = g_list_append(rlist, (gpointer)r);
527 g_list_free(children);
537 grc->hbb = GTK_HBUTTON_BOX(gtk_hbutton_box_new());
538 grc->vbox = GTK_VBOX(gtk_vbox_new(FALSE, 1));
541 grc->buttAdd = GTK_BUTTON(gtk_button_new_from_stock(GTK_STOCK_ADD));
542 g_signal_connect(G_OBJECT(grc->buttAdd),
"clicked",
543 G_CALLBACK(addClicked), grc);
544 grc->buttRemove = GTK_BUTTON(gtk_button_new_from_stock(GTK_STOCK_REMOVE));
545 g_signal_connect(G_OBJECT(grc->buttRemove),
"clicked",
546 G_CALLBACK(removeClicked), grc);
548 gtk_box_pack_start(GTK_BOX(grc->hbb), GTK_WIDGET(grc->buttAdd),
550 gtk_box_pack_start(GTK_BOX(grc->hbb), GTK_WIDGET(grc->buttRemove),
553 vb = gtk_vbox_new(FALSE, 1);
554 gtk_box_pack_start(GTK_BOX(vb), GTK_WIDGET(grc->hbb),
556 gtk_box_pack_start(GTK_BOX(vb), GTK_WIDGET(grc->vbox),
559 gtk_scrolled_window_add_with_viewport(
560 GTK_SCROLLED_WINDOW(grc), GTK_WIDGET(vb));
561 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(grc),
562 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
565 gtk_widget_show_all(GTK_WIDGET(grc));
566 addClicked(NULL, grc);
573 GObjectClass *object_class;
575 object_class = G_OBJECT_CLASS (klass);
576 g_signal_new (
"changed",
577 G_OBJECT_CLASS_TYPE (object_class),
582 g_cclosure_marshal_VOID__VOID,
592 gnc_recurrence_comp_get_type()
594 static GType type = 0;
597 static GTypeInfo typeinfo =
601 (GClassInitFunc)gnc_recurrence_comp_class_init,
605 (GInstanceInitFunc)gnc_recurrence_comp_init
608 type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW,
609 "GncRecurrenceComp", &typeinfo, 0);
616 gnc_recurrence_comp_new()
619 grc = g_object_new(gnc_recurrence_comp_get_type(), NULL);
620 return GTK_WIDGET(grc);
time64 gnc_time64_get_day_start_gdate(const GDate *date)
#define ENTER(format, args...)
All type declarations for the whole Gnucash engine.
#define LEAVE(format, args...)
time64 gnc_time(time64 *tbuf)
get the current local time
const gchar * QofLogModule