88
96
gboolean fif_recursive;
89
97
gboolean fif_use_extra_options;
90
98
gchar *fif_extra_options;
91
gboolean fif_use_files;
101
gboolean find_regexp;
102
gboolean find_escape_sequences;
103
gboolean find_case_sensitive;
104
gboolean find_match_whole_word;
105
gboolean find_match_word_start;
106
gboolean find_close_dialog;
107
gboolean replace_regexp;
108
gboolean replace_escape_sequences;
109
gboolean replace_case_sensitive;
110
gboolean replace_match_whole_word;
111
gboolean replace_match_word_start;
112
gboolean replace_search_backwards;
113
gboolean replace_close_dialog;
94
settings = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL, FALSE, NULL};
96
117
static StashGroup *fif_prefs = NULL;
118
static StashGroup *find_prefs = NULL;
119
static StashGroup *replace_prefs = NULL;
122
145
GtkWidget *files_combo;
123
146
GtkWidget *search_combo;
124
147
GtkWidget *encoding_combo;
148
GtkWidget *files_mode_combo;
125
149
gint position[2]; /* x, y */
127
fif_dlg = {NULL, NULL, NULL, NULL, NULL, {0, 0}};
151
fif_dlg = {NULL, NULL, NULL, NULL, NULL, NULL, {0, 0}};
130
154
static gboolean search_read_io(GIOChannel *source, GIOCondition condition, gpointer data);
195
224
"fif_use_extra_options", FALSE, "check_extra");
196
225
stash_group_add_entry(group, &settings.fif_files,
197
226
"fif_files", "", "entry_files");
198
stash_group_add_toggle_button(group, &settings.fif_use_files,
199
"fif_use_files", FALSE, "check_files");
227
stash_group_add_combo_box(group, &settings.fif_files_mode,
228
"fif_files_mode", FILES_MODE_ALL, "combo_files_mode");
230
group = stash_group_new("search");
232
configuration_add_pref_group(group, FALSE);
233
stash_group_add_toggle_button(group, &settings.find_regexp,
234
"find_regexp", FALSE, "check_regexp");
235
stash_group_add_toggle_button(group, &settings.find_case_sensitive,
236
"find_case_sensitive", FALSE, "check_case");
237
stash_group_add_toggle_button(group, &settings.find_escape_sequences,
238
"find_escape_sequences", FALSE, "check_escape");
239
stash_group_add_toggle_button(group, &settings.find_match_whole_word,
240
"find_match_whole_word", FALSE, "check_word");
241
stash_group_add_toggle_button(group, &settings.find_match_word_start,
242
"find_match_word_start", FALSE, "check_wordstart");
243
stash_group_add_toggle_button(group, &settings.find_close_dialog,
244
"find_close_dialog", TRUE, "check_close");
246
group = stash_group_new("search");
247
replace_prefs = group;
248
configuration_add_pref_group(group, FALSE);
249
stash_group_add_toggle_button(group, &settings.replace_regexp,
250
"replace_regexp", FALSE, "check_regexp");
251
stash_group_add_toggle_button(group, &settings.replace_case_sensitive,
252
"replace_case_sensitive", FALSE, "check_case");
253
stash_group_add_toggle_button(group, &settings.replace_escape_sequences,
254
"replace_escape_sequences", FALSE, "check_escape");
255
stash_group_add_toggle_button(group, &settings.replace_match_whole_word,
256
"replace_match_whole_word", FALSE, "check_word");
257
stash_group_add_toggle_button(group, &settings.replace_match_word_start,
258
"replace_match_word_start", FALSE, "check_wordstart");
259
stash_group_add_toggle_button(group, &settings.replace_search_backwards,
260
"replace_search_backwards", FALSE, "check_back");
261
stash_group_add_toggle_button(group, &settings.replace_close_dialog,
262
"replace_close_dialog", TRUE, "check_close");
203
266
void search_init(void)
205
268
search_data.text = NULL;
269
search_data.original_text = NULL;
227
292
check_regexp = gtk_check_button_new_with_mnemonic(_("_Use regular expressions"));
228
293
ui_hookup_widget(dialog, check_regexp, "check_regexp");
229
294
gtk_button_set_focus_on_click(GTK_BUTTON(check_regexp), FALSE);
230
ui_widget_set_tooltip_text(check_regexp, _("Use POSIX-like regular expressions. "
295
gtk_widget_set_tooltip_text(check_regexp, _("Use POSIX-like regular expressions. "
231
296
"For detailed information about using regular expressions, please read the documentation."));
232
297
g_signal_connect(check_regexp, "toggled",
233
G_CALLBACK(on_find_replace_checkbutton_toggled), GTK_WIDGET(dialog));
298
G_CALLBACK(on_find_replace_checkbutton_toggled), dialog);
235
300
if (dialog != GTK_DIALOG(find_dlg.dialog))
425
492
g_signal_connect(gtk_bin_get_child(GTK_BIN(entry)), "activate",
426
493
G_CALLBACK(on_find_entry_activate), NULL);
494
ui_entry_add_activate_backward_signal(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))));
495
g_signal_connect(gtk_bin_get_child(GTK_BIN(entry)), "activate-backward",
496
G_CALLBACK(on_find_entry_activate_backward), NULL);
427
497
g_signal_connect(find_dlg.dialog, "response",
428
498
G_CALLBACK(on_find_dialog_response), entry);
429
499
g_signal_connect(find_dlg.dialog, "delete-event",
466
536
check_close = gtk_check_button_new_with_mnemonic(_("Close _dialog"));
467
537
ui_hookup_widget(find_dlg.dialog, check_close, "check_close");
468
538
gtk_button_set_focus_on_click(GTK_BUTTON(check_close), FALSE);
469
ui_widget_set_tooltip_text(check_close,
539
gtk_widget_set_tooltip_text(check_close,
470
540
_("Disable this option to keep the dialog open"));
471
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_close), TRUE);
472
541
gtk_container_add(GTK_CONTAINER(bbox), check_close);
473
542
gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(bbox), check_close, TRUE);
650
720
check_close = gtk_check_button_new_with_mnemonic(_("Close _dialog"));
651
721
ui_hookup_widget(replace_dlg.dialog, check_close, "check_close");
652
722
gtk_button_set_focus_on_click(GTK_BUTTON(check_close), FALSE);
653
ui_widget_set_tooltip_text(check_close,
723
gtk_widget_set_tooltip_text(check_close,
654
724
_("Disable this option to keep the dialog open"));
655
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_close), TRUE);
656
725
gtk_container_add(GTK_CONTAINER(bbox), check_close);
657
726
gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(bbox), check_close, TRUE);
782
static void update_file_patterns(GtkWidget *mode_combo, GtkWidget *fcombo)
787
entry = gtk_bin_get_child(GTK_BIN(fcombo));
789
selection = gtk_combo_box_get_active(GTK_COMBO_BOX(mode_combo));
791
if (selection == FILES_MODE_ALL)
793
gtk_entry_set_text(GTK_ENTRY(entry), "");
794
gtk_widget_set_sensitive(fcombo, FALSE);
796
else if (selection == FILES_MODE_CUSTOM)
798
gtk_widget_set_sensitive(fcombo, TRUE);
800
else if (selection == FILES_MODE_PROJECT)
802
if (app->project && NZV(app->project->file_patterns))
806
patterns = g_strjoinv(" ", app->project->file_patterns);
807
gtk_entry_set_text(GTK_ENTRY(entry), patterns);
812
gtk_entry_set_text(GTK_ENTRY(entry), "");
815
gtk_widget_set_sensitive(fcombo, FALSE);
820
/* creates the combo to choose which files include in the search */
821
static GtkWidget *create_fif_file_mode_combo(void)
824
GtkCellRenderer *renderer;
829
store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
830
gtk_list_store_append(store, &iter);
831
gtk_list_store_set(store, &iter, 0, _("all"), 1, TRUE, -1);
832
gtk_list_store_append(store, &iter);
833
gtk_list_store_set(store, &iter, 0, _("project"), 1, app->project != NULL, -1);
834
gtk_list_store_append(store, &iter);
835
gtk_list_store_set(store, &iter, 0, _("custom"), 1, TRUE, -1);
837
combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
838
g_object_unref(store);
839
gtk_widget_set_tooltip_text(combo, _("All: search all files in the directory\n"
840
"Project: use file patterns defined in the project settings\n"
841
"Custom: specify file patterns manually"));
843
renderer = gtk_cell_renderer_text_new();
844
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
845
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "text", 0, "sensitive", 1, NULL);
851
/* updates the sensitivity of the project combo item */
852
static void update_fif_file_mode_combo(void)
854
GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(fif_dlg.files_mode_combo));
857
/* "1" refers to the second list entry, project */
858
if (gtk_tree_model_get_iter_from_string(model, &iter, "1"))
859
gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1, app->project != NULL, -1);
711
863
static void create_fif_dialog(void)
713
865
GtkWidget *dir_combo, *combo, *fcombo, *e_combo, *entry;
714
GtkWidget *label, *label1, *label2, *checkbox1, *checkbox2, *check_wholeword,
715
*check_recursive, *check_extra, *entry_extra, *check_regexp, *check;
866
GtkWidget *label, *label1, *label2, *label3, *checkbox1, *checkbox2, *check_wholeword,
867
*check_recursive, *check_extra, *entry_extra, *check_regexp, *combo_files_mode;
716
868
GtkWidget *dbox, *sbox, *lbox, *rbox, *hbox, *vbox, *ebox;
717
869
GtkSizeGroup *size_group;
718
870
gchar *encoding_string;
751
903
size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
752
904
gtk_size_group_add_widget(size_group, label);
754
check = gtk_check_button_new_with_mnemonic(_("Fi_les:"));
755
ui_hookup_widget(fif_dlg.dialog, check, "check_files");
756
gtk_button_set_focus_on_click(GTK_BUTTON(check), FALSE);
757
gtk_size_group_add_widget(size_group, check);
906
label3 = gtk_label_new_with_mnemonic(_("Fi_les:"));
907
gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
759
/* tab from search to the files checkbox */
760
g_signal_connect(entry, "key-press-event",
761
G_CALLBACK(on_widget_key_pressed_set_focus), check);
909
combo_files_mode = create_fif_file_mode_combo();
910
gtk_label_set_mnemonic_widget(GTK_LABEL(label3), combo_files_mode);
911
ui_hookup_widget(fif_dlg.dialog, combo_files_mode, "combo_files_mode");
912
fif_dlg.files_mode_combo = combo_files_mode;
763
914
fcombo = gtk_combo_box_entry_new_text();
764
gtk_widget_set_sensitive(fcombo, FALSE);
765
915
entry = gtk_bin_get_child(GTK_BIN(fcombo));
766
916
ui_entry_add_clear_icon(GTK_ENTRY(entry));
767
917
gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
768
ui_widget_set_tooltip_text(entry, _("File patterns, e.g. *.c *.h"));
918
gtk_widget_set_tooltip_text(entry, _("File patterns, e.g. *.c *.h"));
769
919
ui_hookup_widget(fif_dlg.dialog, entry, "entry_files");
770
920
fif_dlg.files_combo = fcombo;
772
/* enable entry when check is checked */
773
g_signal_connect(check, "toggled",
774
G_CALLBACK(on_widget_toggled_set_sensitive), fcombo);
922
/* update the entry when selection is changed */
923
g_signal_connect(combo_files_mode, "changed", G_CALLBACK(update_file_patterns), fcombo);
776
925
hbox = gtk_hbox_new(FALSE, 6);
777
gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
926
gtk_box_pack_start(GTK_BOX(hbox), label3, FALSE, FALSE, 0);
927
gtk_box_pack_start(GTK_BOX(hbox), combo_files_mode, FALSE, FALSE, 0);
778
928
gtk_box_pack_start(GTK_BOX(hbox), fcombo, TRUE, TRUE, 0);
780
930
label1 = gtk_label_new_with_mnemonic(_("_Directory:"));
981
1135
gboolean regex_set = gtk_toggle_button_get_active(chk_regexp);
982
1136
GtkWidget *check_word = ui_lookup_widget(dialog, "check_word");
983
1137
GtkWidget *check_wordstart = ui_lookup_widget(dialog, "check_wordstart");
984
GtkToggleButton *check_case = GTK_TOGGLE_BUTTON(
985
ui_lookup_widget(dialog, "check_case"));
986
1138
GtkWidget *check_escape = ui_lookup_widget(dialog, "check_escape");
987
static gboolean case_state = FALSE; /* state before regex enabled */
1139
gboolean replace = (dialog != find_dlg.dialog);
1140
const char *back_button[2] = { "btn_previous" , "check_back" };
989
1142
/* hide options that don't apply to regex searches */
990
1143
gtk_widget_set_sensitive(check_escape, ! regex_set);
992
if (dialog == find_dlg.dialog)
993
gtk_widget_set_sensitive(ui_lookup_widget(dialog, "btn_previous"), ! regex_set);
995
gtk_widget_set_sensitive(ui_lookup_widget(dialog, "check_back"), ! regex_set);
1144
gtk_widget_set_sensitive(ui_lookup_widget(dialog, back_button[replace]), ! regex_set);
997
1145
gtk_widget_set_sensitive(check_word, ! regex_set);
998
1146
gtk_widget_set_sensitive(check_wordstart, ! regex_set);
1000
if (regex_set) /* regex enabled */
1002
/* Enable case sensitive but remember original case toggle state */
1003
case_state = gtk_toggle_button_get_active(check_case);
1004
gtk_toggle_button_set_active(check_case, TRUE);
1006
else /* regex disabled */
1008
/* If case sensitive is still enabled, revert to what it was before we enabled it */
1009
if (gtk_toggle_button_get_active(check_case) == TRUE)
1010
gtk_toggle_button_set_active(check_case, case_state);
1059
static gint get_search_flags(GtkWidget *dialog)
1195
on_find_entry_activate_backward(GtkEntry *entry, gpointer user_data)
1061
gboolean fl1, fl2, fl3, fl4;
1063
fl1 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1064
ui_lookup_widget(dialog, "check_case")));
1065
fl2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1066
ui_lookup_widget(dialog, "check_word")));
1067
fl3 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1068
ui_lookup_widget(dialog, "check_regexp")));
1069
fl4 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1070
ui_lookup_widget(dialog, "check_wordstart")));
1072
return (fl1 ? SCFIND_MATCHCASE : 0) |
1073
(fl2 ? SCFIND_WHOLEWORD : 0) |
1074
(fl3 ? SCFIND_REGEXP | SCFIND_POSIX : 0) |
1075
(fl4 ? SCFIND_WORDSTART : 0);
1197
/* can't search backwards with a regexp */
1198
if (search_data.flags & SCFIND_REGEXP)
1201
on_find_dialog_response(NULL, GEANY_RESPONSE_FIND_PREVIOUS,
1202
ui_lookup_widget(GTK_WIDGET(entry), "entry"));
1206
#define int_search_flags(match_case, whole_word, regexp, word_start) \
1207
((match_case ? SCFIND_MATCHCASE : 0) | \
1208
(whole_word ? SCFIND_WHOLEWORD : 0) | \
1209
(regexp ? SCFIND_REGEXP | SCFIND_POSIX : 0) | \
1210
(word_start ? SCFIND_WORDSTART : 0))
1080
1214
on_find_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
1082
1216
gtk_window_get_position(GTK_WINDOW(find_dlg.dialog),
1083
1217
&find_dlg.position[0], &find_dlg.position[1]);
1219
stash_group_update(find_prefs, find_dlg.dialog);
1085
1221
if (response == GTK_RESPONSE_CANCEL || response == GTK_RESPONSE_DELETE_EVENT)
1086
1222
gtk_widget_hide(find_dlg.dialog);
1089
1225
GeanyDocument *doc = document_get_current();
1090
gboolean search_replace_escape;
1091
gboolean check_close = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1092
ui_lookup_widget(GTK_WIDGET(find_dlg.dialog), "check_close")));
1226
gboolean check_close = settings.find_close_dialog;
1094
1228
if (doc == NULL)
1097
search_replace_escape = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1098
ui_lookup_widget(GTK_WIDGET(find_dlg.dialog), "check_escape")));
1099
1231
search_data.backwards = FALSE;
1100
1232
search_data.search_bar = FALSE;
1102
1234
g_free(search_data.text);
1235
g_free(search_data.original_text);
1103
1236
search_data.text = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data)))));
1104
search_data.flags = get_search_flags(find_dlg.dialog);
1237
search_data.original_text = g_strdup(search_data.text);
1238
search_data.flags = int_search_flags(settings.find_case_sensitive,
1239
settings.find_match_whole_word, settings.find_regexp, settings.find_match_word_start);
1106
if (strlen(search_data.text) == 0)
1241
if (! NZV(search_data.text))
1110
1245
gtk_widget_grab_focus(find_dlg.entry);
1113
if (search_replace_escape || search_data.flags & SCFIND_REGEXP)
1248
if (settings.find_escape_sequences || search_data.flags & SCFIND_REGEXP)
1115
1250
if (! utils_str_replace_escape(search_data.text, search_data.flags & SCFIND_REGEXP))
1118
ui_combo_box_add_to_history(GTK_COMBO_BOX_ENTRY(user_data), search_data.text, 0);
1253
ui_combo_box_add_to_history(GTK_COMBO_BOX_ENTRY(user_data), search_data.original_text, 0);
1120
1255
switch (response)
1122
1257
case GEANY_RESPONSE_FIND:
1123
1258
case GEANY_RESPONSE_FIND_PREVIOUS:
1125
gint result = document_find_text(doc, search_data.text, search_data.flags,
1260
gint result = document_find_text(doc, search_data.text, search_data.original_text, search_data.flags,
1126
1261
(response == GEANY_RESPONSE_FIND_PREVIOUS), TRUE, GTK_WIDGET(find_dlg.dialog));
1127
1262
ui_set_search_entry_background(find_dlg.entry, (result > -1));
1128
1263
check_close = FALSE;
1209
1344
GeanyDocument *doc = document_get_current();
1210
1345
gint search_flags_re;
1211
1346
gboolean search_backwards_re, search_replace_escape_re;
1212
gboolean close_window;
1213
gchar *find, *replace;
1347
gchar *find, *replace, *original_find = NULL, *original_replace = NULL;
1215
1349
gtk_window_get_position(GTK_WINDOW(replace_dlg.dialog),
1216
1350
&replace_dlg.position[0], &replace_dlg.position[1]);
1352
stash_group_update(replace_prefs, replace_dlg.dialog);
1218
1354
if (response == GTK_RESPONSE_CANCEL || response == GTK_RESPONSE_DELETE_EVENT)
1220
1356
gtk_widget_hide(replace_dlg.dialog);
1224
close_window = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1225
ui_lookup_widget(GTK_WIDGET(replace_dlg.dialog), "check_close")));
1226
search_backwards_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1227
ui_lookup_widget(GTK_WIDGET(replace_dlg.dialog), "check_back")));
1228
search_replace_escape_re = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
1229
ui_lookup_widget(GTK_WIDGET(replace_dlg.dialog), "check_escape")));
1360
search_backwards_re = settings.replace_search_backwards;
1361
search_replace_escape_re = settings.replace_escape_sequences;
1230
1362
find = g_strdup(gtk_entry_get_text(GTK_ENTRY(replace_dlg.find_entry)));
1231
1363
replace = g_strdup(gtk_entry_get_text(GTK_ENTRY(replace_dlg.replace_entry)));
1233
search_flags_re = get_search_flags(replace_dlg.dialog);
1365
search_flags_re = int_search_flags(settings.replace_case_sensitive,
1366
settings.replace_match_whole_word, settings.replace_regexp,
1367
settings.replace_match_word_start);
1235
1369
if ((response != GEANY_RESPONSE_FIND) && (search_flags_re & SCFIND_MATCHCASE)
1236
1370
&& (strcmp(find, replace) == 0))
1240
gtk_widget_grab_focus(replace_dlg.find_entry);
1373
original_find = g_strdup(find);
1374
original_replace = g_strdup(replace);
1245
1375
if (search_flags_re & SCFIND_REGEXP)
1247
1377
if (! utils_str_replace_escape(find, TRUE) ||
1258
1388
ui_combo_box_add_to_history(GTK_COMBO_BOX_ENTRY(
1259
gtk_widget_get_parent(replace_dlg.find_entry)), find, 0);
1389
gtk_widget_get_parent(replace_dlg.find_entry)), original_find, 0);
1260
1390
ui_combo_box_add_to_history(GTK_COMBO_BOX_ENTRY(
1261
gtk_widget_get_parent(replace_dlg.replace_entry)), replace, 0);
1391
gtk_widget_get_parent(replace_dlg.replace_entry)), original_replace, 0);
1263
1393
switch (response)
1265
1395
case GEANY_RESPONSE_REPLACE_AND_FIND:
1267
gint rep = document_replace_text(doc, find, replace, search_flags_re,
1397
gint rep = document_replace_text(doc, find, original_find, replace, search_flags_re,
1268
1398
search_backwards_re);
1270
document_find_text(doc, find, search_flags_re, search_backwards_re,
1400
document_find_text(doc, find, original_find, search_flags_re, search_backwards_re,
1274
1404
case GEANY_RESPONSE_REPLACE:
1275
document_replace_text(doc, find, replace, search_flags_re,
1405
document_replace_text(doc, find, original_find, replace, search_flags_re,
1276
1406
search_backwards_re);
1279
1409
case GEANY_RESPONSE_FIND:
1281
gint result = document_find_text(doc, find, search_flags_re,
1411
gint result = document_find_text(doc, find, original_find, search_flags_re,
1282
1412
search_backwards_re, TRUE, GTK_WIDGET(dialog));
1283
1413
ui_set_search_entry_background(replace_dlg.find_entry, (result > -1));
1286
1416
case GEANY_RESPONSE_REPLACE_IN_FILE:
1287
if (! document_replace_all(doc, find, replace, search_flags_re,
1288
search_replace_escape_re))
1417
if (! document_replace_all(doc, find, replace, original_find, original_replace, search_flags_re))
1292
1421
case GEANY_RESPONSE_REPLACE_IN_SESSION:
1293
replace_in_session(doc, search_flags_re, search_replace_escape_re, find, replace);
1422
replace_in_session(doc, search_flags_re, search_replace_escape_re, find, replace, original_find, original_replace);
1296
1425
case GEANY_RESPONSE_REPLACE_IN_SEL:
1297
document_replace_sel(doc, find, replace, search_flags_re, search_replace_escape_re);
1426
document_replace_sel(doc, find, replace, original_find, original_replace, search_flags_re);
1300
1429
switch (response)
1657
static gboolean pattern_list_match(GSList *patterns, const gchar *str)
1661
foreach_slist(item, patterns)
1663
if (g_pattern_match_string(item->data, str))
1517
1670
/* Creates an argument vector of strings, copying argv_prefix[] values for
1518
1671
* the first arguments, then followed by filenames found in dir.
1519
1672
* Returns NULL if no files were found, otherwise returned vector should be fully freed. */
1520
1673
static gchar **search_get_argv(const gchar **argv_prefix, const gchar *dir)
1522
guint prefix_len, list_len, i;
1675
guint prefix_len, list_len, i, j;
1524
GSList *list, *item;
1677
GSList *list, *item, *patterns = NULL;
1525
1678
GError *error = NULL;
1527
1680
g_return_val_if_fail(dir != NULL, NULL);
1540
1693
argv = g_new(gchar*, prefix_len + list_len + 1);
1542
for (i = 0; i < prefix_len; i++)
1543
argv[i] = g_strdup(argv_prefix[i]);
1545
foreach_slist(item, list)
1546
argv[i++] = item->data;
1695
for (i = 0, j = 0; i < prefix_len; i++)
1697
if (g_str_has_prefix(argv_prefix[i], "--include="))
1699
const gchar *pat = &(argv_prefix[i][10]); /* the pattern part of the argument */
1701
patterns = g_slist_prepend(patterns, g_pattern_spec_new(pat));
1704
argv[j++] = g_strdup(argv_prefix[i]);
1711
foreach_slist(item, list)
1713
if (pattern_list_match(patterns, item->data))
1714
argv[j++] = item->data;
1718
foreach_slist(pat, patterns)
1719
g_pattern_spec_free(pat->data);
1720
g_slist_free(patterns);
1724
foreach_slist(item, list)
1725
argv[j++] = item->data;
1549
1729
g_slist_free(list);
1880
2061
if (count == 0) /* no matches were found */
1882
ui_set_statusbar(FALSE, _("No matches found for \"%s\"."), search_text);
1883
msgwin_msg_add(COLOR_BLUE, -1, NULL, _("No matches found for \"%s\"."), search_text);
2063
ui_set_statusbar(FALSE, _("No matches found for \"%s\"."), original_search_text);
2064
msgwin_msg_add(COLOR_BLUE, -1, NULL, _("No matches found for \"%s\"."), original_search_text);
1887
2068
ui_set_statusbar(FALSE, ngettext(
1888
2069
"Found %d match for \"%s\".", "Found %d matches for \"%s\".", count),
1889
count, search_text);
2070
count, original_search_text);
1890
2071
msgwin_msg_add(COLOR_BLUE, -1, NULL, ngettext(
1891
2072
"Found %d match for \"%s\".", "Found %d matches for \"%s\".", count),
1892
count, search_text);
2073
count, original_search_text);