diff options
-rw-r--r-- | calendar/ChangeLog | 5 | ||||
-rw-r--r-- | calendar/gui/e-itip-control.c | 181 | ||||
-rw-r--r-- | calendar/gui/e-itip-control.glade | 65 |
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> |