Index: libnautilus-private/nautilus-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-view.c,v
retrieving revision 1.3
diff -u -p -r1.3 nautilus-view.c
--- libnautilus-private/nautilus-view.c	17 May 2005 13:27:29 -0000	1.3
+++ libnautilus-private/nautilus-view.c	20 Jul 2005 12:38:52 -0000
@@ -252,11 +252,12 @@ nautilus_view_get_zoom_level (NautilusVi
 
 void
 nautilus_view_pop_up_location_context_menu (NautilusView   *view,
-					    GdkEventButton *event)
+					    GdkEventButton *event,
+					    const char     *location)
 {
 	g_return_if_fail (NAUTILUS_IS_VIEW (view));
 
 	if (NAUTILUS_VIEW_GET_IFACE (view)->pop_up_location_context_menu != NULL) {
-		(* NAUTILUS_VIEW_GET_IFACE (view)->pop_up_location_context_menu) (view, event);
+		(* NAUTILUS_VIEW_GET_IFACE (view)->pop_up_location_context_menu) (view, event, location);
 	}
 }
Index: libnautilus-private/nautilus-view.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-view.h,v
retrieving revision 1.3
diff -u -p -r1.3 nautilus-view.h
--- libnautilus-private/nautilus-view.h	17 May 2005 13:27:29 -0000	1.3
+++ libnautilus-private/nautilus-view.h	20 Jul 2005 12:38:52 -0000
@@ -109,11 +109,14 @@ struct _NautilusViewIface 
 	/* Request popup of context menu referring to the open location.
 	 * This is triggered in spatial windows by right-clicking the location button,
 	 * in navigational windows by right-clicking the "Location:" label in the
-	 * navigation bar.
+	 * navigation bar or any of the buttons in the pathbar.
+	 * The location parameter specifies the location this popup should be displayed for.
+	 * If it is NULL, the currently displayed location should be used.
 	 * The view may display the popup synchronously, asynchronously
 	 * or not react to the popup request at all. */
 	void           (* pop_up_location_context_menu) (NautilusView   *view,
-							 GdkEventButton *event);
+							 GdkEventButton *event,
+							 const char     *location);
 
 	/* Padding for future expansion */
 	void (*_reserved1) (void);
@@ -150,7 +153,8 @@ gboolean          nautilus_view_can_zoom
 gboolean          nautilus_view_can_zoom_out               (NautilusView      *view);
 NautilusZoomLevel nautilus_view_get_zoom_level             (NautilusView      *view);
 void              nautilus_view_pop_up_location_context_menu (NautilusView    *view,
-							      GdkEventButton  *event);
+							      GdkEventButton  *event,
+							      const char      *location);
 
 G_END_DECLS
 
Index: src/nautilus-location-bar.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-location-bar.c,v
retrieving revision 1.107
diff -u -p -r1.107 nautilus-location-bar.c
--- src/nautilus-location-bar.c	2 Jun 2005 16:16:55 -0000	1.107
+++ src/nautilus-location-bar.c	20 Jul 2005 12:38:54 -0000
@@ -279,7 +279,7 @@ label_button_pressed_callback (GtkWidget
 		return FALSE;
 	}
 
-	nautilus_view_pop_up_location_context_menu (view, event);
+	nautilus_view_pop_up_location_context_menu (view, event, NULL);
 
 	return FALSE;
 }
Index: src/nautilus-navigation-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-navigation-window.c,v
retrieving revision 1.436
diff -u -p -r1.436 nautilus-navigation-window.c
--- src/nautilus-navigation-window.c	13 Jul 2005 12:23:37 -0000	1.436
+++ src/nautilus-navigation-window.c	20 Jul 2005 12:38:55 -0000
@@ -115,6 +115,9 @@ static void navigation_bar_location_chan
 static void path_bar_location_changed_callback       (GtkWidget                *widget,
 						      const char               *uri,
 						      NautilusNavigationWindow *window);
+static void path_bar_path_set_callback               (GtkWidget                *widget,
+						      const char               *uri,
+						      NautilusNavigationWindow *window);
 static void always_use_location_entry_changed        (gpointer                  callback_data);
 
 
@@ -188,6 +191,8 @@ nautilus_navigation_window_instance_init
 	
 	g_signal_connect_object (window->path_bar, "path_clicked",
 				 G_CALLBACK (path_bar_location_changed_callback), window, 0);
+	g_signal_connect_object (window->path_bar, "path_set",
+				 G_CALLBACK (path_bar_path_set_callback), window, 0);
 	
 	gtk_box_pack_start (GTK_BOX (hbox),
 			    window->path_bar,
@@ -313,6 +318,59 @@ path_bar_location_changed_callback (GtkW
 	}
 }
 
+static gboolean
+path_bar_button_pressed_callback (GtkWidget *widget,
+				  GdkEventButton *event,
+				  NautilusNavigationWindow *window)
+{
+	NautilusView *view;
+	char *location;
+
+	if (event->button == 3) {
+		view = NAUTILUS_WINDOW (window)->content_view;
+		if (view != NULL) {
+			location = nautilus_path_bar_get_path_for_button (
+				NAUTILUS_PATH_BAR (window->path_bar), widget);
+			nautilus_view_pop_up_location_context_menu (
+				view, event, location);
+			return TRUE;
+		}
+	}
+
+
+	return FALSE;
+}
+
+static void
+path_bar_path_set_callback (GtkWidget *widget,
+			    const char *uri,
+			    NautilusNavigationWindow *window)
+{
+	GList *children, *l;
+	GtkWidget *child;
+
+	children = gtk_container_get_children (GTK_CONTAINER (widget));
+
+	for (l = children; l != NULL; l = l->next) {
+		child = GTK_WIDGET (l->data);
+
+		if (!GTK_IS_TOGGLE_BUTTON (child)) {
+			continue;
+		}
+
+		if (!g_signal_handler_find (child,
+					    G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
+					    0, 0, NULL, 
+					    path_bar_button_pressed_callback,
+					    window)) {
+			g_signal_connect (child, "button-press-event",
+					  G_CALLBACK (path_bar_button_pressed_callback),
+					  window);
+		}
+	}
+
+	g_list_free (children);
+}
 
 static void
 navigation_bar_location_changed_callback (GtkWidget *widget,
@@ -1226,7 +1284,6 @@ nautilus_navigation_window_save_geometry
 		g_free (geometry_string);
 	}
 }
-
 
 
 static void
Index: src/nautilus-pathbar.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-pathbar.c,v
retrieving revision 1.2
diff -u -p -r1.2 nautilus-pathbar.c
--- src/nautilus-pathbar.c	9 Jul 2005 21:28:27 -0000	1.2
+++ src/nautilus-pathbar.c	20 Jul 2005 12:38:57 -0000
@@ -42,6 +42,7 @@
 
 enum {
         PATH_CLICKED,
+        PATH_SET,
         LAST_SIGNAL
 };
 
@@ -267,6 +268,15 @@ nautilus_path_bar_class_init (NautilusPa
 		  g_cclosure_marshal_VOID__STRING,
 		  G_TYPE_NONE, 1,
 		  G_TYPE_STRING);
+        path_bar_signals [PATH_SET] =
+                g_signal_new ("path-set",
+		  G_OBJECT_CLASS_TYPE (object_class),
+		  G_SIGNAL_RUN_FIRST,
+		  G_STRUCT_OFFSET (NautilusPathBarClass, path_set),
+		  NULL, NULL,
+		  g_cclosure_marshal_VOID__STRING,
+		  G_TYPE_NONE, 1,
+		  G_TYPE_STRING);
 }
 
 
@@ -1572,6 +1582,8 @@ nautilus_path_bar_update_path (NautilusP
 
         gtk_widget_pop_composite_child ();
 
+	g_signal_emit (path_bar, path_bar_signals [PATH_SET], 0, file_path);
+
         return result;
 }
 
@@ -1590,7 +1602,25 @@ nautilus_path_bar_set_path (NautilusPath
 	return nautilus_path_bar_update_path (path_bar, file_path);
 }
 
+char *
+nautilus_path_bar_get_path_for_button (NautilusPathBar *path_bar,
+				       GtkWidget       *button)
+{
+	GList *list;
+ 
+	g_return_val_if_fail (NAUTILUS_IS_PATH_BAR (path_bar), NULL);
+	g_return_val_if_fail (button != NULL, NULL);
+
+	for (list = path_bar->button_list; list; list = list->next) {
+		ButtonData *button_data;
+		button_data = BUTTON_DATA (list->data);
+		if (button_data->button == button) {
+			return button_data->path;
+		}
+	}
 
+	return NULL;
+}
 
 /**
  * _nautilus_path_bar_up:
Index: src/nautilus-pathbar.h
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-pathbar.h,v
retrieving revision 1.1
diff -u -p -r1.1 nautilus-pathbar.h
--- src/nautilus-pathbar.h	8 Jul 2005 11:25:51 -0000	1.1
+++ src/nautilus-pathbar.h	20 Jul 2005 12:38:57 -0000
@@ -68,11 +68,15 @@ struct _NautilusPathBarClass
 
   	void (* path_clicked)   (NautilusPathBar  *path_bar,
 				 const char       *file_path);
+	void (* path_set)       (NautilusPathBar  *path_bar,
+				 const char       *file_path);
 };
 
 GType    nautilus_path_bar_get_type (void) G_GNUC_CONST;
 
 gboolean nautilus_path_bar_set_path    (NautilusPathBar *path_bar, const char *file_path);
+char *   nautilus_path_bar_get_path_for_button (NautilusPathBar *path_bar,
+						GtkWidget       *button);
 
 void     nautilus_path_bar_up              (NautilusPathBar *path_bar);
 void     nautilus_path_bar_down            (NautilusPathBar *path_bar);
Index: src/nautilus-spatial-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-spatial-window.c,v
retrieving revision 1.449
diff -u -p -r1.449 nautilus-spatial-window.c
--- src/nautilus-spatial-window.c	13 Jul 2005 10:39:43 -0000	1.449
+++ src/nautilus-spatial-window.c	20 Jul 2005 12:38:57 -0000
@@ -498,7 +498,7 @@ location_button_pressed_callback (GtkWid
 {
 	if (event->button == 3 &&
 	    window->content_view != NULL) {
-		nautilus_view_pop_up_location_context_menu (window->content_view, event);
+		nautilus_view_pop_up_location_context_menu (window->content_view, event, NULL);
 	}
 
 	return FALSE;
Index: src/file-manager/fm-actions.h
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-actions.h,v
retrieving revision 1.8
diff -u -p -r1.8 fm-actions.h
--- src/file-manager/fm-actions.h	1 Jul 2005 10:30:33 -0000	1.8
+++ src/file-manager/fm-actions.h	20 Jul 2005 12:38:58 -0000
@@ -34,6 +34,7 @@
 #define FM_ACTION_PROPERTIES "Properties"
 #define FM_ACTION_PROPERTIES_ACCEL "PropertiesAccel"
 #define FM_ACTION_SELF_PROPERTIES "SelfProperties"
+#define FM_ACTION_LOCATION_SELF_PROPERTIES "LocationSelfProperties"
 #define FM_ACTION_NO_TEMPLATES "No Templates"
 #define FM_ACTION_EMPTY_TRASH "Empty Trash"
 #define FM_ACTION_CUT "Cut"
Index: src/file-manager/fm-directory-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.c,v
retrieving revision 1.701
diff -u -p -r1.701 fm-directory-view.c
--- src/file-manager/fm-directory-view.c	11 Jul 2005 10:07:53 -0000	1.701
+++ src/file-manager/fm-directory-view.c	20 Jul 2005 12:39:04 -0000
@@ -174,6 +174,7 @@ struct FMDirectoryViewDetails
 	NautilusWindowInfo *window;
 	NautilusDirectory *model;
 	NautilusFile *directory_as_file;
+	NautilusFile *location_popup_directory_as_file;
 	GtkActionGroup *dir_action_group;
 	guint dir_merge_id;
 
@@ -391,6 +392,8 @@ static void action_location_trash_callba
 						     gpointer   callback_data);
 static void action_location_delete_callback         (GtkAction *action,
 						     gpointer   callback_data);
+static void action_location_self_properties_callback (GtkAction *action,
+						      gpointer   callback_data);
 
 EEL_CLASS_BOILERPLATE (FMDirectoryView, fm_directory_view, GTK_TYPE_SCROLLED_WINDOW)
 
@@ -1791,6 +1794,7 @@ fm_directory_view_finalize (GObject *obj
 	eel_preferences_remove_callback (NAUTILUS_PREFERENCES_SORT_DIRECTORIES_FIRST,
 					 sort_directories_first_changed_callback, view);
 
+	nautilus_file_unref (view->details->location_popup_directory_as_file);
 	g_hash_table_destroy (view->details->non_ready_files);
 
 	g_free (view->details);
@@ -5965,7 +5969,7 @@ action_location_open_alternate_callback 
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = view->details->directory_as_file;
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	fm_directory_view_activate_file (view,
@@ -5984,7 +5988,7 @@ action_location_cut_callback (GtkAction 
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	files = g_list_append (NULL, file);
@@ -6002,7 +6006,7 @@ action_location_copy_callback (GtkAction
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	files = g_list_append (NULL, file);
@@ -6020,7 +6024,7 @@ action_location_trash_callback (GtkActio
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	files = g_list_append (NULL, file);
@@ -6039,7 +6043,7 @@ action_location_delete_callback (GtkActi
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	file_uri = nautilus_file_get_uri (file);
@@ -6052,6 +6056,28 @@ action_location_delete_callback (GtkActi
 }
 
 static void
+action_location_self_properties_callback (GtkAction *action,
+					  gpointer   callback_data)
+{
+	FMDirectoryView *view;
+	NautilusFile *file;
+	GList           *files;
+
+	g_assert (FM_IS_DIRECTORY_VIEW (callback_data));
+
+	view = FM_DIRECTORY_VIEW (callback_data);
+
+	file = view->details->location_popup_directory_as_file;
+	g_return_if_fail (file != NULL);
+
+	files = g_list_append (NULL, file);
+
+	fm_properties_window_present (files, GTK_WIDGET (view));
+
+	nautilus_file_list_free (files);
+}
+
+static void
 fm_directory_view_init_show_hidden_files (FMDirectoryView *view)
 {
 	NautilusWindowShowHiddenFilesMode mode;
@@ -6110,7 +6136,7 @@ static const GtkActionEntry directory_vi
     G_CALLBACK (action_properties_callback) },
   { "SelfProperties", GTK_STOCK_PROPERTIES,                  /* name, stock id */
     N_("_Properties"), NULL,                /* label, accelerator */
-    N_("View or modify the properties of the open folder"),                   /* tooltip */ 
+    N_("View or modify the properties of this folder"),                   /* tooltip */ 
     G_CALLBACK (action_self_properties_callback) },
   { "New Folder", NULL,                  /* name, stock id */
     N_("Create _Folder"), "<control><shift>N",                /* label, accelerator */
@@ -6252,6 +6278,10 @@ static const GtkActionEntry directory_vi
     N_("_Delete"), "",                /* label, accelerator */
     N_("Delete this folder, without moving to the Trash"),                   /* tooltip */ 
     G_CALLBACK (action_location_delete_callback) },
+  { FM_ACTION_LOCATION_SELF_PROPERTIES, GTK_STOCK_PROPERTIES,                  /* name, stock id */
+    N_("_Properties"), NULL,                /* label, accelerator */
+    N_("View or modify the properties of this folder"),                   /* tooltip */ 
+    G_CALLBACK (action_location_self_properties_callback) },
 };
 
 static const GtkToggleActionEntry directory_view_toggle_entries[] = {
@@ -6569,7 +6599,8 @@ real_update_paste_menu (FMDirectoryView 
 }
 
 static void
-real_update_location_menu (FMDirectoryView *view)
+real_update_location_menu (FMDirectoryView *view,
+			   const char *location)
 {
 	GtkAction *action;
 	gboolean is_read_only;
@@ -6589,20 +6620,36 @@ real_update_location_menu (FMDirectoryVi
 		      "label", label,
 		      NULL);
 
-	is_read_only = fm_directory_view_is_read_only (view);
+	nautilus_file_unref (view->details->location_popup_directory_as_file);
+	view->details->location_popup_directory_as_file = NULL;
+
+	if (location == NULL) {
+		view->details->location_popup_directory_as_file =
+			nautilus_file_ref (view->details->directory_as_file);
+	} else {
+		view->details->location_popup_directory_as_file =
+			nautilus_file_get (location);
+	}
+
+	if (view->details->location_popup_directory_as_file != NULL) {
+		is_read_only = !nautilus_file_can_write (
+			view->details->location_popup_directory_as_file);
+	} else {
+		is_read_only = fm_directory_view_is_read_only (view);
+	}
 
 	action = gtk_action_group_get_action (view->details->dir_action_group,
 					      FM_ACTION_LOCATION_CUT);
 	gtk_action_set_sensitive (action, !is_read_only);
 
-	if (view->details->directory_as_file != NULL &&
-	    nautilus_file_is_in_trash (view->details->directory_as_file)) {
+	if (view->details->location_popup_directory_as_file != NULL &&
+	    nautilus_file_is_in_trash (view->details->location_popup_directory_as_file)) {
 		label = _("_Delete from Trash");
-		tip = _("Delete the open folder permanently");
+		tip = _("Delete this folder permanently");
 		show_separate_delete_command = FALSE;
 	} else {
 		label = _("Mo_ve to Trash");
-		tip = _("Move the open folder to the Trash");
+		tip = _("Move this folder to the Trash");
 		show_separate_delete_command = show_delete_command_auto_value;
 	}
 
@@ -6622,7 +6669,7 @@ real_update_location_menu (FMDirectoryVi
 	}
 
 	/* we silently assume that fm_directory_view_supports_properties always returns the same value.
-	 * Therefore, we don't update the sensitivity of FM_ACTION_SELF_PROPERTIES */
+	 * Therefore, we don't update the sensitivity of FM_ACTION_LOCATION_SELF_PROPERTIES */
 }
 
 static void
@@ -6821,6 +6868,13 @@ real_update_menus (FMDirectoryView *view
 				!FM_IS_DESKTOP_ICON_VIEW (view));
 
 	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_SELF_PROPERTIES);
+	gtk_action_set_sensitive (action,
+				  fm_directory_view_supports_properties (view));
+	gtk_action_set_visible (action,
+				!FM_IS_DESKTOP_ICON_VIEW (view));
+
+	action = gtk_action_group_get_action (view->details->dir_action_group,
 					      FM_ACTION_EMPTY_TRASH);
 	g_object_set (action,
 		      "label", _("E_mpty Trash"),
@@ -6929,16 +6983,19 @@ fm_directory_view_pop_up_background_cont
  * Pop up a context menu appropriate to the view globally.
  * @view: FMDirectoryView of interest.
  * @event: GdkEventButton triggering the popup.
+ * @location: The location the popup-menu should be created for,
+ * or NULL for the currently displayed location.
  *
  **/
 void 
 fm_directory_view_pop_up_location_context_menu (FMDirectoryView *view, 
-						GdkEventButton  *event)
+						GdkEventButton  *event,
+						const char      *location)
 {
 	g_assert (FM_IS_DIRECTORY_VIEW (view));
 
 	/* always update the menu before showing it. Shouldn't be too expensive. */
-	real_update_location_menu (view);
+	real_update_location_menu (view, location);
 
 	eel_pop_up_context_menu (create_popup_menu 
 				      (view, FM_DIRECTORY_VIEW_POPUP_PATH_LOCATION),
Index: src/file-manager/fm-directory-view.h
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.h,v
retrieving revision 1.141
diff -u -p -r1.141 fm-directory-view.h
--- src/file-manager/fm-directory-view.h	5 Jul 2005 12:23:35 -0000	1.141
+++ src/file-manager/fm-directory-view.h	20 Jul 2005 12:39:05 -0000
@@ -379,7 +379,8 @@ void                fm_directory_view_po
 void                fm_directory_view_pop_up_selection_context_menu    (FMDirectoryView  *view,
 									GdkEventButton   *event); 
 void                fm_directory_view_pop_up_location_context_menu     (FMDirectoryView  *view,
-									GdkEventButton   *event); 
+									GdkEventButton   *event,
+									const char       *location); 
 void                fm_directory_view_send_selection_change            (FMDirectoryView *view);
 gboolean            fm_directory_view_should_show_file                 (FMDirectoryView  *view,
 									NautilusFile     *file);
Index: src/file-manager/nautilus-directory-view-ui.xml
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/nautilus-directory-view-ui.xml,v
retrieving revision 1.76
diff -u -p -r1.76 nautilus-directory-view-ui.xml
--- src/file-manager/nautilus-directory-view-ui.xml	6 Jul 2005 14:02:38 -0000	1.76
+++ src/file-manager/nautilus-directory-view-ui.xml	20 Jul 2005 12:39:08 -0000
@@ -165,6 +165,6 @@
 		<menuitem name="Delete" action="LocationDelete"/>
 	</placeholder>
 	<separator/>
-	<menuitem name="Properties" action="SelfProperties"/>
+	<menuitem name="LocationSelfProperties" action="LocationSelfProperties"/>
 </popup>
 </ui>
