aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog5
-rw-r--r--calendar/gui/e-itip-control.c181
-rw-r--r--calendar/gui/e-itip-control.glade65
3 files changed, 143 insertions, 108 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 8a79a0a802..dbc1e1cf32 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-07 Jesse Pavel <jpavel@helixcode.com>
+
+ *gui/e-itip-control.c, gui/e-itip-control.glade: changed the GUI,
+ and added some extra feedback for the user.
+
2000-11-07 Federico Mena Quintero <federico@helixcode.com>
* gui/weekday-picker.h (WeekdayPickerClass): Added a "changed"
diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c
index b017678be3..b28ee1a2b1 100644
--- a/calendar/gui/e-itip-control.c
+++ b/calendar/gui/e-itip-control.c
@@ -21,8 +21,8 @@
#include <cal-client/cal-client.h>
-#define DEFAULT_WIDTH 500
-#define DEFAULT_HEIGHT 300
+#define DEFAULT_WIDTH 450
+#define DEFAULT_HEIGHT 350
extern gchar *evolution_dir;
@@ -31,9 +31,8 @@ typedef struct _EItipControlPrivate EItipControlPrivate;
struct _EItipControlPrivate {
GladeXML *xml, *xml2;
GtkWidget *main_frame;
- GtkWidget *text_box;
GtkWidget *organizer_entry, *dtstart_label, *dtend_label;
- GtkWidget *summary_entry, *description_box, *type_entry;
+ GtkWidget *summary_entry, *description_box, *message_text;
GtkWidget *address_entry;
GtkWidget *add_button;
GtkWidget *loading_window;
@@ -41,14 +40,15 @@ struct _EItipControlPrivate {
icalcomponent *main_comp, *comp;
CalComponent *cal_comp;
- gchar *from_address;
+ char *vcalendar;
+ gchar *from_address, *my_address, *organizer;
};
enum E_ITIP_BONOBO_ARGS {
- FROM_ADDRESS_ARG_ID
+ FROM_ADDRESS_ARG_ID,
+ MY_ADDRESS_ARG_ID
};
-#if 0
static icalparameter *
get_icalparam_by_type (icalproperty *prop, icalparameter_kind kind)
{
@@ -60,7 +60,45 @@ get_icalparam_by_type (icalproperty *prop, icalparameter_kind kind)
return param;
}
-#endif
+
+
+/********
+ * find_attendee() searches through the attendee properties of `comp'
+ * and returns the one whose value is the same as `address' if such
+ * a property exists. Otherwise, it will return NULL.
+ ********/
+static icalproperty *
+find_attendee (icalcomponent *comp, char *address)
+{
+ icalproperty *prop;
+ char *attendee, *text;
+ icalvalue *value;
+
+ for (prop = icalcomponent_get_first_property (comp, ICAL_ATTENDEE_PROPERTY);
+ prop != NULL;
+ prop = icalcomponent_get_next_property (comp, ICAL_ATTENDEE_PROPERTY))
+ {
+ value = icalproperty_get_value (prop);
+ if (!value)
+ continue;
+
+ attendee = icalvalue_get_string (value);
+
+ /* Here I strip off the "MAILTO:" if it is present. */
+ text = strchr (attendee, ':');
+ if (text != NULL)
+ text++;
+ else
+ text = attendee;
+
+ if (strcmp (text, address) == 0) {
+ /* We have found the correct property. */
+ break;
+ }
+ }
+
+ return prop;
+}
static void
itip_control_destroy_cb (GtkObject *object,
@@ -81,6 +119,12 @@ itip_control_destroy_cb (GtkObject *object,
if (priv->from_address != NULL)
g_free (priv->from_address);
+
+ if (priv->organizer != NULL)
+ g_free (priv->organizer);
+
+ if (priv->vcalendar != NULL)
+ g_free (priv->vcalendar);
g_free (priv);
}
@@ -215,9 +259,10 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
CORBA_Environment *ev)
{
EItipControlPrivate *priv = data;
- gchar *vcalendar;
gint pos, length, length2;
icalcomponent_kind comp_kind;
+ char message[256];
+
if (type && g_strcasecmp (type, "text/calendar") != 0 &&
g_strcasecmp (type, "text/x-calendar") != 0) {
@@ -226,27 +271,15 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
return;
}
- if ((vcalendar = stream_read (stream)) == NULL) {
+ if ((priv->vcalendar = stream_read (stream)) == NULL) {
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
ex_Bonobo_Persist_FileNotFound, NULL);
return;
}
/* Do something with the data, here. */
- pos = 0;
- length = strlen (vcalendar);
- length2 = strlen (gtk_editable_get_chars (GTK_EDITABLE (priv->text_box), 0, -1));
-
-
- if (length2 > 0)
- gtk_editable_delete_text (GTK_EDITABLE (priv->text_box), 0, length2);
- gtk_editable_insert_text (GTK_EDITABLE (priv->text_box),
- vcalendar,
- length,
- &pos);
-
- priv->main_comp = icalparser_parse_string (vcalendar);
+ priv->main_comp = icalparser_parse_string (priv->vcalendar);
if (priv->main_comp == NULL) {
g_printerr ("e-itip-control.c: the iCalendar data was invalid!\n");
return;
@@ -275,6 +308,7 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
break;
case ICAL_VFREEBUSY_COMPONENT:
/* Take care of busy time information. */
+ return;
break;
default:
/* We don't know what this is, so bail. */
@@ -284,7 +318,8 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
dialog = gnome_warning_dialog("I don't recognize this type of calendar component.");
gnome_dialog_run (GNOME_DIALOG(dialog));
- g_free (vcalendar);
+ g_free (priv->vcalendar);
+ priv->vcalendar = NULL;
return;
}
@@ -312,6 +347,7 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
else
new_text = organizer;
+ priv->organizer = g_strdup (new_text);
gtk_entry_set_text (GTK_ENTRY (priv->organizer_entry), new_text);
}
@@ -350,35 +386,53 @@ pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream,
gtk_label_set_text (GTK_LABEL (priv->dtstart_label), ctime (&tstart));
gtk_label_set_text (GTK_LABEL (priv->dtend_label), ctime (&tend));
+ /* Clear out any old-assed text that's been lying around in my message box. */
+ gtk_editable_delete_text (GTK_EDITABLE (priv->message_text), 0, -1);
+
prop = icalcomponent_get_first_property (priv->main_comp, ICAL_METHOD_PROPERTY);
switch (icalproperty_get_method (prop)) {
case ICAL_METHOD_PUBLISH:
- gtk_entry_set_text (GTK_ENTRY (priv->type_entry), "Published information");
+ sprintf (message, "%s has published calendar information, "
+ "which you can add to your own calendar."
+ "No reply is necessary.",
+ priv->from_address);
break;
case ICAL_METHOD_REQUEST:
- gtk_entry_set_text (GTK_ENTRY (priv->type_entry), "Meeting Request");
+ {
+ /* I'll check if I have to rsvp. */
+ icalproperty *prop;
+ icalparameter *param;
+ int rsvp = FALSE;
+
+ prop = find_attendee (priv->comp, priv->my_address);
+ if (prop) {
+ param = get_icalparam_by_type (prop, ICAL_RSVP_PARAMETER);
+
+ if (param) {
+ if (icalparameter_get_rsvp (param))
+ rsvp = TRUE;
+ }
+ }
+
+ sprintf (message, "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") );
+
+ }
break;
default:
- gtk_entry_set_text (GTK_ENTRY (priv->type_entry), "Unknown");
+ sprintf (message, "I haven't the slightest notion what this calendar "
+ "object represents. Sorry.");
}
-
- }
-
- pos = 0;
- length = strlen (vcalendar);
- length2 = strlen (gtk_editable_get_chars (GTK_EDITABLE (priv->text_box), 0, -1));
-
-
- if (length2 > 0)
- gtk_editable_delete_text (GTK_EDITABLE (priv->text_box), 0, length2);
-
- gtk_editable_insert_text (GTK_EDITABLE (priv->text_box),
- vcalendar,
- length,
- &pos);
+ {
+ int pos = 0;
- g_free (vcalendar);
+ gtk_editable_insert_text (GTK_EDITABLE (priv->message_text), message,
+ strlen (message), &pos);
+ }
+ }
} /* pstream_load */
@@ -391,7 +445,6 @@ pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream,
CORBA_Environment *ev)
{
EItipControlPrivate *priv = data;
- gchar *vcalendar;
int length;
if (type && g_strcasecmp (type, "text/calendar") != 0 &&
@@ -402,11 +455,9 @@ pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream,
}
/* Put something into vcalendar here. */
- length = gtk_text_get_length (GTK_TEXT (priv->text_box));
- vcalendar = gtk_editable_get_chars (GTK_EDITABLE (priv->text_box), 0, -1);
+ length = strlen (priv->vcalendar);
- bonobo_stream_client_write (stream, vcalendar, length, ev);
- g_free (vcalendar);
+ bonobo_stream_client_write (stream, priv->vcalendar, length, ev);
} /* pstream_save */
static CORBA_long
@@ -414,11 +465,11 @@ pstream_get_max_size (BonoboPersistStream *ps, void *data,
CORBA_Environment *ev)
{
EItipControlPrivate *priv = data;
- gint length;
- length = gtk_text_get_length (GTK_TEXT (priv->text_box));
-
- return length;
+ if (priv->vcalendar)
+ return strlen (priv->vcalendar);
+ else
+ return 0L;
}
static Bonobo_Persist_ContentTypeList *
@@ -434,7 +485,12 @@ get_prop ( BonoboPropertyBag *bag, BonoboArg *arg,
{
EItipControlPrivate *priv = user_data;
- BONOBO_ARG_SET_STRING (arg, priv->from_address);
+ if (arg_id == FROM_ADDRESS_ARG_ID) {
+ BONOBO_ARG_SET_STRING (arg, priv->from_address);
+ }
+ else if (arg_id == MY_ADDRESS_ARG_ID) {
+ BONOBO_ARG_SET_STRING (arg, priv->my_address);
+ }
}
static void
@@ -455,6 +511,12 @@ set_prop ( BonoboPropertyBag *bag, const BonoboArg *arg,
gtk_entry_set_text (GTK_ENTRY (priv->address_entry), priv->from_address);
}
+ else if (arg_id == MY_ADDRESS_ARG_ID) {
+ if (priv->my_address)
+ g_free (priv->my_address);
+
+ priv->my_address = g_strdup (BONOBO_ARG_GET_STRING (arg));
+ }
}
@@ -472,7 +534,6 @@ e_itip_control_factory (BonoboGenericFactory *Factory, void *closure)
/* Create the control. */
priv->main_frame = glade_xml_get_widget (priv->xml, "main_frame");
- priv->text_box = glade_xml_get_widget (priv->xml, "text_box");
priv->organizer_entry = glade_xml_get_widget (priv->xml, "organizer_entry");
priv->dtstart_label = glade_xml_get_widget (priv->xml, "dtstart_label");
priv->dtend_label = glade_xml_get_widget (priv->xml, "dtend_label");
@@ -480,23 +541,19 @@ e_itip_control_factory (BonoboGenericFactory *Factory, void *closure)
priv->description_box = glade_xml_get_widget (priv->xml, "description_box");
/* priv->add_button = glade_xml_get_widget (priv->xml, "add_button"); */
priv->address_entry = glade_xml_get_widget (priv->xml, "address_entry");
+ priv->message_text = glade_xml_get_widget (priv->xml, "message_text");
+
+ gtk_text_set_word_wrap (GTK_TEXT (priv->message_text), TRUE);
priv->xml2 = glade_xml_new (EVOLUTION_GLADEDIR "/" "e-itip-control.glade", "loading_window");
priv->loading_progress = glade_xml_get_widget (priv->xml2, "loading_progress");
priv->loading_window = glade_xml_get_widget (priv->xml2, "loading_window");
- gtk_text_set_editable (GTK_TEXT (priv->text_box), FALSE);
-
gtk_signal_connect (GTK_OBJECT (priv->main_frame), "destroy",
GTK_SIGNAL_FUNC (itip_control_destroy_cb), priv);
gtk_signal_connect (GTK_OBJECT (priv->main_frame), "size_request",
GTK_SIGNAL_FUNC (itip_control_size_request_cb), priv);
- /********
- * gtk_signal_connect (GTK_OBJECT (priv->add_button), "clicked",
- * GTK_SIGNAL_FUNC (add_button_clicked_cb), priv);
- ********/
- gtk_widget_show (priv->text_box);
gtk_widget_show (priv->main_frame);
control = bonobo_control_new (priv->main_frame);
@@ -507,6 +564,8 @@ e_itip_control_factory (BonoboGenericFactory *Factory, void *closure)
bonobo_property_bag_add (prop_bag, "from_address", FROM_ADDRESS_ARG_ID, BONOBO_ARG_STRING, NULL,
"from_address", 0 );
+ bonobo_property_bag_add (prop_bag, "my_address", MY_ADDRESS_ARG_ID, BONOBO_ARG_STRING, NULL,
+ "my_address", 0 );
bonobo_control_set_automerge (control, TRUE);
diff --git a/calendar/gui/e-itip-control.glade b/calendar/gui/e-itip-control.glade
index 2eeb7cc63e..6233f7b409 100644
--- a/calendar/gui/e-itip-control.glade
+++ b/calendar/gui/e-itip-control.glade
@@ -28,8 +28,7 @@
<class>GtkFrame</class>
<name>main_frame</name>
<border_width>4</border_width>
- <height>231</height>
- <label>Test iTip control</label>
+ <label>Calendar Message</label>
<label_xalign>0.11</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
@@ -55,7 +54,7 @@
<widget>
<class>GtkTable</class>
<name>table1</name>
- <rows>6</rows>
+ <rows>5</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>0</row_spacing>
@@ -379,55 +378,27 @@
<yfill>False</yfill>
</child>
</widget>
+ </widget>
- <widget>
- <class>GtkLabel</class>
- <name>label12</name>
- <label>Type</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <child>
- <left_attach>0</left_attach>
- <right_attach>1</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>False</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
- </widget>
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow3</name>
+ <hscrollbar_policy>GTK_POLICY_NEVER</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>GtkEntry</class>
- <name>type_entry</name>
+ <class>GtkText</class>
+ <name>message_text</name>
<can_focus>True</can_focus>
- <editable>True</editable>
- <text_visible>True</text_visible>
- <text_max_length>0</text_max_length>
+ <editable>False</editable>
<text></text>
- <child>
- <left_attach>1</left_attach>
- <right_attach>2</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>False</yfill>
- </child>
</widget>
</widget>