summaryrefslogtreecommitdiff
path: root/tools/glade/glade/glade_project_window.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/glade/glade/glade_project_window.c')
-rw-r--r--tools/glade/glade/glade_project_window.c2108
1 files changed, 2108 insertions, 0 deletions
diff --git a/tools/glade/glade/glade_project_window.c b/tools/glade/glade/glade_project_window.c
new file mode 100644
index 00000000..4a609fd5
--- /dev/null
+++ b/tools/glade/glade/glade_project_window.c
@@ -0,0 +1,2108 @@
+/* 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 <string.h>
+#include <locale.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtkcheckmenuitem.h>
+#include <gtk/gtkfilechooserdialog.h>
+#include <gtk/gtkhbbox.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtkimagemenuitem.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtkmenu.h>
+#include <gtk/gtkmenubar.h>
+#include <gtk/gtkscrolledwindow.h>
+#include <gtk/gtkseparatormenuitem.h>
+#include <gtk/gtkstatusbar.h>
+#include <gtk/gtkstock.h>
+#include <gtk/gtktextview.h>
+#include <gtk/gtkvbox.h>
+
+#include "gladeconfig.h"
+
+#ifdef USE_GNOME
+#include <gnome.h>
+#endif
+
+#include "glade.h"
+#include "glade_clipboard.h"
+#include "glade_palette.h"
+#include "glade_project_options.h"
+#include "glade_project_window.h"
+#include "editor.h"
+#include "gbwidget.h"
+#include "load.h"
+#include "property.h"
+#include "tree.h"
+#include "utils.h"
+
+/* This is the main project window. */
+static GladeProjectWindow *project_window;
+
+/* This is used to store a pointer to a GladeProjectWindow in the main window.
+ */
+static gchar *GladeProjectWindowKey = "GladeProjectWindowKey";
+
+/* The menuitem's to show/hide the various windows. */
+static GtkWidget *palette_item = NULL;
+static GtkWidget *property_editor_item = NULL;
+static GtkWidget *widget_tree_item = NULL;
+static GtkWidget *clipboard_item = NULL;
+
+/* stuff for opening a file when dragged into glade */
+enum
+{
+ TARGET_URI_LIST
+};
+
+static GtkTargetEntry drop_types[] =
+{
+ {"text/uri-list", 0, TARGET_URI_LIST}
+};
+
+
+static gboolean glade_project_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ GladeProjectWindow *project_window);
+static void glade_project_window_destroy (GtkWidget *widget,
+ gpointer data);
+
+static void glade_project_window_new_project (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_on_new_project_ok (GladeProjectWindow *project_window);
+static void glade_project_window_on_open_project (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_real_open_project (GtkWidget *widget,
+ gint response_id,
+ GladeProjectWindow *project_window);
+
+static void glade_project_window_drag_data_received (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y,
+ GtkSelectionData *selection_data,
+ guint info, guint time, gpointer data);
+#if 0
+static void glade_project_window_show_loading_errors (GladeProjectWindow *project_window,
+ GList *errors);
+#endif
+static GtkWidget* glade_project_window_new_errors_dialog (GladeProjectWindow *project_window,
+ GtkWidget **text_return);
+
+static void glade_project_window_on_edit_options (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_edit_options (GladeProjectWindow *project_window,
+ GladeProjectOptionsAction action);
+static void glade_project_window_save_project (GtkWidget *widget,
+ gpointer data);
+#if 0
+static void glade_project_window_on_save_project_as (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_save_project_as (GladeProjectWindow *project_window);
+static void glade_project_window_save_as_callback (GtkWidget *widget,
+ gint response_id,
+ GladeProjectWindow *project_window);
+#endif
+static gboolean glade_project_window_real_save_project (GladeProjectWindow *project_window,
+ gboolean warn_before_overwrite);
+static void glade_project_window_write_source (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_real_write_source (GladeProjectWindow *project_window);
+static void glade_project_window_show_error (GladeProjectWindow *project_window,
+ GladeError *error,
+ gchar *title);
+
+static void glade_project_window_quit (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_show_quit_dialog (GladeProjectWindow *project_window);
+
+static void glade_project_window_cut (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_copy (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_paste (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_delete (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_real_delete (GladeProjectWindow *project_window);
+
+static void glade_project_window_toggle_palette (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_toggle_property_editor (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_toggle_widget_tree (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_toggle_clipboard (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_toggle_tooltips (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_toggle_grid (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_edit_grid_settings (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_toggle_snap (GtkWidget *widget,
+ gpointer data);
+static void glade_project_window_edit_snap_settings (GtkWidget *widget,
+ gpointer data);
+
+static void glade_project_window_about (GtkWidget *widget,
+ gpointer data);
+
+static gint glade_project_window_key_press_event (GtkWidget * widget,
+ GdkEventKey * event,
+ gpointer data);
+
+static void glade_project_window_options_ok (GtkWidget *widget,
+ GladeProjectWindow *project_window);
+static void glade_project_window_update_title (GladeProjectWindow *project_window);
+
+
+
+#ifdef USE_GNOME
+static void
+glade_project_window_show_help_doc (const gchar *docname,
+ GtkWidget *transient_widget)
+{
+ GError *error = NULL;
+
+ gnome_help_display (docname, NULL, &error);
+ if (error) {
+ char *message;
+ message = g_strdup_printf (_("Couldn't show help file: %s.\n\nError: %s"),
+ docname, error->message);
+ glade_util_show_message_box (message, transient_widget);
+ g_free (message);
+ g_error_free (error);
+ }
+}
+
+
+static void
+glade_project_window_show_glade_faq (GtkWidget *menuitem,
+ gpointer data)
+{
+ glade_project_window_show_help_doc ("glade-faq", menuitem);
+}
+#endif
+
+
+/*
+ * These are the menubar and toolbar definitions for Gnome.
+ */
+#ifdef USE_GNOME
+static GnomeUIInfo FileMenu[] =
+{
+ GNOMEUIINFO_MENU_NEW_ITEM (N_("_New"), N_("Create a new project"),
+ glade_project_window_new_project, NULL),
+ GNOMEUIINFO_MENU_OPEN_ITEM (glade_project_window_on_open_project, NULL),
+ GNOMEUIINFO_MENU_SAVE_ITEM (glade_project_window_save_project, NULL),
+ /*GNOMEUIINFO_MENU_SAVE_AS_ITEM (glade_project_window_on_save_project_as,
+ NULL),*/
+ GNOMEUIINFO_SEPARATOR,
+ {
+ GNOME_APP_UI_ITEM, N_("_Build"),
+ N_("Output the project source code"),
+ glade_project_window_write_source, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GTK_STOCK_CONVERT,
+ 'B', GDK_CONTROL_MASK, NULL
+ },
+ {
+ GNOME_APP_UI_ITEM, N_("Op_tions..."),
+ N_("Edit the project options"),
+ glade_project_window_on_edit_options, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GTK_STOCK_PROPERTIES,
+ 0, 0, NULL
+ },
+ GNOMEUIINFO_SEPARATOR,
+ GNOMEUIINFO_MENU_QUIT_ITEM (glade_project_window_quit, NULL),
+ GNOMEUIINFO_END
+};
+
+static GnomeUIInfo EditMenu[] =
+{
+ GNOMEUIINFO_MENU_CUT_ITEM (glade_project_window_cut, NULL),
+ GNOMEUIINFO_MENU_COPY_ITEM (glade_project_window_copy, NULL),
+ GNOMEUIINFO_MENU_PASTE_ITEM (glade_project_window_paste, NULL),
+ { GNOME_APP_UI_ITEM, N_("_Delete"), N_("Delete the selected widget"),
+ glade_project_window_delete, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_TRASH,
+ GDK_DELETE, 0, NULL },
+ GNOMEUIINFO_END
+};
+
+
+/* These must match the indices of the appropriate items in the settings
+ GnomeUIInfo array. We need them to set the initial state. */
+#define GLADE_PALETTE_ITEM 0
+#define GLADE_PROPERTY_EDITOR_ITEM 1
+#define GLADE_WIDGET_TREE_ITEM 2
+#define GLADE_CLIPBOARD_ITEM 3
+
+static GnomeUIInfo ViewMenu[] =
+{
+ {
+ GNOME_APP_UI_TOGGLEITEM, N_("Show _Palette"), N_("Show the palette of widgets"),
+ glade_project_window_toggle_palette, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_TOGGLEITEM, N_("Show Property _Editor"),
+ N_("Show the property editor"),
+ glade_project_window_toggle_property_editor, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_TOGGLEITEM, N_("Show Widget _Tree"),
+ N_("Show the widget tree"),
+ glade_project_window_toggle_widget_tree, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_TOGGLEITEM, N_("Show _Clipboard"),
+ N_("Show the clipboard"),
+ glade_project_window_toggle_clipboard, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ GNOMEUIINFO_END
+};
+
+
+/* These must match the indices of the appropriate items in the settings
+ GnomeUIInfo array. We need them to set the initial state. */
+#define GLADE_SHOW_GRID_ITEM 0
+#define GLADE_SNAP_TO_GRID_ITEM 1
+#define GLADE_SHOW_TOOLTIPS_ITEM 2
+
+static GnomeUIInfo SettingsMenu[] =
+{
+ {
+ GNOME_APP_UI_TOGGLEITEM, N_("Show _Grid"),
+ N_("Show the grid (in fixed containers only)"),
+ glade_project_window_toggle_grid, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_TOGGLEITEM, N_("_Snap to Grid"),
+ N_("Snap widgets to the grid"),
+ glade_project_window_toggle_snap, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_TOGGLEITEM, N_("Show _Widget Tooltips"),
+ N_("Show the tooltips of created widgets"),
+ glade_project_window_toggle_tooltips, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+
+ GNOMEUIINFO_SEPARATOR,
+
+ {
+ GNOME_APP_UI_ITEM, N_("Set Grid _Options..."),
+ N_("Set the grid style and spacing"),
+ glade_project_window_edit_grid_settings, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_ITEM, N_("Set Snap O_ptions..."),
+ N_("Set options for snapping to the grid"),
+ glade_project_window_edit_snap_settings, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+ GNOMEUIINFO_END
+};
+
+static GnomeUIInfo HelpMenu[] =
+{
+ GNOMEUIINFO_HELP ("glade-user-guide"),
+ {
+ GNOME_APP_UI_ITEM, N_("_FAQ"),
+ N_("View the Glade FAQ"),
+ glade_project_window_show_glade_faq, NULL, NULL,
+ GNOME_APP_PIXMAP_NONE, NULL,
+ 0, 0, NULL
+ },
+
+ GNOMEUIINFO_SEPARATOR,
+
+ GNOMEUIINFO_MENU_ABOUT_ITEM (glade_project_window_about, NULL),
+ GNOMEUIINFO_END
+};
+
+static GnomeUIInfo MainMenu[] =
+{
+ GNOMEUIINFO_SUBTREE (N_("_Project"), FileMenu),
+ GNOMEUIINFO_MENU_EDIT_TREE (EditMenu),
+ GNOMEUIINFO_MENU_VIEW_TREE (ViewMenu),
+ GNOMEUIINFO_MENU_SETTINGS_TREE (SettingsMenu),
+ GNOMEUIINFO_MENU_HELP_TREE (HelpMenu),
+ GNOMEUIINFO_END
+};
+
+static GnomeUIInfo ToolBar[] =
+{
+ {
+ GNOME_APP_UI_ITEM, N_("New"), N_("New Project"),
+ glade_project_window_new_project, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_NEW, 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_ITEM, N_("Open"), N_("Open Project"),
+ glade_project_window_on_open_project, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_OPEN, 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_ITEM, N_("Save"), N_("Save Project"),
+ glade_project_window_save_project, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_SAVE, 0, 0, NULL
+ },
+ GNOMEUIINFO_SEPARATOR,
+ {
+ GNOME_APP_UI_ITEM, N_("Options"), N_("Project Options"),
+ glade_project_window_on_edit_options, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GTK_STOCK_PROPERTIES, 0, 0, NULL
+ },
+ {
+ GNOME_APP_UI_ITEM, N_("Build"), N_("Build the Source Code"),
+ glade_project_window_write_source, NULL, NULL,
+ GNOME_APP_PIXMAP_STOCK, GTK_STOCK_CONVERT, 0, 0, NULL
+ },
+ GNOMEUIINFO_END
+};
+#endif
+
+
+#ifdef USE_GNOME
+GladeProjectWindow*
+glade_project_window_new (void)
+{
+ GtkWidget *scrolled_win;
+ GtkWidget *show_grid_item, *snap_to_grid_item, *show_tooltips_item;
+
+ project_window = g_new (GladeProjectWindow, 1);
+ project_window->current_directory = NULL;
+
+ project_window->window = gnome_app_new ("Glade", "Glade");
+ gtk_widget_set_name (project_window->window, "GladeProjectWindow");
+ gtk_window_set_wmclass (GTK_WINDOW (project_window->window),
+ "project", "Glade");
+
+ /* We want all the keyboard accelerators from the menus to work anywhere in
+ the Glade GUI, including windows being designed. So we add the accel
+ group to every window. */
+ GNOME_APP (project_window->window)->accel_group = glade_get_global_accel_group ();
+ gtk_window_add_accel_group (GTK_WINDOW (project_window->window),
+ glade_get_global_accel_group ());
+
+ /* Save a pointer to the GladeProjectWindow, so we can find it in callbacks.
+ */
+ gtk_object_set_data (GTK_OBJECT (project_window->window),
+ GladeProjectWindowKey, project_window);
+
+ gtk_window_move (GTK_WINDOW (project_window->window), 0, 0);
+
+ gtk_signal_connect (GTK_OBJECT (project_window->window), "destroy",
+ GTK_SIGNAL_FUNC (glade_project_window_destroy), NULL);
+ gtk_signal_connect (GTK_OBJECT (project_window->window), "delete_event",
+ GTK_SIGNAL_FUNC (glade_project_window_delete_event),
+ project_window);
+ gtk_signal_connect_after (GTK_OBJECT (project_window->window),
+ "key_press_event",
+ GTK_SIGNAL_FUNC (glade_project_window_key_press_event),
+ NULL);
+
+ /* support for opening a file by dragging onto the project window */
+ gtk_drag_dest_set (project_window->window,
+ GTK_DEST_DEFAULT_ALL,
+ drop_types, G_N_ELEMENTS (drop_types),
+ GDK_ACTION_COPY | GDK_ACTION_MOVE);
+
+ g_signal_connect (G_OBJECT (project_window->window), "drag-data-received",
+ G_CALLBACK (glade_project_window_drag_data_received), NULL);
+
+ gnome_app_create_menus (GNOME_APP (project_window->window), MainMenu);
+
+ /* Set the states of the toggle items. */
+ palette_item = ViewMenu[GLADE_PALETTE_ITEM].widget;
+ property_editor_item = ViewMenu[GLADE_PROPERTY_EDITOR_ITEM].widget;
+ widget_tree_item = ViewMenu[GLADE_WIDGET_TREE_ITEM].widget;
+ clipboard_item = ViewMenu[GLADE_CLIPBOARD_ITEM].widget;
+
+ show_grid_item = SettingsMenu[GLADE_SHOW_GRID_ITEM].widget;
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_grid_item),
+ editor_get_show_grid ());
+
+ snap_to_grid_item = SettingsMenu[GLADE_SNAP_TO_GRID_ITEM].widget;
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (snap_to_grid_item),
+ editor_get_snap_to_grid ());
+
+ show_tooltips_item = SettingsMenu[GLADE_SHOW_TOOLTIPS_ITEM].widget;
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_tooltips_item),
+ gb_widget_get_show_tooltips ());
+
+
+ gnome_app_create_toolbar (GNOME_APP (project_window->window), ToolBar);
+
+ /* Create list of components */
+ project_window->project_view = glade_project_view_new ();
+ gtk_widget_show (project_window->project_view);
+
+ scrolled_win = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (scrolled_win),
+ project_window->project_view);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_widget_show(scrolled_win);
+
+ gnome_app_set_contents (GNOME_APP (project_window->window), scrolled_win);
+
+ /* Create status bar. */
+ project_window->statusbar = gtk_statusbar_new ();
+ gnome_app_set_statusbar (GNOME_APP (project_window->window),
+ project_window->statusbar);
+ gnome_app_install_statusbar_menu_hints (GTK_STATUSBAR (project_window->statusbar), MainMenu);
+
+ return project_window;
+}
+
+#else
+
+#if 0
+static GtkItemFactoryEntry menu_items[] =
+{
+ { "/_File", NULL,
+ 0, 0, "<Branch>" },
+ { "/File/tearoff1", NULL,
+ 0, 0, "<Tearoff>" },
+ { "/File/_New Project", NULL,
+ glade_project_window_new_project, 0, "<StockItem>", GTK_STOCK_NEW },
+ { "/File/_Open", NULL,
+ glade_project_window_on_open_project, 0, "<StockItem>", GTK_STOCK_OPEN },
+ { "/File/_Save", NULL,
+ glade_project_window_save_project, 0, "<StockItem>", GTK_STOCK_SAVE },
+ { "/File/sep1", NULL,
+ 0, 0, "<Separator>" },
+ { "/File/_Build Source Code", NULL,
+ glade_project_window_write_source, 0, "<StockItem>", GTK_STOCK_CONVERT },
+ { "/File/_Project Options", NULL,
+ glade_project_window_on_edit_options, 0, "<StockItem>", GTK_STOCK_PROPERTIES },
+ { "/File/_Quit", NULL,
+ glade_project_window_quit, 0, "<StockItem>", GTK_STOCK_QUIT },
+
+ { "/_Edit", NULL,
+ 0, 0, "<Branch>" },
+
+ { "/_View", NULL,
+ 0, 0, "<Branch>" },
+
+ { "/_Help", NULL,
+ 0, 0, "<LastBranch>" },
+ { "/Help/_About", NULL,
+ glade_project_window_about, 0 },
+};
+
+static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
+#endif
+
+static void
+add_stock_menu_item (GtkMenu *menu, gchar *stock_id, gchar *label,
+ GtkSignalFunc callback, GtkAccelGroup *accel_group,
+ GtkTooltips *tooltips, gchar *tip)
+{
+ GtkWidget *menuitem;
+
+ menuitem = gtk_image_menu_item_new_from_stock (stock_id, accel_group);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+
+ if (label)
+ gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_BIN (menuitem)->child),
+ label);
+
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate", callback, NULL);
+
+ gtk_tooltips_set_tip (tooltips, menuitem, tip, NULL);
+ gtk_widget_show (menuitem);
+}
+
+
+GladeProjectWindow*
+glade_project_window_new (void)
+{
+ GtkTooltips *tooltips;
+
+ GtkWidget *menubar;
+ GtkWidget *menu;
+ GtkWidget *menuitem;
+ GtkWidget *image;
+ GtkWidget *toolbar;
+ GdkColormap *colormap;
+ GtkAccelGroup *accel_group;
+ GtkWidget *scrolled_win;
+ GtkWidget *vbox_main;
+ GtkIconSize icon_size;
+ GtkToolbarChild *toolbar_child;
+ GList *elem;
+
+ project_window = g_new (GladeProjectWindow, 1);
+ project_window->current_directory = NULL;
+
+ project_window->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_name (project_window->window, "GladeProjectWindow");
+ gtk_window_set_title (GTK_WINDOW (project_window->window), "Glade");
+ gtk_window_set_wmclass (GTK_WINDOW (project_window->window),
+ "project", "Glade");
+
+ /* Save a pointer to the GladeProjectWindow, so we can find it in callbacks.
+ */
+ gtk_object_set_data (GTK_OBJECT (project_window->window),
+ GladeProjectWindowKey, project_window);
+
+ gtk_window_move (GTK_WINDOW (project_window->window), 0, 0);
+
+ gtk_signal_connect (GTK_OBJECT (project_window->window), "destroy",
+ GTK_SIGNAL_FUNC (glade_project_window_destroy), NULL);
+ gtk_signal_connect (GTK_OBJECT (project_window->window), "delete_event",
+ GTK_SIGNAL_FUNC (glade_project_window_delete_event),
+ project_window);
+ gtk_signal_connect_after (GTK_OBJECT (project_window->window),
+ "key_press_event",
+ GTK_SIGNAL_FUNC (glade_project_window_key_press_event),
+ NULL);
+
+ tooltips = gtk_tooltips_new ();
+
+ vbox_main = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (project_window->window), vbox_main);
+ gtk_widget_show (vbox_main);
+
+ /* Create accelerator table */
+ accel_group = glade_get_global_accel_group ();
+ gtk_window_add_accel_group (GTK_WINDOW (project_window->window),
+ accel_group);
+
+#if 0
+ /* Create the menubar items, using the factory. */
+ item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
+ accel_group);
+ gtk_object_set_data_full (GTK_OBJECT (project_window->window), "<main>",
+ item_factory, (GtkDestroyNotify) gtk_object_unref);
+ gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
+ gtk_box_pack_start (GTK_BOX (vbox_main),
+ gtk_item_factory_get_widget (item_factory, "<main>"),
+ FALSE, FALSE, 0);
+ gtk_widget_show_all (vbox_main);
+#endif
+
+ /* create menu bar */
+ menubar = gtk_menu_bar_new ();
+ gtk_box_pack_start (GTK_BOX (vbox_main), menubar, FALSE, TRUE, 0);
+ gtk_widget_show (menubar);
+
+ /* create File menu */
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Project"));
+ gtk_container_add (GTK_CONTAINER (menubar), menuitem);
+ gtk_widget_show (menuitem);
+
+ menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_NEW, _("_New"),
+ GTK_SIGNAL_FUNC (glade_project_window_new_project),
+ accel_group, tooltips, _("Create a new project"));
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_OPEN, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_on_open_project),
+ accel_group, tooltips, _("Open an existing project"));
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_SAVE, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_save_project),
+ accel_group, tooltips, _("Save project"));
+
+ /*
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_SAVE_AS, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_save_project_as),
+ accel_group, tooltips, _("Save project to a new file"));
+ */
+
+ menuitem = gtk_separator_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Build"));
+ image = gtk_image_new_from_stock (GTK_STOCK_CONVERT, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
+ gtk_widget_show (image);
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_write_source),
+ NULL);
+ gtk_widget_add_accelerator (menuitem, "activate", accel_group,
+ 'B', GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Output the project source code"), NULL);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_image_menu_item_new_with_mnemonic (_("Op_tions..."));
+ image = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
+ gtk_widget_show (image);
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_on_edit_options),
+ NULL);
+
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem, _("Edit the project options"),
+ NULL);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_separator_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_widget_show (menuitem);
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_QUIT, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_quit),
+ accel_group, tooltips, _("Quit Glade"));
+
+
+ /* Create Edit menu */
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Edit"));
+ gtk_container_add (GTK_CONTAINER (menubar), menuitem);
+ gtk_widget_show (menuitem);
+
+ menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_CUT, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_cut),
+ accel_group, tooltips,
+ _("Cut the selected widget to the clipboard"));
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_COPY, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_copy),
+ accel_group, tooltips,
+ _("Copy the selected widget to the clipboard"));
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_PASTE, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_paste),
+ accel_group, tooltips,
+ _("Paste the widget from the clipboard over the selected widget"));
+
+ add_stock_menu_item (GTK_MENU (menu), GTK_STOCK_DELETE, NULL,
+ GTK_SIGNAL_FUNC (glade_project_window_delete),
+ accel_group, tooltips,
+ _("Delete the selected widget"));
+
+
+ /* Create View menu */
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_View"));
+ gtk_container_add (GTK_CONTAINER (menubar), menuitem);
+ gtk_widget_show (menuitem);
+
+ menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
+
+ menuitem = gtk_check_menu_item_new_with_mnemonic (_("Show _Palette"));
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_toggle_palette),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem, _("Show the palette of widgets"),
+ NULL);
+ palette_item = menuitem;
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_check_menu_item_new_with_mnemonic (_("Show Property _Editor"));
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_toggle_property_editor),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Show the property editor"), NULL);
+ property_editor_item = menuitem;
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_check_menu_item_new_with_mnemonic (_("Show Widget _Tree"));
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_toggle_widget_tree),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Show the widget tree"), NULL);
+ widget_tree_item = menuitem;
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_check_menu_item_new_with_mnemonic (_("Show _Clipboard"));
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_toggle_clipboard),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Show the clipboard"), NULL);
+ clipboard_item = menuitem;
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_separator_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_check_menu_item_new_with_mnemonic (_("Show _Widget Tooltips"));
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
+ gb_widget_get_show_tooltips ());
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_toggle_tooltips),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Show the tooltips of created widgets"), NULL);
+ gtk_widget_show (menuitem);
+
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Grid"));
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_widget_show (menuitem);
+
+ /* Create Grid submenu */
+ menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
+
+ menuitem = gtk_check_menu_item_new_with_mnemonic (_("_Show Grid"));
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
+ editor_get_show_grid ());
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_toggle_grid),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Show the grid (in fixed containers only)"), NULL);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("Set Grid _Options..."));
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_edit_grid_settings),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Set the spacing between grid lines"), NULL);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_check_menu_item_new_with_mnemonic (_("S_nap to Grid"));
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
+ editor_get_snap_to_grid ());
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_toggle_snap),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Snap widgets to the grid (in fixed containers only)"),
+ NULL);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("Set Snap O_ptions..."));
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_edit_snap_settings),
+ NULL);
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_tooltips_set_tip (tooltips, menuitem,
+ _("Set which parts of a widget snap to the grid"), NULL);
+ gtk_widget_show (menuitem);
+
+ /* Create Help menu */
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Help"));
+ gtk_container_add (GTK_CONTAINER (menubar), menuitem);
+ gtk_widget_show (menuitem);
+
+ menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
+
+ /* Don't show these yet as we have no help pages.
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Contents"));
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_Index"));
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_widget_show (menuitem);
+ */
+
+ menuitem = gtk_menu_item_new_with_mnemonic (_("_About..."));
+ gtk_container_add (GTK_CONTAINER (menu), menuitem);
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (glade_project_window_about),
+ NULL);
+ gtk_widget_show (menuitem);
+
+ /* Create toolbar */
+ toolbar = gtk_toolbar_new ();
+ /*gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_HALF);*/
+ gtk_box_pack_start (GTK_BOX (vbox_main), toolbar, FALSE, TRUE, 0);
+ gtk_widget_show (toolbar);
+
+ colormap = gtk_widget_get_colormap (toolbar);
+
+ /* I've taken this out to try to make the window smaller. */
+#if 0
+ gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_NEW,
+ _("New Project"), "",
+ GTK_SIGNAL_FUNC (glade_project_window_new_project),
+ NULL, -1);
+#endif
+ gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_OPEN,
+ _("Open Project"), "",
+ GTK_SIGNAL_FUNC (glade_project_window_on_open_project),
+ NULL, -1);
+ gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_SAVE,
+ _("Save Project"), "",
+ GTK_SIGNAL_FUNC (glade_project_window_save_project),
+ NULL, -1);
+ gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
+
+ icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar));
+ image = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, icon_size);
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "",
+ _("Project Options"), "", image,
+ GTK_SIGNAL_FUNC (glade_project_window_on_edit_options),
+ NULL);
+ elem = g_list_last (GTK_TOOLBAR (toolbar)->children);
+ toolbar_child = elem->data;
+ gtk_label_set_text_with_mnemonic (GTK_LABEL (toolbar_child->label),
+ _("Optio_ns"));
+
+ image = gtk_image_new_from_stock (GTK_STOCK_CONVERT, icon_size);
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "",
+ _("Write Source Code"), "", image,
+ GTK_SIGNAL_FUNC (glade_project_window_write_source),
+ NULL);
+ elem = g_list_last (GTK_TOOLBAR (toolbar)->children);
+ toolbar_child = elem->data;
+ gtk_label_set_text_with_mnemonic (GTK_LABEL (toolbar_child->label),
+ _("_Build"));
+
+ /* Create list of components */
+ project_window->project_view = glade_project_view_new ();
+ gtk_widget_show (project_window->project_view);
+
+ scrolled_win = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (scrolled_win),
+ project_window->project_view);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_widget_show(scrolled_win);
+ gtk_box_pack_start (GTK_BOX (vbox_main), scrolled_win, TRUE, TRUE, 0);
+
+ /* Create status bar. */
+ project_window->statusbar = gtk_statusbar_new ();
+ gtk_box_pack_start (GTK_BOX (vbox_main), project_window->statusbar,
+ FALSE, FALSE, 0);
+ gtk_widget_show (project_window->statusbar);
+
+ return project_window;
+}
+#endif
+
+
+/* This returns the GladeProjectWindow given any widget in the window,
+ e.g. a menuitem or a toolbar item, or NULL if not found. */
+static GladeProjectWindow*
+get_glade_project_window (GtkWidget *widget)
+{
+ /* We just use a global now. */
+ return project_window;
+
+#if 0
+ return (gtk_object_get_data (GTK_OBJECT (glade_util_get_toplevel (widget)),
+ GladeProjectWindowKey));
+#endif
+}
+
+
+static gboolean
+glade_project_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ GladeProjectWindow *project_window)
+{
+ glade_project_window_show_quit_dialog (project_window);
+ return TRUE;
+}
+
+
+static void
+glade_project_window_destroy (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ gtk_widget_destroy (project_window->window);
+ g_free (project_window->current_directory);
+ g_free (project_window);
+
+ gtk_exit (0);
+}
+
+
+static void
+glade_project_window_new_project (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+ GtkWidget *dialog, *label;
+ gint response;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ /* If we don't currently have a project, there's no point in prompting for
+ confirmation. */
+ if (current_project == NULL)
+ {
+ glade_project_window_on_new_project_ok (project_window);
+ return;
+ }
+
+ dialog = gtk_dialog_new_with_buttons (_("Glade"),
+ GTK_WINDOW (project_window->window),
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ label = gtk_label_new (_("Are you sure you want to create a new project?"));
+ gtk_misc_set_padding (GTK_MISC (label), 20, 20);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label,
+ TRUE, TRUE, 0);
+ gtk_widget_show (label);
+
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_wmclass (GTK_WINDOW (dialog), "new_project", "Glade");
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ if (response == GTK_RESPONSE_OK)
+ glade_project_window_on_new_project_ok (project_window);
+}
+
+
+/* This sets the palette sensitive if a project is open or insensitive if
+ not, and shows/hides the GNOME widgets as appropriate. */
+static void
+glade_project_window_setup_interface (GladeProjectWindow *project_window)
+{
+ gboolean gnome_support = TRUE;
+ gboolean gnome_db_support = TRUE;
+
+ /* Make sure the arrow is selected in the palette. */
+ glade_palette_reset_selection (GLADE_PALETTE (glade_palette), FALSE);
+
+ if (current_project)
+ {
+ gnome_support = glade_project_get_gnome_support (current_project);
+ gnome_db_support = glade_project_get_gnome_db_support (current_project);
+ }
+
+ glade_palette_set_show_gnome_widgets (GLADE_PALETTE (glade_palette),
+ gnome_support, gnome_db_support);
+
+ gtk_widget_set_sensitive (GTK_BIN (glade_palette)->child,
+ current_project ? TRUE : FALSE);
+}
+
+
+static void
+glade_project_window_on_new_project_ok (GladeProjectWindow *project_window)
+{
+ GladeProject *project;
+
+ /* In the GNOME version we need to ask the user to specify whether they
+ want a GTK+ or GNOME project. The menu stock systems are different. */
+#ifdef USE_GNOME
+#define RESPONSE_GNOME 1
+#define RESPONSE_GTK 2
+
+ GtkWidget *dialog, *label;
+ gint response;
+
+ dialog = gtk_dialog_new_with_buttons (_("New Project"),
+ GTK_WINDOW (project_window->window),
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ _("New _GTK+ Project"), RESPONSE_GTK,
+ _("New G_NOME Project"), RESPONSE_GNOME,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), RESPONSE_GNOME);
+ label = gtk_label_new (_("Which type of project do you want to create?"));
+ gtk_misc_set_padding (GTK_MISC (label), 20, 20);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label,
+ TRUE, TRUE, 0);
+ gtk_widget_show (label);
+
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_wmclass (GTK_WINDOW (dialog), "new_project_type", "Glade");
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+ gtk_widget_destroy (dialog);
+
+ if (response == GTK_RESPONSE_CANCEL)
+ return;
+
+ project = glade_project_new ();
+
+ /* In the GNOME version, gnome_support defaults to TRUE, so we turn it off
+ if the user requested a GTK+ project. */
+ if (response == RESPONSE_GTK)
+ glade_project_set_gnome_support (project, FALSE);
+
+#else
+
+ project = glade_project_new ();
+
+#endif
+
+ glade_project_view_set_project (GLADE_PROJECT_VIEW (project_window->project_view), project);
+ glade_project_window_update_title (project_window);
+
+ gtk_statusbar_pop (GTK_STATUSBAR (project_window->statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (project_window->statusbar), 1,
+ _("New project created."));
+
+ /* Make sure the palette is sensitive now and shows the appropriate
+ widgets. */
+ glade_project_window_setup_interface (project_window);
+}
+
+
+static void
+glade_project_window_on_open_project (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+ GtkWidget *filesel;
+ GtkFileFilter *filter;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ filesel = gtk_file_chooser_dialog_new (_("Open Project"),
+ GTK_WINDOW (project_window->window),
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_OK);
+ gtk_window_set_position (GTK_WINDOW (filesel), GTK_WIN_POS_MOUSE);
+
+ g_signal_connect (filesel, "response",
+ GTK_SIGNAL_FUNC (glade_project_window_real_open_project),
+ project_window);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, "Glade Files");
+ gtk_file_filter_add_pattern (filter, "*.glade");
+ gtk_file_filter_add_pattern (filter, "*.glade2");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (filesel), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, "All Files");
+ gtk_file_filter_add_pattern (filter, "*");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (filesel), filter);
+
+ if (project_window->current_directory)
+ glade_util_set_file_selection_filename (filesel, project_window->current_directory);
+
+ gtk_widget_show (filesel);
+}
+
+
+static void
+glade_project_window_real_open_project (GtkWidget *filesel,
+ gint response_id,
+ GladeProjectWindow *project_window)
+{
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ gchar *filename = glade_util_get_file_selection_filename (filesel);
+ if (filename)
+ glade_project_window_open_project (project_window, filename);
+ g_free (filename);
+ }
+ gtk_widget_destroy (filesel);
+}
+
+
+void
+glade_project_window_open_project (GladeProjectWindow *project_window,
+ const gchar *filename)
+{
+ GladeProject *project;
+ gboolean status;
+
+ /* Clear the project view. Otherwise we may show an invalid project for
+ a while. */
+ glade_project_view_set_project (GLADE_PROJECT_VIEW (project_window->project_view), NULL);
+
+ if (filename)
+ {
+ g_free (project_window->current_directory);
+ project_window->current_directory = glade_util_dirname (filename);
+ }
+
+ status = glade_project_open (filename, &project);
+
+ gtk_statusbar_pop (GTK_STATUSBAR (project_window->statusbar), 1);
+ if (status)
+ {
+ glade_project_view_set_project (GLADE_PROJECT_VIEW (project_window->project_view), project);
+ gtk_statusbar_push (GTK_STATUSBAR (project_window->statusbar), 1,
+ _("Project opened."));
+ }
+ else
+ {
+ /* For GNOME we set the current project to NULL - we can't create a new
+ project without asking if it is for GNOMR or GTK+. For GTK+ we can
+ create a new empty GTK+ project. */
+#ifdef USE_GNOME
+ project = NULL;
+#else
+ project = glade_project_new ();
+#endif
+ glade_project_view_set_project (GLADE_PROJECT_VIEW (project_window->project_view), project);
+ gtk_statusbar_push (GTK_STATUSBAR (project_window->statusbar), 1,
+ _("Error opening project."));
+ }
+
+ /* Make sure the palette is sensitive if needed and show the appropriate
+ widgets. */
+ glade_project_window_setup_interface (project_window);
+
+ glade_project_window_update_title (project_window);
+}
+
+
+static void
+glade_project_window_drag_data_received (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y,
+ GtkSelectionData *selection_data,
+ guint info, guint time, gpointer data)
+{
+ GladeProjectWindow *project_window;
+ gchar *uri_list;
+ GList *list = NULL;
+
+ if (info != TARGET_URI_LIST)
+ return;
+
+ /*
+ * Mmh... it looks like on Windows selection_data->data is not
+ * NULL terminated, so we need to make sure our local copy is.
+ */
+ uri_list = g_new (gchar, selection_data->length + 1);
+ memcpy (uri_list, selection_data->data, selection_data->length);
+ uri_list[selection_data->length] = 0;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ /* For now, if more than a file is dragged into glade we actually
+ * only try the first one... we can open only one anyway.
+ */
+ list = glade_util_uri_list_parse (uri_list);
+ if (list->data)
+ glade_project_window_open_project (project_window, list->data);
+
+ /* we can now free each string in the list */
+ g_list_foreach (list, (GFunc) g_free, NULL);
+ g_list_free (list);
+}
+
+
+/* This shows the errors in a dialog, and frees them. */
+/* Currently unused, since we switched to using libxml. */
+#if 0
+static void
+glade_project_window_show_loading_errors (GladeProjectWindow *project_window,
+ GList *errors)
+{
+ GtkWidget *dialog, *text;
+ GtkTextBuffer *buffer;
+ GList *element;
+ gchar *message, buf[16];
+
+ dialog = glade_project_window_new_errors_dialog (project_window, &text);
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Errors opening project file"));
+ gtk_window_set_wmclass (GTK_WINDOW (dialog), "error", "Glade");
+
+ sprintf (buf, "\n%i", g_list_length (errors));
+ gtk_text_buffer_insert_at_cursor (buffer, buf, -1);
+
+ message = _(" errors opening project file:");
+ gtk_text_buffer_insert_at_cursor (buffer, message, -1);
+ gtk_text_buffer_insert_at_cursor (buffer, "\n\n", 2);
+
+ element = errors;
+ while (element)
+ {
+ message = (gchar*) element->data;
+ gtk_text_buffer_insert_at_cursor (buffer, message, -1);
+ g_free (message);
+ element = element->next;
+ }
+ g_list_free (errors);
+
+ gtk_widget_show (dialog);
+}
+#endif
+
+
+static GtkWidget*
+glade_project_window_new_errors_dialog (GladeProjectWindow *project_window,
+ GtkWidget **text_return)
+{
+ GtkWidget *dialog, *vbox, *text, *hbbox, *ok_button, *scrolled_win;
+
+ dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 2);
+
+ vbox = gtk_vbox_new (FALSE, 4);
+ gtk_widget_show (vbox);
+ gtk_container_add (GTK_CONTAINER (dialog), vbox);
+
+ text = gtk_text_view_new ();
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (text), FALSE);
+ gtk_widget_show (text);
+ gtk_widget_set_usize (text, 400, 150);
+ GTK_WIDGET_UNSET_FLAGS (text, GTK_CAN_FOCUS);
+
+ scrolled_win = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (scrolled_win), text);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
+ gtk_widget_show(scrolled_win);
+
+ hbbox = gtk_hbutton_box_new ();
+ gtk_widget_show (hbbox);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (hbbox), GTK_BUTTONBOX_END);
+ gtk_box_pack_start (GTK_BOX (vbox), hbbox, FALSE, TRUE, 0);
+
+ ok_button = gtk_button_new_with_label (_("OK"));
+ gtk_widget_show (ok_button);
+ GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
+ gtk_container_add (GTK_CONTAINER (hbbox), ok_button);
+ gtk_widget_grab_default (ok_button);
+ gtk_signal_connect_object (GTK_OBJECT (ok_button), "clicked",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy),
+ GTK_OBJECT (dialog));
+ gtk_signal_connect (GTK_OBJECT (dialog), "key_press_event",
+ GTK_SIGNAL_FUNC (glade_util_check_key_is_esc),
+ GINT_TO_POINTER (GladeEscDestroys));
+
+ *text_return = text;
+ return dialog;
+}
+
+
+/* This shows a warning dialog when the user tries to use a command like
+ Save/Options/Build when we currently have no project. */
+static void
+glade_project_window_show_no_project_warning (GladeProjectWindow *project_window)
+{
+ glade_util_show_message_box (_("There is no project currently open.\n"
+ "Create a new project with the Project/New command."),
+ project_window->window);
+}
+
+
+static void
+glade_project_window_on_edit_options (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ glade_project_window_edit_options (project_window,
+ GLADE_PROJECT_OPTIONS_ACTION_NORMAL);
+}
+
+
+/* The action specifies what to do when 'OK' is clicked. It can be NULL, to
+ simply update the options, or 'Save' or 'Build' to save the XML file, or
+ build the source code. */
+static void
+glade_project_window_edit_options (GladeProjectWindow *project_window,
+ GladeProjectOptionsAction action)
+{
+ GladeProject *project;
+ GtkWidget *options;
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ if (project)
+ {
+ options = glade_project_options_new (project);
+ gtk_signal_connect (GTK_OBJECT (GLADE_PROJECT_OPTIONS (options)->ok_button),
+ "clicked",
+ GTK_SIGNAL_FUNC (glade_project_window_options_ok),
+ project_window);
+ if (action)
+ glade_project_options_set_action (GLADE_PROJECT_OPTIONS (options),
+ action);
+ if (GTK_IS_WINDOW (project_window->window))
+ gtk_window_set_transient_for (GTK_WINDOW (options),
+ GTK_WINDOW (project_window->window));
+
+ gtk_widget_show (options);
+ }
+ else
+ {
+ glade_project_window_show_no_project_warning (project_window);
+ }
+}
+
+
+static void
+glade_project_window_options_ok (GtkWidget *widget,
+ GladeProjectWindow *project_window)
+{
+ GladeProjectOptions *options;
+ GladeProjectOptionsAction action;
+ gboolean saved;
+
+ options = GLADE_PROJECT_OPTIONS (gtk_widget_get_toplevel (widget));
+ action = options->action;
+
+ glade_project_window_update_title (project_window);
+ glade_project_window_setup_interface (project_window);
+
+ gtk_widget_destroy (GTK_WIDGET (options));
+
+ switch (action)
+ {
+ case GLADE_PROJECT_OPTIONS_ACTION_NORMAL:
+ /* Don't need to do anything here. */
+ break;
+ case GLADE_PROJECT_OPTIONS_ACTION_SAVE:
+ glade_project_window_real_save_project (project_window, FALSE);
+ break;
+ case GLADE_PROJECT_OPTIONS_ACTION_BUILD:
+ saved = glade_project_window_real_save_project (project_window, FALSE);
+ if (saved)
+ glade_project_window_real_write_source (project_window);
+ break;
+ }
+}
+
+
+static void
+glade_project_window_save_project (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+ GladeProject *project;
+ gchar *xml_filename = NULL;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ if (project)
+ {
+ xml_filename = glade_project_get_xml_filename (project);
+
+ /* If the XML filename isn't set, show the project options dialog,
+ and tell it we are saving. */
+ if (xml_filename == NULL || xml_filename[0] == '\0')
+ glade_project_window_edit_options (project_window,
+ GLADE_PROJECT_OPTIONS_ACTION_SAVE);
+ else
+ glade_project_window_real_save_project (project_window, FALSE);
+ }
+ else
+ {
+ glade_project_window_show_no_project_warning (project_window);
+ }
+}
+
+
+#if 0
+static void
+glade_project_window_on_save_project_as (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ glade_project_window_save_project_as (project_window);
+}
+
+
+static void
+glade_project_window_save_project_as (GladeProjectWindow *project_window)
+{
+ GtkWidget *filesel;
+
+ filesel = gtk_file_chooser_dialog_new (_("Save Project"),
+ GTK_WINDOW (project_window->window),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_OK);
+ gtk_window_set_position (GTK_WINDOW (filesel), GTK_WIN_POS_MOUSE);
+
+ g_signal_connect (options->filesel, "response",
+ GTK_SIGNAL_FUNC (glade_project_window_save_as_callback),
+ project_window);
+
+ if (project_window->current_directory)
+ glade_util_set_file_selection_filename (filesel, project_window->current_directory);
+
+ gtk_widget_show (filesel);
+}
+
+
+static void
+glade_project_window_save_as_callback (GtkWidget *filesel,
+ gint response_id,
+ GladeProjectWindow *project_window)
+{
+ GladeProject *project;
+ gchar *filename;
+
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ filename = glade_util_get_file_selection_filename (filesel);
+
+ g_free (project_window->current_directory);
+ project_window->current_directory = glade_util_dirname (filename);
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ if (project)
+ {
+ glade_project_set_xml_filename (project, filename);
+ glade_project_window_real_save_project (project_window, TRUE);
+ }
+ g_free (filename);
+ }
+
+ gtk_widget_destroy (filesel);
+}
+#endif
+
+
+/* Returns TRUE if the XML file is saved OK.
+ FIXME: Doesn't use warn_before_overwrite. */
+static gboolean
+glade_project_window_real_save_project (GladeProjectWindow *project_window,
+ gboolean warn_before_overwrite)
+{
+ GladeProject *project;
+ GladeError *error;
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ g_return_val_if_fail (project != NULL, GLADE_STATUS_ERROR);
+
+ error = glade_project_save (project);
+
+ gtk_statusbar_pop (GTK_STATUSBAR (project_window->statusbar), 1);
+ if (error)
+ {
+ glade_project_window_show_error (project_window, error,
+ _("Error saving project"));
+ gtk_statusbar_push (GTK_STATUSBAR (project_window->statusbar), 1,
+ _("Error saving project."));
+ glade_error_free (error);
+ return FALSE;
+ }
+ else
+ gtk_statusbar_push (GTK_STATUSBAR (project_window->statusbar), 1,
+ _("Project saved."));
+ return TRUE;
+}
+
+
+static void
+glade_project_window_write_source (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+ GladeProject *project;
+ gchar *directory, *xml_filename, *project_name, *program_name;
+ gchar *source_directory, *pixmaps_directory;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ if (!project)
+ {
+ glade_project_window_show_no_project_warning (project_window);
+ return;
+ }
+
+ /* First we need to make sure we have an XML file, a project name, and a
+ program name. */
+ directory = glade_project_get_directory (project);
+ xml_filename = glade_project_get_xml_filename (project);
+ project_name = glade_project_get_name (project);
+ program_name = glade_project_get_program_name (project);
+ source_directory = glade_project_get_source_directory (project);
+ pixmaps_directory = glade_project_get_pixmaps_directory (project);
+
+ /* First check we have all the options we need. If not show the project
+ options dialog, and tell it we are building the source. */
+ if (directory == NULL || directory[0] == '\0'
+ || xml_filename == NULL || xml_filename[0] == '\0'
+ || project_name == NULL || project_name[0] == '\0'
+ || program_name == NULL || program_name[0] == '\0'
+ || source_directory == NULL || source_directory[0] == '\0'
+ || pixmaps_directory == NULL || pixmaps_directory[0] == '\0')
+ {
+ glade_project_window_edit_options (project_window,
+ GLADE_PROJECT_OPTIONS_ACTION_BUILD);
+ return;
+ }
+
+ /* If there is an error saving the XML file we simply return. The user
+ will already have been informed of the error. */
+ if (!glade_project_window_real_save_project (project_window, FALSE))
+ return;
+ glade_project_window_real_write_source (project_window);
+}
+
+
+static void
+glade_project_window_real_write_source (GladeProjectWindow *project_window)
+{
+ GladeProject *project;
+ GladeError *error;
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ g_return_if_fail (project != NULL);
+
+ error = glade_project_write_source (project);
+
+ gtk_statusbar_pop (GTK_STATUSBAR (project_window->statusbar), 1);
+ if (error)
+ {
+ glade_project_window_show_error (project_window, error,
+ _("Errors writing source code"));
+ gtk_statusbar_push (GTK_STATUSBAR (project_window->statusbar), 1,
+ _("Error writing source."));
+ glade_error_free (error);
+ return;
+ }
+
+ gtk_statusbar_push (GTK_STATUSBAR (project_window->statusbar), 1,
+ _("Source code written."));
+}
+
+
+/* This shows a single GladeError in a dialog. */
+static void
+glade_project_window_show_error (GladeProjectWindow *project_window,
+ GladeError *error,
+ gchar *title)
+{
+ GtkWidget *dialog, *text;
+ GtkTextBuffer *buffer;
+ gchar *message;
+
+ dialog = glade_project_window_new_errors_dialog (project_window, &text);
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+ gtk_window_set_wmclass (GTK_WINDOW (dialog), "error", "Glade");
+ if (GTK_IS_WINDOW (project_window->window))
+ gtk_window_set_transient_for (GTK_WINDOW (dialog),
+ GTK_WINDOW (project_window->window));
+
+ gtk_text_buffer_insert_at_cursor (buffer, error->message, -1);
+
+ /* For system errors, we also output the system error message. */
+ if (error->status == GLADE_STATUS_SYSTEM_ERROR)
+ {
+ /* Insert a blank line between our message and the system message. */
+ gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
+
+ message = _("System error message:");
+ gtk_text_buffer_insert_at_cursor (buffer, message, -1);
+
+ /* Place the system error message on the next line, indented slightly. */
+ gtk_text_buffer_insert_at_cursor (buffer, "\n ", -1);
+
+ message = (char*) g_strerror (error->system_errno);
+ gtk_text_buffer_insert_at_cursor (buffer, message, -1);
+ }
+
+ gtk_widget_show (dialog);
+}
+
+
+static void
+glade_project_window_quit (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ glade_project_window_show_quit_dialog (project_window);
+}
+
+
+static void
+glade_project_window_show_quit_dialog (GladeProjectWindow *project_window)
+{
+ GtkWidget *dialog, *label;
+
+ dialog = gtk_dialog_new_with_buttons (_("Glade"),
+ GTK_WINDOW (project_window->window),
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_QUIT, GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ label = gtk_label_new (_("Are you sure you want to quit?"));
+ gtk_misc_set_padding (GTK_MISC (label), 20, 20);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label,
+ TRUE, TRUE, 0);
+ gtk_widget_show (label);
+
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_wmclass (GTK_WINDOW (dialog), "quit", "Glade");
+
+ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
+ {
+ glade_save_settings (project_window, glade_palette, win_property,
+ win_tree, glade_clipboard);
+ gtk_widget_destroy (project_window->window);
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+
+static void
+glade_project_window_cut (GtkWidget *widget,
+ gpointer user_data)
+{
+ GladeProjectWindow *project_window;
+ GladeProject *project;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ if (project == NULL)
+ return;
+
+ glade_clipboard_cut (GLADE_CLIPBOARD (glade_clipboard), project, NULL);
+}
+
+
+static void
+glade_project_window_copy (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+ GladeProject *project;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ if (project == NULL)
+ return;
+
+ glade_clipboard_copy (GLADE_CLIPBOARD (glade_clipboard), project, NULL);
+}
+
+
+static void
+glade_project_window_paste (GtkWidget *widget,
+ gpointer user_data)
+{
+ GladeProjectWindow *project_window;
+ GladeProject *project;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+ if (project == NULL)
+ return;
+
+ glade_clipboard_paste (GLADE_CLIPBOARD (glade_clipboard), project, NULL);
+}
+
+
+static void
+glade_project_window_delete (GtkWidget *widget,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+
+ project_window = get_glade_project_window (widget);
+ g_return_if_fail (project_window != NULL);
+
+ glade_project_window_real_delete (project_window);
+}
+
+
+/* If one or more items in the project view is selected, we delete them.
+ If not, we delete any widgets selected in the interface.
+ FIXME: I'm not sure of the correct way to handle the Delete key. Should we
+ be using X selections to determine what is currently selected? */
+static void
+glade_project_window_real_delete (GladeProjectWindow *project_window)
+{
+ if (glade_project_view_has_selection (GLADE_PROJECT_VIEW (project_window->project_view)))
+ glade_project_view_delete_selection (GLADE_PROJECT_VIEW (project_window->project_view));
+ else
+ editor_on_delete ();
+}
+
+
+static void
+refresh_menu_item (GtkWidget *menuitem, GtkWidget *window)
+{
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
+ GTK_WIDGET_VISIBLE (window));
+}
+
+void
+glade_project_window_refresh_menu_items (void)
+{
+ refresh_menu_item (palette_item, glade_palette);
+ refresh_menu_item (property_editor_item, win_property);
+ refresh_menu_item (widget_tree_item, win_tree);
+ refresh_menu_item (clipboard_item, glade_clipboard);
+}
+
+
+void
+glade_project_window_uncheck_palette_menu_item (void)
+{
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (palette_item),
+ FALSE);
+}
+
+
+void
+glade_project_window_uncheck_property_editor_menu_item (void)
+{
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (property_editor_item),
+ FALSE);
+}
+
+
+void
+glade_project_window_uncheck_widget_tree_menu_item (void)
+{
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget_tree_item),
+ FALSE);
+}
+
+
+void
+glade_project_window_uncheck_clipboard_menu_item (void)
+{
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (clipboard_item),
+ FALSE);
+}
+
+
+static void
+glade_project_window_toggle_palette (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean show_palette;
+
+ show_palette = GTK_CHECK_MENU_ITEM (widget)->active;
+ if (show_palette)
+ glade_show_palette ();
+ else
+ glade_hide_palette ();
+}
+
+
+static void
+glade_project_window_toggle_property_editor (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean show_property_editor;
+
+ show_property_editor = GTK_CHECK_MENU_ITEM (widget)->active;
+ if (show_property_editor)
+ glade_show_property_editor ();
+ else
+ glade_hide_property_editor ();
+}
+
+
+static void
+glade_project_window_toggle_widget_tree (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean show_widget_tree;
+
+ show_widget_tree = GTK_CHECK_MENU_ITEM (widget)->active;
+ if (show_widget_tree)
+ glade_show_widget_tree ();
+ else
+ glade_hide_widget_tree ();
+}
+
+
+static void
+glade_project_window_toggle_clipboard (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean show_clipboard;
+
+ show_clipboard = GTK_CHECK_MENU_ITEM (widget)->active;
+ if (show_clipboard)
+ glade_show_clipboard ();
+ else
+ glade_hide_clipboard ();
+}
+
+
+static void
+glade_project_window_toggle_tooltips (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean show_tooltips;
+
+ show_tooltips = GTK_CHECK_MENU_ITEM (widget)->active;
+ gb_widget_set_show_tooltips (show_tooltips);
+}
+
+
+static void
+glade_project_window_toggle_grid (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean show_grid;
+
+ show_grid = GTK_CHECK_MENU_ITEM (widget)->active;
+ editor_set_show_grid (show_grid);
+}
+
+
+static void
+glade_project_window_edit_grid_settings (GtkWidget *widget,
+ gpointer data)
+{
+ editor_show_grid_settings_dialog (widget);
+}
+
+
+static void
+glade_project_window_toggle_snap (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean snap_to_grid;
+
+ snap_to_grid = GTK_CHECK_MENU_ITEM (widget)->active;
+ editor_set_snap_to_grid (snap_to_grid);
+}
+
+
+static void
+glade_project_window_edit_snap_settings (GtkWidget *widget,
+ gpointer data)
+{
+ editor_show_snap_settings_dialog (widget);
+}
+
+
+static void
+glade_project_window_about (GtkWidget *widget,
+ gpointer data)
+{
+ /* VERSION comes from configure.in - the only place it should be defined */
+
+#ifdef USE_GNOME
+ static GtkWidget *about = NULL;
+
+ if (about == NULL )
+ {
+ const gchar *author[] = { "Damon Chaplin <damon@gnome.org>",
+ "Martijn van Beers <martijn@earthling.net>",
+ "Jacob Berkman <jacob@ximian.com>",
+ NULL };
+ const gchar *documenter[] = { NULL };
+ GtkWidget *transient_parent;
+ GdkPixbuf *pixbuf = NULL;
+ char *filename;
+
+ filename = gnome_program_locate_file (gnome_program_get (),
+ GNOME_FILE_DOMAIN_APP_PIXMAP,
+ "glade-2.png", /* "glade-2/glade_logo.png", */
+ TRUE, NULL);
+ if (filename)
+ pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
+
+ about = gnome_about_new (_("Glade"),
+ VERSION,
+ _("(C) 1998-2002 Damon Chaplin"),
+ _("Glade is a User Interface Builder for GTK+ and GNOME."),
+ author, documenter, NULL, pixbuf);
+ if (pixbuf)
+ gdk_pixbuf_unref (pixbuf);
+
+ /* set the widget pointer to NULL when the widget is destroyed */
+ g_signal_connect (G_OBJECT (about), "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &about);
+ gtk_window_set_wmclass (GTK_WINDOW (about), "about", "Glade");
+ transient_parent = glade_util_get_toplevel (widget);
+ if (GTK_IS_WINDOW (transient_parent))
+ gtk_window_set_transient_for (GTK_WINDOW (about),
+ GTK_WINDOW (transient_parent));
+
+ gtk_widget_show_all (GTK_WIDGET (about));
+ }
+ gtk_window_present (GTK_WINDOW (about));
+
+#else
+ static GtkWidget *about = NULL;
+
+ if (about == NULL )
+ {
+ GtkWidget *vbox, *image, *label;
+ GtkWindow *transient_parent;
+ char *filename, *text;
+
+ transient_parent = GTK_WINDOW (glade_util_get_toplevel (widget));
+ about = gtk_dialog_new_with_buttons (_("About Glade"),
+ transient_parent,
+ 0,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_OK,
+ NULL);
+ gtk_window_set_resizable (GTK_WINDOW (about), FALSE);
+ g_signal_connect (G_OBJECT (about), "response",
+ G_CALLBACK (gtk_widget_destroy), NULL);
+ /* set the widget pointer to NULL when the widget is destroyed */
+ g_signal_connect (G_OBJECT (about), "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &about);
+ gtk_window_set_wmclass (GTK_WINDOW (about), "about", "Glade");
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about)->vbox),
+ vbox, TRUE, TRUE, 0);
+
+ filename = g_strdup_printf ("%s/pixmaps/glade-2.png", GLADE_DATADIR);
+ image = gtk_image_new_from_file (filename);
+ g_free (filename);
+ gtk_box_pack_start (GTK_BOX (vbox), image, TRUE, TRUE, 8);
+
+ text = g_strdup_printf ("<span size=\"xx-large\" weight=\"bold\">Glade "
+ VERSION "</span>\n\n"
+ "%s\n\n"
+ "<span size=\"small\">%s</span>",
+ _("Glade is a User Interface Builder for GTK+ and GNOME."),
+ _("(C) 1998-2002 Damon Chaplin"));
+
+ label = gtk_label_new (text);
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
+ gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
+ gtk_widget_show_all (GTK_WIDGET (about));
+ }
+ gtk_window_present (GTK_WINDOW (about));
+#endif
+}
+
+
+static gint
+glade_project_window_key_press_event (GtkWidget * widget,
+ GdkEventKey * event,
+ gpointer data)
+{
+ GladeProjectWindow *project_window;
+
+ project_window = get_glade_project_window (widget);
+ g_return_val_if_fail (project_window != NULL, FALSE);
+
+ switch (event->keyval)
+ {
+ case GDK_Delete:
+ glade_project_window_real_delete (project_window);
+ break;
+ }
+ return TRUE;
+}
+
+
+void
+glade_project_window_set_project (GladeProjectWindow *project_window,
+ GladeProject *project)
+{
+ glade_project_view_set_project (GLADE_PROJECT_VIEW (project_window->project_view),
+ project);
+ glade_project_window_update_title (project_window);
+}
+
+
+static void
+glade_project_window_update_title (GladeProjectWindow *project_window)
+{
+ GladeProject *project;
+ gchar *title, *project_name = NULL;
+
+ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
+
+ if (project)
+ project_name = glade_project_get_name (project);
+
+ if (!project_name || !project_name[0])
+ project_name = _("<untitled>");
+
+ title = g_strdup_printf ("Glade: %s", project_name);
+ gtk_window_set_title (GTK_WINDOW (project_window->window), title);
+ g_free (title);
+}