summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--gladeui/glade-palette.c6
-rw-r--r--gladeui/glade-project.c56
-rw-r--r--gladeui/glade-project.h3
-rw-r--r--gladeui/glade-signal-editor.c18
-rw-r--r--gladeui/glade-utils.c46
-rw-r--r--gladeui/glade-utils.h2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/glade-close-button.c80
-rw-r--r--src/glade-close-button.h56
-rw-r--r--src/glade-window.c254
11 files changed, 519 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index a7383037..4b8e3237 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2010-03-31 Tristan Van Berkom <tvb@gnome.org>
+
+ * gladeui/glade-signal-editor.c: Moved unrefs from finalize --> dispose, unload the loaded
+ widget and disconnect from support-changed signal, avoid clearing liststore when its owning
+ view is destroyed and we're unsetting the widget in ->dispose.
+
+ * src/Makefile.am, src/glade-close-button.[ch]: Using Paolo Borelli's close button code for notebook
+ tab close buttons.
+
+ * src/glade-window.c:
+ - Added option to disable toolbar in View menu and session data (bug 586194).
+ - Added option to show notebook tabs for open projects also in the View menu and session data.
+
+ * gladeui/glade-palette.c: Made "both" mode use text horizontally again, still get alot of unwanted
+ ellipsize here.
+
+ * gladeui/glade-project.c: Added the targets-changed signal to refresh views with data about
+ target project versions (notebook tabs).
+
2010-03-30 Tristan Van Berkom <tvb@gnome.org>
* plugins/gtk+/glade-gtk.c, plugins/gtk+/gtk+.xml.in: Block the glade_gtk_text_buffer_changed()
diff --git a/gladeui/glade-palette.c b/gladeui/glade-palette.c
index 3d9b5ff2..d3b3a96b 100644
--- a/gladeui/glade-palette.c
+++ b/gladeui/glade-palette.c
@@ -658,9 +658,9 @@ glade_palette_update_appearance (GladePalette *palette)
switch (priv->item_appearance)
{
- case GLADE_ITEM_ICON_AND_LABEL: style = GTK_TOOLBAR_BOTH; break;
- case GLADE_ITEM_ICON_ONLY: style = GTK_TOOLBAR_ICONS; break;
- case GLADE_ITEM_LABEL_ONLY: style = GTK_TOOLBAR_TEXT; break;
+ case GLADE_ITEM_ICON_AND_LABEL: style = GTK_TOOLBAR_BOTH_HORIZ; break;
+ case GLADE_ITEM_ICON_ONLY: style = GTK_TOOLBAR_ICONS; break;
+ case GLADE_ITEM_LABEL_ONLY: style = GTK_TOOLBAR_TEXT; break;
default:
g_assert_not_reached ();
break;
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index 3e97d6a9..5778b139 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -62,6 +62,7 @@ enum
CHANGED,
PARSE_FINISHED,
CONVERT_FINISHED,
+ TARGETS_CHANGED,
LAST_SIGNAL
};
@@ -802,6 +803,22 @@ glade_project_class_init (GladeProjectClass *klass)
G_TYPE_NONE,
0);
+
+ /**
+ * GladeProject::targets-changed:
+ * @gladeproject: the #GladeProject which received the signal.
+ *
+ * Emitted when @gladeproject target versions change.
+ */
+ glade_project_signals[TARGETS_CHANGED] =
+ g_signal_new ("targets-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
g_object_class_install_property (object_class,
PROP_MODIFIED,
g_param_spec_boolean ("modified",
@@ -2861,6 +2878,8 @@ glade_project_set_target_version (GladeProject *project,
}
glade_project_verify_project_for_ui (project);
+
+ g_signal_emit (project, glade_project_signals [TARGETS_CHANGED], 0);
}
static void
@@ -4146,3 +4165,40 @@ glade_project_preferences (GladeProject *project)
gtk_window_present (GTK_WINDOW (project->priv->prefs_dialog));
}
+
+
+gchar *
+glade_project_display_dependencies (GladeProject *project)
+{
+ GList *catalogs, *l;
+ GString *string;
+
+ g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL);
+
+ string = g_string_new ("");
+
+ catalogs = glade_project_required_libs (project);
+ for (l = catalogs; l; l = l->next)
+ {
+ gchar *catalog = l->data;
+ gint major = 0, minor = 0;
+
+ glade_project_get_target_version (project, catalog, &major, &minor);
+
+ if (l != catalogs)
+ g_string_append (string, ", ");
+
+ /* Capitalize GTK+ */
+ if (strcmp (catalog, "gtk+") == 0)
+ g_string_append_printf (string, "GTK+ >= %d.%d", major, minor);
+ else if (major && minor)
+ g_string_append_printf (string, "%s >= %d.%d", catalog, major, minor);
+ else
+ g_string_append_printf (string, "%s", catalog);
+
+ g_free (catalog);
+ }
+ g_list_free (catalogs);
+
+ return g_string_free (string, FALSE);
+}
diff --git a/gladeui/glade-project.h b/gladeui/glade-project.h
index f3894653..f76ce6ce 100644
--- a/gladeui/glade-project.h
+++ b/gladeui/glade-project.h
@@ -193,6 +193,9 @@ void glade_project_get_target_version (GladeProject *project,
void glade_project_update_signal_support_warning (GladeWidget *widget,
GladeSignal *signal);
+
+gchar *glade_project_display_dependencies (GladeProject *project);
+
G_END_DECLS
#endif /* __GLADE_PROJECT_H__ */
diff --git a/gladeui/glade-signal-editor.c b/gladeui/glade-signal-editor.c
index dc7a41ae..be6fd583 100644
--- a/gladeui/glade-signal-editor.c
+++ b/gladeui/glade-signal-editor.c
@@ -1115,8 +1115,6 @@ glade_signal_editor_load_widget (GladeSignalEditor *editor,
g_return_if_fail (GLADE_IS_SIGNAL_EDITOR (editor));
g_return_if_fail (widget == NULL || GLADE_IS_WIDGET (widget));
- gtk_tree_store_clear (editor->model);
-
if (editor->widget != widget)
{
if (editor->widget)
@@ -1141,6 +1139,8 @@ glade_signal_editor_load_widget (GladeSignalEditor *editor,
if (!widget)
return;
+ gtk_tree_store_clear (editor->model);
+
if (glade_project_get_format (glade_widget_get_project (widget)) == GLADE_PROJECT_FORMAT_GTKBUILDER)
gtk_tree_view_column_set_visible (editor->swapped_column_ptr, TRUE);
else
@@ -1362,14 +1362,18 @@ glade_signal_editor_set_property (GObject *object,
}
static void
-glade_signal_editor_finalize (GObject *object)
+glade_signal_editor_dispose (GObject *object)
{
GladeSignalEditor *self = GLADE_SIGNAL_EDITOR (object);
+
+ glade_signal_editor_load_widget (self, NULL);
- g_object_unref (self->handler_store);
- g_object_unref (self->userdata_store);
+ if (self->handler_store)
+ g_object_unref (self->handler_store);
+ if (self->userdata_store)
+ g_object_unref (self->userdata_store);
- G_OBJECT_CLASS (glade_signal_editor_parent_class)->finalize (object);
+ G_OBJECT_CLASS (glade_signal_editor_parent_class)->dispose (object);
}
static void
@@ -1391,7 +1395,7 @@ glade_signal_editor_class_init (GladeSignalEditorClass *klass)
object_class->constructor = glade_signal_editor_constructor;
object_class->get_property = glade_signal_editor_get_property;
object_class->set_property = glade_signal_editor_set_property;
- object_class->finalize = glade_signal_editor_finalize;
+ object_class->dispose = glade_signal_editor_dispose;
klass->handler_editing_done = glade_signal_editor_handler_editing_done_impl;
klass->userdata_editing_done = glade_signal_editor_userdata_editing_done_impl;
klass->handler_editing_started = NULL;
diff --git a/gladeui/glade-utils.c b/gladeui/glade-utils.c
index af4abada..80b5bb27 100644
--- a/gladeui/glade-utils.c
+++ b/gladeui/glade-utils.c
@@ -2346,3 +2346,49 @@ glade_utils_hijack_key_press (GtkWindow *win,
return FALSE;
}
+
+/* copied from gedit */
+gchar *
+glade_utils_replace_home_dir_with_tilde (const gchar *uri)
+{
+ gchar *tmp;
+ gchar *home;
+
+ g_return_val_if_fail (uri != NULL, NULL);
+
+ /* Note that g_get_home_dir returns a const string */
+ tmp = (gchar *)g_get_home_dir ();
+
+ if (tmp == NULL)
+ return g_strdup (uri);
+
+ home = g_filename_to_utf8 (tmp, -1, NULL, NULL, NULL);
+ if (home == NULL)
+ return g_strdup (uri);
+
+ if (strcmp (uri, home) == 0)
+ {
+ g_free (home);
+
+ return g_strdup ("~");
+ }
+
+ tmp = home;
+ home = g_strdup_printf ("%s/", tmp);
+ g_free (tmp);
+
+ if (g_str_has_prefix (uri, home))
+ {
+ gchar *res;
+
+ res = g_strdup_printf ("~/%s", uri + strlen (home));
+
+ g_free (home);
+
+ return res;
+ }
+
+ g_free (home);
+
+ return g_strdup (uri);
+}
diff --git a/gladeui/glade-utils.h b/gladeui/glade-utils.h
index b584688e..edbf8ad4 100644
--- a/gladeui/glade-utils.h
+++ b/gladeui/glade-utils.h
@@ -159,6 +159,8 @@ gint glade_utils_hijack_key_press (GtkWindow *win,
gpointer user_data);
+gchar *glade_utils_replace_home_dir_with_tilde (const gchar *uri);
+
G_END_DECLS
#endif /* __GLADE_UTILS_H__ */
diff --git a/src/Makefile.am b/src/Makefile.am
index 4202205f..ed147b0a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -21,6 +21,8 @@ glade_3_LDADD = $(top_builddir)/gladeui/libgladeui-1.la $(IGE_MAC_LIBS)
glade_3_SOURCES = \
glade-window.c \
glade-window.h \
+ glade-close-button.c \
+ glade-close-button.h \
main.c
if NATIVE_WIN32
diff --git a/src/glade-close-button.c b/src/glade-close-button.c
new file mode 100644
index 00000000..79772830
--- /dev/null
+++ b/src/glade-close-button.c
@@ -0,0 +1,80 @@
+/*
+ * glade-close-button.c
+ * This file was taken from gedit
+ *
+ * Copyright (C) 2010 - Paolo Borelli
+ *
+ * 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 "glade-close-button.h"
+
+G_DEFINE_TYPE (GladeCloseButton, glade_close_button, GTK_TYPE_BUTTON)
+
+static void
+glade_close_button_style_set (GtkWidget *button,
+ GtkStyle *previous_style)
+{
+ gint h, w;
+
+ gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button),
+ GTK_ICON_SIZE_MENU, &w, &h);
+
+ gtk_widget_set_size_request (button, w + 2, h + 2);
+
+ GTK_WIDGET_CLASS (glade_close_button_parent_class)->style_set (button, previous_style);
+}
+
+static void
+glade_close_button_class_init (GladeCloseButtonClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ widget_class->style_set = glade_close_button_style_set;
+}
+
+static void
+glade_close_button_init (GladeCloseButton *button)
+{
+ GtkRcStyle *rcstyle;
+ GtkWidget *image;
+
+ /* make it as small as possible */
+ rcstyle = gtk_rc_style_new ();
+ rcstyle->xthickness = rcstyle->ythickness = 0;
+ gtk_widget_modify_style (GTK_WIDGET (button), rcstyle);
+ g_object_unref (rcstyle);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_CLOSE,
+ GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image);
+
+ gtk_container_add (GTK_CONTAINER (button), image);
+}
+
+GtkWidget *
+glade_close_button_new ()
+{
+ GladeCloseButton *button;
+
+ button = g_object_new (GLADE_TYPE_CLOSE_BUTTON,
+ "relief", GTK_RELIEF_NONE,
+ "focus-on-click", FALSE,
+ NULL);
+
+ return GTK_WIDGET (button);
+}
+
diff --git a/src/glade-close-button.h b/src/glade-close-button.h
new file mode 100644
index 00000000..bd1195d5
--- /dev/null
+++ b/src/glade-close-button.h
@@ -0,0 +1,56 @@
+/*
+ * glade-close-button.h
+ * This file was taken from gedit
+ *
+ * Copyright (C) 2010 - Paolo Borelli
+ *
+ * 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.
+ */
+
+#ifndef __GLADE_CLOSE_BUTTON_H__
+#define __GLADE_CLOSE_BUTTON_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GLADE_TYPE_CLOSE_BUTTON (glade_close_button_get_type ())
+#define GLADE_CLOSE_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_CLOSE_BUTTON, GladeCloseButton))
+#define GLADE_CLOSE_BUTTON_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_CLOSE_BUTTON, GladeCloseButton const))
+#define GLADE_CLOSE_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_CLOSE_BUTTON, GladeCloseButtonClass))
+#define GLADE_IS_CLOSE_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_CLOSE_BUTTON))
+#define GLADE_IS_CLOSE_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_CLOSE_BUTTON))
+#define GLADE_CLOSE_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_CLOSE_BUTTON, GladeCloseButtonClass))
+
+typedef struct _GladeCloseButton GladeCloseButton;
+typedef struct _GladeCloseButtonClass GladeCloseButtonClass;
+typedef struct _GladeCloseButtonPrivate GladeCloseButtonPrivate;
+
+struct _GladeCloseButton {
+ GtkButton parent;
+};
+
+struct _GladeCloseButtonClass {
+ GtkButtonClass parent_class;
+};
+
+GType glade_close_button_get_type (void) G_GNUC_CONST;
+
+GtkWidget *glade_close_button_new (void);
+
+G_END_DECLS
+
+#endif /* __GLADE_CLOSE_BUTTON_H__ */
diff --git a/src/glade-window.c b/src/glade-window.c
index 138a648f..67f9272a 100644
--- a/src/glade-window.c
+++ b/src/glade-window.c
@@ -26,6 +26,7 @@
#include <config.h>
#include "glade-window.h"
+#include "glade-close-button.h"
#include <gladeui/glade.h>
#include <gladeui/glade-design-view.h>
@@ -61,6 +62,8 @@
#define CONFIG_KEY_HEIGHT "height"
#define CONFIG_KEY_DETACHED "detached"
#define CONFIG_KEY_MAXIMIZED "maximized"
+#define CONFIG_KEY_SHOW_TOOLBAR "show-toolbar"
+#define CONFIG_KEY_SHOW_TABS "show-tabs"
#define GLADE_WINDOW_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), \
GLADE_TYPE_WINDOW, \
@@ -673,6 +676,77 @@ format_project_list_item_tooltip (GladeProject *project)
}
static void
+refresh_notebook_tab_for_project (GladeWindow *window, GladeProject *project)
+{
+ GtkWidget *tab_label, *label, *view, *eventbox;
+ GList *children, *l;
+ gchar *str;
+
+ children = gtk_container_get_children (GTK_CONTAINER (window->priv->notebook));
+ for (l = children; l; l = l->next)
+ {
+ view = l->data;
+
+ if (project == glade_design_view_get_project (GLADE_DESIGN_VIEW (view)))
+ {
+ GladeProjectFormat fmt = glade_project_get_format (project);
+ gchar *path, *deps;
+
+ tab_label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (window->priv->notebook), view);
+ label = g_object_get_data (G_OBJECT (tab_label), "tab-label");
+ eventbox = g_object_get_data (G_OBJECT (tab_label), "tab-event-box");
+
+ str = get_formatted_project_name_for_display (project,
+ FORMAT_NAME_MARK_UNSAVED |
+ FORMAT_NAME_MIDDLE_TRUNCATE);
+ gtk_label_set_text (GTK_LABEL (label), str);
+ g_free (str);
+
+ if (glade_project_get_path (project))
+ path = glade_utils_replace_home_dir_with_tilde (glade_project_get_path (project));
+ else
+ path = glade_project_get_name (project);
+
+
+ deps = glade_project_display_dependencies (project);
+ str = g_markup_printf_escaped (" <b>%s</b> %s \n"
+ " %s \n"
+ " <b>%s</b> %s \n"
+ " <b>%s</b> %s ",
+ _("Name:"), path,
+ glade_project_get_readonly (project) ? READONLY_INDICATOR : "",
+ _("Format:"),
+ fmt == GLADE_PROJECT_FORMAT_GTKBUILDER ? "GtkBuilder" : "Libglade",
+ _("Requires:"), deps);
+
+ gtk_widget_set_tooltip_markup (eventbox, str);
+
+ g_free (path);
+ g_free (deps);
+ g_free (str);
+
+ break;
+ }
+ }
+ g_list_free (children);
+}
+
+static void
+refresh_notebook_tabs (GladeWindow *window)
+{
+ GList *list;
+
+ for (list = glade_app_get_projects (); list; list = list->next)
+ refresh_notebook_tab_for_project (window, GLADE_PROJECT (list->data));
+}
+
+static void
+project_targets_changed_cb (GladeProject *project, GladeWindow *window)
+{
+ refresh_notebook_tab_for_project (window, project);
+}
+
+static void
refresh_projects_list_item (GladeWindow *window, GladeProject *project)
{
GtkAction *action;
@@ -740,18 +814,24 @@ project_notify_handler_cb (GladeProject *project, GParamSpec *spec, GladeWindow
{
GtkAction *action;
- if (strcmp (spec->name, "modified") == 0)
+ if (strcmp (spec->name, "path") == 0 ||
+ strcmp (spec->name, "format") == 0)
+ refresh_notebook_tab_for_project (window, project);
+ else if (strcmp (spec->name, "modified") == 0)
{
refresh_title (window);
refresh_projects_list_item (window, project);
}
else if (strcmp (spec->name, "read-only") == 0)
{
+ refresh_notebook_tab_for_project (window, project);
+
action = gtk_action_group_get_action (window->priv->project_actions, "Save");
gtk_action_set_sensitive (action,
!glade_project_get_readonly (project));
}
- else if (strcmp (spec->name, "has-selection") == 0)
+ else if (strcmp (spec->name, "has-selection") == 0 &&
+ (project == glade_app_get_project ()))
{
action = gtk_action_group_get_action (window->priv->project_actions, "Cut");
gtk_action_set_sensitive (action,
@@ -1166,6 +1246,7 @@ save (GladeWindow *window, GladeProject *project, const gchar *path)
/* refresh names */
refresh_title (window);
refresh_projects_list_item (window, project);
+ refresh_notebook_tab_for_project (window, project);
glade_util_flash_message (window->priv->statusbar,
window->priv->statusbar_actions_context_id,
@@ -1631,14 +1712,24 @@ notebook_tab_added_cb (GtkNotebook *notebook,
g_signal_connect (G_OBJECT (project), "notify::modified",
G_CALLBACK (project_notify_handler_cb),
window);
- g_signal_connect (G_OBJECT (project), "selection-changed",
- G_CALLBACK (project_selection_changed_cb), window);
+ g_signal_connect (G_OBJECT (project), "notify::path",
+ G_CALLBACK (project_notify_handler_cb),
+ window);
+ g_signal_connect (G_OBJECT (project), "notify::format",
+ G_CALLBACK (project_notify_handler_cb),
+ window);
g_signal_connect (G_OBJECT (project), "notify::has-selection",
G_CALLBACK (project_notify_handler_cb),
window);
g_signal_connect (G_OBJECT (project), "notify::read-only",
G_CALLBACK (project_notify_handler_cb),
window);
+ g_signal_connect (G_OBJECT (project), "selection-changed",
+ G_CALLBACK (project_selection_changed_cb),
+ window);
+ g_signal_connect (G_OBJECT (project), "targets-changed",
+ G_CALLBACK (project_targets_changed_cb),
+ window);
/* create inspector */
inspector = glade_inspector_new ();
@@ -1682,6 +1773,9 @@ notebook_tab_removed_cb (GtkNotebook *notebook,
g_signal_handlers_disconnect_by_func (G_OBJECT (project),
G_CALLBACK (project_selection_changed_cb),
window);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (project),
+ G_CALLBACK (project_targets_changed_cb),
+ window);
gtk_notebook_remove_page (GTK_NOTEBOOK (window->priv->inspectors_notebook), page_num);
@@ -1852,6 +1946,25 @@ toggle_dock_cb (GtkAction *action, GladeWindow *window)
}
}
+
+static void
+toggle_toolbar_cb (GtkAction *action, GladeWindow *window)
+{
+ if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
+ gtk_widget_show (window->priv->toolbar);
+ else
+ gtk_widget_hide (window->priv->toolbar);
+}
+
+static void
+toggle_tabs_cb (GtkAction *action, GladeWindow *window)
+{
+ if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->priv->notebook), TRUE);
+ else
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->priv->notebook), FALSE);
+}
+
static void
show_help_cb (GtkAction *action, GladeWindow *window)
{
@@ -1970,7 +2083,7 @@ about_cb (GtkAction *action, GladeWindow *window)
static const gchar copyright[] =
"Copyright \xc2\xa9 2001-2006 Ximian, Inc.\n"
"Copyright \xc2\xa9 2001-2006 Joaquin Cuenca Abela, Paolo Borelli, et al.\n"
- "Copyright \xc2\xa9 2001-2008 Tristan Van Berkom, Juan Pablo Ugarte, et al.";
+ "Copyright \xc2\xa9 2001-2010 Tristan Van Berkom, Juan Pablo Ugarte, et al.";
gtk_show_about_dialog (GTK_WINDOW (window),
"name", g_get_application_name (),
@@ -2014,6 +2127,8 @@ static const gchar ui_info[] =
" <menuitem action='Preferences'/>"
" </menu>"
" <menu action='ViewMenu'>"
+" <menuitem action='ToolbarVisible'/>"
+" <menuitem action='ProjectTabsVisible'/>"
" <menu action='PaletteAppearance'>"
" <menuitem action='IconsAndLabels'/>"
" <menuitem action='IconsOnly'/>"
@@ -2150,6 +2265,14 @@ static GtkToggleActionEntry view_entries[] = {
N_("Dock the editor into the main window"),
G_CALLBACK (toggle_dock_cb), TRUE },
+ { "ToolbarVisible", NULL, N_("Toolbar"), NULL,
+ N_("Show the main toolbar"),
+ G_CALLBACK (toggle_toolbar_cb), TRUE },
+
+ { "ProjectTabsVisible", NULL, N_("Project Tabs"), NULL,
+ N_("Show notebook tabs for loaded projects"),
+ G_CALLBACK (toggle_tabs_cb), TRUE },
+
};
static guint n_view_entries = G_N_ELEMENTS (view_entries);
@@ -2389,10 +2512,72 @@ create_drag_resize_tool_button (GtkToolbar *toolbar)
return GTK_WIDGET (button);
}
+static void
+tab_close_button_clicked_cb (GtkWidget *close_button,
+ GladeProject *project)
+{
+ GladeDesignView *view;
+ GladeWindow *window = GLADE_WINDOW (glade_app_get_window ());
+ gboolean close;
+
+ view = glade_design_view_get_from_project (project);
+
+ if (glade_project_get_modified (project))
+ {
+ close = confirm_close_project (window, project);
+ if (!close)
+ return;
+ }
+ do_close (window, view);
+}
+
+static GtkWidget *
+create_notebook_tab (GladeWindow *window, GladeProject *project)
+{
+ GtkWidget *tab_label, *ebox, *hbox, *close_button, *label, *dummy_label;
+
+ tab_label = gtk_hbox_new (FALSE, 4);
+
+ ebox = gtk_event_box_new ();
+ gtk_event_box_set_visible_window (GTK_EVENT_BOX (ebox), FALSE);
+ gtk_box_pack_start (GTK_BOX (tab_label), ebox, TRUE, TRUE, 0);
+
+ hbox = gtk_hbox_new (FALSE, 4);
+ gtk_container_add (GTK_CONTAINER (ebox), hbox);
+
+ close_button = glade_close_button_new ();
+ gtk_widget_set_tooltip_text (close_button, _("Close document"));
+ gtk_box_pack_start (GTK_BOX (tab_label), close_button, FALSE, FALSE, 0);
+
+ g_signal_connect (close_button,
+ "clicked",
+ G_CALLBACK (tab_close_button_clicked_cb),
+ project);
+
+ label = gtk_label_new ("");
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label), 0, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ dummy_label = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), dummy_label, TRUE, TRUE, 0);
+
+ gtk_widget_show (ebox);
+ gtk_widget_show (hbox);
+ gtk_widget_show (close_button);
+ gtk_widget_show (label);
+ gtk_widget_show (dummy_label);
+
+ g_object_set_data (G_OBJECT (tab_label), "tab-event-box", ebox);
+ g_object_set_data (G_OBJECT (tab_label), "tab-label", label);
+
+ return tab_label;
+}
+
static void
add_project (GladeWindow *window, GladeProject *project)
{
- GtkWidget *view;
+ GtkWidget *view, *label;
g_return_if_fail (GLADE_IS_PROJECT (project));
@@ -2403,9 +2588,14 @@ add_project (GladeWindow *window, GladeProject *project)
glade_app_add_project (project);
g_object_unref (project);
- gtk_notebook_append_page (GTK_NOTEBOOK (window->priv->notebook), GTK_WIDGET (view), NULL);
+ /* Custom notebook tab label (will be refreshed later) */
+ label = create_notebook_tab (window, project);
+
+ gtk_notebook_append_page (GTK_NOTEBOOK (window->priv->notebook), GTK_WIDGET (view), label);
gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook), -1);
+ refresh_notebook_tab_for_project (window, project);
+
/* Kick the inspector in the balls here... */
glade_project_selection_changed (project);
}
@@ -2570,9 +2760,9 @@ glade_window_open_project (GladeWindow *window,
static void
change_menu_label (GladeWindow *window,
- const gchar *path,
- const gchar *action_label,
- const gchar *action_description)
+ const gchar *path,
+ const gchar *action_label,
+ const gchar *action_description)
{
GtkBin *bin;
GtkLabel *label;
@@ -2651,6 +2841,8 @@ update_ui (GladeApp *app, GladeWindow *window)
gtk_widget_queue_draw (GTK_WIDGET (window->priv->active_view));
refresh_undo_redo (window);
+
+ refresh_notebook_tabs (window);
}
static void
@@ -2765,6 +2957,8 @@ static void
save_windows_config (GladeWindow *window, GKeyFile *config)
{
guint i;
+ GdkWindow *gdk_window;
+ gboolean maximized;
for (i = 0; i < N_DOCKS; ++i)
{
@@ -2773,11 +2967,21 @@ save_windows_config (GladeWindow *window, GKeyFile *config)
dock->detached, TRUE, dock->maximized);
}
- GdkWindow *gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
- gboolean maximized = gdk_window_get_state (gdk_window) & GDK_WINDOW_STATE_MAXIMIZED;
+ gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
+ maximized = gdk_window_get_state (gdk_window) & GDK_WINDOW_STATE_MAXIMIZED;
key_file_set_window_position (config, &window->priv->position,
"main", FALSE, FALSE, maximized);
+
+ g_key_file_set_boolean (config,
+ CONFIG_GROUP_WINDOWS,
+ CONFIG_KEY_SHOW_TOOLBAR,
+ gtk_widget_get_visible (window->priv->toolbar));
+
+ g_key_file_set_boolean (config,
+ CONFIG_GROUP_WINDOWS,
+ CONFIG_KEY_SHOW_TABS,
+ gtk_notebook_get_show_tabs (GTK_NOTEBOOK (window->priv->notebook)));
}
static void
@@ -2880,6 +3084,7 @@ glade_window_set_initial_size (GladeWindow *window, GKeyFile *config)
};
gboolean maximized;
+
key_file_get_window_position (config, "main", &position, NULL, &maximized);
if (maximized)
{
@@ -2903,9 +3108,30 @@ static void
glade_window_config_load (GladeWindow *window)
{
GKeyFile *config = glade_app_get_config ();
+ gboolean show_toolbar, show_tabs;
+ GtkAction *action;
+ /* Initial main dimensions */
glade_window_set_initial_size (window, config);
+ /* toolbar and tabs */
+ show_toolbar = g_key_file_get_boolean (config, CONFIG_GROUP_WINDOWS, CONFIG_KEY_SHOW_TOOLBAR, NULL);
+ show_tabs = g_key_file_get_boolean (config, CONFIG_GROUP_WINDOWS, CONFIG_KEY_SHOW_TABS, NULL);
+
+ if (show_toolbar)
+ gtk_widget_show (window->priv->toolbar);
+ else
+ gtk_widget_hide (window->priv->toolbar);
+
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->priv->notebook), show_tabs);
+
+ action = gtk_action_group_get_action (window->priv->static_actions, "ToolbarVisible");
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), show_toolbar);
+
+ action = gtk_action_group_get_action (window->priv->static_actions, "ProjectTabsVisible");
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), show_tabs);
+
+ /* Paned positions */
load_paned_position (config, window->priv->left_pane, "left_pane", 200);
load_paned_position (config, window->priv->center_pane, "center_pane", 400);
load_paned_position (config, window->priv->right_pane, "right_pane", 220);
@@ -3068,7 +3294,9 @@ glade_window_init (GladeWindow *window)
/* notebook */
priv->notebook = gtk_notebook_new ();
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE);
+
+ /* Show tabs (user preference) */
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), TRUE);
gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE);
gtk_paned_pack2 (GTK_PANED (hpaned2), priv->notebook, TRUE, FALSE);
gtk_widget_show (priv->notebook);