Kaydet (Commit) 85af83f6 authored tarafından Enrico Tröger's avatar Enrico Tröger

Added some options to the Find in files dialog, made search directory editable.


git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@647 ea778897-0a13-0410-b9d1-a72fbfd435f5
üst 6cb83f8a
2006-07-28 Enrico Tröger <enrico.troeger@uvena.de>
* src/search.c, src/callbacks.c, src/dialogs.c:
Added some options to the Find in files dialog, made search
directory editable.
2006-07-28 Nick Treleaven <nick.treleaven@btinternet.com>
* src/sciwrappers.h: Set PLAT_GTK before including ScintillaWidget.h.
......@@ -18,7 +25,7 @@
styles to keep the syntax highlighting consistent.
* src/main.c: Removed startup warning.
* src/geany.h, src/main.c: Added Select All item to sensitive buttons.
* src/win32.c, src/dialogs.c, src/callbacks.c:
* src/win32.c, src/dialogs.c, src/callbacks.c:
Let the colour chooser pick the colour under the cursor(Win32 code).
Added some sanity checks.
......
......@@ -2065,26 +2065,35 @@ on_find_in_files_dialog_response (GtkDialog *dialog,
{
const gchar *search_text =
gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data))));
gchar *utf8_dir = utils_get_current_file_dir();
const gchar *utf8_dir =
gtk_entry_get_text(GTK_ENTRY(lookup_widget(app->find_in_files_dialog, "entry_dir")));
if (utf8_dir == NULL)
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);
gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), search_text);
search_find_in_files(search_text, locale_dir);
search_find_in_files(search_text, locale_dir, opts);
g_free(locale_dir);
gtk_widget_hide(app->find_in_files_dialog);
}
else
msgwin_status_add(_("No text to find."));
g_free(utf8_dir);
}
else
gtk_widget_hide(app->find_in_files_dialog);
......
......@@ -1004,24 +1004,21 @@ void dialogs_show_replace(void)
void dialogs_show_find_in_files(void)
{
static GtkWidget *dirlabel = NULL, *combo = NULL;
GtkWidget *entry; //the child GtkEntry of combo
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, *dirtext;
gchar *cur_dir;
if (idx == -1 || ! doc_list[idx].is_valid) return;
cur_dir = utils_get_current_file_dir();
if (cur_dir == NULL)
{
utils_set_statusbar(_("Invalid directory for find in files."), FALSE);
return;
}
if (app->find_in_files_dialog == NULL)
{
GtkWidget *label;
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,
......@@ -1031,17 +1028,51 @@ void dialogs_show_find_in_files(void)
gtk_dialog_set_default_response(GTK_DIALOG(app->find_in_files_dialog),
GTK_RESPONSE_ACCEPT);
dirlabel = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(dirlabel), 0, 0);
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();
entry = gtk_bin_get_child(GTK_BIN(combo));
gtk_entry_set_max_length(GTK_ENTRY(entry), 248);
gtk_entry_set_width_chars(GTK_ENTRY(entry), 50);
gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
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);
......@@ -1049,13 +1080,13 @@ void dialogs_show_find_in_files(void)
G_CALLBACK(gtk_widget_hide), NULL);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(app->find_in_files_dialog)->vbox),
dirlabel, TRUE, TRUE, 6);
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),
gtk_label_new(""), TRUE, TRUE, 0);
vbox2, TRUE, TRUE, 6);
gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(app->find_in_files_dialog)->vbox), 6);
......@@ -1068,15 +1099,18 @@ void dialogs_show_find_in_files(void)
sci_get_selected_text(doc_list[idx].sci, sel);
}
entry = GTK_BIN(combo)->child;
if (sel) gtk_entry_set_text(GTK_ENTRY(entry), sel);
entry2 = GTK_BIN(combo)->child;
if (sel) gtk_entry_set_text(GTK_ENTRY(entry2), sel);
g_free(sel);
gtk_widget_grab_focus(entry);
dirtext = g_strdup_printf(_("Current directory: %s"), cur_dir);
gtk_label_set_text(GTK_LABEL(dirlabel), dirtext);
if (cur_dir) gtk_entry_set_text(GTK_ENTRY(entry1), cur_dir);
g_free(cur_dir);
g_free(dirtext);
// 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);
}
......
......@@ -45,27 +45,57 @@ static gchar **search_get_argv(const gchar **argv_prefix, const gchar *dir);
static GSList *search_get_file_list(const gchar *path, gint *length);
gboolean search_find_in_files(const gchar *search_text, const gchar *dir)
gboolean search_find_in_files(const gchar *search_text, const gchar *dir, fif_options opts)
{
const gchar *argv_prefix[] = {app->tools_grep_cmd, "-nHI", "--", search_text, NULL};
gchar **argv_prefix;
gchar **grep_cmd_argv;
gchar **argv;
gchar grep_opts[] = "-nHI ";
GPid child_pid;
gint stdout_fd, stdin_fd;
gint stdout_fd, stdin_fd, grep_cmd_argv_len, i, grep_opts_len = 4;
GError *error = NULL;
gboolean ret = FALSE;
if (! search_text || ! *search_text || ! dir) return TRUE;
if (! g_file_test(app->tools_grep_cmd, G_FILE_TEST_IS_EXECUTABLE))
// first process the grep command (need to split it in a argv because it can be "grep -I")
grep_cmd_argv = g_strsplit(app->tools_grep_cmd, " ", -1);
grep_cmd_argv_len = g_strv_length(grep_cmd_argv);
if (! g_file_test(grep_cmd_argv[0], G_FILE_TEST_IS_EXECUTABLE))
{
msgwin_status_add(_("Cannot execute grep tool '%s';"
" check the path setting in Preferences."), argv_prefix[0]);
" check the path setting in Preferences."), app->tools_grep_cmd);
return FALSE;
}
gtk_list_store_clear(msgwindow.store_msg);
gtk_notebook_set_current_page(GTK_NOTEBOOK(msgwindow.notebook), MSG_MESSAGE);
argv = search_get_argv(argv_prefix, dir);
if (! (opts & FIF_CASE_SENSITIVE))
grep_opts[grep_opts_len++] = 'i';
if (opts & FIF_USE_EREGEXP)
grep_opts[grep_opts_len++] = 'E';
if (opts & FIF_INVERT_MATCH)
grep_opts[grep_opts_len++] = 'v';
grep_opts[grep_opts_len] = '\0';
// set grep command and options
argv_prefix = g_new0(gchar*, grep_cmd_argv_len + 4);
for (i = 0; i < grep_cmd_argv_len; i++)
{
argv_prefix[i] = g_strdup(grep_cmd_argv[i]);
}
argv_prefix[grep_cmd_argv_len ] = g_strdup(grep_opts);
argv_prefix[grep_cmd_argv_len + 1] = g_strdup("--");
argv_prefix[grep_cmd_argv_len + 2] = g_strdup(search_text);
argv_prefix[grep_cmd_argv_len + 3] = NULL;
g_strfreev(grep_cmd_argv);
// finally add the arguments(files to be searched)
argv = search_get_argv((const gchar**)argv_prefix, dir);
g_strfreev(argv_prefix);
//geany_debug(g_strjoinv(" ", argv));
if (argv == NULL) return FALSE;
if (! g_spawn_async_with_pipes(dir, (gchar**)argv, NULL,
......@@ -80,9 +110,9 @@ gboolean search_find_in_files(const gchar *search_text, const gchar *dir)
}
else
{
g_child_watch_add(child_pid, search_close_pid, NULL);
utils_set_up_io_channel(stdout_fd, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
search_read_io, NULL);
g_child_watch_add(child_pid, search_close_pid, NULL);
ret = TRUE;
}
g_strfreev(argv);
......
......@@ -21,5 +21,13 @@
*/
gboolean search_find_in_files(const gchar *search_text, const gchar *dir);
typedef enum
{
FIF_CASE_SENSITIVE = 1 << 0,
FIF_USE_EREGEXP = 1 << 1,
FIF_INVERT_MATCH = 1 << 2
} fif_options;
gboolean search_find_in_files(const gchar *search_text, const gchar *dir, fif_options opts);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment