SF.net SVN: geany: [698] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Fri Aug 11 21:13:00 UTC 2006
Revision: 698
Author: ntrel
Date: 2006-08-11 14:12:49 -0700 (Fri, 11 Aug 2006)
ViewCVS: http://svn.sourceforge.net/geany/?rev=698&view=rev
Log Message:
-----------
Group search related code
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/callbacks.c
trunk/src/callbacks.h
trunk/src/dialogs.c
trunk/src/dialogs.h
trunk/src/geany.h
trunk/src/keybindings.c
trunk/src/main.c
trunk/src/search.c
trunk/src/search.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/ChangeLog 2006-08-11 21:12:49 UTC (rev 698)
@@ -1,3 +1,10 @@
+2006-08-11 Nick Treleaven <nick.treleaven at btinternet.com>
+
+ * src/keybindings.c, src/geany.h, src/callbacks.c, src/callbacks.h,
+ src/search.c, src/search.h, src/dialogs.c, src/main.c,
+ src/dialogs.h: Group search related code.
+
+
2006-08-11 Enrico Tröger <enrico.troeger at uvena.de>
* src/document.c:
Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/callbacks.c 2006-08-11 21:12:49 UTC (rev 698)
@@ -74,10 +74,6 @@
// the selection-changed signal from tv.tree_openfiles
//static gboolean switch_tv_notebook_page = FALSE;
-// the flags given in the search dialog(stored statically for "find next" and "replace")
-static gint search_flags;
-static gboolean search_backwards;
-
// holds the current position where the mouse pointer is when the popup menu for the scintilla
// scintilla widget is shown
static gint clickpos;
@@ -121,7 +117,7 @@
g_free(app->configdir);
g_free(app->datadir);
g_free(app->docdir);
- g_free(app->search_text);
+ g_free(search_data.text);
g_free(app->editor_font);
g_free(app->tagbar_font);
g_free(app->msgwin_font);
@@ -141,8 +137,6 @@
g_queue_free(app->recent_queue);
if (app->prefs_dialog && GTK_IS_WIDGET(app->prefs_dialog)) gtk_widget_destroy(app->prefs_dialog);
- if (app->find_dialog && GTK_IS_WIDGET(app->find_dialog)) gtk_widget_destroy(app->find_dialog);
- if (app->replace_dialog && GTK_IS_WIDGET(app->replace_dialog)) gtk_widget_destroy(app->replace_dialog);
if (app->save_filesel && GTK_IS_WIDGET(app->save_filesel)) gtk_widget_destroy(app->save_filesel);
if (app->open_filesel && GTK_IS_WIDGET(app->open_filesel)) gtk_widget_destroy(app->open_filesel);
if (app->open_fontsel && GTK_IS_WIDGET(app->open_fontsel)) gtk_widget_destroy(app->open_fontsel);
@@ -152,6 +146,7 @@
g_object_unref(app->default_tag_tree);
gtk_widget_destroy(app->default_tag_tree);
}
+ search_finalise();
scintilla_release_resources();
#ifdef HAVE_VTE
if (app->have_vte) vte_close();
@@ -589,11 +584,11 @@
static void setup_find_next(GtkEditable *editable)
{
- g_free(app->search_text);
- app->search_text = g_strdup(gtk_editable_get_chars(editable, 0, -1));
+ g_free(search_data.text);
+ search_data.text = g_strdup(gtk_editable_get_chars(editable, 0, -1));
// clear search flags so can later use Search->Find Next/Previous
- search_flags = 0;
- search_backwards = FALSE;
+ search_data.flags = 0;
+ search_data.backwards = FALSE;
}
@@ -605,7 +600,7 @@
gint idx = document_get_cur_idx();
setup_find_next(GTK_EDITABLE(entry));
- document_find_next(idx, app->search_text, 0, FALSE, FALSE);
+ document_find_next(idx, search_data.text, 0, FALSE, FALSE);
}
@@ -617,7 +612,7 @@
gint idx = document_get_cur_idx();
setup_find_next(editable);
- document_find_next(idx, app->search_text, 0, FALSE, TRUE);
+ document_find_next(idx, search_data.text, 0, FALSE, TRUE);
}
@@ -631,7 +626,7 @@
GtkWidget *entry = lookup_widget(GTK_WIDGET(app->window), "entry1");
setup_find_next(GTK_EDITABLE(entry));
- document_find_next(idx, app->search_text, 0, TRUE, FALSE);
+ document_find_next(idx, search_data.text, 0, TRUE, FALSE);
}
@@ -1796,27 +1791,19 @@
on_find1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
- dialogs_show_find();
+ search_show_find_dialog();
}
void
-on_replace1_activate (GtkMenuItem *menuitem,
- gpointer user_data)
-{
- dialogs_show_replace();
-}
-
-
-void
on_find_next1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
gint idx = document_get_cur_idx();
- if (app->search_text)
+ if (search_data.text)
{
- document_find_text(idx, app->search_text, search_flags, search_backwards);
+ document_find_text(idx, search_data.text, search_data.flags, search_data.backwards);
}
}
@@ -1827,258 +1814,34 @@
{
gint idx = document_get_cur_idx();
- if (app->search_text == NULL) return;
+ if (search_data.text == NULL) return;
- if (search_flags & SCFIND_REGEXP)
+ if (search_data.flags & SCFIND_REGEXP)
utils_beep(); //Can't reverse search order for a regex (find next ignores search backwards)
else
{
- document_find_text(idx, app->search_text, search_flags,
- !search_backwards);
+ document_find_text(idx, search_data.text, search_data.flags, !search_data.backwards);
}
}
-void on_find_replace_checkbutton_toggled (GtkToggleButton *togglebutton,
- gpointer user_data)
-{
- GtkWidget *dialog = GTK_WIDGET(user_data);
- GtkToggleButton *chk_regexp = GTK_TOGGLE_BUTTON(
- lookup_widget(dialog, "check_regexp"));
-
- if (togglebutton == chk_regexp)
- {
- gboolean regex_set = gtk_toggle_button_get_active(chk_regexp);
- GtkWidget *check_back = lookup_widget(dialog, "check_back");
- GtkWidget *check_word = lookup_widget(dialog, "check_word");
- GtkWidget *check_wordstart = lookup_widget(dialog, "check_wordstart");
-
- gtk_widget_set_sensitive(check_back, ! regex_set);
- gtk_widget_set_sensitive(check_word, ! regex_set);
- gtk_widget_set_sensitive(check_wordstart, ! regex_set);
- }
-}
-
-
void
-on_find_dialog_response (GtkDialog *dialog,
- gint response,
- gpointer user_data)
-{
- if (response == GTK_RESPONSE_ACCEPT)
- {
- gint idx = document_get_cur_idx();
- gboolean search_replace_escape;
- gboolean
- fl1 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->find_dialog), "check_case"))),
- fl2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->find_dialog), "check_word"))),
- fl3 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->find_dialog), "check_regexp"))),
- fl4 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->find_dialog), "check_wordstart")));
- search_replace_escape = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->find_dialog), "check_escape")));
- search_backwards = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->find_dialog), "check_back")));
-
- g_free(app->search_text);
- app->search_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data)))));
- if (strlen(app->search_text) == 0 ||
- (search_replace_escape && ! utils_str_replace_escape(app->search_text)))
- {
- utils_beep();
- gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->find_dialog, "entry"))->child));
- return;
- }
-
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), app->search_text);
- search_flags = (fl1 ? SCFIND_MATCHCASE : 0) |
- (fl2 ? SCFIND_WHOLEWORD : 0) |
- (fl3 ? SCFIND_REGEXP | SCFIND_POSIX: 0) |
- (fl4 ? SCFIND_WORDSTART : 0);
- document_find_text(idx, app->search_text, search_flags, search_backwards);
- }
- else gtk_widget_hide(app->find_dialog);
-}
-
-
-void
-on_find_entry_activate (GtkEntry *entry,
+on_replace1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
- on_find_dialog_response(NULL, GTK_RESPONSE_ACCEPT,
- lookup_widget(GTK_WIDGET(entry), "entry"));
+ search_show_replace_dialog();
}
void
-on_replace_dialog_response (GtkDialog *dialog,
- gint response,
- gpointer user_data)
-{
- gint idx = document_get_cur_idx();
- GtkWidget *entry_find = lookup_widget(GTK_WIDGET(app->replace_dialog), "entry_find");
- GtkWidget *entry_replace = lookup_widget(GTK_WIDGET(app->replace_dialog), "entry_replace");
- gint search_flags_re;
- gboolean search_backwards_re, search_replace_escape_re, search_in_all_buffers_re;
- gboolean fl1, fl2, fl3, fl4;
- gchar *find, *replace;
-
- if (response == GTK_RESPONSE_CANCEL)
- {
- gtk_widget_hide(app->replace_dialog);
- return;
- }
-
- fl1 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->replace_dialog), "check_case")));
- fl2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->replace_dialog), "check_word")));
- fl3 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->replace_dialog), "check_regexp")));
- fl4 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->replace_dialog), "check_wordstart")));
- search_backwards_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->replace_dialog), "check_back")));
- search_replace_escape_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->replace_dialog), "check_escape")));
- search_in_all_buffers_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(GTK_WIDGET(app->replace_dialog), "check_all_buffers")));
- find = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find)))));
- replace = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace)))));
-
- if ((response != GEANY_RESPONSE_FIND) && (! fl1) && (strcasecmp(find, replace) == 0))
- {
- utils_beep();
- gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->replace_dialog, "entry_find"))->child));
- return;
- }
-
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_find), find);
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_replace), replace);
-
- if (search_replace_escape_re &&
- (! utils_str_replace_escape(find) || ! utils_str_replace_escape(replace)))
- {
- utils_beep();
- gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->replace_dialog, "entry_find"))->child));
- return;
- }
-
- search_flags_re = (fl1 ? SCFIND_MATCHCASE : 0) |
- (fl2 ? SCFIND_WHOLEWORD : 0) |
- (fl3 ? SCFIND_REGEXP | SCFIND_POSIX : 0) |
- (fl4 ? SCFIND_WORDSTART : 0);
-
- if (search_in_all_buffers_re && response == GEANY_RESPONSE_REPLACE_ALL)
- {
- gint i;
- for (i = 0; i < GEANY_MAX_OPEN_FILES; i++)
- {
- if (! doc_list[i].is_valid) continue;
-
- document_replace_all(i, find, replace, search_flags_re);
- }
- gtk_widget_hide(app->replace_dialog);
- }
- else
- {
- switch (response)
- {
- case GEANY_RESPONSE_REPLACE:
- {
- document_replace_text(idx, find, replace, search_flags_re,
- search_backwards_re);
- break;
- }
- case GEANY_RESPONSE_FIND:
- {
- document_find_text(idx, find, search_flags_re, search_backwards_re);
- break;
- }
- case GEANY_RESPONSE_REPLACE_ALL:
- {
- document_replace_all(idx, find, replace, search_flags_re);
- gtk_widget_hide(app->replace_dialog);
- break;
- }
- case GEANY_RESPONSE_REPLACE_SEL:
- {
- document_replace_sel(idx, find, replace, search_flags_re);
- gtk_widget_hide(app->replace_dialog);
- break;
- }
- }
- }
- g_free(find);
- g_free(replace);
-}
-
-
-void
-on_replace_entry_activate (GtkEntry *entry,
- gpointer user_data)
-{
- on_replace_dialog_response(NULL, GEANY_RESPONSE_REPLACE, NULL);
-}
-
-
-void
on_find_in_files1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
- dialogs_show_find_in_files();
+ search_show_find_in_files_dialog();
}
void
-on_find_in_files_dialog_response (GtkDialog *dialog,
- gint response,
- gpointer user_data)
-{
- if (response == GTK_RESPONSE_ACCEPT)
- {
- const gchar *search_text =
- gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data))));
- const gchar *utf8_dir =
- gtk_entry_get_text(GTK_ENTRY(lookup_widget(app->find_in_files_dialog, "entry_dir")));
-
- if (utf8_dir == NULL || utils_strcmp(utf8_dir, ""))
- msgwin_status_add(_("Invalid directory for find in files."));
- else if (search_text && *search_text)
- {
- gchar *locale_dir;
- gboolean eregexp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(app->find_in_files_dialog, "check_eregexp")));
- gboolean invert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(app->find_in_files_dialog, "check_invert")));
- gboolean case_sens = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
- lookup_widget(app->find_in_files_dialog, "check_case")));
- gint opts = (eregexp ? FIF_USE_EREGEXP : 0) |
- (invert ? FIF_INVERT_MATCH : 0) |
- (case_sens ? FIF_CASE_SENSITIVE : 0);
-
- locale_dir = g_locale_from_utf8(utf8_dir, -1, NULL, NULL, NULL);
- if (locale_dir == NULL) locale_dir = g_strdup(utf8_dir);
-
- if (search_find_in_files(search_text, locale_dir, opts))
- {
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), search_text);
- gtk_widget_hide(app->find_in_files_dialog);
- }
- g_free(locale_dir);
- }
- else
- msgwin_status_add(_("No text to find."));
- }
- else
- gtk_widget_hide(app->find_in_files_dialog);
-}
-
-
-void
on_toolbutton_new_clicked (GtkToolButton *toolbutton,
gpointer user_data)
{
Modified: trunk/src/callbacks.h
===================================================================
--- trunk/src/callbacks.h 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/callbacks.h 2006-08-11 21:12:49 UTC (rev 698)
@@ -20,14 +20,6 @@
* $Id$
*/
-enum {
- GEANY_RESPONSE_REPLACE = 1,
- GEANY_RESPONSE_REPLACE_ALL,
- GEANY_RESPONSE_REPLACE_SEL,
- GEANY_RESPONSE_FIND
-};
-
-
extern gchar current_word[]; //needed for popup menu keybindings access
void
@@ -386,37 +378,15 @@
on_find_previous1_activate (GtkMenuItem *menuitem,
gpointer user_data);
-void on_find_replace_checkbutton_toggled (GtkToggleButton *togglebutton,
- gpointer user_data);
-
void
-on_find_dialog_response (GtkDialog *dialog,
- gint response,
- gpointer user_data);
-
-void
-on_find_entry_activate (GtkEntry *entry,
+on_replace1_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
-on_replace_dialog_response (GtkDialog *dialog,
- gint response,
- gpointer user_data);
-
-void
-on_replace_entry_activate (GtkEntry *entry,
- gpointer user_data);
-
-void
on_find_in_files1_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
-on_find_in_files_dialog_response (GtkDialog *dialog,
- gint response,
- gpointer user_data);
-
-void
on_new_with_template (GtkMenuItem *menuitem,
gpointer user_data);
@@ -522,10 +492,6 @@
gpointer user_data);
void
-on_replace1_activate (GtkMenuItem *menuitem,
- gpointer user_data);
-
-void
on_tv_notebook_switch_page (GtkNotebook *notebook,
GtkNotebookPage *page,
guint page_num,
Modified: trunk/src/dialogs.c
===================================================================
--- trunk/src/dialogs.c 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/dialogs.c 2006-08-11 21:12:49 UTC (rev 698)
@@ -46,9 +46,6 @@
#include "keybindings.h"
-static void dialogs_add_find_checkboxes(GtkDialog *dialog);
-
-
/* This shows the file selection dialog to open a file. */
void dialogs_show_open_file ()
{
@@ -761,354 +758,6 @@
}
-static void dialogs_add_find_checkboxes(GtkDialog *dialog)
-{
- GtkWidget *checkbox1, *checkbox2, *check_regexp, *checkbox4, *checkbox5,
- *checkbox7, *hbox, *lbox, *rbox;
- GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
-
- checkbox1 = gtk_check_button_new_with_mnemonic(_("_Case sensitive"));
- g_object_set_data_full(G_OBJECT(dialog), "check_case",
- gtk_widget_ref(checkbox1), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox1), FALSE);
-
- checkbox2 = gtk_check_button_new_with_mnemonic(_("Match only a _whole word"));
- g_object_set_data_full(G_OBJECT(dialog), "check_word",
- gtk_widget_ref(checkbox2), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox2), FALSE);
-
- checkbox5 = gtk_check_button_new_with_mnemonic(_("Match only word s_tart"));
- g_object_set_data_full(G_OBJECT(dialog), "check_wordstart",
- gtk_widget_ref(checkbox5), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox5), FALSE);
-
- lbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(lbox), checkbox1);
- gtk_container_add(GTK_CONTAINER(lbox), checkbox2);
- gtk_container_add(GTK_CONTAINER(lbox), checkbox5);
-
- check_regexp = gtk_check_button_new_with_mnemonic(_("_Use regular expressions"));
- g_object_set_data_full(G_OBJECT(dialog), "check_regexp",
- gtk_widget_ref(check_regexp), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(check_regexp), FALSE);
- gtk_tooltips_set_tip(tooltips, check_regexp, _("Use POSIX-like regular expressions. "
- "For detailed information about using regular expressions, please read the documentation."), NULL);
- g_signal_connect(G_OBJECT(check_regexp), "toggled",
- G_CALLBACK(on_find_replace_checkbutton_toggled), GTK_WIDGET(dialog));
-
- checkbox4 = gtk_check_button_new_with_mnemonic(_("_Search backwards"));
- g_object_set_data_full(G_OBJECT(dialog), "check_back",
- gtk_widget_ref(checkbox4), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox4), FALSE);
-
- checkbox7 = gtk_check_button_new_with_mnemonic(_("_Replace control characters"));
- g_object_set_data_full(G_OBJECT(dialog), "check_escape",
- gtk_widget_ref(checkbox7), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox7), FALSE);
- gtk_tooltips_set_tip(tooltips, checkbox7,
- _("Replace \\\\, \\t, \\n, \\r and \\uXXXX (Unicode chararacters) with the "
- "corresponding control characters."), NULL);
-
- rbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(rbox), check_regexp);
- gtk_container_add(GTK_CONTAINER(rbox), checkbox7);
- gtk_container_add(GTK_CONTAINER(rbox), checkbox4);
-
- hbox = gtk_hbox_new(FALSE, 6);
- gtk_container_add(GTK_CONTAINER(hbox), lbox);
- gtk_container_add(GTK_CONTAINER(hbox), rbox);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 6);
-}
-
-
-void dialogs_show_find(void)
-{
- gint idx = document_get_cur_idx();
- gchar *sel = NULL;
-
- if (idx == -1 || ! doc_list[idx].is_valid) return;
-
- if (sci_get_lines_selected(doc_list[idx].sci) == 1)
- {
- sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci));
- sci_get_selected_text(doc_list[idx].sci, sel);
- }
-
- if (app->find_dialog == NULL)
- {
- GtkWidget *label, *entry, *vbox;
-
- app->find_dialog = gtk_dialog_new_with_buttons(_("Find"),
- GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL,
- GTK_STOCK_FIND, GTK_RESPONSE_ACCEPT, NULL);
-
- label = gtk_label_new(_("Enter the search text here:"));
- gtk_misc_set_padding(GTK_MISC(label), 0, 6);
- gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-
- entry = gtk_combo_box_entry_new_text();
- gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))), 248);
- gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))), 50);
- if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(entry)->child), sel);
- g_object_set_data_full(G_OBJECT(app->find_dialog), "entry",
- gtk_widget_ref(entry), (GDestroyNotify)gtk_widget_unref);
-
- g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry)), "activate",
- G_CALLBACK(on_find_entry_activate), NULL);
- g_signal_connect((gpointer) app->find_dialog, "response",
- G_CALLBACK(on_find_dialog_response), entry);
- g_signal_connect((gpointer) app->find_dialog, "delete_event",
- G_CALLBACK(gtk_widget_hide), NULL);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(vbox), label);
- gtk_container_add(GTK_CONTAINER(vbox), entry);
- gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), vbox);
-
- dialogs_add_find_checkboxes(GTK_DIALOG(app->find_dialog));
-
- gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(app->find_dialog)->vbox), 3);
-
- gtk_widget_show_all(app->find_dialog);
- }
- else
- {
- if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(
- lookup_widget(app->find_dialog, "entry"))->child), sel);
- gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->find_dialog, "entry"))->child));
- gtk_widget_show(app->find_dialog);
- }
- g_free(sel);
-}
-
-
-void dialogs_show_replace(void)
-{
- gint idx = document_get_cur_idx();
- gchar *sel = NULL;
-
- if (idx == -1 || ! doc_list[idx].is_valid) return;
-
- if (sci_get_lines_selected(doc_list[idx].sci) == 1)
- {
- sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci));
- sci_get_selected_text(doc_list[idx].sci, sel);
- }
-
- if (app->replace_dialog == NULL)
- {
- GtkWidget *label_find, *label_replace, *entry_find, *entry_replace,
- *checkbox6, *button, *align, *rbox, *fbox;
- GtkSizeGroup *size_group;
- GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
-
- app->replace_dialog = gtk_dialog_new_with_buttons(_("Replace"),
- GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, NULL);
-
- button = gtk_button_new_with_mnemonic(_("_In Selection"));
- gtk_tooltips_set_tip(tooltips, button,
- _("Replace all matches found in the currently selected text"), NULL);
- gtk_widget_show(button);
- gtk_dialog_add_action_widget(GTK_DIALOG(app->replace_dialog), button,
- GEANY_RESPONSE_REPLACE_SEL);
- button = gtk_button_new_with_mnemonic(_("Replace _All"));
- gtk_widget_show(button);
- gtk_dialog_add_action_widget(GTK_DIALOG(app->replace_dialog), button,
- GEANY_RESPONSE_REPLACE_ALL);
- button = gtk_button_new_from_stock(GTK_STOCK_FIND);
- gtk_widget_show(button);
- gtk_dialog_add_action_widget(GTK_DIALOG(app->replace_dialog), button,
- GEANY_RESPONSE_FIND);
- button = gtk_button_new_with_mnemonic(_("_Replace"));
- gtk_widget_show(button);
- gtk_dialog_add_action_widget(GTK_DIALOG(app->replace_dialog), button,
- GEANY_RESPONSE_REPLACE);
-
- label_find = gtk_label_new(_("Enter the search text here:"));
- gtk_misc_set_alignment(GTK_MISC(label_find), 0, 0.5);
-
- label_replace = gtk_label_new(_("Enter the replace text here:"));
- gtk_misc_set_alignment(GTK_MISC(label_replace), 0, 0.5);
-
- entry_find = gtk_combo_box_entry_new_text();
- gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find))), 248);
- gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find))), 50);
- if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(entry_find)->child), sel);
- g_object_set_data_full(G_OBJECT(app->replace_dialog), "entry_find",
- gtk_widget_ref(entry_find), (GDestroyNotify)gtk_widget_unref);
-
- entry_replace = gtk_combo_box_entry_new_text();
- gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace))), 248);
- gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace))), 50);
- g_object_set_data_full(G_OBJECT(app->replace_dialog), "entry_replace",
- gtk_widget_ref(entry_replace), (GDestroyNotify)gtk_widget_unref);
-
- g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry_replace)), "activate",
- G_CALLBACK(on_replace_entry_activate), NULL);
- g_signal_connect((gpointer) app->replace_dialog, "response",
- G_CALLBACK(on_replace_dialog_response), entry_replace);
- g_signal_connect((gpointer) app->replace_dialog, "delete_event",
- G_CALLBACK(gtk_widget_hide), NULL);
-
- fbox = gtk_hbox_new(FALSE, 6);
- gtk_container_add(GTK_CONTAINER(fbox), label_find);
- gtk_container_add(GTK_CONTAINER(fbox), entry_find);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(app->replace_dialog)->vbox), fbox,
- FALSE, FALSE, 6);
-
- rbox = gtk_hbox_new(FALSE, 6);
- gtk_container_add(GTK_CONTAINER(rbox), label_replace);
- gtk_container_add(GTK_CONTAINER(rbox), entry_replace);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(app->replace_dialog)->vbox), rbox,
- FALSE, FALSE, 3);
-
- size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
- gtk_size_group_add_widget(size_group, label_find);
- gtk_size_group_add_widget(size_group, label_replace);
-
- dialogs_add_find_checkboxes(GTK_DIALOG(app->replace_dialog));
-
- checkbox6 = gtk_check_button_new_with_mnemonic(_("Replace in all _open files"));
- g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_all_buffers",
- gtk_widget_ref(checkbox6), (GDestroyNotify)gtk_widget_unref);
- gtk_tooltips_set_tip(tooltips, checkbox6,
- _("Replaces the search text in all opened files. This option is only useful(and used) if you click on \"Replace All\"."), NULL);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox6), FALSE);
-
- align = gtk_alignment_new(0, 0, 1, 1);
- gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 9, 0, 0);
- gtk_container_add(GTK_CONTAINER(align), checkbox6);
- gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), align);
-
- gtk_widget_show_all(app->replace_dialog);
- }
- else
- {
- if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(
- lookup_widget(app->replace_dialog, "entry_find"))->child), sel);
- gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->replace_dialog, "entry_find"))->child));
- gtk_widget_show(app->replace_dialog);
- }
- g_free(sel);
-}
-
-
-void dialogs_show_find_in_files(void)
-{
- static GtkWidget *combo = NULL;
- static GtkWidget *entry1;
- GtkWidget *entry2; // the child GtkEntry of combo
- gint idx = document_get_cur_idx();
- gchar *sel = NULL;
- gchar *cur_dir;
-
- if (idx == -1 || ! doc_list[idx].is_valid) return;
-
- cur_dir = utils_get_current_file_dir();
-
- if (app->find_in_files_dialog == NULL)
- {
- GtkWidget *label, *label1, *checkbox1, *checkbox2, *checkbox3, *vbox2, *vbox1;
- GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
-
- app->find_in_files_dialog = gtk_dialog_new_with_buttons(
- _("Find in files"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
-
- gtk_dialog_add_button(GTK_DIALOG(app->find_in_files_dialog), "gtk-find", GTK_RESPONSE_ACCEPT);
- gtk_dialog_set_default_response(GTK_DIALOG(app->find_in_files_dialog),
- GTK_RESPONSE_ACCEPT);
-
- label1 = gtk_label_new("Directory to be searched:");
- gtk_misc_set_alignment(GTK_MISC(label1), 0, 0);
-
- entry1 = gtk_entry_new();
- gtk_entry_set_max_length(GTK_ENTRY(entry1), 248);
- gtk_entry_set_width_chars(GTK_ENTRY(entry1), 50);
- g_object_set_data_full(G_OBJECT(app->find_in_files_dialog), "entry_dir",
- gtk_widget_ref(entry1), (GDestroyNotify)gtk_widget_unref);
-
- vbox1 = gtk_vbox_new(FALSE, 5);
- gtk_box_pack_start(GTK_BOX(vbox1), label1, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox1), entry1, FALSE, FALSE, 0);
-
- label = gtk_label_new(_("Enter the search text here:"));
- gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-
- combo = gtk_combo_box_entry_new_text();
- entry2 = gtk_bin_get_child(GTK_BIN(combo));
- gtk_entry_set_max_length(GTK_ENTRY(entry2), 248);
- gtk_entry_set_width_chars(GTK_ENTRY(entry2), 50);
- gtk_entry_set_activates_default(GTK_ENTRY(entry2), TRUE);
-
- checkbox1 = gtk_check_button_new_with_mnemonic(_("_Case sensitive"));
- g_object_set_data_full(G_OBJECT(app->find_in_files_dialog), "check_case",
- gtk_widget_ref(checkbox1), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox1), FALSE);
-
- checkbox2 = gtk_check_button_new_with_mnemonic(_("Invert search results"));
- g_object_set_data_full(G_OBJECT(app->find_in_files_dialog), "check_invert",
- gtk_widget_ref(checkbox2), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox2), FALSE);
- gtk_tooltips_set_tip(tooltips, checkbox2,
- _("Invert the sense of matching, to select non-matching lines."), NULL);
-
- checkbox3 = gtk_check_button_new_with_mnemonic(_("_Use extended regular expressions"));
- g_object_set_data_full(G_OBJECT(app->find_in_files_dialog), "check_eregexp",
- gtk_widget_ref(checkbox3), (GDestroyNotify)gtk_widget_unref);
- gtk_button_set_focus_on_click(GTK_BUTTON(checkbox3), FALSE);
- gtk_tooltips_set_tip(tooltips, checkbox3,
- _("See grep's manual page for more information."), NULL);
-
- vbox2 = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(vbox2), checkbox1);
- gtk_container_add(GTK_CONTAINER(vbox2), checkbox2);
- gtk_container_add(GTK_CONTAINER(vbox2), checkbox3);
-
- g_signal_connect((gpointer) app->find_in_files_dialog, "response",
- G_CALLBACK(on_find_in_files_dialog_response), combo);
- g_signal_connect((gpointer) app->find_in_files_dialog, "delete_event",
- G_CALLBACK(gtk_widget_hide), NULL);
-
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(app->find_in_files_dialog)->vbox),
- vbox1, TRUE, TRUE, 6);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(app->find_in_files_dialog)->vbox),
- label, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(app->find_in_files_dialog)->vbox),
- combo, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(app->find_in_files_dialog)->vbox),
- vbox2, TRUE, TRUE, 6);
-
- gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(app->find_in_files_dialog)->vbox), 6);
-
- gtk_widget_show_all(app->find_in_files_dialog);
- }
-
- if (sci_get_lines_selected(doc_list[idx].sci) == 1)
- {
- sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci));
- sci_get_selected_text(doc_list[idx].sci, sel);
- }
-
- entry2 = GTK_BIN(combo)->child;
- if (sel) gtk_entry_set_text(GTK_ENTRY(entry2), sel);
- g_free(sel);
-
- if (cur_dir) gtk_entry_set_text(GTK_ENTRY(entry1), cur_dir);
- g_free(cur_dir);
-
- // put the focus to the directory entry if it is empty
- if (utils_strcmp(gtk_entry_get_text(GTK_ENTRY(entry1)), ""))
- gtk_widget_grab_focus(entry1);
- else
- gtk_widget_grab_focus(entry2);
-
- gtk_widget_show(app->find_in_files_dialog);
-}
-
-
void dialogs_show_includes_arguments_tex(void)
{
GtkWidget *dialog, *label, *entries[4];
Modified: trunk/src/dialogs.h
===================================================================
--- trunk/src/dialogs.h 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/dialogs.h 2006-08-11 21:12:49 UTC (rev 698)
@@ -49,12 +49,6 @@
void dialogs_show_make_target(void);
-void dialogs_show_find(void);
-
-void dialogs_show_replace(void);
-
-void dialogs_show_find_in_files(void);
-
void dialogs_show_goto_line(void);
void dialogs_show_includes_arguments_gen(void);
Modified: trunk/src/geany.h
===================================================================
--- trunk/src/geany.h 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/geany.h 2006-08-11 21:12:49 UTC (rev 698)
@@ -189,7 +189,6 @@
gchar *configdir;
gchar *datadir;
gchar *docdir;
- gchar *search_text;
gchar build_make_custopt[256];
gchar *tools_browser_cmd;
gchar *tools_make_cmd;
@@ -222,9 +221,6 @@
GtkWidget *open_filesel;
GtkWidget *save_filesel;
GtkWidget *prefs_dialog;
- GtkWidget *find_dialog;
- GtkWidget *replace_dialog;
- GtkWidget *find_in_files_dialog;
GtkWidget *default_tag_tree;
const TMWorkspace *tm_workspace;
GQueue *recent_queue;
Modified: trunk/src/keybindings.c
===================================================================
--- trunk/src/keybindings.c 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/keybindings.c 2006-08-11 21:12:49 UTC (rev 698)
@@ -29,7 +29,6 @@
#include "utils.h"
#include "document.h"
#include "callbacks.h"
-#include "dialogs.h"
#include "prefs.h"
#include "msgwindow.h"
#include "sci_cb.h"
@@ -411,7 +410,7 @@
static void cb_func_menu_open(void)
{
- dialogs_show_open_file();
+ on_open1_activate(NULL, NULL);
}
static void cb_func_menu_save(void)
@@ -456,7 +455,7 @@
static void cb_func_menu_preferences(void)
{
- dialogs_show_prefs_dialog();
+ on_preferences1_activate(NULL, NULL);
}
static void cb_func_menu_findnext(void)
@@ -471,12 +470,12 @@
static void cb_func_menu_replace(void)
{
- dialogs_show_replace();
+ on_replace1_activate(NULL, NULL);
}
static void cb_func_menu_findinfiles(void)
{
- dialogs_show_find_in_files();
+ on_find_in_files1_activate(NULL, NULL);
}
static void cb_func_menu_gotoline(void)
Modified: trunk/src/main.c
===================================================================
--- trunk/src/main.c 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/main.c 2006-08-11 21:12:49 UTC (rev 698)
@@ -49,6 +49,7 @@
#include "notebook.h"
#include "keybindings.h"
#include "sci_cb.h"
+#include "search.h"
#ifdef HAVE_VTE
# include "vte.h"
@@ -222,15 +223,11 @@
else
app->configdir = g_strconcat(GEANY_HOME_DIR, G_DIR_SEPARATOR_S, ".", PACKAGE, NULL);
app->window = NULL;
- app->search_text = NULL;
app->open_fontsel = NULL;
app->open_colorsel = NULL;
app->open_filesel = NULL;
app->save_filesel = NULL;
app->prefs_dialog = NULL;
- app->find_dialog = NULL;
- app->replace_dialog = NULL;
- app->find_in_files_dialog = NULL;
app->default_tag_tree = NULL;
app->main_window_realized= FALSE;
app->tab_order_ltr = FALSE;
@@ -323,6 +320,8 @@
msgwindow.tree_status = lookup_widget(app->window, "treeview3");
msgwindow.tree_msg = lookup_widget(app->window, "treeview4");
msgwindow.tree_compiler = lookup_widget(app->window, "treeview5");
+
+ search_init();
}
Modified: trunk/src/search.c
===================================================================
--- trunk/src/search.c 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/search.c 2006-08-11 21:12:49 UTC (rev 698)
@@ -25,8 +25,11 @@
#include "support.h"
#include "utils.h"
#include "msgwindow.h"
+#include "document.h"
+#include "sciwrappers.h"
#include <unistd.h>
+#include <string.h>
#ifdef G_OS_UNIX
# include <sys/types.h>
@@ -34,6 +37,23 @@
#endif
+enum {
+ GEANY_RESPONSE_REPLACE = 1,
+ GEANY_RESPONSE_REPLACE_ALL,
+ GEANY_RESPONSE_REPLACE_SEL,
+ GEANY_RESPONSE_FIND
+};
+
+GeanySearchData search_data;
+
+static struct
+{
+ GtkWidget *find_dialog;
+ GtkWidget *replace_dialog;
+ GtkWidget *find_in_files_dialog;
+} widgets;
+
+
static gboolean search_read_io (GIOChannel *source,
GIOCondition condition,
gpointer data);
@@ -45,6 +65,619 @@
static GSList *search_get_file_list(const gchar *path, gint *length);
+static void add_find_checkboxes(GtkDialog *dialog);
+
+static void
+on_find_replace_checkbutton_toggled(GtkToggleButton *togglebutton, gpointer user_data);
+
+static void
+on_find_dialog_response(GtkDialog *dialog, gint response, gpointer user_data);
+
+static void
+on_find_entry_activate(GtkEntry *entry, gpointer user_data);
+
+static void
+on_replace_dialog_response(GtkDialog *dialog, gint response, gpointer user_data);
+
+static void
+on_replace_entry_activate(GtkEntry *entry, gpointer user_data);
+
+static void
+on_find_in_files_dialog_response(GtkDialog *dialog, gint response, gpointer user_data);
+
+
+void search_init()
+{
+ widgets.find_dialog = NULL;
+ widgets.replace_dialog = NULL;
+ widgets.find_in_files_dialog = NULL;
+ search_data.text = NULL;
+}
+
+
+#define FREE_WIDGET(wid) \
+ if (wid && GTK_IS_WIDGET(wid)) gtk_widget_destroy(wid);
+
+void search_finalise()
+{
+ FREE_WIDGET(widgets.find_dialog);
+ FREE_WIDGET(widgets.replace_dialog);
+ FREE_WIDGET(widgets.find_in_files_dialog);
+ g_free(search_data.text);
+}
+
+
+static void add_find_checkboxes(GtkDialog *dialog)
+{
+ GtkWidget *checkbox1, *checkbox2, *check_regexp, *checkbox4, *checkbox5,
+ *checkbox7, *hbox, *lbox, *rbox;
+ GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
+
+ checkbox1 = gtk_check_button_new_with_mnemonic(_("_Case sensitive"));
+ g_object_set_data_full(G_OBJECT(dialog), "check_case",
+ gtk_widget_ref(checkbox1), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox1), FALSE);
+
+ checkbox2 = gtk_check_button_new_with_mnemonic(_("Match only a _whole word"));
+ g_object_set_data_full(G_OBJECT(dialog), "check_word",
+ gtk_widget_ref(checkbox2), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox2), FALSE);
+
+ checkbox5 = gtk_check_button_new_with_mnemonic(_("Match only word s_tart"));
+ g_object_set_data_full(G_OBJECT(dialog), "check_wordstart",
+ gtk_widget_ref(checkbox5), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox5), FALSE);
+
+ lbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(lbox), checkbox1);
+ gtk_container_add(GTK_CONTAINER(lbox), checkbox2);
+ gtk_container_add(GTK_CONTAINER(lbox), checkbox5);
+
+ check_regexp = gtk_check_button_new_with_mnemonic(_("_Use regular expressions"));
+ g_object_set_data_full(G_OBJECT(dialog), "check_regexp",
+ gtk_widget_ref(check_regexp), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(check_regexp), FALSE);
+ gtk_tooltips_set_tip(tooltips, check_regexp, _("Use POSIX-like regular expressions. "
+ "For detailed information about using regular expressions, please read the documentation."), NULL);
+ g_signal_connect(G_OBJECT(check_regexp), "toggled",
+ G_CALLBACK(on_find_replace_checkbutton_toggled), GTK_WIDGET(dialog));
+
+ checkbox4 = gtk_check_button_new_with_mnemonic(_("_Search backwards"));
+ g_object_set_data_full(G_OBJECT(dialog), "check_back",
+ gtk_widget_ref(checkbox4), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox4), FALSE);
+
+ checkbox7 = gtk_check_button_new_with_mnemonic(_("_Replace control characters"));
+ g_object_set_data_full(G_OBJECT(dialog), "check_escape",
+ gtk_widget_ref(checkbox7), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox7), FALSE);
+ gtk_tooltips_set_tip(tooltips, checkbox7,
+ _("Replace \\\\, \\t, \\n, \\r and \\uXXXX (Unicode chararacters) with the "
+ "corresponding control characters."), NULL);
+
+ rbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(rbox), check_regexp);
+ gtk_container_add(GTK_CONTAINER(rbox), checkbox7);
+ gtk_container_add(GTK_CONTAINER(rbox), checkbox4);
+
+ hbox = gtk_hbox_new(FALSE, 6);
+ gtk_container_add(GTK_CONTAINER(hbox), lbox);
+ gtk_container_add(GTK_CONTAINER(hbox), rbox);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 6);
+}
+
+
+void search_show_find_dialog()
+{
+ gint idx = document_get_cur_idx();
+ gchar *sel = NULL;
+
+ if (idx == -1 || ! doc_list[idx].is_valid) return;
+
+ if (sci_get_lines_selected(doc_list[idx].sci) == 1)
+ {
+ sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci));
+ sci_get_selected_text(doc_list[idx].sci, sel);
+ }
+
+ if (widgets.find_dialog == NULL)
+ {
+ GtkWidget *label, *entry, *vbox;
+
+ widgets.find_dialog = gtk_dialog_new_with_buttons(_("Find"),
+ GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_FIND, GTK_RESPONSE_ACCEPT, NULL);
+
+ label = gtk_label_new(_("Enter the search text here:"));
+ gtk_misc_set_padding(GTK_MISC(label), 0, 6);
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+
+ entry = gtk_combo_box_entry_new_text();
+ gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))), 248);
+ gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))), 50);
+ if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(entry)->child), sel);
+ g_object_set_data_full(G_OBJECT(widgets.find_dialog), "entry",
+ gtk_widget_ref(entry), (GDestroyNotify)gtk_widget_unref);
+
+ g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry)), "activate",
+ G_CALLBACK(on_find_entry_activate), NULL);
+ g_signal_connect((gpointer) widgets.find_dialog, "response",
+ G_CALLBACK(on_find_dialog_response), entry);
+ g_signal_connect((gpointer) widgets.find_dialog, "delete_event",
+ G_CALLBACK(gtk_widget_hide), NULL);
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(vbox), label);
+ gtk_container_add(GTK_CONTAINER(vbox), entry);
+ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(widgets.find_dialog)->vbox), vbox);
+
+ add_find_checkboxes(GTK_DIALOG(widgets.find_dialog));
+
+ gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(widgets.find_dialog)->vbox), 3);
+
+ gtk_widget_show_all(widgets.find_dialog);
+ }
+ else
+ {
+ if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(
+ lookup_widget(widgets.find_dialog, "entry"))->child), sel);
+ gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(widgets.find_dialog, "entry"))->child));
+ gtk_widget_show(widgets.find_dialog);
+ }
+ g_free(sel);
+}
+
+
+void search_show_replace_dialog()
+{
+ gint idx = document_get_cur_idx();
+ gchar *sel = NULL;
+
+ if (idx == -1 || ! doc_list[idx].is_valid) return;
+
+ if (sci_get_lines_selected(doc_list[idx].sci) == 1)
+ {
+ sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci));
+ sci_get_selected_text(doc_list[idx].sci, sel);
+ }
+
+ if (widgets.replace_dialog == NULL)
+ {
+ GtkWidget *label_find, *label_replace, *entry_find, *entry_replace,
+ *checkbox6, *button, *align, *rbox, *fbox;
+ GtkSizeGroup *size_group;
+ GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
+
+ widgets.replace_dialog = gtk_dialog_new_with_buttons(_("Replace"),
+ GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, NULL);
+
+ button = gtk_button_new_with_mnemonic(_("_In Selection"));
+ gtk_tooltips_set_tip(tooltips, button,
+ _("Replace all matches found in the currently selected text"), NULL);
+ gtk_widget_show(button);
+ gtk_dialog_add_action_widget(GTK_DIALOG(widgets.replace_dialog), button,
+ GEANY_RESPONSE_REPLACE_SEL);
+ button = gtk_button_new_with_mnemonic(_("Replace _All"));
+ gtk_widget_show(button);
+ gtk_dialog_add_action_widget(GTK_DIALOG(widgets.replace_dialog), button,
+ GEANY_RESPONSE_REPLACE_ALL);
+ button = gtk_button_new_from_stock(GTK_STOCK_FIND);
+ gtk_widget_show(button);
+ gtk_dialog_add_action_widget(GTK_DIALOG(widgets.replace_dialog), button,
+ GEANY_RESPONSE_FIND);
+ button = gtk_button_new_with_mnemonic(_("_Replace"));
+ gtk_widget_show(button);
+ gtk_dialog_add_action_widget(GTK_DIALOG(widgets.replace_dialog), button,
+ GEANY_RESPONSE_REPLACE);
+
+ label_find = gtk_label_new(_("Enter the search text here:"));
+ gtk_misc_set_alignment(GTK_MISC(label_find), 0, 0.5);
+
+ label_replace = gtk_label_new(_("Enter the replace text here:"));
+ gtk_misc_set_alignment(GTK_MISC(label_replace), 0, 0.5);
+
+ entry_find = gtk_combo_box_entry_new_text();
+ gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find))), 248);
+ gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find))), 50);
+ if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(entry_find)->child), sel);
+ g_object_set_data_full(G_OBJECT(widgets.replace_dialog), "entry_find",
+ gtk_widget_ref(entry_find), (GDestroyNotify)gtk_widget_unref);
+
+ entry_replace = gtk_combo_box_entry_new_text();
+ gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace))), 248);
+ gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace))), 50);
+ g_object_set_data_full(G_OBJECT(widgets.replace_dialog), "entry_replace",
+ gtk_widget_ref(entry_replace), (GDestroyNotify)gtk_widget_unref);
+
+ g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry_replace)), "activate",
+ G_CALLBACK(on_replace_entry_activate), NULL);
+ g_signal_connect((gpointer) widgets.replace_dialog, "response",
+ G_CALLBACK(on_replace_dialog_response), entry_replace);
+ g_signal_connect((gpointer) widgets.replace_dialog, "delete_event",
+ G_CALLBACK(gtk_widget_hide), NULL);
+
+ fbox = gtk_hbox_new(FALSE, 6);
+ gtk_container_add(GTK_CONTAINER(fbox), label_find);
+ gtk_container_add(GTK_CONTAINER(fbox), entry_find);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(widgets.replace_dialog)->vbox), fbox,
+ FALSE, FALSE, 6);
+
+ rbox = gtk_hbox_new(FALSE, 6);
+ gtk_container_add(GTK_CONTAINER(rbox), label_replace);
+ gtk_container_add(GTK_CONTAINER(rbox), entry_replace);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(widgets.replace_dialog)->vbox), rbox,
+ FALSE, FALSE, 3);
+
+ size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+ gtk_size_group_add_widget(size_group, label_find);
+ gtk_size_group_add_widget(size_group, label_replace);
+
+ add_find_checkboxes(GTK_DIALOG(widgets.replace_dialog));
+
+ checkbox6 = gtk_check_button_new_with_mnemonic(_("Replace in all _open files"));
+ g_object_set_data_full(G_OBJECT(widgets.replace_dialog), "check_all_buffers",
+ gtk_widget_ref(checkbox6), (GDestroyNotify)gtk_widget_unref);
+ gtk_tooltips_set_tip(tooltips, checkbox6,
+ _("Replaces the search text in all opened files. This option is only useful(and used) if you click on \"Replace All\"."), NULL);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox6), FALSE);
+
+ align = gtk_alignment_new(0, 0, 1, 1);
+ gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 9, 0, 0);
+ gtk_container_add(GTK_CONTAINER(align), checkbox6);
+ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(widgets.replace_dialog)->vbox), align);
+
+ gtk_widget_show_all(widgets.replace_dialog);
+ }
+ else
+ {
+ if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(
+ lookup_widget(widgets.replace_dialog, "entry_find"))->child), sel);
+ gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(widgets.replace_dialog, "entry_find"))->child));
+ gtk_widget_show(widgets.replace_dialog);
+ }
+ g_free(sel);
+}
+
+
+void search_show_find_in_files_dialog()
+{
+ static GtkWidget *combo = NULL;
+ static GtkWidget *entry1;
+ GtkWidget *entry2; // the child GtkEntry of combo
+ gint idx = document_get_cur_idx();
+ gchar *sel = NULL;
+ gchar *cur_dir;
+
+ if (idx == -1 || ! doc_list[idx].is_valid) return;
+
+ cur_dir = utils_get_current_file_dir();
+
+ if (widgets.find_in_files_dialog == NULL)
+ {
+ GtkWidget *label, *label1, *checkbox1, *checkbox2, *checkbox3, *vbox2, *vbox1;
+ GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
+
+ widgets.find_in_files_dialog = gtk_dialog_new_with_buttons(
+ _("Find in files"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
+
+ gtk_dialog_add_button(GTK_DIALOG(widgets.find_in_files_dialog), "gtk-find", GTK_RESPONSE_ACCEPT);
+ gtk_dialog_set_default_response(GTK_DIALOG(widgets.find_in_files_dialog),
+ GTK_RESPONSE_ACCEPT);
+
+ label1 = gtk_label_new("Directory to be searched:");
+ gtk_misc_set_alignment(GTK_MISC(label1), 0, 0);
+
+ entry1 = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(entry1), 248);
+ gtk_entry_set_width_chars(GTK_ENTRY(entry1), 50);
+ g_object_set_data_full(G_OBJECT(widgets.find_in_files_dialog), "entry_dir",
+ gtk_widget_ref(entry1), (GDestroyNotify)gtk_widget_unref);
+
+ vbox1 = gtk_vbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(vbox1), label1, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox1), entry1, FALSE, FALSE, 0);
+
+ label = gtk_label_new(_("Enter the search text here:"));
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+
+ combo = gtk_combo_box_entry_new_text();
+ entry2 = gtk_bin_get_child(GTK_BIN(combo));
+ gtk_entry_set_max_length(GTK_ENTRY(entry2), 248);
+ gtk_entry_set_width_chars(GTK_ENTRY(entry2), 50);
+ gtk_entry_set_activates_default(GTK_ENTRY(entry2), TRUE);
+
+ checkbox1 = gtk_check_button_new_with_mnemonic(_("_Case sensitive"));
+ g_object_set_data_full(G_OBJECT(widgets.find_in_files_dialog), "check_case",
+ gtk_widget_ref(checkbox1), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox1), FALSE);
+
+ checkbox2 = gtk_check_button_new_with_mnemonic(_("Invert search results"));
+ g_object_set_data_full(G_OBJECT(widgets.find_in_files_dialog), "check_invert",
+ gtk_widget_ref(checkbox2), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox2), FALSE);
+ gtk_tooltips_set_tip(tooltips, checkbox2,
+ _("Invert the sense of matching, to select non-matching lines."), NULL);
+
+ checkbox3 = gtk_check_button_new_with_mnemonic(_("_Use extended regular expressions"));
+ g_object_set_data_full(G_OBJECT(widgets.find_in_files_dialog), "check_eregexp",
+ gtk_widget_ref(checkbox3), (GDestroyNotify)gtk_widget_unref);
+ gtk_button_set_focus_on_click(GTK_BUTTON(checkbox3), FALSE);
+ gtk_tooltips_set_tip(tooltips, checkbox3,
+ _("See grep's manual page for more information."), NULL);
+
+ vbox2 = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(vbox2), checkbox1);
+ gtk_container_add(GTK_CONTAINER(vbox2), checkbox2);
+ gtk_container_add(GTK_CONTAINER(vbox2), checkbox3);
+
+ g_signal_connect((gpointer) widgets.find_in_files_dialog, "response",
+ G_CALLBACK(on_find_in_files_dialog_response), combo);
+ g_signal_connect((gpointer) widgets.find_in_files_dialog, "delete_event",
+ G_CALLBACK(gtk_widget_hide), NULL);
+
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(widgets.find_in_files_dialog)->vbox),
+ vbox1, TRUE, TRUE, 6);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(widgets.find_in_files_dialog)->vbox),
+ label, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(widgets.find_in_files_dialog)->vbox),
+ combo, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(widgets.find_in_files_dialog)->vbox),
+ vbox2, TRUE, TRUE, 6);
+
+ gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(widgets.find_in_files_dialog)->vbox), 6);
+
+ gtk_widget_show_all(widgets.find_in_files_dialog);
+ }
+
+ if (sci_get_lines_selected(doc_list[idx].sci) == 1)
+ {
+ sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci));
+ sci_get_selected_text(doc_list[idx].sci, sel);
+ }
+
+ entry2 = GTK_BIN(combo)->child;
+ if (sel) gtk_entry_set_text(GTK_ENTRY(entry2), sel);
+ g_free(sel);
+
+ if (cur_dir) gtk_entry_set_text(GTK_ENTRY(entry1), cur_dir);
+ g_free(cur_dir);
+
+ // put the focus to the directory entry if it is empty
+ if (utils_strcmp(gtk_entry_get_text(GTK_ENTRY(entry1)), ""))
+ gtk_widget_grab_focus(entry1);
+ else
+ gtk_widget_grab_focus(entry2);
+
+ gtk_widget_show(widgets.find_in_files_dialog);
+}
+
+
+static void
+on_find_replace_checkbutton_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+ GtkWidget *dialog = GTK_WIDGET(user_data);
+ GtkToggleButton *chk_regexp = GTK_TOGGLE_BUTTON(
+ lookup_widget(dialog, "check_regexp"));
+
+ if (togglebutton == chk_regexp)
+ {
+ gboolean regex_set = gtk_toggle_button_get_active(chk_regexp);
+ GtkWidget *check_back = lookup_widget(dialog, "check_back");
+ GtkWidget *check_word = lookup_widget(dialog, "check_word");
+ GtkWidget *check_wordstart = lookup_widget(dialog, "check_wordstart");
+
+ gtk_widget_set_sensitive(check_back, ! regex_set);
+ gtk_widget_set_sensitive(check_word, ! regex_set);
+ gtk_widget_set_sensitive(check_wordstart, ! regex_set);
+ }
+}
+
+
+static void
+on_find_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
+{
+ if (response == GTK_RESPONSE_ACCEPT)
+ {
+ gint idx = document_get_cur_idx();
+ gboolean search_replace_escape;
+ gboolean
+ fl1 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.find_dialog), "check_case"))),
+ fl2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.find_dialog), "check_word"))),
+ fl3 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.find_dialog), "check_regexp"))),
+ fl4 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.find_dialog), "check_wordstart")));
+ search_replace_escape = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.find_dialog), "check_escape")));
+ search_data.backwards = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.find_dialog), "check_back")));
+
+ g_free(search_data.text);
+ search_data.text = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data)))));
+ if (strlen(search_data.text) == 0 ||
+ (search_replace_escape && ! utils_str_replace_escape(search_data.text)))
+ {
+ utils_beep();
+ gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(widgets.find_dialog, "entry"))->child));
+ return;
+ }
+
+ gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), search_data.text);
+ search_data.flags = (fl1 ? SCFIND_MATCHCASE : 0) |
+ (fl2 ? SCFIND_WHOLEWORD : 0) |
+ (fl3 ? SCFIND_REGEXP | SCFIND_POSIX: 0) |
+ (fl4 ? SCFIND_WORDSTART : 0);
+ document_find_text(idx, search_data.text, search_data.flags, search_data.backwards);
+ }
+ else gtk_widget_hide(widgets.find_dialog);
+}
+
+
+static void
+on_find_entry_activate(GtkEntry *entry, gpointer user_data)
+{
+ on_find_dialog_response(NULL, GTK_RESPONSE_ACCEPT,
+ lookup_widget(GTK_WIDGET(entry), "entry"));
+}
+
+
+static void
+on_replace_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
+{
+ gint idx = document_get_cur_idx();
+ GtkWidget *entry_find = lookup_widget(GTK_WIDGET(widgets.replace_dialog), "entry_find");
+ GtkWidget *entry_replace = lookup_widget(GTK_WIDGET(widgets.replace_dialog), "entry_replace");
+ gint search_flags_re;
+ gboolean search_backwards_re, search_replace_escape_re, search_in_all_buffers_re;
+ gboolean fl1, fl2, fl3, fl4;
+ gchar *find, *replace;
+
+ if (response == GTK_RESPONSE_CANCEL)
+ {
+ gtk_widget_hide(widgets.replace_dialog);
+ return;
+ }
+
+ fl1 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.replace_dialog), "check_case")));
+ fl2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.replace_dialog), "check_word")));
+ fl3 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.replace_dialog), "check_regexp")));
+ fl4 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.replace_dialog), "check_wordstart")));
+ search_backwards_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.replace_dialog), "check_back")));
+ search_replace_escape_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.replace_dialog), "check_escape")));
+ search_in_all_buffers_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(widgets.replace_dialog), "check_all_buffers")));
+ find = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find)))));
+ replace = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace)))));
+
+ if ((response != GEANY_RESPONSE_FIND) && (! fl1) && (strcasecmp(find, replace) == 0))
+ {
+ utils_beep();
+ gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(widgets.replace_dialog, "entry_find"))->child));
+ return;
+ }
+
+ gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_find), find);
+ gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_replace), replace);
+
+ if (search_replace_escape_re &&
+ (! utils_str_replace_escape(find) || ! utils_str_replace_escape(replace)))
+ {
+ utils_beep();
+ gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(widgets.replace_dialog, "entry_find"))->child));
+ return;
+ }
+
+ search_flags_re = (fl1 ? SCFIND_MATCHCASE : 0) |
+ (fl2 ? SCFIND_WHOLEWORD : 0) |
+ (fl3 ? SCFIND_REGEXP | SCFIND_POSIX : 0) |
+ (fl4 ? SCFIND_WORDSTART : 0);
+
+ if (search_in_all_buffers_re && response == GEANY_RESPONSE_REPLACE_ALL)
+ {
+ gint i;
+ for (i = 0; i < GEANY_MAX_OPEN_FILES; i++)
+ {
+ if (! doc_list[i].is_valid) continue;
+
+ document_replace_all(i, find, replace, search_flags_re);
+ }
+ gtk_widget_hide(widgets.replace_dialog);
+ }
+ else
+ {
+ switch (response)
+ {
+ case GEANY_RESPONSE_REPLACE:
+ {
+ document_replace_text(idx, find, replace, search_flags_re,
+ search_backwards_re);
+ break;
+ }
+ case GEANY_RESPONSE_FIND:
+ {
+ document_find_text(idx, find, search_flags_re, search_backwards_re);
+ break;
+ }
+ case GEANY_RESPONSE_REPLACE_ALL:
+ {
+ document_replace_all(idx, find, replace, search_flags_re);
+ gtk_widget_hide(widgets.replace_dialog);
+ break;
+ }
+ case GEANY_RESPONSE_REPLACE_SEL:
+ {
+ document_replace_sel(idx, find, replace, search_flags_re);
+ gtk_widget_hide(widgets.replace_dialog);
+ break;
+ }
+ }
+ }
+ g_free(find);
+ g_free(replace);
+}
+
+
+static void
+on_replace_entry_activate(GtkEntry *entry, gpointer user_data)
+{
+ on_replace_dialog_response(NULL, GEANY_RESPONSE_REPLACE, NULL);
+}
+
+
+static void
+on_find_in_files_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
+{
+ if (response == GTK_RESPONSE_ACCEPT)
+ {
+ const gchar *search_text =
+ gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data))));
+ const gchar *utf8_dir =
+ gtk_entry_get_text(GTK_ENTRY(lookup_widget(widgets.find_in_files_dialog, "entry_dir")));
+
+ if (utf8_dir == NULL || utils_strcmp(utf8_dir, ""))
+ msgwin_status_add(_("Invalid directory for find in files."));
+ else if (search_text && *search_text)
+ {
+ gchar *locale_dir;
+ gboolean eregexp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(widgets.find_in_files_dialog, "check_eregexp")));
+ gboolean invert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(widgets.find_in_files_dialog, "check_invert")));
+ gboolean case_sens = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ lookup_widget(widgets.find_in_files_dialog, "check_case")));
+ gint opts = (eregexp ? FIF_USE_EREGEXP : 0) |
+ (invert ? FIF_INVERT_MATCH : 0) |
+ (case_sens ? FIF_CASE_SENSITIVE : 0);
+
+ locale_dir = g_locale_from_utf8(utf8_dir, -1, NULL, NULL, NULL);
+ if (locale_dir == NULL) locale_dir = g_strdup(utf8_dir);
+
+ if (search_find_in_files(search_text, locale_dir, opts))
+ {
+ gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), search_text);
+ gtk_widget_hide(widgets.find_in_files_dialog);
+ }
+ g_free(locale_dir);
+ }
+ else
+ msgwin_status_add(_("No text to find."));
+ }
+ else
+ gtk_widget_hide(widgets.find_in_files_dialog);
+}
+
+
gboolean search_find_in_files(const gchar *search_text, const gchar *dir, fif_options opts)
{
gchar **argv_prefix;
Modified: trunk/src/search.h
===================================================================
--- trunk/src/search.h 2006-08-11 18:16:28 UTC (rev 697)
+++ trunk/src/search.h 2006-08-11 21:12:49 UTC (rev 698)
@@ -28,6 +28,26 @@
FIF_INVERT_MATCH = 1 << 2
} fif_options;
+// the flags given in the search dialog(stored statically for "find next" and "replace")
+typedef struct
+{
+ gchar *text;
+ gint flags;
+ gboolean backwards;
+} GeanySearchData;
+extern GeanySearchData search_data;
+
+
+void search_init();
+
+void search_finalise();
+
+void search_show_find_dialog();
+
+void search_show_replace_dialog();
+
+void search_show_find_in_files_dialog();
+
gboolean search_find_in_files(const gchar *search_text, const gchar *dir, fif_options opts);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list