static void check_replace_text (IdeEditorFrame *self) { GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; g_autoptr(GError) error = NULL; PangoAttrList *attrs; g_assert (IDE_IS_EDITOR_FRAME (self)); search_context = ide_source_view_get_search_context (self->source_view); search_settings = gtk_source_search_context_get_settings (search_context); attrs = pango_attr_list_new (); /* * If the replace expression is invalid, add a white squiggly underline; * otherwise remove it. */ if (gtk_source_search_settings_get_regex_enabled (search_settings)) { const gchar *replace_text; replace_text = gtk_entry_get_text (GTK_ENTRY (self->replace_entry)); if (!g_regex_check_replacement (replace_text, NULL, &error)) { pango_attr_list_insert (attrs, pango_attr_underline_new (PANGO_UNDERLINE_ERROR)); pango_attr_list_insert (attrs, pango_attr_underline_color_new (65535, 65535, 65535)); } } gtk_entry_set_attributes (GTK_ENTRY (self->replace_entry), attrs); pango_attr_list_unref (attrs); }
static void update_replace_actions_sensitivity (IdeEditorFrame *self) { GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; GtkTextBuffer *buffer; GtkTextIter start; GtkTextIter end; const gchar *search_text; const gchar *replace_text; gint pos; gint count; gboolean enable_replace; gboolean enable_replace_all; gboolean replace_regex_valid; g_autoptr(GError) regex_error = NULL; g_autoptr(GError) replace_regex_error = NULL; GActionGroup *group; GAction *replace_action; GAction *replace_all_action; g_assert (IDE_IS_EDITOR_FRAME (self)); search_context = ide_source_view_get_search_context (self->source_view); search_settings = gtk_source_search_context_get_settings (search_context); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->source_view)); gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (buffer), &start, &end); replace_text = gtk_entry_get_text (GTK_ENTRY (self->replace_entry)); /* Gather enough info to determine if Replace or Replace All would make sense */ search_text = gtk_entry_get_text (GTK_ENTRY (self->search_entry)); pos = gtk_source_search_context_get_occurrence_position (search_context, &start, &end); count = gtk_source_search_context_get_occurrences_count (search_context); regex_error = gtk_source_search_context_get_regex_error (search_context); replace_regex_valid = gtk_source_search_settings_get_regex_enabled (search_settings) ? g_regex_check_replacement (replace_text, NULL, &replace_regex_error) : TRUE; enable_replace = (!ide_str_empty0 (search_text) && regex_error == NULL && replace_regex_valid && pos > 0); enable_replace_all = (!ide_str_empty0 (search_text) && regex_error == NULL && replace_regex_valid && count > 0); group = gtk_widget_get_action_group (GTK_WIDGET (self->search_frame), "search-entry"); replace_action = g_action_map_lookup_action (G_ACTION_MAP (group), "replace"); replace_all_action = g_action_map_lookup_action (G_ACTION_MAP (group), "replace-all"); g_simple_action_set_enabled (G_SIMPLE_ACTION (replace_action), enable_replace); g_simple_action_set_enabled (G_SIMPLE_ACTION (replace_all_action), enable_replace_all); }
static gboolean search_text_transform_to (GBinding *binding, const GValue *from_value, GValue *to_value, gpointer user_data) { IdeEditorFrame *self = user_data; g_assert (IDE_IS_EDITOR_FRAME (self)); g_assert (from_value != NULL); g_assert (to_value != NULL); if (g_value_get_string (from_value) == NULL) { g_value_set_string (to_value, ""); } else { const gchar *entry_text = g_value_get_string (from_value); GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; search_context = ide_source_view_get_search_context (self->source_view); search_settings = gtk_source_search_context_get_settings (search_context); if (gtk_source_search_settings_get_regex_enabled (search_settings)) { g_value_set_string (to_value, entry_text); } else { gchar *unescaped_entry_text; unescaped_entry_text = gtk_source_utils_unescape_search_text (entry_text); g_value_set_string (to_value, unescaped_entry_text); g_free (unescaped_entry_text); } } return TRUE; }
static void ide_editor_frame_actions_find (GSimpleAction *action, GVariant *variant, gpointer user_data) { IdeEditorFrame *self = user_data; GtkTextBuffer *buffer; GtkDirectionType search_direction; g_assert (IDE_IS_EDITOR_FRAME (self)); gtk_widget_set_visible (GTK_WIDGET (self->replace_entry), FALSE); gtk_widget_set_visible (GTK_WIDGET (self->replace_button), FALSE); gtk_widget_set_visible (GTK_WIDGET (self->replace_all_button), FALSE); search_direction = (GtkDirectionType) g_variant_get_int32 (variant); ide_source_view_set_search_direction (self->source_view, search_direction); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->source_view)); /* * If the buffer currently has a selection, we prime the search entry with the * selected text. If not, we use our previous search text in the case that it was * cleared by the IdeSourceView internal state. */ if (gtk_text_buffer_get_has_selection (buffer)) { GtkTextIter start_sel; GtkTextIter end_sel; g_autofree gchar *selected_text = NULL; g_autofree gchar *escaped_selected_text = NULL; GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; gtk_text_buffer_get_selection_bounds (buffer, &start_sel, &end_sel); selected_text = gtk_text_buffer_get_text (buffer, &start_sel, &end_sel, FALSE); search_context = ide_source_view_get_search_context (self->source_view); search_settings = gtk_source_search_context_get_settings (search_context); if (gtk_source_search_settings_get_regex_enabled (search_settings)) escaped_selected_text = g_regex_escape_string (selected_text, -1); else escaped_selected_text = gtk_source_utils_escape_search_text (selected_text); gtk_entry_set_text (GTK_ENTRY (self->search_entry), escaped_selected_text); } else { GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; const gchar *search_text; search_context = ide_source_view_get_search_context (self->source_view); search_settings = gtk_source_search_context_get_settings (search_context); search_text = gtk_source_search_settings_get_search_text (search_settings); if ((search_text != NULL) && (search_text [0] != '\0')) gtk_entry_set_text (GTK_ENTRY (self->search_entry), search_text); else if (self->previous_search_string != NULL) gtk_entry_set_text (GTK_ENTRY (self->search_entry), self->previous_search_string); } gtk_revealer_set_reveal_child (self->search_revealer, TRUE); gtk_widget_grab_focus (GTK_WIDGET (self->search_entry)); }