gboolean peacock_file_find_and_select (PeacockFile *file, const gchar *search_str, gboolean from_start, gboolean case_sensitive) { GtkTextIter start_iter; GtkTextIter end_iter; GtkTextIter match_start; GtkTextIter match_end; GtkSourceSearchFlags flags; gboolean retval; /* Get start iter or current cursor pos iter. */ if (from_start) gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (file), &start_iter); else gtk_text_buffer_get_iter_at_mark ( GTK_TEXT_BUFFER (file), &start_iter, gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (file))); /* Get the end iter. */ gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (file), &end_iter); /* Setup search flags. */ flags = GTK_SOURCE_SEARCH_TEXT_ONLY; if (!case_sensitive) flags |= GTK_SOURCE_SEARCH_CASE_INSENSITIVE; /* Perform search. */ retval = gtk_source_iter_forward_search (&start_iter, search_str, flags, &match_start, &match_end, &end_iter); /* It found something, highlight it. */ if (retval) peacock_file_set_selection (PEACOCK_FILE (file), &match_start, &match_end); return retval; }
static gboolean hlight_searched_strings(GtkTextBuffer *buffer, gchar *str) { GtkTextIter iter, start, end; gboolean res, retval = FALSE; GtkSourceSearchFlags search_flags = GTK_SOURCE_SEARCH_VISIBLE_ONLY | GTK_SOURCE_SEARCH_TEXT_ONLY; if (!string_find) return FALSE; if (!match_case) search_flags = search_flags | GTK_SOURCE_SEARCH_CASE_INSENSITIVE; gtk_text_buffer_get_bounds(buffer, &start, &end); /* gtk_text_buffer_remove_tag_by_name(buffer, "searched", &start, &end); gtk_text_buffer_remove_tag_by_name(buffer, "replaced", &start, &end); */ gtk_text_buffer_remove_all_tags(buffer, &start, &end); iter = start; do { res = gtk_source_iter_forward_search( &iter, str, search_flags, &start, &end, NULL); if (res) { retval = TRUE; gtk_text_buffer_apply_tag_by_name(buffer, "searched", &start, &end); // replace_mode ? "replaced" : "searched", &start, &end); iter = end; } } while (res); /* if (replace_mode) replace_mode = FALSE; else */ hlight_toggle_searched(buffer); return retval; }
gboolean document_search_real(GtkWidget *textview, gint direction) { GtkTextIter iter, match_start, match_end; gboolean res; GtkSourceSearchFlags search_flags = GTK_SOURCE_SEARCH_VISIBLE_ONLY | GTK_SOURCE_SEARCH_TEXT_ONLY; GtkTextBuffer *textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); if (!string_find) return FALSE; if (!match_case) search_flags = search_flags | GTK_SOURCE_SEARCH_CASE_INSENSITIVE; // if (direction == 0 || !hlight_check_searched()) if (direction == 0 || (direction != 2 && !hlight_check_searched())) hlight_searched_strings(GTK_TEXT_VIEW(textview)->buffer, string_find); gtk_text_mark_set_visible( gtk_text_buffer_get_selection_bound( GTK_TEXT_VIEW(textview)->buffer), FALSE); gtk_text_buffer_get_iter_at_mark(textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer)); if (direction < 0) { res = gtk_source_iter_backward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); if (gtk_text_iter_equal(&iter, &match_end)) { res = gtk_source_iter_backward_search( &match_start, string_find, search_flags, &match_start, &match_end, NULL); } } else { res = gtk_source_iter_forward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); } /* TODO: both gtk_(text/source)_iter_backward_search works not fine for multi-byte */ /* wrap */ /* TODO: define limit NULL -> proper value */ if (!res) { if (direction < 0) { gtk_text_buffer_get_end_iter(textbuffer, &iter); res = gtk_source_iter_backward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); } else { gtk_text_buffer_get_start_iter(textbuffer, &iter); res = gtk_source_iter_forward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); } } if (res) { gtk_text_buffer_place_cursor(textbuffer, &match_start); gtk_text_buffer_move_mark_by_name(textbuffer, "insert", &match_end); // gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview), &match_start, 0.1, FALSE, 0.5, 0.5); scroll_to_cursor(textbuffer, 0.05); } else if (direction == 0) run_dialog_message(gtk_widget_get_toplevel(textview), GTK_MESSAGE_WARNING, _("Search string not found")); return res; }
static gint document_replace_real(GtkWidget *textview) { GtkTextIter iter, match_start, match_end, rep_start; GtkTextMark *mark_init = NULL; gboolean res; gint num = 0, offset; GtkWidget *q_dialog = NULL; GtkSourceSearchFlags search_flags = GTK_SOURCE_SEARCH_VISIBLE_ONLY | GTK_SOURCE_SEARCH_TEXT_ONLY; GtkTextBuffer *textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); if (!match_case) search_flags = search_flags | GTK_SOURCE_SEARCH_CASE_INSENSITIVE; if (replace_all) { gtk_text_buffer_get_iter_at_mark(textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer)); mark_init = gtk_text_buffer_create_mark(textbuffer, NULL, &iter, FALSE); gtk_text_buffer_get_start_iter(textbuffer, &iter); gtk_text_buffer_get_end_iter(textbuffer, &match_end); // gtk_text_buffer_remove_tag_by_name(textbuffer, // "replaced", &iter, &match_end); gtk_text_buffer_remove_all_tags(textbuffer, &iter, &match_end); } else { hlight_searched_strings(textbuffer, string_find); hlight_toggle_searched(textbuffer); } do { if (replace_all) { res = gtk_source_iter_forward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); if (res) { gtk_text_buffer_place_cursor(textbuffer, &match_start); gtk_text_buffer_move_mark_by_name(textbuffer, "insert", &match_end); gtk_text_buffer_get_iter_at_mark( textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer)); } } else // res = document_search_real(textview, 0); res = document_search_real(textview, 2); if (res) { if (!replace_all) { if (num == 0 && q_dialog == NULL) q_dialog = create_dialog_message_question( gtk_widget_get_toplevel(textview), _("Replace?")); #if GTK_CHECK_VERSION(2, 10, 0) GtkTextIter ins,bou; gtk_text_buffer_get_selection_bounds(textbuffer, &ins, &bou); #endif switch (gtk_dialog_run(GTK_DIALOG(q_dialog))) { case GTK_RESPONSE_YES: #if GTK_CHECK_VERSION(2, 10, 0) gtk_text_buffer_select_range(textbuffer, &ins, &bou); #endif break; case GTK_RESPONSE_NO: continue; // case GTK_RESPONSE_CANCEL: default: res = 0; if (num == 0) num = -1; continue; } } gtk_text_buffer_delete_selection(textbuffer, TRUE, TRUE); if (strlen(string_replace)) { gtk_text_buffer_get_iter_at_mark( textbuffer, &rep_start, gtk_text_buffer_get_insert(textbuffer)); offset = gtk_text_iter_get_offset(&rep_start); undo_set_sequency(TRUE); g_signal_emit_by_name(G_OBJECT(textbuffer), "begin-user-action"); gtk_text_buffer_insert_at_cursor(textbuffer, string_replace, strlen(string_replace)); g_signal_emit_by_name(G_OBJECT(textbuffer), "end-user-action"); gtk_text_buffer_get_iter_at_mark( textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer)); gtk_text_buffer_get_iter_at_offset(textbuffer, &rep_start, offset); gtk_text_buffer_apply_tag_by_name(textbuffer, "replaced", &rep_start, &iter); } else gtk_text_buffer_get_iter_at_mark( textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer)); num++; /* if (replace_all) undo_set_sequency(TRUE); else undo_set_sequency(FALSE);*/ undo_set_sequency(replace_all); } } while (res); if (!hlight_check_searched()) hlight_toggle_searched(textbuffer); if (q_dialog) gtk_widget_destroy(q_dialog); /* if (strlen(string_replace)) { replace_mode = TRUE; hlight_searched_strings(textbuffer, string_replace); } */ if (replace_all) { gtk_text_buffer_get_iter_at_mark(textbuffer, &iter, mark_init); gtk_text_buffer_place_cursor(textbuffer, &iter); run_dialog_message(gtk_widget_get_toplevel(textview), GTK_MESSAGE_INFO, _("%d strings replaced"), num); undo_set_sequency(FALSE); } return num; }