SF.net SVN: geany: [1659] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Wed Jul 4 11:32:34 UTC 2007


Revision: 1659
          http://svn.sourceforge.net/geany/?rev=1659&view=rev
Author:   ntrel
Date:     2007-07-04 04:32:33 -0700 (Wed, 04 Jul 2007)

Log Message:
-----------
Make Class Builder into a plugin.
Add some function pointers to the plugin API (for the class builder).
Don't use G_MODULE_BIND_LAZY when loading plugins otherwise we can
potentially get unresolved symbols at runtime, causing a segfault.
Capitalize 2 menu item labels.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/geany.glade
    trunk/plugins/Makefile.am
    trunk/po/POTFILES.in
    trunk/src/callbacks.c
    trunk/src/callbacks.h
    trunk/src/interface.c
    trunk/src/plugindata.h
    trunk/src/plugins.c
    trunk/src/templates.c
    trunk/src/templates.h
    trunk/src/tools.c
    trunk/src/tools.h

Added Paths:
-----------
    trunk/plugins/classbuilder.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/ChangeLog	2007-07-04 11:32:33 UTC (rev 1659)
@@ -1,3 +1,19 @@
+2007-07-04  Nick Treleaven  <nick.treleaven at btinternet.com>
+
+ * src/utils.c, src/utils.h:
+   Add comment for utils_free_pointers() warning not to use it if any
+   pointers may be NULL.
+ * plugins/Makefile.am, plugins/classbuilder.c, src/templates.c,
+   src/interface.c, src/templates.h, src/tools.c, src/tools.h,
+   src/plugindata.h, src/callbacks.c, src/callbacks.h, src/plugins.c,
+   po/POTFILES.in, geany.glade:
+   Make Class Builder into a plugin.
+   Add some function pointers to the plugin API (for the class builder).
+   Don't use G_MODULE_BIND_LAZY when loading plugins otherwise we can
+   potentially get unresolved symbols at runtime, causing a segfault.
+   Capitalize 2 menu item labels.
+
+
 2007-07-02  Enrico Tröger  <enrico.troeger at uvena.de>
 
  * src/symbols.c, tagmanager/conf.c:

Modified: trunk/geany.glade
===================================================================
--- trunk/geany.glade	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/geany.glade	2007-07-04 11:32:33 UTC (rev 1659)
@@ -58,7 +58,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1776">
+			<widget class="GtkImage" id="image1877">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-new</property>
 			  <property name="icon_size">1</property>
@@ -148,7 +148,7 @@
 		      <signal name="activate" handler="on_save_all1_activate" last_modification_time="Thu, 02 Jun 2005 14:15:30 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1777">
+			<widget class="GtkImage" id="image1878">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-save</property>
 			  <property name="icon_size">1</property>
@@ -169,7 +169,7 @@
 		      <signal name="activate" handler="on_toolbutton23_clicked" last_modification_time="Mon, 24 Jul 2006 19:26:04 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1778">
+			<widget class="GtkImage" id="image1879">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-revert-to-saved</property>
 			  <property name="icon_size">1</property>
@@ -189,7 +189,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1779">
+			<widget class="GtkImage" id="image1880">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-revert-to-saved</property>
 			  <property name="icon_size">1</property>
@@ -285,7 +285,7 @@
 		      <signal name="activate" handler="on_close_all1_activate" last_modification_time="Thu, 02 Jun 2005 14:15:30 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1780">
+			<widget class="GtkImage" id="image1881">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-close</property>
 			  <property name="icon_size">1</property>
@@ -493,7 +493,7 @@
 			      <signal name="activate" handler="on_menu_increase_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:28:54 GMT"/>
 
 			      <child internal-child="image">
-				<widget class="GtkImage" id="image1781">
+				<widget class="GtkImage" id="image1882">
 				  <property name="visible">True</property>
 				  <property name="stock">gtk-indent</property>
 				  <property name="icon_size">1</property>
@@ -514,7 +514,7 @@
 			      <signal name="activate" handler="on_menu_decrease_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:28:54 GMT"/>
 
 			      <child internal-child="image">
-				<widget class="GtkImage" id="image1782">
+				<widget class="GtkImage" id="image1883">
 				  <property name="visible">True</property>
 				  <property name="stock">gtk-unindent</property>
 				  <property name="icon_size">1</property>
@@ -570,7 +570,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1783">
+			<widget class="GtkImage" id="image1884">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -602,7 +602,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1784">
+			<widget class="GtkImage" id="image1885">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -687,7 +687,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1785">
+			<widget class="GtkImage" id="image1886">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -784,7 +784,7 @@
 		      <signal name="activate" handler="on_replace1_activate" last_modification_time="Sun, 23 Oct 2005 13:22:36 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1786">
+			<widget class="GtkImage" id="image1887">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-find-and-replace</property>
 			  <property name="icon_size">1</property>
@@ -850,7 +850,7 @@
 		      <signal name="activate" handler="on_go_to_line1_activate" last_modification_time="Tue, 23 May 2006 17:10:49 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1787">
+			<widget class="GtkImage" id="image1888">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-jump-to</property>
 			  <property name="icon_size">1</property>
@@ -874,7 +874,7 @@
 	      <property name="use_underline">True</property>
 
 	      <child>
-		<widget class="GtkMenu" id="menuitem3_menu">
+		<widget class="GtkMenu" id="menu_view1_menu">
 
 		  <child>
 		    <widget class="GtkImageMenuItem" id="menu_change_font1">
@@ -885,7 +885,7 @@
 		      <signal name="activate" handler="on_change_font1_activate" last_modification_time="Fri, 22 Apr 2005 18:58:45 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1788">
+			<widget class="GtkImage" id="image1889">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-select-font</property>
 			  <property name="icon_size">1</property>
@@ -907,7 +907,7 @@
 		  <child>
 		    <widget class="GtkMenuItem" id="menu_toggle_all_additional_widgets1">
 		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Toggle all additional widgets</property>
+		      <property name="label" translatable="yes">Toggle All Additional Widgets</property>
 		      <property name="use_underline">True</property>
 		      <signal name="activate" handler="on_menu_toggle_all_additional_widgets1_activate" last_modification_time="Sun, 06 May 2007 14:13:10 GMT"/>
 		    </widget>
@@ -1021,7 +1021,7 @@
 	      <property name="use_underline">True</property>
 
 	      <child>
-		<widget class="GtkMenu" id="menu_item4_menu">
+		<widget class="GtkMenu" id="menu_document1_menu">
 
 		  <child>
 		    <widget class="GtkCheckMenuItem" id="menu_line_breaking1">
@@ -1245,7 +1245,7 @@
 		      <signal name="activate" handler="on_project_new1_activate" last_modification_time="Thu, 18 Jan 2007 22:16:24 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1789">
+			<widget class="GtkImage" id="image1890">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-new</property>
 			  <property name="icon_size">1</property>
@@ -1266,7 +1266,7 @@
 		      <signal name="activate" handler="on_project_open1_activate" last_modification_time="Mon, 15 Jan 2007 17:34:17 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1790">
+			<widget class="GtkImage" id="image1891">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-open</property>
 			  <property name="icon_size">1</property>
@@ -1287,7 +1287,7 @@
 		      <signal name="activate" handler="on_project_close1_activate" last_modification_time="Mon, 15 Jan 2007 17:34:17 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1791">
+			<widget class="GtkImage" id="image1892">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-close</property>
 			  <property name="icon_size">1</property>
@@ -1345,7 +1345,7 @@
 		      <signal name="activate" handler="on_show_color_chooser1_activate" last_modification_time="Wed, 22 Jun 2005 18:10:21 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1792">
+			<widget class="GtkImage" id="image1893">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-select-color</property>
 			  <property name="icon_size">1</property>
@@ -1376,49 +1376,6 @@
 		      <signal name="activate" handler="on_menu_insert_special_chars1_activate" last_modification_time="Tue, 12 Dec 2006 22:03:01 GMT"/>
 		    </widget>
 		  </child>
-
-		  <child>
-		    <widget class="GtkImageMenuItem" id="menu_create_class1">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Create cla_ss</property>
-		      <property name="use_underline">True</property>
-
-		      <child internal-child="image">
-			<widget class="GtkImage" id="image1861">
-			  <property name="visible">True</property>
-			  <property name="stock">gtk-add</property>
-			  <property name="icon_size">1</property>
-			  <property name="xalign">0.5</property>
-			  <property name="yalign">0.5</property>
-			  <property name="xpad">0</property>
-			  <property name="ypad">0</property>
-			</widget>
-		      </child>
-
-		      <child>
-			<widget class="GtkMenu" id="menu_create_class1_menu">
-
-			  <child>
-			    <widget class="GtkMenuItem" id="menu_create_cpp_class">
-			      <property name="visible">True</property>
-			      <property name="label" translatable="yes">C++ class</property>
-			      <property name="use_underline">True</property>
-			      <signal name="activate" handler="on_menu_create_cpp_class_activate" last_modification_time="Mon, 11 Jun 2007 10:49:53 GMT"/>
-			    </widget>
-			  </child>
-
-			  <child>
-			    <widget class="GtkMenuItem" id="menu_create_gtk_class">
-			      <property name="visible">True</property>
-			      <property name="label" translatable="yes">GTK+ class</property>
-			      <property name="use_underline">True</property>
-			      <signal name="activate" handler="on_menu_create_gtk_class_activate" last_modification_time="Mon, 11 Jun 2007 10:50:17 GMT"/>
-			    </widget>
-			  </child>
-			</widget>
-		      </child>
-		    </widget>
-		  </child>
 		</widget>
 	      </child>
 	    </widget>
@@ -1431,7 +1388,7 @@
 	      <property name="use_underline">True</property>
 
 	      <child>
-		<widget class="GtkMenu" id="menu_item5_menu">
+		<widget class="GtkMenu" id="menu_help1_menu">
 
 		  <child>
 		    <widget class="GtkImageMenuItem" id="help1">
@@ -2698,7 +2655,7 @@
 	      <signal name="activate" handler="on_menu_increase_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:31:38 GMT"/>
 
 	      <child internal-child="image">
-		<widget class="GtkImage" id="image1693">
+		<widget class="GtkImage" id="image1894">
 		  <property name="visible">True</property>
 		  <property name="stock">gtk-indent</property>
 		  <property name="icon_size">1</property>
@@ -2719,7 +2676,7 @@
 	      <signal name="activate" handler="on_menu_decrease_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:31:38 GMT"/>
 
 	      <child internal-child="image">
-		<widget class="GtkImage" id="image1694">
+		<widget class="GtkImage" id="image1895">
 		  <property name="visible">True</property>
 		  <property name="stock">gtk-unindent</property>
 		  <property name="icon_size">1</property>
@@ -2775,7 +2732,7 @@
       <property name="use_underline">True</property>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1695">
+	<widget class="GtkImage" id="image1896">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-add</property>
 	  <property name="icon_size">1</property>
@@ -2807,7 +2764,7 @@
       <property name="use_underline">True</property>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1696">
+	<widget class="GtkImage" id="image1897">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-add</property>
 	  <property name="icon_size">1</property>
@@ -2875,7 +2832,7 @@
 	    <widget class="GtkMenuItem" id="insert_bsd_license_notice1">
 	      <property name="visible">True</property>
 	      <property name="tooltip" translatable="yes">Inserts a BSD licence notice (should be done at the beginning of the file)</property>
-	      <property name="label" translatable="yes">Insert BSD license Notice</property>
+	      <property name="label" translatable="yes">Insert BSD License Notice</property>
 	      <property name="use_underline">True</property>
 	      <signal name="activate" handler="on_comments_bsd_activate" last_modification_time="Fri, 05 Jan 2007 13:32:16 GMT"/>
 	    </widget>
@@ -2892,7 +2849,7 @@
       <property name="use_underline">True</property>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1697">
+	<widget class="GtkImage" id="image1898">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-add</property>
 	  <property name="icon_size">1</property>
@@ -2931,7 +2888,7 @@
       <signal name="activate" handler="on_find_usage1_activate" last_modification_time="Fri, 27 May 2005 21:55:12 GMT"/>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1698">
+	<widget class="GtkImage" id="image1899">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-find</property>
 	  <property name="icon_size">1</property>
@@ -2986,7 +2943,7 @@
       <signal name="activate" handler="on_go_to_line_activate" last_modification_time="Sat, 16 Jul 2005 11:20:32 GMT"/>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1699">
+	<widget class="GtkImage" id="image1900">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-jump-to</property>
 	  <property name="icon_size">1</property>

Modified: trunk/plugins/Makefile.am
===================================================================
--- trunk/plugins/Makefile.am	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/plugins/Makefile.am	2007-07-04 11:32:33 UTC (rev 1659)
@@ -8,20 +8,24 @@
 plugindir = $(libdir)/geany
 
 demoplugin_la_LDFLAGS    = -module -avoid-version
+classbuilder_la_LDFLAGS  = -module -avoid-version
 
 if PLUGINS
 
 # Plugins to be installed
 plugin_LTLIBRARIES = \
-	demoplugin.la
+	demoplugin.la \
+	classbuilder.la
 
 # Plugins not to be installed
 #noinst_LTLIBRARIES = \
 	#demoplugin.la
 
 demoplugin_la_SOURCES    = demoplugin.c
+classbuilder_la_SOURCES  = classbuilder.c
 
 demoplugin_la_LIBADD    = $(GTK_LIBS)
+classbuilder_la_LIBADD  = $(GTK_LIBS)
 
 endif # PLUGINS
 

Added: trunk/plugins/classbuilder.c
===================================================================
--- trunk/plugins/classbuilder.c	                        (rev 0)
+++ trunk/plugins/classbuilder.c	2007-07-04 11:32:33 UTC (rev 1659)
@@ -0,0 +1,859 @@
+/*
+ *      classbuilder.c - this file is part of Geany, a fast and lightweight IDE
+ *
+ *      Copyright 2007 Alexander Rodin <rodin(dot)alexander(at)gmail(dot)com>
+ *      Copyright 2007 Enrico Tröger <enrico.troeger at uvena.de>
+ *      Copyright 2007 Nick Treleaven <nick.treleaven at btinternet.com>
+ *
+ *      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 2 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, write to the Free Software
+ *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ *      MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+/* Class Builder - creates source files containing a new class interface and definition. */
+
+#include "geany.h"
+#include "plugindata.h"
+#include "support.h"
+#include "filetypes.h"
+#include "document.h"
+
+
+enum
+{
+	GEANY_CLASS_TYPE_CPP,
+	GEANY_CLASS_TYPE_GTK
+};
+
+typedef struct _ClassInfo	ClassInfo;
+
+struct _ClassInfo
+{
+	gint type;
+	gchar *class_name;
+	gchar *class_name_up;
+	gchar *class_name_low;
+	gchar *base_name;
+	gchar *base_gtype;
+	gchar *header;
+	gchar *header_guard;
+	gchar *base_include;
+	gchar *base_decl;
+	gchar *constructor_decl;
+	gchar *destructor_decl;
+	gchar *source;
+	gchar *constructor_impl;
+	gchar *destructor_impl;
+	gchar *gtk_destructor_registration;
+};
+
+typedef struct _CreateClassDialog
+{
+	gint class_type;
+	GtkWidget *dialog;
+	GtkWidget *class_name_entry;
+	GtkWidget *header_entry;
+	GtkWidget *source_entry;
+	GtkWidget *base_name_entry;
+	GtkWidget *base_header_entry;
+	GtkWidget *base_header_global_box;
+	GtkWidget *base_gtype_entry;
+	GtkWidget *create_constructor_box;
+	GtkWidget *create_destructor_box;
+	GtkWidget *gtk_constructor_type_entry;
+} CreateClassDialog;
+
+
+static PluginData *plugin_data;
+
+#define doc_array	plugin_data->doc_array
+// can't use document as a macro because it's currently a typename
+#define documents	plugin_data->document
+#define scintilla	plugin_data->sci
+#define templates	plugin_data->templates
+#define utils		plugin_data->utils
+
+
+static struct
+{
+	GtkWidget *menu_item;
+}
+local_data;
+
+
+static const gchar templates_cpp_class_header[] = "{fileheader}\n\n\
+#ifndef {header_guard}\n\
+#define {header_guard}\n\
+{base_include}\n\
+class {class_name}{base_decl}\n\
+{\n\
+	public:\n\
+		{constructor_decl}\
+		{destructor_decl}\
+	\n\
+	private:\n\
+		// add your private declarations\n\
+};\n\
+\n\
+#endif // {header_guard}\n\
+";
+
+static const gchar templates_cpp_class_source[] = "{fileheader}\n\n\
+#include \"{header}\"\n\
+\n\
+{constructor_impl}\n\
+{destructor_impl}\n\
+";
+
+static const gchar templates_gtk_class_header[] = "{fileheader}\n\n\
+#ifndef __{header_guard}__\n\
+#define __{header_guard}__\n\
+{base_include}\n\
+G_BEGIN_DECLS\n\
+\n\
+#define {class_name_up}_TYPE				({class_name_low}_get_type())\n\
+#define {class_name_up}(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj),\\\n\
+		{class_name_up}_TYPE, {class_name}))\n\
+#define {class_name_up}_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass),\\\n\
+		{class_name_up}_TYPE, {class_name}Class))\n\
+#define IS_{class_name_up}(obj)				(G_TYPE_CHECK_INSTANCE_TYPE((obj),\\\n\
+		{class_name_up}_TYPE))\n\
+#define IS_{class_name_up}_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE((klass),\\\n\
+		{class_name_up}_TYPE))\n\
+\n\
+typedef struct _{class_name}				{class_name};\n\
+typedef struct _{class_name}Class			{class_name}Class;\n\
+\n\
+struct _{class_name}\n\
+{\n\
+	{base_name} parent;\n\
+	/* add your public declarations here */\n\
+};\n\
+\n\
+struct _{class_name}Class\n\
+{\n\
+	{base_name}Class parent_class;\n\
+};\n\
+\n\
+GType		{class_name_low}_get_type	(void);\n\
+{constructor_decl}\
+\n\
+G_END_DECLS\n\
+\n\
+#endif /* __{header_guard}__ */\n\
+";
+
+static const gchar templates_gtk_class_source[] = "{fileheader}\n\
+#include \"{header}\"\n\
+\n\
+typedef struct _{class_name}Private				{class_name}Private;\n\
+\n\
+#define {class_name_up}_GET_PRIVATE(obj)		(G_TYPE_INSTANCE_GET_PRIVATE((obj),\\\n\
+		{class_name_up}_TYPE, {class_name}Private))\n\
+\n\
+struct _{class_name}Private\n\
+{\n\
+	/* add your private declarations here */\n\
+};\n\
+\n\
+static void {class_name_low}_class_init			({class_name}Class *klass);\n\
+static void {class_name_low}_init				({class_name} *self);\n\
+{destructor_decl}\
+\n\
+/* Local data */\n\
+static {base_name}Class *parent_class = NULL;\n\
+\n\
+GType {class_name_low}_get_type(void)\n\
+{\n\
+	static GType self_type = 0;\n\
+	if (! self_type)\n\
+	{\n\
+		static const GTypeInfo self_info = \n\
+		{\n\
+			sizeof({class_name}Class),\n\
+			NULL, /* base_init */\n\
+			NULL, /* base_finalize */\n\
+			(GClassInitFunc){class_name_low}_class_init,\n\
+			NULL, /* class_finalize */\n\
+			NULL, /* class_data */\n\
+			sizeof({class_name}),\n\
+			0,\n\
+			(GInstanceInitFunc){class_name_low}_init,\n\
+		};\n\
+		\n\
+		self_type = g_type_register_static({base_gtype}, \"{class_name}\", &self_info, 0);\
+	}\n\
+	\n\
+	return self_type;\n\
+}\n\
+\n\
+static void {class_name_low}_class_init({class_name}Class *klass)\n\
+{\n\
+	{gtk_destructor_registration}\n\
+	parent_class = ({base_name}Class*)g_type_class_peek({base_gtype});\n\
+	g_type_class_add_private((gpointer)klass, sizeof({class_name}Private));\n\
+}\n\
+\n\
+static void {class_name_low}_init({class_name} *self)\n\
+{\n\
+	\n\
+}\n\
+\n\
+{constructor_impl}\n\
+{destructor_impl}\n\
+";
+
+
+static void cc_dlg_on_set_sensitive_toggled(GtkWidget *toggle_button, GtkWidget *target_widget);
+static void cc_dlg_on_class_name_entry_changed(GtkWidget *entry, CreateClassDialog *cc_dlg);
+static void cc_dlg_on_base_name_entry_changed(GtkWidget *entry, CreateClassDialog *cc_dlg);
+static void cc_dlg_on_create_class(CreateClassDialog *cc_dlg);
+
+
+VERSION_CHECK(3)
+
+PLUGIN_INFO(_("Class Builder"), _("Creates source files for new class types."))
+
+
+/* I don't want this to be in the plugin API because it can cause leaks if any pointers
+ * are NULL -ntrel. */
+/* Frees all passed pointers if they are *ALL* non-NULL.
+ * Do not use if any pointers may be NULL.
+ * The first argument is nothing special, it will also be freed.
+ * The list must be ended with NULL. */
+static void
+utils_free_pointers(gpointer first, ...)
+{
+	va_list a;
+	gpointer sa;
+
+    for (va_start(a, first);  (sa = va_arg(a, gpointer), sa!=NULL);)
+    {
+    	if (sa != NULL)
+    		g_free(sa);
+	}
+	va_end(a);
+
+    if (first != NULL)
+    	g_free(first);
+}
+
+
+static gchar*
+get_template_class_header(ClassInfo *class_info)
+{
+	switch (class_info->type)
+	{
+		case GEANY_CLASS_TYPE_CPP:
+		{
+			gchar *fileheader = NULL;
+			gchar *template;
+
+			fileheader = templates->get_template_fileheader(GEANY_FILETYPES_C, class_info->header);
+			template = g_strdup(templates_cpp_class_header);
+			template = utils->str_replace(template, "{fileheader}", fileheader);
+			template = utils->str_replace(template, "{header_guard}", class_info->header_guard);
+			template = utils->str_replace(template, "{base_include}", class_info->base_include);
+			template = utils->str_replace(template, "{class_name}", class_info->class_name);
+			template = utils->str_replace(template, "{base_decl}", class_info->base_decl);
+			template = utils->str_replace(template, "{constructor_decl}",
+					class_info->constructor_decl);
+			template = utils->str_replace(template, "{destructor_decl}",
+					class_info->destructor_decl);
+
+			return template;
+		}
+		case GEANY_CLASS_TYPE_GTK:
+		{
+			gchar *fileheader = NULL;
+			gchar *template;
+
+			fileheader = templates->get_template_fileheader(GEANY_FILETYPES_C, class_info->header);
+			template = g_strdup(templates_gtk_class_header);
+			template = utils->str_replace(template, "{fileheader}", fileheader);
+			template = utils->str_replace(template, "{header_guard}", class_info->header_guard);
+			template = utils->str_replace(template, "{base_include}", class_info->base_include);
+			template = utils->str_replace(template, "{class_name}", class_info->class_name);
+			template = utils->str_replace(template, "{class_name_up}", class_info->class_name_up);
+			template = utils->str_replace(template, "{class_name_low}", class_info->class_name_low);
+			template = utils->str_replace(template, "{base_name}", class_info->base_name);
+			template = utils->str_replace(template, "{constructor_decl}",
+					class_info->constructor_decl);
+
+			return template;
+		}
+	}
+
+	return NULL;
+}
+
+static gchar*
+get_template_class_source(ClassInfo *class_info)
+{
+	switch (class_info->type)
+	{
+		case GEANY_CLASS_TYPE_CPP:
+		{
+			gchar *fileheader = NULL;
+			gchar *template;
+
+			fileheader = templates->get_template_fileheader(GEANY_FILETYPES_C, class_info->source);
+			template = g_strdup(templates_cpp_class_source);
+			template = utils->str_replace(template, "{fileheader}", fileheader);
+			template = utils->str_replace(template, "{header}", class_info->header);
+			template = utils->str_replace(template, "{class_name}", class_info->class_name);
+			template = utils->str_replace(template, "{base_include}", class_info->base_include);
+			template = utils->str_replace(template, "{base_name}", class_info->base_name);
+			template = utils->str_replace(template, "{constructor_impl}",
+					class_info->constructor_impl);
+			template = utils->str_replace(template, "{destructor_impl}",
+					class_info->destructor_impl);
+
+			return template;
+		}
+		case GEANY_CLASS_TYPE_GTK:
+		{
+			gchar *fileheader = NULL;
+			gchar *template;
+
+			fileheader = templates->get_template_fileheader(GEANY_FILETYPES_C, class_info->source);
+			template = g_strdup(templates_gtk_class_source);
+			template = utils->str_replace(template, "{fileheader}", fileheader);
+			template = utils->str_replace(template, "{header}", class_info->header);
+			template = utils->str_replace(template, "{class_name}", class_info->class_name);
+			template = utils->str_replace(template, "{class_name_up}", class_info->class_name_up);
+			template = utils->str_replace(template, "{class_name_low}", class_info->class_name_low);
+			template = utils->str_replace(template, "{base_name}", class_info->base_name);
+			template = utils->str_replace(template, "{base_gtype}", class_info->base_gtype);
+			template = utils->str_replace(template, "{destructor_decl}", class_info->destructor_decl);
+			template = utils->str_replace(template, "{constructor_impl}",
+					class_info->constructor_impl);
+			template = utils->str_replace(template, "{destructor_impl}",
+					class_info->destructor_impl);
+			template = utils->str_replace(template, "{gtk_destructor_registration}",
+					class_info->gtk_destructor_registration);
+
+			return template;
+		}
+	}
+
+	return NULL;
+}
+
+
+void show_dialog_create_class(gint type)
+{
+	CreateClassDialog *cc_dlg;
+	GtkWidget *main_box;
+	GtkWidget *frame;
+	GtkWidget *vbox;
+	GtkWidget *hbox;
+	GtkWidget *label;
+
+	cc_dlg = g_new0(CreateClassDialog, 1);
+	cc_dlg->class_type = type;
+
+	cc_dlg->dialog = gtk_dialog_new_with_buttons(_("Create class"),
+			GTK_WINDOW(plugin_data->app->window),
+			GTK_DIALOG_MODAL,
+			GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+			GTK_STOCK_OK, GTK_RESPONSE_OK,
+			NULL);
+	gtk_container_set_border_width(GTK_CONTAINER(cc_dlg->dialog), 5);
+	g_signal_connect_swapped(G_OBJECT(cc_dlg->dialog), "destroy",
+			G_CALLBACK(g_free), (gpointer)cc_dlg);
+
+	main_box = GTK_DIALOG(cc_dlg->dialog)->vbox;
+	gtk_box_set_spacing(GTK_BOX(main_box), 10);
+
+	frame = gtk_frame_new(_("Class"));
+	gtk_container_add(GTK_CONTAINER(main_box), frame);
+	gtk_widget_show(frame);
+
+	vbox = gtk_vbox_new(FALSE, 10);
+	gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
+	gtk_container_add(GTK_CONTAINER(frame), vbox);
+	gtk_widget_show(vbox);
+
+	hbox = gtk_hbox_new(FALSE, 10);
+	gtk_container_add(GTK_CONTAINER(vbox), hbox);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new(_("Class name:"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show(label);
+
+	cc_dlg->class_name_entry = gtk_entry_new();
+	gtk_box_pack_start(GTK_BOX(hbox), cc_dlg->class_name_entry, TRUE, TRUE, 0);
+	gtk_widget_show(cc_dlg->class_name_entry);
+	g_signal_connect(G_OBJECT(cc_dlg->class_name_entry), "changed",
+			G_CALLBACK(cc_dlg_on_class_name_entry_changed), cc_dlg);
+
+	hbox = gtk_hbox_new(FALSE, 10);
+	gtk_container_add(GTK_CONTAINER(vbox), hbox);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new(_("Header file:"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show(label);
+
+	cc_dlg->header_entry = gtk_entry_new();
+	gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->header_entry);
+	gtk_widget_show(cc_dlg->header_entry);
+
+	hbox = gtk_hbox_new(FALSE, 10);
+	gtk_container_add(GTK_CONTAINER(vbox), hbox);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new(_("Source file:"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show(label);
+
+	cc_dlg->source_entry = gtk_entry_new();
+	gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->source_entry);
+	gtk_widget_show(cc_dlg->source_entry);
+
+	frame = gtk_frame_new(_("Inheritance"));
+	gtk_container_add(GTK_CONTAINER(main_box), frame);
+	gtk_widget_show(frame);
+
+	vbox = gtk_vbox_new(FALSE, 10);
+	gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
+	gtk_container_add(GTK_CONTAINER(frame), vbox);
+	gtk_widget_show(vbox);
+
+	hbox = gtk_hbox_new(FALSE, 10);
+	gtk_container_add(GTK_CONTAINER(vbox), hbox);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new(_("Base class:"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show(label);
+
+	cc_dlg->base_name_entry = gtk_entry_new();
+	if (type == GEANY_CLASS_TYPE_GTK)
+		gtk_entry_set_text(GTK_ENTRY(cc_dlg->base_name_entry), "GObject");
+	gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->base_name_entry);
+	gtk_widget_show(cc_dlg->base_name_entry);
+	g_signal_connect(G_OBJECT(cc_dlg->base_name_entry), "changed",
+			G_CALLBACK(cc_dlg_on_base_name_entry_changed), (gpointer)cc_dlg);
+
+	hbox = gtk_hbox_new(FALSE, 10);
+	gtk_container_add(GTK_CONTAINER(vbox), hbox);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new(_("Base header:"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show(label);
+
+	cc_dlg->base_header_entry = gtk_entry_new();
+	if (type == GEANY_CLASS_TYPE_GTK)
+		gtk_entry_set_text(GTK_ENTRY(cc_dlg->base_header_entry), "glib-object.h");
+	gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->base_header_entry);
+	gtk_widget_show(cc_dlg->base_header_entry);
+
+	cc_dlg->base_header_global_box = gtk_check_button_new_with_label(_("Global"));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cc_dlg->base_header_global_box), TRUE);
+	gtk_box_pack_end(GTK_BOX(hbox), cc_dlg->base_header_global_box, FALSE, FALSE, 0);
+	gtk_widget_show(cc_dlg->base_header_global_box);
+
+	if (type == GEANY_CLASS_TYPE_GTK)
+	{
+		hbox = gtk_hbox_new(FALSE, 10);
+		gtk_container_add(GTK_CONTAINER(vbox), hbox);
+		gtk_widget_show(hbox);
+
+		label = gtk_label_new(_("Base GType:"));
+		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+		gtk_widget_show(label);
+
+		cc_dlg->base_gtype_entry = gtk_entry_new();
+		gtk_entry_set_text(GTK_ENTRY(cc_dlg->base_gtype_entry), "GTK_TYPE_OBJECT");
+		gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->base_gtype_entry);
+		gtk_widget_show(cc_dlg->base_gtype_entry);
+	}
+
+	frame = gtk_frame_new(_("Options"));
+	gtk_container_add(GTK_CONTAINER(main_box), frame);
+	gtk_widget_show(frame);
+
+	vbox = gtk_vbox_new(FALSE, 10);
+	gtk_container_add(GTK_CONTAINER(frame), vbox);
+	gtk_widget_show(vbox);
+
+	hbox = gtk_hbox_new(FALSE, 10);
+	gtk_container_add(GTK_CONTAINER(vbox), hbox);
+	gtk_widget_show(hbox);
+
+	cc_dlg->create_constructor_box = gtk_check_button_new_with_label(_("Create constructor"));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cc_dlg->create_constructor_box), TRUE);
+	gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->create_constructor_box);
+	gtk_widget_show(cc_dlg->create_constructor_box);
+
+	cc_dlg->create_destructor_box = gtk_check_button_new_with_label(_("Create destructor"));
+	gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->create_destructor_box);
+	gtk_widget_show(cc_dlg->create_destructor_box);
+
+	if (type == GEANY_CLASS_TYPE_GTK)
+	{
+		hbox = gtk_hbox_new(FALSE, 10);
+		gtk_container_add(GTK_CONTAINER(vbox), hbox);
+		gtk_widget_show(hbox);
+		g_signal_connect(G_OBJECT(cc_dlg->create_constructor_box), "toggled",
+				G_CALLBACK(cc_dlg_on_set_sensitive_toggled), (gpointer)hbox);
+
+		label = gtk_label_new(_("GTK+ constructor type"));
+		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+		gtk_widget_show(label);
+
+		cc_dlg->gtk_constructor_type_entry = gtk_entry_new();
+		gtk_entry_set_text(GTK_ENTRY(cc_dlg->gtk_constructor_type_entry), "GObject");
+		gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->gtk_constructor_type_entry);
+		gtk_widget_show(cc_dlg->gtk_constructor_type_entry);
+	}
+
+	if (gtk_dialog_run(GTK_DIALOG(cc_dlg->dialog)) == GTK_RESPONSE_OK)
+		cc_dlg_on_create_class(cc_dlg);
+
+	gtk_widget_destroy(cc_dlg->dialog);
+//	g_object_unref(G_OBJECT(cc_dlg->dialog));
+}
+
+
+static void cc_dlg_on_set_sensitive_toggled(GtkWidget *toggle_button, GtkWidget *target_widget)
+{
+	g_return_if_fail(toggle_button != NULL);
+	g_return_if_fail(GTK_IS_TOGGLE_BUTTON(toggle_button));
+	g_return_if_fail(target_widget != NULL);
+	g_return_if_fail(GTK_IS_WIDGET(target_widget));
+
+	gtk_widget_set_sensitive(target_widget,
+			gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle_button)));
+}
+
+
+static void cc_dlg_on_class_name_entry_changed(GtkWidget *entry, CreateClassDialog *cc_dlg)
+{
+	gchar *class_name_down;
+	gchar *class_header;
+	gchar *class_source;
+
+	g_return_if_fail(entry != NULL);
+	g_return_if_fail(GTK_IS_ENTRY(entry));
+	g_return_if_fail(cc_dlg != NULL);
+
+	class_name_down = g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(entry)), -1);
+	class_header = g_strconcat(class_name_down, ".h", NULL);
+	if (cc_dlg->class_type == GEANY_CLASS_TYPE_CPP)
+		class_source = g_strconcat(class_name_down, ".cpp", NULL);
+	else
+		class_source = g_strconcat(class_name_down, ".c", NULL);
+
+	gtk_entry_set_text(GTK_ENTRY(cc_dlg->header_entry), class_header);
+	gtk_entry_set_text(GTK_ENTRY(cc_dlg->source_entry), class_source);
+
+	g_free(class_name_down);
+	g_free(class_header);
+	g_free(class_source);
+}
+
+
+static gchar* str_case_split(const gchar *str, gchar splitter)
+{
+	GString *result;
+
+	g_return_val_if_fail(str != NULL, NULL);
+	if (*str == '\0')
+		return g_strdup("");
+
+	result = g_string_new(NULL);
+	g_string_append_c(result, *str);
+	while (*(++str) != '\0')
+	{
+		if (g_ascii_isupper(*str) && g_ascii_islower(result->str[result->len - 1]))
+			g_string_append_c(result, splitter);
+		g_string_append_c(result, *str);
+	}
+	return g_string_free(result, FALSE);
+}
+
+
+static void cc_dlg_on_base_name_entry_changed(GtkWidget *entry, CreateClassDialog *cc_dlg)
+{
+	gchar *base_name_splitted;
+	gchar *base_header;
+	gchar *tmp;
+
+	g_return_if_fail(entry != NULL);
+	g_return_if_fail(GTK_IS_ENTRY(entry));
+	g_return_if_fail(cc_dlg != NULL);
+
+	base_name_splitted = str_case_split(gtk_entry_get_text(GTK_ENTRY(entry)), '_');
+	if (! g_ascii_strncasecmp(gtk_entry_get_text(GTK_ENTRY(entry)), "gtk", 3))
+		tmp = g_strconcat("gtk/", gtk_entry_get_text(GTK_ENTRY(entry)), ".h", NULL);
+	else if (utils->str_equal(gtk_entry_get_text(GTK_ENTRY(entry)), "GObject"))
+		tmp = g_strdup("glib-object.h");
+	else
+		tmp = g_strconcat(gtk_entry_get_text(GTK_ENTRY(entry)), ".h", NULL);
+	base_header = g_ascii_strdown(tmp, -1);
+	g_free(tmp);
+
+	gtk_entry_set_text(GTK_ENTRY(cc_dlg->base_header_entry), base_header);
+
+	if (cc_dlg->class_type == GEANY_CLASS_TYPE_GTK)
+	{
+		gchar *base_gtype;
+		if (! g_ascii_strncasecmp(gtk_entry_get_text(GTK_ENTRY(entry)), "gtk", 3))
+			tmp = g_strdup_printf("%.3s_TYPE%s",
+					base_name_splitted,
+					base_name_splitted + 3);
+		else if (utils->str_equal(gtk_entry_get_text(GTK_ENTRY(entry)), "GObject"))
+			tmp = g_strdup("G_TYPE_OBJECT");
+		else
+			tmp = g_strconcat(base_name_splitted, "_TYPE", NULL);
+		base_gtype = g_ascii_strup(tmp, -1);
+		gtk_entry_set_text(GTK_ENTRY(cc_dlg->base_gtype_entry), base_gtype);
+
+		g_free(base_gtype);
+		g_free(tmp);
+	}
+
+	g_free(base_name_splitted);
+	g_free(base_header);
+}
+
+
+static void cc_dlg_on_create_class(CreateClassDialog *cc_dlg)
+{
+	ClassInfo *class_info;
+	gint idx;
+	gchar *text;
+	gchar *tmp;
+
+	g_return_if_fail(cc_dlg != NULL);
+
+	if (utils->str_equal(gtk_entry_get_text(GTK_ENTRY(cc_dlg->class_name_entry)), ""))
+		return;
+
+	class_info = g_new0(ClassInfo, 1);
+	class_info->type = cc_dlg->class_type;
+	class_info->class_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(cc_dlg->class_name_entry)));
+	tmp = str_case_split(class_info->class_name, '_');
+	class_info->class_name_up = g_ascii_strup(tmp, -1);
+	class_info->class_name_low = g_ascii_strdown(class_info->class_name_up, -1);
+	if (! utils->str_equal(gtk_entry_get_text(GTK_ENTRY(cc_dlg->base_name_entry)), ""))
+	{
+		class_info->base_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(cc_dlg->base_name_entry)));
+		class_info->base_include = g_strdup_printf("\n#include %c%s%c\n",
+			gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->base_header_global_box)) ?
+				'<' : '\"',
+			gtk_entry_get_text(GTK_ENTRY(cc_dlg->base_header_entry)),
+			gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->base_header_global_box)) ?
+				'>' : '\"');
+	}
+	else
+	{
+		class_info->base_name = g_strdup("");
+		class_info->base_include = g_strdup("");
+	}
+	class_info->header = g_strdup(gtk_entry_get_text(GTK_ENTRY(cc_dlg->header_entry)));
+	class_info->header_guard = g_ascii_strup(class_info->header, -1);
+	g_strdelimit(class_info->header_guard, ".", '_');
+	switch (class_info->type)
+	{
+		case GEANY_CLASS_TYPE_CPP:
+		{
+			class_info->source = g_strdup(gtk_entry_get_text(GTK_ENTRY(cc_dlg->source_entry)));
+			if (! utils->str_equal(class_info->base_name, ""))
+				class_info->base_decl = g_strdup_printf(": public %s", class_info->base_name);
+			else
+				class_info->base_decl = g_strdup("");
+			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->create_constructor_box)))
+			{
+				gchar *base_constructor;
+
+				if (utils->str_equal(class_info->base_name, ""))
+					base_constructor = g_strdup("");
+				else
+					base_constructor = g_strdup_printf("\t: %s()\n", class_info->base_name);
+				class_info->constructor_decl = g_strdup_printf("%s();\n", class_info->class_name);
+				class_info->constructor_impl = g_strdup_printf("\n%s::%s()\n%s{\n\t\n}\n",
+					class_info->class_name, class_info->class_name, base_constructor);
+				g_free(base_constructor);
+			}
+			else
+			{
+				class_info->constructor_decl = g_strdup("");
+				class_info->constructor_impl = g_strdup("");
+			}
+			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->create_destructor_box)))
+			{
+				class_info->destructor_decl =
+						g_strdup_printf("virtual ~%s();\n", class_info->class_name);
+				class_info->destructor_impl = g_strdup_printf("\n%s::~%s()\n{\n\t\n}\n",
+					class_info->class_name, class_info->class_name);
+			}
+			else
+			{
+				class_info->destructor_decl = g_strdup("");
+				class_info->destructor_impl = g_strdup("");
+			}
+			break;
+		}
+		case GEANY_CLASS_TYPE_GTK:
+		{
+			class_info->base_gtype = g_strdup(gtk_entry_get_text(
+					GTK_ENTRY(cc_dlg->base_gtype_entry)));
+			class_info->source = g_strdup(gtk_entry_get_text(GTK_ENTRY(cc_dlg->source_entry)));
+			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->create_constructor_box)))
+			{
+				class_info->constructor_decl = g_strdup_printf("%s*\t%s_new\t\t\t(void);\n",
+						gtk_entry_get_text(GTK_ENTRY(cc_dlg->gtk_constructor_type_entry)),
+						class_info->class_name_low);
+				class_info->constructor_impl = g_strdup_printf("\n"
+						"%s* %s_new(void)\n"
+						"{\n"
+						"\treturn (%s*)g_object_new(%s_TYPE, NULL);\n"
+						"}\n",
+						gtk_entry_get_text(GTK_ENTRY(cc_dlg->gtk_constructor_type_entry)),
+						class_info->class_name_low,
+						gtk_entry_get_text(GTK_ENTRY(cc_dlg->gtk_constructor_type_entry)),
+						class_info->class_name_up);
+			}
+			else
+			{
+				class_info->constructor_decl = g_strdup("");
+				class_info->constructor_impl = g_strdup("");
+			}
+			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->create_destructor_box)))
+			{
+				class_info->gtk_destructor_registration =
+						g_strdup_printf("GObjectClass *g_object_class;\n\n"
+						"\tg_object_class = G_OBJECT_CLASS(klass);\n\n"
+						"\tg_object_class->finalize = %s_finalize;\n",
+						class_info->class_name_low);
+				class_info->destructor_decl =
+						g_strdup_printf("static void %s_finalize\t\t\t(GObject *object);\n",
+						class_info->class_name_low);
+				class_info->destructor_impl = g_strdup_printf("\n"
+						"void %s_finalize(GObject *object)\n"
+						"{\n"
+						"\t%s *self;\n\n"
+						"\tg_return_if_fail(object != NULL);\n"
+						"\tg_return_if_fail(IS_%s(object));\n\n"
+						"\tself = %s(object);\n\n"
+						"\tif (G_OBJECT_CLASS(parent_class)->finalize)\n"
+						"\t\t(* G_OBJECT_CLASS(parent_class)->finalize)(object);\n"
+						"}\n",
+						class_info->class_name_low,
+						class_info->class_name,
+						class_info->class_name_up,
+						class_info->class_name_up);
+			}
+			else
+			{
+				class_info->gtk_destructor_registration = g_strdup("");
+				class_info->destructor_decl = g_strdup("");
+				class_info->destructor_impl = g_strdup("");
+			}
+			break;
+		}
+	}
+
+	// only create the files if the filename is not empty
+	if (! utils->str_equal(class_info->source, ""))
+	{
+		text = get_template_class_source(class_info);
+		idx = documents->new_file(class_info->source, NULL);
+		scintilla->set_text(doc_list[idx].sci, text);
+		g_free(text);
+	}
+
+	if (! utils->str_equal(class_info->header, ""))
+	{
+		text = get_template_class_header(class_info);
+		idx = documents->new_file(class_info->header, NULL);
+		scintilla->set_text(doc_list[idx].sci, text);
+		g_free(text);
+	}
+
+	utils_free_pointers(tmp, class_info->class_name, class_info->class_name_up,
+		class_info->base_name, class_info->class_name_low, class_info->base_include,
+		class_info->header, class_info->header_guard, class_info->source, class_info->base_decl,
+		class_info->constructor_decl, class_info->constructor_impl,
+		class_info->gtk_destructor_registration, class_info->destructor_decl,
+		class_info->destructor_impl, class_info->base_gtype, class_info, NULL);
+}
+
+
+static void
+on_menu_create_cpp_class_activate      (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+	show_dialog_create_class(GEANY_CLASS_TYPE_CPP);
+}
+
+
+static void
+on_menu_create_gtk_class_activate      (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+	show_dialog_create_class(GEANY_CLASS_TYPE_GTK);
+}
+
+
+void init(PluginData *data)
+{
+	GtkWidget *menu_create_class1;
+	GtkWidget *image1861;
+	GtkWidget *menu_create_class1_menu;
+	GtkWidget *menu_create_cpp_class;
+	GtkWidget *menu_create_gtk_class;
+
+	plugin_data = data;
+
+	menu_create_class1 = gtk_image_menu_item_new_with_mnemonic (_("Create Cla_ss"));
+	gtk_container_add (GTK_CONTAINER (data->tools_menu), menu_create_class1);
+
+	image1861 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_create_class1), image1861);
+
+	menu_create_class1_menu = gtk_menu_new ();
+	gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_create_class1), menu_create_class1_menu);
+
+	menu_create_cpp_class = gtk_menu_item_new_with_mnemonic (_("C++ class"));
+	gtk_container_add (GTK_CONTAINER (menu_create_class1_menu), menu_create_cpp_class);
+
+	menu_create_gtk_class = gtk_menu_item_new_with_mnemonic (_("GTK+ class"));
+	gtk_container_add (GTK_CONTAINER (menu_create_class1_menu), menu_create_gtk_class);
+
+	g_signal_connect ((gpointer) menu_create_cpp_class, "activate",
+		G_CALLBACK (on_menu_create_cpp_class_activate),
+		NULL);
+	g_signal_connect ((gpointer) menu_create_gtk_class, "activate",
+		G_CALLBACK (on_menu_create_gtk_class_activate),
+		NULL);
+
+	gtk_widget_show_all(menu_create_class1);
+
+	local_data.menu_item = menu_create_class1;
+}
+
+
+void cleanup()
+{
+	gtk_widget_destroy(local_data.menu_item);
+}


Property changes on: trunk/plugins/classbuilder.c
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Modified: trunk/po/POTFILES.in
===================================================================
--- trunk/po/POTFILES.in	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/po/POTFILES.in	2007-07-04 11:32:33 UTC (rev 1659)
@@ -33,3 +33,4 @@
 src/utils.c
 src/vte.c
 src/win32.c
+plugins/classbuilder.c

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/src/callbacks.c	2007-07-04 11:32:33 UTC (rev 1659)
@@ -1587,9 +1587,15 @@
 {
 	gint idx = document_get_cur_idx();
 	gchar *text;
+	gchar *fname;
+	filetype *ft;
 
-	text = templates_get_template_fileheader(idx);
+	g_return_if_fail(DOC_IDX_VALID(idx));
 
+	ft = doc_list[idx].file_type;
+	fname = doc_list[idx].file_name;
+	text = templates_get_template_fileheader(FILETYPE_ID(ft), fname);
+
 	sci_insert_text(doc_list[idx].sci, 0, text);
 	sci_goto_pos(doc_list[idx].sci, 0, FALSE);
 	g_free(text);
@@ -2300,18 +2306,3 @@
 }
 
 
-void
-on_menu_create_cpp_class_activate      (GtkMenuItem     *menuitem,
-                                        gpointer         user_data)
-{
-	tools_show_dialog_create_class(GEANY_CLASS_TYPE_CPP);
-}
-
-
-void
-on_menu_create_gtk_class_activate      (GtkMenuItem     *menuitem,
-                                        gpointer         user_data)
-{
-	tools_show_dialog_create_class(GEANY_CLASS_TYPE_GTK);
-}
-

Modified: trunk/src/callbacks.h
===================================================================
--- trunk/src/callbacks.h	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/src/callbacks.h	2007-07-04 11:32:33 UTC (rev 1659)
@@ -617,10 +617,3 @@
                                         GdkEventMotion  *event,
                                         gpointer         user_data);
 
-void
-on_menu_create_cpp_class_activate      (GtkMenuItem     *menuitem,
-                                        gpointer         user_data);
-
-void
-on_menu_create_gtk_class_activate      (GtkMenuItem     *menuitem,
-                                        gpointer         user_data);

Modified: trunk/src/interface.c
===================================================================
--- trunk/src/interface.c	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/src/interface.c	2007-07-04 11:32:33 UTC (rev 1659)
@@ -37,7 +37,7 @@
   GtkWidget *file1_menu;
   GtkWidget *menu_new1;
   GtkWidget *menu_new_with_template1;
-  GtkWidget *image1776;
+  GtkWidget *image1877;
   GtkWidget *menu_new_with_template1_menu;
   GtkWidget *invisible2;
   GtkWidget *separator12;
@@ -48,11 +48,11 @@
   GtkWidget *menu_save1;
   GtkWidget *menu_save_as1;
   GtkWidget *menu_save_all1;
-  GtkWidget *image1777;
+  GtkWidget *image1878;
   GtkWidget *menu_reload1;
-  GtkWidget *image1778;
+  GtkWidget *image1879;
   GtkWidget *menu_reload_as1;
-  GtkWidget *image1779;
+  GtkWidget *image1880;
   GtkWidget *menu_reload_as1_menu;
   GtkWidget *invisible7;
   GtkWidget *separator21;
@@ -64,7 +64,7 @@
   GtkWidget *separator14;
   GtkWidget *menu_close1;
   GtkWidget *menu_close_all1;
-  GtkWidget *image1780;
+  GtkWidget *image1881;
   GtkWidget *menu_separatormenuitem1;
   GtkWidget *menu_quit1;
   GtkWidget *edit1;
@@ -90,20 +90,20 @@
   GtkWidget *menu_duplicate_line1;
   GtkWidget *separator29;
   GtkWidget *menu_increase_indent1;
-  GtkWidget *image1781;
+  GtkWidget *image1882;
   GtkWidget *menu_decrease_indent1;
-  GtkWidget *image1782;
+  GtkWidget *image1883;
   GtkWidget *separator37;
   GtkWidget *send_selection_to2;
   GtkWidget *send_selection_to2_menu;
   GtkWidget *invisible13;
   GtkWidget *separator18;
   GtkWidget *insert_include2;
-  GtkWidget *image1783;
+  GtkWidget *image1884;
   GtkWidget *insert_include2_menu;
   GtkWidget *invisible4;
   GtkWidget *add_comments1;
-  GtkWidget *image1784;
+  GtkWidget *image1885;
   GtkWidget *add_comments1_menu;
   GtkWidget *menu_add_changelog_entry1;
   GtkWidget *insert_file_header1;
@@ -112,7 +112,7 @@
   GtkWidget *insert_gpl_notice2;
   GtkWidget *insert_bsd_license_notice2;
   GtkWidget *insert_date1;
-  GtkWidget *image1785;
+  GtkWidget *image1886;
   GtkWidget *insert_date1_menu;
   GtkWidget *invisible8;
   GtkWidget *separator9;
@@ -124,7 +124,7 @@
   GtkWidget *find_previous1;
   GtkWidget *find_in_files1;
   GtkWidget *replace1;
-  GtkWidget *image1786;
+  GtkWidget *image1887;
   GtkWidget *separator33;
   GtkWidget *find_nextsel1;
   GtkWidget *find_prevsel1;
@@ -132,11 +132,11 @@
   GtkWidget *next_message1;
   GtkWidget *separator32;
   GtkWidget *go_to_line1;
-  GtkWidget *image1787;
+  GtkWidget *image1888;
   GtkWidget *menu_view1;
-  GtkWidget *menuitem3_menu;
+  GtkWidget *menu_view1_menu;
   GtkWidget *menu_change_font1;
-  GtkWidget *image1788;
+  GtkWidget *image1889;
   GtkWidget *menu_separator4;
   GtkWidget *menu_toggle_all_additional_widgets1;
   GtkWidget *menu_fullscreen1;
@@ -150,7 +150,7 @@
   GtkWidget *menu_zoom_out1;
   GtkWidget *normal_size1;
   GtkWidget *menu_document1;
-  GtkWidget *menu_item4_menu;
+  GtkWidget *menu_document1_menu;
   GtkWidget *menu_line_breaking1;
   GtkWidget *menu_use_auto_indentation1;
   GtkWidget *set_file_readonly1;
@@ -179,27 +179,22 @@
   GtkWidget *menu_project1;
   GtkWidget *menu_project1_menu;
   GtkWidget *project_new1;
-  GtkWidget *image1789;
+  GtkWidget *image1890;
   GtkWidget *project_open1;
-  GtkWidget *image1790;
+  GtkWidget *image1891;
   GtkWidget *project_close1;
-  GtkWidget *image1791;
+  GtkWidget *image1892;
   GtkWidget *separator34;
   GtkWidget *project_properties1;
   GtkWidget *menu_build1;
   GtkWidget *tools1;
   GtkWidget *tools1_menu;
   GtkWidget *menu_choose_color1;
-  GtkWidget *image1792;
+  GtkWidget *image1893;
   GtkWidget *menu_count_words1;
   GtkWidget *menu_insert_special_chars1;
-  GtkWidget *menu_create_class1;
-  GtkWidget *image1861;
-  GtkWidget *menu_create_class1_menu;
-  GtkWidget *menu_create_cpp_class;
-  GtkWidget *menu_create_gtk_class;
   GtkWidget *menu_help1;
-  GtkWidget *menu_item5_menu;
+  GtkWidget *menu_help1_menu;
   GtkWidget *help1;
   GtkWidget *keyboard_shortcuts1;
   GtkWidget *website1;
@@ -300,9 +295,9 @@
   gtk_widget_show (menu_new_with_template1);
   gtk_container_add (GTK_CONTAINER (file1_menu), menu_new_with_template1);
 
-  image1776 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1776);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_new_with_template1), image1776);
+  image1877 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1877);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_new_with_template1), image1877);
 
   menu_new_with_template1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_new_with_template1), menu_new_with_template1_menu);
@@ -345,25 +340,25 @@
   gtk_container_add (GTK_CONTAINER (file1_menu), menu_save_all1);
   gtk_tooltips_set_tip (tooltips, menu_save_all1, _("Saves all open files"), NULL);
 
-  image1777 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1777);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_save_all1), image1777);
+  image1878 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1878);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_save_all1), image1878);
 
   menu_reload1 = gtk_image_menu_item_new_with_mnemonic (_("_Reload"));
   gtk_widget_show (menu_reload1);
   gtk_container_add (GTK_CONTAINER (file1_menu), menu_reload1);
 
-  image1778 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1778);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload1), image1778);
+  image1879 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1879);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload1), image1879);
 
   menu_reload_as1 = gtk_image_menu_item_new_with_mnemonic (_("R_eload As"));
   gtk_widget_show (menu_reload_as1);
   gtk_container_add (GTK_CONTAINER (file1_menu), menu_reload_as1);
 
-  image1779 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1779);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload_as1), image1779);
+  image1880 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1880);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload_as1), image1880);
 
   menu_reload_as1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_reload_as1), menu_reload_as1_menu);
@@ -414,9 +409,9 @@
   gtk_container_add (GTK_CONTAINER (file1_menu), menu_close_all1);
   gtk_tooltips_set_tip (tooltips, menu_close_all1, _("Closes all open files"), NULL);
 
-  image1780 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1780);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_close_all1), image1780);
+  image1881 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1881);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_close_all1), image1881);
 
   menu_separatormenuitem1 = gtk_separator_menu_item_new ();
   gtk_widget_show (menu_separatormenuitem1);
@@ -524,17 +519,17 @@
   gtk_widget_show (menu_increase_indent1);
   gtk_container_add (GTK_CONTAINER (menu_format1_menu), menu_increase_indent1);
 
-  image1781 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1781);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent1), image1781);
+  image1882 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1882);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent1), image1882);
 
   menu_decrease_indent1 = gtk_image_menu_item_new_with_mnemonic (_("_Decrease Indent"));
   gtk_widget_show (menu_decrease_indent1);
   gtk_container_add (GTK_CONTAINER (menu_format1_menu), menu_decrease_indent1);
 
-  image1782 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1782);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent1), image1782);
+  image1883 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1883);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent1), image1883);
 
   separator37 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator37);
@@ -560,9 +555,9 @@
   gtk_widget_show (insert_include2);
   gtk_container_add (GTK_CONTAINER (edit1_menu), insert_include2);
 
-  image1783 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1783);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include2), image1783);
+  image1884 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1884);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include2), image1884);
 
   insert_include2_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_include2), insert_include2_menu);
@@ -574,9 +569,9 @@
   gtk_widget_show (add_comments1);
   gtk_container_add (GTK_CONTAINER (edit1_menu), add_comments1);
 
-  image1784 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1784);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_comments1), image1784);
+  image1885 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1885);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_comments1), image1885);
 
   add_comments1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (add_comments1), add_comments1_menu);
@@ -615,9 +610,9 @@
   gtk_widget_show (insert_date1);
   gtk_container_add (GTK_CONTAINER (edit1_menu), insert_date1);
 
-  image1785 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1785);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_date1), image1785);
+  image1886 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1886);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_date1), image1886);
 
   insert_date1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_date1), insert_date1_menu);
@@ -661,9 +656,9 @@
   gtk_widget_show (replace1);
   gtk_container_add (GTK_CONTAINER (search1_menu), replace1);
 
-  image1786 = gtk_image_new_from_stock ("gtk-find-and-replace", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1786);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (replace1), image1786);
+  image1887 = gtk_image_new_from_stock ("gtk-find-and-replace", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1887);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (replace1), image1887);
 
   separator33 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator33);
@@ -696,120 +691,120 @@
   gtk_widget_show (go_to_line1);
   gtk_container_add (GTK_CONTAINER (search1_menu), go_to_line1);
 
-  image1787 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1787);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line1), image1787);
+  image1888 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1888);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line1), image1888);
 
   menu_view1 = gtk_menu_item_new_with_mnemonic (_("_View"));
   gtk_widget_show (menu_view1);
   gtk_container_add (GTK_CONTAINER (menubar1), menu_view1);
 
-  menuitem3_menu = gtk_menu_new ();
-  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_view1), menuitem3_menu);
+  menu_view1_menu = gtk_menu_new ();
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_view1), menu_view1_menu);
 
   menu_change_font1 = gtk_image_menu_item_new_with_mnemonic (_("Change _Font"));
   gtk_widget_show (menu_change_font1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_change_font1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_change_font1);
   gtk_tooltips_set_tip (tooltips, menu_change_font1, _("Change the default font"), NULL);
 
-  image1788 = gtk_image_new_from_stock ("gtk-select-font", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1788);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_change_font1), image1788);
+  image1889 = gtk_image_new_from_stock ("gtk-select-font", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1889);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_change_font1), image1889);
 
   menu_separator4 = gtk_separator_menu_item_new ();
   gtk_widget_show (menu_separator4);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_separator4);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_separator4);
   gtk_widget_set_sensitive (menu_separator4, FALSE);
 
-  menu_toggle_all_additional_widgets1 = gtk_menu_item_new_with_mnemonic (_("Toggle all additional widgets"));
+  menu_toggle_all_additional_widgets1 = gtk_menu_item_new_with_mnemonic (_("Toggle All Additional Widgets"));
   gtk_widget_show (menu_toggle_all_additional_widgets1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_toggle_all_additional_widgets1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_toggle_all_additional_widgets1);
 
   menu_fullscreen1 = gtk_check_menu_item_new_with_mnemonic (_("Full_screen"));
   gtk_widget_show (menu_fullscreen1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_fullscreen1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_fullscreen1);
 
   menu_show_messages_window1 = gtk_check_menu_item_new_with_mnemonic (_("Show Message _Window"));
   gtk_widget_show (menu_show_messages_window1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_show_messages_window1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_show_messages_window1);
   gtk_tooltips_set_tip (tooltips, menu_show_messages_window1, _("Toggle the window with status and compiler messages on and off"), NULL);
   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_show_messages_window1), TRUE);
 
   menu_show_toolbar1 = gtk_check_menu_item_new_with_mnemonic (_("Show _Toolbar"));
   gtk_widget_show (menu_show_toolbar1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_show_toolbar1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_show_toolbar1);
   gtk_tooltips_set_tip (tooltips, menu_show_toolbar1, _("Toggle the toolbar on and off"), NULL);
   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_show_toolbar1), TRUE);
 
   menu_show_sidebar1 = gtk_check_menu_item_new_with_mnemonic (_("Show Side_bar"));
   gtk_widget_show (menu_show_sidebar1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_show_sidebar1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_show_sidebar1);
   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_show_sidebar1), TRUE);
 
   menu_markers_margin1 = gtk_check_menu_item_new_with_mnemonic (_("Show _Markers Margin"));
   gtk_widget_show (menu_markers_margin1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_markers_margin1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_markers_margin1);
   gtk_tooltips_set_tip (tooltips, menu_markers_margin1, _("Shows or hides the small margin right of the line numbers, which is used to mark lines."), NULL);
   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_markers_margin1), TRUE);
 
   menu_linenumber_margin1 = gtk_check_menu_item_new_with_mnemonic (_("Show _Line Numbers"));
   gtk_widget_show (menu_linenumber_margin1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_linenumber_margin1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_linenumber_margin1);
   gtk_tooltips_set_tip (tooltips, menu_linenumber_margin1, _("Shows or hides the Line Number margin."), NULL);
   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_linenumber_margin1), TRUE);
 
   menu_separator5 = gtk_separator_menu_item_new ();
   gtk_widget_show (menu_separator5);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_separator5);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_separator5);
   gtk_widget_set_sensitive (menu_separator5, FALSE);
 
   menu_zoom_in1 = gtk_image_menu_item_new_from_stock ("gtk-zoom-in", accel_group);
   gtk_widget_show (menu_zoom_in1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_zoom_in1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_zoom_in1);
 
   menu_zoom_out1 = gtk_image_menu_item_new_from_stock ("gtk-zoom-out", accel_group);
   gtk_widget_show (menu_zoom_out1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_zoom_out1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), menu_zoom_out1);
 
   normal_size1 = gtk_image_menu_item_new_from_stock ("gtk-zoom-100", accel_group);
   gtk_widget_show (normal_size1);
-  gtk_container_add (GTK_CONTAINER (menuitem3_menu), normal_size1);
+  gtk_container_add (GTK_CONTAINER (menu_view1_menu), normal_size1);
 
   menu_document1 = gtk_menu_item_new_with_mnemonic (_("_Document"));
   gtk_widget_show (menu_document1);
   gtk_container_add (GTK_CONTAINER (menubar1), menu_document1);
 
-  menu_item4_menu = gtk_menu_new ();
-  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_document1), menu_item4_menu);
+  menu_document1_menu = gtk_menu_new ();
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_document1), menu_document1_menu);
 
   menu_line_breaking1 = gtk_check_menu_item_new_with_mnemonic (_("_Line Wrapping"));
   gtk_widget_show (menu_line_breaking1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_line_breaking1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_line_breaking1);
   gtk_tooltips_set_tip (tooltips, menu_line_breaking1, _("Wrap the line at the window border and continue it on the next line. Note: line wrapping has a high performance cost for large documents so should be disabled on slow machines."), NULL);
   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_line_breaking1), TRUE);
 
   menu_use_auto_indentation1 = gtk_check_menu_item_new_with_mnemonic (_("_Use Auto-indentation"));
   gtk_widget_show (menu_use_auto_indentation1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_use_auto_indentation1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_use_auto_indentation1);
   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_use_auto_indentation1), TRUE);
 
   set_file_readonly1 = gtk_check_menu_item_new_with_mnemonic (_("Read _Only"));
   gtk_widget_show (set_file_readonly1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), set_file_readonly1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), set_file_readonly1);
   gtk_tooltips_set_tip (tooltips, set_file_readonly1, _("Treat this file as read-only. No changes can be made."), NULL);
 
   menu_write_unicode_bom1 = gtk_check_menu_item_new_with_mnemonic (_("_Write Unicode BOM"));
   gtk_widget_show (menu_write_unicode_bom1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_write_unicode_bom1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_write_unicode_bom1);
 
   separator10 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator10);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), separator10);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), separator10);
   gtk_widget_set_sensitive (separator10, FALSE);
 
   set_filetype1 = gtk_menu_item_new_with_mnemonic (_("Set File_type"));
   gtk_widget_show (set_filetype1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), set_filetype1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), set_filetype1);
 
   set_filetype1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (set_filetype1), set_filetype1_menu);
@@ -819,7 +814,7 @@
 
   set_encoding1 = gtk_menu_item_new_with_mnemonic (_("Set _Encoding"));
   gtk_widget_show (set_encoding1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), set_encoding1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), set_encoding1);
 
   set_encoding1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (set_encoding1), set_encoding1_menu);
@@ -829,7 +824,7 @@
 
   menu_line_endings1 = gtk_menu_item_new_with_mnemonic (_("Set Line E_ndings"));
   gtk_widget_show (menu_line_endings1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_line_endings1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_line_endings1);
 
   menu_line_endings1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_line_endings1), menu_line_endings1_menu);
@@ -854,41 +849,41 @@
 
   separator8 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator8);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), separator8);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), separator8);
   gtk_widget_set_sensitive (separator8, FALSE);
 
   menu_replace_tabs = gtk_menu_item_new_with_mnemonic (_("_Replace Tabs by Spaces"));
   gtk_widget_show (menu_replace_tabs);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_replace_tabs);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_replace_tabs);
   gtk_tooltips_set_tip (tooltips, menu_replace_tabs, _("Replaces all tabs in document by spaces."), NULL);
 
   separator22 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator22);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), separator22);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), separator22);
   gtk_widget_set_sensitive (separator22, FALSE);
 
   menu_fold_all1 = gtk_menu_item_new_with_mnemonic (_("_Fold All"));
   gtk_widget_show (menu_fold_all1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_fold_all1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_fold_all1);
   gtk_tooltips_set_tip (tooltips, menu_fold_all1, _("Folds all contractible code blocks"), NULL);
 
   menu_unfold_all1 = gtk_menu_item_new_with_mnemonic (_("_Unfold All"));
   gtk_widget_show (menu_unfold_all1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_unfold_all1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_unfold_all1);
   gtk_tooltips_set_tip (tooltips, menu_unfold_all1, _("Unfolds all contracted code blocks"), NULL);
 
   separator23 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator23);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), separator23);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), separator23);
   gtk_widget_set_sensitive (separator23, FALSE);
 
   remove_markers1 = gtk_menu_item_new_with_mnemonic (_("Remove _Markers"));
   gtk_widget_show (remove_markers1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), remove_markers1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), remove_markers1);
 
   menu_remove_indicators1 = gtk_menu_item_new_with_mnemonic (_("Remove Error _Indicators"));
   gtk_widget_show (menu_remove_indicators1);
-  gtk_container_add (GTK_CONTAINER (menu_item4_menu), menu_remove_indicators1);
+  gtk_container_add (GTK_CONTAINER (menu_document1_menu), menu_remove_indicators1);
   gtk_tooltips_set_tip (tooltips, menu_remove_indicators1, _("Removes all error indicators in the current document."), NULL);
 
   menu_project1 = gtk_menu_item_new_with_mnemonic (_("_Project"));
@@ -902,25 +897,25 @@
   gtk_widget_show (project_new1);
   gtk_container_add (GTK_CONTAINER (menu_project1_menu), project_new1);
 
-  image1789 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1789);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_new1), image1789);
+  image1890 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1890);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_new1), image1890);
 
   project_open1 = gtk_image_menu_item_new_with_mnemonic (_("_Open"));
   gtk_widget_show (project_open1);
   gtk_container_add (GTK_CONTAINER (menu_project1_menu), project_open1);
 
-  image1790 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1790);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_open1), image1790);
+  image1891 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1891);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_open1), image1891);
 
   project_close1 = gtk_image_menu_item_new_with_mnemonic (_("_Close"));
   gtk_widget_show (project_close1);
   gtk_container_add (GTK_CONTAINER (menu_project1_menu), project_close1);
 
-  image1791 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1791);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_close1), image1791);
+  image1892 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1892);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_close1), image1892);
 
   separator34 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator34);
@@ -947,9 +942,9 @@
   gtk_container_add (GTK_CONTAINER (tools1_menu), menu_choose_color1);
   gtk_tooltips_set_tip (tooltips, menu_choose_color1, _("Open a color chooser dialog, to interactively pick colors from a palette."), NULL);
 
-  image1792 = gtk_image_new_from_stock ("gtk-select-color", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1792);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_choose_color1), image1792);
+  image1893 = gtk_image_new_from_stock ("gtk-select-color", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1893);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_choose_color1), image1893);
 
   menu_count_words1 = gtk_menu_item_new_with_mnemonic (_("_Word Count"));
   gtk_widget_show (menu_count_words1);
@@ -960,53 +955,34 @@
   gtk_widget_show (menu_insert_special_chars1);
   gtk_container_add (GTK_CONTAINER (tools1_menu), menu_insert_special_chars1);
 
-  menu_create_class1 = gtk_image_menu_item_new_with_mnemonic (_("Create cla_ss"));
-  gtk_widget_show (menu_create_class1);
-  gtk_container_add (GTK_CONTAINER (tools1_menu), menu_create_class1);
-
-  image1861 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1861);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_create_class1), image1861);
-
-  menu_create_class1_menu = gtk_menu_new ();
-  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_create_class1), menu_create_class1_menu);
-
-  menu_create_cpp_class = gtk_menu_item_new_with_mnemonic (_("C++ class"));
-  gtk_widget_show (menu_create_cpp_class);
-  gtk_container_add (GTK_CONTAINER (menu_create_class1_menu), menu_create_cpp_class);
-
-  menu_create_gtk_class = gtk_menu_item_new_with_mnemonic (_("GTK+ class"));
-  gtk_widget_show (menu_create_gtk_class);
-  gtk_container_add (GTK_CONTAINER (menu_create_class1_menu), menu_create_gtk_class);
-
   menu_help1 = gtk_menu_item_new_with_mnemonic (_("_Help"));
   gtk_widget_show (menu_help1);
   gtk_container_add (GTK_CONTAINER (menubar1), menu_help1);
 
-  menu_item5_menu = gtk_menu_new ();
-  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_help1), menu_item5_menu);
+  menu_help1_menu = gtk_menu_new ();
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_help1), menu_help1_menu);
 
   help1 = gtk_image_menu_item_new_from_stock ("gtk-help", accel_group);
   gtk_widget_show (help1);
-  gtk_container_add (GTK_CONTAINER (menu_item5_menu), help1);
+  gtk_container_add (GTK_CONTAINER (menu_help1_menu), help1);
 
   keyboard_shortcuts1 = gtk_menu_item_new_with_mnemonic (_("_Keyboard Shortcuts"));
   gtk_widget_show (keyboard_shortcuts1);
-  gtk_container_add (GTK_CONTAINER (menu_item5_menu), keyboard_shortcuts1);
+  gtk_container_add (GTK_CONTAINER (menu_help1_menu), keyboard_shortcuts1);
   gtk_tooltips_set_tip (tooltips, keyboard_shortcuts1, _("Shows a list of all keyboard shortcuts for Geany."), NULL);
 
   website1 = gtk_menu_item_new_with_mnemonic (_("_Website"));
   gtk_widget_show (website1);
-  gtk_container_add (GTK_CONTAINER (menu_item5_menu), website1);
+  gtk_container_add (GTK_CONTAINER (menu_help1_menu), website1);
 
   separator16 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator16);
-  gtk_container_add (GTK_CONTAINER (menu_item5_menu), separator16);
+  gtk_container_add (GTK_CONTAINER (menu_help1_menu), separator16);
   gtk_widget_set_sensitive (separator16, FALSE);
 
   menu_info1 = gtk_image_menu_item_new_from_stock ("gtk-about", accel_group);
   gtk_widget_show (menu_info1);
-  gtk_container_add (GTK_CONTAINER (menu_item5_menu), menu_info1);
+  gtk_container_add (GTK_CONTAINER (menu_help1_menu), menu_info1);
 
   toolbar1 = gtk_toolbar_new ();
   gtk_widget_show (toolbar1);
@@ -1532,12 +1508,6 @@
   g_signal_connect ((gpointer) menu_insert_special_chars1, "activate",
                     G_CALLBACK (on_menu_insert_special_chars1_activate),
                     NULL);
-  g_signal_connect ((gpointer) menu_create_cpp_class, "activate",
-                    G_CALLBACK (on_menu_create_cpp_class_activate),
-                    NULL);
-  g_signal_connect ((gpointer) menu_create_gtk_class, "activate",
-                    G_CALLBACK (on_menu_create_gtk_class_activate),
-                    NULL);
   g_signal_connect ((gpointer) help1, "activate",
                     G_CALLBACK (on_help1_activate),
                     NULL);
@@ -1635,7 +1605,7 @@
   GLADE_HOOKUP_OBJECT (window1, file1_menu, "file1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_new1, "menu_new1");
   GLADE_HOOKUP_OBJECT (window1, menu_new_with_template1, "menu_new_with_template1");
-  GLADE_HOOKUP_OBJECT (window1, image1776, "image1776");
+  GLADE_HOOKUP_OBJECT (window1, image1877, "image1877");
   GLADE_HOOKUP_OBJECT (window1, menu_new_with_template1_menu, "menu_new_with_template1_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible2, "invisible2");
   GLADE_HOOKUP_OBJECT (window1, separator12, "separator12");
@@ -1646,11 +1616,11 @@
   GLADE_HOOKUP_OBJECT (window1, menu_save1, "menu_save1");
   GLADE_HOOKUP_OBJECT (window1, menu_save_as1, "menu_save_as1");
   GLADE_HOOKUP_OBJECT (window1, menu_save_all1, "menu_save_all1");
-  GLADE_HOOKUP_OBJECT (window1, image1777, "image1777");
+  GLADE_HOOKUP_OBJECT (window1, image1878, "image1878");
   GLADE_HOOKUP_OBJECT (window1, menu_reload1, "menu_reload1");
-  GLADE_HOOKUP_OBJECT (window1, image1778, "image1778");
+  GLADE_HOOKUP_OBJECT (window1, image1879, "image1879");
   GLADE_HOOKUP_OBJECT (window1, menu_reload_as1, "menu_reload_as1");
-  GLADE_HOOKUP_OBJECT (window1, image1779, "image1779");
+  GLADE_HOOKUP_OBJECT (window1, image1880, "image1880");
   GLADE_HOOKUP_OBJECT (window1, menu_reload_as1_menu, "menu_reload_as1_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible7, "invisible7");
   GLADE_HOOKUP_OBJECT (window1, separator21, "separator21");
@@ -1662,7 +1632,7 @@
   GLADE_HOOKUP_OBJECT (window1, separator14, "separator14");
   GLADE_HOOKUP_OBJECT (window1, menu_close1, "menu_close1");
   GLADE_HOOKUP_OBJECT (window1, menu_close_all1, "menu_close_all1");
-  GLADE_HOOKUP_OBJECT (window1, image1780, "image1780");
+  GLADE_HOOKUP_OBJECT (window1, image1881, "image1881");
   GLADE_HOOKUP_OBJECT (window1, menu_separatormenuitem1, "menu_separatormenuitem1");
   GLADE_HOOKUP_OBJECT (window1, menu_quit1, "menu_quit1");
   GLADE_HOOKUP_OBJECT (window1, edit1, "edit1");
@@ -1688,20 +1658,20 @@
   GLADE_HOOKUP_OBJECT (window1, menu_duplicate_line1, "menu_duplicate_line1");
   GLADE_HOOKUP_OBJECT (window1, separator29, "separator29");
   GLADE_HOOKUP_OBJECT (window1, menu_increase_indent1, "menu_increase_indent1");
-  GLADE_HOOKUP_OBJECT (window1, image1781, "image1781");
+  GLADE_HOOKUP_OBJECT (window1, image1882, "image1882");
   GLADE_HOOKUP_OBJECT (window1, menu_decrease_indent1, "menu_decrease_indent1");
-  GLADE_HOOKUP_OBJECT (window1, image1782, "image1782");
+  GLADE_HOOKUP_OBJECT (window1, image1883, "image1883");
   GLADE_HOOKUP_OBJECT (window1, separator37, "separator37");
   GLADE_HOOKUP_OBJECT (window1, send_selection_to2, "send_selection_to2");
   GLADE_HOOKUP_OBJECT (window1, send_selection_to2_menu, "send_selection_to2_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible13, "invisible13");
   GLADE_HOOKUP_OBJECT (window1, separator18, "separator18");
   GLADE_HOOKUP_OBJECT (window1, insert_include2, "insert_include2");
-  GLADE_HOOKUP_OBJECT (window1, image1783, "image1783");
+  GLADE_HOOKUP_OBJECT (window1, image1884, "image1884");
   GLADE_HOOKUP_OBJECT (window1, insert_include2_menu, "insert_include2_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible4, "invisible4");
   GLADE_HOOKUP_OBJECT (window1, add_comments1, "add_comments1");
-  GLADE_HOOKUP_OBJECT (window1, image1784, "image1784");
+  GLADE_HOOKUP_OBJECT (window1, image1885, "image1885");
   GLADE_HOOKUP_OBJECT (window1, add_comments1_menu, "add_comments1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_add_changelog_entry1, "menu_add_changelog_entry1");
   GLADE_HOOKUP_OBJECT (window1, insert_file_header1, "insert_file_header1");
@@ -1710,7 +1680,7 @@
   GLADE_HOOKUP_OBJECT (window1, insert_gpl_notice2, "insert_gpl_notice2");
   GLADE_HOOKUP_OBJECT (window1, insert_bsd_license_notice2, "insert_bsd_license_notice2");
   GLADE_HOOKUP_OBJECT (window1, insert_date1, "insert_date1");
-  GLADE_HOOKUP_OBJECT (window1, image1785, "image1785");
+  GLADE_HOOKUP_OBJECT (window1, image1886, "image1886");
   GLADE_HOOKUP_OBJECT (window1, insert_date1_menu, "insert_date1_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible8, "invisible8");
   GLADE_HOOKUP_OBJECT (window1, separator9, "separator9");
@@ -1722,7 +1692,7 @@
   GLADE_HOOKUP_OBJECT (window1, find_previous1, "find_previous1");
   GLADE_HOOKUP_OBJECT (window1, find_in_files1, "find_in_files1");
   GLADE_HOOKUP_OBJECT (window1, replace1, "replace1");
-  GLADE_HOOKUP_OBJECT (window1, image1786, "image1786");
+  GLADE_HOOKUP_OBJECT (window1, image1887, "image1887");
   GLADE_HOOKUP_OBJECT (window1, separator33, "separator33");
   GLADE_HOOKUP_OBJECT (window1, find_nextsel1, "find_nextsel1");
   GLADE_HOOKUP_OBJECT (window1, find_prevsel1, "find_prevsel1");
@@ -1730,11 +1700,11 @@
   GLADE_HOOKUP_OBJECT (window1, next_message1, "next_message1");
   GLADE_HOOKUP_OBJECT (window1, separator32, "separator32");
   GLADE_HOOKUP_OBJECT (window1, go_to_line1, "go_to_line1");
-  GLADE_HOOKUP_OBJECT (window1, image1787, "image1787");
+  GLADE_HOOKUP_OBJECT (window1, image1888, "image1888");
   GLADE_HOOKUP_OBJECT (window1, menu_view1, "menu_view1");
-  GLADE_HOOKUP_OBJECT (window1, menuitem3_menu, "menuitem3_menu");
+  GLADE_HOOKUP_OBJECT (window1, menu_view1_menu, "menu_view1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_change_font1, "menu_change_font1");
-  GLADE_HOOKUP_OBJECT (window1, image1788, "image1788");
+  GLADE_HOOKUP_OBJECT (window1, image1889, "image1889");
   GLADE_HOOKUP_OBJECT (window1, menu_separator4, "menu_separator4");
   GLADE_HOOKUP_OBJECT (window1, menu_toggle_all_additional_widgets1, "menu_toggle_all_additional_widgets1");
   GLADE_HOOKUP_OBJECT (window1, menu_fullscreen1, "menu_fullscreen1");
@@ -1748,7 +1718,7 @@
   GLADE_HOOKUP_OBJECT (window1, menu_zoom_out1, "menu_zoom_out1");
   GLADE_HOOKUP_OBJECT (window1, normal_size1, "normal_size1");
   GLADE_HOOKUP_OBJECT (window1, menu_document1, "menu_document1");
-  GLADE_HOOKUP_OBJECT (window1, menu_item4_menu, "menu_item4_menu");
+  GLADE_HOOKUP_OBJECT (window1, menu_document1_menu, "menu_document1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_line_breaking1, "menu_line_breaking1");
   GLADE_HOOKUP_OBJECT (window1, menu_use_auto_indentation1, "menu_use_auto_indentation1");
   GLADE_HOOKUP_OBJECT (window1, set_file_readonly1, "set_file_readonly1");
@@ -1776,27 +1746,22 @@
   GLADE_HOOKUP_OBJECT (window1, menu_project1, "menu_project1");
   GLADE_HOOKUP_OBJECT (window1, menu_project1_menu, "menu_project1_menu");
   GLADE_HOOKUP_OBJECT (window1, project_new1, "project_new1");
-  GLADE_HOOKUP_OBJECT (window1, image1789, "image1789");
+  GLADE_HOOKUP_OBJECT (window1, image1890, "image1890");
   GLADE_HOOKUP_OBJECT (window1, project_open1, "project_open1");
-  GLADE_HOOKUP_OBJECT (window1, image1790, "image1790");
+  GLADE_HOOKUP_OBJECT (window1, image1891, "image1891");
   GLADE_HOOKUP_OBJECT (window1, project_close1, "project_close1");
-  GLADE_HOOKUP_OBJECT (window1, image1791, "image1791");
+  GLADE_HOOKUP_OBJECT (window1, image1892, "image1892");
   GLADE_HOOKUP_OBJECT (window1, separator34, "separator34");
   GLADE_HOOKUP_OBJECT (window1, project_properties1, "project_properties1");
   GLADE_HOOKUP_OBJECT (window1, menu_build1, "menu_build1");
   GLADE_HOOKUP_OBJECT (window1, tools1, "tools1");
   GLADE_HOOKUP_OBJECT (window1, tools1_menu, "tools1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_choose_color1, "menu_choose_color1");
-  GLADE_HOOKUP_OBJECT (window1, image1792, "image1792");
+  GLADE_HOOKUP_OBJECT (window1, image1893, "image1893");
   GLADE_HOOKUP_OBJECT (window1, menu_count_words1, "menu_count_words1");
   GLADE_HOOKUP_OBJECT (window1, menu_insert_special_chars1, "menu_insert_special_chars1");
-  GLADE_HOOKUP_OBJECT (window1, menu_create_class1, "menu_create_class1");
-  GLADE_HOOKUP_OBJECT (window1, image1861, "image1861");
-  GLADE_HOOKUP_OBJECT (window1, menu_create_class1_menu, "menu_create_class1_menu");
-  GLADE_HOOKUP_OBJECT (window1, menu_create_cpp_class, "menu_create_cpp_class");
-  GLADE_HOOKUP_OBJECT (window1, menu_create_gtk_class, "menu_create_gtk_class");
   GLADE_HOOKUP_OBJECT (window1, menu_help1, "menu_help1");
-  GLADE_HOOKUP_OBJECT (window1, menu_item5_menu, "menu_item5_menu");
+  GLADE_HOOKUP_OBJECT (window1, menu_help1_menu, "menu_help1_menu");
   GLADE_HOOKUP_OBJECT (window1, help1, "help1");
   GLADE_HOOKUP_OBJECT (window1, keyboard_shortcuts1, "keyboard_shortcuts1");
   GLADE_HOOKUP_OBJECT (window1, website1, "website1");
@@ -1994,20 +1959,20 @@
   GtkWidget *menu_duplicate_line2;
   GtkWidget *separator31;
   GtkWidget *menu_increase_indent2;
-  GtkWidget *image1693;
+  GtkWidget *image1894;
   GtkWidget *menu_decrease_indent2;
-  GtkWidget *image1694;
+  GtkWidget *image1895;
   GtkWidget *separator38;
   GtkWidget *send_selection_to1;
   GtkWidget *send_selection_to1_menu;
   GtkWidget *invisible12;
   GtkWidget *separator17;
   GtkWidget *insert_include1;
-  GtkWidget *image1695;
+  GtkWidget *image1896;
   GtkWidget *insert_include1_menu;
   GtkWidget *invisible3;
   GtkWidget *comments;
-  GtkWidget *image1696;
+  GtkWidget *image1897;
   GtkWidget *comments_menu;
   GtkWidget *add_changelog_entry2;
   GtkWidget *insert_file_header2;
@@ -2016,18 +1981,18 @@
   GtkWidget *insert_gpl_notice1;
   GtkWidget *insert_bsd_license_notice1;
   GtkWidget *insert_date2;
-  GtkWidget *image1697;
+  GtkWidget *image1898;
   GtkWidget *insert_date2_menu;
   GtkWidget *invisible10;
   GtkWidget *separator7;
   GtkWidget *find_usage1;
-  GtkWidget *image1698;
+  GtkWidget *image1899;
   GtkWidget *goto_tag_definition1;
   GtkWidget *goto_tag_declaration1;
   GtkWidget *context_action1;
   GtkWidget *separator15;
   GtkWidget *go_to_line;
-  GtkWidget *image1699;
+  GtkWidget *image1900;
   GtkAccelGroup *accel_group;
   GtkTooltips *tooltips;
 
@@ -2134,17 +2099,17 @@
   gtk_widget_show (menu_increase_indent2);
   gtk_container_add (GTK_CONTAINER (menu_format2_menu), menu_increase_indent2);
 
-  image1693 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1693);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent2), image1693);
+  image1894 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1894);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent2), image1894);
 
   menu_decrease_indent2 = gtk_image_menu_item_new_with_mnemonic (_("_Decrease Indent"));
   gtk_widget_show (menu_decrease_indent2);
   gtk_container_add (GTK_CONTAINER (menu_format2_menu), menu_decrease_indent2);
 
-  image1694 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1694);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent2), image1694);
+  image1895 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1895);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent2), image1895);
 
   separator38 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator38);
@@ -2170,9 +2135,9 @@
   gtk_widget_show (insert_include1);
   gtk_container_add (GTK_CONTAINER (edit_menu1), insert_include1);
 
-  image1695 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1695);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include1), image1695);
+  image1896 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1896);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include1), image1896);
 
   insert_include1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_include1), insert_include1_menu);
@@ -2184,9 +2149,9 @@
   gtk_widget_show (comments);
   gtk_container_add (GTK_CONTAINER (edit_menu1), comments);
 
-  image1696 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1696);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (comments), image1696);
+  image1897 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1897);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (comments), image1897);
 
   comments_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (comments), comments_menu);
@@ -2216,7 +2181,7 @@
   gtk_container_add (GTK_CONTAINER (comments_menu), insert_gpl_notice1);
   gtk_tooltips_set_tip (tooltips, insert_gpl_notice1, _("Inserts a GPL notice (should be done at the beginning of the file)"), NULL);
 
-  insert_bsd_license_notice1 = gtk_menu_item_new_with_mnemonic (_("Insert BSD license Notice"));
+  insert_bsd_license_notice1 = gtk_menu_item_new_with_mnemonic (_("Insert BSD License Notice"));
   gtk_widget_show (insert_bsd_license_notice1);
   gtk_container_add (GTK_CONTAINER (comments_menu), insert_bsd_license_notice1);
   gtk_tooltips_set_tip (tooltips, insert_bsd_license_notice1, _("Inserts a BSD licence notice (should be done at the beginning of the file)"), NULL);
@@ -2225,9 +2190,9 @@
   gtk_widget_show (insert_date2);
   gtk_container_add (GTK_CONTAINER (edit_menu1), insert_date2);
 
-  image1697 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1697);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_date2), image1697);
+  image1898 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1898);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_date2), image1898);
 
   insert_date2_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_date2), insert_date2_menu);
@@ -2244,9 +2209,9 @@
   gtk_widget_show (find_usage1);
   gtk_container_add (GTK_CONTAINER (edit_menu1), find_usage1);
 
-  image1698 = gtk_image_new_from_stock ("gtk-find", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1698);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (find_usage1), image1698);
+  image1899 = gtk_image_new_from_stock ("gtk-find", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1899);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (find_usage1), image1899);
 
   goto_tag_definition1 = gtk_menu_item_new_with_mnemonic (_("Go to Tag Definition"));
   gtk_widget_show (goto_tag_definition1);
@@ -2270,9 +2235,9 @@
   gtk_container_add (GTK_CONTAINER (edit_menu1), go_to_line);
   gtk_tooltips_set_tip (tooltips, go_to_line, _("Goto to the entered line"), NULL);
 
-  image1699 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1699);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line), image1699);
+  image1900 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1900);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line), image1900);
 
   g_signal_connect ((gpointer) undo1, "activate",
                     G_CALLBACK (on_undo1_activate),
@@ -2381,20 +2346,20 @@
   GLADE_HOOKUP_OBJECT (edit_menu1, menu_duplicate_line2, "menu_duplicate_line2");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator31, "separator31");
   GLADE_HOOKUP_OBJECT (edit_menu1, menu_increase_indent2, "menu_increase_indent2");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1693, "image1693");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1894, "image1894");
   GLADE_HOOKUP_OBJECT (edit_menu1, menu_decrease_indent2, "menu_decrease_indent2");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1694, "image1694");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1895, "image1895");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator38, "separator38");
   GLADE_HOOKUP_OBJECT (edit_menu1, send_selection_to1, "send_selection_to1");
   GLADE_HOOKUP_OBJECT (edit_menu1, send_selection_to1_menu, "send_selection_to1_menu");
   GLADE_HOOKUP_OBJECT (edit_menu1, invisible12, "invisible12");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator17, "separator17");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_include1, "insert_include1");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1695, "image1695");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1896, "image1896");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_include1_menu, "insert_include1_menu");
   GLADE_HOOKUP_OBJECT (edit_menu1, invisible3, "invisible3");
   GLADE_HOOKUP_OBJECT (edit_menu1, comments, "comments");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1696, "image1696");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1897, "image1897");
   GLADE_HOOKUP_OBJECT (edit_menu1, comments_menu, "comments_menu");
   GLADE_HOOKUP_OBJECT (edit_menu1, add_changelog_entry2, "add_changelog_entry2");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_file_header2, "insert_file_header2");
@@ -2403,18 +2368,18 @@
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_gpl_notice1, "insert_gpl_notice1");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_bsd_license_notice1, "insert_bsd_license_notice1");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_date2, "insert_date2");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1697, "image1697");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1898, "image1898");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_date2_menu, "insert_date2_menu");
   GLADE_HOOKUP_OBJECT (edit_menu1, invisible10, "invisible10");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator7, "separator7");
   GLADE_HOOKUP_OBJECT (edit_menu1, find_usage1, "find_usage1");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1698, "image1698");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1899, "image1899");
   GLADE_HOOKUP_OBJECT (edit_menu1, goto_tag_definition1, "goto_tag_definition1");
   GLADE_HOOKUP_OBJECT (edit_menu1, goto_tag_declaration1, "goto_tag_declaration1");
   GLADE_HOOKUP_OBJECT (edit_menu1, context_action1, "context_action1");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator15, "separator15");
   GLADE_HOOKUP_OBJECT (edit_menu1, go_to_line, "go_to_line");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1699, "image1699");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1900, "image1900");
   GLADE_HOOKUP_OBJECT_NO_REF (edit_menu1, tooltips, "tooltips");
 
   gtk_menu_set_accel_group (GTK_MENU (edit_menu1), accel_group);

Modified: trunk/src/plugindata.h
===================================================================
--- trunk/src/plugindata.h	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/src/plugindata.h	2007-07-04 11:32:33 UTC (rev 1659)
@@ -27,7 +27,7 @@
 
 /* The API version should be incremented whenever any plugin data types below are
  * modified. */
-static const gint api_version = 2;
+static const gint api_version = 3;
 
 /* The ABI version should be incremented whenever existing fields in the plugin
  * data types below have to be changed or reordered. It should stay the same if fields
@@ -68,6 +68,11 @@
 	}
 
 
+typedef struct DocumentFuncs	DocumentFuncs;
+typedef struct ScintillaFuncs	ScintillaFuncs;
+typedef struct TemplateFuncs	TemplateFuncs;
+typedef struct UtilsFuncs		UtilsFuncs;
+
 /* These are fields and functions owned by Geany.
  * Fields will be appended when needed by plugin authors.
  * Note: Remember to increment api_version (and abi_version if necessary) when
@@ -76,10 +81,41 @@
 {
 	MyApp	*app;	// Geany application data fields
 
-	/*  Almost all plugins should add menu items to the Tools menu only */
-	GtkWidget	*tools_menu;
+	GtkWidget	*tools_menu;	// Almost all plugins should add menu items to the Tools menu only
+
+	GArray		*doc_array;	// array of document pointers
+
+	DocumentFuncs	*document;
+	ScintillaFuncs	*sci;
+	TemplateFuncs	*templates;
+	UtilsFuncs		*utils;
 }
 PluginData;
 
 
+struct filetype;
+
+struct DocumentFuncs
+{
+	gint (*new_file) (const gchar *filename, struct filetype *ft);
+};
+
+struct _ScintillaObject;
+
+struct ScintillaFuncs
+{
+	void (*set_text) (struct _ScintillaObject *sci, const gchar *text);
+};
+
+struct TemplateFuncs
+{
+	gchar* (*get_template_fileheader) (gint filetype_idx, const gchar *fname);
+};
+
+struct UtilsFuncs
+{
+	gboolean (*str_equal) (const gchar *a, const gchar *b);
+	gchar* (*str_replace) (gchar *haystack, const gchar *needle, const gchar *replacement);
+};
+
 #endif

Modified: trunk/src/plugins.c
===================================================================
--- trunk/src/plugins.c	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/src/plugins.c	2007-07-04 11:32:33 UTC (rev 1659)
@@ -32,11 +32,12 @@
 #include "plugindata.h"
 #include "support.h"
 #include "utils.h"
+#include "document.h"
+#include "templates.h"
+#include "sciwrappers.h"
 
 
-typedef struct Plugin Plugin;
-
-struct Plugin
+typedef struct Plugin
 {
 	GModule *module;
 	gchar	*filename;		// plugin filename (/path/libname.so)
@@ -45,11 +46,46 @@
 	PluginInfo* (*info) ();	/* Returns plugin name, description */
 	void (*init) (PluginData *data);	/* Called when the plugin is enabled */
 	void (*cleanup) ();		/* Called when the plugin is disabled or when Geany exits */
-};
+}
+Plugin;
 
 
+static DocumentFuncs	doc_funcs;
+static ScintillaFuncs	sci_funcs;
+static TemplateFuncs	template_funcs;
+static UtilsFuncs		utils_funcs;
+
 static GList *plugin_list = NULL;
 
+
+static void
+init_function_pointers()
+{
+	doc_funcs.new_file = &document_new_file;
+
+	template_funcs.get_template_fileheader = &templates_get_template_fileheader;
+
+	sci_funcs.set_text = &sci_set_text;
+
+	utils_funcs.str_equal = &utils_str_equal;
+	utils_funcs.str_replace = &utils_str_replace;
+}
+
+
+static void
+init_plugin_data(PluginData *data)
+{
+	data->app = app;
+	data->tools_menu = lookup_widget(app->window, "tools1_menu");
+	data->doc_array = doc_array;
+
+	data->document = &doc_funcs;
+	data->sci = &sci_funcs;
+	data->templates = &template_funcs;
+	data->utils = &utils_funcs;
+}
+
+
 /* Prevent the same plugin filename being loaded more than once.
  * Note: g_module_name always returns the .so name, even when Plugin::filename
  * is an .la file. */
@@ -108,7 +144,10 @@
 	g_return_val_if_fail(fname, NULL);
 	g_return_val_if_fail(g_module_supported(), NULL);
 
-	module = g_module_open(fname, G_MODULE_BIND_LAZY);
+	/* Don't use G_MODULE_BIND_LAZY otherwise we can get unresolved symbols at runtime,
+	 * causing a segfault.
+	 * Without that flag the module will safely fail to load. */
+	module = g_module_open(fname, 0);
 	if (! module)
 	{
 		g_warning("%s", g_module_error());
@@ -148,8 +187,7 @@
 	plugin->filename = g_strdup(fname);
 	plugin->module = module;
 
-	plugin->data.app = app;
-	plugin->data.tools_menu = lookup_widget(app->window, "tools1_menu");
+	init_plugin_data(&plugin->data);
 
 	g_module_symbol(module, "init", (void *) &plugin->init);
 	g_module_symbol(module, "cleanup", (void *) &plugin->cleanup);
@@ -192,6 +230,8 @@
 	const gchar *path = LIBDIR;
 	GSList *list, *item;
 
+	init_function_pointers();
+
 	list = utils_get_file_list(path, NULL, NULL);
 
 	for (item = list; item != NULL; item = g_slist_next(item))

Modified: trunk/src/templates.c
===================================================================
--- trunk/src/templates.c	2007-07-04 11:14:05 UTC (rev 1658)
+++ trunk/src/templates.c	2007-07-04 11:32:33 UTC (rev 1659)
@@ -206,128 +206,6 @@
 x = StdClass.new\n\
 ";
 
-static const gchar templates_cpp_class_header[] = "{fileheader}\n\n\
-#ifndef {header_guard}\n\
-#define {header_guard}\n\
-{base_include}\n\
-class {class_name}{base_decl}\n\
-{\n\
-	public:\n\
-		{constructor_decl}\
-		{destructor_decl}\
-	\n\
-	private:\n\
-		// add your private declarations\n\
-};\n\
-\n\
-#endif // {header_guard}\n\
-";
-
-static const gchar templates_cpp_class_source[] = "{fileheader}\n\n\
-#include \"{header}\"\n\
-\n\
-{constructor_impl}\n\
-{destructor_impl}\n\
-";
-
-static const gchar templates_gtk_class_header[] = "{fileheader}\n\n\
-#ifndef __{header_guard}__\n\
-#define __{header_guard}__\n\
-{base_include}\n\
-G_BEGIN_DECLS\n\
-\n\
-#define {class_name_up}_TYPE				({class_name_low}_get_type())\n\
-#define {class_name_up}(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj),\\\n\
-		{class_name_up}_TYPE, {class_name}))\n\
-#define {class_name_up}_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass),\\\n\
-		{class_name_up}_TYPE, {class_name}Class))\n\
-#define IS_{class_name_up}(obj)				(G_TYPE_CHECK_INSTANCE_TYPE((obj),\\\n\
-		{class_name_up}_TYPE))\n\
-#define IS_{class_name_up}_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE((klass),\\\n\
-		{class_name_up}_TYPE))\n\
-\n\
-typedef struct _{class_name}				{class_name};\n\
-typedef struct _{class_name}Class			{class_name}Class;\n\
-\n\
-struct _{class_name}\n\
-{\n\
-	{base_name} parent;\n\
-	/* add your public declarations here */\n\
-};\n\
-\n\
-struct _{class_name}Class\n\
-{\n\
-	{base_name}Class parent_class;\n\
-};\n\
-\n\
-GType		{class_name_low}_get_type	(void);\n\
-{constructor_decl}\
-\n\
-G_END_DECLS\n\
-\n\
-#endif /* __{header_guard}__ */\n\
-";
-
-static const gchar templates_gtk_class_source[] = "{fileheader}\n\
-#include \"{header}\"\n\
-\n\
-typedef struct _{class_name}Private				{class_name}Private;\n\
-\n\
-#define {class_name_up}_GET_PRIVATE(obj)		(G_TYPE_INSTANCE_GET_PRIVATE((obj),\\\n\
-		{class_name_up}_TYPE, {class_name}Private))\n\
-\n\
-struct _{class_name}Private\n\
-{\n\
-	/* add your private declarations here */\n\
-};\n\
-\n\
-static void {class_name_low}_class_init			({class_name}Class *klass);\n\
-static void {class_name_low}_init				({class_name} *self);\n\
-{destructor_decl}\
-\n\
-/* Local data */\n\
-static {base_name}Class *parent_class = NULL;\n\
-\n\
-GType {class_name_low}_get_type(void)\n\
-{\n\
-	static GType self_type = 0;\n\
-	if (! self_type)\n\
-	{\n\
-		static const GTypeInfo self_info = \n\
-		{\n\
-			sizeof({class_name}Class),\n\
-			NULL, /* base_init */\n\
-			NULL, /* base_finalize */\n\
-			(GClassInitFunc){class_name_low}_class_init,\n\
-			NULL, /* class_finalize */\n\
-			NULL, /* class_data */\n\
-			sizeof({class_name}),\n\
-			0,\n\
-			(GInstanceInitFunc){class_name_low}_init,\n\
-		};\n\
-		\n\
-		self_type = g_type_register_static({base_gtype}, \"{class_name}\", &self_info, 0);\
-	}\n\
-	\n\

@@ Diff output truncated at 100000 characters. @@

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list