1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /***************************************************************************
5 * Sat Nov 27 18:26:50 2004
6 * Copyright 2004 Jean-Noel GUIHENEUF
7 * guiheneuf.jean-noel@wanadoo.fr
8 ****************************************************************************/
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Library General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
34 #include <gconf/gconf-client.h>
36 #include "search-replace_backend.h"
37 #include "search-replace.h"
38 #include "search_preferences.h"
41 enum {PREF_DEFAULT_COLUMN
, PREF_NAME_COLUMN
, PREF_ACTIVE_COLUMN
};
43 #define SEARCH_PREF_PATH "/apps/anjuta/search_preferences"
44 #define BASIC _("Basic Search")
47 static GSList
*list_pref
= NULL
;
48 static gchar
*default_pref
= NULL
;
50 static SearchReplace
*sr
= NULL
;
54 static GSList
*search_preferences_find_setting(gchar
*name
);
55 static gboolean
on_search_preferences_clear_default_foreach (GtkTreeModel
*model
,
56 GtkTreePath
*path
, GtkTreeIter
*iter
, gpointer data
);
57 static gboolean
on_search_preferences_setting_inactive (GtkTreeModel
*model
,
58 GtkTreePath
*path
, GtkTreeIter
*iter
, gpointer data
);
59 static void search_preferences_update_entry(gchar
*name
);
60 static void search_preferences_read_setting(gchar
*name
);
61 static void search_preferences_setting_by_default(void);
62 static void search_preferences_save_setting(gchar
*name
);
63 static void search_preferences_save_search_pref(gchar
*name
);
64 static GtkTreeModel
* search_preferences_get_model(void);
65 static void search_preferences_add_treeview(gchar
*name
);
66 static void search_preferences_remove_setting(gchar
*name
);
67 static void search_preferences_activate_default(gchar
*name
);
68 static void search_preferences_active_selection_row(GtkTreeView
*view
);
69 static void on_search_preferences_colorize_setting (GtkTreeViewColumn
*tree_column
,
70 GtkCellRenderer
*cell
, GtkTreeModel
*tree_model
,
71 GtkTreeIter
*iter
, gpointer data
);
72 static void on_search_preferences_row_activated (GtkTreeView
*view
,
73 GtkTreePath
*tree_path
,
74 GtkTreeViewColumn
*view_column
,
75 GtkCellRenderer
*renderer
);
76 static void on_search_preferences_treeview_enable_toggle (GtkCellRendererToggle
*cell
,
77 gchar
*path_str
, gpointer data
);
78 static gboolean
search_preferences_name_is_valid(gchar
*name
);
79 void search_preferences_initialize_setting_treeview(GtkWidget
*dialog
);
85 search_preferences_find_setting(gchar
*name
)
89 for(list
= list_pref
; list
; list
=g_slist_next(list
))
91 if (g_ascii_strcasecmp(name
, list
->data
) == 0)
99 on_search_preferences_clear_default_foreach (GtkTreeModel
*model
, GtkTreePath
*path
,
100 GtkTreeIter
*iter
, gpointer data
)
105 gtk_tree_model_get (model
, iter
, PREF_NAME_COLUMN
, &t_name
,
106 PREF_ACTIVE_COLUMN
, &active
, -1);
107 if ((data
!= NULL
) && (g_ascii_strcasecmp(t_name
, (gchar
*) data
) == 0))
108 gtk_tree_store_set (GTK_TREE_STORE (model
), iter
,
109 PREF_DEFAULT_COLUMN
, TRUE
,
110 PREF_ACTIVE_COLUMN
, TRUE
, -1);
112 gtk_tree_store_set (GTK_TREE_STORE (model
), iter
,
113 PREF_DEFAULT_COLUMN
, FALSE
,
120 on_search_preferences_setting_inactive (GtkTreeModel
*model
, GtkTreePath
*path
,
121 GtkTreeIter
*iter
, gpointer data
)
123 gtk_tree_store_set (GTK_TREE_STORE (model
), iter
, PREF_ACTIVE_COLUMN
, FALSE
, -1);
129 search_preferences_update_entry(gchar
*name
)
131 GtkWidget
*pref_entry
;
133 pref_entry
= sr_get_gladewidget(SETTING_PREF_ENTRY
)->widget
;
134 gtk_entry_set_text(GTK_ENTRY(pref_entry
), name
);
139 search_preferences_read_setting(gchar
*name
)
143 client
= gconf_client_get_default();
145 sr
->search
.expr
.regex
= gconf_client_get_bool(client
,
146 gconf_concat_dir_and_key(name
, "regex"), NULL
);
147 sr
->search
.expr
.greedy
= gconf_client_get_bool(client
,
148 gconf_concat_dir_and_key(name
, "greedy"), NULL
);
149 sr
->search
.expr
.ignore_case
= gconf_client_get_bool(client
,
150 gconf_concat_dir_and_key(name
, "ignore_case"), NULL
);
151 sr
->search
.expr
.whole_word
= gconf_client_get_bool(client
,
152 gconf_concat_dir_and_key(name
, "whole_word"), NULL
);
153 sr
->search
.expr
.whole_line
= gconf_client_get_bool(client
,
154 gconf_concat_dir_and_key(name
, "whole_line"), NULL
);
155 sr
->search
.expr
.word_start
= gconf_client_get_bool(client
,
156 gconf_concat_dir_and_key(name
, "word_start"), NULL
);
157 sr
->search
.expr
.no_limit
= gconf_client_get_bool(client
,
158 gconf_concat_dir_and_key(name
, "no_limit"), NULL
);
159 sr
->search
.expr
.actions_max
= gconf_client_get_int(client
,
160 gconf_concat_dir_and_key(name
, "actions_max"), NULL
);
161 sr
->search
.range
.type
= gconf_client_get_int(client
,
162 gconf_concat_dir_and_key(name
, "type"), NULL
);
163 sr
->search
.range
.direction
= gconf_client_get_int(client
,
164 gconf_concat_dir_and_key(name
, "direction"), NULL
);
165 sr
->search
.action
= gconf_client_get_int(client
,
166 gconf_concat_dir_and_key(name
, "action"), NULL
);
167 sr
->search
.basic_search
= gconf_client_get_bool(client
,
168 gconf_concat_dir_and_key(name
, "basic_search"), NULL
);
170 search_update_dialog();
175 search_preferences_setting_by_default(void)
177 sr
->search
.expr
.regex
=FALSE
;
178 sr
->search
.expr
.greedy
= FALSE
;
179 sr
->search
.expr
.ignore_case
= FALSE
;
180 sr
->search
.expr
.whole_word
= FALSE
;
181 sr
->search
.expr
.whole_line
= FALSE
;
182 sr
->search
.expr
.word_start
= FALSE
;
183 sr
->search
.expr
.no_limit
=TRUE
;
184 sr
->search
.expr
.actions_max
= 200;
185 sr
->search
.range
.type
= SR_BUFFER
;
186 sr
->search
.range
.direction
= SD_FORWARD
;
187 sr
->search
.action
= SA_SELECT
;
188 sr
->search
.basic_search
= TRUE
;
190 search_update_dialog();
195 search_preferences_save_setting(gchar
*name
)
200 search_replace_populate();
202 client
= gconf_client_get_default();
203 path
= gconf_concat_dir_and_key(SEARCH_PREF_PATH
, name
);
205 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "regex"),
206 sr
->search
.expr
.regex
, NULL
);
207 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "greedy"),
208 sr
->search
.expr
.greedy
, NULL
);
209 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "ignore_case"),
210 sr
->search
.expr
.ignore_case
, NULL
);
211 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "whole_word"),
212 sr
->search
.expr
.whole_word
, NULL
);
213 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "whole_line"),
214 sr
->search
.expr
.whole_line
, NULL
);
215 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "word_start"),
216 sr
->search
.expr
.word_start
, NULL
);
217 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "no_limit"),
218 sr
->search
.expr
.no_limit
, NULL
);
219 gconf_client_set_int(client
, gconf_concat_dir_and_key(path
, "actions_max"),
220 sr
->search
.expr
.actions_max
, NULL
);
221 gconf_client_set_int(client
, gconf_concat_dir_and_key(path
, "type"),
222 sr
->search
.range
.type
, NULL
);
223 gconf_client_set_int(client
, gconf_concat_dir_and_key(path
, "direction"),
224 sr
->search
.range
.direction
, NULL
);
225 gconf_client_set_int(client
, gconf_concat_dir_and_key(path
, "action"),
226 sr
->search
.action
, NULL
);
227 gconf_client_set_bool(client
, gconf_concat_dir_and_key(path
, "basic_search"),
228 sr
->search
.basic_search
, NULL
);
233 search_preferences_save_search_pref(gchar
*name
)
238 client
= gconf_client_get_default();
239 gconf_client_set_list(client
, gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
240 "list_pref"), GCONF_VALUE_STRING
, list_pref
, NULL
);
242 path
= gconf_concat_dir_and_key(SEARCH_PREF_PATH
, name
);
243 gconf_client_add_dir(client
, path
, GCONF_CLIENT_PRELOAD_NONE
, NULL
);
245 search_preferences_save_setting(name
);
250 search_preferences_get_model(void)
254 view
= GTK_TREE_VIEW (sr_get_gladewidget(SETTING_PREF_TREEVIEW
)->widget
);
255 return gtk_tree_view_get_model(view
);
260 search_preferences_add_treeview(gchar
*name
)
265 model
= search_preferences_get_model();
266 gtk_tree_model_foreach (model
, on_search_preferences_setting_inactive
, NULL
);
267 gtk_tree_store_append (GTK_TREE_STORE (model
), &iter
, NULL
);
268 gtk_tree_store_set (GTK_TREE_STORE (model
), &iter
,
269 PREF_DEFAULT_COLUMN
, FALSE
,
270 PREF_NAME_COLUMN
, name
,
271 PREF_ACTIVE_COLUMN
, TRUE
, -1);
276 search_preferences_remove_setting(gchar
*name
)
280 client
= gconf_client_get_default();
281 gconf_client_set_list(client
, gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
282 "list_pref"), GCONF_VALUE_STRING
, list_pref
, NULL
);
283 // FIXME : Remove Setting Directory
284 gconf_client_remove_dir(client
, gconf_concat_dir_and_key(SEARCH_PREF_PATH
, name
), NULL
);
290 search_preferences_activate_default(gchar
*name
)
295 view
= GTK_TREE_VIEW (sr_get_gladewidget(SETTING_PREF_TREEVIEW
)->widget
);
296 model
= gtk_tree_view_get_model (view
);
298 gtk_tree_model_foreach (model
, on_search_preferences_clear_default_foreach
, name
);
303 search_preferences_active_selection_row(GtkTreeView
*view
)
305 GtkTreeSelection
*selection
;
310 selection
= gtk_tree_view_get_selection (view
);
312 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
) == TRUE
)
314 gtk_tree_model_foreach (model
, on_search_preferences_setting_inactive
, NULL
);
315 gtk_tree_store_set (GTK_TREE_STORE (model
), &iter
,
316 PREF_ACTIVE_COLUMN
, TRUE
,
318 gtk_tree_model_get (model
, &iter
, PREF_NAME_COLUMN
, &name
, -1);
319 search_preferences_update_entry(name
);
321 if (g_strcasecmp(name
, BASIC
))
322 search_preferences_read_setting(gconf_concat_dir_and_key(
323 SEARCH_PREF_PATH
, name
));
325 search_preferences_setting_by_default();
331 on_search_preferences_colorize_setting (GtkTreeViewColumn
*tree_column
,
332 GtkCellRenderer
*cell
, GtkTreeModel
*tree_model
,
333 GtkTreeIter
*iter
, gpointer data
)
336 static const gchar
*colors
[] = {"black", "red"};
337 GValue gvalue
= {0, };
339 gtk_tree_model_get (tree_model
, iter
, PREF_ACTIVE_COLUMN
, &active
, -1);
340 g_value_init (&gvalue
, G_TYPE_STRING
);
341 g_value_set_static_string (&gvalue
, colors
[active
? 1 : 0]);
342 g_object_set_property (G_OBJECT (cell
), "foreground", &gvalue
);
347 on_search_preferences_row_activated (GtkTreeView
*view
,
348 GtkTreePath
*tree_path
,
349 GtkTreeViewColumn
*view_column
,
350 GtkCellRenderer
*renderer
)
352 search_preferences_active_selection_row(view
);
357 on_search_preferences_treeview_enable_toggle (GtkCellRendererToggle
*cell
,
370 path
= gtk_tree_path_new_from_string (path_str
);
371 view
= GTK_TREE_VIEW (sr_get_gladewidget(SETTING_PREF_TREEVIEW
)->widget
);
372 model
= gtk_tree_view_get_model (view
);
373 gtk_tree_model_get_iter (model
, &iter
, path
);
374 gtk_tree_model_get (model
, &iter
, PREF_NAME_COLUMN
, &name
,
375 PREF_DEFAULT_COLUMN
, &state
, -1);
377 client
= gconf_client_get_default();
380 gtk_tree_store_set (GTK_TREE_STORE (model
), &iter
, PREF_DEFAULT_COLUMN
, FALSE
, -1);
381 gconf_client_set_string(client
, gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
382 "search_pref_default"), "", NULL
);
386 gconf_client_set_string(client
, gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
387 "search_pref_default"), name
, NULL
);
389 gtk_tree_model_foreach (model
, on_search_preferences_clear_default_foreach
, NULL
);
391 gtk_tree_store_set (GTK_TREE_STORE (model
), &iter
, PREF_DEFAULT_COLUMN
, TRUE
, -1);
397 search_preferences_name_is_valid(gchar
*name
)
401 for(i
=0; i
<strlen(name
); i
++)
402 if ((!g_ascii_isalnum(name
[i
]) && name
[i
]!='_'))
409 on_setting_pref_add_clicked(GtkButton
*button
, gpointer user_data
)
411 GtkWidget
*pref_entry
;
414 pref_entry
= sr_get_gladewidget(SETTING_PREF_ENTRY
)->widget
;
415 name
= g_strstrip(gtk_editable_get_chars(GTK_EDITABLE(pref_entry
), 0, -1));
417 if (!name
|| strlen(name
) < 1)
420 if (!search_preferences_name_is_valid(name
))
422 if (search_preferences_find_setting(name
))
425 if (g_strcasecmp(name
, BASIC
))
427 list_pref
= g_slist_append(list_pref
, g_strdup(name
));
429 search_preferences_save_search_pref(name
);
431 search_preferences_add_treeview(name
);
438 on_setting_pref_remove_clicked(GtkButton
*button
, gpointer user_data
)
442 GtkTreeSelection
*selection
;
449 view
= GTK_TREE_VIEW (sr_get_gladewidget(SETTING_PREF_TREEVIEW
)->widget
);
450 store
= GTK_TREE_STORE (gtk_tree_view_get_model(view
));
451 selection
= gtk_tree_view_get_selection (view
);
452 valid
= gtk_tree_selection_get_selected (selection
, &model
, &iter
);
455 gtk_tree_model_get (model
, &iter
, PREF_NAME_COLUMN
, &name
, -1);
456 if (g_strcasecmp(name
, BASIC
))
460 client
= gconf_client_get_default();
461 path
= gconf_client_get_string(client
, gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
462 "search_pref_default"), NULL
);
463 gtk_tree_store_remove(store
, &iter
);
465 list_pref
= g_slist_remove(list_pref
, search_preferences_find_setting(name
)->data
);
467 search_preferences_remove_setting(name
);
469 if (!g_strcasecmp(name
, path
))
471 gconf_client_set_string(client
, gconf_concat_dir_and_key(
472 SEARCH_PREF_PATH
, "search_pref_default"), "", NULL
);
475 search_preferences_update_entry("");
482 on_setting_pref_modify_clicked(GtkButton
*button
, gpointer user_data
)
486 GtkTreeSelection
*selection
;
492 view
= GTK_TREE_VIEW (sr_get_gladewidget(SETTING_PREF_TREEVIEW
)->widget
);
493 store
= GTK_TREE_STORE (gtk_tree_view_get_model(view
));
494 selection
= gtk_tree_view_get_selection (view
);
495 valid
= gtk_tree_selection_get_selected (selection
, &model
, &iter
);
498 gtk_tree_model_get (model
, &iter
, PREF_NAME_COLUMN
, &name
, -1);
499 if (g_strcasecmp(name
, BASIC
))
501 search_preferences_save_setting(name
);
502 search_preferences_update_entry("");
509 search_preferences_initialize_setting_treeview(GtkWidget
*dialog
)
513 GtkCellRenderer
*renderer
;
514 GtkTreeViewColumn
*column
;
516 view
= GTK_TREE_VIEW (sr_get_gladewidget(SETTING_PREF_TREEVIEW
)->widget
);
517 store
= gtk_tree_store_new (3, G_TYPE_BOOLEAN
, G_TYPE_STRING
, G_TYPE_BOOLEAN
);
518 gtk_tree_view_set_model (view
, GTK_TREE_MODEL (store
));
519 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (view
),
520 GTK_SELECTION_SINGLE
);
522 renderer
= gtk_cell_renderer_toggle_new ();
523 column
= gtk_tree_view_column_new_with_attributes (_("Default"),
528 g_signal_connect (renderer
, "toggled",
529 G_CALLBACK (on_search_preferences_treeview_enable_toggle
), NULL
);
530 gtk_tree_view_column_set_sizing (column
, GTK_TREE_VIEW_COLUMN_AUTOSIZE
);
531 gtk_tree_view_append_column (view
, column
);
533 renderer
= gtk_cell_renderer_text_new ();
534 column
= gtk_tree_view_column_new_with_attributes (_("Name"),
539 g_signal_connect (view
, "row-activated",
540 G_CALLBACK (on_search_preferences_row_activated
), renderer
);
541 gtk_tree_view_column_set_cell_data_func (column
, renderer
,
542 on_search_preferences_colorize_setting
, NULL
, NULL
);
543 gtk_tree_view_column_set_sizing (column
, GTK_TREE_VIEW_COLUMN_AUTOSIZE
);
544 gtk_tree_view_append_column (view
, column
);
548 search_preferences_init(void)
555 sr
= create_search_replace_instance(NULL
);
557 search_preferences_add_treeview(BASIC
);
559 client
= gconf_client_get_default();
560 gconf_client_add_dir(client
, SEARCH_PREF_PATH
, GCONF_CLIENT_PRELOAD_NONE
, NULL
);
562 list_pref
= gconf_client_get_list(client
,gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
563 "list_pref"), GCONF_VALUE_STRING
, NULL
);
565 for (list
= list_pref
; list
!= NULL
; list
= g_slist_next(list
))
566 search_preferences_add_treeview(list
->data
);
568 default_pref
= gconf_client_get_string(client
,gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
569 "search_pref_default"), NULL
);
571 model
= search_preferences_get_model();
572 gtk_tree_model_foreach (model
, on_search_preferences_setting_inactive
, NULL
);
574 if (default_pref
&& g_strcasecmp(default_pref
, "") && g_strcasecmp(default_pref
, BASIC
))
575 search_preferences_read_setting(gconf_concat_dir_and_key(SEARCH_PREF_PATH
,
579 gtk_tree_model_get_iter_first(model
, &iter
);
580 gtk_tree_store_set (GTK_TREE_STORE (model
), &iter
,
581 PREF_ACTIVE_COLUMN
, TRUE
, -1);
582 search_preferences_setting_by_default();
585 search_preferences_activate_default(default_pref
);
586 g_free(default_pref
);