[evolution/kill-bonobo] Add vertical view to Memos and Tasks.



commit 7dc82b2dcbab7f85504c3061ef45cc4249821e42
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Aug 27 13:38:17 2009 -0400

    Add vertical view to Memos and Tasks.

 calendar/gui/apps_evolution_calendar.schemas.in |   95 ++++++++++++++++++--
 modules/calendar/e-memo-shell-content.c         |  112 ++++++++++++++++-------
 modules/calendar/e-memo-shell-content.h         |    6 +-
 modules/calendar/e-memo-shell-view-actions.c    |   72 ++++++++++++++-
 modules/calendar/e-memo-shell-view-actions.h    |    4 +
 modules/calendar/e-task-shell-content.c         |  111 ++++++++++++++++-------
 modules/calendar/e-task-shell-content.h         |    6 +-
 modules/calendar/e-task-shell-view-actions.c    |   68 ++++++++++++++
 modules/calendar/e-task-shell-view-actions.h    |    4 +
 modules/mail/e-mail-shell-content.c             |   15 +--
 modules/mail/e-mail-shell-view-actions.c        |    2 +-
 ui/evolution-memos.ui                           |    9 ++-
 ui/evolution-tasks.ui                           |    9 ++-
 widgets/misc/e-paned.c                          |    1 +
 14 files changed, 419 insertions(+), 95 deletions(-)
---
diff --git a/calendar/gui/apps_evolution_calendar.schemas.in b/calendar/gui/apps_evolution_calendar.schemas.in
index 6a3b68a..b232c60 100644
--- a/calendar/gui/apps_evolution_calendar.schemas.in
+++ b/calendar/gui/apps_evolution_calendar.schemas.in
@@ -289,29 +289,106 @@
         <long>Position of the vertical pane, between the calendar lists and the date navigator calendar.</long>
       </locale>
     </schema>
+
     <schema>
-      <key>/schemas/apps/evolution/calendar/display/show_task_preview</key>
-      <applyto>/apps/evolution/calendar/display/show_task_preview</applyto>
+      <key>/schemas/apps/evolution/calendar/display/memo_layout</key>
+      <applyto>/apps/evolution/calendar/display/memo_layout</applyto>
+      <type>int</type>
+      <default>0</default>
+      <locale name="C">
+        <short>Memo layout style</short>
+        <long>
+          The layout style determines where to place the preview pane
+          in relation to the memo list.  "0" (Classic View) places the
+          preview pane below the memo list.  "1" (Vertical View) places
+          the preview pane next to the memo list.
+        </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/evolution/calendar/display/show_memo_preview</key>
+      <applyto>/apps/evolution/calendar/display/show_memo_preview</applyto>
       <owner>evolution-calendar</owner>
       <type>bool</type>
       <default>true</default>
       <locale name="C">
-         <short>Show the "Preview" pane</short>
+         <short>Show the memo preview pane</short>
          <long>
-          Show the "Preview" pane.
+           If "true", show the memo preview pane in the main window.
          </long>
       </locale>
     </schema>
 
     <schema>
+      <key>/schemas/apps/evolution/calendar/display/memo_hpane_position</key>
+      <applyto>/apps/evolution/calendar/display/memo_hpane_position</applyto>
+      <owner>evolution-calendar</owner>
+      <type>int</type>
+      <default>200</default>
+      <locale name="C">
+        <short>Memo preview pane position (horizontal)</short>
+        <long>
+          Position of the task preview pane when oriented horizontally.
+        </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/evolution/calendar/display/memo_vpane_position</key>
       <applyto>/apps/evolution/calendar/display/memo_vpane_position</applyto>
       <owner>evolution-calendar</owner>
       <type>int</type>
       <default>400</default>
       <locale name="C">
-        <short>Memos vertical pane position</short>
-        <long>Position of the vertical pane, between the memo list and the memo preview pane, in pixels.</long>
+        <short>Memo preview pane position (vertical)</short>
+        <long>
+          Position of the memo preview pane when oriented vertically.
+        </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/evolution/calendar/display/task_layout</key>
+      <applyto>/apps/evolution/calendar/display/task_layout</applyto>
+      <type>int</type>
+      <default>0</default>
+      <locale name="C">
+        <short>Task layout style</short>
+        <long>
+          The layout style determines where to place the preview pane
+          in relation to the task list.  "0" (Classic View) places the
+          preview pane below the task list.  "1" (Vertical View) places
+          the preview pane next to the task list.
+        </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/evolution/calendar/display/show_task_preview</key>
+      <applyto>/apps/evolution/calendar/display/show_task_preview</applyto>
+      <owner>evolution-calendar</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+         <short>Show the task preview pane</short>
+         <long>
+           If "true", show the task preview pane in the main window.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/evolution/calendar/display/task_hpane_position</key>
+      <applyto>/apps/evolution/calendar/display/task_hpane_position</applyto>
+      <owner>evolution-calendar</owner>
+      <type>int</type>
+      <default>200</default>
+      <locale name="C">
+        <short>Task preview pane position (horizontal)</short>
+        <long>
+          Position of the task preview pane when oriented horizontally.
+        </long>
       </locale>
     </schema>
 
@@ -322,8 +399,10 @@
       <type>int</type>
       <default>400</default>
       <locale name="C">
-        <short>Tasks vertical pane position</short>
-        <long>Position of the vertical pane, between the task list and the task preview pane, in pixels.</long>
+        <short>Task preview pane position (vertical)</short>
+        <long>
+          Position of the task preview pane when oriented vertically.
+        </long>
       </locale>
     </schema>
 
diff --git a/modules/calendar/e-memo-shell-content.c b/modules/calendar/e-memo-shell-content.c
index 7c7b84f..2f4e436 100644
--- a/modules/calendar/e-memo-shell-content.c
+++ b/modules/calendar/e-memo-shell-content.c
@@ -23,14 +23,15 @@
 
 #include <glib/gi18n.h>
 
+#include "e-util/e-binding.h"
 #include "e-util/gconf-bridge.h"
+#include "widgets/menus/gal-view-etable.h"
+#include "widgets/misc/e-paned.h"
 
 #include "calendar/gui/comp-util.h"
 #include "calendar/gui/e-cal-model-memos.h"
 #include "calendar/gui/e-memo-table.h"
 
-#include "widgets/menus/gal-view-etable.h"
-
 #define E_MEMO_SHELL_CONTENT_GET_PRIVATE(obj) \
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), E_TYPE_MEMO_SHELL_CONTENT, EMemoShellContentPrivate))
@@ -51,13 +52,17 @@ struct _EMemoShellContentPrivate {
 
 	ECalModel *memo_model;
 	GalViewInstance *view_instance;
+	GtkOrientation orientation;
 
 	gchar *current_uid;
+
+	guint preview_visible	: 1;
 };
 
 enum {
 	PROP_0,
 	PROP_MODEL,
+	PROP_ORIENTATION,
 	PROP_PREVIEW_VISIBLE
 };
 
@@ -258,6 +263,21 @@ memo_shell_content_model_row_changed_cb (EMemoShellContent *memo_shell_content,
 	memo_shell_content_cursor_change_cb (memo_shell_content, 0, table);
 }
 
+static GtkOrientation
+memo_shell_content_get_orientation (EMemoShellContent *memo_shell_content)
+{
+	return memo_shell_content->priv->orientation;
+}
+
+static void
+memo_shell_content_set_orientation (EMemoShellContent *memo_shell_content,
+                                    GtkOrientation orientation)
+{
+	memo_shell_content->priv->orientation = orientation;
+
+	g_object_notify (G_OBJECT (memo_shell_content), "orientation");
+}
+
 static void
 memo_shell_content_set_property (GObject *object,
                                  guint property_id,
@@ -265,6 +285,12 @@ memo_shell_content_set_property (GObject *object,
                                  GParamSpec *pspec)
 {
 	switch (property_id) {
+		case PROP_ORIENTATION:
+			memo_shell_content_set_orientation (
+				E_MEMO_SHELL_CONTENT (object),
+				g_value_get_enum (value));
+			return;
+
 		case PROP_PREVIEW_VISIBLE:
 			e_memo_shell_content_set_preview_visible (
 				E_MEMO_SHELL_CONTENT (object),
@@ -284,13 +310,22 @@ memo_shell_content_get_property (GObject *object,
 	switch (property_id) {
 		case PROP_MODEL:
 			g_value_set_object (
-				value, e_memo_shell_content_get_memo_model (
+				value,
+				e_memo_shell_content_get_memo_model (
+				E_MEMO_SHELL_CONTENT (object)));
+			return;
+
+		case PROP_ORIENTATION:
+			g_value_set_enum (
+				value,
+				memo_shell_content_get_orientation (
 				E_MEMO_SHELL_CONTENT (object)));
 			return;
 
 		case PROP_PREVIEW_VISIBLE:
 			g_value_set_boolean (
-				value, e_memo_shell_content_get_preview_visible (
+				value,
+				e_memo_shell_content_get_preview_visible (
 				E_MEMO_SHELL_CONTENT (object)));
 			return;
 	}
@@ -385,11 +420,15 @@ memo_shell_content_constructed (GObject *object)
 
 	container = GTK_WIDGET (object);
 
-	widget = gtk_vpaned_new ();
+	widget = e_paned_new (GTK_ORIENTATION_VERTICAL);
 	gtk_container_add (GTK_CONTAINER (container), widget);
 	priv->paned = g_object_ref (widget);
 	gtk_widget_show (widget);
 
+	e_binding_new (
+		G_OBJECT (object), "orientation",
+		G_OBJECT (widget), "orientation");
+
 	container = widget;
 
 	widget = e_memo_table_new (shell_view, priv->memo_model);
@@ -406,6 +445,10 @@ memo_shell_content_constructed (GObject *object)
 	gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE);
 	gtk_widget_show (widget);
 
+	e_binding_new (
+		G_OBJECT (object), "preview-visible",
+		G_OBJECT (widget), "visible");
+
 	container = widget;
 
 	widget = e_cal_component_preview_new ();
@@ -467,8 +510,12 @@ memo_shell_content_constructed (GObject *object)
 	bridge = gconf_bridge_get ();
 
 	object = G_OBJECT (priv->paned);
+	key = "/apps/evolution/calendar/display/memo_hpane_position";
+	gconf_bridge_bind_property_delayed (bridge, key, object, "hposition");
+
+	object = G_OBJECT (priv->paned);
 	key = "/apps/evolution/calendar/display/memo_vpane_position";
-	gconf_bridge_bind_property_delayed (bridge, key, object, "position");
+	gconf_bridge_bind_property_delayed (bridge, key, object, "vposition");
 }
 
 static guint32
@@ -553,7 +600,11 @@ memo_shell_content_class_init (EMemoShellContentClass *class)
 			_("Preview is Visible"),
 			_("Whether the preview pane is visible"),
 			TRUE,
-			G_PARAM_READWRITE));
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	g_object_class_override_property (
+		object_class, PROP_ORIENTATION, "orientation");
 }
 
 static void
@@ -587,9 +638,19 @@ e_memo_shell_content_register_type (GTypeModule *type_module)
 		NULL   /* value_table */
 	};
 
+	static const GInterfaceInfo orientable_info = {
+		(GInterfaceInitFunc) NULL,
+		(GInterfaceFinalizeFunc) NULL,
+		NULL  /* interface_data */
+	};
+
 	memo_shell_content_type = g_type_module_register_type (
 		type_module, E_TYPE_SHELL_CONTENT,
 		"EMemoShellContent", &type_info, 0);
+
+	g_type_module_add_interface (
+		type_module, memo_shell_content_type,
+		GTK_TYPE_ORIENTABLE, &orientable_info);
 }
 
 GtkWidget *
@@ -630,46 +691,31 @@ e_memo_shell_content_get_memo_table (EMemoShellContent *memo_shell_content)
 	return E_MEMO_TABLE (memo_shell_content->priv->memo_table);
 }
 
-GalViewInstance *
-e_memo_shell_content_get_view_instance (EMemoShellContent *memo_shell_content)
-{
-	g_return_val_if_fail (
-		E_IS_MEMO_SHELL_CONTENT (memo_shell_content), NULL);
-
-	return memo_shell_content->priv->view_instance;
-}
-
 gboolean
 e_memo_shell_content_get_preview_visible (EMemoShellContent *memo_shell_content)
 {
-	GtkPaned *paned;
-	GtkWidget *child;
-
 	g_return_val_if_fail (
 		E_IS_MEMO_SHELL_CONTENT (memo_shell_content), FALSE);
 
-	paned = GTK_PANED (memo_shell_content->priv->paned);
-	child = gtk_paned_get_child2 (paned);
-
-	return GTK_WIDGET_VISIBLE (child);
+	return memo_shell_content->priv->preview_visible;
 }
 
 void
 e_memo_shell_content_set_preview_visible (EMemoShellContent *memo_shell_content,
                                           gboolean preview_visible)
 {
-	GtkPaned *paned;
-	GtkWidget *child;
-
 	g_return_if_fail (E_IS_MEMO_SHELL_CONTENT (memo_shell_content));
 
-	paned = GTK_PANED (memo_shell_content->priv->paned);
-	child = gtk_paned_get_child2 (paned);
-
-	if (preview_visible)
-		gtk_widget_show (child);
-	else
-		gtk_widget_hide (child);
+	memo_shell_content->priv->preview_visible = preview_visible;
 
 	g_object_notify (G_OBJECT (memo_shell_content), "preview-visible");
 }
+
+GalViewInstance *
+e_memo_shell_content_get_view_instance (EMemoShellContent *memo_shell_content)
+{
+	g_return_val_if_fail (
+		E_IS_MEMO_SHELL_CONTENT (memo_shell_content), NULL);
+
+	return memo_shell_content->priv->view_instance;
+}
diff --git a/modules/calendar/e-memo-shell-content.h b/modules/calendar/e-memo-shell-content.h
index 84c22d6..ae2710e 100644
--- a/modules/calendar/e-memo-shell-content.h
+++ b/modules/calendar/e-memo-shell-content.h
@@ -82,14 +82,14 @@ ECalComponentPreview *
 					(EMemoShellContent *memo_shell_content);
 EMemoTable *	e_memo_shell_content_get_memo_table
 					(EMemoShellContent *memo_shell_content);
-GalViewInstance *
-		e_memo_shell_content_get_view_instance
-					(EMemoShellContent *memo_shell_content);
 gboolean	e_memo_shell_content_get_preview_visible
 					(EMemoShellContent *memo_shell_content);
 void		e_memo_shell_content_set_preview_visible
 					(EMemoShellContent *memo_shell_content,
 					 gboolean preview_visible);
+GalViewInstance *
+		e_memo_shell_content_get_view_instance
+					(EMemoShellContent *memo_shell_content);
 
 G_END_DECLS
 
diff --git a/modules/calendar/e-memo-shell-view-actions.c b/modules/calendar/e-memo-shell-view-actions.c
index 2d6713a..0161eeb 100644
--- a/modules/calendar/e-memo-shell-view-actions.c
+++ b/modules/calendar/e-memo-shell-view-actions.c
@@ -528,6 +528,32 @@ action_memo_search_cb (GtkRadioAction *action,
 }
 
 static void
+action_memo_view_cb (GtkRadioAction *action,
+                     GtkRadioAction *current,
+                     EMemoShellView *memo_shell_view)
+{
+	EMemoShellContent *memo_shell_content;
+	GtkOrientable *orientable;
+	GtkOrientation orientation;
+
+	memo_shell_content = memo_shell_view->priv->memo_shell_content;
+	orientable = GTK_ORIENTABLE (memo_shell_content);
+
+	switch (gtk_radio_action_get_current_value (action)) {
+		case 0:
+			orientation = GTK_ORIENTATION_VERTICAL;
+			break;
+		case 1:
+			orientation = GTK_ORIENTATION_HORIZONTAL;
+			break;
+		default:
+			g_return_if_reached ();
+	}
+
+	gtk_orientable_set_orientation (orientable, orientation);
+}
+
+static void
 action_search_execute_cb (GtkAction *action,
                           EMemoShellView *memo_shell_view)
 {
@@ -662,7 +688,16 @@ static GtkActionEntry memo_entries[] = {
 	  N_("_Save as iCalendar..."),
 	  NULL,
 	  NULL,  /* XXX Add a tooltip! */
-	  G_CALLBACK (action_memo_save_as_cb) }
+	  G_CALLBACK (action_memo_save_as_cb) },
+
+	/*** Menus ***/
+
+	{ "memo-preview-menu",
+	  NULL,
+	  N_("_Preview"),
+	  NULL,
+	  NULL,
+	  NULL }
 };
 
 static EPopupActionEntry memo_popup_entries[] = {
@@ -731,6 +766,33 @@ static GtkToggleActionEntry memo_toggle_entries[] = {
 	  TRUE }
 };
 
+static GtkRadioActionEntry memo_view_entries[] = {
+
+	/* This action represents the initial active memo view.
+	 * It should not be visible in the UI, nor should it be
+	 * possible to switch to it from another shell view. */
+	{ "memo-view-initial",
+	  NULL,
+	  NULL,
+	  NULL,
+	  NULL,
+	  -1 },
+
+	{ "memo-view-classic",
+	  NULL,
+	  N_("_Classic View"),
+	  NULL,
+	  N_("Show memo preview below the memo list"),
+	  0 },
+
+	{ "memo-view-vertical",
+	  NULL,
+	  N_("_Vertical View"),
+	  NULL,
+	  N_("Show memo preview alongside the memo list"),
+	  1 }
+};
+
 static GtkRadioActionEntry memo_filter_entries[] = {
 
 	{ "memo-filter-any-category",
@@ -829,6 +891,10 @@ e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
 		action_group, memo_toggle_entries,
 		G_N_ELEMENTS (memo_toggle_entries), memo_shell_view);
 	gtk_action_group_add_radio_actions (
+		action_group, memo_view_entries,
+		G_N_ELEMENTS (memo_view_entries), -1,
+		G_CALLBACK (action_memo_view_cb), memo_shell_view);
+	gtk_action_group_add_radio_actions (
 		action_group, memo_search_entries,
 		G_N_ELEMENTS (memo_search_entries),
 		MEMO_SEARCH_SUMMARY_CONTAINS,
@@ -851,6 +917,10 @@ e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
 	key = "/apps/evolution/calendar/display/show_memo_preview";
 	gconf_bridge_bind_property (bridge, key, object, "active");
 
+	object = G_OBJECT (ACTION (MEMO_VIEW_VERTICAL));
+	key = "/apps/evolution/calendar/display/memo_layout";
+	gconf_bridge_bind_property (bridge, key, object, "current-value");
+
 	/* Fine tuning. */
 
 	action = ACTION (MEMO_DELETE);
diff --git a/modules/calendar/e-memo-shell-view-actions.h b/modules/calendar/e-memo-shell-view-actions.h
index d6fd3ca..d43d023 100644
--- a/modules/calendar/e-memo-shell-view-actions.h
+++ b/modules/calendar/e-memo-shell-view-actions.h
@@ -47,6 +47,10 @@
 	E_SHELL_WINDOW_ACTION ((window), "memo-print")
 #define E_SHELL_WINDOW_ACTION_MEMO_SAVE_AS(window) \
 	E_SHELL_WINDOW_ACTION ((window), "memo-save-as")
+#define E_SHELL_WINDOW_ACTION_MEMO_VIEW_CLASSIC(window) \
+	E_SHELL_WINDOW_ACTION ((window), "memo-view-classic")
+#define E_SHELL_WINDOW_ACTION_MEMO_VIEW_VERTICAL(window) \
+	E_SHELL_WINDOW_ACTION ((window), "memo-view-vertical")
 
 /* Memo List Actions */
 #define E_SHELL_WINDOW_ACTION_MEMO_LIST_COPY(window) \
diff --git a/modules/calendar/e-task-shell-content.c b/modules/calendar/e-task-shell-content.c
index c133372..a095003 100644
--- a/modules/calendar/e-task-shell-content.c
+++ b/modules/calendar/e-task-shell-content.c
@@ -25,13 +25,13 @@
 
 #include "e-util/e-binding.h"
 #include "e-util/gconf-bridge.h"
+#include "widgets/menus/gal-view-etable.h"
+#include "widgets/misc/e-paned.h"
 
 #include "calendar/gui/comp-util.h"
 #include "calendar/gui/e-cal-model-tasks.h"
 #include "calendar/gui/e-calendar-table.h"
 
-#include "widgets/menus/gal-view-etable.h"
-
 #define E_TASK_SHELL_CONTENT_GET_PRIVATE(obj) \
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), E_TYPE_TASK_SHELL_CONTENT, ETaskShellContentPrivate))
@@ -53,13 +53,17 @@ struct _ETaskShellContentPrivate {
 
 	ECalModel *task_model;
 	GalViewInstance *view_instance;
+	GtkOrientation orientation;
 
 	gchar *current_uid;
+
+	guint preview_visible	: 1;
 };
 
 enum {
 	PROP_0,
 	PROP_MODEL,
+	PROP_ORIENTATION,
 	PROP_PREVIEW_VISIBLE
 };
 
@@ -258,6 +262,21 @@ task_shell_content_model_row_changed_cb (ETaskShellContent *task_shell_content,
 	task_shell_content_cursor_change_cb (task_shell_content, 0, table);
 }
 
+static GtkOrientation
+task_shell_content_get_orientation (ETaskShellContent *task_shell_content)
+{
+	return task_shell_content->priv->orientation;
+}
+
+static void
+task_shell_content_set_orientation (ETaskShellContent *task_shell_content,
+                                    GtkOrientation orientation)
+{
+	task_shell_content->priv->orientation = orientation;
+
+	g_object_notify (G_OBJECT (task_shell_content), "orientation");
+}
+
 static void
 task_shell_content_set_property (GObject *object,
                                  guint property_id,
@@ -265,6 +284,12 @@ task_shell_content_set_property (GObject *object,
                                  GParamSpec *pspec)
 {
 	switch (property_id) {
+		case PROP_ORIENTATION:
+			task_shell_content_set_orientation (
+				E_TASK_SHELL_CONTENT (object),
+				g_value_get_enum (value));
+			return;
+
 		case PROP_PREVIEW_VISIBLE:
 			e_task_shell_content_set_preview_visible (
 				E_TASK_SHELL_CONTENT (object),
@@ -284,13 +309,22 @@ task_shell_content_get_property (GObject *object,
 	switch (property_id) {
 		case PROP_MODEL:
 			g_value_set_object (
-				value, e_task_shell_content_get_task_model (
+				value,
+				e_task_shell_content_get_task_model (
+				E_TASK_SHELL_CONTENT (object)));
+			return;
+
+		case PROP_ORIENTATION:
+			g_value_set_enum (
+				value,
+				task_shell_content_get_orientation (
 				E_TASK_SHELL_CONTENT (object)));
 			return;
 
 		case PROP_PREVIEW_VISIBLE:
 			g_value_set_boolean (
-				value, e_task_shell_content_get_preview_visible (
+				value,
+				e_task_shell_content_get_preview_visible (
 				E_TASK_SHELL_CONTENT (object)));
 			return;
 	}
@@ -384,11 +418,15 @@ task_shell_content_constructed (GObject *object)
 
 	container = GTK_WIDGET (object);
 
-	widget = gtk_vpaned_new ();
+	widget = e_paned_new (GTK_ORIENTATION_VERTICAL);
 	gtk_container_add (GTK_CONTAINER (container), widget);
 	priv->paned = g_object_ref (widget);
 	gtk_widget_show (widget);
 
+	e_binding_new (
+		G_OBJECT (object), "orientation",
+		G_OBJECT (widget), "orientation");
+
 	container = widget;
 
 	widget = e_calendar_table_new (shell_view, priv->task_model);
@@ -405,6 +443,10 @@ task_shell_content_constructed (GObject *object)
 	gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE);
 	gtk_widget_show (widget);
 
+	e_binding_new (
+		G_OBJECT (object), "preview-visible",
+		G_OBJECT (widget), "visible");
+
 	container = widget;
 
 	widget = e_cal_component_preview_new ();
@@ -466,8 +508,12 @@ task_shell_content_constructed (GObject *object)
 	bridge = gconf_bridge_get ();
 
 	object = G_OBJECT (priv->paned);
+	key = "/apps/evolution/calendar/display/task_hpane_position";
+	gconf_bridge_bind_property_delayed (bridge, key, object, "hposition");
+
+	object = G_OBJECT (priv->paned);
 	key = "/apps/evolution/calendar/display/task_vpane_position";
-	gconf_bridge_bind_property_delayed (bridge, key, object, "position");
+	gconf_bridge_bind_property_delayed (bridge, key, object, "vposition");
 }
 
 static guint32
@@ -577,7 +623,11 @@ task_shell_content_class_init (ETaskShellContentClass *class)
 			_("Preview is Visible"),
 			_("Whether the preview pane is visible"),
 			TRUE,
-			G_PARAM_READWRITE));
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	g_object_class_override_property (
+		object_class, PROP_ORIENTATION, "orientation");
 }
 
 static void
@@ -611,9 +661,19 @@ e_task_shell_content_register_type (GTypeModule *type_module)
 		NULL   /* value_table */
 	};
 
+	static const GInterfaceInfo orientable_info = {
+		(GInterfaceInitFunc) NULL,
+		(GInterfaceFinalizeFunc) NULL,
+		NULL  /* interface_data */
+	};
+
 	task_shell_content_type = g_type_module_register_type (
 		type_module, E_TYPE_SHELL_CONTENT,
 		"ETaskShellContent", &type_info, 0);
+
+	g_type_module_add_interface (
+		type_module, task_shell_content_type,
+		GTK_TYPE_ORIENTABLE, &orientable_info);
 }
 
 GtkWidget *
@@ -654,46 +714,31 @@ e_task_shell_content_get_task_table (ETaskShellContent *task_shell_content)
 	return E_CALENDAR_TABLE (task_shell_content->priv->task_table);
 }
 
-GalViewInstance *
-e_task_shell_content_get_view_instance (ETaskShellContent *task_shell_content)
-{
-	g_return_val_if_fail (
-		E_IS_TASK_SHELL_CONTENT (task_shell_content), NULL);
-
-	return task_shell_content->priv->view_instance;
-}
-
 gboolean
 e_task_shell_content_get_preview_visible (ETaskShellContent *task_shell_content)
 {
-	GtkPaned *paned;
-	GtkWidget *child;
-
 	g_return_val_if_fail (
 		E_IS_TASK_SHELL_CONTENT (task_shell_content), FALSE);
 
-	paned = GTK_PANED (task_shell_content->priv->paned);
-	child = gtk_paned_get_child2 (paned);
-
-	return GTK_WIDGET_VISIBLE (child);
+	return task_shell_content->priv->preview_visible;
 }
 
 void
 e_task_shell_content_set_preview_visible (ETaskShellContent *task_shell_content,
                                           gboolean preview_visible)
 {
-	GtkPaned *paned;
-	GtkWidget *child;
-
 	g_return_if_fail (E_IS_TASK_SHELL_CONTENT (task_shell_content));
 
-	paned = GTK_PANED (task_shell_content->priv->paned);
-	child = gtk_paned_get_child2 (paned);
-
-	if (preview_visible)
-		gtk_widget_show (child);
-	else
-		gtk_widget_hide (child);
+	task_shell_content->priv->preview_visible = preview_visible;
 
 	g_object_notify (G_OBJECT (task_shell_content), "preview-visible");
 }
+
+GalViewInstance *
+e_task_shell_content_get_view_instance (ETaskShellContent *task_shell_content)
+{
+	g_return_val_if_fail (
+		E_IS_TASK_SHELL_CONTENT (task_shell_content), NULL);
+
+	return task_shell_content->priv->view_instance;
+}
diff --git a/modules/calendar/e-task-shell-content.h b/modules/calendar/e-task-shell-content.h
index 7e0b212..f5d4fc9 100644
--- a/modules/calendar/e-task-shell-content.h
+++ b/modules/calendar/e-task-shell-content.h
@@ -86,14 +86,14 @@ ECalComponentPreview *
 					(ETaskShellContent *task_shell_content);
 ECalendarTable *e_task_shell_content_get_task_table
 					(ETaskShellContent *task_shell_content);
-GalViewInstance *
-		e_task_shell_content_get_view_instance
-					(ETaskShellContent *task_shell_content);
 gboolean	e_task_shell_content_get_preview_visible
 					(ETaskShellContent *task_shell_content);
 void		e_task_shell_content_set_preview_visible
 					(ETaskShellContent *task_shell_content,
 					 gboolean preview_visible);
+GalViewInstance *
+		e_task_shell_content_get_view_instance
+					(ETaskShellContent *task_shell_content);
 
 G_END_DECLS
 
diff --git a/modules/calendar/e-task-shell-view-actions.c b/modules/calendar/e-task-shell-view-actions.c
index d135402..d4fb94c 100644
--- a/modules/calendar/e-task-shell-view-actions.c
+++ b/modules/calendar/e-task-shell-view-actions.c
@@ -675,6 +675,32 @@ action_task_search_cb (GtkRadioAction *action,
 	e_shell_content_set_search_hint (shell_content, search_hint);
 }
 
+static void
+action_task_view_cb (GtkRadioAction *action,
+                     GtkRadioAction *current,
+                     ETaskShellView *task_shell_view)
+{
+	ETaskShellContent *task_shell_content;
+	GtkOrientable *orientable;
+	GtkOrientation orientation;
+
+	task_shell_content = task_shell_view->priv->task_shell_content;
+	orientable = GTK_ORIENTABLE (task_shell_content);
+
+	switch (gtk_radio_action_get_current_value (action)) {
+		case 0:
+			orientation = GTK_ORIENTATION_VERTICAL;
+			break;
+		case 1:
+			orientation = GTK_ORIENTATION_HORIZONTAL;
+			break;
+		default:
+			g_return_if_reached ();
+	}
+
+	gtk_orientable_set_orientation (orientable, orientation);
+}
+
 static GtkActionEntry task_entries[] = {
 
 	{ "task-assign",
@@ -817,6 +843,13 @@ static GtkActionEntry task_entries[] = {
 	  N_("_Actions"),
 	  NULL,
 	  NULL,
+	  NULL },
+
+	{ "task-preview-menu",
+	  NULL,
+	  N_("_Preview"),
+	  NULL,
+	  NULL,
 	  NULL }
 };
 
@@ -898,6 +931,33 @@ static GtkToggleActionEntry task_toggle_entries[] = {
 	  TRUE }
 };
 
+static GtkRadioActionEntry task_view_entries[] = {
+
+	/* This action represents the inital active memo view.
+	 * It should not be visible in the UI, nor should it be
+	 * possible to switch to it from another shell view. */
+	{ "task-view-initial",
+	  NULL,
+	  NULL,
+	  NULL,
+	  NULL,
+	  -1 },
+
+	{ "task-view-classic",
+	  NULL,
+	  N_("_Classic View"),
+	  NULL,
+	  N_("Show task preview below the task list"),
+	  0 },
+
+	{ "task-view-vertical",
+	  NULL,
+	  N_("_Vertical View"),
+	  NULL,
+	  N_("Show task preview alongside the task list"),
+	  1 }
+};
+
 static GtkRadioActionEntry task_filter_entries[] = {
 
 	{ "task-filter-active-tasks",
@@ -1031,6 +1091,10 @@ e_task_shell_view_actions_init (ETaskShellView *task_shell_view)
 		action_group, task_toggle_entries,
 		G_N_ELEMENTS (task_toggle_entries), task_shell_view);
 	gtk_action_group_add_radio_actions (
+		action_group, task_view_entries,
+		G_N_ELEMENTS (task_view_entries), -1,
+		G_CALLBACK (action_task_view_cb), task_shell_view);
+	gtk_action_group_add_radio_actions (
 		action_group, task_search_entries,
 		G_N_ELEMENTS (task_search_entries),
 		TASK_SEARCH_SUMMARY_CONTAINS,
@@ -1053,6 +1117,10 @@ e_task_shell_view_actions_init (ETaskShellView *task_shell_view)
 	key = "/apps/evolution/calendar/display/show_task_preview";
 	gconf_bridge_bind_property (bridge, key, object, "active");
 
+	object = G_OBJECT (ACTION (TASK_VIEW_VERTICAL));
+	key = "/apps/evolution/calendar/display/task_layout";
+	gconf_bridge_bind_property (bridge, key, object, "current-value");
+
 	/* Fine tuning. */
 
 	action = ACTION (TASK_DELETE);
diff --git a/modules/calendar/e-task-shell-view-actions.h b/modules/calendar/e-task-shell-view-actions.h
index d7db39b..daa70c3 100644
--- a/modules/calendar/e-task-shell-view-actions.h
+++ b/modules/calendar/e-task-shell-view-actions.h
@@ -55,6 +55,10 @@
 	E_SHELL_WINDOW_ACTION ((window), "task-purge")
 #define E_SHELL_WINDOW_ACTION_TASK_SAVE_AS(window) \
 	E_SHELL_WINDOW_ACTION ((window), "task-save-as")
+#define E_SHELL_WINDOW_ACTION_TASK_VIEW_CLASSIC(window) \
+	E_SHELL_WINDOW_ACTION ((window), "task-view-classic")
+#define E_SHELL_WINDOW_ACTION_TASK_VIEW_VERTICAL(window) \
+	E_SHELL_WINDOW_ACTION ((window), "task-view-vertical")
 
 /* Task List Actions */
 #define E_SHELL_WINDOW_ACTION_TASK_LIST_COPY(window) \
diff --git a/modules/mail/e-mail-shell-content.c b/modules/mail/e-mail-shell-content.c
index 9bea68f..3a4f5ae 100644
--- a/modules/mail/e-mail-shell-content.c
+++ b/modules/mail/e-mail-shell-content.c
@@ -463,6 +463,10 @@ mail_shell_content_constructed (GObject *object)
 	gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE);
 	gtk_widget_show (widget);
 
+	e_binding_new (
+		G_OBJECT (object), "preview-visible",
+		G_OBJECT (widget), "visible");
+
 	container = widget;
 
 	widget = gtk_scrolled_window_new (NULL, NULL);
@@ -783,22 +787,11 @@ void
 e_mail_shell_content_set_preview_visible (EMailShellContent *mail_shell_content,
                                           gboolean preview_visible)
 {
-	GtkPaned *paned;
-	GtkWidget *child;
-
 	g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content));
 
 	if (preview_visible == mail_shell_content->priv->preview_visible)
 		return;
 
-	paned = GTK_PANED (mail_shell_content->priv->paned);
-	child = gtk_paned_get_child2 (paned);
-
-	if (preview_visible)
-		gtk_widget_show (child);
-	else
-		gtk_widget_hide (child);
-
 	/* If we're showing the preview, tell EMailReader to reload the
 	 * selected message.  This should force it to download the full
 	 * message if necessary, so we don't get an empty preview. */
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 22bd863..08a8d12 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -1322,7 +1322,7 @@ static GtkRadioActionEntry mail_view_entries[] = {
 	/* This action represents the initial active mail view.
 	 * It should not be visible in the UI, nor should it be
 	 * possible to switch to it from another shell view. */
-	{ "mail-view-internal",
+	{ "mail-view-initial",
 	  NULL,
 	  NULL,
 	  NULL,
diff --git a/ui/evolution-memos.ui b/ui/evolution-memos.ui
index 28abc7e..f4d4129 100644
--- a/ui/evolution-memos.ui
+++ b/ui/evolution-memos.ui
@@ -19,7 +19,14 @@
       </placeholder>
     </menu>
     <menu action='view-menu'>
-      <menuitem action='memo-preview'/>
+      <placeholder name='view-custom-menus'>
+        <menu action='memo-preview-menu'>
+          <menuitem action='memo-preview'/>
+          <separator/>
+          <menuitem action='memo-view-classic'/>
+          <menuitem action='memo-view-vertical'/>
+        </menu>
+      </placeholder>
     </menu>
   </menubar>
   <toolbar name='main-toolbar'>
diff --git a/ui/evolution-tasks.ui b/ui/evolution-tasks.ui
index 073f7d4..e8d6f76 100644
--- a/ui/evolution-tasks.ui
+++ b/ui/evolution-tasks.ui
@@ -22,7 +22,14 @@
       </placeholder>
     </menu>
     <menu action='view-menu'>
-      <menuitem action='task-preview'/>
+      <placeholder name='view-custom-menus'>
+        <menu action='task-preview-menu'>
+          <menuitem action='task-preview'/>
+          <separator/>
+          <menuitem action='task-view-classic'/>
+          <menuitem action='task-view-vertical'/>
+        </menu>
+      </placeholder>
     </menu>
     <placeholder name='custom-menus'>
       <menu action='task-actions-menu'>
diff --git a/widgets/misc/e-paned.c b/widgets/misc/e-paned.c
index 3500424..2c8a182 100644
--- a/widgets/misc/e-paned.c
+++ b/widgets/misc/e-paned.c
@@ -47,6 +47,7 @@ static gpointer parent_class;
 static void
 paned_notify_orientation_cb (EPaned *paned)
 {
+	/* Ignore the next "notify::position" emission. */
 	paned->priv->sync_position = TRUE;
 	gtk_widget_queue_resize (GTK_WIDGET (paned));
 



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