diff options
Diffstat (limited to 'calendar/gui/e-day-view.c')
-rw-r--r-- | calendar/gui/e-day-view.c | 131 |
1 files changed, 98 insertions, 33 deletions
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 4b11b89437..80b79bf2f5 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -97,6 +97,14 @@ #define E_DAY_VIEW_LAYOUT_TIMEOUT 100 +/* Signal IDs */ +enum { + SELECTION_CHANGED, + LAST_SIGNAL +}; +static guint e_day_view_signals[LAST_SIGNAL] = { 0 }; + + /* Drag and Drop stuff. */ enum { TARGET_CALENDAR_EVENT @@ -470,6 +478,16 @@ e_day_view_class_init (EDayViewClass *class) object_class = (GtkObjectClass *) class; widget_class = (GtkWidgetClass *) class; + e_day_view_signals[SELECTION_CHANGED] = + gtk_signal_new ("selection_changed", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (EDayViewClass, selection_changed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, e_day_view_signals, LAST_SIGNAL); + /* Method override */ object_class->destroy = e_day_view_destroy; @@ -481,6 +499,8 @@ e_day_view_class_init (EDayViewClass *class) widget_class->focus_out_event = e_day_view_focus_out; widget_class->key_press_event = e_day_view_key_press; + class->selection_changed = NULL; + /* clipboard atom */ if (!clipboard_atom) clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); @@ -1889,7 +1909,7 @@ e_day_view_remove_event_cb (EDayView *day_view, event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); - /* If we were editing this event, set editing_event_num to -1 so + /* If we were editing this event, set editing_event_day to -1 so on_editing_stopped doesn't try to update the event. */ if (day_view->editing_event_day == day && day_view->editing_event_num == event_num) @@ -2657,7 +2677,7 @@ get_current_event (EDayView *day_view) { g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL); - if (day_view->editing_event_num == -1) + if (day_view->editing_event_day == -1) return NULL; if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT) @@ -3582,13 +3602,31 @@ e_day_view_on_delete_occurrence (GtkWidget *widget, gpointer data) gtk_object_unref (GTK_OBJECT (comp)); } +static void +e_day_view_delete_event_internal (EDayView *day_view, EDayViewEvent *event) +{ + CalComponentVType vtype; + + vtype = cal_component_get_vtype (event->comp); + + if (delete_component_dialog (event->comp, 1, vtype, + GTK_WIDGET (day_view))) { + const char *uid; + + cal_component_get_uid (event->comp, &uid); + + /* We don't check the return value; FALSE can mean the object + * was not in the server anyways. + */ + cal_client_remove_object (day_view->client, uid); + } +} static void e_day_view_on_delete_appointment (GtkWidget *widget, gpointer data) { EDayView *day_view; EDayViewEvent *event; - CalComponentVType vtype; day_view = E_DAY_VIEW (data); @@ -3599,20 +3637,32 @@ e_day_view_on_delete_appointment (GtkWidget *widget, gpointer data) if (day_view->editing_event_day >= 0) e_day_view_stop_editing_event (day_view); - vtype = cal_component_get_vtype (event->comp); + e_day_view_delete_event_internal (day_view, event); +} - if (delete_component_dialog (event->comp, 1, vtype, widget)) { - const char *uid; +void +e_day_view_delete_event (EDayView *day_view) +{ + EDayViewEvent *event; - cal_component_get_uid (event->comp, &uid); + g_return_if_fail (E_IS_DAY_VIEW (day_view)); - /* We don't check the return value; FALSE can mean the object - * was not in the server anyways. - */ - cal_client_remove_object (day_view->client, uid); - } + if (day_view->editing_event_day == -1) + return; + + 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); + + e_day_view_delete_event_internal (day_view, event); } + static void e_day_view_on_cut (GtkWidget *widget, gpointer data) { @@ -5032,10 +5082,8 @@ e_day_view_key_press (GtkWidget *widget, GdkEventKey *event) cal_component_set_categories (comp, day_view->default_category); - /* We add the event locally and start editing it. When we get the - "update_event" callback from the server, we basically ignore it. - If we were to wait for the "update_event" callback it wouldn't be - as responsive and we may lose a few keystrokes. */ + /* We add the event locally and start editing it. We don't send it + to the server until the user finishes editing it. */ e_day_view_add_event (comp, dtstart, dtend, day_view); e_day_view_check_layout (day_view); gtk_widget_queue_draw (day_view->top_canvas); @@ -5494,6 +5542,9 @@ e_day_view_on_editing_started (EDayView *day_view, e_day_view_update_event_label (day_view, day, event_num); e_day_view_reshape_main_canvas_resize_bars (day_view); } + + gtk_signal_emit (GTK_OBJECT (day_view), + e_day_view_signals[SELECTION_CHANGED]); } @@ -5545,28 +5596,29 @@ e_day_view_on_editing_stopped (EDayView *day_view, gtk_object_get (GTK_OBJECT (event->canvas_item), "text", &text, NULL); + g_assert (text != NULL); /* Only update the summary if necessary. */ cal_component_get_summary (event->comp, &summary); - if (text && summary.value && !strcmp (text, summary.value)) { - g_free (text); - + if (summary.value && !strcmp (text, summary.value)) { if (day == E_DAY_VIEW_LONG_EVENT) e_day_view_reshape_long_event (day_view, event_num); - return; - } - - if (text) { + else + e_day_view_update_event_label (day_view, day, + event_num); + } else { summary.value = text; summary.altrep = NULL; cal_component_set_summary (event->comp, &summary); - g_free (text); - } else - cal_component_set_summary (event->comp, NULL); + if (!cal_client_update_object (day_view->client, event->comp)) + g_message ("e_day_view_on_editing_stopped(): Could not update the object!"); + } - if (!cal_client_update_object (day_view->client, event->comp)) - g_message ("e_day_view_on_editing_stopped(): Could not update the object!"); + g_free (text); + + gtk_signal_emit (GTK_OBJECT (day_view), + e_day_view_signals[SELECTION_CHANGED]); } @@ -6164,7 +6216,6 @@ e_day_view_update_top_canvas_drag (EDayView *day_view, & GNOME_CANVAS_ITEM_VISIBLE)) { CalComponentText summary; - cal_component_get_summary (event->comp, &summary); if (event) { cal_component_get_summary (event->comp, &summary); text = g_strdup (summary.value); @@ -6500,7 +6551,9 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget, struct icaltimetype itt; time_t dt; - if ((data->length >= 0) && (data->format == 8)) { + /* Note that we only support DnD within the EDayView at present. */ + if ((data->length >= 0) && (data->format == 8) + && (day_view->drag_event_day != -1)) { pos = e_day_view_convert_position_in_top_canvas (day_view, x, y, &day, NULL); @@ -6527,7 +6580,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget, start_offset = event->start_minute; end_offset = event->end_minute; - } else if (day_view->drag_event_day != -1) { + } else { event = &g_array_index (day_view->events[day_view->drag_event_day], EDayViewEvent, day_view->drag_event_num); @@ -6613,7 +6666,9 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget, x += scroll_x; y += scroll_y; - if ((data->length >= 0) && (data->format == 8)) { + /* Note that we only support DnD within the EDayView at present. */ + if ((data->length >= 0) && (data->format == 8) + && (day_view->drag_event_day != -1)) { pos = e_day_view_convert_position_in_main_canvas (day_view, x, y, &day, &row, NULL); @@ -6626,7 +6681,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget, if (day_view->drag_event_day == E_DAY_VIEW_LONG_EVENT) { event = &g_array_index (day_view->long_events, EDayViewEvent, day_view->drag_event_num); - } else if (day_view->drag_event_day != -1) { + } else { event = &g_array_index (day_view->events[day_view->drag_event_day], EDayViewEvent, day_view->drag_event_num); @@ -6930,3 +6985,13 @@ e_day_view_layout_timeout_cb (gpointer data) day_view->layout_timeout_id = 0; return FALSE; } + + +/* Returns the number of selected events (0 or 1 at present). */ +gint +e_day_view_get_num_events_selected (EDayView *day_view) +{ + g_return_val_if_fail (E_IS_DAY_VIEW (day_view), 0); + + return (day_view->editing_event_day != -1) ? 1 : 0; +} |