Index: gedit-view.c =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-view.c,v retrieving revision 1.59.2.17 diff -u -p -r1.59.2.17 gedit-view.c --- gedit-view.c 27 Nov 2005 20:35:16 -0000 1.59.2.17 +++ gedit-view.c 30 Nov 2005 17:19:07 -0000 @@ -68,13 +68,23 @@ struct _GeditViewPrivate SearchMode search_mode; GtkTextIter start_search_iter; + + /* used to restore the search state if an + * incremental search is cancelled + */ gchar *old_search_text; - + guint old_search_flags; + + /* used to remeber the state of the last + * incremental search (the document search + * state may be changed by the search dialog) + */ + guint search_flags; + gboolean wrap_around; + GtkWidget *search_window; GtkWidget *search_entry; - gboolean wrap_around; - guint typeselect_flush_timeout; guint search_entry_changed_id; @@ -815,7 +825,6 @@ set_entry_background (GtkWidget static gboolean run_search (GeditView *view, - const gchar *entry_text, gboolean search_backward, gboolean wrap_around, gboolean typing) @@ -832,70 +841,61 @@ run_search (GeditView *view, start_iter = view->priv->start_search_iter; - if (*entry_text != '\0') - { - if (!search_backward) + if (!search_backward) + { + if (!typing) { - if (!typing) - { - /* forward and _NOT_ typing */ - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - &start_iter, - &match_end); - - gtk_text_iter_order (&match_end, &start_iter); - } + /* forward and _NOT_ typing */ + gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), + &start_iter, + &match_end); + + gtk_text_iter_order (&match_end, &start_iter); + } + + /* run search */ + found = gedit_document_search_forward (doc, + &start_iter, + NULL, + &match_start, + &match_end); + } + else if (!typing) + { + /* backward and not typing */ + gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), + &start_iter, + &match_end); - /* run search */ + /* run search */ + found = gedit_document_search_backward (doc, + NULL, + &start_iter, + &match_start, + &match_end); + } + else + { + /* backward (while typing) */ + g_return_val_if_reached (FALSE); + + } + + if (!found && wrap_around) + { + if (!search_backward) found = gedit_document_search_forward (doc, - &start_iter, NULL, + NULL, /* FIXME: set the end_inter */ &match_start, &match_end); - } - else if (!typing) - { - /* backward and not typing */ - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - &start_iter, - &match_end); - - /* run search */ + else found = gedit_document_search_backward (doc, - NULL, - &start_iter, + NULL, /* FIXME: set the start_inter */ + NULL, &match_start, &match_end); - } - else - { - /* backward (while typing) */ - g_return_val_if_reached (FALSE); - - } - - if (!found && wrap_around) - { - if (!search_backward) - 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); - } } - else - { - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - &start_iter, - NULL); - } if (found) { @@ -913,8 +913,8 @@ run_search (GeditView *view, &view->priv->start_search_iter); } } - - if (found || (*entry_text == '\0')) + + if (found) { gedit_view_scroll_to_cursor (view); @@ -1066,7 +1066,6 @@ search_again (GeditView *view, add_search_completion_entry (entry_text); run_search (view, - entry_text, search_backward, view->priv->wrap_around, FALSE); @@ -1111,11 +1110,12 @@ search_window_key_press_event (GtkWidget if (view->priv->search_mode == SEARCH) { GeditDocument *doc; - + + /* restore document search so that Find Next does the right thing */ doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); gedit_document_set_search_text (doc, view->priv->old_search_text, - GEDIT_SEARCH_DONT_SET_FLAGS); + view->priv->old_search_flags); } @@ -1177,40 +1177,16 @@ static void match_entire_word_menu_item_toggled (GtkCheckMenuItem *checkmenuitem, GeditView *view) { - GeditDocument *doc; - gchar *search_text; - guint flags; - - doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - - search_text = gedit_document_get_search_text (doc, - &flags); - g_free (search_text); - - GEDIT_SEARCH_SET_ENTIRE_WORD (flags, + GEDIT_SEARCH_SET_ENTIRE_WORD (view->priv->search_flags, gtk_check_menu_item_get_active (checkmenuitem)); - - gedit_document_set_search_text (doc, NULL, flags); } static void match_case_menu_item_toggled (GtkCheckMenuItem *checkmenuitem, GeditView *view) { - GeditDocument *doc; - gchar *search_text; - guint flags; - - doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - - search_text = gedit_document_get_search_text (doc, - &flags); - g_free (search_text); - - GEDIT_SEARCH_SET_CASE_SENSITIVE (flags, + GEDIT_SEARCH_SET_CASE_SENSITIVE (view->priv->search_flags, gtk_check_menu_item_get_active (checkmenuitem)); - - gedit_document_set_search_text (doc, NULL, flags); } static gboolean @@ -1249,9 +1225,7 @@ search_entry_populate_popup (GtkEntry * GeditView *view) { GtkWidget *menu_item; - guint flags; - gchar *search_text; - + view->priv->disable_popdown = TRUE; g_signal_connect (menu, "hide", G_CALLBACK (search_enable_popdown), view); @@ -1259,10 +1233,6 @@ search_entry_populate_popup (GtkEntry * if (view->priv->search_mode == GOTO_LINE) return; - search_text = gedit_document_get_search_text (GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))), - &flags); - g_free (search_text); - /* separator */ menu_item = gtk_menu_item_new (); gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); @@ -1277,7 +1247,7 @@ search_entry_populate_popup (GtkEntry * gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), view->priv->wrap_around); gtk_widget_show (menu_item); - + /* create "Match Entire Word Only" menu item. */ menu_item = gtk_check_menu_item_new_with_mnemonic (_("Match _Entire Word Only")); g_signal_connect (G_OBJECT (menu_item), "toggled", @@ -1285,7 +1255,7 @@ search_entry_populate_popup (GtkEntry * view); gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - GEDIT_SEARCH_IS_ENTIRE_WORD (flags)); + GEDIT_SEARCH_IS_ENTIRE_WORD (view->priv->search_flags)); gtk_widget_show (menu_item); /* create "Match Case" menu item. */ @@ -1295,7 +1265,7 @@ search_entry_populate_popup (GtkEntry * view); gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - GEDIT_SEARCH_IS_CASE_SENSITIVE(flags)); + GEDIT_SEARCH_IS_CASE_SENSITIVE (view->priv->search_flags)); gtk_widget_show (menu_item); } @@ -1530,7 +1500,6 @@ get_selected_text (GtkTextBuffer *doc, g return TRUE; } - static void init_search_entry (GeditView *view) { @@ -1559,19 +1528,25 @@ init_search_entry (GeditView *view) /* SEARCH mode */ gboolean selection_exists; gchar *find_text = NULL; - gchar *old_find_text; + gchar *old_find_text; + guint old_find_flags = 0; gint sel_len = 0; - + g_free (view->priv->old_search_text); - + old_find_text = gedit_document_get_search_text (GEDIT_DOCUMENT (buffer), - NULL); + &old_find_flags); if (old_find_text != NULL) { view->priv->old_search_text = old_find_text; add_search_completion_entry (old_find_text); } - + + if (old_find_flags != 0) + { + view->priv->old_search_flags = old_find_flags; + } + selection_exists = get_selected_text (buffer, &find_text, &sel_len); @@ -1592,11 +1567,12 @@ init_search_entry (GeditView *view) } static void -search_init (GtkWidget *entry, GeditView *view) +search_init (GtkWidget *entry, + GeditView *view) { GeditDocument *doc; - const gchar *entry_text; - + const gchar *entry_text; + /* renew the flush timeout */ if (view->priv->typeselect_flush_timeout != 0) { @@ -1606,50 +1582,55 @@ search_init (GtkWidget *entry, GeditView (GSourceFunc)search_entry_flush_timeout, view); } - + doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - + entry_text = gtk_entry_get_text (GTK_ENTRY (entry)); - + + if (*entry_text == '\0') + { + set_entry_background (entry, GEDIT_SEARCH_ENTRY_NORMAL); + return; + } + if (view->priv->search_mode == SEARCH) { gchar *search_text; - - search_text = gedit_document_get_search_text (doc, NULL); - - if ((search_text == NULL) || (strcmp (search_text, entry_text) != 0)) + guint search_flags; + + search_text = gedit_document_get_search_text (doc, &search_flags); + + if ((search_text == NULL) || + (strcmp (search_text, entry_text) != 0) || + search_flags != view->priv->search_flags) { gedit_document_set_search_text (doc, entry_text, - GEDIT_SEARCH_DONT_SET_FLAGS); + view->priv->search_flags); } - + g_free (search_text); - + run_search (view, - entry_text, FALSE, view->priv->wrap_around, TRUE); } else { - if (*entry_text != '\0') - { - gboolean moved; - gint line; + gboolean moved; + gint line; - line = MAX (atoi (entry_text) - 1, 0); - moved = gedit_document_goto_line (doc, line); - gedit_view_scroll_to_cursor (view); - - if (!moved) - set_entry_background (view->priv->search_entry, - GEDIT_SEARCH_ENTRY_NOT_FOUND); - else - set_entry_background (view->priv->search_entry, - GEDIT_SEARCH_ENTRY_NORMAL); - } + line = MAX (atoi (entry_text) - 1, 0); + moved = gedit_document_goto_line (doc, line); + gedit_view_scroll_to_cursor (view); + + if (!moved) + set_entry_background (view->priv->search_entry, + GEDIT_SEARCH_ENTRY_NOT_FOUND); + else + set_entry_background (view->priv->search_entry, + GEDIT_SEARCH_ENTRY_NORMAL); } }