indentation-c-style: Update preferences UI file to gtk+-3
[anjuta.git] / plugins / sourceview / plugin.c
blob7187db62f83cb291d9b440d907ab7260662a143f
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * plugin.c
4 * Copyright (C) Johannes Schmid 2005 <jhs@gnome.org>
6 * plugin.c is free software.
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
11 * any later version.
13 * plugin.c is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 * See the GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with plugin.c. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include <config.h>
26 #include <libanjuta/anjuta-shell.h>
27 #include <libanjuta/anjuta-debug.h>
28 #include <libanjuta/anjuta-preferences.h>
29 #include <libanjuta/anjuta-status.h>
30 #include <libanjuta/interfaces/ianjuta-document-manager.h>
31 #include <libanjuta/interfaces/ianjuta-editor-factory.h>
32 #include <libanjuta/interfaces/ianjuta-editor.h>
33 #include <libanjuta/interfaces/ianjuta-preferences.h>
34 #include <gtksourceview/gtksource.h>
36 #include "plugin.h"
37 #include "sourceview.h"
38 #include "sourceview-prefs.h"
39 #include "sourceview-private.h"
41 #define PREF_SCHEMA "org.gnome.anjuta.plugins.sourceview"
42 #define PREFS_GLADE PACKAGE_DATA_DIR"/glade/anjuta-editor-sourceview.ui"
43 #define ICON_FILE "anjuta-editor-sourceview-plugin-48.png"
44 #define UI_FILE PACKAGE_DATA_DIR"/ui/anjuta-sourceview.xml"
46 #define COMBO_STYLES "combo_styles"
47 #define SOURCEVIEW_STYLE "style"
49 #define FONT_USE_THEME_BUTTON "preferences_toggle:bool:1:0:font-use-theme"
50 #define FONT_BUTTON "preferences_font:font:Monospace 12:0:font"
52 static gpointer parent_class;
54 static GtkBuilder* builder = NULL;
56 static void
57 on_editor_linenos_activate (GtkAction *action, gpointer user_data)
59 gboolean state;
60 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (user_data);
62 state = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
63 g_settings_set_boolean (plugin->settings,
64 VIEW_LINENUMBERS, state);
67 static void
68 on_editor_markers_activate (GtkAction *action, gpointer user_data)
70 gboolean state;
71 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (user_data);
73 state = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
74 g_settings_set_boolean (plugin->settings,
75 VIEW_MARKS, state);
78 static void
79 on_editor_whitespaces_activate (GtkAction *action, gpointer user_data)
81 gboolean state;
82 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (user_data);
84 state = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
85 g_settings_set_boolean (plugin->settings,
86 VIEW_WHITE_SPACES, state);
89 static void
90 on_editor_eolchars_activate (GtkAction *action, gpointer user_data)
92 gboolean state;
93 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (user_data);
95 state = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
96 g_settings_set_boolean (plugin->settings,
97 VIEW_EOL, state);
100 static void
101 on_editor_linewrap_activate (GtkAction *action, gpointer user_data)
103 gboolean state;
104 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (user_data);
106 state = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
107 g_settings_set_boolean (plugin->settings,
108 VIEW_LINE_WRAP, state);
111 static GtkToggleActionEntry actions_view[] = {
112 { "ActionViewEditorLinenumbers", NULL, N_("_Line Number Margin"), NULL,
113 N_("Show/Hide line numbers"),
114 G_CALLBACK (on_editor_linenos_activate), FALSE},
115 { "ActionViewEditorMarkers", NULL, N_("_Marker Margin"), NULL,
116 N_("Show/Hide marker margin"),
117 G_CALLBACK (on_editor_markers_activate), FALSE},
118 { "ActionViewEditorSpaces", NULL, N_("_White Space"), NULL,
119 N_("Show/Hide white spaces"),
120 G_CALLBACK (on_editor_whitespaces_activate), FALSE},
121 { "ActionViewEditorEOL", NULL, N_("_Line End Characters"), NULL,
122 N_("Show/Hide line end characters"),
123 G_CALLBACK (on_editor_eolchars_activate), FALSE},
124 { "ActionViewEditorWrapping", NULL, N_("Line _Wrapping"), NULL,
125 N_("Enable/disable line wrapping"),
126 G_CALLBACK (on_editor_linewrap_activate), FALSE}
129 static void
130 ui_states_init (SourceviewPlugin* plugin, AnjutaUI *ui)
132 static const gchar *prefs[] = {
133 VIEW_LINENUMBERS,
134 VIEW_MARKS,
135 VIEW_WHITE_SPACES,
136 VIEW_EOL,
137 VIEW_LINE_WRAP
139 gint i;
141 for (i = 0; i < sizeof (prefs)/sizeof(const gchar *); i++)
143 GtkAction *action;
144 gboolean state;
146 state = g_settings_get_boolean (plugin->settings, prefs[i]);
147 action = anjuta_ui_get_action (ui, "ActionGroupEditorView",
148 actions_view[i].name);
149 g_object_set (G_OBJECT (action), "sensitive", TRUE, "visible", TRUE, NULL);
150 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), state);
155 static void
156 on_font_check_toggled(GtkToggleButton* button, GtkBuilder* builder)
158 GtkWidget* font_button;
159 font_button = GTK_WIDGET (gtk_builder_get_object (builder, FONT_BUTTON));
160 gtk_widget_set_sensitive(font_button, !gtk_toggle_button_get_active(button));
163 static gboolean
164 sourceview_plugin_activate (AnjutaPlugin *obj)
166 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (obj);
167 AnjutaUI *ui;
169 DEBUG_PRINT ("%s", "SourceviewPlugin: Activating SourceviewPlugin plugin ...");
171 /* Add menu entries */
172 ui = anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin)->shell, NULL);
173 plugin->group = anjuta_ui_add_toggle_action_group_entries (ui, "ActionGroupEditorView",
174 _("Editor view settings"),
175 actions_view,
176 G_N_ELEMENTS (actions_view),
177 GETTEXT_PACKAGE, TRUE, plugin);
178 ui_states_init (plugin, ui);
179 plugin->uiid = anjuta_ui_merge (ui, UI_FILE);
181 return TRUE;
184 static gboolean
185 sourceview_plugin_deactivate (AnjutaPlugin *obj)
187 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (obj);
188 AnjutaUI *ui;
190 DEBUG_PRINT ("%s", "SourceviewPlugin: Dectivating SourceviewPlugin plugin ...");
192 ui = anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin)->shell, NULL);
193 anjuta_ui_unmerge (ui, plugin->uiid);
194 if (plugin->group != NULL)
196 anjuta_ui_remove_action_group (ui, plugin->group);
197 plugin->group = NULL;
200 return TRUE;
203 static void
204 sourceview_plugin_finalize (GObject *obj)
206 /* Finalization codes here */
207 G_OBJECT_CLASS (parent_class)->finalize (obj);
210 static void
211 sourceview_plugin_dispose (GObject *obj)
213 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (obj);
215 g_object_unref (plugin->settings);
217 G_OBJECT_CLASS (parent_class)->dispose (obj);
220 static void
221 sourceview_plugin_instance_init (GObject *obj)
223 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (obj);
224 plugin->settings = g_settings_new (PREF_SCHEMA);
225 plugin->group = NULL;
226 plugin->uiid = 0;
229 static void
230 sourceview_plugin_class_init (GObjectClass *klass)
232 AnjutaPluginClass *plugin_class = ANJUTA_PLUGIN_CLASS (klass);
234 parent_class = g_type_class_peek_parent (klass);
236 plugin_class->activate = sourceview_plugin_activate;
237 plugin_class->deactivate = sourceview_plugin_deactivate;
238 klass->finalize = sourceview_plugin_finalize;
239 klass->dispose = sourceview_plugin_dispose;
242 static IAnjutaEditor*
243 ieditor_factory_new_editor(IAnjutaEditorFactory* factory,
244 GFile* file,
245 const gchar* filename,
246 GError** error)
248 AnjutaPlugin* plugin = ANJUTA_PLUGIN(factory);
249 SourceviewPlugin* splugin = ANJUTA_PLUGIN_SOURCEVIEW (plugin);
250 gchar* current_style = g_settings_get_string (splugin->settings, SOURCEVIEW_STYLE);
251 GtkSourceStyleSchemeManager* manager = gtk_source_style_scheme_manager_get_default();
252 Sourceview* sv;
253 sv = sourceview_new(file, filename, plugin);
254 if (current_style)
255 gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (sv->priv->document),
256 gtk_source_style_scheme_manager_get_scheme (manager,
257 current_style));
258 g_free (current_style);
259 return IANJUTA_EDITOR (sv);
262 static void
263 ieditor_factory_iface_init (IAnjutaEditorFactoryIface *iface)
265 iface->new_editor = ieditor_factory_new_editor;
268 enum
270 COLUMN_NAME = 0,
271 COLUMN_DESC,
272 COLUMN_ID
275 static GtkTreeModel*
276 create_style_model (GSettings* settings, GtkTreeIter** current)
278 GtkListStore* model = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING,
279 G_TYPE_STRING);
280 GtkSourceStyleSchemeManager* manager = gtk_source_style_scheme_manager_get_default();
281 const gchar* const *styles = gtk_source_style_scheme_manager_get_scheme_ids (manager);
282 const gchar* const *style;
283 gchar* current_style = g_settings_get_string (settings, SOURCEVIEW_STYLE);
284 *current = NULL;
285 for (style = styles; *style != NULL; style++)
287 GtkTreeIter iter;
288 GtkSourceStyleScheme* scheme =
289 gtk_source_style_scheme_manager_get_scheme (manager, *style);
290 const gchar* id = gtk_source_style_scheme_get_id (scheme);
291 gtk_list_store_append (model, &iter);
292 gtk_list_store_set (model, &iter,
293 COLUMN_NAME, gtk_source_style_scheme_get_name (scheme),
294 COLUMN_DESC, gtk_source_style_scheme_get_description (scheme),
295 COLUMN_ID, id, -1);
296 if (current_style && g_str_equal (id, current_style))
298 *current = gtk_tree_iter_copy (&iter);
301 g_free (current_style);
302 return GTK_TREE_MODEL (model);
305 static void
306 on_style_changed (GtkComboBox* combo, SourceviewPlugin* plugin)
308 GtkTreeIter iter;
309 gchar* id;
310 GtkSourceStyleSchemeManager* manager = gtk_source_style_scheme_manager_get_default();
311 GtkSourceStyleScheme* scheme;
312 IAnjutaDocumentManager* docman;
313 AnjutaShell* shell = ANJUTA_PLUGIN (plugin)->shell;
314 gtk_combo_box_get_active_iter (combo, &iter);
315 gtk_tree_model_get (gtk_combo_box_get_model(combo), &iter,
316 COLUMN_ID, &id, -1);
317 scheme = gtk_source_style_scheme_manager_get_scheme (manager, id);
319 g_settings_set_string (plugin->settings,
320 SOURCEVIEW_STYLE,
321 id);
322 g_free (id);
325 docman = anjuta_shell_get_interface (shell,
326 IAnjutaDocumentManager, NULL);
327 if (docman)
329 GList* editors = ianjuta_document_manager_get_doc_widgets (docman, NULL);
330 GList* node;
331 for (node = editors; node != NULL; node = g_list_next (node))
333 IAnjutaDocument* editor = IANJUTA_DOCUMENT (node->data);
334 if (ANJUTA_IS_SOURCEVIEW (editor))
336 Sourceview* sv = ANJUTA_SOURCEVIEW (editor);
337 gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (sv->priv->document),
338 scheme);
344 static void
345 ipreferences_merge(IAnjutaPreferences* ipref, AnjutaPreferences* prefs, GError** e)
347 /* Add preferences */
348 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (ipref);
349 GtkCellRenderer* renderer_name = gtk_cell_renderer_text_new ();
350 GtkCellRenderer* renderer_desc = gtk_cell_renderer_text_new ();
351 GtkTreeIter* iter = NULL;
352 GError* error = NULL;
353 builder = gtk_builder_new ();
354 if (!gtk_builder_add_from_file(builder, PREFS_GLADE, &error))
356 DEBUG_PRINT ("Could load sourceview preferences: %s", error->message);
357 g_error_free (error);
358 return;
360 anjuta_preferences_add_from_builder (prefs,
361 builder,
362 plugin->settings,
363 "Editor",
364 _("GtkSourceView Editor"),
365 ICON_FILE);
367 plugin->check_font = GTK_WIDGET (gtk_builder_get_object (builder,
368 FONT_USE_THEME_BUTTON));
369 g_signal_connect(G_OBJECT(plugin->check_font), "toggled",
370 G_CALLBACK(on_font_check_toggled), builder);
371 on_font_check_toggled (GTK_TOGGLE_BUTTON (plugin->check_font), builder);
373 /* Init styles combo */
374 plugin->combo_styles = GTK_WIDGET (gtk_builder_get_object (builder, COMBO_STYLES));
375 gtk_combo_box_set_model (GTK_COMBO_BOX (plugin->combo_styles),
376 create_style_model(plugin->settings, &iter));
377 g_signal_connect (plugin->combo_styles, "changed", G_CALLBACK (on_style_changed), plugin);
379 gtk_cell_layout_clear (GTK_CELL_LAYOUT(plugin->combo_styles));
380 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(plugin->combo_styles), renderer_name, TRUE);
381 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(plugin->combo_styles), renderer_desc, FALSE);
382 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(plugin->combo_styles), renderer_name,
383 "text", COLUMN_NAME);
384 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(plugin->combo_styles), renderer_desc,
385 "text", COLUMN_DESC);
386 g_object_set (renderer_desc,
387 "style", PANGO_STYLE_ITALIC, NULL);
388 if (iter)
390 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (plugin->combo_styles),
391 iter);
392 gtk_tree_iter_free (iter);
396 static void
397 ipreferences_unmerge(IAnjutaPreferences* ipref, AnjutaPreferences* prefs, GError** e)
399 SourceviewPlugin* plugin = ANJUTA_PLUGIN_SOURCEVIEW (ipref);
400 g_signal_handlers_disconnect_by_func(G_OBJECT(plugin->check_font),
401 G_CALLBACK(on_font_check_toggled), builder);
402 g_signal_handlers_disconnect_by_func(G_OBJECT(plugin->combo_styles),
403 G_CALLBACK(on_style_changed), builder);
405 anjuta_preferences_remove_page(prefs, _("GtkSourceView Editor"));
406 g_object_unref(builder);
407 builder = NULL;
410 static void
411 ipreferences_iface_init(IAnjutaPreferencesIface* iface)
413 iface->merge = ipreferences_merge;
414 iface->unmerge = ipreferences_unmerge;
417 ANJUTA_PLUGIN_BEGIN (SourceviewPlugin, sourceview_plugin);
418 ANJUTA_TYPE_ADD_INTERFACE(ieditor_factory, IANJUTA_TYPE_EDITOR_FACTORY);
419 ANJUTA_TYPE_ADD_INTERFACE(ipreferences, IANJUTA_TYPE_PREFERENCES);
420 ANJUTA_PLUGIN_END;
422 ANJUTA_SIMPLE_PLUGIN (SourceviewPlugin, sourceview_plugin);