search: Get files from project manager according to the selection
[anjuta.git] / plugins / document-manager / search-files.c
blob54f5bbfecc772fb790f16eb35a5dee56cfbf5a74
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta
4 * Copyright (C) Johannes Schmid 2012 <jhs@gnome.org>
5 *
6 * anjuta is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * anjuta is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "search-files.h"
21 #include "search-file-command.h"
22 #include <libanjuta/anjuta-command-queue.h>
23 #include <libanjuta/interfaces/ianjuta-project-manager.h>
24 #include <libanjuta/interfaces/ianjuta-project-chooser.h>
26 #define BUILDER_FILE PACKAGE_DATA_DIR"/glade/anjuta-document-manager.ui"
28 struct _SearchFilesPrivate
30 GtkBuilder* builder;
32 GtkWidget* main_box;
34 GtkWidget* search_button;
35 GtkWidget* replace_button;
36 GtkWidget* find_files_button;
38 GtkWidget* search_entry;
39 GtkWidget* replace_entry;
41 GtkWidget* files_combo;
42 GtkWidget* project_combo;
43 GtkWidget* file_type_combo;
45 GtkWidget* case_check;
46 GtkWidget* regex_check;
48 GtkWidget* spinner_busy;
50 GtkWidget* files_tree;
51 GtkTreeModel* files_model;
53 GtkWidget* files_tree_check;
55 AnjutaDocman* docman;
56 SearchBox* search_box;
57 GtkWidget* dialog;
59 /* Saved from last search */
60 gboolean case_sensitive;
61 gboolean regex;
62 gchar* last_search_string;
63 gchar* last_replace_string;
65 gboolean busy;
68 enum
70 COLUMN_SELECTED,
71 COLUMN_FILENAME,
72 COLUMN_COUNT,
73 COLUMN_PULSE,
74 COLUMN_SPINNER,
75 COLUMN_FILE,
76 COLUMN_ERROR_TOOLTIP,
77 COLUMN_ERROR_CODE,
78 N_COLUMNS
81 G_DEFINE_TYPE (SearchFiles, search_files, G_TYPE_OBJECT);
83 void search_files_search_clicked (SearchFiles* sf);
84 void search_files_replace_clicked (SearchFiles* sf);
85 void search_files_find_files_clicked (SearchFiles* sf);
86 void search_files_update_ui (SearchFiles* sf);
89 void
90 search_files_update_ui (SearchFiles* sf)
92 GtkTreeIter iter;
93 gboolean can_search = FALSE;
95 if (!sf->priv->busy)
97 gtk_spinner_stop(GTK_SPINNER (sf->priv->spinner_busy));
98 gtk_widget_hide (sf->priv->spinner_busy);
100 if (strlen(gtk_entry_get_text (GTK_ENTRY (sf->priv->search_entry))) > 0
101 && gtk_tree_model_get_iter_first(sf->priv->files_model, &iter))
105 gboolean selected;
106 gtk_tree_model_get (sf->priv->files_model, &iter,
107 COLUMN_SELECTED, &selected, -1);
108 if (selected)
110 can_search = TRUE;
111 break;
114 while (gtk_tree_model_iter_next(sf->priv->files_model, &iter));
117 else
119 gtk_spinner_start(GTK_SPINNER (sf->priv->spinner_busy));
120 gtk_widget_show (sf->priv->spinner_busy);
123 gtk_widget_set_sensitive (sf->priv->search_button, can_search);
124 gtk_widget_set_sensitive (sf->priv->replace_button, can_search);
125 gtk_widget_set_sensitive (sf->priv->find_files_button, !sf->priv->busy);
128 static void
129 search_files_get_files (GFile* parent, GList** files, IAnjutaProjectManager* pm)
131 GList* node;
132 GList* children = ianjuta_project_manager_get_children(pm, parent, NULL);
133 for (node = children;node != NULL; node = g_list_next(node))
135 search_files_get_files(G_FILE(node->data), files, pm);
136 *files = g_list_append (*files, node->data);
138 g_list_foreach (children, (GFunc)g_object_unref, NULL);
139 g_list_free(children);
142 static void
143 search_files_check_column_toggled (GtkCellRendererToggle* renderer,
144 gchar* path,
145 SearchFiles* sf)
147 GtkTreePath* tree_path;
148 GtkTreeIter iter;
149 gboolean state;
151 if (sf->priv->busy)
152 return;
154 tree_path = gtk_tree_path_new_from_string(path);
155 gtk_tree_model_get_iter (sf->priv->files_model, &iter, tree_path);
157 gtk_tree_path_free(tree_path);
159 gtk_tree_model_get (sf->priv->files_model, &iter,
160 COLUMN_SELECTED, &state, -1);
162 gtk_list_store_set (GTK_LIST_STORE (sf->priv->files_model), &iter,
163 COLUMN_SELECTED, !state,
164 -1);
167 static void
168 search_files_finished (SearchFiles* sf, AnjutaCommandQueue* queue)
170 sf->priv->busy = FALSE;
171 g_object_unref (queue);
173 search_files_update_ui(sf);
176 static void
177 search_files_command_finished (SearchFileCommand* cmd,
178 guint return_code,
179 SearchFiles* sf)
181 GtkTreeIter iter;
182 GtkTreeRowReference* tree_ref;
183 GtkTreePath* path;
185 tree_ref = g_object_get_data (G_OBJECT (cmd),
186 "__tree_ref");
187 path = gtk_tree_row_reference_get_path(tree_ref);
189 gtk_tree_model_get_iter(sf->priv->files_model, &iter, path);
190 gtk_list_store_set (GTK_LIST_STORE (sf->priv->files_model),
191 &iter,
192 COLUMN_COUNT, search_file_command_get_n_matches(cmd),
193 COLUMN_ERROR_CODE, return_code,
194 COLUMN_ERROR_TOOLTIP, NULL,
195 -1);
196 gtk_tree_row_reference_free(tree_ref);
197 gtk_tree_path_free(path);
199 if (return_code)
201 gtk_list_store_set (GTK_LIST_STORE (sf->priv->files_model),
202 &iter,
203 COLUMN_ERROR_CODE, return_code,
204 COLUMN_ERROR_TOOLTIP,
205 anjuta_command_get_error_message(ANJUTA_COMMAND(cmd)),
206 -1);
209 g_object_unref (cmd);
212 void
213 search_files_search_clicked (SearchFiles* sf)
215 GtkTreeIter iter;
217 if (gtk_tree_model_get_iter_first(sf->priv->files_model, &iter))
219 AnjutaCommandQueue* queue = anjuta_command_queue_new(ANJUTA_COMMAND_QUEUE_EXECUTE_MANUAL);
220 const gchar* pattern =
221 gtk_entry_get_text (GTK_ENTRY (sf->priv->search_entry));
224 GFile* file;
225 gboolean selected;
227 /* Save the current values */
228 sf->priv->regex =
229 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (sf->priv->regex_check));
230 sf->priv->case_sensitive =
231 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (sf->priv->case_check));
233 g_free (sf->priv->last_search_string);
234 sf->priv->last_search_string = g_strdup(pattern);
235 g_free (sf->priv->last_replace_string);
236 sf->priv->last_replace_string = NULL;
238 gtk_tree_model_get (sf->priv->files_model, &iter,
239 COLUMN_FILE, &file,
240 COLUMN_SELECTED, &selected, -1);
241 if (selected)
243 GtkTreePath* path;
244 GtkTreeRowReference* ref;
246 path = gtk_tree_model_get_path(sf->priv->files_model, &iter);
247 ref = gtk_tree_row_reference_new(sf->priv->files_model,
248 path);
249 gtk_tree_path_free(path);
252 SearchFileCommand* cmd = search_file_command_new(file,
253 pattern,
254 NULL,
255 sf->priv->case_sensitive,
256 sf->priv->regex);
257 g_object_set_data (G_OBJECT (cmd), "__tree_ref",
258 ref);
260 g_signal_connect (cmd, "command-finished",
261 G_CALLBACK(search_files_command_finished), sf);
263 anjuta_command_queue_push(queue,
264 ANJUTA_COMMAND(cmd));
266 g_object_unref (file);
268 while (gtk_tree_model_iter_next(sf->priv->files_model, &iter));
270 g_signal_connect_swapped (queue, "finished", G_CALLBACK (search_files_finished), sf);
272 anjuta_command_queue_start (queue);
273 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (sf->priv->files_model),
274 COLUMN_COUNT,
275 GTK_SORT_DESCENDING);
277 sf->priv->busy = TRUE;
278 search_files_update_ui(sf);
282 void
283 search_files_replace_clicked (SearchFiles* sf)
285 GtkTreeIter iter;
287 if (gtk_tree_model_get_iter_first(sf->priv->files_model, &iter))
289 AnjutaCommandQueue* queue = anjuta_command_queue_new(ANJUTA_COMMAND_QUEUE_EXECUTE_MANUAL);
290 const gchar* pattern =
291 gtk_entry_get_text (GTK_ENTRY (sf->priv->search_entry));
292 const gchar* replace =
293 gtk_entry_get_text (GTK_ENTRY (sf->priv->replace_entry));
296 GFile* file;
297 gboolean selected;
299 /* Save the current values */
300 sf->priv->regex =
301 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (sf->priv->regex_check));
302 sf->priv->case_sensitive =
303 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (sf->priv->case_check));
305 g_free (sf->priv->last_search_string);
306 sf->priv->last_search_string = g_strdup(pattern);
307 g_free (sf->priv->last_replace_string);
308 sf->priv->last_replace_string = g_strdup(replace);
310 gtk_tree_model_get (sf->priv->files_model, &iter,
311 COLUMN_FILE, &file,
312 COLUMN_SELECTED, &selected, -1);
313 if (selected)
315 GtkTreePath* path;
316 GtkTreeRowReference* ref;
318 path = gtk_tree_model_get_path(sf->priv->files_model, &iter);
319 ref = gtk_tree_row_reference_new(sf->priv->files_model,
320 path);
321 gtk_tree_path_free(path);
324 SearchFileCommand* cmd = search_file_command_new(file,
325 pattern,
326 replace,
327 sf->priv->case_sensitive,
328 sf->priv->regex);
329 g_object_set_data (G_OBJECT (cmd), "__tree_ref",
330 ref);
332 g_signal_connect (cmd, "command-finished",
333 G_CALLBACK(search_files_command_finished), sf);
335 anjuta_command_queue_push(queue,
336 ANJUTA_COMMAND(cmd));
338 g_object_unref (file);
340 while (gtk_tree_model_iter_next(sf->priv->files_model, &iter));
342 g_signal_connect_swapped (queue, "finished", G_CALLBACK (search_files_finished), sf);
344 anjuta_command_queue_start (queue);
345 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (sf->priv->files_model),
346 COLUMN_COUNT,
347 GTK_SORT_DESCENDING);
349 sf->priv->busy = TRUE;
350 search_files_update_ui(sf);
354 void
355 search_files_find_files_clicked (SearchFiles* sf)
357 GFile* selected;
358 IAnjutaProjectManager* pm;
359 GList* files = NULL;
360 GList* file;
362 gchar* project_uri = NULL;
363 GFile* project_file = NULL;
365 g_return_if_fail (sf != NULL && SEARCH_IS_FILES (sf));
367 pm = anjuta_shell_get_interface (sf->priv->docman->shell,
368 IAnjutaProjectManager,
369 NULL);
371 selected =
372 ianjuta_project_chooser_get_selected(IANJUTA_PROJECT_CHOOSER (sf->priv->project_combo),
373 NULL);
375 search_files_get_files (selected, &files, pm);
377 gtk_list_store_clear(GTK_LIST_STORE (sf->priv->files_model));
378 anjuta_shell_get (sf->priv->docman->shell,
379 IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI,
380 G_TYPE_STRING,
381 &project_uri, NULL);
383 if (project_uri)
384 project_file = g_file_new_for_uri (project_uri);
385 g_free (project_uri);
387 for (file = files; file != NULL; file = g_list_next (file))
389 GtkTreeIter iter;
391 gchar* display_name = NULL;
393 if (project_file)
395 display_name = g_file_get_relative_path (project_file,
396 G_FILE (file->data));
397 if (!display_name)
398 continue;
400 #if 0
401 if (!display_name)
402 display_name = g_file_get_path (G_FILE (file->data));
403 if (!display_name)
404 display_name = g_file_get_uri (G_FILE (file->data));
405 #endif
406 gtk_list_store_append(GTK_LIST_STORE (sf->priv->files_model),
407 &iter);
408 gtk_list_store_set (GTK_LIST_STORE (sf->priv->files_model), &iter,
409 COLUMN_SELECTED, TRUE,
410 COLUMN_FILENAME, display_name,
411 COLUMN_FILE, file->data,
412 COLUMN_COUNT, 0,
413 COLUMN_SPINNER, FALSE,
414 COLUMN_PULSE, FALSE, -1);
416 g_object_unref (project_file);
418 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (sf->priv->files_model),
419 COLUMN_FILENAME,
420 GTK_SORT_DESCENDING);
422 g_list_foreach (files, (GFunc) g_object_unref, NULL);
423 g_list_free (files);
426 static void
427 search_files_render_count (GtkTreeViewColumn *tree_column,
428 GtkCellRenderer *cell,
429 GtkTreeModel *tree_model,
430 GtkTreeIter *iter,
431 gpointer data)
433 int count;
434 gchar* count_str;
436 gtk_tree_model_get (tree_model, iter,
437 COLUMN_COUNT, &count,
438 -1);
439 count_str = g_strdup_printf("%d", count);
440 g_object_set (cell, "text", count_str, NULL);
441 g_free (count_str);
444 static void
445 search_files_editor_loaded (SearchFiles* sf, IAnjutaEditor* editor)
447 search_box_set_search_string(sf->priv->search_box,
448 sf->priv->last_search_string);
449 if (sf->priv->last_replace_string)
451 search_box_set_replace_string(sf->priv->search_box,
452 sf->priv->last_replace_string);
453 search_box_set_replace(sf->priv->search_box,
454 TRUE);
456 else
458 search_box_set_replace(sf->priv->search_box,
459 FALSE);
461 search_box_toggle_case_sensitive(sf->priv->search_box,
462 sf->priv->case_sensitive);
463 search_box_toggle_highlight(sf->priv->search_box,
464 TRUE);
465 search_box_toggle_regex(sf->priv->search_box,
466 sf->priv->regex);
467 search_box_search_highlight_all(sf->priv->search_box, TRUE);
468 search_box_incremental_search(sf->priv->search_box, TRUE, FALSE);
470 gtk_widget_show (GTK_WIDGET(sf->priv->search_box));
474 static void
475 search_files_result_activated (GtkTreeView* files_tree,
476 GtkTreePath* path,
477 GtkTreeViewColumn* column,
478 SearchFiles* sf)
480 IAnjutaDocument* editor;
481 GFile* file;
482 GtkTreeIter iter;
484 gtk_tree_model_get_iter (sf->priv->files_model, &iter, path);
485 gtk_tree_model_get (sf->priv->files_model, &iter,
486 COLUMN_FILE, &file, -1);
488 /* Check if document is open */
489 editor = anjuta_docman_get_document_for_file(sf->priv->docman, file);
491 if (editor && IANJUTA_IS_EDITOR(editor))
493 search_files_editor_loaded (sf, IANJUTA_EDITOR(editor));
495 else
497 IAnjutaEditor* real_editor =
498 anjuta_docman_goto_file_line(sf->priv->docman, file, 0);
499 if (real_editor)
500 g_signal_connect_swapped (real_editor, "opened",
501 G_CALLBACK (search_files_editor_loaded), sf);
504 g_object_unref (file);
507 static void
508 search_files_init_tree (SearchFiles* sf)
510 GtkTreeViewColumn* column_select;
511 GtkTreeViewColumn* column_filename;
512 GtkTreeViewColumn* column_count;
514 GtkCellRenderer* selection_renderer;
515 GtkCellRenderer* filename_renderer;
516 GtkCellRenderer* count_renderer;
517 GtkCellRenderer* error_renderer;
519 column_select = gtk_tree_view_column_new();
520 sf->priv->files_tree_check = gtk_check_button_new();
521 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sf->priv->files_tree_check),
522 TRUE);
523 gtk_widget_show (sf->priv->files_tree_check);
524 gtk_tree_view_column_set_widget(column_select,
525 sf->priv->files_tree_check);
526 selection_renderer = gtk_cell_renderer_toggle_new ();
527 gtk_tree_view_column_pack_start(column_select,
528 selection_renderer,
529 FALSE);
530 gtk_tree_view_column_add_attribute(column_select,
531 selection_renderer,
532 "active",
533 COLUMN_SELECTED);
534 g_signal_connect (selection_renderer, "toggled",
535 G_CALLBACK(search_files_check_column_toggled), sf);
536 gtk_tree_view_column_set_sort_column_id(column_select,
537 COLUMN_SELECTED);
539 column_filename = gtk_tree_view_column_new();
540 gtk_tree_view_column_set_expand(column_filename,
541 TRUE);
542 gtk_tree_view_column_set_title (column_filename, _("Filename"));
543 filename_renderer = gtk_cell_renderer_text_new();
544 gtk_tree_view_column_pack_start(column_filename,
545 filename_renderer,
546 TRUE);
547 gtk_tree_view_column_add_attribute (column_filename,
548 filename_renderer,
549 "text",
550 COLUMN_FILENAME);
551 gtk_tree_view_column_add_attribute (column_filename,
552 filename_renderer,
553 "sensitive",
554 COLUMN_COUNT);
555 gtk_tree_view_column_set_sort_column_id(column_filename,
556 COLUMN_FILENAME);
557 error_renderer = gtk_cell_renderer_pixbuf_new();
558 g_object_set (error_renderer, "stock-id", GTK_STOCK_DIALOG_ERROR, NULL);
559 gtk_tree_view_column_pack_start(column_filename,
560 error_renderer,
561 FALSE);
562 gtk_tree_view_column_add_attribute (column_filename,
563 error_renderer,
564 "visible",
565 COLUMN_ERROR_CODE);
567 column_count = gtk_tree_view_column_new();
568 gtk_tree_view_column_set_title (column_count, "#");
569 count_renderer = gtk_cell_renderer_text_new();
570 gtk_tree_view_column_pack_start(column_count,
571 count_renderer,
572 TRUE);
573 gtk_tree_view_column_add_attribute (column_count,
574 count_renderer,
575 "sensitive",
576 COLUMN_COUNT);
577 gtk_tree_view_column_set_cell_data_func(column_count,
578 count_renderer,
579 search_files_render_count,
580 NULL,
581 NULL);
582 gtk_tree_view_column_set_sort_column_id(column_count,
583 COLUMN_COUNT);
585 sf->priv->files_model = GTK_TREE_MODEL (gtk_list_store_new (N_COLUMNS,
586 G_TYPE_BOOLEAN,
587 G_TYPE_STRING,
588 G_TYPE_INT,
589 G_TYPE_BOOLEAN,
590 G_TYPE_BOOLEAN,
591 G_TYPE_FILE,
592 G_TYPE_STRING,
593 G_TYPE_INT));
594 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (sf->priv->files_model),
595 COLUMN_FILENAME,
596 GTK_SORT_DESCENDING);
598 g_signal_connect_swapped (sf->priv->files_model,
599 "row-inserted",
600 G_CALLBACK (search_files_update_ui),
601 sf);
602 g_signal_connect_swapped (sf->priv->files_model,
603 "row-deleted",
604 G_CALLBACK (search_files_update_ui),
605 sf);
606 g_signal_connect_swapped (sf->priv->files_model,
607 "row-changed",
608 G_CALLBACK (search_files_update_ui),
609 sf);
611 gtk_tree_view_set_model (GTK_TREE_VIEW (sf->priv->files_tree), sf->priv->files_model);
612 gtk_tree_view_append_column(GTK_TREE_VIEW (sf->priv->files_tree),
613 column_select);
614 gtk_tree_view_append_column(GTK_TREE_VIEW (sf->priv->files_tree),
615 column_filename);
616 gtk_tree_view_append_column(GTK_TREE_VIEW (sf->priv->files_tree),
617 column_count);
618 gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW (sf->priv->files_tree),
619 COLUMN_ERROR_TOOLTIP);
620 g_signal_connect (sf->priv->files_tree, "row-activated",
621 G_CALLBACK (search_files_result_activated), sf);
624 static void
625 search_files_init (SearchFiles* sf)
627 GError* error = NULL;
628 GtkCellRenderer* combo_renderer;
630 sf->priv =
631 G_TYPE_INSTANCE_GET_PRIVATE (sf, SEARCH_TYPE_FILES, SearchFilesPrivate);
633 sf->priv->builder = gtk_builder_new();
634 gtk_builder_add_from_file(sf->priv->builder, BUILDER_FILE, &error);
636 if (error)
638 g_warning("Could load ui file for search files: %s",
639 error->message);
640 g_error_free(error);
641 return;
644 combo_renderer = gtk_cell_renderer_text_new();
646 sf->priv->main_box = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
647 "main_box"));
648 sf->priv->search_button = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
649 "search_button"));
650 sf->priv->replace_button = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
651 "replace_button"));
652 sf->priv->find_files_button = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
653 "find_files_button"));
654 sf->priv->search_entry = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
655 "search_entry"));
656 sf->priv->replace_entry = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
657 "replace_entry"));
658 sf->priv->project_combo = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
659 "project_combo"));
660 sf->priv->file_type_combo = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
661 "file_type_combo"));
662 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (sf->priv->file_type_combo),
663 combo_renderer, TRUE);
664 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (sf->priv->file_type_combo),
665 combo_renderer, "text", 0);
667 sf->priv->case_check = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
668 "case_check"));
669 sf->priv->regex_check = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
670 "regex_check"));
671 sf->priv->spinner_busy = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
672 "spinner_busy"));
674 sf->priv->files_tree = GTK_WIDGET (gtk_builder_get_object(sf->priv->builder,
675 "files_tree"));
677 search_files_init_tree(sf);
679 gtk_builder_connect_signals(sf->priv->builder, sf);
681 g_object_ref (sf->priv->main_box);
682 gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (sf->priv->main_box)),
683 sf->priv->main_box);
686 static void
687 search_files_finalize (GObject* object)
689 SearchFiles* sf = SEARCH_FILES(object);
691 g_object_unref (sf->priv->main_box);
692 g_object_unref (sf->priv->builder);
694 G_OBJECT_CLASS (search_files_parent_class)->finalize (object);
697 static void
698 search_files_class_init (SearchFilesClass* klass)
700 GObjectClass* object_class = G_OBJECT_CLASS (klass);
702 object_class->finalize = search_files_finalize;
704 g_type_class_add_private(klass, sizeof(SearchFilesPrivate));
707 static void
708 search_files_project_loaded (SearchFiles* sf, IAnjutaProjectManager *pm, GError* e)
710 if (!e)
712 ianjuta_project_chooser_set_project_model(IANJUTA_PROJECT_CHOOSER(sf->priv->project_combo),
714 ANJUTA_PROJECT_GROUP,
715 NULL);
719 SearchFiles*
720 search_files_new (AnjutaDocman* docman, SearchBox* search_box)
722 AnjutaShell* shell = docman->shell;
723 GObject* obj = g_object_new (SEARCH_TYPE_FILES, NULL);
724 SearchFiles* sf = SEARCH_FILES(obj);
725 IAnjutaProjectManager* pm = anjuta_shell_get_interface(shell,
726 IAnjutaProjectManager,
727 NULL);
728 search_files_project_loaded(sf, pm, NULL);
729 g_signal_connect_swapped (pm, "project-loaded",
730 G_CALLBACK (search_files_project_loaded), NULL);
732 anjuta_shell_add_widget(shell, sf->priv->main_box,
733 "search_files",
734 _("Find in files"),
735 GTK_STOCK_FIND_AND_REPLACE,
736 ANJUTA_SHELL_PLACEMENT_BOTTOM, NULL);
738 sf->priv->docman = docman;
739 sf->priv->search_box = search_box;
741 gtk_widget_show (sf->priv->main_box);
743 search_files_update_ui(sf);
745 return sf;
748 void search_files_present (SearchFiles* sf)
750 g_return_if_fail (sf != NULL && SEARCH_IS_FILES(sf));
752 gtk_entry_set_text (GTK_ENTRY (sf->priv->search_entry),
753 search_box_get_search_string(sf->priv->search_box));
754 gtk_entry_set_text (GTK_ENTRY (sf->priv->replace_entry),
755 search_box_get_replace_string(sf->priv->search_box));
757 anjuta_shell_present_widget(sf->priv->docman->shell,
758 sf->priv->main_box,
759 NULL);