summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDarin Adler <darin@src.gnome.org>2001-04-19 22:33:59 +0000
committerDarin Adler <darin@src.gnome.org>2001-04-19 22:33:59 +0000
commit670fd0d0896d1f76172e991784c9bfd247bc2a7a (patch)
tree579e0513477478d10fa95e82ed27a97df47275bd /src
parentc41c44e4f19fe781e1e6d0702ea5e8d2a31b4a07 (diff)
downloadnautilus-670fd0d0896d1f76172e991784c9bfd247bc2a7a.tar.gz
Fix bug 8000 (Can get two identical "View as" items in "View as"
menu): * src/nautilus-window-private.h: * src/nautilus-window-manage-views.h: * src/nautilus-window-manage-views.c: (location_has_really_changed): Make logic clearer by using else instead of two if statements. (view_frame_info_new), (view_frame_info_free), (set_view_frame_info), (view_frame_get_label), (view_frame_get_id), (nautilus_window_get_content_view_id), (load_content_view), (nautilus_window_set_sidebar_panels): Store a NautilusViewIdentifier with each view. * src/nautilus-window.h: * src/nautilus-window.c: (nautilus_window_destroy): We no longer have to store the content view identifier separately. (remove_first_child): New function. (update_extra_viewer_in_view_as_menus): Shared by the two below, this is the old replace_extra_viewer_in_view_as_menus, simplified and changed to support both adding and removing the extra viewer. (remove_extra_viewer_in_view_as_menus): Cover for removing. (replace_extra_viewer_in_view_as_menus): Cover for adding. (nautilus_window_synch_view_as_menus): Simplify code a lot by removing some special cases and taking advantage of the fact that the position of the chosen item is always the same in both menus. (chose_component_callback): Removed the FIXME now that the bug is fixed. * NEWS: Tweak wording.
Diffstat (limited to 'src')
-rw-r--r--src/nautilus-navigation-window.c127
-rw-r--r--src/nautilus-navigation-window.h1
-rw-r--r--src/nautilus-object-window.c127
-rw-r--r--src/nautilus-object-window.h1
-rw-r--r--src/nautilus-spatial-window.c127
-rw-r--r--src/nautilus-spatial-window.h1
-rw-r--r--src/nautilus-window-manage-views.c51
-rw-r--r--src/nautilus-window-manage-views.h36
-rw-r--r--src/nautilus-window-private.h2
-rw-r--r--src/nautilus-window.c127
-rw-r--r--src/nautilus-window.h1
11 files changed, 340 insertions, 261 deletions
diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c
index d4c719765..010746fb3 100644
--- a/src/nautilus-navigation-window.c
+++ b/src/nautilus-navigation-window.c
@@ -936,8 +936,6 @@ nautilus_window_destroy (GtkObject *object)
g_list_free (window->sidebar_panels);
- nautilus_view_identifier_free (window->content_view_id);
-
free_stored_viewers (window);
g_free (window->details->location);
@@ -1239,22 +1237,39 @@ add_view_as_bonobo_menu_item (NautilusWindow *window,
g_free (tip);
}
+static void
+remove_first_child (GtkContainer *container)
+{
+ gtk_container_remove (container,
+ eel_gtk_container_get_first_child (container));
+}
+
/* Make a special first item in the "View as" option menu that represents
* the current content view. This should only be called if the current
* content view isn't already in the "View as" option menu.
*/
static void
-replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+update_extra_viewer_in_view_as_menus (NautilusWindow *window,
+ const NautilusViewIdentifier *id)
{
GtkWidget *menu;
- GtkWidget *first_menu_item;
GtkWidget *new_menu_item;
gboolean had_extra_viewer;
had_extra_viewer = window->details->extra_viewer != NULL;
+
+ if (id == NULL) {
+ if (!had_extra_viewer) {
+ return;
+ }
+ } else {
+ if (had_extra_viewer
+ && nautilus_view_identifier_compare (window->details->extra_viewer, id) == 0) {
+ return;
+ }
+ }
nautilus_view_identifier_free (window->details->extra_viewer);
- window->details->extra_viewer = nautilus_view_identifier_copy (window->content_view_id);
- g_assert (window->details->extra_viewer != NULL);
+ window->details->extra_viewer = nautilus_view_identifier_copy (id);
/* Update the View As option menu */
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (window->view_as_option_menu));
@@ -1265,28 +1280,54 @@ replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
gtk_widget_ref (menu);
gtk_option_menu_remove_menu (GTK_OPTION_MENU (window->view_as_option_menu));
+ /* Remove old menu item, and either remove or add separator. */
if (had_extra_viewer) {
- first_menu_item = eel_gtk_container_get_first_child (GTK_CONTAINER (menu));
- g_assert (first_menu_item != NULL);
- g_assert (GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (first_menu_item), "extra viewer")) == TRUE);
- gtk_container_remove (GTK_CONTAINER (menu), first_menu_item);
+ remove_first_child (GTK_CONTAINER (menu));
+ if (id == NULL) {
+ remove_first_child (GTK_CONTAINER (menu));
+ }
} else {
- /* Prepend separator. */
- gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ if (id != NULL) {
+ gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ }
}
- new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
- gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
- gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ /* Add new menu item. */
+ if (id != NULL) {
+ new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
+ gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
+ gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ }
gtk_option_menu_set_menu (GTK_OPTION_MENU (window->view_as_option_menu), menu);
gtk_widget_unref (menu);
/* Also update the Bonobo View menu item */
- add_view_as_bonobo_menu_item (window,
- NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
- window->details->extra_viewer,
- 0);
+ if (id == NULL) {
+ nautilus_bonobo_remove_menu_items_and_commands
+ (window->details->shell_ui, NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER);
+ } else {
+ add_view_as_bonobo_menu_item (window,
+ NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
+ window->details->extra_viewer,
+ 0);
+ }
+}
+
+static void
+remove_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ update_extra_viewer_in_view_as_menus (window, NULL);
+}
+
+static void
+replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ NautilusViewIdentifier *id;
+
+ id = nautilus_window_get_content_view_id (window);
+ update_extra_viewer_in_view_as_menus (window, id);
+ nautilus_view_identifier_free (id);
}
/**
@@ -1304,8 +1345,6 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
int index;
char *verb_name, *command_path;
GList *node;
- int option_menu_index;
- int numbered_menu_item_index;
const char *numbered_menu_item_container_path;
g_return_if_fail (NAUTILUS_IS_WINDOW (window));
@@ -1314,50 +1353,31 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
return;
}
- option_menu_index = -1;
- numbered_menu_item_index = -1;
- numbered_menu_item_container_path = 0;
-
- if (window->details->extra_viewer != NULL &&
- nautilus_window_content_view_matches_iid (window, window->details->extra_viewer->iid)) {
- option_menu_index = 0;
- numbered_menu_item_index = 0;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
- } else {
- for (node = window->details->short_list_viewers, index = 0;
- node != NULL;
- node = node->next, ++index) {
- if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
- option_menu_index = window->details->extra_viewer == NULL
- ? index
- : index + 2;
- numbered_menu_item_index = index;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
- break;
- }
+ for (node = window->details->short_list_viewers, index = 0;
+ node != NULL;
+ node = node->next, ++index) {
+ if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
+ break;
}
}
-
- if (option_menu_index == -1) {
+ if (node == NULL) {
replace_extra_viewer_in_view_as_menus (window);
- option_menu_index = 0;
- numbered_menu_item_index = 0;
+ index = 0;
numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
+ } else {
+ remove_extra_viewer_in_view_as_menus (window);
+ numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
}
- g_assert (option_menu_index >= 0);
- g_assert (numbered_menu_item_index >= 0);
g_assert (numbered_menu_item_container_path != NULL);
/* Make option menu show the right item */
- gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu),
- option_menu_index);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu), index);
/* Make View menu in menu bar mark the right item */
verb_name = nautilus_bonobo_get_numbered_menu_item_command
(window->details->shell_ui,
- numbered_menu_item_container_path,
- numbered_menu_item_index);
+ numbered_menu_item_container_path, index);
command_path = g_strconcat (COMMAND_PREFIX, verb_name, NULL);
nautilus_bonobo_set_toggle_state (window->details->shell_ui, command_path, TRUE);
g_free (command_path);
@@ -1380,9 +1400,6 @@ chose_component_callback (NautilusViewIdentifier *identifier, gpointer callback_
* now, hardwire this case, which is the most obvious one by
* far.
*/
- /* FIXME bugzilla.eazel.com 8000: It's possible to get the
- * same view listed twice in the menu due to this call.
- */
nautilus_window_load_view_as_menus (window);
}
diff --git a/src/nautilus-navigation-window.h b/src/nautilus-navigation-window.h
index f17348f47..d3d189133 100644
--- a/src/nautilus-navigation-window.h
+++ b/src/nautilus-navigation-window.h
@@ -94,7 +94,6 @@ struct NautilusWindow {
/* Current views stuff */
NautilusViewFrame *content_view;
- NautilusViewIdentifier *content_view_id;
GList *sidebar_panels;
/* Widgets to keep track of (for state changes, etc) */
diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c
index d4c719765..010746fb3 100644
--- a/src/nautilus-object-window.c
+++ b/src/nautilus-object-window.c
@@ -936,8 +936,6 @@ nautilus_window_destroy (GtkObject *object)
g_list_free (window->sidebar_panels);
- nautilus_view_identifier_free (window->content_view_id);
-
free_stored_viewers (window);
g_free (window->details->location);
@@ -1239,22 +1237,39 @@ add_view_as_bonobo_menu_item (NautilusWindow *window,
g_free (tip);
}
+static void
+remove_first_child (GtkContainer *container)
+{
+ gtk_container_remove (container,
+ eel_gtk_container_get_first_child (container));
+}
+
/* Make a special first item in the "View as" option menu that represents
* the current content view. This should only be called if the current
* content view isn't already in the "View as" option menu.
*/
static void
-replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+update_extra_viewer_in_view_as_menus (NautilusWindow *window,
+ const NautilusViewIdentifier *id)
{
GtkWidget *menu;
- GtkWidget *first_menu_item;
GtkWidget *new_menu_item;
gboolean had_extra_viewer;
had_extra_viewer = window->details->extra_viewer != NULL;
+
+ if (id == NULL) {
+ if (!had_extra_viewer) {
+ return;
+ }
+ } else {
+ if (had_extra_viewer
+ && nautilus_view_identifier_compare (window->details->extra_viewer, id) == 0) {
+ return;
+ }
+ }
nautilus_view_identifier_free (window->details->extra_viewer);
- window->details->extra_viewer = nautilus_view_identifier_copy (window->content_view_id);
- g_assert (window->details->extra_viewer != NULL);
+ window->details->extra_viewer = nautilus_view_identifier_copy (id);
/* Update the View As option menu */
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (window->view_as_option_menu));
@@ -1265,28 +1280,54 @@ replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
gtk_widget_ref (menu);
gtk_option_menu_remove_menu (GTK_OPTION_MENU (window->view_as_option_menu));
+ /* Remove old menu item, and either remove or add separator. */
if (had_extra_viewer) {
- first_menu_item = eel_gtk_container_get_first_child (GTK_CONTAINER (menu));
- g_assert (first_menu_item != NULL);
- g_assert (GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (first_menu_item), "extra viewer")) == TRUE);
- gtk_container_remove (GTK_CONTAINER (menu), first_menu_item);
+ remove_first_child (GTK_CONTAINER (menu));
+ if (id == NULL) {
+ remove_first_child (GTK_CONTAINER (menu));
+ }
} else {
- /* Prepend separator. */
- gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ if (id != NULL) {
+ gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ }
}
- new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
- gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
- gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ /* Add new menu item. */
+ if (id != NULL) {
+ new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
+ gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
+ gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ }
gtk_option_menu_set_menu (GTK_OPTION_MENU (window->view_as_option_menu), menu);
gtk_widget_unref (menu);
/* Also update the Bonobo View menu item */
- add_view_as_bonobo_menu_item (window,
- NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
- window->details->extra_viewer,
- 0);
+ if (id == NULL) {
+ nautilus_bonobo_remove_menu_items_and_commands
+ (window->details->shell_ui, NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER);
+ } else {
+ add_view_as_bonobo_menu_item (window,
+ NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
+ window->details->extra_viewer,
+ 0);
+ }
+}
+
+static void
+remove_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ update_extra_viewer_in_view_as_menus (window, NULL);
+}
+
+static void
+replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ NautilusViewIdentifier *id;
+
+ id = nautilus_window_get_content_view_id (window);
+ update_extra_viewer_in_view_as_menus (window, id);
+ nautilus_view_identifier_free (id);
}
/**
@@ -1304,8 +1345,6 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
int index;
char *verb_name, *command_path;
GList *node;
- int option_menu_index;
- int numbered_menu_item_index;
const char *numbered_menu_item_container_path;
g_return_if_fail (NAUTILUS_IS_WINDOW (window));
@@ -1314,50 +1353,31 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
return;
}
- option_menu_index = -1;
- numbered_menu_item_index = -1;
- numbered_menu_item_container_path = 0;
-
- if (window->details->extra_viewer != NULL &&
- nautilus_window_content_view_matches_iid (window, window->details->extra_viewer->iid)) {
- option_menu_index = 0;
- numbered_menu_item_index = 0;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
- } else {
- for (node = window->details->short_list_viewers, index = 0;
- node != NULL;
- node = node->next, ++index) {
- if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
- option_menu_index = window->details->extra_viewer == NULL
- ? index
- : index + 2;
- numbered_menu_item_index = index;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
- break;
- }
+ for (node = window->details->short_list_viewers, index = 0;
+ node != NULL;
+ node = node->next, ++index) {
+ if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
+ break;
}
}
-
- if (option_menu_index == -1) {
+ if (node == NULL) {
replace_extra_viewer_in_view_as_menus (window);
- option_menu_index = 0;
- numbered_menu_item_index = 0;
+ index = 0;
numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
+ } else {
+ remove_extra_viewer_in_view_as_menus (window);
+ numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
}
- g_assert (option_menu_index >= 0);
- g_assert (numbered_menu_item_index >= 0);
g_assert (numbered_menu_item_container_path != NULL);
/* Make option menu show the right item */
- gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu),
- option_menu_index);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu), index);
/* Make View menu in menu bar mark the right item */
verb_name = nautilus_bonobo_get_numbered_menu_item_command
(window->details->shell_ui,
- numbered_menu_item_container_path,
- numbered_menu_item_index);
+ numbered_menu_item_container_path, index);
command_path = g_strconcat (COMMAND_PREFIX, verb_name, NULL);
nautilus_bonobo_set_toggle_state (window->details->shell_ui, command_path, TRUE);
g_free (command_path);
@@ -1380,9 +1400,6 @@ chose_component_callback (NautilusViewIdentifier *identifier, gpointer callback_
* now, hardwire this case, which is the most obvious one by
* far.
*/
- /* FIXME bugzilla.eazel.com 8000: It's possible to get the
- * same view listed twice in the menu due to this call.
- */
nautilus_window_load_view_as_menus (window);
}
diff --git a/src/nautilus-object-window.h b/src/nautilus-object-window.h
index f17348f47..d3d189133 100644
--- a/src/nautilus-object-window.h
+++ b/src/nautilus-object-window.h
@@ -94,7 +94,6 @@ struct NautilusWindow {
/* Current views stuff */
NautilusViewFrame *content_view;
- NautilusViewIdentifier *content_view_id;
GList *sidebar_panels;
/* Widgets to keep track of (for state changes, etc) */
diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c
index d4c719765..010746fb3 100644
--- a/src/nautilus-spatial-window.c
+++ b/src/nautilus-spatial-window.c
@@ -936,8 +936,6 @@ nautilus_window_destroy (GtkObject *object)
g_list_free (window->sidebar_panels);
- nautilus_view_identifier_free (window->content_view_id);
-
free_stored_viewers (window);
g_free (window->details->location);
@@ -1239,22 +1237,39 @@ add_view_as_bonobo_menu_item (NautilusWindow *window,
g_free (tip);
}
+static void
+remove_first_child (GtkContainer *container)
+{
+ gtk_container_remove (container,
+ eel_gtk_container_get_first_child (container));
+}
+
/* Make a special first item in the "View as" option menu that represents
* the current content view. This should only be called if the current
* content view isn't already in the "View as" option menu.
*/
static void
-replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+update_extra_viewer_in_view_as_menus (NautilusWindow *window,
+ const NautilusViewIdentifier *id)
{
GtkWidget *menu;
- GtkWidget *first_menu_item;
GtkWidget *new_menu_item;
gboolean had_extra_viewer;
had_extra_viewer = window->details->extra_viewer != NULL;
+
+ if (id == NULL) {
+ if (!had_extra_viewer) {
+ return;
+ }
+ } else {
+ if (had_extra_viewer
+ && nautilus_view_identifier_compare (window->details->extra_viewer, id) == 0) {
+ return;
+ }
+ }
nautilus_view_identifier_free (window->details->extra_viewer);
- window->details->extra_viewer = nautilus_view_identifier_copy (window->content_view_id);
- g_assert (window->details->extra_viewer != NULL);
+ window->details->extra_viewer = nautilus_view_identifier_copy (id);
/* Update the View As option menu */
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (window->view_as_option_menu));
@@ -1265,28 +1280,54 @@ replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
gtk_widget_ref (menu);
gtk_option_menu_remove_menu (GTK_OPTION_MENU (window->view_as_option_menu));
+ /* Remove old menu item, and either remove or add separator. */
if (had_extra_viewer) {
- first_menu_item = eel_gtk_container_get_first_child (GTK_CONTAINER (menu));
- g_assert (first_menu_item != NULL);
- g_assert (GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (first_menu_item), "extra viewer")) == TRUE);
- gtk_container_remove (GTK_CONTAINER (menu), first_menu_item);
+ remove_first_child (GTK_CONTAINER (menu));
+ if (id == NULL) {
+ remove_first_child (GTK_CONTAINER (menu));
+ }
} else {
- /* Prepend separator. */
- gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ if (id != NULL) {
+ gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ }
}
- new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
- gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
- gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ /* Add new menu item. */
+ if (id != NULL) {
+ new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
+ gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
+ gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ }
gtk_option_menu_set_menu (GTK_OPTION_MENU (window->view_as_option_menu), menu);
gtk_widget_unref (menu);
/* Also update the Bonobo View menu item */
- add_view_as_bonobo_menu_item (window,
- NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
- window->details->extra_viewer,
- 0);
+ if (id == NULL) {
+ nautilus_bonobo_remove_menu_items_and_commands
+ (window->details->shell_ui, NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER);
+ } else {
+ add_view_as_bonobo_menu_item (window,
+ NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
+ window->details->extra_viewer,
+ 0);
+ }
+}
+
+static void
+remove_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ update_extra_viewer_in_view_as_menus (window, NULL);
+}
+
+static void
+replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ NautilusViewIdentifier *id;
+
+ id = nautilus_window_get_content_view_id (window);
+ update_extra_viewer_in_view_as_menus (window, id);
+ nautilus_view_identifier_free (id);
}
/**
@@ -1304,8 +1345,6 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
int index;
char *verb_name, *command_path;
GList *node;
- int option_menu_index;
- int numbered_menu_item_index;
const char *numbered_menu_item_container_path;
g_return_if_fail (NAUTILUS_IS_WINDOW (window));
@@ -1314,50 +1353,31 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
return;
}
- option_menu_index = -1;
- numbered_menu_item_index = -1;
- numbered_menu_item_container_path = 0;
-
- if (window->details->extra_viewer != NULL &&
- nautilus_window_content_view_matches_iid (window, window->details->extra_viewer->iid)) {
- option_menu_index = 0;
- numbered_menu_item_index = 0;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
- } else {
- for (node = window->details->short_list_viewers, index = 0;
- node != NULL;
- node = node->next, ++index) {
- if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
- option_menu_index = window->details->extra_viewer == NULL
- ? index
- : index + 2;
- numbered_menu_item_index = index;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
- break;
- }
+ for (node = window->details->short_list_viewers, index = 0;
+ node != NULL;
+ node = node->next, ++index) {
+ if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
+ break;
}
}
-
- if (option_menu_index == -1) {
+ if (node == NULL) {
replace_extra_viewer_in_view_as_menus (window);
- option_menu_index = 0;
- numbered_menu_item_index = 0;
+ index = 0;
numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
+ } else {
+ remove_extra_viewer_in_view_as_menus (window);
+ numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
}
- g_assert (option_menu_index >= 0);
- g_assert (numbered_menu_item_index >= 0);
g_assert (numbered_menu_item_container_path != NULL);
/* Make option menu show the right item */
- gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu),
- option_menu_index);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu), index);
/* Make View menu in menu bar mark the right item */
verb_name = nautilus_bonobo_get_numbered_menu_item_command
(window->details->shell_ui,
- numbered_menu_item_container_path,
- numbered_menu_item_index);
+ numbered_menu_item_container_path, index);
command_path = g_strconcat (COMMAND_PREFIX, verb_name, NULL);
nautilus_bonobo_set_toggle_state (window->details->shell_ui, command_path, TRUE);
g_free (command_path);
@@ -1380,9 +1400,6 @@ chose_component_callback (NautilusViewIdentifier *identifier, gpointer callback_
* now, hardwire this case, which is the most obvious one by
* far.
*/
- /* FIXME bugzilla.eazel.com 8000: It's possible to get the
- * same view listed twice in the menu due to this call.
- */
nautilus_window_load_view_as_menus (window);
}
diff --git a/src/nautilus-spatial-window.h b/src/nautilus-spatial-window.h
index f17348f47..d3d189133 100644
--- a/src/nautilus-spatial-window.h
+++ b/src/nautilus-spatial-window.h
@@ -94,7 +94,6 @@ struct NautilusWindow {
/* Current views stuff */
NautilusViewFrame *content_view;
- NautilusViewIdentifier *content_view_id;
GList *sidebar_panels;
/* Widgets to keep track of (for state changes, etc) */
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index f823cfcf9..93a934b5a 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -91,7 +91,7 @@ typedef enum {
typedef struct {
gboolean is_sidebar_panel;
- char *label;
+ NautilusViewIdentifier *id;
} ViewFrameInfo;
static void connect_view (NautilusWindow *window,
@@ -662,10 +662,8 @@ location_has_really_changed (NautilusWindow *window)
*/
if (window->details->pending_location == NULL) {
nautilus_window_synch_view_as_menus (window);
- }
-
- /* Tell the window we are finished. */
- if (window->details->pending_location != NULL) {
+ } else {
+ /* Tell the window we are finished. */
update_for_new_location (window);
}
@@ -756,15 +754,16 @@ nautilus_window_open_location_with_selection (NautilusWindow *window,
static ViewFrameInfo *
-view_frame_info_new (gboolean is_sidebar_panel, const char *label)
+view_frame_info_new (gboolean is_sidebar_panel,
+ const NautilusViewIdentifier *id)
{
ViewFrameInfo *new_info;
- g_return_val_if_fail (label != NULL, NULL);
+ g_return_val_if_fail (id != NULL, NULL);
- new_info = g_new0 (ViewFrameInfo, 1);
+ new_info = g_new (ViewFrameInfo, 1);
new_info->is_sidebar_panel = is_sidebar_panel;
- new_info->label = g_strdup (label);
+ new_info->id = nautilus_view_identifier_copy (id);
return new_info;
}
@@ -773,7 +772,7 @@ static void
view_frame_info_free (ViewFrameInfo *info)
{
if (info != NULL) {
- g_free (info->label);
+ nautilus_view_identifier_free (info->id);
g_free (info);
}
}
@@ -781,11 +780,11 @@ view_frame_info_free (ViewFrameInfo *info)
static void
set_view_frame_info (NautilusViewFrame *view_frame,
gboolean is_sidebar_panel,
- const char *label)
+ const NautilusViewIdentifier *id)
{
gtk_object_set_data_full (GTK_OBJECT (view_frame),
"info",
- view_frame_info_new (is_sidebar_panel, label),
+ view_frame_info_new (is_sidebar_panel, id),
(GtkDestroyNotify) view_frame_info_free);
}
@@ -806,7 +805,17 @@ view_frame_get_label (NautilusViewFrame *view_frame)
info = (ViewFrameInfo *)gtk_object_get_data
(GTK_OBJECT (view_frame), "info");
- return g_strdup (info->label);
+ return g_strdup (info->id->name);
+}
+
+static NautilusViewIdentifier *
+view_frame_get_id (NautilusViewFrame *view_frame)
+{
+ ViewFrameInfo *info;
+
+ info = (ViewFrameInfo *)gtk_object_get_data
+ (GTK_OBJECT (view_frame), "info");
+ return nautilus_view_identifier_copy (info->id);
}
static void
@@ -913,6 +922,15 @@ set_to_pending_location_and_selection (NautilusWindow *window)
window->details->pending_selection = NULL;
}
+NautilusViewIdentifier *
+nautilus_window_get_content_view_id (NautilusWindow *window)
+{
+ if (window->content_view == NULL) {
+ return NULL;
+ }
+ return view_frame_get_id (window->content_view);
+}
+
gboolean
nautilus_window_content_view_matches_iid (NautilusWindow *window,
const char *iid)
@@ -961,9 +979,6 @@ load_content_view (NautilusWindow *window,
bonobo_ui_component_thaw (window->details->shell_ui, NULL);
- nautilus_view_identifier_free (window->content_view_id);
- window->content_view_id = nautilus_view_identifier_copy (id);
-
if (nautilus_window_content_view_matches_iid (window, iid)) {
/* reuse existing content view */
view = window->content_view;
@@ -977,7 +992,7 @@ load_content_view (NautilusWindow *window,
window->new_content_view = view;
gtk_object_ref (GTK_OBJECT (view));
gtk_object_sink (GTK_OBJECT (view));
- set_view_frame_info (view, FALSE, id->name);
+ set_view_frame_info (view, FALSE, id);
connect_view (window, view);
nautilus_view_frame_load_view (view, iid);
}
@@ -1538,7 +1553,7 @@ nautilus_window_set_sidebar_panels (NautilusWindow *window,
sidebar_panel = nautilus_view_frame_new (window->details->ui_container,
window->application->undo_manager);
nautilus_view_frame_set_label (sidebar_panel, identifier->name);
- set_view_frame_info (sidebar_panel, TRUE, identifier->name);
+ set_view_frame_info (sidebar_panel, TRUE, identifier);
connect_view (window, sidebar_panel);
nautilus_window_add_sidebar_panel (window, sidebar_panel);
nautilus_view_frame_load_view (sidebar_panel, identifier->iid);
diff --git a/src/nautilus-window-manage-views.h b/src/nautilus-window-manage-views.h
index 8ac96476c..b8ec7c113 100644
--- a/src/nautilus-window-manage-views.h
+++ b/src/nautilus-window-manage-views.h
@@ -4,7 +4,7 @@
* Nautilus
*
* Copyright (C) 1999, 2000 Red Hat, Inc.
- * Copyright (C) 1999, 2000 Eazel, Inc.
+ * Copyright (C) 1999, 2000, 2001 Eazel, Inc.
*
* Nautilus is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
@@ -20,7 +20,7 @@
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
- * Author: Elliot Lee <sopwith@redhat.com>
+ * Author: Darin Adler <darin@eazel.com>
*
*/
@@ -29,20 +29,22 @@
#include "nautilus-window.h"
-void nautilus_window_manage_views_destroy (NautilusWindow *window);
-void nautilus_window_open_location (NautilusWindow *window,
- const char *location);
-void nautilus_window_open_location_with_selection
- (NautilusWindow *window,
- const char *location,
- GList *selection);
-void nautilus_window_stop_loading (NautilusWindow *window);
-void nautilus_window_set_content_view (NautilusWindow *window,
- NautilusViewIdentifier *id);
-void nautilus_window_set_sidebar_panels (NautilusWindow *window,
- GList *view_identifier_list);
-void nautilus_window_back_or_forward (NautilusWindow *window,
- gboolean back,
- guint distance);
+void nautilus_window_manage_views_destroy (NautilusWindow *window);
+void nautilus_window_open_location (NautilusWindow *window,
+ const char *location);
+void nautilus_window_open_location_with_selection (NautilusWindow *window,
+ const char *location,
+ GList *selection);
+void nautilus_window_stop_loading (NautilusWindow *window);
+void nautilus_window_set_content_view (NautilusWindow *window,
+ NautilusViewIdentifier *id);
+void nautilus_window_set_sidebar_panels (NautilusWindow *window,
+ GList *view_identifier_list);
+void nautilus_window_back_or_forward (NautilusWindow *window,
+ gboolean back,
+ guint distance);
+gboolean nautilus_window_content_view_matches_iid (NautilusWindow *window,
+ const char *iid);
+NautilusViewIdentifier *nautilus_window_get_content_view_id (NautilusWindow *window);
#endif /* NAUTILUS_WINDOW_MANAGE_VIEWS_H */
diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h
index a485d8713..cbe62a2ef 100644
--- a/src/nautilus-window-private.h
+++ b/src/nautilus-window-private.h
@@ -123,8 +123,6 @@ struct NautilusWindowDetails
#define NAUTILUS_WINDOW_DEFAULT_WIDTH 800
#define NAUTILUS_WINDOW_DEFAULT_HEIGHT 550
-gboolean nautilus_window_content_view_matches_iid (NautilusWindow *window,
- const char *iid);
void nautilus_window_set_status (NautilusWindow *window,
const char *status);
void nautilus_window_load_view_as_menus (NautilusWindow *window);
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index d4c719765..010746fb3 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -936,8 +936,6 @@ nautilus_window_destroy (GtkObject *object)
g_list_free (window->sidebar_panels);
- nautilus_view_identifier_free (window->content_view_id);
-
free_stored_viewers (window);
g_free (window->details->location);
@@ -1239,22 +1237,39 @@ add_view_as_bonobo_menu_item (NautilusWindow *window,
g_free (tip);
}
+static void
+remove_first_child (GtkContainer *container)
+{
+ gtk_container_remove (container,
+ eel_gtk_container_get_first_child (container));
+}
+
/* Make a special first item in the "View as" option menu that represents
* the current content view. This should only be called if the current
* content view isn't already in the "View as" option menu.
*/
static void
-replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+update_extra_viewer_in_view_as_menus (NautilusWindow *window,
+ const NautilusViewIdentifier *id)
{
GtkWidget *menu;
- GtkWidget *first_menu_item;
GtkWidget *new_menu_item;
gboolean had_extra_viewer;
had_extra_viewer = window->details->extra_viewer != NULL;
+
+ if (id == NULL) {
+ if (!had_extra_viewer) {
+ return;
+ }
+ } else {
+ if (had_extra_viewer
+ && nautilus_view_identifier_compare (window->details->extra_viewer, id) == 0) {
+ return;
+ }
+ }
nautilus_view_identifier_free (window->details->extra_viewer);
- window->details->extra_viewer = nautilus_view_identifier_copy (window->content_view_id);
- g_assert (window->details->extra_viewer != NULL);
+ window->details->extra_viewer = nautilus_view_identifier_copy (id);
/* Update the View As option menu */
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (window->view_as_option_menu));
@@ -1265,28 +1280,54 @@ replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
gtk_widget_ref (menu);
gtk_option_menu_remove_menu (GTK_OPTION_MENU (window->view_as_option_menu));
+ /* Remove old menu item, and either remove or add separator. */
if (had_extra_viewer) {
- first_menu_item = eel_gtk_container_get_first_child (GTK_CONTAINER (menu));
- g_assert (first_menu_item != NULL);
- g_assert (GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (first_menu_item), "extra viewer")) == TRUE);
- gtk_container_remove (GTK_CONTAINER (menu), first_menu_item);
+ remove_first_child (GTK_CONTAINER (menu));
+ if (id == NULL) {
+ remove_first_child (GTK_CONTAINER (menu));
+ }
} else {
- /* Prepend separator. */
- gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ if (id != NULL) {
+ gtk_menu_prepend (GTK_MENU (menu), new_gtk_separator ());
+ }
}
- new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
- gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
- gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ /* Add new menu item. */
+ if (id != NULL) {
+ new_menu_item = create_view_as_menu_item (window, window->details->extra_viewer, 0);
+ gtk_object_set_data (GTK_OBJECT (new_menu_item), "extra viewer", GINT_TO_POINTER (TRUE));
+ gtk_menu_prepend (GTK_MENU (menu), new_menu_item);
+ }
gtk_option_menu_set_menu (GTK_OPTION_MENU (window->view_as_option_menu), menu);
gtk_widget_unref (menu);
/* Also update the Bonobo View menu item */
- add_view_as_bonobo_menu_item (window,
- NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
- window->details->extra_viewer,
- 0);
+ if (id == NULL) {
+ nautilus_bonobo_remove_menu_items_and_commands
+ (window->details->shell_ui, NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER);
+ } else {
+ add_view_as_bonobo_menu_item (window,
+ NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER,
+ window->details->extra_viewer,
+ 0);
+ }
+}
+
+static void
+remove_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ update_extra_viewer_in_view_as_menus (window, NULL);
+}
+
+static void
+replace_extra_viewer_in_view_as_menus (NautilusWindow *window)
+{
+ NautilusViewIdentifier *id;
+
+ id = nautilus_window_get_content_view_id (window);
+ update_extra_viewer_in_view_as_menus (window, id);
+ nautilus_view_identifier_free (id);
}
/**
@@ -1304,8 +1345,6 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
int index;
char *verb_name, *command_path;
GList *node;
- int option_menu_index;
- int numbered_menu_item_index;
const char *numbered_menu_item_container_path;
g_return_if_fail (NAUTILUS_IS_WINDOW (window));
@@ -1314,50 +1353,31 @@ nautilus_window_synch_view_as_menus (NautilusWindow *window)
return;
}
- option_menu_index = -1;
- numbered_menu_item_index = -1;
- numbered_menu_item_container_path = 0;
-
- if (window->details->extra_viewer != NULL &&
- nautilus_window_content_view_matches_iid (window, window->details->extra_viewer->iid)) {
- option_menu_index = 0;
- numbered_menu_item_index = 0;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
- } else {
- for (node = window->details->short_list_viewers, index = 0;
- node != NULL;
- node = node->next, ++index) {
- if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
- option_menu_index = window->details->extra_viewer == NULL
- ? index
- : index + 2;
- numbered_menu_item_index = index;
- numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
- break;
- }
+ for (node = window->details->short_list_viewers, index = 0;
+ node != NULL;
+ node = node->next, ++index) {
+ if (nautilus_window_content_view_matches_iid (window, ((NautilusViewIdentifier *)node->data)->iid)) {
+ break;
}
}
-
- if (option_menu_index == -1) {
+ if (node == NULL) {
replace_extra_viewer_in_view_as_menus (window);
- option_menu_index = 0;
- numbered_menu_item_index = 0;
+ index = 0;
numbered_menu_item_container_path = NAUTILUS_MENU_PATH_EXTRA_VIEWER_PLACEHOLDER;
+ } else {
+ remove_extra_viewer_in_view_as_menus (window);
+ numbered_menu_item_container_path = NAUTILUS_MENU_PATH_SHORT_LIST_PLACEHOLDER;
}
- g_assert (option_menu_index >= 0);
- g_assert (numbered_menu_item_index >= 0);
g_assert (numbered_menu_item_container_path != NULL);
/* Make option menu show the right item */
- gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu),
- option_menu_index);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (window->view_as_option_menu), index);
/* Make View menu in menu bar mark the right item */
verb_name = nautilus_bonobo_get_numbered_menu_item_command
(window->details->shell_ui,
- numbered_menu_item_container_path,
- numbered_menu_item_index);
+ numbered_menu_item_container_path, index);
command_path = g_strconcat (COMMAND_PREFIX, verb_name, NULL);
nautilus_bonobo_set_toggle_state (window->details->shell_ui, command_path, TRUE);
g_free (command_path);
@@ -1380,9 +1400,6 @@ chose_component_callback (NautilusViewIdentifier *identifier, gpointer callback_
* now, hardwire this case, which is the most obvious one by
* far.
*/
- /* FIXME bugzilla.eazel.com 8000: It's possible to get the
- * same view listed twice in the menu due to this call.
- */
nautilus_window_load_view_as_menus (window);
}
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index f17348f47..d3d189133 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -94,7 +94,6 @@ struct NautilusWindow {
/* Current views stuff */
NautilusViewFrame *content_view;
- NautilusViewIdentifier *content_view_id;
GList *sidebar_panels;
/* Widgets to keep track of (for state changes, etc) */