diff options
Diffstat (limited to 'src/nautilus-list-view.c')
-rw-r--r-- | src/nautilus-list-view.c | 5147 |
1 files changed, 2737 insertions, 2410 deletions
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c index 4e69434b6..490b4bafb 100644 --- a/src/nautilus-list-view.c +++ b/src/nautilus-list-view.c @@ -1,27 +1,26 @@ - /* fm-list-view.c - implementation of list view of directory. - - Copyright (C) 2000 Eazel, Inc. - Copyright (C) 2001, 2002 Anders Carlsson <andersca@gnu.org> - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Authors: John Sullivan <sullivan@eazel.com> - Anders Carlsson <andersca@gnu.org> - David Emory Watson <dwatson@cs.ucr.edu> -*/ + * + * Copyright (C) 2000 Eazel, Inc. + * Copyright (C) 2001, 2002 Anders Carlsson <andersca@gnu.org> + * + * The Gnome Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * The Gnome Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * see <http://www.gnu.org/licenses/>. + * + * Authors: John Sullivan <sullivan@eazel.com> + * Anders Carlsson <andersca@gnu.org> + * David Emory Watson <dwatson@cs.ucr.edu> + */ #include <config.h> #include "nautilus-list-view.h" @@ -65,9 +64,10 @@ * in the edges if the window is small */ #define RENAME_POPOVER_RELATIVE_TO_RECTANGLE_WIDTH 40 -struct SelectionForeachData { - GList *list; - GtkTreeSelection *selection; +struct SelectionForeachData +{ + GList *list; + GtkTreeSelection *selection; }; /* @@ -75,1335 +75,1520 @@ struct SelectionForeachData { * Computing this would be costly, so we just choose a number * that works well with the set of emblems we've designed. */ -#define LIST_VIEW_MINIMUM_ROW_HEIGHT 28 +#define LIST_VIEW_MINIMUM_ROW_HEIGHT 28 /* We wait two seconds after row is collapsed to unload the subdirectory */ #define COLLAPSE_TO_UNLOAD_DELAY 2 -static GdkCursor * hand_cursor = NULL; +static GdkCursor *hand_cursor = NULL; -static GList *nautilus_list_view_get_selection (NautilusFilesView *view); -static GList *nautilus_list_view_get_selection_for_file_transfer (NautilusFilesView *view); -static void nautilus_list_view_set_zoom_level (NautilusListView *view, - NautilusListZoomLevel new_level); -static void nautilus_list_view_scroll_to_file (NautilusListView *view, - NautilusFile *file); +static GList *nautilus_list_view_get_selection (NautilusFilesView *view); +static GList *nautilus_list_view_get_selection_for_file_transfer (NautilusFilesView *view); +static void nautilus_list_view_set_zoom_level (NautilusListView *view, + NautilusListZoomLevel new_level); +static void nautilus_list_view_scroll_to_file (NautilusListView *view, + NautilusFile *file); -static void apply_columns_settings (NautilusListView *list_view, - char **column_order, - char **visible_columns); -static char **get_visible_columns (NautilusListView *list_view); -static char **get_default_visible_columns (NautilusListView *list_view); -static char **get_column_order (NautilusListView *list_view); -static char **get_default_column_order (NautilusListView *list_view); +static void apply_columns_settings (NautilusListView *list_view, + char **column_order, + char **visible_columns); +static char **get_visible_columns (NautilusListView *list_view); +static char **get_default_visible_columns (NautilusListView *list_view); +static char **get_column_order (NautilusListView *list_view); +static char **get_default_column_order (NautilusListView *list_view); G_DEFINE_TYPE (NautilusListView, nautilus_list_view, NAUTILUS_TYPE_FILES_VIEW); -static const char * default_search_visible_columns[] = { - "name", "size", "where", NULL +static const char *default_search_visible_columns[] = +{ + "name", "size", "where", NULL }; -static const char * default_search_columns_order[] = { - "name", "size", "where", NULL +static const char *default_search_columns_order[] = +{ + "name", "size", "where", NULL }; -static const char * default_trash_visible_columns[] = { - "name", "size", "trash_orig_path", "trashed_on", NULL +static const char *default_trash_visible_columns[] = +{ + "name", "size", "trash_orig_path", "trashed_on", NULL }; -static const char * default_trash_columns_order[] = { - "name", "size", "trash_orig_path", "trashed_on", NULL +static const char *default_trash_columns_order[] = +{ + "name", "size", "trash_orig_path", "trashed_on", NULL }; -static const gchar* -get_default_sort_order (NautilusFile *file, gboolean *reversed) +static const gchar * +get_default_sort_order (NautilusFile *file, + gboolean *reversed) { - NautilusFileSortType default_sort_order; - gboolean default_sort_reversed; - const gchar *retval; - const char *attributes[] = { - "name", /* is really "manually" which doesn't apply to lists */ - "name", - "size", - "type", - "date_modified", - "date_accessed", - "trashed_on", - NULL - }; + NautilusFileSortType default_sort_order; + gboolean default_sort_reversed; + const gchar *retval; + const char *attributes[] = + { + "name", /* is really "manually" which doesn't apply to lists */ + "name", + "size", + "type", + "date_modified", + "date_accessed", + "trashed_on", + NULL + }; - retval = nautilus_file_get_default_sort_attribute (file, reversed); + retval = nautilus_file_get_default_sort_attribute (file, reversed); - if (retval == NULL) { - default_sort_order = g_settings_get_enum (nautilus_preferences, - NAUTILUS_PREFERENCES_DEFAULT_SORT_ORDER); - default_sort_reversed = g_settings_get_boolean (nautilus_preferences, - NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER); + if (retval == NULL) + { + default_sort_order = g_settings_get_enum (nautilus_preferences, + NAUTILUS_PREFERENCES_DEFAULT_SORT_ORDER); + default_sort_reversed = g_settings_get_boolean (nautilus_preferences, + NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER); - retval = attributes[default_sort_order]; - *reversed = default_sort_reversed; - } + retval = attributes[default_sort_order]; + *reversed = default_sort_reversed; + } - return retval; + return retval; } static void -list_selection_changed_callback (GtkTreeSelection *selection, gpointer user_data) +list_selection_changed_callback (GtkTreeSelection *selection, + gpointer user_data) { - NautilusFilesView *view; + NautilusFilesView *view; - view = NAUTILUS_FILES_VIEW (user_data); + view = NAUTILUS_FILES_VIEW (user_data); - nautilus_files_view_notify_selection_changed (view); + nautilus_files_view_notify_selection_changed (view); } /* Move these to eel? */ static void tree_selection_foreach_set_boolean (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer callback_data) + GtkTreePath *path, + GtkTreeIter *iter, + gpointer callback_data) { - * (gboolean *) callback_data = TRUE; + *(gboolean *) callback_data = TRUE; } static gboolean tree_selection_not_empty (GtkTreeSelection *selection) { - gboolean not_empty; + gboolean not_empty; - not_empty = FALSE; - gtk_tree_selection_selected_foreach (selection, - tree_selection_foreach_set_boolean, - ¬_empty); - return not_empty; + not_empty = FALSE; + gtk_tree_selection_selected_foreach (selection, + tree_selection_foreach_set_boolean, + ¬_empty); + return not_empty; } static gboolean tree_view_has_selection (GtkTreeView *view) { - return tree_selection_not_empty (gtk_tree_view_get_selection (view)); + return tree_selection_not_empty (gtk_tree_view_get_selection (view)); } static void preview_selected_items (NautilusListView *view) { - GList *file_list; - - file_list = nautilus_list_view_get_selection (NAUTILUS_FILES_VIEW (view)); + GList *file_list; + + file_list = nautilus_list_view_get_selection (NAUTILUS_FILES_VIEW (view)); - if (file_list != NULL) { - nautilus_files_view_preview_files (NAUTILUS_FILES_VIEW (view), - file_list, NULL); - nautilus_file_list_free (file_list); - } + if (file_list != NULL) + { + nautilus_files_view_preview_files (NAUTILUS_FILES_VIEW (view), + file_list, NULL); + nautilus_file_list_free (file_list); + } } static void activate_selected_items (NautilusListView *view) { - GList *file_list; - - file_list = nautilus_list_view_get_selection (NAUTILUS_FILES_VIEW (view)); - nautilus_files_view_activate_files (NAUTILUS_FILES_VIEW (view), - file_list, - 0, TRUE); - nautilus_file_list_free (file_list); + GList *file_list; + file_list = nautilus_list_view_get_selection (NAUTILUS_FILES_VIEW (view)); + nautilus_files_view_activate_files (NAUTILUS_FILES_VIEW (view), + file_list, + 0, TRUE); + nautilus_file_list_free (file_list); } static void activate_selected_items_alternate (NautilusListView *view, - NautilusFile *file, - gboolean open_in_tab) -{ - GList *file_list; - NautilusWindowOpenFlags flags; - - flags = 0; - - if (open_in_tab) { - flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB; - flags |= NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE; - } else { - flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW; - } - - if (file != NULL) { - nautilus_file_ref (file); - file_list = g_list_prepend (NULL, file); - } else { - file_list = nautilus_list_view_get_selection (NAUTILUS_FILES_VIEW (view)); - } - nautilus_files_view_activate_files (NAUTILUS_FILES_VIEW (view), - file_list, - flags, - TRUE); - nautilus_file_list_free (file_list); - + NautilusFile *file, + gboolean open_in_tab) +{ + GList *file_list; + NautilusWindowOpenFlags flags; + + flags = 0; + + if (open_in_tab) + { + flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB; + flags |= NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE; + } + else + { + flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW; + } + + if (file != NULL) + { + nautilus_file_ref (file); + file_list = g_list_prepend (NULL, file); + } + else + { + file_list = nautilus_list_view_get_selection (NAUTILUS_FILES_VIEW (view)); + } + nautilus_files_view_activate_files (NAUTILUS_FILES_VIEW (view), + file_list, + flags, + TRUE); + nautilus_file_list_free (file_list); } static gboolean button_event_modifies_selection (GdkEventButton *event) { - return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0; + return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0; } static int get_click_policy (void) { - return g_settings_get_enum (nautilus_preferences, - NAUTILUS_PREFERENCES_CLICK_POLICY); + return g_settings_get_enum (nautilus_preferences, + NAUTILUS_PREFERENCES_CLICK_POLICY); } static void nautilus_list_view_did_not_drag (NautilusListView *view, - GdkEventButton *event) -{ - GtkTreeView *tree_view; - GtkTreeSelection *selection; - GtkTreePath *path; - - tree_view = view->details->tree_view; - selection = gtk_tree_view_get_selection (tree_view); - - if (gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, - &path, NULL, NULL, NULL)) { - if ((event->button == 1 || event->button == 2) - && ((event->state & GDK_CONTROL_MASK) != 0 || - (event->state & GDK_SHIFT_MASK) == 0) - && view->details->row_selected_on_button_down) { - if (!button_event_modifies_selection (event)) { - gtk_tree_selection_unselect_all (selection); - gtk_tree_selection_select_path (selection, path); - } else { - gtk_tree_selection_unselect_path (selection, path); - } - } - - if ((get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) - && !button_event_modifies_selection(event)) { - if (event->button == 1) { - activate_selected_items (view); - } else if (event->button == 2) { - activate_selected_items_alternate (view, NULL, TRUE); - } - } - gtk_tree_path_free (path); - } - + GdkEventButton *event) +{ + GtkTreeView *tree_view; + GtkTreeSelection *selection; + GtkTreePath *path; + + tree_view = view->details->tree_view; + selection = gtk_tree_view_get_selection (tree_view); + + if (gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, + &path, NULL, NULL, NULL)) + { + if ((event->button == 1 || event->button == 2) + && ((event->state & GDK_CONTROL_MASK) != 0 || + (event->state & GDK_SHIFT_MASK) == 0) + && view->details->row_selected_on_button_down) + { + if (!button_event_modifies_selection (event)) + { + gtk_tree_selection_unselect_all (selection); + gtk_tree_selection_select_path (selection, path); + } + else + { + gtk_tree_selection_unselect_path (selection, path); + } + } + + if ((get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) + && !button_event_modifies_selection (event)) + { + if (event->button == 1) + { + activate_selected_items (view); + } + else if (event->button == 2) + { + activate_selected_items_alternate (view, NULL, TRUE); + } + } + gtk_tree_path_free (path); + } } static gboolean -motion_notify_callback (GtkWidget *widget, - GdkEventMotion *event, - gpointer callback_data) -{ - NautilusListView *view; - gboolean handled = FALSE; - - view = NAUTILUS_LIST_VIEW (callback_data); - - if (event->window != gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget))) { - return FALSE; - } - - if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) { - GtkTreePath *old_hover_path; - - old_hover_path = view->details->hover_path; - gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), - event->x, event->y, - &view->details->hover_path, - NULL, NULL, NULL); - - if ((old_hover_path != NULL) != (view->details->hover_path != NULL)) { - if (view->details->hover_path != NULL) { - gdk_window_set_cursor (gtk_widget_get_window (widget), hand_cursor); - } else { - gdk_window_set_cursor (gtk_widget_get_window (widget), NULL); - } - } +motion_notify_callback (GtkWidget *widget, + GdkEventMotion *event, + gpointer callback_data) +{ + NautilusListView *view; + gboolean handled = FALSE; + + view = NAUTILUS_LIST_VIEW (callback_data); + + if (event->window != gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget))) + { + return FALSE; + } + + if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) + { + GtkTreePath *old_hover_path; + + old_hover_path = view->details->hover_path; + gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), + event->x, event->y, + &view->details->hover_path, + NULL, NULL, NULL); + + if ((old_hover_path != NULL) != (view->details->hover_path != NULL)) + { + if (view->details->hover_path != NULL) + { + gdk_window_set_cursor (gtk_widget_get_window (widget), hand_cursor); + } + else + { + gdk_window_set_cursor (gtk_widget_get_window (widget), NULL); + } + } - if (old_hover_path != NULL) { - gtk_tree_path_free (old_hover_path); - } - } + if (old_hover_path != NULL) + { + gtk_tree_path_free (old_hover_path); + } + } - nautilus_list_view_dnd_init (view); - handled = nautilus_list_view_dnd_drag_begin (view, event); + nautilus_list_view_dnd_init (view); + handled = nautilus_list_view_dnd_drag_begin (view, event); - return handled; + return handled; } static gboolean -leave_notify_callback (GtkWidget *widget, - GdkEventCrossing *event, - gpointer callback_data) +leave_notify_callback (GtkWidget *widget, + GdkEventCrossing *event, + gpointer callback_data) { - NautilusListView *view; + NautilusListView *view; - view = NAUTILUS_LIST_VIEW (callback_data); + view = NAUTILUS_LIST_VIEW (callback_data); - if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE && - view->details->hover_path != NULL) { - gtk_tree_path_free (view->details->hover_path); - view->details->hover_path = NULL; - } + if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE && + view->details->hover_path != NULL) + { + gtk_tree_path_free (view->details->hover_path); + view->details->hover_path = NULL; + } - return FALSE; + return FALSE; } static gboolean -enter_notify_callback (GtkWidget *widget, - GdkEventCrossing *event, - gpointer callback_data) +enter_notify_callback (GtkWidget *widget, + GdkEventCrossing *event, + gpointer callback_data) { - NautilusListView *view; + NautilusListView *view; - view = NAUTILUS_LIST_VIEW (callback_data); + view = NAUTILUS_LIST_VIEW (callback_data); - if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) { - if (view->details->hover_path != NULL) { - gtk_tree_path_free (view->details->hover_path); - } + if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) + { + if (view->details->hover_path != NULL) + { + gtk_tree_path_free (view->details->hover_path); + } - gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), - event->x, event->y, - &view->details->hover_path, - NULL, NULL, NULL); + gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), + event->x, event->y, + &view->details->hover_path, + NULL, NULL, NULL); - if (view->details->hover_path != NULL) { - gdk_window_set_cursor (gtk_widget_get_window (widget), hand_cursor); - } - } + if (view->details->hover_path != NULL) + { + gdk_window_set_cursor (gtk_widget_get_window (widget), hand_cursor); + } + } - return FALSE; + return FALSE; } static void -do_popup_menu (GtkWidget *widget, NautilusListView *view, GdkEventButton *event) +do_popup_menu (GtkWidget *widget, + NautilusListView *view, + GdkEventButton *event) { - if (tree_view_has_selection (GTK_TREE_VIEW (widget))) { - nautilus_files_view_pop_up_selection_context_menu (NAUTILUS_FILES_VIEW (view), event); - } else { - nautilus_files_view_pop_up_background_context_menu (NAUTILUS_FILES_VIEW (view), event); - } + if (tree_view_has_selection (GTK_TREE_VIEW (widget))) + { + nautilus_files_view_pop_up_selection_context_menu (NAUTILUS_FILES_VIEW (view), event); + } + else + { + nautilus_files_view_pop_up_background_context_menu (NAUTILUS_FILES_VIEW (view), event); + } } static void -row_activated_callback (GtkTreeView *treeview, GtkTreePath *path, - GtkTreeViewColumn *column, NautilusListView *view) +row_activated_callback (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + NautilusListView *view) { - activate_selected_items (view); + activate_selected_items (view); } static gboolean -button_press_callback (GtkWidget *widget, GdkEventButton *event, gpointer callback_data) -{ - NautilusListView *view; - GtkTreeView *tree_view; - GtkTreePath *path; - GtkTreeSelection *selection; - GtkWidgetClass *tree_view_class; - gint64 current_time; - static gint64 last_click_time = 0; - static int click_count = 0; - int double_click_time; - gboolean call_parent, on_expander, show_expanders; - gboolean is_simple_click, path_selected; - NautilusFile *file; - - view = NAUTILUS_LIST_VIEW (callback_data); - tree_view = GTK_TREE_VIEW (widget); - tree_view_class = GTK_WIDGET_GET_CLASS (tree_view); - selection = gtk_tree_view_get_selection (tree_view); - view->details->last_event_button_x = event->x; - view->details->last_event_button_y = event->y; - - /* Don't handle extra mouse buttons here */ - if (event->button > 5) { - return FALSE; - } - - if (event->window != gtk_tree_view_get_bin_window (tree_view)) { - return FALSE; - } - - nautilus_list_model_set_drag_view - (NAUTILUS_LIST_MODEL (gtk_tree_view_get_model (tree_view)), - tree_view, - event->x, event->y); - - g_object_get (G_OBJECT (gtk_widget_get_settings (widget)), - "gtk-double-click-time", &double_click_time, - NULL); - - /* Determine click count */ - current_time = g_get_monotonic_time (); - if (current_time - last_click_time < double_click_time * 1000) { - click_count++; - } else { - click_count = 0; - } - - /* Stash time for next compare */ - last_click_time = current_time; - - /* Ignore double click if we are in single click mode */ - if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE && click_count >= 2) { - return TRUE; - } - - view->details->ignore_button_release = FALSE; - is_simple_click = ((event->button == 1 || event->button == 2) && (event->type == GDK_BUTTON_PRESS)); - - /* No item at this position */ - if (!gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, - &path, NULL, NULL, NULL)) { - if (is_simple_click) { - g_clear_pointer (&view->details->double_click_path[1], gtk_tree_path_free); - view->details->double_click_path[1] = view->details->double_click_path[0]; - view->details->double_click_path[0] = NULL; - } - - /* Deselect if people click outside any row. It's OK to - let default code run; it won't reselect anything. */ - gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (tree_view)); - tree_view_class->button_press_event (widget, event); - - if (event->button == 3) { - do_popup_menu (widget, view, event); - } - - return TRUE; - } - - call_parent = TRUE; - on_expander = FALSE; - path_selected = gtk_tree_selection_path_is_selected (selection, path); - show_expanders = g_settings_get_boolean (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE); - - if (show_expanders) { - int expander_size, horizontal_separator; - gtk_widget_style_get (widget, - "expander-size", &expander_size, - "horizontal-separator", &horizontal_separator, - NULL); - /* TODO we should not hardcode this extra padding. It is - * EXPANDER_EXTRA_PADDING from GtkTreeView. - */ - expander_size += 4; - on_expander = (event->x <= horizontal_separator / 2 + - gtk_tree_path_get_depth (path) * expander_size); - } - - /* Keep track of path of last click so double clicks only happen - * on the same item */ - if (is_simple_click) { - g_clear_pointer (&view->details->double_click_path[1], gtk_tree_path_free); - view->details->double_click_path[1] = view->details->double_click_path[0]; - view->details->double_click_path[0] = gtk_tree_path_copy (path); - } - - if (event->type == GDK_2BUTTON_PRESS) { - /* Double clicking does not trigger a D&D action. */ - view->details->drag_button = 0; - - /* NOTE: Activation can actually destroy the view if we're switching */ - if (!on_expander && - view->details->double_click_path[1] && - gtk_tree_path_compare (view->details->double_click_path[0], view->details->double_click_path[1]) == 0) { - if ((event->button == 1) && button_event_modifies_selection (event)) { - file = nautilus_list_model_file_for_path (view->details->model, path); - if (file != NULL) { - activate_selected_items_alternate (view, file, TRUE); - nautilus_file_unref (file); - } - } else { - if ((event->button == 1 || event->button == 3)) { - activate_selected_items (view); - } else if (event->button == 2) { - activate_selected_items_alternate (view, NULL, TRUE); - } - } - } else { - tree_view_class->button_press_event (widget, event); - } - } else { - /* We're going to filter out some situations where - * we can't let the default code run because all - * but one row would be would be deselected. We don't - * want that; we want the right click menu or single - * click to apply to everything that's currently selected. - */ - if (event->button == 3 && path_selected) { - call_parent = FALSE; - } - - if ((event->button == 1 || event->button == 2) && - ((event->state & GDK_CONTROL_MASK) != 0 || (event->state & GDK_SHIFT_MASK) == 0)) { - view->details->row_selected_on_button_down = path_selected; - - if (path_selected) { - call_parent = on_expander; - view->details->ignore_button_release = on_expander; - } else if ((event->state & GDK_CONTROL_MASK) != 0) { - GList *selected_rows, *l; - - call_parent = FALSE; - if ((event->state & GDK_SHIFT_MASK) != 0) { - GtkTreePath *cursor; - gtk_tree_view_get_cursor (tree_view, &cursor, NULL); - if (cursor != NULL) { - gtk_tree_selection_select_range (selection, cursor, path); - } else { - gtk_tree_selection_select_path (selection, path); - } - } else { - gtk_tree_selection_select_path (selection, path); - } - selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); - - /* This unselects everything */ - gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE); - - /* So select it again */ - for (l = selected_rows; l != NULL; l = l->next) { - gtk_tree_selection_select_path (selection, l->data); - } - g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free); - } else { - view->details->ignore_button_release = on_expander; - } - } - - if (call_parent) { - g_signal_handlers_block_by_func (tree_view, row_activated_callback, view); - tree_view_class->button_press_event (widget, event); - g_signal_handlers_unblock_by_func (tree_view, row_activated_callback, view); - } else if (path_selected) { - gtk_widget_grab_focus (widget); - } - - if (is_simple_click && !on_expander) { - view->details->drag_started = FALSE; - view->details->drag_button = event->button; - view->details->drag_x = event->x; - view->details->drag_y = event->y; - } - - if (event->button == 3) { - do_popup_menu (widget, view, event); - } - } - - gtk_tree_path_free (path); - - /* We chained to the default handler in this method, so never - * let the default handler run */ - return TRUE; +button_press_callback (GtkWidget *widget, + GdkEventButton *event, + gpointer callback_data) +{ + NautilusListView *view; + GtkTreeView *tree_view; + GtkTreePath *path; + GtkTreeSelection *selection; + GtkWidgetClass *tree_view_class; + gint64 current_time; + static gint64 last_click_time = 0; + static int click_count = 0; + int double_click_time; + gboolean call_parent, on_expander, show_expanders; + gboolean is_simple_click, path_selected; + NautilusFile *file; + + view = NAUTILUS_LIST_VIEW (callback_data); + tree_view = GTK_TREE_VIEW (widget); + tree_view_class = GTK_WIDGET_GET_CLASS (tree_view); + selection = gtk_tree_view_get_selection (tree_view); + view->details->last_event_button_x = event->x; + view->details->last_event_button_y = event->y; + + /* Don't handle extra mouse buttons here */ + if (event->button > 5) + { + return FALSE; + } + + if (event->window != gtk_tree_view_get_bin_window (tree_view)) + { + return FALSE; + } + + nautilus_list_model_set_drag_view + (NAUTILUS_LIST_MODEL (gtk_tree_view_get_model (tree_view)), + tree_view, + event->x, event->y); + + g_object_get (G_OBJECT (gtk_widget_get_settings (widget)), + "gtk-double-click-time", &double_click_time, + NULL); + + /* Determine click count */ + current_time = g_get_monotonic_time (); + if (current_time - last_click_time < double_click_time * 1000) + { + click_count++; + } + else + { + click_count = 0; + } + + /* Stash time for next compare */ + last_click_time = current_time; + + /* Ignore double click if we are in single click mode */ + if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE && click_count >= 2) + { + return TRUE; + } + + view->details->ignore_button_release = FALSE; + is_simple_click = ((event->button == 1 || event->button == 2) && (event->type == GDK_BUTTON_PRESS)); + + /* No item at this position */ + if (!gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, + &path, NULL, NULL, NULL)) + { + if (is_simple_click) + { + g_clear_pointer (&view->details->double_click_path[1], gtk_tree_path_free); + view->details->double_click_path[1] = view->details->double_click_path[0]; + view->details->double_click_path[0] = NULL; + } + + /* Deselect if people click outside any row. It's OK to + * let default code run; it won't reselect anything. */ + gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (tree_view)); + tree_view_class->button_press_event (widget, event); + + if (event->button == 3) + { + do_popup_menu (widget, view, event); + } + + return TRUE; + } + + call_parent = TRUE; + on_expander = FALSE; + path_selected = gtk_tree_selection_path_is_selected (selection, path); + show_expanders = g_settings_get_boolean (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE); + + if (show_expanders) + { + int expander_size, horizontal_separator; + gtk_widget_style_get (widget, + "expander-size", &expander_size, + "horizontal-separator", &horizontal_separator, + NULL); + /* TODO we should not hardcode this extra padding. It is + * EXPANDER_EXTRA_PADDING from GtkTreeView. + */ + expander_size += 4; + on_expander = (event->x <= horizontal_separator / 2 + + gtk_tree_path_get_depth (path) * expander_size); + } + + /* Keep track of path of last click so double clicks only happen + * on the same item */ + if (is_simple_click) + { + g_clear_pointer (&view->details->double_click_path[1], gtk_tree_path_free); + view->details->double_click_path[1] = view->details->double_click_path[0]; + view->details->double_click_path[0] = gtk_tree_path_copy (path); + } + + if (event->type == GDK_2BUTTON_PRESS) + { + /* Double clicking does not trigger a D&D action. */ + view->details->drag_button = 0; + + /* NOTE: Activation can actually destroy the view if we're switching */ + if (!on_expander && + view->details->double_click_path[1] && + gtk_tree_path_compare (view->details->double_click_path[0], view->details->double_click_path[1]) == 0) + { + if ((event->button == 1) && button_event_modifies_selection (event)) + { + file = nautilus_list_model_file_for_path (view->details->model, path); + if (file != NULL) + { + activate_selected_items_alternate (view, file, TRUE); + nautilus_file_unref (file); + } + } + else + { + if ((event->button == 1 || event->button == 3)) + { + activate_selected_items (view); + } + else if (event->button == 2) + { + activate_selected_items_alternate (view, NULL, TRUE); + } + } + } + else + { + tree_view_class->button_press_event (widget, event); + } + } + else + { + /* We're going to filter out some situations where + * we can't let the default code run because all + * but one row would be would be deselected. We don't + * want that; we want the right click menu or single + * click to apply to everything that's currently selected. + */ + if (event->button == 3 && path_selected) + { + call_parent = FALSE; + } + + if ((event->button == 1 || event->button == 2) && + ((event->state & GDK_CONTROL_MASK) != 0 || (event->state & GDK_SHIFT_MASK) == 0)) + { + view->details->row_selected_on_button_down = path_selected; + + if (path_selected) + { + call_parent = on_expander; + view->details->ignore_button_release = on_expander; + } + else if ((event->state & GDK_CONTROL_MASK) != 0) + { + GList *selected_rows, *l; + + call_parent = FALSE; + if ((event->state & GDK_SHIFT_MASK) != 0) + { + GtkTreePath *cursor; + gtk_tree_view_get_cursor (tree_view, &cursor, NULL); + if (cursor != NULL) + { + gtk_tree_selection_select_range (selection, cursor, path); + } + else + { + gtk_tree_selection_select_path (selection, path); + } + } + else + { + gtk_tree_selection_select_path (selection, path); + } + selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); + + /* This unselects everything */ + gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE); + + /* So select it again */ + for (l = selected_rows; l != NULL; l = l->next) + { + gtk_tree_selection_select_path (selection, l->data); + } + g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free); + } + else + { + view->details->ignore_button_release = on_expander; + } + } + + if (call_parent) + { + g_signal_handlers_block_by_func (tree_view, row_activated_callback, view); + tree_view_class->button_press_event (widget, event); + g_signal_handlers_unblock_by_func (tree_view, row_activated_callback, view); + } + else if (path_selected) + { + gtk_widget_grab_focus (widget); + } + + if (is_simple_click && !on_expander) + { + view->details->drag_started = FALSE; + view->details->drag_button = event->button; + view->details->drag_x = event->x; + view->details->drag_y = event->y; + } + + if (event->button == 3) + { + do_popup_menu (widget, view, event); + } + } + + gtk_tree_path_free (path); + + /* We chained to the default handler in this method, so never + * let the default handler run */ + return TRUE; } static gboolean -button_release_callback (GtkWidget *widget, - GdkEventButton *event, - gpointer callback_data) +button_release_callback (GtkWidget *widget, + GdkEventButton *event, + gpointer callback_data) { - NautilusListView *view; - - view = NAUTILUS_LIST_VIEW (callback_data); + NautilusListView *view; - if (event->button == view->details->drag_button) { - view->details->drag_button = 0; - if (!view->details->drag_started && - !view->details->ignore_button_release) { - nautilus_list_view_did_not_drag (view, event); - } - } - return FALSE; + view = NAUTILUS_LIST_VIEW (callback_data); + + if (event->button == view->details->drag_button) + { + view->details->drag_button = 0; + if (!view->details->drag_started && + !view->details->ignore_button_release) + { + nautilus_list_view_did_not_drag (view, event); + } + } + return FALSE; } static gboolean -popup_menu_callback (GtkWidget *widget, gpointer callback_data) +popup_menu_callback (GtkWidget *widget, + gpointer callback_data) { - NautilusListView *view; + NautilusListView *view; - view = NAUTILUS_LIST_VIEW (callback_data); + view = NAUTILUS_LIST_VIEW (callback_data); - do_popup_menu (widget, view, NULL); + do_popup_menu (widget, view, NULL); - return TRUE; + return TRUE; } static void -subdirectory_done_loading_callback (NautilusDirectory *directory, NautilusListView *view) +subdirectory_done_loading_callback (NautilusDirectory *directory, + NautilusListView *view) { - nautilus_list_model_subdirectory_done_loading (view->details->model, directory); + nautilus_list_model_subdirectory_done_loading (view->details->model, directory); } static void row_expanded_callback (GtkTreeView *treeview, - GtkTreeIter *iter, - GtkTreePath *path, - gpointer callback_data) + GtkTreeIter *iter, + GtkTreePath *path, + gpointer callback_data) { - NautilusListView *view; - NautilusDirectory *directory; - char *uri; + NautilusListView *view; + NautilusDirectory *directory; + char *uri; - view = NAUTILUS_LIST_VIEW (callback_data); + view = NAUTILUS_LIST_VIEW (callback_data); - if (!nautilus_list_model_load_subdirectory (view->details->model, path, &directory)) { - return; - } + if (!nautilus_list_model_load_subdirectory (view->details->model, path, &directory)) + { + return; + } - uri = nautilus_directory_get_uri (directory); - DEBUG ("Row expaded callback for uri %s", uri); - g_free (uri); + uri = nautilus_directory_get_uri (directory); + DEBUG ("Row expaded callback for uri %s", uri); + g_free (uri); - nautilus_files_view_add_subdirectory (NAUTILUS_FILES_VIEW (view), directory); + nautilus_files_view_add_subdirectory (NAUTILUS_FILES_VIEW (view), directory); - if (nautilus_directory_are_all_files_seen (directory)) { - nautilus_list_model_subdirectory_done_loading (view->details->model, - directory); - } else { - g_signal_connect_object (directory, "done-loading", - G_CALLBACK (subdirectory_done_loading_callback), - view, 0); - } + if (nautilus_directory_are_all_files_seen (directory)) + { + nautilus_list_model_subdirectory_done_loading (view->details->model, + directory); + } + else + { + g_signal_connect_object (directory, "done-loading", + G_CALLBACK (subdirectory_done_loading_callback), + view, 0); + } - nautilus_directory_unref (directory); + nautilus_directory_unref (directory); } -typedef struct { - NautilusFile *file; - NautilusDirectory *directory; - NautilusListView *view; +typedef struct +{ + NautilusFile *file; + NautilusDirectory *directory; + NautilusListView *view; } UnloadDelayData; static void unload_delay_data_free (UnloadDelayData *unload_data) { - if (unload_data->view != NULL) { - g_object_remove_weak_pointer (G_OBJECT (unload_data->view), - (gpointer *) &unload_data->view); - } + if (unload_data->view != NULL) + { + g_object_remove_weak_pointer (G_OBJECT (unload_data->view), + (gpointer *) &unload_data->view); + } - nautilus_directory_unref (unload_data->directory); - nautilus_file_unref (unload_data->file); + nautilus_directory_unref (unload_data->directory); + nautilus_file_unref (unload_data->file); - g_slice_free (UnloadDelayData, unload_data); + g_slice_free (UnloadDelayData, unload_data); } static UnloadDelayData * -unload_delay_data_new (NautilusFile *file, - NautilusDirectory *parent_directory, - NautilusListView *view) +unload_delay_data_new (NautilusFile *file, + NautilusDirectory *parent_directory, + NautilusListView *view) { - UnloadDelayData *unload_data; + UnloadDelayData *unload_data; - unload_data = g_slice_new0 (UnloadDelayData); - unload_data->view = view; - unload_data->file = nautilus_file_ref (file); - unload_data->directory = nautilus_directory_ref (parent_directory); + unload_data = g_slice_new0 (UnloadDelayData); + unload_data->view = view; + unload_data->file = nautilus_file_ref (file); + unload_data->directory = nautilus_directory_ref (parent_directory); - g_object_add_weak_pointer (G_OBJECT (unload_data->view), - (gpointer *) &unload_data->view); + g_object_add_weak_pointer (G_OBJECT (unload_data->view), + (gpointer *) &unload_data->view); - return unload_data; + return unload_data; } static gboolean unload_file_timeout (gpointer data) { - UnloadDelayData *unload_data = data; - GtkTreeIter iter; - NautilusListModel *model; - GtkTreePath *path; - - if (unload_data->view == NULL) { - goto out; - } - - model = unload_data->view->details->model; - if (nautilus_list_model_get_tree_iter_from_file (model, - unload_data->file, - unload_data->directory, - &iter)) { - path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter); - if (!gtk_tree_view_row_expanded (unload_data->view->details->tree_view, - path)) { - nautilus_list_model_unload_subdirectory (model, &iter); - } - gtk_tree_path_free (path); - } + UnloadDelayData *unload_data = data; + GtkTreeIter iter; + NautilusListModel *model; + GtkTreePath *path; + + if (unload_data->view == NULL) + { + goto out; + } + + model = unload_data->view->details->model; + if (nautilus_list_model_get_tree_iter_from_file (model, + unload_data->file, + unload_data->directory, + &iter)) + { + path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter); + if (!gtk_tree_view_row_expanded (unload_data->view->details->tree_view, + path)) + { + nautilus_list_model_unload_subdirectory (model, &iter); + } + gtk_tree_path_free (path); + } - out: - unload_delay_data_free (unload_data); - return FALSE; +out: + unload_delay_data_free (unload_data); + return FALSE; } static void row_collapsed_callback (GtkTreeView *treeview, - GtkTreeIter *iter, - GtkTreePath *path, - gpointer callback_data) + GtkTreeIter *iter, + GtkTreePath *path, + gpointer callback_data) { - NautilusListView *view; - NautilusFile *file; - NautilusDirectory *directory; - GtkTreeIter parent; - UnloadDelayData *unload_data; - GtkTreeModel *model; - char *uri; + NautilusListView *view; + NautilusFile *file; + NautilusDirectory *directory; + GtkTreeIter parent; + UnloadDelayData *unload_data; + GtkTreeModel *model; + char *uri; - view = NAUTILUS_LIST_VIEW (callback_data); - model = GTK_TREE_MODEL (view->details->model); + view = NAUTILUS_LIST_VIEW (callback_data); + model = GTK_TREE_MODEL (view->details->model); - gtk_tree_model_get (model, iter, - NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, - -1); + gtk_tree_model_get (model, iter, + NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, + -1); - uri = nautilus_file_get_uri (file); - DEBUG ("Row collapsed callback for uri %s", uri); - g_free (uri); + uri = nautilus_file_get_uri (file); + DEBUG ("Row collapsed callback for uri %s", uri); + g_free (uri); - directory = NULL; - if (gtk_tree_model_iter_parent (model, &parent, iter)) { - gtk_tree_model_get (model, &parent, - NAUTILUS_LIST_MODEL_SUBDIRECTORY_COLUMN, &directory, - -1); - } + directory = NULL; + if (gtk_tree_model_iter_parent (model, &parent, iter)) + { + gtk_tree_model_get (model, &parent, + NAUTILUS_LIST_MODEL_SUBDIRECTORY_COLUMN, &directory, + -1); + } - unload_data = unload_delay_data_new (file, directory, view); - g_timeout_add_seconds (COLLAPSE_TO_UNLOAD_DELAY, - unload_file_timeout, - unload_data); + unload_data = unload_delay_data_new (file, directory, view); + g_timeout_add_seconds (COLLAPSE_TO_UNLOAD_DELAY, + unload_file_timeout, + unload_data); - nautilus_file_unref (file); - nautilus_directory_unref (directory); + nautilus_file_unref (file); + nautilus_directory_unref (directory); } static void subdirectory_unloaded_callback (NautilusListModel *model, - NautilusDirectory *directory, - gpointer callback_data) + NautilusDirectory *directory, + gpointer callback_data) { - NautilusListView *view; - - g_return_if_fail (NAUTILUS_IS_LIST_MODEL (model)); - g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + NautilusListView *view; - view = NAUTILUS_LIST_VIEW(callback_data); - - g_signal_handlers_disconnect_by_func (directory, - G_CALLBACK (subdirectory_done_loading_callback), - view); - nautilus_files_view_remove_subdirectory (NAUTILUS_FILES_VIEW (view), directory); + g_return_if_fail (NAUTILUS_IS_LIST_MODEL (model)); + g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + + view = NAUTILUS_LIST_VIEW (callback_data); + + g_signal_handlers_disconnect_by_func (directory, + G_CALLBACK (subdirectory_done_loading_callback), + view); + nautilus_files_view_remove_subdirectory (NAUTILUS_FILES_VIEW (view), directory); } static gboolean -key_press_callback (GtkWidget *widget, GdkEventKey *event, gpointer callback_data) -{ - NautilusFilesView *view; - GdkEventButton button_event = { 0 }; - gboolean handled; - GtkTreeView *tree_view; - GtkTreePath *path; - - tree_view = GTK_TREE_VIEW (widget); - - view = NAUTILUS_FILES_VIEW (callback_data); - handled = FALSE; - - NAUTILUS_LIST_VIEW (view)->details->last_event_button_x = -1; - NAUTILUS_LIST_VIEW (view)->details->last_event_button_y = -1; - - switch (event->keyval) { - case GDK_KEY_F10: - if (event->state & GDK_CONTROL_MASK) { - nautilus_files_view_pop_up_background_context_menu (view, &button_event); - handled = TRUE; - } - break; - case GDK_KEY_Right: - gtk_tree_view_get_cursor (tree_view, &path, NULL); - if (path) { - gtk_tree_view_expand_row (tree_view, path, FALSE); - gtk_tree_path_free (path); - } - handled = TRUE; - break; - case GDK_KEY_Left: - gtk_tree_view_get_cursor (tree_view, &path, NULL); - if (path) { - if (!gtk_tree_view_collapse_row (tree_view, path)) { - /* if the row is already collapsed or doesn't have any children, - * jump to the parent row instead. - */ - if ((gtk_tree_path_get_depth (path) > 1) && gtk_tree_path_up (path)) { - gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE); - } - } - - gtk_tree_path_free (path); - } - handled = TRUE; - break; - case GDK_KEY_space: - if (event->state & GDK_CONTROL_MASK) { - handled = FALSE; - break; - } - if (!gtk_widget_has_focus (GTK_WIDGET (NAUTILUS_LIST_VIEW (view)->details->tree_view))) { - handled = FALSE; - break; - } - if ((event->state & GDK_SHIFT_MASK) != 0) { - activate_selected_items_alternate (NAUTILUS_LIST_VIEW (view), NULL, TRUE); - } else { - preview_selected_items (NAUTILUS_LIST_VIEW (view)); - } - handled = TRUE; - break; - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - if ((event->state & GDK_SHIFT_MASK) != 0) { - activate_selected_items_alternate (NAUTILUS_LIST_VIEW (view), NULL, TRUE); - } else { - activate_selected_items (NAUTILUS_LIST_VIEW (view)); - } - handled = TRUE; - break; - case GDK_KEY_v: - /* Eat Control + v to not enable type ahead */ - if ((event->state & GDK_CONTROL_MASK) != 0) { - handled = TRUE; - } - break; - - default: - handled = FALSE; - } - - return handled; +key_press_callback (GtkWidget *widget, + GdkEventKey *event, + gpointer callback_data) +{ + NautilusFilesView *view; + GdkEventButton button_event = { 0 }; + gboolean handled; + GtkTreeView *tree_view; + GtkTreePath *path; + + tree_view = GTK_TREE_VIEW (widget); + + view = NAUTILUS_FILES_VIEW (callback_data); + handled = FALSE; + + NAUTILUS_LIST_VIEW (view)->details->last_event_button_x = -1; + NAUTILUS_LIST_VIEW (view)->details->last_event_button_y = -1; + + switch (event->keyval) + { + case GDK_KEY_F10: + { + if (event->state & GDK_CONTROL_MASK) + { + nautilus_files_view_pop_up_background_context_menu (view, &button_event); + handled = TRUE; + } + } + break; + + case GDK_KEY_Right: + { + gtk_tree_view_get_cursor (tree_view, &path, NULL); + if (path) + { + gtk_tree_view_expand_row (tree_view, path, FALSE); + gtk_tree_path_free (path); + } + handled = TRUE; + } + break; + + case GDK_KEY_Left: + { + gtk_tree_view_get_cursor (tree_view, &path, NULL); + if (path) + { + if (!gtk_tree_view_collapse_row (tree_view, path)) + { + /* if the row is already collapsed or doesn't have any children, + * jump to the parent row instead. + */ + if ((gtk_tree_path_get_depth (path) > 1) && gtk_tree_path_up (path)) + { + gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE); + } + } + + gtk_tree_path_free (path); + } + handled = TRUE; + } + break; + + case GDK_KEY_space: + { + if (event->state & GDK_CONTROL_MASK) + { + handled = FALSE; + break; + } + if (!gtk_widget_has_focus (GTK_WIDGET (NAUTILUS_LIST_VIEW (view)->details->tree_view))) + { + handled = FALSE; + break; + } + if ((event->state & GDK_SHIFT_MASK) != 0) + { + activate_selected_items_alternate (NAUTILUS_LIST_VIEW (view), NULL, TRUE); + } + else + { + preview_selected_items (NAUTILUS_LIST_VIEW (view)); + } + handled = TRUE; + } + break; + + case GDK_KEY_Return: + case GDK_KEY_KP_Enter: + { + if ((event->state & GDK_SHIFT_MASK) != 0) + { + activate_selected_items_alternate (NAUTILUS_LIST_VIEW (view), NULL, TRUE); + } + else + { + activate_selected_items (NAUTILUS_LIST_VIEW (view)); + } + handled = TRUE; + } + break; + + case GDK_KEY_v: + { + /* Eat Control + v to not enable type ahead */ + if ((event->state & GDK_CONTROL_MASK) != 0) + { + handled = TRUE; + } + } + break; + + default: + handled = FALSE; + } + + return handled; } static gboolean test_expand_row_callback (GtkTreeView *tree_view, - GtkTreeIter *iter, - GtkTreePath *path, - gboolean user_data) + GtkTreeIter *iter, + GtkTreePath *path, + gboolean user_data) { - return !g_settings_get_boolean (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE); + return !g_settings_get_boolean (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE); } static void nautilus_list_view_reveal_selection (NautilusFilesView *view) { - GList *selection; + GList *selection; - g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); + g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); + + selection = nautilus_view_get_selection (NAUTILUS_VIEW (view)); + + /* Make sure at least one of the selected items is scrolled into view */ + if (selection != NULL) + { + NautilusListView *list_view; + NautilusFile *file; + GtkTreeIter iter; + GtkTreePath *path; - selection = nautilus_view_get_selection (NAUTILUS_VIEW (view)); + list_view = NAUTILUS_LIST_VIEW (view); + file = selection->data; + if (nautilus_list_model_get_first_iter_for_file (list_view->details->model, file, &iter)) + { + path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_view->details->model), &iter); - /* Make sure at least one of the selected items is scrolled into view */ - if (selection != NULL) { - NautilusListView *list_view; - NautilusFile *file; - GtkTreeIter iter; - GtkTreePath *path; - - list_view = NAUTILUS_LIST_VIEW (view); - file = selection->data; - if (nautilus_list_model_get_first_iter_for_file (list_view->details->model, file, &iter)) { - path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_view->details->model), &iter); + gtk_tree_view_scroll_to_cell (list_view->details->tree_view, path, NULL, FALSE, 0.0, 0.0); - gtk_tree_view_scroll_to_cell (list_view->details->tree_view, path, NULL, FALSE, 0.0, 0.0); - - gtk_tree_path_free (path); - } - } + gtk_tree_path_free (path); + } + } - nautilus_file_list_free (selection); + nautilus_file_list_free (selection); } static gboolean sort_criterion_changes_due_to_user (GtkTreeView *tree_view) { - GList *columns, *p; - GtkTreeViewColumn *column; - GSignalInvocationHint *ihint; - gboolean ret; - - ret = FALSE; - - columns = gtk_tree_view_get_columns (tree_view); - for (p = columns; p != NULL; p = p->next) { - column = p->data; - ihint = g_signal_get_invocation_hint (column); - if (ihint != NULL) { - ret = TRUE; - break; - } - } - g_list_free (columns); + GList *columns, *p; + GtkTreeViewColumn *column; + GSignalInvocationHint *ihint; + gboolean ret; + + ret = FALSE; + + columns = gtk_tree_view_get_columns (tree_view); + for (p = columns; p != NULL; p = p->next) + { + column = p->data; + ihint = g_signal_get_invocation_hint (column); + if (ihint != NULL) + { + ret = TRUE; + break; + } + } + g_list_free (columns); - return ret; + return ret; } static void -sort_column_changed_callback (GtkTreeSortable *sortable, - NautilusListView *view) +sort_column_changed_callback (GtkTreeSortable *sortable, + NautilusListView *view) { - NautilusFile *file; - gint sort_column_id, default_sort_column_id; - GtkSortType reversed; - GQuark sort_attr, default_sort_attr; - char *reversed_attr, *default_reversed_attr; - gboolean default_sort_reversed; + NautilusFile *file; + gint sort_column_id, default_sort_column_id; + GtkSortType reversed; + GQuark sort_attr, default_sort_attr; + char *reversed_attr, *default_reversed_attr; + gboolean default_sort_reversed; - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view)); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view)); - gtk_tree_sortable_get_sort_column_id (sortable, &sort_column_id, &reversed); - sort_attr = nautilus_list_model_get_attribute_from_sort_column_id (view->details->model, sort_column_id); + gtk_tree_sortable_get_sort_column_id (sortable, &sort_column_id, &reversed); + sort_attr = nautilus_list_model_get_attribute_from_sort_column_id (view->details->model, sort_column_id); - default_sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (view->details->model, - g_quark_from_string (get_default_sort_order (file, &default_sort_reversed))); - default_sort_attr = nautilus_list_model_get_attribute_from_sort_column_id (view->details->model, default_sort_column_id); - nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN, - g_quark_to_string (default_sort_attr), g_quark_to_string (sort_attr)); + default_sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (view->details->model, + g_quark_from_string (get_default_sort_order (file, &default_sort_reversed))); + default_sort_attr = nautilus_list_model_get_attribute_from_sort_column_id (view->details->model, default_sort_column_id); + nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN, + g_quark_to_string (default_sort_attr), g_quark_to_string (sort_attr)); - default_reversed_attr = (default_sort_reversed ? "true" : "false"); + default_reversed_attr = (default_sort_reversed ? "true" : "false"); - if (view->details->last_sort_attr != sort_attr && - sort_criterion_changes_due_to_user (view->details->tree_view)) { - /* at this point, the sort order is always GTK_SORT_ASCENDING, if the sort column ID - * switched. Invert the sort order, if it's the default criterion with a reversed preference, - * or if it makes sense for the attribute (i.e. date). */ - if (sort_attr == default_sort_attr) { - /* use value from preferences */ - reversed = g_settings_get_boolean (nautilus_preferences, - NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER); - } else { - reversed = nautilus_file_is_date_sort_attribute_q (sort_attr); - } + if (view->details->last_sort_attr != sort_attr && + sort_criterion_changes_due_to_user (view->details->tree_view)) + { + /* at this point, the sort order is always GTK_SORT_ASCENDING, if the sort column ID + * switched. Invert the sort order, if it's the default criterion with a reversed preference, + * or if it makes sense for the attribute (i.e. date). */ + if (sort_attr == default_sort_attr) + { + /* use value from preferences */ + reversed = g_settings_get_boolean (nautilus_preferences, + NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER); + } + else + { + reversed = nautilus_file_is_date_sort_attribute_q (sort_attr); + } - if (reversed) { - g_signal_handlers_block_by_func (sortable, sort_column_changed_callback, view); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (view->details->model), - sort_column_id, - GTK_SORT_DESCENDING); - g_signal_handlers_unblock_by_func (sortable, sort_column_changed_callback, view); - } - } + if (reversed) + { + g_signal_handlers_block_by_func (sortable, sort_column_changed_callback, view); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (view->details->model), + sort_column_id, + GTK_SORT_DESCENDING); + g_signal_handlers_unblock_by_func (sortable, sort_column_changed_callback, view); + } + } - reversed_attr = (reversed ? "true" : "false"); - nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_REVERSED, - default_reversed_attr, reversed_attr); + reversed_attr = (reversed ? "true" : "false"); + nautilus_file_set_metadata (file, NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_REVERSED, + default_reversed_attr, reversed_attr); - /* Make sure selected item(s) is visible after sort */ - nautilus_list_view_reveal_selection (NAUTILUS_FILES_VIEW (view)); + /* Make sure selected item(s) is visible after sort */ + nautilus_list_view_reveal_selection (NAUTILUS_FILES_VIEW (view)); - view->details->last_sort_attr = sort_attr; + view->details->last_sort_attr = sort_attr; } static char * get_root_uri_callback (NautilusTreeViewDragDest *dest, - gpointer user_data) + gpointer user_data) { - NautilusListView *view; - - view = NAUTILUS_LIST_VIEW (user_data); + NautilusListView *view; + + view = NAUTILUS_LIST_VIEW (user_data); - return nautilus_files_view_get_uri (NAUTILUS_FILES_VIEW (view)); + return nautilus_files_view_get_uri (NAUTILUS_FILES_VIEW (view)); } static NautilusFile * get_file_for_path_callback (NautilusTreeViewDragDest *dest, - GtkTreePath *path, - gpointer user_data) + GtkTreePath *path, + gpointer user_data) { - NautilusListView *view; - - view = NAUTILUS_LIST_VIEW (user_data); + NautilusListView *view; - return nautilus_list_model_file_for_path (view->details->model, path); + view = NAUTILUS_LIST_VIEW (user_data); + + return nautilus_list_model_file_for_path (view->details->model, path); } /* Handles an URL received from Mozilla */ static void -list_view_handle_netscape_url (NautilusTreeViewDragDest *dest, const char *encoded_url, - const char *target_uri, GdkDragAction action, int x, int y, NautilusListView *view) +list_view_handle_netscape_url (NautilusTreeViewDragDest *dest, + const char *encoded_url, + const char *target_uri, + GdkDragAction action, + int x, + int y, + NautilusListView *view) { - nautilus_files_view_handle_netscape_url_drop (NAUTILUS_FILES_VIEW (view), - encoded_url, target_uri, action, x, y); + nautilus_files_view_handle_netscape_url_drop (NAUTILUS_FILES_VIEW (view), + encoded_url, target_uri, action, x, y); } static void -list_view_handle_uri_list (NautilusTreeViewDragDest *dest, const char *item_uris, - const char *target_uri, - GdkDragAction action, int x, int y, NautilusListView *view) +list_view_handle_uri_list (NautilusTreeViewDragDest *dest, + const char *item_uris, + const char *target_uri, + GdkDragAction action, + int x, + int y, + NautilusListView *view) { - nautilus_files_view_handle_uri_list_drop (NAUTILUS_FILES_VIEW (view), - item_uris, target_uri, action, x, y); + nautilus_files_view_handle_uri_list_drop (NAUTILUS_FILES_VIEW (view), + item_uris, target_uri, action, x, y); } static void -list_view_handle_text (NautilusTreeViewDragDest *dest, const char *text, - const char *target_uri, - GdkDragAction action, int x, int y, NautilusListView *view) +list_view_handle_text (NautilusTreeViewDragDest *dest, + const char *text, + const char *target_uri, + GdkDragAction action, + int x, + int y, + NautilusListView *view) { - nautilus_files_view_handle_text_drop (NAUTILUS_FILES_VIEW (view), - text, target_uri, action, x, y); + nautilus_files_view_handle_text_drop (NAUTILUS_FILES_VIEW (view), + text, target_uri, action, x, y); } static void -list_view_handle_raw (NautilusTreeViewDragDest *dest, const char *raw_data, - int length, const char *target_uri, const char *direct_save_uri, - GdkDragAction action, int x, int y, NautilusListView *view) +list_view_handle_raw (NautilusTreeViewDragDest *dest, + const char *raw_data, + int length, + const char *target_uri, + const char *direct_save_uri, + GdkDragAction action, + int x, + int y, + NautilusListView *view) { - nautilus_files_view_handle_raw_drop (NAUTILUS_FILES_VIEW (view), - raw_data, length, target_uri, direct_save_uri, - action, x, y); + nautilus_files_view_handle_raw_drop (NAUTILUS_FILES_VIEW (view), + raw_data, length, target_uri, direct_save_uri, + action, x, y); } static void list_view_handle_hover (NautilusTreeViewDragDest *dest, - const char *target_uri, - NautilusListView *view) + const char *target_uri, + NautilusListView *view) { - nautilus_files_view_handle_hover (NAUTILUS_FILES_VIEW (view), target_uri); + nautilus_files_view_handle_hover (NAUTILUS_FILES_VIEW (view), target_uri); } static void move_copy_items_callback (NautilusTreeViewDragDest *dest, - const GList *item_uris, - const char *target_uri, - guint action, - int x, - int y, - gpointer user_data) - + const GList *item_uris, + const char *target_uri, + guint action, + int x, + int y, + gpointer user_data) { - NautilusFilesView *view = user_data; + NautilusFilesView *view = user_data; - nautilus_clipboard_clear_if_colliding_uris (GTK_WIDGET (view), - item_uris, - nautilus_files_view_get_copied_files_atom (view)); - nautilus_files_view_move_copy_items (view, - item_uris, - NULL, - target_uri, - action, - x, y); + nautilus_clipboard_clear_if_colliding_uris (GTK_WIDGET (view), + item_uris, + nautilus_files_view_get_copied_files_atom (view)); + nautilus_files_view_move_copy_items (view, + item_uris, + NULL, + target_uri, + action, + x, y); } static void column_header_menu_toggled (GtkCheckMenuItem *menu_item, NautilusListView *list_view) { - NautilusFile *file; - char **visible_columns; - char **column_order; - const char *column; - GList *list = NULL; - GList *l; - int i; + NautilusFile *file; + char **visible_columns; + char **column_order; + const char *column; + GList *list = NULL; + GList *l; + int i; + + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + visible_columns = get_visible_columns (list_view); + column_order = get_column_order (list_view); + column = g_object_get_data (G_OBJECT (menu_item), "column-name"); + + for (i = 0; visible_columns[i] != NULL; ++i) + { + list = g_list_prepend (list, visible_columns[i]); + } + + if (gtk_check_menu_item_get_active (menu_item)) + { + list = g_list_prepend (list, g_strdup (column)); + } + else + { + l = g_list_find_custom (list, column, (GCompareFunc) g_strcmp0); + list = g_list_delete_link (list, l); + } + + list = g_list_reverse (list); + nautilus_file_set_metadata_list (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, + list); + + g_free (visible_columns); + + visible_columns = g_new0 (char *, g_list_length (list) + 1); + for (i = 0, l = list; l != NULL; ++i, l = l->next) + { + visible_columns[i] = l->data; + } + + /* set view values ourselves, as new metadata could not have been + * updated yet. + */ + apply_columns_settings (list_view, column_order, visible_columns); + + g_list_free (list); + g_strfreev (column_order); + g_strfreev (visible_columns); +} + +static void +column_header_menu_use_default (GtkMenuItem *menu_item, + NautilusListView *list_view) +{ + NautilusFile *file; + char **default_columns; + char **default_order; - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - visible_columns = get_visible_columns (list_view); - column_order = get_column_order (list_view); - column = g_object_get_data (G_OBJECT (menu_item), "column-name"); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - for (i = 0; visible_columns[i] != NULL; ++i) { - list = g_list_prepend (list, visible_columns[i]); - } + nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NULL); + nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NULL); - if (gtk_check_menu_item_get_active (menu_item)) { - list = g_list_prepend (list, g_strdup (column)); - } else { - l = g_list_find_custom (list, column, (GCompareFunc) g_strcmp0); - list = g_list_delete_link (list, l); - } + default_columns = get_default_visible_columns (list_view); + default_order = get_default_column_order (list_view); - list = g_list_reverse (list); - nautilus_file_set_metadata_list (file, - NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, - list); + /* set view values ourselves, as new metadata could not have been + * updated yet. + */ + apply_columns_settings (list_view, default_order, default_columns); - g_free (visible_columns); + g_strfreev (default_columns); + g_strfreev (default_order); +} - visible_columns = g_new0 (char *, g_list_length (list) + 1); - for (i = 0, l = list; l != NULL; ++i, l = l->next) { - visible_columns[i] = l->data; - } +static gboolean +column_header_clicked (GtkWidget *column_button, + GdkEventButton *event, + NautilusListView *list_view) +{ + NautilusFile *file; + char **visible_columns; + char **column_order; + GList *all_columns; + GHashTable *visible_columns_hash; + int i; + GList *l; + GtkWidget *menu; + GtkWidget *menu_item; + + if (event->button != GDK_BUTTON_SECONDARY) + { + return FALSE; + } + + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + + visible_columns = get_visible_columns (list_view); + column_order = get_column_order (list_view); + + all_columns = nautilus_get_columns_for_file (file); + all_columns = nautilus_sort_columns (all_columns, column_order); + + /* hash table to lookup if a given column should be visible */ + visible_columns_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) g_free); + /* always show name column */ + g_hash_table_insert (visible_columns_hash, g_strdup ("name"), g_strdup ("name")); + if (visible_columns != NULL) + { + for (i = 0; visible_columns[i] != NULL; ++i) + { + g_hash_table_insert (visible_columns_hash, + g_ascii_strdown (visible_columns[i], -1), + g_ascii_strdown (visible_columns[i], -1)); + } + } - /* set view values ourselves, as new metadata could not have been - * updated yet. - */ - apply_columns_settings (list_view, column_order, visible_columns); + menu = gtk_menu_new (); - g_list_free (list); - g_strfreev (column_order); - g_strfreev (visible_columns); -} + for (l = all_columns; l != NULL; l = l->next) + { + char *name; + char *label; + char *lowercase; -static void -column_header_menu_use_default (GtkMenuItem *menu_item, - NautilusListView *list_view) -{ - NautilusFile *file; - char **default_columns; - char **default_order; + g_object_get (G_OBJECT (l->data), + "name", &name, + "label", &label, + NULL); + lowercase = g_ascii_strdown (name, -1); + + menu_item = gtk_check_menu_item_new_with_label (label); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + g_object_set_data_full (G_OBJECT (menu_item), + "column-name", name, g_free); - nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NULL); - nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NULL); + /* name is always visible */ + if (strcmp (lowercase, "name") == 0) + { + gtk_widget_set_sensitive (menu_item, FALSE); + } - default_columns = get_default_visible_columns (list_view); - default_order = get_default_column_order (list_view); + if (g_hash_table_lookup (visible_columns_hash, lowercase) != NULL) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), + TRUE); + } - /* set view values ourselves, as new metadata could not have been - * updated yet. - */ - apply_columns_settings (list_view, default_order, default_columns); + g_signal_connect (menu_item, + "toggled", + G_CALLBACK (column_header_menu_toggled), + list_view); + + g_free (lowercase); + g_free (label); + } + + menu_item = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + + menu_item = gtk_menu_item_new_with_label (_("Use Default")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + + g_signal_connect (menu_item, + "activate", + G_CALLBACK (column_header_menu_use_default), + list_view); + + gtk_widget_show_all (menu); + gtk_menu_popup_for_device (GTK_MENU (menu), + gdk_event_get_device ((GdkEvent *) event), + NULL, NULL, NULL, NULL, NULL, + event->button, event->time); + + g_hash_table_destroy (visible_columns_hash); + nautilus_column_list_free (all_columns); + g_strfreev (column_order); + g_strfreev (visible_columns); + + return TRUE; +} + +static void +apply_columns_settings (NautilusListView *list_view, + char **column_order, + char **visible_columns) +{ + GList *all_columns; + NautilusFile *file; + GList *old_view_columns, *view_columns; + GHashTable *visible_columns_hash; + GtkTreeViewColumn *prev_view_column; + GList *l; + int i; + + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + + /* prepare ordered list of view columns using column_order and visible_columns */ + view_columns = NULL; + + all_columns = nautilus_get_columns_for_file (file); + all_columns = nautilus_sort_columns (all_columns, column_order); + + /* hash table to lookup if a given column should be visible */ + visible_columns_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) g_free); + /* always show name column */ + g_hash_table_insert (visible_columns_hash, g_strdup ("name"), g_strdup ("name")); + if (visible_columns != NULL) + { + for (i = 0; visible_columns[i] != NULL; ++i) + { + g_hash_table_insert (visible_columns_hash, + g_ascii_strdown (visible_columns[i], -1), + g_ascii_strdown (visible_columns[i], -1)); + } + } - g_strfreev (default_columns); - g_strfreev (default_order); -} + for (l = all_columns; l != NULL; l = l->next) + { + char *name; + char *lowercase; -static gboolean -column_header_clicked (GtkWidget *column_button, - GdkEventButton *event, - NautilusListView *list_view) -{ - NautilusFile *file; - char **visible_columns; - char **column_order; - GList *all_columns; - GHashTable *visible_columns_hash; - int i; - GList *l; - GtkWidget *menu; - GtkWidget *menu_item; - - if (event->button != GDK_BUTTON_SECONDARY) { - return FALSE; - } - - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - - visible_columns = get_visible_columns (list_view); - column_order = get_column_order (list_view); - - all_columns = nautilus_get_columns_for_file (file); - all_columns = nautilus_sort_columns (all_columns, column_order); - - /* hash table to lookup if a given column should be visible */ - visible_columns_hash = g_hash_table_new_full (g_str_hash, - g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) g_free); - /* always show name column */ - g_hash_table_insert (visible_columns_hash, g_strdup ("name"), g_strdup ("name")); - if (visible_columns != NULL) { - for (i = 0; visible_columns[i] != NULL; ++i) { - g_hash_table_insert (visible_columns_hash, - g_ascii_strdown (visible_columns[i], -1), - g_ascii_strdown (visible_columns[i], -1)); - } - } - - menu = gtk_menu_new (); - - for (l = all_columns; l != NULL; l = l->next) { - char *name; - char *label; - char *lowercase; - - g_object_get (G_OBJECT (l->data), - "name", &name, - "label", &label, - NULL); - lowercase = g_ascii_strdown (name, -1); - - menu_item = gtk_check_menu_item_new_with_label (label); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - - g_object_set_data_full (G_OBJECT (menu_item), - "column-name", name, g_free); - - /* name is always visible */ - if (strcmp (lowercase, "name") == 0) { - gtk_widget_set_sensitive (menu_item, FALSE); - } - - if (g_hash_table_lookup (visible_columns_hash, lowercase) != NULL) { - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - TRUE); - } - - g_signal_connect (menu_item, - "toggled", - G_CALLBACK (column_header_menu_toggled), - list_view); - - g_free (lowercase); - g_free (label); - } - - menu_item = gtk_separator_menu_item_new (); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - - menu_item = gtk_menu_item_new_with_label (_("Use Default")); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - - g_signal_connect (menu_item, - "activate", - G_CALLBACK (column_header_menu_use_default), - list_view); - - gtk_widget_show_all (menu); - gtk_menu_popup_for_device (GTK_MENU (menu), - gdk_event_get_device ((GdkEvent *) event), - NULL, NULL, NULL, NULL, NULL, - event->button, event->time); - - g_hash_table_destroy (visible_columns_hash); - nautilus_column_list_free (all_columns); - g_strfreev (column_order); - g_strfreev (visible_columns); - - return TRUE; -} - -static void -apply_columns_settings (NautilusListView *list_view, - char **column_order, - char **visible_columns) -{ - GList *all_columns; - NautilusFile *file; - GList *old_view_columns, *view_columns; - GHashTable *visible_columns_hash; - GtkTreeViewColumn *prev_view_column; - GList *l; - int i; - - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - - /* prepare ordered list of view columns using column_order and visible_columns */ - view_columns = NULL; - - all_columns = nautilus_get_columns_for_file (file); - all_columns = nautilus_sort_columns (all_columns, column_order); - - /* hash table to lookup if a given column should be visible */ - visible_columns_hash = g_hash_table_new_full (g_str_hash, - g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) g_free); - /* always show name column */ - g_hash_table_insert (visible_columns_hash, g_strdup ("name"), g_strdup ("name")); - if (visible_columns != NULL) { - for (i = 0; visible_columns[i] != NULL; ++i) { - g_hash_table_insert (visible_columns_hash, - g_ascii_strdown (visible_columns[i], -1), - g_ascii_strdown (visible_columns[i], -1)); - } - } - - for (l = all_columns; l != NULL; l = l->next) { - char *name; - char *lowercase; - - g_object_get (G_OBJECT (l->data), "name", &name, NULL); - lowercase = g_ascii_strdown (name, -1); - - if (g_hash_table_lookup (visible_columns_hash, lowercase) != NULL) { - GtkTreeViewColumn *view_column; - - view_column = g_hash_table_lookup (list_view->details->columns, name); - if (view_column != NULL) { - view_columns = g_list_prepend (view_columns, view_column); - } - } - - g_free (name); - g_free (lowercase); - } - - g_hash_table_destroy (visible_columns_hash); - nautilus_column_list_free (all_columns); - - view_columns = g_list_reverse (view_columns); - - /* hide columns that are not present in the configuration */ - old_view_columns = gtk_tree_view_get_columns (list_view->details->tree_view); - for (l = old_view_columns; l != NULL; l = l->next) { - if (g_list_find (view_columns, l->data) == NULL) { - gtk_tree_view_column_set_visible (l->data, FALSE); - } - } - g_list_free (old_view_columns); - - /* show new columns from the configuration */ - for (l = view_columns; l != NULL; l = l->next) { - gtk_tree_view_column_set_visible (l->data, TRUE); - } + g_object_get (G_OBJECT (l->data), "name", &name, NULL); + lowercase = g_ascii_strdown (name, -1); - /* place columns in the correct order */ - prev_view_column = NULL; - for (l = view_columns; l != NULL; l = l->next) { - gtk_tree_view_move_column_after (list_view->details->tree_view, l->data, prev_view_column); - prev_view_column = l->data; - } - g_list_free (view_columns); + if (g_hash_table_lookup (visible_columns_hash, lowercase) != NULL) + { + GtkTreeViewColumn *view_column; + + view_column = g_hash_table_lookup (list_view->details->columns, name); + if (view_column != NULL) + { + view_columns = g_list_prepend (view_columns, view_column); + } + } + + g_free (name); + g_free (lowercase); + } + + g_hash_table_destroy (visible_columns_hash); + nautilus_column_list_free (all_columns); + + view_columns = g_list_reverse (view_columns); + + /* hide columns that are not present in the configuration */ + old_view_columns = gtk_tree_view_get_columns (list_view->details->tree_view); + for (l = old_view_columns; l != NULL; l = l->next) + { + if (g_list_find (view_columns, l->data) == NULL) + { + gtk_tree_view_column_set_visible (l->data, FALSE); + } + } + g_list_free (old_view_columns); + + /* show new columns from the configuration */ + for (l = view_columns; l != NULL; l = l->next) + { + gtk_tree_view_column_set_visible (l->data, TRUE); + } + + /* place columns in the correct order */ + prev_view_column = NULL; + for (l = view_columns; l != NULL; l = l->next) + { + gtk_tree_view_move_column_after (list_view->details->tree_view, l->data, prev_view_column); + prev_view_column = l->data; + } + g_list_free (view_columns); } static void filename_cell_data_func (GtkTreeViewColumn *column, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - NautilusListView *view) + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + NautilusListView *view) { - char *text; - GtkTreePath *path; - PangoUnderline underline; + char *text; + GtkTreePath *path; + PangoUnderline underline; - gtk_tree_model_get (model, iter, - view->details->file_name_column_num, &text, - -1); + gtk_tree_model_get (model, iter, + view->details->file_name_column_num, &text, + -1); - if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) { - path = gtk_tree_model_get_path (model, iter); + if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) + { + path = gtk_tree_model_get_path (model, iter); - if (view->details->hover_path == NULL || - gtk_tree_path_compare (path, view->details->hover_path)) { - underline = PANGO_UNDERLINE_NONE; - } else { - underline = PANGO_UNDERLINE_SINGLE; - } + if (view->details->hover_path == NULL || + gtk_tree_path_compare (path, view->details->hover_path)) + { + underline = PANGO_UNDERLINE_NONE; + } + else + { + underline = PANGO_UNDERLINE_SINGLE; + } - gtk_tree_path_free (path); - } else { - underline = PANGO_UNDERLINE_NONE; - } + gtk_tree_path_free (path); + } + else + { + underline = PANGO_UNDERLINE_NONE; + } - g_object_set (G_OBJECT (renderer), - "text", text, - "underline", underline, - NULL); - g_free (text); + g_object_set (G_OBJECT (renderer), + "text", text, + "underline", underline, + NULL); + g_free (text); } static void @@ -1414,100 +1599,119 @@ location_cell_data_func (GtkTreeViewColumn *column, NautilusListView *view, gboolean show_trash_orig) { - NautilusDirectory *directory; - GFile *home_location; - NautilusFile *file; - GFile *dir_location; - GFile *base_location; - gchar *where = NULL; - - directory = nautilus_files_view_get_model (NAUTILUS_FILES_VIEW (view)); + NautilusDirectory *directory; + GFile *home_location; + NautilusFile *file; + GFile *dir_location; + GFile *base_location; + gchar *where = NULL; - home_location = g_file_new_for_path (g_get_home_dir ()); + directory = nautilus_files_view_get_model (NAUTILUS_FILES_VIEW (view)); - gtk_tree_model_get (model, iter, - NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, - -1); + home_location = g_file_new_for_path (g_get_home_dir ()); - /* The file might be NULL if we just toggled an expander - * and we're still loading the subdirectory. - */ - if (file == NULL) { - return; - } + gtk_tree_model_get (model, iter, + NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, + -1); - if (show_trash_orig && nautilus_file_is_in_trash (file)) { - NautilusFile *orig_file; + /* The file might be NULL if we just toggled an expander + * and we're still loading the subdirectory. + */ + if (file == NULL) + { + return; + } - orig_file = nautilus_file_get_trash_original_file (file); + if (show_trash_orig && nautilus_file_is_in_trash (file)) + { + NautilusFile *orig_file; - if (orig_file != NULL) { - nautilus_file_unref (file); - file = orig_file; - } - } + orig_file = nautilus_file_get_trash_original_file (file); - if (!nautilus_file_is_in_recent (file)) { - dir_location = nautilus_file_get_parent_location (file); - } else { - GFile *activation_location; - - activation_location = nautilus_file_get_activation_location (file); - dir_location = g_file_get_parent (activation_location); - - g_object_unref (activation_location); - } - - if (!NAUTILUS_IS_SEARCH_DIRECTORY (directory)) { - base_location = g_object_ref (home_location); - } else { - NautilusQuery *query; - NautilusFile *base; - GFile *location; - - query = nautilus_search_directory_get_query (NAUTILUS_SEARCH_DIRECTORY (directory)); - location = nautilus_query_get_location (query); - base = nautilus_file_get (location); - - if (!nautilus_file_is_in_recent (base)) { - base_location = nautilus_file_get_location (base); - } else { - base_location = g_object_ref (home_location); - } + if (orig_file != NULL) + { + nautilus_file_unref (file); + file = orig_file; + } + } + + if (!nautilus_file_is_in_recent (file)) + { + dir_location = nautilus_file_get_parent_location (file); + } + else + { + GFile *activation_location; + + activation_location = nautilus_file_get_activation_location (file); + dir_location = g_file_get_parent (activation_location); + + g_object_unref (activation_location); + } + + if (!NAUTILUS_IS_SEARCH_DIRECTORY (directory)) + { + base_location = g_object_ref (home_location); + } + else + { + NautilusQuery *query; + NautilusFile *base; + GFile *location; + + query = nautilus_search_directory_get_query (NAUTILUS_SEARCH_DIRECTORY (directory)); + location = nautilus_query_get_location (query); + base = nautilus_file_get (location); + + if (!nautilus_file_is_in_recent (base)) + { + base_location = nautilus_file_get_location (base); + } + else + { + base_location = g_object_ref (home_location); + } - nautilus_file_unref (base); - g_object_unref (location); - g_object_unref (query); - } + nautilus_file_unref (base); + g_object_unref (location); + g_object_unref (query); + } - if (g_file_equal (base_location, dir_location)) { - /* Only occurs when search result is - * a direct child of the base location - */ - where = g_strdup (""); - } else if (g_file_equal (home_location, dir_location)) { - where = g_strdup (_("Home")); - } else if (g_file_has_prefix (dir_location, base_location)) { - gchar *relative_path; + if (g_file_equal (base_location, dir_location)) + { + /* Only occurs when search result is + * a direct child of the base location + */ + where = g_strdup (""); + } + else if (g_file_equal (home_location, dir_location)) + { + where = g_strdup (_("Home")); + } + else if (g_file_has_prefix (dir_location, base_location)) + { + gchar *relative_path; - relative_path = g_file_get_relative_path (base_location, dir_location); - where = g_filename_display_name (relative_path); + relative_path = g_file_get_relative_path (base_location, dir_location); + where = g_filename_display_name (relative_path); - g_free (relative_path); - } else { - where = g_file_get_path (dir_location); - } + g_free (relative_path); + } + else + { + where = g_file_get_path (dir_location); + } - g_object_set (G_OBJECT (renderer), - "text", where, - NULL); + g_object_set (G_OBJECT (renderer), + "text", where, + NULL); - g_free (where); + g_free (where); - g_object_unref (base_location); - g_object_unref (dir_location); - nautilus_file_unref (file); - g_object_unref (home_location); + g_object_unref (base_location); + g_object_unref (dir_location); + nautilus_file_unref (file); + g_object_unref (home_location); } @@ -1518,7 +1722,7 @@ where_cell_data_func (GtkTreeViewColumn *column, GtkTreeIter *iter, NautilusListView *view) { - location_cell_data_func (column, renderer, model, iter, view, FALSE); + location_cell_data_func (column, renderer, model, iter, view, FALSE); } static void @@ -1528,7 +1732,7 @@ trash_orig_path_cell_data_func (GtkTreeViewColumn *column, GtkTreeIter *iter, NautilusListView *view) { - location_cell_data_func (column, renderer, model, iter, view, TRUE); + location_cell_data_func (column, renderer, model, iter, view, TRUE); } #define SMALL_ZOOM_ICON_PADDING 0 @@ -1539,1692 +1743,1815 @@ trash_orig_path_cell_data_func (GtkTreeViewColumn *column, static gint nautilus_list_view_get_icon_padding_for_zoom_level (NautilusListZoomLevel zoom_level) { - switch (zoom_level) { - case NAUTILUS_LIST_ZOOM_LEVEL_SMALL: - return SMALL_ZOOM_ICON_PADDING; - case NAUTILUS_LIST_ZOOM_LEVEL_STANDARD: - return STANDARD_ZOOM_ICON_PADDING; - case NAUTILUS_LIST_ZOOM_LEVEL_LARGE: - return LARGE_ZOOM_ICON_PADDING; - case NAUTILUS_LIST_ZOOM_LEVEL_LARGER: - return LARGER_ZOOM_ICON_PADDING; - default: - g_assert_not_reached (); - } + switch (zoom_level) + { + case NAUTILUS_LIST_ZOOM_LEVEL_SMALL: + { + return SMALL_ZOOM_ICON_PADDING; + } + + case NAUTILUS_LIST_ZOOM_LEVEL_STANDARD: + { + return STANDARD_ZOOM_ICON_PADDING; + } + + case NAUTILUS_LIST_ZOOM_LEVEL_LARGE: + { + return LARGE_ZOOM_ICON_PADDING; + } + + case NAUTILUS_LIST_ZOOM_LEVEL_LARGER: + { + return LARGER_ZOOM_ICON_PADDING; + } + + default: + g_assert_not_reached (); + } } static void set_up_pixbuf_size (NautilusListView *view) { - int icon_size, icon_padding; + int icon_size, icon_padding; - /* Make all rows the same size. */ - icon_size = nautilus_list_model_get_icon_size_for_zoom_level (view->details->zoom_level); - icon_padding = nautilus_list_view_get_icon_padding_for_zoom_level (view->details->zoom_level); - gtk_cell_renderer_set_fixed_size (GTK_CELL_RENDERER (view->details->pixbuf_cell), - -1, icon_size + 2 * icon_padding); + /* Make all rows the same size. */ + icon_size = nautilus_list_model_get_icon_size_for_zoom_level (view->details->zoom_level); + icon_padding = nautilus_list_view_get_icon_padding_for_zoom_level (view->details->zoom_level); + gtk_cell_renderer_set_fixed_size (GTK_CELL_RENDERER (view->details->pixbuf_cell), + -1, icon_size + 2 * icon_padding); - /* FIXME: https://bugzilla.gnome.org/show_bug.cgi?id=641518 */ - gtk_tree_view_columns_autosize (view->details->tree_view); + /* FIXME: https://bugzilla.gnome.org/show_bug.cgi?id=641518 */ + gtk_tree_view_columns_autosize (view->details->tree_view); } static gint get_icon_scale_callback (NautilusListModel *model, - NautilusListView *view) + NautilusListView *view) { - return gtk_widget_get_scale_factor (GTK_WIDGET (view->details->tree_view)); + return gtk_widget_get_scale_factor (GTK_WIDGET (view->details->tree_view)); } static void create_and_set_up_tree_view (NautilusListView *view) { - GtkCellRenderer *cell; - GtkTreeViewColumn *column; - AtkObject *atk_obj; - GList *nautilus_columns; - GList *l; - gchar **default_column_order, **default_visible_columns; - GtkWidget *content_widget; - - content_widget = nautilus_files_view_get_content_widget (NAUTILUS_FILES_VIEW (view)); - view->details->tree_view = GTK_TREE_VIEW (gtk_tree_view_new ()); - view->details->columns = g_hash_table_new_full (g_str_hash, - g_str_equal, - (GDestroyNotify) g_free, - NULL); - gtk_tree_view_set_enable_search (view->details->tree_view, FALSE); - - view->details->drag_dest = - nautilus_tree_view_drag_dest_new (view->details->tree_view); - - g_signal_connect_object (view->details->drag_dest, - "get-root-uri", - G_CALLBACK (get_root_uri_callback), - view, 0); - g_signal_connect_object (view->details->drag_dest, - "get-file-for-path", - G_CALLBACK (get_file_for_path_callback), - view, 0); - g_signal_connect_object (view->details->drag_dest, - "move-copy-items", - G_CALLBACK (move_copy_items_callback), - view, 0); - g_signal_connect_object (view->details->drag_dest, "handle-netscape-url", - G_CALLBACK (list_view_handle_netscape_url), view, 0); - g_signal_connect_object (view->details->drag_dest, "handle-uri-list", - G_CALLBACK (list_view_handle_uri_list), view, 0); - g_signal_connect_object (view->details->drag_dest, "handle-text", - G_CALLBACK (list_view_handle_text), view, 0); - g_signal_connect_object (view->details->drag_dest, "handle-raw", - G_CALLBACK (list_view_handle_raw), view, 0); - g_signal_connect_object (view->details->drag_dest, "handle-hover", - G_CALLBACK (list_view_handle_hover), view, 0); - - g_signal_connect_object (gtk_tree_view_get_selection (view->details->tree_view), - "changed", - G_CALLBACK (list_selection_changed_callback), view, 0); - - g_signal_connect_object (view->details->tree_view, "motion-notify-event", - G_CALLBACK (motion_notify_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "enter-notify-event", - G_CALLBACK (enter_notify_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "leave-notify-event", - G_CALLBACK (leave_notify_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "button-press-event", - G_CALLBACK (button_press_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "button-release-event", - G_CALLBACK (button_release_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "key-press-event", - G_CALLBACK (key_press_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "test-expand-row", - G_CALLBACK (test_expand_row_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "popup-menu", - G_CALLBACK (popup_menu_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "row-expanded", - G_CALLBACK (row_expanded_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "row-collapsed", - G_CALLBACK (row_collapsed_callback), view, 0); - g_signal_connect_object (view->details->tree_view, "row-activated", - G_CALLBACK (row_activated_callback), view, 0); - - view->details->model = g_object_new (NAUTILUS_TYPE_LIST_MODEL, NULL); - gtk_tree_view_set_model (view->details->tree_view, GTK_TREE_MODEL (view->details->model)); - /* Need the model for the dnd drop icon "accept" change */ - nautilus_list_model_set_drag_view (NAUTILUS_LIST_MODEL (view->details->model), - view->details->tree_view, 0, 0); - - g_signal_connect_object (view->details->model, "sort-column-changed", - G_CALLBACK (sort_column_changed_callback), view, 0); - - g_signal_connect_object (view->details->model, "subdirectory-unloaded", - G_CALLBACK (subdirectory_unloaded_callback), view, 0); - - g_signal_connect_object (view->details->model, "get-icon-scale", - G_CALLBACK (get_icon_scale_callback), view, 0); - - gtk_tree_selection_set_mode (gtk_tree_view_get_selection (view->details->tree_view), GTK_SELECTION_MULTIPLE); - - g_settings_bind (nautilus_list_view_preferences, NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE, - view->details->tree_view, "show-expanders", - G_SETTINGS_BIND_DEFAULT); - - nautilus_columns = nautilus_get_all_columns (); - - for (l = nautilus_columns; l != NULL; l = l->next) { - NautilusColumn *nautilus_column; - int column_num; - char *name; - char *label; - float xalign; - GtkSortType sort_order; - - nautilus_column = NAUTILUS_COLUMN (l->data); - - g_object_get (nautilus_column, - "name", &name, - "label", &label, - "xalign", &xalign, - "default-sort-order", &sort_order, - NULL); - - column_num = nautilus_list_model_add_column (view->details->model, - nautilus_column); - - /* Created the name column specially, because it - * has the icon in it.*/ - if (!strcmp (name, "name")) { - /* Create the file name column */ - view->details->file_name_column = gtk_tree_view_column_new (); - gtk_tree_view_append_column (view->details->tree_view, - view->details->file_name_column); - view->details->file_name_column_num = column_num; - - g_hash_table_insert (view->details->columns, - g_strdup ("name"), - view->details->file_name_column); - - g_signal_connect (gtk_tree_view_column_get_button (view->details->file_name_column), - "button-press-event", - G_CALLBACK (column_header_clicked), - view); - - gtk_tree_view_set_search_column (view->details->tree_view, column_num); - - gtk_tree_view_column_set_sort_column_id (view->details->file_name_column, column_num); - gtk_tree_view_column_set_title (view->details->file_name_column, _("Name")); - gtk_tree_view_column_set_resizable (view->details->file_name_column, TRUE); - gtk_tree_view_column_set_expand (view->details->file_name_column, TRUE); - - /* Initial padding */ - cell = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (view->details->file_name_column, cell, FALSE); - g_object_set (cell, "xpad", 6, NULL); - g_settings_bind (nautilus_list_view_preferences, NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE, - cell, "visible", - G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_GET); - - /* File icon */ - cell = gtk_cell_renderer_pixbuf_new (); - view->details->pixbuf_cell = (GtkCellRendererPixbuf *)cell; - set_up_pixbuf_size (view); - - gtk_tree_view_column_pack_start (view->details->file_name_column, cell, FALSE); - gtk_tree_view_column_set_attributes (view->details->file_name_column, - cell, - "surface", nautilus_list_model_get_column_id_from_zoom_level (view->details->zoom_level), - NULL); - - cell = gtk_cell_renderer_text_new (); - view->details->file_name_cell = (GtkCellRendererText *)cell; - g_object_set (cell, - "ellipsize", PANGO_ELLIPSIZE_END, - "single-paragraph-mode", TRUE, - "width-chars", 30, - "xpad", 5, - NULL); - - gtk_tree_view_column_pack_start (view->details->file_name_column, cell, TRUE); - gtk_tree_view_column_set_cell_data_func (view->details->file_name_column, cell, - (GtkTreeCellDataFunc) filename_cell_data_func, - view, NULL); - } else { - /* We need to use libgd */ - cell = gd_styled_text_renderer_new (); - /* FIXME: should be just dim-label. - * See https://bugzilla.gnome.org/show_bug.cgi?id=744397 - */ - gd_styled_text_renderer_add_class (GD_STYLED_TEXT_RENDERER (cell), - "nautilus-list-dim-label"); - - g_object_set (cell, - "xalign", xalign, - "xpad", 5, - NULL); - if (!strcmp (name, "permissions")) { - g_object_set (cell, - "family", "Monospace", - NULL); - } - view->details->cells = g_list_append (view->details->cells, - cell); - column = gtk_tree_view_column_new_with_attributes (label, - cell, - "text", column_num, - NULL); - gtk_tree_view_append_column (view->details->tree_view, column); - gtk_tree_view_column_set_sort_column_id (column, column_num); - g_hash_table_insert (view->details->columns, - g_strdup (name), - column); - - g_signal_connect (gtk_tree_view_column_get_button (column), - "button-press-event", - G_CALLBACK (column_header_clicked), - view); - - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_column_set_sort_order (column, sort_order); - - if (!strcmp (name, "where")) { - gtk_tree_view_column_set_cell_data_func (column, cell, - (GtkTreeCellDataFunc) where_cell_data_func, - view, NULL); - } else if (!strcmp (name, "trash_orig_path")) { - gtk_tree_view_column_set_cell_data_func (column, cell, - (GtkTreeCellDataFunc) trash_orig_path_cell_data_func, - view, NULL); - } - } - g_free (name); - g_free (label); - } - nautilus_column_list_free (nautilus_columns); - - default_visible_columns = g_settings_get_strv (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS); - default_column_order = g_settings_get_strv (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER); - - /* Apply the default column order and visible columns, to get it - * right most of the time. The metadata will be checked when a - * folder is loaded */ - apply_columns_settings (view, - default_column_order, - default_visible_columns); - - gtk_widget_show (GTK_WIDGET (view->details->tree_view)); - gtk_container_add (GTK_CONTAINER (content_widget), GTK_WIDGET (view->details->tree_view)); - - atk_obj = gtk_widget_get_accessible (GTK_WIDGET (view->details->tree_view)); - atk_object_set_name (atk_obj, _("List View")); - - g_strfreev (default_visible_columns); - g_strfreev (default_column_order); -} - -static void -nautilus_list_view_add_file (NautilusFilesView *view, NautilusFile *file, NautilusDirectory *directory) -{ - NautilusListModel *model; - - model = NAUTILUS_LIST_VIEW (view)->details->model; - nautilus_list_model_add_file (model, file, directory); + GtkCellRenderer *cell; + GtkTreeViewColumn *column; + AtkObject *atk_obj; + GList *nautilus_columns; + GList *l; + gchar **default_column_order, **default_visible_columns; + GtkWidget *content_widget; + + content_widget = nautilus_files_view_get_content_widget (NAUTILUS_FILES_VIEW (view)); + view->details->tree_view = GTK_TREE_VIEW (gtk_tree_view_new ()); + view->details->columns = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + NULL); + gtk_tree_view_set_enable_search (view->details->tree_view, FALSE); + + view->details->drag_dest = + nautilus_tree_view_drag_dest_new (view->details->tree_view); + + g_signal_connect_object (view->details->drag_dest, + "get-root-uri", + G_CALLBACK (get_root_uri_callback), + view, 0); + g_signal_connect_object (view->details->drag_dest, + "get-file-for-path", + G_CALLBACK (get_file_for_path_callback), + view, 0); + g_signal_connect_object (view->details->drag_dest, + "move-copy-items", + G_CALLBACK (move_copy_items_callback), + view, 0); + g_signal_connect_object (view->details->drag_dest, "handle-netscape-url", + G_CALLBACK (list_view_handle_netscape_url), view, 0); + g_signal_connect_object (view->details->drag_dest, "handle-uri-list", + G_CALLBACK (list_view_handle_uri_list), view, 0); + g_signal_connect_object (view->details->drag_dest, "handle-text", + G_CALLBACK (list_view_handle_text), view, 0); + g_signal_connect_object (view->details->drag_dest, "handle-raw", + G_CALLBACK (list_view_handle_raw), view, 0); + g_signal_connect_object (view->details->drag_dest, "handle-hover", + G_CALLBACK (list_view_handle_hover), view, 0); + + g_signal_connect_object (gtk_tree_view_get_selection (view->details->tree_view), + "changed", + G_CALLBACK (list_selection_changed_callback), view, 0); + + g_signal_connect_object (view->details->tree_view, "motion-notify-event", + G_CALLBACK (motion_notify_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "enter-notify-event", + G_CALLBACK (enter_notify_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "leave-notify-event", + G_CALLBACK (leave_notify_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "button-press-event", + G_CALLBACK (button_press_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "button-release-event", + G_CALLBACK (button_release_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "key-press-event", + G_CALLBACK (key_press_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "test-expand-row", + G_CALLBACK (test_expand_row_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "popup-menu", + G_CALLBACK (popup_menu_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "row-expanded", + G_CALLBACK (row_expanded_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "row-collapsed", + G_CALLBACK (row_collapsed_callback), view, 0); + g_signal_connect_object (view->details->tree_view, "row-activated", + G_CALLBACK (row_activated_callback), view, 0); + + view->details->model = g_object_new (NAUTILUS_TYPE_LIST_MODEL, NULL); + gtk_tree_view_set_model (view->details->tree_view, GTK_TREE_MODEL (view->details->model)); + /* Need the model for the dnd drop icon "accept" change */ + nautilus_list_model_set_drag_view (NAUTILUS_LIST_MODEL (view->details->model), + view->details->tree_view, 0, 0); + + g_signal_connect_object (view->details->model, "sort-column-changed", + G_CALLBACK (sort_column_changed_callback), view, 0); + + g_signal_connect_object (view->details->model, "subdirectory-unloaded", + G_CALLBACK (subdirectory_unloaded_callback), view, 0); + + g_signal_connect_object (view->details->model, "get-icon-scale", + G_CALLBACK (get_icon_scale_callback), view, 0); + + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (view->details->tree_view), GTK_SELECTION_MULTIPLE); + + g_settings_bind (nautilus_list_view_preferences, NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE, + view->details->tree_view, "show-expanders", + G_SETTINGS_BIND_DEFAULT); + + nautilus_columns = nautilus_get_all_columns (); + + for (l = nautilus_columns; l != NULL; l = l->next) + { + NautilusColumn *nautilus_column; + int column_num; + char *name; + char *label; + float xalign; + GtkSortType sort_order; + + nautilus_column = NAUTILUS_COLUMN (l->data); + + g_object_get (nautilus_column, + "name", &name, + "label", &label, + "xalign", &xalign, + "default-sort-order", &sort_order, + NULL); + + column_num = nautilus_list_model_add_column (view->details->model, + nautilus_column); + + /* Created the name column specially, because it + * has the icon in it.*/ + if (!strcmp (name, "name")) + { + /* Create the file name column */ + view->details->file_name_column = gtk_tree_view_column_new (); + gtk_tree_view_append_column (view->details->tree_view, + view->details->file_name_column); + view->details->file_name_column_num = column_num; + + g_hash_table_insert (view->details->columns, + g_strdup ("name"), + view->details->file_name_column); + + g_signal_connect (gtk_tree_view_column_get_button (view->details->file_name_column), + "button-press-event", + G_CALLBACK (column_header_clicked), + view); + + gtk_tree_view_set_search_column (view->details->tree_view, column_num); + + gtk_tree_view_column_set_sort_column_id (view->details->file_name_column, column_num); + gtk_tree_view_column_set_title (view->details->file_name_column, _("Name")); + gtk_tree_view_column_set_resizable (view->details->file_name_column, TRUE); + gtk_tree_view_column_set_expand (view->details->file_name_column, TRUE); + + /* Initial padding */ + cell = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (view->details->file_name_column, cell, FALSE); + g_object_set (cell, "xpad", 6, NULL); + g_settings_bind (nautilus_list_view_preferences, NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE, + cell, "visible", + G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_GET); + + /* File icon */ + cell = gtk_cell_renderer_pixbuf_new (); + view->details->pixbuf_cell = (GtkCellRendererPixbuf *) cell; + set_up_pixbuf_size (view); + + gtk_tree_view_column_pack_start (view->details->file_name_column, cell, FALSE); + gtk_tree_view_column_set_attributes (view->details->file_name_column, + cell, + "surface", nautilus_list_model_get_column_id_from_zoom_level (view->details->zoom_level), + NULL); + + cell = gtk_cell_renderer_text_new (); + view->details->file_name_cell = (GtkCellRendererText *) cell; + g_object_set (cell, + "ellipsize", PANGO_ELLIPSIZE_END, + "single-paragraph-mode", TRUE, + "width-chars", 30, + "xpad", 5, + NULL); + + gtk_tree_view_column_pack_start (view->details->file_name_column, cell, TRUE); + gtk_tree_view_column_set_cell_data_func (view->details->file_name_column, cell, + (GtkTreeCellDataFunc) filename_cell_data_func, + view, NULL); + } + else + { + /* We need to use libgd */ + cell = gd_styled_text_renderer_new (); + /* FIXME: should be just dim-label. + * See https://bugzilla.gnome.org/show_bug.cgi?id=744397 + */ + gd_styled_text_renderer_add_class (GD_STYLED_TEXT_RENDERER (cell), + "nautilus-list-dim-label"); + + g_object_set (cell, + "xalign", xalign, + "xpad", 5, + NULL); + if (!strcmp (name, "permissions")) + { + g_object_set (cell, + "family", "Monospace", + NULL); + } + view->details->cells = g_list_append (view->details->cells, + cell); + column = gtk_tree_view_column_new_with_attributes (label, + cell, + "text", column_num, + NULL); + gtk_tree_view_append_column (view->details->tree_view, column); + gtk_tree_view_column_set_sort_column_id (column, column_num); + g_hash_table_insert (view->details->columns, + g_strdup (name), + column); + + g_signal_connect (gtk_tree_view_column_get_button (column), + "button-press-event", + G_CALLBACK (column_header_clicked), + view); + + gtk_tree_view_column_set_resizable (column, TRUE); + gtk_tree_view_column_set_sort_order (column, sort_order); + + if (!strcmp (name, "where")) + { + gtk_tree_view_column_set_cell_data_func (column, cell, + (GtkTreeCellDataFunc) where_cell_data_func, + view, NULL); + } + else if (!strcmp (name, "trash_orig_path")) + { + gtk_tree_view_column_set_cell_data_func (column, cell, + (GtkTreeCellDataFunc) trash_orig_path_cell_data_func, + view, NULL); + } + } + g_free (name); + g_free (label); + } + nautilus_column_list_free (nautilus_columns); + + default_visible_columns = g_settings_get_strv (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS); + default_column_order = g_settings_get_strv (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER); + + /* Apply the default column order and visible columns, to get it + * right most of the time. The metadata will be checked when a + * folder is loaded */ + apply_columns_settings (view, + default_column_order, + default_visible_columns); + + gtk_widget_show (GTK_WIDGET (view->details->tree_view)); + gtk_container_add (GTK_CONTAINER (content_widget), GTK_WIDGET (view->details->tree_view)); + + atk_obj = gtk_widget_get_accessible (GTK_WIDGET (view->details->tree_view)); + atk_object_set_name (atk_obj, _("List View")); + + g_strfreev (default_visible_columns); + g_strfreev (default_column_order); +} + +static void +nautilus_list_view_add_file (NautilusFilesView *view, + NautilusFile *file, + NautilusDirectory *directory) +{ + NautilusListModel *model; + + model = NAUTILUS_LIST_VIEW (view)->details->model; + nautilus_list_model_add_file (model, file, directory); } static char ** get_default_visible_columns (NautilusListView *list_view) { - NautilusFile *file; - NautilusDirectory *directory; + NautilusFile *file; + NautilusDirectory *directory; - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - if (nautilus_file_is_in_trash (file)) { - return g_strdupv ((gchar **) default_trash_visible_columns); - } + if (nautilus_file_is_in_trash (file)) + { + return g_strdupv ((gchar **) default_trash_visible_columns); + } - directory = nautilus_files_view_get_model (NAUTILUS_FILES_VIEW (list_view)); - if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) { - return g_strdupv ((gchar **) default_search_visible_columns); - } + directory = nautilus_files_view_get_model (NAUTILUS_FILES_VIEW (list_view)); + if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) + { + return g_strdupv ((gchar **) default_search_visible_columns); + } - return g_settings_get_strv (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS); + return g_settings_get_strv (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS); } static char ** get_visible_columns (NautilusListView *list_view) { - NautilusFile *file; - GList *visible_columns; + NautilusFile *file; + GList *visible_columns; - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - visible_columns = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS); + visible_columns = nautilus_file_get_metadata_list + (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS); - if (visible_columns) { - GPtrArray *res; - GList *l; + if (visible_columns) + { + GPtrArray *res; + GList *l; - res = g_ptr_array_new (); - for (l = visible_columns; l != NULL; l = l->next) { - g_ptr_array_add (res, l->data); - } - g_ptr_array_add (res, NULL); + res = g_ptr_array_new (); + for (l = visible_columns; l != NULL; l = l->next) + { + g_ptr_array_add (res, l->data); + } + g_ptr_array_add (res, NULL); - g_list_free (visible_columns); + g_list_free (visible_columns); - return (char **) g_ptr_array_free (res, FALSE); - } + return (char **) g_ptr_array_free (res, FALSE); + } - return get_default_visible_columns (list_view); + return get_default_visible_columns (list_view); } static char ** get_default_column_order (NautilusListView *list_view) { - NautilusFile *file; - NautilusDirectory *directory; + NautilusFile *file; + NautilusDirectory *directory; - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - if (nautilus_file_is_in_trash (file)) { - return g_strdupv ((gchar **) default_trash_columns_order); - } + if (nautilus_file_is_in_trash (file)) + { + return g_strdupv ((gchar **) default_trash_columns_order); + } - directory = nautilus_files_view_get_model (NAUTILUS_FILES_VIEW (list_view)); - if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) { - return g_strdupv ((gchar **) default_search_columns_order); - } + directory = nautilus_files_view_get_model (NAUTILUS_FILES_VIEW (list_view)); + if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) + { + return g_strdupv ((gchar **) default_search_columns_order); + } - return g_settings_get_strv (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER); + return g_settings_get_strv (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER); } static char ** get_column_order (NautilusListView *list_view) { - NautilusFile *file; - GList *column_order; + NautilusFile *file; + GList *column_order; - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - column_order = nautilus_file_get_metadata_list - (file, - NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER); + column_order = nautilus_file_get_metadata_list + (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER); - if (column_order) { - GPtrArray *res; - GList *l; + if (column_order) + { + GPtrArray *res; + GList *l; - res = g_ptr_array_new (); - for (l = column_order; l != NULL; l = l->next) { - g_ptr_array_add (res, l->data); - } - g_ptr_array_add (res, NULL); + res = g_ptr_array_new (); + for (l = column_order; l != NULL; l = l->next) + { + g_ptr_array_add (res, l->data); + } + g_ptr_array_add (res, NULL); - g_list_free (column_order); + g_list_free (column_order); - return (char **) g_ptr_array_free (res, FALSE); - } + return (char **) g_ptr_array_free (res, FALSE); + } - return get_default_column_order (list_view); + return get_default_column_order (list_view); } static void check_allow_sort (NautilusListView *list_view) { - GList *column_names; - GList *l; - NautilusFile *file; - GtkTreeViewColumn *column; - gboolean allow_sorting; - int sort_column_id; - - column_names = g_hash_table_get_keys (list_view->details->columns); - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - allow_sorting = ! (nautilus_file_is_in_recent (file) || nautilus_file_is_in_search (file)); - - for (l = column_names; l != NULL; l = l->next) { - column = g_hash_table_lookup (list_view->details->columns, l->data); - if (allow_sorting) { - sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, - g_quark_from_string (l->data)); - /* Restore its original sorting id. We rely on that the keys of the hashmap - * use the same string than the sort criterias */ - gtk_tree_view_column_set_sort_column_id (column, sort_column_id); - } else { - /* This disables the header and any sorting capability (like shortcuts), - * but leaving them interactionable so the user can still resize them */ - gtk_tree_view_column_set_sort_column_id (column, -1); - } + GList *column_names; + GList *l; + NautilusFile *file; + GtkTreeViewColumn *column; + gboolean allow_sorting; + int sort_column_id; + + column_names = g_hash_table_get_keys (list_view->details->columns); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + allow_sorting = !(nautilus_file_is_in_recent (file) || nautilus_file_is_in_search (file)); + + for (l = column_names; l != NULL; l = l->next) + { + column = g_hash_table_lookup (list_view->details->columns, l->data); + if (allow_sorting) + { + sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, + g_quark_from_string (l->data)); + /* Restore its original sorting id. We rely on that the keys of the hashmap + * use the same string than the sort criterias */ + gtk_tree_view_column_set_sort_column_id (column, sort_column_id); } + else + { + /* This disables the header and any sorting capability (like shortcuts), + * but leaving them interactionable so the user can still resize them */ + gtk_tree_view_column_set_sort_column_id (column, -1); + } + } - g_list_free (column_names); + g_list_free (column_names); } static void set_columns_settings_from_metadata_and_preferences (NautilusListView *list_view) { - char **column_order; - char **visible_columns; + char **column_order; + char **visible_columns; - column_order = get_column_order (list_view); - visible_columns = get_visible_columns (list_view); + column_order = get_column_order (list_view); + visible_columns = get_visible_columns (list_view); - apply_columns_settings (list_view, column_order, visible_columns); + apply_columns_settings (list_view, column_order, visible_columns); - g_strfreev (column_order); - g_strfreev (visible_columns); + g_strfreev (column_order); + g_strfreev (visible_columns); } static void set_sort_order_from_metadata_and_preferences (NautilusListView *list_view) { - char *sort_attribute; - int sort_column_id; - NautilusFile *file; - gboolean sort_reversed, default_sort_reversed; - const gchar *default_sort_order; - - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); - default_sort_order = get_default_sort_order (file, &default_sort_reversed); - if (!(nautilus_file_is_in_recent (file) || nautilus_file_is_in_search (file))) { - sort_attribute = nautilus_file_get_metadata (file, - NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN, - NULL); - sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, - g_quark_from_string (sort_attribute)); - g_free (sort_attribute); - - if (sort_column_id == -1) { - sort_column_id = - nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, - g_quark_from_string (default_sort_order)); - } - - sort_reversed = nautilus_file_get_boolean_metadata (file, - NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_REVERSED, - default_sort_reversed); - } else { - /* Make sure we use the default one and not one that the user used previously - * of the change to not allow sorting on search and recent, or the - * case that the user or some app modified directly the metadata */ - sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, - g_quark_from_string (default_sort_order)); - sort_reversed = default_sort_reversed; - } - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_view->details->model), - sort_column_id, - sort_reversed ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING); + char *sort_attribute; + int sort_column_id; + NautilusFile *file; + gboolean sort_reversed, default_sort_reversed; + const gchar *default_sort_order; + + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (list_view)); + default_sort_order = get_default_sort_order (file, &default_sort_reversed); + if (!(nautilus_file_is_in_recent (file) || nautilus_file_is_in_search (file))) + { + sort_attribute = nautilus_file_get_metadata (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_COLUMN, + NULL); + sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, + g_quark_from_string (sort_attribute)); + g_free (sort_attribute); + + if (sort_column_id == -1) + { + sort_column_id = + nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, + g_quark_from_string (default_sort_order)); + } + + sort_reversed = nautilus_file_get_boolean_metadata (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_SORT_REVERSED, + default_sort_reversed); + } + else + { + /* Make sure we use the default one and not one that the user used previously + * of the change to not allow sorting on search and recent, or the + * case that the user or some app modified directly the metadata */ + sort_column_id = nautilus_list_model_get_sort_column_id_from_attribute (list_view->details->model, + g_quark_from_string (default_sort_order)); + sort_reversed = default_sort_reversed; + } + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_view->details->model), + sort_column_id, + sort_reversed ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING); } static NautilusListZoomLevel -get_default_zoom_level (void) { - NautilusListZoomLevel default_zoom_level; +get_default_zoom_level (void) +{ + NautilusListZoomLevel default_zoom_level; - default_zoom_level = g_settings_get_enum (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_ZOOM_LEVEL); + default_zoom_level = g_settings_get_enum (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_ZOOM_LEVEL); - if (default_zoom_level < NAUTILUS_LIST_ZOOM_LEVEL_SMALL - || default_zoom_level > NAUTILUS_LIST_ZOOM_LEVEL_LARGER) { - default_zoom_level = NAUTILUS_LIST_ZOOM_LEVEL_STANDARD; - } + if (default_zoom_level < NAUTILUS_LIST_ZOOM_LEVEL_SMALL + || default_zoom_level > NAUTILUS_LIST_ZOOM_LEVEL_LARGER) + { + default_zoom_level = NAUTILUS_LIST_ZOOM_LEVEL_STANDARD; + } - return default_zoom_level; + return default_zoom_level; } static void nautilus_list_view_begin_loading (NautilusFilesView *view) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (view); + list_view = NAUTILUS_LIST_VIEW (view); - set_sort_order_from_metadata_and_preferences (list_view); - set_columns_settings_from_metadata_and_preferences (list_view); - check_allow_sort (list_view); + set_sort_order_from_metadata_and_preferences (list_view); + set_columns_settings_from_metadata_and_preferences (list_view); + check_allow_sort (list_view); } static void nautilus_list_view_clear (NautilusFilesView *view) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (view); + list_view = NAUTILUS_LIST_VIEW (view); - if (list_view->details->model != NULL) { - nautilus_list_model_clear (list_view->details->model); - } + if (list_view->details->model != NULL) + { + nautilus_list_model_clear (list_view->details->model); + } } static void -nautilus_list_view_file_changed (NautilusFilesView *view, NautilusFile *file, NautilusDirectory *directory) +nautilus_list_view_file_changed (NautilusFilesView *view, + NautilusFile *file, + NautilusDirectory *directory) { - NautilusListView *listview; + NautilusListView *listview; - listview = NAUTILUS_LIST_VIEW (view); - - nautilus_list_model_file_changed (listview->details->model, file, directory); + listview = NAUTILUS_LIST_VIEW (view); + + nautilus_list_model_file_changed (listview->details->model, file, directory); } -typedef struct { - GtkTreePath *path; - gboolean is_common; - gboolean is_root; +typedef struct +{ + GtkTreePath *path; + gboolean is_common; + gboolean is_root; } HasCommonParentData; static void tree_selection_has_common_parent_foreach_func (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer user_data) + GtkTreePath *path, + GtkTreeIter *iter, + gpointer user_data) { - HasCommonParentData *data; - GtkTreePath *parent_path; - gboolean has_parent; + HasCommonParentData *data; + GtkTreePath *parent_path; + gboolean has_parent; - data = (HasCommonParentData *) user_data; + data = (HasCommonParentData *) user_data; - parent_path = gtk_tree_path_copy (path); - gtk_tree_path_up (parent_path); + parent_path = gtk_tree_path_copy (path); + gtk_tree_path_up (parent_path); - has_parent = (gtk_tree_path_get_depth (parent_path) > 0) ? TRUE : FALSE; + has_parent = (gtk_tree_path_get_depth (parent_path) > 0) ? TRUE : FALSE; - if (!has_parent) { - data->is_root = TRUE; - } + if (!has_parent) + { + data->is_root = TRUE; + } - if (data->is_common && !data->is_root) { - if (data->path == NULL) { - data->path = gtk_tree_path_copy (parent_path); - } else if (gtk_tree_path_compare (data->path, parent_path) != 0) { - data->is_common = FALSE; - } - } + if (data->is_common && !data->is_root) + { + if (data->path == NULL) + { + data->path = gtk_tree_path_copy (parent_path); + } + else if (gtk_tree_path_compare (data->path, parent_path) != 0) + { + data->is_common = FALSE; + } + } - gtk_tree_path_free (parent_path); + gtk_tree_path_free (parent_path); } static void tree_selection_has_common_parent (GtkTreeSelection *selection, - gboolean *is_common, - gboolean *is_root) + gboolean *is_common, + gboolean *is_root) { - HasCommonParentData data; + HasCommonParentData data; - g_assert (is_common != NULL); - g_assert (is_root != NULL); + g_assert (is_common != NULL); + g_assert (is_root != NULL); - data.path = NULL; - data.is_common = *is_common = TRUE; - data.is_root = *is_root = FALSE; + data.path = NULL; + data.is_common = *is_common = TRUE; + data.is_root = *is_root = FALSE; - gtk_tree_selection_selected_foreach (selection, - tree_selection_has_common_parent_foreach_func, - &data); + gtk_tree_selection_selected_foreach (selection, + tree_selection_has_common_parent_foreach_func, + &data); - *is_common = data.is_common; - *is_root = data.is_root; + *is_common = data.is_common; + *is_root = data.is_root; - if (data.path != NULL) { - gtk_tree_path_free (data.path); - } + if (data.path != NULL) + { + gtk_tree_path_free (data.path); + } } static char * nautilus_list_view_get_backing_uri (NautilusFilesView *view) { - NautilusListView *list_view; - NautilusListModel *list_model; - NautilusFile *file; - GtkTreeView *tree_view; - GtkTreeSelection *selection; - GtkTreePath *path; - GList *paths; - guint length; - char *uri; - - g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), NULL); - - list_view = NAUTILUS_LIST_VIEW (view); - list_model = list_view->details->model; - tree_view = list_view->details->tree_view; - - g_assert (list_model); - - /* We currently handle three common cases here: - * (a) if the selection contains non-filesystem items (i.e., the - * "(Empty)" label), we return the uri of the parent. - * (b) if the selection consists of exactly one _expanded_ directory, we - * return its URI. - * (c) if the selection consists of either exactly one item which is not - * an expanded directory) or multiple items in the same directory, - * we return the URI of the common parent. - */ - - uri = NULL; - - selection = gtk_tree_view_get_selection (tree_view); - length = gtk_tree_selection_count_selected_rows (selection); - - if (length == 1) { - - paths = gtk_tree_selection_get_selected_rows (selection, NULL); - path = (GtkTreePath *) paths->data; - - file = nautilus_list_model_file_for_path (list_model, path); - if (file == NULL) { - /* The selected item is a label, not a file */ - gtk_tree_path_up (path); - file = nautilus_list_model_file_for_path (list_model, path); - } - - if (file != NULL) { - if (nautilus_file_is_directory (file) && - gtk_tree_view_row_expanded (tree_view, path)) { - uri = nautilus_file_get_uri (file); - } - nautilus_file_unref (file); - } + NautilusListView *list_view; + NautilusListModel *list_model; + NautilusFile *file; + GtkTreeView *tree_view; + GtkTreeSelection *selection; + GtkTreePath *path; + GList *paths; + guint length; + char *uri; + + g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), NULL); + + list_view = NAUTILUS_LIST_VIEW (view); + list_model = list_view->details->model; + tree_view = list_view->details->tree_view; + + g_assert (list_model); + + /* We currently handle three common cases here: + * (a) if the selection contains non-filesystem items (i.e., the + * "(Empty)" label), we return the uri of the parent. + * (b) if the selection consists of exactly one _expanded_ directory, we + * return its URI. + * (c) if the selection consists of either exactly one item which is not + * an expanded directory) or multiple items in the same directory, + * we return the URI of the common parent. + */ + + uri = NULL; + + selection = gtk_tree_view_get_selection (tree_view); + length = gtk_tree_selection_count_selected_rows (selection); + + if (length == 1) + { + paths = gtk_tree_selection_get_selected_rows (selection, NULL); + path = (GtkTreePath *) paths->data; + + file = nautilus_list_model_file_for_path (list_model, path); + if (file == NULL) + { + /* The selected item is a label, not a file */ + gtk_tree_path_up (path); + file = nautilus_list_model_file_for_path (list_model, path); + } - gtk_tree_path_free (path); - g_list_free (paths); - } + if (file != NULL) + { + if (nautilus_file_is_directory (file) && + gtk_tree_view_row_expanded (tree_view, path)) + { + uri = nautilus_file_get_uri (file); + } + nautilus_file_unref (file); + } - if (uri == NULL && length > 0) { + gtk_tree_path_free (path); + g_list_free (paths); + } - gboolean is_common, is_root; + if (uri == NULL && length > 0) + { + gboolean is_common, is_root; - /* Check that all the selected items belong to the same - * directory and that directory is not the root directory (which - * is handled by NautilusFilesView::get_backing_directory.) */ + /* Check that all the selected items belong to the same + * directory and that directory is not the root directory (which + * is handled by NautilusFilesView::get_backing_directory.) */ - tree_selection_has_common_parent (selection, &is_common, &is_root); + tree_selection_has_common_parent (selection, &is_common, &is_root); - if (is_common && !is_root) { - paths = gtk_tree_selection_get_selected_rows (selection, NULL); - path = (GtkTreePath *) paths->data; + if (is_common && !is_root) + { + paths = gtk_tree_selection_get_selected_rows (selection, NULL); + path = (GtkTreePath *) paths->data; - file = nautilus_list_model_file_for_path (list_model, path); - g_assert (file != NULL); - uri = nautilus_file_get_parent_uri (file); - nautilus_file_unref (file); + file = nautilus_list_model_file_for_path (list_model, path); + g_assert (file != NULL); + uri = nautilus_file_get_parent_uri (file); + nautilus_file_unref (file); - g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free); - } - } + g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free); + } + } - if (uri != NULL) { - return uri; - } + if (uri != NULL) + { + return uri; + } - return NAUTILUS_FILES_VIEW_CLASS (nautilus_list_view_parent_class)->get_backing_uri (view); + return NAUTILUS_FILES_VIEW_CLASS (nautilus_list_view_parent_class)->get_backing_uri (view); } static void -nautilus_list_view_get_selection_foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) +nautilus_list_view_get_selection_foreach_func (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) { - GList **list; - NautilusFile *file; - - list = data; + GList **list; + NautilusFile *file; + + list = data; - gtk_tree_model_get (model, iter, - NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, - -1); + gtk_tree_model_get (model, iter, + NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, + -1); - if (file != NULL) { - (* list) = g_list_prepend ((* list), file); - } + if (file != NULL) + { + (*list) = g_list_prepend ((*list), file); + } } static GList * nautilus_list_view_get_selection (NautilusFilesView *view) { - GList *list; + GList *list; - list = NULL; + list = NULL; - gtk_tree_selection_selected_foreach (gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view), - nautilus_list_view_get_selection_foreach_func, &list); + gtk_tree_selection_selected_foreach (gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view), + nautilus_list_view_get_selection_foreach_func, &list); - return g_list_reverse (list); + return g_list_reverse (list); } static void -nautilus_list_view_get_selection_for_file_transfer_foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) +nautilus_list_view_get_selection_for_file_transfer_foreach_func (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) { - NautilusFile *file; - struct SelectionForeachData *selection_data; - GtkTreeIter parent, child; + NautilusFile *file; + struct SelectionForeachData *selection_data; + GtkTreeIter parent, child; - selection_data = data; + selection_data = data; - gtk_tree_model_get (model, iter, - NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, - -1); + gtk_tree_model_get (model, iter, + NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, + -1); + + if (file != NULL) + { + /* If the parent folder is also selected, don't include this file in the + * file operation, since that would copy it to the toplevel target instead + * of keeping it as a child of the copied folder + */ + child = *iter; + while (gtk_tree_model_iter_parent (model, &parent, &child)) + { + if (gtk_tree_selection_iter_is_selected (selection_data->selection, + &parent)) + { + return; + } + child = parent; + } - if (file != NULL) { - /* If the parent folder is also selected, don't include this file in the - * file operation, since that would copy it to the toplevel target instead - * of keeping it as a child of the copied folder - */ - child = *iter; - while (gtk_tree_model_iter_parent (model, &parent, &child)) { - if (gtk_tree_selection_iter_is_selected (selection_data->selection, - &parent)) { - return; - } - child = parent; - } - - nautilus_file_ref (file); - selection_data->list = g_list_prepend (selection_data->list, file); - } + nautilus_file_ref (file); + selection_data->list = g_list_prepend (selection_data->list, file); + } } static GList * nautilus_list_view_get_selection_for_file_transfer (NautilusFilesView *view) { - struct SelectionForeachData selection_data; + struct SelectionForeachData selection_data; - selection_data.list = NULL; - selection_data.selection = gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view); + selection_data.list = NULL; + selection_data.selection = gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view); - gtk_tree_selection_selected_foreach (selection_data.selection, - nautilus_list_view_get_selection_for_file_transfer_foreach_func, &selection_data); + gtk_tree_selection_selected_foreach (selection_data.selection, + nautilus_list_view_get_selection_for_file_transfer_foreach_func, &selection_data); - return g_list_reverse (selection_data.list); + return g_list_reverse (selection_data.list); } static gboolean nautilus_list_view_is_empty (NautilusFilesView *view) { - return nautilus_list_model_is_empty (NAUTILUS_LIST_VIEW (view)->details->model); + return nautilus_list_model_is_empty (NAUTILUS_LIST_VIEW (view)->details->model); } static void nautilus_list_view_end_file_changes (NautilusFilesView *view) { - NautilusListView *list_view; - - list_view = NAUTILUS_LIST_VIEW (view); - - if (list_view->details->new_selection_path) { - gtk_tree_view_set_cursor (list_view->details->tree_view, - list_view->details->new_selection_path, - NULL, FALSE); - gtk_tree_path_free (list_view->details->new_selection_path); - list_view->details->new_selection_path = NULL; - } -} - -static void -nautilus_list_view_remove_file (NautilusFilesView *view, NautilusFile *file, NautilusDirectory *directory) -{ - GtkTreePath *path; - GtkTreePath *file_path; - GtkTreeIter iter; - GtkTreeIter temp_iter; - GtkTreeRowReference* row_reference; - NautilusListView *list_view; - GtkTreeModel* tree_model; - GtkTreeSelection *selection; - - path = NULL; - row_reference = NULL; - list_view = NAUTILUS_LIST_VIEW (view); - tree_model = GTK_TREE_MODEL(list_view->details->model); - - if (nautilus_list_model_get_tree_iter_from_file (list_view->details->model, file, directory, &iter)) { - selection = gtk_tree_view_get_selection (list_view->details->tree_view); - file_path = gtk_tree_model_get_path (tree_model, &iter); - - if (gtk_tree_selection_path_is_selected (selection, file_path)) { - /* get reference for next element in the list view. If the element to be deleted is the - * last one, get reference to previous element. If there is only one element in view - * no need to select anything. - */ - temp_iter = iter; - - if (gtk_tree_model_iter_next (tree_model, &iter)) { - path = gtk_tree_model_get_path (tree_model, &iter); - row_reference = gtk_tree_row_reference_new (tree_model, path); - } else { - path = gtk_tree_model_get_path (tree_model, &temp_iter); - if (gtk_tree_path_prev (path)) { - row_reference = gtk_tree_row_reference_new (tree_model, path); - } - } - gtk_tree_path_free (path); - } - - gtk_tree_path_free (file_path); - - nautilus_list_model_remove_file (list_view->details->model, file, directory); - - if (gtk_tree_row_reference_valid (row_reference)) { - if (list_view->details->new_selection_path) { - gtk_tree_path_free (list_view->details->new_selection_path); - } - list_view->details->new_selection_path = gtk_tree_row_reference_get_path (row_reference); - } - - if (row_reference) { - gtk_tree_row_reference_free (row_reference); - } - } - - -} - -static void -nautilus_list_view_set_selection (NautilusFilesView *view, GList *selection) -{ - NautilusListView *list_view; - GtkTreeSelection *tree_selection; - GList *node; - GList *iters, *l; - NautilusFile *file; - - list_view = NAUTILUS_LIST_VIEW (view); - tree_selection = gtk_tree_view_get_selection (list_view->details->tree_view); - - g_signal_handlers_block_by_func (tree_selection, list_selection_changed_callback, view); - - gtk_tree_selection_unselect_all (tree_selection); - for (node = selection; node != NULL; node = node->next) { - file = node->data; - iters = nautilus_list_model_get_all_iters_for_file (list_view->details->model, file); - - for (l = iters; l != NULL; l = l->next) { - gtk_tree_selection_select_iter (tree_selection, - (GtkTreeIter *)l->data); - } - g_list_free_full (iters, g_free); - } - - g_signal_handlers_unblock_by_func (tree_selection, list_selection_changed_callback, view); - nautilus_files_view_notify_selection_changed (view); + NautilusListView *list_view; + + list_view = NAUTILUS_LIST_VIEW (view); + + if (list_view->details->new_selection_path) + { + gtk_tree_view_set_cursor (list_view->details->tree_view, + list_view->details->new_selection_path, + NULL, FALSE); + gtk_tree_path_free (list_view->details->new_selection_path); + list_view->details->new_selection_path = NULL; + } +} + +static void +nautilus_list_view_remove_file (NautilusFilesView *view, + NautilusFile *file, + NautilusDirectory *directory) +{ + GtkTreePath *path; + GtkTreePath *file_path; + GtkTreeIter iter; + GtkTreeIter temp_iter; + GtkTreeRowReference *row_reference; + NautilusListView *list_view; + GtkTreeModel *tree_model; + GtkTreeSelection *selection; + + path = NULL; + row_reference = NULL; + list_view = NAUTILUS_LIST_VIEW (view); + tree_model = GTK_TREE_MODEL (list_view->details->model); + + if (nautilus_list_model_get_tree_iter_from_file (list_view->details->model, file, directory, &iter)) + { + selection = gtk_tree_view_get_selection (list_view->details->tree_view); + file_path = gtk_tree_model_get_path (tree_model, &iter); + + if (gtk_tree_selection_path_is_selected (selection, file_path)) + { + /* get reference for next element in the list view. If the element to be deleted is the + * last one, get reference to previous element. If there is only one element in view + * no need to select anything. + */ + temp_iter = iter; + + if (gtk_tree_model_iter_next (tree_model, &iter)) + { + path = gtk_tree_model_get_path (tree_model, &iter); + row_reference = gtk_tree_row_reference_new (tree_model, path); + } + else + { + path = gtk_tree_model_get_path (tree_model, &temp_iter); + if (gtk_tree_path_prev (path)) + { + row_reference = gtk_tree_row_reference_new (tree_model, path); + } + } + gtk_tree_path_free (path); + } + + gtk_tree_path_free (file_path); + + nautilus_list_model_remove_file (list_view->details->model, file, directory); + + if (gtk_tree_row_reference_valid (row_reference)) + { + if (list_view->details->new_selection_path) + { + gtk_tree_path_free (list_view->details->new_selection_path); + } + list_view->details->new_selection_path = gtk_tree_row_reference_get_path (row_reference); + } + + if (row_reference) + { + gtk_tree_row_reference_free (row_reference); + } + } +} + +static void +nautilus_list_view_set_selection (NautilusFilesView *view, + GList *selection) +{ + NautilusListView *list_view; + GtkTreeSelection *tree_selection; + GList *node; + GList *iters, *l; + NautilusFile *file; + + list_view = NAUTILUS_LIST_VIEW (view); + tree_selection = gtk_tree_view_get_selection (list_view->details->tree_view); + + g_signal_handlers_block_by_func (tree_selection, list_selection_changed_callback, view); + + gtk_tree_selection_unselect_all (tree_selection); + for (node = selection; node != NULL; node = node->next) + { + file = node->data; + iters = nautilus_list_model_get_all_iters_for_file (list_view->details->model, file); + + for (l = iters; l != NULL; l = l->next) + { + gtk_tree_selection_select_iter (tree_selection, + (GtkTreeIter *) l->data); + } + g_list_free_full (iters, g_free); + } + + g_signal_handlers_unblock_by_func (tree_selection, list_selection_changed_callback, view); + nautilus_files_view_notify_selection_changed (view); } static void nautilus_list_view_invert_selection (NautilusFilesView *view) { - NautilusListView *list_view; - GtkTreeSelection *tree_selection; - GList *node; - GList *iters, *l; - NautilusFile *file; - GList *selection = NULL; - - list_view = NAUTILUS_LIST_VIEW (view); - tree_selection = gtk_tree_view_get_selection (list_view->details->tree_view); + NautilusListView *list_view; + GtkTreeSelection *tree_selection; + GList *node; + GList *iters, *l; + NautilusFile *file; + GList *selection = NULL; + + list_view = NAUTILUS_LIST_VIEW (view); + tree_selection = gtk_tree_view_get_selection (list_view->details->tree_view); + + g_signal_handlers_block_by_func (tree_selection, list_selection_changed_callback, view); - g_signal_handlers_block_by_func (tree_selection, list_selection_changed_callback, view); - - gtk_tree_selection_selected_foreach (tree_selection, - nautilus_list_view_get_selection_foreach_func, &selection); + gtk_tree_selection_selected_foreach (tree_selection, + nautilus_list_view_get_selection_foreach_func, &selection); - gtk_tree_selection_select_all (tree_selection); - - for (node = selection; node != NULL; node = node->next) { - file = node->data; - iters = nautilus_list_model_get_all_iters_for_file (list_view->details->model, file); + gtk_tree_selection_select_all (tree_selection); - for (l = iters; l != NULL; l = l->next) { - gtk_tree_selection_unselect_iter (tree_selection, - (GtkTreeIter *)l->data); - } - g_list_free_full (iters, g_free); - } + for (node = selection; node != NULL; node = node->next) + { + file = node->data; + iters = nautilus_list_model_get_all_iters_for_file (list_view->details->model, file); - g_list_free (selection); + for (l = iters; l != NULL; l = l->next) + { + gtk_tree_selection_unselect_iter (tree_selection, + (GtkTreeIter *) l->data); + } + g_list_free_full (iters, g_free); + } + + g_list_free (selection); - g_signal_handlers_unblock_by_func (tree_selection, list_selection_changed_callback, view); - nautilus_files_view_notify_selection_changed (view); + g_signal_handlers_unblock_by_func (tree_selection, list_selection_changed_callback, view); + nautilus_files_view_notify_selection_changed (view); } static void nautilus_list_view_select_all (NautilusFilesView *view) { - gtk_tree_selection_select_all (gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view)); + gtk_tree_selection_select_all (gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view)); } static void nautilus_list_view_select_first (NautilusFilesView *view) { - GtkTreeSelection *selection; - GtkTreeIter iter; + GtkTreeSelection *selection; + GtkTreeIter iter; - if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (NAUTILUS_LIST_VIEW (view)->details->model), &iter)) { - return; - } - selection = gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view); - gtk_tree_selection_unselect_all (selection); - gtk_tree_selection_select_iter (selection, &iter); + if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (NAUTILUS_LIST_VIEW (view)->details->model), &iter)) + { + return; + } + selection = gtk_tree_view_get_selection (NAUTILUS_LIST_VIEW (view)->details->tree_view); + gtk_tree_selection_unselect_all (selection); + gtk_tree_selection_select_iter (selection, &iter); } static void nautilus_list_view_zoom_to_level (NautilusFilesView *view, - gint zoom_level) + gint zoom_level) { - NautilusListView *list_view; + NautilusListView *list_view; - g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); + g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); - list_view = NAUTILUS_LIST_VIEW (view); + list_view = NAUTILUS_LIST_VIEW (view); - if (list_view->details->zoom_level == zoom_level) { - return; - } + if (list_view->details->zoom_level == zoom_level) + { + return; + } - nautilus_list_view_set_zoom_level (list_view, zoom_level); - g_action_group_change_action_state (nautilus_files_view_get_action_group (view), - "zoom-to-level", g_variant_new_int32 (zoom_level)); + nautilus_list_view_set_zoom_level (list_view, zoom_level); + g_action_group_change_action_state (nautilus_files_view_get_action_group (view), + "zoom-to-level", g_variant_new_int32 (zoom_level)); - nautilus_files_view_update_toolbar_menus (view); + nautilus_files_view_update_toolbar_menus (view); } static void action_zoom_to_level (GSimpleAction *action, - GVariant *state, - gpointer user_data) + GVariant *state, + gpointer user_data) { - NautilusFilesView *view; - NautilusListZoomLevel zoom_level; + NautilusFilesView *view; + NautilusListZoomLevel zoom_level; - g_assert (NAUTILUS_IS_FILES_VIEW (user_data)); + g_assert (NAUTILUS_IS_FILES_VIEW (user_data)); - view = NAUTILUS_FILES_VIEW (user_data); - zoom_level = g_variant_get_int32 (state); - nautilus_list_view_zoom_to_level (view, zoom_level); + view = NAUTILUS_FILES_VIEW (user_data); + zoom_level = g_variant_get_int32 (state); + nautilus_list_view_zoom_to_level (view, zoom_level); - g_simple_action_set_state (G_SIMPLE_ACTION (action), state); - if (g_settings_get_enum (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_ZOOM_LEVEL) != zoom_level) { - g_settings_set_enum (nautilus_list_view_preferences, - NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_ZOOM_LEVEL, - zoom_level); - } + g_simple_action_set_state (G_SIMPLE_ACTION (action), state); + if (g_settings_get_enum (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_ZOOM_LEVEL) != zoom_level) + { + g_settings_set_enum (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_ZOOM_LEVEL, + zoom_level); + } } static void -column_editor_response_callback (GtkWidget *dialog, - int response_id, - gpointer user_data) +column_editor_response_callback (GtkWidget *dialog, + int response_id, + gpointer user_data) { - gtk_widget_destroy (GTK_WIDGET (dialog)); + gtk_widget_destroy (GTK_WIDGET (dialog)); } static void column_chooser_changed_callback (NautilusColumnChooser *chooser, - NautilusListView *view) + NautilusListView *view) { - NautilusFile *file; - char **visible_columns; - char **column_order; - GList *list; - int i; + NautilusFile *file; + char **visible_columns; + char **column_order; + GList *list; + int i; - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view)); + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view)); - nautilus_column_chooser_get_settings (chooser, - &visible_columns, - &column_order); + nautilus_column_chooser_get_settings (chooser, + &visible_columns, + &column_order); - list = NULL; - for (i = 0; visible_columns[i] != NULL; ++i) { - list = g_list_prepend (list, visible_columns[i]); - } - list = g_list_reverse (list); - nautilus_file_set_metadata_list (file, - NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, - list); - g_list_free (list); + list = NULL; + for (i = 0; visible_columns[i] != NULL; ++i) + { + list = g_list_prepend (list, visible_columns[i]); + } + list = g_list_reverse (list); + nautilus_file_set_metadata_list (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, + list); + g_list_free (list); - list = NULL; - for (i = 0; column_order[i] != NULL; ++i) { - list = g_list_prepend (list, column_order[i]); - } - list = g_list_reverse (list); - nautilus_file_set_metadata_list (file, - NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, - list); - g_list_free (list); + list = NULL; + for (i = 0; column_order[i] != NULL; ++i) + { + list = g_list_prepend (list, column_order[i]); + } + list = g_list_reverse (list); + nautilus_file_set_metadata_list (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, + list); + g_list_free (list); - apply_columns_settings (view, column_order, visible_columns); + apply_columns_settings (view, column_order, visible_columns); - g_strfreev (visible_columns); - g_strfreev (column_order); + g_strfreev (visible_columns); + g_strfreev (column_order); } static void -column_chooser_set_from_arrays (NautilusColumnChooser *chooser, - NautilusListView *view, - char **visible_columns, - char **column_order) +column_chooser_set_from_arrays (NautilusColumnChooser *chooser, + NautilusListView *view, + char **visible_columns, + char **column_order) { - g_signal_handlers_block_by_func - (chooser, G_CALLBACK (column_chooser_changed_callback), view); + g_signal_handlers_block_by_func + (chooser, G_CALLBACK (column_chooser_changed_callback), view); - nautilus_column_chooser_set_settings (chooser, - visible_columns, - column_order); + nautilus_column_chooser_set_settings (chooser, + visible_columns, + column_order); - g_signal_handlers_unblock_by_func - (chooser, G_CALLBACK (column_chooser_changed_callback), view); + g_signal_handlers_unblock_by_func + (chooser, G_CALLBACK (column_chooser_changed_callback), view); } static void column_chooser_set_from_settings (NautilusColumnChooser *chooser, - NautilusListView *view) + NautilusListView *view) { - char **visible_columns; - char **column_order; + char **visible_columns; + char **column_order; - visible_columns = get_visible_columns (view); - column_order = get_column_order (view); + visible_columns = get_visible_columns (view); + column_order = get_column_order (view); - column_chooser_set_from_arrays (chooser, view, - visible_columns, column_order); + column_chooser_set_from_arrays (chooser, view, + visible_columns, column_order); - g_strfreev (visible_columns); - g_strfreev (column_order); + g_strfreev (visible_columns); + g_strfreev (column_order); } static void column_chooser_use_default_callback (NautilusColumnChooser *chooser, - NautilusListView *view) + NautilusListView *view) { - NautilusFile *file; - char **default_columns; - char **default_order; + NautilusFile *file; + char **default_columns; + char **default_order; - file = nautilus_files_view_get_directory_as_file - (NAUTILUS_FILES_VIEW (view)); + file = nautilus_files_view_get_directory_as_file + (NAUTILUS_FILES_VIEW (view)); - nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NULL); - nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NULL); + nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, NULL); + nautilus_file_set_metadata_list (file, NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, NULL); - /* set view values ourselves, as new metadata could not have been - * updated yet. - */ - default_columns = get_default_visible_columns (view); - default_order = get_default_column_order (view); + /* set view values ourselves, as new metadata could not have been + * updated yet. + */ + default_columns = get_default_visible_columns (view); + default_order = get_default_column_order (view); - apply_columns_settings (view, default_order, default_columns); - column_chooser_set_from_arrays (chooser, view, - default_columns, default_order); + apply_columns_settings (view, default_order, default_columns); + column_chooser_set_from_arrays (chooser, view, + default_columns, default_order); - g_strfreev (default_columns); - g_strfreev (default_order); + g_strfreev (default_columns); + g_strfreev (default_order); } static GtkWidget * create_column_editor (NautilusListView *view) { - GtkWidget *window; - GtkWidget *label; - GtkWidget *box; - GtkWidget *column_chooser; - NautilusFile *file; - char *str; - char *name; - const char *label_text; - - file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view)); - name = nautilus_file_get_display_name (file); - str = g_strdup_printf (_("%s Visible Columns"), name); - g_free (name); - - window = gtk_dialog_new_with_buttons (str, - GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))), - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_USE_HEADER_BAR, - NULL, NULL); - g_free (str); - g_signal_connect (window, "response", - G_CALLBACK (column_editor_response_callback), NULL); - - gtk_window_set_default_size (GTK_WINDOW (window), 300, 400); - - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - gtk_container_set_border_width (GTK_CONTAINER (box), 12); - gtk_widget_set_hexpand (box, TRUE); - gtk_widget_show (box); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window))), box, - TRUE, TRUE, 0); - - label_text = _("Choose the order of information to appear in this folder:"); - str = g_strconcat ("<b>", label_text, "</b>", NULL); - label = gtk_label_new (NULL); - gtk_label_set_markup (GTK_LABEL (label), str); - gtk_label_set_line_wrap (GTK_LABEL (label), FALSE); - gtk_label_set_xalign (GTK_LABEL (label), 0); - gtk_label_set_yalign (GTK_LABEL (label), 0); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); - - g_free (str); - - column_chooser = nautilus_column_chooser_new (file); - gtk_widget_set_margin_start (column_chooser, 12); - gtk_widget_show (column_chooser); - gtk_box_pack_start (GTK_BOX (box), column_chooser, TRUE, TRUE, 0); - - g_signal_connect (column_chooser, "changed", - G_CALLBACK (column_chooser_changed_callback), - view); - g_signal_connect (column_chooser, "use-default", - G_CALLBACK (column_chooser_use_default_callback), - view); - - column_chooser_set_from_settings - (NAUTILUS_COLUMN_CHOOSER (column_chooser), view); - - return window; + GtkWidget *window; + GtkWidget *label; + GtkWidget *box; + GtkWidget *column_chooser; + NautilusFile *file; + char *str; + char *name; + const char *label_text; + + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view)); + name = nautilus_file_get_display_name (file); + str = g_strdup_printf (_("%s Visible Columns"), name); + g_free (name); + + window = gtk_dialog_new_with_buttons (str, + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_USE_HEADER_BAR, + NULL, NULL); + g_free (str); + g_signal_connect (window, "response", + G_CALLBACK (column_editor_response_callback), NULL); + + gtk_window_set_default_size (GTK_WINDOW (window), 300, 400); + + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (box), 12); + gtk_widget_set_hexpand (box, TRUE); + gtk_widget_show (box); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window))), box, + TRUE, TRUE, 0); + + label_text = _("Choose the order of information to appear in this folder:"); + str = g_strconcat ("<b>", label_text, "</b>", NULL); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), str); + gtk_label_set_line_wrap (GTK_LABEL (label), FALSE); + gtk_label_set_xalign (GTK_LABEL (label), 0); + gtk_label_set_yalign (GTK_LABEL (label), 0); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); + + g_free (str); + + column_chooser = nautilus_column_chooser_new (file); + gtk_widget_set_margin_start (column_chooser, 12); + gtk_widget_show (column_chooser); + gtk_box_pack_start (GTK_BOX (box), column_chooser, TRUE, TRUE, 0); + + g_signal_connect (column_chooser, "changed", + G_CALLBACK (column_chooser_changed_callback), + view); + g_signal_connect (column_chooser, "use-default", + G_CALLBACK (column_chooser_use_default_callback), + view); + + column_chooser_set_from_settings + (NAUTILUS_COLUMN_CHOOSER (column_chooser), view); + + return window; } static void action_visible_columns (GSimpleAction *action, - GVariant *state, - gpointer user_data) -{ - NautilusListView *list_view; - - list_view = NAUTILUS_LIST_VIEW (user_data); - - if (list_view->details->column_editor) { - gtk_window_present (GTK_WINDOW (list_view->details->column_editor)); - } else { - list_view->details->column_editor = create_column_editor (list_view); - g_object_add_weak_pointer (G_OBJECT (list_view->details->column_editor), - (gpointer *) &list_view->details->column_editor); - - gtk_widget_show (list_view->details->column_editor); - } -} - -const GActionEntry list_view_entries[] = { - { "visible-columns", action_visible_columns }, - { "zoom-to-level", NULL, NULL, "1", action_zoom_to_level } + GVariant *state, + gpointer user_data) +{ + NautilusListView *list_view; + + list_view = NAUTILUS_LIST_VIEW (user_data); + + if (list_view->details->column_editor) + { + gtk_window_present (GTK_WINDOW (list_view->details->column_editor)); + } + else + { + list_view->details->column_editor = create_column_editor (list_view); + g_object_add_weak_pointer (G_OBJECT (list_view->details->column_editor), + (gpointer *) &list_view->details->column_editor); + + gtk_widget_show (list_view->details->column_editor); + } +} + +const GActionEntry list_view_entries[] = +{ + { "visible-columns", action_visible_columns }, + { "zoom-to-level", NULL, NULL, "1", action_zoom_to_level } }; static void -nautilus_list_view_set_zoom_level (NautilusListView *view, - NautilusListZoomLevel new_level) +nautilus_list_view_set_zoom_level (NautilusListView *view, + NautilusListZoomLevel new_level) { - int column; + int column; - g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); - g_return_if_fail (new_level >= NAUTILUS_LIST_ZOOM_LEVEL_SMALL && - new_level <= NAUTILUS_LIST_ZOOM_LEVEL_LARGER); + g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); + g_return_if_fail (new_level >= NAUTILUS_LIST_ZOOM_LEVEL_SMALL && + new_level <= NAUTILUS_LIST_ZOOM_LEVEL_LARGER); - if (view->details->zoom_level == new_level) { - return; - } + if (view->details->zoom_level == new_level) + { + return; + } - view->details->zoom_level = new_level; + view->details->zoom_level = new_level; - /* Select correctly scaled icons. */ - column = nautilus_list_model_get_column_id_from_zoom_level (new_level); - gtk_tree_view_column_set_attributes (view->details->file_name_column, - GTK_CELL_RENDERER (view->details->pixbuf_cell), - "surface", column, - NULL); - set_up_pixbuf_size (view); + /* Select correctly scaled icons. */ + column = nautilus_list_model_get_column_id_from_zoom_level (new_level); + gtk_tree_view_column_set_attributes (view->details->file_name_column, + GTK_CELL_RENDERER (view->details->pixbuf_cell), + "surface", column, + NULL); + set_up_pixbuf_size (view); } static void -nautilus_list_view_bump_zoom_level (NautilusFilesView *view, int zoom_increment) +nautilus_list_view_bump_zoom_level (NautilusFilesView *view, + int zoom_increment) { - NautilusListView *list_view; - gint new_level; + NautilusListView *list_view; + gint new_level; - g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); + g_return_if_fail (NAUTILUS_IS_LIST_VIEW (view)); - list_view = NAUTILUS_LIST_VIEW (view); - new_level = list_view->details->zoom_level + zoom_increment; + list_view = NAUTILUS_LIST_VIEW (view); + new_level = list_view->details->zoom_level + zoom_increment; - if (new_level >= NAUTILUS_LIST_ZOOM_LEVEL_SMALL && - new_level <= NAUTILUS_LIST_ZOOM_LEVEL_LARGER) { - nautilus_list_view_zoom_to_level (view, new_level); - } + if (new_level >= NAUTILUS_LIST_ZOOM_LEVEL_SMALL && + new_level <= NAUTILUS_LIST_ZOOM_LEVEL_LARGER) + { + nautilus_list_view_zoom_to_level (view, new_level); + } } static void nautilus_list_view_restore_standard_zoom_level (NautilusFilesView *view) { - nautilus_list_view_zoom_to_level (view, NAUTILUS_LIST_ZOOM_LEVEL_STANDARD); + nautilus_list_view_zoom_to_level (view, NAUTILUS_LIST_ZOOM_LEVEL_STANDARD); } -static gboolean -nautilus_list_view_can_zoom_in (NautilusFilesView *view) +static gboolean +nautilus_list_view_can_zoom_in (NautilusFilesView *view) { - g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), FALSE); + g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), FALSE); - return NAUTILUS_LIST_VIEW (view)->details->zoom_level < NAUTILUS_LIST_ZOOM_LEVEL_LARGER; + return NAUTILUS_LIST_VIEW (view)->details->zoom_level < NAUTILUS_LIST_ZOOM_LEVEL_LARGER; } -static gboolean -nautilus_list_view_can_zoom_out (NautilusFilesView *view) +static gboolean +nautilus_list_view_can_zoom_out (NautilusFilesView *view) { - g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), FALSE); + g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), FALSE); - return NAUTILUS_LIST_VIEW (view)->details->zoom_level > NAUTILUS_LIST_ZOOM_LEVEL_SMALL; + return NAUTILUS_LIST_VIEW (view)->details->zoom_level > NAUTILUS_LIST_ZOOM_LEVEL_SMALL; } static gfloat nautilus_list_view_get_zoom_level_percentage (NautilusFilesView *view) { - NautilusListView *list_view; - guint icon_size; + NautilusListView *list_view; + guint icon_size; - g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), 1.0); + g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), 1.0); - list_view = NAUTILUS_LIST_VIEW (view); - icon_size = nautilus_list_model_get_icon_size_for_zoom_level (list_view->details->zoom_level); + list_view = NAUTILUS_LIST_VIEW (view); + icon_size = nautilus_list_model_get_icon_size_for_zoom_level (list_view->details->zoom_level); - return (gfloat) icon_size / NAUTILUS_LIST_ICON_SIZE_STANDARD; + return (gfloat) icon_size / NAUTILUS_LIST_ICON_SIZE_STANDARD; } static void nautilus_list_view_click_policy_changed (NautilusFilesView *directory_view) { - GdkWindow *win; - GdkDisplay *display; - NautilusListView *view; - GtkTreeIter iter; - GtkTreeView *tree; - - view = NAUTILUS_LIST_VIEW (directory_view); - display = gtk_widget_get_display (GTK_WIDGET (view)); - - /* ensure that we unset the hand cursor and refresh underlined rows */ - if (get_click_policy () == NAUTILUS_CLICK_POLICY_DOUBLE) { - if (view->details->hover_path != NULL) { - if (gtk_tree_model_get_iter (GTK_TREE_MODEL (view->details->model), - &iter, view->details->hover_path)) { - gtk_tree_model_row_changed (GTK_TREE_MODEL (view->details->model), - view->details->hover_path, &iter); - } - - gtk_tree_path_free (view->details->hover_path); - view->details->hover_path = NULL; - } + GdkWindow *win; + GdkDisplay *display; + NautilusListView *view; + GtkTreeIter iter; + GtkTreeView *tree; + + view = NAUTILUS_LIST_VIEW (directory_view); + display = gtk_widget_get_display (GTK_WIDGET (view)); + + /* ensure that we unset the hand cursor and refresh underlined rows */ + if (get_click_policy () == NAUTILUS_CLICK_POLICY_DOUBLE) + { + if (view->details->hover_path != NULL) + { + if (gtk_tree_model_get_iter (GTK_TREE_MODEL (view->details->model), + &iter, view->details->hover_path)) + { + gtk_tree_model_row_changed (GTK_TREE_MODEL (view->details->model), + view->details->hover_path, &iter); + } + + gtk_tree_path_free (view->details->hover_path); + view->details->hover_path = NULL; + } - tree = view->details->tree_view; - if (gtk_widget_get_realized (GTK_WIDGET (tree))) { - win = gtk_widget_get_window (GTK_WIDGET (tree)); - gdk_window_set_cursor (win, NULL); + tree = view->details->tree_view; + if (gtk_widget_get_realized (GTK_WIDGET (tree))) + { + win = gtk_widget_get_window (GTK_WIDGET (tree)); + gdk_window_set_cursor (win, NULL); - if (display != NULL) { - gdk_display_flush (display); - } - } + if (display != NULL) + { + gdk_display_flush (display); + } + } - g_clear_object (&hand_cursor); - } else if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) { - if (hand_cursor == NULL) { - hand_cursor = gdk_cursor_new_for_display (display, GDK_HAND2); - } - } + g_clear_object (&hand_cursor); + } + else if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE) + { + if (hand_cursor == NULL) + { + hand_cursor = gdk_cursor_new_for_display (display, GDK_HAND2); + } + } } static void default_sort_order_changed_callback (gpointer callback_data) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (callback_data); + list_view = NAUTILUS_LIST_VIEW (callback_data); - set_sort_order_from_metadata_and_preferences (list_view); + set_sort_order_from_metadata_and_preferences (list_view); } static void default_visible_columns_changed_callback (gpointer callback_data) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (callback_data); + list_view = NAUTILUS_LIST_VIEW (callback_data); - set_columns_settings_from_metadata_and_preferences (list_view); + set_columns_settings_from_metadata_and_preferences (list_view); } static void default_column_order_changed_callback (gpointer callback_data) { - NautilusListView *list_view; - - list_view = NAUTILUS_LIST_VIEW (callback_data); + NautilusListView *list_view; + + list_view = NAUTILUS_LIST_VIEW (callback_data); - set_columns_settings_from_metadata_and_preferences (list_view); + set_columns_settings_from_metadata_and_preferences (list_view); } static void nautilus_list_view_sort_directories_first_changed (NautilusFilesView *view) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (view); + list_view = NAUTILUS_LIST_VIEW (view); - nautilus_list_model_set_should_sort_directories_first (list_view->details->model, - nautilus_files_view_should_sort_directories_first (view)); + nautilus_list_model_set_should_sort_directories_first (list_view->details->model, + nautilus_files_view_should_sort_directories_first (view)); } static int -nautilus_list_view_compare_files (NautilusFilesView *view, NautilusFile *file1, NautilusFile *file2) +nautilus_list_view_compare_files (NautilusFilesView *view, + NautilusFile *file1, + NautilusFile *file2) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (view); - return nautilus_list_model_compare_func (list_view->details->model, file1, file2); + list_view = NAUTILUS_LIST_VIEW (view); + return nautilus_list_model_compare_func (list_view->details->model, file1, file2); } static gboolean nautilus_list_view_using_manual_layout (NautilusFilesView *view) { - g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), FALSE); + g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), FALSE); - return FALSE; + return FALSE; } static void nautilus_list_view_dispose (GObject *object) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (object); + list_view = NAUTILUS_LIST_VIEW (object); - if (list_view->details->model) { - g_object_unref (list_view->details->model); - list_view->details->model = NULL; - } + if (list_view->details->model) + { + g_object_unref (list_view->details->model); + list_view->details->model = NULL; + } - if (list_view->details->drag_dest) { - g_object_unref (list_view->details->drag_dest); - list_view->details->drag_dest = NULL; - } + if (list_view->details->drag_dest) + { + g_object_unref (list_view->details->drag_dest); + list_view->details->drag_dest = NULL; + } - if (list_view->details->clipboard_handler_id != 0) { - g_signal_handler_disconnect (nautilus_clipboard_monitor_get (), - list_view->details->clipboard_handler_id); - list_view->details->clipboard_handler_id = 0; - } + if (list_view->details->clipboard_handler_id != 0) + { + g_signal_handler_disconnect (nautilus_clipboard_monitor_get (), + list_view->details->clipboard_handler_id); + list_view->details->clipboard_handler_id = 0; + } - G_OBJECT_CLASS (nautilus_list_view_parent_class)->dispose (object); + G_OBJECT_CLASS (nautilus_list_view_parent_class)->dispose (object); } static void nautilus_list_view_finalize (GObject *object) { - NautilusListView *list_view; + NautilusListView *list_view; - list_view = NAUTILUS_LIST_VIEW (object); + list_view = NAUTILUS_LIST_VIEW (object); - g_free (list_view->details->original_name); - list_view->details->original_name = NULL; - - if (list_view->details->double_click_path[0]) { - gtk_tree_path_free (list_view->details->double_click_path[0]); - } - if (list_view->details->double_click_path[1]) { - gtk_tree_path_free (list_view->details->double_click_path[1]); - } - if (list_view->details->new_selection_path) { - gtk_tree_path_free (list_view->details->new_selection_path); - } - - g_list_free (list_view->details->cells); - g_hash_table_destroy (list_view->details->columns); + g_free (list_view->details->original_name); + list_view->details->original_name = NULL; - if (list_view->details->hover_path != NULL) { - gtk_tree_path_free (list_view->details->hover_path); - } + if (list_view->details->double_click_path[0]) + { + gtk_tree_path_free (list_view->details->double_click_path[0]); + } + if (list_view->details->double_click_path[1]) + { + gtk_tree_path_free (list_view->details->double_click_path[1]); + } + if (list_view->details->new_selection_path) + { + gtk_tree_path_free (list_view->details->new_selection_path); + } - if (list_view->details->column_editor != NULL) { - gtk_widget_destroy (list_view->details->column_editor); - } + g_list_free (list_view->details->cells); + g_hash_table_destroy (list_view->details->columns); - g_clear_object (&list_view->details->icon); + if (list_view->details->hover_path != NULL) + { + gtk_tree_path_free (list_view->details->hover_path); + } - g_free (list_view->details); + if (list_view->details->column_editor != NULL) + { + gtk_widget_destroy (list_view->details->column_editor); + } - g_signal_handlers_disconnect_by_func (nautilus_preferences, - default_sort_order_changed_callback, - list_view); - g_signal_handlers_disconnect_by_func (nautilus_list_view_preferences, - default_visible_columns_changed_callback, - list_view); - g_signal_handlers_disconnect_by_func (nautilus_list_view_preferences, - default_column_order_changed_callback, - list_view); + g_clear_object (&list_view->details->icon); - G_OBJECT_CLASS (nautilus_list_view_parent_class)->finalize (object); + g_free (list_view->details); + + g_signal_handlers_disconnect_by_func (nautilus_preferences, + default_sort_order_changed_callback, + list_view); + g_signal_handlers_disconnect_by_func (nautilus_list_view_preferences, + default_visible_columns_changed_callback, + list_view); + g_signal_handlers_disconnect_by_func (nautilus_list_view_preferences, + default_column_order_changed_callback, + list_view); + + G_OBJECT_CLASS (nautilus_list_view_parent_class)->finalize (object); } static char * nautilus_list_view_get_first_visible_file (NautilusFilesView *view) { - NautilusFile *file; - GtkTreePath *path; - GtkTreeIter iter; - NautilusListView *list_view; - - list_view = NAUTILUS_LIST_VIEW (view); - - if (gtk_tree_view_get_path_at_pos (list_view->details->tree_view, - 0, 0, - &path, NULL, NULL, NULL)) { - gtk_tree_model_get_iter (GTK_TREE_MODEL (list_view->details->model), - &iter, path); - - gtk_tree_path_free (path); - - gtk_tree_model_get (GTK_TREE_MODEL (list_view->details->model), - &iter, - NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, - -1); - if (file) { - char *uri; - - uri = nautilus_file_get_uri (file); - - nautilus_file_unref (file); - - return uri; - } - } - - return NULL; + NautilusFile *file; + GtkTreePath *path; + GtkTreeIter iter; + NautilusListView *list_view; + + list_view = NAUTILUS_LIST_VIEW (view); + + if (gtk_tree_view_get_path_at_pos (list_view->details->tree_view, + 0, 0, + &path, NULL, NULL, NULL)) + { + gtk_tree_model_get_iter (GTK_TREE_MODEL (list_view->details->model), + &iter, path); + + gtk_tree_path_free (path); + + gtk_tree_model_get (GTK_TREE_MODEL (list_view->details->model), + &iter, + NAUTILUS_LIST_MODEL_FILE_COLUMN, &file, + -1); + if (file) + { + char *uri; + + uri = nautilus_file_get_uri (file); + + nautilus_file_unref (file); + + return uri; + } + } + + return NULL; } static void nautilus_list_view_scroll_to_file (NautilusListView *view, - NautilusFile *file) + NautilusFile *file) { - GtkTreePath *path; - GtkTreeIter iter; - - if (!nautilus_list_model_get_first_iter_for_file (view->details->model, file, &iter)) { - return; - } - - path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->details->model), &iter); + GtkTreePath *path; + GtkTreeIter iter; + + if (!nautilus_list_model_get_first_iter_for_file (view->details->model, file, &iter)) + { + return; + } - gtk_tree_view_scroll_to_cell (view->details->tree_view, - path, NULL, - TRUE, 0.0, 0.0); - - gtk_tree_path_free (path); + path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->details->model), &iter); + + gtk_tree_view_scroll_to_cell (view->details->tree_view, + path, NULL, + TRUE, 0.0, 0.0); + + gtk_tree_path_free (path); } static void list_view_scroll_to_file (NautilusFilesView *view, - const char *uri) -{ - NautilusFile *file; - - if (uri != NULL) { - /* Only if existing, since we don't want to add the file to - the directory if it has been removed since then */ - file = nautilus_file_get_existing_by_uri (uri); - if (file != NULL) { - nautilus_list_view_scroll_to_file (NAUTILUS_LIST_VIEW (view), file); - nautilus_file_unref (file); - } - } + const char *uri) +{ + NautilusFile *file; + + if (uri != NULL) + { + /* Only if existing, since we don't want to add the file to + * the directory if it has been removed since then */ + file = nautilus_file_get_existing_by_uri (uri); + if (file != NULL) + { + nautilus_list_view_scroll_to_file (NAUTILUS_LIST_VIEW (view), file); + nautilus_file_unref (file); + } + } } static void list_view_notify_clipboard_info (NautilusClipboardMonitor *monitor, - NautilusClipboardInfo *info, - NautilusListView *view) + NautilusClipboardInfo *info, + NautilusListView *view) { - /* this could be called as a result of _end_loading() being - * called after _dispose(), where the model is cleared. - */ - if (view->details->model == NULL) { - return; - } + /* this could be called as a result of _end_loading() being + * called after _dispose(), where the model is cleared. + */ + if (view->details->model == NULL) + { + return; + } - if (info != NULL && info->cut) { - nautilus_list_model_set_highlight_for_files (view->details->model, info->files); - } else { - nautilus_list_model_set_highlight_for_files (view->details->model, NULL); - } + if (info != NULL && info->cut) + { + nautilus_list_model_set_highlight_for_files (view->details->model, info->files); + } + else + { + nautilus_list_model_set_highlight_for_files (view->details->model, NULL); + } } static void nautilus_list_view_end_loading (NautilusFilesView *view, - gboolean all_files_seen) + gboolean all_files_seen) { - NautilusClipboardMonitor *monitor; - NautilusClipboardInfo *info; + NautilusClipboardMonitor *monitor; + NautilusClipboardInfo *info; - monitor = nautilus_clipboard_monitor_get (); - info = nautilus_clipboard_monitor_get_clipboard_info (monitor); + monitor = nautilus_clipboard_monitor_get (); + info = nautilus_clipboard_monitor_get_clipboard_info (monitor); - list_view_notify_clipboard_info (monitor, info, NAUTILUS_LIST_VIEW (view)); + list_view_notify_clipboard_info (monitor, info, NAUTILUS_LIST_VIEW (view)); } static guint nautilus_list_view_get_id (NautilusFilesView *view) { - return NAUTILUS_VIEW_LIST_ID; + return NAUTILUS_VIEW_LIST_ID; } -static GdkRectangle* +static GdkRectangle * nautilus_list_view_compute_rename_popover_pointing_to (NautilusFilesView *view) { - GtkTreeSelection *selection; - GtkTreePath *path; - GdkRectangle *rect; - GtkTreeModel *model; - GtkTreeView *tree_view; - GList *list; - NautilusListView *list_view; - - rect = g_malloc0 (sizeof(GdkRectangle)); - list_view = NAUTILUS_LIST_VIEW (view); - tree_view = list_view->details->tree_view; - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list_view->details->tree_view)); - model = GTK_TREE_MODEL (list_view->details->model); - list = gtk_tree_selection_get_selected_rows (selection, &model); - path = list->data; - gtk_tree_view_get_cell_area (tree_view, path, NULL, rect); - gtk_tree_view_convert_bin_window_to_widget_coords (tree_view, - rect->x, rect->y, - &rect->x, &rect->y); - - if (list_view->details->last_event_button_x > 0) { - rect->x = list_view->details->last_event_button_x; - } else { - rect->x = CLAMP (gtk_tree_view_column_get_width (list_view->details->file_name_column) * 0.5 - - RENAME_POPOVER_RELATIVE_TO_RECTANGLE_WIDTH * 0.5, - 0, - gtk_tree_view_column_get_width (list_view->details->file_name_column) - - RENAME_POPOVER_RELATIVE_TO_RECTANGLE_WIDTH); - } - rect->width = RENAME_POPOVER_RELATIVE_TO_RECTANGLE_WIDTH; - - g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free); - - return rect; -} - -static GIcon* + GtkTreeSelection *selection; + GtkTreePath *path; + GdkRectangle *rect; + GtkTreeModel *model; + GtkTreeView *tree_view; + GList *list; + NautilusListView *list_view; + + rect = g_malloc0 (sizeof (GdkRectangle)); + list_view = NAUTILUS_LIST_VIEW (view); + tree_view = list_view->details->tree_view; + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list_view->details->tree_view)); + model = GTK_TREE_MODEL (list_view->details->model); + list = gtk_tree_selection_get_selected_rows (selection, &model); + path = list->data; + gtk_tree_view_get_cell_area (tree_view, path, NULL, rect); + gtk_tree_view_convert_bin_window_to_widget_coords (tree_view, + rect->x, rect->y, + &rect->x, &rect->y); + + if (list_view->details->last_event_button_x > 0) + { + rect->x = list_view->details->last_event_button_x; + } + else + { + rect->x = CLAMP (gtk_tree_view_column_get_width (list_view->details->file_name_column) * 0.5 - + RENAME_POPOVER_RELATIVE_TO_RECTANGLE_WIDTH * 0.5, + 0, + gtk_tree_view_column_get_width (list_view->details->file_name_column) - + RENAME_POPOVER_RELATIVE_TO_RECTANGLE_WIDTH); + } + rect->width = RENAME_POPOVER_RELATIVE_TO_RECTANGLE_WIDTH; + + g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free); + + return rect; +} + +static GIcon * nautilus_list_view_get_icon (NautilusFilesView *view) { - g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), NULL); + g_return_val_if_fail (NAUTILUS_IS_LIST_VIEW (view), NULL); - return NAUTILUS_LIST_VIEW (view)->details->icon; + return NAUTILUS_LIST_VIEW (view)->details->icon; } static void nautilus_list_view_class_init (NautilusListViewClass *class) { - NautilusFilesViewClass *nautilus_files_view_class; - - nautilus_files_view_class = NAUTILUS_FILES_VIEW_CLASS (class); - - G_OBJECT_CLASS (class)->dispose = nautilus_list_view_dispose; - G_OBJECT_CLASS (class)->finalize = nautilus_list_view_finalize; - - nautilus_files_view_class->add_file = nautilus_list_view_add_file; - nautilus_files_view_class->begin_loading = nautilus_list_view_begin_loading; - nautilus_files_view_class->end_loading = nautilus_list_view_end_loading; - nautilus_files_view_class->bump_zoom_level = nautilus_list_view_bump_zoom_level; - nautilus_files_view_class->can_zoom_in = nautilus_list_view_can_zoom_in; - nautilus_files_view_class->can_zoom_out = nautilus_list_view_can_zoom_out; - nautilus_files_view_class->get_zoom_level_percentage = nautilus_list_view_get_zoom_level_percentage; - nautilus_files_view_class->click_policy_changed = nautilus_list_view_click_policy_changed; - nautilus_files_view_class->clear = nautilus_list_view_clear; - nautilus_files_view_class->file_changed = nautilus_list_view_file_changed; - nautilus_files_view_class->get_backing_uri = nautilus_list_view_get_backing_uri; - nautilus_files_view_class->get_selection = nautilus_list_view_get_selection; - nautilus_files_view_class->get_selection_for_file_transfer = nautilus_list_view_get_selection_for_file_transfer; - nautilus_files_view_class->is_empty = nautilus_list_view_is_empty; - nautilus_files_view_class->remove_file = nautilus_list_view_remove_file; - nautilus_files_view_class->restore_standard_zoom_level = nautilus_list_view_restore_standard_zoom_level; - nautilus_files_view_class->reveal_selection = nautilus_list_view_reveal_selection; - nautilus_files_view_class->select_all = nautilus_list_view_select_all; - nautilus_files_view_class->select_first = nautilus_list_view_select_first; - nautilus_files_view_class->set_selection = nautilus_list_view_set_selection; - nautilus_files_view_class->invert_selection = nautilus_list_view_invert_selection; - nautilus_files_view_class->compare_files = nautilus_list_view_compare_files; - nautilus_files_view_class->sort_directories_first_changed = nautilus_list_view_sort_directories_first_changed; - nautilus_files_view_class->end_file_changes = nautilus_list_view_end_file_changes; - nautilus_files_view_class->using_manual_layout = nautilus_list_view_using_manual_layout; - nautilus_files_view_class->get_view_id = nautilus_list_view_get_id; - nautilus_files_view_class->get_first_visible_file = nautilus_list_view_get_first_visible_file; - nautilus_files_view_class->scroll_to_file = list_view_scroll_to_file; - nautilus_files_view_class->compute_rename_popover_pointing_to = nautilus_list_view_compute_rename_popover_pointing_to; - nautilus_files_view_class->get_icon = nautilus_list_view_get_icon; + NautilusFilesViewClass *nautilus_files_view_class; + + nautilus_files_view_class = NAUTILUS_FILES_VIEW_CLASS (class); + + G_OBJECT_CLASS (class)->dispose = nautilus_list_view_dispose; + G_OBJECT_CLASS (class)->finalize = nautilus_list_view_finalize; + + nautilus_files_view_class->add_file = nautilus_list_view_add_file; + nautilus_files_view_class->begin_loading = nautilus_list_view_begin_loading; + nautilus_files_view_class->end_loading = nautilus_list_view_end_loading; + nautilus_files_view_class->bump_zoom_level = nautilus_list_view_bump_zoom_level; + nautilus_files_view_class->can_zoom_in = nautilus_list_view_can_zoom_in; + nautilus_files_view_class->can_zoom_out = nautilus_list_view_can_zoom_out; + nautilus_files_view_class->get_zoom_level_percentage = nautilus_list_view_get_zoom_level_percentage; + nautilus_files_view_class->click_policy_changed = nautilus_list_view_click_policy_changed; + nautilus_files_view_class->clear = nautilus_list_view_clear; + nautilus_files_view_class->file_changed = nautilus_list_view_file_changed; + nautilus_files_view_class->get_backing_uri = nautilus_list_view_get_backing_uri; + nautilus_files_view_class->get_selection = nautilus_list_view_get_selection; + nautilus_files_view_class->get_selection_for_file_transfer = nautilus_list_view_get_selection_for_file_transfer; + nautilus_files_view_class->is_empty = nautilus_list_view_is_empty; + nautilus_files_view_class->remove_file = nautilus_list_view_remove_file; + nautilus_files_view_class->restore_standard_zoom_level = nautilus_list_view_restore_standard_zoom_level; + nautilus_files_view_class->reveal_selection = nautilus_list_view_reveal_selection; + nautilus_files_view_class->select_all = nautilus_list_view_select_all; + nautilus_files_view_class->select_first = nautilus_list_view_select_first; + nautilus_files_view_class->set_selection = nautilus_list_view_set_selection; + nautilus_files_view_class->invert_selection = nautilus_list_view_invert_selection; + nautilus_files_view_class->compare_files = nautilus_list_view_compare_files; + nautilus_files_view_class->sort_directories_first_changed = nautilus_list_view_sort_directories_first_changed; + nautilus_files_view_class->end_file_changes = nautilus_list_view_end_file_changes; + nautilus_files_view_class->using_manual_layout = nautilus_list_view_using_manual_layout; + nautilus_files_view_class->get_view_id = nautilus_list_view_get_id; + nautilus_files_view_class->get_first_visible_file = nautilus_list_view_get_first_visible_file; + nautilus_files_view_class->scroll_to_file = list_view_scroll_to_file; + nautilus_files_view_class->compute_rename_popover_pointing_to = nautilus_list_view_compute_rename_popover_pointing_to; + nautilus_files_view_class->get_icon = nautilus_list_view_get_icon; } static void nautilus_list_view_init (NautilusListView *list_view) { - GActionGroup *view_action_group; - list_view->details = g_new0 (NautilusListViewDetails, 1); - - list_view->details->icon = g_themed_icon_new ("view-list-symbolic"); - - /* ensure that the zoom level is always set before settings up the tree view columns */ - list_view->details->zoom_level = get_default_zoom_level (); - - create_and_set_up_tree_view (list_view); - - gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (list_view)), - "nautilus-list-view"); - - g_signal_connect_swapped (nautilus_preferences, - "changed::" NAUTILUS_PREFERENCES_DEFAULT_SORT_ORDER, - G_CALLBACK (default_sort_order_changed_callback), - list_view); - g_signal_connect_swapped (nautilus_preferences, - "changed::" NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER, - G_CALLBACK (default_sort_order_changed_callback), - list_view); - g_signal_connect_swapped (nautilus_list_view_preferences, - "changed::" NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS, - G_CALLBACK (default_visible_columns_changed_callback), - list_view); - g_signal_connect_swapped (nautilus_list_view_preferences, - "changed::" NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER, - G_CALLBACK (default_column_order_changed_callback), - list_view); - - nautilus_list_view_click_policy_changed (NAUTILUS_FILES_VIEW (list_view)); - - nautilus_list_view_sort_directories_first_changed (NAUTILUS_FILES_VIEW (list_view)); - nautilus_list_view_set_zoom_level (list_view, get_default_zoom_level ()); - - list_view->details->hover_path = NULL; - list_view->details->clipboard_handler_id = - g_signal_connect (nautilus_clipboard_monitor_get (), - "clipboard-info", - G_CALLBACK (list_view_notify_clipboard_info), list_view); - - view_action_group = nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (list_view)); - g_action_map_add_action_entries (G_ACTION_MAP (view_action_group), - list_view_entries, - G_N_ELEMENTS (list_view_entries), - list_view); - /* Keep the action synced with the actual value, so the toolbar can poll it */ - g_action_group_change_action_state (nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (list_view)), - "zoom-to-level", g_variant_new_int32 (get_default_zoom_level ())); + GActionGroup *view_action_group; + list_view->details = g_new0 (NautilusListViewDetails, 1); + + list_view->details->icon = g_themed_icon_new ("view-list-symbolic"); + + /* ensure that the zoom level is always set before settings up the tree view columns */ + list_view->details->zoom_level = get_default_zoom_level (); + + create_and_set_up_tree_view (list_view); + + gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (list_view)), + "nautilus-list-view"); + + g_signal_connect_swapped (nautilus_preferences, + "changed::" NAUTILUS_PREFERENCES_DEFAULT_SORT_ORDER, + G_CALLBACK (default_sort_order_changed_callback), + list_view); + g_signal_connect_swapped (nautilus_preferences, + "changed::" NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER, + G_CALLBACK (default_sort_order_changed_callback), + list_view); + g_signal_connect_swapped (nautilus_list_view_preferences, + "changed::" NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS, + G_CALLBACK (default_visible_columns_changed_callback), + list_view); + g_signal_connect_swapped (nautilus_list_view_preferences, + "changed::" NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER, + G_CALLBACK (default_column_order_changed_callback), + list_view); + + nautilus_list_view_click_policy_changed (NAUTILUS_FILES_VIEW (list_view)); + + nautilus_list_view_sort_directories_first_changed (NAUTILUS_FILES_VIEW (list_view)); + nautilus_list_view_set_zoom_level (list_view, get_default_zoom_level ()); + + list_view->details->hover_path = NULL; + list_view->details->clipboard_handler_id = + g_signal_connect (nautilus_clipboard_monitor_get (), + "clipboard-info", + G_CALLBACK (list_view_notify_clipboard_info), list_view); + + view_action_group = nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (list_view)); + g_action_map_add_action_entries (G_ACTION_MAP (view_action_group), + list_view_entries, + G_N_ELEMENTS (list_view_entries), + list_view); + /* Keep the action synced with the actual value, so the toolbar can poll it */ + g_action_group_change_action_state (nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (list_view)), + "zoom-to-level", g_variant_new_int32 (get_default_zoom_level ())); } NautilusFilesView * nautilus_list_view_new (NautilusWindowSlot *slot) { - return g_object_new (NAUTILUS_TYPE_LIST_VIEW, - "window-slot", slot, - NULL); + return g_object_new (NAUTILUS_TYPE_LIST_VIEW, + "window-slot", slot, + NULL); } |