static void ide_editor_frame_actions_replace (GSimpleAction *action, GVariant *state, gpointer user_data) { IdeEditorFrame *self = user_data; GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; const gchar *replace_text; gchar *unescaped_replace_text; const gchar *search_text; GError *error = NULL; GtkTextIter start; GtkTextIter end; GtkTextBuffer *buffer; gint occurrence_position; g_assert (IDE_IS_EDITOR_FRAME (self)); search_context = ide_source_view_get_search_context (self->source_view); g_assert (search_context != NULL); search_settings = gtk_source_search_context_get_settings (search_context); search_text = gtk_source_search_settings_get_search_text (search_settings); replace_text = gtk_entry_get_text (GTK_ENTRY (self->replace_entry)); if (ide_str_empty0 (search_text) || replace_text == NULL) return; unescaped_replace_text = gtk_source_utils_unescape_search_text (replace_text); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->source_view)); gtk_text_buffer_get_selection_bounds (buffer, &start, &end); occurrence_position = gtk_source_search_context_get_occurrence_position (search_context, &start, &end); if (occurrence_position > 0) { /* Temporarily disable updating the search position label to prevent flickering */ g_signal_handler_block (buffer, self->cursor_moved_handler); gtk_source_search_context_replace2 (search_context, &start, &end, unescaped_replace_text, -1, &error); /* Re-enable updating the search position label. The next-search-result action * below will cause it to update. */ g_signal_handler_unblock (buffer, self->cursor_moved_handler); if (error != NULL) { g_warning ("%s", error->message); g_clear_error (&error); } ide_widget_action (GTK_WIDGET (self), "frame", "next-search-result", NULL); } g_free (unescaped_replace_text); }
static void gb_vim_do_search_and_replace (GtkTextBuffer *buffer, GtkTextIter *begin, GtkTextIter *end, const gchar *search_text, const gchar *replace_text, gboolean is_global) { GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; GtkTextMark *mark; GtkTextIter tmp1; GtkTextIter tmp2; GtkTextIter match_begin; GtkTextIter match_end; gboolean has_wrapped = FALSE; GError *error = NULL; g_assert (search_text); g_assert (replace_text); g_assert ((!begin && !end) || (begin && end)); search_settings = gtk_source_search_settings_new (); search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (buffer), search_settings); if (!begin) { gtk_text_buffer_get_start_iter (buffer, &tmp1); begin = &tmp1; } if (!end) { gtk_text_buffer_get_end_iter (buffer, &tmp2); end = &tmp2; } mark = gtk_text_buffer_create_mark (buffer, NULL, end, FALSE); gtk_source_search_settings_set_search_text (search_settings, search_text); gtk_source_search_settings_set_case_sensitive (search_settings, TRUE); while (gtk_source_search_context_forward2 (search_context, begin, &match_begin, &match_end, &has_wrapped) && !has_wrapped) { if (is_global || gb_vim_match_is_selected (buffer, &match_begin, &match_end)) { if (!gtk_source_search_context_replace2 (search_context, &match_begin, &match_end, replace_text, -1, &error)) { g_warning ("%s", error->message); g_clear_error (&error); break; } } *begin = match_end; gtk_text_buffer_get_iter_at_mark (buffer, end, mark); } gtk_text_buffer_delete_mark (buffer, mark); g_clear_object (&search_settings); g_clear_object (&search_context); }