static void gb_project_tree_actions_open_with_editor (GSimpleAction *action, GVariant *variant, gpointer user_data) { IdeWorkbench *workbench; GbProjectTree *self = user_data; GFileInfo *file_info; GFile *file; IdeTreeNode *selected; GObject *item; g_assert (GB_IS_PROJECT_TREE (self)); if (!(selected = ide_tree_get_selected (IDE_TREE (self))) || !(item = ide_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 = ide_widget_get_workbench (GTK_WIDGET (self)))) return; ide_workbench_open_files_async (workbench, &file, 1, "editor", NULL, NULL, NULL); }
static gboolean maybe_open_with_existing_workspace (IdeApplication *self, GFile *file, const gchar *hint, GCancellable *cancellable) { GList *windows; GList *iter; g_assert (IDE_IS_APPLICATION (self)); g_assert (G_IS_FILE (file)); windows = gtk_application_get_windows (GTK_APPLICATION (self)); for (iter = windows; iter != NULL; iter = iter->next) { GtkWindow *window = iter->data; if (IDE_IS_WORKBENCH (window) && workbench_manages_file (IDE_WORKBENCH (window), file)) { ide_workbench_open_files_async (IDE_WORKBENCH (window), &file, 1, hint, 0, cancellable, NULL, NULL); return TRUE; } } return FALSE; }
static gboolean load_split_async (GtkWidget *active_widget, const gchar *options, GAsyncReadyCallback callback, GError **error) { IdeWorkbench *workbench; IdeContext *context; IdeVcs *vcs; GFile *workdir; GFile *file = NULL; gchar *file_path; SplitCallbackData *split_callback_data; g_assert (GTK_IS_WIDGET (active_widget)); g_assert (options != NULL); g_assert (callback != NULL); if (!(workbench = ide_widget_get_workbench (active_widget)) || !(context = ide_workbench_get_context (workbench)) || !(vcs = ide_context_get_vcs (context)) || !(workdir = ide_vcs_get_working_directory (vcs))) { g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_NOT_SOURCE_VIEW, _("Failed to locate working directory")); return FALSE; } if (!g_path_is_absolute (options)) { g_autofree gchar *workdir_path = NULL; workdir_path = g_file_get_path (workdir); file_path = g_build_filename (workdir_path, options, NULL); } else file_path = g_strdup (options); file = g_file_new_for_path (file_path); split_callback_data = g_slice_new (SplitCallbackData); split_callback_data->active_widget = g_object_ref (active_widget); split_callback_data->file_path = file_path; ide_workbench_open_files_async (workbench, &file, 1, "editor", IDE_WORKBENCH_OPEN_FLAGS_NO_VIEW, NULL, callback, split_callback_data); g_clear_object (&file); return TRUE; }
static gboolean gb_vim_command_vsplit (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { IdeWorkbench *workbench; IdeContext *context; IdeVcs *vcs; GFile *workdir; GFile *file = NULL; gchar *file_path; SplitCallbackData *split_callback_data; GVariant *variant; g_assert (GTK_IS_WIDGET (active_widget)); if (!IDE_IS_LAYOUT_VIEW (active_widget)) return gb_vim_set_no_view_error (error); if (ide_str_empty0 (options)) { variant = g_variant_new_string (""); ide_widget_action (GTK_WIDGET (active_widget), "view-stack", "split-left", variant); } else { if (!(workbench = ide_widget_get_workbench (active_widget)) || !(context = ide_workbench_get_context (workbench)) || !(vcs = ide_context_get_vcs (context)) || !(workdir = ide_vcs_get_working_directory (vcs))) { g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_NOT_SOURCE_VIEW, _("Failed to locate working directory")); return FALSE; } file_path = g_strdup (options); if (!g_path_is_absolute (file_path)) file_path = g_build_filename (g_file_get_path (workdir), file_path, NULL); file = g_file_new_for_path (file_path); split_callback_data = g_slice_new (SplitCallbackData); split_callback_data->active_widget = g_object_ref (active_widget); split_callback_data->file_path = file_path; ide_workbench_open_files_async (workbench, &file, 1, "editor", IDE_WORKBENCH_OPEN_FLAGS_BACKGROUND, NULL, gb_vim_command_vsplit_cb, split_callback_data); g_clear_object (&file); } return TRUE; }
static void ide_editor_perspective_actions_open_file (GSimpleAction *action, GVariant *variant, gpointer user_data) { IdeEditorPerspective *self = user_data; GtkFileChooserNative *chooser; IdeWorkbench *workbench; gint ret; g_assert (G_IS_SIMPLE_ACTION (action)); g_assert (IDE_IS_EDITOR_PERSPECTIVE (self)); workbench = ide_widget_get_workbench (GTK_WIDGET (self)); if (workbench == NULL) { g_warning ("Failed to locate workbench"); return; } chooser = gtk_file_chooser_native_new (_("Open File"), GTK_WINDOW (workbench), GTK_FILE_CHOOSER_ACTION_OPEN, _("Open"), _("Cancel")); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE); ret = gtk_native_dialog_run (GTK_NATIVE_DIALOG (chooser)); if (ret == GTK_RESPONSE_ACCEPT) { g_autoptr(GPtrArray) ar = NULL; GSList *files; ar = g_ptr_array_new_with_free_func (g_object_unref); files = gtk_file_chooser_get_files (GTK_FILE_CHOOSER (chooser)); for (const GSList *iter = files; iter; iter = iter->next) g_ptr_array_add (ar, iter->data); g_slist_free (files); if (ar->len > 0) ide_workbench_open_files_async (workbench, (GFile **)ar->pdata, ar->len, "editor", IDE_WORKBENCH_OPEN_FLAGS_NONE, NULL, NULL, NULL); } gtk_native_dialog_destroy (GTK_NATIVE_DIALOG (chooser)); }
static void ide_workbench_actions_open_with_dialog (GSimpleAction *action, GVariant *param, gpointer user_data) { IdeWorkbench *self = user_data; GtkWidget *button; GtkWidget *dialog; gint ret; IDE_ENTRY; g_assert (IDE_IS_WORKBENCH (self)); dialog = gtk_file_chooser_dialog_new (_("Open File"), GTK_WINDOW (self), GTK_FILE_CHOOSER_ACTION_OPEN, _("Cancel"), GTK_RESPONSE_CANCEL, _("Open"), GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE); button = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_style_context_add_class (gtk_widget_get_style_context (button), GTK_STYLE_CLASS_SUGGESTED_ACTION); /* * TODO: Allow workbench addins to specify file filters? * Do we want to move this to a custom interface and use that * for file loading as well? */ ret = gtk_dialog_run (GTK_DIALOG (dialog)); if (ret == GTK_RESPONSE_OK) { g_autoptr(GFile) file = NULL; IDE_PROBE; file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog)); ide_workbench_open_files_async (self, &file, 1, NULL, NULL, ide_workbench_actions_open_with_dialog_cb, NULL); } gtk_widget_destroy (dialog); IDE_EXIT; }
static gboolean gb_vim_command_edit (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { IdeWorkbench *workbench; IdeContext *context; IdeVcs *vcs; GFile *workdir; GFile *file = NULL; g_assert (GTK_IS_WIDGET (active_widget)); if (ide_str_empty0 (options)) { ide_widget_action (GTK_WIDGET (active_widget), "win", "open-with-dialog", NULL); return TRUE; } if (!(workbench = ide_widget_get_workbench (active_widget)) || !(context = ide_workbench_get_context (workbench)) || !(vcs = ide_context_get_vcs (context)) || !(workdir = ide_vcs_get_working_directory (vcs))) { g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_NOT_SOURCE_VIEW, _("Failed to locate working directory")); return FALSE; } if (g_path_is_absolute (options)) file = g_file_new_for_path (options); else file = g_file_get_child (workdir, options); ide_workbench_open_files_async (workbench, &file, 1, "editor", IDE_WORKBENCH_OPEN_FLAGS_NONE, NULL, NULL, NULL); g_clear_object (&file); return TRUE; }
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 ide_application_open_project_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeWorkbench *workbench = (IdeWorkbench *)object; IdeApplicationOpen *state; g_autoptr(GTask) task = user_data; g_autoptr(GError) error = NULL; g_autoptr(GFile) file = NULL; g_assert (IDE_IS_WORKBENCH (workbench)); g_assert (G_IS_TASK (task)); state = g_task_get_task_data (task); file = g_object_ref (g_ptr_array_index (state->files, state->files->len - 1)); g_ptr_array_remove_index (state->files, state->files->len - 1); if (!ide_workbench_open_project_finish (workbench, result, &error)) { g_warning ("%s", error->message); gtk_widget_destroy (GTK_WIDGET (workbench)); } else { ide_workbench_open_files_async (workbench, &file, 1, state->hint, 0, g_task_get_cancellable (task), NULL, NULL); gtk_window_present (GTK_WINDOW (workbench)); } ide_application_open_tick (task); }
static void find_other_file_cb (GObject *object, GAsyncResult *result, gpointer user_data) { g_autoptr(IdeEditorView) self = user_data; g_autoptr(IdeFile) ret = NULL; IdeFile *file = (IdeFile *)object; ret = ide_file_find_other_finish (file, result, NULL); if (ret != NULL) { IdeWorkbench *workbench; GFile *gfile; IdeWorkbenchOpenFlags flags; gfile = ide_file_get_file (ret); workbench = ide_widget_get_workbench (GTK_WIDGET (self)); flags = WORKBENCH_OPEN_FLAGS_NONE; ide_workbench_open_files_async (workbench, &gfile, 1, "editor", flags, NULL, NULL, NULL); } }