diff --git a/src/gnome-utils/gnc-period-select.c b/src/gnome-utils/gnc-period-select.c index 1eab2489d8..83dde2e18e 100644 --- a/src/gnome-utils/gnc-period-select.c +++ b/src/gnome-utils/gnc-period-select.c @@ -45,6 +45,7 @@ enum PROP_FY_END, PROP_SHOW_DATE, PROP_DATE_BASE, + PROP_PS_ACTIVE, }; enum @@ -121,7 +122,7 @@ struct _GncPeriodSelectPrivate /* Tells a GncPeriodSelect object to emit a "changed" signal. */ -void +static void gnc_period_select_changed (GncPeriodSelect *period) { g_return_if_fail(GNC_IS_PERIOD_SELECT(period)); @@ -165,9 +166,8 @@ gnc_period_sample_update_date_label (GncPeriodSelect *period) /** Handle the "changed" signal from the GtkComboBox that is embedded * in this GncPeriodSelect object. When called, this function - * updates the feedback label embedded in the object, then generates - * another "changed" signal so that a developer can see that - * something in the object changed. + * will delegate the actual update work to the GncPeriodSelect widget + * to do the necessary updates of internal widgets and state. * * @param box The combo box that changed. * @@ -178,11 +178,10 @@ gnc_period_sample_combobox_changed (GtkComboBox *box, GncPeriodSelect *period) { g_return_if_fail(GNC_IS_PERIOD_SELECT(period)); - /* Update this widget */ - gnc_period_sample_update_date_label(period); - - /* Pass it on... */ - gnc_period_select_changed(period); + g_object_set (G_OBJECT (period), + "active", + gtk_combo_box_get_active (box), + NULL); } @@ -208,6 +207,40 @@ gnc_period_sample_new_date_format (GConfEntry *unused, /* Property Functions */ /************************************************************/ +/* Set an item in the GncPeriodSelect to be the active one. + * This will first update the internal GtkCombobox (blocking + * its "changed" callback to prevent an infinite loop). + * Then it will update the sample label and finally it will + * emit a "changed" signal of it's own for other objects + * listening for this signal. + */ +static void +gnc_period_select_set_active_internal (GncPeriodSelect *period, + GncAccountingPeriod which) +{ + GncPeriodSelectPrivate *priv; + + g_return_if_fail(period != NULL); + g_return_if_fail(GNC_IS_PERIOD_SELECT(period)); + g_return_if_fail(which >= 0); + g_return_if_fail(which < GNC_ACCOUNTING_PERIOD_LAST); + + priv = GNC_PERIOD_SELECT_GET_PRIVATE(period); + + g_signal_handlers_block_by_func(G_OBJECT(period), + G_CALLBACK(gnc_period_sample_combobox_changed), period); + gtk_combo_box_set_active(GTK_COMBO_BOX(priv->selector), which); + g_signal_handlers_unblock_by_func(G_OBJECT(period), + G_CALLBACK(gnc_period_sample_combobox_changed), period); + + /* Update this widget */ + gnc_period_sample_update_date_label(period); + + /* Pass it on... */ + gnc_period_select_changed(period); +} + + /** @name GncPeriodSelect Properties @{ */ @@ -413,6 +446,9 @@ gnc_period_select_get_property (GObject *object, case PROP_DATE_BASE: g_value_set_pointer(value, gnc_period_select_get_date_base(period)); break; + case PROP_PS_ACTIVE: + g_value_set_int(value, gnc_period_select_get_active(period)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -447,6 +483,9 @@ gnc_period_select_set_property (GObject *object, case PROP_DATE_BASE: gnc_period_select_set_date_base(period, g_value_get_pointer(value)); break; + case PROP_PS_ACTIVE: + gnc_period_select_set_active_internal(period, g_value_get_int(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -536,7 +575,7 @@ gnc_period_select_class_init (GncPeriodSelectClass *klass) PROP_SHOW_DATE, g_param_spec_boolean("show-date", "Show Date", - "Show the start/end date of the accouting period in this widget", + "Show the start/end date of the accounting period in this widget", FALSE, G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, @@ -545,6 +584,15 @@ gnc_period_select_class_init (GncPeriodSelectClass *klass) "Date Base", "The starting date to use for display calculations", G_PARAM_READWRITE)); + g_object_class_install_property(gobject_class, + PROP_PS_ACTIVE, + g_param_spec_int("active", + "Active period", + "The currently selected period in the list of periods", + -1, + G_MAXINT, + 0, + G_PARAM_READWRITE)); g_type_class_add_private(klass, sizeof(GncPeriodSelectPrivate)); } @@ -689,15 +737,12 @@ void gnc_period_select_set_active (GncPeriodSelect *period, GncAccountingPeriod which) { - GncPeriodSelectPrivate *priv; - g_return_if_fail(period != NULL); g_return_if_fail(GNC_IS_PERIOD_SELECT(period)); g_return_if_fail(which >= 0); g_return_if_fail(which < GNC_ACCOUNTING_PERIOD_LAST); - priv = GNC_PERIOD_SELECT_GET_PRIVATE(period); - gtk_combo_box_set_active(GTK_COMBO_BOX(priv->selector), which); + g_object_set (G_OBJECT (period), "active", which, NULL); } diff --git a/src/gnome-utils/gnc-period-select.h b/src/gnome-utils/gnc-period-select.h index 566955b43d..2245c8686b 100644 --- a/src/gnome-utils/gnc-period-select.h +++ b/src/gnome-utils/gnc-period-select.h @@ -65,14 +65,6 @@ typedef struct GType gnc_period_select_get_type (void); -/** Tells a GncPeriodSelect object to emit a "changed" signal. - * - * @param period The GncPeriodSelect object that should emit the - * signal. - */ -void gnc_period_select_changed (GncPeriodSelect *period); - - /** Create a new GncPeriodSelect widget which is used to select a * accounting period like "previous month" or "this year". *