From 6e0ff07291e87dcd216aa2d39e33857ea5b45088 Mon Sep 17 00:00:00 2001 From: Kidd Wang Date: Wed, 18 Feb 2004 06:47:16 +0000 Subject: make copy & paste and drag & drop behave the same way described as * gui/e-cal-view.c: (e_calendar_view_add_event), (clipboard_get_text_cb): make copy & paste and drag & drop behave the same way described as follows: In day view and work week view from main canvas to top canvas before copy or drag: short event after paste or drop: all-day event from main canvas to main canvas before copy or drag: short event after paste or drop: short event from top canvas to top canvas before copy or drag: all-day event after paste or drop: all-day event before copy or drag: long event after paste or drop: long event from top canvas to main canvas before copy or drag: all-day event after paste or drop: short event before copy or drag: long event after paste or drop: short event In week view, month view and list view life is pretty simple since there's no top canvas in these three views. We just get what we copy or drag after we perform paste or drop. svn path=/trunk/; revision=24770 --- calendar/gui/e-calendar-view.c | 61 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 8 deletions(-) (limited to 'calendar/gui/e-calendar-view.c') diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index cdbcae7289..b02b51e6ff 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -341,10 +341,12 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart ECalComponent *comp; struct icaltimetype itime, old_dtstart, old_dtend; time_t tt_start, tt_end, new_dtstart; - struct icaldurationtype ic_dur; + struct icaldurationtype ic_dur, ic_oneday; char *uid; gint start_offset, end_offset; - gboolean all_day_event; + gboolean all_day_event = FALSE; + GnomeCalendarViewType view_type; + ECalComponentDateTime dt; start_offset = 0; end_offset = 0; @@ -361,11 +363,37 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart end_offset = old_dtstart.hour * 60 + old_dtend.minute; } - if (start_offset == 0 && end_offset == 0 && in_top_canvas) - all_day_event = TRUE; - else - all_day_event = FALSE; + ic_oneday = icaldurationtype_null_duration (); + ic_oneday.days = 1; + + view_type = gnome_calendar_get_view (cal_view->priv->calendar); + switch (view_type) { + case GNOME_CAL_DAY_VIEW: + case GNOME_CAL_WORK_WEEK_VIEW: + if (start_offset == 0 && end_offset == 0 && in_top_canvas) + all_day_event = TRUE; + + if (all_day_event) { + ic_dur = ic_oneday; + } else if (icaldurationtype_as_int (ic_dur) >= 60*60*24 + && !in_top_canvas) { + /* copy & paste from top canvas to main canvas */ + int time_divisions; + + time_divisions = calendar_config_get_time_divisions (); + ic_dur = icaldurationtype_from_int (time_divisions * 60); + } + break; + case GNOME_CAL_WEEK_VIEW: + case GNOME_CAL_MONTH_VIEW: + case GNOME_CAL_LIST_VIEW: + if (old_dtstart.is_date && old_dtend.is_date + && memcmp (&ic_dur, &ic_oneday, sizeof(ic_dur)) == 0) + all_day_event = TRUE; + break; + } + if (in_top_canvas) new_dtstart = dtstart + start_offset * 60; else @@ -376,6 +404,7 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart itime.is_date = TRUE; icalcomponent_set_dtstart (icalcomp, itime); + itime.is_date = FALSE; itime = icaltime_add (itime, ic_dur); if (all_day_event) itime.is_date = TRUE; @@ -388,6 +417,16 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart comp, icalcomponent_new_clone (icalcomp)); e_cal_component_set_uid (comp, uid); + /* set the timezone properly */ + dt.value = &itime; + e_cal_component_get_dtstart (comp, &dt); + dt.tzid = icaltimezone_get_tzid (default_zone); + e_cal_component_set_dtstart (comp, &dt); + e_cal_component_get_dtend (comp, &dt); + dt.tzid = icaltimezone_get_tzid (default_zone); + e_cal_component_set_dtend (comp, &dt); + e_cal_component_commit_sequence (comp); + /* FIXME Error handling */ if (e_cal_create_object (client, e_cal_component_get_icalcomponent (comp), NULL, NULL)) { if (itip_organizer_is_user (comp, client) && @@ -761,6 +800,7 @@ clipboard_get_text_cb (GtkClipboard *clipboard, const gchar *text, ECalendarView time_t selected_time_start, selected_time_end; icaltimezone *default_zone; ECal *client; + gboolean in_top_canvas; g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view)); @@ -780,6 +820,11 @@ clipboard_get_text_cb (GtkClipboard *clipboard, const gchar *text, ECalendarView e_calendar_view_set_status_message (cal_view, _("Updating objects")); e_calendar_view_get_selected_time_range (cal_view, &selected_time_start, &selected_time_end); + if ((selected_time_end - selected_time_start) == 60 * 60 * 24) + in_top_canvas = TRUE; + else + in_top_canvas = FALSE; + /* FIXME Timezone handling */ if (kind == ICAL_VCALENDAR_COMPONENT) { icalcomponent_kind child_kind; @@ -790,7 +835,7 @@ clipboard_get_text_cb (GtkClipboard *clipboard, const gchar *text, ECalendarView child_kind = icalcomponent_isa (subcomp); if (child_kind == ICAL_VEVENT_COMPONENT) e_calendar_view_add_event (cal_view, client, selected_time_start, - default_zone, subcomp, FALSE); + default_zone, subcomp, in_top_canvas); else if (child_kind == ICAL_VTIMEZONE_COMPONENT) { icaltimezone *zone; @@ -808,7 +853,7 @@ clipboard_get_text_cb (GtkClipboard *clipboard, const gchar *text, ECalendarView icalcomponent_free (icalcomp); } else { - e_calendar_view_add_event (cal_view, client, selected_time_start, default_zone, icalcomp, FALSE); + e_calendar_view_add_event (cal_view, client, selected_time_start, default_zone, icalcomp, in_top_canvas); } e_calendar_view_set_status_message (cal_view, NULL); -- cgit