remove and free op before return.

2003-10-23  Harry Lu  <harry.lu@sun.com>

	* cal-client/cal-client.c: (cal_client_get_timezone): remove and free
	op before return.

	* gui/e-cal-view.c (e_cal_view_add_event): modified from
	selection_received_add_event() so that it call be called out of
	e-cal-view.c.
	(selection_received): modified to call e_cal_view_add_event().

	* gui/e-cal-view.h: add declaration for e_cal_view_add_event().

	* gui/e-day-view.c (e_day_view_on_drag_data_get): Provide a
	icalcomponent for both TARGET_CALENDAR_EVENT and TARGET_VCALENDAR.
	(e_day_view_on_top_canvas_drag_data_received): If dragging between
	different windows, make it works like a copy and paste.
	(e_day_view_on_main_canvas_drag_data_received): ditto.

svn path=/trunk/; revision=23041
This commit is contained in:
Harry Lu
2003-10-23 16:10:09 +00:00
committed by Rodrigo Moya
parent 39e56385b1
commit eca844b013
7 changed files with 276 additions and 57 deletions

View File

@ -1,3 +1,21 @@
2003-10-23 Harry Lu <harry.lu@sun.com>
* cal-client/cal-client.c: (cal_client_get_timezone): remove and free
op before return.
* gui/e-cal-view.c (e_cal_view_add_event): modified from
selection_received_add_event() so that it call be called out of
e-cal-view.c.
(selection_received): modified to call e_cal_view_add_event().
* gui/e-cal-view.h: add declaration for e_cal_view_add_event().
* gui/e-day-view.c (e_day_view_on_drag_data_get): Provide a
icalcomponent for both TARGET_CALENDAR_EVENT and TARGET_VCALENDAR.
(e_day_view_on_top_canvas_drag_data_received): If dragging between
different windows, make it works like a copy and paste.
(e_day_view_on_main_canvas_drag_data_received): ditto.
2003-10-23 JP Rosevear <jpr@ximian.com>
* cal-util/cal-recur.c: update g_date calls to non-deprecated

View File

@ -3482,13 +3482,22 @@ cal_client_get_timezone (CalClient *client, const char *tzid, icaltimezone **zon
g_free (our_op->string);
/* FIXME Invalid object status? */
if (!icalcomp)
if (!icalcomp) {
e_calendar_remove_op (client, our_op);
e_mutex_unlock (our_op->mutex);
e_calendar_free_op (our_op);
E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_OBJECT_NOT_FOUND, error);
}
*zone = icaltimezone_new ();
if (!icaltimezone_set_component (*zone, icalcomp)) {
icaltimezone_free (*zone, 1);
e_calendar_remove_op (client, our_op);
e_mutex_unlock (our_op->mutex);
e_calendar_free_op (our_op);
E_CALENDAR_CHECK_STATUS (E_CALENDAR_STATUS_OBJECT_NOT_FOUND, error);
}

View File

@ -276,23 +276,51 @@ selection_clear_event (GtkWidget *invisible,
}
}
static void
selection_received_add_event (ECalView *cal_view, CalClient *client, time_t selected_time_start,
icaltimezone *default_zone, icalcomponent *icalcomp)
void
e_cal_view_add_event (ECalView *cal_view, CalClient *client, time_t dtstart,
icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas)
{
CalComponent *comp;
struct icaltimetype itime;
time_t tt_start, tt_end;
struct icaltimetype itime, old_dtstart, old_dtend;
time_t tt_start, tt_end, new_dtstart;
struct icaldurationtype ic_dur;
char *uid;
gint start_offset, end_offset;
gboolean all_day_event;
tt_start = icaltime_as_timet (icalcomponent_get_dtstart (icalcomp));
tt_end = icaltime_as_timet (icalcomponent_get_dtend (icalcomp));
start_offset = 0;
end_offset = 0;
old_dtstart = icalcomponent_get_dtstart (icalcomp);
tt_start = icaltime_as_timet (old_dtstart);
old_dtend = icalcomponent_get_dtend (icalcomp);
tt_end = icaltime_as_timet (old_dtend);
ic_dur = icaldurationtype_from_int (tt_end - tt_start);
itime = icaltime_from_timet_with_zone (selected_time_start, FALSE, default_zone);
if (icaldurationtype_as_int (ic_dur) > 60*60*24) {
/* This is a long event */
start_offset = old_dtstart.hour * 60 + old_dtstart.minute;
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;
if (in_top_canvas)
new_dtstart = dtstart + start_offset * 60;
else
new_dtstart = dtstart;
itime = icaltime_from_timet_with_zone (new_dtstart, FALSE, default_zone);
if (all_day_event)
itime.is_date = TRUE;
icalcomponent_set_dtstart (icalcomp, itime);
itime = icaltime_add (itime, ic_dur);
if (all_day_event)
itime.is_date = TRUE;
icalcomponent_set_dtend (icalcomp, itime);
/* FIXME The new uid stuff can go away once we actually set it in the backend */
@ -303,12 +331,15 @@ selection_received_add_event (ECalView *cal_view, CalClient *client, time_t sele
cal_component_set_uid (comp, uid);
/* FIXME Error handling */
cal_client_create_object (client, cal_component_get_icalcomponent (comp), NULL, NULL);
if (itip_organizer_is_user (comp, client) &&
send_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
if (cal_client_create_object (client, cal_component_get_icalcomponent (comp), NULL, NULL)) {
if (itip_organizer_is_user (comp, client) &&
send_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
client, comp, TRUE)) {
itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp,
itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp,
client, NULL);
}
} else {
g_message (G_STRLOC ": Could not create the object!");
}
free (uid);
@ -364,8 +395,8 @@ selection_received (GtkWidget *invisible,
while (subcomp) {
child_kind = icalcomponent_isa (subcomp);
if (child_kind == ICAL_VEVENT_COMPONENT)
selection_received_add_event (cal_view, client, selected_time_start,
default_zone, subcomp);
e_cal_view_add_event (cal_view, client, selected_time_start,
default_zone, subcomp, FALSE);
else if (child_kind == ICAL_VTIMEZONE_COMPONENT) {
icaltimezone *zone;
@ -383,7 +414,7 @@ selection_received (GtkWidget *invisible,
icalcomponent_free (icalcomp);
} else {
selection_received_add_event (cal_view, client, selected_time_start, default_zone, icalcomp);
e_cal_view_add_event (cal_view, client, selected_time_start, default_zone, icalcomp, FALSE);
}
e_cal_view_set_status_message (cal_view, NULL);

View File

@ -116,6 +116,8 @@ void e_cal_view_delete_selected_occurrence (ECalView *cal_view);
GtkMenu *e_cal_view_create_popup_menu (ECalView *cal_view);
void e_cal_view_add_event (ECalView *cal_view, CalClient *client, time_t dtstart,
icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas);
void e_cal_view_new_appointment_for (ECalView *cal_view,
time_t dtstart,
time_t dtend,

View File

@ -276,23 +276,51 @@ selection_clear_event (GtkWidget *invisible,
}
}
static void
selection_received_add_event (ECalView *cal_view, CalClient *client, time_t selected_time_start,
icaltimezone *default_zone, icalcomponent *icalcomp)
void
e_cal_view_add_event (ECalView *cal_view, CalClient *client, time_t dtstart,
icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas)
{
CalComponent *comp;
struct icaltimetype itime;
time_t tt_start, tt_end;
struct icaltimetype itime, old_dtstart, old_dtend;
time_t tt_start, tt_end, new_dtstart;
struct icaldurationtype ic_dur;
char *uid;
gint start_offset, end_offset;
gboolean all_day_event;
tt_start = icaltime_as_timet (icalcomponent_get_dtstart (icalcomp));
tt_end = icaltime_as_timet (icalcomponent_get_dtend (icalcomp));
start_offset = 0;
end_offset = 0;
old_dtstart = icalcomponent_get_dtstart (icalcomp);
tt_start = icaltime_as_timet (old_dtstart);
old_dtend = icalcomponent_get_dtend (icalcomp);
tt_end = icaltime_as_timet (old_dtend);
ic_dur = icaldurationtype_from_int (tt_end - tt_start);
itime = icaltime_from_timet_with_zone (selected_time_start, FALSE, default_zone);
if (icaldurationtype_as_int (ic_dur) > 60*60*24) {
/* This is a long event */
start_offset = old_dtstart.hour * 60 + old_dtstart.minute;
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;
if (in_top_canvas)
new_dtstart = dtstart + start_offset * 60;
else
new_dtstart = dtstart;
itime = icaltime_from_timet_with_zone (new_dtstart, FALSE, default_zone);
if (all_day_event)
itime.is_date = TRUE;
icalcomponent_set_dtstart (icalcomp, itime);
itime = icaltime_add (itime, ic_dur);
if (all_day_event)
itime.is_date = TRUE;
icalcomponent_set_dtend (icalcomp, itime);
/* FIXME The new uid stuff can go away once we actually set it in the backend */
@ -303,12 +331,15 @@ selection_received_add_event (ECalView *cal_view, CalClient *client, time_t sele
cal_component_set_uid (comp, uid);
/* FIXME Error handling */
cal_client_create_object (client, cal_component_get_icalcomponent (comp), NULL, NULL);
if (itip_organizer_is_user (comp, client) &&
send_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
if (cal_client_create_object (client, cal_component_get_icalcomponent (comp), NULL, NULL)) {
if (itip_organizer_is_user (comp, client) &&
send_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
client, comp, TRUE)) {
itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp,
itip_send_comp (CAL_COMPONENT_METHOD_REQUEST, comp,
client, NULL);
}
} else {
g_message (G_STRLOC ": Could not create the object!");
}
free (uid);
@ -364,8 +395,8 @@ selection_received (GtkWidget *invisible,
while (subcomp) {
child_kind = icalcomponent_isa (subcomp);
if (child_kind == ICAL_VEVENT_COMPONENT)
selection_received_add_event (cal_view, client, selected_time_start,
default_zone, subcomp);
e_cal_view_add_event (cal_view, client, selected_time_start,
default_zone, subcomp, FALSE);
else if (child_kind == ICAL_VTIMEZONE_COMPONENT) {
icaltimezone *zone;
@ -383,7 +414,7 @@ selection_received (GtkWidget *invisible,
icalcomponent_free (icalcomp);
} else {
selection_received_add_event (cal_view, client, selected_time_start, default_zone, icalcomp);
e_cal_view_add_event (cal_view, client, selected_time_start, default_zone, icalcomp, FALSE);
}
e_cal_view_set_status_message (cal_view, NULL);

View File

@ -116,6 +116,8 @@ void e_cal_view_delete_selected_occurrence (ECalView *cal_view);
GtkMenu *e_cal_view_create_popup_menu (ECalView *cal_view);
void e_cal_view_add_event (ECalView *cal_view, CalClient *client, time_t dtstart,
icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas);
void e_cal_view_new_appointment_for (ECalView *cal_view,
time_t dtstart,
time_t dtend,

View File

@ -6736,15 +6736,8 @@ e_day_view_on_drag_data_get (GtkWidget *widget,
event = &g_array_index (day_view->events[day],
EDayViewEvent, event_num);
if (info == TARGET_CALENDAR_EVENT) {
const char *event_uid;
event_uid = icalcomponent_get_uid (event->comp_data->icalcomp);
g_return_if_fail (event_uid != NULL);
gtk_selection_data_set (selection_data, selection_data->target,
8, event_uid, strlen (event_uid));
} else if (info == TARGET_VCALENDAR) {
if (info == TARGET_CALENDAR_EVENT || info == TARGET_VCALENDAR) {
/* we will pass an icalcalendar component for both types */
char *comp_str;
icalcomponent *vcal;
@ -6779,26 +6772,32 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
ECalViewPosition pos;
gint day, start_day, end_day, num_days;
gint start_offset, end_offset;
gchar *event_uid;
CalComponent *comp;
CalComponentDateTime date;
struct icaltimetype itt;
time_t dt;
gboolean all_day_event;
CalClient *client;
gboolean drag_from_same_window;
if (day_view->drag_event_day != -1)
drag_from_same_window = TRUE;
else
drag_from_same_window = FALSE;
client = e_cal_model_get_default_client (e_cal_view_get_model (E_CAL_VIEW (day_view)));
/* Note that we only support DnD within the EDayView at present. */
if ((data->length >= 0) && (data->format == 8)
&& (day_view->drag_event_day != -1)) {
/* We are dragging in the same window */
pos = e_day_view_convert_position_in_top_canvas (day_view,
x, y, &day,
NULL);
if (pos != E_CAL_VIEW_POS_OUTSIDE) {
CalObjModType mod = CALOBJ_MOD_ALL;
GtkWindow *toplevel;
const char *uid;
num_days = 1;
start_offset = 0;
@ -6829,13 +6828,6 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
client = event->comp_data->client;
event_uid = data->data;
uid = icalcomponent_get_uid (event->comp_data->icalcomp);
if (!event_uid || !uid || strcmp (event_uid, uid))
g_warning ("Unexpected event UID");
/* We clone the event since we don't want to change
the original comp here.
Otherwise we would not detect that the event's time
@ -6896,6 +6888,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
}
toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
cal_component_commit_sequence (comp);
if (cal_client_modify_object (client, cal_component_get_icalcomponent (comp), mod, NULL)) {
if (itip_organizer_is_user (comp, client)
@ -6910,6 +6903,72 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
}
}
if ((data->length >= 0) && (data->format == 8)
&& !drag_from_same_window) {
/* We are dragging between different window */
char *comp_str, *default_tzid;
icalcomponent *icalcomp;
icalcomponent_kind kind;
time_t dtstart;
icaltimezone *default_zone;
pos = e_day_view_convert_position_in_top_canvas (day_view,
x, y, &day,
NULL);
if (pos == E_CAL_VIEW_POS_OUTSIDE)
goto error;
comp_str = (char *) data->data;
icalcomp = icalparser_parse_string ((const char *) comp_str);
if (!icalcomp)
goto error;
default_tzid = calendar_config_get_timezone ();
cal_client_get_timezone (client, default_tzid, &default_zone, NULL);
/* check the type of the component */
kind = icalcomponent_isa (icalcomp);
if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
goto error;
dtstart = day_view->day_starts[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)
e_cal_view_add_event (E_CAL_VIEW (day_view), client, dtstart,
default_zone, subcomp, TRUE);
else if (child_kind == ICAL_VTIMEZONE_COMPONENT) {
icaltimezone *zone;
zone = icaltimezone_new ();
icaltimezone_set_component (zone, subcomp);
cal_client_add_timezone (client, zone, NULL);
icaltimezone_free (zone, 1);
}
subcomp = icalcomponent_get_next_component (
icalcomp, ICAL_ANY_COMPONENT);
}
icalcomponent_free (icalcomp);
} else {
e_cal_add_event (E_CAL_VIEW (day_view), client, dtstart, default_zone, icalcomp, TRUE);
}
gtk_drag_finish (context, TRUE, TRUE, time);
return;
}
error:
gtk_drag_finish (context, FALSE, FALSE, time);
}
@ -6928,12 +6987,17 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
ECalViewPosition pos;
gint day, row, start_row, end_row, num_rows, scroll_x, scroll_y;
gint start_offset, end_offset;
gchar *event_uid;
CalComponent *comp;
CalComponentDateTime date;
struct icaltimetype itt;
time_t dt;
CalClient *client;
gboolean drag_from_same_window;
if (day_view->drag_event_day != -1)
drag_from_same_window = TRUE;
else
drag_from_same_window = FALSE;
client = e_cal_model_get_default_client (e_cal_view_get_model (E_CAL_VIEW (day_view)));
@ -6945,13 +7009,14 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
/* Note that we only support DnD within the EDayView at present. */
if ((data->length >= 0) && (data->format == 8)
&& (day_view->drag_event_day != -1)) {
/* We are dragging in the same window */
pos = e_day_view_convert_position_in_main_canvas (day_view,
x, y, &day,
&row, NULL);
if (pos != E_CAL_VIEW_POS_OUTSIDE) {
CalObjModType mod = CALOBJ_MOD_ALL;
GtkWindow *toplevel;
const char *uid;
num_rows = 1;
start_offset = 0;
@ -6982,12 +7047,6 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
client = event->comp_data->client;
event_uid = data->data;
uid = icalcomponent_get_uid (event->comp_data->icalcomp);
if (!event_uid || !uid || strcmp (event_uid, uid))
g_warning ("Unexpected event UID");
/* We use a temporary shallow copy of comp since we
don't want to change the original comp here.
Otherwise we would not detect that the event's time
@ -7025,6 +7084,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
}
toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view)));
cal_component_commit_sequence (comp);
if (cal_client_modify_object (client, cal_component_get_icalcomponent (comp), mod, NULL)) {
if (itip_organizer_is_user (comp, client)
@ -7039,6 +7099,72 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
}
}
if ((data->length >= 0) && (data->format == 8)
&& !drag_from_same_window) {
/* We are dragging between different window */
char *comp_str, *default_tzid;;
icalcomponent *icalcomp;
icalcomponent_kind kind;
time_t dtstart;
icaltimezone *default_zone;
pos = e_day_view_convert_position_in_main_canvas (day_view,
x, y, &day,
&row, NULL);
if (pos == E_CAL_VIEW_POS_OUTSIDE)
goto error;
comp_str = (char *) data->data;
icalcomp = icalparser_parse_string ((const char *) comp_str);
if (!icalcomp)
goto error;
default_tzid = calendar_config_get_timezone ();
cal_client_get_timezone (client, default_tzid, &default_zone, NULL);
/* check the type of the component */
kind = icalcomponent_isa (icalcomp);
if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
goto error;
dtstart = e_day_view_convert_grid_position_to_time (day_view, day, row);
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)
e_cal_view_add_event (E_CAL_VIEW (day_view), client, dtstart,
default_zone, subcomp, FALSE);
else if (child_kind == ICAL_VTIMEZONE_COMPONENT) {
icaltimezone *zone;
zone = icaltimezone_new ();
icaltimezone_set_component (zone, subcomp);
cal_client_add_timezone (client, zone, NULL);
icaltimezone_free (zone, 1);
}
subcomp = icalcomponent_get_next_component (
icalcomp, ICAL_ANY_COMPONENT);
}
icalcomponent_free (icalcomp);
} else {
e_cal_add_event (E_CAL_VIEW (day_view), client, dtstart, default_zone, icalcomp, FALSE);
}
gtk_drag_finish (context, TRUE, TRUE, time);
return;
}
error:
gtk_drag_finish (context, FALSE, FALSE, time);
}