1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
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)
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.
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>
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
;
57 on_editor_linenos_activate (GtkAction
*action
, gpointer user_data
)
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
);
68 on_editor_markers_activate (GtkAction
*action
, gpointer user_data
)
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
,
79 on_editor_whitespaces_activate (GtkAction
*action
, gpointer user_data
)
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
);
90 on_editor_eolchars_activate (GtkAction
*action
, gpointer user_data
)
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
,
101 on_editor_linewrap_activate (GtkAction
*action
, gpointer user_data
)
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
}
130 ui_states_init (SourceviewPlugin
* plugin
, AnjutaUI
*ui
)
132 static const gchar
*prefs
[] = {
141 for (i
= 0; i
< sizeof (prefs
)/sizeof(const gchar
*); i
++)
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
);
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
));
164 sourceview_plugin_activate (AnjutaPlugin
*obj
)
166 SourceviewPlugin
* plugin
= ANJUTA_PLUGIN_SOURCEVIEW (obj
);
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"),
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
);
185 sourceview_plugin_deactivate (AnjutaPlugin
*obj
)
187 SourceviewPlugin
* plugin
= ANJUTA_PLUGIN_SOURCEVIEW (obj
);
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
;
204 sourceview_plugin_finalize (GObject
*obj
)
206 /* Finalization codes here */
207 G_OBJECT_CLASS (parent_class
)->finalize (obj
);
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
);
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
;
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
,
245 const gchar
* filename
,
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();
253 sv
= sourceview_new(file
, filename
, plugin
);
255 gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (sv
->priv
->document
),
256 gtk_source_style_scheme_manager_get_scheme (manager
,
258 g_free (current_style
);
259 return IANJUTA_EDITOR (sv
);
263 ieditor_factory_iface_init (IAnjutaEditorFactoryIface
*iface
)
265 iface
->new_editor
= ieditor_factory_new_editor
;
276 create_style_model (GSettings
* settings
, GtkTreeIter
** current
)
278 GtkListStore
* model
= gtk_list_store_new (3, G_TYPE_STRING
, 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
);
285 for (style
= styles
; *style
!= NULL
; style
++)
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
),
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
);
306 on_style_changed (GtkComboBox
* combo
, SourceviewPlugin
* plugin
)
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
,
317 scheme
= gtk_source_style_scheme_manager_get_scheme (manager
, id
);
319 g_settings_set_string (plugin
->settings
,
325 docman
= anjuta_shell_get_interface (shell
,
326 IAnjutaDocumentManager
, NULL
);
329 GList
* editors
= ianjuta_document_manager_get_doc_widgets (docman
, NULL
);
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
),
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
);
360 anjuta_preferences_add_from_builder (prefs
,
364 _("GtkSourceView Editor"),
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
);
390 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (plugin
->combo_styles
),
392 gtk_tree_iter_free (iter
);
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
);
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
);
422 ANJUTA_SIMPLE_PLUGIN (SourceviewPlugin
, sourceview_plugin
);