static gboolean file_view_key_press_event (GtkWidget* widget, GdkEventKey* event) { if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter) { AnjutaFileView* view = ANJUTA_FILE_VIEW (widget); AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeIter selected; GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); if (gtk_tree_selection_get_selected (selection, NULL, &selected)) { GFile* file; GtkTreeIter select_iter; GtkTreeModel* sort_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(sort_model), &select_iter, &selected); file = file_model_get_file (priv->model, &select_iter); if (file != NULL) { g_signal_emit_by_name (G_OBJECT (view), "file-open", file); g_object_unref (file); } } } return GTK_WIDGET_CLASS (file_view_parent_class)->key_press_event (widget, event); }
static gboolean file_view_query_tooltip (GtkWidget* widget, gint x, gint y, gboolean keyboard, GtkTooltip* tooltip) { AnjutaFileView* view = ANJUTA_FILE_VIEW (widget); AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeModel* model_sort; GtkTreeModel* file_model = GTK_TREE_MODEL (priv->model); GtkTreePath* path; GtkTreeIter iter; GtkTreeIter real_iter; gchar* filename; gboolean result = TRUE; GdkRectangle visible_rect, column_rect; GdkScreen *screen = gdk_screen_get_default (); PangoContext *context; PangoLayout *layout; gint width, height; if (!gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (view), &x, &y, keyboard, &model_sort, &path, &iter)) return FALSE; gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (model_sort), &real_iter, &iter); filename = file_model_get_filename (FILE_MODEL (file_model), &real_iter); context = gdk_pango_context_get_for_screen (screen); layout = pango_layout_new (context); pango_layout_set_text (layout, filename, -1); pango_layout_get_pixel_size (layout, &width, &height); gtk_tree_view_get_visible_rect (GTK_TREE_VIEW (view), &visible_rect); gtk_tree_view_get_cell_area (GTK_TREE_VIEW (view), path, gtk_tree_view_get_column (GTK_TREE_VIEW (view), 0), &column_rect); if (column_rect.x + width > visible_rect.x + visible_rect.width || column_rect.x < visible_rect.x) { gtk_tooltip_set_text (tooltip, filename); gtk_tree_view_set_tooltip_row (GTK_TREE_VIEW (view), tooltip, path); } else { result = FALSE; } g_free (filename); gtk_tree_path_free (path); g_object_unref (layout); g_object_unref (context); return result; }
static void file_view_init (AnjutaFileView *object) { GtkCellRenderer* renderer_pixbuf; GtkCellRenderer* renderer_display; GtkTreeViewColumn* column; GtkTreeSelection* selection; GtkTreeModel* sort_model; AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (object); priv->current_selection = NULL; priv->model = file_model_new (GTK_TREE_VIEW(object), NULL); g_signal_connect_object (priv->model, "directory-expanded", G_CALLBACK (file_view_directory_expanded), object, 0); sort_model = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(priv->model)); gtk_tree_view_set_model (GTK_TREE_VIEW(object), sort_model); /* set_model takes a reference so we can release the reference we got when * the sort_model was created. */ g_object_unref (sort_model); gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE(sort_model), file_view_sort_model, NULL, NULL); renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); renderer_display = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Filename")); gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); gtk_tree_view_column_pack_start (column, renderer_display, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer_pixbuf, file_view_render_pixbuf_with_emblem, object, NULL); gtk_tree_view_column_set_attributes (column, renderer_display, "markup", COLUMN_DISPLAY, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (object), column); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (object)); g_signal_connect (selection, "changed", G_CALLBACK (file_view_selection_changed), object); /* DND */ gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW(object), GDK_BUTTON1_MASK, uri_targets, 1, GDK_ACTION_MOVE); /* Typeahead search */ gtk_tree_view_set_search_column (GTK_TREE_VIEW (object), COLUMN_FILENAME); }
static void file_view_finalize (GObject *object) { AnjutaFileViewPrivate *priv = ANJUTA_FILE_VIEW_GET_PRIVATE (object); g_object_unref (priv->model); G_OBJECT_CLASS (file_view_parent_class)->finalize (object); }
static void file_view_selection_changed (GtkTreeSelection* selection, AnjutaFileView* view) { AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeModel* file_model = GTK_TREE_MODEL(priv->model); GtkTreeIter selected; GtkTreeModel* model = gtk_tree_view_get_model (GTK_TREE_VIEW(view)); if (priv->current_selection) { GtkTreeIter iter; GtkTreePath* path = gtk_tree_row_reference_get_path (priv->current_selection); if (path && gtk_tree_model_get_iter (file_model, &iter, path)) { gchar* filename; gtk_tree_model_get (file_model, &iter, COLUMN_FILENAME, &filename, -1); gtk_tree_store_set (GTK_TREE_STORE (file_model), &iter, COLUMN_DISPLAY, filename, -1); g_free(filename); gtk_tree_path_free(path); } gtk_tree_row_reference_free(priv->current_selection); priv->current_selection = NULL; } if (gtk_tree_selection_get_selected (selection, &model, &selected)) { GtkTreeIter real_selection; GtkTreePath* path; GFile* file; gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(model), &real_selection, &selected); path = gtk_tree_model_get_path(file_model, &real_selection); priv->current_selection = gtk_tree_row_reference_new (file_model, path); gtk_tree_path_free(path); file_view_show_extended_data (view, &real_selection); file = file_model_get_file(FILE_MODEL(file_model), &real_selection); g_signal_emit_by_name (G_OBJECT (view), "current-file-changed", file, NULL); g_object_unref (file); } else { g_signal_emit_by_name (G_OBJECT (view), "current-file-changed", NULL, NULL); } /* The pending selection is now either done or if the user changed the * selection before it was finished we cancel it. */ g_clear_object (&priv->pending_selected_file); DEBUG_PRINT ("%s", "selection_changed"); }
static void file_view_show_extended_data (AnjutaFileView* view, GtkTreeIter* iter) { AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeModel* file_model = GTK_TREE_MODEL (priv->model); gboolean is_dummy, is_dir; GFile* file; GFileInfo* file_info; time_t time; gchar* display; gchar time_str[128]; AnjutaVcsStatus status; gtk_tree_model_get (file_model, iter, COLUMN_DUMMY, &is_dummy, COLUMN_IS_DIR, &is_dir, -1); if (is_dummy || is_dir) return; gtk_tree_model_get (file_model, iter, COLUMN_FILE, &file, COLUMN_STATUS, &status, -1); file_info = g_file_query_info (file, "standard::*,time::changed", G_FILE_QUERY_INFO_NONE, NULL, NULL); g_object_unref (file); if (!file_info) return; time = g_file_info_get_attribute_uint64(file_info, "time::changed"); strftime(time_str, 127, "%x %X", localtime(&time)); if (get_status_string(status)) { display = g_markup_printf_escaped("%s\n" "<small><tt>%s</tt></small>\n" "<small>%s</small>", g_file_info_get_display_name(file_info), time_str, get_status_string(status)); } else { display = g_markup_printf_escaped("%s\n" "<small><tt>%s</tt></small>", g_file_info_get_display_name(file_info), time_str); } gtk_tree_store_set (GTK_TREE_STORE(file_model), iter, COLUMN_DISPLAY, display, -1); g_object_unref (file_info); g_free(display); }
void file_view_refresh (AnjutaFileView* view) { AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreePath* tree_path; file_model_refresh (priv->model); tree_path = gtk_tree_path_new_first (); gtk_tree_view_expand_row (GTK_TREE_VIEW (view), tree_path, FALSE); gtk_tree_path_free (tree_path); }
static void file_view_init (AnjutaFileView *object) { GtkCellRenderer* renderer_pixbuf; GtkCellRenderer* renderer_display; GtkTreeViewColumn* column; GtkTreeSelection* selection; GtkTreeModel* sort_model; AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (object); priv->current_selection = NULL; priv->model = file_model_new (GTK_TREE_VIEW(object), NULL); sort_model = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(priv->model)); gtk_tree_view_set_model (GTK_TREE_VIEW(object), sort_model); gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE(sort_model), file_view_sort_model, NULL, NULL); renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); renderer_display = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Filename")); gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); gtk_tree_view_column_pack_start (column, renderer_display, FALSE); gtk_tree_view_column_set_attributes (column, renderer_pixbuf, "pixbuf", COLUMN_PIXBUF, NULL); gtk_tree_view_column_set_attributes (column, renderer_display, "markup", COLUMN_DISPLAY, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (object), column); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (object)); g_signal_connect (selection, "changed", G_CALLBACK (file_view_selection_changed), object); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (object), FALSE); g_object_set (object, "has-tooltip", TRUE, NULL); /* DND */ gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW(object), GDK_BUTTON1_MASK, uri_targets, 1, GDK_ACTION_MOVE); }
static void file_view_row_activated (GtkTreeView* widget, GtkTreePath* sort_path, GtkTreeViewColumn* column) { AnjutaFileView* view = ANJUTA_FILE_VIEW (widget); AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeIter selected; GtkTreePath* path = NULL; gboolean is_dir; GFile* file; GtkTreeIter select_iter; GtkTreeModel* sort_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_tree_model_get_iter (sort_model, &selected, sort_path); gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(sort_model), &select_iter, &selected); gtk_tree_model_get (GTK_TREE_MODEL(priv->model), &select_iter, COLUMN_IS_DIR, &is_dir, -1); file = file_model_get_file (priv->model, &select_iter); path = gtk_tree_model_get_path(sort_model, &selected); if (is_dir) { if (!gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), path)) { gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, FALSE); } else { gtk_tree_view_collapse_row (GTK_TREE_VIEW (view), path); } } else { g_signal_emit_by_name (G_OBJECT (view), "file-open", file); } if (file) g_object_unref (file); if (path) gtk_tree_path_free(path); }
void file_view_set_selected (AnjutaFileView* view, GFile *selected) { AnjutaFileViewPrivate *priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeIter iter; gboolean valid; g_clear_object (&priv->pending_selected_file); priv->pending_selected_file = g_object_ref (selected); valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->model), &iter); if (valid) file_view_select_from_iter (view, iter); }
static void file_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { AnjutaFileViewPrivate *priv = ANJUTA_FILE_VIEW_GET_PRIVATE (object); switch (prop_id) { case PROP_BASE_PATH: g_object_set_property (G_OBJECT (priv->model), "base-path", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void file_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { AnjutaFileViewPrivate *priv = ANJUTA_FILE_VIEW_GET_PRIVATE (object); gchar* uri; switch (prop_id) { case PROP_BASE_URI: g_object_get (G_OBJECT(priv->model), "base_uri", &uri, NULL); g_value_set_string (value, uri); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void file_view_directory_expanded (FileModel* model, GtkTreeIter* iter, GtkTreePath* path, gpointer user_data) { AnjutaFileView* view = user_data; AnjutaFileViewPrivate *priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); if (priv->pending_selected_file) { GFile *dir; gtk_tree_model_get (GTK_TREE_MODEL (priv->model), iter, COLUMN_FILE, &dir, -1); if (g_file_has_prefix (priv->pending_selected_file, dir)) file_view_select_from_iter (view, *iter); g_object_unref (dir); } }
static void file_view_do_popup_menu (GtkWidget* widget, GdkEventButton* event) { AnjutaFileView* view = ANJUTA_FILE_VIEW (widget); AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); GFile* file = NULL; gboolean is_dir = FALSE; GtkTreeIter selected; gint button, event_time; if (gtk_tree_selection_get_selected (selection, NULL, &selected)) { GtkTreeIter select_iter; GtkTreeModel* sort_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(sort_model), &select_iter, &selected); gtk_tree_model_get (GTK_TREE_MODEL(priv->model), &select_iter, COLUMN_IS_DIR, &is_dir, -1); file = file_model_get_file (priv->model, &select_iter); } if (event) { button = event->button; event_time = event->time; } else { button = 0; event_time = gtk_get_current_event_time (); } g_signal_emit_by_name (G_OBJECT(widget), "show-popup-menu", file, is_dir, button, event_time); if (file) g_object_unref (file); }
GFile* file_view_get_selected (AnjutaFileView* view) { AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); GtkTreeIter selected; if (gtk_tree_selection_get_selected (selection, NULL, &selected)) { GFile* file; GtkTreeIter real_iter; GtkTreeModel* sort_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view)); gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(sort_model), &real_iter, &selected); file = file_model_get_file (priv->model, &real_iter); return file; } else return NULL; }
void file_view_refresh_vcs (AnjutaFileView* view) { AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); file_model_update_vcs_status(priv->model); }
static void file_view_select_from_iter (AnjutaFileView* view, GtkTreeIter iter) { AnjutaFileViewPrivate* priv = ANJUTA_FILE_VIEW_GET_PRIVATE (view); GtkTreeModelSort* model_sort; gboolean valid; GtkTreeIter sort_iter; GFile* file; model_sort = GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (GTK_TREE_VIEW (view))); do { gboolean is_dummy, is_dir; gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter, COLUMN_FILE, &file, COLUMN_DUMMY, &is_dummy, COLUMN_IS_DIR, &is_dir, -1); if (is_dummy) break; if (g_file_equal (priv->pending_selected_file, file)) { file_view_select_iter (view, iter); break; } else if (g_file_has_prefix (priv->pending_selected_file, file)) { if (is_dir) { GtkTreePath *path = NULL; gtk_tree_model_sort_convert_child_iter_to_iter (model_sort, &sort_iter, &iter); path = gtk_tree_model_get_path (GTK_TREE_MODEL (model_sort), &sort_iter); if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), path)) { GtkTreeIter parent = iter; valid = gtk_tree_model_iter_children (GTK_TREE_MODEL (priv->model), &iter, &parent); gtk_tree_path_free (path); } else { gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, FALSE); gtk_tree_path_free (path); break; } } else { file_view_select_iter (view, iter); break; } } else valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->model), &iter); g_clear_object (&file); } while (valid); if (file) g_object_unref (file); }