Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.1802
diff -u -r1.1802 ChangeLog
--- ChangeLog	25 Jun 2003 16:08:55 -0000	1.1802
+++ ChangeLog	26 Jun 2003 09:28:44 -0000
@@ -1,3 +1,9 @@
+2003-06-26  Bolian Yin <bolian.yin@sun.com>
+
+	Fixes #45274
+
+	* gui/e-week-view.c: implemented tabbing though events in week view.
+	
 2003-06-25  Bolian Yin <bolian.yin@sun.com>
 
 	Fixes #45275
Index: gui/e-week-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-week-view.c,v
retrieving revision 1.165
diff -u -r1.165 e-week-view.c
--- gui/e-week-view.c	19 Jun 2003 02:41:49 -0000	1.165
+++ gui/e-week-view.c	26 Jun 2003 09:28:49 -0000
@@ -114,6 +114,14 @@
 				   GdkEventFocus *event);
 static gint e_week_view_expose_event (GtkWidget *widget,
 				      GdkEventExpose *event);
+static gboolean e_week_view_get_next_tab_event (EWeekView *week_view,
+						GtkDirectionType direction,
+						gint current_event_num,
+						gint current_span_num,
+						gint *next_event_num,
+						gint *next_span_num);
+static gboolean e_week_view_focus (GtkWidget *widget,
+				   GtkDirectionType direction);
 static void e_week_view_draw_shadow (EWeekView *week_view);
 
 static gboolean e_week_view_on_button_press (GtkWidget *widget,
@@ -278,6 +286,7 @@
 	widget_class->key_press_event	= e_week_view_key_press;
 	widget_class->popup_menu        = e_week_view_popup_menu;
 	widget_class->expose_event	= e_week_view_expose_event;
+	widget_class->focus             = e_week_view_focus;
 
 	class->selection_changed = NULL;
 
@@ -998,6 +1007,85 @@
 	return FALSE;
 }
 
+
+static gboolean
+e_week_view_get_next_tab_event (EWeekView *week_view,
+				GtkDirectionType direction,
+				gint current_event_num,
+				gint current_span_num,
+				gint *next_event_num,
+				gint *next_span_num)
+{
+	gint event_num;
+
+	g_return_val_if_fail (week_view != NULL, FALSE);
+	g_return_val_if_fail (next_event_num != NULL, FALSE);
+	g_return_val_if_fail (next_span_num != NULL, FALSE);
+
+	if (week_view->events->len <= 0)
+		return FALSE;
+
+	/* we only tab through events not spans */
+	*next_span_num = 0;
+
+	switch (direction) {
+	case GTK_DIR_TAB_BACKWARD:
+		event_num = current_event_num - 1;
+		break;
+	case GTK_DIR_TAB_FORWARD:
+		event_num = current_event_num + 1;
+		break;
+	default:
+		return FALSE;
+	}
+
+	if (event_num < 0)
+		*next_event_num = week_view->events->len - 1;
+	else if (event_num >= week_view->events->len)
+		*next_event_num = 0;
+	else
+		*next_event_num = event_num;
+	return TRUE;
+}
+
+static gboolean
+e_week_view_focus (GtkWidget *widget, GtkDirectionType direction)
+{
+	EWeekView *week_view;
+	gint new_event_num;
+	gint new_span_num;
+	gint current_event_num;
+	gint current_span_num;
+	gint event_loop;
+	gboolean editable = FALSE;
+
+	g_return_val_if_fail (widget != NULL, FALSE);
+	g_return_val_if_fail (E_IS_WEEK_VIEW (widget), FALSE);
+
+	week_view = E_WEEK_VIEW (widget);
+	current_event_num = week_view->editing_event_num;
+	current_span_num = week_view->editing_span_num;
+	for (event_loop = 0; event_loop < week_view->events->len;
+	     ++event_loop) {
+		if (!e_week_view_get_next_tab_event (week_view, direction,
+						     current_event_num,
+						     current_span_num,
+						     &new_event_num,
+						     &new_span_num))
+			return FALSE;
+
+		editable = e_week_view_start_editing_event (week_view,
+							    new_event_num,
+							    new_span_num,
+							    NULL);
+		if (editable)
+			break;
+		current_event_num = new_event_num;
+		current_span_num = new_span_num;
+	}
+	return editable;
+}
+
 static void
 e_week_view_draw_shadow (EWeekView *week_view)
 {
@@ -2978,7 +3066,7 @@
 }
 
 
-void
+gboolean
 e_week_view_start_editing_event (EWeekView *week_view,
 				 gint	    event_num,
 				 gint	    span_num,
@@ -2992,7 +3080,7 @@
 	/* If we are already editing the event, just return. */
 	if (event_num == week_view->editing_event_num
 	    && span_num == week_view->editing_span_num)
-		return;
+		return TRUE;
 
 	event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
 	span = &g_array_index (week_view->spans, EWeekViewEventSpan,
@@ -3000,7 +3088,7 @@
 
 	/* If the event is not shown, don't try to edit it. */
 	if (!span->text_item)
-		return;
+		return FALSE;
 
 	if (initial_text) {
 		gnome_canvas_item_set (span->text_item,
@@ -3022,6 +3110,7 @@
 		g_signal_emit_by_name (event_processor,
 				       "command", &command);
 	}
+	return TRUE;
 }
 
 
Index: gui/e-week-view.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-week-view.h,v
retrieving revision 1.34
diff -u -r1.34 e-week-view.h
--- gui/e-week-view.h	22 Apr 2003 18:06:37 -0000	1.34
+++ gui/e-week-view.h	26 Jun 2003 09:28:49 -0000
@@ -489,7 +489,7 @@
 						 gint		*span_w);
 gboolean   e_week_view_is_one_day_event		(EWeekView	*week_view,
 						 gint		 event_num);
-void	   e_week_view_start_editing_event	(EWeekView	*week_view,
+gboolean   e_week_view_start_editing_event	(EWeekView	*week_view,
 						 gint		 event_num,
 						 gint		 span_num,
 						 gchar		*initial_text);
