diff options
Diffstat (limited to 'calendar/gui/dialogs/schedule-page.c')
-rw-r--r-- | calendar/gui/dialogs/schedule-page.c | 166 |
1 files changed, 71 insertions, 95 deletions
diff --git a/calendar/gui/dialogs/schedule-page.c b/calendar/gui/dialogs/schedule-page.c index 425b191c5f..57af4ecf87 100644 --- a/calendar/gui/dialogs/schedule-page.c +++ b/calendar/gui/dialogs/schedule-page.c @@ -39,7 +39,9 @@ #include "e-delegate-dialog.h" #include "schedule-page.h" - +#define SCHEDULE_PAGE_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), TYPE_SCHEDULE_PAGE, SchedulePagePrivate)) /* Private part of the SchedulePage structure */ struct _SchedulePagePrivate { @@ -59,93 +61,68 @@ struct _SchedulePagePrivate { start and end date. We convert the end date if it is passed in in another timezone. */ icaltimezone *zone; - - gboolean updating; }; - - -static void schedule_page_finalize (GObject *object); - static GtkWidget *schedule_page_get_widget (CompEditorPage *page); static void schedule_page_focus_main_widget (CompEditorPage *page); static gboolean schedule_page_fill_widgets (CompEditorPage *page, ECalComponent *comp); static gboolean schedule_page_fill_component (CompEditorPage *page, ECalComponent *comp); static void schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates); -static void times_changed_cb (GtkWidget *widget, gpointer data); +static void times_changed_cb (GtkWidget *widget, SchedulePage *spage); G_DEFINE_TYPE (SchedulePage, schedule_page, TYPE_COMP_EDITOR_PAGE) -/* Class initialization function for the schedule page */ static void -schedule_page_class_init (SchedulePageClass *class) -{ - CompEditorPageClass *editor_page_class; - GObjectClass *object_class; - - editor_page_class = (CompEditorPageClass *) class; - object_class = (GObjectClass *) class; - - editor_page_class->get_widget = schedule_page_get_widget; - editor_page_class->focus_main_widget = schedule_page_focus_main_widget; - editor_page_class->fill_widgets = schedule_page_fill_widgets; - editor_page_class->fill_component = schedule_page_fill_component; - editor_page_class->set_summary = NULL; - editor_page_class->set_dates = schedule_page_set_dates; - - object_class->finalize = schedule_page_finalize; -} - -/* Object initialization function for the schedule page */ -static void -schedule_page_init (SchedulePage *spage) +schedule_page_dispose (GObject *object) { SchedulePagePrivate *priv; - priv = g_new0 (SchedulePagePrivate, 1); - spage->priv = priv; + priv = SCHEDULE_PAGE_GET_PRIVATE (object); - priv->xml = NULL; + if (priv->main != NULL) { + g_object_unref (priv->main); + priv->main = NULL; + } - priv->main = NULL; + if (priv->xml != NULL) { + g_object_unref (priv->xml); + priv->xml = NULL; + } - priv->zone = NULL; + if (priv->model != NULL) { + g_object_unref (priv->model); + priv->model = NULL; + } - priv->updating = FALSE; + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (schedule_page_parent_class)->dispose (object); } -/* Destroy handler for the schedule page */ static void -schedule_page_finalize (GObject *object) +schedule_page_class_init (SchedulePageClass *class) { - SchedulePage *spage; - SchedulePagePrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_SCHEDULE_PAGE (object)); - - spage = SCHEDULE_PAGE (object); - priv = spage->priv; - - if (priv->main) - g_object_unref (priv->main); - - if (priv->xml) { - g_object_unref (priv->xml); - priv->xml = NULL; - } + GObjectClass *object_class; + CompEditorPageClass *editor_page_class; - g_object_unref(priv->model); + g_type_class_add_private (class, sizeof (SchedulePagePrivate)); - g_free (priv); - spage->priv = NULL; + object_class = G_OBJECT_CLASS (class); + object_class->dispose = schedule_page_dispose; - if (G_OBJECT_CLASS (schedule_page_parent_class)->finalize) - (* G_OBJECT_CLASS (schedule_page_parent_class)->finalize) (object); + editor_page_class = COMP_EDITOR_PAGE_CLASS (class); + editor_page_class->get_widget = schedule_page_get_widget; + editor_page_class->focus_main_widget = schedule_page_focus_main_widget; + editor_page_class->fill_widgets = schedule_page_fill_widgets; + editor_page_class->fill_component = schedule_page_fill_component; + editor_page_class->set_dates = schedule_page_set_dates; } - +static void +schedule_page_init (SchedulePage *spage) +{ + spage->priv = SCHEDULE_PAGE_GET_PRIVATE (spage); +} /* get_widget handler for the schedule page */ static GtkWidget * @@ -176,41 +153,40 @@ schedule_page_focus_main_widget (CompEditorPage *page) static void sensitize_widgets (SchedulePage *spage) { - gboolean read_only; SchedulePagePrivate *priv = spage->priv; + CompEditor *editor; + ECal *client; + gboolean read_only; - if (!e_cal_is_read_only (COMP_EDITOR_PAGE (spage)->client, &read_only, NULL)) + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage)); + client = comp_editor_get_client (editor); + + if (!e_cal_is_read_only (client, &read_only, NULL)) read_only = TRUE; e_meeting_time_selector_set_read_only (priv->sel, read_only); } -static void -client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data) -{ - SchedulePage *spage = SCHEDULE_PAGE (page); - - sensitize_widgets (spage); -} - /* Set date/time */ static void update_time (SchedulePage *spage, ECalComponentDateTime *start_date, ECalComponentDateTime *end_date) { - SchedulePagePrivate *priv; + SchedulePagePrivate *priv = spage->priv; + CompEditor *editor; struct icaltimetype start_tt, end_tt; icaltimezone *start_zone = NULL, *end_zone = NULL; + ECal *client; gboolean all_day; - priv = spage->priv; + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage)); + client = comp_editor_get_client (editor); /* Note that if we are creating a new event, the timezones may not be on the server, so we try to get the builtin timezone with the TZID first. */ start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid); if (!start_zone) { - if (!e_cal_get_timezone (COMP_EDITOR_PAGE (spage)->client, - start_date->tzid, &start_zone, NULL)) { + if (!e_cal_get_timezone (client, start_date->tzid, &start_zone, NULL)) { /* FIXME: Handle error better. */ g_warning ("Couldn't get timezone from server: %s", start_date->tzid ? start_date->tzid : ""); @@ -219,8 +195,7 @@ update_time (SchedulePage *spage, ECalComponentDateTime *start_date, ECalCompone end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid); if (!end_zone) { - if (!e_cal_get_timezone (COMP_EDITOR_PAGE (spage)->client, - end_date->tzid, &end_zone, NULL)) { + if (!e_cal_get_timezone (client, end_date->tzid, &end_zone, NULL)) { /* FIXME: Handle error better. */ g_warning ("Couldn't get timezone from server: %s", end_date->tzid ? end_date->tzid : ""); @@ -283,8 +258,6 @@ schedule_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) spage = SCHEDULE_PAGE (page); priv = spage->priv; - priv->updating = TRUE; - /* Clean the screen */ clear_widgets (spage); @@ -301,8 +274,6 @@ schedule_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) e_cal_component_free_datetime (&start_date); e_cal_component_free_datetime (&end_date); - priv->updating = FALSE; - sensitize_widgets (spage); return validated; @@ -324,11 +295,9 @@ schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) spage = SCHEDULE_PAGE (page); priv = spage->priv; - priv->updating = TRUE; - + comp_editor_page_set_updating (page, TRUE); update_time (spage, dates->start, dates->end); - - priv->updating = FALSE; + comp_editor_page_set_updating (page, FALSE); } @@ -413,10 +382,11 @@ schedule_page_set_meeting_time (SchedulePage *spage, icaltimetype *start_tt, ica SchedulePage * schedule_page_construct (SchedulePage *spage, EMeetingStore *ems) { - SchedulePagePrivate *priv; + SchedulePagePrivate *priv = spage->priv; + CompEditor *editor; char *gladefile; - priv = spage->priv; + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage)); gladefile = g_build_filename (EVOLUTION_GLADEDIR, "schedule-page.glade", @@ -457,8 +427,10 @@ schedule_page_construct (SchedulePage *spage, EMeetingStore *ems) return NULL; } - g_signal_connect_after (G_OBJECT (spage), "client_changed", - G_CALLBACK (client_changed_cb), NULL); + g_signal_connect_swapped ( + editor, "notify::client", + G_CALLBACK (sensitize_widgets), spage); + return spage; } @@ -471,14 +443,15 @@ schedule_page_construct (SchedulePage *spage, EMeetingStore *ems) * not be created. **/ SchedulePage * -schedule_page_new (EMeetingStore *ems) +schedule_page_new (EMeetingStore *ems, + CompEditor *editor) { SchedulePage *spage; - spage = g_object_new (TYPE_SCHEDULE_PAGE, NULL); + spage = g_object_new (TYPE_SCHEDULE_PAGE, "editor", editor, NULL); if (!schedule_page_construct (spage, ems)) { g_object_unref (spage); - return NULL; + g_return_val_if_reached (NULL); } return spage; @@ -511,20 +484,23 @@ schedule_page_set_name_selector (SchedulePage *spage, ENameSelector *name_select } static void -times_changed_cb (GtkWidget *widget, gpointer data) +times_changed_cb (GtkWidget *widget, + SchedulePage *spage) { - SchedulePage *spage = data; SchedulePagePrivate *priv; CompEditorPageDates dates; + CompEditor *editor; ECalComponentDateTime start_dt, end_dt; struct icaltimetype start_tt = icaltime_null_time (); struct icaltimetype end_tt = icaltime_null_time (); priv = spage->priv; - if (priv->updating) + if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (spage))) return; + editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage)); + e_date_edit_get_date (E_DATE_EDIT (priv->sel->start_date_edit), &start_tt.year, &start_tt.month, @@ -563,5 +539,5 @@ times_changed_cb (GtkWidget *widget, gpointer data) dates.complete = NULL; comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (spage), &dates); - comp_editor_page_notify_changed (COMP_EDITOR_PAGE (spage)); + comp_editor_set_changed (editor, TRUE); } |