diff options
author | Rodrigo Moya <rodrigo@ximian.com> | 2003-07-23 05:13:38 +0800 |
---|---|---|
committer | Rodrigo Moya <rodrigo@src.gnome.org> | 2003-07-23 05:13:38 +0800 |
commit | 806e63b32a7fdca4899d89ba236a0eb64726707c (patch) | |
tree | b16e3db0eb30e98b7a700d6854310f3a736c1062 | |
parent | 2c6ab566c91705955a8de51a2937fa97f2a79d91 (diff) | |
download | gsoc2013-evolution-806e63b32a7fdca4899d89ba236a0eb64726707c.tar gsoc2013-evolution-806e63b32a7fdca4899d89ba236a0eb64726707c.tar.gz gsoc2013-evolution-806e63b32a7fdca4899d89ba236a0eb64726707c.tar.bz2 gsoc2013-evolution-806e63b32a7fdca4899d89ba236a0eb64726707c.tar.lz gsoc2013-evolution-806e63b32a7fdca4899d89ba236a0eb64726707c.tar.xz gsoc2013-evolution-806e63b32a7fdca4899d89ba236a0eb64726707c.tar.zst gsoc2013-evolution-806e63b32a7fdca4899d89ba236a0eb64726707c.zip |
added "get_selected_events", and "update_query" virtual methods.
2003-07-22 Rodrigo Moya <rodrigo@ximian.com>
* gui/e-cal-view.[ch]: added "get_selected_events",
and "update_query" virtual methods.
(e_cal_view_class_init): initialize new virtual methods.
(e_cal_view_destroy): destroy new private members.
(e_cal_view_get_selected_events, e_cal_view_set_cal_client,
e_cal_view_get_cal_client): new functions.
(e_cal_view_cut_clipboard, e_cal_view_copy_clipboard,
e_cal_view_paste_clipboard): merged clipboard stuff.
* gui/e-day-view.c (e_day_view_cut_clipboard,
e_day_view_copy_clipboard, e_day_view_paste_clipboard): removed.
(e_day_view_get_selected_events): made these private as the
implementation of the 'get_selected_events' base class virtual method.
* gui/e-week-view.c (e_week_view_get_selected_events): ditto.
(e_week_view_cut_clipboard, e_week_view_copy_clipboard,
e_week_view_paste_clipboard): removed.
* gui/calendar-commands.c (sensitize_calendar_commands): call
e_cal_view_get_selected_events.
* gui/gnome-cal.c: removed a lot of redundant code thanks to the
above changes.
svn path=/trunk/; revision=21893
-rw-r--r-- | calendar/ChangeLog | 26 | ||||
-rw-r--r-- | calendar/gui/calendar-commands.c | 12 | ||||
-rw-r--r-- | calendar/gui/e-cal-view.c | 421 | ||||
-rw-r--r-- | calendar/gui/e-cal-view.h | 19 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 421 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.h | 19 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 726 | ||||
-rw-r--r-- | calendar/gui/e-day-view.h | 24 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 647 | ||||
-rw-r--r-- | calendar/gui/e-week-view.h | 26 | ||||
-rw-r--r-- | calendar/gui/gnome-cal.c | 94 |
11 files changed, 1249 insertions, 1186 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index b84625c773..3f3b46b0a5 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,29 @@ +2003-07-22 Rodrigo Moya <rodrigo@ximian.com> + + * gui/e-cal-view.[ch]: added "get_selected_events", + and "update_query" virtual methods. + (e_cal_view_class_init): initialize new virtual methods. + (e_cal_view_destroy): destroy new private members. + (e_cal_view_get_selected_events, e_cal_view_set_cal_client, + e_cal_view_get_cal_client): new functions. + (e_cal_view_cut_clipboard, e_cal_view_copy_clipboard, + e_cal_view_paste_clipboard): merged clipboard stuff. + + * gui/e-day-view.c (e_day_view_cut_clipboard, + e_day_view_copy_clipboard, e_day_view_paste_clipboard): removed. + (e_day_view_get_selected_events): made these private as the + implementation of the 'get_selected_events' base class virtual method. + + * gui/e-week-view.c (e_week_view_get_selected_events): ditto. + (e_week_view_cut_clipboard, e_week_view_copy_clipboard, + e_week_view_paste_clipboard): removed. + + * gui/calendar-commands.c (sensitize_calendar_commands): call + e_cal_view_get_selected_events. + + * gui/gnome-cal.c: removed a lot of redundant code thanks to the + above changes. + 2003-07-21 Rodrigo Moya <rodrigo@ximian.com> * gui/e-day-view.[ch]: removed e_day_view_set_calendar prototype. diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c index 82cf5e1976..8f2aba9988 100644 --- a/calendar/gui/calendar-commands.c +++ b/calendar/gui/calendar-commands.c @@ -8,6 +8,7 @@ * Authors: Miguel de Icaza <miguel@ximian.com> * Federico Mena-Quintero <federico@ximian.com> * Seth Alves <alves@hungry.com> + * Rodrigo Moya <rodrigo@ximian.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public @@ -598,14 +599,15 @@ sensitize_calendar_commands (GnomeCalendar *gcal, BonoboControl *control, gboole has_recurrences = FALSE; if (n_selected > 0 && !read_only) { CalComponent *comp; + GList *list; GtkWidget *view; view = gnome_calendar_get_current_view_widget (gcal); - if (E_IS_DAY_VIEW (view)) - comp = e_day_view_get_selected_event (E_DAY_VIEW (view)); - else if (E_IS_WEEK_VIEW (view)) - comp = e_week_view_get_selected_event (E_WEEK_VIEW (view)); - else + list = e_cal_view_get_selected_events (E_CAL_VIEW (view)); + if (list) { + comp = (CalComponent *) list->data; + g_list_free (list); + } else comp = NULL; if (comp) { diff --git a/calendar/gui/e-cal-view.c b/calendar/gui/e-cal-view.c index 6272f0eab9..1b4676beb8 100644 --- a/calendar/gui/e-cal-view.c +++ b/calendar/gui/e-cal-view.c @@ -22,9 +22,17 @@ */ #include <config.h> +#include <string.h> +#include <gtk/gtkinvisible.h> +#include <libgnome/gnome-i18n.h> #include <gal/util/e-util.h> #include "evolution-activity-client.h" +#include "calendar-config.h" #include "e-cal-view.h" +#include "itip-utils.h" +#include "dialogs/cancel-comp.h" +#include "dialogs/delete-error.h" +#include "dialogs/send-comp.h" /* Used for the status bar messages */ #define EVOLUTION_CALENDAR_PROGRESS_IMAGE "evolution-calendar-mini.png" @@ -34,8 +42,18 @@ struct _ECalViewPrivate { /* The GnomeCalendar we are associated to */ GnomeCalendar *calendar; + /* Calendar client we are monitoring */ + CalClient *client; + + /* Search expression */ + gchar *sexp; + /* The activity client used to show messages on the status bar. */ EvolutionActivityClient *activity; + + /* the invisible widget to manage the clipboard selections */ + GtkWidget *invisible; + gchar *clipboard_selection; }; static void e_cal_view_class_init (ECalViewClass *klass); @@ -43,6 +61,7 @@ static void e_cal_view_init (ECalView *cal_view, ECalViewClass *klass); static void e_cal_view_destroy (GtkObject *object); static GObjectClass *parent_class = NULL; +static GdkAtom clipboard_atom = GDK_NONE; /* Signal IDs */ enum { @@ -73,12 +92,203 @@ e_cal_view_class_init (ECalViewClass *klass) object_class->destroy = e_cal_view_destroy; klass->selection_changed = NULL; + klass->get_selected_events = NULL; + klass->get_selected_time_range = NULL; + klass->set_selected_time_range = NULL; + klass->update_query = NULL; + + /* clipboard atom */ + if (!clipboard_atom) + clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); +} + +static void +selection_get (GtkWidget *invisible, + GtkSelectionData *selection_data, + guint info, + guint time_stamp, + ECalView *cal_view) +{ + if (cal_view->priv->clipboard_selection != NULL) { + gtk_selection_data_set (selection_data, + GDK_SELECTION_TYPE_STRING, + 8, + cal_view->priv->clipboard_selection, + strlen (cal_view->priv->clipboard_selection)); + } +} + +static void +selection_clear_event (GtkWidget *invisible, + GdkEventSelection *event, + ECalView *cal_view) +{ + if (cal_view->priv->clipboard_selection != NULL) { + g_free (cal_view->priv->clipboard_selection); + cal_view->priv->clipboard_selection = NULL; + } +} + +static void +selection_received (GtkWidget *invisible, + GtkSelectionData *selection_data, + guint time, + ECalView *cal_view) +{ + char *comp_str, *default_tzid; + icalcomponent *icalcomp; + icalcomponent_kind kind; + CalComponent *comp; + time_t selected_time_start, selected_time_end; + struct icaltimetype itime; + struct icaltimetype tmp_itime; + time_t tt_start, tt_end; + struct icaldurationtype ic_dur; + char *uid; + CalComponentDateTime ccdt; + icaltimezone *default_zone; + + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (selection_data->length < 0 || + selection_data->type != GDK_SELECTION_TYPE_STRING) { + return; + } + + comp_str = (char *) selection_data->data; + icalcomp = icalparser_parse_string ((const char *) comp_str); + if (!icalcomp) + return; + + default_tzid = calendar_config_get_timezone (); + cal_client_get_timezone (cal_view->priv->client, default_tzid, &default_zone); + + /* check the type of the component */ + kind = icalcomponent_isa (icalcomp); + if (kind != ICAL_VCALENDAR_COMPONENT && + kind != ICAL_VEVENT_COMPONENT && + kind != ICAL_VTODO_COMPONENT && + kind != ICAL_VJOURNAL_COMPONENT) { + return; + } + + e_cal_view_set_status_message (cal_view, _("Updating objects")); + e_cal_view_get_selected_time_range (cal_view, &selected_time_start, &selected_time_end); + + if (kind == ICAL_VCALENDAR_COMPONENT) { + icalcomponent_kind child_kind; + icalcomponent *subcomp; + + subcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT); + while (subcomp) { + child_kind = icalcomponent_isa (subcomp); + if (child_kind == ICAL_VEVENT_COMPONENT || + child_kind == ICAL_VTODO_COMPONENT || + child_kind == ICAL_VJOURNAL_COMPONENT) { + icalcomponent *new_icalcomp; + + new_icalcomp = icalcomponent_new_clone (subcomp); + comp = cal_component_new (); + + /* change the day for the event */ + tt_start = icaltime_as_timet ( + icalcomponent_get_dtstart (new_icalcomp)); + tt_end = icaltime_as_timet ( + icalcomponent_get_dtend (new_icalcomp)); + ic_dur = icaldurationtype_from_int (tt_end - tt_start); + + tmp_itime = icaltime_from_timet_with_zone ( + selected_time_start, FALSE, default_zone); + itime = icalcomponent_get_dtstart (new_icalcomp); + itime.year = tmp_itime.year; + itime.month = tmp_itime.month; + itime.day = tmp_itime.day; + + cal_component_set_icalcomponent (comp, new_icalcomp); + ccdt.value = &itime; + ccdt.tzid = icaltimezone_get_tzid (default_zone); + cal_component_set_dtstart (comp, &ccdt); + + itime = icaltime_add (itime, ic_dur); + ccdt.value = &itime; + cal_component_set_dtend (comp, &ccdt); + + uid = cal_component_gen_uid (); + cal_component_set_uid (comp, uid); + + cal_client_update_object (cal_view->priv->client, comp); + + g_free (uid); + g_object_unref (comp); + } + subcomp = icalcomponent_get_next_component ( + icalcomp, ICAL_ANY_COMPONENT); + } + + icalcomponent_free (icalcomp); + + } + else { + comp = cal_component_new (); + + /* change the day for the event */ + tt_start = icaltime_as_timet (icalcomponent_get_dtstart (icalcomp)); + tt_end = icaltime_as_timet (icalcomponent_get_dtend (icalcomp)); + ic_dur = icaldurationtype_from_int (tt_end - tt_start); + + tmp_itime = icaltime_from_timet_with_zone ( + selected_time_start, FALSE, default_zone); + itime = icalcomponent_get_dtstart (icalcomp); + itime.year = tmp_itime.year; + itime.month = tmp_itime.month; + itime.day = tmp_itime.day; + + cal_component_set_icalcomponent (comp, icalcomp); + ccdt.value = &itime; + ccdt.tzid = icaltimezone_get_tzid (default_zone); + cal_component_set_dtstart (comp, &ccdt); + + itime = icaltime_add (itime, ic_dur); + ccdt.value = &itime; + cal_component_set_dtend (comp, &ccdt); + + uid = cal_component_gen_uid (); + cal_component_set_uid (comp, (const char *) uid); + + cal_client_update_object (cal_view->priv->client, comp); + + if (itip_organizer_is_user (comp, cal_view->priv->client) && + send_component_dialog (gtk_widget_get_toplevel (cal_view), cal_view->priv->client, comp, TRUE)) + itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, cal_view->priv->client, NULL); + + g_free (uid); + g_object_unref (comp); + } + + e_cal_view_set_status_message (cal_view, NULL); } static void e_cal_view_init (ECalView *cal_view, ECalViewClass *klass) { cal_view->priv = g_new0 (ECalViewPrivate, 1); + + cal_view->priv->sexp = g_strdup ("#t"); /* match all by default */ + + /* Set up the invisible widget for the clipboard selections */ + cal_view->priv->invisible = gtk_invisible_new (); + gtk_selection_add_target (cal_view->priv->invisible, + clipboard_atom, + GDK_SELECTION_TYPE_STRING, + 0); + g_signal_connect (cal_view->priv->invisible, "selection_get", + G_CALLBACK (selection_get), (gpointer) cal_view); + g_signal_connect (cal_view->priv->invisible, "selection_clear_event", + G_CALLBACK (selection_clear_event), (gpointer) cal_view); + g_signal_connect (cal_view->priv->invisible, "selection_received", + G_CALLBACK (selection_received), (gpointer) cal_view); + + cal_view->priv->clipboard_selection = NULL; } static void @@ -89,11 +299,31 @@ e_cal_view_destroy (GtkObject *object) g_return_if_fail (E_IS_CAL_VIEW (cal_view)); if (cal_view->priv) { + if (cal_view->priv->client) { + g_object_unref (cal_view->priv->client); + cal_view->priv->client = NULL; + } + + if (cal_view->priv->sexp) { + g_free (cal_view->priv->sexp); + cal_view->priv->sexp = NULL; + } + if (cal_view->priv->activity) { g_object_unref (cal_view->priv->activity); cal_view->priv->activity = NULL; } + if (cal_view->priv->invisible) { + gtk_widget_destroy (cal_view->priv->invisible); + cal_view->priv->invisible = NULL; + } + + if (cal_view->priv->clipboard_selection) { + g_free (cal_view->priv->clipboard_selection); + cal_view->priv->clipboard_selection = NULL; + } + g_free (cal_view->priv); cal_view->priv = NULL; } @@ -121,6 +351,72 @@ e_cal_view_set_calendar (ECalView *cal_view, GnomeCalendar *calendar) cal_view->priv->calendar = calendar; } +CalClient * +e_cal_view_get_cal_client (ECalView *cal_view) +{ + g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), NULL); + + return cal_view->priv->client; +} + +static void +cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer user_data) +{ + ECalView *cal_view = (ECalView *) user_data; + + if (status != CAL_CLIENT_OPEN_SUCCESS) + return; + + e_cal_view_update_query (cal_view); +} + +void +e_cal_view_set_cal_client (ECalView *cal_view, CalClient *client) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (client == cal_view->priv->client) + return; + + if (IS_CAL_CLIENT (client)) + g_object_ref (client); + + if (cal_view->priv->client) { + g_signal_handlers_disconnect_matched (cal_view->priv->client, G_SIGNAL_MATCH_DATA, 0, 0, + NULL, NULL, cal_view); + g_object_unref (cal_view->priv->client); + } + + cal_view->priv->client = client; + if (cal_view->priv->client) { + if (cal_client_get_load_state (cal_view->priv->client) == CAL_CLIENT_LOAD_LOADED) + e_cal_view_update_query (cal_view); + else + g_signal_connect (cal_view->priv->client, "cal_opened", + G_CALLBACK (cal_opened_cb), cal_view); + } +} + +const gchar * +e_cal_view_get_query (ECalView *cal_view) +{ + g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), NULL); + + return (const gchar *) cal_view->priv->sexp; +} + +void +e_cal_view_set_query (ECalView *cal_view, const gchar *sexp) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (cal_view->priv->sexp) + g_free (cal_view->priv->sexp); + + cal_view->priv->sexp = g_strdup (sexp); + e_cal_view_update_query (cal_view); +} + void e_cal_view_set_status_message (ECalView *cal_view, const gchar *message) { @@ -147,3 +443,128 @@ e_cal_view_set_status_message (ECalView *cal_view, const gchar *message) } else evolution_activity_client_update (cal_view->priv->activity, message, -1.0); } + +GList * +e_cal_view_get_selected_events (ECalView *cal_view) +{ + g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), NULL); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events) + return E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events (cal_view); + + return NULL; +} + +void +e_cal_view_get_selected_time_range (ECalView *cal_view, time_t *start_time, time_t *end_time) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range) { + E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range ( + cal_view, start_time, end_time); + } +} + +void +e_cal_view_set_selected_time_range (ECalView *cal_view, time_t start_time, time_t end_time) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range) { + E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range ( + cal_view, start_time, end_time); + } +} + +void +e_cal_view_update_query (ECalView *cal_view) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query) { + E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query (cal_view); + } +} + +void +e_cal_view_cut_clipboard (ECalView *cal_view) +{ + GList *selected, *l; + const char *uid; + + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + selected = e_cal_view_get_selected_events (cal_view); + if (!selected) + return; + + e_cal_view_set_status_message (cal_view, _("Deleting selected objects")); + + e_cal_view_copy_clipboard (cal_view); + for (l = selected; l != NULL; l = l->next) { + CalComponent *comp = l->data; + + if (itip_organizer_is_user (comp, cal_view->priv->client) + && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (cal_view), + cal_view->priv->client, comp, TRUE)) + itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, comp, cal_view->priv->client, NULL); + + cal_component_get_uid (comp, &uid); + delete_error_dialog (cal_client_remove_object (cal_view->priv->client, uid), + CAL_COMPONENT_EVENT); + } + + e_cal_view_set_status_message (cal_view, NULL); + + g_list_free (selected); +} + +void +e_cal_view_copy_clipboard (ECalView *cal_view) +{ + GList *selected, *l; + gchar *comp_str; + icalcomponent *vcal_comp; + icalcomponent *new_icalcomp; + + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + selected = e_cal_view_get_selected_events (cal_view); + if (!selected) + return; + + /* create top-level VCALENDAR component and add VTIMEZONE's */ + vcal_comp = cal_util_new_top_level (); + for (l = selected; l != NULL; l = l->next) + cal_util_add_timezones_from_component (vcal_comp, (CalComponent *) l->data); + + for (l = selected; l != NULL; l = l->next) { + CalComponent *comp = (CalComponent *) l->data; + + new_icalcomp = icalcomponent_new_clone (cal_component_get_icalcomponent (comp)); + icalcomponent_add_component (vcal_comp, new_icalcomp); + } + + /* copy the VCALENDAR to the clipboard */ + comp_str = icalcomponent_as_ical_string (vcal_comp); + if (cal_view->priv->clipboard_selection != NULL) + g_free (cal_view->priv->clipboard_selection); + cal_view->priv->clipboard_selection = g_strdup (comp_str); + gtk_selection_owner_set (cal_view->priv->invisible, clipboard_atom, GDK_CURRENT_TIME); + + /* free memory */ + icalcomponent_free (vcal_comp); + g_list_free (selected); +} + +void +e_cal_view_paste_clipboard (ECalView *cal_view) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + gtk_selection_convert (cal_view->priv->invisible, + clipboard_atom, + GDK_SELECTION_TYPE_STRING, + GDK_CURRENT_TIME); +} diff --git a/calendar/gui/e-cal-view.h b/calendar/gui/e-cal-view.h index b43fa0301d..d188ee6659 100644 --- a/calendar/gui/e-cal-view.h +++ b/calendar/gui/e-cal-view.h @@ -51,15 +51,34 @@ struct _ECalViewClass { /* Notification signals */ void (* selection_changed) (ECalView *cal_view); + + /* Virtual methods */ + GList * (* get_selected_events) (ECalView *cal_view); + void (* get_selected_time_range) (ECalView *cal_view, time_t *start_time, time_t *end_time); + void (* set_selected_time_range) (ECalView *cal_view, time_t start_time, time_t end_time); + void (* update_query) (ECalView *cal_view); }; GType e_cal_view_get_type (void); GnomeCalendar *e_cal_view_get_calendar (ECalView *cal_view); void e_cal_view_set_calendar (ECalView *cal_view, GnomeCalendar *calendar); +CalClient *e_cal_view_get_cal_client (ECalView *cal_view); +void e_cal_view_set_cal_client (ECalView *cal_view, CalClient *client); +const gchar *e_cal_view_get_query (ECalView *cal_view); +void e_cal_view_set_query (ECalView *cal_view, const gchar *sexp); void e_cal_view_set_status_message (ECalView *cal_view, const gchar *message); +GList *e_cal_view_get_selected_events (ECalView *cal_view); +void e_cal_view_get_selected_time_range (ECalView *cal_view, time_t *start_time, time_t *end_time); +void e_cal_view_set_selected_time_range (ECalView *cal_view, time_t start_time, time_t end_time); +void e_cal_view_update_query (ECalView *cal_view); + +void e_cal_view_cut_clipboard (ECalView *cal_view); +void e_cal_view_copy_clipboard (ECalView *cal_view); +void e_cal_view_paste_clipboard (ECalView *cal_view); + G_END_DECLS #endif diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index 6272f0eab9..1b4676beb8 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -22,9 +22,17 @@ */ #include <config.h> +#include <string.h> +#include <gtk/gtkinvisible.h> +#include <libgnome/gnome-i18n.h> #include <gal/util/e-util.h> #include "evolution-activity-client.h" +#include "calendar-config.h" #include "e-cal-view.h" +#include "itip-utils.h" +#include "dialogs/cancel-comp.h" +#include "dialogs/delete-error.h" +#include "dialogs/send-comp.h" /* Used for the status bar messages */ #define EVOLUTION_CALENDAR_PROGRESS_IMAGE "evolution-calendar-mini.png" @@ -34,8 +42,18 @@ struct _ECalViewPrivate { /* The GnomeCalendar we are associated to */ GnomeCalendar *calendar; + /* Calendar client we are monitoring */ + CalClient *client; + + /* Search expression */ + gchar *sexp; + /* The activity client used to show messages on the status bar. */ EvolutionActivityClient *activity; + + /* the invisible widget to manage the clipboard selections */ + GtkWidget *invisible; + gchar *clipboard_selection; }; static void e_cal_view_class_init (ECalViewClass *klass); @@ -43,6 +61,7 @@ static void e_cal_view_init (ECalView *cal_view, ECalViewClass *klass); static void e_cal_view_destroy (GtkObject *object); static GObjectClass *parent_class = NULL; +static GdkAtom clipboard_atom = GDK_NONE; /* Signal IDs */ enum { @@ -73,12 +92,203 @@ e_cal_view_class_init (ECalViewClass *klass) object_class->destroy = e_cal_view_destroy; klass->selection_changed = NULL; + klass->get_selected_events = NULL; + klass->get_selected_time_range = NULL; + klass->set_selected_time_range = NULL; + klass->update_query = NULL; + + /* clipboard atom */ + if (!clipboard_atom) + clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); +} + +static void +selection_get (GtkWidget *invisible, + GtkSelectionData *selection_data, + guint info, + guint time_stamp, + ECalView *cal_view) +{ + if (cal_view->priv->clipboard_selection != NULL) { + gtk_selection_data_set (selection_data, + GDK_SELECTION_TYPE_STRING, + 8, + cal_view->priv->clipboard_selection, + strlen (cal_view->priv->clipboard_selection)); + } +} + +static void +selection_clear_event (GtkWidget *invisible, + GdkEventSelection *event, + ECalView *cal_view) +{ + if (cal_view->priv->clipboard_selection != NULL) { + g_free (cal_view->priv->clipboard_selection); + cal_view->priv->clipboard_selection = NULL; + } +} + +static void +selection_received (GtkWidget *invisible, + GtkSelectionData *selection_data, + guint time, + ECalView *cal_view) +{ + char *comp_str, *default_tzid; + icalcomponent *icalcomp; + icalcomponent_kind kind; + CalComponent *comp; + time_t selected_time_start, selected_time_end; + struct icaltimetype itime; + struct icaltimetype tmp_itime; + time_t tt_start, tt_end; + struct icaldurationtype ic_dur; + char *uid; + CalComponentDateTime ccdt; + icaltimezone *default_zone; + + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (selection_data->length < 0 || + selection_data->type != GDK_SELECTION_TYPE_STRING) { + return; + } + + comp_str = (char *) selection_data->data; + icalcomp = icalparser_parse_string ((const char *) comp_str); + if (!icalcomp) + return; + + default_tzid = calendar_config_get_timezone (); + cal_client_get_timezone (cal_view->priv->client, default_tzid, &default_zone); + + /* check the type of the component */ + kind = icalcomponent_isa (icalcomp); + if (kind != ICAL_VCALENDAR_COMPONENT && + kind != ICAL_VEVENT_COMPONENT && + kind != ICAL_VTODO_COMPONENT && + kind != ICAL_VJOURNAL_COMPONENT) { + return; + } + + e_cal_view_set_status_message (cal_view, _("Updating objects")); + e_cal_view_get_selected_time_range (cal_view, &selected_time_start, &selected_time_end); + + if (kind == ICAL_VCALENDAR_COMPONENT) { + icalcomponent_kind child_kind; + icalcomponent *subcomp; + + subcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT); + while (subcomp) { + child_kind = icalcomponent_isa (subcomp); + if (child_kind == ICAL_VEVENT_COMPONENT || + child_kind == ICAL_VTODO_COMPONENT || + child_kind == ICAL_VJOURNAL_COMPONENT) { + icalcomponent *new_icalcomp; + + new_icalcomp = icalcomponent_new_clone (subcomp); + comp = cal_component_new (); + + /* change the day for the event */ + tt_start = icaltime_as_timet ( + icalcomponent_get_dtstart (new_icalcomp)); + tt_end = icaltime_as_timet ( + icalcomponent_get_dtend (new_icalcomp)); + ic_dur = icaldurationtype_from_int (tt_end - tt_start); + + tmp_itime = icaltime_from_timet_with_zone ( + selected_time_start, FALSE, default_zone); + itime = icalcomponent_get_dtstart (new_icalcomp); + itime.year = tmp_itime.year; + itime.month = tmp_itime.month; + itime.day = tmp_itime.day; + + cal_component_set_icalcomponent (comp, new_icalcomp); + ccdt.value = &itime; + ccdt.tzid = icaltimezone_get_tzid (default_zone); + cal_component_set_dtstart (comp, &ccdt); + + itime = icaltime_add (itime, ic_dur); + ccdt.value = &itime; + cal_component_set_dtend (comp, &ccdt); + + uid = cal_component_gen_uid (); + cal_component_set_uid (comp, uid); + + cal_client_update_object (cal_view->priv->client, comp); + + g_free (uid); + g_object_unref (comp); + } + subcomp = icalcomponent_get_next_component ( + icalcomp, ICAL_ANY_COMPONENT); + } + + icalcomponent_free (icalcomp); + + } + else { + comp = cal_component_new (); + + /* change the day for the event */ + tt_start = icaltime_as_timet (icalcomponent_get_dtstart (icalcomp)); + tt_end = icaltime_as_timet (icalcomponent_get_dtend (icalcomp)); + ic_dur = icaldurationtype_from_int (tt_end - tt_start); + + tmp_itime = icaltime_from_timet_with_zone ( + selected_time_start, FALSE, default_zone); + itime = icalcomponent_get_dtstart (icalcomp); + itime.year = tmp_itime.year; + itime.month = tmp_itime.month; + itime.day = tmp_itime.day; + + cal_component_set_icalcomponent (comp, icalcomp); + ccdt.value = &itime; + ccdt.tzid = icaltimezone_get_tzid (default_zone); + cal_component_set_dtstart (comp, &ccdt); + + itime = icaltime_add (itime, ic_dur); + ccdt.value = &itime; + cal_component_set_dtend (comp, &ccdt); + + uid = cal_component_gen_uid (); + cal_component_set_uid (comp, (const char *) uid); + + cal_client_update_object (cal_view->priv->client, comp); + + if (itip_organizer_is_user (comp, cal_view->priv->client) && + send_component_dialog (gtk_widget_get_toplevel (cal_view), cal_view->priv->client, comp, TRUE)) + itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, cal_view->priv->client, NULL); + + g_free (uid); + g_object_unref (comp); + } + + e_cal_view_set_status_message (cal_view, NULL); } static void e_cal_view_init (ECalView *cal_view, ECalViewClass *klass) { cal_view->priv = g_new0 (ECalViewPrivate, 1); + + cal_view->priv->sexp = g_strdup ("#t"); /* match all by default */ + + /* Set up the invisible widget for the clipboard selections */ + cal_view->priv->invisible = gtk_invisible_new (); + gtk_selection_add_target (cal_view->priv->invisible, + clipboard_atom, + GDK_SELECTION_TYPE_STRING, + 0); + g_signal_connect (cal_view->priv->invisible, "selection_get", + G_CALLBACK (selection_get), (gpointer) cal_view); + g_signal_connect (cal_view->priv->invisible, "selection_clear_event", + G_CALLBACK (selection_clear_event), (gpointer) cal_view); + g_signal_connect (cal_view->priv->invisible, "selection_received", + G_CALLBACK (selection_received), (gpointer) cal_view); + + cal_view->priv->clipboard_selection = NULL; } static void @@ -89,11 +299,31 @@ e_cal_view_destroy (GtkObject *object) g_return_if_fail (E_IS_CAL_VIEW (cal_view)); if (cal_view->priv) { + if (cal_view->priv->client) { + g_object_unref (cal_view->priv->client); + cal_view->priv->client = NULL; + } + + if (cal_view->priv->sexp) { + g_free (cal_view->priv->sexp); + cal_view->priv->sexp = NULL; + } + if (cal_view->priv->activity) { g_object_unref (cal_view->priv->activity); cal_view->priv->activity = NULL; } + if (cal_view->priv->invisible) { + gtk_widget_destroy (cal_view->priv->invisible); + cal_view->priv->invisible = NULL; + } + + if (cal_view->priv->clipboard_selection) { + g_free (cal_view->priv->clipboard_selection); + cal_view->priv->clipboard_selection = NULL; + } + g_free (cal_view->priv); cal_view->priv = NULL; } @@ -121,6 +351,72 @@ e_cal_view_set_calendar (ECalView *cal_view, GnomeCalendar *calendar) cal_view->priv->calendar = calendar; } +CalClient * +e_cal_view_get_cal_client (ECalView *cal_view) +{ + g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), NULL); + + return cal_view->priv->client; +} + +static void +cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer user_data) +{ + ECalView *cal_view = (ECalView *) user_data; + + if (status != CAL_CLIENT_OPEN_SUCCESS) + return; + + e_cal_view_update_query (cal_view); +} + +void +e_cal_view_set_cal_client (ECalView *cal_view, CalClient *client) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (client == cal_view->priv->client) + return; + + if (IS_CAL_CLIENT (client)) + g_object_ref (client); + + if (cal_view->priv->client) { + g_signal_handlers_disconnect_matched (cal_view->priv->client, G_SIGNAL_MATCH_DATA, 0, 0, + NULL, NULL, cal_view); + g_object_unref (cal_view->priv->client); + } + + cal_view->priv->client = client; + if (cal_view->priv->client) { + if (cal_client_get_load_state (cal_view->priv->client) == CAL_CLIENT_LOAD_LOADED) + e_cal_view_update_query (cal_view); + else + g_signal_connect (cal_view->priv->client, "cal_opened", + G_CALLBACK (cal_opened_cb), cal_view); + } +} + +const gchar * +e_cal_view_get_query (ECalView *cal_view) +{ + g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), NULL); + + return (const gchar *) cal_view->priv->sexp; +} + +void +e_cal_view_set_query (ECalView *cal_view, const gchar *sexp) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (cal_view->priv->sexp) + g_free (cal_view->priv->sexp); + + cal_view->priv->sexp = g_strdup (sexp); + e_cal_view_update_query (cal_view); +} + void e_cal_view_set_status_message (ECalView *cal_view, const gchar *message) { @@ -147,3 +443,128 @@ e_cal_view_set_status_message (ECalView *cal_view, const gchar *message) } else evolution_activity_client_update (cal_view->priv->activity, message, -1.0); } + +GList * +e_cal_view_get_selected_events (ECalView *cal_view) +{ + g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), NULL); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events) + return E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events (cal_view); + + return NULL; +} + +void +e_cal_view_get_selected_time_range (ECalView *cal_view, time_t *start_time, time_t *end_time) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range) { + E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range ( + cal_view, start_time, end_time); + } +} + +void +e_cal_view_set_selected_time_range (ECalView *cal_view, time_t start_time, time_t end_time) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range) { + E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range ( + cal_view, start_time, end_time); + } +} + +void +e_cal_view_update_query (ECalView *cal_view) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query) { + E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query (cal_view); + } +} + +void +e_cal_view_cut_clipboard (ECalView *cal_view) +{ + GList *selected, *l; + const char *uid; + + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + selected = e_cal_view_get_selected_events (cal_view); + if (!selected) + return; + + e_cal_view_set_status_message (cal_view, _("Deleting selected objects")); + + e_cal_view_copy_clipboard (cal_view); + for (l = selected; l != NULL; l = l->next) { + CalComponent *comp = l->data; + + if (itip_organizer_is_user (comp, cal_view->priv->client) + && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (cal_view), + cal_view->priv->client, comp, TRUE)) + itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, comp, cal_view->priv->client, NULL); + + cal_component_get_uid (comp, &uid); + delete_error_dialog (cal_client_remove_object (cal_view->priv->client, uid), + CAL_COMPONENT_EVENT); + } + + e_cal_view_set_status_message (cal_view, NULL); + + g_list_free (selected); +} + +void +e_cal_view_copy_clipboard (ECalView *cal_view) +{ + GList *selected, *l; + gchar *comp_str; + icalcomponent *vcal_comp; + icalcomponent *new_icalcomp; + + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + selected = e_cal_view_get_selected_events (cal_view); + if (!selected) + return; + + /* create top-level VCALENDAR component and add VTIMEZONE's */ + vcal_comp = cal_util_new_top_level (); + for (l = selected; l != NULL; l = l->next) + cal_util_add_timezones_from_component (vcal_comp, (CalComponent *) l->data); + + for (l = selected; l != NULL; l = l->next) { + CalComponent *comp = (CalComponent *) l->data; + + new_icalcomp = icalcomponent_new_clone (cal_component_get_icalcomponent (comp)); + icalcomponent_add_component (vcal_comp, new_icalcomp); + } + + /* copy the VCALENDAR to the clipboard */ + comp_str = icalcomponent_as_ical_string (vcal_comp); + if (cal_view->priv->clipboard_selection != NULL) + g_free (cal_view->priv->clipboard_selection); + cal_view->priv->clipboard_selection = g_strdup (comp_str); + gtk_selection_owner_set (cal_view->priv->invisible, clipboard_atom, GDK_CURRENT_TIME); + + /* free memory */ + icalcomponent_free (vcal_comp); + g_list_free (selected); +} + +void +e_cal_view_paste_clipboard (ECalView *cal_view) +{ + g_return_if_fail (E_IS_CAL_VIEW (cal_view)); + + gtk_selection_convert (cal_view->priv->invisible, + clipboard_atom, + GDK_SELECTION_TYPE_STRING, + GDK_CURRENT_TIME); +} diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h index b43fa0301d..d188ee6659 100644 --- a/calendar/gui/e-calendar-view.h +++ b/calendar/gui/e-calendar-view.h @@ -51,15 +51,34 @@ struct _ECalViewClass { /* Notification signals */ void (* selection_changed) (ECalView *cal_view); + + /* Virtual methods */ + GList * (* get_selected_events) (ECalView *cal_view); + void (* get_selected_time_range) (ECalView *cal_view, time_t *start_time, time_t *end_time); + void (* set_selected_time_range) (ECalView *cal_view, time_t start_time, time_t end_time); + void (* update_query) (ECalView *cal_view); }; GType e_cal_view_get_type (void); GnomeCalendar *e_cal_view_get_calendar (ECalView *cal_view); void e_cal_view_set_calendar (ECalView *cal_view, GnomeCalendar *calendar); +CalClient *e_cal_view_get_cal_client (ECalView *cal_view); +void e_cal_view_set_cal_client (ECalView *cal_view, CalClient *client); +const gchar *e_cal_view_get_query (ECalView *cal_view); +void e_cal_view_set_query (ECalView *cal_view, const gchar *sexp); void e_cal_view_set_status_message (ECalView *cal_view, const gchar *message); +GList *e_cal_view_get_selected_events (ECalView *cal_view); +void e_cal_view_get_selected_time_range (ECalView *cal_view, time_t *start_time, time_t *end_time); +void e_cal_view_set_selected_time_range (ECalView *cal_view, time_t start_time, time_t end_time); +void e_cal_view_update_query (ECalView *cal_view); + +void e_cal_view_cut_clipboard (ECalView *cal_view); +void e_cal_view_copy_clipboard (ECalView *cal_view); +void e_cal_view_paste_clipboard (ECalView *cal_view); + G_END_DECLS #endif diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 55343080ba..53123917e2 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -35,7 +35,6 @@ #include <gdk/gdkkeysyms.h> #include <gdk/gdkx.h> #include <gtk/gtkdnd.h> -#include <gtk/gtkinvisible.h> #include <gtk/gtkmain.h> #include <gtk/gtksignal.h> #include <gtk/gtkvscrollbar.h> @@ -152,6 +151,10 @@ static gboolean e_day_view_get_extreme_event (EDayView *day_view, static gboolean e_day_view_do_key_press (GtkWidget *widget, GdkEventKey *event); static gboolean e_day_view_popup_menu (GtkWidget *widget); +static GList *e_day_view_get_selected_events (ECalView *cal_view); +static void e_day_view_get_selected_time_range (EDayView *day_view, time_t *start_time, time_t *end_time); +static void e_day_view_set_selected_time_range (EDayView *day_view, time_t start_time, time_t end_time); +static void e_day_view_update_query (EDayView *day_view); static void e_day_view_goto_start_of_work_day (EDayView *day_view); static void e_day_view_goto_end_of_work_day (EDayView *day_view); static void e_day_view_cursor_key_up_shifted (EDayView *day_view, @@ -466,26 +469,12 @@ static time_t e_day_view_find_work_week_start (EDayView *day_view, static void e_day_view_recalc_work_week (EDayView *day_view); static void e_day_view_recalc_work_week_days_shown (EDayView *day_view); -static void selection_clear_event (GtkWidget *invisible, - GdkEventSelection *event, - EDayView *day_view); -static void selection_received (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint time, - EDayView *day_view); -static void selection_get (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint info, - guint time_stamp, - EDayView *day_view); - static void e_day_view_queue_layout (EDayView *day_view); static void e_day_view_cancel_layout (EDayView *day_view); static gboolean e_day_view_layout_timeout_cb (gpointer data); static GtkTableClass *parent_class; -static GdkAtom clipboard_atom = GDK_NONE; E_MAKE_TYPE (e_day_view, "EDayView", EDayView, e_day_view_class_init, e_day_view_init, e_cal_view_get_type ()); @@ -495,10 +484,12 @@ e_day_view_class_init (EDayViewClass *class) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; + ECalViewClass *view_class; parent_class = g_type_class_peek_parent (class); object_class = (GtkObjectClass *) class; widget_class = (GtkWidgetClass *) class; + view_class = (ECalViewClass *) class; /* Method override */ object_class->destroy = e_day_view_destroy; @@ -513,10 +504,10 @@ e_day_view_class_init (EDayViewClass *class) widget_class->focus = e_day_view_focus; widget_class->popup_menu = e_day_view_popup_menu; - /* clipboard atom */ - if (!clipboard_atom) - clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); - + view_class->get_selected_events = e_day_view_get_selected_events; + view_class->get_selected_time_range = e_day_view_get_selected_time_range; + view_class->set_selected_time_range = e_day_view_set_selected_time_range; + view_class->update_query = e_day_view_update_query; } static void @@ -527,8 +518,6 @@ e_day_view_init (EDayView *day_view) GTK_WIDGET_SET_FLAGS (day_view, GTK_CAN_FOCUS); - day_view->client = NULL; - day_view->sexp = g_strdup ("#t"); /* match all by default */ day_view->query = NULL; day_view->long_events = g_array_new (FALSE, FALSE, @@ -836,21 +825,6 @@ e_day_view_init (EDayView *day_view) GTK_DEST_DEFAULT_ALL, target_table, n_targets, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK); - - /* Set up the invisible widget for the clipboard selections */ - day_view->invisible = gtk_invisible_new (); - gtk_selection_add_target (day_view->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - 0); - g_signal_connect (day_view->invisible, "selection_get", - G_CALLBACK (selection_get), (gpointer) day_view); - g_signal_connect (day_view->invisible, "selection_clear_event", - G_CALLBACK (selection_clear_event), (gpointer) day_view); - g_signal_connect (day_view->invisible, "selection_received", - G_CALLBACK (selection_received), (gpointer) day_view); - - day_view->clipboard_selection = NULL; } @@ -894,15 +868,9 @@ e_day_view_destroy (GtkObject *object) e_day_view_stop_auto_scroll (day_view); - if (day_view->client) { - g_signal_handlers_disconnect_matched (day_view->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, day_view); - g_object_unref (day_view->client); - day_view->client = NULL; - } - - if (day_view->sexp) { - g_free (day_view->sexp); - day_view->sexp = NULL; + if (e_cal_view_get_cal_client (E_CAL_VIEW (day_view))) { + g_signal_handlers_disconnect_matched (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), + G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, day_view); } if (day_view->query) { @@ -953,15 +921,6 @@ e_day_view_destroy (GtkObject *object) } } - if (day_view->invisible) { - gtk_widget_destroy (day_view->invisible); - day_view->invisible = NULL; - } - if (day_view->clipboard_selection) { - g_free (day_view->clipboard_selection); - day_view->clipboard_selection = NULL; - } - GTK_OBJECT_CLASS (parent_class)->destroy (object); } @@ -1493,7 +1452,7 @@ query_obj_updated_cb (CalQuery *query, const char *uid, return; /* Get the event from the server. */ - status = cal_client_get_object (day_view->client, uid, &comp); + status = cal_client_get_object (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), uid, &comp); switch (status) { case CAL_CLIENT_GET_SUCCESS: @@ -1551,7 +1510,8 @@ query_obj_updated_cb (CalQuery *query, const char *uid, cal_recur_generate_instances (comp, day_view->lower, day_view->upper, e_day_view_add_event, day_view, - cal_client_resolve_tzid_cb, day_view->client, + cal_client_resolve_tzid_cb, + e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), day_view->zone); g_object_unref (comp); @@ -1635,136 +1595,6 @@ adjust_query_sexp (EDayView *day_view, const char *sexp) return new_sexp; } - -/* Restarts a query for the day view */ -static void -update_query (EDayView *day_view) -{ - CalQuery *old_query; - char *real_sexp; - - e_day_view_stop_editing_event (day_view); - - gtk_widget_queue_draw (day_view->top_canvas); - gtk_widget_queue_draw (day_view->main_canvas); - e_day_view_free_events (day_view); - e_day_view_queue_layout (day_view); - - if (!(day_view->client - && cal_client_get_load_state (day_view->client) == CAL_CLIENT_LOAD_LOADED)) - return; - - old_query = day_view->query; - day_view->query = NULL; - - if (old_query) { - g_signal_handlers_disconnect_matched (old_query, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, day_view); - g_object_unref (old_query); - } - - g_assert (day_view->sexp != NULL); - - real_sexp = adjust_query_sexp (day_view, day_view->sexp); - if (!real_sexp) - return; /* No time range is set, so don't start a query */ - - e_cal_view_set_status_message (E_CAL_VIEW (day_view), _("Searching")); - day_view->query = cal_client_get_query (day_view->client, real_sexp); - g_free (real_sexp); - - if (!day_view->query) { - g_message ("update_query(): Could not create the query"); - return; - } - - g_signal_connect (day_view->query, "obj_updated", - G_CALLBACK (query_obj_updated_cb), day_view); - g_signal_connect (day_view->query, "obj_removed", - G_CALLBACK (query_obj_removed_cb), day_view); - g_signal_connect (day_view->query, "query_done", - G_CALLBACK (query_query_done_cb), day_view); - g_signal_connect (day_view->query, "eval_error", - G_CALLBACK (query_eval_error_cb), day_view); -} - -/* Callback used when the calendar client finishes opening */ -static void -cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer data) -{ - EDayView *day_view; - - day_view = E_DAY_VIEW (data); - - if (status != CAL_CLIENT_OPEN_SUCCESS) - return; - - update_query (day_view); -} - -/** - * e_day_view_set_cal_client: - * @day_view: A day view. - * @client: A calendar client interface object. - * - * Sets the calendar client interface object that a day view will monitor. - **/ -void -e_day_view_set_cal_client (EDayView *day_view, - CalClient *client) -{ - g_return_if_fail (day_view != NULL); - g_return_if_fail (E_IS_DAY_VIEW (day_view)); - - if (client == day_view->client) - return; - - if (client) - g_return_if_fail (IS_CAL_CLIENT (client)); - - if (client) - g_object_ref (client); - - if (day_view->client) { - g_signal_handlers_disconnect_matched (day_view->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, day_view); - g_object_unref (day_view->client); - } - - day_view->client = client; - - if (day_view->client) { - if (cal_client_get_load_state (day_view->client) == CAL_CLIENT_LOAD_LOADED) - update_query (day_view); - else - g_signal_connect (day_view->client, "cal_opened", - G_CALLBACK (cal_opened_cb), day_view); - } -} - -/** - * e_day_view_set_query: - * @day_view: A day view. - * @sexp: S-expression that defines the query. - * - * Sets the query sexp that the day view will use for filtering the displayed - * events. - **/ -void -e_day_view_set_query (EDayView *day_view, const char *sexp) -{ - g_return_if_fail (day_view != NULL); - g_return_if_fail (E_IS_DAY_VIEW (day_view)); - g_return_if_fail (sexp != NULL); - - if (day_view->sexp) - g_free (day_view->sexp); - - day_view->sexp = g_strdup (sexp); - - update_query (day_view); -} - - /** * e_day_view_set_default_category: * @day_view: A day view. @@ -2160,7 +1990,7 @@ e_day_view_find_event_from_uid (EDayView *day_view, corresponding to the start time. If the start_time & end_time are not equal and are both visible in the view, then the selection is set to those times, otherwise it is set to 1 hour from the start of the working day. */ -void +static void e_day_view_set_selected_time_range (EDayView *day_view, time_t start_time, time_t end_time) @@ -2184,7 +2014,7 @@ e_day_view_set_selected_time_range (EDayView *day_view, /* See if we need to change the days shown. */ if (lower != day_view->lower) { e_day_view_recalc_day_starts (day_view, lower); - update_query (day_view); + e_day_view_update_query (day_view); } /* Set the selection. */ @@ -2379,7 +2209,7 @@ e_day_view_find_work_week_start (EDayView *day_view, /* Returns the selected time range. */ -void +static void e_day_view_get_selected_time_range (EDayView *day_view, time_t *start_time, time_t *end_time) @@ -2495,7 +2325,7 @@ e_day_view_set_days_shown (EDayView *day_view, e_day_view_recalc_day_starts (day_view, day_view->lower); e_day_view_recalc_cell_sizes (day_view); - update_query (day_view); + e_day_view_update_query (day_view); } @@ -2748,7 +2578,7 @@ e_day_view_set_timezone (EDayView *day_view, lower = icaltime_as_timet_with_zone (tt, zone); e_day_view_recalc_day_starts (day_view, lower); - update_query (day_view); + e_day_view_update_query (day_view); } @@ -2794,87 +2624,6 @@ e_day_view_set_week_start_day (EDayView *day_view, e_day_view_recalc_work_week (day_view); } -static EDayViewEvent * -get_current_event (EDayView *day_view) -{ - g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL); - - if (day_view->editing_event_day == -1) - return NULL; - - if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT) - return &g_array_index (day_view->long_events, - EDayViewEvent, - day_view->editing_event_num); - else - return &g_array_index (day_view->events[day_view->editing_event_day], - EDayViewEvent, - day_view->editing_event_num); -} - -void -e_day_view_cut_clipboard (EDayView *day_view) -{ - EDayViewEvent *event; - const char *uid; - - g_return_if_fail (E_IS_DAY_VIEW (day_view)); - - event = get_current_event (day_view); - if (event == NULL) - return; - - e_cal_view_set_status_message (E_CAL_VIEW (day_view), _("Deleting selected objects")); - - e_day_view_copy_clipboard (day_view); - cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object (day_view->client, uid), CAL_COMPONENT_EVENT); - - e_cal_view_set_status_message (E_CAL_VIEW (day_view), NULL); -} - -void -e_day_view_copy_clipboard (EDayView *day_view) -{ - EDayViewEvent *event; - char *comp_str; - icalcomponent *vcal_comp; - icalcomponent *new_icalcomp; - - g_return_if_fail (E_IS_DAY_VIEW (day_view)); - - event = get_current_event (day_view); - if (event == NULL) - return; - - /* create top-level VCALENDAR component and add VTIMEZONE's */ - vcal_comp = cal_util_new_top_level (); - cal_util_add_timezones_from_component (vcal_comp, event->comp); - - new_icalcomp = icalcomponent_new_clone (cal_component_get_icalcomponent (event->comp)); - icalcomponent_add_component (vcal_comp, new_icalcomp); - - comp_str = icalcomponent_as_ical_string (vcal_comp); - if (day_view->clipboard_selection != NULL) - g_free (day_view->clipboard_selection); - day_view->clipboard_selection = g_strdup (comp_str); - gtk_selection_owner_set (day_view->invisible, clipboard_atom, GDK_CURRENT_TIME); - - /* free memory */ - icalcomponent_free (vcal_comp); -} - -void -e_day_view_paste_clipboard (EDayView *day_view) -{ - g_return_if_fail (E_IS_DAY_VIEW (day_view)); - - gtk_selection_convert (day_view->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - GDK_CURRENT_TIME); -} - static void e_day_view_recalc_work_week (EDayView *day_view) { @@ -2896,7 +2645,7 @@ e_day_view_recalc_work_week (EDayView *day_view) day_view->selection_start_day = -1; e_day_view_recalc_day_starts (day_view, lower); - update_query (day_view); + e_day_view_update_query (day_view); /* This updates the date navigator. */ e_day_view_update_calendar_selection_time (day_view); @@ -3788,12 +3537,13 @@ e_day_view_show_popup_menu (EDayView *day_view, if (cal_component_has_organizer (event->comp)) { disable_mask |= MASK_MEETING; - if (!itip_organizer_is_user (event->comp, day_view->client)) + if (!itip_organizer_is_user (event->comp, + e_cal_view_get_cal_client (E_CAL_VIEW (day_view)))) disable_mask |= MASK_MEETING_ORGANIZER; } } - if (cal_client_is_read_only (day_view->client)) + if (cal_client_is_read_only (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)))) disable_mask |= MASK_EDITABLE; if (being_edited) @@ -3817,6 +3567,78 @@ e_day_view_popup_menu (GtkWidget *widget) return TRUE; } +/* Returns the currently-selected event, or NULL if none */ +static GList * +e_day_view_get_selected_events (ECalView *cal_view) +{ + EDayViewEvent *event; + GList *list = NULL; + EDayView *day_view = (EDayView *) cal_view; + + g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL); + g_return_val_if_fail (day_view->editing_event_day != -1, NULL); + + if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT) + event = &g_array_index (day_view->long_events, + EDayViewEvent, + day_view->editing_event_num); + else + event = &g_array_index (day_view->events[day_view->editing_event_day], + EDayViewEvent, + day_view->editing_event_num); + + if (event) + list = g_list_append (list, event->comp); + + return list; +} + +/* Restarts a query for the day view */ +static void +e_day_view_update_query (EDayView *day_view) +{ + CalQuery *old_query; + char *real_sexp; + + e_day_view_stop_editing_event (day_view); + + gtk_widget_queue_draw (day_view->top_canvas); + gtk_widget_queue_draw (day_view->main_canvas); + e_day_view_free_events (day_view); + e_day_view_queue_layout (day_view); + + old_query = day_view->query; + day_view->query = NULL; + + if (old_query) { + g_signal_handlers_disconnect_matched (old_query, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, day_view); + g_object_unref (old_query); + } + + real_sexp = adjust_query_sexp (day_view, e_cal_view_get_query (E_CAL_VIEW (day_view))); + if (!real_sexp) + return; /* No time range is set, so don't start a query */ + + e_cal_view_set_status_message (E_CAL_VIEW (day_view), _("Searching")); + day_view->query = cal_client_get_query (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), real_sexp); + g_free (real_sexp); + + if (!day_view->query) { + g_message ("e_day_view_update_query(): Could not create the query"); + return; + } + + g_signal_connect (day_view->query, "obj_updated", + G_CALLBACK (query_obj_updated_cb), day_view); + g_signal_connect (day_view->query, "obj_removed", + G_CALLBACK (query_obj_removed_cb), day_view); + g_signal_connect (day_view->query, "query_done", + G_CALLBACK (query_query_done_cb), day_view); + g_signal_connect (day_view->query, "eval_error", + G_CALLBACK (query_eval_error_cb), day_view); +} + static void e_day_view_on_event_right_click (EDayView *day_view, GdkEventButton *bevent, @@ -3961,7 +3783,8 @@ e_day_view_on_save_as (GtkWidget *widget, gpointer data) if (filename == NULL) return; - ical_string = cal_client_get_component_as_string (day_view->client, event->comp); + ical_string = cal_client_get_component_as_string (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), + event->comp); if (ical_string == NULL) { g_warning ("Couldn't convert item to a string"); return; @@ -4020,7 +3843,7 @@ e_day_view_on_print_event (GtkWidget *widget, gpointer data) if (event == NULL) return; - print_comp (event->comp, day_view->client, FALSE); + print_comp (event->comp, e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), FALSE); } static void @@ -4036,7 +3859,7 @@ e_day_view_on_meeting (GtkWidget *widget, gpointer data) if (event == NULL) return; - e_cal_view_get_calendar (E_CAL_VIEW (day_view)); + calendar = e_cal_view_get_calendar (E_CAL_VIEW (day_view)); if (calendar) gnome_calendar_edit_object (calendar, event->comp, TRUE); else @@ -4056,7 +3879,7 @@ e_day_view_on_forward (GtkWidget *widget, gpointer data) return; itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, event->comp, - day_view->client, NULL); + e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL); } static void @@ -4073,14 +3896,15 @@ e_day_view_on_publish (GtkWidget *widget, gpointer data) start = time_day_begin_with_zone (start, utc); end = time_add_week_with_zone (start, 6, utc); - comp_list = cal_client_get_free_busy (day_view->client, NULL, start, end); + comp_list = cal_client_get_free_busy (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL, + start, end); if (comp_list) { GList *l; for (l = comp_list; l; l = l->next) { CalComponent *comp = CAL_COMPONENT (l->data); itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, comp, - day_view->client, NULL); + e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL); g_object_unref (comp); } @@ -4110,14 +3934,17 @@ e_day_view_delete_event_internal (EDayView *day_view, EDayViewEvent *event) GTK_WIDGET (day_view))) { const char *uid; - if (itip_organizer_is_user (event->comp, day_view->client) + if (itip_organizer_is_user (event->comp, e_cal_view_get_cal_client (E_CAL_VIEW (day_view))) && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (day_view), - day_view->client, event->comp, TRUE)) - itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp, day_view->client, NULL); + e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), + event->comp, TRUE)) + itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp, + e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL); cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object (day_view->client, uid), CAL_COMPONENT_EVENT); + delete_error_dialog (cal_client_remove_object (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), + uid), CAL_COMPONENT_EVENT); } } @@ -4179,8 +4006,10 @@ e_day_view_delete_occurrence_internal (EDayView *day_view, EDayViewEvent *event) cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object_with_mod (day_view->client, uid, CALOBJ_MOD_THIS), - CAL_COMPONENT_EVENT); + delete_error_dialog ( + cal_client_remove_object_with_mod (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), + uid, CALOBJ_MOD_THIS), + CAL_COMPONENT_EVENT); return; } @@ -4189,7 +4018,8 @@ e_day_view_delete_occurrence_internal (EDayView *day_view, EDayViewEvent *event) comp = cal_component_clone (event->comp); cal_comp_util_add_exdate (comp, event->start, day_view->zone); - if (cal_client_update_object (day_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS) + if (cal_client_update_object (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), comp) + != CAL_CLIENT_RESULT_SUCCESS) g_message ("e_day_view_on_delete_occurrence(): Could not update the object!"); g_object_unref (comp); @@ -4235,58 +4065,17 @@ e_day_view_delete_occurrence (EDayView *day_view) static void e_day_view_on_cut (GtkWidget *widget, gpointer data) { - EDayView *day_view; - EDayViewEvent *event; - const char *uid; - - day_view = E_DAY_VIEW (data); - - event = e_day_view_get_popup_menu_event (day_view); - if (event == NULL) - return; - - e_day_view_on_copy (widget, data); - - if (itip_organizer_is_user (event->comp, day_view->client) - && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (day_view), - day_view->client, event->comp, TRUE)) - itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp, day_view->client, NULL); + EDayView *day_view = E_DAY_VIEW (data); - cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object (day_view->client, uid), CAL_COMPONENT_EVENT); + e_cal_view_cut_clipboard (E_CAL_VIEW (day_view)); } static void e_day_view_on_copy (GtkWidget *widget, gpointer data) { - EDayView *day_view; - EDayViewEvent *event; - char *comp_str; - icalcomponent *vcal_comp; - icalcomponent *new_icalcomp; - - day_view = E_DAY_VIEW (data); - - event = e_day_view_get_popup_menu_event (day_view); - if (event == NULL) - return; - - /* create top-level VCALENDAR component and add VTIMEZONE's */ - vcal_comp = cal_util_new_top_level (); - cal_util_add_timezones_from_component (vcal_comp, event->comp); - - new_icalcomp = icalcomponent_new_clone (cal_component_get_icalcomponent (event->comp)); - icalcomponent_add_component (vcal_comp, new_icalcomp); - - comp_str = icalcomponent_as_ical_string (vcal_comp); - if (day_view->clipboard_selection) - g_free (day_view->clipboard_selection); - day_view->clipboard_selection = g_strdup (comp_str); - - gtk_selection_owner_set (day_view->invisible, clipboard_atom, GDK_CURRENT_TIME); + EDayView *day_view = E_DAY_VIEW (data); - /* free memory */ - icalcomponent_free (vcal_comp); + e_cal_view_copy_clipboard (E_CAL_VIEW (day_view)); } static void @@ -4294,10 +4083,7 @@ e_day_view_on_paste (GtkWidget *widget, gpointer data) { EDayView *day_view = E_DAY_VIEW (data); - gtk_selection_convert (day_view->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - GDK_CURRENT_TIME); + e_cal_view_paste_clipboard (E_CAL_VIEW (day_view)); } static void @@ -4348,12 +4134,14 @@ e_day_view_on_unrecur_appointment (GtkWidget *widget, gpointer data) /* Now update both CalComponents. Note that we do this last since at * present the updates happen synchronously so our event may disappear. */ - if (cal_client_update_object (day_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS) + if (cal_client_update_object (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), comp) + != CAL_CLIENT_RESULT_SUCCESS) g_message ("e_day_view_on_unrecur_appointment(): Could not update the object!"); g_object_unref (comp); - if (cal_client_update_object (day_view->client, new_comp) != CAL_CLIENT_RESULT_SUCCESS) + if (cal_client_update_object (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), new_comp) + != CAL_CLIENT_RESULT_SUCCESS) g_message ("e_day_view_on_unrecur_appointment(): Could not update the object!"); g_object_unref (new_comp); @@ -4853,6 +4641,9 @@ e_day_view_finish_long_event_resize (EDayView *day_view) CalComponentDateTime date; struct icaltimetype itt; time_t dt; + CalClient *client; + + client = e_cal_view_get_cal_client (E_CAL_VIEW (day_view)); event_num = day_view->resize_event_num; event = &g_array_index (day_view->long_events, EDayViewEvent, @@ -4884,22 +4675,22 @@ e_day_view_finish_long_event_resize (EDayView *day_view) CalObjModType mod; if (recur_component_dialog (comp, &mod, NULL)) { - if (cal_client_update_object_with_mod (day_view->client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) && + if (cal_client_update_object_with_mod (client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, comp, FALSE)) - itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, day_view->client, NULL); + client, comp, FALSE)) + itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, client, NULL); } else { g_message ("e_day_view_finish_resize(): Could not update the object!"); } } else { gtk_widget_queue_draw (day_view->top_canvas); } - } else if (cal_client_update_object (day_view->client, comp) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) && + } else if (cal_client_update_object (client, comp) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, comp, TRUE)) - itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, day_view->client, NULL); + client, comp, TRUE)) + itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, client, NULL); } else { g_message ("e_day_view_finish_long_event_resize(): Could not update the object!"); } @@ -4923,6 +4714,9 @@ e_day_view_finish_resize (EDayView *day_view) CalComponentDateTime date; struct icaltimetype itt; time_t dt; + CalClient *client; + + client = e_cal_view_get_cal_client (E_CAL_VIEW (day_view)); day = day_view->resize_event_day; event_num = day_view->resize_event_num; @@ -4966,21 +4760,21 @@ e_day_view_finish_resize (EDayView *day_view) CalObjModType mod; if (recur_component_dialog (comp, &mod, NULL)) { - if (cal_client_update_object_with_mod (day_view->client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) && + if (cal_client_update_object_with_mod (client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, comp, FALSE)) - itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, day_view->client, NULL); + client, comp, FALSE)) + itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, client, NULL); } else { g_message ("e_day_view_finish_resize(): Could not update the object!"); } } else { gtk_widget_queue_draw (day_view->main_canvas); } - } else if (cal_client_update_object (day_view->client, comp) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) && - send_component_dialog (gtk_widget_get_toplevel (day_view), day_view->client, comp, FALSE)) - itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, day_view->client, NULL); + } else if (cal_client_update_object (client, comp) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (comp, client) && + send_component_dialog (gtk_widget_get_toplevel (day_view), client, comp, FALSE)) + itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, client, NULL); } else { g_message ("e_day_view_finish_resize(): Could not update the object!"); } @@ -5113,7 +4907,7 @@ e_day_view_add_event (CalComponent *comp, event.num_columns = 0; event.different_timezone = FALSE; - if (!cal_comp_util_compare_event_timezones (comp, day_view->client, + if (!cal_comp_util_compare_event_timezones (comp, e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), day_view->zone)) event.different_timezone = TRUE; @@ -5631,7 +5425,9 @@ e_day_view_do_key_press (GtkWidget *widget, GdkEventKey *event) day_view = E_DAY_VIEW (widget); keyval = event->keyval; - if (!(day_view->client && cal_client_get_load_state (day_view->client) == CAL_CLIENT_LOAD_LOADED)) + if (!(e_cal_view_get_cal_client (E_CAL_VIEW (day_view)) + && cal_client_get_load_state (e_cal_view_get_cal_client (E_CAL_VIEW (day_view))) + == CAL_CLIENT_LOAD_LOADED)) return TRUE; /* The Escape key aborts a resize operation. */ @@ -5732,7 +5528,7 @@ e_day_view_do_key_press (GtkWidget *widget, GdkEventKey *event) /* Add a new event covering the selected range */ - comp = cal_comp_event_new_with_defaults (day_view->client); + comp = cal_comp_event_new_with_defaults (e_cal_view_get_cal_client (E_CAL_VIEW (day_view))); e_day_view_get_selected_time_range (day_view, &dtstart, &dtend); @@ -6561,7 +6357,8 @@ e_day_view_on_editing_stopped (EDayView *day_view, NULL); g_assert (text != NULL); - if (string_is_empty (text) && !cal_comp_is_on_server (event->comp, day_view->client)) { + if (string_is_empty (text) && + !cal_comp_is_on_server (event->comp, e_cal_view_get_cal_client (E_CAL_VIEW (day_view)))) { const char *uid; cal_component_get_uid (event->comp, &uid); @@ -6583,6 +6380,10 @@ e_day_view_on_editing_stopped (EDayView *day_view, e_day_view_update_event_label (day_view, day, event_num); } else if (summary.value || !string_is_empty (text)) { + CalClient *client; + + client = e_cal_view_get_cal_client (E_CAL_VIEW (day_view)); + summary.value = text; summary.altrep = NULL; cal_component_set_summary (event->comp, &summary); @@ -6591,22 +6392,22 @@ e_day_view_on_editing_stopped (EDayView *day_view, CalObjModType mod; if (recur_component_dialog (event->comp, &mod, NULL)) { - if (cal_client_update_object_with_mod (day_view->client, event->comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (event->comp, day_view->client) + if (cal_client_update_object_with_mod (client, event->comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (event->comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, event->comp, FALSE)) + client, event->comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, event->comp, - day_view->client, NULL); + client, NULL); } else { g_message ("e_day_view_on_editing_stopped(): Could not update the object!"); } } - } else if (cal_client_update_object (day_view->client, event->comp) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (event->comp, day_view->client) && + } else if (cal_client_update_object (client, event->comp) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (event->comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, event->comp, FALSE)) + client, event->comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, event->comp, - day_view->client, NULL); + client, NULL); } else { g_message ("e_day_view_on_editing_stopped(): Could not update the object!"); } @@ -7606,6 +7407,9 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget, struct icaltimetype itt; time_t dt; gboolean all_day_event; + CalClient *client; + + client = e_cal_view_get_cal_client (E_CAL_VIEW (day_view)); /* Note that we only support DnD within the EDayView at present. */ if ((data->length >= 0) && (data->format == 8) @@ -7706,24 +7510,24 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget, CalObjModType mod; if (recur_component_dialog (comp, &mod, NULL)) { - if (cal_client_update_object_with_mod (day_view->client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) + if (cal_client_update_object_with_mod (client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, comp, FALSE)) + client, comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, - day_view->client, NULL); + client, NULL); } else { g_message ("e_day_view_on_top_canvas_drag_data_received(): Could " "not update the object!"); } } - } else if (cal_client_update_object (day_view->client, comp) + } else if (cal_client_update_object (client, comp) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) && + if (itip_organizer_is_user (comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, comp, FALSE)) + client, comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, - day_view->client, NULL); + client, NULL); } else { g_message ("e_day_view_on_top_canvas_drag_data_received(): Could " "not update the object!"); @@ -7758,6 +7562,9 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget, CalComponentDateTime date; struct icaltimetype itt; time_t dt; + CalClient *client; + + client = e_cal_view_get_cal_client (E_CAL_VIEW (day_view)); gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget), &scroll_x, &scroll_y); @@ -7837,24 +7644,23 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget, CalObjModType mod; if (recur_component_dialog (comp, &mod, NULL)) { - if (cal_client_update_object_with_mod (day_view->client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) + if (cal_client_update_object_with_mod (client, comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, comp, FALSE)) + client, comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, - day_view->client, NULL); + client, NULL); } else { g_message ("e_day_view_on_top_canvas_drag_data_received(): Could " "not update the object!"); } } - } else if (cal_client_update_object (day_view->client, comp) - == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (comp, day_view->client) && + } else if (cal_client_update_object (client, comp) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (comp, client) && send_component_dialog (gtk_widget_get_toplevel (day_view), - day_view->client, comp, FALSE)) + client, comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, - day_view->client, NULL); + client, NULL); } else { g_message ("e_day_view_on_main_canvas_drag_data_received(): " "Could not update the object!"); @@ -7916,139 +7722,6 @@ e_day_view_get_time_string_width (EDayView *day_view) return time_width; } -static void -selection_get (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint info, - guint time_stamp, - EDayView *day_view) -{ - if (day_view->clipboard_selection != NULL) { - gtk_selection_data_set (selection_data, - GDK_SELECTION_TYPE_STRING, - 8, - day_view->clipboard_selection, - strlen (day_view->clipboard_selection)); - } -} - -static void -selection_clear_event (GtkWidget *invisible, - GdkEventSelection *event, - EDayView *day_view) -{ - if (day_view->clipboard_selection != NULL) { - g_free (day_view->clipboard_selection); - day_view->clipboard_selection = NULL; - } -} - -static void -selection_received (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint time, - EDayView *day_view) -{ - char *comp_str; - icalcomponent *icalcomp; - time_t dtstart, dtend; - struct icaltimetype itime; - icalcomponent_kind kind; - CalComponent *comp; - char *uid; - time_t tt_start, tt_end; - struct icaldurationtype ic_dur; - - g_return_if_fail (E_IS_DAY_VIEW (day_view)); - - if (selection_data->length < 0 || - selection_data->type != GDK_SELECTION_TYPE_STRING) { - return; - } - - comp_str = (char *) selection_data->data; - icalcomp = icalparser_parse_string ((const char *) comp_str); - if (!icalcomp) - return; - - /* check the type of the component */ - kind = icalcomponent_isa (icalcomp); - if (kind != ICAL_VCALENDAR_COMPONENT && - kind != ICAL_VEVENT_COMPONENT && - kind != ICAL_VTODO_COMPONENT && - kind != ICAL_VJOURNAL_COMPONENT) { - return; - } - - e_cal_view_set_status_message (E_CAL_VIEW (day_view), _("Updating objects")); - e_day_view_get_selected_time_range (day_view, &dtstart, &dtend); - - if (kind == ICAL_VCALENDAR_COMPONENT) { - icalcomponent_kind child_kind; - icalcomponent *subcomp; - - subcomp = icalcomponent_get_first_component ( - icalcomp, ICAL_ANY_COMPONENT); - while (subcomp) { - child_kind = icalcomponent_isa (subcomp); - if (child_kind == ICAL_VEVENT_COMPONENT || - child_kind == ICAL_VTODO_COMPONENT || - child_kind == ICAL_VJOURNAL_COMPONENT) { - tt_start = icaltime_as_timet (icalcomponent_get_dtstart (subcomp)); - tt_end = icaltime_as_timet (icalcomponent_get_dtend (subcomp)); - ic_dur = icaldurationtype_from_int (tt_end - tt_start); - itime = icaltime_from_timet_with_zone (dtstart, FALSE, day_view->zone); - - icalcomponent_set_dtstart (subcomp, itime); - itime = icaltime_add (itime, ic_dur); - icalcomponent_set_dtend (subcomp, itime); - - uid = cal_component_gen_uid (); - comp = cal_component_new (); - cal_component_set_icalcomponent ( - comp, icalcomponent_new_clone (subcomp)); - cal_component_set_uid (comp, uid); - - cal_client_update_object (day_view->client, comp); - - free (uid); - g_object_unref (comp); - - } - subcomp = icalcomponent_get_next_component ( - icalcomp, ICAL_ANY_COMPONENT); - } - } - else { - tt_start = icaltime_as_timet (icalcomponent_get_dtstart (icalcomp)); - tt_end = icaltime_as_timet (icalcomponent_get_dtend (icalcomp)); - ic_dur = icaldurationtype_from_int (tt_end - tt_start); - itime = icaltime_from_timet_with_zone (dtstart, FALSE, day_view->zone); - - icalcomponent_set_dtstart (icalcomp, itime); - itime = icaltime_add (itime, ic_dur); - icalcomponent_set_dtend (icalcomp, itime); - - comp = cal_component_new (); - cal_component_set_icalcomponent (comp, icalcomp); - - uid = cal_component_gen_uid (); - cal_component_set_uid (comp, (const char *) uid); - free (uid); - - cal_client_update_object (day_view->client, comp); - - if (itip_organizer_is_user (comp, day_view->client) && - send_component_dialog (gtk_widget_get_toplevel (day_view), day_view->client, comp, TRUE)) - itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, day_view->client, NULL); - - g_object_unref (comp); - } - - e_cal_view_set_status_message (E_CAL_VIEW (day_view), NULL); -} - - /* Gets the visible time range. Returns FALSE if no time range has been set. */ gboolean e_day_view_get_visible_time_range (EDayView *day_view, @@ -8110,23 +7783,4 @@ e_day_view_get_num_events_selected (EDayView *day_view) return (day_view->editing_event_day != -1) ? 1 : 0; } -/* Returns the currently-selected event, or NULL if none */ -CalComponent * -e_day_view_get_selected_event (EDayView *day_view) -{ - EDayViewEvent *event; - - g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL); - g_return_val_if_fail (day_view->editing_event_day != -1, NULL); - if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT) - event = &g_array_index (day_view->long_events, - EDayViewEvent, - day_view->editing_event_num); - else - event = &g_array_index (day_view->events[day_view->editing_event_day], - EDayViewEvent, - day_view->editing_event_num); - - return event ? event->comp : NULL; -} diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h index 3bbf793ffb..dd95eba078 100644 --- a/calendar/gui/e-day-view.h +++ b/calendar/gui/e-day-view.h @@ -240,11 +240,7 @@ struct _EDayView GtkWidget *vscrollbar; - /* Calendar client object we are monitoring */ - CalClient *client; - /* S-expression for query and the query object */ - char *sexp; CalQuery *query; /* The start and end of the days shown. */ @@ -491,10 +487,6 @@ struct _EDayView gint am_string_width; gint pm_string_width; - /* the invisible widget to manage the clipboard selections */ - GtkWidget *invisible; - gchar *clipboard_selection; - /* The default category for new events */ char *default_category; @@ -511,28 +503,12 @@ struct _EDayViewClass GtkType e_day_view_get_type (void); GtkWidget* e_day_view_new (void); -void e_day_view_set_cal_client (EDayView *day_view, - CalClient *client); - void e_day_view_set_query (EDayView *day_view, const char *sexp); void e_day_view_set_default_category (EDayView *day_view, const char *category); -/* This sets the selected time range. The EDayView will show the day or week - corresponding to the start time. If the start_time & end_time are not equal - and are both visible in the view, then the selection is set to those times, - otherwise it is set to 1 hour from the start of the working day. */ -void e_day_view_set_selected_time_range (EDayView *day_view, - time_t start_time, - time_t end_time); - -/* Returns the selected time range. */ -void e_day_view_get_selected_time_range (EDayView *day_view, - time_t *start_time, - time_t *end_time); - /* Gets the visible time range. Returns FALSE if no time range has been set. */ gboolean e_day_view_get_visible_time_range (EDayView *day_view, time_t *start_time, diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index 8d3ef6a26f..d3573db107 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -33,7 +33,6 @@ #include <math.h> #include <gdk/gdkkeysyms.h> -#include <gtk/gtkinvisible.h> #include <gtk/gtkselection.h> #include <gtk/gtksignal.h> #include <gtk/gtkvscrollbar.h> @@ -111,6 +110,10 @@ static gboolean e_week_view_get_next_tab_event (EWeekView *week_view, gint *next_span_num); static gboolean e_week_view_focus (GtkWidget *widget, GtkDirectionType direction); +static GList *e_week_view_get_selected_events (ECalView *cal_view); +static void e_week_view_get_selected_time_range (EWeekView *cal_view, time_t *start_time, time_t *end_time); +static void e_week_view_set_selected_time_range (EWeekView *cal_view, time_t start_time, time_t end_time); +static void e_week_view_update_query (EWeekView *week_view); static void e_week_view_draw_shadow (EWeekView *week_view); static gboolean e_week_view_on_button_press (GtkWidget *widget, @@ -222,25 +225,11 @@ static gboolean e_week_view_remove_event_cb (EWeekView *week_view, gpointer data); static gboolean e_week_view_recalc_display_start_day (EWeekView *week_view); -static void selection_get (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint info, - guint time_stamp, - EWeekView *week_view); -static void selection_clear_event (GtkWidget *invisible, - GdkEventSelection *event, - EWeekView *week_view); -static void selection_received (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint time, - EWeekView *week_view); - static void e_week_view_queue_layout (EWeekView *week_view); static void e_week_view_cancel_layout (EWeekView *week_view); static gboolean e_week_view_layout_timeout_cb (gpointer data); static ECalViewClass *parent_class; -static GdkAtom clipboard_atom = GDK_NONE; E_MAKE_TYPE (e_week_view, "EWeekView", EWeekView, e_week_view_class_init, e_week_view_init, e_cal_view_get_type ()); @@ -250,10 +239,12 @@ e_week_view_class_init (EWeekViewClass *class) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; + ECalViewClass *view_class; parent_class = g_type_class_peek_parent (class); object_class = (GtkObjectClass *) class; widget_class = (GtkWidgetClass *) class; + view_class = (ECalViewClass *) class; /* Method override */ object_class->destroy = e_week_view_destroy; @@ -269,9 +260,10 @@ e_week_view_class_init (EWeekViewClass *class) widget_class->expose_event = e_week_view_expose_event; widget_class->focus = e_week_view_focus; - /* clipboard atom */ - if (!clipboard_atom) - clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); + view_class->get_selected_events = e_week_view_get_selected_events; + view_class->get_selected_time_range = e_week_view_get_selected_time_range; + view_class->set_selected_time_range = e_week_view_set_selected_time_range; + view_class->update_query = e_week_view_update_query; } @@ -285,8 +277,6 @@ e_week_view_init (EWeekView *week_view) GTK_WIDGET_SET_FLAGS (week_view, GTK_CAN_FOCUS); - week_view->client = NULL; - week_view->sexp = g_strdup ("#t"); /* match all by default */ week_view->query = NULL; week_view->events = g_array_new (FALSE, FALSE, @@ -415,22 +405,6 @@ e_week_view_init (EWeekView *week_view) week_view->move_cursor = gdk_cursor_new (GDK_FLEUR); week_view->resize_width_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW); week_view->last_cursor_set = NULL; - - /* Set up the inivisible widget for the clipboard selections */ - week_view->invisible = gtk_invisible_new (); - gtk_selection_add_target (week_view->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - 0); - - g_signal_connect (week_view->invisible, "selection_get", - G_CALLBACK (selection_get), (gpointer) week_view); - g_signal_connect (week_view->invisible, "selection_clear_event", - G_CALLBACK (selection_clear_event), (gpointer) week_view); - g_signal_connect (week_view->invisible, "selection_received", - G_CALLBACK (selection_received), (gpointer) week_view); - - week_view->clipboard_selection = NULL; } @@ -466,15 +440,10 @@ e_week_view_destroy (GtkObject *object) week_view->events = NULL; } - if (week_view->client) { - g_signal_handlers_disconnect_matched (week_view->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, week_view); - g_object_unref (week_view->client); - week_view->client = NULL; - } - - if (week_view->sexp) { - g_free (week_view->sexp); - week_view->sexp = NULL; + if (e_cal_view_get_cal_client (E_CAL_VIEW (week_view))) { + g_signal_handlers_disconnect_matched ( + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, week_view); } if (week_view->query) { @@ -506,15 +475,6 @@ e_week_view_destroy (GtkObject *object) gdk_cursor_unref (week_view->resize_width_cursor); week_view->resize_width_cursor = NULL; } - - if (week_view->invisible) { - gtk_widget_destroy (week_view->invisible); - week_view->invisible = NULL; - } - if (week_view->clipboard_selection) { - g_free (week_view->clipboard_selection); - week_view->clipboard_selection = NULL; - } GTK_OBJECT_CLASS (parent_class)->destroy (object); } @@ -1057,58 +1017,24 @@ e_week_view_focus (GtkWidget *widget, GtkDirectionType direction) return editable; } -static void -e_week_view_draw_shadow (EWeekView *week_view) +/* Returns the currently-selected event, or NULL if none */ +static GList * +e_week_view_get_selected_events (ECalView *cal_view) { - gint x1, y1, x2, y2; - GtkStyle *style; - GdkGC *light_gc, *dark_gc; - GdkWindow *window; - - /* Draw the shadow around the graphical displays. */ - x1 = week_view->main_canvas->allocation.x - 1; - y1 = week_view->main_canvas->allocation.y - 1; - x2 = x1 + week_view->main_canvas->allocation.width + 2; - y2 = y1 + week_view->main_canvas->allocation.height + 2; - - style = GTK_WIDGET (week_view)->style; - dark_gc = style->dark_gc[GTK_STATE_NORMAL]; - light_gc = style->light_gc[GTK_STATE_NORMAL]; + EWeekViewEvent *event; + GList *list = NULL; + EWeekView *week_view = (EWeekView *) cal_view; - window = GTK_WIDGET (week_view)->window; - gdk_draw_line (window, dark_gc, x1, y1, x1, y2); - gdk_draw_line (window, dark_gc, x1, y1, x2, y1); - gdk_draw_line (window, light_gc, x2, y1, x2, y2); - gdk_draw_line (window, light_gc, x1, y2, x2, y2); -} + g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL); + g_return_val_if_fail (week_view->editing_event_num != -1, NULL); -static void -e_week_view_new_appointment (EWeekView *week_view, gboolean meeting) -{ - time_t dtstart, dtend; - struct icaltimetype itt; - gboolean all_day = FALSE; - - /* Edit a new event. If only one day is selected we set the time to - the first 1/2-hour of the working day. */ - if (week_view->selection_start_day == week_view->selection_end_day) { - dtstart = week_view->day_starts[week_view->selection_start_day]; - itt = icaltime_from_timet_with_zone (dtstart, FALSE, - week_view->zone); - itt.hour = calendar_config_get_day_start_hour (); - itt.minute = calendar_config_get_day_start_minute (); - dtstart = icaltime_as_timet_with_zone (itt, week_view->zone); + event = &g_array_index (week_view->events, EWeekViewEvent, + week_view->editing_event_num); - icaltime_adjust (&itt, 0, 0, 30, 0); - dtend = icaltime_as_timet_with_zone (itt, week_view->zone); - } else { - dtstart = week_view->day_starts[week_view->selection_start_day]; - dtend = week_view->day_starts[week_view->selection_end_day + 1]; - all_day = TRUE; - } + if (event) + list = g_list_prepend (list, event->comp); - gnome_calendar_new_appointment_for (e_cal_view_get_calendar (E_CAL_VIEW (week_view)), - dtstart, dtend, all_day, meeting); + return list; } /* Callback used when a component is updated in the live query */ @@ -1130,7 +1056,7 @@ query_obj_updated_cb (CalQuery *query, const char *uid, return; /* Get the event from the server. */ - status = cal_client_get_object (week_view->client, uid, &comp); + status = cal_client_get_object (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), uid, &comp); switch (status) { case CAL_CLIENT_GET_SUCCESS: @@ -1182,7 +1108,8 @@ query_obj_updated_cb (CalQuery *query, const char *uid, week_view->day_starts[0], week_view->day_starts[num_days], e_week_view_add_event, week_view, - cal_client_resolve_tzid_cb, week_view->client, + cal_client_resolve_tzid_cb, + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), week_view->zone); g_object_unref (comp); @@ -1274,7 +1201,7 @@ adjust_query_sexp (EWeekView *week_view, const char *sexp) /* Restarts a query for the week view */ static void -update_query (EWeekView *week_view) +e_week_view_update_query (EWeekView *week_view) { CalQuery *old_query; char *real_sexp; @@ -1283,10 +1210,6 @@ update_query (EWeekView *week_view) e_week_view_free_events (week_view); e_week_view_queue_layout (week_view); - if (!(week_view->client - && cal_client_get_load_state (week_view->client) == CAL_CLIENT_LOAD_LOADED)) - return; - old_query = week_view->query; week_view->query = NULL; @@ -1296,19 +1219,19 @@ update_query (EWeekView *week_view) g_object_unref (old_query); } - g_assert (week_view->sexp != NULL); + g_assert (e_cal_view_get_query (E_CAL_VIEW (week_view)) != NULL); - real_sexp = adjust_query_sexp (week_view, week_view->sexp); + real_sexp = adjust_query_sexp (week_view, e_cal_view_get_query (E_CAL_VIEW (week_view))); if (!real_sexp) { return; /* No time range is set, so don't start a query */ } e_cal_view_set_status_message (E_CAL_VIEW (week_view), _("Searching")); - week_view->query = cal_client_get_query (week_view->client, real_sexp); + week_view->query = cal_client_get_query (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), real_sexp); g_free (real_sexp); if (!week_view->query) { - g_message ("update_query(): Could not create the query"); + g_message ("e_week_view_update_query(): Could not create the query"); return; } @@ -1322,83 +1245,60 @@ update_query (EWeekView *week_view) G_CALLBACK (query_eval_error_cb), week_view); } -/* Callback used when the calendar client finishes opening */ static void -cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer data) +e_week_view_draw_shadow (EWeekView *week_view) { - EWeekView *week_view; + gint x1, y1, x2, y2; + GtkStyle *style; + GdkGC *light_gc, *dark_gc; + GdkWindow *window; - week_view = E_WEEK_VIEW (data); + /* Draw the shadow around the graphical displays. */ + x1 = week_view->main_canvas->allocation.x - 1; + y1 = week_view->main_canvas->allocation.y - 1; + x2 = x1 + week_view->main_canvas->allocation.width + 2; + y2 = y1 + week_view->main_canvas->allocation.height + 2; - if (status != CAL_CLIENT_OPEN_SUCCESS) - return; + style = GTK_WIDGET (week_view)->style; + dark_gc = style->dark_gc[GTK_STATE_NORMAL]; + light_gc = style->light_gc[GTK_STATE_NORMAL]; - update_query (week_view); + window = GTK_WIDGET (week_view)->window; + gdk_draw_line (window, dark_gc, x1, y1, x1, y2); + gdk_draw_line (window, dark_gc, x1, y1, x2, y1); + gdk_draw_line (window, light_gc, x2, y1, x2, y2); + gdk_draw_line (window, light_gc, x1, y2, x2, y2); } -/** - * e_week_view_set_cal_client: - * @week_view: A week view. - * @client: A calendar client interface object. - * - * Sets the calendar client interface object that a week view will monitor. - **/ -void -e_week_view_set_cal_client (EWeekView *week_view, - CalClient *client) +static void +e_week_view_new_appointment (EWeekView *week_view, gboolean meeting) { - g_return_if_fail (week_view != NULL); - g_return_if_fail (E_IS_WEEK_VIEW (week_view)); - - if (client == week_view->client) - return; - - if (client) - g_return_if_fail (IS_CAL_CLIENT (client)); - - if (client) - g_object_ref (client); - - if (week_view->client) { - g_signal_handlers_disconnect_matched (week_view->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, week_view); - g_object_unref (week_view->client); - } - - week_view->client = client; + time_t dtstart, dtend; + struct icaltimetype itt; + gboolean all_day = FALSE; + + /* Edit a new event. If only one day is selected we set the time to + the first 1/2-hour of the working day. */ + if (week_view->selection_start_day == week_view->selection_end_day) { + dtstart = week_view->day_starts[week_view->selection_start_day]; + itt = icaltime_from_timet_with_zone (dtstart, FALSE, + week_view->zone); + itt.hour = calendar_config_get_day_start_hour (); + itt.minute = calendar_config_get_day_start_minute (); + dtstart = icaltime_as_timet_with_zone (itt, week_view->zone); - if (week_view->client) { - if (cal_client_get_load_state (week_view->client) == CAL_CLIENT_LOAD_LOADED) - update_query (week_view); - else - g_signal_connect (week_view->client, "cal_opened", - G_CALLBACK (cal_opened_cb), week_view); + icaltime_adjust (&itt, 0, 0, 30, 0); + dtend = icaltime_as_timet_with_zone (itt, week_view->zone); + } else { + dtstart = week_view->day_starts[week_view->selection_start_day]; + dtend = week_view->day_starts[week_view->selection_end_day + 1]; + all_day = TRUE; } -} - -/** - * e_week_view_set_query: - * @week_view: A week view. - * @sexp: S-expression that defines the query. - * - * Sets the query sexp that the week view will use for filtering the displayed - * events. - **/ -void -e_week_view_set_query (EWeekView *week_view, const char *sexp) -{ - g_return_if_fail (week_view != NULL); - g_return_if_fail (E_IS_WEEK_VIEW (week_view)); - g_return_if_fail (sexp != NULL); - - if (week_view->sexp) - g_free (week_view->sexp); - week_view->sexp = g_strdup (sexp); - - update_query (week_view); + gnome_calendar_new_appointment_for (e_cal_view_get_calendar (E_CAL_VIEW (week_view)), + dtstart, dtend, all_day, meeting); } - /** * e_week_view_set_default_category: * @week_view: A week view. @@ -1423,7 +1323,7 @@ e_week_view_set_default_category (EWeekView *week_view, const char *category) /* This sets the selected time range. The EWeekView will show the corresponding month and the days between start_time and end_time will be selected. To select a single day, use the same value for start_time & end_time. */ -void +static void e_week_view_set_selected_time_range (EWeekView *week_view, time_t start_time, time_t end_time) @@ -1487,7 +1387,7 @@ e_week_view_set_selected_time_range (EWeekView *week_view, start_time = time_day_begin_with_zone (start_time, week_view->zone); e_week_view_recalc_day_starts (week_view, start_time); - update_query (week_view); + e_week_view_update_query (week_view); } /* Set the selection to the given days. */ @@ -1560,7 +1460,7 @@ e_week_view_set_selected_time_range_visible (EWeekView *week_view, /* Returns the selected time range. */ -void +static void e_week_view_get_selected_time_range (EWeekView *week_view, time_t *start_time, time_t *end_time) @@ -1648,7 +1548,7 @@ e_week_view_set_first_day_shown (EWeekView *week_view, week_view->zone); e_week_view_recalc_day_starts (week_view, start_time); - update_query (week_view); + e_week_view_update_query (week_view); } /* Try to keep the previous selection, but if it is no longer shown @@ -1785,7 +1685,7 @@ e_week_view_set_weeks_shown (EWeekView *week_view, if (g_date_valid (&week_view->first_day_shown)) e_week_view_set_first_day_shown (week_view, &week_view->first_day_shown); - update_query (week_view); + e_week_view_update_query (week_view); } } @@ -1960,79 +1860,9 @@ e_week_view_set_timezone (EWeekView *week_view, lower = icaltime_as_timet_with_zone (tt, zone); e_week_view_recalc_day_starts (week_view, lower); - update_query (week_view); + e_week_view_update_query (week_view); } - -void -e_week_view_cut_clipboard (EWeekView *week_view) -{ - EWeekViewEvent *event; - const char *uid; - - g_return_if_fail (E_IS_WEEK_VIEW (week_view)); - - if (week_view->editing_event_num == -1) - return; - - event = &g_array_index (week_view->events, EWeekViewEvent, - week_view->editing_event_num); - if (event == NULL) - return; - - e_cal_view_set_status_message (E_CAL_VIEW (week_view), _("Deleting selected objects")); - - e_week_view_copy_clipboard (week_view); - cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object (week_view->client, uid), CAL_COMPONENT_EVENT); - - e_cal_view_set_status_message (E_CAL_VIEW (week_view), NULL); -} - -void -e_week_view_copy_clipboard (EWeekView *week_view) -{ - EWeekViewEvent *event; - char *comp_str; - icalcomponent *vcal_comp; - icalcomponent *new_icalcomp; - - g_return_if_fail (E_IS_WEEK_VIEW (week_view)); - - event = &g_array_index (week_view->events, EWeekViewEvent, - week_view->editing_event_num); - if (event == NULL) - return; - - /* create top-level VCALENDAR component and add VTIMEZONE's */ - vcal_comp = cal_util_new_top_level (); - cal_util_add_timezones_from_component (vcal_comp, event->comp); - - new_icalcomp = icalcomponent_new_clone (cal_component_get_icalcomponent (event->comp)); - icalcomponent_add_component (vcal_comp, new_icalcomp); - - comp_str = icalcomponent_as_ical_string (vcal_comp); - if (week_view->clipboard_selection != NULL) - g_free (week_view->clipboard_selection); - week_view->clipboard_selection = g_strdup (comp_str); - gtk_selection_owner_set (week_view->invisible, clipboard_atom, GDK_CURRENT_TIME); - - /* free memory */ - icalcomponent_free (vcal_comp); -} - -void -e_week_view_paste_clipboard (EWeekView *week_view) -{ - g_return_if_fail (E_IS_WEEK_VIEW (week_view)); - - gtk_selection_convert (week_view->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - GDK_CURRENT_TIME); -} - - static gboolean e_week_view_recalc_display_start_day (EWeekView *week_view) { @@ -2593,7 +2423,7 @@ e_week_view_add_event (CalComponent *comp, event.end_minute = 24 * 60; event.different_timezone = FALSE; - if (!cal_comp_util_compare_event_timezones (comp, week_view->client, + if (!cal_comp_util_compare_event_timezones (comp, e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), week_view->zone)) event.different_timezone = TRUE; @@ -3016,7 +2846,7 @@ e_week_view_on_adjustment_changed (GtkAdjustment *adjustment, lower = icaltime_as_timet_with_zone (start_tt, week_view->zone); e_week_view_recalc_day_starts (week_view, lower); - update_query (week_view); + e_week_view_update_query (week_view); /* Update the selection, if needed. */ if (week_view->selection_start_day != -1) { @@ -3346,7 +3176,9 @@ e_week_view_on_editing_stopped (EWeekView *week_view, g_object_get (G_OBJECT (span->text_item), "text", &text, NULL); g_assert (text != NULL); - if (string_is_empty (text) && !cal_comp_is_on_server (event->comp, week_view->client)) { + if (string_is_empty (text) && + !cal_comp_is_on_server (event->comp, + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)))) { const char *uid; cal_component_get_uid (event->comp, &uid); @@ -3365,30 +3197,33 @@ e_week_view_on_editing_stopped (EWeekView *week_view, e_week_view_reshape_event_span (week_view, event_num, span_num); } else if (summary.value || !string_is_empty (text)) { + CalClient *client; summary.value = text; summary.altrep = NULL; cal_component_set_summary (event->comp, &summary); + client = e_cal_view_get_cal_client (E_CAL_VIEW (week_view)); if (cal_component_is_instance (event->comp)) { CalObjModType mod; - + if (recur_component_dialog (event->comp, &mod, NULL)) { - if (cal_client_update_object_with_mod (week_view->client, event->comp, mod) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (event->comp, week_view->client) + if (cal_client_update_object_with_mod (client, event->comp, mod) + == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (event->comp, client) && send_component_dialog (gtk_widget_get_toplevel (week_view), - week_view->client, event->comp, FALSE)) + client, event->comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, event->comp, - week_view->client, NULL); + client, NULL); } else { g_message ("e_week_view_on_editing_stopped(): Could not update the object!"); } } - } else if (cal_client_update_object (week_view->client, event->comp) == CAL_CLIENT_RESULT_SUCCESS) { - if (itip_organizer_is_user (event->comp, week_view->client) && + } else if (cal_client_update_object (client, event->comp) == CAL_CLIENT_RESULT_SUCCESS) { + if (itip_organizer_is_user (event->comp, client) && send_component_dialog (gtk_widget_get_toplevel (week_view), - week_view->client, event->comp, FALSE)) + client, event->comp, FALSE)) itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, event->comp, - week_view->client, NULL); + client, NULL); } else { g_message ("e_week_view_on_editing_stopped(): Could not update the object!"); } @@ -3508,7 +3343,8 @@ e_week_view_do_key_press (GtkWidget *widget, GdkEventKey *event) week_view = E_WEEK_VIEW (widget); - if (cal_client_get_load_state (week_view->client) != CAL_CLIENT_LOAD_LOADED) + if (cal_client_get_load_state (e_cal_view_get_cal_client (E_CAL_VIEW (week_view))) + != CAL_CLIENT_LOAD_LOADED) return TRUE; /* The Escape key aborts a resize operation. */ @@ -3537,7 +3373,7 @@ e_week_view_do_key_press (GtkWidget *widget, GdkEventKey *event) initial_text = e_utf8_from_gtk_event_key (widget, event->keyval, event->string); /* Add a new event covering the selected range. */ - comp = cal_comp_event_new_with_defaults (week_view->client); + comp = cal_comp_event_new_with_defaults (e_cal_view_get_cal_client (E_CAL_VIEW (week_view))); dtstart = week_view->day_starts[week_view->selection_start_day]; dtend = week_view->day_starts[week_view->selection_end_day + 1]; @@ -3747,12 +3583,13 @@ e_week_view_show_popup_menu (EWeekView *week_view, if (cal_component_has_organizer (event->comp)) { disable_mask |= MASK_MEETING; - if (!itip_organizer_is_user (event->comp, week_view->client)) + if (!itip_organizer_is_user (event->comp, + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)))) disable_mask |= MASK_MEETING_ORGANIZER; } } - if (cal_client_is_read_only (week_view->client)) + if (cal_client_is_read_only (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)))) disable_mask |= MASK_EDITABLE; if (being_edited) @@ -3899,7 +3736,8 @@ e_week_view_on_save_as (GtkWidget *widget, gpointer data) if (filename == NULL) return; - ical_string = cal_client_get_component_as_string (week_view->client, event->comp); + ical_string = cal_client_get_component_as_string (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), + event->comp); if (ical_string == NULL) { g_warning ("Couldn't convert item to a string"); return; @@ -3930,7 +3768,7 @@ e_week_view_on_print_event (GtkWidget *widget, gpointer data) event = &g_array_index (week_view->events, EWeekViewEvent, week_view->popup_event_num); - print_comp (event->comp, week_view->client, FALSE); + print_comp (event->comp, e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), FALSE); } static void @@ -3970,7 +3808,7 @@ e_week_view_on_forward (GtkWidget *widget, gpointer data) week_view->popup_event_num); itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, event->comp, - week_view->client, NULL); + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL); } static void @@ -3987,14 +3825,15 @@ e_week_view_on_publish (GtkWidget *widget, gpointer data) start = time_day_begin_with_zone (start, utc); end = time_add_week_with_zone (start, 6, utc); - comp_list = cal_client_get_free_busy (week_view->client, NULL, start, end); + comp_list = cal_client_get_free_busy (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL, + start, end); if (comp_list) { GList *l; for (l = comp_list; l; l = l->next) { CalComponent *comp = CAL_COMPONENT (l->data); itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, comp, - week_view->client, NULL); + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL); g_object_unref (comp); } @@ -4028,14 +3867,19 @@ e_week_view_delete_event_internal (EWeekView *week_view, gint event_num) GTK_WIDGET (week_view))) { const char *uid; - if (itip_organizer_is_user (event->comp, week_view->client) + if (itip_organizer_is_user (event->comp, + e_cal_view_get_cal_client (E_CAL_VIEW (week_view))) && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (week_view), - week_view->client, event->comp, TRUE)) - itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp, week_view->client, NULL); + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), + event->comp, TRUE)) + itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp, + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL); cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object (week_view->client, uid), CAL_COMPONENT_EVENT); + delete_error_dialog ( + cal_client_remove_object (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), + uid), CAL_COMPONENT_EVENT); } } @@ -4081,7 +3925,9 @@ e_week_view_delete_occurrence_internal (EWeekView *week_view, gint event_num) const char *uid; cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object_with_mod (week_view->client, uid, CALOBJ_MOD_THIS), + delete_error_dialog (cal_client_remove_object_with_mod ( + e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), + uid, CALOBJ_MOD_THIS), CAL_COMPONENT_EVENT); return; } @@ -4092,7 +3938,8 @@ e_week_view_delete_occurrence_internal (EWeekView *week_view, gint event_num) comp = cal_component_clone (event->comp); cal_comp_util_add_exdate (comp, event->start, week_view->zone); - if (cal_client_update_object (week_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS) + if (cal_client_update_object (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), comp) + != CAL_CLIENT_RESULT_SUCCESS) g_message ("e_week_view_on_delete_occurrence(): Could not update the object!"); g_object_unref (comp); @@ -4125,62 +3972,17 @@ e_week_view_delete_occurrence (EWeekView *week_view) static void e_week_view_on_cut (GtkWidget *widget, gpointer data) { - EWeekView *week_view; - EWeekViewEvent *event; - const char *uid; - - week_view = E_WEEK_VIEW (data); + EWeekView *week_view = E_WEEK_VIEW (data); - e_week_view_on_copy (widget, data); - - if (week_view->popup_event_num == -1) - return; - - event = &g_array_index (week_view->events, EWeekViewEvent, - week_view->popup_event_num); - - if (itip_organizer_is_user (event->comp, week_view->client) - && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (week_view), - week_view->client, event->comp, TRUE)) - itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp, week_view->client, NULL); - - cal_component_get_uid (event->comp, &uid); - delete_error_dialog (cal_client_remove_object (week_view->client, uid), CAL_COMPONENT_EVENT); + e_cal_view_cut_clipboard (E_CAL_VIEW (week_view)); } static void e_week_view_on_copy (GtkWidget *widget, gpointer data) { - EWeekView *week_view; - EWeekViewEvent *event; - char *comp_str; - icalcomponent *vcal_comp; - icalcomponent *new_icalcomp; - - week_view = E_WEEK_VIEW (data); - - if (week_view->popup_event_num == -1) - return; - - event = &g_array_index (week_view->events, EWeekViewEvent, - week_view->popup_event_num); - - /* create top-level VCALENDAR component and add VTIMEZONE's */ - vcal_comp = cal_util_new_top_level (); - cal_util_add_timezones_from_component (vcal_comp, event->comp); - - new_icalcomp = icalcomponent_new_clone (cal_component_get_icalcomponent (event->comp)); - icalcomponent_add_component (vcal_comp, new_icalcomp); - - comp_str = icalcomponent_as_ical_string (vcal_comp); - if (week_view->clipboard_selection) - g_free (week_view->clipboard_selection); - week_view->clipboard_selection = g_strdup (comp_str); - - gtk_selection_owner_set (week_view->invisible, clipboard_atom, GDK_CURRENT_TIME); + EWeekView *week_view = E_WEEK_VIEW (data); - /* free memory */ - icalcomponent_free (vcal_comp); + e_cal_view_copy_clipboard (E_CAL_VIEW (week_view)); } static void @@ -4188,10 +3990,7 @@ e_week_view_on_paste (GtkWidget *widget, gpointer data) { EWeekView *week_view = E_WEEK_VIEW (data); - gtk_selection_convert (week_view->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - GDK_CURRENT_TIME); + e_cal_view_paste_clipboard (E_CAL_VIEW (week_view)); } static void @@ -4239,12 +4038,14 @@ e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data) /* Now update both CalComponents. Note that we do this last since at present the updates happen synchronously so our event may disappear. */ - if (cal_client_update_object (week_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS) + if (cal_client_update_object (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), comp) + != CAL_CLIENT_RESULT_SUCCESS) g_message ("e_week_view_on_unrecur_appointment(): Could not update the object!"); g_object_unref (comp); - if (cal_client_update_object (week_view->client, new_comp) != CAL_CLIENT_RESULT_SUCCESS) + if (cal_client_update_object (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), new_comp) + != CAL_CLIENT_RESULT_SUCCESS) g_message ("e_week_view_on_unrecur_appointment(): Could not update the object!"); g_object_unref (new_comp); @@ -4331,170 +4132,6 @@ e_week_view_get_time_string_width (EWeekView *week_view) return time_width; } -static void -selection_get (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint info, - guint time_stamp, - EWeekView *week_view) -{ - if (week_view->clipboard_selection != NULL) { - gtk_selection_data_set (selection_data, - GDK_SELECTION_TYPE_STRING, - 8, - week_view->clipboard_selection, - strlen (week_view->clipboard_selection)); - } -} - -static void -selection_clear_event (GtkWidget *invisible, - GdkEventSelection *event, - EWeekView *week_view) -{ - if (week_view->clipboard_selection != NULL) { - g_free (week_view->clipboard_selection); - week_view->clipboard_selection = NULL; - } -} - -static void -selection_received (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint time, - EWeekView *week_view) -{ - char *comp_str; - icalcomponent *icalcomp; - icalcomponent_kind kind; - CalComponent *comp; - time_t selected_time; - struct icaltimetype itime; - struct icaltimetype tmp_itime; - time_t tt_start, tt_end; - struct icaldurationtype ic_dur; - char *uid; - CalComponentDateTime ccdt; - - g_return_if_fail (E_IS_WEEK_VIEW (week_view)); - - if (selection_data->length < 0 || - selection_data->type != GDK_SELECTION_TYPE_STRING) { - return; - } - - comp_str = (char *) selection_data->data; - icalcomp = icalparser_parse_string ((const char *) comp_str); - if (!icalcomp) - return; - - /* check the type of the component */ - kind = icalcomponent_isa (icalcomp); - if (kind != ICAL_VCALENDAR_COMPONENT && - kind != ICAL_VEVENT_COMPONENT && - kind != ICAL_VTODO_COMPONENT && - kind != ICAL_VJOURNAL_COMPONENT) { - return; - } - - e_cal_view_set_status_message (E_CAL_VIEW (week_view), _("Updating objects")); - selected_time = week_view->day_starts[week_view->selection_start_day]; - - if (kind == ICAL_VCALENDAR_COMPONENT) { - icalcomponent_kind child_kind; - icalcomponent *subcomp; - - subcomp = icalcomponent_get_first_component ( - icalcomp, ICAL_ANY_COMPONENT); - while (subcomp) { - child_kind = icalcomponent_isa (subcomp); - if (child_kind == ICAL_VEVENT_COMPONENT || - child_kind == ICAL_VTODO_COMPONENT || - child_kind == ICAL_VJOURNAL_COMPONENT) { - icalcomponent *new_icalcomp; - - new_icalcomp = icalcomponent_new_clone (subcomp); - comp = cal_component_new (); - - /* change the day for the event */ - tt_start = icaltime_as_timet ( - icalcomponent_get_dtstart (new_icalcomp)); - tt_end = icaltime_as_timet ( - icalcomponent_get_dtend (new_icalcomp)); - ic_dur = icaldurationtype_from_int (tt_end - tt_start); - - tmp_itime = icaltime_from_timet_with_zone ( - selected_time, FALSE, week_view->zone); - itime = icalcomponent_get_dtstart (new_icalcomp); - itime.year = tmp_itime.year; - itime.month = tmp_itime.month; - itime.day = tmp_itime.day; - - cal_component_set_icalcomponent (comp, new_icalcomp); - ccdt.value = &itime; - ccdt.tzid = icaltimezone_get_tzid (week_view->zone); - cal_component_set_dtstart (comp, &ccdt); - - itime = icaltime_add (itime, ic_dur); - ccdt.value = &itime; - cal_component_set_dtend (comp, &ccdt); - - uid = cal_component_gen_uid (); - cal_component_set_uid (comp, uid); - - cal_client_update_object (week_view->client, comp); - - g_free (uid); - g_object_unref (comp); - } - subcomp = icalcomponent_get_next_component ( - icalcomp, ICAL_ANY_COMPONENT); - } - - icalcomponent_free (icalcomp); - - } - else { - comp = cal_component_new (); - - /* change the day for the event */ - tt_start = icaltime_as_timet (icalcomponent_get_dtstart (icalcomp)); - tt_end = icaltime_as_timet (icalcomponent_get_dtend (icalcomp)); - ic_dur = icaldurationtype_from_int (tt_end - tt_start); - - tmp_itime = icaltime_from_timet_with_zone ( - selected_time, FALSE, week_view->zone); - itime = icalcomponent_get_dtstart (icalcomp); - itime.year = tmp_itime.year; - itime.month = tmp_itime.month; - itime.day = tmp_itime.day; - - cal_component_set_icalcomponent (comp, icalcomp); - ccdt.value = &itime; - ccdt.tzid = icaltimezone_get_tzid (week_view->zone); - cal_component_set_dtstart (comp, &ccdt); - - itime = icaltime_add (itime, ic_dur); - ccdt.value = &itime; - cal_component_set_dtend (comp, &ccdt); - - uid = cal_component_gen_uid (); - cal_component_set_uid (comp, (const char *) uid); - - cal_client_update_object (week_view->client, comp); - - if (itip_organizer_is_user (comp, week_view->client) && - send_component_dialog (gtk_widget_get_toplevel (week_view), week_view->client, comp, TRUE)) - itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp, week_view->client, NULL); - - g_free (uid); - g_object_unref (comp); - } - - e_cal_view_set_status_message (E_CAL_VIEW (week_view), NULL); -} - - /* Gets the visible time range. Returns FALSE if no time range has been set. */ gboolean e_week_view_get_visible_time_range (EWeekView *week_view, @@ -4558,18 +4195,4 @@ e_week_view_get_num_events_selected (EWeekView *week_view) return (week_view->editing_event_num != -1) ? 1 : 0; } -/* Returns the currently-selected event, or NULL if none */ -CalComponent * -e_week_view_get_selected_event (EWeekView *week_view) -{ - EWeekViewEvent *event; - - g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL); - g_return_val_if_fail (week_view->editing_event_num != -1, NULL); - - event = &g_array_index (week_view->events, EWeekViewEvent, - week_view->editing_event_num); - - return event ? event->comp : NULL; -} diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h index 0fdbbf6cdd..7b3d85711b 100644 --- a/calendar/gui/e-week-view.h +++ b/calendar/gui/e-week-view.h @@ -192,11 +192,7 @@ struct _EWeekView GtkWidget *vscrollbar; - /* Calendar client object we are monitoring */ - CalClient *client; - - /* S-expression for query and the query object */ - char *sexp; + /* The query object */ CalQuery *query; /* The array of EWeekViewEvent elements. */ @@ -358,10 +354,6 @@ struct _EWeekView gint am_string_width; gint pm_string_width; - /* the invisible widget to manage the clipboard selections */ - GtkWidget *invisible; - gchar *clipboard_selection; - /* The default category for new events */ char *default_category; }; @@ -375,9 +367,6 @@ struct _EWeekViewClass GtkType e_week_view_get_type (void); GtkWidget* e_week_view_new (void); -void e_week_view_set_calendar (EWeekView *week_view, - GnomeCalendar *calendar); - /* The first day shown. Note that it will be rounded down to the start of a week when set. The returned value will be invalid if no date has been set yet. */ @@ -386,25 +375,12 @@ void e_week_view_get_first_day_shown (EWeekView *week_view, void e_week_view_set_first_day_shown (EWeekView *week_view, GDate *date); -void e_week_view_set_cal_client (EWeekView *week_view, - CalClient *client); - -void e_week_view_set_query (EWeekView *week_view, - const char *sexp); - void e_week_view_set_default_category (EWeekView *week_view, const char *category); /* The selected time range. The EWeekView will show the corresponding month and the days between start_time and end_time will be selected. To select a single day, use the same value for start_time & end_time. */ -void e_week_view_get_selected_time_range (EWeekView *week_view, - time_t *start_time, - time_t *end_time); -void e_week_view_set_selected_time_range (EWeekView *week_view, - time_t start_time, - time_t end_time); - void e_week_view_set_selected_time_range_visible (EWeekView *week_view, time_t start_time, time_t end_time); diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index d8bcff310c..a144b77ef5 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -665,28 +665,7 @@ gnome_calendar_set_query (GnomeCalendar *gcal, const char *sexp) update_query (gcal); /* Set the query on the main view */ - - switch (priv->current_view_type) { - case GNOME_CAL_DAY_VIEW: - e_day_view_set_query (E_DAY_VIEW (priv->day_view), sexp); - break; - - case GNOME_CAL_WORK_WEEK_VIEW: - e_day_view_set_query (E_DAY_VIEW (priv->work_week_view), sexp); - break; - - case GNOME_CAL_WEEK_VIEW: - e_week_view_set_query (E_WEEK_VIEW (priv->week_view), sexp); - break; - - case GNOME_CAL_MONTH_VIEW: - e_week_view_set_query (E_WEEK_VIEW (priv->month_view), sexp); - break; - - default: - g_warning ("A penguin bit my hand!"); - g_assert_not_reached (); - } + e_cal_view_set_query (E_CAL_VIEW (gnome_calendar_get_current_view_widget (gcal)), sexp); /* Set the query on the task pad */ @@ -1211,35 +1190,9 @@ gnome_calendar_update_view_times (GnomeCalendar *gcal) priv = gcal->priv; - switch (priv->current_view_type) { - case GNOME_CAL_DAY_VIEW: - e_day_view_set_selected_time_range (E_DAY_VIEW (priv->day_view), - priv->selection_start_time, - priv->selection_end_time); - break; - - case GNOME_CAL_WORK_WEEK_VIEW: - e_day_view_set_selected_time_range (E_DAY_VIEW (priv->work_week_view), - priv->selection_start_time, - priv->selection_end_time); - break; - - case GNOME_CAL_WEEK_VIEW: - e_week_view_set_selected_time_range (E_WEEK_VIEW (priv->week_view), - priv->selection_start_time, - priv->selection_end_time); - break; - - case GNOME_CAL_MONTH_VIEW: - e_week_view_set_selected_time_range (E_WEEK_VIEW (priv->month_view), - priv->selection_start_time, - priv->selection_end_time); - break; - - default: - g_warning ("My penguin is gone!"); - g_assert_not_reached (); - } + e_cal_view_set_selected_time_range (E_CAL_VIEW (gnome_calendar_get_current_view_widget (gcal)), + priv->selection_start_time, + priv->selection_end_time); } static void @@ -2002,14 +1955,10 @@ gnome_calendar_construct (GnomeCalendar *gcal) g_signal_connect (priv->client, "backend_died", G_CALLBACK (backend_died_cb), gcal); - e_day_view_set_cal_client (E_DAY_VIEW (priv->day_view), - priv->client); - e_day_view_set_cal_client (E_DAY_VIEW (priv->work_week_view), - priv->client); - e_week_view_set_cal_client (E_WEEK_VIEW (priv->week_view), - priv->client); - e_week_view_set_cal_client (E_WEEK_VIEW (priv->month_view), - priv->client); + e_cal_view_set_cal_client (E_CAL_VIEW (priv->day_view), priv->client); + e_cal_view_set_cal_client (E_CAL_VIEW (priv->work_week_view), priv->client); + e_cal_view_set_cal_client (E_CAL_VIEW (priv->week_view), priv->client); + e_cal_view_set_cal_client (E_CAL_VIEW (priv->month_view), priv->client); /* * TaskPad Folder Client. @@ -2587,31 +2536,8 @@ gnome_calendar_get_current_time_range (GnomeCalendar *gcal, priv = gcal->priv; - switch (priv->current_view_type) { - case GNOME_CAL_DAY_VIEW: - e_day_view_get_selected_time_range (E_DAY_VIEW (priv->day_view), - start_time, end_time); - break; - - case GNOME_CAL_WORK_WEEK_VIEW: - e_day_view_get_selected_time_range (E_DAY_VIEW (priv->work_week_view), - start_time, end_time); - break; - - case GNOME_CAL_WEEK_VIEW: - e_week_view_get_selected_time_range (E_WEEK_VIEW (priv->week_view), - start_time, end_time); - break; - - case GNOME_CAL_MONTH_VIEW: - e_week_view_get_selected_time_range (E_WEEK_VIEW (priv->month_view), - start_time, end_time); - break; - - default: - g_message ("My penguin is gone!"); - g_assert_not_reached (); - } + e_cal_view_get_selected_time_range (E_CAL_VIEW (gnome_calendar_get_current_view_widget (gcal)), + start_time, end_time); } |