Index: src/nautilus-navigation-window.c
===================================================================
--- src/nautilus-navigation-window.c	(revision 14227)
+++ src/nautilus-navigation-window.c	(working copy)
@@ -64,6 +64,7 @@
 #include <libnautilus-private/nautilus-file-attributes.h>
 #include <libnautilus-private/nautilus-global-preferences.h>
 #include <libnautilus-private/nautilus-horizontal-splitter.h>
+#include <libnautilus-private/nautilus-vertical-splitter.h>
 #include <libnautilus-private/nautilus-icon-info.h>
 #include <libnautilus-private/nautilus-metadata.h>
 #include <libnautilus-private/nautilus-mime-actions.h>
@@ -104,7 +105,8 @@ enum {
 
 static int side_pane_width_auto_value = 0;
 
-static void add_sidebar_panels                       (NautilusNavigationWindow *window);
+static void add_sidebar_panels                       (NautilusNavigationWindow *window, NautilusSidePanelInstance *sidebaritem);
+static NautilusSidePanelInstance * get_sidepanelinstance_for_sidebar(NautilusNavigationWindow *window, NautilusSidebar *side_panel);
 static void load_view_as_menu                        (NautilusWindow           *window);
 static void side_panel_image_changed_callback        (NautilusSidebar          *side_panel,
 						      gpointer                  callback_data);
@@ -501,6 +503,13 @@ side_pane_close_requested_callback (GtkW
 }
 
 static void
+side_pane_minimize_bottom_requested_callback (GtkWidget *widget,
+				    gpointer user_data)
+{
+	nautilus_vertical_splitter_collapse(NAUTILUS_VERTICAL_SPLITTER (user_data));
+}
+
+static void
 side_pane_size_allocate_callback (GtkWidget *widget,
 				  GtkAllocation *allocation,
 				  gpointer user_data)
@@ -524,7 +533,7 @@ setup_side_pane_width (NautilusNavigatio
 {
 	static gboolean setup_auto_value= TRUE;
 
-	g_return_if_fail (window->sidebar != NULL);
+	g_return_if_fail (window->sidepanelinstances != NULL);
 	
 	if (setup_auto_value) {
 		setup_auto_value = FALSE;
@@ -559,12 +568,135 @@ set_current_side_panel (NautilusNavigati
 	eel_add_weak_pointer (&window->details->current_side_panel);
 }
 
+/**
+ * Find a the sidepanel instance associated with the given sidebar
+ */
+static NautilusSidePanelInstance *
+get_sidepanelinstance_for_sidebar(NautilusNavigationWindow *window, NautilusSidebar *side_panel)
+{
+	NautilusSidePanelInstance *sidepanelinstance;
+	GList *node, *next;
+
+	for (node = window->sidepanelinstances; node != NULL; node = next) {
+		next = node->next;
+
+		sidepanelinstance = NAUTILUS_SIDEPANEL_INSTANCE (node->data);
+
+		if (g_list_index (sidepanelinstance->sidebar_panels, side_panel) != -1) {
+			return sidepanelinstance;
+		}
+    }
+	
+	return NULL;
+}
+
+/**
+ * Save the sidebar id of each sidepanelinstance which is loaded, in order. These may later be read by index
+ * to determine the preferred sidebar id of a given sidepanelinstance.
+ */
+static void
+side_pane_view_preferences_save(NautilusNavigationWindow *window, NautilusSidebar *set_current_sidebar)
+{
+	NautilusSidePanelInstance *sidepanelinstance;
+	NautilusSidePanelInstance *sidebar_sidepanelinstance;
+	char **ids;
+	GPtrArray *new_ids;
+	int index, current_id_index, change_index;
+	char *sidebar_id;
+	GList *node, *next;
+	
+	g_return_if_fail (window->sidepanelinstances != NULL);
+	
+	new_ids = g_ptr_array_new ();
+	ids = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_SIDE_PANE_VIEWS);
+	sidebar_sidepanelinstance = get_sidepanelinstance_for_sidebar(window, set_current_sidebar);
+	change_index = g_list_index(window->sidepanelinstances, sidebar_sidepanelinstance);
+	sidebar_id = g_strdup (nautilus_sidebar_get_sidebar_id (set_current_sidebar));
+	
+	// Now loop through the list of sidepanel instances and set something on each one
+	current_id_index = 0;
+	for (node = window->sidepanelinstances, index = 0; node != NULL; node = next, index++) {
+		next = node->next;
+		sidepanelinstance = NAUTILUS_SIDEPANEL_INSTANCE (node->data);
+
+		if (index == change_index && sidebar_id) {
+			g_ptr_array_add (new_ids, sidebar_id);
+		}
+		else if (ids && ids[current_id_index]) {
+			g_ptr_array_add (new_ids, ids[current_id_index]);
+		}
+		else {
+			g_ptr_array_add (new_ids, "");
+		}
+		if (ids && ids[current_id_index]) {
+			current_id_index++;
+		}
+    }
+    // Add a NULL element as a terminator
+	g_ptr_array_add (new_ids, NULL);
+	
+	eel_preferences_set_string_array (NAUTILUS_PREFERENCES_SIDE_PANE_VIEWS, (char **)new_ids->pdata);
+	g_ptr_array_free (new_ids, TRUE);
+	if (ids) {
+		g_strfreev (ids);
+	}
+	g_free (sidebar_id);
+}
+
+static char *
+get_side_pane_default_id(NautilusNavigationWindow *window, NautilusSidePanelInstance *sidepanelinstance)
+{
+	char **ids;
+	int desired_index, current_id_index;
+	char *default_id;
+	
+	default_id = NULL;
+	
+	if (window->sidepanelinstances == NULL)
+		return NULL;
+	
+	desired_index = g_list_index(window->sidepanelinstances, sidepanelinstance);
+	
+	if (desired_index == -1)
+		return NULL;
+	
+	ids = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_SIDE_PANE_VIEWS);
+	if (ids) {
+		// Loop through the ids until either the one matching the desired index is found, or the NULL terminator is hit
+		for (current_id_index = 0; current_id_index <= desired_index && ids[current_id_index]; current_id_index++) {
+			if (current_id_index == desired_index) {
+				default_id = g_strdup (ids[desired_index]);
+			}
+		}
+		g_strfreev (ids);
+	}
+	return default_id;
+}
+
+static void
+show_side_pane_if_default(
+	NautilusNavigationWindow *window, 
+	NautilusSidePanelInstance *sidepanelinstance, 
+	NautilusSidebar *sidebar_panel, 
+	const char *default_id)
+{
+	const char *sidebar_id;
+	
+	g_return_if_fail (window->sidepanelinstances != NULL);
+	
+	sidebar_id = nautilus_sidebar_get_sidebar_id (sidebar_panel);
+	
+	// Finally, show the panel, if it matches the given sidebar's id
+	if (sidebar_id && default_id && !strcmp (sidebar_id, default_id)) {
+		nautilus_side_pane_show_panel (sidepanelinstance->sidepane, GTK_WIDGET (sidebar_panel));
+	}
+}
+
 static void
 side_pane_switch_page_callback (NautilusSidePane *side_pane,
 				GtkWidget *widget,
 				NautilusNavigationWindow *window)
 {
-	const char *id;
 	NautilusSidebar *sidebar;
 
 	sidebar = NAUTILUS_SIDEBAR (widget);
@@ -572,66 +704,121 @@ side_pane_switch_page_callback (Nautilus
 	if (sidebar == NULL) {
 		return;
 	}
-		
+	
 	set_current_side_panel (window, sidebar);
-
-	id = nautilus_sidebar_get_sidebar_id (sidebar);
-	if (eel_preferences_key_is_writable (NAUTILUS_PREFERENCES_SIDE_PANE_VIEW)) {
-		eel_preferences_set (NAUTILUS_PREFERENCES_SIDE_PANE_VIEW, id);
-	}
+	side_pane_view_preferences_save(window, sidebar);
 }
 
 static void
 nautilus_navigation_window_set_up_sidebar (NautilusNavigationWindow *window)
 {
-	window->sidebar = nautilus_side_pane_new ();
-
-	gtk_paned_pack1 (GTK_PANED (window->details->content_paned),
-			 GTK_WIDGET (window->sidebar),
-			 FALSE, TRUE);
-
+	NautilusSidePanelInstance *top_sidepanelinstance;
+	NautilusSidePanelInstance *bottom_sidepanelinstance;
+	GtkWidget *vpaned;
+	
+	g_return_if_fail (window->sidepanelinstances == NULL);	
+	
+	top_sidepanelinstance = nautilus_sidepanel_instance_new ();
+	top_sidepanelinstance->sidepane = nautilus_side_pane_new ();
+	bottom_sidepanelinstance = nautilus_sidepanel_instance_new ();
+	bottom_sidepanelinstance->sidepane = nautilus_side_pane_new ();
+	
+	window->sidepanelinstances = g_list_append (window->sidepanelinstances, g_object_ref (top_sidepanelinstance));
+	window->sidepanelinstances = g_list_append (window->sidepanelinstances, g_object_ref (bottom_sidepanelinstance));
+
+	// Add the vpaned to manage the split top/bottom panels
+	vpaned = nautilus_vertical_splitter_new ();
+	top_sidepanelinstance->nextcontainer = vpaned;
+
+	nautilus_vertical_splitter_pack1 (NAUTILUS_VERTICAL_SPLITTER (vpaned), GTK_WIDGET (top_sidepanelinstance->sidepane));
+	nautilus_vertical_splitter_pack2 (NAUTILUS_VERTICAL_SPLITTER (vpaned), GTK_WIDGET (bottom_sidepanelinstance->sidepane));
+	nautilus_vertical_splitter_position_preference_name(NAUTILUS_VERTICAL_SPLITTER (vpaned), NAUTILUS_PREFERENCES_SIDE_PANE_POSITIONS, TRUE);
+	nautilus_vertical_splitter_set_toggle_up(NAUTILUS_VERTICAL_SPLITTER (vpaned), FALSE);
+	gtk_widget_show (vpaned);
+	
+	// Add the sidebar splitter to the content pane
+	gtk_paned_pack1 (GTK_PANED (window->details->content_paned), GTK_WIDGET (vpaned), FALSE, TRUE);
+	
 	setup_side_pane_width (window);
-	g_signal_connect (window->sidebar, 
+	
+	// Init top bar
+	g_signal_connect (top_sidepanelinstance->sidepane, 
 			  "size_allocate",
 			  G_CALLBACK (side_pane_size_allocate_callback),
 			  window);
 	
-	add_sidebar_panels (window);
+	add_sidebar_panels (window, top_sidepanelinstance);
 
-	g_signal_connect (window->sidebar,
+	g_signal_connect (top_sidepanelinstance->sidepane,
 			  "close_requested",
 			  G_CALLBACK (side_pane_close_requested_callback),
 			  window);
 
-	g_signal_connect (window->sidebar,
+	g_signal_connect (top_sidepanelinstance->sidepane,
+			  "switch_page",
+			  G_CALLBACK (side_pane_switch_page_callback),
+			  window);
+	
+	gtk_widget_show (GTK_WIDGET (top_sidepanelinstance->sidepane));
+	
+	// Init bottom bar
+	
+	add_sidebar_panels (window, bottom_sidepanelinstance);
+
+	g_signal_connect (bottom_sidepanelinstance->sidepane,
+			  "close_requested",
+			  G_CALLBACK (side_pane_minimize_bottom_requested_callback),
+			  vpaned);
+
+	g_signal_connect (bottom_sidepanelinstance->sidepane,
 			  "switch_page",
 			  G_CALLBACK (side_pane_switch_page_callback),
 			  window);
 	
-	gtk_widget_show (GTK_WIDGET (window->sidebar));
+	gtk_widget_show (GTK_WIDGET (bottom_sidepanelinstance->sidepane));
 }
 
 static void
-nautilus_navigation_window_tear_down_sidebar (NautilusNavigationWindow *window)
+nautilus_navigation_window_tear_down_sidepanelinstance (NautilusSidePanelInstance *sidepanelinstance, NautilusNavigationWindow *window)
 {
 	GList *node, *next;
 	NautilusSidebar *sidebar_panel;
 	
-	g_signal_handlers_disconnect_by_func (window->sidebar,
+	g_return_if_fail (sidepanelinstance != NULL);	
+	
+	g_signal_handlers_disconnect_by_func (sidepanelinstance->sidepane,
 					      side_pane_switch_page_callback,
 					      window);
 
-	for (node = window->sidebar_panels; node != NULL; node = next) {
+	for (node = sidepanelinstance->sidebar_panels; node != NULL; node = next) {
 		next = node->next;
 
 		sidebar_panel = NAUTILUS_SIDEBAR (node->data);
 		
 		nautilus_navigation_window_remove_sidebar_panel (window,
+								 sidepanelinstance,
 								 sidebar_panel);
         }
 
-	gtk_widget_destroy (GTK_WIDGET (window->sidebar));
-	window->sidebar = NULL;
+	gtk_widget_destroy (GTK_WIDGET (sidepanelinstance->sidepane));
+	// Destroy the container used for grouping a set of panel instances, if defined. The last instance won't have one of these
+	if (sidepanelinstance->nextcontainer != NULL) {
+		gtk_widget_destroy (GTK_WIDGET (sidepanelinstance->nextcontainer));
+	}
+	
+	sidepanelinstance->sidepane = NULL;
+	g_object_unref (sidepanelinstance);
+}
+
+static void
+nautilus_navigation_window_tear_down_sidebar (NautilusNavigationWindow *window)
+{
+	if (window->sidepanelinstances != NULL) {
+		// Tear down the instances in reverse order to handle the nextcontainer tree
+		g_list_foreach (g_list_reverse (window->sidepanelinstances), (GFunc)nautilus_navigation_window_tear_down_sidepanelinstance, window);
+		g_list_free (window->sidepanelinstances);
+		window->sidepanelinstances = NULL;
+	}
 }
 
 static void
@@ -697,10 +884,9 @@ nautilus_navigation_window_destroy (GtkO
 	
 	window = NAUTILUS_NAVIGATION_WINDOW (object);
 
-	window->sidebar = NULL;
-	g_list_foreach (window->sidebar_panels, (GFunc)g_object_unref, NULL);
-	g_list_free (window->sidebar_panels);
-	window->sidebar_panels = NULL;
+	if (window->sidepanelinstances != NULL) {
+		nautilus_navigation_window_tear_down_sidebar(window);
+	}
 
 	window->view_as_combo_box = NULL;
 	window->navigation_bar = NULL;
@@ -729,25 +915,24 @@ nautilus_navigation_window_finalize (GOb
 /*
  * Main API
  */
-
 void
 nautilus_navigation_window_add_sidebar_panel (NautilusNavigationWindow *window,
-					      NautilusSidebar *sidebar_panel)
+                          NautilusSidePanelInstance *sidepanelinstance,
+					      NautilusSidebar *sidebar_panel,
+					      const char *default_sidebar_id)
 {
-	const char *sidebar_id;
 	char *label;
 	char *tooltip;
-	char *default_id;
 	GdkPixbuf *icon;
 
 	g_return_if_fail (NAUTILUS_IS_NAVIGATION_WINDOW (window));
 	g_return_if_fail (NAUTILUS_IS_SIDEBAR (sidebar_panel));
-	g_return_if_fail (NAUTILUS_IS_SIDE_PANE (window->sidebar));
-	g_return_if_fail (g_list_find (window->sidebar_panels, sidebar_panel) == NULL);	
+	g_return_if_fail (NAUTILUS_IS_SIDE_PANE (sidepanelinstance->sidepane));
+	g_return_if_fail (g_list_find (sidepanelinstance->sidebar_panels, sidebar_panel) == NULL);	
 
 	label = nautilus_sidebar_get_tab_label (sidebar_panel);
 	tooltip = nautilus_sidebar_get_tab_tooltip (sidebar_panel);
-	nautilus_side_pane_add_panel (window->sidebar, 
+	nautilus_side_pane_add_panel (sidepanelinstance->sidepane, 
 				      GTK_WIDGET (sidebar_panel), 
 				      label,
 				      tooltip);
@@ -755,7 +940,7 @@ nautilus_navigation_window_add_sidebar_p
 	g_free (label);
 
 	icon = nautilus_sidebar_get_tab_icon (sidebar_panel);
-	nautilus_side_pane_set_panel_image (NAUTILUS_NAVIGATION_WINDOW (window)->sidebar,
+	nautilus_side_pane_set_panel_image (sidepanelinstance->sidepane,
 					    GTK_WIDGET (sidebar_panel),
 					    icon);
 	if (icon) {
@@ -765,35 +950,30 @@ nautilus_navigation_window_add_sidebar_p
 	g_signal_connect (sidebar_panel, "tab_icon_changed",
 			  (GCallback)side_panel_image_changed_callback, window);
 
-	window->sidebar_panels = g_list_prepend (window->sidebar_panels,
+	sidepanelinstance->sidebar_panels = g_list_prepend (sidepanelinstance->sidebar_panels,
 						 g_object_ref (sidebar_panel));
 
 	/* Show if default */
-	sidebar_id = nautilus_sidebar_get_sidebar_id (sidebar_panel);
-	default_id = eel_preferences_get (NAUTILUS_PREFERENCES_SIDE_PANE_VIEW);
-	if (sidebar_id && default_id && !strcmp (sidebar_id, default_id)) {
-		nautilus_side_pane_show_panel (window->sidebar,
-					       GTK_WIDGET (sidebar_panel));
-	}	
-	g_free (default_id);
+	show_side_pane_if_default(window, sidepanelinstance, sidebar_panel, default_sidebar_id);
 }
 
 void
 nautilus_navigation_window_remove_sidebar_panel (NautilusNavigationWindow *window,
+                         NautilusSidePanelInstance *sidepanelinstance,
 						 NautilusSidebar *sidebar_panel)
 {
 	g_return_if_fail (NAUTILUS_IS_NAVIGATION_WINDOW (window));
 	g_return_if_fail (NAUTILUS_IS_SIDEBAR (sidebar_panel));
 
-	if (g_list_find (window->sidebar_panels, sidebar_panel) == NULL) {
+	if (g_list_find (sidepanelinstance->sidebar_panels, sidebar_panel) == NULL) {
 		return;
 	}
 
 	g_signal_handlers_disconnect_by_func (sidebar_panel, side_panel_image_changed_callback, window);
 	
-	nautilus_side_pane_remove_panel (window->sidebar, 
+	nautilus_side_pane_remove_panel (sidepanelinstance->sidepane, 
 					 GTK_WIDGET (sidebar_panel));
-	window->sidebar_panels = g_list_remove (window->sidebar_panels, sidebar_panel);
+	sidepanelinstance->sidebar_panels = g_list_remove (sidepanelinstance->sidebar_panels, sidebar_panel);
 	g_object_unref (sidebar_panel);
 }
 
@@ -1208,15 +1388,22 @@ static void
 side_panel_image_changed_callback (NautilusSidebar *side_panel,
                                    gpointer callback_data)
 {
-        NautilusWindow *window;
+    	NautilusWindow *window;
 	GdkPixbuf *icon;
 
-        window = NAUTILUS_WINDOW (callback_data);
+    	window = NAUTILUS_WINDOW (callback_data);
 
 	icon = nautilus_sidebar_get_tab_icon (side_panel);
-        nautilus_side_pane_set_panel_image (NAUTILUS_NAVIGATION_WINDOW (window)->sidebar,
+	
+	NautilusSidePanelInstance *sidepanelinstance;
+	sidepanelinstance = get_sidepanelinstance_for_sidebar (NAUTILUS_NAVIGATION_WINDOW (window), side_panel);
+	
+	if (sidepanelinstance != NULL) {
+    	nautilus_side_pane_set_panel_image (sidepanelinstance->sidepane,
                                             GTK_WIDGET (side_panel),
                                             icon);
+	}
+	                             
 	if (icon != NULL) {
 		g_object_unref (icon);
 	}
@@ -1230,20 +1417,22 @@ side_panel_image_changed_callback (Nauti
  *
  */
 static void
-add_sidebar_panels (NautilusNavigationWindow *window)
+add_sidebar_panels (NautilusNavigationWindow *window, NautilusSidePanelInstance *sidepanelinstance)
 {
 	GtkWidget *current;
 	GList *providers;
 	GList *p;
 	NautilusSidebar *sidebar_panel;
+	char *default_id;
 
 	g_assert (NAUTILUS_IS_NAVIGATION_WINDOW (window));
 
-	if (window->sidebar == NULL) {
+	if (sidepanelinstance->sidepane == NULL) {
 		return;
 	}
 
  	providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_SIDEBAR_PROVIDER);
+	default_id = get_side_pane_default_id(window, sidepanelinstance);
 	
 	for (p = providers; p != NULL; p = p->next) {
 		NautilusSidebarProvider *provider;
@@ -1253,17 +1442,20 @@ add_sidebar_panels (NautilusNavigationWi
 		sidebar_panel = nautilus_sidebar_provider_create (provider,
 								  NAUTILUS_WINDOW_INFO (window));
 		nautilus_navigation_window_add_sidebar_panel (window,
-							      sidebar_panel);
+							      sidepanelinstance,
+							      sidebar_panel,
+							      default_id);
 		
 		g_object_unref (sidebar_panel);
 	}
 
 	nautilus_module_extension_list_free (providers);
-
-	current = nautilus_side_pane_get_current_panel (window->sidebar);
-	set_current_side_panel
-		(window, 
-		 NAUTILUS_SIDEBAR (current));
+	current = nautilus_side_pane_get_current_panel (sidepanelinstance->sidepane);
+	set_current_side_panel(window, NAUTILUS_SIDEBAR (current));
+	
+	if (default_id) {
+		g_free (default_id);
+	}
 }
 
 void 
@@ -1415,7 +1607,7 @@ nautilus_navigation_window_show_toolbar 
 void 
 nautilus_navigation_window_hide_sidebar (NautilusNavigationWindow *window)
 {
-	if (window->sidebar == NULL) {
+	if (window->sidepanelinstances == NULL) {
 		return;
 	}
 
@@ -1431,7 +1623,7 @@ nautilus_navigation_window_hide_sidebar 
 void 
 nautilus_navigation_window_show_sidebar (NautilusNavigationWindow *window)
 {
-	if (window->sidebar != NULL) {
+	if (window->sidepanelinstances != NULL) {
 		return;
 	}
 
@@ -1448,7 +1640,7 @@ nautilus_navigation_window_sidebar_showi
 {
 	g_return_val_if_fail (NAUTILUS_IS_NAVIGATION_WINDOW (window), FALSE);
 
-	return (window->sidebar != NULL)
+	return (window->sidepanelinstances != NULL)
 		&& nautilus_horizontal_splitter_is_hidden (NAUTILUS_HORIZONTAL_SPLITTER (window->details->content_paned));
 }
 
Index: src/nautilus-navigation-window.h
===================================================================
--- src/nautilus-navigation-window.h	(revision 14227)
+++ src/nautilus-navigation-window.h	(working copy)
@@ -39,6 +39,7 @@
 #include "nautilus-information-panel.h"
 #include "nautilus-side-pane.h"
 #include "nautilus-window.h"
+#include "nautilus-sidepanel-instance.h"
 
 #define NAUTILUS_TYPE_NAVIGATION_WINDOW              (nautilus_navigation_window_get_type())
 #define NAUTILUS_NAVIGATION_WINDOW(obj)	          (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_NAVIGATION_WINDOW, NautilusNavigationWindow))
@@ -56,7 +57,7 @@ struct _NautilusNavigationWindow {
         NautilusNavigationWindowDetails *details;
         
         /** UI stuff **/
-        NautilusSidePane *sidebar;
+        GList *sidepanelinstances;
         GtkWidget *view_as_combo_box;
         GtkWidget *navigation_bar;
 	GtkWidget *path_bar;
@@ -67,9 +68,6 @@ struct _NautilusNavigationWindow {
          */
         GList *back_list, *forward_list;
         
-        /* Current views stuff */
-        GList *sidebar_panels;
-        
         /* Widgets to keep track of (for state changes, etc) */      
         GtkWidget *zoom_control;
 };
@@ -107,8 +105,11 @@ void     nautilus_navigation_window_hide
 void     nautilus_navigation_window_show_sidebar         (NautilusNavigationWindow *window);
 gboolean nautilus_navigation_window_sidebar_showing      (NautilusNavigationWindow *window);
 void     nautilus_navigation_window_add_sidebar_panel    (NautilusNavigationWindow *window,
-                                                          NautilusSidebar          *sidebar_panel);
+                                                          NautilusSidePanelInstance *sidebaritem,
+                                                          NautilusSidebar          *sidebar_panel,
+                                                          const char *default_id);
 void     nautilus_navigation_window_remove_sidebar_panel (NautilusNavigationWindow *window,
+                                                          NautilusSidePanelInstance *sidebaritem,
                                                           NautilusSidebar          *sidebar_panel);
 void     nautilus_navigation_window_hide_status_bar      (NautilusNavigationWindow *window);
 void     nautilus_navigation_window_show_status_bar      (NautilusNavigationWindow *window);
Index: src/nautilus-sidepanel-instance.c
===================================================================
--- src/nautilus-sidepanel-instance.c	(revision 0)
+++ src/nautilus-sidepanel-instance.c	(revision 0)
@@ -0,0 +1,56 @@
+/*
+ * Nautilus
+ * nautilus-sidepanel-list.c: a list of side panels bar content items
+ *
+ * Nautilus is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * Nautilus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Daren C. Robbins
+ */
+
+#include "nautilus-sidepanel-instance.h"
+
+G_DEFINE_TYPE(NautilusSidePanelInstance, nautilus_sidepanel_instance, GTK_TYPE_OBJECT)
+
+/**
+ * Called (by glib) to initialize the class
+ */
+static void
+nautilus_sidepanel_instance_class_init (NautilusSidePanelInstanceClass *class)
+{
+	/* nothing to do here yet */
+}
+
+/**
+ * Called (by glib) to initialize the instance
+ */
+static void
+nautilus_sidepanel_instance_init (NautilusSidePanelInstance *instance)
+{
+	/* nothing to do here yet */
+}
+
+/**
+ * Create a new gobject for this panel instance
+ */
+NautilusSidePanelInstance *
+nautilus_sidepanel_instance_new (void)
+{
+	NautilusSidePanelInstance *instance;
+	instance = NAUTILUS_SIDEPANEL_INSTANCE (g_object_new (NAUTILUS_TYPE_SIDEPANEL_INSTANCE, NULL));
+
+	return instance;
+}
+
+
Index: src/nautilus-sidepanel-instance.h
===================================================================
--- src/nautilus-sidepanel-instance.h	(revision 0)
+++ src/nautilus-sidepanel-instance.h	(revision 0)
@@ -0,0 +1,52 @@
+/*
+ * Nautilus
+ * nautilus-sidepanel-list.h: a list of side panels bar content items
+ *
+ * Nautilus is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * Nautilus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Daren C. Robbins
+ */
+
+
+#ifndef NAUTILUS_SIDEPANEL_INSTANCE_H
+#define NAUTILUS_SIDEPANEL_INSTANCE_H
+
+#include "nautilus-side-pane.h"
+#include "nautilus-window.h"
+
+typedef struct NautilusSidePanelInstance NautilusSidePanelInstance;
+typedef struct NautilusSidePanelInstanceClass NautilusSidePanelInstanceClass;
+
+#define NAUTILUS_TYPE_SIDEPANEL_INSTANCE 				(nautilus_sidepanel_instance_get_type ())
+#define NAUTILUS_SIDEPANEL_INSTANCE(obj) 				(GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_SIDEPANEL_INSTANCE, NautilusSidePanelInstance))
+#define NAUTILUS_SIDEPANEL_INSTANCE_CLASS(klass) 		(GTK_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_SIDEPANEL_INSTANCE, NautilusSidePanelInstanceClass))
+#define NAUTILUS_IS_SIDEPANEL_INSTANCE(obj) 			(GTK_CHECK_TYPE ((obj), NAUTILUS_TYPE_SIDEPANEL_INSTANCE))
+#define NAUTILUS_IS_SIDEPANEL_INSTANCE_CLASS(klass)		(GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_SIDEPANEL_INSTANCE))
+
+struct NautilusSidePanelInstance {
+    GtkObject object;
+    NautilusSidePane *sidepane;
+    GtkWidget *nextcontainer;
+    GList *sidebar_panels;
+};
+
+struct NautilusSidePanelInstanceClass {
+	GtkObjectClass parent_class;
+};
+
+GType                        nautilus_sidepanel_instance_get_type            (void);
+NautilusSidePanelInstance *  nautilus_sidepanel_instance_new                 (void);
+
+#endif /* NAUTILUS_SIDEPANEL_INSTANCE_H */

Property changes on: src/nautilus-sidepanel-instance.h
___________________________________________________________________
Name: svn:executable
   + *

Index: src/nautilus-places-sidebar.c
===================================================================
--- src/nautilus-places-sidebar.c	(revision 14227)
+++ src/nautilus-places-sidebar.c	(working copy)
@@ -253,6 +253,38 @@ update_places (NautilusPlacesSidebar *si
 	gtk_list_store_clear (sidebar->store);
 	location = nautilus_window_info_get_current_location (sidebar->window);
 
+	/* add bookmarks */
+
+	bookmark_count = nautilus_bookmark_list_length (sidebar->bookmarks);
+	for (index = 0; index < bookmark_count; ++index) {
+		bookmark = nautilus_bookmark_list_item_at (sidebar->bookmarks, index);
+
+		if (nautilus_bookmark_uri_known_not_to_exist (bookmark)) {
+			continue;
+		}
+
+		name = nautilus_bookmark_get_name (bookmark);
+		icon = nautilus_bookmark_get_icon (bookmark);
+		mount_uri = nautilus_bookmark_get_uri (bookmark);
+		last_iter = add_place (sidebar, PLACES_BOOKMARK,
+				       name, icon, mount_uri,
+				       NULL, NULL, NULL, index);
+		if (strcmp (location, mount_uri) == 0) {
+			gtk_tree_selection_select_iter (selection, &last_iter);
+		}
+		g_free (name);
+		g_object_unref (icon);
+		g_free (mount_uri);
+	}
+	g_free (location);
+
+	/* add separator */
+
+	gtk_list_store_append (sidebar->store, &iter);
+	gtk_list_store_set (sidebar->store, &iter,
+			    PLACES_SIDEBAR_COLUMN_ROW_TYPE, PLACES_SEPARATOR,
+			    -1);
+	
 	/* add built in bookmarks */
 	desktop_path = nautilus_get_desktop_directory ();
 
@@ -308,7 +340,7 @@ update_places (NautilusPlacesSidebar *si
 				volume = ll->data;
 				mount = g_volume_get_mount (volume);
 				if (mount != NULL) {
-					/* Show mounted volume in the sidebar */
+					/* Show m	ounted volume in the sidebar */
 					icon = g_mount_get_icon (mount);
 					root = g_mount_get_root (mount);
 					mount_uri = g_file_get_uri (root);
@@ -445,38 +477,6 @@ update_places (NautilusPlacesSidebar *si
 		gtk_tree_selection_select_iter (selection, &last_iter);
 	}
 	g_object_unref (icon);
-
-	/* add separator */
-
-	gtk_list_store_append (sidebar->store, &iter);
-	gtk_list_store_set (sidebar->store, &iter,
-			    PLACES_SIDEBAR_COLUMN_ROW_TYPE, PLACES_SEPARATOR,
-			    -1);
-
-	/* add bookmarks */
-
-	bookmark_count = nautilus_bookmark_list_length (sidebar->bookmarks);
-	for (index = 0; index < bookmark_count; ++index) {
-		bookmark = nautilus_bookmark_list_item_at (sidebar->bookmarks, index);
-
-		if (nautilus_bookmark_uri_known_not_to_exist (bookmark)) {
-			continue;
-		}
-
-		name = nautilus_bookmark_get_name (bookmark);
-		icon = nautilus_bookmark_get_icon (bookmark);
-		mount_uri = nautilus_bookmark_get_uri (bookmark);
-		last_iter = add_place (sidebar, PLACES_BOOKMARK,
-				       name, icon, mount_uri,
-				       NULL, NULL, NULL, index);
-		if (strcmp (location, mount_uri) == 0) {
-			gtk_tree_selection_select_iter (selection, &last_iter);
-		}
-		g_free (name);
-		g_object_unref (icon);
-		g_free (mount_uri);
-	}
-	g_free (location);
 }
 
 static gboolean
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 14227)
+++ src/Makefile.am	(working copy)
@@ -116,6 +116,8 @@ nautilus_SOURCES = \
 	nautilus-shell.h			\
 	nautilus-side-pane.c                    \
 	nautilus-side-pane.h			\
+	nautilus-sidepanel-instance.c		\
+	nautilus-sidepanel-instance.h		\
 	nautilus-sidebar-title.c		\
 	nautilus-sidebar-title.h		\
 	nautilus-spatial-window.c               \
Index: libnautilus-private/nautilus-vertical-splitter.c
===================================================================
--- libnautilus-private/nautilus-vertical-splitter.c	(revision 0)
+++ libnautilus-private/nautilus-vertical-splitter.c	(revision 0)
@@ -0,0 +1,367 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* nautilus-vertical-splitter.c - A vertical splitter with a semi gradient look
+
+   The Gnome Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Daren C. Robbins
+*/
+
+#include <config.h>
+#include "nautilus-vertical-splitter.h"
+#include "nautilus-global-preferences.h"
+#include <eel/eel-gtk-macros.h>
+#include <stdlib.h>
+
+struct NautilusVerticalSplitterDetails {
+	double press_x;
+	guint32 press_time;
+	int press_position;
+	int saved_size;
+};
+
+#define CLOSED_THRESHOLD 4
+#define NOMINAL_SIZE 148
+#define SPLITTER_CLICK_SLOP 1
+#define SPLITTER_CLICK_TIMEOUT	400
+
+static void nautilus_vertical_splitter_class_init (NautilusVerticalSplitterClass *vertical_splitter_class);
+static void nautilus_vertical_splitter_init       (NautilusVerticalSplitter      *vertical_splitter);
+
+EEL_CLASS_BOILERPLATE (NautilusVerticalSplitter,
+		       nautilus_vertical_splitter,
+		       GTK_TYPE_VPANED)
+
+static void
+nautilus_vertical_splitter_init (NautilusVerticalSplitter *vertical_splitter)
+{
+	vertical_splitter->details = g_new0 (NautilusVerticalSplitterDetails, 1);
+}
+
+static void
+nautilus_vertical_splitter_finalize (GObject *object)
+{
+	NautilusVerticalSplitter *vertical_splitter;
+	
+	vertical_splitter = NAUTILUS_VERTICAL_SPLITTER (object);
+
+	g_free (vertical_splitter->details);
+	
+	EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+static gboolean splitter_position_within_closed_threshold(NautilusVerticalSplitter *splitter, int position)
+{
+	if (splitter->toggle_up) {
+		return position < CLOSED_THRESHOLD;
+	} else {
+		return position > (GTK_PANED (splitter)->max_position - CLOSED_THRESHOLD);
+	}
+}
+
+static void
+save_position_preference(NautilusVerticalSplitter *splitter, int position)
+{
+	if (splitter->position_preference_name) {
+		// If it's within the closed threshold, store a fully-closed value
+		if (splitter_position_within_closed_threshold(splitter, position)) {
+			if (splitter->toggle_up) {
+				position = 0;
+			} else {
+				position = INT_MAX;
+			}
+		}
+		
+		eel_preferences_set_integer(splitter->position_preference_name, position);
+	}
+}
+
+static void
+splitter_expand (NautilusVerticalSplitter *splitter, int position)
+{
+	g_return_if_fail (NAUTILUS_IS_VERTICAL_SPLITTER (splitter));
+
+	if (!splitter_position_within_closed_threshold(splitter, position)) {
+		return;
+	}
+
+	position = splitter->details->saved_size;
+	if (position == 0 || splitter_position_within_closed_threshold(splitter, position)) {
+		position = NOMINAL_SIZE;
+	}
+	
+	gtk_paned_set_position (GTK_PANED (splitter), position);
+	save_position_preference(splitter, position);
+}
+
+static void
+splitter_collapse (NautilusVerticalSplitter *splitter, int position)
+{
+	g_return_if_fail (NAUTILUS_IS_VERTICAL_SPLITTER (splitter));
+
+	splitter->details->saved_size = position;
+	if (splitter->toggle_up) {
+		position = 0;
+	} else {
+		position = INT_MAX;
+	}
+	
+	gtk_paned_set_position (GTK_PANED (splitter), position);
+	save_position_preference(splitter, position);
+}
+
+static void
+splitter_toggle (NautilusVerticalSplitter *splitter, int position)
+{
+	g_return_if_fail (NAUTILUS_IS_VERTICAL_SPLITTER (splitter));
+
+	if (!splitter_position_within_closed_threshold(splitter, gtk_paned_get_position (GTK_PANED (splitter)))) {
+		nautilus_vertical_splitter_collapse (splitter);
+	} else {
+		nautilus_vertical_splitter_expand (splitter);
+	}
+}
+
+static void
+splitter_hide (NautilusVerticalSplitter *splitter)
+{
+	GtkPaned *parent;
+
+	parent = GTK_PANED (splitter);
+
+	gtk_widget_hide (parent->child1);
+}
+
+static void
+splitter_show (NautilusVerticalSplitter *splitter)
+{
+	GtkPaned *parent;
+
+	parent = GTK_PANED (splitter);
+
+	gtk_widget_show (parent->child1);
+}
+
+static gboolean
+splitter_is_hidden (NautilusVerticalSplitter *splitter)
+{
+	GtkPaned *parent;
+	
+	parent = GTK_PANED (splitter);
+
+	return GTK_WIDGET_VISIBLE (parent->child1);
+}
+
+void
+nautilus_vertical_splitter_expand (NautilusVerticalSplitter *splitter)
+{
+	splitter_expand (splitter, gtk_paned_get_position (GTK_PANED (splitter)));
+}
+
+void
+nautilus_vertical_splitter_hide (NautilusVerticalSplitter *splitter)
+{
+	splitter_hide (splitter);
+}
+
+void
+nautilus_vertical_splitter_show (NautilusVerticalSplitter *splitter)
+{
+	splitter_show (splitter);
+};
+
+gboolean
+nautilus_vertical_splitter_is_hidden (NautilusVerticalSplitter *splitter)
+{
+	return splitter_is_hidden (splitter);
+}
+
+void
+nautilus_vertical_splitter_collapse (NautilusVerticalSplitter *splitter)
+{
+	splitter_collapse (splitter, gtk_paned_get_position (GTK_PANED (splitter)));
+}
+
+/* routine to toggle the open/closed state of the splitter */
+void
+nautilus_vertical_splitter_toggle_position (NautilusVerticalSplitter *splitter)
+{
+	splitter_toggle (splitter, gtk_paned_get_position (GTK_PANED (splitter)));
+}
+
+/* Indicate whether this splitter toggles up (true) or down (false) */
+void nautilus_vertical_splitter_set_toggle_up (NautilusVerticalSplitter *splitter, gboolean toggle_up)
+{
+	splitter->toggle_up = toggle_up;
+}
+
+/* Indicate the name of the preference attribute to use to store/load the position of this splitter */
+void nautilus_vertical_splitter_position_preference_name (NautilusVerticalSplitter *splitter, char *pref_name, gboolean loadPrevValue)
+{
+	int position;
+	
+	splitter->position_preference_name = pref_name;
+	
+	// When the preference is set, optionally load the preference position
+	if (loadPrevValue && pref_name) {
+		position = eel_preferences_get_integer(splitter->position_preference_name);
+		if (position == 0) {
+			if (splitter->toggle_up) {
+				position = 0;
+			} else {
+				position = INT_MAX;
+			}
+		}
+		
+		gtk_paned_set_position (GTK_PANED (splitter), position);
+	}
+}
+
+/* NautilusVerticalSplitter public methods */
+GtkWidget *
+nautilus_vertical_splitter_new (void)
+{
+	return gtk_widget_new (nautilus_vertical_splitter_get_type (), NULL);
+}
+
+/* handle mouse downs by remembering the position and the time */
+static gboolean
+nautilus_vertical_splitter_button_press (GtkWidget *widget, GdkEventButton *event)
+{
+	gboolean result;
+	NautilusVerticalSplitter *splitter;
+	int position;
+	
+	splitter = NAUTILUS_VERTICAL_SPLITTER (widget);
+
+	position = gtk_paned_get_position (GTK_PANED (widget));
+
+	result = EEL_CALL_PARENT_WITH_RETURN_VALUE
+		(GTK_WIDGET_CLASS, button_press_event, (widget, event));
+
+	if (result) {
+		splitter->details->press_x = event->x;
+		splitter->details->press_time = event->time;
+		splitter->details->press_position = position;
+	}
+
+	return result;
+}
+
+/* handle mouse ups by seeing if it was a tap and toggling the open state accordingly */
+static gboolean
+nautilus_vertical_splitter_button_release (GtkWidget *widget, GdkEventButton *event)
+{
+	gboolean result;
+	NautilusVerticalSplitter *splitter;
+	int delta, delta_time;
+	splitter = NAUTILUS_VERTICAL_SPLITTER (widget);
+
+	result = EEL_CALL_PARENT_WITH_RETURN_VALUE
+		(GTK_WIDGET_CLASS, button_release_event, (widget, event));
+
+	if (result) {
+		delta = abs (event->x - splitter->details->press_x);
+		delta_time = event->time - splitter->details->press_time;
+		save_position_preference(splitter, gtk_paned_get_position (GTK_PANED (widget)));
+		if (delta < SPLITTER_CLICK_SLOP && delta_time < SPLITTER_CLICK_TIMEOUT)  {
+			nautilus_vertical_splitter_toggle_position (splitter);
+		}
+	}
+
+	return result;
+}
+
+static void
+nautilus_vertical_splitter_size_allocate (GtkWidget     *widget,
+					    GtkAllocation *allocation)
+{
+	gint border_width;
+	GtkPaned *paned;
+	GtkAllocation child_allocation;
+	GtkRequisition child_requisition;
+      
+	paned = GTK_PANED (widget);
+	border_width = GTK_CONTAINER (paned)->border_width;
+
+	widget->allocation = *allocation;
+
+	if (paned->child2 != NULL && GTK_WIDGET_VISIBLE (paned->child2)) { 
+		EEL_CALL_PARENT (GTK_WIDGET_CLASS, size_allocate,
+				 (widget, allocation));
+	} else if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1)) {
+
+		if (GTK_WIDGET_REALIZED (widget)) {
+			gdk_window_hide (paned->handle);
+		}
+
+		gtk_widget_get_child_requisition (paned->child1,
+						  &child_requisition);
+		
+		child_allocation.x = widget->allocation.x + border_width;
+		child_allocation.y = widget->allocation.y + border_width;
+		child_allocation.width = MIN (child_requisition.width,
+					      allocation->width - 2 * border_width);
+		child_allocation.height = MIN (child_requisition.height,
+					       allocation->height - 2 * border_width);
+		
+		gtk_widget_size_allocate (paned->child1, &child_allocation);
+	} else
+		if (GTK_WIDGET_REALIZED (widget)) {
+			gdk_window_hide (paned->handle);
+		}
+
+}
+
+static void
+nautilus_vertical_splitter_class_init (NautilusVerticalSplitterClass *class)
+{
+	GtkWidgetClass *widget_class;
+	
+	widget_class = GTK_WIDGET_CLASS (class);
+
+	G_OBJECT_CLASS (class)->finalize = nautilus_vertical_splitter_finalize;
+
+	widget_class->size_allocate = nautilus_vertical_splitter_size_allocate;
+	widget_class->button_press_event = nautilus_vertical_splitter_button_press;
+	widget_class->button_release_event = nautilus_vertical_splitter_button_release;
+}
+
+void
+nautilus_vertical_splitter_pack1 (NautilusVerticalSplitter *splitter,
+				    GtkWidget                  *child1)
+{
+	GtkPaned *paned;
+	
+	g_return_if_fail (GTK_IS_WIDGET (child1));
+	g_return_if_fail (NAUTILUS_IS_VERTICAL_SPLITTER (splitter));
+
+	paned = GTK_PANED (splitter);
+	gtk_paned_pack1 (paned, child1, TRUE, TRUE);
+}
+
+void
+nautilus_vertical_splitter_pack2 (NautilusVerticalSplitter *splitter,
+				    GtkWidget                  *child2)
+{
+	GtkPaned *paned;
+	
+	g_return_if_fail (GTK_IS_WIDGET (child2));
+	g_return_if_fail (NAUTILUS_IS_VERTICAL_SPLITTER (splitter));
+
+	paned = GTK_PANED (splitter);
+	gtk_paned_pack2 (paned, child2, TRUE, TRUE);
+}

Property changes on: libnautilus-private/nautilus-vertical-splitter.c
___________________________________________________________________
Name: svn:executable
   + *

Index: libnautilus-private/nautilus-vertical-splitter.h
===================================================================
--- libnautilus-private/nautilus-vertical-splitter.h	(revision 0)
+++ libnautilus-private/nautilus-vertical-splitter.h	(revision 0)
@@ -0,0 +1,68 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* nautilus-vertical-splitter.h - A vertical splitter with a semi gradient look
+
+   The Gnome Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+   
+   Author: Daren C. Robbins
+*/
+
+#ifndef NAUTILUS_VERTICAL_SPLITTER_H
+#define NAUTILUS_VERTICAL_SPLITTER_H
+
+#include <gtk/gtkvpaned.h>
+
+G_BEGIN_DECLS
+
+#define NAUTILUS_TYPE_VERTICAL_SPLITTER            (nautilus_vertical_splitter_get_type ())
+#define NAUTILUS_VERTICAL_SPLITTER(obj)            (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_VERTICAL_SPLITTER, NautilusVerticalSplitter))
+#define NAUTILUS_VERTICAL_SPLITTER_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_VERTICAL_SPLITTER, NautilusVerticalSplitterClass))
+#define NAUTILUS_IS_VERTICAL_SPLITTER(obj)         (GTK_CHECK_TYPE ((obj), NAUTILUS_TYPE_VERTICAL_SPLITTER))
+#define NAUTILUS_IS_VERTICAL_SPLITTER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_VERTICAL_SPLITTER))
+
+typedef struct NautilusVerticalSplitterDetails NautilusVerticalSplitterDetails;
+
+typedef struct {
+	GtkVPaned				parent_slot;
+	NautilusVerticalSplitterDetails	*details;
+	gboolean				toggle_up;
+	char 					*position_preference_name;
+} NautilusVerticalSplitter;
+
+typedef struct {
+	GtkVPanedClass				parent_slot;
+} NautilusVerticalSplitterClass;
+
+/* NautilusVerticalSplitter public methods */
+GType      nautilus_vertical_splitter_get_type (void);
+GtkWidget *nautilus_vertical_splitter_new      (void);
+
+gboolean   nautilus_vertical_splitter_is_hidden	(NautilusVerticalSplitter *splitter);
+void	   nautilus_vertical_splitter_collapse	(NautilusVerticalSplitter *splitter);
+void	   nautilus_vertical_splitter_hide		(NautilusVerticalSplitter *splitter);
+void	   nautilus_vertical_splitter_show		(NautilusVerticalSplitter *splitter);
+void	   nautilus_vertical_splitter_expand		(NautilusVerticalSplitter *splitter);
+void	   nautilus_vertical_splitter_toggle_position	(NautilusVerticalSplitter *splitter);
+void	   nautilus_vertical_splitter_set_toggle_up	(NautilusVerticalSplitter *splitter, gboolean toggle_up);
+void	   nautilus_vertical_splitter_position_preference_name	(NautilusVerticalSplitter *splitter, char *pref_name, gboolean loadPrevValue);
+void	   nautilus_vertical_splitter_pack1           (NautilusVerticalSplitter *splitter,
+							 GtkWidget                  *child1);
+void	   nautilus_vertical_splitter_pack2           (NautilusVerticalSplitter *splitter,
+							 GtkWidget                  *child2);
+
+G_END_DECLS
+
+#endif /* NAUTILUS_VERTICAL_SPLITTER_H */

Property changes on: libnautilus-private/nautilus-vertical-splitter.h
___________________________________________________________________
Name: svn:executable
   + *

Index: libnautilus-private/Makefile.am
===================================================================
--- libnautilus-private/Makefile.am	(revision 14227)
+++ libnautilus-private/Makefile.am	(working copy)
@@ -184,6 +184,8 @@ libnautilus_private_la_SOURCES = \
 	nautilus-undo.h \
 	nautilus-users-groups-cache.c \
 	nautilus-users-groups-cache.h \
+	nautilus-vertical-splitter.c \
+	nautilus-vertical-splitter.h \
 	nautilus-vfs-directory.c \
 	nautilus-vfs-directory.h \
 	nautilus-vfs-file.c \
Index: libnautilus-private/nautilus-global-preferences.h
===================================================================
--- libnautilus-private/nautilus-global-preferences.h	(revision 14227)
+++ libnautilus-private/nautilus-global-preferences.h	(working copy)
@@ -96,7 +96,8 @@ typedef enum
 #define NAUTILUS_PREFERENCES_START_WITH_STATUS_BAR		"preferences/start_with_status_bar"
 #define NAUTILUS_PREFERENCES_START_WITH_SIDEBAR		 	"preferences/start_with_sidebar"
 #define NAUTILUS_PREFERENCES_START_WITH_TOOLBAR			"preferences/start_with_toolbar"
-#define NAUTILUS_PREFERENCES_SIDE_PANE_VIEW                     "preferences/side_pane_view"
+#define NAUTILUS_PREFERENCES_SIDE_PANE_VIEWS                     "preferences/side_pane_views"
+#define NAUTILUS_PREFERENCES_SIDE_PANE_POSITIONS                     "preferences/side_pane_positions"
 #define NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_SAVED_GEOMETRY 	"preferences/navigation_window_saved_geometry"
 #define NAUTILUS_PREFERENCES_NAVIGATION_WINDOW_MAXIMIZED        "preferences/navigation_window_saved_maximized"
 
