1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 /*
3  * Copyright (C) 2004 Fernando Herrera <fherrera@onirica.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 #include "gconf-search.h"
20 #include "gconf-search-dialog.h"
21 #include "gconf-editor-window.h"
22 #include "gconf-tree-model.h"
23 #include "gconf-list-model.h"
24 #include "gedit-output-window.h"
25 #include <gconf/gconf-client.h>
26 #include <gtk/gtk.h>
27 #include <glib/gi18n.h>
28 #include <string.h>
29 
30 #include "gconf-stock-icons.h"
31 
G_DEFINE_TYPE(GConfSearchDialog,gconf_search_dialog,GTK_TYPE_DIALOG)32 G_DEFINE_TYPE(GConfSearchDialog, gconf_search_dialog, GTK_TYPE_DIALOG)
33 
34 static void
35 gconf_search_dialog_response (GtkDialog *dialog, gint response_id)
36 {
37 	gtk_widget_destroy (GTK_WIDGET (dialog));
38 }
39 
40 static void
gconf_search_dialog_class_init(GConfSearchDialogClass * klass)41 gconf_search_dialog_class_init (GConfSearchDialogClass *klass)
42 {
43 	GtkDialogClass *dialog_class;
44 
45 	dialog_class = (GtkDialogClass *)klass;
46 
47 	dialog_class->response = gconf_search_dialog_response;
48 }
49 
50 
51 static void
gconf_search_not_found_dialog(GConfSearchDialog * dialog)52 gconf_search_not_found_dialog (GConfSearchDialog *dialog)
53 {
54 	GtkWidget *not_found_dialog;
55 
56 	not_found_dialog = gtk_message_dialog_new (GTK_WINDOW (dialog),
57 						   GTK_DIALOG_DESTROY_WITH_PARENT,
58 						   GTK_MESSAGE_ERROR,
59 						   GTK_BUTTONS_CLOSE,
60 						   _("Pattern not found"));
61 	gtk_dialog_run (GTK_DIALOG (not_found_dialog));
62 	gtk_widget_destroy (GTK_WIDGET (not_found_dialog));
63 }
64 
65 static void
gconf_search_entry_changed(GtkEntry * entry,GConfSearchDialog * dialog)66 gconf_search_entry_changed (GtkEntry *entry, GConfSearchDialog *dialog)
67 {
68         gboolean find_sensitive;
69         const gchar *text;
70 
71         text = gtk_entry_get_text (GTK_ENTRY (entry));
72         find_sensitive = text != NULL && text[0] != '\0';
73 
74         gtk_widget_set_sensitive (dialog->search_button, find_sensitive);
75 }
76 
77 static void
gconf_search_dialog_search(GtkWidget * button,GConfSearchDialog * dialog)78 gconf_search_dialog_search (GtkWidget *button, GConfSearchDialog *dialog)
79 {
80 	GConfEditorWindow *window;
81 	GdkCursor *cursor;
82 	GdkWindow *dialog_window;
83 
84 	gchar *pattern;
85 	int res;
86 
87 	window = g_object_get_data (G_OBJECT (dialog), "editor-window");
88 	gedit_output_window_clear (GEDIT_OUTPUT_WINDOW (window->output_window));
89 	window->output_window_type = GCONF_EDITOR_WINDOW_OUTPUT_WINDOW_SEARCH;
90 
91 	pattern = g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->entry)));
92 	dialog_window = gtk_widget_get_window (GTK_WIDGET (dialog));
93 
94 	cursor = gdk_cursor_new (GDK_WATCH);
95 	gdk_window_set_cursor (dialog_window, cursor);
96 	gdk_cursor_unref (cursor);
97 	gdk_display_flush (gtk_widget_get_display (GTK_WIDGET (dialog)));
98 
99 	res = gconf_tree_model_build_match_list  (GCONF_TREE_MODEL (window->tree_model),
100 						  GEDIT_OUTPUT_WINDOW (window->output_window),
101 						  pattern,
102 						  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->search_in_keys)),
103 						  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->search_in_values)),
104 						  G_OBJECT (dialog));
105 
106 	g_free (pattern);
107 
108 	if (dialog != NULL && GTK_IS_WIDGET (dialog)) {
109 		gdk_window_set_cursor (dialog_window, NULL);
110 		gdk_display_flush (gtk_widget_get_display (GTK_WIDGET (dialog)));
111 
112 		if (res != 0) {
113 			gtk_widget_destroy (GTK_WIDGET (dialog));
114 		} else {
115 			gconf_search_not_found_dialog (dialog);
116 		}
117 	}
118 }
119 
120 static void
gconf_search_dialog_init(GConfSearchDialog * dialog)121 gconf_search_dialog_init (GConfSearchDialog *dialog)
122 {
123 	GtkWidget *action_area, *content_area;
124 	GtkWidget *hbox;
125 	GtkWidget *vbox;
126 	GtkWidget *label;
127 
128 	content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
129 	action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
130 
131 	gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
132 	gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
133 	gtk_box_set_spacing (GTK_BOX (content_area), 2);
134 
135 	hbox = gtk_hbox_new (FALSE, 12);
136 	vbox = gtk_vbox_new (FALSE, 6);
137 	gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
138 
139 	gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
140 
141 	gtk_window_set_title (GTK_WINDOW (dialog), _("Find"));
142 
143 	label = gtk_label_new_with_mnemonic (_("_Search for: "));
144 
145 	dialog->entry = gtk_entry_new ();
146 	g_signal_connect (dialog->entry, "changed",
147 			  G_CALLBACK (gconf_search_entry_changed), dialog);
148 	gtk_label_set_mnemonic_widget (GTK_LABEL(label), GTK_WIDGET(dialog->entry));
149 
150 	dialog->search_button = gtk_button_new_from_stock (GTK_STOCK_FIND);
151 	gtk_widget_set_sensitive (dialog->search_button, FALSE);
152 	g_signal_connect (dialog->search_button, "clicked",
153 			  G_CALLBACK (gconf_search_dialog_search), dialog);
154 
155 	gtk_widget_set_can_default (dialog->search_button, TRUE);
156 	gtk_window_set_default(GTK_WINDOW(dialog), dialog->search_button);
157 	gtk_entry_set_activates_default(GTK_ENTRY(dialog->entry), TRUE);
158 
159 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
160 	gtk_box_pack_start (GTK_BOX (hbox), dialog->entry, FALSE, FALSE, 0);
161 
162 	gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
163 
164 	dialog->search_in_keys = gtk_check_button_new_with_mnemonic (_("Search also in key _names"));
165 	gtk_box_pack_start (GTK_BOX (vbox), dialog->search_in_keys, TRUE, TRUE, 0);
166 
167 	dialog->search_in_values = gtk_check_button_new_with_mnemonic (_("Search also in key _values"));
168 	gtk_box_pack_start (GTK_BOX (vbox), dialog->search_in_values, TRUE, TRUE, 0);
169 
170 	gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
171 	gtk_box_pack_start (GTK_BOX (action_area), dialog->search_button, TRUE, TRUE, 0);
172 	gtk_widget_show_all (action_area);
173 	gtk_widget_show_all (vbox);
174 
175 	gtk_widget_show_all (hbox);
176 }
177 
178 GtkWidget *
gconf_search_dialog_new(GtkWindow * parent)179 gconf_search_dialog_new (GtkWindow *parent)
180 {
181 	GtkWidget *dialog;
182 
183 	dialog = g_object_new (GCONF_TYPE_SEARCH_DIALOG, NULL);
184 	g_object_set_data (G_OBJECT (dialog), "editor-window", parent);
185 	gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
186 	gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
187 
188 	return dialog;
189 }
190