diff options
Diffstat (limited to 'src/glade-project-window.c')
-rw-r--r-- | src/glade-project-window.c | 1160 |
1 files changed, 463 insertions, 697 deletions
diff --git a/src/glade-project-window.c b/src/glade-project-window.c index a99c98b9..a59e2ea4 100644 --- a/src/glade-project-window.c +++ b/src/glade-project-window.c @@ -31,21 +31,28 @@ #include <gtk/gtkstock.h> #include "glade.h" - +#include "glade-design-view.h" #include "glade-project-window.h" -#define CONFIG_RECENT_PROJECTS "Recent Projects" -#define CONFIG_RECENT_PROJECTS_MAX "max_recent_projects" - #define GLADE_ACTION_GROUP_STATIC "GladeStatic" #define GLADE_ACTION_GROUP_PROJECT "GladeProject" -#define GLADE_ACTION_GROUP_RECENT "GladeRecent" #define GLADE_ACTION_GROUP_PROJECTS_LIST_MENU "GladeProjectsList" -struct _GladeProjectWindowPriv { +#define READONLY_INDICATOR (_("[Read Only]")) + +#define GLADE_PROJECT_WINDOW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), \ + GLADE_TYPE_PROJECT_WINDOW, \ + GladeProjectWindowPrivate)) + +struct _GladeProjectWindowPrivate +{ /* Application widgets */ GtkWidget *window; /* Main window */ GtkWidget *main_vbox; + + GtkWidget *notebook; + GladeDesignView *active_view; + gint num_tabs; GtkWidget *statusbar; /* A pointer to the status bar. */ guint statusbar_menu_context_id; /* The context id of the menu bar */ @@ -56,22 +63,12 @@ struct _GladeProjectWindowPriv { GtkActionGroup *static_actions; /* All the static actions */ GtkActionGroup *project_actions;/* All the project actions */ - GtkActionGroup *recent_actions; /* Recent projects actions */ GtkActionGroup *projects_list_menu_actions;/* Projects list menu actions */ - - GQueue *recent_projects; /* A GtkAction queue */ - gint rp_max; /* Maximum Recent Projects entries */ - - GtkWindow *palette_window; /* The window that will contain the palette */ - GtkWindow *editor_window; /* The window that will contain the editor */ - GtkWidget *expand; /* Expand/Collapse the treeview */ - GtkWidget *collapse; + + GtkLabel *label; /* the title of property editor dock */ }; - -#define READONLY_INDICATOR (_("[read-only]")) - const gint GLADE_WIDGET_TREE_WIDTH = 230; const gint GLADE_WIDGET_TREE_HEIGHT = 300; const gint GLADE_PALETTE_DEFAULT_HEIGHT = 450; @@ -80,176 +77,89 @@ static gpointer parent_class = NULL; static void gpw_refresh_undo_redo (GladeProjectWindow *gpw); + +G_DEFINE_TYPE(GladeProjectWindow, glade_project_window, GLADE_TYPE_APP) + static void gpw_refresh_title (GladeProjectWindow *gpw) { - GladeProject *active_project; - gchar *title, *project_name; + GladeProject *project; + gchar *title, *name = NULL; - active_project = glade_app_get_project (); - if (active_project) + if (gpw->priv->active_view) { - project_name = glade_project_display_name (active_project, TRUE, FALSE, FALSE); + project = glade_design_view_get_project (gpw->priv->active_view); + + name = glade_project_display_name (project, TRUE, FALSE, FALSE); - if (active_project->readonly != FALSE) - title = g_strdup_printf ("%s %s - %s", project_name, + if (project->readonly != FALSE) + title = g_strdup_printf ("%s %s - %s", name, READONLY_INDICATOR, g_get_application_name ()); else - title = g_strdup_printf ("%s - %s", project_name, + title = g_strdup_printf ("%s - %s", name, g_get_application_name ()); - g_free (project_name); + g_free (name); } else title = g_strdup_printf ("%s", g_get_application_name ()); gtk_window_set_title (GTK_WINDOW (gpw->priv->window), title); - g_free (title); -} - -static void -gpw_new_cb (GtkAction *action, GladeProjectWindow *gpw) -{ - glade_project_window_new_project (gpw); -} - -static void -gpw_recent_project_delete (GtkAction *action, GladeProjectWindow *gpw) -{ - guint merge_id = GPOINTER_TO_UINT(g_object_get_data (G_OBJECT (action), "merge_id")); - - gtk_ui_manager_remove_ui(gpw->priv->ui, merge_id); - gtk_action_group_remove_action (gpw->priv->recent_actions, action); - g_queue_remove (gpw->priv->recent_projects, action); - gtk_ui_manager_ensure_update (gpw->priv->ui); -} -static void -gpw_recent_project_open_cb (GtkAction *action, GladeProjectWindow *gpw) -{ - gchar *path = (gchar *) g_object_get_data (G_OBJECT (action), "project_path"); - - if (path == NULL) return; - - if (!glade_app_is_project_loaded (path)) - gpw_recent_project_delete (action, gpw); - - glade_project_window_open_project (gpw, path); -} - -static gint gpw_rp_cmp (gconstpointer a, gconstpointer b) -{ - /* a is a GtkAction from the queue and b is a gchar* */ - return strcmp (g_object_get_data (G_OBJECT (a), "project_path"), b); + g_free (title); } static void -gpw_recent_project_add (GladeProjectWindow *gpw, const gchar *project_path) +project_selection_changed_cb (GladeProject *project, GladeProjectWindow *gpw) { - GtkAction *action; - gchar *label, *action_name; - guint merge_id; + GladeWidget *glade_widget = NULL; + GtkLabel *label; + GList *list; + gchar *text; + gint num; - /* Need to check if it's already loaded */ - if (g_queue_find_custom (gpw->priv->recent_projects, - project_path, gpw_rp_cmp)) - return; + g_return_if_fail (GLADE_IS_PROJECT (project)); + g_return_if_fail (GLADE_IS_PROJECT_WINDOW (gpw)); - label = glade_util_duplicate_underscores (project_path); - if (!label) return; - - action_name = g_strdup_printf ("open[%s]", project_path); - /* We don't want '/'s in the menu path */ - glade_util_replace (action_name, '/', ' '); - - /* Add action */ - action = gtk_action_new (action_name, label, NULL, NULL); - gtk_action_group_add_action_with_accel (gpw->priv->recent_actions, action, ""); - g_signal_connect (G_OBJECT (action), "activate", (GCallback)gpw_recent_project_open_cb, gpw); - - /* Add menuitem */ - merge_id = gtk_ui_manager_new_merge_id (gpw->priv->ui); - gtk_ui_manager_add_ui (gpw->priv->ui, merge_id, - "/MenuBar/FileMenu/Recents", label, action_name, - GTK_UI_MANAGER_MENUITEM, TRUE); - - /* Set extra data to action */ - g_object_set_data(G_OBJECT (action), "merge_id", GUINT_TO_POINTER(merge_id)); - g_object_set_data_full (G_OBJECT (action), "project_path", g_strdup (project_path), g_free); - - /* Push action into recent project queue */ - g_queue_push_head (gpw->priv->recent_projects, action); - - /* If there is more entries than rp_max, delete the last one.*/ - if (g_queue_get_length(gpw->priv->recent_projects) > gpw->priv->rp_max) - { - GtkAction *last_action = (GtkAction *)g_queue_pop_tail(gpw->priv->recent_projects); - gpw_recent_project_delete (last_action, gpw); - } - - /* Set submenu sensitive */ - gtk_widget_set_sensitive (gtk_ui_manager_get_widget - (gpw->priv->ui, "/MenuBar/FileMenu/Recents"), - TRUE); - g_free (label); - g_free (action_name); -} + label = gpw->priv->label; -static void -gpw_recent_project_config_load (GladeProjectWindow *gpw) -{ - gchar *filename, key[8]; - gint i; - - gpw->priv->rp_max = g_key_file_get_integer ( - glade_app_get_config (), - CONFIG_RECENT_PROJECTS, - CONFIG_RECENT_PROJECTS_MAX, NULL); - - /* Some default value for recent projects maximum */ - if (gpw->priv->rp_max == 0) gpw->priv->rp_max = 5; - - for (i = 0; i < gpw->priv->rp_max; i++) + /* Only update the editor if the selection has changed on + * the currently active project. + */ + if (glade_app_get_editor() && + (project == glade_app_get_project ())) { - g_snprintf(key, 8, "%d", i); + list = glade_project_selection_get (project); + num = g_list_length (list); + + if (num == 1 && !GLADE_IS_PLACEHOLDER (list->data)) + { - filename = g_key_file_get_string (glade_app_get_config (), - CONFIG_RECENT_PROJECTS, key, NULL); - if (filename) + glade_widget = glade_widget_get_from_gobject (G_OBJECT (list->data)); + + text = g_strdup_printf ("%s [%s] - Properties", + glade_widget_get_name (glade_widget), + G_OBJECT_TYPE_NAME (glade_widget->object)); + + gtk_label_set_text (label, text); + + g_free (text); + } + else { - if (g_file_test (filename, G_FILE_TEST_EXISTS)) - gpw_recent_project_add (gpw, filename); + gtk_label_set_text (label, "Properties"); } - else break; + } + } -static void -gpw_recent_project_config_save (GladeProjectWindow *gpw) +static GladeDesignView * +glade_project_window_get_active_view (GladeProjectWindow *gpw) { - GKeyFile *config = glade_app_get_config (); - GList *list; - gchar key[8]; - gint i = 0; - - g_key_file_remove_group (config, CONFIG_RECENT_PROJECTS, NULL); - - g_key_file_set_integer (config, - CONFIG_RECENT_PROJECTS, - CONFIG_RECENT_PROJECTS_MAX, - gpw->priv->rp_max); - - for (list = gpw->priv->recent_projects->tail; list; list = list->prev, i++) - { - gchar *path = g_object_get_data (G_OBJECT (list->data), "project_path"); - - if( path ) - { - g_snprintf (key, 8, "%d", i); - g_key_file_set_string (config, CONFIG_RECENT_PROJECTS, - key, path); - } - } + g_return_val_if_fail (GLADE_IS_PROJECT_WINDOW (gpw), NULL); + + return gpw->priv->active_view; } static void @@ -279,6 +189,43 @@ gpw_refresh_projects_list_item (GladeProjectWindow *gpw, GladeProject *project) } static void +gpw_refresh_next_prev_project_sensitivity (GladeProjectWindow *gpw) +{ + GladeDesignView *view; + GtkAction *action; + gint view_number; + + view = glade_project_window_get_active_view (gpw); + + if (view != NULL) + { + view_number = gtk_notebook_page_num (GTK_NOTEBOOK (gpw->priv->notebook), GTK_WIDGET (view)); + g_return_if_fail (view_number >= 0); + + action = gtk_action_group_get_action (gpw->priv->project_actions, "PreviousProject"); + gtk_action_set_sensitive (action, view_number != 0); + + action = gtk_action_group_get_action (gpw->priv->project_actions, "NextProject"); + gtk_action_set_sensitive (action, + view_number < gtk_notebook_get_n_pages (GTK_NOTEBOOK (gpw->priv->notebook)) - 1); + } + else + { + action = gtk_action_group_get_action (gpw->priv->project_actions, "PreviousProject"); + gtk_action_set_sensitive (action, FALSE); + + action = gtk_action_group_get_action (gpw->priv->project_actions, "NextProject"); + gtk_action_set_sensitive (action, FALSE); + } +} + +static void +gpw_new_cb (GtkAction *action, GladeProjectWindow *gpw) +{ + glade_project_window_new_project (gpw); +} + +static void gpw_project_notify_handler_cb (GladeProject *project, GParamSpec *spec, GladeProjectWindow *gpw) { GtkAction *action; @@ -323,69 +270,87 @@ gpw_clipboard_notify_handler_cb (GladeClipboard *clipboard, GParamSpec *spec, Gl } } +static GtkWidget* +gpw_construct_dock_item (GladeProjectWindow *gpw, const gchar *title, GtkWidget *child) +{ + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *alignment; + + vbox = gtk_vbox_new (FALSE, 0); + + label = gtk_label_new (title); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + gtk_misc_set_padding (GTK_MISC (label), 2, 5); + + alignment = gtk_alignment_new (0, 0, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 0, 12); + + gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (alignment), label); + + gtk_box_pack_start (GTK_BOX (vbox), child, TRUE, TRUE, 0); + + gtk_widget_show (alignment); + gtk_widget_show (label); + gtk_widget_show (child); + gtk_widget_show (vbox); + + /* FIXME: naughty */ + g_object_set_data (G_OBJECT (vbox), "dock-label", label); + + return vbox; +} + static void -gpw_set_sensitivity_according_to_project (GladeProjectWindow *gpw, GladeProject *project) +gpw_set_sensitivity_according_to_project (GladeProjectWindow *window, GladeProject *project) { GtkAction *action; - gboolean is_first_in_list = FALSE, is_last_in_list = FALSE; - action = gtk_action_group_get_action (gpw->priv->project_actions, "Save"); + action = gtk_action_group_get_action (window->priv->project_actions, "Save"); gtk_action_set_sensitive (action, !glade_project_get_readonly (project)); - action = gtk_action_group_get_action (gpw->priv->project_actions, "Cut"); + action = gtk_action_group_get_action (window->priv->project_actions, "Cut"); gtk_action_set_sensitive (action, glade_project_get_has_selection (project)); - action = gtk_action_group_get_action (gpw->priv->project_actions, "Copy"); + action = gtk_action_group_get_action (window->priv->project_actions, "Copy"); gtk_action_set_sensitive (action, glade_project_get_has_selection (project)); - action = gtk_action_group_get_action (gpw->priv->project_actions, "Paste"); + action = gtk_action_group_get_action (window->priv->project_actions, "Paste"); gtk_action_set_sensitive (action, glade_clipboard_get_has_selection (glade_app_get_clipboard ())); - action = gtk_action_group_get_action (gpw->priv->project_actions, "Delete"); + action = gtk_action_group_get_action (window->priv->project_actions, "Delete"); gtk_action_set_sensitive (action, glade_project_get_has_selection (project)); - action = GTK_ACTION (g_object_get_data (G_OBJECT (project), "project-list-action")); - g_return_if_fail (GTK_IS_ACTION (action)); - is_first_in_list = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action), "is-first-in-list")); - is_last_in_list = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action), "is-last-in-list")); - - - action = gtk_action_group_get_action (gpw->priv->project_actions, "PreviousProject"); - gtk_action_set_sensitive (action, !is_first_in_list); - - action = gtk_action_group_get_action (gpw->priv->project_actions, "NextProject"); - gtk_action_set_sensitive (action, !is_last_in_list); + gpw_refresh_next_prev_project_sensitivity (window); } static void -gpw_projects_list_menu_activate_cb (GtkAction *action, GladeProjectWindow *gpw) +gpw_projects_list_menu_activate_cb (GtkAction *action, GladeProjectWindow *window) { - GladeProject *project; - - project = GLADE_PROJECT (g_object_get_data (G_OBJECT (action), "project")); - g_assert (GLADE_IS_PROJECT (project)); - - glade_app_set_project (project); + gint n; - gpw_set_sensitivity_according_to_project (gpw, project); + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) == FALSE) + return; - gpw_refresh_title (gpw); + n = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action)); + gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook), n); } static void -gpw_refresh_projects_list_menu (GladeProjectWindow *gpw) +gpw_refresh_projects_list_menu (GladeProjectWindow *window) { - GladeProjectWindowPriv *p = gpw->priv; - GList *projects, *actions, *l; + GladeProjectWindowPrivate *p = window->priv; + GList *actions, *l; GSList *group = NULL; - gint i = 0; + gint n, i; guint id; if (p->projects_list_menu_ui_id != 0) @@ -395,65 +360,70 @@ gpw_refresh_projects_list_menu (GladeProjectWindow *gpw) actions = gtk_action_group_list_actions (p->projects_list_menu_actions); for (l = actions; l != NULL; l = l->next) { - g_signal_handlers_disconnect_by_func - (GTK_ACTION (l->data), - G_CALLBACK (gpw_projects_list_menu_activate_cb), gpw); + g_signal_handlers_disconnect_by_func (GTK_ACTION (l->data), + G_CALLBACK (gpw_projects_list_menu_activate_cb), window); gtk_action_group_remove_action (p->projects_list_menu_actions, GTK_ACTION (l->data)); } g_list_free (actions); - projects = glade_app_get_projects (); + n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (p->notebook)); - id = (projects != NULL) ? gtk_ui_manager_new_merge_id (p->ui) : 0; - p->projects_list_menu_ui_id = id; + id = (n > 0) ? gtk_ui_manager_new_merge_id (p->ui) : 0; /* Add an action for each project */ - for (l = projects; l != NULL; l = l->next, i++) + for (i = 0; i < n; i++) { + GtkWidget *view; GladeProject *project; GtkRadioAction *action; gchar *action_name; gchar *project_name; - gchar *tooltip = NULL; + gchar *name; + gchar *tooltip; gchar *accel; - project = GLADE_PROJECT (l->data); + view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (p->notebook), i); + project = glade_design_view_get_project (GLADE_DESIGN_VIEW (view)); - action_name = g_strdup_printf ("Project_%d", i); - project_name = glade_project_display_name (project, TRUE, FALSE, TRUE); - if (project->readonly != FALSE && project->path) - tooltip = g_strdup_printf ("%s %s",project->path, READONLY_INDICATOR); - else - tooltip = g_strdup (project->path); - action = gtk_radio_action_new (action_name, project_name, tooltip, NULL, i); + /* NOTE: the action is associated to the position of the tab in + * the notebook not to the tab itself! This is needed to work + * around the gtk+ bug #170727: gtk leaves around the accels + * of the action. Since the accel depends on the tab position + * the problem is worked around, action with the same name always + * get the same accel. + */ + action_name = g_strdup_printf ("Tab_%d", i); + project_name = glade_project_display_name (project, TRUE, FALSE, FALSE); + name = glade_util_duplicate_underscores (project_name); + tooltip = g_strdup_printf (_("Activate %s"), project_name); + + /* alt + 1, 2, 3... 0 to switch to the first ten tabs */ + accel = (i < 10) ? g_strdup_printf ("<alt>%d", (i + 1) % 10) : NULL; + + action = gtk_radio_action_new (action_name, + name, + tooltip, + NULL, + i); /* Link action and project */ g_object_set_data (G_OBJECT (project), "project-list-action", action); g_object_set_data (G_OBJECT (action), "project", project); - /* add additional data for Previous/Next Project actions */ - if (l->prev == NULL) - g_object_set_data (G_OBJECT (action), "is-first-in-list", GINT_TO_POINTER (TRUE)); - if (l->next == NULL) - g_object_set_data (G_OBJECT (action), "is-last-in-list", GINT_TO_POINTER (TRUE)); - if (group != NULL) gtk_radio_action_set_group (action, group); + /* note that group changes each time we add an action, so it must be updated */ group = gtk_radio_action_get_group (action); - /* alt + 1, 2, 3... 0 to switch to the first ten tabs */ - accel = (i < 10) ? g_strdup_printf ("<alt>%d", (i + 1) % 10) : NULL; - - gtk_action_group_add_action_with_accel (p->projects_list_menu_actions, GTK_ACTION (action), accel); + gtk_action_group_add_action_with_accel (p->projects_list_menu_actions, + GTK_ACTION (action), + accel); g_signal_connect (action, "activate", G_CALLBACK (gpw_projects_list_menu_activate_cb), - gpw); - - if (project == glade_app_get_project ()) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + window); gtk_ui_manager_add_ui (p->ui, id, "/MenuBar/ProjectMenu/ProjectsListPlaceholder", @@ -461,36 +431,19 @@ gpw_refresh_projects_list_menu (GladeProjectWindow *gpw) GTK_UI_MANAGER_MENUITEM, FALSE); + if (GLADE_DESIGN_VIEW (view) == p->active_view) + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + g_object_unref (action); g_free (action_name); g_free (project_name); + g_free (name); g_free (tooltip); g_free (accel); } -} -static gchar * -gpw_get_recent_dir (GladeProjectWindow *gpw) -{ - const gchar *project_path; - gchar *dir = NULL; - - if (gpw->priv->recent_projects->head) - { - GtkAction *action = gpw->priv->recent_projects->head->data; - - project_path = g_object_get_data (G_OBJECT (action), "project_path"); - - if (project_path) - dir = g_path_get_dirname (project_path); - } - - /* this is wrong on win32 */ - if (!dir) - dir = g_strdup (g_get_home_dir ()); - - return dir; + p->projects_list_menu_ui_id = id; } static void @@ -498,16 +451,10 @@ gpw_open_cb (GtkAction *action, GladeProjectWindow *gpw) { GtkWidget *filechooser; gchar *path = NULL; - gchar *dir; filechooser = glade_util_file_dialog_new (_("Open\342\200\246"), GTK_WINDOW (gpw->priv->window), GLADE_FILE_DIALOG_ACTION_OPEN); - if ((dir = gpw_get_recent_dir (gpw)) != NULL) - { - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filechooser), dir); - g_free (dir); - } if (gtk_dialog_run (GTK_DIALOG(filechooser)) == GTK_RESPONSE_OK) path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser)); @@ -522,40 +469,6 @@ gpw_open_cb (GtkAction *action, GladeProjectWindow *gpw) } static void -gpw_recent_project_clear_cb (GtkAction *action, GladeProjectWindow *gpw) -{ - GtkWidget *dialog; - - dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gpw->priv->window), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - "<big><b>%s</b></big>\n\n%s", - _("Are you sure you want to clear the\nlist of recent projects?"), - _("If you clear the list of recent projects, they will be\npermanently deleted.")); - - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_CLEAR, GTK_RESPONSE_OK, - NULL); - - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) - { - /* Remove all Recent Projects items */ - g_queue_foreach (gpw->priv->recent_projects, (GFunc)gpw_recent_project_delete, gpw); - /* Set submenu insensitive */ - gtk_widget_set_sensitive (gtk_ui_manager_get_widget - (gpw->priv->ui, "/MenuBar/FileMenu/Recents"), - FALSE); - - /* Save it */ - gpw_recent_project_config_save (gpw); - glade_app_config_save (); - } - gtk_widget_destroy (dialog); -} - -static void gpw_save (GladeProjectWindow *gpw, GladeProject *project, const gchar *path) { GError *error = NULL; @@ -579,11 +492,7 @@ gpw_save (GladeProjectWindow *gpw, GladeProject *project, const gchar *path) glade_app_update_instance_count (project); /* Get display_name here, it could have changed with "Save As..." */ - display_name = glade_project_display_name (project, FALSE, FALSE, FALSE), - - gpw_recent_project_add (gpw, project->path); - gpw_recent_project_config_save (gpw); - glade_app_config_save (); + display_name = glade_project_display_name (project, FALSE, FALSE, FALSE); /* refresh names */ gpw_refresh_title (gpw); @@ -598,40 +507,30 @@ gpw_save (GladeProjectWindow *gpw, GladeProject *project, const gchar *path) } static void -gpw_save_as (GladeProjectWindow *gpw, const gchar *dialog_title) +gpw_save_as (GladeProjectWindow *gpw) { GladeProject *project, *another_project; GtkWidget *filechooser; gchar *path = NULL; gchar *real_path, *ch; - if ((project = glade_app_get_project ()) == NULL) + project = glade_design_view_get_project (gpw->priv->active_view); + + if (project == NULL) { - /* Just incase the menu-item is not insensitive */ - glade_util_ui_message (gpw->priv->window, GLADE_UI_WARN, - _("No open projects to save")); + /* Just in case the menu-item is not insensitive */ + glade_util_ui_message (gpw->priv->window, GLADE_UI_WARN, _("No open projects to save")); return; } - filechooser = glade_util_file_dialog_new (dialog_title, + filechooser = glade_util_file_dialog_new (_("Save As\342\200\246"), GTK_WINDOW (gpw->priv->window), GLADE_FILE_DIALOG_ACTION_SAVE); if (project->path) gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), project->path); - else - { - gchar *dir; - if ((dir = gpw_get_recent_dir (gpw)) != NULL) - { - gtk_file_chooser_set_current_folder - (GTK_FILE_CHOOSER (filechooser), dir); - g_free (dir); - } - - gtk_file_chooser_set_current_name - (GTK_FILE_CHOOSER (filechooser), project->name); - } + else + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), project->name); if (gtk_dialog_run (GTK_DIALOG(filechooser)) == GTK_RESPONSE_OK) path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser)); @@ -685,14 +584,14 @@ gpw_save_as (GladeProjectWindow *gpw, const gchar *dialog_title) static void gpw_save_cb (GtkAction *action, GladeProjectWindow *gpw) { - GladeProject *project; + GladeProject *project; - if ((project = glade_app_get_project ()) == NULL) + project = glade_design_view_get_project (gpw->priv->active_view); + + if (project == NULL) { - /* Just incase the menu-item or button is not insensitive */ - glade_util_ui_message (gpw->priv->window, - GLADE_UI_WARN, - _("No open projects to save")); + /* Just in case the menu-item or button is not insensitive */ + glade_util_ui_message (gpw->priv->window, GLADE_UI_WARN, _("No open projects to save")); return; } @@ -703,26 +602,23 @@ gpw_save_cb (GtkAction *action, GladeProjectWindow *gpw) } /* If instead we dont have a path yet, fire up a file selector */ - gpw_save_as (gpw, _("Save\342\200\246")); + gpw_save_as (gpw); } static void gpw_save_as_cb (GtkAction *action, GladeProjectWindow *gpw) { - gpw_save_as (gpw, _("Save as\342\200\246")); + gpw_save_as (gpw); } - static gboolean gpw_confirm_close_project (GladeProjectWindow *gpw, GladeProject *project) { GtkWidget *dialog; gboolean close = FALSE; - char *msg; + gchar *msg; gint ret; GError *error = NULL; - g_return_val_if_fail (GLADE_IS_PROJECT (project), FALSE); - msg = g_strdup_printf (_("<span weight=\"bold\" size=\"larger\">Save changes to project \"%s\" before closing?</span>\n\n" "Your changes will be lost if you don't save them.\n"), project->name); @@ -767,19 +663,12 @@ gpw_confirm_close_project (GladeProjectWindow *gpw, GladeProject *project) { GtkWidget *filechooser; gchar *path = NULL; - gchar *dir; filechooser = - glade_util_file_dialog_new (_("Save ..."), + glade_util_file_dialog_new (_("Save\342\200\246"), GTK_WINDOW (gpw->priv->window), GLADE_FILE_DIALOG_ACTION_SAVE); - if ((dir = gpw_get_recent_dir (gpw)) != NULL) - { - gtk_file_chooser_set_current_folder - (GTK_FILE_CHOOSER (filechooser), dir); - g_free (dir); - } gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), project->name); @@ -816,36 +705,31 @@ gpw_confirm_close_project (GladeProjectWindow *gpw, GladeProject *project) } static void -do_close (GladeProjectWindow *gpw, GladeProject *project) +do_close (GladeProjectWindow *gpw, GladeDesignView *view) { - GladeProject *active_project; - - g_signal_handlers_disconnect_by_func (G_OBJECT (project), - G_CALLBACK (gpw_project_notify_handler_cb), - gpw); - - glade_app_remove_project (project); - - gpw_refresh_projects_list_menu (gpw); - - gpw_refresh_title (gpw); - - active_project = glade_app_get_project (); - if (active_project != NULL) - gpw_set_sensitivity_according_to_project (gpw, active_project); - else - gtk_action_group_set_sensitive (gpw->priv->project_actions, FALSE); + gint n; + + n = gtk_notebook_page_num (GTK_NOTEBOOK (gpw->priv->notebook), GTK_WIDGET (view)); + + g_object_ref (view); + + gtk_notebook_remove_page (GTK_NOTEBOOK (gpw->priv->notebook), n); + + g_object_unref (view); } static void gpw_close_cb (GtkAction *action, GladeProjectWindow *gpw) { + GladeDesignView *view; GladeProject *project; gboolean close; - project = glade_app_get_project (); + view = gpw->priv->active_view; - if (!project) + project = glade_design_view_get_project (view); + + if (view == NULL) return; if (project->changed) @@ -854,13 +738,13 @@ gpw_close_cb (GtkAction *action, GladeProjectWindow *gpw) if (!close) return; } - do_close (gpw, project); + do_close (gpw, view); } static void gpw_quit_cb (GtkAction *action, GladeProjectWindow *gpw) { - GList *list; +/* GList *list; for (list = glade_app_get_projects (); list; list = list->next) { @@ -879,7 +763,7 @@ gpw_quit_cb (GtkAction *action, GladeProjectWindow *gpw) GladeProject *project = GLADE_PROJECT (glade_app_get_projects ()->data); do_close (gpw, project); } - +*/ gtk_main_quit (); } @@ -934,74 +818,6 @@ gpw_redo_cb (GtkAction *action, GladeProjectWindow *gpw) glade_app_command_redo (); } -static gboolean -gpw_hide_palette_on_delete (GtkWidget *palette, gpointer not_used, GtkUIManager *ui) -{ - glade_util_hide_window (GTK_WINDOW (palette)); - return TRUE; -} - -static void -gpw_create_palette (GladeProjectWindow *gpw) -{ - g_return_if_fail (gpw != NULL); - - gpw->priv->palette_window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); - gtk_window_set_default_size (GTK_WINDOW (gpw->priv->palette_window), -1, - GLADE_PALETTE_DEFAULT_HEIGHT); - - - gtk_window_set_title (gpw->priv->palette_window, _("Palette")); - gtk_window_set_resizable (gpw->priv->palette_window, TRUE); - gtk_window_move (gpw->priv->palette_window, 0, 250); - - gtk_container_add (GTK_CONTAINER (gpw->priv->palette_window), - GTK_WIDGET (glade_app_get_palette())); - - /* Delete event, don't destroy it */ - g_signal_connect (G_OBJECT (gpw->priv->palette_window), "delete_event", - G_CALLBACK (gpw_hide_palette_on_delete), gpw->priv->ui); -} - -static void -gpw_show_palette (GladeProjectWindow *gpw, gboolean raise) -{ - g_return_if_fail (gpw != NULL); - - if (gpw->priv->palette_window == NULL) - gpw_create_palette (gpw); - - gtk_widget_show (GTK_WIDGET (gpw->priv->palette_window)); - - if (raise) - gtk_window_present (gpw->priv->palette_window); -} - -static gboolean -gpw_hide_editor_on_delete (GtkWidget *editor, gpointer not_used, - GtkUIManager *ui) -{ - glade_util_hide_window (GTK_WINDOW (editor)); - return TRUE; -} - -static gint -gpw_hijack_editor_key_press (GtkWidget *editor_win, - GdkEventKey *event, - GladeProjectWindow *gpw) -{ - if (event->keyval == GDK_Delete || /* Filter Delete from accelerator keys */ - ((event->state & GDK_CONTROL_MASK) && /* CNTL keys... */ - ((event->keyval == GDK_c || event->keyval == GDK_C) || /* CNTL-C (copy) */ - (event->keyval == GDK_x || event->keyval == GDK_X) || /* CNTL-X (cut) */ - (event->keyval == GDK_v || event->keyval == GDK_V)))) /* CNTL-V (paste) */ - { - return gtk_widget_event (GTK_WINDOW (editor_win)->focus_widget, - (GdkEvent *)event); - } - return FALSE; -} - static void gpw_doc_search_cb (GladeEditor *editor, const gchar *book, @@ -1012,106 +828,6 @@ gpw_doc_search_cb (GladeEditor *editor, glade_util_search_devhelp (book, page, search); } -static void -gpw_create_editor (GladeProjectWindow *gpw) -{ - g_return_if_fail (gpw != NULL); - - gpw->priv->editor_window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); - gtk_window_set_default_size (GTK_WINDOW (gpw->priv->editor_window), 400, 450); - - gtk_window_set_title (gpw->priv->editor_window, _("Properties")); - gtk_window_move (gpw->priv->editor_window, 550, 0); - - gtk_container_set_border_width (GTK_CONTAINER (gpw->priv->editor_window), 6); - - gtk_container_add (GTK_CONTAINER (gpw->priv->editor_window), - GTK_WIDGET (glade_app_get_editor ())); - - /* Delete event, don't destroy it */ - g_signal_connect (G_OBJECT (gpw->priv->editor_window), "delete_event", - G_CALLBACK (gpw_hide_editor_on_delete), gpw->priv->ui); - - g_signal_connect (G_OBJECT (gpw->priv->editor_window), "key-press-event", - G_CALLBACK (gpw_hijack_editor_key_press), gpw); -} - -static void -gpw_show_editor (GladeApp *app, gboolean raise) -{ - GladeProjectWindow *gpw = GLADE_PROJECT_WINDOW (app); - - g_return_if_fail (GLADE_IS_PROJECT_WINDOW (gpw)); - - gtk_widget_show (GTK_WIDGET (gpw->priv->editor_window)); - - if (raise) - gtk_window_present (gpw->priv->editor_window); -} - -static void -gpw_hide_editor (GladeApp *app) -{ - GladeProjectWindow *gpw = GLADE_PROJECT_WINDOW (app); - - g_return_if_fail (GLADE_IS_PROJECT_WINDOW (gpw)); - - glade_util_hide_window (gpw->priv->editor_window); -} - -static void -gpw_expand_treeview_cb (GtkButton *button, GladeProjectView *view) -{ - glade_project_view_expand_all (view); -} - -static void -gpw_collapse_treeview_cb (GtkButton *button, GladeProjectView *view) -{ - glade_project_view_collapse_all (view); -} - -static GtkWidget* -gpw_create_widget_tree_contents (GladeProjectWindow *gpw) -{ - GtkWidget *hbox, *vbox; - GtkWidget *view; - - view = glade_project_view_new (); - glade_app_add_project_view (GLADE_PROJECT_VIEW (view)); - - gtk_container_set_border_width (GTK_CONTAINER (view), GLADE_GENERIC_BORDER_WIDTH); - - /* Add control buttons to the treeview. */ - hbox = gtk_hbutton_box_new (); - vbox = gtk_vbox_new (FALSE, 0); - - gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_START); - - gpw->priv->expand = gtk_button_new_with_mnemonic (_("E_xpand all")); - gtk_container_set_border_width (GTK_CONTAINER (gpw->priv->expand), - GLADE_GENERIC_BORDER_WIDTH); - - gpw->priv->collapse = gtk_button_new_with_mnemonic (_("_Collapse all")); - gtk_container_set_border_width (GTK_CONTAINER (gpw->priv->collapse), - GLADE_GENERIC_BORDER_WIDTH); - - gtk_box_pack_start (GTK_BOX (hbox), gpw->priv->expand, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), gpw->priv->collapse, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (view), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_signal_connect (G_OBJECT (gpw->priv->expand), "clicked", - G_CALLBACK (gpw_expand_treeview_cb), - view); - - g_signal_connect (G_OBJECT (gpw->priv->collapse), "clicked", - G_CALLBACK (gpw_collapse_treeview_cb), - view); - - return vbox; -} - static gboolean gpw_hide_clipboard_view_on_delete (GtkWidget *clipboard_view, gpointer not_used, GtkUIManager *ui) @@ -1150,88 +866,156 @@ gpw_show_clipboard_view (GladeProjectWindow *gpw) } static void -gpw_palette_appearance_change_cb (GtkRadioAction *action, - GtkRadioAction *current, - GladeProjectWindow *gpw) +glade_project_window_previous_project_cb (GtkAction *action, GladeProjectWindow *window) { - gint value; - - value = gtk_radio_action_get_current_value (action); - - glade_palette_set_item_appearance (glade_app_get_palette (), value); - + gtk_notebook_prev_page (GTK_NOTEBOOK (window->priv->notebook)); } static void -gpw_palette_toggle_small_icons_cb (GtkAction *action, GladeProjectWindow *gpw) +glade_project_window_next_project_cb (GtkAction *action, GladeProjectWindow *window) { - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) - glade_palette_set_use_small_item_icons (glade_app_get_palette(), TRUE); - else - glade_palette_set_use_small_item_icons (glade_app_get_palette(), FALSE); - + gtk_notebook_next_page (GTK_NOTEBOOK (window->priv->notebook)); } static void -gpw_show_palette_cb (GtkAction *action, GladeProjectWindow *gpw) +gpw_notebook_switch_page_cb (GtkNotebook *notebook, + GtkNotebookPage *page, + guint page_num, + GladeProjectWindow *gpw) { - gpw_show_palette (gpw, TRUE); -} + GladeDesignView *view; + GladeProject *project; + GtkAction *action; + gchar *action_name; + + view = GLADE_DESIGN_VIEW (gtk_notebook_get_nth_page (notebook, page_num)); + + /* CHECK: I don't know why but it seems notebook_switch_page is called + two times every time the user change the active tab */ + if (view == gpw->priv->active_view) + return; + + gpw->priv->active_view = view; + + project = glade_design_view_get_project (view); + + /* FIXME: this does not feel good */ + glade_app_set_project (project); + + gpw_refresh_title (gpw); + gpw_set_sensitivity_according_to_project (gpw, project); + + /* activate the corresponding item in the project menu */ + action_name = g_strdup_printf ("Tab_%d", page_num); + action = gtk_action_group_get_action (gpw->priv->projects_list_menu_actions, + action_name); + + /* sometimes the action doesn't exist yet, and the proper action + * is set active during the documents list menu creation + * CHECK: would it be nicer if active_view was a property and we monitored the notify signal? + */ + if (action != NULL) + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + + g_free (action_name); -static void -gpw_show_editor_cb (GtkAction *action, GladeProjectWindow *gpw) -{ - gpw_show_editor (GLADE_APP (gpw), TRUE); } static void -gpw_show_clipboard_cb (GtkAction *action, GladeProjectWindow *gpw) +gpw_notebook_tab_added_cb (GtkNotebook *notebook, + GladeDesignView *view, + guint page_num, + GladeProjectWindow *gpw) { - gpw_show_clipboard_view (gpw); + GladeProject *project; + + ++gpw->priv->num_tabs; + + project = glade_design_view_get_project (view); + + g_signal_connect (G_OBJECT (project), "notify::has-unsaved-changes", + G_CALLBACK (gpw_project_notify_handler_cb), + gpw); + g_signal_connect (G_OBJECT (project), "selection-changed", + G_CALLBACK (project_selection_changed_cb), gpw); + g_signal_connect (G_OBJECT (project), "notify::has-selection", + G_CALLBACK (gpw_project_notify_handler_cb), + gpw); + g_signal_connect (G_OBJECT (project), "notify::read-only", + G_CALLBACK (gpw_project_notify_handler_cb), + gpw); + + gpw_set_sensitivity_according_to_project (gpw, project); + + gpw_refresh_projects_list_menu (gpw); + + gpw_refresh_title (gpw); + + if (gpw->priv->num_tabs > 0) + gtk_action_group_set_sensitive (gpw->priv->project_actions, TRUE); + } -void -glade_project_window_prev_project_cb (GtkAction *action, GladeProjectWindow *window) +static void +gpw_notebook_tab_removed_cb (GtkNotebook *notebook, + GladeDesignView *view, + guint page_num, + GladeProjectWindow *gpw) { GladeProject *project; - GtkToggleAction *project_list_action; - GList *l; - project = glade_app_get_project (); + --gpw->priv->num_tabs; - l = glade_app_get_projects (); - l = g_list_find (l, project); + if (gpw->priv->num_tabs == 0) + gpw->priv->active_view = NULL; - if ((l = g_list_previous (l)) != NULL) - { - project = GLADE_PROJECT (l->data); - - project_list_action = GTK_TOGGLE_ACTION (g_object_get_data (G_OBJECT (project), "project-list-action")); + project = glade_design_view_get_project (view); + + g_signal_handlers_disconnect_by_func (G_OBJECT (project), + G_CALLBACK (gpw_project_notify_handler_cb), + gpw); + g_signal_handlers_disconnect_by_func (G_OBJECT (project), + G_CALLBACK (project_selection_changed_cb), + gpw); + + /* FIXME: this function needs to be preferably called somewhere else */ + glade_app_remove_project (project); + + gpw_refresh_projects_list_menu (gpw); + + gpw_refresh_title (gpw); + + if (gpw->priv->active_view) + gpw_set_sensitivity_according_to_project (gpw, glade_design_view_get_project (gpw->priv->active_view)); + else + gtk_action_group_set_sensitive (gpw->priv->project_actions, FALSE); - gtk_toggle_action_set_active (project_list_action, TRUE); - } } -void -glade_project_window_next_project_cb (GtkAction *action, GladeProjectWindow *gpw) +static void +gpw_palette_appearance_change_cb (GtkRadioAction *action, + GtkRadioAction *current, + GladeProjectWindow *gpw) { - GladeProject *project; - GtkToggleAction *project_list_action; - GList *l; + gint value; - project = glade_app_get_project (); + value = gtk_radio_action_get_current_value (action); - l = glade_app_get_projects (); - l = g_list_find (l, project); + glade_palette_set_item_appearance (glade_app_get_palette (), value); - if ((l = g_list_next (l)) != NULL) - { - project = GLADE_PROJECT (l->data); - - project_list_action = GTK_TOGGLE_ACTION (g_object_get_data (G_OBJECT (project), "project-list-action")); +} - gtk_toggle_action_set_active (project_list_action, TRUE); - } +static void +gpw_palette_toggle_small_icons_cb (GtkAction *action, GladeProjectWindow *gpw) +{ + glade_palette_set_use_small_item_icons (glade_app_get_palette(), + gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); +} + +static void +gpw_show_clipboard_cb (GtkAction *action, GladeProjectWindow *gpw) +{ + gpw_show_clipboard_view (gpw); } static void @@ -1337,10 +1121,6 @@ static const gchar *ui_info = " <menu action='FileMenu'>\n" " <menuitem action='New'/>\n" " <menuitem action='Open'/>\n" -" <menu action='Recents'>\n" -" <separator/>\n" -" <menuitem action='ClearRecents'/>\n" -" </menu>\n" " <separator/>\n" " <menuitem action='Save'/>\n" " <menuitem action='SaveAs'/>\n" @@ -1358,9 +1138,7 @@ static const gchar *ui_info = " <menuitem action='Delete'/>\n" " </menu>\n" " <menu action='ViewMenu'>\n" -" <menuitem action='PropertyEditor'/>\n" " <menuitem action='Clipboard'/>\n" -" <menuitem action='Palette'/>\n" " <separator/>\n" " <menu action='PaletteAppearance'>\n" " <menuitem action='IconsAndLabels'/>\n" @@ -1384,11 +1162,16 @@ static const gchar *ui_info = " </menu>\n" " </menubar>\n" " <toolbar name='ToolBar'>" +" <toolitem action='New'/>" " <toolitem action='Open'/>" " <toolitem action='Save'/>" " <separator/>\n" " <toolitem action='Undo'/>" " <toolitem action='Redo'/>" +" <separator/>\n" +" <toolitem action='Cut'/>" +" <toolitem action='Copy'/>" +" <toolitem action='Paste'/>" " </toolbar>" "</ui>\n"; @@ -1406,11 +1189,6 @@ static GtkActionEntry static_entries[] = { { "Open", GTK_STOCK_OPEN, N_("_Open"),"<control>O", N_("Open a project"), G_CALLBACK (gpw_open_cb) }, - { "Recents", NULL, N_("Open _Recent"), NULL, NULL }, - - { "ClearRecents", GTK_STOCK_CLEAR, N_("Clear Recent Projects"), NULL, - NULL, G_CALLBACK (gpw_recent_project_clear_cb) }, - { "Quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q", N_("Quit the program"), G_CALLBACK (gpw_quit_cb) }, @@ -1458,14 +1236,6 @@ static GtkActionEntry project_entries[] = { N_("Delete the selection"), G_CALLBACK (gpw_delete_cb) }, /* ViewMenu */ - - { "PropertyEditor", NULL, N_("Property _Editor"), NULL, - N_("Show the property editor"), - G_CALLBACK (gpw_show_editor_cb) }, - - { "Palette", NULL, N_("_Palette"), NULL, - N_("Show the palette of widgets"), - G_CALLBACK (gpw_show_palette_cb) }, { "Clipboard", NULL, N_("_Clipboard"), NULL, N_("Show the clipboard"), @@ -1473,7 +1243,7 @@ static GtkActionEntry project_entries[] = { /* ProjectsMenu */ { "PreviousProject", NULL, N_("_Previous Project"), "<control>Page_Up", - N_("Activate previous project"), G_CALLBACK (glade_project_window_prev_project_cb) }, + N_("Activate previous project"), G_CALLBACK (glade_project_window_previous_project_cb) }, { "NextProject", NULL, N_("_Next Project"), "<control>Page_Down", N_("Activate next project"), G_CALLBACK (glade_project_window_next_project_cb) } @@ -1595,10 +1365,6 @@ gpw_construct_menu (GladeProjectWindow *gpw) gtk_action_group_new (GLADE_ACTION_GROUP_PROJECTS_LIST_MENU); gtk_action_group_set_translation_domain (gpw->priv->projects_list_menu_actions, GETTEXT_PACKAGE); - - gpw->priv->recent_actions = gtk_action_group_new (GLADE_ACTION_GROUP_RECENT); - gtk_action_group_set_translation_domain (gpw->priv->recent_actions, - GETTEXT_PACKAGE); gpw->priv->ui = gtk_ui_manager_new (); @@ -1609,7 +1375,6 @@ gpw_construct_menu (GladeProjectWindow *gpw) gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->static_actions, 0); gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->project_actions, 1); - gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->recent_actions, 2); gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->projects_list_menu_actions, 3); gtk_window_add_accel_group (GTK_WINDOW (gpw->priv->window), @@ -1620,10 +1385,6 @@ gpw_construct_menu (GladeProjectWindow *gpw) g_message ("Building menus failed: %s", error->message); g_error_free (error); } - - gtk_widget_set_sensitive (gtk_ui_manager_get_widget - (gpw->priv->ui, "/MenuBar/FileMenu/Recents"), - FALSE); return gtk_ui_manager_get_widget (gpw->priv->ui, "/MenuBar"); } @@ -1703,37 +1464,92 @@ gpw_delete_event (GtkWindow *w, GdkEvent *event, GladeProjectWindow *gpw) static void glade_project_window_create (GladeProjectWindow *gpw) { - GtkWidget *app; + GtkWidget *window; GtkWidget *vbox; + GtkWidget *hpaned1; + GtkWidget *hpaned2; + GtkWidget *vpaned; GtkWidget *menubar; GtkWidget *toolbar; - GtkWidget *project_view; + GladeProjectView *project_view; GtkWidget *statusbar; GtkWidget *editor_item, *docs_item; + GtkWidget *palette; + GtkWidget *editor; + GtkWidget *dockitem; - app = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_move (GTK_WINDOW (app), 0, 0); - gtk_window_set_default_size (GTK_WINDOW (app), 300, 450); - - gpw->priv->window = app; + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gpw->priv->window = window; + gtk_window_maximize (GTK_WINDOW (window)); vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (app), vbox); + gtk_container_add (GTK_CONTAINER (window), vbox); gpw->priv->main_vbox = vbox; + /* menubar */ menubar = gpw_construct_menu (gpw); - toolbar = gtk_ui_manager_get_widget (gpw->priv->ui, "/ToolBar"); - project_view = gpw_create_widget_tree_contents (gpw); - statusbar = gpw_construct_statusbar (gpw); - + gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, TRUE, 0); gtk_widget_show (menubar); + + /* toolbar */ + toolbar = gtk_ui_manager_get_widget (gpw->priv->ui, "/ToolBar"); + gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, TRUE, 0); gtk_widget_show (toolbar); - gtk_widget_show_all (project_view); + + /* main contents */ + hpaned1 = gtk_hpaned_new (); + hpaned2 = gtk_hpaned_new (); + vpaned = gtk_vpaned_new (); + + /* minimum size for far-right pane */ + gtk_widget_set_size_request (vpaned, 310, -1); + + gtk_box_pack_start (GTK_BOX (vbox), hpaned1, TRUE, TRUE, 0); + gtk_paned_pack1 (GTK_PANED (hpaned1), hpaned2, TRUE, FALSE); + gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned, FALSE, FALSE); + + gtk_widget_show_all (hpaned1); + gtk_widget_show_all (hpaned2); + gtk_widget_show_all (vpaned); + + /* palette */ + palette = GTK_WIDGET (glade_app_get_palette ()); + dockitem = gpw_construct_dock_item (gpw, _("Palette"), palette); + gtk_paned_pack1 (GTK_PANED (hpaned2), dockitem, FALSE, FALSE); + + /* notebook */ + gpw->priv->notebook = gtk_notebook_new (); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (gpw->priv->notebook), FALSE); + gtk_notebook_set_show_border (GTK_NOTEBOOK (gpw->priv->notebook), FALSE); + gtk_paned_pack2 (GTK_PANED (hpaned2), gpw->priv->notebook, TRUE, FALSE); + gtk_widget_show (gpw->priv->notebook); + + /* project view */ + project_view = GLADE_PROJECT_VIEW (glade_project_view_new ()); + glade_app_add_project_view (project_view); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (project_view), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (project_view), GTK_SHADOW_IN); + dockitem = gpw_construct_dock_item (gpw, _("Inspector"), GTK_WIDGET (project_view)); + gtk_paned_pack1 (GTK_PANED (vpaned), dockitem, FALSE, FALSE); + gtk_widget_show_all (GTK_WIDGET (project_view)); + + /* editor */ + editor = GTK_WIDGET (glade_app_get_editor ()); + dockitem = gpw_construct_dock_item (gpw, _("Properties"), editor); + gpw->priv->label = GTK_LABEL (g_object_get_data (G_OBJECT (dockitem), "dock-label")); + gtk_label_set_ellipsize (GTK_LABEL (gpw->priv->label), PANGO_ELLIPSIZE_END); + gtk_misc_set_alignment (GTK_MISC (gpw->priv->label), 0, 0.5); + gtk_paned_pack2 (GTK_PANED (vpaned), dockitem, FALSE, FALSE); + + /* status bar */ + statusbar = gpw_construct_statusbar (gpw); + gtk_box_pack_end (GTK_BOX (vbox), statusbar, FALSE, TRUE, 0); gtk_widget_show (statusbar); - gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, TRUE, 0); + gtk_widget_show (vbox); + /* devhelp */ editor_item = gtk_ui_manager_get_widget (gpw->priv->ui, "/MenuBar/ViewMenu/PropertyEditorHelp"); docs_item = gtk_ui_manager_get_widget (gpw->priv->ui, @@ -1742,53 +1558,49 @@ glade_project_window_create (GladeProjectWindow *gpw) gtk_widget_set_sensitive (editor_item, FALSE); gtk_widget_set_sensitive (docs_item, FALSE); - - gtk_box_pack_start (GTK_BOX (vbox), project_view, TRUE, TRUE, 0); - gtk_box_pack_end (GTK_BOX (vbox), statusbar, FALSE, TRUE, 0); - - gtk_widget_show (vbox); - - gpw_recent_project_config_load (gpw); /* support for opening a file by dragging onto the project window */ - gtk_drag_dest_set (app, + gtk_drag_dest_set (GTK_WIDGET (window), GTK_DEST_DEFAULT_ALL, drop_types, G_N_ELEMENTS (drop_types), GDK_ACTION_COPY | GDK_ACTION_MOVE); - g_signal_connect (G_OBJECT (app), "drag-data-received", + g_signal_connect (G_OBJECT (window), "drag-data-received", G_CALLBACK (gpw_drag_data_received), gpw); - g_signal_connect (G_OBJECT (app), "delete_event", + g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gpw_delete_event), gpw); + + /* Connect signals notebook */ + g_signal_connect (gpw->priv->notebook, + "switch-page", + G_CALLBACK (gpw_notebook_switch_page_cb), + gpw); + g_signal_connect (gpw->priv->notebook, + "page-added", + G_CALLBACK (gpw_notebook_tab_added_cb), + gpw); + g_signal_connect (gpw->priv->notebook, + "page-removed", + G_CALLBACK (gpw_notebook_tab_removed_cb), + gpw); } static void glade_project_window_add_project (GladeProjectWindow *gpw, GladeProject *project) { + GtkWidget *view; + g_return_if_fail (GLADE_IS_PROJECT (project)); + + view = glade_design_view_new (project); + gtk_widget_show (view); glade_app_add_project (project); - /* Connect callback handler for notify signals emitted by projects */ - g_signal_connect (G_OBJECT (project), "notify::has-unsaved-changes", - G_CALLBACK (gpw_project_notify_handler_cb), - gpw); - g_signal_connect (G_OBJECT (project), "notify::has-selection", - G_CALLBACK (gpw_project_notify_handler_cb), - gpw); - g_signal_connect (G_OBJECT (project), "notify::read-only", - G_CALLBACK (gpw_project_notify_handler_cb), - gpw); - - gpw_refresh_projects_list_menu (gpw); - - gpw_set_sensitivity_according_to_project (gpw, project); - - gpw_refresh_title (gpw); - - if (gtk_action_group_get_sensitive (gpw->priv->project_actions) == FALSE) - gtk_action_group_set_sensitive (gpw->priv->project_actions, TRUE); + gtk_notebook_append_page (GTK_NOTEBOOK (gpw->priv->notebook), GTK_WIDGET (view), NULL); + gtk_notebook_set_current_page (GTK_NOTEBOOK (gpw->priv->notebook), -1); + } void @@ -1807,9 +1619,6 @@ glade_project_window_new_project (GladeProjectWindow *gpw) glade_project_window_add_project (gpw, project); } -/* - * Opens the project specified by path and adds it to the GladeProjectWindow. - */ void glade_project_window_open_project (GladeProjectWindow *gpw, const gchar *path) { @@ -1830,10 +1639,6 @@ glade_project_window_open_project (GladeProjectWindow *gpw, const gchar *path) if ((project = glade_project_open (path)) == NULL) return; - gpw_recent_project_add (gpw, project->path); - gpw_recent_project_config_save (gpw); - glade_app_config_save (); - glade_project_window_add_project (gpw, project); } @@ -1917,75 +1722,40 @@ glade_project_window_update_ui (GladeApp *app) void glade_project_window_show_all (GladeProjectWindow *gpw) { - gpw_show_palette (gpw, FALSE); - gpw_show_editor (GLADE_APP (gpw), FALSE); gtk_widget_show (gpw->priv->window); } static void glade_project_window_finalize (GObject *object) { - GladeProjectWindow *gpw = GLADE_PROJECT_WINDOW (object); - - g_queue_foreach (gpw->priv->recent_projects, (GFunc)g_object_unref, NULL); - g_queue_free (gpw->priv->recent_projects); - G_OBJECT_CLASS (parent_class)->finalize (object); } static void -glade_project_window_class_init (GladeProjectWindowClass * klass) +glade_project_window_class_init (GladeProjectWindowClass * class) { GObjectClass *object_class; GladeAppClass *app_class; - g_return_if_fail (klass != NULL); + g_return_if_fail (class != NULL); - - - parent_class = g_type_class_peek_parent (klass); - object_class = G_OBJECT_CLASS (klass); - app_class = GLADE_APP_CLASS (klass); + parent_class = g_type_class_peek_parent (class); + object_class = G_OBJECT_CLASS (class); + app_class = GLADE_APP_CLASS (class); object_class->finalize = glade_project_window_finalize; app_class->update_ui_signal = glade_project_window_update_ui; - app_class->show_properties = gpw_show_editor; - app_class->hide_properties = gpw_hide_editor; + + g_type_class_add_private (object_class, sizeof (GladeProjectWindowPrivate)); } static void glade_project_window_init (GladeProjectWindow *gpw) { - gpw->priv = g_new0 (GladeProjectWindowPriv, 1); - - /* initialize widgets */ - gpw->priv->recent_projects = g_queue_new (); -} - -GType -glade_project_window_get_type () -{ - static GType obj_type = 0; + gpw->priv = GLADE_PROJECT_WINDOW_GET_PRIVATE (gpw); - if (!obj_type) - { - static const GTypeInfo obj_info = - { - sizeof (GladeProjectWindowClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) glade_project_window_class_init, - (GClassFinalizeFunc) NULL, - NULL, /* class_data */ - sizeof (GladeProjectWindow), - 0, /* n_preallocs */ - (GInstanceInitFunc) glade_project_window_init, - NULL /* value_table */ - }; - obj_type = g_type_register_static (GLADE_TYPE_APP, - "GladeProjectWindow", &obj_info, 0); - } - return obj_type; + gpw->priv->label = NULL; + } GladeProjectWindow * @@ -1997,16 +1767,12 @@ glade_project_window_new (void) gpw = g_object_new (GLADE_TYPE_PROJECT_WINDOW, NULL); glade_project_window_create (gpw); - gpw_create_palette (gpw); - gpw_create_editor (gpw); glade_app_set_window (gpw->priv->window); accel_group = gtk_ui_manager_get_accel_group(gpw->priv->ui); glade_app_set_accel_group (accel_group); - gtk_window_add_accel_group(gpw->priv->palette_window, accel_group); - gtk_window_add_accel_group(gpw->priv->editor_window, accel_group); gtk_window_add_accel_group(GTK_WINDOW (glade_app_get_clipboard_view ()), accel_group); /* Connect callback handler for notify signals emitted by clipboard */ |