Revision: 1372 http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1372&view=re... Author: colombanw Date: 2010-05-21 17:49:54 +0000 (Fri, 21 May 2010)
Log Message: ----------- GeanyGenDoc: Support per-filetype documentation type setting
Allow to use separated doctype for each filetype. This is useful since different languages may not share the same doctype (e.g. Java is likely to use Javadoc, Vala to use Valadoc, etc.).
Modified Paths: -------------- trunk/geanygendoc/TODO trunk/geanygendoc/src/Makefile.am trunk/geanygendoc/src/ggd-plugin.c trunk/geanygendoc/src/ggd-plugin.h
Added Paths: ----------- trunk/geanygendoc/src/ggd-widget-doctype-selector.c trunk/geanygendoc/src/ggd-widget-doctype-selector.h
Modified: trunk/geanygendoc/TODO =================================================================== --- trunk/geanygendoc/TODO 2010-05-21 08:16:50 UTC (rev 1371) +++ trunk/geanygendoc/TODO 2010-05-21 17:49:54 UTC (rev 1372) @@ -12,9 +12,5 @@ Problem: there is (for now) nothing here for this kind of settings (doctype-global but also specific to it).
-* Support per-filetype documentation type. In practice it is needed since if we - want the documentation type represent its common name (such as doxygen, - gtkdoc, javadoc, valadoc or whatever), and for example almost all users would - use valadoc for vala, but not with other languages. - In practice Doxygen seems the only (or close to be) option that would be - useful for more than one single language. +* Store doctype in a per-document basis? It would be cool, but not sure it is + possible without re-implementing a lot of document history.
Modified: trunk/geanygendoc/src/Makefile.am =================================================================== --- trunk/geanygendoc/src/Makefile.am 2010-05-21 08:16:50 UTC (rev 1371) +++ trunk/geanygendoc/src/Makefile.am 2010-05-21 17:49:54 UTC (rev 1372) @@ -10,7 +10,8 @@ ggd-options.c \ ggd-plugin.c \ ggd-utils.c \ - ggd-widget-frame.c + ggd-widget-frame.c \ + ggd-widget-doctype-selector.c noinst_HEADERS = ggd.h \ ggd-doc-setting.h \ ggd-doc-type.h \ @@ -22,7 +23,8 @@ ggd-options.h \ ggd-plugin.h \ ggd-utils.h \ - ggd-widget-frame.h + ggd-widget-frame.h \ + ggd-widget-doctype-selector.h geanygendoc_la_LDFLAGS = -module -avoid-version geanygendoc_la_LIBADD = @GEANY_LIBS@ \ @GLIB_LIBS@ \
Modified: trunk/geanygendoc/src/ggd-plugin.c =================================================================== --- trunk/geanygendoc/src/ggd-plugin.c 2010-05-21 08:16:50 UTC (rev 1371) +++ trunk/geanygendoc/src/ggd-plugin.c 2010-05-21 17:49:54 UTC (rev 1372) @@ -79,12 +79,28 @@ };
/* global plugin options */ -gchar *GGD_OPT_doctype = NULL; -gboolean GGD_OPT_save_to_refresh = FALSE; -gboolean GGD_OPT_indent = TRUE; -gchar *GGD_OPT_environ = NULL; +gchar *GGD_OPT_doctype[GEANY_MAX_BUILT_IN_FILETYPES] = { NULL }; +gboolean GGD_OPT_save_to_refresh = FALSE; +gboolean GGD_OPT_indent = TRUE; +gchar *GGD_OPT_environ = NULL;
+/* Gets an element of GGD_OPT_doctype, falling back to GGD_OPT_doctype[0] + * (default) if the requested element is not set */ +const gchar * +ggd_plugin_get_doctype (filetype_id id) +{ + const gchar *doctype; + + g_return_val_if_fail (id >= 0 && id < GEANY_MAX_BUILT_IN_FILETYPES, NULL); + + doctype = GGD_OPT_doctype[id]; + if (! doctype || ! *doctype) { + doctype = GGD_OPT_doctype[0]; + } + + return doctype; +}
/* FIXME: tm_source_file_buffer_update() is not found in symbols table */ @@ -123,7 +139,7 @@ if (line < 0) { line = sci_get_current_line (doc->editor->sci); } - ggd_insert_comment (doc, line, GGD_OPT_doctype); + ggd_insert_comment (doc, line, ggd_plugin_get_doctype (doc->file_type->id)); } }
@@ -137,19 +153,49 @@ if (DOC_VALID (doc)) { /* try to ensure tags corresponds to the actual state of the file */ refresh_tag_list (doc->tm_file, doc->editor->sci, doc); - ggd_insert_all_comments (doc, GGD_OPT_doctype); + ggd_insert_all_comments (doc, ggd_plugin_get_doctype (doc->file_type->id)); } }
+/* Escapes a string to use it safely as a GKeyFile key. + * It currently replaces only "=" and "#" since GKeyFile supports UTF-8 keys. */ +static gchar * +normalize_key (const gchar *key) +{ + GString *nkey; + + nkey = g_string_new (NULL); + for (; *key; key++) { + switch (*key) { + case '=': g_string_append (nkey, "Equal"); break; + case '#': g_string_append (nkey, "Sharp"); break; + default: g_string_append_c (nkey, *key); break; + } + } + + return g_string_free (nkey, FALSE); +} + static gboolean load_configuration (void) { gboolean success = FALSE; gchar *conffile; GError *err = NULL; + guint i;
plugin->config = ggd_opt_group_new ("General"); - ggd_opt_group_add_string (plugin->config, &GGD_OPT_doctype, "doctype"); + ggd_opt_group_add_string (plugin->config, &GGD_OPT_doctype[0], "doctype"); + for (i = 1; i < GEANY_MAX_BUILT_IN_FILETYPES; i++) { + gchar *name; + gchar *normal_ftname; + + normal_ftname = normalize_key (filetypes[i]->name); + name = g_strconcat ("doctype_", normal_ftname, NULL); + ggd_opt_group_add_string (plugin->config, &GGD_OPT_doctype[i], name); + g_free (name); + g_free (normal_ftname); + } ggd_opt_group_add_boolean (plugin->config, &GGD_OPT_save_to_refresh, "save_to_refresh"); ggd_opt_group_add_boolean (plugin->config, &GGD_OPT_indent, "indent"); ggd_opt_group_add_string (plugin->config, &GGD_OPT_environ, "environ"); @@ -464,7 +510,10 @@ /* --- Configuration dialog --- */
#include "ggd-widget-frame.h" +#include "ggd-widget-doctype-selector.h"
+static GtkWidget *GGD_W_doctype_selector; + static void conf_dialog_response_handler (GtkDialog *dialog, gint response_id, @@ -474,9 +523,17 @@ case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_APPLY: case GTK_RESPONSE_OK: - case GTK_RESPONSE_YES: + case GTK_RESPONSE_YES: { + guint i; + ggd_opt_group_sync_from_proxies (pdata->config); + for (i = 0; i < GEANY_MAX_BUILT_IN_FILETYPES; i++) { + g_free (GGD_OPT_doctype[i]); + GGD_OPT_doctype[i] = ggd_doctype_selector_get_doctype (GGD_DOCTYPE_SELECTOR (GGD_W_doctype_selector), + i); + } break; + }
default: break; } @@ -486,23 +543,21 @@ plugin_configure (GtkDialog *dialog) { GtkWidget *box; - GtkWidget *hbox; + GtkWidget *box2; + GtkWidget *frame; GtkWidget *widget; - GtkWidget *label; + guint i;
g_signal_connect (dialog, "response", G_CALLBACK (conf_dialog_response_handler), plugin);
- box = gtk_vbox_new (FALSE, 6); - /* documentation type */ - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0); - label = gtk_label_new_with_mnemonic (_("Documentation _type:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - widget = gtk_entry_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget); - ggd_opt_group_set_proxy_gtkentry (plugin->config, &GGD_OPT_doctype, widget); - gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); + box = gtk_vbox_new (FALSE, 12); + + /* General */ + frame = ggd_frame_new (_("General")); + gtk_box_pack_start (GTK_BOX (box), frame, TRUE, TRUE, 0); + box2 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (frame), box2); /* auto-save */ widget = gtk_check_button_new_with_mnemonic (_("_Save file before generating comment")); ui_widget_set_tooltip_text (widget, @@ -514,7 +569,7 @@ "file.")); ggd_opt_group_set_proxy_gtktogglebutton (plugin->config, &GGD_OPT_save_to_refresh, widget); - gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box2), widget, FALSE, FALSE, 0); /* indent */ widget = gtk_check_button_new_with_mnemonic (_("_Indent comments")); ui_widget_set_tooltip_text (widget, _("Whether to indent the comments to fit " @@ -522,8 +577,21 @@ "position.")); ggd_opt_group_set_proxy_gtktogglebutton (plugin->config, &GGD_OPT_indent, widget); - gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0); - /* environ editor */ + gtk_box_pack_start (GTK_BOX (box2), widget, FALSE, FALSE, 0); + + /* Documentation type */ + frame = ggd_frame_new (_("Documentation type")); + gtk_box_pack_start (GTK_BOX (box), frame, TRUE, TRUE, 0); + box2 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (frame), box2); + GGD_W_doctype_selector = ggd_doctype_selector_new (); + for (i = 0; i < GEANY_MAX_BUILT_IN_FILETYPES; i++) { + ggd_doctype_selector_set_doctype (GGD_DOCTYPE_SELECTOR (GGD_W_doctype_selector), + i, GGD_OPT_doctype[i]); + } + gtk_box_pack_start (GTK_BOX (box2), GGD_W_doctype_selector, TRUE, TRUE, 0); + + /* Environ editor */ widget = ggd_frame_new (_("Global environment")); ui_widget_set_tooltip_text (widget, _("Global environment overrides and " "additions. This environment will be "
Modified: trunk/geanygendoc/src/ggd-plugin.h =================================================================== --- trunk/geanygendoc/src/ggd-plugin.h 2010-05-21 08:16:50 UTC (rev 1371) +++ trunk/geanygendoc/src/ggd-plugin.h 2010-05-21 17:49:54 UTC (rev 1372) @@ -52,12 +52,15 @@
/* global plugin options */ -extern gchar *GGD_OPT_doctype; +extern gchar *GGD_OPT_doctype[GEANY_MAX_BUILT_IN_FILETYPES]; extern gboolean GGD_OPT_save_to_refresh; extern gboolean GGD_OPT_indent; extern gchar *GGD_OPT_environ;
+const gchar *ggd_plugin_get_doctype (filetype_id id); + + GGD_END_PLUGIN_API G_END_DECLS
Added: trunk/geanygendoc/src/ggd-widget-doctype-selector.c =================================================================== --- trunk/geanygendoc/src/ggd-widget-doctype-selector.c (rev 0) +++ trunk/geanygendoc/src/ggd-widget-doctype-selector.c 2010-05-21 17:49:54 UTC (rev 1372) @@ -0,0 +1,310 @@ +/* + * + * GeanyGenDoc, a Geany plugin to ease generation of source code documentation + * Copyright (C) 2010 Colomban Wendling ban@herbesfolles.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +#include "ggd-widget-doctype-selector.h" + +#include <gtk/gtk.h> + +#include "ggd-plugin.h" + + +static void ggd_doctype_selector_finalize (GObject *object); +static void ggd_doctype_selector_constructed (GObject *object); +static void doctype_column_edited_handler (GtkCellRendererText *renderer, + gchar *path, + gchar *new_text, + GtkListStore *store); +static gint sort_language_column (GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer user_data); + + +struct _GgdDoctypeSelectorPrivate +{ + GtkListStore *store; + GtkWidget *view; +}; + +enum +{ + COLUMN_ID, + COLUMN_LANGUAGE, + COLUMN_TOOLTIP, + COLUMN_DOCTYPE, + + N_COLUMNS +}; + + +G_DEFINE_TYPE (GgdDoctypeSelector, ggd_doctype_selector, GTK_TYPE_SCROLLED_WINDOW) + + +static void +ggd_doctype_selector_finalize (GObject *object) +{ + GgdDoctypeSelector *self = GGD_DOCTYPE_SELECTOR (object); + + g_object_unref (self->priv->store); + + G_OBJECT_CLASS (ggd_doctype_selector_parent_class)->finalize (object); +} + +static void +ggd_doctype_selector_class_init (GgdDoctypeSelectorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = ggd_doctype_selector_finalize; + object_class->constructed = ggd_doctype_selector_constructed; + + g_type_class_add_private (klass, sizeof (GgdDoctypeSelectorPrivate)); +} + +static void +ggd_doctype_selector_init (GgdDoctypeSelector *self) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GGD_DOCTYPE_SELECTOR_TYPE, + GgdDoctypeSelectorPrivate); + /* Set scrolled window properties */ + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), + GTK_SHADOW_IN); + + /* Model */ + self->priv->store = gtk_list_store_new (N_COLUMNS, G_TYPE_UINT, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (self->priv->store), + COLUMN_LANGUAGE, sort_language_column, + NULL, NULL); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self->priv->store), + COLUMN_LANGUAGE, GTK_SORT_ASCENDING); + + /* View */ + self->priv->view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (self->priv->store)); + gtk_tree_view_set_search_column (GTK_TREE_VIEW (self->priv->view), COLUMN_LANGUAGE); + gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (self->priv->view), COLUMN_TOOLTIP); + gtk_widget_show (self->priv->view); + /* language column */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Language"), renderer, + "text", COLUMN_LANGUAGE, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->view), column); + /* doctype column */ + renderer = gtk_cell_renderer_text_new (); + g_object_set (renderer, "editable", TRUE, NULL); + g_signal_connect (renderer, "edited", + G_CALLBACK (doctype_column_edited_handler), self->priv->store); + column = gtk_tree_view_column_new_with_attributes (_("Documentation type"), renderer, + "text", COLUMN_DOCTYPE, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->view), column); +} + +static void +ggd_doctype_selector_constructed (GObject *object) +{ + GgdDoctypeSelector *self = GGD_DOCTYPE_SELECTOR (object); + GtkTreeIter iter; + guint i; + + /* Add the view after construction because GtkScrolledWindow needs its + * adjustments to be non-NULL, which is done by setting a property on + * construction. It perhaps should be fixed in GTK+? */ + gtk_container_add (GTK_CONTAINER (self), self->priv->view); + + /* add "All" on top of the list */ + gtk_list_store_append (self->priv->store, &iter); + gtk_list_store_set (self->priv->store, &iter, + COLUMN_ID, 0, + COLUMN_LANGUAGE, _("All"), + COLUMN_TOOLTIP, _("Default doctype for languages that " + "doesn't have one set"), + COLUMN_DOCTYPE, NULL, + -1); + /* i = 1: skip None */ + for (i = 1; i < GEANY_MAX_BUILT_IN_FILETYPES; i++) { + gtk_list_store_append (self->priv->store, &iter); + gtk_list_store_set (self->priv->store, &iter, + COLUMN_ID, i, + COLUMN_LANGUAGE, filetypes[i]->name, + COLUMN_TOOLTIP, filetypes[i]->title, + COLUMN_DOCTYPE, NULL, + -1); + } +} + +/* Gets the row having @language_id as language ID. + * Returns: %TRUE if @iter was set, %FALSE otherwise */ +static gboolean +get_row_iter (GgdDoctypeSelector *self, + guint language_id, + GtkTreeIter *iter) +{ + gboolean valid; + GtkTreeModel *model = GTK_TREE_MODEL (self->priv->store); + gboolean found = FALSE; + + valid = gtk_tree_model_get_iter_first (model, iter); + while (valid && ! found) { + guint id; + + gtk_tree_model_get (model, iter, COLUMN_ID, &id, -1); + if (id == language_id) { + found = TRUE; + break; + } + valid = gtk_tree_model_iter_next (model, iter); + } + + return found; +} + +/* Updates the doctype of @language_id. + * Returns: %TRUE if @language_id was found (and updated), %FALSE otherwise */ +static gboolean +update_doctype (GgdDoctypeSelector *self, + guint language_id, + const gchar *new_doctype) +{ + GtkTreeIter iter; + gboolean changed = FALSE; + + if (get_row_iter (self, language_id, &iter)) { + gtk_list_store_set (self->priv->store, &iter, + COLUMN_DOCTYPE, new_doctype, + -1); + changed = TRUE; + } + + return changed; +} + +/* Gets the value of a column of the row containing @language_id + * Returns: %TRUE if @result was set, %FALSE otherwise */ +static gboolean +get_row_value (GgdDoctypeSelector *self, + guint language_id, + guint column, + void *result) +{ + GtkTreeIter iter; + gboolean found = FALSE; + + if (get_row_iter (self, language_id, &iter)) { + gtk_tree_model_get (GTK_TREE_MODEL (self->priv->store), &iter, + column, result, + -1); + found = TRUE; + } + + return found; +} + +static void +doctype_column_edited_handler (GtkCellRendererText *renderer, + gchar *path, + gchar *new_text, + GtkListStore *store) +{ + GtkTreeIter iter; + + gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path); + gtk_list_store_set (store, &iter, COLUMN_DOCTYPE, new_text, -1); +} + +/* GtkTreeIterCompareFunc to sort by the language column + * It keeps language ID 0 (All) on top. */ +static gint +sort_language_column (GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer user_data) +{ + guint lang_id_1; + guint lang_id_2; + gchar *lang_name_1; + gchar *lang_name_2; + gint ret = 0; + + gtk_tree_model_get (model, a, + COLUMN_ID, &lang_id_1, + COLUMN_LANGUAGE, &lang_name_1, + -1); + gtk_tree_model_get (model, b, + COLUMN_ID, &lang_id_2, + COLUMN_LANGUAGE, &lang_name_2, + -1); + if (lang_id_1 == 0 || lang_id_2 == 0) { + /* sort All before any other */ + ret = (gint)lang_id_1 - (gint)lang_id_2; + } else { + /* probably no need for a better string sorting function */ + ret = g_ascii_strcasecmp (lang_name_1, lang_name_2); + } + g_free (lang_name_1); + g_free (lang_name_2); + + return ret; +} + + +/*----------------------------- Begin public API -----------------------------*/ + +GtkWidget * +ggd_doctype_selector_new (void) +{ + return g_object_new (GGD_DOCTYPE_SELECTOR_TYPE, NULL); +} + +gboolean +ggd_doctype_selector_set_doctype (GgdDoctypeSelector *self, + guint language_id, + const gchar *doctype) +{ + g_return_val_if_fail (GGD_IS_DOCTYPE_SELECTOR (self), FALSE); + g_return_val_if_fail (language_id >= 0 && + language_id < GEANY_MAX_BUILT_IN_FILETYPES, + FALSE); + + return update_doctype (self, language_id, doctype); +} + +gchar * +ggd_doctype_selector_get_doctype (GgdDoctypeSelector *self, + guint language_id) +{ + gchar *doctype = NULL; + + g_return_val_if_fail (GGD_IS_DOCTYPE_SELECTOR (self), FALSE); + g_return_val_if_fail (language_id >= 0 && + language_id < GEANY_MAX_BUILT_IN_FILETYPES, + FALSE); + + get_row_value (self, language_id, COLUMN_DOCTYPE, &doctype); + + return doctype; +}
Added: trunk/geanygendoc/src/ggd-widget-doctype-selector.h =================================================================== --- trunk/geanygendoc/src/ggd-widget-doctype-selector.h (rev 0) +++ trunk/geanygendoc/src/ggd-widget-doctype-selector.h 2010-05-21 17:49:54 UTC (rev 1372) @@ -0,0 +1,68 @@ +/* + * + * GeanyGenDoc, a Geany plugin to ease generation of source code documentation + * Copyright (C) 2010 Colomban Wendling ban@herbesfolles.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +#ifndef H_GGD_WIDGET_DOCTYPE_SELECTOR +#define H_GGD_WIDGET_DOCTYPE_SELECTOR + +#include <gtk/gtk.h> + +#include "ggd-macros.h" + +G_BEGIN_DECLS +GGD_BEGIN_PLUGIN_API + + +#define GGD_DOCTYPE_SELECTOR_TYPE (ggd_doctype_selector_get_type ()) +#define GGD_DOCTYPE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGD_DOCTYPE_SELECTOR_TYPE, GgdDoctypeSelector)) +#define GGD_DOCTYPE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGD_DOCTYPE_SELECTOR_TYPE, GgdDoctypeSelectorClass)) +#define GGD_IS_DOCTYPE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGD_DOCTYPE_SELECTOR_TYPE)) +#define GGD_IS_DOCTYPE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGD_DOCTYPE_SELECTOR_TYPE)) + + +typedef struct _GgdDoctypeSelector GgdDoctypeSelector; +typedef struct _GgdDoctypeSelectorClass GgdDoctypeSelectorClass; +typedef struct _GgdDoctypeSelectorPrivate GgdDoctypeSelectorPrivate; + +struct _GgdDoctypeSelector +{ + GtkScrolledWindow parent; + + GgdDoctypeSelectorPrivate *priv; +}; + +struct _GgdDoctypeSelectorClass +{ + GtkScrolledWindowClass parent_class; +}; + + +GType ggd_doctype_selector_get_type (void) G_GNUC_CONST; +GtkWidget *ggd_doctype_selector_new (void); +gboolean ggd_doctype_selector_set_doctype (GgdDoctypeSelector *self, + guint language_id, + const gchar *doctype); +gchar *ggd_doctype_selector_get_doctype (GgdDoctypeSelector *self, + guint language_id); + + +GGD_END_PLUGIN_API +G_END_DECLS + +#endif /* guard */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
plugins-commits@lists.geany.org