aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog6
-rw-r--r--calendar/gui/e-itip-control.c123
-rw-r--r--calendar/gui/e-meeting-edit.c23
3 files changed, 131 insertions, 21 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index ed20842624..e5bdf9696c 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,9 @@
+2000-11-16 Jesse Pavel <jpavel@helixcode.com>
+
+ * gui/e-itip-control.c, gui/e-meeting-edit.c: added cancellation
+ code to our program; people can cancel meetings, which is the best
+ thing to do for most meetings.
+
2000-11-13 Jesse Pavel <jpavel@helixcode.com>
* gui/e-itip-control.c: made the REPLY code actually work.
diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c
index a8151b01bf..fc93489618 100644
--- a/calendar/gui/e-itip-control.c
+++ b/calendar/gui/e-itip-control.c
@@ -393,6 +393,41 @@ decline_button_clicked_cb (GtkWidget *widget, gpointer data)
return;
}
+
+/********
+ * load_calendar_store() opens and loads the calendar referred to by cal_uri
+ * and sets cal_client as a client for that store. If cal_uri is NULL,
+ * we load the default calendar URI. If all goes well, it returns TRUE;
+ * otherwise, it returns FALSE.
+ ********/
+static gboolean
+load_calendar_store (char *cal_uri, CalClient **cal_client)
+{
+ char uri_buf[255];
+ char *uri;
+
+ if (cal_uri == NULL) {
+ snprintf (uri_buf, 250, "%s/local/Calendar/calendar.ics", evolution_dir);
+ uri = uri_buf;
+ }
+ else {
+ uri = cal_uri;
+ }
+
+ *cal_client = cal_client_new ();
+ if (cal_client_load_calendar (*cal_client, uri) == FALSE) {
+ return FALSE;
+ }
+
+ while (!cal_client_is_loaded (*cal_client)) {
+ gtk_main_iteration_do (FALSE); /* Do a non-blocking iteration. */
+ usleep (200000L); /* Pause for 1/5th of a second before checking again.*/
+ }
+
+ return TRUE;
+}
+
+
static void
update_reply_cb (GtkWidget *widget, gpointer data)
{
@@ -403,27 +438,17 @@ update_reply_cb (GtkWidget *widget, gpointer data)
icalproperty *prop;
icalparameter *param;
const char *uid;
- char cal_uri[255];
-
- /* First we must load our calendar object from the calendar store. */
- snprintf (cal_uri, 250, "%s/local/Calendar/calendar.ics", evolution_dir);
-
- cal_client = cal_client_new ();
- if (cal_client_load_calendar (cal_client, cal_uri) == FALSE) {
+ if (load_calendar_store (NULL, &cal_client) == FALSE) {
GtkWidget *dialog;
- dialog = gnome_warning_dialog("I couldn't open your calendar file!\n");
+ dialog = gnome_warning_dialog("I couldn't load your calendar file!\n");
gnome_dialog_run (GNOME_DIALOG(dialog));
gtk_object_unref (GTK_OBJECT (cal_client));
return;
}
-
- while (!cal_client_is_loaded (cal_client)) {
- gtk_main_iteration_do (FALSE); /* Do a non-blocking iteration. */
- usleep (200000L); /* Pause for 1/5th of a second before checking again.*/
- }
+
cal_component_get_uid (priv->cal_comp, &uid);
if (cal_client_get_object (cal_client, uid, &cal_comp) != CAL_CLIENT_GET_SUCCESS) {
@@ -478,6 +503,44 @@ update_reply_cb (GtkWidget *widget, gpointer data)
gtk_object_unref (GTK_OBJECT (cal_comp));
}
+static void
+cancel_meeting_cb (GtkWidget *widget, gpointer data)
+{
+ EItipControlPrivate *priv = data;
+ CalClient *cal_client;
+ const char *uid;
+
+ if (load_calendar_store (NULL, &cal_client) == FALSE) {
+ GtkWidget *dialog;
+
+ dialog = gnome_warning_dialog("I couldn't load your calendar file!\n");
+ gnome_dialog_run (GNOME_DIALOG(dialog));
+ gtk_object_unref (GTK_OBJECT (cal_client));
+
+ return;
+ }
+
+ cal_component_get_uid (priv->cal_comp, &uid);
+ if (cal_client_remove_object (cal_client, uid) == FALSE) {
+ GtkWidget *dialog;
+
+ dialog = gnome_warning_dialog("I couldn't delete the calendar component!\n");
+ gnome_dialog_run (GNOME_DIALOG(dialog));
+ gtk_object_unref (GTK_OBJECT (cal_client));
+
+ return;
+ }
+ else {
+ /* We have success! */
+ GtkWidget *dialog;
+
+ dialog = gnome_ok_dialog("Component successfully deleted.");
+ gnome_dialog_run (GNOME_DIALOG(dialog));
+ }
+
+}
+
+
/*
* Bonobo::PersistStream
@@ -694,7 +757,7 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
{
GtkWidget *button;
- sprintf (message, "%s has published calendar information, "
+ snprintf (message, 250, "%s has published calendar information, "
"which you can add to your own calendar. "
"No reply is necessary.",
priv->from_address);
@@ -725,7 +788,7 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
}
}
- sprintf (message, "This is a meeting organized by %s, "
+ snprintf (message, 250, "This is a meeting organized by %s, "
"who indicated that you %s RSVP.",
(priv->organizer ? priv->organizer : "an unknown person"),
(rsvp ? "should" : "don't have to") );
@@ -772,7 +835,7 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
}
if (!success) {
- sprintf (message, "%s sent a reply to a meeting request, but "
+ snprintf (message, 250, "%s sent a reply to a meeting request, but "
"the reply is not properly formed.",
priv->from_address);
}
@@ -786,14 +849,38 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (update_reply_cb), priv);
- sprintf (message, "%s responded to your request, replying with: %s",
+ snprintf (message, 250, "%s responded to your request, replying with: %s",
priv->from_address, partstat_values[priv->new_partstat]);
}
}
break;
+ case ICAL_METHOD_CANCEL:
+ {
+ if (strcmp (priv->organizer, priv->from_address) != 0) {
+ snprintf (message, 250, "%s sent a cancellation request, but is not "
+ "the organizer of the meeting.",
+ priv->from_address);
+ }
+ else {
+ GtkWidget *button;
+
+ button = gtk_button_new_with_label ("Cancel Meeting");
+ gtk_box_pack_start (GTK_BOX (priv->button_box), button, FALSE, FALSE, 3);
+ gtk_widget_show (button);
+
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (cancel_meeting_cb), priv);
+
+ snprintf (message, 250, "%s sent a cancellation request. You can"
+ " delete this event from your calendar, if you wish.",
+ priv->organizer);
+ }
+
+ }
+ break;
default:
- sprintf (message, "I haven't the slightest notion what this calendar "
+ snprintf (message, 250, "I haven't the slightest notion what this calendar "
"object represents. Sorry.");
}
diff --git a/calendar/gui/e-meeting-edit.c b/calendar/gui/e-meeting-edit.c
index 6d72ea2c66..bdacb7514b 100644
--- a/calendar/gui/e-meeting-edit.c
+++ b/calendar/gui/e-meeting-edit.c
@@ -45,7 +45,8 @@ struct _EMeetingEditorPrivate {
GtkWidget *organizer_entry;
GtkWidget *role_entry;
GtkWidget *rsvp_check;
- GtkWidget *publish_button, *request_button, *schedule_button;
+ GtkWidget *publish_button, *request_button, *cancel_button,
+ *schedule_button;
gint changed_signal_id;
@@ -469,12 +470,14 @@ schedule_button_clicked_cb (GtkWidget *widget, gpointer data)
static gchar *itip_methods[] = {
"REQUEST",
- "PUBLISH"
+ "PUBLISH",
+ "CANCEL"
};
enum itip_method_enum {
METHOD_REQUEST,
- METHOD_PUBLISH
+ METHOD_PUBLISH,
+ METHOD_CANCEL
};
typedef enum itip_method_enum itip_method_enum;
@@ -679,6 +682,16 @@ request_button_clicked_cb (GtkWidget *widget, gpointer data)
}
+static void
+cancel_button_clicked_cb (GtkWidget *widget, gpointer data)
+{
+ EMeetingEditorPrivate *priv;
+
+ priv = (EMeetingEditorPrivate *) ((EMeetingEditor *)data)->priv;
+
+ send_calendar_info (METHOD_CANCEL, priv);
+}
+
static void
@@ -891,6 +904,7 @@ e_meeting_edit (EMeetingEditor *editor)
priv->schedule_button = glade_xml_get_widget (priv->xml, "schedule_button");
priv->publish_button = glade_xml_get_widget (priv->xml, "publish_button");
priv->request_button = glade_xml_get_widget (priv->xml, "request_button");
+ priv->cancel_button = glade_xml_get_widget (priv->xml, "cancel_button");
gtk_clist_set_column_justification (GTK_CLIST (priv->attendee_list), ROLE_COL, GTK_JUSTIFY_CENTER);
gtk_clist_set_column_justification (GTK_CLIST (priv->attendee_list), RSVP_COL, GTK_JUSTIFY_CENTER);
@@ -917,6 +931,9 @@ e_meeting_edit (EMeetingEditor *editor)
gtk_signal_connect (GTK_OBJECT (priv->request_button), "clicked",
GTK_SIGNAL_FUNC (request_button_clicked_cb), editor);
+ gtk_signal_connect (GTK_OBJECT (priv->cancel_button), "clicked",
+ GTK_SIGNAL_FUNC (cancel_button_clicked_cb), editor);
+
add_button = glade_xml_get_widget (priv->xml, "add_button");
delete_button = glade_xml_get_widget (priv->xml, "delete_button");
edit_button = glade_xml_get_widget (priv->xml, "edit_button");