aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog8
-rw-r--r--calendar/gui/e-meeting-dialog.glade157
-rw-r--r--calendar/gui/e-meeting-edit.c370
-rw-r--r--calendar/gui/e-meeting-edit.h11
-rw-r--r--calendar/gui/event-editor.c5
5 files changed, 411 insertions, 140 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index ef896182e1..925cada41a 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,11 @@
+2000-09-29 Jesse Pavel <jpavel@helixcode.com>
+
+ * gui/e-meeting-edit.c: added code that makes changes to the underlying
+ iCAL structure of an event, when the user changes meeting information.
+
+ * gui/e-meeting-dialog.glade: this is the Glade UI for the meeting dialog
+ and accoutrements.
+
2000-09-29 Damon Chaplin <damon@helixcode.com>
* cal-util/cal-recur.c: updated to support RDATE end times or
diff --git a/calendar/gui/e-meeting-dialog.glade b/calendar/gui/e-meeting-dialog.glade
index 7dee1b9166..809eb38f8f 100644
--- a/calendar/gui/e-meeting-dialog.glade
+++ b/calendar/gui/e-meeting-dialog.glade
@@ -16,7 +16,7 @@
<class>GtkWindow</class>
<name>meeting_window</name>
<width>400</width>
- <height>300</height>
+ <height>330</height>
<visible>False</visible>
<title>Meeting Invitations</title>
<type>GTK_WINDOW_DIALOG</type>
@@ -38,7 +38,7 @@
<orientation>GTK_ORIENTATION_HORIZONTAL</orientation>
<type>GTK_TOOLBAR_BOTH</type>
<space_size>5</space_size>
- <space_style>GTK_TOOLBAR_SPACE_EMPTY</space_style>
+ <space_style>GTK_TOOLBAR_SPACE_LINE</space_style>
<relief>GTK_RELIEF_NORMAL</relief>
<tooltips>True</tooltips>
<child>
@@ -51,69 +51,78 @@
<class>GtkButton</class>
<child_name>Toolbar:button</child_name>
<name>send_button</name>
- <width>64</width>
- <label>Send</label>
+ <label>Send
+Updates</label>
<stock_pixmap>GNOME_STOCK_PIXMAP_MAIL_SND</stock_pixmap>
</widget>
<widget>
+ <class>GtkVSeparator</class>
+ <name>vseparator1</name>
+ <width>13</width>
+ <height>58</height>
+ </widget>
+
+ <widget>
<class>GtkButton</class>
<child_name>Toolbar:button</child_name>
- <name>cancel_button</name>
- <label>Cancel</label>
+ <name>button4</name>
+ <label>Cancel
+Meeting</label>
<stock_pixmap>GNOME_STOCK_PIXMAP_CLOSE</stock_pixmap>
</widget>
+
+ <widget>
+ <class>GtkVSeparator</class>
+ <name>vseparator2</name>
+ <width>12</width>
+ <height>58</height>
+ </widget>
</widget>
<widget>
- <class>GtkScrolledWindow</class>
- <name>scrolledwindow1</name>
- <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
- <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
- <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
- <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+ <class>GtkHBox</class>
+ <name>hbox3</name>
+ <border_width>3</border_width>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
<child>
- <padding>0</padding>
- <expand>True</expand>
+ <padding>4</padding>
+ <expand>False</expand>
<fill>True</fill>
</child>
<widget>
- <class>GtkCList</class>
- <name>attendee_list</name>
- <border_width>3</border_width>
- <can_focus>True</can_focus>
- <columns>2</columns>
- <column_widths>222,80</column_widths>
- <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
- <show_titles>True</show_titles>
- <shadow_type>GTK_SHADOW_IN</shadow_type>
-
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>attendee_label</name>
- <label>Attendee</label>
- <justify>GTK_JUSTIFY_LEFT</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
+ <class>GtkLabel</class>
+ <name>label3</name>
+ <label>Organizer: </label>
+ <justify>GTK_JUSTIFY_RIGHT</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>3</xpad>
+ <ypad>0</ypad>
+ <child>
+ <padding>1</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
- <widget>
- <class>GtkLabel</class>
- <child_name>CList:title</child_name>
- <name>status_label</name>
- <label>Status</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- </widget>
+ <widget>
+ <class>GtkEntry</class>
+ <name>organizer_entry</name>
+ <width>252</width>
+ <can_focus>True</can_focus>
+ <editable>False</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text></text>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ </child>
</widget>
</widget>
@@ -186,6 +195,58 @@
</widget>
</widget>
</widget>
+
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow1</name>
+ <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
+ <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
+ <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+ <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkCList</class>
+ <name>attendee_list</name>
+ <border_width>3</border_width>
+ <can_focus>True</can_focus>
+ <columns>2</columns>
+ <column_widths>222,80</column_widths>
+ <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
+ <show_titles>True</show_titles>
+ <shadow_type>GTK_SHADOW_IN</shadow_type>
+
+ <widget>
+ <class>GtkLabel</class>
+ <child_name>CList:title</child_name>
+ <name>attendee_label</name>
+ <label>Attendee</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <child_name>CList:title</child_name>
+ <name>status_label</name>
+ <label>Status</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
+ </widget>
+ </widget>
</widget>
</widget>
diff --git a/calendar/gui/e-meeting-edit.c b/calendar/gui/e-meeting-edit.c
index 4b0499542a..55442b819b 100644
--- a/calendar/gui/e-meeting-edit.c
+++ b/calendar/gui/e-meeting-edit.c
@@ -23,19 +23,44 @@
#include <gnome.h>
#include <glade/glade.h>
#include <icaltypes.h>
+#include <ical.h>
#include "e-meeting-edit.h"
#define E_MEETING_GLADE_XML "e-meeting-dialog.glade"
#define E_MEETING_DEBUG
-/* These are the widgets to be used in the GUI. */
-static GladeXML *xml;
-static GtkWidget *meeting_window;
-static GtkWidget *attendee_list;
-static GtkWidget *address_entry;
-static GtkWidget *add_dialog;
-static gint selected_row;
+typedef struct _EMeetingEditorPrivate EMeetingEditorPrivate;
+
+struct _EMeetingEditorPrivate {
+ /* These are the widgets to be used in the GUI. */
+ GladeXML *xml;
+ GtkWidget *meeting_window;
+ GtkWidget *attendee_list;
+ GtkWidget *address_entry;
+ GtkWidget *add_dialog;
+
+ /* Various pieces of information. */
+ gint selected_row;
+ CalComponent *comp;
+ CalClient *client;
+ icalcomponent *icalcomp, *vevent;
+
+ gint numentries; /* How many attendees are there? */
+ gboolean dirty; /* Has anything changed? */
+};
+
+
+static gchar *partstat_values[] = {
+ "Needs action",
+ "Accepted",
+ "Declined",
+ "Tentative",
+ "Delegated",
+ "Completed",
+ "In Progress",
+ "Unknown"
+};
static gboolean
@@ -43,10 +68,28 @@ window_delete_cb (GtkWidget *widget,
GdkEvent *event,
gpointer data)
{
+ EMeetingEditorPrivate *priv;
+
+ priv = (EMeetingEditorPrivate *) ((EMeetingEditor *)data)->priv;
#ifdef E_MEETING_DEBUG
- g_print ("e-meeting-edit.c: The main window received a delete event.\n");
+ g_printerr ("e-meeting-edit.c: The main window received a delete event.\n");
#endif
+
+ if (priv->dirty == TRUE) {
+ /* FIXME: notify the event editor that our data has changed.
+ For now, I'll just display a dialog box. */
+ {
+ GtkWidget *dialog;
+
+ dialog = gnome_warning_dialog_parented ("Note that the meeting has changed,\n"
+ "and you should save this event.",
+ GTK_WINDOW (priv->meeting_window));
+ gnome_dialog_run (GNOME_DIALOG(dialog));
+ }
+ }
+
+
return (FALSE);
}
@@ -55,9 +98,14 @@ static void
window_destroy_cb (GtkWidget *widget,
gpointer data)
{
+ EMeetingEditorPrivate *priv;
+
#ifdef E_MEETING_DEBUG
- g_print ("e-meeting-edit.c: The main window received a destroy event.\n");
+ g_printerr ("e-meeting-edit.c: The main window received a destroy event.\n");
#endif
+
+ priv = (EMeetingEditorPrivate *) ((EMeetingEditor *)data)->priv;
+
gtk_main_quit ();
return;
}
@@ -65,68 +113,112 @@ window_destroy_cb (GtkWidget *widget,
static void
add_button_clicked_cb (GtkWidget *widget, gpointer data)
{
+ EMeetingEditorPrivate *priv;
gint button_num;
+ gchar buffer[200];
#ifdef E_MEETING_DEBUG
- g_print ("e-meeting-edit.c: the add button was clicked.\n");
+ g_printerr ("e-meeting-edit.c: the add button was clicked.\n");
#endif
- if (add_dialog == NULL || address_entry == NULL) {
- add_dialog = glade_xml_get_widget (xml, "add_dialog");
- address_entry = glade_xml_get_widget (xml, "address_entry");
-
- gnome_dialog_set_close (GNOME_DIALOG (add_dialog), TRUE);
- gnome_dialog_editable_enters (GNOME_DIALOG (add_dialog), GTK_EDITABLE (address_entry));
- gnome_dialog_close_hides (GNOME_DIALOG (add_dialog), TRUE);
- gnome_dialog_set_default (GNOME_DIALOG (add_dialog), 0);
+
+ priv = (EMeetingEditorPrivate *) ((EMeetingEditor *)data)->priv;
+
+ if (priv->add_dialog == NULL || priv->address_entry == NULL) {
+ priv->add_dialog = glade_xml_get_widget (priv->xml, "add_dialog");
+ priv->address_entry = glade_xml_get_widget (priv->xml, "address_entry");
+
+ gnome_dialog_set_close (GNOME_DIALOG (priv->add_dialog), TRUE);
+ gnome_dialog_editable_enters (GNOME_DIALOG (priv->add_dialog),
+ GTK_EDITABLE (priv->address_entry));
+ gnome_dialog_close_hides (GNOME_DIALOG (priv->add_dialog), TRUE);
+ gnome_dialog_set_default (GNOME_DIALOG (priv->add_dialog), 0);
}
- g_return_if_fail (add_dialog != NULL);
- g_return_if_fail (address_entry != NULL);
+ g_return_if_fail (priv->add_dialog != NULL);
+ g_return_if_fail (priv->address_entry != NULL);
- gtk_widget_show (add_dialog);
+ gtk_widget_show (priv->add_dialog);
- button_num = gnome_dialog_run (GNOME_DIALOG (add_dialog));
+ button_num = gnome_dialog_run (GNOME_DIALOG (priv->add_dialog));
if (button_num == 0) {
/* The user pressed Okay--let's add it to our list. */
- gchar temp_stat[] = "Needs action";
+ icalproperty *prop;
+ icalparameter *param;
+ icalvalue *value;
+
gchar *address;
gchar * row_text[2];
- address = gtk_entry_get_text (GTK_ENTRY (address_entry));
+ address = gtk_entry_get_text (GTK_ENTRY (priv->address_entry));
+
+ prop = icalproperty_new (ICAL_ATTENDEE_PROPERTY);
+ g_snprintf (buffer, 190, "MAILTO:%s", address);
+ value = icalvalue_new_text (buffer);
+ icalproperty_set_value (prop, value);
+
+ param = icalparameter_new_partstat (ICAL_PARTSTAT_PARAMETER);
+ icalparameter_set_partstat (param, ICAL_PARTSTAT_NEEDSACTION);
+ icalproperty_add_parameter (prop, param);
+
+ icalcomponent_add_property (priv->vevent, prop);
+
row_text[0] = address;
- row_text[1] = temp_stat;
+ row_text[1] = partstat_values[icalparameter_get_partstat (param)];
- gtk_clist_append (GTK_CLIST (attendee_list), row_text);
+ gtk_clist_append (GTK_CLIST (priv->attendee_list), row_text);
+ gtk_clist_set_row_data (GTK_CLIST (priv->attendee_list), priv->numentries, prop);
+
+ priv->numentries++;
+ priv->dirty = TRUE;
}
- gtk_entry_set_text (GTK_ENTRY (address_entry), "");
+ gtk_entry_set_text (GTK_ENTRY (priv->address_entry), "");
}
static void
delete_button_clicked_cb (GtkWidget *widget, gpointer data)
{
- if (selected_row < 0) {
+ EMeetingEditorPrivate *priv;
+
+ priv = (EMeetingEditorPrivate *) ((EMeetingEditor *)data)->priv;
+
+ if (priv->selected_row < 0) {
GtkWidget *dialog;
dialog = gnome_warning_dialog_parented ("You must select an entry to delete.",
- GTK_WINDOW (add_dialog));
+ GTK_WINDOW (priv->meeting_window));
gnome_dialog_run (GNOME_DIALOG(dialog));
}
else {
- gtk_clist_remove (GTK_CLIST (attendee_list), selected_row);
- selected_row = -1;
+ /* Delete the associated property from the iCAL object. */
+ icalproperty *prop;
+
+ prop = (icalproperty *)gtk_clist_get_row_data (GTK_CLIST (priv->attendee_list),
+ priv->selected_row);
+ icalcomponent_remove_property (priv->vevent, prop);
+ icalproperty_free (prop);
+
+ gtk_clist_remove (GTK_CLIST (priv->attendee_list), priv->selected_row);
+ priv->selected_row = -1;
+ priv->numentries--;
+ priv->dirty = TRUE;
}
}
static void
edit_button_clicked_cb (GtkWidget *widget, gpointer data)
{
- if (selected_row < 0) {
+ EMeetingEditorPrivate *priv;
+
+ priv = (EMeetingEditorPrivate *) ((EMeetingEditor *)data)->priv;
+
+
+ if (priv->selected_row < 0) {
GtkWidget *dialog;
dialog = gnome_warning_dialog_parented ("You must select an entry to edit.",
- GTK_WINDOW (add_dialog));
+ GTK_WINDOW (priv->meeting_window));
gnome_dialog_run (GNOME_DIALOG(dialog));
return;
}
@@ -136,122 +228,220 @@ edit_button_clicked_cb (GtkWidget *widget, gpointer data)
gint button_num;
for (cntr = 0; cntr < 2; cntr++) {
- gtk_clist_get_text (GTK_CLIST (attendee_list),
- selected_row,
+ gtk_clist_get_text (GTK_CLIST (priv->attendee_list),
+ priv->selected_row,
cntr,
&text[cntr]);
}
- if (add_dialog == NULL || address_entry == NULL) {
- add_dialog = glade_xml_get_widget (xml, "add_dialog");
- address_entry = glade_xml_get_widget (xml, "address_entry");
+ if (priv->add_dialog == NULL || priv->address_entry == NULL) {
+ priv->add_dialog = glade_xml_get_widget (priv->xml, "add_dialog");
+ priv->address_entry = glade_xml_get_widget (priv->xml, "address_entry");
- gnome_dialog_set_close (GNOME_DIALOG (add_dialog), TRUE);
- gnome_dialog_editable_enters (GNOME_DIALOG (add_dialog), GTK_EDITABLE (address_entry));
- gnome_dialog_close_hides (GNOME_DIALOG (add_dialog), TRUE);
- gnome_dialog_set_default (GNOME_DIALOG (add_dialog), 0);
+ gnome_dialog_set_close (GNOME_DIALOG (priv->add_dialog), TRUE);
+ gnome_dialog_editable_enters (GNOME_DIALOG (priv->add_dialog),
+ GTK_EDITABLE (priv->address_entry));
+ gnome_dialog_close_hides (GNOME_DIALOG (priv->add_dialog), TRUE);
+ gnome_dialog_set_default (GNOME_DIALOG (priv->add_dialog), 0);
}
- gtk_entry_set_text (GTK_ENTRY (address_entry), text[0]);
+ gtk_entry_set_text (GTK_ENTRY (priv->address_entry), text[0]);
- gtk_widget_show (add_dialog);
+ gtk_widget_show (priv->add_dialog);
- button_num = gnome_dialog_run (GNOME_DIALOG (add_dialog));
+ button_num = gnome_dialog_run (GNOME_DIALOG (priv->add_dialog));
if (button_num == 0) {
gchar *new_text;
+ icalproperty *prop;
+ icalparameter *param;
+ icalvalue *value;
+ gchar buffer[200];
- new_text = gtk_entry_get_text (GTK_ENTRY (address_entry));
+ new_text = gtk_entry_get_text (GTK_ENTRY (priv->address_entry));
- gtk_clist_set_text (GTK_CLIST (attendee_list),
- selected_row,
+ gtk_clist_set_text (GTK_CLIST (priv->attendee_list),
+ priv->selected_row,
0,
new_text);
+
+ prop = (icalproperty *)gtk_clist_get_row_data (GTK_CLIST (priv->attendee_list),
+ priv->selected_row);
+ g_snprintf (buffer, 190, "MAILTO:%s", new_text);
+ value = icalvalue_new_text (buffer);
+ icalproperty_set_value (prop, value);
+
+ priv->dirty = TRUE;
}
- gtk_entry_set_text (GTK_ENTRY (address_entry), "");
+ gtk_entry_set_text (GTK_ENTRY (priv->address_entry), "");
}
}
-
-
-
static void list_row_select_cb (GtkWidget *widget,
gint row,
gint column,
GdkEventButton *event,
gpointer data)
{
- selected_row = row;
+ EMeetingEditorPrivate *priv;
+
+ priv = (EMeetingEditorPrivate *) ((EMeetingEditor *)data)->priv;
+
+ priv->selected_row = row;
}
-static void
-reset_widgets (void)
+
+/* ------------------------------------------------------------ */
+/* --------------------- Exported Functions ------------------- */
+/* ------------------------------------------------------------ */
+
+EMeetingEditor *
+e_meeting_editor_new (CalComponent *comp, CalClient *client)
+{
+ EMeetingEditor *object;
+ EMeetingEditorPrivate *priv;
+
+ object = (EMeetingEditor *)g_new(EMeetingEditor, 1);
+
+ priv = (EMeetingEditorPrivate *) g_new0(EMeetingEditorPrivate, 1);
+ priv->selected_row = -1;
+ priv->comp = comp;
+ priv->client = client;
+ priv->icalcomp = cal_component_get_icalcomponent (comp);
+
+ object->priv = priv;
+
+ return object;
+}
+
+void
+e_meeting_editor_free (EMeetingEditor *editor)
{
- xml = NULL;
- meeting_window = NULL;
- attendee_list = NULL;
- address_entry = NULL;
- add_dialog = NULL;
- selected_row = -1;
+ if (editor == NULL)
+ return;
+
+ if (editor->priv != NULL)
+ g_free (editor->priv);
+
+ g_free (editor);
}
+
+
void
-e_meeting_edit (CalComponent *comp, CalClient *client)
+e_meeting_edit (EMeetingEditor *editor)
{
+ EMeetingEditorPrivate *priv;
GtkWidget *add_button, *delete_button, *edit_button;
+ icalproperty *prop;
+ icalparameter *param;
+ icalvalue *value;
+ gchar *text;
+ gchar *row_text[2];
+
+
+ g_return_if_fail (editor != NULL);
- reset_widgets ();
+ priv = (EMeetingEditorPrivate *)editor->priv;
- xml = glade_xml_new (EVOLUTION_GLADEDIR "/" E_MEETING_GLADE_XML, NULL);
+ g_return_if_fail (priv != NULL);
+
+
+ priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/" E_MEETING_GLADE_XML, NULL);
- meeting_window = glade_xml_get_widget (xml, "meeting_window");
- attendee_list = glade_xml_get_widget (xml, "attendee_list");
+ priv->meeting_window = glade_xml_get_widget (priv->xml, "meeting_window");
+ priv->attendee_list = glade_xml_get_widget (priv->xml, "attendee_list");
- gtk_clist_set_column_justification (GTK_CLIST (attendee_list), 1, GTK_JUSTIFY_CENTER);
+ gtk_clist_set_column_justification (GTK_CLIST (priv->attendee_list), 1, GTK_JUSTIFY_CENTER);
- gtk_signal_connect (GTK_OBJECT (meeting_window), "delete_event",
- GTK_SIGNAL_FUNC (window_delete_cb), NULL);
+ gtk_signal_connect (GTK_OBJECT (priv->meeting_window), "delete_event",
+ GTK_SIGNAL_FUNC (window_delete_cb), editor);
- gtk_signal_connect_after (GTK_OBJECT (meeting_window), "delete_event",
- GTK_SIGNAL_FUNC (window_destroy_cb), NULL);
+ gtk_signal_connect_after (GTK_OBJECT (priv->meeting_window), "delete_event",
+ GTK_SIGNAL_FUNC (window_destroy_cb), editor);
- gtk_signal_connect (GTK_OBJECT (meeting_window), "destroy_event",
- GTK_SIGNAL_FUNC (window_destroy_cb), NULL);
+ gtk_signal_connect (GTK_OBJECT (priv->meeting_window), "destroy_event",
+ GTK_SIGNAL_FUNC (window_destroy_cb), editor);
- gtk_signal_connect (GTK_OBJECT (attendee_list), "select_row",
- GTK_SIGNAL_FUNC (list_row_select_cb), NULL);
+ gtk_signal_connect (GTK_OBJECT (priv->attendee_list), "select_row",
+ GTK_SIGNAL_FUNC (list_row_select_cb), editor);
- add_button = glade_xml_get_widget (xml, "add_button");
- delete_button = glade_xml_get_widget (xml, "delete_button");
- edit_button = glade_xml_get_widget (xml, "edit_button");
+ 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");
gtk_signal_connect (GTK_OBJECT (add_button), "clicked",
- GTK_SIGNAL_FUNC (add_button_clicked_cb), NULL);
+ GTK_SIGNAL_FUNC (add_button_clicked_cb), editor);
gtk_signal_connect (GTK_OBJECT (delete_button), "clicked",
- GTK_SIGNAL_FUNC (delete_button_clicked_cb), NULL);
+ GTK_SIGNAL_FUNC (delete_button_clicked_cb), editor);
gtk_signal_connect (GTK_OBJECT (edit_button), "clicked",
- GTK_SIGNAL_FUNC (edit_button_clicked_cb), NULL);
+ GTK_SIGNAL_FUNC (edit_button_clicked_cb), editor);
+
+ if (icalcomponent_isa (priv->icalcomp) != ICAL_VEVENT_COMPONENT)
+ priv->vevent = icalcomponent_get_first_component(priv->icalcomp,ICAL_VEVENT_COMPONENT);
+ else
+ priv->vevent = priv->icalcomp;
+
+ g_assert (priv->vevent != NULL);
+
+ /* Let's go through the iCAL object, and create a list entry
+ for each ATTENDEE property. */
+ for (prop = icalcomponent_get_first_property (priv->vevent, ICAL_ATTENDEE_PROPERTY);
+ prop != NULL;
+ prop = icalcomponent_get_next_property (priv->vevent, ICAL_ATTENDEE_PROPERTY))
+ {
+ value = icalproperty_get_value (prop);
+ text = g_strdup (icalvalue_as_ical_string (value));
+
+ /* Strip off the MAILTO: from the property value. */
+ row_text[0] = strchr (text, ':');
+ if (row_text[0] != NULL)
+ row_text[0]++;
+ else
+ row_text[0] = text;
+
+ for (param = icalproperty_get_first_parameter (prop, ICAL_ANY_PARAMETER);
+ param != NULL && icalparameter_isa (param) != ICAL_PARTSTAT_PARAMETER;
+ param = icalproperty_get_next_parameter (prop, ICAL_ANY_PARAMETER) );
+
+ if (param == NULL) {
+ /* We need to add a PARTSTAT parameter to this property. */
+ param = icalparameter_new_partstat (ICAL_PARTSTAT_PARAMETER);
+ icalparameter_set_partstat (param, ICAL_PARTSTAT_NEEDSACTION);
+ icalproperty_add_parameter (prop, param);
+ }
+
+ /* row_text[1] corresponds to the `Status' column in the CList. */
+ row_text[1] = partstat_values[icalparameter_get_partstat (param)];
+ gtk_clist_append (GTK_CLIST (priv->attendee_list), row_text);
+
+ /* The property to which each row in the list refers will be stored
+ as the data for that row. */
+ gtk_clist_set_row_data (GTK_CLIST (priv->attendee_list), priv->numentries, prop);
+ priv->numentries++;
+
+ g_free (text);
+ }
+
- gtk_widget_show (meeting_window);
+ gtk_widget_show (priv->meeting_window);
gtk_main ();
#ifdef E_MEETING_DEBUG
- g_print ("e-meeting-edit.c: We've terminated the subsidiary gtk_main().\n");
+ g_printerr ("e-meeting-edit.c: We've terminated the subsidiary gtk_main().\n");
#endif
- if (meeting_window != NULL)
- gtk_widget_destroy (meeting_window);
-
- if (add_dialog != NULL)
- gtk_widget_destroy (add_dialog);
-
+ if (priv->meeting_window != NULL)
+ gtk_widget_destroy (priv->meeting_window);
+ if (priv->add_dialog != NULL)
+ gtk_widget_destroy (priv->add_dialog);
- gtk_object_destroy (GTK_OBJECT (xml));
+ gtk_object_unref (GTK_OBJECT (priv->xml));
}
diff --git a/calendar/gui/e-meeting-edit.h b/calendar/gui/e-meeting-edit.h
index 82b2af9288..783a9c6b34 100644
--- a/calendar/gui/e-meeting-edit.h
+++ b/calendar/gui/e-meeting-edit.h
@@ -28,7 +28,16 @@
#include <cal-util/cal-component.h>
#include <cal-client/cal-client.h>
-void e_meeting_edit (CalComponent *comp, CalClient *client);
+typedef struct _EMeetingEditor EMeetingEditor;
+
+struct _EMeetingEditor {
+ gpointer priv;
+};
+
+
+EMeetingEditor * e_meeting_editor_new (CalComponent *comp, CalClient *client);
+void e_meeting_edit (EMeetingEditor *editor);
+void e_meeting_editor_free (EMeetingEditor *editor);
#endif /* __E_MEETING_EDIT_H__ */
diff --git a/calendar/gui/event-editor.c b/calendar/gui/event-editor.c
index 5f7b693be3..7575e1f34d 100644
--- a/calendar/gui/event-editor.c
+++ b/calendar/gui/event-editor.c
@@ -1153,6 +1153,7 @@ schedule_meeting_cb (GtkWidget *widget, gpointer data)
{
EventEditor *ee;
EventEditorPrivate *priv;
+ EMeetingEditor *editor;
ee = EVENT_EDITOR (data);
@@ -1160,7 +1161,9 @@ schedule_meeting_cb (GtkWidget *widget, gpointer data)
priv = (EventEditorPrivate *)ee->priv;
- e_meeting_edit (priv->comp, priv->client);
+ editor = e_meeting_editor_new (priv->comp, priv->client);
+ e_meeting_edit (editor);
+ e_meeting_editor_free (editor);
}