[evolution-patches] huge patch for popup menu merging in EDayView/EWeekView



Hi

I just committed this patch to HEAD, which moves all the duplicated code
for managing the popup menu in the views to a common place (ECalView).
This reduces the amount of code a lot :-)

cheers
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.1830
diff -u -p -r1.1830 ChangeLog
--- ChangeLog	23 Jul 2003 12:14:56 -0000	1.1830
+++ ChangeLog	23 Jul 2003 15:44:21 -0000
@@ -1,5 +1,40 @@
 2003-07-23  Rodrigo Moya <rodrigo ximian com>
 
+	* gui/e-cal-view.[ch]: moved the duplicated popup menu code here.
+	(e_cal_view_create_popup_menu): new function to create the popup
+	menu for all views.
+	(on_new_appointment, on_new_event, on_new_meeting, on_new_task,
+	 on_goto_today, on_goto_date, on_edit_appointment, on_print,
+	 on_save_as, on_print_event, on_meeting, on_forward, on_publish,
+	 on_settings, on_delete_appointment, on_cut, on_copy, on_paste,
+	 on_unrecur_appointment): callbacks for the popup menu items.
+
+	* gui/e-week-view.c (e_week_view_on_new_appointment,
+	  e_week_view_new_appointment, e_week_view_on_new_event,
+	  e_week_view_on_new_meeting, e_week_view_on_new_task,
+	  e_week_view_on_goto_today, e_week_view_on_goto_date,
+	  e_week_view_on_edit_appointment, e_week_view_on_print,
+	  e_week_view_on_save_as, e_week_view_on_print_event,
+	  e_week_view_on_meeting, e_week_view_on_forward,
+	  e_week_view_on_publish, e_week_view_on_settings,
+	  e_week_view_on_delete_appointment,
+	  e_week_view_delete_event_internal, e_week_view_on_cut,
+	  e_week_view_on_copy, e_week_view_on_paste):
+	* gui/e-day-view.c (e_day_view_on_new_appointment,
+	  e_day_view_on_new_event, e_day_view_on_new_meeting,
+	  e_day_view_on_new_task, e_day_view_on_goto_today,
+	  e_day_view_on_goto_date, e_day_view_on_edit_appointment,
+	  e_day_view_on_print, e_day_view_on_save_as,
+	  e_day_view_on_print_event, e_day_view_on_meeting,
+	  e_day_view_on_forward, e_day_view_on_publish,
+	  e_day_view_on_settings, e_day_view_on_delete_appointment,
+	  e_day_view_delete_event_internal, e_day_view_on_cut,
+	  e_day_view_on_copy, e_day_view_on_paste): removed duplicated code.
+
+	* gui/gnome-cal.[ch] (gnome_calendar_unrecur_selection): new function.
+
+2003-07-23  Rodrigo Moya <rodrigo ximian com>
+
 	* gui/e-day-view.h:
 	* gui/e-week-view.h: removed unneeded prototypes.
 
Index: gui/e-day-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view.c,v
retrieving revision 1.208
diff -u -p -r1.208 e-day-view.c
--- gui/e-day-view.c	23 Jul 2003 12:14:57 -0000	1.208
+++ gui/e-day-view.c	23 Jul 2003 15:44:24 -0000
@@ -357,43 +357,6 @@ static void e_day_view_start_auto_scroll
 					  gboolean scroll_up);
 static gboolean e_day_view_auto_scroll_handler (gpointer data);
 
-static void e_day_view_on_new_appointment (GtkWidget *widget,
-					   gpointer data);
-static void e_day_view_on_new_event       (GtkWidget *widget,
-					   gpointer data);
-static void e_day_view_on_new_meeting (GtkWidget *widget,
-				       gpointer data);
-static void e_day_view_on_new_task (GtkWidget *widget,
-				    gpointer data);
-static void e_day_view_on_goto_today      (GtkWidget *widget,
-					   gpointer data);
-static void e_day_view_on_goto_date       (GtkWidget *widget,
-					   gpointer data);
-static void e_day_view_on_edit_appointment (GtkWidget *widget,
-					    gpointer data);
-static void e_day_view_on_save_as (GtkWidget *widget, 
-				   gpointer data);
-static void e_day_view_on_print (GtkWidget *widget,
-				 gpointer data);
-static void e_day_view_on_print_event (GtkWidget *widget, 
-				       gpointer data);
-static void e_day_view_on_meeting (GtkWidget *widget,
-				   gpointer data);
-static void e_day_view_on_forward (GtkWidget *widget,
-				   gpointer data);
-static void e_day_view_on_publish (GtkWidget *widget,
-				   gpointer data);
-static void e_day_view_on_settings (GtkWidget *widget,
-				    gpointer data);
-static void e_day_view_on_delete_occurrence (GtkWidget *widget,
-					     gpointer data);
-static void e_day_view_on_delete_appointment (GtkWidget *widget,
-					      gpointer data);
-static void e_day_view_on_cut (GtkWidget *widget, gpointer data);
-static void e_day_view_on_copy (GtkWidget *widget, gpointer data);
-static void e_day_view_on_paste (GtkWidget *widget, gpointer data);
-static void e_day_view_on_unrecur_appointment (GtkWidget *widget,
-					       gpointer data);
 static EDayViewEvent* e_day_view_get_popup_menu_event (EDayView *day_view);
 
 static gboolean e_day_view_on_top_canvas_drag_motion (GtkWidget      *widget,
@@ -3378,130 +3341,6 @@ e_day_view_on_event_double_click (EDayVi
 	}
 }
 
-enum {
-	/*
-	 * This is used to "flag" events that can not be edited
-	 */
-	MASK_EDITABLE = 1,
-
-	/*
-	 * To disable recurring actions to be displayed
-	 */
-	MASK_RECURRING = 2,
-
-	/*
-	 * To disable actions for non-recurring items to be displayed
-	 */
-	MASK_SINGLE   = 4,
-
-	/*
-	 * This is used to when an event is currently being edited
-	 * in another window and we want to disable the event
-	 * from being edited twice
-	 */
-	MASK_EDITING  = 8,
-
-	/*
-	 * This is used to when an event is already a meeting and
-	 * we want to disable the schedule meeting command
-	 */
-	MASK_MEETING  = 16,
-
-	/*
-	 * To disable cut and copy for meetings the user is not the
-	 * organizer of
-	 */
-	MASK_MEETING_ORGANIZER = 32,
-
-	/*
-	 * To disable things not valid for instances
-	 */
-	MASK_INSTANCE = 64
-};
-
-static EPopupMenu main_items [] = {
-	E_POPUP_ITEM (N_("New _Appointment"),
-	  GTK_SIGNAL_FUNC (e_day_view_on_new_appointment), MASK_EDITABLE),
-	E_POPUP_ITEM (N_("New All Day _Event"),
-	  GTK_SIGNAL_FUNC (e_day_view_on_new_event), MASK_EDITABLE),
-	E_POPUP_ITEM (N_("New Meeting"),
-	  GTK_SIGNAL_FUNC (e_day_view_on_new_meeting), MASK_EDITABLE),
-	E_POPUP_ITEM (N_("New Task"),
-	  GTK_SIGNAL_FUNC (e_day_view_on_new_task), MASK_EDITABLE),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("Print..."),
-	  GTK_SIGNAL_FUNC (e_day_view_on_print), 0),
-	
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Paste"),
-	  GTK_SIGNAL_FUNC (e_day_view_on_paste), MASK_EDITABLE),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_SUBMENU (N_("Current View"), NULL, 0),
-
-	E_POPUP_ITEM (N_("Go to _Today"),
-	  GTK_SIGNAL_FUNC (e_day_view_on_goto_today), 0),
-	E_POPUP_ITEM (N_("_Go to Date..."),
-	  GTK_SIGNAL_FUNC (e_day_view_on_goto_date), 0),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Publish Free/Busy Information"),
-	  GTK_SIGNAL_FUNC (e_day_view_on_publish), 0),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Settings..."),
-	  GTK_SIGNAL_FUNC (e_day_view_on_settings), 0),
-
-	E_POPUP_TERMINATOR
-};
-
-static EPopupMenu child_items [] = {
-
-	E_POPUP_ITEM (N_("_Open"), GTK_SIGNAL_FUNC (e_day_view_on_edit_appointment), MASK_EDITING),
-	E_POPUP_ITEM (N_("_Save As..."), GTK_SIGNAL_FUNC (e_day_view_on_save_as), MASK_EDITING),
-	E_POPUP_ITEM (N_("_Print..."), GTK_SIGNAL_FUNC (e_day_view_on_print_event), MASK_EDITING),
-
-	/* Only show this separator if one of the above is shown. */
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("C_ut"), GTK_SIGNAL_FUNC (e_day_view_on_cut), MASK_EDITABLE | MASK_EDITING | MASK_MEETING_ORGANIZER),
-	E_POPUP_ITEM (N_("_Copy"), GTK_SIGNAL_FUNC (e_day_view_on_copy), MASK_EDITING | MASK_MEETING_ORGANIZER),
-	E_POPUP_ITEM (N_("_Paste"), GTK_SIGNAL_FUNC (e_day_view_on_paste), MASK_EDITABLE),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Schedule Meeting..."), GTK_SIGNAL_FUNC (e_day_view_on_meeting), MASK_EDITABLE | MASK_EDITING | MASK_MEETING),
-	E_POPUP_ITEM (N_("_Forward as iCalendar..."), GTK_SIGNAL_FUNC (e_day_view_on_forward), MASK_EDITING),
-	
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Delete"), GTK_SIGNAL_FUNC (e_day_view_on_delete_appointment), MASK_EDITABLE | MASK_SINGLE | MASK_EDITING),
-	E_POPUP_ITEM (N_("Make this Occurrence _Movable"), GTK_SIGNAL_FUNC (e_day_view_on_unrecur_appointment), MASK_EDITABLE | MASK_RECURRING | MASK_EDITING | MASK_INSTANCE),
-	E_POPUP_ITEM (N_("Delete this _Occurrence"), GTK_SIGNAL_FUNC (e_day_view_on_delete_occurrence), MASK_EDITABLE | MASK_RECURRING | MASK_EDITING),
-	E_POPUP_ITEM (N_("Delete _All Occurrences"), GTK_SIGNAL_FUNC (e_day_view_on_delete_appointment), MASK_EDITABLE | MASK_RECURRING | MASK_EDITING),
-
-	E_POPUP_TERMINATOR
-};
-
-static void
-free_view_popup (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-
-	if (day_view->view_menu == NULL)
-		return;
-	
-	gnome_calendar_discard_view_popup (e_cal_view_get_calendar (E_CAL_VIEW (day_view)),
-								    day_view->view_menu);
-	day_view->view_menu = NULL;
-}
-
 static void
 e_day_view_show_popup_menu (EDayView *day_view,
 			    GdkEvent *gdk_event,
@@ -3509,68 +3348,12 @@ e_day_view_show_popup_menu (EDayView *da
 			    gint event_num)
 {
 	EDayViewEvent *event;
-	int have_selection;
-	gboolean being_edited;
-	EPopupMenu *context_menu;
 	GtkMenu *popup;
-	int hide_mask = 0;
-	int disable_mask = 0;
-
-	/*
-	 * FIXME:
-	 * This used to be set only if the event wasn't being edited
-	 * in the event editor, but we can't check that at present.
-	 * We could possibly set up another method of checking it.
-	 */
-	
-	being_edited = FALSE;
-	
-	have_selection = GTK_WIDGET_HAS_FOCUS (day_view)
-		&& day_view->selection_start_day != -1;
-
-	if (event_num == -1) {
-		day_view->view_menu = gnome_calendar_setup_view_popup (
-			e_cal_view_get_calendar (E_CAL_VIEW (day_view)));
-		main_items[9].submenu = day_view->view_menu;
-		context_menu = main_items;
-	} else {
-		context_menu = child_items;
-		
-		if (day == E_DAY_VIEW_LONG_EVENT)
-			event = &g_array_index (day_view->long_events,
-						EDayViewEvent, event_num);
-		else
-			event = &g_array_index (day_view->events[day],
-						EDayViewEvent, event_num);
-
-		if (cal_component_has_recurrences (event->comp)) 
-			hide_mask |= MASK_SINGLE;
-		else
-			hide_mask |= MASK_RECURRING;
-
-		if (cal_component_is_instance (event->comp))
-			hide_mask |= MASK_INSTANCE;
-		
-		if (cal_component_has_organizer (event->comp)) {
-			disable_mask |= MASK_MEETING;
-
-			if (!itip_organizer_is_user (event->comp,
-						     e_cal_view_get_cal_client (E_CAL_VIEW (day_view))))
-				disable_mask |= MASK_MEETING_ORGANIZER;
-		}
-	}
-
-	if (cal_client_is_read_only (e_cal_view_get_cal_client (E_CAL_VIEW (day_view))))
-		disable_mask |= MASK_EDITABLE;
-
-	if (being_edited)
-		disable_mask |= MASK_EDITING;
 	
 	day_view->popup_event_day = day;
 	day_view->popup_event_num = event_num;
 	
-	popup = e_popup_menu_create (context_menu, disable_mask, hide_mask, day_view);
-	g_signal_connect (popup, "selection-done", G_CALLBACK (free_view_popup), day_view);
+	popup = e_cal_view_create_popup_menu (E_CAL_VIEW (day_view));
 	e_popup_menu (popup, gdk_event);
 }
 
@@ -3676,331 +3459,6 @@ e_day_view_on_event_right_click (EDayVie
 				    day, event_num);
 }
 
-static void
-e_day_view_on_new_appointment (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-	time_t dtstart, dtend;
-	struct icaltimetype itt;
-	
-	/* Edit a new event. If only one day is selected in the top canvas,
-	   we set the time to the first 1/2-hour of the working day. */
-	if (day_view->selection_in_top_canvas
-	    && day_view->selection_start_day != -1
-	    && day_view->selection_start_day == day_view->selection_end_day) {
-		dtstart = day_view->day_starts[day_view->selection_start_day];
-		itt = icaltime_from_timet_with_zone (dtstart, FALSE,
-						     day_view->zone);
-		itt.hour = calendar_config_get_day_start_hour ();
-		itt.minute = calendar_config_get_day_start_minute ();
-		dtstart = icaltime_as_timet_with_zone (itt, day_view->zone);
-
-		icaltime_adjust (&itt, 0, 0, 30, 0);
-		dtend = icaltime_as_timet_with_zone (itt, day_view->zone);
-	} else {
-		e_day_view_get_selected_time_range (day_view, &dtstart,
-						    &dtend);
-	}
-
-	gnome_calendar_new_appointment_for (
-		e_cal_view_get_calendar (E_CAL_VIEW (day_view)), dtstart, dtend, FALSE, FALSE);
-}
-
-static void
-e_day_view_on_new_event (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-	time_t dtstart, dtend;
-	
-	e_day_view_get_selected_time_range (day_view, &dtstart, &dtend);
-	gnome_calendar_new_appointment_for (
-		e_cal_view_get_calendar (E_CAL_VIEW (day_view)), dtstart, dtend, TRUE, FALSE);
-}
-
-static void
-e_day_view_on_new_meeting (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-	time_t dtstart, dtend;
-	struct icaltimetype itt;
-	
-	/* Edit a new event. If only one day is selected in the top canvas,
-	   we set the time to the first 1/2-hour of the working day. */
-	if (day_view->selection_in_top_canvas
-	    && day_view->selection_start_day != -1
-	    && day_view->selection_start_day == day_view->selection_end_day) {
-		dtstart = day_view->day_starts[day_view->selection_start_day];
-		itt = icaltime_from_timet_with_zone (dtstart, FALSE,
-						     day_view->zone);
-		itt.hour = calendar_config_get_day_start_hour ();
-		itt.minute = calendar_config_get_day_start_minute ();
-		dtstart = icaltime_as_timet_with_zone (itt, day_view->zone);
-
-		icaltime_adjust (&itt, 0, 0, 30, 0);
-		dtend = icaltime_as_timet_with_zone (itt, day_view->zone);
-	} else {
-		e_day_view_get_selected_time_range (day_view, &dtstart,
-						    &dtend);
-	}
-
-	gnome_calendar_new_appointment_for (
-		e_cal_view_get_calendar (E_CAL_VIEW (day_view)), dtstart, dtend, FALSE, TRUE);
-}
-
-static void
-e_day_view_on_new_task (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-
-	gnome_calendar_new_task (e_cal_view_get_calendar (E_CAL_VIEW (day_view)));
-}
-
-static void
-e_day_view_on_goto_date (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-
-	goto_dialog (e_cal_view_get_calendar (E_CAL_VIEW (day_view)));
-}
-
-static void
-e_day_view_on_goto_today (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-
-	calendar_goto_today (e_cal_view_get_calendar (E_CAL_VIEW (day_view)));
-}
-
-static void
-e_day_view_on_edit_appointment (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	EDayViewEvent *event;
-	GnomeCalendar *calendar;
-
-	day_view = E_DAY_VIEW (data);
-
-	event = e_day_view_get_popup_menu_event (day_view);
-	if (event == NULL)
-		return;
-
-	calendar = e_cal_view_get_calendar (E_CAL_VIEW (day_view));
-	if (calendar)
-		gnome_calendar_edit_object (calendar, event->comp, FALSE);
-	else
-		g_warning ("Calendar not set");
-}
-
-static void
-e_day_view_on_save_as (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	EDayViewEvent *event;
-	char *filename;
-	char *ical_string;
-	FILE *file;
-
-	day_view = E_DAY_VIEW (data);
-
-	event = e_day_view_get_popup_menu_event (day_view);
-	if (event == NULL)
-		return;
-	
-	filename = e_file_dialog_save (_("Save as..."));
-	if (filename == NULL)
-		return;
-	
-	ical_string = cal_client_get_component_as_string (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)),
-							  event->comp);
-	if (ical_string == NULL) {
-		g_warning ("Couldn't convert item to a string");
-		return;
-	}
-	
-	file = fopen (filename, "w");
-	if (file == NULL) {
-		g_warning ("Couldn't save item");
-		return;
-	}
-	
-	fprintf (file, ical_string);
-	g_free (ical_string);
-	fclose (file);
-}
-
-static void
-e_day_view_on_print (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	time_t start;
-	GnomeCalendarViewType view_type;
-	PrintView print_view;
-
-	day_view = E_DAY_VIEW (data);
-
-	gnome_calendar_get_current_time_range (e_cal_view_get_calendar (E_CAL_VIEW (day_view)), &start, NULL);
-	view_type = gnome_calendar_get_view (e_cal_view_get_calendar (E_CAL_VIEW (day_view)));
-
-	switch (view_type) {
-	case GNOME_CAL_DAY_VIEW:
-		print_view = PRINT_VIEW_DAY;
-		break;
-
-	case GNOME_CAL_WORK_WEEK_VIEW:
-		print_view = PRINT_VIEW_WEEK;
-		break;
-
-	default:
-		g_assert_not_reached ();
-		return;
-	}
-
-	print_calendar (e_cal_view_get_calendar (E_CAL_VIEW (day_view)), FALSE, start, print_view);
-}
-
-static void
-e_day_view_on_print_event (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	EDayViewEvent *event;
-
-	day_view = E_DAY_VIEW (data);
-
-	event = e_day_view_get_popup_menu_event (day_view);
-	if (event == NULL)
-		return;
-
-	print_comp (event->comp, e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), FALSE);
-}
-
-static void
-e_day_view_on_meeting (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	EDayViewEvent *event;
-	GnomeCalendar *calendar;
-
-	day_view = E_DAY_VIEW (data);
-
-	event = e_day_view_get_popup_menu_event (day_view);
-	if (event == NULL)
-		return;
-
-	calendar = e_cal_view_get_calendar (E_CAL_VIEW (day_view));
-	if (calendar)
-		gnome_calendar_edit_object (calendar, event->comp, TRUE);
-	else
-		g_warning ("Calendar not set");
-}
-
-static void
-e_day_view_on_forward (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	EDayViewEvent *event;
-
-	day_view = E_DAY_VIEW (data);
-
-	event = e_day_view_get_popup_menu_event (day_view);
-	if (event == NULL)
-		return;
-
-	itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, event->comp, 
-			e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL);
-}
-
-static void
-e_day_view_on_publish (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	icaltimezone *utc;
-	time_t start = time (NULL), end;
-	GList *comp_list;
-
-	day_view = E_DAY_VIEW (data);
-
-	utc = icaltimezone_get_utc_timezone ();
-	start = time_day_begin_with_zone (start, utc);
-	end = time_add_week_with_zone (start, 6, utc);
-
-	comp_list = cal_client_get_free_busy (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL,
-					      start, end);
-	if (comp_list) {
-		GList *l;
-
-		for (l = comp_list; l; l = l->next) {
-			CalComponent *comp = CAL_COMPONENT (l->data);
-			itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, comp, 
-					e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL);
-
-			g_object_unref (comp);
-		}
-
- 		g_list_free (comp_list);
-	}
-}
-
-static void
-e_day_view_on_settings (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-
-	day_view = E_DAY_VIEW (data);
-
-	control_util_show_settings (e_cal_view_get_calendar (E_CAL_VIEW (day_view)));
-}
-
-static void
-e_day_view_delete_event_internal (EDayView *day_view, EDayViewEvent *event)
-{
-	CalComponentVType vtype;
-
-	vtype = cal_component_get_vtype (event->comp);
-
-	if (delete_component_dialog (event->comp, FALSE, 1, vtype,
-				     GTK_WIDGET (day_view))) {
-		const char *uid;
-
-		if (itip_organizer_is_user (event->comp, e_cal_view_get_cal_client (E_CAL_VIEW (day_view))) 
-		    && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (day_view),
-						e_cal_view_get_cal_client (E_CAL_VIEW (day_view)),
-						event->comp, TRUE))
-			itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp,
-					e_cal_view_get_cal_client (E_CAL_VIEW (day_view)), NULL);
-
-		cal_component_get_uid (event->comp, &uid);
-
-		delete_error_dialog (cal_client_remove_object (e_cal_view_get_cal_client (E_CAL_VIEW (day_view)),
-							       uid), CAL_COMPONENT_EVENT);
-	}
-}
-
-static void
-e_day_view_on_delete_appointment (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	EDayViewEvent *event;
-	gboolean destroyed;
-
-	day_view = E_DAY_VIEW (data);
-
-	event = e_day_view_get_popup_menu_event (day_view);
-	if (event == NULL)
-		return;
-
-	destroyed = FALSE;
-	g_object_weak_ref ((GObject *) event->comp, comp_destroy_cb, &destroyed);
-
-	if (day_view->editing_event_day >= 0)
-		e_day_view_stop_editing_event (day_view);
-
-	if (!destroyed) {
-		g_object_weak_unref ((GObject *) event->comp, comp_destroy_cb, &destroyed);
-
-		e_day_view_delete_event_internal (day_view, event);
-	}
-}
-
 void
 e_day_view_delete_event		(EDayView       *day_view)
 {
@@ -4020,7 +3478,7 @@ e_day_view_delete_event		(EDayView      
 					EDayViewEvent,
 					day_view->editing_event_num);
 
-	e_day_view_delete_event_internal (day_view, event);
+	e_cal_view_delete_event_internal (day_view, event->comp);
 }
 
 static void
@@ -4052,21 +3510,6 @@ e_day_view_delete_occurrence_internal (E
 	g_object_unref (comp);
 }
 
-static void
-e_day_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view;
-	EDayViewEvent *event;
-
-	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)
 {
@@ -4089,40 +3532,13 @@ e_day_view_delete_occurrence (EDayView *
 	e_day_view_delete_occurrence_internal (day_view, event);
 }
 
-static void
-e_day_view_on_cut (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-
-	e_cal_view_cut_clipboard (E_CAL_VIEW (day_view));
-}
-
-static void
-e_day_view_on_copy (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-
-	e_cal_view_copy_clipboard (E_CAL_VIEW (day_view));
-}
-
-static void
-e_day_view_on_paste (GtkWidget *widget, gpointer data)
-{
-	EDayView *day_view = E_DAY_VIEW (data);
-
-	e_cal_view_paste_clipboard (E_CAL_VIEW (day_view));
-}
-
-static void
-e_day_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
+void
+e_day_view_unrecur_appointment (EDayView *day_view)
 {
-	EDayView *day_view;
 	EDayViewEvent *event;
 	CalComponent *comp, *new_comp;
 	CalComponentDateTime date;
 	struct icaltimetype itt;
-
-	day_view = E_DAY_VIEW (data);
 
 	event = e_day_view_get_popup_menu_event (day_view);
 	if (event == NULL)
Index: gui/e-day-view.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view.h,v
retrieving revision 1.45
diff -u -p -r1.45 e-day-view.h
--- gui/e-day-view.h	23 Jul 2003 12:14:57 -0000	1.45
+++ gui/e-day-view.h	23 Jul 2003 15:44:25 -0000
@@ -407,7 +407,6 @@ struct _EDayView
 	/* The event for which a popup menu is being displayed, as above. */
 	gint popup_event_day;
 	gint popup_event_num;
-	EPopupMenu *view_menu;
 	
 	/* The currently selected region. If selection_start_day is -1 there is
 	   no current selection. If start_row or end_row is -1 then the
Index: gui/e-cal-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-view.c,v
retrieving revision 1.5
diff -u -p -r1.5 e-cal-view.c
--- gui/e-cal-view.c	23 Jul 2003 12:14:57 -0000	1.5
+++ gui/e-cal-view.c	23 Jul 2003 15:44:25 -0000
@@ -26,13 +26,20 @@
 #include <gtk/gtkinvisible.h>
 #include <libgnome/gnome-i18n.h>
 #include <gal/util/e-util.h>
+#include "e-util/e-dialog-utils.h"
+#include "cal-util/timeutil.h"
 #include "evolution-activity-client.h"
+#include "calendar-commands.h"
 #include "calendar-config.h"
 #include "e-cal-view.h"
 #include "itip-utils.h"
-#include "dialogs/cancel-comp.h"
+#include "dialogs/delete-comp.h"
 #include "dialogs/delete-error.h"
 #include "dialogs/send-comp.h"
+#include "dialogs/cancel-comp.h"
+#include "dialogs/recur-comp.h"
+#include "print.h"
+#include "goto.h"
 
 /* Used for the status bar messages */
 #define EVOLUTION_CALENDAR_PROGRESS_IMAGE "evolution-calendar-mini.png"
@@ -54,6 +61,9 @@ struct _ECalViewPrivate {
 	/* the invisible widget to manage the clipboard selections */
 	GtkWidget *invisible;
 	gchar *clipboard_selection;
+
+	/* The popup menu */
+	EPopupMenu *view_menu;
 };
 
 static void e_cal_view_class_init (ECalViewClass *klass);
@@ -75,6 +85,7 @@ static void
 e_cal_view_class_init (ECalViewClass *klass)
 {
 	GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
+	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
 	parent_class = g_type_class_peek_parent (klass);
 
@@ -461,12 +472,14 @@ e_cal_view_set_selected_time_range (ECal
 gboolean
 e_cal_view_get_visible_time_range (ECalView *cal_view, time_t *start_time, time_t *end_time)
 {
-	g_return_if_fail (E_IS_CAL_VIEW (cal_view));
+	g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), FALSE);
 
 	if (E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_visible_time_range) {
-		E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_visible_time_range (
+		return E_CAL_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_visible_time_range (
 			cal_view, start_time, end_time);
 	}
+
+	return FALSE;
 }
 
 void
@@ -559,4 +572,467 @@ e_cal_view_paste_clipboard (ECalView *ca
 			       clipboard_atom,
 			       GDK_SELECTION_TYPE_STRING,
 			       GDK_CURRENT_TIME);
+}
+
+static void
+on_new_appointment (GtkWidget *widget, gpointer user_data)
+{
+	time_t dtstart, dtend;
+	ECalView *cal_view = (ECalView *) user_data;
+
+	e_cal_view_get_selected_time_range (cal_view, &dtstart, &dtend);
+	gnome_calendar_new_appointment_for (cal_view->priv->calendar, dtstart, dtend, FALSE, FALSE);
+}
+
+static void
+on_new_event (GtkWidget *widget, gpointer user_data)
+{
+	time_t dtstart, dtend;
+	ECalView *cal_view = (ECalView *) user_data;
+
+	e_cal_view_get_selected_time_range (cal_view, &dtstart, &dtend);
+	gnome_calendar_new_appointment_for (cal_view->priv->calendar, dtstart, dtend, TRUE, FALSE);
+}
+
+static void
+on_new_meeting (GtkWidget *widget, gpointer user_data)
+{
+	time_t dtstart, dtend;
+	ECalView *cal_view = (ECalView *) user_data;
+
+	e_cal_view_get_selected_time_range (cal_view, &dtstart, &dtend);
+	gnome_calendar_new_appointment_for (cal_view->priv->calendar, dtstart, dtend, FALSE, TRUE);
+}
+
+static void
+on_new_task (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view = (ECalView *) user_data;
+	gnome_calendar_new_task (cal_view->priv->calendar);
+}
+
+static void
+on_goto_date (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	goto_dialog (cal_view->priv->calendar);
+}
+
+static void
+on_goto_today (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	calendar_goto_today (cal_view->priv->calendar);
+}
+
+static void
+on_edit_appointment (GtkWidget *widget, gpointer user_data)
+{
+	GList *selected;
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	selected = e_cal_view_get_selected_events (cal_view);
+	if (selected) {
+		gnome_calendar_edit_object (cal_view->priv->calendar, CAL_COMPONENT (selected->data), FALSE);
+
+		g_list_free (selected);
+	}
+}
+
+static void
+on_print (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view;
+	time_t start;
+	GnomeCalendarViewType view_type;
+	PrintView print_view;
+
+	cal_view = E_CAL_VIEW (user_data);
+
+	gnome_calendar_get_current_time_range (cal_view->priv->calendar, &start, NULL);
+	view_type = gnome_calendar_get_view (cal_view->priv->calendar);
+
+	switch (view_type) {
+	case GNOME_CAL_WEEK_VIEW:
+		print_view = PRINT_VIEW_WEEK;
+		break;
+
+	case GNOME_CAL_MONTH_VIEW:
+		print_view = PRINT_VIEW_MONTH;
+		break;
+
+	default:
+		g_assert_not_reached ();
+		return;
+	}
+
+	print_calendar (cal_view->priv->calendar, FALSE, start, print_view);
+}
+
+static void
+on_save_as (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view;
+	GList *selected;
+	char *filename;
+	char *ical_string;
+	FILE *file;
+
+	cal_view = E_CAL_VIEW (user_data);
+
+	selected = e_cal_view_get_selected_events (cal_view);
+	if (!selected)
+		return;
+
+	filename = e_file_dialog_save (_("Save as..."));
+	if (filename == NULL)
+		return;
+	
+	ical_string = cal_client_get_component_as_string (cal_view->priv->client,
+							  CAL_COMPONENT (selected->data));
+	if (ical_string == NULL) {
+		g_warning ("Couldn't convert item to a string");
+		return;
+	}
+	
+	file = fopen (filename, "w");
+	if (file == NULL) {
+		g_warning ("Couldn't save item");
+		return;
+	}
+	
+	fprintf (file, ical_string);
+	g_free (ical_string);
+	fclose (file);
+
+	g_list_free (selected);
+}
+
+static void
+on_print_event (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view;
+	GList *selected;
+
+	cal_view = E_CAL_VIEW (user_data);
+	selected = e_cal_view_get_selected_events (cal_view);
+	if (!selected)
+		return;
+
+	print_comp (CAL_COMPONENT (selected->data), cal_view->priv->client, FALSE);
+}
+
+static void
+on_meeting (GtkWidget *widget, gpointer user_data)
+{
+	GList *selected;
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	selected = e_cal_view_get_selected_events (cal_view);
+	if (selected) {
+		gnome_calendar_edit_object (cal_view->priv->calendar, CAL_COMPONENT (selected->data), TRUE);
+
+		g_list_free (selected);
+	}
+}
+
+static void
+on_forward (GtkWidget *widget, gpointer user_data)
+{
+	GList *selected;
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	selected = e_cal_view_get_selected_events (cal_view);
+	if (selected) {
+		itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, CAL_COMPONENT (selected->data),
+				cal_view->priv->client, NULL);
+
+		g_list_free (selected);
+	}
+}
+
+static void
+on_publish (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view;
+	icaltimezone *utc;
+	time_t start = time (NULL), end;
+	GList *comp_list;
+
+	cal_view = E_CAL_VIEW (user_data);
+
+	utc = icaltimezone_get_utc_timezone ();
+	start = time_day_begin_with_zone (start, utc);
+	end = time_add_week_with_zone (start, 6, utc);
+
+	comp_list = cal_client_get_free_busy (cal_view->priv->client, NULL, start, end);
+	if (comp_list) {
+		GList *l;
+
+		for (l = comp_list; l; l = l->next) {
+			CalComponent *comp = CAL_COMPONENT (l->data);
+			itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, comp, cal_view->priv->client, NULL);
+
+			g_object_unref (comp);
+		}
+
+ 		g_list_free (comp_list);
+	}
+}
+
+static void
+on_settings (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view;
+
+	cal_view = E_CAL_VIEW (user_data);
+	control_util_show_settings (cal_view->priv->calendar);
+}
+
+void
+e_cal_view_delete_event_internal (ECalView *cal_view, CalComponent *comp)
+{
+	CalComponentVType vtype;
+
+	vtype = cal_component_get_vtype (comp);
+
+	if (delete_component_dialog (comp, FALSE, 1, vtype, GTK_WIDGET (cal_view))) {
+		const char *uid;
+
+		if (itip_organizer_is_user (comp, cal_view->priv->client) 
+		    && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (cal_view),
+						cal_view->priv->client,
+						comp, TRUE))
+			itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, comp,
+					cal_view->priv->client, NULL);
+
+		cal_component_get_uid (comp, &uid);
+
+		delete_error_dialog (
+			cal_client_remove_object (cal_view->priv->client, uid), CAL_COMPONENT_EVENT);
+	}
+}
+
+
+static void
+on_delete_appointment (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view;
+	GList *selected;
+
+	cal_view = E_CAL_VIEW (user_data);
+
+	selected = e_cal_view_get_selected_events (cal_view);
+	if (selected) {
+		e_cal_view_delete_event_internal (cal_view, CAL_COMPONENT (selected->data));
+		g_list_free (selected);
+	}
+}
+
+static void
+on_delete_occurrence (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view;
+
+	cal_view = E_CAL_VIEW (user_data);
+	gnome_calendar_delete_selected_occurrence (cal_view->priv->calendar);
+}
+
+static void
+on_cut (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	e_cal_view_cut_clipboard (cal_view);
+}
+
+static void
+on_copy (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	e_cal_view_copy_clipboard (cal_view);
+}
+
+static void
+on_paste (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	e_cal_view_paste_clipboard (cal_view);
+}
+
+static void
+on_unrecur_appointment (GtkWidget *widget, gpointer user_data)
+{
+	ECalView *cal_view = E_CAL_VIEW (user_data);
+
+	gnome_calendar_unrecur_selection (cal_view->priv->calendar);
+}
+
+enum {
+	/*
+	 * This is used to "flag" events that can not be editted
+	 */
+	MASK_EDITABLE = 1,
+
+	/*
+	 * To disable recurring actions to be displayed
+	 */
+	MASK_RECURRING = 2,
+
+	/*
+	 * To disable actions for non-recurring items to be displayed
+	 */
+	MASK_SINGLE   = 4,
+
+	/*
+	 * This is used to when an event is currently being edited
+	 * in another window and we want to disable the event
+	 * from being edited twice
+	 */
+	MASK_EDITING  = 8,
+
+	/*
+	 * This is used to when an event is already a meeting and
+	 * we want to disable the schedule meeting command
+	 */
+	MASK_MEETING  = 16,
+
+	/*
+	 * To disable cut and copy for meetings the user is not the
+	 * organizer of
+	 */
+	MASK_MEETING_ORGANIZER = 32,
+
+	/*
+	 * To disable things not valid for instances
+	 */
+	MASK_INSTANCE = 64
+};
+
+static EPopupMenu main_items [] = {
+	E_POPUP_ITEM (N_("New _Appointment..."), GTK_SIGNAL_FUNC (on_new_appointment), MASK_EDITABLE),
+	E_POPUP_ITEM (N_("New All Day _Event"), GTK_SIGNAL_FUNC (on_new_event), MASK_EDITABLE),
+	E_POPUP_ITEM (N_("New Meeting"), GTK_SIGNAL_FUNC (on_new_meeting), MASK_EDITABLE),
+	E_POPUP_ITEM (N_("New Task"), GTK_SIGNAL_FUNC (on_new_task), MASK_EDITABLE),
+
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_ITEM (N_("_Print..."), GTK_SIGNAL_FUNC (on_print), 0),
+
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_ITEM (N_("_Paste"), GTK_SIGNAL_FUNC (on_paste), MASK_EDITABLE),
+
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_SUBMENU (N_("Current View"), NULL, 0),
+	
+	E_POPUP_ITEM (N_("Go to _Today"), GTK_SIGNAL_FUNC (on_goto_today), 0),
+	E_POPUP_ITEM (N_("_Go to Date..."), GTK_SIGNAL_FUNC (on_goto_date), 0),
+
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_ITEM (N_("_Publish Free/Busy Information"), GTK_SIGNAL_FUNC (on_publish), 0),
+
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_ITEM (N_("_Settings..."), GTK_SIGNAL_FUNC (on_settings), 0),
+
+	E_POPUP_TERMINATOR
+};
+
+static EPopupMenu child_items [] = {
+	E_POPUP_ITEM (N_("_Open"), GTK_SIGNAL_FUNC (on_edit_appointment), MASK_EDITING),
+	E_POPUP_ITEM (N_("_Save As..."), GTK_SIGNAL_FUNC (on_save_as), MASK_EDITING),
+	E_POPUP_ITEM (N_("_Print..."), GTK_SIGNAL_FUNC (on_print_event), MASK_EDITING),
+
+	/* Only show this separator if one of the above is shown. */
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_ITEM (N_("C_ut"), GTK_SIGNAL_FUNC (on_cut), MASK_EDITING | MASK_EDITABLE | MASK_MEETING_ORGANIZER),
+	E_POPUP_ITEM (N_("_Copy"), GTK_SIGNAL_FUNC (on_copy), MASK_EDITING | MASK_MEETING_ORGANIZER),
+	E_POPUP_ITEM (N_("_Paste"), GTK_SIGNAL_FUNC (on_paste), MASK_EDITABLE),
+
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_ITEM (N_("_Schedule Meeting..."), GTK_SIGNAL_FUNC (on_meeting), MASK_EDITABLE | MASK_EDITING | MASK_MEETING),
+	E_POPUP_ITEM (N_("_Forward as iCalendar..."), GTK_SIGNAL_FUNC (on_forward), MASK_EDITING),
+
+	E_POPUP_SEPARATOR,
+
+	E_POPUP_ITEM (N_("_Delete"), GTK_SIGNAL_FUNC (on_delete_appointment), MASK_EDITABLE | MASK_SINGLE | MASK_EDITING),
+	E_POPUP_ITEM (N_("Make this Occurrence _Movable"), GTK_SIGNAL_FUNC (on_unrecur_appointment), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE | MASK_INSTANCE),
+	E_POPUP_ITEM (N_("Delete this _Occurrence"), GTK_SIGNAL_FUNC (on_delete_occurrence), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE),
+	E_POPUP_ITEM (N_("Delete _All Occurrences"), GTK_SIGNAL_FUNC (on_delete_appointment), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE),
+
+	E_POPUP_TERMINATOR
+};
+
+static void
+free_view_popup (GtkWidget *widget, gpointer data)
+{
+	ECalView *cal_view = E_CAL_VIEW (data);
+
+	if (cal_view->priv->view_menu == NULL)
+		return;
+	
+	gnome_calendar_discard_view_popup (cal_view->priv->calendar, cal_view->priv->view_menu);
+	cal_view->priv->view_menu = NULL;
+}
+
+GtkMenu *
+e_cal_view_create_popup_menu (ECalView *cal_view)
+{
+	gboolean being_edited, have_selection;
+	GList *selected;
+	EPopupMenu *context_menu;
+	guint32 disable_mask = 0, hide_mask = 0;
+	GtkMenu *popup;
+
+	g_return_val_if_fail (E_IS_CAL_VIEW (cal_view), NULL);
+
+	/* get the selection */
+	being_edited = FALSE;
+	selected = e_cal_view_get_selected_events (cal_view);
+
+	have_selection = GTK_WIDGET_HAS_FOCUS (cal_view) && selected != NULL;
+
+	if (selected == NULL) {
+		cal_view->priv->view_menu = gnome_calendar_setup_view_popup (cal_view->priv->calendar);
+		main_items[9].submenu = cal_view->priv->view_menu;
+		context_menu = main_items;
+	} else {
+		context_menu = child_items;
+
+		if (cal_component_has_recurrences (CAL_COMPONENT (selected->data)))
+			hide_mask |= MASK_SINGLE;
+		else
+			hide_mask |= MASK_RECURRING;
+
+		if (cal_component_is_instance (CAL_COMPONENT (selected->data)))
+			hide_mask |= MASK_INSTANCE;
+
+		if (cal_component_has_organizer (CAL_COMPONENT (selected->data))) {
+			disable_mask |= MASK_MEETING;
+
+			if (!itip_organizer_is_user (CAL_COMPONENT (selected->data),
+						     cal_view->priv->client))
+				disable_mask |= MASK_MEETING_ORGANIZER;
+		}
+	}
+
+	if (cal_client_is_read_only (cal_view->priv->client))
+		disable_mask |= MASK_EDITABLE;
+
+	if (being_edited)
+		disable_mask |= MASK_EDITING;
+
+	popup = e_popup_menu_create (context_menu, disable_mask, hide_mask, cal_view);
+	g_signal_connect (popup, "selection-done", G_CALLBACK (free_view_popup), cal_view);
+
+	return popup;
 }
Index: gui/e-cal-view.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-view.h,v
retrieving revision 1.5
diff -u -p -r1.5 e-cal-view.h
--- gui/e-cal-view.h	23 Jul 2003 12:14:57 -0000	1.5
+++ gui/e-cal-view.h	23 Jul 2003 15:44:25 -0000
@@ -80,6 +80,9 @@ void           e_cal_view_update_query (
 void           e_cal_view_cut_clipboard (ECalView *cal_view);
 void           e_cal_view_copy_clipboard (ECalView *cal_view);
 void           e_cal_view_paste_clipboard (ECalView *cal_view);
+void           e_cal_view_delete_event_internal (ECalView *cal_view, CalComponent *comp);
+
+GtkMenu       *e_cal_view_create_popup_menu (ECalView *cal_view);
 
 G_END_DECLS
 
Index: gui/e-week-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-week-view.c,v
retrieving revision 1.174
diff -u -p -r1.174 e-week-view.c
--- gui/e-week-view.c	23 Jul 2003 12:14:57 -0000	1.174
+++ gui/e-week-view.c	23 Jul 2003 15:44:27 -0000
@@ -180,44 +180,6 @@ static gboolean e_week_view_do_key_press
 					  GdkEventKey *event);
 static gboolean e_week_view_popup_menu (GtkWidget *widget);
 
-static void e_week_view_on_new_appointment (GtkWidget *widget,
-					    gpointer data);
-static void e_week_view_on_new_event       (GtkWidget *widget,
-					   gpointer data);
-static void e_week_view_on_new_meeting (GtkWidget *widget,
-					gpointer data);
-static void e_week_view_on_new_task (GtkWidget *widget,
-				     gpointer data);
-static void e_week_view_on_goto_today      (GtkWidget *widget,
-					   gpointer data);
-static void e_week_view_on_goto_date       (GtkWidget *widget,
-					   gpointer data);
-static void e_week_view_on_edit_appointment (GtkWidget *widget,
-					     gpointer data);
-static void e_week_view_on_save_as (GtkWidget *widget,
-				    gpointer data);
-static void e_week_view_on_print (GtkWidget *widget,
-				  gpointer data);
-static void e_week_view_on_print_event (GtkWidget *widget,
-					gpointer data);
-static void e_week_view_on_meeting (GtkWidget *widget,
-				    gpointer data);
-static void e_week_view_on_forward (GtkWidget *widget,
-				    gpointer data);
-static void e_week_view_on_publish (GtkWidget *widget,
-				    gpointer data);
-static void e_week_view_on_settings (GtkWidget *widget,
-				     gpointer data);
-static void e_week_view_on_delete_occurrence (GtkWidget *widget,
-					      gpointer data);
-static void e_week_view_on_delete_appointment (GtkWidget *widget,
-					       gpointer data);
-static void e_week_view_on_cut (GtkWidget *widget, gpointer data);
-static void e_week_view_on_copy (GtkWidget *widget, gpointer data);
-static void e_week_view_on_paste (GtkWidget *widget, gpointer data);
-static void e_week_view_on_unrecur_appointment (GtkWidget *widget,
-						gpointer data);
-
 static gboolean e_week_view_update_event_cb (EWeekView *week_view,
 					     gint event_num,
 					     gpointer data);
@@ -1276,35 +1238,6 @@ e_week_view_draw_shadow (EWeekView *week
 	gdk_draw_line (window, light_gc, x1, y2, x2, y2);
 }
 
-static void
-e_week_view_new_appointment (EWeekView *week_view, gboolean meeting)
-{
-	time_t dtstart, dtend;
-	struct icaltimetype itt;
-	gboolean all_day = FALSE;
-	
-	/* Edit a new event. If only one day is selected we set the time to
-	   the first 1/2-hour of the working day. */
-	if (week_view->selection_start_day == week_view->selection_end_day) {
-		dtstart = week_view->day_starts[week_view->selection_start_day];
-		itt = icaltime_from_timet_with_zone (dtstart, FALSE,
-						     week_view->zone);
-		itt.hour = calendar_config_get_day_start_hour ();
-		itt.minute = calendar_config_get_day_start_minute ();
-		dtstart = icaltime_as_timet_with_zone (itt, week_view->zone);
-
-		icaltime_adjust (&itt, 0, 0, 30, 0);
-		dtend = icaltime_as_timet_with_zone (itt, week_view->zone);
-	} else {
-		dtstart = week_view->day_starts[week_view->selection_start_day];
-		dtend = week_view->day_starts[week_view->selection_end_day + 1];
-		all_day = TRUE;
-	}
-
-	gnome_calendar_new_appointment_for (e_cal_view_get_calendar (E_CAL_VIEW (week_view)),
-					    dtstart, dtend, all_day, meeting);
-}
-
 /**
  * e_week_view_set_default_category:
  * @week_view: A week view.
@@ -3453,176 +3386,17 @@ e_week_view_key_press (GtkWidget *widget
 	return handled;
 }
 
-enum {
-	/*
-	 * This is used to "flag" events that can not be editted
-	 */
-	MASK_EDITABLE = 1,
-
-	/*
-	 * To disable recurring actions to be displayed
-	 */
-	MASK_RECURRING = 2,
-
-	/*
-	 * To disable actions for non-recurring items to be displayed
-	 */
-	MASK_SINGLE   = 4,
-
-	/*
-	 * This is used to when an event is currently being edited
-	 * in another window and we want to disable the event
-	 * from being edited twice
-	 */
-	MASK_EDITING  = 8,
-
-	/*
-	 * This is used to when an event is already a meeting and
-	 * we want to disable the schedule meeting command
-	 */
-	MASK_MEETING  = 16,
-
-	/*
-	 * To disable cut and copy for meetings the user is not the
-	 * organizer of
-	 */
-	MASK_MEETING_ORGANIZER = 32,
-
-	/*
-	 * To disable things not valid for instances
-	 */
-	MASK_INSTANCE = 64
-};
-
-static EPopupMenu main_items [] = {
-	E_POPUP_ITEM (N_("New _Appointment..."), GTK_SIGNAL_FUNC (e_week_view_on_new_appointment), MASK_EDITABLE),
-	E_POPUP_ITEM (N_("New All Day _Event"), GTK_SIGNAL_FUNC (e_week_view_on_new_event), MASK_EDITABLE),
-	E_POPUP_ITEM (N_("New Meeting"), GTK_SIGNAL_FUNC (e_week_view_on_new_meeting), MASK_EDITABLE),
-	E_POPUP_ITEM (N_("New Task"), GTK_SIGNAL_FUNC (e_week_view_on_new_task), MASK_EDITABLE),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Print..."), GTK_SIGNAL_FUNC (e_week_view_on_print), 0),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Paste"), GTK_SIGNAL_FUNC (e_week_view_on_paste), MASK_EDITABLE),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_SUBMENU (N_("Current View"), NULL, 0),
-	
-	E_POPUP_ITEM (N_("Go to _Today"), GTK_SIGNAL_FUNC (e_week_view_on_goto_today), 0),
-	E_POPUP_ITEM (N_("_Go to Date..."), GTK_SIGNAL_FUNC (e_week_view_on_goto_date), 0),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Publish Free/Busy Information"), GTK_SIGNAL_FUNC (e_week_view_on_publish), 0),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Settings..."), GTK_SIGNAL_FUNC (e_week_view_on_settings), 0),
-
-	E_POPUP_TERMINATOR
-};
-
-static EPopupMenu child_items [] = {
-	E_POPUP_ITEM (N_("_Open"), GTK_SIGNAL_FUNC (e_week_view_on_edit_appointment), MASK_EDITING),
-	E_POPUP_ITEM (N_("_Save As..."), GTK_SIGNAL_FUNC (e_week_view_on_save_as), MASK_EDITING),
-	E_POPUP_ITEM (N_("_Print..."), GTK_SIGNAL_FUNC (e_week_view_on_print_event), MASK_EDITING),
-
-	/* Only show this separator if one of the above is shown. */
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("C_ut"), GTK_SIGNAL_FUNC (e_week_view_on_cut), MASK_EDITING | MASK_EDITABLE | MASK_MEETING_ORGANIZER),
-	E_POPUP_ITEM (N_("_Copy"), GTK_SIGNAL_FUNC (e_week_view_on_copy), MASK_EDITING | MASK_MEETING_ORGANIZER),
-	E_POPUP_ITEM (N_("_Paste"), GTK_SIGNAL_FUNC (e_week_view_on_paste), MASK_EDITABLE),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Schedule Meeting..."), GTK_SIGNAL_FUNC (e_week_view_on_meeting), MASK_EDITABLE | MASK_EDITING | MASK_MEETING),
-	E_POPUP_ITEM (N_("_Forward as iCalendar..."), GTK_SIGNAL_FUNC (e_week_view_on_forward), MASK_EDITING),
-
-	E_POPUP_SEPARATOR,
-
-	E_POPUP_ITEM (N_("_Delete"), GTK_SIGNAL_FUNC (e_week_view_on_delete_appointment), MASK_EDITABLE | MASK_SINGLE | MASK_EDITING),
-	E_POPUP_ITEM (N_("Make this Occurrence _Movable"), GTK_SIGNAL_FUNC (e_week_view_on_unrecur_appointment), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE | MASK_INSTANCE),
-	E_POPUP_ITEM (N_("Delete this _Occurrence"), GTK_SIGNAL_FUNC (e_week_view_on_delete_occurrence), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE),
-	E_POPUP_ITEM (N_("Delete _All Occurrences"), GTK_SIGNAL_FUNC (e_week_view_on_delete_appointment), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE),
-
-	E_POPUP_TERMINATOR
-};
-
-static void
-free_view_popup (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	if (week_view->view_menu == NULL)
-		return;
-	
-	gnome_calendar_discard_view_popup (e_cal_view_get_calendar (E_CAL_VIEW (week_view)),
-					   week_view->view_menu);
-	week_view->view_menu = NULL;
-}
-
 void
 e_week_view_show_popup_menu (EWeekView	     *week_view,
 			     GdkEventButton  *bevent,
 			     gint	      event_num)
 {
 	EWeekViewEvent *event;
-	int have_selection;
-	gboolean being_edited;
-	guint32 disable_mask = 0, hide_mask = 0;
-	EPopupMenu *context_menu;
 	GtkMenu *popup;
 	
-	have_selection = GTK_WIDGET_HAS_FOCUS (week_view)
-		&& week_view->selection_start_day != -1;
-
-	/*
-	 * This used to be set only if the event wasn't being edited
-	 * in the event editor, but we can't check that at present.
-	 * We could possibly set up another method of checking it.
-	 */
-	being_edited = FALSE;
-
-	if (event_num == -1) {
-		week_view->view_menu = gnome_calendar_setup_view_popup (e_cal_view_get_calendar (E_CAL_VIEW (week_view)));
-		main_items[9].submenu = week_view->view_menu;
-		context_menu = main_items;
-	} else {
-		context_menu = child_items;
-		event = &g_array_index (week_view->events,
-					EWeekViewEvent, event_num);
-
-		if (cal_component_has_recurrences (event->comp))
-			hide_mask |= MASK_SINGLE;
-		else
-			hide_mask |= MASK_RECURRING;
-
-		if (cal_component_is_instance (event->comp))
-			hide_mask |= MASK_INSTANCE;
-
-		if (cal_component_has_organizer (event->comp)) {
-			disable_mask |= MASK_MEETING;
-
-			if (!itip_organizer_is_user (event->comp,
-						     e_cal_view_get_cal_client (E_CAL_VIEW (week_view))))
-				disable_mask |= MASK_MEETING_ORGANIZER;
-		}
-	}
-
-	if (cal_client_is_read_only (e_cal_view_get_cal_client (E_CAL_VIEW (week_view))))
-		disable_mask |= MASK_EDITABLE;
-
-	if (being_edited)
-		disable_mask |= MASK_EDITING;
 	week_view->popup_event_num = event_num;
 
-	popup = e_popup_menu_create (context_menu, disable_mask, hide_mask, week_view);
-	g_signal_connect (popup, "selection-done", G_CALLBACK (free_view_popup), week_view);
+	popup = e_cal_view_create_popup_menu (E_CAL_VIEW (week_view));
 	e_popup_menu (popup, (GdkEvent *) bevent);
 }
 
@@ -3635,305 +3409,20 @@ e_week_view_popup_menu (GtkWidget *widge
 	return TRUE;
 }
 
-static void
-e_week_view_on_new_appointment (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	e_week_view_new_appointment (week_view, FALSE);
-}
-
-
-static void
-e_week_view_on_new_event (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-	time_t dtstart, dtend;
-
-	dtstart = week_view->day_starts[week_view->selection_start_day];
-	dtend = week_view->day_starts[week_view->selection_end_day + 1];
-	gnome_calendar_new_appointment_for (
-		e_cal_view_get_calendar (E_CAL_VIEW (week_view)), dtstart, dtend, TRUE, FALSE);
-}
-
-static void
-e_week_view_on_new_meeting (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	e_week_view_new_appointment (week_view, TRUE);
-}
-
-static void
-e_week_view_on_new_task (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	gnome_calendar_new_task (e_cal_view_get_calendar (E_CAL_VIEW (week_view)));
-}
-
-static void
-e_week_view_on_goto_date (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	goto_dialog (e_cal_view_get_calendar (E_CAL_VIEW (week_view)));
-}
-
-static void
-e_week_view_on_goto_today (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	calendar_goto_today (e_cal_view_get_calendar (E_CAL_VIEW (week_view)));
-}
-
-static void
-e_week_view_on_edit_appointment (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-	EWeekViewEvent *event;
-	GnomeCalendar *calendar;
-
-	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);
-
-	calendar = e_cal_view_get_calendar (E_CAL_VIEW (week_view));
-	if (calendar)
-		gnome_calendar_edit_object (calendar, event->comp, FALSE);
-	else
-		g_warning ("Calendar not set");
-}
-
-static void
-e_week_view_on_print (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-	time_t start;
-	GnomeCalendarViewType view_type;
-	PrintView print_view;
-
-	week_view = E_WEEK_VIEW (data);
-
-	gnome_calendar_get_current_time_range (e_cal_view_get_calendar (E_CAL_VIEW (week_view)), &start, NULL);
-	view_type = gnome_calendar_get_view (e_cal_view_get_calendar (E_CAL_VIEW (week_view)));
-
-	switch (view_type) {
-	case GNOME_CAL_WEEK_VIEW:
-		print_view = PRINT_VIEW_WEEK;
-		break;
-
-	case GNOME_CAL_MONTH_VIEW:
-		print_view = PRINT_VIEW_MONTH;
-		break;
-
-	default:
-		g_assert_not_reached ();
-		return;
-	}
-
-	print_calendar (e_cal_view_get_calendar (E_CAL_VIEW (week_view)), FALSE, start, print_view);
-}
-
-static void
-e_week_view_on_save_as (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-	EWeekViewEvent *event;
-	char *filename;
-	char *ical_string;
-	FILE *file;
-
-	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);
-	
-	filename = e_file_dialog_save (_("Save as..."));
-	if (filename == NULL)
-		return;
-	
-	ical_string = cal_client_get_component_as_string (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)),
-							  event->comp);
-	if (ical_string == NULL) {
-		g_warning ("Couldn't convert item to a string");
-		return;
-	}
-	
-	file = fopen (filename, "w");
-	if (file == NULL) {
-		g_warning ("Couldn't save item");
-		return;
-	}
-	
-	fprintf (file, ical_string);
-	g_free (ical_string);
-	fclose (file);
-}
-
-static void
-e_week_view_on_print_event (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-	EWeekViewEvent *event;
-
-	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);
-
-	print_comp (event->comp, e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), FALSE);
-}
-
-static void
-e_week_view_on_meeting (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-	EWeekViewEvent *event;
-	GnomeCalendar *calendar;
-
-	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);
-
-	calendar = e_cal_view_get_calendar (E_CAL_VIEW (week_view));
-	if (calendar)
-		gnome_calendar_edit_object (calendar, event->comp, TRUE);
-	else
-		g_warning ("Calendar not set");
-}
-
-static void
-e_week_view_on_forward (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-	EWeekViewEvent *event;
-
-	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);
-
-	itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, event->comp, 
-			e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL);
-}
-
-static void
-e_week_view_on_publish (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-	icaltimezone *utc;
-	time_t start = time (NULL), end;
-	GList *comp_list;
-
-	week_view = E_WEEK_VIEW (data);
-
-	utc = icaltimezone_get_utc_timezone ();
-	start = time_day_begin_with_zone (start, utc);
-	end = time_add_week_with_zone (start, 6, utc);
-
-	comp_list = cal_client_get_free_busy (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL,
-					      start, end);
-	if (comp_list) {
-		GList *l;
-
-		for (l = comp_list; l; l = l->next) {
-			CalComponent *comp = CAL_COMPONENT (l->data);
-			itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, comp, 
-					e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL);
-
-			g_object_unref (comp);
-		}
-
- 		g_list_free (comp_list);
-	}
-}
-
-static void
-e_week_view_on_settings (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view;
-
-	week_view = E_WEEK_VIEW (data);
-
-	control_util_show_settings (e_cal_view_get_calendar (E_CAL_VIEW (week_view)));
-}
-
-static void
-e_week_view_delete_event_internal (EWeekView *week_view, gint event_num)
-{
-	CalComponentVType vtype;
-	EWeekViewEvent *event;
-
-	event = &g_array_index (week_view->events, EWeekViewEvent,
-				event_num);
-
-	vtype = cal_component_get_vtype (event->comp);
-
-	if (delete_component_dialog (event->comp, FALSE, 1, vtype,
-				     GTK_WIDGET (week_view))) {
-		const char *uid;
-
-		if (itip_organizer_is_user (event->comp,
-					    e_cal_view_get_cal_client (E_CAL_VIEW (week_view))) 
-		    && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (week_view),
-						e_cal_view_get_cal_client (E_CAL_VIEW (week_view)),
-						event->comp, TRUE))
-			itip_send_comp (CAL_COMPONENT_METHOD_CANCEL, event->comp,
-					e_cal_view_get_cal_client (E_CAL_VIEW (week_view)), NULL);
-
-		cal_component_get_uid (event->comp, &uid);
-
-		delete_error_dialog (
-			cal_client_remove_object (e_cal_view_get_cal_client (E_CAL_VIEW (week_view)),
-						  uid), CAL_COMPONENT_EVENT);
-	}
-}
-
-
-static void
-e_week_view_on_delete_appointment (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_event_internal (week_view,
-					   week_view->popup_event_num);
-}
-
-
 void
 e_week_view_delete_event		(EWeekView       *week_view)
 {
+	EWeekViewEvent *event;
+
 	g_return_if_fail (E_IS_WEEK_VIEW (week_view));
 
 	if (week_view->editing_event_num == -1)
 		return;
 
-	e_week_view_delete_event_internal (week_view,
-					   week_view->editing_event_num);
+	event = &g_array_index (week_view->events, EWeekViewEvent, week_view->editing_event_num);
+	if (!event)
+		return;
+	e_cal_view_delete_event_internal (week_view, event->comp);
 }
 
 
@@ -3970,19 +3459,6 @@ e_week_view_delete_occurrence_internal (
 	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)
 {
@@ -3994,40 +3470,13 @@ e_week_view_delete_occurrence (EWeekView
 	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 = E_WEEK_VIEW (data);
-
-	e_cal_view_cut_clipboard (E_CAL_VIEW (week_view));
-}
-
-static void
-e_week_view_on_copy (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	e_cal_view_copy_clipboard (E_CAL_VIEW (week_view));
-}
-
-static void
-e_week_view_on_paste (GtkWidget *widget, gpointer data)
-{
-	EWeekView *week_view = E_WEEK_VIEW (data);
-
-	e_cal_view_paste_clipboard (E_CAL_VIEW (week_view));
-}
-
-static void
-e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
+void
+e_week_view_unrecur_appointment (EWeekView *week_view)
 {
-	EWeekView *week_view;
 	EWeekViewEvent *event;
 	CalComponent *comp, *new_comp;
 	CalComponentDateTime date;
 	struct icaltimetype itt;
-
-	week_view = E_WEEK_VIEW (data);
 
 	if (week_view->popup_event_num == -1)
 		return;
Index: gui/e-week-view.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-week-view.h,v
retrieving revision 1.40
diff -u -p -r1.40 e-week-view.h
--- gui/e-week-view.h	23 Jul 2003 12:14:57 -0000	1.40
+++ gui/e-week-view.h	23 Jul 2003 15:44:27 -0000
@@ -342,7 +342,6 @@ struct _EWeekView
 
 	/* The event that the context menu is for. */
 	gint popup_event_num;
-	EPopupMenu *view_menu;
 
 	/* The last mouse position when dragging, in the entire canvas. */
 	gint drag_event_x;
Index: gui/gnome-cal.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/gnome-cal.c,v
retrieving revision 1.251
diff -u -p -r1.251 gnome-cal.c
--- gui/gnome-cal.c	23 Jul 2003 12:14:57 -0000	1.251
+++ gui/gnome-cal.c	23 Jul 2003 15:44:29 -0000
@@ -2953,6 +2953,30 @@ gnome_calendar_delete_selected_occurrenc
 	}
 }
 
+void
+gnome_calendar_unrecur_selection (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_unrecur_appointment (E_DAY_VIEW (view));
+		else
+			e_week_view_unrecur_appointment (E_WEEK_VIEW (view));
+	}
+}
+
 typedef struct {
 	gboolean remove;
 	GnomeCalendar *gcal;
Index: gui/gnome-cal.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/gnome-cal.h,v
retrieving revision 1.84
diff -u -p -r1.84 gnome-cal.h
--- gui/gnome-cal.h	16 Jul 2003 23:15:04 -0000	1.84
+++ gui/gnome-cal.h	23 Jul 2003 15:44:29 -0000
@@ -184,6 +184,7 @@ void       gnome_calendar_paste_clipboar
 
 void       gnome_calendar_delete_selection	(GnomeCalendar  *gcal);
 void       gnome_calendar_delete_selected_occurrence (GnomeCalendar *gcal);
+void       gnome_calendar_unrecur_selection     (GnomeCalendar *gcal);
 void       gnome_calendar_purge                 (GnomeCalendar  *gcal,
 						 time_t older_than);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]