diff options
Diffstat (limited to 'tools/glade/glade/glade_project_options.c')
-rw-r--r-- | tools/glade/glade/glade_project_options.c | 1433 |
1 files changed, 1433 insertions, 0 deletions
diff --git a/tools/glade/glade/glade_project_options.c b/tools/glade/glade/glade_project_options.c new file mode 100644 index 00000000..a1f19624 --- /dev/null +++ b/tools/glade/glade/glade_project_options.c @@ -0,0 +1,1433 @@ +/* Gtk+ User Interface Builder + * Copyright (C) 1998 Damon Chaplin + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include <ctype.h> +#include <string.h> + +#include <gtk/gtkalignment.h> +#include <gtk/gtkentry.h> +#include <gtk/gtkeventbox.h> +#include <gtk/gtkfilechooserdialog.h> +#include <gtk/gtkframe.h> +#include <gtk/gtkhbox.h> +#include <gtk/gtkhbbox.h> +#include <gtk/gtklabel.h> +#include <gtk/gtkmain.h> +#include <gtk/gtkmenu.h> +#include <gtk/gtkmenuitem.h> +#include <gtk/gtknotebook.h> +#include <gtk/gtkoptionmenu.h> +#include <gtk/gtkradiobutton.h> +#include <gtk/gtkstock.h> +#include <gtk/gtkvbox.h> + +#include "gladeconfig.h" + +#ifdef USE_GNOME +#include <gnome.h> +#endif + +#include "glade_project_options.h" +#include "utils.h" + + +static GtkWindowClass *parent_class = NULL; + + +static void glade_project_options_class_init (GladeProjectOptionsClass * klass); +static void glade_project_options_init (GladeProjectOptions * project_options); +static void glade_project_options_destroy (GtkObject *object); + +static void glade_project_options_set_project (GladeProjectOptions *options, + GladeProject *project); +static void glade_project_options_directory_changed (GtkWidget * entry, + GladeProjectOptions *options); +static void glade_project_options_name_changed (GtkWidget * entry, + GladeProjectOptions *options); +static void glade_project_options_program_name_changed (GtkWidget * entry, + GladeProjectOptions *options); +static void glade_project_options_xml_filename_changed (GtkWidget * entry, + GladeProjectOptions *options); +static void glade_project_options_generate_name (GladeProjectOptions *options); +static void glade_project_options_generate_program_name (GladeProjectOptions *options); +static void glade_project_options_generate_xml_filename (GladeProjectOptions *options); +static gchar* glade_project_options_generate_project_name_from_directory (gchar *directory); +static gchar* glade_project_options_generate_program_name_from_project_name (gchar *project_name); +static gchar* glade_project_options_generate_xml_filename_from_program_name (gchar *program_name); +static void glade_project_options_translatable_strings_toggled (GtkWidget *widget, + GladeProjectOptions *options); +static void glade_project_options_show_file_selection (GtkWidget *widget, + gpointer data); +static void on_filesel_response (GtkWidget *widget, + gint response_id, + GladeProjectOptions *options); +static void glade_project_options_ok (GtkWidget *widget, + GladeProjectOptions *options); +static gchar* get_entry_text (GtkWidget *entry); +static gboolean glade_project_options_check_valid (GladeProjectOptions *options); + +GType +glade_project_options_get_type (void) +{ + static GType glade_project_options_type = 0; + + if (!glade_project_options_type) + { + GtkTypeInfo glade_project_options_info = + { + "GladeProjectOptions", + sizeof (GladeProjectOptions), + sizeof (GladeProjectOptionsClass), + (GtkClassInitFunc) glade_project_options_class_init, + (GtkObjectInitFunc) glade_project_options_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + glade_project_options_type = gtk_type_unique (gtk_window_get_type (), + &glade_project_options_info); + } + return glade_project_options_type; +} + + +static void +glade_project_options_class_init (GladeProjectOptionsClass * klass) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass *) klass; + + parent_class = gtk_type_class (gtk_window_get_type ()); + + object_class->destroy = glade_project_options_destroy; +} + +static void +set_accessible_description (GtkWidget *widget, const gchar *desc) +{ + AtkObject *atk_widget; + + g_return_if_fail (GTK_IS_WIDGET (widget)); + + atk_widget = gtk_widget_get_accessible (widget); + + if (desc) + atk_object_set_description (atk_widget, desc); +} + + +static void +glade_project_options_init (GladeProjectOptions * options) +{ + GtkTooltips *tooltips; + GtkWidget *main_vbox, *notebook; + GtkWidget *general_options_vbox, *c_options_vbox, *libglade_options_vbox; + GtkWidget *vbox, *table, *label, *button, *eventbox, *alignment; + GtkWidget *hbox, *hbbox, *radio_button, *frame; + gint row, language; + GSList *group; + + options->generate_program_name = FALSE; + options->generate_xml_filename = FALSE; + options->language_buttons = NULL; + options->filesel = NULL; + options->auto_generation_level = 0; + + tooltips = gtk_tooltips_new (); + + gtk_container_set_border_width (GTK_CONTAINER (options), 4); + gtk_window_set_position (GTK_WINDOW (options), GTK_WIN_POS_MOUSE); + gtk_window_set_title (GTK_WINDOW (options), _("Project Options")); + gtk_window_set_policy (GTK_WINDOW (options), FALSE, TRUE, FALSE); + gtk_window_set_wmclass (GTK_WINDOW (options), "project_options", "Glade"); + + main_vbox = gtk_vbox_new (FALSE, 4); + gtk_container_add (GTK_CONTAINER (options), main_vbox); + gtk_widget_show (main_vbox); + + notebook = gtk_notebook_new (); + gtk_widget_show (notebook); + gtk_box_pack_start (GTK_BOX (main_vbox), notebook, TRUE, TRUE, 0); + + + /* + * General Page. + */ + + label = gtk_label_new (_("General")); + gtk_widget_show (label); + + general_options_vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_show (general_options_vbox); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), general_options_vbox, + label); + gtk_container_set_border_width (GTK_CONTAINER (general_options_vbox), 7); + + frame = gtk_frame_new (_("Basic Options:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (general_options_vbox), frame, FALSE, TRUE, 4); + + table = gtk_table_new (3, 4, TRUE); + gtk_widget_show (table); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_container_set_border_width (GTK_CONTAINER (table), 4); + + /* Project Directory. */ + row = 0; + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 0, 1, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The project directory"), NULL); + + label = gtk_label_new (_("Project Directory:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + hbox = gtk_hbox_new (FALSE, 4); + gtk_widget_show (hbox); + gtk_table_attach (GTK_TABLE (table), hbox, + 1, 4, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + + options->directory_entry = gtk_entry_new (); + gtk_widget_show (options->directory_entry); + gtk_box_pack_start (GTK_BOX (hbox), options->directory_entry, + TRUE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT (options->directory_entry), "changed", + GTK_SIGNAL_FUNC (glade_project_options_directory_changed), + options); + + button = gtk_button_new_with_label (_("Browse...")); + gtk_widget_show (button); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 8, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (glade_project_options_show_file_selection), + NULL); + + /* Project Name. */ + row++; + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 0, 1, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The name of the current project"), NULL); + + label = gtk_label_new (_("Project Name:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->name_entry = gtk_entry_new (); + gtk_widget_set_usize (options->name_entry, 80, -1); + gtk_widget_show (options->name_entry); + gtk_table_attach (GTK_TABLE (table), options->name_entry, + 1, 2, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + gtk_signal_connect (GTK_OBJECT (options->name_entry), "changed", + GTK_SIGNAL_FUNC (glade_project_options_name_changed), + options); + + /* Program Name. */ + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 2, 3, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The name of the program"), NULL); + + label = gtk_label_new (_("Program Name:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->program_name_entry = gtk_entry_new (); + gtk_widget_set_usize (options->program_name_entry, 80, -1); + gtk_widget_show (options->program_name_entry); + gtk_table_attach (GTK_TABLE (table), options->program_name_entry, + 3, 4, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + gtk_signal_connect (GTK_OBJECT (options->program_name_entry), "changed", + GTK_SIGNAL_FUNC (glade_project_options_program_name_changed), + options); + + /* Project XML File. */ + row++; + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 0, 1, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The project file"), NULL); + + label = gtk_label_new (_("Project File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->xml_filename_entry = gtk_entry_new (); + gtk_widget_set_usize (options->xml_filename_entry, 80, -1); + gtk_widget_show (options->xml_filename_entry); + gtk_table_attach (GTK_TABLE (table), options->xml_filename_entry, + 1, 4, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + gtk_signal_connect (GTK_OBJECT (options->xml_filename_entry), "changed", + GTK_SIGNAL_FUNC (glade_project_options_xml_filename_changed), + options); + + + /* Project Source Directory. */ + frame = gtk_frame_new (_("Subdirectories:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (general_options_vbox), frame, FALSE, TRUE, 4); + + table = gtk_table_new (1, 4, TRUE); + gtk_widget_show (table); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_container_set_border_width (GTK_CONTAINER (table), 4); + + row = 0; + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 0, 1, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The directory to save generated source code"), + NULL); + + label = gtk_label_new (_("Source Directory:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->source_directory_entry = gtk_entry_new (); + gtk_widget_set_usize (options->source_directory_entry, 80, -1); + gtk_widget_show (options->source_directory_entry); + gtk_table_attach (GTK_TABLE (table), options->source_directory_entry, + 1, 2, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + + + /* Project Pixmaps Directory. */ + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 2, 3, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The directory to store pixmaps"), + NULL); + + label = gtk_label_new (_("Pixmaps Directory:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->pixmaps_directory_entry = gtk_entry_new (); + gtk_widget_set_usize (options->pixmaps_directory_entry, 80, -1); + gtk_widget_show (options->pixmaps_directory_entry); + gtk_table_attach (GTK_TABLE (table), options->pixmaps_directory_entry, + 3, 4, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + + + /* Project License. */ + /* Take this out until we actually use it. */ +#if 0 + row++; + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 0, 1, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The license which is added at the top of generated files"), NULL); + + label = gtk_label_new (_("License:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->license_option_menu = gtk_option_menu_new (); + gtk_widget_show (options->license_option_menu); + gtk_table_attach (GTK_TABLE (table), options->license_option_menu, + 1, 3, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + + menu = gtk_menu_new (); + menuitem = gtk_menu_item_new_with_label ("GNU General Public License"); + gtk_widget_show (menuitem); + gtk_container_add (GTK_CONTAINER (menu), menuitem); + gtk_option_menu_set_menu (GTK_OPTION_MENU (options->license_option_menu), + menu); +#endif + + /* Source Language. */ + frame = gtk_frame_new (_("Language:")); + /* Change this to 0 if you don't want the language option (C/C++/Perl). */ +#if 1 + gtk_widget_show (frame); +#endif + gtk_box_pack_start (GTK_BOX (general_options_vbox), frame, FALSE, TRUE, 4); + + alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); + gtk_widget_show (alignment); + gtk_container_add (GTK_CONTAINER (frame), alignment); + + hbox = gtk_hbox_new (TRUE, 4); + gtk_widget_show (hbox); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); + gtk_container_add (GTK_CONTAINER (alignment), hbox); + + options->language_buttons = g_new (GtkWidget*, GladeNumLanguages); + group = NULL; + for (language = 0; language < GladeNumLanguages; language++) + { + radio_button = gtk_radio_button_new_with_label (group, + GladeLanguages[language]); + gtk_widget_show (radio_button); + gtk_box_pack_start (GTK_BOX (hbox), radio_button, FALSE, TRUE, 4); + group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button)); + + options->language_buttons[language] = radio_button; + } + + /* Gnome Support. */ +#ifdef USE_GNOME + frame = gtk_frame_new (_("Gnome:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (general_options_vbox), frame, FALSE, TRUE, 4); + + hbox = gtk_hbox_new (TRUE, 4); + gtk_widget_show (hbox); + gtk_container_add (GTK_CONTAINER (frame), hbox); + + options->gnome_support = gtk_check_button_new_with_label (_("Enable Gnome Support")); + /* This can't be changed now. */ + gtk_widget_set_sensitive (options->gnome_support, FALSE); + gtk_widget_show (options->gnome_support); + gtk_box_pack_start (GTK_BOX (hbox), options->gnome_support, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, options->gnome_support, + _("If a Gnome application is to be built"), NULL); + +#ifdef USE_GNOME_DB + options->gnome_db_support = gtk_check_button_new_with_label (_("Enable Gnome DB Support")); + gtk_widget_show (options->gnome_db_support); + gtk_box_pack_start (GTK_BOX (hbox), options->gnome_db_support, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, options->gnome_db_support, + _("If a Gnome DB application is to be built"), NULL); +#endif /* USE_GNOME_DB */ + +#endif /* USE_GNOME */ + + + /* + * C Options Page. + */ + + label = gtk_label_new (_("C Options")); + gtk_widget_show (label); + + c_options_vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_show (c_options_vbox); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), c_options_vbox, label); + gtk_container_set_border_width (GTK_CONTAINER (c_options_vbox), 7); + + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), _("<b>Note:</b> for large applications the use of libglade is recommended.")); + gtk_widget_set_size_request (label, 400, -1); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (c_options_vbox), label, FALSE, TRUE, 4); + + hbox = gtk_hbox_new (TRUE, 4); + gtk_widget_show (hbox); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); + gtk_box_pack_start (GTK_BOX (c_options_vbox), hbox, FALSE, TRUE, 4); + + frame = gtk_frame_new (_("General Options:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0); + + vbox = gtk_vbox_new (TRUE, 0); + gtk_widget_show (vbox); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); + gtk_container_add (GTK_CONTAINER (frame), vbox); + + /* Gettext Support. */ + options->gettext_support = gtk_check_button_new_with_label (_("Gettext Support")); + gtk_widget_show (options->gettext_support); + gtk_box_pack_start (GTK_BOX (vbox), options->gettext_support, + FALSE, FALSE, 0); + gtk_tooltips_set_tip (tooltips, options->gettext_support, + _("If strings are marked for translation by gettext"), + NULL); + + /* Setting widget names. */ + options->use_widget_names = gtk_check_button_new_with_label (_("Set Widget Names")); + gtk_widget_show (options->use_widget_names); + gtk_box_pack_start (GTK_BOX (vbox), options->use_widget_names, + FALSE, FALSE, 0); + gtk_tooltips_set_tip (tooltips, options->use_widget_names, + _("If widget names are set in the source code"), + NULL); + + /* Backing up source files. */ + options->backup_source_files = gtk_check_button_new_with_label (_("Backup Source Files")); + gtk_widget_show (options->backup_source_files); + gtk_box_pack_start (GTK_BOX (vbox), options->backup_source_files, + FALSE, FALSE, 0); + gtk_tooltips_set_tip (tooltips, options->backup_source_files, + _("If copies of old source files are made"), + NULL); + + /* Gnome Help System support. */ + options->gnome_help_support = gtk_check_button_new_with_label (_("Gnome Help Support")); +#ifdef USE_GNOME + gtk_widget_show (options->gnome_help_support); +#endif + gtk_box_pack_start (GTK_BOX (vbox), options->gnome_help_support, + FALSE, FALSE, 0); + gtk_tooltips_set_tip (tooltips, options->gnome_help_support, + _("If support for the Gnome Help system should be included"), + NULL); + + frame = gtk_frame_new (_("File Output Options:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0); + + vbox = gtk_vbox_new (TRUE, 0); + gtk_widget_show (vbox); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); + gtk_container_add (GTK_CONTAINER (frame), vbox); + + /* Outputting main file. */ + options->output_main_file = gtk_check_button_new_with_label (_("Output main.c File")); + gtk_widget_show (options->output_main_file); + gtk_box_pack_start (GTK_BOX (vbox), options->output_main_file, + FALSE, FALSE, 0); + gtk_tooltips_set_tip (tooltips, options->output_main_file, + _("If a main.c file is output containing a main() function, if it doesn't already exist"), + NULL); + + /* Outputting support files. */ + options->output_support_files = gtk_check_button_new_with_label (_("Output Support Functions")); + gtk_widget_show (options->output_support_files); + gtk_box_pack_start (GTK_BOX (vbox), options->output_support_files, + FALSE, FALSE, 0); + gtk_tooltips_set_tip (tooltips, options->output_support_files, + _("If the support functions are output"), + NULL); + + /* Outputting build files. */ + options->output_build_files = gtk_check_button_new_with_label (_("Output Build Files")); + gtk_widget_show (options->output_build_files); + gtk_box_pack_start (GTK_BOX (vbox), options->output_build_files, + FALSE, FALSE, 0); + gtk_tooltips_set_tip (tooltips, options->output_build_files, + _("If files for building the source code are output, including Makefile.am and configure.in, if they don't already exist"), + NULL); + + /* Main source file. */ + frame = gtk_frame_new (_("Interface Creation Functions:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (c_options_vbox), frame, FALSE, TRUE, 4); + + hbox = gtk_hbox_new (TRUE, 4); + gtk_widget_show (hbox); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); + gtk_container_add (GTK_CONTAINER (frame), hbox); + + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_box_pack_start (GTK_BOX (hbox), eventbox, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox, _("The file in which the functions to create the interface are written"), NULL); + + label = gtk_label_new (_("Source File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->main_source_entry = gtk_entry_new (); + gtk_widget_show (options->main_source_entry); + gtk_widget_set_usize (options->main_source_entry, 80, -1); + gtk_box_pack_start (GTK_BOX (hbox), options->main_source_entry, + TRUE, TRUE, 0); + + /* Main header file. */ + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_box_pack_start (GTK_BOX (hbox), eventbox, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox, _("The file in which the declarations of the functions to create the interface are written"), NULL); + + label = gtk_label_new (_("Header File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->main_header_entry = gtk_entry_new (); + gtk_widget_show (options->main_header_entry); + gtk_widget_set_usize (options->main_header_entry, 80, -1); + gtk_box_pack_start (GTK_BOX (hbox), options->main_header_entry, + TRUE, TRUE, 0); + + set_accessible_description (options->main_source_entry, _("Source file for interface creation functions")); + set_accessible_description (options->main_header_entry, _("Header file for interface creation functions")); + + /* Handler source file. */ + frame = gtk_frame_new (_("Signal Handler & Callback Functions:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (c_options_vbox), frame, FALSE, TRUE, 4); + + hbox = gtk_hbox_new (TRUE, 4); + gtk_widget_show (hbox); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); + gtk_container_add (GTK_CONTAINER (frame), hbox); + + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_box_pack_start (GTK_BOX (hbox), eventbox, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox, _("The file in which the empty signal handler and callback functions are written"), NULL); + + label = gtk_label_new (_("Source File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->handler_source_entry = gtk_entry_new (); + gtk_widget_show (options->handler_source_entry); + gtk_widget_set_usize (options->handler_source_entry, 80, -1); + gtk_box_pack_start (GTK_BOX (hbox), options->handler_source_entry, + TRUE, TRUE, 0); + + /* Handler header file. */ + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_box_pack_start (GTK_BOX (hbox), eventbox, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox, _("The file in which the declarations of the signal handler and callback functions are written"), NULL); + + label = gtk_label_new (_("Header File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->handler_header_entry = gtk_entry_new (); + gtk_widget_show (options->handler_header_entry); + gtk_widget_set_usize (options->handler_header_entry, 80, -1); + gtk_box_pack_start (GTK_BOX (hbox), options->handler_header_entry, + TRUE, TRUE, 0); + + set_accessible_description (options->handler_source_entry, _("Source file for signal handler and callback functions")); + set_accessible_description (options->handler_header_entry, _("Header file for signal handler and callback functions")); + + /* Support source file. */ + frame = gtk_frame_new (_("Support Functions:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (c_options_vbox), frame, FALSE, TRUE, 4); + + hbox = gtk_hbox_new (TRUE, 4); + gtk_widget_show (hbox); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); + gtk_container_add (GTK_CONTAINER (frame), hbox); + + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_box_pack_start (GTK_BOX (hbox), eventbox, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox, _("The file in which the support functions are written"), NULL); + + label = gtk_label_new (_("Source File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->support_source_entry = gtk_entry_new (); + gtk_widget_show (options->support_source_entry); + gtk_widget_set_usize (options->support_source_entry, 80, -1); + gtk_box_pack_start (GTK_BOX (hbox), options->support_source_entry, + TRUE, TRUE, 0); + + /* Support header file. */ + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_box_pack_start (GTK_BOX (hbox), eventbox, FALSE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox, _("The file in which the declarations of the support functions are written"), NULL); + + label = gtk_label_new (_("Header File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + + options->support_header_entry = gtk_entry_new (); + gtk_widget_show (options->support_header_entry); + gtk_widget_set_usize (options->support_header_entry, 80, -1); + gtk_box_pack_start (GTK_BOX (hbox), options->support_header_entry, + TRUE, TRUE, 0); + + set_accessible_description (options->support_source_entry, _("Source file for support functions")); + set_accessible_description (options->support_header_entry, _("Header file for support functions")); + + /* + * libglade Options Page. + */ + + label = gtk_label_new (_("LibGlade Options")); + gtk_widget_show (label); + + libglade_options_vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_show (libglade_options_vbox); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), libglade_options_vbox, + label); + gtk_container_set_border_width (GTK_CONTAINER (libglade_options_vbox), 7); + + frame = gtk_frame_new (_("Translatable Strings:")); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (libglade_options_vbox), frame, FALSE, TRUE, 4); + + table = gtk_table_new (2, 3, FALSE); + gtk_widget_show (table); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_table_set_col_spacings (GTK_TABLE (table), 2); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_container_set_border_width (GTK_CONTAINER (table), 4); + + row = 0; + + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), _("<b>Note:</b> this option is deprecated - use intltool instead.")); + gtk_widget_set_size_request (label, 400, -1); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_show (label); + gtk_table_attach (GTK_TABLE (table), label, + 0, 3, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + row++; + + /* Output translatable strings. */ + options->output_translatable_strings = gtk_check_button_new_with_label (_("Save Translatable Strings")); + gtk_widget_show (options->output_translatable_strings); + gtk_table_attach (GTK_TABLE (table), options->output_translatable_strings, + 0, 3, row, row + 1, GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, options->output_translatable_strings, + _("If translatable strings are saved in a separate C source file, to enable translation of interfaces loaded by libglade"), + NULL); + + /* Translatable Strings File. */ + row++; + eventbox = gtk_event_box_new (); + gtk_widget_show (eventbox); + gtk_table_attach (GTK_TABLE (table), eventbox, 0, 1, row, row + 1, + GTK_FILL, 0, 0, 0); + gtk_tooltips_set_tip (tooltips, eventbox, + _("The C source file to save all translatable strings in"), NULL); + + label = gtk_label_new (_("File:")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + options->translatable_strings_filename_label = label; + + options->translatable_strings_filename_entry = gtk_entry_new (); + gtk_widget_show (options->translatable_strings_filename_entry); + gtk_table_attach (GTK_TABLE (table), + options->translatable_strings_filename_entry, + 1, 2, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + + + /* The button box with OK & Cancel buttons. */ + hbbox = gtk_hbutton_box_new (); + gtk_widget_show (hbbox); + gtk_box_pack_start (GTK_BOX (main_vbox), hbbox, TRUE, TRUE, 0); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbbox), GTK_BUTTONBOX_END); + gtk_box_set_spacing (GTK_BOX (hbbox), 8); + + options->cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + GTK_WIDGET_SET_FLAGS (options->cancel_button, GTK_CAN_DEFAULT); + gtk_widget_show (options->cancel_button); + gtk_container_add (GTK_CONTAINER (hbbox), options->cancel_button); + gtk_signal_connect_object (GTK_OBJECT (options->cancel_button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (options)); + + options->ok_button = gtk_button_new_from_stock (GTK_STOCK_OK); + GTK_WIDGET_SET_FLAGS (options->ok_button, GTK_CAN_DEFAULT); + gtk_widget_show (options->ok_button); + gtk_container_add (GTK_CONTAINER (hbbox), options->ok_button); + gtk_widget_grab_default (options->ok_button); + gtk_signal_connect (GTK_OBJECT (options->ok_button), "clicked", + GTK_SIGNAL_FUNC (glade_project_options_ok), options); + + gtk_signal_connect (GTK_OBJECT (options), "key_press_event", + GTK_SIGNAL_FUNC (glade_util_check_key_is_esc), + GINT_TO_POINTER (GladeEscDestroys)); + + gtk_widget_grab_focus (options->directory_entry); +} + + +GtkWidget * +glade_project_options_new (GladeProject *project) +{ + GladeProjectOptions *options; + + g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL); + + options = GLADE_PROJECT_OPTIONS (gtk_type_new (glade_project_options_get_type ())); + glade_project_options_set_project (options, project); + + return GTK_WIDGET (options); +} + + +static void +glade_project_options_destroy (GtkObject *object) +{ + GladeProjectOptions *options; + + options = GLADE_PROJECT_OPTIONS (object); + + g_free (options->language_buttons); + options->language_buttons = NULL; + + /* FIXME: Maybe we need to disconnect the destroy signal handler added to + the project. */ + + if (options->filesel) + { + gtk_widget_destroy (options->filesel); + options->filesel = NULL; + } +} + + +/* This sets which project which we show the options of. */ +static void +glade_project_options_set_project (GladeProjectOptions *options, + GladeProject *project) +{ + GladeError *error; + gchar *base = NULL, *next_project_dir = NULL; + gint next_project_num = -1; + + g_return_if_fail (GLADE_IS_PROJECT (project)); + + options->project = project; + options->generate_name = FALSE; + options->generate_program_name = FALSE; + options->generate_xml_filename = FALSE; + + /* If the project directory has been set, we show it, else we show the + next free project directory in $HOME/Projects as the default. */ + if (project->directory && project->directory[0]) + { + base = project->directory; + gtk_entry_set_text (GTK_ENTRY (options->directory_entry), base); + } + else + { + error = glade_util_get_next_free_project_directory (&next_project_dir, + &next_project_num); + if (!error) + { + base = next_project_dir; + gtk_entry_set_text (GTK_ENTRY (options->directory_entry), base); + } + else + { + g_warning ("Couldn't find next free project directory."); + gtk_entry_set_text (GTK_ENTRY (options->directory_entry), ""); + } + } + + /* Project name. */ + if (project->name && project->name[0]) + { + gchar *generated_project_name; + + gtk_entry_set_text (GTK_ENTRY (options->name_entry), project->name); + + /* See if it matches what would have been auto-generated. */ + generated_project_name = glade_project_options_generate_project_name_from_directory (base); + if (!strcmp (generated_project_name, project->name)) + options->generate_name = TRUE; + g_free (generated_project_name); + } + else + { + glade_project_options_generate_name (options); + options->generate_name = TRUE; + } + + /* Program name. */ + if (project->program_name && project->program_name[0]) + { + gchar *generated_program_name; + + gtk_entry_set_text (GTK_ENTRY (options->program_name_entry), + project->program_name); + + /* See if it matches what would have been auto-generated. */ + generated_program_name = glade_project_options_generate_program_name_from_project_name (project->name); + if (!strcmp (generated_program_name, project->program_name)) + options->generate_program_name = TRUE; + g_free (generated_program_name); + } + else + { + glade_project_options_generate_program_name (options); + options->generate_program_name = TRUE; + } + + /* XML filename. */ + if (project->xml_filename && project->xml_filename[0]) + { + gchar *xml_filename_relative, *generated_filename; + + xml_filename_relative = glade_util_make_relative_path (base, project->xml_filename); + gtk_entry_set_text (GTK_ENTRY (options->xml_filename_entry), + xml_filename_relative); + + /* See if it matches what would have been auto-generated. */ + generated_filename = glade_project_options_generate_xml_filename_from_program_name (project->program_name); + if (!strcmp (generated_filename, xml_filename_relative)) + options->generate_xml_filename = TRUE; + g_free (generated_filename); + g_free (xml_filename_relative); + } + else + { + glade_project_options_generate_xml_filename (options); + options->generate_xml_filename = TRUE; + } + + /* Source directory. */ + if (project->source_directory && project->source_directory[0]) + { + gchar *srcdir_relative; + + srcdir_relative = glade_util_make_relative_path (base, project->source_directory); + gtk_entry_set_text (GTK_ENTRY (options->source_directory_entry), + srcdir_relative); + g_free (srcdir_relative); + } + else + { + gtk_entry_set_text (GTK_ENTRY (options->source_directory_entry), + "src"); + } + + /* Pixmaps directory. */ + if (project->pixmaps_directory && project->pixmaps_directory[0]) + { + gchar *pixmaps_relative; + + pixmaps_relative = glade_util_make_relative_path (base, project->pixmaps_directory); + gtk_entry_set_text (GTK_ENTRY (options->pixmaps_directory_entry), + pixmaps_relative); + g_free (pixmaps_relative); + } + else + { + gtk_entry_set_text (GTK_ENTRY (options->pixmaps_directory_entry), + "pixmaps"); + } + + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->language_buttons[project->language]), TRUE); + +#ifdef USE_GNOME + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->gnome_support), + project->gnome_support); +#ifdef USE_GNOME_DB + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->gnome_db_support), + project->gnome_db_support); +#endif +#endif + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->gettext_support), + project->gettext_support); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->use_widget_names), + project->use_widget_names); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->output_main_file), + project->output_main_file); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->output_support_files), + project->output_support_files); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->output_build_files), + project->output_build_files); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->backup_source_files), + project->backup_source_files); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->gnome_help_support), + project->gnome_help_support); + + gtk_entry_set_text (GTK_ENTRY (options->main_source_entry), + project->main_source_file + ? project->main_source_file : ""); + gtk_entry_set_text (GTK_ENTRY (options->main_header_entry), + project->main_header_file + ? project->main_header_file : ""); + gtk_entry_set_text (GTK_ENTRY (options->handler_source_entry), + project->handler_source_file + ? project->handler_source_file : ""); + gtk_entry_set_text (GTK_ENTRY (options->handler_header_entry), + project->handler_header_file + ? project->handler_header_file : ""); + + gtk_entry_set_text (GTK_ENTRY (options->support_source_entry), + project->support_source_file + ? project->support_source_file : ""); + gtk_entry_set_text (GTK_ENTRY (options->support_header_entry), + project->support_header_file + ? project->support_header_file : ""); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->output_translatable_strings), + project->output_translatable_strings); + if (project->translatable_strings_file + && project->translatable_strings_file[0]) + { + gchar *filename; + + filename = glade_util_make_relative_path (base, project->translatable_strings_file); + gtk_entry_set_text (GTK_ENTRY (options->translatable_strings_filename_entry), + filename); + g_free (filename); + } + else + { + gtk_entry_set_text (GTK_ENTRY (options->translatable_strings_filename_entry), ""); + } + gtk_signal_connect (GTK_OBJECT (options->output_translatable_strings), + "toggled", + GTK_SIGNAL_FUNC (glade_project_options_translatable_strings_toggled), + options); + + /* Set the sensitivity of the options. */ + gtk_widget_set_sensitive (options->translatable_strings_filename_label, + project->output_translatable_strings); + gtk_widget_set_sensitive (options->translatable_strings_filename_entry, + project->output_translatable_strings); + + + /* Connect to the project's destroy signal so we can destroy ourself. */ + gtk_signal_connect_object (GTK_OBJECT (project), "destroy", + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (options)); + + g_free (next_project_dir); +} + + +static void +glade_project_options_directory_changed (GtkWidget * entry, + GladeProjectOptions *options) +{ + if (options->generate_name) + glade_project_options_generate_name (options); +} + + +static void +glade_project_options_name_changed (GtkWidget * entry, + GladeProjectOptions *options) +{ + if (options->generate_program_name) + glade_project_options_generate_program_name (options); + + /* If this option has been edited by the user, turn auto-generation off. */ + if (options->auto_generation_level == 0) + options->generate_name = FALSE; +} + + +static void +glade_project_options_program_name_changed (GtkWidget * entry, + GladeProjectOptions *options) +{ + if (options->generate_xml_filename) + glade_project_options_generate_xml_filename (options); + + /* If this option has been edited by the user, turn auto-generation off. */ + if (options->auto_generation_level == 0) + options->generate_program_name = FALSE; +} + + +static void +glade_project_options_xml_filename_changed (GtkWidget * entry, + GladeProjectOptions *options) +{ + /* If this option has been edited by the user, turn auto-generation off. */ + if (options->auto_generation_level == 0) + options->generate_xml_filename = FALSE; +} + + +static void +glade_project_options_generate_name (GladeProjectOptions *options) +{ + gchar *directory, *project_name; + + directory = (char*) gtk_entry_get_text (GTK_ENTRY (options->directory_entry)); + project_name = glade_project_options_generate_project_name_from_directory (directory); + options->auto_generation_level++; + gtk_entry_set_text (GTK_ENTRY (options->name_entry), project_name); + options->auto_generation_level--; + g_free (project_name); +} + + +static gchar* +glade_project_options_generate_project_name_from_directory (gchar *directory) +{ + gchar *project_name; + + if (directory == NULL) + return g_strdup (""); + + project_name = g_strdup (g_basename (directory)); + if (project_name[0] != '\0') + project_name[0] = toupper (project_name[0]); + return project_name; +} + + +static void +glade_project_options_generate_program_name (GladeProjectOptions *options) +{ + gchar *project_name, *program_name; + + project_name = (char*) gtk_entry_get_text (GTK_ENTRY (options->name_entry)); + program_name = glade_project_options_generate_program_name_from_project_name (project_name); + options->auto_generation_level++; + gtk_entry_set_text (GTK_ENTRY (options->program_name_entry), program_name); + options->auto_generation_level--; + g_free (program_name); +} + + +static gchar* +glade_project_options_generate_program_name_from_project_name (gchar *project_name) +{ + gchar *program_name, *pos; + + if (project_name == NULL) + return g_strdup (""); + + program_name = g_strdup (project_name); + g_strdown (program_name); + /* Try to convert any characters which shouldn't be in a program name to '-'. + We'll allow alphanumerics and characters in [.+-_] */ + for (pos = program_name; *pos; pos++) + { + if (!(isalnum (*pos) || *pos == '.' || *pos == '+' || *pos == '-' + || *pos == '_')) + *pos = '-'; + } + return program_name; +} + + +static void +glade_project_options_generate_xml_filename (GladeProjectOptions *options) +{ + gchar *program_name, *xml_filename; + + program_name = (char*) gtk_entry_get_text (GTK_ENTRY (options->program_name_entry)); + xml_filename = glade_project_options_generate_xml_filename_from_program_name (program_name); + options->auto_generation_level++; + gtk_entry_set_text (GTK_ENTRY (options->xml_filename_entry), xml_filename); + options->auto_generation_level--; + g_free (xml_filename); +} + + +static gchar* +glade_project_options_generate_xml_filename_from_program_name (gchar *program_name) +{ + gchar *xml_filename; + + if (program_name == NULL) + return g_strdup (""); + + xml_filename = g_strdup_printf ("%s.glade", program_name); + return xml_filename; +} + + +static void +glade_project_options_translatable_strings_toggled (GtkWidget *widget, + GladeProjectOptions *options) +{ + gboolean sensitive; + + sensitive = GTK_TOGGLE_BUTTON (options->output_translatable_strings)->active; + + /* Set the sensitivity of the options. */ + gtk_widget_set_sensitive (options->translatable_strings_filename_label, + sensitive); + gtk_widget_set_sensitive (options->translatable_strings_filename_entry, + sensitive); +} + + +static void +glade_project_options_show_file_selection (GtkWidget *widget, + gpointer data) +{ + GladeProjectOptions *options; + gchar *filename; + + options = GLADE_PROJECT_OPTIONS (gtk_widget_get_toplevel (widget)); + + if (options->filesel == NULL) + { + options->filesel = gtk_file_chooser_dialog_new (_("Select the Project Directory"), + GTK_WINDOW (options), + GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (options->filesel), + GTK_RESPONSE_OK); + + g_signal_connect (options->filesel, "response", + GTK_SIGNAL_FUNC (on_filesel_response), options); + g_signal_connect (options->filesel, "delete_event", + G_CALLBACK (gtk_true), NULL); + } + + filename = (char*) gtk_entry_get_text (GTK_ENTRY (options->directory_entry)); + if (glade_util_file_exists (filename)) + { + glade_util_set_file_selection_filename (options->filesel, filename); + } + + gtk_window_present (GTK_WINDOW (options->filesel)); +} + + +static void +on_filesel_response (GtkWidget *widget, + gint response_id, + GladeProjectOptions *options) +{ + gchar *filename; + + if (response_id == GTK_RESPONSE_OK) + { + filename = glade_util_get_file_selection_filename (options->filesel); + if (filename) + gtk_entry_set_text (GTK_ENTRY (options->directory_entry), filename); + g_free (filename); + } + + glade_util_close_window (options->filesel); +} + + +static void +glade_project_options_ok (GtkWidget *widget, + GladeProjectOptions *options) +{ + GladeProject *project; + gchar *xml_filename, *directory, *source_directory, *pixmaps_directory; + gchar *strings_filename; + gint language; + + project = options->project; + + /* First check that the options are valid, according to the requested action. + If not, we need to stop the signal so the dialog isn't closed. */ + if (!glade_project_options_check_valid (options)) + { + gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "clicked"); + return; + } + + /* The project directory is the only aboslute path. Everything else is + relative to it, so needs to be turned into an absolute path here. */ + directory = get_entry_text (options->directory_entry); + glade_project_set_directory (project, directory); + + glade_project_set_name (project, get_entry_text (options->name_entry)); + glade_project_set_program_name (project, get_entry_text (options->program_name_entry)); + + pixmaps_directory = get_entry_text (options->pixmaps_directory_entry); + pixmaps_directory = glade_util_make_absolute_path (directory, + pixmaps_directory); + glade_project_set_pixmaps_directory (project, pixmaps_directory); + g_free (pixmaps_directory); + + source_directory = get_entry_text (options->source_directory_entry); + source_directory = glade_util_make_absolute_path (directory, + source_directory); + glade_project_set_source_directory (project, source_directory); + g_free (source_directory); + + xml_filename = get_entry_text (options->xml_filename_entry); + xml_filename = glade_util_make_absolute_path (directory, xml_filename); + glade_project_set_xml_filename (project, xml_filename); + g_free (xml_filename); + + for (language = 0; language < GladeNumLanguages; language++) + { + + if (GTK_TOGGLE_BUTTON (options->language_buttons[language])->active) + { + glade_project_set_language_name (project, GladeLanguages[language]); + break; + } + } + + +#ifdef USE_GNOME + glade_project_set_gnome_support (project, GTK_TOGGLE_BUTTON (options->gnome_support)->active ? TRUE : FALSE); +#ifdef USE_GNOME_DB + glade_project_set_gnome_db_support (project, GTK_TOGGLE_BUTTON (options->gnome_db_support)->active ? TRUE : FALSE); +#endif +#endif + + glade_project_set_gettext_support (project, GTK_TOGGLE_BUTTON (options->gettext_support)->active ? TRUE : FALSE); + + glade_project_set_use_widget_names (project, GTK_TOGGLE_BUTTON (options->use_widget_names)->active ? TRUE : FALSE); + + glade_project_set_output_main_file (project, GTK_TOGGLE_BUTTON (options->output_main_file)->active ? TRUE : FALSE); + + glade_project_set_output_support_files (project, GTK_TOGGLE_BUTTON (options->output_support_files)->active ? TRUE : FALSE); + + glade_project_set_output_build_files (project, GTK_TOGGLE_BUTTON (options->output_build_files)->active ? TRUE : FALSE); + + glade_project_set_backup_source_files (project, GTK_TOGGLE_BUTTON (options->backup_source_files)->active ? TRUE : FALSE); + + glade_project_set_gnome_help_support (project, GTK_TOGGLE_BUTTON (options->gnome_help_support)->active ? TRUE : FALSE); + + glade_project_set_source_files (project, + get_entry_text (options->main_source_entry), + get_entry_text (options->main_header_entry), + get_entry_text (options->handler_source_entry), + get_entry_text (options->handler_header_entry)); + glade_project_set_support_source_file (project, get_entry_text (options->support_source_entry)); + glade_project_set_support_header_file (project, get_entry_text (options->support_header_entry)); + + glade_project_set_output_translatable_strings (project, GTK_TOGGLE_BUTTON (options->output_translatable_strings)->active ? TRUE : FALSE); + + strings_filename = get_entry_text (options->translatable_strings_filename_entry); + strings_filename = glade_util_make_absolute_path (directory, + strings_filename); + glade_project_set_translatable_strings_file (project, strings_filename); + g_free (strings_filename); + + g_free (directory); + gtk_widget_destroy (GTK_WIDGET (options)); +} + + +/* This returns a pointer to the text in the given entry, or NULL if the entry + is empty. */ +static gchar* +get_entry_text (GtkWidget *entry) +{ + gchar *text; + + text = (char*) gtk_entry_get_text (GTK_ENTRY (entry)); + if (text && text[0] != '\0') + return text; + else + return NULL; +} + + +void +glade_project_options_set_action (GladeProjectOptions *options, + GladeProjectOptionsAction action) +{ + options->action = action; +} + + +/* This checks that all the options needed for the required action have been + set, and returns TRUE if so. */ +static gboolean +glade_project_options_check_valid (GladeProjectOptions *options) +{ + gchar *error = NULL; + gchar *directory, *xml_filename, *project_name, *program_name; + gchar *source_directory, *pixmaps_directory; + gboolean output_translatable_strings; + gchar *translatable_strings_filename; + + directory = get_entry_text (options->directory_entry); + xml_filename = get_entry_text (options->xml_filename_entry); + project_name = get_entry_text (options->name_entry); + program_name = get_entry_text (options->program_name_entry); + source_directory = get_entry_text (options->source_directory_entry); + pixmaps_directory = get_entry_text (options->pixmaps_directory_entry); + output_translatable_strings = GTK_TOGGLE_BUTTON (options->output_translatable_strings)->active; + translatable_strings_filename = get_entry_text (options->translatable_strings_filename_entry); + + switch (options->action) + { + case GLADE_PROJECT_OPTIONS_ACTION_NORMAL: + if (output_translatable_strings + && (translatable_strings_filename == NULL + || translatable_strings_filename[0] == '\0')) + error = _("You need to set the Translatable Strings File option"); + break; + case GLADE_PROJECT_OPTIONS_ACTION_SAVE: + if (directory == NULL || directory[0] == '\0') + error = _("You need to set the Project Directory option"); + else if (xml_filename == NULL || xml_filename[0] == '\0') + error = _("You need to set the Project File option"); + else if (output_translatable_strings + && (translatable_strings_filename == NULL + || translatable_strings_filename[0] == '\0')) + error = _("You need to set the Translatable Strings File option"); + break; + case GLADE_PROJECT_OPTIONS_ACTION_BUILD: + if (directory == NULL || directory[0] == '\0') + error = _("You need to set the Project Directory option"); + else if (xml_filename == NULL || xml_filename[0] == '\0') + error = _("You need to set the Project File option"); + else if (output_translatable_strings + && (translatable_strings_filename == NULL + || translatable_strings_filename[0] == '\0')) + error = _("You need to set the Translatable Strings File option"); + else if (project_name == NULL || project_name[0] == '\0') + error = _("You need to set the Project Name option"); + else if (program_name == NULL || program_name[0] == '\0') + error = _("You need to set the Program Name option"); +#if 0 + else if (source_directory == NULL || source_directory[0] == '\0') + error = _("You need to set the Source Directory option"); +#endif + else if (pixmaps_directory == NULL || pixmaps_directory[0] == '\0') + error = _("You need to set the Pixmaps Directory option"); + break; + } + + if (error) + { + glade_util_show_message_box (error, GTK_WIDGET (options)); + return FALSE; + } + + return TRUE; +} |