diff options
-rw-r--r-- | plugins/itip-formatter/ChangeLog | 12 | ||||
-rw-r--r-- | plugins/itip-formatter/itip-formatter.c | 37 | ||||
-rw-r--r-- | plugins/itip-formatter/itip-view.c | 55 | ||||
-rw-r--r-- | plugins/itip-formatter/itip-view.h | 4 |
4 files changed, 103 insertions, 5 deletions
diff --git a/plugins/itip-formatter/ChangeLog b/plugins/itip-formatter/ChangeLog index ca449c1a9b..817393b09c 100644 --- a/plugins/itip-formatter/ChangeLog +++ b/plugins/itip-formatter/ChangeLog @@ -1,3 +1,15 @@ +2005-07-11 Harish Krishnaswamy <kharish@novell.com> + + * itip-formatter.c (source_selected_cb), + (find_cal_opened_cb), (extract_itip_data): enable the + 'Apply to all instances' option for gw recurrence instances. + (view_response_cb): embed X-GW-RECUR-INSTANCE-MOD-TYPE property in the + component to indicate whether the accept/decline status applies + to the instance or the entire group. + * itip-view.[ch]: (set_buttons), (recur_toggled_cb), (itip_view_init), + (itip_view_get_recur_check_state), (itip_view_set_show_recur_check): + utility methods to manipulate the recur_check widget. + 2005-06-27 Tor Lillqvist <tml@novell.com> * Makefile.am: Use NO_UNDEFINED. Link with more libraries. diff --git a/plugins/itip-formatter/itip-formatter.c b/plugins/itip-formatter/itip-formatter.c index 87204791fb..915718c4b4 100644 --- a/plugins/itip-formatter/itip-formatter.c +++ b/plugins/itip-formatter/itip-formatter.c @@ -334,6 +334,30 @@ source_selected_cb (ItipView *view, ESource *source, gpointer data) itip_view_set_buttons_sensitive (ITIP_VIEW (pitip->view), FALSE); start_calendar_server (pitip, source, pitip->type, cal_opened_cb, pitip); + /* If it is a GW recurrence instance, enable the 'Apply to all + * instances' option */ + if (e_cal_get_static_capability (pitip->current_ecal, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) { + gboolean is_instance = FALSE; + icalcomponent *icalcomp = e_cal_component_get_icalcomponent (pitip->comp); + icalproperty *icalprop; + + icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY); + while (icalprop) { + const char *x_name; + + x_name = icalproperty_get_x_name (icalprop); + if (!strcmp (x_name, "X-GW-RECURRENCE-KEY")) { + is_instance = TRUE; + break; + } + icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY); + } + if (is_instance) + itip_view_set_show_recur_check (ITIP_VIEW (pitip->view), TRUE); + else + itip_view_set_show_recur_check (ITIP_VIEW (pitip->view), FALSE); + } + } static void @@ -404,6 +428,9 @@ find_cal_opened_cb (ECal *ecal, ECalendarStatus status, gpointer data) "Found the appointment in the calendar '%s'", e_source_peek_name (source)); set_buttons_sensitive (pitip); + if (e_cal_get_static_capability (pitip->current_ecal, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) + itip_view_set_show_recur_check (ITIP_VIEW (pitip->view), TRUE); + } zone = calendar_config_get_icaltimezone (); @@ -1099,7 +1126,7 @@ extract_itip_data (FormatItipPObject *pitip, GtkContainer *container) return FALSE; } - + prop = icalcomponent_get_first_property (pitip->main_comp, ICAL_METHOD_PROPERTY); if (prop == NULL) { pitip->method = ICAL_METHOD_PUBLISH; @@ -1291,10 +1318,18 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) { FormatItipPObject *pitip = data; gboolean status = FALSE; + icalproperty *prop; + if (!pitip->my_address && pitip->current_ecal != NULL) e_cal_get_cal_address (pitip->current_ecal, &pitip->my_address, NULL); + /* check if it is a recur instance (no master object) and + * add a property */ + prop = icalproperty_new_x ("All"); + icalproperty_set_x_name (prop, "X-GW-RECUR-INSTANCES-MOD-TYPE"); + icalcomponent_add_property (e_cal_component_get_icalcomponent (pitip->comp), prop); + switch (response) { case ITIP_VIEW_RESPONSE_ACCEPT: status = change_status (pitip->ical_comp, pitip->my_address, diff --git a/plugins/itip-formatter/itip-view.c b/plugins/itip-formatter/itip-view.c index acfcf9527f..67a067eae9 100644 --- a/plugins/itip-formatter/itip-view.c +++ b/plugins/itip-formatter/itip-view.c @@ -112,6 +112,9 @@ struct _ItipViewPrivate { GtkWidget *rsvp_comment_entry; gboolean rsvp_show; + GtkWidget *recur_box; + GtkWidget *recur_check; + GtkWidget *update_box; GtkWidget *update_check; gboolean update_show; @@ -689,9 +692,11 @@ static void set_buttons (ItipView *view) { ItipViewPrivate *priv; - + gboolean is_recur_set = FALSE; + priv = view->priv; + is_recur_set = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->recur_check)); gtk_container_foreach (GTK_CONTAINER (priv->button_box), (GtkCallback) gtk_widget_destroy, NULL); /* Everything gets the open button */ @@ -703,9 +708,9 @@ set_buttons (ItipView *view) set_one_button (view, "_Accept", GTK_STOCK_APPLY, ITIP_VIEW_RESPONSE_ACCEPT); break; case ITIP_VIEW_MODE_REQUEST: - set_one_button (view, "_Decline", GTK_STOCK_CANCEL, ITIP_VIEW_RESPONSE_DECLINE); - set_one_button (view, "_Tentative", GTK_STOCK_DIALOG_QUESTION, ITIP_VIEW_RESPONSE_TENTATIVE); - set_one_button (view, "_Accept", GTK_STOCK_APPLY, ITIP_VIEW_RESPONSE_ACCEPT); + set_one_button (view, is_recur_set ? "_Decline all" : "_Decline", GTK_STOCK_CANCEL, ITIP_VIEW_RESPONSE_DECLINE); + set_one_button (view, is_recur_set ? "_Tentative all" : "_Tentative", GTK_STOCK_DIALOG_QUESTION, ITIP_VIEW_RESPONSE_TENTATIVE); + set_one_button (view, is_recur_set ? "_Accept all" : "_Accept", GTK_STOCK_APPLY, ITIP_VIEW_RESPONSE_ACCEPT); break; case ITIP_VIEW_MODE_ADD: set_one_button (view, "_Decline", GTK_STOCK_CANCEL, ITIP_VIEW_RESPONSE_DECLINE); @@ -811,6 +816,20 @@ rsvp_toggled_cb (GtkWidget *widget, gpointer data) } static void +recur_toggled_cb (GtkWidget *widget, gpointer data) +{ + ItipView *view = data; + ItipViewPrivate *priv; + gboolean is_recur; + + priv = view->priv; + + is_recur = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->recur_check)); + itip_view_set_mode (view, priv->mode); +} + + +static void itip_view_init (ItipView *view) { ItipViewPrivate *priv; @@ -961,6 +980,16 @@ itip_view_init (ItipView *view) gtk_widget_show (priv->update_check); gtk_box_pack_start (GTK_BOX (priv->update_box), priv->update_check, FALSE, FALSE, 0); + /* The recurrence check button */ + priv->recur_box = gtk_vbox_new (FALSE, 12); + gtk_widget_show (priv->recur_box); + gtk_box_pack_start (GTK_BOX (vbox), priv->recur_box, FALSE, FALSE, 0); + + priv->recur_check = gtk_check_button_new_with_mnemonic (_("A_pply to all instances")); + gtk_box_pack_start (GTK_BOX (priv->recur_box), priv->recur_check, FALSE, FALSE, 0); + + g_signal_connect (priv->recur_check, "toggled", G_CALLBACK (recur_toggled_cb), view); + /* The buttons for actions */ priv->button_box = gtk_hbutton_box_new (); gtk_button_box_set_layout (GTK_BUTTON_BOX (priv->button_box), GTK_BUTTONBOX_END); @@ -1847,4 +1876,22 @@ itip_view_get_buttons_sensitive (ItipView *view) return priv->buttons_sensitive; } +gboolean +itip_view_get_recur_check_state (ItipView *view) +{ + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (view->priv->recur_check)); +} + +void +itip_view_set_show_recur_check (ItipView *view, gboolean show) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (ITIP_IS_VIEW (view)); + if (show) + gtk_widget_show (view->priv->recur_check); + else { + gtk_widget_hide (view->priv->recur_check); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view->priv->recur_check), FALSE); + } +} diff --git a/plugins/itip-formatter/itip-view.h b/plugins/itip-formatter/itip-view.h index d05bd4479c..4e47594270 100644 --- a/plugins/itip-formatter/itip-view.h +++ b/plugins/itip-formatter/itip-view.h @@ -165,6 +165,10 @@ const char *itip_view_get_rsvp_comment (ItipView *view); void itip_view_set_buttons_sensitive (ItipView *view, gboolean sensitive); gboolean itip_view_get_buttons_sensitive (ItipView *view); +void itip_view_set_show_recur_check (ItipView *view, gboolean show); +gboolean itip_view_get_recur_check_state (ItipView *view); + + G_END_DECLS #endif |