* plugins/terminal/terminal.c,
[anjuta-git-plugin.git] / plugins / sourceview / plugin.c
blob1ba2b6d44a1b0035eb0153117479fa46b9d4170d
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>
5 *
6 * plugin.c is free software.
7 *
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/gtksourceview.h>
35 #include <gtksourceview/gtksourcestyleschememanager.h>
37 #include "plugin.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;
55 static void
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));
63 static gboolean
64 sourceview_plugin_activate (AnjutaPlugin *plugin)
66 DEBUG_PRINT ("SourceviewPlugin: Activating SourceviewPlugin plugin ...");
68 return TRUE;
71 static gboolean
72 sourceview_plugin_deactivate (AnjutaPlugin *plugin)
74 DEBUG_PRINT ("SourceviewPlugin: Dectivating SourceviewPlugin plugin ...");
76 return TRUE;
79 static void
80 sourceview_plugin_finalize (GObject *obj)
82 /* Finalization codes here */
83 G_OBJECT_CLASS (parent_class)->finalize (obj);
86 static void
87 sourceview_plugin_dispose (GObject *obj)
89 /* Disposition codes */
90 G_OBJECT_CLASS (parent_class)->dispose (obj);
93 static void
94 sourceview_plugin_instance_init (GObject *obj)
99 static void
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,
114 const gchar* uri,
115 const gchar* filename,
116 GError** error)
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();
122 Sourceview* sv;
123 if (!current_style)
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,
130 current_style));
131 g_free (current_style);
132 return IANJUTA_EDITOR (sv);
135 static void
136 ieditor_factory_iface_init (IAnjutaEditorFactoryIface *iface)
138 iface->new_editor = ieditor_factory_new_editor;
141 enum
143 COLUMN_NAME = 0,
144 COLUMN_DESC,
145 COLUMN_ID
148 static GtkTreeModel*
149 create_style_model (AnjutaPreferences* prefs, GtkTreeIter** current)
151 GtkListStore* model = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING,
152 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);
157 if (!current_style)
159 current_style = g_strdup (SOURCEVIEW_DEFAULT_STYLE);
161 for (style = styles; *style != NULL; style++)
163 GtkTreeIter iter;
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),
171 COLUMN_ID, id, -1);
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);
181 static void
182 on_style_changed (GtkComboBox* combo, SourceviewPlugin* plugin)
184 GtkTreeIter iter;
185 gchar* id;
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,
192 COLUMN_ID, &id, -1);
193 scheme = gtk_source_style_scheme_manager_get_scheme (manager, id);
195 anjuta_preferences_set (anjuta_shell_get_preferences (shell, NULL),
196 SOURCEVIEW_STYLE,
197 id);
198 g_free (id);
201 docman = anjuta_shell_get_interface (shell,
202 IAnjutaDocumentManager, NULL);
203 if (docman)
205 GList* editors = ianjuta_document_manager_get_doc_widgets (docman, NULL);
206 GList* node;
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),
214 scheme);
220 static void
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);
251 if (iter)
253 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (plugin->combo_styles),
254 iter);
255 gtk_tree_iter_free (iter);
259 static void
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);
270 gxml = NULL;
273 static void
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);
283 ANJUTA_PLUGIN_END;
285 ANJUTA_SIMPLE_PLUGIN (SourceviewPlugin, sourceview_plugin);