SF.net SVN: geany-plugins:[1372] trunk/geanygendoc

colombanw at users.sourceforge.net colombanw at xxxxx
Fri May 21 17:49:54 UTC 2010


Revision: 1372
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1372&view=rev
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 at 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 at 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.



More information about the Plugins-Commits mailing list