diff options
author | Darin Adler <darin@src.gnome.org> | 2001-04-19 22:33:59 +0000 |
---|---|---|
committer | Darin Adler <darin@src.gnome.org> | 2001-04-19 22:33:59 +0000 |
commit | 670fd0d0896d1f76172e991784c9bfd247bc2a7a (patch) | |
tree | 579e0513477478d10fa95e82ed27a97df47275bd /src | |
parent | c41c44e4f19fe781e1e6d0702ea5e8d2a31b4a07 (diff) | |
download | nautilus-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.c | 127 | ||||
-rw-r--r-- | src/nautilus-navigation-window.h | 1 | ||||
-rw-r--r-- | src/nautilus-object-window.c | 127 | ||||
-rw-r--r-- | src/nautilus-object-window.h | 1 | ||||
-rw-r--r-- | src/nautilus-spatial-window.c | 127 | ||||
-rw-r--r-- | src/nautilus-spatial-window.h | 1 | ||||
-rw-r--r-- | src/nautilus-window-manage-views.c | 51 | ||||
-rw-r--r-- | src/nautilus-window-manage-views.h | 36 | ||||
-rw-r--r-- | src/nautilus-window-private.h | 2 | ||||
-rw-r--r-- | src/nautilus-window.c | 127 | ||||
-rw-r--r-- | src/nautilus-window.h | 1 |
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) */ |