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@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@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.