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 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_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_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 void gb_project_tree_builder_build_node (IdeTreeBuilder *builder, IdeTreeNode *node) { GbProjectTreeBuilder *self = (GbProjectTreeBuilder *)builder; GObject *item; g_return_if_fail (GB_IS_PROJECT_TREE_BUILDER (self)); item = ide_tree_node_get_item (node); if (IDE_IS_CONTEXT (item)) build_context (self, node); else if (GB_IS_PROJECT_FILE (item)) build_file (self, node); }
static gboolean find_files_node (IdeTree *tree, IdeTreeNode *node, IdeTreeNode *child, gpointer 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); return GB_IS_PROJECT_FILE (item); }
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 populate_mime_handlers (GMenu *menu, GbProjectFile *project_file) { g_autofree gchar *content_type = NULL; GList *list; GList *iter; GFile *file; g_assert (G_IS_MENU (menu)); g_assert (GB_IS_PROJECT_FILE (project_file)); g_menu_remove_all (menu); file = gb_project_file_get_file (project_file); if (file == NULL) return; content_type = get_content_type (file); if (content_type == NULL) return; list = g_app_info_get_all_for_type (content_type); for (iter = list; iter; iter = iter->next) { g_autoptr(GMenuItem) menu_item = NULL; g_autofree gchar *detailed_action = NULL; GAppInfo *app_info = iter->data; const gchar *display_name; const gchar *app_id; display_name = g_app_info_get_display_name (app_info); app_id = g_app_info_get_id (app_info); detailed_action = g_strdup_printf ("project-tree.open-with('%s')", app_id); menu_item = g_menu_item_new (display_name, detailed_action); g_menu_append_item (menu, menu_item); } g_list_free_full (list, g_object_unref); }
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 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); }