static void gb_project_tree_actions_open_with_editor (GSimpleAction *action, GVariant *variant, gpointer user_data) { GbWorkbench *workbench; GbProjectTree *self = user_data; GFileInfo *file_info; GFile *file; GbTreeNode *selected; GObject *item; g_assert (GB_IS_PROJECT_TREE (self)); if (!(selected = gb_tree_get_selected (GB_TREE (self))) || !(item = gb_tree_node_get_item (selected)) || !GB_IS_PROJECT_FILE (item) || !(file_info = gb_project_file_get_file_info (GB_PROJECT_FILE (item))) || (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY) || !(file = gb_project_file_get_file (GB_PROJECT_FILE (item))) || !(workbench = gb_widget_get_workbench (GTK_WIDGET (self)))) return; gb_workbench_open_with_editor (workbench, file); }
static void gb_project_tree_builder_node_popup (IdeTreeBuilder *builder, IdeTreeNode *node, GMenu *menu) { GObject *item; IdeVcs *vcs; GFile *workdir; GFile *file; g_assert (GB_IS_PROJECT_TREE_BUILDER (builder)); g_assert (IDE_IS_TREE_NODE (node)); g_assert (G_IS_MENU (menu)); item = ide_tree_node_get_item (node); vcs = get_vcs (node); workdir = ide_vcs_get_working_directory (vcs); if (GB_IS_PROJECT_FILE (item) && (file = gb_project_file_get_file (GB_PROJECT_FILE (item))) && !g_file_equal (file, workdir)) { GMenu *mime_section; mime_section = ide_application_get_menu_by_id (IDE_APPLICATION_DEFAULT, "gb-project-tree-open-by-mime-section"); populate_mime_handlers (mime_section, GB_PROJECT_FILE (item)); } }
static gint compare_nodes_func (IdeTreeNode *a, IdeTreeNode *b, gpointer user_data) { GbProjectFile *file_a = GB_PROJECT_FILE (ide_tree_node_get_item (a)); GbProjectFile *file_b = GB_PROJECT_FILE (ide_tree_node_get_item (b)); GbProjectTreeBuilder *self = user_data; if (self->sort_directories_first) return gb_project_file_compare_directories_first (file_a, file_b); else return gb_project_file_compare (file_a, file_b); }
static gboolean find_child_node (IdeTree *tree, IdeTreeNode *node, IdeTreeNode *child, gpointer user_data) { const gchar *name = user_data; GObject *item; g_assert (IDE_IS_TREE (tree)); g_assert (IDE_IS_TREE_NODE (node)); g_assert (IDE_IS_TREE_NODE (child)); item = ide_tree_node_get_item (child); if (GB_IS_PROJECT_FILE (item)) { const gchar *item_name; item_name = gb_project_file_get_display_name (GB_PROJECT_FILE (item)); return ide_str_equal0 (item_name, name); } return FALSE; }
static void gb_project_tree_vcs_changed (GbProjectTree *self, IdeVcs *vcs) { g_autoptr(GFile) file = NULL; IdeTreeNode *node; GObject *item; g_assert (GB_IS_PROJECT_TREE (self)); g_assert (IDE_IS_VCS (vcs)); if (NULL != (node = ide_tree_get_selected (IDE_TREE (self))) && NULL != (item = ide_tree_node_get_item (node)) && GB_IS_PROJECT_FILE (item)) { if (NULL != (file = gb_project_file_get_file (GB_PROJECT_FILE (item)))) g_object_ref (file); } ide_tree_rebuild (IDE_TREE (self)); if (file != NULL) gb_project_tree_reveal (self, file); }
static gboolean project_file_is_directory (GObject *object) { g_assert (!object || G_IS_OBJECT (object)); return (GB_IS_PROJECT_FILE (object) && gb_project_file_get_is_directory (GB_PROJECT_FILE (object))); }
static gboolean gb_project_tree_builder_node_activated (IdeTreeBuilder *builder, IdeTreeNode *node) { GObject *item; g_assert (GB_IS_PROJECT_TREE_BUILDER (builder)); item = ide_tree_node_get_item (node); if (GB_IS_PROJECT_FILE (item)) { GtkWidget *workbench; IdeTree *tree; GFile *file; if (gb_project_file_get_is_directory (GB_PROJECT_FILE (item))) goto failure; file = gb_project_file_get_file (GB_PROJECT_FILE (item)); if (!file) goto failure; tree = ide_tree_node_get_tree (node); if (!tree) goto failure; workbench = gtk_widget_get_ancestor (GTK_WIDGET (tree), IDE_TYPE_WORKBENCH); ide_workbench_open_files_async (IDE_WORKBENCH (workbench), &file, 1, NULL, IDE_WORKBENCH_OPEN_FLAGS_NONE, NULL, NULL, NULL); return TRUE; } failure: return FALSE; }
static void gb_project_tree_actions_open (GSimpleAction *action, GVariant *variant, gpointer user_data) { GbProjectTree *self = user_data; IdeWorkbench *workbench; IdeTreeNode *selected; GObject *item; g_assert (GB_IS_PROJECT_TREE (self)); workbench = ide_widget_get_workbench (GTK_WIDGET (self)); g_assert (IDE_IS_WORKBENCH (workbench)); if (!(selected = ide_tree_get_selected (IDE_TREE (self))) || !(item = ide_tree_node_get_item (selected))) return; item = ide_tree_node_get_item (selected); if (GB_IS_PROJECT_FILE (item)) { GFileInfo *file_info; GFile *file; file_info = gb_project_file_get_file_info (GB_PROJECT_FILE (item)); if (!file_info) return; if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY) return; file = gb_project_file_get_file (GB_PROJECT_FILE (item)); if (!file) return; ide_workbench_open_files_async (workbench, &file, 1, NULL, NULL, NULL, NULL); } }
static void gb_project_tree_actions_open_with (GSimpleAction *action, GVariant *variant, gpointer user_data) { g_autoptr(GDesktopAppInfo) app_info = NULL; g_autoptr(GdkAppLaunchContext) launch_context = NULL; GbProjectTree *self = user_data; GbTreeNode *selected; GbWorkbench *workbench; GdkDisplay *display; GFileInfo *file_info; GFile *file; const gchar *app_id; GObject *item; GList *files; g_assert (GB_IS_PROJECT_TREE (self)); g_assert (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)); if (!(workbench = gb_widget_get_workbench (GTK_WIDGET (self))) || !(selected = gb_tree_get_selected (GB_TREE (self))) || !(item = gb_tree_node_get_item (selected)) || !GB_IS_PROJECT_FILE (item) || !(app_id = g_variant_get_string (variant, NULL)) || !(file_info = gb_project_file_get_file_info (GB_PROJECT_FILE (item))) || !(file = gb_project_file_get_file (GB_PROJECT_FILE (item))) || !(app_info = g_desktop_app_info_new (app_id))) return; display = gtk_widget_get_display (GTK_WIDGET (self)); launch_context = gdk_display_get_app_launch_context (display); files = g_list_append (NULL, file); g_app_info_launch (G_APP_INFO (app_info), files, G_APP_LAUNCH_CONTEXT (launch_context), NULL); g_list_free (files); }
static void gb_project_tree_actions_open_containing_folder (GSimpleAction *action, GVariant *variant, gpointer user_data) { GbProjectTree *self = user_data; GbTreeNode *selected; GObject *item; GFile *file; g_assert (GB_IS_PROJECT_TREE (self)); if (!(selected = gb_tree_get_selected (GB_TREE (self))) || !(item = gb_tree_node_get_item (selected)) || !GB_IS_PROJECT_FILE (item)) return; file = gb_project_file_get_file (GB_PROJECT_FILE (item)); gb_file_manager_show (file, NULL); }
static gboolean compare_to_file (gconstpointer a, gconstpointer b) { GFile *file = (GFile *)a; GObject *item = (GObject *)b; /* * Our key (the GFile) is always @a. * The potential match (maybe a GbProjectFile) is @b. * @b may also be NULL. */ g_assert (G_IS_FILE (file)); g_assert (!item || G_IS_OBJECT (item)); if (GB_IS_PROJECT_FILE (item)) return g_file_equal (file, gb_project_file_get_file (GB_PROJECT_FILE (item))); return FALSE; }
static void build_file (GbProjectTreeBuilder *self, IdeTreeNode *node) { g_autoptr(GFileEnumerator) enumerator = NULL; GbProjectFile *project_file; gpointer file_info_ptr; IdeVcs *vcs; GFile *file; IdeTree *tree; gint count = 0; gboolean show_ignored_files; g_return_if_fail (GB_IS_PROJECT_TREE_BUILDER (self)); g_return_if_fail (IDE_IS_TREE_NODE (node)); project_file = GB_PROJECT_FILE (ide_tree_node_get_item (node)); tree = ide_tree_builder_get_tree (IDE_TREE_BUILDER (self)); show_ignored_files = gb_project_tree_get_show_ignored_files (GB_PROJECT_TREE (tree)); vcs = get_vcs (node); /* * TODO: Make this all async. */ if (!gb_project_file_get_is_directory (project_file)) return; file = gb_project_file_get_file (project_file); enumerator = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME"," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, NULL, NULL); if (enumerator == NULL) return; while ((file_info_ptr = g_file_enumerator_next_file (enumerator, NULL, NULL))) { g_autoptr(GFileInfo) item_file_info = file_info_ptr; g_autoptr(GFile) item_file = NULL; g_autoptr(GbProjectFile) item = NULL; IdeTreeNode *child; const gchar *name; const gchar *display_name; const gchar *icon_name; gboolean ignored; name = g_file_info_get_name (item_file_info); item_file = g_file_get_child (file, name); ignored = ide_vcs_is_ignored (vcs, item_file, NULL); if (ignored && !show_ignored_files) continue; item = gb_project_file_new (item_file, item_file_info); display_name = gb_project_file_get_display_name (item); icon_name = gb_project_file_get_icon_name (item); child = g_object_new (IDE_TYPE_TREE_NODE, "icon-name", icon_name, "text", display_name, "item", item, "use-dim-label", ignored, NULL); ide_tree_node_insert_sorted (node, child, compare_nodes_func, self); if (g_file_info_get_file_type (item_file_info) == G_FILE_TYPE_DIRECTORY) ide_tree_node_set_children_possible (child, TRUE); count++; } /* * If we didn't add any children to this node, insert an empty node to * notify the user that nothing was found. */ if (count == 0) { IdeTreeNode *child; child = g_object_new (IDE_TYPE_TREE_NODE, "icon-name", NULL, "text", _("Empty"), "use-dim-label", TRUE, NULL); ide_tree_node_append (node, child); } }