SF.net SVN: geany: [1616] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Thu Jun 14 13:10:51 UTC 2007
Revision: 1616
http://svn.sourceforge.net/geany/?rev=1616&view=rev
Author: ntrel
Date: 2007-06-14 06:10:51 -0700 (Thu, 14 Jun 2007)
Log Message:
-----------
Apply class builder patch from Alexander Rodin (thanks).
Modified Paths:
--------------
trunk/ChangeLog
trunk/THANKS
trunk/geany.glade
trunk/src/callbacks.c
trunk/src/callbacks.h
trunk/src/interface.c
trunk/src/templates.c
trunk/src/templates.h
trunk/src/tools.c
trunk/src/tools.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/ChangeLog 2007-06-14 13:10:51 UTC (rev 1616)
@@ -1,3 +1,10 @@
+2007-06-14 Nick Treleaven <nick.treleaven at btinternet.com>
+
+ * src/templates.c, src/interface.c, src/templates.h, src/tools.c,
+ src/tools.h, src/callbacks.c, src/callbacks.h, geany.glade, THANKS:
+ Apply class builder patch from Alexander Rodin (thanks).
+
+
2007-06-13 Nick Treleaven <nick.treleaven at btinternet.com>
* src/build.c, src/utils.c:
Modified: trunk/THANKS
===================================================================
--- trunk/THANKS 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/THANKS 2007-06-14 13:10:51 UTC (rev 1616)
@@ -20,7 +20,7 @@
Stefan Oltmanns <stefan(dot)oltmanns(at)abi2006(dot)gymnasium-achim(dot)de> - escape sequences patch
Bob Doan <bdoan(at)sicom(dot)com> - some patches
Rob van der Linde <robvdl(at)paradise(dot)net(dot)nz> - fixed wrong vte height on some systems
-Josef Whiter <josef(at)toxicpanda(dot)com> - parse 'Entering directory' build messages.
+Josef Whiter <josef(at)toxicpanda(dot)com> - parse 'Entering directory' build messages
Jeff Pohlmeyer <yetanothergeek(at)gmail(dot)com> - "Allow DnD", "Use tabs" and other great patches
Tomás Vírseda <kaskaras(at)gmail(dot)com> - sort open files patch
Dirk Weber <dietrich-weber(at)web(dot)de>
@@ -31,6 +31,7 @@
Peter Strand <peter(at)zarquon(dot)se> - Haskell CTags patch
Dave Moore <wrex006(at)gmail(dot)com> - code navigation patch
François Cami <francois.cami(at)free(dot)fr>, Guillaume Duviol - tab replacement patch
+Alexander Rodin <rodin(dot)alexander(at)gmail(dot)com> - class builder patch
Translators:
----------------------------------
Modified: trunk/geany.glade
===================================================================
--- trunk/geany.glade 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/geany.glade 2007-06-14 13:10:51 UTC (rev 1616)
@@ -1376,6 +1376,49 @@
<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>
Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/src/callbacks.c 2007-06-14 13:10:51 UTC (rev 1616)
@@ -2294,3 +2294,19 @@
return FALSE;
}
+
+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-06-14 08:15:49 UTC (rev 1615)
+++ trunk/src/callbacks.h 2007-06-14 13:10:51 UTC (rev 1616)
@@ -616,3 +616,11 @@
on_motion_event (GtkWidget *widget,
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-06-14 08:15:49 UTC (rev 1615)
+++ trunk/src/interface.c 2007-06-14 13:10:51 UTC (rev 1616)
@@ -193,6 +193,11 @@
GtkWidget *image1792;
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 *help1;
@@ -955,6 +960,25 @@
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);
@@ -1508,6 +1532,12 @@
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);
@@ -1760,6 +1790,11 @@
GLADE_HOOKUP_OBJECT (window1, image1792, "image1792");
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, help1, "help1");
Modified: trunk/src/templates.c
===================================================================
--- trunk/src/templates.c 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/src/templates.c 2007-06-14 13:10:51 UTC (rev 1616)
@@ -206,7 +206,128 @@
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\
+ 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 = gtk_type_class({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 gchar *templates[GEANY_MAX_TEMPLATES];
static gchar *ft_templates[GEANY_MAX_FILE_TYPES] = {NULL};
@@ -638,3 +759,103 @@
return text;
}
+
+gchar* templates_get_template_class_header(ClassInfo *class_info)
+{
+ switch (class_info->type)
+ {
+ case GEANY_CLASS_TYPE_CPP:
+ {
+ gchar *fileheader = NULL;
+ gchar *template;
+
+ fileheader = get_file_header(filetypes[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 = get_file_header(filetypes[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;
+}
+
+gchar* templates_get_template_class_source(ClassInfo *class_info)
+{
+ switch (class_info->type)
+ {
+ case GEANY_CLASS_TYPE_CPP:
+ {
+ gchar *fileheader = NULL;
+ gchar *template;
+
+ fileheader = get_file_header(filetypes[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 = get_file_header(filetypes[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;
+}
+
Modified: trunk/src/templates.h
===================================================================
--- trunk/src/templates.h 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/src/templates.h 2007-06-14 13:10:51 UTC (rev 1616)
@@ -26,6 +26,8 @@
#include "filetypes.h"
+typedef struct _ClassInfo ClassInfo;
+
void templates_init(void);
gchar *templates_get_template_fileheader(gint idx);
@@ -40,9 +42,12 @@
gchar *templates_get_template_licence(gint filetype_idx, gint licence_type);
+gchar *templates_get_template_class_header(ClassInfo *class_info);
+
+gchar *templates_get_template_class_source(ClassInfo *class_info);
+
void templates_free_templates(void);
-
enum
{
GEANY_TEMPLATE_GPL = 0,
@@ -53,5 +58,30 @@
GEANY_MAX_TEMPLATES
};
+enum
+{
+ GEANY_CLASS_TYPE_CPP,
+ GEANY_CLASS_TYPE_GTK
+};
+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;
+};
+
#endif
Modified: trunk/src/tools.c
===================================================================
--- trunk/src/tools.c 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/src/tools.c 2007-06-14 13:10:51 UTC (rev 1616)
@@ -46,6 +46,7 @@
#include "ui_utils.h"
#include "msgwindow.h"
#include "keybindings.h"
+#include "templates.h"
enum
@@ -55,6 +56,23 @@
N_COLUMNS
};
+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 GtkWidget *sc_dialog = NULL;
static GtkTreeStore *sc_store = NULL;
static GtkTreeView *sc_tree = NULL;
@@ -66,8 +84,11 @@
static void sc_fill_store(GtkTreeStore *store);
static gboolean sc_insert(GtkTreeModel *model, GtkTreeIter *iter);
+static void on_set_sensetive_toggled(GtkWidget *toggle_button, GtkWidget *target_widget);
+static void on_class_name_entry_changed(GtkWidget *entry, CreateClassDialog *cc_dlg);
+static void on_base_name_entry_changed(GtkWidget *entry, CreateClassDialog *cc_dlg);
+static void on_create_class(CreateClassDialog *cc_dlg);
-
void tools_show_dialog_insert_special_chars()
{
if (sc_dialog == NULL)
@@ -900,4 +921,403 @@
}
+void tools_show_dialog_create_class(gint type)
+{
+ CreateClassDialog *cc_dlg;
+ GtkWidget *main_box;
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *label;
+ GtkWidget *action_area;
+ GtkWidget *cancel_button;
+ GtkWidget *ok_button;
+ cc_dlg = g_malloc(sizeof(CreateClassDialog));
+ cc_dlg->class_type = type;
+
+ cc_dlg->dialog = gtk_dialog_new();
+ gtk_window_set_title(GTK_WINDOW(cc_dlg->dialog), _("Create class"));
+ 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(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), "GtkObject");
+ 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(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), "gtk/gtkobject.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(on_set_sensetive_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), "GtkObject");
+ gtk_container_add(GTK_CONTAINER(hbox), cc_dlg->gtk_constructor_type_entry);
+ gtk_widget_show(cc_dlg->gtk_constructor_type_entry);
+ }
+
+ action_area = GTK_DIALOG(cc_dlg->dialog)->action_area;
+
+ cancel_button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+ gtk_container_add(GTK_CONTAINER(action_area), cancel_button);
+ gtk_widget_show(cancel_button);
+
+ g_signal_connect_swapped(G_OBJECT(cancel_button), "clicked",
+ G_CALLBACK(gtk_object_destroy), (gpointer)cc_dlg->dialog);
+
+ ok_button = gtk_button_new_from_stock(GTK_STOCK_OK);
+ gtk_container_add(GTK_CONTAINER(action_area), ok_button);
+ gtk_widget_show(ok_button);
+ g_signal_connect_swapped(G_OBJECT(ok_button), "clicked",
+ G_CALLBACK(on_create_class), (gpointer)cc_dlg);
+
+ gtk_widget_show(cc_dlg->dialog);
+}
+
+static void on_set_sensetive_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 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, char 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 on_base_name_entry_changed(GtkWidget *entry, CreateClassDialog *cc_dlg)
+{
+ gchar *base_name_splitted;
+ gchar *base_header;
+ gchar *base_gtype = NULL;
+
+ 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)), '_');
+ base_header = g_strdup_printf("%s%s.h",
+ g_ascii_strncasecmp(gtk_entry_get_text(GTK_ENTRY(entry)), "gtk", 3) ? "": "gtk/",
+ gtk_entry_get_text(GTK_ENTRY(entry)));
+ g_strdown(base_header);
+
+ gtk_entry_set_text(GTK_ENTRY(cc_dlg->base_header_entry), base_header);
+
+ if (cc_dlg->class_type == GEANY_CLASS_TYPE_GTK)
+ {
+ if (! g_ascii_strncasecmp(gtk_entry_get_text(GTK_ENTRY(entry)), "gtk", 3))
+ {
+ base_gtype = g_strdup_printf("%.3s_TYPE%s",
+ base_name_splitted,
+ base_name_splitted + 3);
+ }
+ else
+ base_gtype = g_strconcat(base_name_splitted, "_TYPE", NULL);
+ g_strup(base_gtype);
+ gtk_entry_set_text(GTK_ENTRY(cc_dlg->base_gtype_entry), base_gtype);
+ }
+
+ g_free(base_name_splitted);
+ g_free(base_header);
+ g_free(base_gtype);
+}
+
+static void on_create_class(CreateClassDialog *cc_dlg)
+{
+ ClassInfo *class_info;
+ gint idx;
+ gchar *text;
+
+ g_return_if_fail(cc_dlg != NULL);
+
+ class_info = g_malloc0(sizeof(ClassInfo));
+ class_info->type = cc_dlg->class_type;
+ class_info->class_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(cc_dlg->class_name_entry)));
+ class_info->class_name_up = str_case_split(class_info->class_name, '_');
+ g_strup(class_info->class_name_up);
+ class_info->class_name_low = g_ascii_strdown(class_info->class_name_up, -1);
+ if (*gtk_entry_get_text(GTK_ENTRY(cc_dlg->base_name_entry)) != '\0')
+ {
+ 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)) ?
+ '>' : '\"');
+ }
+ 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 (class_info->base_name != NULL)
+ class_info->base_decl = g_strdup_printf(": public %s", class_info->base_name);
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->create_constructor_box)))
+ {
+ gchar *base_constructor;
+
+ if (class_info->base_name == NULL)
+ 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);
+ }
+ 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);
+ }
+ 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);
+ }
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cc_dlg->create_destructor_box)))
+ {
+ class_info->gtk_destructor_registration =
+ g_strdup_printf("GtkObjectClass *object_class;\n\n"
+ "\tobject_class = (GtkObjectClass*)klass;\n\n"
+ "\tobject_class->destroy = %s_destroy;\n",
+ class_info->class_name_low);
+ class_info->destructor_decl =
+ g_strdup_printf("static void %s_destroy\t\t\t(GtkObject *object);\n",
+ class_info->class_name_low);
+ class_info->destructor_impl = g_strdup_printf("\n"
+ "void %s_destroy(GtkObject *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 (GTK_OBJECT_CLASS(parent_class)->destroy)\n"
+ "\t\t(* GTK_OBJECT_CLASS(parent_class)->destroy)(object);\n"
+ "}\n",
+ class_info->class_name_low,
+ class_info->class_name,
+ class_info->class_name_up,
+ class_info->class_name_up);
+ }
+ break;
+ }
+ }
+
+ text = templates_get_template_class_source(class_info);
+ idx = document_new_file(class_info->source, NULL);
+ sci_set_text(doc_list[idx].sci, text);
+ g_free(text);
+
+ text = templates_get_template_class_header(class_info);
+ idx = document_new_file(class_info->header, NULL);
+ sci_set_text(doc_list[idx].sci, text);
+ g_free(text);
+
+ gtk_object_destroy(GTK_OBJECT(cc_dlg->dialog));
+}
+
+
+
Modified: trunk/src/tools.h
===================================================================
--- trunk/src/tools.h 2007-06-14 08:15:49 UTC (rev 1615)
+++ trunk/src/tools.h 2007-06-14 13:10:51 UTC (rev 1616)
@@ -31,4 +31,6 @@
void tools_execute_custom_command(gint idx, const gchar *command);
+void tools_show_dialog_create_class(gint type);
+
#endif
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