2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU Library General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 #include "sourceview-prefs.h"
18 #include "sourceview-private.h"
19 #include "sourceview-provider.h"
20 #include <gtksourceview/gtksourceview.h>
21 #include <gtksourceview/completion-providers/words/gtksourcecompletionwords.h>
23 #include <libanjuta/anjuta-debug.h>
25 #define REGISTER_NOTIFY(settings, key, func) \
26 g_signal_connect (settings, "changed::" key, G_CALLBACK(func), sv);
28 #define PREF_SCHEMA "org.gnome.anjuta.plugins.sourceview"
29 #define MSGMAN_PREF_SCHEMA "org.gnome.anjuta.message-manager"
32 /* Editor preferences */
33 #define HIGHLIGHT_SYNTAX "syntax-highlight"
34 #define HIGHLIGHT_CURRENT_LINE "currentline-highlight"
35 #define USE_TABS "use-tabs"
36 #define HIGHLIGHT_BRACKETS "brackets-highlight"
37 #define TAB_SIZE "tabsize"
38 #define INDENT_SIZE "indent-size"
39 #define AUTOCOMPLETION "autocomplete"
41 #define VIEW_RIGHTMARGIN "rightmargin-visible"
42 #define RIGHTMARGIN_POSITION "rightmargin-position"
44 #define MSGMAN_COLOR_ERROR "msgman-color-error"
45 #define MSGMAN_COLOR_WARNING "msgman-color-warning"
48 #define FONT_THEME "font-use-theme"
50 #define DESKTOP_FIXED_FONT "/desktop/gnome/interface/monospace_font_name"
53 on_notify_view_spaces (GSettings
* settings
,
58 sv
= ANJUTA_SOURCEVIEW(user_data
);
59 GtkSourceDrawSpacesFlags flags
=
60 gtk_source_view_get_draw_spaces (GTK_SOURCE_VIEW (sv
->priv
->view
));
62 if (g_settings_get_boolean (settings
, key
))
63 flags
|= (GTK_SOURCE_DRAW_SPACES_SPACE
| GTK_SOURCE_DRAW_SPACES_TAB
);
65 flags
&= ~(GTK_SOURCE_DRAW_SPACES_SPACE
| GTK_SOURCE_DRAW_SPACES_TAB
);
67 gtk_source_view_set_draw_spaces (GTK_SOURCE_VIEW(sv
->priv
->view
),
72 on_notify_view_eol (GSettings
* settings
,
77 sv
= ANJUTA_SOURCEVIEW(user_data
);
78 GtkSourceDrawSpacesFlags flags
=
79 gtk_source_view_get_draw_spaces (GTK_SOURCE_VIEW (sv
->priv
->view
));
81 if (g_settings_get_boolean (settings
, key
))
82 flags
|= GTK_SOURCE_DRAW_SPACES_NEWLINE
;
84 flags
&= ~GTK_SOURCE_DRAW_SPACES_NEWLINE
;
86 gtk_source_view_set_draw_spaces (GTK_SOURCE_VIEW(sv
->priv
->view
),
91 on_notify_line_wrap (GSettings
* settings
,
96 sv
= ANJUTA_SOURCEVIEW(user_data
);
98 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (sv
->priv
->view
),
99 g_settings_get_boolean (settings
, key
) ? GTK_WRAP_WORD
: GTK_WRAP_NONE
);
103 on_notify_use_tab_for_indentation (GSettings
* settings
,
108 sv
= ANJUTA_SOURCEVIEW(user_data
);
110 gtk_source_view_set_insert_spaces_instead_of_tabs(GTK_SOURCE_VIEW(sv
->priv
->view
),
111 !g_settings_get_boolean (settings
, key
));
115 on_notify_autocompletion (GSettings
* settings
,
120 sv
= ANJUTA_SOURCEVIEW(user_data
);
121 GtkSourceCompletion
* completion
= gtk_source_view_get_completion(GTK_SOURCE_VIEW(sv
->priv
->view
));
123 if (g_settings_get_boolean (settings
, key
))
125 DEBUG_PRINT ("Register word completion provider");
126 GtkSourceCompletionWords
*prov_words
;
127 prov_words
= gtk_source_completion_words_new (NULL
, NULL
);
129 gtk_source_completion_words_register (prov_words
,
130 gtk_text_view_get_buffer (GTK_TEXT_VIEW (sv
->priv
->view
)));
132 gtk_source_completion_add_provider (completion
,
133 GTK_SOURCE_COMPLETION_PROVIDER (prov_words
),
139 for (node
= gtk_source_completion_get_providers(completion
); node
!= NULL
; node
= g_list_next (node
))
141 if (GTK_SOURCE_IS_COMPLETION_WORDS(node
->data
))
143 DEBUG_PRINT ("Unregister word completion provider");
144 gtk_source_completion_words_unregister (GTK_SOURCE_COMPLETION_WORDS(node
->data
),
145 gtk_text_view_get_buffer (GTK_TEXT_VIEW (sv
->priv
->view
)));
146 gtk_source_completion_remove_provider(completion
, GTK_SOURCE_COMPLETION_PROVIDER(node
->data
), NULL
);
154 on_notify_font (GSettings
* settings
,
159 sv
= ANJUTA_SOURCEVIEW(user_data
);
160 gchar
* font
= g_settings_get_string (settings
, key
);
162 anjuta_view_set_font(sv
->priv
->view
, FALSE
,
168 on_notify_font_theme (GSettings
* settings
,
173 sv
= ANJUTA_SOURCEVIEW(user_data
);
175 if (g_settings_get_boolean (settings
, key
))
177 /* FIXME: GSettings */
179 GConfClient
*gclient
= gconf_client_get_default ();
180 gchar
*desktop_fixed_font
;
182 gconf_client_get_string (gclient
, DESKTOP_FIXED_FONT
, NULL
);
183 if (desktop_fixed_font
)
184 anjuta_view_set_font(sv
->priv
->view
, FALSE
, desktop_fixed_font
);
186 anjuta_view_set_font(sv
->priv
->view
, TRUE
, NULL
);
187 g_free (desktop_fixed_font
);
192 gchar
* font
= g_settings_get_string (settings
, FONT
);
193 anjuta_view_set_font(sv
->priv
->view
, FALSE
, font
);
198 /* Preferences notifications */
200 on_notify_indic_colors (GSettings
* settings
,
205 g_settings_get_string (settings
,
207 char* warning_color
=
208 g_settings_get_string (settings
,
209 MSGMAN_COLOR_WARNING
);
210 Sourceview
* sv
= ANJUTA_SOURCEVIEW (user_data
);
212 g_object_set (sv
->priv
->warning_indic
, "foreground", warning_color
, NULL
);
213 g_object_set (sv
->priv
->critical_indic
, "foreground", error_color
, NULL
);
215 g_free (error_color
);
216 g_free (warning_color
);
220 init_fonts(Sourceview
* sv
)
224 font_theme
= FALSE
; //g_settings_get_boolean (sv->priv->settings, FONT_THEME);
228 gchar
* font
= g_settings_get_string (sv
->priv
->settings
, FONT
);
229 anjuta_view_set_font(sv
->priv
->view
, FALSE
, font
);
235 /* FIXME: Get font from GSettings */
236 GConfClient
*gclient
;
237 gchar
*desktop_fixed_font
;
239 gclient
= gconf_client_get_default ();
241 gconf_client_get_string (gclient
, DESKTOP_FIXED_FONT
, NULL
);
242 if (desktop_fixed_font
)
243 anjuta_view_set_font(sv
->priv
->view
, FALSE
, desktop_fixed_font
);
245 anjuta_view_set_font(sv
->priv
->view
, TRUE
, NULL
);
246 g_free (desktop_fixed_font
);
247 g_object_unref (gclient
);
253 sourceview_prefs_init(Sourceview
* sv
)
255 GtkSourceDrawSpacesFlags flags
= 0;
256 /* We create a new GSettings object here because if we used the one from
257 * the editor might be destroyed while the plugin is still alive
259 sv
->priv
->settings
= g_settings_new (PREF_SCHEMA
);
260 sv
->priv
->msgman_settings
= g_settings_new (MSGMAN_PREF_SCHEMA
);
262 /* Bind simple options to GSettings */
263 g_settings_bind (sv
->priv
->settings
, HIGHLIGHT_SYNTAX
,
264 sv
->priv
->document
, "highlight-syntax",
265 G_SETTINGS_BIND_GET
);
266 g_settings_bind (sv
->priv
->settings
, HIGHLIGHT_CURRENT_LINE
,
267 sv
->priv
->view
, "highlight-current-line",
268 G_SETTINGS_BIND_GET
);
269 g_settings_bind (sv
->priv
->settings
, TAB_SIZE
,
270 sv
->priv
->view
, "tab-width",
271 G_SETTINGS_BIND_GET
);
272 g_settings_bind (sv
->priv
->settings
, HIGHLIGHT_BRACKETS
,
273 sv
->priv
->document
, "highlight-matching-brackets",
274 G_SETTINGS_BIND_GET
);
276 g_settings_bind (sv
->priv
->settings
, VIEW_MARKS
,
277 sv
->priv
->view
, "show-line-marks",
278 G_SETTINGS_BIND_GET
);
280 g_settings_bind (sv
->priv
->settings
, RIGHTMARGIN_POSITION
,
281 sv
->priv
->view
, "right-margin-position",
282 G_SETTINGS_BIND_GET
);
284 g_settings_bind (sv
->priv
->settings
, VIEW_RIGHTMARGIN
,
285 sv
->priv
->view
, "show-right-margin",
286 G_SETTINGS_BIND_GET
);
288 g_settings_bind (sv
->priv
->settings
, VIEW_LINENUMBERS
,
289 sv
->priv
->view
, "show-line-numbers",
290 G_SETTINGS_BIND_GET
);
292 /* Init non-simple options */
293 gtk_source_view_set_indent_width(GTK_SOURCE_VIEW(sv
->priv
->view
), -1); /* Same as tab width */
294 gtk_source_view_set_insert_spaces_instead_of_tabs(GTK_SOURCE_VIEW(sv
->priv
->view
),
295 !g_settings_get_boolean (sv
->priv
->settings
, USE_TABS
));
297 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (sv
->priv
->view
),
298 g_settings_get_boolean (sv
->priv
->settings
, VIEW_EOL
) ? GTK_WRAP_WORD
: GTK_WRAP_NONE
);
301 if (g_settings_get_boolean (sv
->priv
->settings
, VIEW_WHITE_SPACES
))
302 flags
|= (GTK_SOURCE_DRAW_SPACES_SPACE
| GTK_SOURCE_DRAW_SPACES_TAB
);
303 if (g_settings_get_boolean (sv
->priv
->settings
, VIEW_EOL
))
304 flags
|= GTK_SOURCE_DRAW_SPACES_NEWLINE
;
306 gtk_source_view_set_draw_spaces (GTK_SOURCE_VIEW (sv
->priv
->view
),
311 on_notify_autocompletion(sv
->priv
->settings
, AUTOCOMPLETION
, sv
);
313 /* Register notifications */
314 REGISTER_NOTIFY (sv
->priv
->settings
, USE_TABS
, on_notify_use_tab_for_indentation
);
315 REGISTER_NOTIFY (sv
->priv
->settings
, AUTOCOMPLETION
, on_notify_autocompletion
);
317 REGISTER_NOTIFY (sv
->priv
->settings
, VIEW_WHITE_SPACES
, on_notify_view_spaces
);
318 REGISTER_NOTIFY (sv
->priv
->settings
, VIEW_EOL
, on_notify_view_eol
);
319 REGISTER_NOTIFY (sv
->priv
->settings
, VIEW_LINE_WRAP
, on_notify_line_wrap
);
320 REGISTER_NOTIFY (sv
->priv
->settings
, FONT_THEME
, on_notify_font_theme
);
321 REGISTER_NOTIFY (sv
->priv
->settings
, FONT
, on_notify_font
);
323 g_signal_connect (sv
->priv
->msgman_settings
, "changed::" MSGMAN_COLOR_ERROR
,
324 G_CALLBACK (on_notify_indic_colors
), sv
);
325 g_signal_connect (sv
->priv
->msgman_settings
, "changed::" MSGMAN_COLOR_WARNING
,
326 G_CALLBACK (on_notify_indic_colors
), sv
);
329 void sourceview_prefs_destroy(Sourceview
* sv
)
331 if (sv
->priv
->settings
)
332 g_object_unref (sv
->priv
->settings
);
333 if (sv
->priv
->msgman_settings
)
334 g_object_unref (sv
->priv
->msgman_settings
);
336 sv
->priv
->settings
= NULL
;
337 sv
->priv
->msgman_settings
= NULL
;