diff options
author | Chenthill Palanisamy <pchen@src.gnome.org> | 2006-04-03 16:36:50 +0800 |
---|---|---|
committer | Chenthill Palanisamy <pchen@src.gnome.org> | 2006-04-03 16:36:50 +0800 |
commit | 998f971fb8973f07e59e39957e23ee10e36f5c61 (patch) | |
tree | 557caa589a79fd4f503387f101e0d9d96c5e275e | |
parent | bb34bf11dc425498b3dda90a95fbabe179a1eaba (diff) | |
download | gsoc2013-evolution-998f971fb8973f07e59e39957e23ee10e36f5c61.tar gsoc2013-evolution-998f971fb8973f07e59e39957e23ee10e36f5c61.tar.gz gsoc2013-evolution-998f971fb8973f07e59e39957e23ee10e36f5c61.tar.bz2 gsoc2013-evolution-998f971fb8973f07e59e39957e23ee10e36f5c61.tar.lz gsoc2013-evolution-998f971fb8973f07e59e39957e23ee10e36f5c61.tar.xz gsoc2013-evolution-998f971fb8973f07e59e39957e23ee10e36f5c61.tar.zst gsoc2013-evolution-998f971fb8973f07e59e39957e23ee10e36f5c61.zip |
Added retract support.
svn path=/trunk/; revision=31759
-rw-r--r-- | calendar/ChangeLog | 12 | ||||
-rw-r--r-- | calendar/gui/dialogs/delete-comp.c | 91 | ||||
-rw-r--r-- | calendar/gui/dialogs/delete-comp.h | 1 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.c | 78 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 127 |
5 files changed, 299 insertions, 10 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 7100395af9..f400598a58 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,15 @@ +2006-04-03 Chenthill Palanisamy <pchenthill@novell.com> + + Fixes #158107 + * gui/dialogs/delete-comp.c: (delete_component_dialog), + (cb_toggled_cb), (prompt_retract_dialog): + * gui/dialogs/delete-comp.h: + * gui/e-calendar-table.c: (add_retract_data), (check_for_retract), + (e_calendar_table_delete_selected): + * gui/e-calendar-view.c: (add_retract_data), (check_for_retract), + (delete_event), (e_calendar_view_delete_selected_occurrence): Added + retract support. + 2006-03-29 Chenthill Palanisamy <pchenthill@novell.com> Fixes #160357 [b.n.c] diff --git a/calendar/gui/dialogs/delete-comp.c b/calendar/gui/dialogs/delete-comp.c index dab62ae8b9..113849b81c 100644 --- a/calendar/gui/dialogs/delete-comp.c +++ b/calendar/gui/dialogs/delete-comp.c @@ -24,6 +24,7 @@ #include <glib.h> #include <gtk/gtkstock.h> +#include <gtk/gtk.h> #include <gtk/gtkmessagedialog.h> #include <libgnome/gnome-i18n.h> #include <e-util/e-icon-factory.h> @@ -155,3 +156,93 @@ delete_component_dialog (ECalComponent *comp, return response == GTK_RESPONSE_YES; } + +static void +cb_toggled_cb (GtkWidget *toggle, gpointer data) +{ + gboolean active = FALSE; + GtkWidget *entry = (GtkWidget *) data; + + active = GTK_TOGGLE_BUTTON (toggle)->active; + gtk_widget_set_sensitive (entry, active); +} + +gboolean +prompt_retract_dialog (ECalComponent *comp, char **retract_text, GtkWidget *parent) +{ + char *message = NULL; + ECalComponentVType type = E_CAL_COMPONENT_NO_TYPE; + GtkMessageDialog *dialog = NULL; + GtkWidget *cb, *label, *entry, *vbox, *sw, *frame; + gboolean ret_val = FALSE; + + type = e_cal_component_get_vtype (comp); + + switch (type) { + case E_CAL_COMPONENT_EVENT: + message = g_strdup_printf (_("Are you sure you want to delete this meeting?")); + break; + case E_CAL_COMPONENT_TODO: + message = g_strdup_printf (_("Are you sure you want to delete this task?")); + break; + case E_CAL_COMPONENT_JOURNAL: + message = g_strdup_printf (_("Are you sure you want to delete this journal entry?")); + break; + default: + g_message ("Retract: Unsupported object type \n"); + return FALSE; + } + + dialog = (GtkMessageDialog *) gtk_message_dialog_new_with_markup + ((GtkWindow *) gtk_widget_get_toplevel (parent), GTK_DIALOG_MODAL, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, "<b>%s</b>", message); + g_free (message); + + gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); + + gtk_box_set_spacing ((GtkBox *) (GTK_DIALOG (dialog)->vbox), 12); + vbox = GTK_CONTAINER (GTK_DIALOG (dialog)->vbox); + + cb = gtk_check_button_new_with_mnemonic (_("_Delete this item from all other recipient's mailboxes?")); + gtk_container_add (GTK_CONTAINER (vbox), cb); + + label = gtk_label_new_with_mnemonic ("_Retract comment"); + + frame = gtk_frame_new (NULL); + gtk_frame_set_label_widget ((GtkFrame *) frame, label); + gtk_frame_set_label_align ((GtkFrame *) frame, 0, 0); + gtk_container_add (GTK_CONTAINER (vbox), frame); + gtk_frame_set_shadow_type ((GtkFrame *)frame, GTK_SHADOW_NONE); + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy ((GtkScrolledWindow *)sw, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + entry = gtk_text_view_new (); + gtk_scrolled_window_add_with_viewport ((GtkScrolledWindow *)sw, entry); + gtk_label_set_mnemonic_widget ((GtkLabel *)label, entry); + gtk_container_add (GTK_CONTAINER (frame), sw); + + g_signal_connect ((GtkToggleButton *)cb, "toggled", G_CALLBACK (cb_toggled_cb), entry); + + gtk_widget_show_all ((GtkWidget *)dialog); + + ret_val = (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK); + + if (ret_val) { + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cb))) { + GtkTextIter text_iter_start, text_iter_end; + GtkTextBuffer *text_buffer; + + text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (entry)); + gtk_text_buffer_get_start_iter (text_buffer, &text_iter_start); + gtk_text_buffer_get_end_iter (text_buffer, &text_iter_end); + + *retract_text = gtk_text_buffer_get_text (text_buffer, &text_iter_start, + &text_iter_end, FALSE); + } + } + + gtk_widget_destroy ((GtkWidget *) dialog); + + return ret_val; +} diff --git a/calendar/gui/dialogs/delete-comp.h b/calendar/gui/dialogs/delete-comp.h index f8773c25d0..d0260f313f 100644 --- a/calendar/gui/dialogs/delete-comp.h +++ b/calendar/gui/dialogs/delete-comp.h @@ -28,5 +28,6 @@ gboolean delete_component_dialog (ECalComponent *comp, gboolean consider_as_untitled, int n_comps, ECalComponentVType vtype, GtkWidget *widget); +gboolean prompt_retract_dialog (ECalComponent *comp, char **retract_text, GtkWidget *parent); #endif diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index 74865debdf..ff6c8a19da 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -716,6 +716,46 @@ delete_selected_components (ECalendarTable *cal_table) g_slist_free (objs); } +static void +add_retract_data (ECalComponent *comp, const char *retract_comment) +{ + icalcomponent *icalcomp = NULL; + icalproperty *icalprop = NULL; + + icalcomp = e_cal_component_get_icalcomponent (comp); + if (retract_comment && *retract_comment) + icalprop = icalproperty_new_x (retract_comment); + else + icalprop = icalproperty_new_x ("0"); + icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT"); + icalcomponent_add_property (icalcomp, icalprop); +} + +static gboolean +check_for_retract (ECalComponent *comp, ECal *client) +{ + ECalComponentOrganizer org; + char *email = NULL; + const char *strip = NULL; + gboolean ret_val = FALSE; + + if (!(e_cal_component_has_attendees (comp) && + e_cal_get_save_schedules (client))) + return ret_val; + + e_cal_component_get_organizer (comp, &org); + strip = itip_strip_mailto (org.value); + + if (e_cal_get_cal_address (client, &email, NULL) && !g_ascii_strcasecmp (email, strip)) { + ret_val = TRUE; + } + + if (!ret_val) + ret_val = e_account_list_find(itip_addresses_get(), E_ACCOUNT_FIND_ID_ADDRESS, strip) != NULL; + + g_free (email); + return ret_val; +} /** * e_calendar_table_delete_selected: @@ -730,6 +770,8 @@ e_calendar_table_delete_selected (ECalendarTable *cal_table) int n_selected; ECalModelComponent *comp_data; ECalComponent *comp = NULL; + gboolean delete = FALSE; + GError *error = NULL; g_return_if_fail (cal_table != NULL); g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table)); @@ -752,8 +794,40 @@ e_calendar_table_delete_selected (ECalendarTable *cal_table) e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); } - if (delete_component_dialog (comp, FALSE, n_selected, E_CAL_COMPONENT_TODO, - GTK_WIDGET (cal_table))) + if ((n_selected == 1) && comp && check_for_retract (comp, comp_data->client)) { + char *retract_comment = NULL; + gboolean retract = FALSE; + + retract = prompt_retract_dialog (comp, &retract_comment, GTK_WIDGET (cal_table)); + if (retract) { + GList *users = NULL; + icalcomponent *icalcomp = NULL, *mod_comp = NULL; + + add_retract_data (comp, retract_comment); + icalcomp = e_cal_component_get_icalcomponent (comp); + icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL); + if (!e_cal_send_objects (comp_data->client, icalcomp, &users, + &mod_comp, &error)) { + delete_error_dialog (error, E_CAL_COMPONENT_TODO); + g_clear_error (&error); + error = NULL; + } else { + + if (mod_comp) + icalcomponent_free (mod_comp); + + if (users) { + g_list_foreach (users, (GFunc) g_free, NULL); + g_list_free (users); + } + } + + } + } else { + delete = delete_component_dialog (comp, FALSE, 1, E_CAL_COMPONENT_TODO, GTK_WIDGET (cal_table)); + } + + if (delete) delete_selected_components (cal_table); /* free memory */ diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index 148d0f0a1e..0fb1ad8abe 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -859,10 +859,60 @@ e_calendar_view_paste_clipboard (ECalendarView *cal_view) } static void +add_retract_data (ECalComponent *comp, const char *retract_comment, CalObjModType mod) +{ + icalcomponent *icalcomp = NULL; + icalproperty *icalprop = NULL; + + icalcomp = e_cal_component_get_icalcomponent (comp); + if (retract_comment && *retract_comment) + icalprop = icalproperty_new_x (retract_comment); + else + icalprop = icalproperty_new_x ("0"); + icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT"); + icalcomponent_add_property (icalcomp, icalprop); + + if (mod == CALOBJ_MOD_ALL) + icalprop = icalproperty_new_x ("All"); + else + icalprop = icalproperty_new_x ("This"); + icalproperty_set_x_name (icalprop, "X-EVOLUTION-RECUR-MOD"); + icalcomponent_add_property (icalcomp, icalprop); +} + +static gboolean +check_for_retract (ECalComponent *comp, ECal *client) +{ + ECalComponentOrganizer org; + char *email = NULL; + const char *strip = NULL; + gboolean ret_val = FALSE; + + if (!(e_cal_component_has_attendees (comp) && + e_cal_get_save_schedules (client))) + return ret_val; + + e_cal_component_get_organizer (comp, &org); + strip = itip_strip_mailto (org.value); + + if (e_cal_get_cal_address (client, &email, NULL) && !g_ascii_strcasecmp (email, strip)) { + ret_val = TRUE; + } + + if (!ret_val) + ret_val = e_account_list_find(itip_addresses_get(), E_ACCOUNT_FIND_ID_ADDRESS, strip) != NULL; + + g_free (email); + return ret_val; +} + +static void delete_event (ECalendarView *cal_view, ECalendarViewEvent *event) { ECalComponent *comp; ECalComponentVType vtype; + gboolean delete = FALSE; + GError *error = NULL; comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); @@ -872,9 +922,39 @@ delete_event (ECalendarView *cal_view, ECalendarViewEvent *event) if (!e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) e_cal_component_set_recurid (comp, NULL); - if (delete_component_dialog (comp, FALSE, 1, vtype, GTK_WIDGET (cal_view))) { + if (check_for_retract (comp, event->comp_data->client)) { + char *retract_comment = NULL; + gboolean retract = FALSE; + + retract = prompt_retract_dialog (comp, &retract_comment, GTK_WIDGET (cal_view)); + if (retract) { + GList *users = NULL; + icalcomponent *icalcomp = NULL, *mod_comp = NULL; + + add_retract_data (comp, retract_comment, CALOBJ_MOD_ALL); + icalcomp = e_cal_component_get_icalcomponent (comp); + icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL); + if (!e_cal_send_objects (event->comp_data->client, icalcomp, &users, + &mod_comp, &error)) { + delete_error_dialog (error, E_CAL_COMPONENT_EVENT); + g_clear_error (&error); + error = NULL; + } else { + + if (mod_comp) + icalcomponent_free (mod_comp); + + if (users) { + g_list_foreach (users, (GFunc) g_free, NULL); + g_list_free (users); + } + } + } + } else + delete = delete_component_dialog (comp, FALSE, 1, vtype, GTK_WIDGET (cal_view)); + + if (delete) { const char *uid; - GError *error = NULL; if (itip_organizer_is_user (comp, event->comp_data->client) && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)), @@ -888,13 +968,13 @@ delete_event (ECalendarView *cal_view, ECalendarViewEvent *event) g_object_unref (comp); return; } - + if (e_cal_util_component_is_instance (event->comp_data->icalcomp) || e_cal_util_component_has_recurrences (event->comp_data->icalcomp)) e_cal_remove_object_with_mod (event->comp_data->client, uid, e_cal_component_get_recurid_as_string (comp), CALOBJ_MOD_ALL, &error); else e_cal_remove_object (event->comp_data->client, uid, &error); - + delete_error_dialog (error, E_CAL_COMPONENT_EVENT); g_clear_error (&error); } @@ -944,18 +1024,49 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) GList *selected; ECalComponent *comp; ECalendarViewEvent *event; + ECalComponentVType vtype; + gboolean delete = FALSE; + GError *error = NULL; selected = e_calendar_view_get_selected_events (cal_view); if (!selected) return; - event = (ECalendarViewEvent *) selected->data; comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + vtype = e_cal_component_get_vtype (comp); - if (delete_component_dialog (comp, FALSE, 1, e_cal_component_get_vtype (comp), GTK_WIDGET (cal_view))) { + if (check_for_retract (comp, event->comp_data->client)) { + char *retract_comment = NULL; + gboolean retract = FALSE; + + retract = prompt_retract_dialog (comp, &retract_comment, GTK_WIDGET (cal_view)); + if (retract) { + GList *users = NULL; + icalcomponent *icalcomp = NULL, *mod_comp = NULL; + + add_retract_data (comp, retract_comment, CALOBJ_MOD_THIS); + icalcomp = e_cal_component_get_icalcomponent (comp); + icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL); + if (!e_cal_send_objects (event->comp_data->client, icalcomp, &users, + &mod_comp, &error)) { + delete_error_dialog (error, E_CAL_COMPONENT_EVENT); + g_clear_error (&error); + error = NULL; + } else { + if (mod_comp) + icalcomponent_free (mod_comp); + if (users) { + g_list_foreach (users, (GFunc) g_free, NULL); + g_list_free (users); + } + } + } + } else + delete = delete_component_dialog (comp, FALSE, 1, vtype, GTK_WIDGET (cal_view)); + + if (delete) { const char *uid, *rid = NULL; - GError *error = NULL; ECalComponentDateTime dt; icaltimezone *zone = NULL; gboolean is_instance = FALSE; @@ -1011,7 +1122,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) e_cal_modify_object (event->comp_data->client, event->comp_data->icalcomp, CALOBJ_MOD_THIS, &error); } - + delete_error_dialog (error, E_CAL_COMPONENT_EVENT); g_clear_error (&error); } |