summaryrefslogtreecommitdiff
path: root/gedit/gedit-commands-search.c
diff options
context:
space:
mode:
Diffstat (limited to 'gedit/gedit-commands-search.c')
-rwxr-xr-xgedit/gedit-commands-search.c716
1 files changed, 0 insertions, 716 deletions
diff --git a/gedit/gedit-commands-search.c b/gedit/gedit-commands-search.c
deleted file mode 100755
index 3a44a218..00000000
--- a/gedit/gedit-commands-search.c
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- * gedit-search-commands.c
- * This file is part of gedit
- *
- * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence
- * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi
- * Copyright (C) 2002-2006 Paolo Maggi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the gedit Team, 1998-2006. See the AUTHORS file for a
- * list of people on the gedit Team.
- * See the ChangeLog files for a list of changes.
- *
- * $Id$
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <glib/gi18n.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "gedit-commands.h"
-#include "gedit-debug.h"
-#include "gedit-statusbar.h"
-#include "gedit-window.h"
-#include "gedit-window-private.h"
-#include "gedit-utils.h"
-#include "dialogs/gedit-search-dialog.h"
-
-#define GEDIT_SEARCH_DIALOG_KEY "gedit-search-dialog-key"
-#define GEDIT_LAST_SEARCH_DATA_KEY "gedit-last-search-data-key"
-
-typedef struct _LastSearchData LastSearchData;
-struct _LastSearchData
-{
- gint x;
- gint y;
-};
-
-static void
-last_search_data_free (LastSearchData *data)
-{
- g_slice_free (LastSearchData, data);
-}
-
-static void
-last_search_data_restore_position (GeditSearchDialog *dlg)
-{
- LastSearchData *data;
-
- data = g_object_get_data (G_OBJECT (dlg), GEDIT_LAST_SEARCH_DATA_KEY);
-
- if (data != NULL)
- {
- gtk_window_move (GTK_WINDOW (dlg),
- data->x,
- data->y);
- }
-}
-
-static void
-last_search_data_store_position (GeditSearchDialog *dlg)
-{
- LastSearchData *data;
-
- data = g_object_get_data (G_OBJECT (dlg), GEDIT_LAST_SEARCH_DATA_KEY);
-
- if (data == NULL)
- {
- data = g_slice_new (LastSearchData);
-
- g_object_set_data_full (G_OBJECT (dlg),
- GEDIT_LAST_SEARCH_DATA_KEY,
- data,
- (GDestroyNotify) last_search_data_free);
- }
-
- gtk_window_get_position (GTK_WINDOW (dlg),
- &data->x,
- &data->y);
-}
-
-/* Use occurences only for Replace All */
-static void
-text_found (GeditWindow *window,
- gint occurrences)
-{
- if (occurrences > 1)
- {
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- ngettext("Found and replaced %d occurrence",
- "Found and replaced %d occurrences",
- occurrences),
- occurrences);
- }
- else
- {
- if (occurrences == 1)
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- _("Found and replaced one occurrence"));
- else
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- " ");
- }
-}
-
-#define MAX_MSG_LENGTH 40
-static void
-text_not_found (GeditWindow *window,
- const gchar *text)
-{
- gchar *searched;
-
- searched = gedit_utils_str_end_truncate (text, MAX_MSG_LENGTH);
-
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- /* Translators: %s is replaced by the text
- entered by the user in the search box */
- _("\"%s\" not found"), searched);
- g_free (searched);
-}
-
-static gboolean
-run_search (GeditView *view,
- gboolean wrap_around,
- gboolean search_backwards)
-{
- GeditDocument *doc;
- GtkTextIter start_iter;
- GtkTextIter match_start;
- GtkTextIter match_end;
- gboolean found = FALSE;
-
- doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
-
- if (!search_backwards)
- {
- gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc),
- NULL,
- &start_iter);
-
- found = gedit_document_search_forward (doc,
- &start_iter,
- NULL,
- &match_start,
- &match_end);
- }
- else
- {
- gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc),
- &start_iter,
- NULL);
-
- found = gedit_document_search_backward (doc,
- NULL,
- &start_iter,
- &match_start,
- &match_end);
- }
-
- if (!found && wrap_around)
- {
- if (!search_backwards)
- found = gedit_document_search_forward (doc,
- NULL,
- NULL, /* FIXME: set the end_inter */
- &match_start,
- &match_end);
- else
- found = gedit_document_search_backward (doc,
- NULL, /* FIXME: set the start_inter */
- NULL,
- &match_start,
- &match_end);
- }
-
- if (found)
- {
- gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc),
- &match_start);
-
- gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER (doc),
- "selection_bound",
- &match_end);
-
- gedit_view_scroll_to_cursor (view);
- }
- else
- {
- gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc),
- &start_iter);
- }
-
- return found;
-}
-
-static void
-do_find (GeditSearchDialog *dialog,
- GeditWindow *window)
-{
- GeditView *active_view;
- GeditDocument *doc;
- gchar *search_text;
- const gchar *entry_text;
- gboolean match_case;
- gboolean entire_word;
- gboolean wrap_around;
- gboolean search_backwards;
- guint flags = 0;
- guint old_flags = 0;
- gboolean found;
-
- /* TODO: make the dialog insensitive when all the tabs are closed
- * and assert here that the view is not NULL */
- active_view = gedit_window_get_active_view (window);
- if (active_view == NULL)
- return;
-
- doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view)));
-
- entry_text = gedit_search_dialog_get_search_text (dialog);
-
- match_case = gedit_search_dialog_get_match_case (dialog);
- entire_word = gedit_search_dialog_get_entire_word (dialog);
- search_backwards = gedit_search_dialog_get_backwards (dialog);
- wrap_around = gedit_search_dialog_get_wrap_around (dialog);
-
- GEDIT_SEARCH_SET_CASE_SENSITIVE (flags, match_case);
- GEDIT_SEARCH_SET_ENTIRE_WORD (flags, entire_word);
-
- search_text = gedit_document_get_search_text (doc, &old_flags);
-
- if ((search_text == NULL) ||
- (strcmp (search_text, entry_text) != 0) ||
- (flags != old_flags))
- {
- gedit_document_set_search_text (doc, entry_text, flags);
- }
-
- g_free (search_text);
-
- found = run_search (active_view,
- wrap_around,
- search_backwards);
-
- if (found)
- text_found (window, 0);
- else
- text_not_found (window, entry_text);
-
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
- GEDIT_SEARCH_DIALOG_REPLACE_RESPONSE,
- found);
-}
-
-/* FIXME: move in gedit-document.c and share it with gedit-view */
-static gboolean
-get_selected_text (GtkTextBuffer *doc,
- gchar **selected_text,
- gint *len)
-{
- GtkTextIter start, end;
-
- g_return_val_if_fail (selected_text != NULL, FALSE);
- g_return_val_if_fail (*selected_text == NULL, FALSE);
-
- if (!gtk_text_buffer_get_selection_bounds (doc, &start, &end))
- {
- if (len != NULL)
- len = 0;
-
- return FALSE;
- }
-
- *selected_text = gtk_text_buffer_get_slice (doc, &start, &end, TRUE);
-
- if (len != NULL)
- *len = g_utf8_strlen (*selected_text, -1);
-
- return TRUE;
-}
-
-static void
-replace_selected_text (GtkTextBuffer *buffer,
- const gchar *replace)
-{
- g_return_if_fail (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL));
- g_return_if_fail (replace != NULL);
-
- gtk_text_buffer_begin_user_action (buffer);
-
- gtk_text_buffer_delete_selection (buffer, FALSE, TRUE);
-
- gtk_text_buffer_insert_at_cursor (buffer, replace, strlen (replace));
-
- gtk_text_buffer_end_user_action (buffer);
-}
-
-static void
-do_replace (GeditSearchDialog *dialog,
- GeditWindow *window)
-{
- GeditDocument *doc;
- const gchar *search_entry_text;
- const gchar *replace_entry_text;
- gchar *unescaped_search_text;
- gchar *unescaped_replace_text;
- gchar *selected_text = NULL;
- gboolean match_case;
-
- doc = gedit_window_get_active_document (window);
- if (doc == NULL)
- return;
-
- search_entry_text = gedit_search_dialog_get_search_text (dialog);
- g_return_if_fail ((search_entry_text) != NULL);
- g_return_if_fail ((*search_entry_text) != '\0');
-
- /* replace text may be "", we just delete */
- replace_entry_text = gedit_search_dialog_get_replace_text (dialog);
- g_return_if_fail ((replace_entry_text) != NULL);
-
- unescaped_search_text = gedit_utils_unescape_search_text (search_entry_text);
-
- get_selected_text (GTK_TEXT_BUFFER (doc),
- &selected_text,
- NULL);
-
- match_case = gedit_search_dialog_get_match_case (dialog);
-
- if ((selected_text == NULL) ||
- (match_case && (strcmp (selected_text, unescaped_search_text) != 0)) ||
- (!match_case && !g_utf8_caselessnmatch (selected_text,
- unescaped_search_text,
- strlen (selected_text),
- strlen (unescaped_search_text)) != 0))
- {
- do_find (dialog, window);
- g_free (unescaped_search_text);
- g_free (selected_text);
-
- return;
- }
-
- unescaped_replace_text = gedit_utils_unescape_search_text (replace_entry_text);
- replace_selected_text (GTK_TEXT_BUFFER (doc), unescaped_replace_text);
-
- g_free (unescaped_search_text);
- g_free (selected_text);
- g_free (unescaped_replace_text);
-
- do_find (dialog, window);
-}
-
-static void
-do_replace_all (GeditSearchDialog *dialog,
- GeditWindow *window)
-{
- GeditView *active_view;
- GeditDocument *doc;
- const gchar *search_entry_text;
- const gchar *replace_entry_text;
- gboolean match_case;
- gboolean entire_word;
- guint flags = 0;
- gint count;
-
- active_view = gedit_window_get_active_view (window);
- if (active_view == NULL)
- return;
-
- doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view)));
-
- search_entry_text = gedit_search_dialog_get_search_text (dialog);
- g_return_if_fail ((search_entry_text) != NULL);
- g_return_if_fail ((*search_entry_text) != '\0');
-
- /* replace text may be "", we just delete all occurrencies */
- replace_entry_text = gedit_search_dialog_get_replace_text (dialog);
- g_return_if_fail ((replace_entry_text) != NULL);
-
- match_case = gedit_search_dialog_get_match_case (dialog);
- entire_word = gedit_search_dialog_get_entire_word (dialog);
-
- GEDIT_SEARCH_SET_CASE_SENSITIVE (flags, match_case);
- GEDIT_SEARCH_SET_ENTIRE_WORD (flags, entire_word);
-
- count = gedit_document_replace_all (doc,
- search_entry_text,
- replace_entry_text,
- flags);
-
- if (count > 0)
- {
- text_found (window, count);
- }
- else
- {
- text_not_found (window, search_entry_text);
- }
-
- gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
- GEDIT_SEARCH_DIALOG_REPLACE_RESPONSE,
- FALSE);
-}
-
-static void
-search_dialog_response_cb (GeditSearchDialog *dialog,
- gint response_id,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- switch (response_id)
- {
- case GEDIT_SEARCH_DIALOG_FIND_RESPONSE:
- do_find (dialog, window);
- break;
- case GEDIT_SEARCH_DIALOG_REPLACE_RESPONSE:
- do_replace (dialog, window);
- break;
- case GEDIT_SEARCH_DIALOG_REPLACE_ALL_RESPONSE:
- do_replace_all (dialog, window);
- break;
- default:
- last_search_data_store_position (dialog);
- gtk_widget_hide (GTK_WIDGET (dialog));
- }
-}
-
-static gboolean
-search_dialog_delete_event_cb (GtkWidget *widget,
- GdkEventAny *event,
- gpointer user_data)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- /* prevent destruction */
- return TRUE;
-}
-
-static void
-search_dialog_destroyed (GeditWindow *window,
- GeditSearchDialog *dialog)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_SEARCH_DIALOG_KEY,
- NULL);
- g_object_set_data (G_OBJECT (dialog),
- GEDIT_LAST_SEARCH_DATA_KEY,
- NULL);
-}
-
-static GtkWidget *
-create_dialog (GeditWindow *window, gboolean show_replace)
-{
- GtkWidget *dialog;
-
- dialog = gedit_search_dialog_new (GTK_WINDOW (window), show_replace);
-
- g_signal_connect (dialog,
- "response",
- G_CALLBACK (search_dialog_response_cb),
- window);
- g_signal_connect (dialog,
- "delete-event",
- G_CALLBACK (search_dialog_delete_event_cb),
- NULL);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_SEARCH_DIALOG_KEY,
- dialog);
-
- g_object_weak_ref (G_OBJECT (dialog),
- (GWeakNotify) search_dialog_destroyed,
- window);
-
- return dialog;
-}
-
-void
-_gedit_cmd_search_find (GtkAction *action,
- GeditWindow *window)
-{
- gpointer data;
- GtkWidget *search_dialog;
- GeditDocument *doc;
- gboolean selection_exists;
- gchar *find_text = NULL;
- gint sel_len;
-
- gedit_debug (DEBUG_COMMANDS);
-
- data = g_object_get_data (G_OBJECT (window), GEDIT_SEARCH_DIALOG_KEY);
-
- if (data == NULL)
- {
- search_dialog = create_dialog (window, FALSE);
- }
- else
- {
- g_return_if_fail (GEDIT_IS_SEARCH_DIALOG (data));
-
- search_dialog = GTK_WIDGET (data);
-
- /* turn the dialog into a find dialog if needed */
- if (gedit_search_dialog_get_show_replace (GEDIT_SEARCH_DIALOG (search_dialog)))
- gedit_search_dialog_set_show_replace (GEDIT_SEARCH_DIALOG (search_dialog),
- FALSE);
- }
-
- doc = gedit_window_get_active_document (window);
- g_return_if_fail (doc != NULL);
-
- selection_exists = get_selected_text (GTK_TEXT_BUFFER (doc),
- &find_text,
- &sel_len);
-
- if (selection_exists && find_text != NULL && sel_len < 80)
- {
- gedit_search_dialog_set_search_text (GEDIT_SEARCH_DIALOG (search_dialog),
- find_text);
- g_free (find_text);
- }
- else
- {
- g_free (find_text);
- }
-
- gtk_widget_show (search_dialog);
- last_search_data_restore_position (GEDIT_SEARCH_DIALOG (search_dialog));
- gedit_search_dialog_present_with_time (GEDIT_SEARCH_DIALOG (search_dialog),
- GDK_CURRENT_TIME);
-}
-
-void
-_gedit_cmd_search_replace (GtkAction *action,
- GeditWindow *window)
-{
- gpointer data;
- GtkWidget *replace_dialog;
- GeditDocument *doc;
- gboolean selection_exists;
- gchar *find_text = NULL;
- gint sel_len;
-
- gedit_debug (DEBUG_COMMANDS);
-
- data = g_object_get_data (G_OBJECT (window), GEDIT_SEARCH_DIALOG_KEY);
-
- if (data == NULL)
- {
- replace_dialog = create_dialog (window, TRUE);
- }
- else
- {
- g_return_if_fail (GEDIT_IS_SEARCH_DIALOG (data));
-
- replace_dialog = GTK_WIDGET (data);
-
- /* turn the dialog into a find dialog if needed */
- if (!gedit_search_dialog_get_show_replace (GEDIT_SEARCH_DIALOG (replace_dialog)))
- gedit_search_dialog_set_show_replace (GEDIT_SEARCH_DIALOG (replace_dialog),
- TRUE);
- }
-
- doc = gedit_window_get_active_document (window);
- g_return_if_fail (doc != NULL);
-
- selection_exists = get_selected_text (GTK_TEXT_BUFFER (doc),
- &find_text,
- &sel_len);
-
- if (selection_exists && find_text != NULL && sel_len < 80)
- {
- gedit_search_dialog_set_search_text (GEDIT_SEARCH_DIALOG (replace_dialog),
- find_text);
- g_free (find_text);
- }
- else
- {
- g_free (find_text);
- }
-
- gtk_widget_show (replace_dialog);
- last_search_data_restore_position (GEDIT_SEARCH_DIALOG (replace_dialog));
- gedit_search_dialog_present_with_time (GEDIT_SEARCH_DIALOG (replace_dialog),
- GDK_CURRENT_TIME);
-}
-
-static void
-do_find_again (GeditWindow *window,
- gboolean backward)
-{
- GeditView *active_view;
- gboolean wrap_around = TRUE;
- gpointer data;
-
- active_view = gedit_window_get_active_view (window);
- g_return_if_fail (active_view != NULL);
-
- data = g_object_get_data (G_OBJECT (window), GEDIT_SEARCH_DIALOG_KEY);
-
- if (data != NULL)
- wrap_around = gedit_search_dialog_get_wrap_around (GEDIT_SEARCH_DIALOG (data));
-
- run_search (active_view,
- wrap_around,
- backward);
-}
-
-void
-_gedit_cmd_search_find_next (GtkAction *action,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- do_find_again (window, FALSE);
-}
-
-void
-_gedit_cmd_search_find_prev (GtkAction *action,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- do_find_again (window, TRUE);
-}
-
-void
-_gedit_cmd_search_clear_highlight (GtkAction *action,
- GeditWindow *window)
-{
- GeditDocument *doc;
-
- gedit_debug (DEBUG_COMMANDS);
-
- doc = gedit_window_get_active_document (window);
- gedit_document_set_search_text (GEDIT_DOCUMENT (doc),
- "",
- GEDIT_SEARCH_DONT_SET_FLAGS);
-}
-
-void
-_gedit_cmd_search_goto_line (GtkAction *action,
- GeditWindow *window)
-{
- GeditView *active_view;
-
- gedit_debug (DEBUG_COMMANDS);
-
- active_view = gedit_window_get_active_view (window);
- if (active_view == NULL)
- return;
-
- /* Focus the view if needed: we need to focus the view otherwise
- activating the binding for goto line has no effect */
- gtk_widget_grab_focus (GTK_WIDGET (active_view));
-
-
- /* goto line is builtin in GeditView, just activate
- * the corrisponding binding.
- */
- gtk_bindings_activate (GTK_OBJECT (active_view),
- GDK_i,
- GDK_CONTROL_MASK);
-}
-
-void
-_gedit_cmd_search_incremental_search (GtkAction *action,
- GeditWindow *window)
-{
- GeditView *active_view;
-
- gedit_debug (DEBUG_COMMANDS);
-
- active_view = gedit_window_get_active_view (window);
- if (active_view == NULL)
- return;
-
- /* Focus the view if needed: we need to focus the view otherwise
- activating the binding for incremental search has no effect */
- gtk_widget_grab_focus (GTK_WIDGET (active_view));
-
- /* incremental search is builtin in GeditView, just activate
- * the corrisponding binding.
- */
- gtk_bindings_activate (GTK_OBJECT (active_view),
- GDK_k,
- GDK_CONTROL_MASK);
-}