diff options
author | Matthew Barnes <mbarnes@src.gnome.org> | 2008-07-16 02:34:59 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@src.gnome.org> | 2008-07-16 02:34:59 +0800 |
commit | ac0c655f3f2a8e47b0cca877aabae66421c58187 (patch) | |
tree | dd86bd195dff93b54184840e7beca7ffa5a11e99 /calendar/gui/dialogs/recurrence-page.c | |
parent | c049cedd6969d77649db15b71f4ba112d4a2c065 (diff) | |
download | gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.gz gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.bz2 gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.lz gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.xz gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.tar.zst gsoc2013-evolution-ac0c655f3f2a8e47b0cca877aabae66421c58187.zip |
Migrate CompEditor, CompEditorPage, and the various subclasses from
BonoboUI to GtkUIManager. See bug #542125.
svn path=/branches/kill-bonobo/; revision=35746
Diffstat (limited to 'calendar/gui/dialogs/recurrence-page.c')
-rw-r--r-- | calendar/gui/dialogs/recurrence-page.c | 613 |
1 files changed, 263 insertions, 350 deletions
diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c index 9165ba38d3..062d0ad0c0 100644 --- a/calendar/gui/dialogs/recurrence-page.c +++ b/calendar/gui/dialogs/recurrence-page.c @@ -45,7 +45,9 @@ #include "../e-mini-calendar-config.h" #include "recurrence-page.h" - +#define RECURRENCE_PAGE_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), TYPE_RECURRENCE_PAGE, RecurrencePagePrivate)) enum month_num_options { MONTH_NUM_FIRST, @@ -183,146 +185,208 @@ struct _RecurrencePagePrivate { /* For the recurrence preview, the actual widget */ GtkWidget *preview_calendar; EMiniCalendarConfig *preview_calendar_config; - - gboolean updating; }; static void recurrence_page_finalize (GObject *object); +static gboolean fill_component (RecurrencePage *rpage, ECalComponent *comp); static GtkWidget *recurrence_page_get_widget (CompEditorPage *page); static void recurrence_page_focus_main_widget (CompEditorPage *page); static gboolean recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp); static gboolean recurrence_page_fill_component (CompEditorPage *page, ECalComponent *comp); static void recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates); -static void preview_date_range_changed_cb (ECalendarItem *item, gpointer data); -static void interval_selection_done_cb (GtkOptionMenu *menu, gpointer data); -static void ending_selection_done_cb (GtkOptionMenu *menu, gpointer data); +static void preview_date_range_changed_cb (ECalendarItem *item, RecurrencePage *rpage); -static void field_changed (RecurrencePage *apage); static void make_ending_count_special (RecurrencePage *rpage); static void make_ending_special (RecurrencePage *rpage); G_DEFINE_TYPE (RecurrencePage, recurrence_page, TYPE_COMP_EDITOR_PAGE) -/* Class initialization function for the recurrence page */ +/* Re-tags the recurrence preview calendar based on the current information of + * the widgets in the recurrence page. + */ static void -recurrence_page_class_init (RecurrencePageClass *class) +preview_recur (RecurrencePage *rpage) { - CompEditorPageClass *editor_page_class; - GObjectClass *object_class; + RecurrencePagePrivate *priv = rpage->priv; + CompEditor *editor; + ECal *client; + ECalComponent *comp; + ECalComponentDateTime cdt; + GSList *l; + icaltimezone *zone = NULL; - editor_page_class = (CompEditorPageClass *) class; - object_class = (GObjectClass *) class; + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); + client = comp_editor_get_client (editor); - editor_page_class->get_widget = recurrence_page_get_widget; - editor_page_class->focus_main_widget = recurrence_page_focus_main_widget; - editor_page_class->fill_widgets = recurrence_page_fill_widgets; - editor_page_class->fill_component = recurrence_page_fill_component; - editor_page_class->set_dates = recurrence_page_set_dates; + /* If our component has not been set yet through ::fill_widgets(), we + * cannot preview the recurrence. + */ + if (!priv || !priv->comp || e_cal_component_is_instance (priv->comp)) + return; - object_class->finalize = recurrence_page_finalize; + /* Create a scratch component with the start/end and + * recurrence/exception information from the one we are editing. + */ + + comp = e_cal_component_new (); + e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT); + + e_cal_component_get_dtstart (priv->comp, &cdt); + if (cdt.tzid != NULL) { + /* FIXME Will e_cal_get_timezone really not return builtin zones? */ + if (!e_cal_get_timezone (client, cdt.tzid, &zone, NULL)) + zone = icaltimezone_get_builtin_timezone_from_tzid (cdt.tzid); + } + e_cal_component_set_dtstart (comp, &cdt); + e_cal_component_free_datetime (&cdt); + + e_cal_component_get_dtend (priv->comp, &cdt); + e_cal_component_set_dtend (comp, &cdt); + e_cal_component_free_datetime (&cdt); + + e_cal_component_get_exdate_list (priv->comp, &l); + e_cal_component_set_exdate_list (comp, l); + e_cal_component_free_exdate_list (l); + + e_cal_component_get_exrule_list (priv->comp, &l); + e_cal_component_set_exrule_list (comp, l); + e_cal_component_free_recur_list (l); + + e_cal_component_get_rdate_list (priv->comp, &l); + e_cal_component_set_rdate_list (comp, l); + e_cal_component_free_period_list (l); + + e_cal_component_get_rrule_list (priv->comp, &l); + e_cal_component_set_rrule_list (comp, l); + e_cal_component_free_recur_list (l); + + fill_component (rpage, comp); + + tag_calendar_by_comp (E_CALENDAR (priv->preview_calendar), comp, + client, zone, TRUE, FALSE); + g_object_unref(comp); } -/* Object initialization function for the recurrence page */ -static void -recurrence_page_init (RecurrencePage *rpage) +static GObject * +recurrence_page_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) { - RecurrencePagePrivate *priv; + GObject *object; + CompEditor *editor; - priv = g_new0 (RecurrencePagePrivate, 1); - rpage->priv = priv; + /* Chain up to parent's constructor() method. */ + object = G_OBJECT_CLASS (recurrence_page_parent_class)->constructor ( + type, n_construct_properties, construct_properties); - priv->xml = NULL; + /* Keep the calendar updated as the user twizzles widgets. */ + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (object)); - priv->main = NULL; - priv->recurs = NULL; - priv->custom = FALSE; - priv->params = NULL; - priv->interval_value = NULL; - priv->interval_unit = NULL; - priv->special = NULL; - priv->ending_menu = NULL; - priv->ending_special = NULL; - priv->custom_warning_bin = NULL; - priv->weekday_picker = NULL; - priv->month_day_menu = NULL; - priv->month_num_menu = NULL; - priv->ending_date_edit = NULL; - priv->ending_count_spin = NULL; - priv->exception_list = NULL; - priv->exception_add = NULL; - priv->exception_modify = NULL; - priv->exception_delete = NULL; - priv->preview_bin = NULL; - priv->preview_calendar = NULL; - - priv->comp = NULL; + g_signal_connect_swapped ( + editor, "notify::changed", + G_CALLBACK (preview_recur), object); + + return object; } -/* Destroy handler for the recurrence page */ static void -recurrence_page_finalize (GObject *object) +recurrence_page_dispose (GObject *object) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; - g_return_if_fail (object != NULL); - g_return_if_fail (IS_RECURRENCE_PAGE (object)); + priv = RECURRENCE_PAGE_GET_PRIVATE (object); - rpage = RECURRENCE_PAGE (object); - priv = rpage->priv; - - g_signal_handlers_disconnect_matched (E_CALENDAR (priv->preview_calendar)->calitem, G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, preview_date_range_changed_cb, NULL); - - g_signal_handlers_disconnect_by_func (GTK_OPTION_MENU (priv->interval_unit), - G_CALLBACK (interval_selection_done_cb), rpage); - g_signal_handlers_disconnect_by_func (GTK_OPTION_MENU (priv->ending_menu), - G_CALLBACK (ending_selection_done_cb), rpage); - - if (priv->main) + if (priv->main != NULL) { g_object_unref (priv->main); + priv->main = NULL; + } - if (priv->xml) { + if (priv->xml != NULL) { g_object_unref (priv->xml); priv->xml = NULL; } - if (priv->comp) { + if (priv->comp != NULL) { g_object_unref (priv->comp); priv->comp = NULL; } - if (priv->exception_list_store) { + if (priv->exception_list_store != NULL) { g_object_unref (priv->exception_list_store); priv->exception_list_store = NULL; } - if (priv->preview_calendar_config) { + if (priv->preview_calendar_config != NULL) { g_object_unref (priv->preview_calendar_config); priv->preview_calendar_config = NULL; } - g_free (priv); - rpage->priv = NULL; + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (recurrence_page_parent_class)->dispose (object); +} + +static void +recurrence_page_finalize (GObject *object) +{ + RecurrencePagePrivate *priv; + + priv = RECURRENCE_PAGE_GET_PRIVATE (object); + + g_signal_handlers_disconnect_matched ( + E_CALENDAR (priv->preview_calendar)->calitem, + G_SIGNAL_MATCH_FUNC, 0, 0, NULL, + preview_date_range_changed_cb, NULL); + + g_signal_handlers_disconnect_matched ( + priv->interval_unit, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, object); + + g_signal_handlers_disconnect_matched ( + priv->ending_menu, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, object); - if (G_OBJECT_CLASS (recurrence_page_parent_class)->finalize) - (* G_OBJECT_CLASS (recurrence_page_parent_class)->finalize) (object); + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (recurrence_page_parent_class)->finalize (object); } - +static void +recurrence_page_class_init (RecurrencePageClass *class) +{ + GObjectClass *object_class; + CompEditorPageClass *editor_page_class; + + g_type_class_add_private (class, sizeof (RecurrencePagePrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->constructor = recurrence_page_constructor; + object_class->dispose = recurrence_page_dispose; + object_class->finalize = recurrence_page_finalize; + + editor_page_class = COMP_EDITOR_PAGE_CLASS (class); + editor_page_class->get_widget = recurrence_page_get_widget; + editor_page_class->focus_main_widget = recurrence_page_focus_main_widget; + editor_page_class->fill_widgets = recurrence_page_fill_widgets; + editor_page_class->fill_component = recurrence_page_fill_component; + editor_page_class->set_dates = recurrence_page_set_dates; + +} + +static void +recurrence_page_init (RecurrencePage *rpage) +{ + rpage->priv = RECURRENCE_PAGE_GET_PRIVATE (rpage); +} /* get_widget handler for the recurrence page */ static GtkWidget * recurrence_page_get_widget (CompEditorPage *page) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; - rpage = RECURRENCE_PAGE (page); - priv = rpage->priv; + priv = RECURRENCE_PAGE_GET_PRIVATE (page); return priv->main; } @@ -331,11 +395,9 @@ recurrence_page_get_widget (CompEditorPage *page) static void recurrence_page_focus_main_widget (CompEditorPage *page) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; - rpage = RECURRENCE_PAGE (page); - priv = rpage->priv; + priv = RECURRENCE_PAGE_GET_PRIVATE (page); gtk_widget_grab_focus (priv->recurs); } @@ -468,14 +530,17 @@ set_special_defaults (RecurrencePage *rpage) static void sensitize_recur_widgets (RecurrencePage *rpage) { - RecurrencePagePrivate *priv; + RecurrencePagePrivate *priv = rpage->priv; + CompEditor *editor; + CompEditorFlags flags; gboolean recurs, sens = TRUE; GtkWidget *label; - priv = rpage->priv; + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); + flags = comp_editor_get_flags (editor); - if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_MEETING) - sens = COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_USER_ORG; + if (flags & COMP_EDITOR_MEETING) + sens = flags & COMP_EDITOR_USER_ORG; recurs = e_dialog_toggle_get (priv->recurs); @@ -512,26 +577,35 @@ sensitize_recur_widgets (RecurrencePage *rpage) static void sensitize_buttons (RecurrencePage *rpage) { + RecurrencePagePrivate *priv = rpage->priv; + CompEditor *editor; + CompEditorFlags flags; gboolean read_only, sensitize = TRUE; gint selected_rows; - RecurrencePagePrivate *priv; icalcomponent *icalcomp; + ECal *client; const char *uid; - priv = rpage->priv; - if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_MEETING) - sensitize = COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_USER_ORG; + if (priv->comp == NULL) + return; + + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); + client = comp_editor_get_client (editor); + flags = comp_editor_get_flags (editor); + + if (flags & COMP_EDITOR_MEETING) + sensitize = flags & COMP_EDITOR_USER_ORG; selected_rows = gtk_tree_selection_count_selected_rows ( gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list))); - if (!e_cal_is_read_only (COMP_EDITOR_PAGE (rpage)->client, &read_only, NULL)) + if (!e_cal_is_read_only (client, &read_only, NULL)) read_only = TRUE; if (!read_only) { e_cal_component_get_uid (priv->comp, &uid); - if (e_cal_get_static_capability (COMP_EDITOR_PAGE (rpage)->client, CAL_STATIC_CAPABILITY_NO_CONV_TO_RECUR) && e_cal_get_object(COMP_EDITOR_PAGE (rpage)->client, uid, NULL, &icalcomp, NULL)) { + if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_CONV_TO_RECUR) && e_cal_get_object (client, uid, NULL, &icalcomp, NULL)) { read_only = TRUE; icalcomponent_free (icalcomp); } @@ -540,7 +614,7 @@ sensitize_buttons (RecurrencePage *rpage) GList *list; /* see if we have detached instances */ - if (e_cal_get_objects_for_uid (COMP_EDITOR_PAGE (rpage)->client, uid, &list, NULL)) { + if (e_cal_get_objects_for_uid (client, uid, &list, NULL)) { if (list && g_list_length (list) > 1) read_only = TRUE; @@ -830,81 +904,6 @@ fill_component (RecurrencePage *rpage, ECalComponent *comp) return TRUE; } -/* Re-tags the recurrence preview calendar based on the current information of - * the widgets in the recurrence page. - */ -static void -preview_recur (RecurrencePage *rpage) -{ - RecurrencePagePrivate *priv; - ECalComponent *comp; - ECalComponentDateTime cdt; - GSList *l; - icaltimezone *zone = NULL; - - priv = rpage->priv; - - /* If our component has not been set yet through ::fill_widgets(), we - * cannot preview the recurrence. - */ - if (!priv || !priv->comp || e_cal_component_is_instance (priv->comp)) - return; - - /* Create a scratch component with the start/end and - * recurrence/exception information from the one we are editing. - */ - - comp = e_cal_component_new (); - e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT); - - e_cal_component_get_dtstart (priv->comp, &cdt); - if (cdt.tzid != NULL) { - /* FIXME Will e_cal_get_timezone really not return builtin zones? */ - if (!e_cal_get_timezone (COMP_EDITOR_PAGE (rpage)->client, cdt.tzid, &zone, NULL)) - zone = icaltimezone_get_builtin_timezone_from_tzid (cdt.tzid); - } - e_cal_component_set_dtstart (comp, &cdt); - e_cal_component_free_datetime (&cdt); - - e_cal_component_get_dtend (priv->comp, &cdt); - e_cal_component_set_dtend (comp, &cdt); - e_cal_component_free_datetime (&cdt); - - e_cal_component_get_exdate_list (priv->comp, &l); - e_cal_component_set_exdate_list (comp, l); - e_cal_component_free_exdate_list (l); - - e_cal_component_get_exrule_list (priv->comp, &l); - e_cal_component_set_exrule_list (comp, l); - e_cal_component_free_recur_list (l); - - e_cal_component_get_rdate_list (priv->comp, &l); - e_cal_component_set_rdate_list (comp, l); - e_cal_component_free_period_list (l); - - e_cal_component_get_rrule_list (priv->comp, &l); - e_cal_component_set_rrule_list (comp, l); - e_cal_component_free_recur_list (l); - - fill_component (rpage, comp); - - tag_calendar_by_comp (E_CALENDAR (priv->preview_calendar), comp, - COMP_EDITOR_PAGE (rpage)->client, zone, TRUE, FALSE); - g_object_unref(comp); -} - -/* Callback used when the recurrence weekday picker changes */ -static void -weekday_picker_changed_cb (WeekdayPicker *wp, gpointer data) -{ - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); - - field_changed (rpage); - preview_recur (rpage); -} - /* Creates the special contents for weekly recurrences */ static void make_weekly_special (RecurrencePage *rpage) @@ -941,9 +940,9 @@ make_weekly_special (RecurrencePage *rpage) weekday_picker_set_week_start_day (wp, calendar_config_get_week_start_day ()); weekday_picker_set_days (wp, priv->weekday_day_mask); - g_signal_connect((wp), "changed", - G_CALLBACK (weekday_picker_changed_cb), - rpage); + g_signal_connect_swapped ( + wp, "changed", + G_CALLBACK (comp_editor_page_changed), rpage); } @@ -1111,14 +1110,13 @@ make_recur_month_menu (void) } static void -month_num_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data) +month_num_menu_selection_done_cb (GtkMenuShell *menu_shell, + RecurrencePage *rpage) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; enum month_num_options month_num; enum month_day_options month_day; - rpage = RECURRENCE_PAGE (data); priv = rpage->priv; month_num = e_dialog_option_menu_get (priv->month_num_menu, @@ -1150,8 +1148,8 @@ month_num_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data) e_dialog_option_menu_set (priv->month_day_menu, MONTH_DAY_MON, month_num_options_map); - field_changed (rpage); - preview_recur (rpage); + + comp_editor_page_changed (COMP_EDITOR_PAGE (rpage)); } /* Callback used when the monthly day selection menu changes. We need @@ -1159,14 +1157,13 @@ month_num_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data) * are 1-31 while a Sunday is the 1st through 5th. */ static void -month_day_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data) +month_day_menu_selection_done_cb (GtkMenuShell *menu_shell, + RecurrencePage *rpage) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; enum month_num_options month_num; enum month_day_options month_day; - rpage = RECURRENCE_PAGE (data); priv = rpage->priv; month_num = e_dialog_option_menu_get (priv->month_num_menu, @@ -1181,20 +1178,8 @@ month_day_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data) e_dialog_option_menu_set (priv->month_num_menu, MONTH_NUM_FIRST, month_num_options_map); - field_changed (rpage); - preview_recur (rpage); -} -/* Callback used when the month index value changes. */ -static void -month_index_value_changed_cb (GtkAdjustment *adj, gpointer data) -{ - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); - - field_changed (rpage); - preview_recur (rpage); + comp_editor_page_changed (COMP_EDITOR_PAGE (rpage)); } /* Creates the special contents for monthly recurrences */ @@ -1243,8 +1228,9 @@ make_monthly_special (RecurrencePage *rpage) priv->month_day, month_day_options_map); - g_signal_connect((adj), "value_changed", G_CALLBACK (month_index_value_changed_cb), - rpage); + g_signal_connect_swapped ( + adj, "value-changed", + G_CALLBACK (comp_editor_page_changed), rpage); menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->month_num_menu)); g_signal_connect((menu), "selection_done", @@ -1321,30 +1307,22 @@ count_by_xxx (short *field, int max_elements) return i; } -/* Callback used when the ending-until date editor changes */ -static void -ending_until_changed_cb (EDateEdit *de, gpointer data) -{ - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); - field_changed (rpage); - preview_recur (rpage); -} - /* Creates the special contents for "ending until" (end date) recurrences */ static void make_ending_until_special (RecurrencePage *rpage) { - RecurrencePagePrivate *priv; + RecurrencePagePrivate *priv = rpage->priv; + CompEditor *editor; + CompEditorFlags flags; EDateEdit *de; ECalComponentDateTime dt_start; - priv = rpage->priv; - g_return_if_fail (GTK_BIN (priv->ending_special)->child == NULL); g_return_if_fail (priv->ending_date_edit == NULL); + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); + flags = comp_editor_get_flags (editor); + /* Create the widget */ priv->ending_date_edit = comp_editor_new_date_edit (TRUE, FALSE, @@ -1357,7 +1335,7 @@ make_ending_until_special (RecurrencePage *rpage) /* Set the value */ - if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_NEW_ITEM) { + if (flags & COMP_EDITOR_NEW_ITEM) { e_cal_component_get_dtstart (priv->comp, &dt_start); /* Setting the default until time to 2 weeks */ icaltime_adjust (dt_start.value, 14, 0, 0, 0); @@ -1367,8 +1345,9 @@ make_ending_until_special (RecurrencePage *rpage) e_date_edit_set_date (de, priv->ending_date_tt.year, priv->ending_date_tt.month, priv->ending_date_tt.day); } - g_signal_connect((de), "changed", - G_CALLBACK (ending_until_changed_cb), rpage); + g_signal_connect_swapped ( + de, "changed", + G_CALLBACK (comp_editor_page_changed), rpage); /* Make sure the EDateEdit widget uses our timezones to get the current time. */ @@ -1377,17 +1356,6 @@ make_ending_until_special (RecurrencePage *rpage) rpage, NULL); } -/* Callback used when the ending-count value changes */ -static void -ending_count_value_changed_cb (GtkAdjustment *adj, gpointer data) -{ - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); - field_changed (rpage); - preview_recur (rpage); -} - /* Creates the special contents for the occurrence count case */ static void make_ending_count_special (RecurrencePage *rpage) @@ -1422,9 +1390,9 @@ make_ending_count_special (RecurrencePage *rpage) e_dialog_spin_set (priv->ending_count_spin, priv->ending_count); - g_signal_connect((adj), "value_changed", - G_CALLBACK (ending_count_value_changed_cb), - rpage); + g_signal_connect_swapped ( + adj, "value-changed", + G_CALLBACK (comp_editor_page_changed), rpage); } /* Changes the recurrence-ending-special widget to match the ending date option @@ -1477,10 +1445,13 @@ make_ending_special (RecurrencePage *rpage) static void fill_ending_date (RecurrencePage *rpage, struct icalrecurrencetype *r) { - RecurrencePagePrivate *priv; + RecurrencePagePrivate *priv = rpage->priv; + CompEditor *editor; GtkWidget *menu; + ECal *client; - priv = rpage->priv; + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); + client = comp_editor_get_client (editor); menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->ending_menu)); g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage); @@ -1496,7 +1467,6 @@ fill_ending_date (RecurrencePage *rpage, struct icalrecurrencetype *r) /* Ending date */ if (!r->until.is_date) { - ECal *client = COMP_EDITOR_PAGE (rpage)->client; ECalComponentDateTime dt; icaltimezone *from_zone, *to_zone; @@ -1552,6 +1522,8 @@ recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) RecurrencePage *rpage; RecurrencePagePrivate *priv; ECalComponentText text; + CompEditor *editor; + CompEditorFlags flags; CompEditorPageDates dates; GSList *rrule_list; int len; @@ -1565,6 +1537,9 @@ recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) rpage = RECURRENCE_PAGE (page); priv = rpage->priv; + editor = comp_editor_page_get_editor (page); + flags = comp_editor_get_flags (editor); + /* Keep a copy of the component so that we can expand the recurrence * set for the preview. */ @@ -1574,11 +1549,10 @@ recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) priv->comp = e_cal_component_clone (comp); - if (!e_cal_component_has_organizer (comp)) - page->flags |= COMP_EDITOR_PAGE_USER_ORG; - - /* Don't send off changes during this time */ - priv->updating = TRUE; + if (!e_cal_component_has_organizer (comp)) { + flags |= COMP_EDITOR_USER_ORG; + comp_editor_set_flags (editor, flags); + } /* Clean the page */ clear_widgets (rpage); @@ -1609,7 +1583,6 @@ recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) sensitize_buttons (rpage); preview_recur (rpage); - priv->updating = FALSE; return TRUE; } @@ -1896,8 +1869,6 @@ recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) e_cal_component_free_recur_list (rrule_list); preview_recur (rpage); - priv->updating = FALSE; - return TRUE; } @@ -1918,12 +1889,17 @@ recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) RecurrencePage *rpage; RecurrencePagePrivate *priv; ECalComponentDateTime dt; + CompEditor *editor; + CompEditorFlags flags; struct icaltimetype icaltime; guint8 mask; rpage = RECURRENCE_PAGE (page); priv = rpage->priv; + editor = comp_editor_page_get_editor (page); + flags = comp_editor_get_flags (editor); + /* Copy the dates to our component */ if (!priv->comp) @@ -1957,7 +1933,7 @@ recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) } } - if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_NEW_ITEM) { + if (flags & COMP_EDITOR_NEW_ITEM) { ECalendar *ecal; GDate *start, *end; @@ -2044,11 +2020,9 @@ get_widgets (RecurrencePage *rpage) * calendar changes. */ static void -preview_date_range_changed_cb (ECalendarItem *item, gpointer data) +preview_date_range_changed_cb (ECalendarItem *item, + RecurrencePage *rpage) { - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); preview_recur (rpage); } @@ -2056,23 +2030,22 @@ preview_date_range_changed_cb (ECalendarItem *item, gpointer data) * enable or disable the recurrence parameters. */ static void -type_toggled_cb (GtkToggleButton *toggle, gpointer data) +type_toggled_cb (GtkToggleButton *toggle, + RecurrencePage *rpage) { - RecurrencePage *rpage; - RecurrencePagePrivate *priv; + RecurrencePagePrivate *priv = rpage->priv; + CompEditor *editor; + ECal *client; gboolean read_only; - rpage = RECURRENCE_PAGE (data); - - priv = rpage->priv; - - field_changed (rpage); + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); + client = comp_editor_get_client (editor); + comp_editor_page_changed (COMP_EDITOR_PAGE (rpage)); sensitize_buttons (rpage); - preview_recur (rpage); /* enable/disable the 'Add' button */ - if (!e_cal_is_read_only (COMP_EDITOR_PAGE (rpage)->client, &read_only, NULL)) + if (!e_cal_is_read_only (client, &read_only, NULL)) read_only = TRUE; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->recurs)) || read_only) @@ -2081,47 +2054,6 @@ type_toggled_cb (GtkToggleButton *toggle, gpointer data) gtk_widget_set_sensitive (priv->exception_add, TRUE); } -/* Callback used when the recurrence interval value spin button changes. */ -static void -interval_value_changed_cb (GtkAdjustment *adj, gpointer data) -{ - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); - - field_changed (rpage); - preview_recur (rpage); -} - -/* Callback used when the recurrence interval option menu changes. We need to - * change the contents of the recurrence special widget. - */ -static void -interval_selection_done_cb (GtkOptionMenu *menu, gpointer data) -{ - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); - - field_changed (rpage); - make_recurrence_special (rpage); - preview_recur (rpage); -} - -/* Callback used when the recurrence ending option menu changes. We need to - * change the contents of the ending special widget. - */ -static void -ending_selection_done_cb (GtkOptionMenu *menu, gpointer data) -{ - RecurrencePage *rpage; - - rpage = RECURRENCE_PAGE (data); - field_changed (rpage); - make_ending_special (rpage); - preview_recur (rpage); -} - static GtkWidget * create_exception_dialog (RecurrencePage *rpage, const char *title, GtkWidget **date_edit) { @@ -2146,22 +2078,18 @@ create_exception_dialog (RecurrencePage *rpage, const char *title, GtkWidget **d /* Callback for the "add exception" button */ static void -exception_add_cb (GtkWidget *widget, gpointer data) +exception_add_cb (GtkWidget *widget, + RecurrencePage *rpage) { - RecurrencePage *rpage; GtkWidget *dialog, *date_edit; gboolean date_set; - rpage = RECURRENCE_PAGE (data); - dialog = create_exception_dialog (rpage, _("Add exception"), &date_edit); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { ECalComponentDateTime dt; struct icaltimetype icaltime = icaltime_null_time (); - field_changed (rpage); - dt.value = &icaltime; /* We use DATE values for exceptions, so we don't need a TZID. */ @@ -2175,7 +2103,8 @@ exception_add_cb (GtkWidget *widget, gpointer data) g_return_if_fail (date_set); append_exception (rpage, &dt); - preview_recur (rpage); + + comp_editor_page_changed (COMP_EDITOR_PAGE (rpage)); } gtk_widget_destroy (dialog); @@ -2183,16 +2112,15 @@ exception_add_cb (GtkWidget *widget, gpointer data) /* Callback for the "modify exception" button */ static void -exception_modify_cb (GtkWidget *widget, gpointer data) +exception_modify_cb (GtkWidget *widget, + RecurrencePage *rpage) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; GtkWidget *dialog, *date_edit; const ECalComponentDateTime *current_dt; GtkTreeSelection *selection; GtkTreeIter iter; - rpage = RECURRENCE_PAGE (data); priv = rpage->priv; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list)); @@ -2212,8 +2140,6 @@ exception_modify_cb (GtkWidget *widget, gpointer data) struct icaltimetype icaltime = icaltime_null_time (); struct icaltimetype *tt; - field_changed (rpage); - dt.value = &icaltime; tt = dt.value; e_date_edit_get_date (E_DATE_EDIT (date_edit), @@ -2227,7 +2153,8 @@ exception_modify_cb (GtkWidget *widget, gpointer data) dt.tzid = NULL; e_date_time_list_set_date_time (priv->exception_list_store, &iter, &dt); - preview_recur (rpage); + + comp_editor_page_changed (COMP_EDITOR_PAGE (rpage)); } gtk_widget_destroy (dialog); @@ -2235,16 +2162,15 @@ exception_modify_cb (GtkWidget *widget, gpointer data) /* Callback for the "delete exception" button */ static void -exception_delete_cb (GtkWidget *widget, gpointer data) +exception_delete_cb (GtkWidget *widget, + RecurrencePage *rpage) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreePath *path; gboolean valid_iter; - rpage = RECURRENCE_PAGE (data); priv = rpage->priv; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list)); @@ -2253,8 +2179,6 @@ exception_delete_cb (GtkWidget *widget, gpointer data) return; } - field_changed (rpage); - path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->exception_list_store), &iter); e_date_time_list_remove (priv->exception_list_store, &iter); @@ -2269,7 +2193,8 @@ exception_delete_cb (GtkWidget *widget, gpointer data) gtk_tree_selection_select_iter (selection, &iter); gtk_tree_path_free (path); - preview_recur (rpage); + + comp_editor_page_changed (COMP_EDITOR_PAGE (rpage)); } /* Callback used when a row is selected in the list of exception @@ -2277,13 +2202,12 @@ exception_delete_cb (GtkWidget *widget, gpointer data) * exception's value. */ static void -exception_selection_changed_cb (GtkTreeSelection *selection, gpointer data) +exception_selection_changed_cb (GtkTreeSelection *selection, + RecurrencePage *rpage) { - RecurrencePage *rpage; RecurrencePagePrivate *priv; GtkTreeIter iter; - rpage = RECURRENCE_PAGE (data); priv = rpage->priv; if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) { @@ -2296,18 +2220,6 @@ exception_selection_changed_cb (GtkTreeSelection *selection, gpointer data) gtk_widget_set_sensitive (priv->exception_delete, TRUE); } -/* This is called when any field is changed; it notifies upstream. */ -static void -field_changed (RecurrencePage *rpage) -{ - RecurrencePagePrivate *priv; - - priv = rpage->priv; - - if (!priv->updating) - comp_editor_page_notify_changed (COMP_EDITOR_PAGE (rpage)); -} - /* Hooks the widget signals */ static void init_widgets (RecurrencePage *rpage) @@ -2344,20 +2256,27 @@ init_widgets (RecurrencePage *rpage) /* Recurrence interval */ adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (priv->interval_value)); - g_signal_connect((adj), "value_changed", - G_CALLBACK (interval_value_changed_cb), - rpage); + g_signal_connect_swapped ( + adj, "value-changed", + G_CALLBACK (comp_editor_page_changed), rpage); /* Recurrence units */ - g_signal_connect(GTK_OPTION_MENU (priv->interval_unit), "changed", - G_CALLBACK (interval_selection_done_cb), - rpage); + g_signal_connect_swapped ( + priv->interval_unit, "changed", + G_CALLBACK (comp_editor_page_changed), rpage); + g_signal_connect_swapped ( + priv->interval_unit, "changed", + G_CALLBACK (make_recurrence_special), rpage); /* Recurrence ending */ - g_signal_connect(GTK_OPTION_MENU (priv->ending_menu), "changed", - G_CALLBACK (ending_selection_done_cb), rpage); + g_signal_connect_swapped ( + priv->ending_menu, "changed", + G_CALLBACK (comp_editor_page_changed), rpage); + g_signal_connect_swapped ( + priv->ending_menu, "changed", + G_CALLBACK (make_ending_special), rpage); /* Exception buttons */ @@ -2390,16 +2309,6 @@ init_widgets (RecurrencePage *rpage) G_CALLBACK (exception_selection_changed_cb), rpage); } - - -static void -client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data) -{ - RecurrencePage *rpage = RECURRENCE_PAGE (page); - - sensitize_buttons (rpage); -} - /** * recurrence_page_construct: * @rpage: A recurrence page. @@ -2412,10 +2321,11 @@ client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data) RecurrencePage * recurrence_page_construct (RecurrencePage *rpage) { - RecurrencePagePrivate *priv; + RecurrencePagePrivate *priv = rpage->priv; + CompEditor *editor; char *gladefile; - priv = rpage->priv; + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); gladefile = g_build_filename (EVOLUTION_GLADEDIR, "recurrence-page.glade", @@ -2437,8 +2347,9 @@ recurrence_page_construct (RecurrencePage *rpage) init_widgets (rpage); - g_signal_connect_after (G_OBJECT (rpage), "client_changed", - G_CALLBACK (client_changed_cb), NULL); + g_signal_connect_swapped ( + editor, "notify::client", + G_CALLBACK (sensitize_buttons), rpage); return rpage; } @@ -2452,14 +2363,16 @@ recurrence_page_construct (RecurrencePage *rpage) * be created. **/ RecurrencePage * -recurrence_page_new (void) +recurrence_page_new (CompEditor *editor) { RecurrencePage *rpage; - rpage = g_object_new (TYPE_RECURRENCE_PAGE, NULL); + g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL); + + rpage = g_object_new (TYPE_RECURRENCE_PAGE, "editor", editor, NULL); if (!recurrence_page_construct (rpage)) { g_object_unref (rpage); - return NULL; + g_return_val_if_reached (NULL); } return rpage; |