aboutsummaryrefslogtreecommitdiffstats
path: root/calendar
diff options
context:
space:
mode:
Diffstat (limited to 'calendar')
-rw-r--r--calendar/ChangeLog26
-rw-r--r--calendar/gui/calendar-commands.c47
-rw-r--r--calendar/gui/e-day-view.c118
-rw-r--r--calendar/gui/e-day-view.h2
-rw-r--r--calendar/gui/e-week-view.c108
-rw-r--r--calendar/gui/e-week-view.h3
-rw-r--r--calendar/gui/gnome-cal.c25
-rw-r--r--calendar/gui/gnome-cal.h2
8 files changed, 257 insertions, 74 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 238dc435dc..e3cd63eb0a 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,29 @@
+2003-04-21 Rodrigo Moya <rodrigo@ximian.com>
+
+ Fixes #22444
+
+ * gui/calendar-commands.c: added new verbs for occurrence-related
+ menu items.
+ (delete_occurrence_cmd): added callback for "Delete this occurrence"
+ menu item. "Delete all occurrences" is just the same as "Delete".
+ (sensitize_calendar_commands): sensitive ocurrence-related menu items.
+
+ * gui/gnome-cal.[ch] (gnome_calendar_delete_selected_occurrence): new
+ function.
+ (gnome_calendar_get_current_view_widget): made this public.
+
+ * gui/e-week-view.[ch] (e_week_view_get_selected_event):
+ (e_week_view_delete_occurrence): new functions.
+ (e_week_view_delete_occurrence_internal): real implementation of the
+ 'Delete Occurrence' logic.
+ (e_week_view_on_delete_occurrence): call delete_instance_internal.
+
+ * gui/e-day-view.[ch] (e_day_view_get_selected_event):
+ (e_day_view_delete_occurrence): new functions.
+ (e_week_view_delete_occurrence_internal): real implementation of the
+ 'Delete Occurrence' logic.
+ (e_week_view_on_delete_occurrence): call delete_occurrence_internal.
+
2003-04-18 Rodrigo Moya <rodrigo@ximian.com>
* gui/alarm-notify/alarm-notify.glade: removed 'heading' and
diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c
index 23109d50a7..6dac8ec8a5 100644
--- a/calendar/gui/calendar-commands.c
+++ b/calendar/gui/calendar-commands.c
@@ -49,6 +49,8 @@
#include "shell/Evolution.h"
#include "calendar-commands.h"
#include "calendar-config.h"
+#include "e-day-view.h"
+#include "e-week-view.h"
#include "gnome-cal.h"
#include "goto.h"
#include "print.h"
@@ -293,6 +295,18 @@ delete_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
}
static void
+delete_occurrence_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
+{
+ GnomeCalendar *gcal;
+
+ gcal = GNOME_CALENDAR (data);
+
+ set_clock_cursor (gcal);
+ gnome_calendar_delete_selected_occurrence (gcal);
+ set_normal_cursor (gcal);
+}
+
+static void
publish_freebusy_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
{
GnomeCalendar *gcal;
@@ -505,7 +519,7 @@ sensitize_calendar_commands (GnomeCalendar *gcal, BonoboControl *control, gboole
{
BonoboUIComponent *uic;
int n_selected;
- gboolean read_only;
+ gboolean read_only, has_recurrences;
uic = bonobo_control_get_ui_component (control);
g_assert (uic != NULL);
@@ -525,6 +539,33 @@ sensitize_calendar_commands (GnomeCalendar *gcal, BonoboControl *control, gboole
bonobo_ui_component_set_prop (uic, "/commands/Delete", "sensitive",
n_selected == 0 || read_only ? "0" : "1",
NULL);
+
+ /* occurrence-related menu items */
+ has_recurrences = FALSE;
+ if (n_selected > 0 && !read_only) {
+ CalComponent *comp;
+ GtkWidget *view;
+
+ view = gnome_calendar_get_current_view_widget (gcal);
+ if (E_IS_DAY_VIEW (view))
+ comp = e_day_view_get_selected_event (E_DAY_VIEW (view));
+ else if (E_IS_WEEK_VIEW (view))
+ comp = e_week_view_get_selected_event (E_WEEK_VIEW (view));
+ else
+ comp = NULL;
+
+ if (comp) {
+ if (cal_component_has_recurrences (comp))
+ has_recurrences = TRUE;
+ }
+ }
+
+ bonobo_ui_component_set_prop (uic, "/commands/DeleteOccurrence", "sensitive",
+ has_recurrences ? "1" : "0",
+ NULL);
+ bonobo_ui_component_set_prop (uic, "/commands/DeleteAllOccurrences", "sensitive",
+ has_recurrences ? "1" : "0",
+ NULL);
}
/* Sensitizes the UI Component menu/toolbar tasks commands based on the number
@@ -659,6 +700,8 @@ static BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("Copy", copy_cmd),
BONOBO_UI_VERB ("Paste", paste_cmd),
BONOBO_UI_VERB ("Delete", delete_cmd),
+ BONOBO_UI_VERB ("DeleteOccurrence", delete_occurrence_cmd),
+ BONOBO_UI_VERB ("DeleteAllOccurrences", delete_cmd),
BONOBO_UI_VERB ("CalendarPrev", previous_clicked),
BONOBO_UI_VERB ("CalendarToday", today_clicked),
@@ -681,6 +724,8 @@ static EPixmap pixmaps [] =
E_PIXMAP ("/menu/EditPlaceholder/Edit/Copy", "16_copy.png"),
E_PIXMAP ("/menu/EditPlaceholder/Edit/Paste", "16_paste.png"),
E_PIXMAP ("/menu/EditPlaceholder/Edit/Delete", "evolution-trash-mini.png"),
+ E_PIXMAP ("/menu/EditPlaceholder/Edit/DeleteOccurrence", "evolution-trash-mini.png"),
+ E_PIXMAP ("/menu/EditPlaceholder/Edit/DeleteAllOccurrences", "evolution-trash-mini.png"),
E_PIXMAP ("/menu/File/Print/Print", "print.xpm"),
E_PIXMAP ("/menu/File/Print/PrintPreview", "print-preview.xpm"),
E_PIXMAP ("/menu/View/ViewBegin/Goto", "goto-16.png"),
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 90e8f28069..27b512a63a 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -4077,40 +4077,6 @@ e_day_view_on_settings (GtkWidget *widget, gpointer data)
}
static void
-e_day_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
-{
- EDayView *day_view;
- EDayViewEvent *event;
- CalComponent *comp;
-
- day_view = E_DAY_VIEW (data);
-
- event = e_day_view_get_popup_menu_event (day_view);
- if (event == NULL)
- return;
-
- if (cal_component_is_instance (event->comp)) {
- const char *uid;
-
- cal_component_get_uid (event->comp, &uid);
- if (cal_client_remove_object_with_mod (day_view->client, uid, CALOBJ_MOD_THIS) != CAL_CLIENT_RESULT_SUCCESS)
- g_message ("e_day_view_on_delete_occurrence(): Could not update the object!");
-
- return;
- }
-
- /* We must duplicate the CalComponent, or we won't know it has changed
- when we get the "update_event" callback. */
- comp = cal_component_clone (event->comp);
- cal_comp_util_add_exdate (comp, event->start, day_view->zone);
-
- if (cal_client_update_object (day_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS)
- g_message ("e_day_view_on_delete_occurrence(): Could not update the object!");
-
- g_object_unref (comp);
-}
-
-static void
e_day_view_delete_event_internal (EDayView *day_view, EDayViewEvent *event)
{
CalComponentVType vtype;
@@ -4182,6 +4148,69 @@ e_day_view_delete_event (EDayView *day_view)
e_day_view_delete_event_internal (day_view, event);
}
+static void
+e_day_view_delete_occurrence_internal (EDayView *day_view, EDayViewEvent *event)
+{
+ CalComponent *comp;
+
+ if (cal_component_is_instance (event->comp)) {
+ const char *uid;
+
+ cal_component_get_uid (event->comp, &uid);
+ if (cal_client_remove_object_with_mod (day_view->client, uid, CALOBJ_MOD_THIS) != CAL_CLIENT_RESULT_SUCCESS)
+ g_message ("e_day_view_on_delete_occurrence(): Could not update the object!");
+
+ return;
+ }
+
+ /* We must duplicate the CalComponent, or we won't know it has changed
+ when we get the "update_event" callback. */
+ comp = cal_component_clone (event->comp);
+ cal_comp_util_add_exdate (comp, event->start, day_view->zone);
+
+ if (cal_client_update_object (day_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS)
+ g_message ("e_day_view_on_delete_occurrence(): Could not update the object!");
+
+ g_object_unref (comp);
+}
+
+static void
+e_day_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
+{
+ EDayView *day_view;
+ EDayViewEvent *event;
+ CalComponent *comp;
+
+ day_view = E_DAY_VIEW (data);
+
+ event = e_day_view_get_popup_menu_event (day_view);
+ if (event == NULL)
+ return;
+
+ e_day_view_delete_occurrence_internal (day_view, event);
+}
+
+void
+e_day_view_delete_occurrence (EDayView *day_view)
+{
+ EDayViewEvent *event;
+
+ g_return_if_fail (E_IS_DAY_VIEW (day_view));
+
+ if (day_view->editing_event_day == -1)
+ return;
+
+ if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT)
+ event = &g_array_index (day_view->long_events,
+ EDayViewEvent,
+ day_view->editing_event_num);
+ else
+ event = &g_array_index (day_view->events[day_view->editing_event_day],
+ EDayViewEvent,
+ day_view->editing_event_num);
+
+ e_day_view_delete_occurrence_internal (day_view, event);
+}
static void
e_day_view_on_cut (GtkWidget *widget, gpointer data)
@@ -7756,6 +7785,27 @@ e_day_view_get_num_events_selected (EDayView *day_view)
return (day_view->editing_event_day != -1) ? 1 : 0;
}
+/* Returns the currently-selected event, or NULL if none */
+CalComponent *
+e_day_view_get_selected_event (EDayView *day_view)
+{
+ EDayViewEvent *event;
+
+ g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL);
+ g_return_val_if_fail (day_view->editing_event_day != -1, NULL);
+
+ if (day_view->editing_event_day == E_DAY_VIEW_LONG_EVENT)
+ event = &g_array_index (day_view->long_events,
+ EDayViewEvent,
+ day_view->editing_event_num);
+ else
+ event = &g_array_index (day_view->events[day_view->editing_event_day],
+ EDayViewEvent,
+ day_view->editing_event_num);
+
+ return event ? event->comp : NULL;
+}
+
/* Displays messages on the status bar. */
void
e_day_view_set_status_message (EDayView *day_view, const char *message)
diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h
index 8743751be1..c8b719aca1 100644
--- a/calendar/gui/e-day-view.h
+++ b/calendar/gui/e-day-view.h
@@ -609,11 +609,13 @@ void e_day_view_copy_clipboard (EDayView *day_view);
void e_day_view_paste_clipboard (EDayView *day_view);
void e_day_view_delete_event (EDayView *day_view);
+void e_day_view_delete_occurrence (EDayView *day_view);
/* Returns the number of selected events (0 or 1 at present). */
gint e_day_view_get_num_events_selected (EDayView *day_view);
+CalComponent *e_day_view_get_selected_event (EDayView *day_view);
/*
* Internal functions called by the associated canvas items.
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index 88de72c287..649da416f9 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -3898,44 +3898,6 @@ e_week_view_on_settings (GtkWidget *widget, gpointer data)
}
static void
-e_week_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- CalComponent *comp;
-
- week_view = E_WEEK_VIEW (data);
-
- if (week_view->popup_event_num == -1)
- return;
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- week_view->popup_event_num);
-
- if (cal_component_is_instance (event->comp)) {
- const char *uid;
-
- cal_component_get_uid (event->comp, &uid);
- if (cal_client_remove_object_with_mod (week_view->client, uid, CALOBJ_MOD_THIS) != CAL_CLIENT_RESULT_SUCCESS)
- g_message ("e_week_view_on_delete_occurrence(): Could not update the object!");
-
- return;
- }
-
- /* We must duplicate the CalComponent, or we won't know it has changed
- when we get the "update_event" callback. */
-
- comp = cal_component_clone (event->comp);
- cal_comp_util_add_exdate (comp, event->start, week_view->zone);
-
- if (cal_client_update_object (week_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS)
- g_message ("e_week_view_on_delete_occurrence(): Could not update the object!");
-
- g_object_unref (comp);
-}
-
-
-static void
e_week_view_delete_event_internal (EWeekView *week_view, gint event_num)
{
CalComponentVType vtype;
@@ -3993,6 +3955,61 @@ e_week_view_delete_event (EWeekView *week_view)
static void
+e_week_view_delete_occurrence_internal (EWeekView *week_view, gint event_num)
+{
+ EWeekViewEvent *event;
+ CalComponent *comp;
+
+ event = &g_array_index (week_view->events, EWeekViewEvent,
+ event_num);
+
+ if (cal_component_is_instance (event->comp)) {
+ const char *uid;
+
+ cal_component_get_uid (event->comp, &uid);
+ if (cal_client_remove_object_with_mod (week_view->client, uid, CALOBJ_MOD_THIS) != CAL_CLIENT_RESULT_SUCCESS)
+ g_message ("e_week_view_on_delete_occurrence(): Could not update the object!");
+
+ return;
+ }
+
+ /* We must duplicate the CalComponent, or we won't know it has changed
+ when we get the "update_event" callback. */
+
+ comp = cal_component_clone (event->comp);
+ cal_comp_util_add_exdate (comp, event->start, week_view->zone);
+
+ if (cal_client_update_object (week_view->client, comp) != CAL_CLIENT_RESULT_SUCCESS)
+ g_message ("e_week_view_on_delete_occurrence(): Could not update the object!");
+
+ g_object_unref (comp);
+}
+
+static void
+e_week_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
+{
+ EWeekView *week_view;
+
+ week_view = E_WEEK_VIEW (data);
+
+ if (week_view->popup_event_num == -1)
+ return;
+
+ e_week_view_delete_occurrence_internal (week_view, week_view->popup_event_num);
+}
+
+void
+e_week_view_delete_occurrence (EWeekView *week_view)
+{
+ g_return_if_fail (E_IS_WEEK_VIEW (week_view));
+
+ if (week_view->editing_event_num == -1)
+ return;
+
+ e_week_view_delete_occurrence_internal (week_view, week_view->editing_event_num);
+}
+
+static void
e_week_view_on_cut (GtkWidget *widget, gpointer data)
{
EWeekView *week_view;
@@ -4430,6 +4447,21 @@ e_week_view_get_num_events_selected (EWeekView *week_view)
return (week_view->editing_event_num != -1) ? 1 : 0;
}
+/* Returns the currently-selected event, or NULL if none */
+CalComponent *
+e_week_view_get_selected_event (EWeekView *week_view)
+{
+ EWeekViewEvent *event;
+
+ g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL);
+ g_return_val_if_fail (week_view->editing_event_num != -1, NULL);
+
+ event = &g_array_index (week_view->events, EWeekViewEvent,
+ week_view->editing_event_num);
+
+ return event ? event->comp : NULL;
+}
+
/* Displays a message on the activity client. */
void
e_week_view_set_status_message (EWeekView *week_view, const char *message)
diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h
index 8723d14cf9..fc481bdc4a 100644
--- a/calendar/gui/e-week-view.h
+++ b/calendar/gui/e-week-view.h
@@ -465,10 +465,13 @@ void e_week_view_copy_clipboard (EWeekView *week_view);
void e_week_view_paste_clipboard (EWeekView *week_view);
void e_week_view_delete_event (EWeekView *week_view);
+void e_week_view_delete_occurrence (EWeekView *week_view);
/* Returns the number of selected events (0 or 1 at present). */
gint e_week_view_get_num_events_selected (EWeekView *week_view);
+CalComponent *e_week_view_get_selected_event (EWeekView *week_view);
+
/*
* Internal functions called by the associated canvas items.
*/
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index be5de68b80..b56f4a1824 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -347,7 +347,7 @@ dn_query_eval_error_cb (CalQuery *query, const char *error_str, gpointer data)
}
/* Returns the current view widget, a EDayView or EWeekView. */
-static GtkWidget*
+GtkWidget*
gnome_calendar_get_current_view_widget (GnomeCalendar *gcal)
{
GnomeCalendarPrivate *priv;
@@ -2853,6 +2853,29 @@ gnome_calendar_delete_selection (GnomeCalendar *gcal)
g_assert_not_reached ();
}
+void
+gnome_calendar_delete_selected_occurrence (GnomeCalendar *gcal)
+{
+ GnomeCalendarPrivate *priv;
+ FocusLocation location;
+ GtkWidget *view;
+
+ g_return_if_fail (GNOME_IS_CALENDAR (gcal));
+
+ priv = gcal->priv;
+
+ location = get_focus_location (gcal);
+
+ if (location == FOCUS_CALENDAR) {
+
+ view = gnome_calendar_get_current_view_widget (gcal);
+
+ if (E_IS_DAY_VIEW (view))
+ e_day_view_delete_occurrence (E_DAY_VIEW (view));
+ else
+ e_week_view_delete_occurrence (E_WEEK_VIEW (view));
+ }
+}
ECalendarTable*
gnome_calendar_get_task_pad (GnomeCalendar *gcal)
diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h
index 2c71eb898c..52c2cf5176 100644
--- a/calendar/gui/gnome-cal.h
+++ b/calendar/gui/gnome-cal.h
@@ -108,6 +108,7 @@ GnomeCalendarViewType gnome_calendar_get_view (GnomeCalendar *gcal);
void gnome_calendar_set_view (GnomeCalendar *gcal, GnomeCalendarViewType view_type,
gboolean range_selected, gboolean grab_focus);
+GtkWidget *gnome_calendar_get_current_view_widget (GnomeCalendar *gcal);
void gnome_calendar_setup_view_menus (GnomeCalendar *gcal, BonoboUIComponent *uic);
void gnome_calendar_discard_view_menus (GnomeCalendar *gcal);
@@ -167,6 +168,7 @@ void gnome_calendar_copy_clipboard (GnomeCalendar *gcal);
void gnome_calendar_paste_clipboard (GnomeCalendar *gcal);
void gnome_calendar_delete_selection (GnomeCalendar *gcal);
+void gnome_calendar_delete_selected_occurrence (GnomeCalendar *gcal);