Re: [evolution-patches] [calendar] Reply ReplyAll options added for meetings
- From: "Chakravarthi P" <pchakravarthi novell com>
- To: <evolution-patches gnome org>
- Subject: Re: [evolution-patches] [calendar] Reply ReplyAll options added for meetings
- Date: Mon, 02 Jan 2006 22:57:36 -0700
modified a few things in the code as suggested
and resending. please review.
[Reply Reply all to appear for personal and
exchange meetings only.]
regards.
>>> "Chakravarthi P" <pchakravarthi novell com> >>>
hi
For meetings items in calendar
a Reply and a ReplyAll option
are added on right click .
This is useful when a person want
something to be indicated or provide
some additional information reg meeting..
either to the organizer alone (Reply)
or to all the attendees (Reply All)
code changes made in e-calendar-view.c
and itip-utils.c
regards.
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.2907
diff -u -p -r1.2907 ChangeLog
--- ChangeLog 2 Jan 2006 14:12:39 -0000 1.2907
+++ ChangeLog 3 Jan 2006 05:45:54 -0000
@@ -1,3 +1,21 @@
+2006-01-03 P S Chakravarthi <pchakravarthi novell com>
+
+ Minor Feature: Reply and Reply all for calendar items of clients
+ that support such facility (personal, exchange).
+
+ * gui/e-cal-popup.[ch] : added a definition for
+ E_CAL_POPUP_SELECT_NOSAVESCHEDULES which separates out calendar items
+ of clients without the static capability of saving schedules.
+ * gui/itip-utils.c:
+ reply_to_calendar_comp (), html_new_lines_for (): added.
+ comp_to_list (): added another boolean parameter called reply_all which
+ indicates if reply to everyone is wanted or not.
+ added code for E_CAL_COMPONENT_METHOD_REPLY
+ itip_get_comp_attendee () : added code for E_CAL_COMPONENT_METHOD_REPLY
+ comp_content_type () : added code for E_CAL_COMPONENT_METHOD_REPLY
+ * gui/e-calendar-view.c on_reply (), on_reply_all (): added.
+ modified E_CAL_POPUP_* menu items to include Reply and Reply All
+
2006-01-02 Srinivasa Ragavan <sragavan novell com>
** Fix for bug #325414
Index: gui/e-cal-popup.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-popup.h,v
retrieving revision 1.11
diff -u -p -r1.11 e-cal-popup.h
--- gui/e-cal-popup.h 18 Oct 2005 09:58:28 -0000 1.11
+++ gui/e-cal-popup.h 3 Jan 2006 05:45:54 -0000
@@ -86,6 +86,7 @@ enum _e_cal_popup_target_select_t {
E_CAL_POPUP_SELECT_DELEGATABLE = 1<<13,
E_CAL_POPUP_SELECT_ACCEPTABLE = 1<<14,
E_CAL_POPUP_SELECT_NOTCOMPLETE = 1<<15,
+ E_CAL_POPUP_SELECT_NOSAVESCHEDULES = 1<<16,
};
/**
Index: gui/e-cal-popup.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-popup.c,v
retrieving revision 1.18
diff -u -p -r1.18 e-cal-popup.c
--- gui/e-cal-popup.c 18 Oct 2005 09:58:28 -0000 1.18
+++ gui/e-cal-popup.c 3 Jan 2006 05:45:54 -0000
@@ -548,7 +548,7 @@ e_cal_popup_target_new_select(ECalPopup
guint32 mask = ~0;
ECal *client;
gboolean read_only, user_org = FALSE;
-
+
/* FIXME: This is duplicated in e-cal-menu */
t->model = model;
@@ -588,6 +588,9 @@ e_cal_popup_target_new_select(ECalPopup
if (e_cal_util_component_has_attendee (comp_data->icalcomp))
mask &= ~E_CAL_POPUP_SELECT_MEETING;
+ if (!e_cal_get_save_schedules (comp_data->client))
+ mask &= ~E_CAL_POPUP_SELECT_NOSAVESCHEDULES;
+
if (e_cal_util_component_has_organizer (comp_data->icalcomp)) {
if (itip_organizer_is_user (comp, comp_data->client)) {
@@ -779,6 +782,7 @@ static const EPopupHookTargetMask ecalph
{ "delegate", E_CAL_POPUP_SELECT_DELEGATABLE },
{ "accept", E_CAL_POPUP_SELECT_ACCEPTABLE },
{ "not-complete", E_CAL_POPUP_SELECT_NOTCOMPLETE },
+ { "no-save-schedules", E_CAL_POPUP_SELECT_NOSAVESCHEDULES },
{ 0 }
};
Index: gui/itip-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/itip-utils.c,v
retrieving revision 1.107
diff -u -p -r1.107 itip-utils.c
--- gui/itip-utils.c 18 Oct 2005 10:30:51 -0000 1.107
+++ gui/itip-utils.c 3 Jan 2006 05:45:54 -0000
@@ -41,6 +41,7 @@
#include <libsoup/soup-uri.h>
#include "calendar-config.h"
#include "itip-utils.h"
+#include <time.h>
#define GNOME_EVOLUTION_COMPOSER_OAFIID "OAFIID:GNOME_Evolution_Mail_Composer:" BASE_VERSION
@@ -155,6 +156,54 @@ get_attendee (GSList *attendees, char *a
return NULL;
}
+
+static char *
+html_new_lines_for (char *string)
+{
+ char *html_string = (char *) malloc (sizeof (char)* (3500));
+ int length = strlen (string);
+ int index = 0;
+ char *index_ptr = string;
+ char *temp = string;
+
+ /*Find the first occurence*/
+ index_ptr = strstr ((const char *)temp, "\n");
+
+ /*Doesn't occur*/
+ if (index_ptr == NULL) {
+ strcpy (html_string, (const char *)string);
+ html_string[length] = '\0';
+ return html_string;
+ }
+
+ /*Split into chunks inserting <br> for \n */
+ do{
+ while (temp != index_ptr){
+ html_string[index++] = *temp;
+ temp++;
+ }
+ temp++;
+
+ html_string[index++] = '<';
+ html_string[index++] = 'b';
+ html_string[index++] = 'r';
+ html_string[index++] = '>';
+
+ index_ptr = strstr ((const char *)temp, "\n");
+
+ } while (index_ptr);
+
+ /*Don't leave out the last chunk*/
+ while (*temp != '\0'){
+ html_string[index++] = *temp;
+ temp++;
+ }
+
+ html_string[index] = '\0';
+
+ return html_string;
+}
+
char *
itip_get_comp_attendee (ECalComponent *comp, ECal *client)
{
@@ -342,7 +391,19 @@ comp_from (ECalComponentItipMethod metho
g_free (sender);
return str;
}
+
+ case E_CAL_COMPONENT_METHOD_REPLY:
+ sender = itip_get_comp_attendee (comp, NULL);
+ if (sender) {
+ str = CORBA_string_dup (sender);
+ g_free (sender);
+ return str;
+ }
+ if (!e_cal_component_has_attendees (comp))
+ return CORBA_string_dup ("");
+
case E_CAL_COMPONENT_METHOD_CANCEL:
+
case E_CAL_COMPONENT_METHOD_ADD:
e_cal_component_get_organizer (comp, &organizer);
@@ -351,9 +412,9 @@ comp_from (ECalComponentItipMethod metho
_("An organizer must be set."));
return NULL;
}
-
return CORBA_string_dup (itip_strip_mailto (organizer.value));
+
default:
if (!e_cal_component_has_attendees (comp))
return CORBA_string_dup ("");
@@ -368,7 +429,7 @@ comp_from (ECalComponentItipMethod metho
}
static GNOME_Evolution_Composer_RecipientList *
-comp_to_list (ECalComponentItipMethod method, ECalComponent *comp, GList *users)
+comp_to_list (ECalComponentItipMethod method, ECalComponent *comp, GList *users, gboolean reply_all)
{
GNOME_Evolution_Composer_RecipientList *to_list;
GNOME_Evolution_Composer_Recipient *recipient;
@@ -430,6 +491,68 @@ comp_to_list (ECalComponentItipMethod me
break;
case E_CAL_COMPONENT_METHOD_REPLY:
+
+ if (reply_all){
+ e_cal_component_get_attendee_list (comp, &attendees);
+ len = g_slist_length (attendees);
+
+ if (len <= 0) {
+ to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
+ to_list->_maximum = len;
+ to_list->_length = 0;
+ to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (len);
+ e_cal_component_free_attendee_list (attendees);
+ return to_list;
+ }
+
+ to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
+ to_list->_maximum = len;
+ to_list->_length = 0;
+ to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (len);
+
+ e_cal_component_get_organizer (comp, &organizer);
+ sender = itip_get_comp_attendee (comp, NULL);
+
+ for (l = attendees; l != NULL; l = l->next) {
+ ECalComponentAttendee *att = l->data;
+
+
+ recipient = &(to_list->_buffer[to_list->_length]);
+ if (att->cn)
+ recipient->name = CORBA_string_dup (att->cn);
+ else
+ recipient->name = CORBA_string_dup ("");
+ recipient->address = CORBA_string_dup (itip_strip_mailto (att->value));
+
+ to_list->_length++;
+ }
+
+ g_free (sender);
+ e_cal_component_free_attendee_list (attendees);
+
+ } else {
+
+ to_list = GNOME_Evolution_Composer_RecipientList__alloc ();
+ to_list->_maximum = 1;
+ to_list->_length = 0;
+ to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (1);
+
+ recipient = &(to_list->_buffer[to_list->_length]);
+
+ e_cal_component_get_organizer (comp, &organizer);
+ if (organizer.value) {
+ recipient->name = CORBA_string_dup ("");
+ recipient->address = CORBA_string_dup (itip_strip_mailto (organizer.value));
+ to_list->_length++;
+ return to_list;
+ } else {
+ recipient->address = CORBA_string_dup ("");
+ recipient->name = CORBA_string_dup ("");
+ }
+ }
+ break;
+
+
case E_CAL_COMPONENT_METHOD_ADD:
case E_CAL_COMPONENT_METHOD_REFRESH:
case E_CAL_COMPONENT_METHOD_COUNTER:
@@ -599,10 +722,14 @@ static CORBA_char *
comp_content_type (ECalComponent *comp, ECalComponentItipMethod method)
{
char tmp[256];
+
+ if (method == E_CAL_COMPONENT_METHOD_REPLY) {
+ sprintf (tmp, "text/plain");
+ } else
+ sprintf (tmp, "text/calendar; name=\"%s\"; charset=utf-8; METHOD=%s",
+ e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_FREEBUSY ?
+ "freebusy.ifb" : "calendar.ics", itip_methods[method]);
- sprintf (tmp, "text/calendar; name=\"%s\"; charset=utf-8; METHOD=%s",
- e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_FREEBUSY ?
- "freebusy.ifb" : "calendar.ics", itip_methods[method]);
return CORBA_string_dup (tmp);
}
@@ -1055,7 +1182,7 @@ itip_send_comp (ECalComponentItipMethod
goto cleanup;
/* Recipients */
- to_list = comp_to_list (method, comp, users);
+ to_list = comp_to_list (method, comp, users, TRUE);
if (method != E_CAL_COMPONENT_METHOD_PUBLISH) {
if (to_list == NULL || to_list->_length == 0) {
/* We sent them all via the server */
@@ -1198,6 +1325,221 @@ itip_send_comp (ECalComponentItipMethod
}
gboolean
+reply_to_calendar_comp (ECalComponentItipMethod method, ECalComponent *send_comp,
+ ECal *client, gboolean reply_all, icalcomponent *zones, GSList *attachments_list)
+{
+ GNOME_Evolution_Composer composer_server;
+ ECalComponent *comp = NULL;
+ icalcomponent *top_level = NULL;
+ GList *users = NULL;
+ GNOME_Evolution_Composer_RecipientList *to_list = NULL;
+ GNOME_Evolution_Composer_RecipientList *cc_list = NULL;
+ GNOME_Evolution_Composer_RecipientList *bcc_list = NULL;
+ CORBA_char *subject = NULL, *content_type = NULL;
+ CORBA_char *from = NULL;
+ char *ical_string;
+ CORBA_Environment ev;
+ gboolean retval = FALSE;
+
+ CORBA_exception_init (&ev);
+
+ /* Tidy up the comp */
+ comp = comp_compliant (method, send_comp, client, zones);
+ if (comp == NULL)
+ goto cleanup;
+
+ /* Recipients */
+ to_list = comp_to_list (method, comp, users, reply_all);
+
+ cc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
+ cc_list->_maximum = cc_list->_length = 0;
+ bcc_list = GNOME_Evolution_Composer_RecipientList__alloc ();
+ bcc_list->_maximum = bcc_list->_length = 0;
+
+ /* Subject information */
+ subject = comp_subject (method, comp);
+
+ /* From address */
+ {
+ GError *error = NULL;
+ char *address = NULL;
+
+ if (e_cal_get_cal_address (client, &address, &error))
+ from = CORBA_string_dup (address);
+ }
+ if (!from)
+ from = comp_from (method, comp);
+
+ /* Obtain an object reference for the Composer. */
+ composer_server = bonobo_activation_activate_from_id (GNOME_EVOLUTION_COMPOSER_OAFIID, 0, NULL, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Could not activate composer: %s", bonobo_exception_get_text (&ev));
+ CORBA_exception_free (&ev);
+ return FALSE;
+ }
+
+ /* Set recipients, subject */
+ GNOME_Evolution_Composer_setHeaders (composer_server, from, to_list, cc_list, bcc_list, subject, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Unable to set composer headers while sending iTip message: %s",
+ bonobo_exception_get_text (&ev));
+ goto cleanup;
+ }
+
+
+ /* Content type */
+ content_type = comp_content_type (comp, method);
+
+ top_level = comp_toplevel_with_zones (method, comp, client, zones);
+ ical_string = icalcomponent_as_ical_string (top_level);
+
+ if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_EVENT){
+
+ char *body = NULL;
+ char *orig_from = (char *) malloc (sizeof (char) * 100);
+ char *description = NULL;
+ char *subject = (char *) malloc (sizeof (char) * 100);
+ char *location = (char *) malloc (sizeof (char) * 100);
+ char *time = (char *) malloc (sizeof (char) * 64);
+ char *html_description = NULL;
+ GSList *text_list = NULL;
+ ECalComponentOrganizer organizer;
+ ECalComponentText text;
+ ECalComponentDateTime dtstart;
+ icaltimezone *start_zone = NULL;
+ time_t start;
+
+ e_cal_component_get_description_list (comp, &text_list);
+
+ if (text_list){
+ ECalComponentText text = *((ECalComponentText *)text_list->data);
+ if (text.value)
+ description = (char *)text.value;
+ else
+ description = "";
+ } else {
+ description = "";
+ }
+
+ e_cal_component_free_text_list (text_list);
+
+
+ e_cal_component_get_summary (comp, &text);
+ if (text.value)
+ subject = g_strdup (text.value);
+
+
+ e_cal_component_get_organizer (comp, &organizer);
+ if (organizer.value)
+ orig_from = g_strdup (itip_strip_mailto (organizer.value));
+ else
+ orig_from = "";
+
+
+ e_cal_component_get_location (comp, (const char **)&location);
+ if (!location)
+ location = "Unspecified";
+
+
+ e_cal_component_get_dtstart (comp, &dtstart);
+ if (dtstart.value) {
+ struct tm *tm_time;
+
+ start_zone = icaltimezone_get_builtin_timezone_from_tzid (dtstart.tzid);
+ if (!start_zone) {
+ if (!e_cal_get_timezone (client, dtstart.tzid, &start_zone, NULL))
+ g_warning ("Couldn't get timezone from server: %s", dtstart.tzid ? dtstart.tzid : "");
+ }
+
+ if (!start_zone || dtstart.value->is_date)
+ start_zone = calendar_config_get_icaltimezone ();
+
+ start = icaltime_as_timet_with_zone (*dtstart.value, start_zone);
+ strcpy (time, ctime (&start));
+ }
+
+
+ body = "<br><br><hr><br><b>______ Original Appointment ______ </b><br><br><table>";
+
+ if (orig_from && *orig_from){
+ char *part1 = (char *) malloc (sizeof (char) * 200);
+ sprintf (part1, "<tr><td><b>From</b></td><td>:</td><td>%s</td></tr>", orig_from);
+ body = g_strconcat (body, (gchar *)part1, NULL);
+ g_free (part1);
+ }
+
+ if (subject){
+ char *part2 = (char *) malloc (sizeof (char) * 100);
+ sprintf (part2, "<tr><td><b>Subject</b></td><td>:</td><td>%s</td></tr>", subject);
+ body = g_strconcat (body, (gchar *)part2, NULL);
+ g_free (part2);
+ }
+
+ {
+ char *part3 = (char *) malloc (sizeof (char) * 100);
+ sprintf (part3, "<tr><td><b>Location</b></td><td>:</td><td>%s</td></tr>", location);
+ body = g_strconcat (body, (gchar *)part3, NULL);
+ g_free (part3);
+ }
+
+ if (time){
+ char *part4 = (char *) malloc (sizeof (char) * 100);
+ sprintf (part4, "<tr><td><b>Time</b></td><td>:</td><td>%s</td></tr></table><br>", time);
+ body = g_strconcat (body, (gchar *)part4, NULL);
+ g_free (part4);
+ }
+
+ html_description = html_new_lines_for (description);
+ body = g_strconcat (body, (gchar *)html_description, NULL);
+
+ g_free (html_description);
+
+ GNOME_Evolution_Composer_setBody (composer_server, body, "text/html", &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Unable to set body text while sending iTip message");
+ goto cleanup;
+ }
+
+ }
+
+
+ GNOME_Evolution_Composer_show (composer_server, &ev);
+ if (BONOBO_EX (&ev))
+ g_warning ("Unable to show the composer while sending iTip message");
+ else
+ retval = TRUE;
+
+ cleanup:
+ CORBA_exception_free (&ev);
+
+ if (comp != NULL)
+ g_object_unref (comp);
+ if (top_level != NULL)
+ icalcomponent_free (top_level);
+
+ if (users) {
+ g_list_foreach (users, (GFunc) g_free, NULL);
+ g_list_free (users);
+ }
+
+ if (to_list != NULL)
+ CORBA_free (to_list);
+ if (cc_list != NULL)
+ CORBA_free (cc_list);
+ if (bcc_list != NULL)
+ CORBA_free (bcc_list);
+
+ if (from != NULL)
+ CORBA_free (from);
+ if (subject != NULL)
+ CORBA_free (subject);
+ if (content_type != NULL)
+ CORBA_free (content_type);
+
+ return retval;
+}
+
+gboolean
itip_publish_begin (ECalComponent *pub_comp, ECal *client,
gboolean cloned, ECalComponent **clone)
{
@@ -1404,3 +1746,4 @@ itip_publish_comp (ECal *client, gchar *
return TRUE;
}
+
Index: gui/e-calendar-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-calendar-view.c,v
retrieving revision 1.97
diff -u -p -r1.97 e-calendar-view.c
--- gui/e-calendar-view.c 18 Oct 2005 09:58:28 -0000 1.97
+++ gui/e-calendar-view.c 3 Jan 2006 05:45:54 -0000
@@ -1400,6 +1400,48 @@ on_forward (EPopup *ep, EPopupItem *pite
}
static void
+on_reply (EPopup *ep, EPopupItem *pitem, void *data)
+{
+ ECalendarView *cal_view = data;
+ GList *selected;
+ gboolean reply_all = FALSE;
+
+ selected = e_calendar_view_get_selected_events (cal_view);
+ if (selected) {
+ ECalComponent *comp;
+ ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
+
+ comp = e_cal_component_new ();
+ e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+ reply_to_calendar_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, event->comp_data->client, reply_all, NULL, NULL);
+
+ g_list_free (selected);
+ g_object_unref (comp);
+ }
+}
+
+static void
+on_reply_all (EPopup *ep, EPopupItem *pitem, void *data)
+{
+ ECalendarView *cal_view = data;
+ GList *selected;
+ gboolean reply_all = TRUE;
+
+ selected = e_calendar_view_get_selected_events (cal_view);
+ if (selected) {
+ ECalComponent *comp;
+ ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data;
+
+ comp = e_cal_component_new ();
+ e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+ reply_to_calendar_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, event->comp_data->client, reply_all, NULL, NULL);
+
+ g_list_free (selected);
+ g_object_unref (comp);
+ }
+}
+
+static void
on_publish (EPopup *ep, EPopupItem *pitem, void *data)
{
e_pub_publish (TRUE);
@@ -1558,11 +1600,13 @@ static EPopupItem ecv_child_items [] = {
{ E_POPUP_BAR, "40." },
- { E_POPUP_ITEM, "44.copyto", N_("Cop_y to Calendar..."), on_copy_to, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING },
- { E_POPUP_ITEM, "45.moveto", N_("Mo_ve to Calendar..."), on_move_to, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE },
- { E_POPUP_ITEM, "46.delegate", N_("_Delegate Meeting..."), on_delegate, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE | E_CAL_POPUP_SELECT_DELEGATABLE | E_CAL_POPUP_SELECT_MEETING},
- { E_POPUP_ITEM, "47.schedule", N_("_Schedule Meeting..."), on_meeting, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE | E_CAL_POPUP_SELECT_NOTMEETING },
- { E_POPUP_ITEM, "48.forward", N_("_Forward as iCalendar..."), on_forward, NULL, "stock_mail-forward", 0, E_CAL_POPUP_SELECT_NOTEDITING },
+ { E_POPUP_ITEM, "43.copyto", N_("Cop_y to Calendar..."), on_copy_to, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING },
+ { E_POPUP_ITEM, "44.moveto", N_("Mo_ve to Calendar..."), on_move_to, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE },
+ { E_POPUP_ITEM, "45.delegate", N_("_Delegate Meeting..."), on_delegate, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE | E_CAL_POPUP_SELECT_DELEGATABLE | E_CAL_POPUP_SELECT_MEETING},
+ { E_POPUP_ITEM, "46.schedule", N_("_Schedule Meeting..."), on_meeting, NULL, NULL, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_EDITABLE | E_CAL_POPUP_SELECT_NOTMEETING },
+ { E_POPUP_ITEM, "47.forward", N_("_Forward as iCalendar..."), on_forward, NULL, "stock_mail-forward", 0, E_CAL_POPUP_SELECT_NOTEDITING },
+ { E_POPUP_ITEM, "48.reply", N_("_Reply"), on_reply, NULL, "stock_mail-reply", E_CAL_POPUP_SELECT_MEETING | E_CAL_POPUP_SELECT_NOSAVESCHEDULES, E_CAL_POPUP_SELECT_NOTEDITING },
+ { E_POPUP_ITEM, "49.reply-all", N_("Reply to _All"), on_reply_all, NULL, "stock_mail-reply-to-all", E_CAL_POPUP_SELECT_MEETING | E_CAL_POPUP_SELECT_NOSAVESCHEDULES, E_CAL_POPUP_SELECT_NOTEDITING },
{ E_POPUP_BAR, "50." },
@@ -1833,6 +1877,7 @@ e_calendar_view_edit_appointment (ECalen
g_object_unref (comp);
}
+
open_event_with_flags (cal_view, client, icalcomp, flags);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]