diff options
Diffstat (limited to 'calendar/gui/gnome-cal.c')
-rw-r--r-- | calendar/gui/gnome-cal.c | 3061 |
1 files changed, 758 insertions, 2303 deletions
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index 576dfc81d2..defda15875 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -36,42 +36,30 @@ #include <glib.h> #include <gdk/gdkkeysyms.h> #include <glib/gi18n.h> -#include <bonobo/bonobo-exception.h> #include <libedataserver/e-categories.h> #include <libedataserver/e-url.h> #include <libedataserverui/e-passwords.h> -#include "shell/e-user-creatable-items-handler.h" #include <libecal/e-cal-time-util.h> #include <widgets/menus/gal-view-factory-etable.h> #include <widgets/menus/gal-view-etable.h> #include <widgets/menus/gal-define-views-dialog.h> -#include "widgets/menus/gal-view-menus.h" +#include "e-util/e-binding.h" #include "e-util/e-util.h" #include "e-util/e-error.h" #include "e-util/e-util-private.h" +#include "shell/e-shell.h" #include "e-comp-editor-registry.h" #include "dialogs/delete-error.h" #include "dialogs/event-editor.h" -#include "dialogs/task-editor.h" #include "comp-util.h" #include "e-cal-model-calendar.h" #include "e-day-view.h" -#include "e-day-view-config.h" #include "e-day-view-time-item.h" +#include "e-month-view.h" #include "e-week-view.h" -#include "e-week-view-config.h" #include "e-cal-list-view.h" -#include "e-cal-list-view-config.h" -#include "e-mini-calendar-config.h" -#include "e-calendar-table-config.h" -#include "e-memo-table-config.h" -#include "evolution-calendar.h" #include "gnome-cal.h" -#include "calendar-component.h" -#include "memos-component.h" -#include "cal-search-bar.h" -#include "calendar-commands.h" #include "calendar-config.h" #include "calendar-view.h" #include "calendar-view-factory.h" @@ -79,14 +67,6 @@ #include "misc.h" #include "ea-calendar.h" #include "common/authentication.h" -#include "e-cal-popup.h" -#include "e-cal-menu.h" -#include "e-cal-model-tasks.h" - -/* FIXME glib 2.4 and above has this */ -#ifndef G_MAXINT32 -#define G_MAXINT32 ((gint32) 0x7fffffff) -#endif #define d(x) @@ -95,11 +75,14 @@ static GHashTable *non_intrusive_error_table = NULL; /* Private part of the GnomeCalendar structure */ struct _GnomeCalendarPrivate { - /* The clients for display */ + EShellSettings *shell_settings; - GHashTable *clients[E_CAL_SOURCE_TYPE_LAST]; - GList *clients_list[E_CAL_SOURCE_TYPE_LAST]; - ECal *default_client[E_CAL_SOURCE_TYPE_LAST]; + ECalModel *model; + + /* The clients for display */ + GHashTable *clients; + GList *clients_list; + ECal *default_client; /* * Fields for the calendar view @@ -110,33 +93,9 @@ struct _GnomeCalendarPrivate { /* Widgets */ - GtkWidget *search_bar; - GtkWidget *hpane; - GtkWidget *notebook; - GtkWidget *vpane; ECalendar *date_navigator; - EMiniCalendarConfig *date_navigator_config; - GtkWidget *todo; - ECalendarTableConfig *todo_config; - - GtkWidget *memo; - EMemoTableConfig *memo_config; - - GtkWidget *day_view; - GtkWidget *work_week_view; - GtkWidget *week_view; - GtkWidget *month_view; - GtkWidget *list_view; - - /* Activity */ - EActivityHandler *activity_handler; - - /* plugin menu managers */ - ECalMenu *calendar_menu; - ECalMenu *taskpad_menu; - ECalMenu *memopad_menu; /* Calendar query for the date navigator */ GList *dn_queries; /* list of CalQueries */ @@ -150,7 +109,6 @@ struct _GnomeCalendarPrivate { positions of the panes. range_selected is TRUE if a range of dates was selected in the date navigator to show the view. */ ECalendarView *views[GNOME_CAL_LAST_VIEW]; - GObject *configs[GNOME_CAL_LAST_VIEW]; GnomeCalendarViewType current_view_type; GList *notifications; @@ -161,22 +119,10 @@ struct _GnomeCalendarPrivate { will work OK after theme changes. */ gint hpane_pos; gint hpane_pos_month_view; - gint vpane_pos; - gint vpane_pos_month_view; /* The signal handler id for our GtkCalendar "day_selected" handler. */ guint day_selected_id; - /* View instance and menus for the control */ - GalViewInstance *view_instance; - GalViewMenus *view_menus; - - /* Our current week start */ - gint week_start; - - /* Our current timezone. */ - icaltimezone *zone; - /* The dates currently shown. If they are -1 then we have no dates shown. We only use these to check if we need to emit a 'dates-shown-changed' signal.*/ @@ -188,24 +134,20 @@ struct _GnomeCalendarPrivate { it uses the date range set in search bar */ gboolean lview_select_daten_range; - /* We should know which calendar has been used to create object, so store it here - before emitting "user_created" signal and make it NULL just after the emit. */ - ECal *user_created_cal; - /* used in update_todo_view, to prevent interleaving when called in separate thread */ GMutex *todo_update_lock; }; -/* Signal IDs */ +enum { + PROP_0, + PROP_DATE_NAVIGATOR, + PROP_SHELL_SETTINGS, + PROP_VIEW +}; enum { DATES_SHOWN_CHANGED, CALENDAR_SELECTION_CHANGED, - TASKPAD_SELECTION_CHANGED, - MEMOPAD_SELECTION_CHANGED, - CALENDAR_FOCUS_CHANGE, - TASKPAD_FOCUS_CHANGE, - MEMOPAD_FOCUS_CHANGE, GOTO_DATE, SOURCE_ADDED, SOURCE_REMOVED, @@ -213,41 +155,15 @@ enum { LAST_SIGNAL }; -/* Used to indicate who has the focus within the calendar view */ -typedef enum { - FOCUS_CALENDAR, - FOCUS_TASKPAD, - FOCUS_MEMOPAD, - FOCUS_OTHER -} FocusLocation; - -static guint gnome_calendar_signals[LAST_SIGNAL]; - - +static guint signals[LAST_SIGNAL]; static void gnome_calendar_destroy (GtkObject *object); static void gnome_calendar_goto_date (GnomeCalendar *gcal, GnomeCalendarGotoDateType goto_date); -static void gnome_calendar_change_view (GnomeCalendar *gcal, - GnomeCalendarViewType view_type); -static void gnome_calendar_set_pane_positions (GnomeCalendar *gcal); -static void update_view_times (GnomeCalendar *gcal, time_t start_time); static void gnome_calendar_update_date_navigator (GnomeCalendar *gcal); -static void gnome_calendar_hpane_realized (GtkWidget *w, GnomeCalendar *gcal); -static void gnome_calendar_date_navigator_scrolled (GtkWidget *widget, GdkEventScroll *event, gpointer user_data); static gboolean gnome_calendar_hpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal); -static void gnome_calendar_vpane_realized (GtkWidget *w, GnomeCalendar *gcal); -static gboolean gnome_calendar_vpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal); - -static void gnome_calendar_on_date_navigator_date_range_changed (ECalendarItem *calitem, - GnomeCalendar *gcal); -static void gnome_calendar_on_date_navigator_selection_changed (ECalendarItem *calitem, - GnomeCalendar *gcal); -static void gnome_calendar_notify_dates_shown_changed (GnomeCalendar *gcal); - -static void update_query (GnomeCalendar *gcal); static void update_todo_view (GnomeCalendar *gcal); static void update_memo_view (GnomeCalendar *gcal); @@ -289,16 +205,340 @@ message_push (Message *msg) G_DEFINE_TYPE (GnomeCalendar, gnome_calendar, GTK_TYPE_VBOX) +static void +update_adjustment (GnomeCalendar *gcal, + GtkAdjustment *adjustment, + EWeekView *week_view) +{ + GDate date; + ECalModel *model; + gint week_offset; + struct icaltimetype start_tt = icaltime_null_time (); + time_t lower; + guint32 old_first_day_julian, new_first_day_julian; + icaltimezone *timezone; + + /* If we don't have a valid date set yet, just return. */ + if (!g_date_valid (&week_view->first_day_shown)) + return; + + /* Determine the first date shown. */ + date = week_view->base_date; + week_offset = floor (adjustment->value + 0.5); + g_date_add_days (&date, week_offset * 7); + + /* Convert the old & new first days shown to julian values. */ + old_first_day_julian = g_date_get_julian (&week_view->first_day_shown); + new_first_day_julian = g_date_get_julian (&date); + + /* If we are already showing the date, just return. */ + if (old_first_day_julian == new_first_day_julian) + return; + + /* Convert it to a time_t. */ + start_tt.year = g_date_get_year (&date); + start_tt.month = g_date_get_month (&date); + start_tt.day = g_date_get_day (&date); + + model = gnome_calendar_get_model (gcal); + timezone = e_cal_model_get_timezone (model); + lower = icaltime_as_timet_with_zone (start_tt, timezone); + + e_week_view_set_update_base_date (week_view, FALSE); + gnome_calendar_set_selected_time_range (gcal, lower); + e_week_view_set_update_base_date (week_view, TRUE); +} + +static void +week_view_adjustment_changed_cb (GtkAdjustment *adjustment, + GnomeCalendar *gcal) +{ + ECalendarView *view; + + view = gnome_calendar_get_calendar_view (gcal, GNOME_CAL_WEEK_VIEW); + update_adjustment (gcal, adjustment, E_WEEK_VIEW (view)); +} + +static void +month_view_adjustment_changed_cb (GtkAdjustment *adjustment, + GnomeCalendar *gcal) +{ + ECalendarView *view; + + view = gnome_calendar_get_calendar_view (gcal, GNOME_CAL_MONTH_VIEW); + update_adjustment (gcal, adjustment, E_WEEK_VIEW (view)); +} + +static void +view_selection_changed_cb (GnomeCalendar *gcal) +{ + g_signal_emit (gcal, signals[CALENDAR_SELECTION_CHANGED], 0); +} + +static void +view_progress_cb (ECalModel *model, + const gchar *message, + gint percent, + ECalSourceType type, + GnomeCalendar *gcal) +{ +#if 0 /* KILL-BONOBO */ + ECalendarView *view; + + view = gnome_calendar_get_calendar_view (gcal, GNOME_CAL_WEEK_VIEW); + e_calendar_view_set_status_message (view, message, percent); +#endif +} + +static void +view_done_cb (ECalModel *model, + ECalendarStatus status, + ECalSourceType type, + GnomeCalendar *gcal) +{ +#if 0 /* KILL-BONOBO */ + ECalendarView *view; + + view = gnome_calendar_get_calendar_view (gcal, GNOME_CAL_WEEK_VIEW); + e_calendar_view_set_status_message (view, NULL, -1); +#endif +} + +static void +gnome_calendar_notify_week_start_day_cb (GnomeCalendar *gcal) +{ + time_t start_time; + + start_time = gcal->priv->base_view_time; + gnome_calendar_set_selected_time_range (gcal, start_time); +} + +static void +gnome_calendar_update_time_range (GnomeCalendar *gcal) +{ + time_t start_time; + + start_time = gcal->priv->base_view_time; + gnome_calendar_set_selected_time_range (gcal, start_time); +} + +static void +gnome_calendar_set_shell_settings (GnomeCalendar *gcal, + EShellSettings *shell_settings) +{ + g_return_if_fail (E_IS_SHELL_SETTINGS (shell_settings)); + g_return_if_fail (gcal->priv->shell_settings == NULL); + + gcal->priv->shell_settings = g_object_ref (shell_settings); +} + +static void +gnome_calendar_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_DATE_NAVIGATOR: + gnome_calendar_set_date_navigator ( + GNOME_CALENDAR (object), + g_value_get_object (value)); + return; + + case PROP_SHELL_SETTINGS: + gnome_calendar_set_shell_settings ( + GNOME_CALENDAR (object), + g_value_get_object (value)); + return; + + case PROP_VIEW: + gnome_calendar_set_view ( + GNOME_CALENDAR (object), + g_value_get_int (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +gnome_calendar_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_DATE_NAVIGATOR: + g_value_set_object ( + value, gnome_calendar_get_date_navigator ( + GNOME_CALENDAR (object))); + return; + + case PROP_SHELL_SETTINGS: + g_value_set_object ( + value, gnome_calendar_get_shell_settings ( + GNOME_CALENDAR (object))); + return; + + case PROP_VIEW: + g_value_set_int ( + value, gnome_calendar_get_view ( + GNOME_CALENDAR (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +gnome_calendar_constructed (GObject *object) +{ + GnomeCalendar *gcal = GNOME_CALENDAR (object); + EShellSettings *shell_settings; + ECalendarView *calendar_view; + ECalModel *model; + GtkAdjustment *adjustment; + + shell_settings = gnome_calendar_get_shell_settings (gcal); + + /* Create the model for the views. */ + model = e_cal_model_calendar_new (shell_settings); + e_cal_model_set_flags (model, E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES); + gcal->priv->model = model; + + g_signal_connect ( + model, "cal-view-progress", + G_CALLBACK (view_progress_cb), gcal); + + g_signal_connect ( + model, "cal-view-done", + G_CALLBACK (view_done_cb), gcal); + + /* Day View */ + calendar_view = e_day_view_new (model); + e_calendar_view_set_calendar (calendar_view, gcal); + gcal->priv->views[GNOME_CAL_DAY_VIEW] = calendar_view; + + g_signal_connect_swapped ( + calendar_view, "selection-changed", + G_CALLBACK (view_selection_changed_cb), gcal); + + /* Work Week View */ + calendar_view = e_day_view_new (model); + e_day_view_set_work_week_view (E_DAY_VIEW (calendar_view), TRUE); + e_day_view_set_days_shown (E_DAY_VIEW (calendar_view), 5); + e_calendar_view_set_calendar (calendar_view, gcal); + gcal->priv->views[GNOME_CAL_WORK_WEEK_VIEW] = calendar_view; + + g_signal_connect_swapped ( + calendar_view, "notify::working-days", + G_CALLBACK (gnome_calendar_update_time_range), gcal); + + /* Week View */ + calendar_view = e_week_view_new (model); + e_calendar_view_set_calendar (calendar_view, gcal); + gcal->priv->views[GNOME_CAL_WEEK_VIEW] = calendar_view; + + g_signal_connect_swapped ( + calendar_view, "selection-changed", + G_CALLBACK (view_selection_changed_cb), gcal); + + adjustment = gtk_range_get_adjustment ( + GTK_RANGE (E_WEEK_VIEW (calendar_view)->vscrollbar)); + g_signal_connect ( + adjustment, "value-changed", + G_CALLBACK (week_view_adjustment_changed_cb), gcal); + + /* Month View */ + calendar_view = e_month_view_new (model); + e_week_view_set_multi_week_view (E_WEEK_VIEW (calendar_view), TRUE); + e_week_view_set_weeks_shown (E_WEEK_VIEW (calendar_view), 6); + e_calendar_view_set_calendar (calendar_view, gcal); + gcal->priv->views[GNOME_CAL_MONTH_VIEW] = calendar_view; + + g_signal_connect_swapped ( + calendar_view, "selection-changed", + G_CALLBACK (view_selection_changed_cb), gcal); + + adjustment = gtk_range_get_adjustment ( + GTK_RANGE (E_WEEK_VIEW (calendar_view)->vscrollbar)); + g_signal_connect ( + adjustment, "value-changed", + G_CALLBACK (month_view_adjustment_changed_cb), gcal); + + /* List View */ + calendar_view = e_cal_list_view_new (model); + e_calendar_view_set_calendar (calendar_view, gcal); + gcal->priv->views[GNOME_CAL_LIST_VIEW] = calendar_view; + + g_signal_connect_swapped ( + calendar_view, "selection-changed", + G_CALLBACK (view_selection_changed_cb), gcal); + + g_signal_connect_swapped ( + model, "notify::week-start-day", + G_CALLBACK (gnome_calendar_notify_week_start_day_cb), gcal); + + gnome_calendar_update_time_range (gcal); +} + /* Class initialization function for the gnome calendar */ static void gnome_calendar_class_init (GnomeCalendarClass *class) { - GtkObjectClass *object_class; + GObjectClass *object_class; + GtkObjectClass *gtk_object_class; GtkBindingSet *binding_set; - object_class = (GtkObjectClass *) class; + object_class = G_OBJECT_CLASS (class); + object_class->set_property = gnome_calendar_set_property; + object_class->get_property = gnome_calendar_get_property; + object_class->constructed = gnome_calendar_constructed; - gnome_calendar_signals[DATES_SHOWN_CHANGED] = + gtk_object_class = GTK_OBJECT_CLASS (class); + gtk_object_class->destroy = gnome_calendar_destroy; + + class->dates_shown_changed = NULL; + class->calendar_selection_changed = NULL; + class->source_added = NULL; + class->source_removed = NULL; + class->goto_date = gnome_calendar_goto_date; + class->change_view = gnome_calendar_set_view; + + g_object_class_install_property ( + object_class, + PROP_DATE_NAVIGATOR, + g_param_spec_object ( + "date-navigator", + "Date Navigator", + NULL, + E_TYPE_CALENDAR, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_SHELL_SETTINGS, + g_param_spec_object ( + "shell-settings", + _("Shell Settings"), + _("Application-wide settings"), + E_TYPE_SHELL_SETTINGS, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property ( + object_class, + PROP_VIEW, + g_param_spec_int ( + "view", + "View", + NULL, + GNOME_CAL_DAY_VIEW, + GNOME_CAL_LIST_VIEW, + 0, + G_PARAM_READWRITE)); + + signals[DATES_SHOWN_CHANGED] = g_signal_new ("dates_shown_changed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, @@ -307,7 +547,7 @@ gnome_calendar_class_init (GnomeCalendarClass *class) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - gnome_calendar_signals[CALENDAR_SELECTION_CHANGED] = + signals[CALENDAR_SELECTION_CHANGED] = g_signal_new ("calendar_selection_changed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, @@ -316,55 +556,7 @@ gnome_calendar_class_init (GnomeCalendarClass *class) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - gnome_calendar_signals[TASKPAD_SELECTION_CHANGED] = - g_signal_new ("taskpad_selection_changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GnomeCalendarClass, taskpad_selection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - gnome_calendar_signals[MEMOPAD_SELECTION_CHANGED] = - g_signal_new ("memopad_selection_changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GnomeCalendarClass, memopad_selection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - gnome_calendar_signals[CALENDAR_FOCUS_CHANGE] = - g_signal_new ("calendar_focus_change", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GnomeCalendarClass, calendar_focus_change), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, - G_TYPE_BOOLEAN); - - gnome_calendar_signals[TASKPAD_FOCUS_CHANGE] = - g_signal_new ("taskpad_focus_change", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GnomeCalendarClass, taskpad_focus_change), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, - G_TYPE_BOOLEAN); - - gnome_calendar_signals[MEMOPAD_FOCUS_CHANGE] = - g_signal_new ("memopad_focus_change", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GnomeCalendarClass, memopad_focus_change), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, - G_TYPE_BOOLEAN); - - gnome_calendar_signals[SOURCE_ADDED] = + signals[SOURCE_ADDED] = g_signal_new ("source_added", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_FIRST, @@ -375,7 +567,7 @@ gnome_calendar_class_init (GnomeCalendarClass *class) 2, G_TYPE_INT, G_TYPE_OBJECT); - gnome_calendar_signals[SOURCE_REMOVED] = + signals[SOURCE_REMOVED] = g_signal_new ("source_removed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_FIRST, @@ -386,7 +578,7 @@ gnome_calendar_class_init (GnomeCalendarClass *class) 2, G_TYPE_INT, G_TYPE_OBJECT); - gnome_calendar_signals[GOTO_DATE] = + signals[GOTO_DATE] = g_signal_new ("goto_date", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, @@ -397,7 +589,7 @@ gnome_calendar_class_init (GnomeCalendarClass *class) 1, G_TYPE_INT); - gnome_calendar_signals[CHANGE_VIEW] = + signals[CHANGE_VIEW] = g_signal_new ("change_view", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, @@ -408,20 +600,6 @@ gnome_calendar_class_init (GnomeCalendarClass *class) 1, G_TYPE_INT); - object_class->destroy = gnome_calendar_destroy; - - class->dates_shown_changed = NULL; - class->calendar_selection_changed = NULL; - class->taskpad_selection_changed = NULL; - class->memopad_selection_changed = NULL; - class->calendar_focus_change = NULL; - class->taskpad_focus_change = NULL; - class->memopad_focus_change = NULL; - class->source_added = NULL; - class->source_removed = NULL; - class->goto_date = gnome_calendar_goto_date; - class->change_view = gnome_calendar_change_view; - /* * Key bindings */ @@ -527,26 +705,31 @@ gnome_calendar_class_init (GnomeCalendarClass *class) } -/* We do this check since the calendar items are downloaded from the server in the open_method, - since the default timezone might not be set there */ +/* We do this check since the calendar items are downloaded from the server + * in the open_method, since the default timezone might not be set there. */ static void -ensure_dates_are_in_default_zone (icalcomponent *icalcomp) +ensure_dates_are_in_default_zone (GnomeCalendar *gcal, + icalcomponent *icalcomp) { + ECalModel *model; + icaltimezone *timezone; icaltimetype dt; - icaltimezone *zone = calendar_config_get_icaltimezone (); - if (!zone) + model = gnome_calendar_get_model (gcal); + timezone = e_cal_model_get_timezone (model); + + if (timezone == NULL) return; dt = icalcomponent_get_dtstart (icalcomp); if (dt.is_utc) { - dt = icaltime_convert_to_zone (dt, zone); + dt = icaltime_convert_to_zone (dt, timezone); icalcomponent_set_dtstart (icalcomp, dt); } dt = icalcomponent_get_dtend (icalcomp); if (dt.is_utc) { - dt = icaltime_convert_to_zone (dt, zone); + dt = icaltime_convert_to_zone (dt, timezone); icalcomponent_set_dtend (icalcomp, dt); } } @@ -565,7 +748,7 @@ dn_e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer data) for (l = objects; l; l = l->next) { ECalComponent *comp = NULL; - ensure_dates_are_in_default_zone (l->data); + ensure_dates_are_in_default_zone (gcal, l->data); comp = e_cal_component_new (); if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (l->data))) { g_object_unref (comp); @@ -590,7 +773,7 @@ dn_e_cal_view_objects_modified_cb (ECalView *query, GList *objects, gpointer dat * and the tag_calendar_by_comp() below would not know how to * untag the old dates. */ - update_query (gcal); + gnome_calendar_update_query (gcal); } /* Callback used when the calendar query reports of a removed object */ @@ -602,7 +785,7 @@ dn_e_cal_view_objects_removed_cb (ECalView *query, GList *ids, gpointer data) gcal = GNOME_CALENDAR (data); /* Just retag the whole thing */ - update_query (gcal); + gnome_calendar_update_query (gcal); } /* Callback used when the calendar query is done */ @@ -614,39 +797,48 @@ dn_e_cal_view_done_cb (ECalView *query, ECalendarStatus status, gpointer data) g_warning (G_STRLOC ": Query did not successfully complete"); } -/* Returns the current view widget, an EDayView, EWeekView or ECalListView. */ -GtkWidget* -gnome_calendar_get_current_view_widget (GnomeCalendar *gcal) +ECalendarView * +gnome_calendar_get_calendar_view (GnomeCalendar *gcal, + GnomeCalendarViewType view_type) { - GnomeCalendarPrivate *priv; - - priv = gcal->priv; + g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); + g_return_val_if_fail (view_type < GNOME_CAL_LAST_VIEW, NULL); - return GTK_WIDGET (priv->views[priv->current_view_type]); + return gcal->priv->views[view_type]; } static void get_times_for_views (GnomeCalendar *gcal, GnomeCalendarViewType view_type, time_t *start_time, time_t *end_time, time_t *select_time) { GnomeCalendarPrivate *priv; + ECalModel *model; gint shown, display_start; GDate date; + gint week_start_day; gint weekday, first_day, last_day, days_shown, i; gboolean has_working_days = FALSE; guint offset; struct icaltimetype tt = icaltime_null_time (); + icaltimezone *timezone; + gboolean range_selected; + + model = gnome_calendar_get_model (gcal); + range_selected = gnome_calendar_get_range_selected (gcal); + + timezone = e_cal_model_get_timezone (model); + week_start_day = e_cal_model_get_week_start_day (model); priv = gcal->priv; switch (view_type) { case GNOME_CAL_DAY_VIEW: shown = e_day_view_get_days_shown (E_DAY_VIEW (priv->views[view_type])); - *start_time = time_day_begin_with_zone (*start_time, priv->zone); - *end_time = time_add_day_with_zone (*start_time, shown, priv->zone); + *start_time = time_day_begin_with_zone (*start_time, timezone); + *end_time = time_add_day_with_zone (*start_time, shown, timezone); break; case GNOME_CAL_WORK_WEEK_VIEW: /* FIXME Kind of gross, but it works */ - time_to_gdate_with_zone (&date, *start_time, priv->zone); + time_to_gdate_with_zone (&date, *start_time, timezone); /* The start of the work-week is the first working day after the week start day. */ @@ -655,7 +847,7 @@ get_times_for_views (GnomeCalendar *gcal, GnomeCalendarViewType view_type, time_ weekday = g_date_get_weekday (&date) % 7; /* Find the first working day in the week, 0 (Sun) to 6 (Sat). */ - first_day = (E_DAY_VIEW (priv->views[view_type])->week_start_day + 1) % 7; + first_day = (week_start_day + 1) % 7; for (i = 0; i < 7; i++) { if (E_DAY_VIEW (priv->views[view_type])->working_days & (1 << first_day)) { has_working_days = TRUE; @@ -666,7 +858,7 @@ get_times_for_views (GnomeCalendar *gcal, GnomeCalendarViewType view_type, time_ if (has_working_days) { /* Now find the last working day of the week, backwards. */ - last_day = E_DAY_VIEW (priv->views[view_type])->week_start_day % 7; + last_day = week_start_day % 7; for (i = 0; i < 7; i++) { if (E_DAY_VIEW (priv->views[view_type])->working_days & (1 << last_day)) break; @@ -693,8 +885,8 @@ get_times_for_views (GnomeCalendar *gcal, GnomeCalendarViewType view_type, time_ tt.month = g_date_get_month (&date); tt.day = g_date_get_day (&date); - *start_time = icaltime_as_timet_with_zone (tt, priv->zone); - *end_time = time_add_day_with_zone (*start_time, days_shown, priv->zone); + *start_time = icaltime_as_timet_with_zone (tt, timezone); + *end_time = time_add_day_with_zone (*start_time, days_shown, timezone); if (select_time && E_DAY_VIEW (priv->views[view_type])->selection_start_day == -1) time (select_time); @@ -703,8 +895,8 @@ get_times_for_views (GnomeCalendar *gcal, GnomeCalendarViewType view_type, time_ /* FIXME We should be using the same day of the week enum every where */ display_start = (E_WEEK_VIEW (priv->views[view_type])->display_start_day + 1) % 7; - *start_time = time_week_begin_with_zone (*start_time, display_start, priv->zone); - *end_time = time_add_week_with_zone (*start_time, 1, priv->zone); + *start_time = time_week_begin_with_zone (*start_time, display_start, timezone); + *end_time = time_add_week_with_zone (*start_time, 1, timezone); if (select_time && E_WEEK_VIEW (priv->views[view_type])->selection_start_day == -1) time (select_time); @@ -714,108 +906,45 @@ get_times_for_views (GnomeCalendar *gcal, GnomeCalendarViewType view_type, time_ /* FIXME We should be using the same day of the week enum every where */ display_start = (E_WEEK_VIEW (priv->views[view_type])->display_start_day + 1) % 7; - if (!priv->range_selected && (!E_WEEK_VIEW (priv->views[view_type])->multi_week_view || !E_WEEK_VIEW (priv->views[view_type])->month_scroll_by_week)) - *start_time = time_month_begin_with_zone (*start_time, priv->zone); - *start_time = time_week_begin_with_zone (*start_time, display_start, priv->zone); - *end_time = time_add_week_with_zone (*start_time, shown, priv->zone); + if (!range_selected && (!E_WEEK_VIEW (priv->views[view_type])->multi_week_view || !E_WEEK_VIEW (priv->views[view_type])->month_scroll_by_week)) + *start_time = time_month_begin_with_zone (*start_time, timezone); + *start_time = time_week_begin_with_zone (*start_time, display_start, timezone); + *end_time = time_add_week_with_zone (*start_time, shown, timezone); if (select_time && E_WEEK_VIEW (priv->views[view_type])->selection_start_day == -1) time (select_time); break; case GNOME_CAL_LIST_VIEW: /* FIXME What to do here? */ - *start_time = time_month_begin_with_zone (*start_time, priv->zone); - *end_time = time_add_month_with_zone (*start_time, 1, priv->zone); + *start_time = time_month_begin_with_zone (*start_time, timezone); + *end_time = time_add_month_with_zone (*start_time, 1, timezone); break; default: g_return_if_reached (); } } -/* Gets the focus location based on who is the focused widget within the - * calendar view. - */ -static FocusLocation -get_focus_location (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - ETable *etable, *m_etable; - - priv = gcal->priv; - - etable = e_calendar_table_get_table (E_CALENDAR_TABLE (priv->todo)); - m_etable = e_memo_table_get_table (E_MEMO_TABLE (priv->memo)); - - if (GTK_WIDGET_HAS_FOCUS (etable->table_canvas)) - return FOCUS_TASKPAD; - else if (GTK_WIDGET_HAS_FOCUS (m_etable->table_canvas)) - return FOCUS_MEMOPAD; - else { - GtkWidget *widget; - EDayView *dv; - EWeekView *wv; - ECalListView *lv; - - widget = gnome_calendar_get_current_view_widget (gcal); - - switch (priv->current_view_type) { - case GNOME_CAL_DAY_VIEW: - case GNOME_CAL_WORK_WEEK_VIEW: - dv = E_DAY_VIEW (widget); - - if (GTK_WIDGET_HAS_FOCUS (dv->top_canvas) - || GNOME_CANVAS (dv->top_canvas)->focused_item != NULL - || GTK_WIDGET_HAS_FOCUS (dv->main_canvas) - || GNOME_CANVAS (dv->main_canvas)->focused_item != NULL - || GTK_WIDGET_HAS_FOCUS (dv)) - return FOCUS_CALENDAR; - else - return FOCUS_OTHER; - - case GNOME_CAL_WEEK_VIEW: - case GNOME_CAL_MONTH_VIEW: - wv = E_WEEK_VIEW (widget); - - if (GTK_WIDGET_HAS_FOCUS (wv->main_canvas) - || GNOME_CANVAS (wv->main_canvas)->focused_item != NULL - || GTK_WIDGET_HAS_FOCUS (wv)) - return FOCUS_CALENDAR; - else - return FOCUS_OTHER; - - case GNOME_CAL_LIST_VIEW: - lv = E_CAL_LIST_VIEW (widget); - - if (GTK_WIDGET_HAS_FOCUS (e_table_scrolled_get_table (lv->table_scrolled)) - || GTK_WIDGET_HAS_FOCUS (lv)) - return FOCUS_CALENDAR; - else - return FOCUS_OTHER; - - default: - g_return_val_if_reached (FOCUS_OTHER); - } - } -} - /* Computes the range of time that the date navigator is showing */ static void get_date_navigator_range (GnomeCalendar *gcal, time_t *start_time, time_t *end_time) { - GnomeCalendarPrivate *priv; + ECalModel *model; gint start_year, start_month, start_day; gint end_year, end_month, end_day; struct icaltimetype start_tt; struct icaltimetype end_tt; + icaltimezone *timezone; - priv = gcal->priv; + model = gnome_calendar_get_model (gcal); + timezone = e_cal_model_get_timezone (model); start_tt = icaltime_null_time (); end_tt = icaltime_null_time (); - if (!e_calendar_item_get_date_range (priv->date_navigator->calitem, - &start_year, &start_month, &start_day, - &end_year, &end_month, &end_day)) { + if (!e_calendar_item_get_date_range ( + gcal->priv->date_navigator->calitem, + &start_year, &start_month, &start_day, + &end_year, &end_month, &end_day)) { *start_time = -1; *end_time = -1; return; @@ -831,8 +960,8 @@ get_date_navigator_range (GnomeCalendar *gcal, time_t *start_time, time_t *end_t icaltime_adjust (&end_tt, 1, 0, 0, 0); - *start_time = icaltime_as_timet_with_zone (start_tt, priv->zone); - *end_time = icaltime_as_timet_with_zone (end_tt, priv->zone); + *start_time = icaltime_as_timet_with_zone (start_tt, timezone); + *end_time = icaltime_as_timet_with_zone (end_tt, timezone); } /* Adjusts a given query sexp with the time range of the date navigator */ @@ -901,7 +1030,7 @@ update_query_async (struct _date_query_msg *msg) } /* create queries for each loaded client */ - for (l = priv->clients_list[E_CAL_SOURCE_TYPE_EVENT]; l != NULL; l = l->next) { + for (l = priv->clients_list; l != NULL; l = l->next) { GError *error = NULL; gint tries = 0; @@ -951,11 +1080,13 @@ try_again: } /* Restarts a query for the date navigator in the calendar */ -static void -update_query (GnomeCalendar *gcal) +void +gnome_calendar_update_query (GnomeCalendar *gcal) { struct _date_query_msg *msg; + g_return_if_fail (GNOME_IS_CALENDAR (gcal)); + e_calendar_item_clear_marks (gcal->priv->date_navigator->calitem); msg = g_slice_new0 (struct _date_query_msg); @@ -965,353 +1096,79 @@ update_query (GnomeCalendar *gcal) message_push ((Message *) msg); } -static void -set_search_query (GnomeCalendar *gcal, const gchar *sexp) +void +gnome_calendar_set_search_query (GnomeCalendar *gcal, + const gchar *sexp, + gboolean range_search, + time_t start_range, + time_t end_range) { GnomeCalendarPrivate *priv; + ECalModel *model; gint i; time_t start, end; - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); g_return_if_fail (sexp != NULL); priv = gcal->priv; - /* Set the query on the date navigator */ + model = gnome_calendar_get_model (gcal); - if (priv->sexp) - g_free (priv->sexp); + /* Set the query on the date navigator */ + g_free (priv->sexp); priv->sexp = g_strdup (sexp); + priv->lview_select_daten_range = range_search; + start = start_range; + end = end_range; + d(g_print ("Changing the queries %s \n", sexp)); - update_query (gcal); + gnome_calendar_update_query (gcal); i = priv->current_view_type; /* Set the query on the views */ if (i == GNOME_CAL_LIST_VIEW) { if (!priv->lview_select_daten_range) { - cal_search_bar_get_time_range ((CalSearchBar *)priv->search_bar, &start, &end); - e_cal_model_set_search_query_with_time_range (e_calendar_view_get_model (priv->views [i]), sexp, start, end); + e_cal_model_set_search_query_with_time_range ( + model, sexp, start, end); } else { start = priv->base_view_time; get_times_for_views (gcal, GNOME_CAL_LIST_VIEW, &start, &end, NULL); - e_cal_model_set_search_query_with_time_range (e_calendar_view_get_model (priv->views [i]), sexp, start, end); + e_cal_model_set_search_query_with_time_range ( + model, sexp, start, end); if (priv->current_view_type == GNOME_CAL_LIST_VIEW) gnome_calendar_update_date_navigator (gcal); } } else - e_cal_model_set_search_query (e_calendar_view_get_model (priv->views[i]), sexp); + e_cal_model_set_search_query (model, sexp); /* Set the query on the task pad */ update_todo_view (gcal); } -/* Returns the current time, for the ECalendarItem. */ -static struct tm -get_current_time (ECalendarItem *calitem, gpointer data) -{ - GnomeCalendar *cal = data; - struct tm tmp_tm = { 0 }; - struct icaltimetype tt; - - g_return_val_if_fail (cal != NULL, tmp_tm); - g_return_val_if_fail (GNOME_IS_CALENDAR (cal), tmp_tm); - - tt = icaltime_from_timet_with_zone (time (NULL), FALSE, - cal->priv->zone); - - /* Now copy it to the struct tm and return it. */ - tmp_tm = icaltimetype_to_tm (&tt); - - return tmp_tm; -} - -/* Callback used when the sexp changes in the calendar search bar */ -static void -search_bar_sexp_changed_cb (CalSearchBar *cal_search, const gchar *sexp, gpointer data) -{ - GnomeCalendar *gcal; - const gchar *d_sexp = "occur-in-time-range?"; - - gcal = GNOME_CALENDAR (data); - - /* Choose List view if the search made in the search bar is based on date */ - if (sexp != NULL && strstr (sexp, d_sexp ) != NULL) { - gcal->priv->lview_select_daten_range = FALSE; - gtk_widget_hide (GTK_WIDGET (gcal->priv->date_navigator)); - gnome_calendar_set_view (gcal, GNOME_CAL_LIST_VIEW); - } else { - gcal->priv->lview_select_daten_range = TRUE; - gtk_widget_show (GTK_WIDGET (gcal->priv->date_navigator)); - } - - set_search_query (gcal, sexp); -} - -/* Callback used when the selected category in the search bar changes */ static void -search_bar_category_changed_cb (CalSearchBar *cal_search, const gchar *category, gpointer data) +set_timezone (GnomeCalendar *gcal) { - GnomeCalendar *gcal; - GnomeCalendarPrivate *priv; ECalModel *model; - gint i; - - gcal = GNOME_CALENDAR (data); - priv = gcal->priv; - - for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) { - e_calendar_view_set_default_category (E_CALENDAR_VIEW (priv->views[i]), - category); - } - - model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)); - e_cal_model_set_default_category (model, category); -} - -static void -view_selection_changed_cb (GtkWidget *view, GnomeCalendar *gcal) -{ - g_signal_emit (gcal, gnome_calendar_signals[CALENDAR_SELECTION_CHANGED], 0); -} - -/** - * gnome_calendar_emit_user_created_signal - * Emits "user_created" signal on a gcal and use calendar as a store where was event created. - * - * @param instance Instance on which emit signal. - * @param gcal GnomeCalendar, it will store info about used calendar here. - * @param calendar Used calendar, where was event created. - **/ -void -gnome_calendar_emit_user_created_signal (gpointer instance, GnomeCalendar *gcal, ECal *calendar) -{ - GnomeCalendarPrivate *priv; - - g_return_if_fail (gcal != NULL); - - priv = gcal->priv; - priv->user_created_cal = calendar; - g_signal_emit_by_name (instance, "user_created"); - priv->user_created_cal = NULL; -} - -static void -user_created_cb (GtkWidget *view, GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - ECal *ecal; - - priv = gcal->priv; - ecal = priv->user_created_cal; - - if (!ecal) { - ECalModel *model; - - model = e_calendar_view_get_model (priv->views[priv->current_view_type]); - ecal = e_cal_model_get_default_client (model); - } - - gnome_calendar_add_source (gcal, E_CAL_SOURCE_TYPE_EVENT, e_cal_get_source (ecal)); -} - -/* Callback used when the taskpad receives a focus event. We emit the - * corresponding signal so that parents can change the menus as appropriate. - */ -static gint -table_canvas_focus_change_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data) -{ - GnomeCalendar *gcal; - - gcal = GNOME_CALENDAR (data); - - g_signal_emit (gcal, gnome_calendar_signals [TASKPAD_FOCUS_CHANGE], 0, - event->in ? TRUE : FALSE); - - return FALSE; -} - -static gint -memo_canvas_focus_change_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data) -{ - GnomeCalendar *gcal; - - gcal = GNOME_CALENDAR (data); - - g_signal_emit (gcal, gnome_calendar_signals [MEMOPAD_FOCUS_CHANGE], 0, - event->in ? TRUE : FALSE); - - return FALSE; -} - -static gint -calendar_focus_change_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data) -{ - GnomeCalendar *gcal; - - gcal = GNOME_CALENDAR (data); - - g_signal_emit (gcal, gnome_calendar_signals [CALENDAR_FOCUS_CHANGE], 0, - event->in ? TRUE : FALSE); - - return FALSE; -} - -/* Connects to the focus change signals of a day view widget */ -static void -connect_day_view_focus (GnomeCalendar *gcal, EDayView *dv) -{ - g_signal_connect_after (dv->top_canvas, "focus_in_event", - G_CALLBACK (calendar_focus_change_cb), gcal); - g_signal_connect_after (dv->top_canvas, "focus_out_event", - G_CALLBACK (calendar_focus_change_cb), gcal); - - g_signal_connect_after (dv->main_canvas, "focus_in_event", - G_CALLBACK (calendar_focus_change_cb), gcal); - g_signal_connect_after (dv->main_canvas, "focus_out_event", - G_CALLBACK (calendar_focus_change_cb), gcal); -} - -/* Connects to the focus change signals of a week view widget */ -static void -connect_week_view_focus (GnomeCalendar *gcal, EWeekView *wv) -{ - if (!E_IS_WEEK_VIEW (wv)) - return; - - g_signal_connect (wv->main_canvas, "focus_in_event", - G_CALLBACK (calendar_focus_change_cb), gcal); - g_signal_connect (wv->main_canvas, "focus_out_event", - G_CALLBACK (calendar_focus_change_cb), gcal); -} - -static void -connect_list_view_focus (GnomeCalendar *gcal, ECalListView *lv) -{ - ETable *etable; - - etable = e_table_scrolled_get_table (lv->table_scrolled); - - g_signal_connect (etable->table_canvas, "focus_in_event", - G_CALLBACK (calendar_focus_change_cb), gcal); - g_signal_connect (etable->table_canvas, "focus_out_event", - G_CALLBACK (calendar_focus_change_cb), gcal); -} - -/* Callback used when the selection in the taskpad table changes. We just proxy - * the signal with our own one. - */ -static void -table_selection_change_cb (ETable *etable, gpointer data) -{ - GnomeCalendar *gcal; - - gcal = GNOME_CALENDAR (data); - - g_signal_emit (gcal, gnome_calendar_signals[TASKPAD_SELECTION_CHANGED], 0); -} - -static void -memo_selection_change_cb (ETable *etable, gpointer data) -{ - GnomeCalendar *gcal; - - gcal = GNOME_CALENDAR (data); - - g_signal_emit (gcal, gnome_calendar_signals[MEMOPAD_SELECTION_CHANGED], 0); -} - -static void -set_week_start (GnomeCalendar *calendar) -{ - GnomeCalendarPrivate *priv; - - priv = calendar->priv; - - priv->week_start = calendar_config_get_week_start_day (); - - /* Only do this if views exist */ - if (priv->day_view && priv->work_week_view && priv->week_view && priv->month_view && priv->list_view) { - update_view_times (calendar, priv->base_view_time); - gnome_calendar_update_date_navigator (calendar); - gnome_calendar_notify_dates_shown_changed (calendar); - } -} - -static void -week_start_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - GnomeCalendar *calendar = data; - - set_week_start (calendar); -} - -static void -set_working_days (GnomeCalendar *calendar) -{ - GnomeCalendarPrivate *priv; - - priv = calendar->priv; - - /* Only do this if views exist */ - if (priv->day_view && priv->work_week_view && priv->week_view && priv->month_view && priv->list_view) { - update_view_times (calendar, priv->base_view_time); - gnome_calendar_update_date_navigator (calendar); - gnome_calendar_notify_dates_shown_changed (calendar); - } -} - -static void -working_days_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - GnomeCalendar *calendar = data; - - set_working_days (calendar); -} - -static void -set_timezone (GnomeCalendar *calendar) -{ - GnomeCalendarPrivate *priv; - gint i; - - priv = calendar->priv; - - priv->zone = calendar_config_get_icaltimezone (); - - for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) { - GList *l; + icaltimezone *timezone; + GList *l; - for (l = priv->clients_list[i]; l != NULL; l = l->next) { - ECal *client = l->data; + model = gnome_calendar_get_model (gcal); + timezone = e_cal_model_get_timezone (model); - if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) - /* FIXME Error checking */ - e_cal_set_default_timezone (client, priv->zone, NULL); - } + for (l = gcal->priv->clients_list; l != NULL; l = l->next) { + ECal *client = l->data; - if (priv->default_client[i] - && e_cal_get_load_state (priv->default_client[i]) == E_CAL_LOAD_LOADED) + if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) /* FIXME Error checking */ - e_cal_set_default_timezone (priv->default_client[i], priv->zone, NULL); + e_cal_set_default_timezone (client, timezone, NULL); } - - if (priv->views [priv->current_view_type]) - e_calendar_view_set_timezone (priv->views [priv->current_view_type], priv->zone); -} - -static void -timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - GnomeCalendar *calendar = data; - - set_timezone (calendar); } struct _mupdate_todo_msg { @@ -1319,6 +1176,7 @@ struct _mupdate_todo_msg { GnomeCalendar *gcal; }; +#if 0 /* KILL-BONOBO */ static void update_todo_view_async (struct _mupdate_todo_msg *msg) { @@ -1357,10 +1215,12 @@ update_todo_view_async (struct _mupdate_todo_msg *msg) g_object_unref (msg->gcal); g_slice_free (struct _mupdate_todo_msg, msg); } +#endif static void update_todo_view (GnomeCalendar *gcal) { +#if 0 /* KILL-BONOBO */ struct _mupdate_todo_msg *msg; msg = g_slice_new0 (struct _mupdate_todo_msg); @@ -1368,11 +1228,13 @@ update_todo_view (GnomeCalendar *gcal) msg->gcal = g_object_ref (gcal); message_push ((Message *) msg); +#endif } static void update_memo_view (GnomeCalendar *gcal) { +#if 0 /* KILL-BONOBO */ GnomeCalendarPrivate *priv; ECalModel *model, *view_model; time_t start, end; @@ -1382,7 +1244,7 @@ update_memo_view (GnomeCalendar *gcal) /* Set the query on the memo pad*/ model = e_memo_table_get_model (E_MEMO_TABLE (priv->memo)); - view_model = e_calendar_view_get_model(priv->views[priv->current_view_type]); + view_model = gnome_calendar_get_model (gcal); e_cal_model_get_time_range (view_model, &start, &end); if (start != -1 && end != -1) { @@ -1404,21 +1266,24 @@ update_memo_view (GnomeCalendar *gcal) g_free (iso_start); g_free (iso_end); } +#endif } static void process_completed_tasks (GnomeCalendar *gcal, gboolean config_changed) { +#if 0 /* KILL-BONOBO */ GnomeCalendarPrivate *priv; - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR(gcal)); priv = gcal->priv; e_calendar_table_process_completed_tasks (E_CALENDAR_TABLE (priv->todo), priv->clients_list[E_CAL_SOURCE_TYPE_TODO], config_changed); +#endif } +#if 0 /* KILL-BONOBO */ static gboolean update_todo_view_cb (GnomeCalendar *gcal) { @@ -1431,26 +1296,29 @@ update_todo_view_cb (GnomeCalendar *gcal) return TRUE; } +#endif static gboolean update_marcus_bains_line_cb (GnomeCalendar *gcal) { GnomeCalendarPrivate *priv; + GnomeCalendarViewType view_type; + ECalendarView *view; time_t now, day_begin; priv = gcal->priv; - if ((priv->current_view_type == GNOME_CAL_DAY_VIEW) || - (priv->current_view_type == GNOME_CAL_WORK_WEEK_VIEW)) { - e_day_view_update_marcus_bains (E_DAY_VIEW (gnome_calendar_get_current_view_widget (gcal))); - } + view_type = gnome_calendar_get_view (gcal); + view = gnome_calendar_get_calendar_view (gcal, view_type); + + if (E_IS_DAY_VIEW (view)) + e_day_view_marcus_bains_update (E_DAY_VIEW (view)); time (&now); day_begin = time_day_begin (now); /* check in the first two minutes */ if (now >= day_begin && now <= day_begin + 120) { - ECalendarView *view = priv->views[priv->current_view_type]; time_t start_time = 0, end_time = 0; g_return_val_if_fail (view != NULL, TRUE); @@ -1466,175 +1334,6 @@ update_marcus_bains_line_cb (GnomeCalendar *gcal) } static void -config_hide_completed_tasks_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - process_completed_tasks (data, TRUE); -} - -static void -setup_config (GnomeCalendar *calendar) -{ - GnomeCalendarPrivate *priv; - guint not; - - priv = calendar->priv; - - /* Week Start */ - set_week_start (calendar); - not = calendar_config_add_notification_week_start_day (week_start_changed_cb, calendar); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - /* Working Days */ - set_working_days (calendar); - not = calendar_config_add_notification_working_days (working_days_changed_cb, calendar); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - /* Timezone */ - set_timezone (calendar); - not = calendar_config_add_notification_timezone (timezone_changed_cb, calendar); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - /* Hide completed tasks */ - not = calendar_config_add_notification_hide_completed_tasks (config_hide_completed_tasks_changed_cb, - calendar); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - not = calendar_config_add_notification_hide_completed_tasks_units (config_hide_completed_tasks_changed_cb, - calendar); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - not = calendar_config_add_notification_hide_completed_tasks_value (config_hide_completed_tasks_changed_cb, - calendar); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - /* Pane positions */ - priv->hpane_pos = calendar_config_get_hpane_pos (); - priv->vpane_pos = calendar_config_get_vpane_pos (); - priv->hpane_pos_month_view = calendar_config_get_month_hpane_pos (); - priv->vpane_pos_month_view = calendar_config_get_month_vpane_pos (); -} - -static void -update_adjustment (GnomeCalendar *gcal, GtkAdjustment *adjustment, EWeekView *week_view) -{ - GDate date; - gint week_offset; - struct icaltimetype start_tt = icaltime_null_time (); - time_t lower; - guint32 old_first_day_julian, new_first_day_julian; - - /* If we don't have a valid date set yet, just return. */ - if (!g_date_valid (&week_view->first_day_shown)) - return; - - /* Determine the first date shown. */ - date = week_view->base_date; - week_offset = floor (adjustment->value + 0.5); - g_date_add_days (&date, week_offset * 7); - - /* Convert the old & new first days shown to julian values. */ - old_first_day_julian = g_date_get_julian (&week_view->first_day_shown); - new_first_day_julian = g_date_get_julian (&date); - - /* If we are already showing the date, just return. */ - if (old_first_day_julian == new_first_day_julian) - return; - - /* Convert it to a time_t. */ - start_tt.year = g_date_get_year (&date); - start_tt.month = g_date_get_month (&date); - start_tt.day = g_date_get_day (&date); - - lower = icaltime_as_timet_with_zone (start_tt, gcal->priv->zone); - - e_week_view_set_update_base_date (week_view, FALSE); - update_view_times (gcal, lower); - gnome_calendar_update_date_navigator (gcal); - gnome_calendar_notify_dates_shown_changed (gcal); - e_week_view_set_update_base_date (week_view, TRUE); -} - -static void -week_view_adjustment_changed_cb (GtkAdjustment *adjustment, GnomeCalendar *gcal) -{ - update_adjustment (gcal, adjustment, E_WEEK_VIEW (gcal->priv->week_view)); -} - -static void -month_view_adjustment_changed_cb (GtkAdjustment *adjustment, GnomeCalendar *gcal) -{ - update_adjustment (gcal, adjustment, E_WEEK_VIEW (gcal->priv->month_view)); -} - -static void -categories_changed_cb (gpointer object, gpointer user_data) -{ - GList *cat_list; - GPtrArray *cat_array; - GnomeCalendarPrivate *priv; - GnomeCalendar *gcal = user_data; - - priv = gcal->priv; - - cat_array = g_ptr_array_new (); - cat_list = e_categories_get_list (); - while (cat_list != NULL) { - if (e_categories_is_searchable ((const gchar *) cat_list->data)) - g_ptr_array_add (cat_array, cat_list->data); - cat_list = g_list_remove (cat_list, cat_list->data); - } - - cal_search_bar_set_categories ((CalSearchBar *)priv->search_bar, cat_array); - - g_ptr_array_free (cat_array, TRUE); -} - -static void -view_progress_cb (ECalModel *model, const gchar *message, gint percent, ECalSourceType type, GnomeCalendar *gcal) -{ - if (type == E_CAL_SOURCE_TYPE_EVENT) { - e_calendar_view_set_status_message (E_CALENDAR_VIEW (gcal->priv->week_view), message, percent); - } else if (type == E_CAL_SOURCE_TYPE_TODO) { - e_calendar_table_set_status_message (E_CALENDAR_TABLE (gcal->priv->todo), message, percent); - } else if (type == E_CAL_SOURCE_TYPE_JOURNAL) { - e_memo_table_set_status_message (E_MEMO_TABLE (gcal->priv->memo), message); - } -} - -static void -view_done_cb (ECalModel *model, ECalendarStatus status, ECalSourceType type, GnomeCalendar *gcal) -{ - if (type == E_CAL_SOURCE_TYPE_EVENT) { - e_calendar_view_set_status_message (E_CALENDAR_VIEW (gcal->priv->week_view), NULL, -1); - } else if (type == E_CAL_SOURCE_TYPE_TODO) { - e_calendar_table_set_status_message (E_CALENDAR_TABLE (gcal->priv->todo), NULL, -1); - } else if (type == E_CAL_SOURCE_TYPE_JOURNAL) { - e_memo_table_set_status_message (E_MEMO_TABLE (gcal->priv->memo), NULL); - } - -} - -GtkWidget * -gnome_calendar_get_tag (GnomeCalendar *gcal) -{ - return GTK_WIDGET (gcal->priv->date_navigator); -} - -static time_t -gc_get_default_time (ECalModel *model, gpointer user_data) -{ - GnomeCalendar *gcal = user_data; - time_t res = 0, end; - - g_return_val_if_fail (model != NULL, 0); - g_return_val_if_fail (GNOME_IS_CALENDAR (user_data), 0); - - gnome_calendar_get_current_time_range (gcal, &res, &end); - - return res; -} - -static void setup_widgets (GnomeCalendar *gcal) { GnomeCalendarPrivate *priv; @@ -1642,7 +1341,6 @@ setup_widgets (GnomeCalendar *gcal) gchar *filename; ETable *etable; GtkAdjustment *adjustment; - ECalModel *w_model; GtkWidget *vbox; GtkWidget *label; ECalModel *cal_model; @@ -1651,234 +1349,17 @@ setup_widgets (GnomeCalendar *gcal) priv = gcal->priv; - priv->search_bar = cal_search_bar_new (CAL_SEARCH_CALENDAR_DEFAULT); - g_signal_connect (priv->search_bar, "sexp_changed", - G_CALLBACK (search_bar_sexp_changed_cb), gcal); - g_signal_connect (priv->search_bar, "category_changed", - G_CALLBACK (search_bar_category_changed_cb), gcal); - categories_changed_cb (NULL, gcal); - - gtk_widget_show (priv->search_bar); - gtk_box_pack_start (GTK_BOX (gcal), priv->search_bar, FALSE, FALSE, 6); - - /* The main HPaned, with the notebook of calendar views on the left - and the ECalendar and ToDo list on the right. */ - priv->hpane = gtk_hpaned_new (); - g_signal_connect_after(priv->hpane, "realize", - G_CALLBACK(gnome_calendar_hpane_realized), gcal); - g_signal_connect (priv->hpane, "button_release_event", - G_CALLBACK (gnome_calendar_hpane_resized), gcal); - gtk_widget_show (priv->hpane); - gtk_box_pack_start (GTK_BOX (gcal), priv->hpane, TRUE, TRUE, 6); - - /* The Notebook containing the 4 calendar views. */ - priv->notebook = gtk_notebook_new (); - gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE); - gtk_widget_show (priv->notebook); - gtk_paned_pack1 (GTK_PANED (priv->hpane), priv->notebook, FALSE, TRUE); - - /* The ECalendar. */ - w = e_calendar_new (); - priv->date_navigator = E_CALENDAR (w); - priv->date_navigator_config = e_mini_calendar_config_new (priv->date_navigator); - e_calendar_item_set_days_start_week_sel (priv->date_navigator->calitem, 9); - e_calendar_item_set_max_days_sel (priv->date_navigator->calitem, 42); - gtk_widget_show (w); - e_calendar_item_set_get_time_callback (priv->date_navigator->calitem, - (ECalendarItemGetTimeCallback) get_current_time, - gcal, NULL); - - g_signal_connect (priv->date_navigator->calitem, "selection_changed", - G_CALLBACK (gnome_calendar_on_date_navigator_selection_changed), gcal); - g_signal_connect (priv->date_navigator->calitem, "date_range_changed", - G_CALLBACK (gnome_calendar_on_date_navigator_date_range_changed), gcal); - g_signal_connect (w, "scroll-event", - G_CALLBACK (gnome_calendar_date_navigator_scrolled), gcal); - - /* The VPaned widget, to contain the ToDo list & Memo list */ - priv->vpane = gtk_vpaned_new (); - g_signal_connect_after (priv->vpane, "realize", - G_CALLBACK(gnome_calendar_vpane_realized), gcal); - g_signal_connect (priv->vpane, "button_release_event", - G_CALLBACK (gnome_calendar_vpane_resized), gcal); - gtk_widget_show (priv->vpane); - gtk_paned_pack2 (GTK_PANED (priv->hpane), priv->vpane, TRUE, TRUE); - - /* The ToDo list. */ - vbox = gtk_vbox_new (FALSE, 0); - sep = gtk_hseparator_new (); - gtk_box_pack_start ((GtkBox *)vbox, sep, FALSE, TRUE, 0); - - label = gtk_label_new (NULL); - tmp = g_strdup_printf ("<b> %s </b>", _("Tasks")); - gtk_label_set_markup ((GtkLabel *)label, tmp); - g_free (tmp); - gtk_box_pack_start ((GtkBox *)vbox, label, FALSE, TRUE, 0); - - priv->todo = e_calendar_table_new (); - priv->todo_config = e_calendar_table_config_new (E_CALENDAR_TABLE (priv->todo)); - gtk_paned_pack1 (GTK_PANED (priv->vpane), vbox, FALSE, FALSE); - gtk_box_pack_end ((GtkBox *)vbox, priv->todo, TRUE, TRUE, 0); - - gtk_widget_show (priv->todo); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (sep); - - filename = g_build_filename (calendar_component_peek_config_directory (calendar_component_peek ()), - "TaskPad", NULL); - e_calendar_table_load_state (E_CALENDAR_TABLE (priv->todo), filename); - /* update_todo_view (gcal); */ - g_free (filename); - - etable = e_calendar_table_get_table (E_CALENDAR_TABLE (priv->todo)); - g_signal_connect (etable->table_canvas, "focus_in_event", - G_CALLBACK (table_canvas_focus_change_cb), gcal); - g_signal_connect (etable->table_canvas, "focus_out_event", - G_CALLBACK (table_canvas_focus_change_cb), gcal); - - g_signal_connect (etable, "selection_change", - G_CALLBACK (table_selection_change_cb), gcal); - - g_signal_connect (e_calendar_table_get_model ((ECalendarTable *)priv->todo), "cal_view_progress", - G_CALLBACK (view_progress_cb), gcal); - g_signal_connect (e_calendar_table_get_model ((ECalendarTable *)priv->todo), "cal_view_done", - G_CALLBACK (view_done_cb), gcal); /* Timeout check to hide completed items */ +#if 0 /* KILL-BONOBO */ priv->update_timeout = g_timeout_add_full (G_PRIORITY_LOW, 60000, (GSourceFunc) update_todo_view_cb, gcal, NULL); - - /* Create the model for the views */ - cal_model = (ECalModel *) e_cal_model_calendar_new (); - e_cal_model_set_flags (cal_model, E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES); - - /* The Day View. */ - priv->day_view = e_day_view_new (cal_model); - e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->day_view), gcal); - e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->day_view), priv->zone); - g_signal_connect (priv->day_view, "selection_changed", - G_CALLBACK (view_selection_changed_cb), gcal); - connect_day_view_focus (gcal, E_DAY_VIEW (priv->day_view)); - - /* The Work Week View. */ - priv->work_week_view = e_day_view_new (cal_model); - e_day_view_set_work_week_view (E_DAY_VIEW (priv->work_week_view), - TRUE); - e_day_view_set_days_shown (E_DAY_VIEW (priv->work_week_view), 5); - e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->work_week_view), gcal); - e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->work_week_view), priv->zone); - connect_day_view_focus (gcal, E_DAY_VIEW (priv->work_week_view)); +#endif /* The Marcus Bains line */ priv->update_marcus_bains_line_timeout = g_timeout_add_full (G_PRIORITY_LOW, 60000, (GSourceFunc) update_marcus_bains_line_cb, gcal, NULL); - /* The Week View. */ - priv->week_view = e_week_view_new (cal_model); - e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->week_view), gcal); - e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->week_view), priv->zone); - g_signal_connect (priv->week_view, "selection_changed", - G_CALLBACK (view_selection_changed_cb), gcal); - - connect_week_view_focus (gcal, E_WEEK_VIEW (priv->week_view)); - - adjustment = gtk_range_get_adjustment (GTK_RANGE (E_WEEK_VIEW (priv->week_view)->vscrollbar)); - g_signal_connect (adjustment, "value_changed", - G_CALLBACK (week_view_adjustment_changed_cb), - gcal); - w_model = e_calendar_view_get_model ((ECalendarView *)priv->week_view); - g_signal_connect (w_model, "cal_view_progress", - G_CALLBACK (view_progress_cb), gcal); - g_signal_connect (w_model, "cal_view_done", - G_CALLBACK (view_done_cb), gcal); - - /* The Month View. */ - priv->month_view = e_week_view_new (cal_model); - e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->month_view), gcal); - e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->month_view), priv->zone); - e_week_view_set_multi_week_view (E_WEEK_VIEW (priv->month_view), TRUE); - e_week_view_set_weeks_shown (E_WEEK_VIEW (priv->month_view), 6); - g_signal_connect (priv->month_view, "selection_changed", - G_CALLBACK (view_selection_changed_cb), gcal); - - connect_week_view_focus (gcal, E_WEEK_VIEW (priv->month_view)); - - adjustment = gtk_range_get_adjustment (GTK_RANGE (E_WEEK_VIEW (priv->month_view)->vscrollbar)); - g_signal_connect (adjustment, "value_changed", - G_CALLBACK (month_view_adjustment_changed_cb), - gcal); - - /* The List View. */ - priv->list_view = e_cal_list_view_new (cal_model); - - e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->list_view), gcal); - e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->list_view), priv->zone); - g_signal_connect (priv->list_view, "selection_changed", - G_CALLBACK (view_selection_changed_cb), gcal); - - connect_list_view_focus (gcal, E_CAL_LIST_VIEW (priv->list_view)); - - priv->views[GNOME_CAL_DAY_VIEW] = E_CALENDAR_VIEW (priv->day_view); - priv->configs[GNOME_CAL_DAY_VIEW] = G_OBJECT (e_day_view_config_new (E_DAY_VIEW (priv->views[GNOME_CAL_DAY_VIEW]))); - priv->views[GNOME_CAL_WORK_WEEK_VIEW] = E_CALENDAR_VIEW (priv->work_week_view); - priv->configs[GNOME_CAL_WORK_WEEK_VIEW] = G_OBJECT (e_day_view_config_new (E_DAY_VIEW (priv->views[GNOME_CAL_WORK_WEEK_VIEW]))); - priv->views[GNOME_CAL_WEEK_VIEW] = E_CALENDAR_VIEW (priv->week_view); - priv->configs[GNOME_CAL_WEEK_VIEW] = G_OBJECT (e_week_view_config_new (E_WEEK_VIEW (priv->views[GNOME_CAL_WEEK_VIEW]))); - priv->views[GNOME_CAL_MONTH_VIEW] = E_CALENDAR_VIEW (priv->month_view); - priv->configs[GNOME_CAL_MONTH_VIEW] = G_OBJECT (e_week_view_config_new (E_WEEK_VIEW (priv->views[GNOME_CAL_MONTH_VIEW]))); - priv->views[GNOME_CAL_LIST_VIEW] = E_CALENDAR_VIEW (priv->list_view); - priv->configs[GNOME_CAL_LIST_VIEW] = G_OBJECT (e_cal_list_view_config_new (E_CAL_LIST_VIEW (priv->views[GNOME_CAL_LIST_VIEW]))); - - for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) { - gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), - GTK_WIDGET (priv->views[i]), gtk_label_new ("")); - - g_signal_connect (priv->views[i], "user_created", - G_CALLBACK (user_created_cb), gcal); - - gtk_widget_show (GTK_WIDGET (priv->views[i])); - } - - /* Memo view */ - vbox = gtk_vbox_new (FALSE, 0); - label = gtk_label_new (NULL); - tmp = g_strdup_printf ("<b> %s </b>", _("Memos")); - gtk_label_set_markup ((GtkLabel *)label, tmp); - g_free (tmp); - gtk_box_pack_start ((GtkBox *)vbox, label, FALSE, TRUE, 0); - priv->memo = e_memo_table_new (); - priv->memo_config = e_memo_table_config_new (E_MEMO_TABLE (priv->memo)); - gtk_paned_pack2 (GTK_PANED (priv->vpane), vbox, TRUE, FALSE); - gtk_box_pack_end ((GtkBox *)vbox, priv->memo, TRUE, TRUE, 0); - - gtk_widget_show (priv->memo); - gtk_widget_show (label); - gtk_widget_show (vbox); - - filename = g_build_filename (memos_component_peek_config_directory (memos_component_peek ()), - "MemoPad", NULL); - e_memo_table_load_state (E_MEMO_TABLE (priv->memo), filename); - - e_cal_model_set_default_time_func (e_memo_table_get_model (E_MEMO_TABLE (priv->memo)), gc_get_default_time, gcal); - update_memo_view (gcal); - g_free (filename); - - etable = e_memo_table_get_table (E_MEMO_TABLE (priv->memo)); - g_signal_connect (etable->table_canvas, "focus_in_event", - G_CALLBACK (memo_canvas_focus_change_cb), gcal); - g_signal_connect (etable->table_canvas, "focus_out_event", - G_CALLBACK (memo_canvas_focus_change_cb), gcal); - - g_signal_connect (etable, "selection_change", - G_CALLBACK (memo_selection_change_cb), gcal); - - g_signal_connect (e_memo_table_get_model ((EMemoTable *)priv->memo), "cal_view_progress", - G_CALLBACK (view_progress_cb), gcal); - g_signal_connect (e_memo_table_get_model ((EMemoTable *)priv->memo), "cal_view_done", - G_CALLBACK (view_done_cb), gcal); - } /* Object initialization function for the gnome calendar */ @@ -1886,18 +1367,17 @@ static void gnome_calendar_init (GnomeCalendar *gcal) { GnomeCalendarPrivate *priv; - gint i; priv = g_new0 (GnomeCalendarPrivate, 1); gcal->priv = priv; - for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) - priv->clients[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); if (non_intrusive_error_table == NULL) non_intrusive_error_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); - e_categories_register_change_listener (G_CALLBACK (categories_changed_cb), gcal); + if (non_intrusive_error_table == NULL) + non_intrusive_error_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); priv->todo_update_lock = g_mutex_new (); @@ -1905,21 +1385,13 @@ gnome_calendar_init (GnomeCalendar *gcal) priv->range_selected = FALSE; priv->lview_select_daten_range = TRUE; - setup_config (gcal); setup_widgets (gcal); - priv->calendar_menu = e_cal_menu_new("org.gnome.evolution.calendar.view"); - priv->taskpad_menu = e_cal_menu_new("org.gnome.evolution.calendar.taskpad"); - priv->memopad_menu = e_cal_menu_new ("org.gnome.evolution.calendar.memopad"); - priv->dn_queries = NULL; priv->sexp = g_strdup ("#t"); /* Match all */ priv->todo_sexp = g_strdup ("#t"); priv->memo_sexp = g_strdup ("#t"); - priv->view_instance = NULL; - priv->view_menus = NULL; - priv->visible_start = -1; priv->visible_end = -1; priv->updating = FALSE; @@ -1931,7 +1403,6 @@ gnome_calendar_destroy (GtkObject *object) GnomeCalendar *gcal; GnomeCalendarPrivate *priv; gchar *filename; - ECalModel *cal_model; g_return_if_fail (object != NULL); g_return_if_fail (GNOME_IS_CALENDAR (object)); @@ -1943,67 +1414,45 @@ gnome_calendar_destroy (GtkObject *object) GList *l; gint i; - e_categories_unregister_change_listener (G_CALLBACK (categories_changed_cb), gcal); - - /* Clean up the clients */ - for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) { - for (l = priv->clients_list[i]; l != NULL; l = l->next) { - ESource *source = e_cal_get_source (l->data); - - g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, gcal); - - if (source) - g_signal_handlers_disconnect_matched (source, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, gcal); - } - - g_hash_table_destroy (priv->clients[i]); - g_list_free (priv->clients_list[i]); - - priv->clients[i] = NULL; - priv->clients_list[i] = NULL; + if (priv->shell_settings != NULL) { + g_object_unref (priv->shell_settings); + priv->shell_settings = NULL; + } - if (priv->default_client[i]) { - ESource *source = e_cal_get_source (priv->default_client[i]); + if (priv->model != NULL) { + g_signal_handlers_disconnect_by_func ( + priv->model, view_progress_cb, gcal); + g_signal_handlers_disconnect_by_func ( + priv->model, view_done_cb, gcal); + g_object_unref (priv->model); + priv->model = NULL; + } - g_signal_handlers_disconnect_matched (priv->default_client[i], - G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, gcal); + /* Clean up the clients */ + for (l = priv->clients_list; l != NULL; l = l->next) { + g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, gcal); + } - if (source) - g_signal_handlers_disconnect_matched (source, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, gcal); + g_hash_table_destroy (priv->clients); + g_list_free (priv->clients_list); - g_object_unref (priv->default_client[i]); - } - priv->default_client[i] = NULL; - } + priv->clients = NULL; + priv->clients_list = NULL; - for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) { - if (priv->configs[i]) - g_object_unref (priv->configs[i]); - priv->configs[i] = NULL; + if (priv->default_client) { + g_signal_handlers_disconnect_matched (priv->default_client, + G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, gcal); + g_object_unref (priv->default_client); } - g_object_unref (priv->date_navigator_config); - g_object_unref (priv->todo_config); - g_object_unref (priv->memo_config); + priv->default_client = NULL; for (l = priv->notifications; l; l = l->next) calendar_config_remove_notification (GPOINTER_TO_UINT (l->data)); g_list_free (priv->notifications); priv->notifications = NULL; - /* Save the TaskPad layout. */ - filename = g_build_filename (calendar_component_peek_config_directory (calendar_component_peek ()), - "TaskPad", NULL); - e_calendar_table_save_state (E_CALENDAR_TABLE (priv->todo), filename); - g_free (filename); - - /* Save the MemoPad layout. */ - filename = g_build_filename (memos_component_peek_config_directory (memos_component_peek ()), - "MemoPad", NULL); - e_memo_table_save_state (E_MEMO_TABLE (priv->memo), filename); - g_free (filename); - if (priv->dn_queries) { for (l = priv->dn_queries; l != NULL; l = l->next) { g_signal_handlers_disconnect_matched ((ECalView *) l->data, G_SIGNAL_MATCH_DATA, @@ -2025,69 +1474,16 @@ gnome_calendar_destroy (GtkObject *object) priv->sexp = NULL; } - if (priv->todo_sexp) { - g_free (priv->todo_sexp); - priv->todo_sexp = NULL; - } - - if (priv->memo_sexp) { - g_free (priv->memo_sexp); - priv->memo_sexp = NULL; - } - if (priv->update_timeout) { g_source_remove (priv->update_timeout); priv->update_timeout = 0; } - if (priv->view_instance) { - g_object_unref (priv->view_instance); - priv->view_instance = NULL; - } - if (priv->update_marcus_bains_line_timeout) { g_source_remove (priv->update_marcus_bains_line_timeout); priv->update_marcus_bains_line_timeout = 0; } - if (priv->view_menus) { - g_object_unref (priv->view_menus); - priv->view_menus = NULL; - } - - if (priv->calendar_menu) { - g_object_unref (priv->calendar_menu); - priv->calendar_menu = NULL; - } - - if (priv->taskpad_menu) { - g_object_unref (priv->taskpad_menu); - priv->taskpad_menu = NULL; - } - - if (priv->memopad_menu) { - g_object_unref (priv->memopad_menu); - priv->memopad_menu = NULL; - } - /* Disconnect all handlers */ - cal_model = e_calendar_view_get_model ((ECalendarView *)priv->week_view); - g_signal_handlers_disconnect_by_func (cal_model, - G_CALLBACK (view_progress_cb), gcal); - g_signal_handlers_disconnect_by_func (cal_model, - G_CALLBACK (view_done_cb), gcal); - - cal_model = e_calendar_table_get_model ((ECalendarTable *) priv->todo); - g_signal_handlers_disconnect_by_func (cal_model, - G_CALLBACK (view_progress_cb), gcal); - g_signal_handlers_disconnect_by_func (cal_model, - G_CALLBACK (view_done_cb), gcal); - - cal_model = e_memo_table_get_model ((EMemoTable *)priv->memo); - g_signal_handlers_disconnect_by_func (cal_model, - G_CALLBACK (view_progress_cb), gcal); - g_signal_handlers_disconnect_by_func (cal_model, - G_CALLBACK (view_done_cb), gcal); - g_mutex_free (priv->todo_update_lock); g_free (priv); @@ -2114,14 +1510,17 @@ static void gnome_calendar_goto_date (GnomeCalendar *gcal, GnomeCalendarGotoDateType goto_date) { - GnomeCalendarPrivate *priv; + ECalModel *model; time_t new_time = 0; + gint week_start_day; gboolean need_updating = FALSE; + icaltimezone *timezone; - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR(gcal)); - priv = gcal->priv; + model = gnome_calendar_get_model (gcal); + week_start_day = e_cal_model_get_week_start_day (model); + timezone = e_cal_model_get_timezone (model); switch (goto_date) { /* GNOME_CAL_GOTO_TODAY and GNOME_CAL_GOTO_DATE are @@ -2132,39 +1531,45 @@ gnome_calendar_goto_date (GnomeCalendar *gcal, case GNOME_CAL_GOTO_DATE: break; case GNOME_CAL_GOTO_FIRST_DAY_OF_MONTH: - new_time = time_month_begin_with_zone (priv->base_view_time, priv->zone); + new_time = time_month_begin_with_zone ( + gcal->priv->base_view_time, timezone); need_updating = TRUE; break; case GNOME_CAL_GOTO_LAST_DAY_OF_MONTH: - new_time = time_add_month_with_zone (priv->base_view_time, 1, priv->zone); - new_time = time_month_begin_with_zone (new_time, priv->zone); - new_time = time_add_day_with_zone (new_time, -1, priv->zone); + new_time = time_add_month_with_zone ( + gcal->priv->base_view_time, 1, timezone); + new_time = time_month_begin_with_zone (new_time, timezone); + new_time = time_add_day_with_zone (new_time, -1, timezone); need_updating = TRUE; break; case GNOME_CAL_GOTO_FIRST_DAY_OF_WEEK: - new_time = time_week_begin_with_zone (priv->base_view_time, priv->week_start, priv->zone); + new_time = time_week_begin_with_zone ( + gcal->priv->base_view_time, week_start_day, timezone); need_updating = TRUE; break; case GNOME_CAL_GOTO_LAST_DAY_OF_WEEK: - new_time = time_week_begin_with_zone (priv->base_view_time, priv->week_start, priv->zone); - if (priv->current_view_type == GNOME_CAL_DAY_VIEW || - priv->current_view_type == GNOME_CAL_WORK_WEEK_VIEW) { + new_time = time_week_begin_with_zone ( + gcal->priv->base_view_time, week_start_day, timezone); + if (gcal->priv->current_view_type == GNOME_CAL_DAY_VIEW || + gcal->priv->current_view_type == GNOME_CAL_WORK_WEEK_VIEW) { /* FIXME Shouldn't hard code work week end */ /* goto Friday of this week */ - new_time = time_add_day_with_zone (new_time, 4, priv->zone); + new_time = time_add_day_with_zone (new_time, 4, timezone); } else { /* goto Sunday of this week */ /* FIXME Shouldn't hard code week end */ - new_time = time_add_day_with_zone (new_time, 6, priv->zone); + new_time = time_add_day_with_zone (new_time, 6, timezone); } need_updating = TRUE; break; case GNOME_CAL_GOTO_SAME_DAY_OF_PREVIOUS_WEEK: - new_time = time_add_week_with_zone (priv->base_view_time, -1, priv->zone); + new_time = time_add_week_with_zone ( + gcal->priv->base_view_time, -1, timezone); need_updating = TRUE; break; case GNOME_CAL_GOTO_SAME_DAY_OF_NEXT_WEEK: - new_time = time_add_week_with_zone (priv->base_view_time, 1, priv->zone); + new_time = time_add_week_with_zone ( + gcal->priv->base_view_time, 1, timezone); need_updating = TRUE; break; default: @@ -2172,9 +1577,7 @@ gnome_calendar_goto_date (GnomeCalendar *gcal, } if (need_updating) { - update_view_times (gcal, new_time); - gnome_calendar_update_date_navigator (gcal); - gnome_calendar_notify_dates_shown_changed (gcal); + gnome_calendar_set_selected_time_range (gcal, new_time); notify_selected_time_changed (gcal); } } @@ -2185,15 +1588,12 @@ gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time) GnomeCalendarPrivate *priv; gint i; - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); g_return_if_fail (new_time != -1); priv = gcal->priv; - update_view_times (gcal, new_time); - gnome_calendar_update_date_navigator (gcal); - gnome_calendar_notify_dates_shown_changed (gcal); + gnome_calendar_set_selected_time_range (gcal, new_time); for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) { if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (priv->views[i]))->set_selected_time_range) @@ -2201,19 +1601,23 @@ gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time) } } -static void -update_view_times (GnomeCalendar *gcal, time_t start_time) +void +gnome_calendar_update_view_times (GnomeCalendar *gcal, + time_t start_time) { GnomeCalendarPrivate *priv; ECalModel *model; time_t real_start_time = start_time; time_t end_time, select_time = 0; + g_return_if_fail (GNOME_IS_CALENDAR (gcal)); + priv = gcal->priv; priv->base_view_time = start_time; - model = e_calendar_view_get_model (priv->views [priv->current_view_type]); + model = gnome_calendar_get_model (gcal); + get_times_for_views (gcal, priv->current_view_type, &real_start_time, &end_time, &select_time); if (priv->current_view_type == GNOME_CAL_LIST_VIEW && !priv->lview_select_daten_range) @@ -2222,42 +1626,44 @@ update_view_times (GnomeCalendar *gcal, time_t start_time) e_cal_model_set_time_range (model, real_start_time, end_time); if (select_time != 0 && select_time >= real_start_time && select_time <= end_time) - e_calendar_view_set_selected_time_range (priv->views [priv->current_view_type], select_time, select_time); + e_calendar_view_set_selected_time_range (priv->views[priv->current_view_type], select_time, select_time); } static void gnome_calendar_direction (GnomeCalendar *gcal, gint direction) { - GnomeCalendarPrivate *priv; + ECalModel *model; + icaltimezone *timezone; - priv = gcal->priv; + model = gnome_calendar_get_model (gcal); + timezone = e_cal_model_get_timezone (model); - switch (priv->current_view_type) { + switch (gnome_calendar_get_view (gcal)) { case GNOME_CAL_DAY_VIEW: - priv->base_view_time = time_add_day_with_zone (priv->base_view_time, direction, priv->zone); + gcal->priv->base_view_time = time_add_day_with_zone ( + gcal->priv->base_view_time, direction, timezone); break; case GNOME_CAL_WORK_WEEK_VIEW: case GNOME_CAL_WEEK_VIEW: - priv->base_view_time = time_add_week_with_zone (priv->base_view_time, direction, priv->zone); + gcal->priv->base_view_time = time_add_week_with_zone ( + gcal->priv->base_view_time, direction, timezone); break; - case GNOME_CAL_LIST_VIEW: - g_warning ("Using month view time interval for list view."); case GNOME_CAL_MONTH_VIEW: - priv->base_view_time = time_add_month_with_zone (priv->base_view_time, direction, priv->zone); + case GNOME_CAL_LIST_VIEW: + gcal->priv->base_view_time = time_add_month_with_zone ( + gcal->priv->base_view_time, direction, timezone); break; default: g_return_if_reached (); } - update_view_times (gcal, priv->base_view_time); - gnome_calendar_update_date_navigator (gcal); - gnome_calendar_notify_dates_shown_changed (gcal); + gnome_calendar_set_selected_time_range ( + gcal, gcal->priv->base_view_time); } void gnome_calendar_next (GnomeCalendar *gcal) { - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); gnome_calendar_direction (gcal, 1); @@ -2266,7 +1672,6 @@ gnome_calendar_next (GnomeCalendar *gcal) void gnome_calendar_previous (GnomeCalendar *gcal) { - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); gnome_calendar_direction (gcal, -1); @@ -2275,33 +1680,34 @@ gnome_calendar_previous (GnomeCalendar *gcal) void gnome_calendar_dayjump (GnomeCalendar *gcal, time_t time) { - GnomeCalendarPrivate *priv; + ECalModel *model; + icaltimezone *timezone; - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - priv = gcal->priv; + model = gnome_calendar_get_model (gcal); + timezone = e_cal_model_get_timezone (model); - priv->base_view_time = time_day_begin_with_zone (time, priv->zone); + gcal->priv->base_view_time = + time_day_begin_with_zone (time, timezone); - update_view_times (gcal, priv->base_view_time); + gnome_calendar_update_view_times (gcal, gcal->priv->base_view_time); gnome_calendar_set_view (gcal, GNOME_CAL_DAY_VIEW); } -static void -focus_current_view (GnomeCalendar *gcal) -{ - gtk_widget_grab_focus (gnome_calendar_get_current_view_widget (gcal)); -} - void gnome_calendar_goto_today (GnomeCalendar *gcal) { - g_return_if_fail (gcal != NULL); + GnomeCalendarViewType view_type; + ECalendarView *view; + g_return_if_fail (GNOME_IS_CALENDAR (gcal)); + view_type = gnome_calendar_get_view (gcal); + view = gnome_calendar_get_calendar_view (gcal, view_type); + gnome_calendar_goto (gcal, time (NULL)); - focus_current_view (gcal); + gtk_widget_grab_focus (GTK_WIDGET (view)); } /** @@ -2315,56 +1721,9 @@ gnome_calendar_goto_today (GnomeCalendar *gcal) GnomeCalendarViewType gnome_calendar_get_view (GnomeCalendar *gcal) { - GnomeCalendarPrivate *priv; - - g_return_val_if_fail (gcal != NULL, GNOME_CAL_DAY_VIEW); g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), GNOME_CAL_DAY_VIEW); - priv = gcal->priv; - return priv->current_view_type; -} - -static void -set_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type, gboolean range_selected) -{ - GnomeCalendarPrivate *priv; - const gchar *view_id; - - g_return_if_fail (gcal != NULL); - g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - - priv = gcal->priv; - - switch (view_type) { - case GNOME_CAL_DAY_VIEW: - view_id = "Day_View"; - break; - - case GNOME_CAL_WORK_WEEK_VIEW: - view_id = "Work_Week_View"; - break; - - case GNOME_CAL_WEEK_VIEW: - view_id = "Week_View"; - break; - - case GNOME_CAL_MONTH_VIEW: - view_id = "Month_View"; - break; - - case GNOME_CAL_LIST_VIEW: - view_id = "List_View"; - break; - - default: - g_return_if_reached (); - } - - priv->range_selected = range_selected; - priv->current_view_type = view_type; - - gal_view_instance_set_current_view_id (priv->view_instance, view_id); - focus_current_view (gcal); + return gcal->priv->current_view_type; } /** @@ -2377,34 +1736,46 @@ set_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type, gboolean range_s * the view; otherwise the last configuration will be kept. **/ void -gnome_calendar_set_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type) +gnome_calendar_set_view (GnomeCalendar *gcal, + GnomeCalendarViewType view_type) { - g_return_if_fail (gcal != NULL); + ECalendarView *calendar_view; + g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - set_view (gcal, view_type, FALSE); + gcal->priv->current_view_type = view_type; + gnome_calendar_set_range_selected (gcal, FALSE); + + calendar_view = gnome_calendar_get_calendar_view (gcal, view_type); + gtk_widget_grab_focus (GTK_WIDGET (calendar_view)); + + g_object_notify (G_OBJECT (gcal), "view"); } -/* Sets the view without changing the selection or updating the date - * navigator. If a range of dates isn't selected it will also reset the number - * of days/weeks shown to the default (i.e. 1 day for the day view or 5 weeks - * for the month view). - */ -static void -display_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type, gboolean grab_focus) +void +gnome_calendar_display_view (GnomeCalendar *gcal, + GnomeCalendarViewType view_type) { - GnomeCalendarPrivate *priv; + CalendarView *cal_view; + ECalendarView *view; gboolean preserve_day; - gint i; + gboolean range_selected; + time_t start_time; + gint ii; - priv = gcal->priv; + view = gnome_calendar_get_calendar_view (gcal, view_type); + + /* Set the view without changing the selection or updating the date + * navigator. If a range of dates isn't selected, also reset the + * number of days/weeks shown to the default (i.e. 1 day for the + * day view or 6 weeks for the month view). */ preserve_day = FALSE; switch (view_type) { case GNOME_CAL_DAY_VIEW: - if (!priv->range_selected) - e_day_view_set_days_shown (E_DAY_VIEW (priv->day_view), 1); + if (!gnome_calendar_get_range_selected (gcal)) + e_day_view_set_days_shown (E_DAY_VIEW (view), 1); gtk_widget_show (GTK_WIDGET (gcal->priv->date_navigator)); break; @@ -2420,15 +1791,15 @@ display_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type, gboolean gra break; case GNOME_CAL_MONTH_VIEW: - if (!priv->range_selected) - e_week_view_set_weeks_shown (E_WEEK_VIEW (priv->month_view), 6); + if (!gnome_calendar_get_range_selected (gcal)) + e_week_view_set_weeks_shown (E_WEEK_VIEW (view), 6); preserve_day = TRUE; gtk_widget_show (GTK_WIDGET (gcal->priv->date_navigator)); break; case GNOME_CAL_LIST_VIEW: - if (!priv->lview_select_daten_range) + if (!gcal->priv->lview_select_daten_range) gtk_widget_hide (GTK_WIDGET (gcal->priv->date_navigator)); else gtk_widget_show (GTK_WIDGET (gcal->priv->date_navigator)); @@ -2438,345 +1809,32 @@ display_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type, gboolean gra g_return_if_reached (); } - priv->current_view_type = view_type; - E_CALENDAR_VIEW (priv->views [view_type])->in_focus = TRUE; + range_selected = gnome_calendar_get_range_selected (gcal); + gnome_calendar_set_view (gcal, view_type); + gnome_calendar_set_range_selected (gcal, range_selected); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (priv->notebook), (gint) view_type); - - for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) { - if (i == view_type) + /* XXX Move this to set_view()? */ + E_CALENDAR_VIEW (gcal->priv->views[view_type])->in_focus = TRUE; + for (ii = 0; ii < GNOME_CAL_LAST_VIEW; ii++) { + if (ii == view_type) continue; - E_CALENDAR_VIEW (priv->views [i])->in_focus = FALSE; + E_CALENDAR_VIEW (gcal->priv->views[ii])->in_focus = FALSE; } - if (grab_focus) - focus_current_view (gcal); - - gnome_calendar_set_pane_positions (gcal); - /* For the week & month views we want the selection in the date navigator to be rounded to the nearest week when the arrow buttons are pressed to move to the previous/next month. */ - g_object_set (G_OBJECT (priv->date_navigator->calitem), - "preserve_day_when_moving", preserve_day, - NULL); -} - -static void gnome_calendar_change_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type) -{ - if (gnome_calendar_get_view(gcal) == view_type) - return; - - gnome_calendar_set_view(gcal, view_type); -} - -/* Callback used when the view collection asks us to display a particular view */ -static void -display_view_cb (GalViewInstance *view_instance, GalView *view, gpointer data) -{ - GnomeCalendar *gcal; - GnomeCalendarPrivate *priv; - CalendarView *cal_view; - GnomeCalendarViewType view_type; - - gcal = GNOME_CALENDAR (data); - priv = gcal->priv; + g_object_set ( + gcal->priv->date_navigator->calitem, + "preserve_day_when_moving", preserve_day, NULL); - if (GAL_IS_VIEW_ETABLE(view)) { - ETable *table; - - view_type = GNOME_CAL_LIST_VIEW; - - table = e_table_scrolled_get_table (E_CAL_LIST_VIEW (priv->list_view)->table_scrolled); - gal_view_etable_attach_table (GAL_VIEW_ETABLE (view), table); - } else if (IS_CALENDAR_VIEW (view)) { - cal_view = CALENDAR_VIEW (view); - - view_type = calendar_view_get_view_type (cal_view); - } else { - g_error (G_STRLOC ": Unknown type of view for GnomeCalendar"); - return; - } - - display_view (gcal, view_type, TRUE); - - if (!priv->base_view_time) - update_view_times (gcal, time (NULL)); + if (!gcal->priv->base_view_time) + start_time = time (NULL); else - update_view_times (gcal, priv->base_view_time); - - gnome_calendar_update_date_navigator (gcal); - gnome_calendar_notify_dates_shown_changed (gcal); - -} - -/** - * gnome_calendar_setup_view_menus: - * @gcal: A calendar. - * @uic: UI controller to use for the menus. - * - * Sets up the #GalView menus for a calendar. This function should be called - * from the Bonobo control activation callback for this calendar. Also, the - * menus should be discarded using gnome_calendar_discard_view_menus(). - **/ -void -gnome_calendar_setup_view_menus (GnomeCalendar *gcal, BonoboUIComponent *uic) -{ - GnomeCalendarPrivate *priv; - gchar *path0, *path1, *etspecfile; - CalendarViewFactory *factory; - GalViewFactory *gal_factory; - static GalViewCollection *collection = NULL; - - g_return_if_fail (gcal != NULL); - g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - g_return_if_fail (uic != NULL); - g_return_if_fail (BONOBO_IS_UI_COMPONENT (uic)); - - priv = gcal->priv; - - g_return_if_fail (priv->view_instance == NULL); - g_return_if_fail (priv->view_menus == NULL); - - /* Create the view instance */ - if (collection == NULL) { - ETableSpecification *spec; - - collection = gal_view_collection_new (); - - gal_view_collection_set_title (collection, _("Calendar")); - - path0 = g_build_filename (EVOLUTION_GALVIEWSDIR, - "calendar", - NULL); - path1 = g_build_filename (calendar_component_peek_base_directory (calendar_component_peek ()), - "views", NULL); - gal_view_collection_set_storage_directories (collection, - path0, - path1); - g_free (path1); - g_free (path0); - - /* Create the views */ - - factory = calendar_view_factory_new (GNOME_CAL_DAY_VIEW); - gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory)); - g_object_unref (factory); - - factory = calendar_view_factory_new (GNOME_CAL_WORK_WEEK_VIEW); - gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory)); - g_object_unref (factory); - - factory = calendar_view_factory_new (GNOME_CAL_WEEK_VIEW); - gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory)); - g_object_unref (factory); - - factory = calendar_view_factory_new (GNOME_CAL_MONTH_VIEW); - gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (factory)); - g_object_unref (factory); - - spec = e_table_specification_new (); - etspecfile = g_build_filename (EVOLUTION_ETSPECDIR, - "e-cal-list-view.etspec", - NULL); - if (!e_table_specification_load_from_file (spec, etspecfile)) - g_error ("Unable to load ETable specification file " - "for calendar"); - g_free (etspecfile); - gal_factory = gal_view_factory_etable_new (spec); - g_object_unref (spec); - gal_view_collection_add_factory (collection, GAL_VIEW_FACTORY (gal_factory)); - g_object_unref (gal_factory); - - /* Load the collection and create the menus */ - - gal_view_collection_load (collection); - - } - - priv->view_instance = gal_view_instance_new (collection, NULL); - priv->view_menus = gal_view_menus_new (priv->view_instance); - gal_view_menus_apply (priv->view_menus, uic, NULL); - - g_signal_connect (priv->view_instance, "display_view", G_CALLBACK (display_view_cb), gcal); - display_view_cb (priv->view_instance, gal_view_instance_get_current_view (priv->view_instance), gcal); -} - -/** - * gnome_calendar_discard_view_menus: - * @gcal: A calendar. - * - * Discards the #GalView menus used by a calendar. This function should be - * called from the Bonobo control deactivation callback for this calendar. The - * menus should have been set up with gnome_calendar_setup_view_menus(). - **/ -void -gnome_calendar_discard_view_menus (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - - g_return_if_fail (gcal != NULL); - - priv = gcal->priv; - - g_return_if_fail (priv->view_instance != NULL); - g_return_if_fail (priv->view_menus != NULL); - - g_object_unref (priv->view_instance); - priv->view_instance = NULL; - - g_object_unref (priv->view_menus); - priv->view_menus = NULL; -} - -/* This is copied/moved from gal-view-instance, only the calendar uses this for a popup menu */ -static void -gc_set_view(EPopup *ep, EPopupItem *pitem, gpointer data) -{ - GnomeCalendar *gcal = data; - - if (pitem->type & E_POPUP_ACTIVE) - gal_view_instance_set_current_view_id(gcal->priv->view_instance, (gchar *)pitem->user_data); -} - -static void -gc_save_custom_view(EPopup *ep, EPopupItem *pitem, gpointer data) -{ - GnomeCalendar *gcal = data; - - gal_view_instance_save_as(gcal->priv->view_instance); -} - -static void -gc_define_views_response(GtkWidget *d, gint id, GnomeCalendar *gcal) -{ - if (id == GTK_RESPONSE_OK) - gal_view_collection_save(gcal->priv->view_instance->collection); - - gtk_widget_destroy(d); -} - -static void -gc_define_views(EPopup *ep, EPopupItem *pitem, gpointer data) -{ - GnomeCalendar *gcal = data; - GtkWidget *dialog = gal_define_views_dialog_new(gcal->priv->view_instance->collection); - - g_signal_connect(dialog, "response", G_CALLBACK(gc_define_views_response), data); - gtk_widget_show(dialog); -} - -static EPopupItem gc_popups[] = { - /* Code generates the path to fit */ - { E_POPUP_BAR, NULL }, - { E_POPUP_RADIO|E_POPUP_ACTIVE, NULL, (gchar *) N_("_Custom View"), }, - { E_POPUP_ITEM, NULL, (gchar *) N_("_Save Custom View"), gc_save_custom_view }, - - /* index == 3, when we have non-custom view */ - - { E_POPUP_BAR, NULL }, - { E_POPUP_ITEM, NULL, (gchar *) N_("_Define Views..."), gc_define_views }, -}; - -static void -gc_popup_free (EPopup *ep, GSList *list, gpointer data) -{ - while (list) { - GSList *n = list->next; - EPopupItem *pitem = list->data; - - g_free(pitem->path); - g_free(pitem->label); - g_free(pitem->user_data); - g_free(pitem); - g_slist_free_1(list); - list = n; - } -} - -static void -gc_popup_free_static (EPopup *ep, GSList *list, gpointer data) -{ - while (list) { - GSList *n = list->next; - EPopupItem *pitem = list->data; - - g_free(pitem->path); - g_free(pitem); - g_slist_free_1(list); - list = n; - } -} - -void -gnome_calendar_view_popup_factory (GnomeCalendar *gcal, EPopup *ep, const gchar *prefix) -{ - GnomeCalendarPrivate *priv; - gint length; - gint i; - gboolean found = FALSE; - gchar *id; - GSList *menus = NULL; - EPopupItem *pitem; - - g_return_if_fail (gcal != NULL); - g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - g_return_if_fail (prefix != NULL); + start_time = gcal->priv->base_view_time; - priv = gcal->priv; - - g_return_if_fail (priv->view_instance != NULL); - - length = gal_view_collection_get_count(priv->view_instance->collection); - id = gal_view_instance_get_current_view_id (priv->view_instance); - - for (i = 0; i < length; i++) { - GalViewCollectionItem *item = gal_view_collection_get_view_item(priv->view_instance->collection, i); - - pitem = g_malloc0(sizeof(*pitem)); - pitem->type = E_POPUP_RADIO; - pitem->path = g_strdup_printf("%s/%02d.item", prefix, i); - pitem->label = g_strdup(item->title); - pitem->activate = gc_set_view; - pitem->user_data = g_strdup(item->id); - - if (!found && id && !strcmp (id, item->id)) { - found = TRUE; - pitem->type |= E_POPUP_ACTIVE; - } - - menus = g_slist_prepend(menus, pitem); - } + gnome_calendar_set_selected_time_range (gcal, start_time); - if (menus) - e_popup_add_items(ep, menus, NULL, gc_popup_free, gcal); - - menus = NULL; - for (i = found?3:0; i<sizeof(gc_popups)/sizeof(gc_popups[0]);i++) { - pitem = g_malloc0(sizeof(*pitem)); - memcpy(pitem, &gc_popups[i], sizeof(*pitem)); - pitem->path = g_strdup_printf("%s/%02d.item", prefix, i+length); - menus = g_slist_prepend(menus, pitem); - } - - e_popup_add_items(ep, menus, NULL, gc_popup_free_static, gcal); -} - -static void -gnome_calendar_set_pane_positions (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - - priv = gcal->priv; - - if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) { - gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos_month_view); - gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos_month_view); - } else { - gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos); - gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos); - } } struct _mclient_msg { @@ -2818,7 +1876,6 @@ static void client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal) { GnomeCalendarPrivate *priv; - ECalSourceType source_type; ESource *source; ECalModel *model; ECalLoadState state; @@ -2828,23 +1885,9 @@ client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal) priv = gcal->priv; - source_type = e_cal_get_source_type (ecal); source = e_cal_get_source (ecal); state = e_cal_get_load_state (ecal); - switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); - break; - case E_CAL_SOURCE_TYPE_TODO: - e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL, -1); - break; - case E_CAL_SOURCE_TYPE_JOURNAL: - e_memo_table_set_status_message (E_MEMO_TABLE (priv->memo), NULL); - default: - break; - } - if (status == E_CALENDAR_STATUS_AUTHENTICATION_FAILED || status == E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED) auth_cal_forget_password (ecal); @@ -2865,7 +1908,7 @@ client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal) } w = e_error_new(NULL, "calendar:server-version", NULL); - e_calendar_utils_show_error_silent (w); + /*e_calendar_utils_show_error_silent (w); KILL-BONOBO */ g_hash_table_insert (non_intrusive_error_table, id, g_object_ref(w)); g_signal_connect(w, "destroy", G_CALLBACK(non_intrusive_error_remove), id); @@ -2876,32 +1919,27 @@ client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal) e_cal_open_async (ecal, FALSE); return; case E_CALENDAR_STATUS_REPOSITORY_OFFLINE: - if (source_type == E_CAL_SOURCE_TYPE_EVENT) - { - /* check to see if we have dialog already running for this operation */ - id = g_strdup ("calendar:unable-to-load-the-calendar"); - - if (g_hash_table_lookup(non_intrusive_error_table, id)) { - /* We already have it */ - g_message("Error occurred while existing dialog active:\n"); - return; - } + /* check to see if we have dialog already running for this operation */ + id = g_strdup ("calendar:unable-to-load-the-calendar"); - w = e_error_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))), "calendar:unable-to-load-the-calendar", e_cal_get_error_message (status), NULL); - e_calendar_utils_show_error_silent (w); - g_hash_table_insert (non_intrusive_error_table, id, g_object_ref(w)); - g_signal_connect(w, "destroy", G_CALLBACK(non_intrusive_error_remove), id); + if (g_hash_table_lookup(non_intrusive_error_table, id)) { + /* We already have it */ + g_message("Error occurred while existing dialog active:\n"); + return; } + + w = e_error_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))), "calendar:unable-to-load-the-calendar", e_cal_get_error_message (status), NULL); + /*e_calendar_utils_show_error_silent (w); KILL-BONOBO */ + g_hash_table_insert (non_intrusive_error_table, id, g_object_ref(w)); + g_signal_connect(w, "destroy", G_CALLBACK(non_intrusive_error_remove), id); default: /* Make sure the source doesn't disappear on us */ g_object_ref (source); - g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, gcal); - - priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal); - g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source)); + priv->clients_list = g_list_remove (priv->clients_list, ecal); + g_hash_table_remove (priv->clients, e_source_peek_uid (source)); - g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source); + g_signal_emit (gcal, signals[SOURCE_REMOVED], 0, source); g_object_unref (source); g_warning ("Unable to load the calendar %s \n", e_cal_get_error_message (status)); @@ -2911,74 +1949,36 @@ client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal) g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, client_cal_opened_cb, NULL); - switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT : - msg = g_strdup_printf (_("Loading appointments at %s"), e_cal_get_uri (ecal)); - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1); - g_free (msg); - - /* add client to the views */ - model = e_calendar_view_get_model (priv->views[priv->current_view_type]); - add_mclient (model, ecal); - - /* update date navigator query */ - update_query (gcal); - - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); - break; + msg = g_strdup_printf (_("Loading appointments at %s"), e_cal_get_uri (ecal)); + /*e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1); KILL-BONOBO */ + g_free (msg); - case E_CAL_SOURCE_TYPE_TODO : - msg = g_strdup_printf (_("Loading tasks at %s"), e_cal_get_uri (ecal)); - e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), msg, -1); - g_free (msg); + /* add client to the views */ + model = gnome_calendar_get_model (gcal); + add_mclient (model, ecal); - e_cal_model_add_client (e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), ecal); + /* update date navigator query */ + gnome_calendar_update_query (gcal); - e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL, -1); - break; - case E_CAL_SOURCE_TYPE_JOURNAL: - msg = g_strdup_printf (_("Loading memos at %s"), e_cal_get_uri (ecal)); - e_memo_table_set_status_message (E_MEMO_TABLE (priv->memo), msg); - g_free (msg); - e_cal_model_add_client (e_memo_table_get_model (E_MEMO_TABLE (priv->memo)), ecal); - e_memo_table_set_status_message (E_MEMO_TABLE (priv->memo), NULL); - break; - default: - g_return_if_reached (); - } + /*e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); KILL-BONOBO */ } static void default_client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal) { GnomeCalendarPrivate *priv; - ECalSourceType source_type; ESource *source; ECalLoadState state; + ECalModel *model; priv = gcal->priv; - source_type = e_cal_get_source_type (ecal); source = e_cal_get_source (ecal); state = e_cal_get_load_state (ecal); if (status == E_CALENDAR_STATUS_AUTHENTICATION_FAILED || status == E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED) auth_cal_forget_password (ecal); - switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); - break; - case E_CAL_SOURCE_TYPE_TODO: - e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL, -1); - break; - case E_CAL_SOURCE_TYPE_JOURNAL: - e_memo_table_set_status_message (E_MEMO_TABLE (priv->memo), NULL); - break; - default: - break; - } - switch (status) { case E_CALENDAR_STATUS_OK: break; @@ -2999,15 +1999,15 @@ default_client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, gcal); /* FIXME should we do this to prevent multiple error dialogs? */ - priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal); - g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source)); + priv->clients_list = g_list_remove (priv->clients_list, ecal); + g_hash_table_remove (priv->clients, e_source_peek_uid (source)); /* FIXME Is there a better way to handle this? */ - if (priv->default_client[source_type]) - g_object_unref (priv->default_client[source_type]); - priv->default_client[source_type] = NULL; + if (priv->default_client) + g_object_unref (priv->default_client); + priv->default_client = NULL; - g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source); + g_signal_emit (gcal, signals[SOURCE_REMOVED], 0, source); g_object_unref (source); g_warning ("Unable to load the calendar %s \n", e_cal_get_error_message (status)); @@ -3017,22 +2017,8 @@ default_client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, default_client_cal_opened_cb, NULL); - switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: - e_cal_model_set_default_client ( - e_calendar_view_get_model (E_CALENDAR_VIEW (priv->views[priv->current_view_type])), - ecal); - break; - - case E_CAL_SOURCE_TYPE_TODO: - e_cal_model_set_default_client (e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), ecal); - break; - case E_CAL_SOURCE_TYPE_JOURNAL: - e_cal_model_set_default_client (e_memo_table_get_model (E_MEMO_TABLE (priv->memo)), ecal); - break; - default: - break; - } + model = gnome_calendar_get_model (gcal); + e_cal_model_set_default_client (model, ecal); } typedef void (*open_func) (ECal *, ECalendarStatus, GnomeCalendar *); @@ -3050,20 +2036,7 @@ open_ecal (GnomeCalendar *gcal, ECal *cal, gboolean only_if_exists, open_func of e_cal_set_default_timezone (cal, zone, NULL); msg = g_strdup_printf (_("Opening %s"), e_cal_get_uri (cal)); - switch (e_cal_get_source_type (cal)) { - case E_CAL_SOURCE_TYPE_EVENT : - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1); - break; - case E_CAL_SOURCE_TYPE_TODO : - e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), msg, -1); - break; - case E_CAL_SOURCE_TYPE_JOURNAL: - e_memo_table_set_status_message (E_MEMO_TABLE (priv->memo), msg); - break; - default: - g_free (msg); - g_return_val_if_reached (FALSE); - } + /*e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1); KILL-BONOBO */ g_free (msg); @@ -3094,7 +2067,7 @@ backend_error_cb (ECal *client, const gchar *message, gpointer data) } dialog = (GtkDialog *)e_error_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))), "calendar:error-on-loading-the-calendar", uristr, message, NULL); - e_calendar_utils_show_error_silent(GTK_WIDGET (dialog)); + /* e_calendar_utils_show_error_silent(GTK_WIDGET (dialog)); KILL-BONOBO */ g_hash_table_insert (non_intrusive_error_table, id, g_object_ref(dialog)); g_signal_connect(GTK_WIDGET (dialog), "destroy", G_CALLBACK(non_intrusive_error_remove), id); @@ -3108,7 +2081,6 @@ backend_died_cb (ECal *ecal, gpointer data) { GnomeCalendar *gcal; GnomeCalendarPrivate *priv; - ECalSourceType source_type; ESource *source; const gchar *id; GtkWidget *w = NULL; @@ -3119,39 +2091,16 @@ backend_died_cb (ECal *ecal, gpointer data) /* FIXME What about default sources? */ /* Make sure the source doesn't go away on us since we use it below */ - source_type = e_cal_get_source_type (ecal); source = g_object_ref (e_cal_get_source (ecal)); - priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal); - g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source)); - - switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: - id = g_strdup ("calendar:calendar-crashed"); - - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); - - g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source); - break; - - case E_CAL_SOURCE_TYPE_TODO: - id = g_strdup ("calendar:calendar-crashed"); - - e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL, -1); - - g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source); - break; + priv->clients_list = g_list_remove (priv->clients_list, ecal); + g_hash_table_remove (priv->clients, e_source_peek_uid (source)); - case E_CAL_SOURCE_TYPE_JOURNAL: - id = g_strdup ("calendar:calendar-crashed"); + id = g_strdup ("calendar:calendar-crashed"); - e_memo_table_set_status_message (E_MEMO_TABLE (priv->memo), NULL); + /* e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); KILL-BONOBO */ - g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source); - break; - default: - g_return_if_reached (); - } + g_signal_emit (gcal, signals[SOURCE_REMOVED], 0, source); g_object_unref (source); @@ -3162,71 +2111,58 @@ backend_died_cb (ECal *ecal, gpointer data) } w = e_error_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))), "calendar:backend_died", NULL); - e_calendar_utils_show_error_silent (w); + /* e_calendar_utils_show_error_silent (w); KILL-BONOBO */ g_hash_table_insert (non_intrusive_error_table, (gpointer) id, g_object_ref(w)); g_signal_connect((GtkObject *)w, "destroy", G_CALLBACK(non_intrusive_error_remove), (gpointer) id); } GtkWidget * -gnome_calendar_construct (GnomeCalendar *gcal) +gnome_calendar_new (EShellSettings *shell_settings) { - GnomeCalendarPrivate *priv; - - g_return_val_if_fail (gcal != NULL, NULL); - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - priv = gcal->priv; + g_return_val_if_fail (E_IS_SHELL_SETTINGS (shell_settings), NULL); - return GTK_WIDGET (gcal); + return g_object_new ( + GNOME_TYPE_CALENDAR, + "shell-settings", shell_settings, NULL); } -GtkWidget * -gnome_calendar_new (void) +EShellSettings * +gnome_calendar_get_shell_settings (GnomeCalendar *gcal) { - GnomeCalendar *gcal; - - gcal = g_object_new (gnome_calendar_get_type (), NULL); - - if (!gnome_calendar_construct (gcal)) { - g_message (G_STRLOC ": Could not construct the calendar GUI"); - g_object_unref (gcal); - return NULL; - } + g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - return GTK_WIDGET (gcal); + return gcal->priv->shell_settings; } -void -gnome_calendar_set_activity_handler (GnomeCalendar *cal, EActivityHandler *activity_handler) +ECalendar * +gnome_calendar_get_date_navigator (GnomeCalendar *gcal) { - GnomeCalendarPrivate *priv; - gint i; - - g_return_if_fail (cal != NULL); - g_return_if_fail (GNOME_IS_CALENDAR (cal)); - - priv = cal->priv; - - priv->activity_handler = activity_handler; - - for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) - e_calendar_view_set_activity_handler (priv->views[i], activity_handler); + g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - e_calendar_table_set_activity_handler (E_CALENDAR_TABLE (priv->todo), activity_handler); + return gcal->priv->date_navigator; } void -gnome_calendar_set_ui_component (GnomeCalendar *gcal, - BonoboUIComponent *ui_component) +gnome_calendar_set_date_navigator (GnomeCalendar *gcal, + ECalendar *date_navigator) { g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - g_return_if_fail (ui_component == NULL || BONOBO_IS_UI_COMPONENT (ui_component)); - e_search_bar_set_ui_component (E_SEARCH_BAR (gcal->priv->search_bar), ui_component); + if (date_navigator != NULL) { + g_return_if_fail (E_IS_CALENDAR (date_navigator)); + g_object_ref (date_navigator); + } + + if (gcal->priv->date_navigator != NULL) + g_object_unref (gcal->priv->date_navigator); + + gcal->priv->date_navigator = date_navigator; + + g_object_notify (G_OBJECT (gcal), "date-navigator"); } /** - * gnome_calendar_get_calendar_model: + * gnome_calendar_get_model: * @gcal: A calendar view. * * Queries the calendar model object that a calendar view is using. @@ -3234,92 +2170,11 @@ gnome_calendar_set_ui_component (GnomeCalendar *gcal, * Return value: A calendar client interface object. **/ ECalModel * -gnome_calendar_get_calendar_model (GnomeCalendar *gcal) +gnome_calendar_get_model (GnomeCalendar *gcal) { - GnomeCalendarPrivate *priv; - - g_return_val_if_fail (gcal != NULL, NULL); g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - priv = gcal->priv; - - return e_calendar_view_get_model (priv->views[priv->current_view_type]); -} - -/** - * gnome_calendar_get_default_client - */ -ECal * -gnome_calendar_get_default_client (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - - g_return_val_if_fail (gcal != NULL, NULL); - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - priv = gcal->priv; - - return e_cal_model_get_default_client (e_calendar_view_get_model (gcal->priv->views[priv->current_view_type])); -} - -/** - * gnome_calendar_add_source: - * @gcal: A GnomeCalendar. - * @source: #ESource to add to the calendar views. - * - * Adds the given calendar source to the calendar views. - * - * Returns: TRUE if successful, FALSE if error. - */ -gboolean -gnome_calendar_add_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source) -{ - GnomeCalendarPrivate *priv; - ECal *client; - - g_return_val_if_fail (gcal != NULL, FALSE); - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE); - g_return_val_if_fail (E_IS_SOURCE (source), FALSE); - - priv = gcal->priv; - - client = g_hash_table_lookup (priv->clients[source_type], e_source_peek_uid (source)); - if (client) { - /* We already have it */ - - return TRUE; - } else { - ESource *default_source; - - if (priv->default_client[source_type]) { - default_source = e_cal_get_source (priv->default_client[source_type]); - - g_message ("Check if default client matches (%s %s)", e_source_peek_uid (default_source), e_source_peek_uid (source)); - /* We don't have it but the default client is it */ - if (!strcmp (e_source_peek_uid (default_source), e_source_peek_uid (source))) - client = g_object_ref (priv->default_client[source_type]); - } - - /* Create a new one */ - if (!client) { - client = auth_new_cal_from_source (source, source_type); - if (!client) - return FALSE; - } - } - - g_signal_connect (G_OBJECT (client), "backend_error", G_CALLBACK (backend_error_cb), gcal); - g_signal_connect (G_OBJECT (client), "backend_died", G_CALLBACK (backend_died_cb), gcal); - - /* add the client to internal structure */ - g_hash_table_insert (priv->clients[source_type], g_strdup (e_source_peek_uid (source)), client); - priv->clients_list[source_type] = g_list_prepend (priv->clients_list[source_type], client); - - g_signal_emit (gcal, gnome_calendar_signals[SOURCE_ADDED], 0, source_type, source); - - open_ecal (gcal, client, FALSE, client_cal_opened_cb); - - return TRUE; + return gcal->priv->model; } /** @@ -3333,80 +2188,61 @@ gnome_calendar_add_source (GnomeCalendar *gcal, ECalSourceType source_type, ESou * Returns: TRUE if successful, FALSE otherwise. */ gboolean -gnome_calendar_remove_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source) +gnome_calendar_remove_source (GnomeCalendar *gcal, ESource *source) { gboolean result; - g_return_val_if_fail (gcal != NULL, FALSE); g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE); g_return_val_if_fail (E_IS_SOURCE (source), FALSE); - result = gnome_calendar_remove_source_by_uid (gcal, source_type, e_source_peek_uid (source)); + result = gnome_calendar_remove_source_by_uid (gcal, e_source_peek_uid (source)); if (result) - g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source); + g_signal_emit (gcal, signals[SOURCE_REMOVED], 0, source); return result; } gboolean -gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, ECalSourceType source_type, const gchar *uid) +gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, const gchar *uid) { GnomeCalendarPrivate *priv; ECal *client; ECalModel *model; GList *l; - g_return_val_if_fail (gcal != NULL, FALSE); g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE); g_return_val_if_fail (uid != NULL, FALSE); priv = gcal->priv; - client = g_hash_table_lookup (priv->clients[source_type], uid); + client = g_hash_table_lookup (priv->clients, uid); if (!client) return TRUE; - priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], client); + priv->clients_list = g_list_remove (priv->clients_list, client); g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, gcal); - switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: - /* remove the query for this client */ - for (l = priv->dn_queries; l != NULL; l = l->next) { - ECalView *query = l->data; + /* remove the query for this client */ + for (l = priv->dn_queries; l != NULL; l = l->next) { + ECalView *query = l->data; - if (query && (client == e_cal_view_get_client (query))) { - g_signal_handlers_disconnect_matched (query, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, gcal); - priv->dn_queries = g_list_remove (priv->dn_queries, query); - g_object_unref (query); - break; - } + if (query && (client == e_cal_view_get_client (query))) { + g_signal_handlers_disconnect_matched (query, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, gcal); + priv->dn_queries = g_list_remove (priv->dn_queries, query); + g_object_unref (query); + break; } + } - model = e_calendar_view_get_model (priv->views[priv->current_view_type]); - e_cal_model_remove_client (model, client); - - /* update date navigator query */ - update_query (gcal); - break; - - case E_CAL_SOURCE_TYPE_TODO: - model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)); - e_cal_model_remove_client (model, client); - break; - - case E_CAL_SOURCE_TYPE_JOURNAL: - model = e_memo_table_get_model (E_MEMO_TABLE (priv->memo)); - e_cal_model_remove_client (model, client); - break; + model = gnome_calendar_get_model (gcal); + e_cal_model_remove_client (model, client); - default: - g_return_val_if_reached (TRUE); - } + /* update date navigator query */ + gnome_calendar_update_query (gcal); - g_hash_table_remove (priv->clients[source_type], uid); + g_hash_table_remove (priv->clients, uid); return TRUE; } @@ -3424,68 +2260,58 @@ gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, ECalSourceType source_ * otherwise **/ gboolean -gnome_calendar_set_default_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source) +gnome_calendar_set_default_source (GnomeCalendar *gcal, ESource *source) { GnomeCalendarPrivate *priv; ECal *client; - g_return_val_if_fail (gcal != NULL, FALSE); g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE); g_return_val_if_fail (E_IS_SOURCE (source), FALSE); priv = gcal->priv; - client = g_hash_table_lookup (priv->clients[source_type], e_source_peek_uid (source)); + client = g_hash_table_lookup (priv->clients, e_source_peek_uid (source)); - if (priv->default_client[source_type]) - g_object_unref (priv->default_client[source_type]); + if (priv->default_client) + g_object_unref (priv->default_client); if (client) { - priv->default_client[source_type] = g_object_ref (client); + priv->default_client = g_object_ref (client); } else { - priv->default_client[source_type] = auth_new_cal_from_source (source, source_type); - if (!priv->default_client[source_type]) + priv->default_client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT); + if (!priv->default_client) return FALSE; } - open_ecal (gcal, priv->default_client[source_type], FALSE, default_client_cal_opened_cb); + open_ecal (gcal, priv->default_client, FALSE, default_client_cal_opened_cb); return TRUE; } -void -gnome_calendar_set_selected_time_range (GnomeCalendar *gcal, - time_t start_time, - time_t end_time) +gboolean +gnome_calendar_get_range_selected (GnomeCalendar *gcal) { - update_view_times (gcal, start_time); - gnome_calendar_update_date_navigator (gcal); - gnome_calendar_notify_dates_shown_changed (gcal); + g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE); + + return gcal->priv->range_selected; } -/** - * gnome_calendar_get_selected_time_range: - * @gcal: A calendar view. - * @start_time: Return value for the start of the time selection. - * @end_time: Return value for the end of the time selection. - * - * Queries the time selection range on the calendar view. - **/ void -gnome_calendar_get_selected_time_range (GnomeCalendar *gcal, - time_t *start_time, - time_t *end_time) +gnome_calendar_set_range_selected (GnomeCalendar *gcal, + gboolean range_selected) { - GnomeCalendarPrivate *priv; - ECalModel *model; - - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - priv = gcal->priv; + gcal->priv->range_selected = range_selected; +} - model = e_calendar_view_get_model (priv->views[priv->current_view_type]); - e_cal_model_get_time_range (model, start_time, end_time); +void +gnome_calendar_set_selected_time_range (GnomeCalendar *gcal, + time_t start_time) +{ + gnome_calendar_update_view_times (gcal, start_time); + gnome_calendar_update_date_navigator (gcal); + gnome_calendar_notify_dates_shown_changed (gcal); } /** @@ -3496,6 +2322,7 @@ gnome_calendar_get_selected_time_range (GnomeCalendar *gcal, * * Opens a task editor dialog for a new task. dtstart or dtend can be NULL. **/ +#if 0 /* KILL-BONOBO */ void gnome_calendar_new_task (GnomeCalendar *gcal, time_t *dtstart, time_t *dtend) { @@ -3510,7 +2337,6 @@ gnome_calendar_new_task (GnomeCalendar *gcal, time_t *dtstart, time_t *dtend) ECalComponentDateTime dt; struct icaltimetype itt; - g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); priv = gcal->priv; @@ -3526,9 +2352,6 @@ gnome_calendar_new_task (GnomeCalendar *gcal, time_t *dtstart, time_t *dtend) comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomp); - category = cal_search_bar_get_category (CAL_SEARCH_BAR (priv->search_bar)); - e_cal_component_set_categories (comp, category); - dt.value = &itt; dt.tzid = icaltimezone_get_tzid (e_cal_model_get_timezone (model)); @@ -3550,6 +2373,7 @@ gnome_calendar_new_task (GnomeCalendar *gcal, time_t *dtstart, time_t *dtend) gtk_window_present (GTK_WINDOW (editor)); } +#endif /* Returns the selected time range for the current view. Note that this may be different from the fields in the GnomeCalendar, since the view may clip @@ -3559,25 +2383,13 @@ gnome_calendar_get_current_time_range (GnomeCalendar *gcal, time_t *start_time, time_t *end_time) { - e_calendar_view_get_selected_time_range (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)), - start_time, end_time); -} - -/* Gets the visible time range for the current view. Returns FALSE if no - time range has been set yet. */ -gboolean -gnome_calendar_get_visible_time_range (GnomeCalendar *gcal, - time_t *start_time, - time_t *end_time) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE); + GnomeCalendarViewType view_type; + ECalendarView *view; - retval = e_calendar_view_get_visible_time_range (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal)), - start_time, end_time); + view_type = gnome_calendar_get_view (gcal); + view = gnome_calendar_get_calendar_view (gcal, view_type); - return retval; + e_calendar_view_get_selected_time_range (view, start_time, end_time); } /* This updates the month shown and the days selected in the calendar, if @@ -3588,10 +2400,16 @@ gnome_calendar_update_date_navigator (GnomeCalendar *gcal) GnomeCalendarPrivate *priv; ECalModel *model; time_t start, end; + gint week_start_day; GDate start_date, end_date; + icaltimezone *timezone; priv = gcal->priv; + /* If the ECalendar is not yet set, we just return. */ + if (priv->date_navigator == NULL) + return; + /* If the ECalendar isn't visible, we just return. */ if (!GTK_WIDGET_VISIBLE (priv->date_navigator)) return; @@ -3599,163 +2417,39 @@ gnome_calendar_update_date_navigator (GnomeCalendar *gcal) if (priv->current_view_type == GNOME_CAL_LIST_VIEW && !priv->lview_select_daten_range) return; - model = e_calendar_view_get_model (priv->views[priv->current_view_type]); + model = gnome_calendar_get_model (gcal); + timezone = e_cal_model_get_timezone (model); + week_start_day = e_cal_model_get_week_start_day (model); e_cal_model_get_time_range (model, &start, &end); - time_to_gdate_with_zone (&start_date, start, priv->zone); + time_to_gdate_with_zone (&start_date, start, timezone); if (priv->current_view_type == GNOME_CAL_MONTH_VIEW) { EWeekView *week_view = E_WEEK_VIEW (priv->views[priv->current_view_type]); - if (priv->week_start == 0 + if (week_start_day == 0 && (!week_view->multi_week_view || week_view->compress_weekend)) g_date_add_days (&start_date, 1); } - time_to_gdate_with_zone (&end_date, end, priv->zone); + time_to_gdate_with_zone (&end_date, end, timezone); g_date_subtract_days (&end_date, 1); e_calendar_item_set_selection (priv->date_navigator->calitem, &start_date, &end_date); } -static void -gnome_calendar_on_date_navigator_selection_changed (ECalendarItem *calitem, GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - GnomeCalendarViewType view_type; - ECalModel *model; - GDate start_date, end_date, new_start_date, new_end_date; - gint new_days_shown; - gboolean starts_on_week_start_day; - time_t new_time, start, end; - struct icaltimetype tt; - - priv = gcal->priv; - - starts_on_week_start_day = FALSE; - - model = e_calendar_view_get_model (priv->views[priv->current_view_type]); - e_cal_model_get_time_range (model, &start, &end); - - time_to_gdate_with_zone (&start_date, start, priv->zone); - if (priv->current_view_type == GNOME_CAL_MONTH_VIEW) { - EWeekView *week_view = E_WEEK_VIEW (priv->views[priv->current_view_type]); - - if (priv->week_start == 0 && (!week_view->multi_week_view || week_view->compress_weekend)) - g_date_add_days (&start_date, 1); - } - time_to_gdate_with_zone (&end_date, end, priv->zone); - g_date_subtract_days (&end_date, 1); - - e_calendar_item_get_selection (calitem, &new_start_date, &new_end_date); - - /* If the selection hasn't changed just return. */ - if (!g_date_compare (&start_date, &new_start_date) - && !g_date_compare (&end_date, &new_end_date)) { - return; - } - - new_days_shown = g_date_get_julian (&new_end_date) - g_date_get_julian (&new_start_date) + 1; - - /* If a complete week is selected we show the Week view. - Note that if weekends are compressed and the week start day is set - to Sunday we don't actually show complete weeks in the Week view, - so this may need tweaking. */ - if (g_date_get_weekday (&new_start_date) % 7 == priv->week_start) - starts_on_week_start_day = TRUE; - - /* Update selection to be in the new time range */ - tt = icaltime_null_time (); - tt.year = g_date_get_year (&new_start_date); - tt.month = g_date_get_month (&new_start_date); - tt.day = g_date_get_day (&new_start_date); - new_time = icaltime_as_timet_with_zone (tt, priv->zone); - - /* Switch views as appropriate, and change the number of days or weeks - shown. */ - if (new_days_shown > 9) { - /* FIXME Gross hack so that the view times are updated properly */ - priv->range_selected = TRUE; - - if (priv->current_view_type != GNOME_CAL_LIST_VIEW) { - e_week_view_set_weeks_shown (E_WEEK_VIEW (priv->month_view), - (new_days_shown + 6) / 7); - view_type = GNOME_CAL_MONTH_VIEW; - } else - view_type = GNOME_CAL_LIST_VIEW; - } else if (new_days_shown == 7 && starts_on_week_start_day) { - view_type = GNOME_CAL_WEEK_VIEW; - } else { - e_day_view_set_days_shown (E_DAY_VIEW (priv->day_view), new_days_shown); - - if (new_days_shown == 5 && starts_on_week_start_day - && priv->current_view_type == GNOME_CAL_WORK_WEEK_VIEW) - view_type = GNOME_CAL_WORK_WEEK_VIEW; - else - view_type = GNOME_CAL_DAY_VIEW; - } - - /* Make the views display things properly */ - update_view_times (gcal, new_time); - set_view (gcal, view_type, TRUE); - - gnome_calendar_notify_dates_shown_changed (gcal); -} - -static void -gnome_calendar_on_date_navigator_date_range_changed (ECalendarItem *calitem, GnomeCalendar *gcal) -{ - update_query (gcal); -} - -static void -gnome_calendar_hpane_realized (GtkWidget *w, GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - - priv = gcal->priv; - - if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) { - gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos_month_view); - } else { - gtk_paned_set_position (GTK_PANED (priv->hpane), priv->hpane_pos); - } -} - -static void -gnome_calendar_date_navigator_scrolled (GtkWidget *widget, GdkEventScroll *event, gpointer user_data) -{ - GnomeCalendar *gcal = user_data; - ECalendarItem *calitem = gcal->priv->date_navigator->calitem; - GDate start_date, end_date; - - if (e_calendar_item_get_selection (calitem, &start_date, &end_date)) { - switch (event->direction) { - case GDK_SCROLL_UP: - g_date_subtract_months (&start_date, 1); - g_date_subtract_months (&end_date, 1); - break; - case GDK_SCROLL_DOWN: - g_date_add_months (&start_date, 1); - g_date_add_months (&end_date, 1); - break; - default: - break; - - } - e_calendar_item_set_selection (calitem, &start_date, &end_date); - gnome_calendar_on_date_navigator_selection_changed (calitem, gcal); - } -} - static gboolean gnome_calendar_hpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal) { GnomeCalendarPrivate *priv; + ECalendarView *view; + gboolean range_selected; gint times_width; priv = gcal->priv; - if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) { + range_selected = gnome_calendar_get_range_selected (gcal); + + if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !range_selected) { priv->hpane_pos_month_view = gtk_paned_get_position (GTK_PANED (priv->hpane)); calendar_config_set_month_hpane_pos (priv->hpane_pos_month_view); } else { @@ -3764,124 +2458,37 @@ gnome_calendar_hpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gc } /* adjust the size of the EDayView's time column */ + view = gnome_calendar_get_calendar_view (gcal, GNOME_CAL_DAY_VIEW); times_width = e_day_view_time_item_get_column_width ( - E_DAY_VIEW_TIME_ITEM (E_DAY_VIEW (priv->day_view)->time_canvas_item)); + E_DAY_VIEW_TIME_ITEM (E_DAY_VIEW (view)->time_canvas_item)); if (times_width < priv->hpane_pos - 20) - gtk_widget_set_size_request (E_DAY_VIEW (priv->day_view)->time_canvas, times_width, -1); + gtk_widget_set_size_request (E_DAY_VIEW (view)->time_canvas, times_width, -1); else - gtk_widget_set_size_request (E_DAY_VIEW (priv->day_view)->time_canvas, priv->hpane_pos - 20, -1); - - return FALSE; -} -static void -gnome_calendar_vpane_realized (GtkWidget *w, GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - - priv = gcal->priv; - - if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) { - gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos_month_view); - } else { - gtk_paned_set_position (GTK_PANED (priv->vpane), priv->vpane_pos); - } -} - -static gboolean -gnome_calendar_vpane_resized (GtkWidget *w, GdkEventButton *e, GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - - priv = gcal->priv; - - if (priv->current_view_type == GNOME_CAL_MONTH_VIEW && !priv->range_selected) { - priv->vpane_pos_month_view = gtk_paned_get_position (GTK_PANED (priv->vpane)); - calendar_config_set_month_vpane_pos (priv->vpane_pos_month_view); - } else { - priv->vpane_pos = gtk_paned_get_position (GTK_PANED (priv->vpane)); - calendar_config_set_vpane_pos (priv->vpane_pos); - } + gtk_widget_set_size_request (E_DAY_VIEW (view)->time_canvas, priv->hpane_pos - 20, -1); return FALSE; } void -gnome_calendar_cut_clipboard (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - FocusLocation location; - - priv = gcal->priv; - - location = get_focus_location (gcal); - - if (location == FOCUS_CALENDAR) { - e_calendar_view_cut_clipboard (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal))); - } else if (location == FOCUS_TASKPAD) - e_calendar_table_cut_clipboard (E_CALENDAR_TABLE (priv->todo)); - else if (location == FOCUS_MEMOPAD) - e_memo_table_cut_clipboard (E_MEMO_TABLE (priv->memo)); -} - -void -gnome_calendar_copy_clipboard (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - FocusLocation location; - - priv = gcal->priv; - - location = get_focus_location (gcal); - - if (location == FOCUS_CALENDAR) { - e_calendar_view_copy_clipboard (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal))); - } else if (location == FOCUS_TASKPAD) - e_calendar_table_copy_clipboard (E_CALENDAR_TABLE (priv->todo)); - else if (location == FOCUS_MEMOPAD) - e_memo_table_copy_clipboard (E_MEMO_TABLE (priv->memo)); -} - -void -gnome_calendar_paste_clipboard (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - FocusLocation location; - - priv = gcal->priv; - - location = get_focus_location (gcal); - - if (location == FOCUS_CALENDAR) { - e_calendar_view_paste_clipboard (E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (gcal))); - } else if (location == FOCUS_TASKPAD) - e_calendar_table_paste_clipboard (E_CALENDAR_TABLE (priv->todo)); - else if (location == FOCUS_MEMOPAD) - e_memo_table_paste_clipboard (E_MEMO_TABLE (priv->memo)); -} - -/* Get the current timezone. */ -icaltimezone* -gnome_calendar_get_timezone (GnomeCalendar *gcal) -{ - g_return_val_if_fail (gcal != NULL, NULL); - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return gcal->priv->zone; -} - -static void gnome_calendar_notify_dates_shown_changed (GnomeCalendar *gcal) { + GnomeCalendarViewType view_type; + ECalendarView *calendar_view; GnomeCalendarPrivate *priv; time_t start_time, end_time; + gboolean has_time_range; g_return_if_fail (GNOME_IS_CALENDAR (gcal)); priv = gcal->priv; + view_type = gnome_calendar_get_view (gcal); + calendar_view = gnome_calendar_get_calendar_view (gcal, view_type); + /* If no time range is set yet, just return. */ - if (!gnome_calendar_get_visible_time_range (gcal, &start_time, - &end_time)) + has_time_range = e_calendar_view_get_visible_time_range ( + calendar_view, &start_time, &end_time); + if (!has_time_range) return; /* We check if the visible date range has changed, and only emit the @@ -3892,7 +2499,7 @@ gnome_calendar_notify_dates_shown_changed (GnomeCalendar *gcal) priv->visible_start = start_time; priv->visible_end = end_time; - g_signal_emit (gcal, gnome_calendar_signals[DATES_SHOWN_CHANGED], 0); + g_signal_emit (gcal, signals[DATES_SHOWN_CHANGED], 0); } update_memo_view (gcal); } @@ -3901,12 +2508,15 @@ gnome_calendar_notify_dates_shown_changed (GnomeCalendar *gcal) gint gnome_calendar_get_num_events_selected (GnomeCalendar *gcal) { - GtkWidget *view; + GnomeCalendarViewType view_type; + ECalendarView *view; gint retval = 0; g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), 0); - view = gnome_calendar_get_current_view_widget (gcal); + view_type = gnome_calendar_get_view (gcal); + view = gnome_calendar_get_calendar_view (gcal, view_type); + if (E_IS_DAY_VIEW (view)) retval = e_day_view_get_num_events_selected (E_DAY_VIEW (view)); else @@ -3915,70 +2525,6 @@ gnome_calendar_get_num_events_selected (GnomeCalendar *gcal) return retval; } -/** - * gnome_calendar_get_num_tasks_selected: - * @gcal: A calendar view. - * - * Queries the number of tasks that are currently selected in the task pad of a - * calendar view. - * - * Return value: Number of selected tasks. - **/ -gint -gnome_calendar_get_num_tasks_selected (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - ETable *etable; - - g_return_val_if_fail (gcal != NULL, -1); - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), -1); - - priv = gcal->priv; - - etable = e_calendar_table_get_table (E_CALENDAR_TABLE (priv->todo)); - return e_table_selected_count (etable); -} - -void -gnome_calendar_delete_selection (GnomeCalendar *gcal) -{ - GnomeCalendarPrivate *priv; - FocusLocation location; - GtkWidget *view; - - g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - - priv = gcal->priv; - - location = get_focus_location (gcal); - - if (location == FOCUS_CALENDAR) { - view = gnome_calendar_get_current_view_widget (gcal); - - e_calendar_view_delete_selected_events (E_CALENDAR_VIEW (view)); - } else if (location == FOCUS_TASKPAD) - e_calendar_table_delete_selected (E_CALENDAR_TABLE (priv->todo)); - else if (location == FOCUS_MEMOPAD) - e_memo_table_delete_selected (E_MEMO_TABLE (priv->memo)); -} - -void -gnome_calendar_delete_selected_occurrence (GnomeCalendar *gcal) -{ - FocusLocation location; - GtkWidget *view; - - g_return_if_fail (GNOME_IS_CALENDAR (gcal)); - - location = get_focus_location (gcal); - - if (location == FOCUS_CALENDAR) { - - view = gnome_calendar_get_current_view_widget (gcal); - e_calendar_view_delete_selected_occurrence (E_CALENDAR_VIEW (view)); - } -} - static gboolean check_instance_cb (ECalComponent *comp, time_t instance_start, @@ -4009,10 +2555,10 @@ gnome_calendar_purge (GnomeCalendar *gcal, time_t older_than) " (make-time \"%s\"))", start, end); - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), _("Purging"), -1); + /*e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), _("Purging"), -1); KILL-BONOBO */ /* FIXME Confirm expunge */ - for (l = priv->clients_list[E_CAL_SOURCE_TYPE_EVENT]; l != NULL; l = l->next) { + for (l = priv->clients_list; l != NULL; l = l->next) { ECal *client = l->data; GList *objects, *m; gboolean read_only; @@ -4067,101 +2613,10 @@ gnome_calendar_purge (GnomeCalendar *gcal, time_t older_than) g_list_free (objects); } - e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); + /* e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1); KILL-BONOBO */ g_free (sexp); g_free (start); g_free (end); } - -ECalendarTable* -gnome_calendar_get_task_pad (GnomeCalendar *gcal) -{ - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return E_CALENDAR_TABLE (gcal->priv->todo); -} - -GtkWidget * -gnome_calendar_get_e_calendar_widget (GnomeCalendar *gcal) -{ - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return GTK_WIDGET(gcal->priv->date_navigator); -} - -GtkWidget * -gnome_calendar_get_search_bar_widget (GnomeCalendar *gcal) -{ - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return GTK_WIDGET(gcal->priv->search_bar); -} - -GtkWidget * -gnome_calendar_get_view_notebook_widget (GnomeCalendar *gcal) -{ - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return GTK_WIDGET(gcal->priv->notebook); -} - -ECalMenu *gnome_calendar_get_taskpad_menu (GnomeCalendar *gcal) -{ - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return gcal->priv->taskpad_menu; -} - -ECalMenu *gnome_calendar_get_calendar_menu (GnomeCalendar *gcal) -{ - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return gcal->priv->calendar_menu; -} - -ECalMenu *gnome_calendar_get_memopad_menu (GnomeCalendar *gcal) -{ - g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); - - return gcal->priv->memopad_menu; -} - -void -gnome_calendar_edit_appointment (GnomeCalendar *gcal, - const gchar * src_uid, - const gchar * comp_uid, - const gchar * comp_rid) -{ - ECal *client = NULL; - GList *l; - icalcomponent* icalcomp = NULL; - icalproperty *attendee_prop = NULL; - - if (!src_uid || !comp_uid) - return; - - for (l = gcal->priv->clients_list[E_CAL_SOURCE_TYPE_EVENT]; l != NULL; l = l->next) { - ESource *client_src; - - client = l->data; - client_src = e_cal_get_source (client); - - if (!strcmp (src_uid, e_source_peek_uid (client_src))) - break; - } - - if (!client) - return; - - e_cal_get_object (client, comp_uid, comp_rid, &icalcomp, NULL); - - if (!icalcomp) - return; - - attendee_prop = icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY); - e_calendar_view_edit_appointment (gcal->priv->views[gcal->priv->current_view_type], - client, icalcomp, attendee_prop ? TRUE:FALSE); - icalcomponent_free (icalcomp); -} |