aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog26
-rw-r--r--calendar/gui/e-cal-view.c61
-rw-r--r--calendar/gui/e-calendar-view.c61
3 files changed, 132 insertions, 16 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 9863e61be8..a7c1f4ae23 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,5 +1,31 @@
2004-02-18 Kidd Wang <kidd.wang@sun.com>
+ * 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.
+
+2004-02-18 Kidd Wang <kidd.wang@sun.com>
+
* gui/itip-utils.c: (itip_send_comp): set the string length properly.
2004-02-16 Rodrigo Moya <rodrigo@ximian.com>
diff --git a/calendar/gui/e-cal-view.c b/calendar/gui/e-cal-view.c
index cdbcae7289..b02b51e6ff 100644
--- a/calendar/gui/e-cal-view.c
+++ b/calendar/gui/e-cal-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);
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);