static void gb_vim_command_split_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeWorkbench *workbench = (IdeWorkbench *)object; SplitCallbackData *split_callback_data = user_data; GtkWidget *active_widget; const gchar *file_path; GVariant *variant; g_autoptr(GError) error = NULL; g_assert (IDE_IS_WORKBENCH (workbench)); g_assert (split_callback_data != NULL); if (ide_workbench_open_finish (workbench, result, &error)) { active_widget = split_callback_data->active_widget; file_path = split_callback_data->file_path; variant = g_variant_new_string (file_path); dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "split-page", variant); } g_clear_object (&split_callback_data->active_widget); g_clear_pointer (&split_callback_data->file_path, g_free); g_slice_free (SplitCallbackData, split_callback_data); }
static void gb_vim_command_vsplit_cb (GObject *object, GAsyncResult *result, gpointer user_data) { SplitCallbackData *split_callback_data = (SplitCallbackData *)user_data; IdeWorkbench *workbench; GtkWidget *active_widget; const gchar *file_path; GVariant *variant; g_autoptr(GError) error = NULL; workbench = IDE_WORKBENCH (object); if (ide_workbench_open_files_finish (workbench,result, &error)) { active_widget = split_callback_data->active_widget; file_path = split_callback_data->file_path; variant = g_variant_new_string (file_path); dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "open-in-new-frame", variant); } g_object_unref (split_callback_data->active_widget); g_free (split_callback_data->file_path); g_slice_free (SplitCallbackData, split_callback_data); }
static gboolean gb_vim_command_quit (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); if (IDE_IS_EDITOR_PAGE (active_widget)) { IdeSourceView *source_view = ide_editor_page_get_view (IDE_EDITOR_PAGE (active_widget)); dzl_gtk_widget_action (GTK_WIDGET (source_view), "editor-page", "save", NULL); } dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "close-page", NULL); return TRUE; }
static gboolean gb_vim_command_buffers (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "show-list", NULL); return TRUE; }
static gboolean gb_vim_command_make (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); /* TODO: check for an open project */ dzl_gtk_widget_action (GTK_WIDGET (active_widget), "build-manager", "build", NULL); return TRUE; }
static gboolean gb_vim_command_tabe (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); if (!ide_str_empty0 (options)) return gb_vim_command_edit (active_widget, command, options, error); dzl_gtk_widget_action (GTK_WIDGET (active_widget), "editor", "new-file", NULL); return TRUE; }
static gboolean gb_vim_command_help (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { GVariant *param; g_assert (GTK_IS_WIDGET (active_widget)); param = g_variant_new_string (options); dzl_gtk_widget_action (GTK_WIDGET (active_widget), "workbench", "search-docs", param); return TRUE; }
static gboolean gb_vim_command_bprevious (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { IdeFrame *frame_; g_assert (GTK_IS_WIDGET (active_widget)); if ((frame_ = (IdeFrame *)gtk_widget_get_ancestor (active_widget, IDE_TYPE_FRAME)) && g_list_model_get_n_items (G_LIST_MODEL (frame_)) > 0) dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "previous-page", NULL); return TRUE; }
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 (dzl_str_empty0 (options)) { dzl_gtk_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_vim_command_write (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); if (IDE_IS_EDITOR_VIEW (active_widget)) { IdeSourceView *source_view = ide_editor_view_get_view (IDE_EDITOR_VIEW (active_widget)); dzl_gtk_widget_action (GTK_WIDGET (source_view), "editor-view", "save", NULL); return TRUE; } else return gb_vim_set_source_view_error (error); }
static void gb_vim_command_vsplit_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeWorkbench *workbench = (IdeWorkbench *)object; SplitCallbackData *split_callback_data = user_data; g_autoptr(GError) error = NULL; g_assert (IDE_IS_WORKBENCH (workbench)); g_assert (split_callback_data != NULL); if (ide_workbench_open_finish (workbench,result, &error)) dzl_gtk_widget_action (split_callback_data->active_widget, "frame", "open-in-new-frame", g_variant_new_string (split_callback_data->file_path)); g_clear_object (&split_callback_data->active_widget); g_clear_pointer (&split_callback_data->file_path, g_free); g_slice_free (SplitCallbackData, split_callback_data); }
static gboolean gb_vim_command_vsplit (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { GVariant *variant; g_assert (GTK_IS_WIDGET (active_widget)); if (!IDE_IS_PAGE (active_widget)) return gb_vim_set_no_view_error (error); if (ide_str_empty0 (options)) { variant = g_variant_new_string (""); dzl_gtk_widget_action (GTK_WIDGET (active_widget), "frame", "open-in-new-frame", variant); return TRUE; } else return load_split_async (active_widget, options, gb_vim_command_vsplit_cb, error); }
static gboolean gb_vim_command_bprevious (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { IdeWorkbench *workbench; IdeContext *context; IdeBufferManager *bufmgr; guint n_buffers; g_assert (GTK_IS_WIDGET (active_widget)); workbench = ide_widget_get_workbench (GTK_WIDGET (active_widget)); context = ide_workbench_get_context (workbench); bufmgr = ide_context_get_buffer_manager (context); n_buffers = ide_buffer_manager_get_n_buffers (bufmgr); if (n_buffers > 0) dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "previous-view", NULL); return TRUE; }
static gboolean gb_vim_command_split (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { 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 (dzl_str_empty0 (options)) { variant = g_variant_new_string (""); dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "split-view", variant); return TRUE; } else return load_split_async (active_widget, options, gb_vim_command_split_cb, error); }
static gboolean gb_vim_command_edit (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_autoptr(GFile) workdir = NULL; g_autoptr(GFile) file = NULL; IdeWorkbench *workbench; g_assert (GTK_IS_WIDGET (active_widget)); if (ide_str_empty0 (options)) { dzl_gtk_widget_action (GTK_WIDGET (active_widget), "workbench", "open", NULL); return TRUE; } if (!(workdir = find_workdir (active_widget))) { 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); workbench = ide_widget_get_workbench (active_widget); ide_workbench_open_async (workbench, file, "editor", 0, NULL, NULL, NULL); return TRUE; }
static void open_project (GSimpleAction *action, GVariant *param, gpointer user_data) { GbpGreeterApplicationAddin *self = user_data; g_autoptr(IdeWorkbench) workbench = NULL; IdeGreeterWorkspace *workspace; g_assert (!action || G_IS_SIMPLE_ACTION (action)); g_assert (!param || g_variant_is_of_type (param, G_VARIANT_TYPE_STRING)); g_assert (GBP_IS_GREETER_APPLICATION_ADDIN (self)); g_assert (IDE_IS_APPLICATION (self->application)); workbench = ide_workbench_new (); ide_application_add_workbench (self->application, workbench); workspace = ide_greeter_workspace_new (self->application); ide_workbench_add_workspace (workbench, IDE_WORKSPACE (workspace)); ide_workbench_focus_workspace (workbench, IDE_WORKSPACE (workspace)); dzl_gtk_widget_action (GTK_WIDGET (workspace), "win", "open", NULL); }
static gboolean gb_vim_command_substitute (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { IdeSourceView *source_view; GtkTextBuffer *buffer; const gchar *search_begin = NULL; const gchar *search_end = NULL; const gchar *replace_begin = NULL; const gchar *replace_end = NULL; g_autofree gchar *search_text = NULL; g_autofree gchar *replace_text = NULL; GtkTextIter *substitute_begin = NULL; GtkTextIter *substitute_end = NULL; gunichar separator; gboolean replace_in_every_line = FALSE; gboolean replace_every_occurence_in_line = FALSE; gboolean replace_ask_for_confirmation = FALSE; GtkTextIter selection_begin, selection_end; g_assert (GTK_IS_WIDGET (active_widget)); g_assert (g_str_has_prefix (command, "%s") || g_str_has_prefix (command, "s")); if (IDE_IS_EDITOR_PAGE (active_widget)) source_view = ide_editor_page_get_view (IDE_EDITOR_PAGE (active_widget)); else return gb_vim_set_source_view_error (error); if (command[0] == '%') { replace_in_every_line = TRUE; command++; } command++; separator = g_utf8_get_char (command); if (!separator) goto invalid_request; search_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { search_end = command; break; } } if (search_end == NULL) { search_text = g_strdup (search_begin); replace_text = g_strdup (""); } else { search_text = g_strndup (search_begin, search_end - search_begin); replace_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { replace_end = command; break; } } if (replace_end == NULL) replace_text = g_strdup (replace_begin); else { replace_text = g_strndup (replace_begin, replace_end - replace_begin); command = g_utf8_next_char (command); } if (*command) { for (; *command; command++) { switch (*command) { case 'c': replace_ask_for_confirmation = TRUE; break; case 'g': replace_every_occurence_in_line = TRUE; break; /* what other options are supported? */ default: break; } } } } if (replace_ask_for_confirmation) { GVariant *variant; GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY); g_variant_builder_add (&builder, "s", search_text); g_variant_builder_add (&builder, "s", replace_text); variant = g_variant_builder_end (&builder); dzl_gtk_widget_action (active_widget, "editor-page", "replace-confirm", variant); return TRUE; } buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); if (gtk_text_buffer_get_has_selection (buffer)) { gtk_text_buffer_get_selection_bounds (buffer, &selection_begin, &selection_end); substitute_begin = &selection_begin; substitute_end = &selection_end; } gtk_text_buffer_begin_user_action (buffer); gb_vim_do_substitute (buffer, substitute_begin, substitute_end, search_text, replace_text, replace_every_occurence_in_line, replace_in_every_line); gtk_text_buffer_end_user_action (buffer); return TRUE; invalid_request: g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_UNKNOWN_OPTION, _("Invalid search and replace request")); return FALSE; }