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/gtksourceview.h>
35 #include <gtksourceview/gtksourcestyleschememanager.h>
38 #include "sourceview.h"
39 #include "sourceview-private.h"
41 #define PREFS_GLADE PACKAGE_DATA_DIR"/glade/anjuta-editor-sourceview.glade"
42 #define ICON_FILE "anjuta-editor-sourceview-plugin-48.png"
44 #define COMBO_STYLES "combo_styles"
45 #define SOURCEVIEW_STYLE "sourceview.style"
46 #define SOURCEVIEW_DEFAULT_STYLE "classic"
48 #define FONT_USE_THEME_BUTTON "preferences_toggle:bool:1:0:sourceview.font.use_theme"
49 #define FONT_BUTTON "preferences_font:font:Monospace 12:0:sourceview.font"
51 static gpointer parent_class
;
53 static GladeXML
* gxml
= NULL
;
56 on_font_check_toggled(GtkToggleButton
* button
, GladeXML
* gxml
)
58 GtkWidget
* font_button
;
59 font_button
= glade_xml_get_widget(gxml
, FONT_BUTTON
);
60 gtk_widget_set_sensitive(font_button
, !gtk_toggle_button_get_active(button
));
64 sourceview_plugin_activate (AnjutaPlugin
*plugin
)
66 DEBUG_PRINT ("SourceviewPlugin: Activating SourceviewPlugin plugin ...");
72 sourceview_plugin_deactivate (AnjutaPlugin
*plugin
)
74 DEBUG_PRINT ("SourceviewPlugin: Dectivating SourceviewPlugin plugin ...");
80 sourceview_plugin_finalize (GObject
*obj
)
82 /* Finalization codes here */
83 G_OBJECT_CLASS (parent_class
)->finalize (obj
);
87 sourceview_plugin_dispose (GObject
*obj
)
89 /* Disposition codes */
90 G_OBJECT_CLASS (parent_class
)->dispose (obj
);
94 sourceview_plugin_instance_init (GObject
*obj
)
100 sourceview_plugin_class_init (GObjectClass
*klass
)
102 AnjutaPluginClass
*plugin_class
= ANJUTA_PLUGIN_CLASS (klass
);
104 parent_class
= g_type_class_peek_parent (klass
);
106 plugin_class
->activate
= sourceview_plugin_activate
;
107 plugin_class
->deactivate
= sourceview_plugin_deactivate
;
108 klass
->finalize
= sourceview_plugin_finalize
;
109 klass
->dispose
= sourceview_plugin_dispose
;
112 static IAnjutaEditor
*
113 ieditor_factory_new_editor(IAnjutaEditorFactory
* factory
,
115 const gchar
* filename
,
118 AnjutaPlugin
* plugin
= ANJUTA_PLUGIN(factory
);
119 AnjutaPreferences
* prefs
= anjuta_shell_get_preferences (plugin
->shell
, NULL
);
120 gchar
* current_style
= anjuta_preferences_get (prefs
, SOURCEVIEW_STYLE
);
121 GtkSourceStyleSchemeManager
* manager
= gtk_source_style_scheme_manager_get_default();
125 current_style
= g_strdup (SOURCEVIEW_DEFAULT_STYLE
);
127 sv
= sourceview_new(uri
, filename
, plugin
);
128 gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (sv
->priv
->document
),
129 gtk_source_style_scheme_manager_get_scheme (manager
,
131 g_free (current_style
);
132 return IANJUTA_EDITOR (sv
);
136 ieditor_factory_iface_init (IAnjutaEditorFactoryIface
*iface
)
138 iface
->new_editor
= ieditor_factory_new_editor
;
149 create_style_model (AnjutaPreferences
* prefs
, GtkTreeIter
** current
)
151 GtkListStore
* model
= gtk_list_store_new (3, G_TYPE_STRING
, G_TYPE_STRING
,
153 GtkSourceStyleSchemeManager
* manager
= gtk_source_style_scheme_manager_get_default();
154 const gchar
* const *styles
= gtk_source_style_scheme_manager_get_scheme_ids (manager
);
155 const gchar
* const *style
;
156 gchar
* current_style
= anjuta_preferences_get (prefs
, SOURCEVIEW_STYLE
);
159 current_style
= g_strdup (SOURCEVIEW_DEFAULT_STYLE
);
161 for (style
= styles
; *style
!= NULL
; style
++)
164 GtkSourceStyleScheme
* scheme
=
165 gtk_source_style_scheme_manager_get_scheme (manager
, *style
);
166 const gchar
* id
= gtk_source_style_scheme_get_id (scheme
);
167 gtk_list_store_append (model
, &iter
);
168 gtk_list_store_set (model
, &iter
,
169 COLUMN_NAME
, gtk_source_style_scheme_get_name (scheme
),
170 COLUMN_DESC
, gtk_source_style_scheme_get_description (scheme
),
172 if (g_str_equal (id
, current_style
))
174 *current
= gtk_tree_iter_copy (&iter
);
177 g_free (current_style
);
178 return GTK_TREE_MODEL (model
);
182 on_style_changed (GtkComboBox
* combo
, SourceviewPlugin
* plugin
)
186 GtkSourceStyleSchemeManager
* manager
= gtk_source_style_scheme_manager_get_default();
187 GtkSourceStyleScheme
* scheme
;
188 IAnjutaDocumentManager
* docman
;
189 AnjutaShell
* shell
= ANJUTA_PLUGIN (plugin
)->shell
;
190 gtk_combo_box_get_active_iter (combo
, &iter
);
191 gtk_tree_model_get (gtk_combo_box_get_model(combo
), &iter
,
193 scheme
= gtk_source_style_scheme_manager_get_scheme (manager
, id
);
195 anjuta_preferences_set (anjuta_shell_get_preferences (shell
, NULL
),
201 docman
= anjuta_shell_get_interface (shell
,
202 IAnjutaDocumentManager
, NULL
);
205 GList
* editors
= ianjuta_document_manager_get_doc_widgets (docman
, NULL
);
207 for (node
= editors
; node
!= NULL
; node
= g_list_next (node
))
209 IAnjutaDocument
* editor
= IANJUTA_DOCUMENT (node
->data
);
210 if (ANJUTA_IS_SOURCEVIEW (editor
))
212 Sourceview
* sv
= ANJUTA_SOURCEVIEW (editor
);
213 gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (sv
->priv
->document
),
221 ipreferences_merge(IAnjutaPreferences
* ipref
, AnjutaPreferences
* prefs
, GError
** e
)
223 /* Add preferences */
224 SourceviewPlugin
* plugin
= ANJUTA_PLUGIN_SOURCEVIEW (ipref
);
225 GtkCellRenderer
* renderer_name
= gtk_cell_renderer_text_new ();
226 GtkCellRenderer
* renderer_desc
= gtk_cell_renderer_text_new ();
227 GtkTreeIter
* iter
= NULL
;
228 gxml
= glade_xml_new (PREFS_GLADE
, "preferences_dialog", NULL
);
229 anjuta_preferences_add_page (prefs
,
230 gxml
, "Editor", _("GtkSourceView Editor"), ICON_FILE
);
232 plugin
->check_font
= glade_xml_get_widget(gxml
, FONT_USE_THEME_BUTTON
);
233 g_signal_connect(G_OBJECT(plugin
->check_font
), "toggled", G_CALLBACK(on_font_check_toggled
), gxml
);
234 on_font_check_toggled (GTK_TOGGLE_BUTTON (plugin
->check_font
), gxml
);
236 /* Init styles combo */
237 plugin
->combo_styles
= glade_xml_get_widget (gxml
, COMBO_STYLES
);
238 gtk_combo_box_set_model (GTK_COMBO_BOX (plugin
->combo_styles
),
239 create_style_model(prefs
, &iter
));
240 g_signal_connect (plugin
->combo_styles
, "changed", G_CALLBACK (on_style_changed
), plugin
);
242 gtk_cell_layout_clear (GTK_CELL_LAYOUT(plugin
->combo_styles
));
243 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(plugin
->combo_styles
), renderer_name
, TRUE
);
244 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(plugin
->combo_styles
), renderer_desc
, FALSE
);
245 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(plugin
->combo_styles
), renderer_name
,
246 "text", COLUMN_NAME
);
247 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(plugin
->combo_styles
), renderer_desc
,
248 "text", COLUMN_DESC
);
249 g_object_set (renderer_desc
,
250 "style", PANGO_STYLE_ITALIC
, NULL
);
253 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (plugin
->combo_styles
),
255 gtk_tree_iter_free (iter
);
260 ipreferences_unmerge(IAnjutaPreferences
* ipref
, AnjutaPreferences
* prefs
, GError
** e
)
262 SourceviewPlugin
* plugin
= ANJUTA_PLUGIN_SOURCEVIEW (ipref
);
263 g_signal_handlers_disconnect_by_func(G_OBJECT(plugin
->check_font
),
264 G_CALLBACK(on_font_check_toggled
), gxml
);
265 g_signal_handlers_disconnect_by_func(G_OBJECT(plugin
->combo_styles
),
266 G_CALLBACK(on_style_changed
), gxml
);
268 anjuta_preferences_remove_page(prefs
, _("GtkSourceView Editor"));
269 g_object_unref(gxml
);
274 ipreferences_iface_init(IAnjutaPreferencesIface
* iface
)
276 iface
->merge
= ipreferences_merge
;
277 iface
->unmerge
= ipreferences_unmerge
;
280 ANJUTA_PLUGIN_BEGIN (SourceviewPlugin
, sourceview_plugin
);
281 ANJUTA_TYPE_ADD_INTERFACE(ieditor_factory
, IANJUTA_TYPE_EDITOR_FACTORY
);
282 ANJUTA_TYPE_ADD_INTERFACE(ipreferences
, IANJUTA_TYPE_PREFERENCES
);
285 ANJUTA_SIMPLE_PLUGIN (SourceviewPlugin
, sourceview_plugin
);