[libgda] GdaBrowser improvements



commit 83417f84113f2d5a554751cc2324728c1f5a4c08
Author: Vivien Malerba <malerba gnome-db org>
Date:   Sun Nov 29 14:20:29 2015 +0100

    GdaBrowser improvements

 libgda-ui/gdaui.css                                |    4 +
 tools/browser/Makefile.am                          |    1 +
 tools/browser/browser-perspective.c                |   26 +++-
 tools/browser/browser-window.c                     |   19 ++-
 tools/browser/data-manager/perspective-main.c      |    3 +-
 tools/browser/fk-declare.c                         |   11 +-
 tools/browser/ldap-browser/perspective-main.c      |    3 +-
 tools/browser/perspectives-names.h                 |   27 ++++
 tools/browser/query-exec/perspective-main.c        |    3 +-
 tools/browser/query-exec/query-console-page.c      |  159 ++++++++++---------
 tools/browser/query-exec/query-editor.c            |   57 +++-----
 tools/browser/schema-browser/objects-index.c       |    2 +-
 tools/browser/schema-browser/perspective-main.c    |    3 +-
 .../schema-browser/schema-browser-perspective.c    |    2 +-
 tools/browser/schema-browser/table-info.c          |  162 ++++++++++++--------
 tools/browser/schema-browser/table-info.h          |    2 +-
 tools/browser/schema-browser/table-preferences.c   |   10 +-
 tools/browser/ui-support.c                         |   47 ++++++-
 tools/browser/ui-support.h                         |    1 +
 19 files changed, 330 insertions(+), 212 deletions(-)
---
diff --git a/libgda-ui/gdaui.css b/libgda-ui/gdaui.css
index 66ab1f9..4290115 100644
--- a/libgda-ui/gdaui.css
+++ b/libgda-ui/gdaui.css
@@ -36,3 +36,7 @@ GdauiRtEditor GtkToolbar {
     margin: 0px;
     padding: 0px;
 }
+
+GtkPaned.paned-no-border {
+    -GtkPaned-handle-size: 0;
+}
\ No newline at end of file
diff --git a/tools/browser/Makefile.am b/tools/browser/Makefile.am
index ca9ebe4..07727b7 100644
--- a/tools/browser/Makefile.am
+++ b/tools/browser/Makefile.am
@@ -40,6 +40,7 @@ libbrowsercore_la_SOURCES=\
        marshal.c \
        marshal.h \
        decl.h \
+       perspectives-names.h \
        dnd.h \
        dnd.c \
        ui-support.h \
diff --git a/tools/browser/browser-perspective.c b/tools/browser/browser-perspective.c
index 02be830..ac61c38 100644
--- a/tools/browser/browser-perspective.c
+++ b/tools/browser/browser-perspective.c
@@ -247,13 +247,25 @@ static void
 notebook_remove_page_cb (GtkNotebook *nb, GtkWidget *page, gint pagenb, BrowserPerspective *bpers)
 {
        if (customization_data_exists (G_OBJECT (bpers))) {
-               g_print ("\tNotebook, removing page %d\n", pagenb);
-               if (pagenb >= 0) {
-                       GtkWidget *current_page;
-                       current_page = gtk_notebook_get_nth_page (nb, pagenb);
-                       if (current_page && IS_BROWSER_PAGE (current_page))
-                               browser_page_uncustomize (BROWSER_PAGE (current_page));
-               }
+               gint current_index;
+               GtkWidget *current_page = NULL;
+               current_index = gtk_notebook_get_current_page (nb);
+               if (current_index >= 0)
+                       current_page = gtk_notebook_get_nth_page (nb, current_index);
+
+               g_print ("\tNotebook, removing page %d, current page is now %d\n", pagenb, current_index);
+
+               /* REM: we need to uncustomize _both_ the removed page and the new page, and customize
+                * again the new page to avoid discrepancies */
+               if (current_page && IS_BROWSER_PAGE (current_page))
+                       browser_page_uncustomize (BROWSER_PAGE (current_page));
+               if (page && IS_BROWSER_PAGE (page))
+                       browser_page_uncustomize (BROWSER_PAGE (page));
+
+               if (current_page && IS_BROWSER_PAGE (current_page))
+                       browser_page_customize (BROWSER_PAGE (current_page),
+                                               customization_data_get_toolbar (G_OBJECT (bpers)),
+                                               customization_data_get_header_bar (G_OBJECT (bpers)));
        }
 }
 
diff --git a/tools/browser/browser-window.c b/tools/browser/browser-window.c
index 458cae5..7432fc1 100644
--- a/tools/browser/browser-window.c
+++ b/tools/browser/browser-window.c
@@ -196,7 +196,7 @@ static void transaction_rollback_cb (G_GNUC_UNUSED GSimpleAction *action, GVaria
 static void connection_properties_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *parameter, gpointer 
data);
 static void connection_close_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *parameter, gpointer data);
 static void fullscreen_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *state, gpointer data);
-static void change_perspective_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *state, gpointer data);
+static void change_perspective_cb (GSimpleAction *action, GVariant *state, gpointer data);
 static GActionEntry win_entries[] = {
        { "change-perspective", NULL, "s", NULL, change_perspective_cb },
 
@@ -622,14 +622,13 @@ transaction_rollback_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *paramete
 }
 
 static void
-change_perspective_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *state, gpointer data)
+change_perspective_cb (GSimpleAction *action, GVariant *state, gpointer data)
 {
        BrowserWindow *bwin = BROWSER_WINDOW (data);
        const gchar *pname;
        pname = g_variant_get_string (state, NULL);
        g_print ("Switching to perspective [%s]\n", pname);
        browser_window_change_perspective (bwin, pname);
-       g_simple_action_set_state (action, state);
 }
 
 static gboolean
@@ -1097,13 +1096,21 @@ browser_window_change_perspective (BrowserWindow *bwin, const gchar *perspective
                        }
                }
        }
+
+       /* update GAction's state */
+       GAction *action;
+       action = g_action_map_lookup_action (G_ACTION_MAP (bwin), "change-perspective");
+       GVariant *value;
+       value = g_variant_new_string (perspective_id);
+       g_simple_action_set_state (G_SIMPLE_ACTION (action), value);
+
+       /* actually switch displayed page */
        gtk_stack_set_visible_child (bwin->priv->pers_stack, GTK_WIDGET (bpers));
        browser_perspective_customize (bpers,
                                       bwin->priv->toolbar, bwin->priv->header);
        bwin->priv->current_perspective = pdata;
 
-       /* setup for the new perspective */
-       /* TODO */
+       /* notice of perspective change */
        gchar *tmp;
        tmp = g_markup_printf_escaped (_("The current perspective has changed to the '%s' perspective, you "
                                         "can switch back to previous perspective through the "
@@ -1111,8 +1118,6 @@ browser_window_change_perspective (BrowserWindow *bwin, const gchar *perspective
                                       bwin->priv->current_perspective->factory->perspective_name,
                                       current_pdata->factory->perspective_name,
                                       current_pdata->factory->menu_shortcut);
-
-                       
        browser_window_show_notice (bwin, GTK_MESSAGE_INFO, "Perspective change", tmp);
        g_free (tmp);
 
diff --git a/tools/browser/data-manager/perspective-main.c b/tools/browser/data-manager/perspective-main.c
index 2fa945c..6ff1040 100644
--- a/tools/browser/data-manager/perspective-main.c
+++ b/tools/browser/data-manager/perspective-main.c
@@ -24,13 +24,14 @@
 #include <gmodule.h>
 #include "perspective-main.h"
 #include "data-manager-perspective.h"
+#include "../perspectives-names.h"
 
 static BrowserPerspectiveFactory bfact;
 
 BrowserPerspectiveFactory *
 data_manager_perspective_get_factory (void)
 {
-       bfact.id = "DataManP";
+       bfact.id = DATA_MANAGER_PERSPECTIVE_NAME;
        bfact.perspective_name = _("Data manager");
        bfact.menu_shortcut ="<control>D";
        bfact.perspective_create = data_manager_perspective_new;
diff --git a/tools/browser/fk-declare.c b/tools/browser/fk-declare.c
index 6972920..eb72cdb 100644
--- a/tools/browser/fk-declare.c
+++ b/tools/browser/fk-declare.c
@@ -130,7 +130,7 @@ fk_declare_init (FkDeclare *declare)
                                NULL);
 #ifdef HAVE_GDU
        GtkWidget *help_btn;
-       help_btn = gtk_button_new_from_icon_name ("help-browser", GTK_ICON_SIZE_DIALOG);
+       help_btn = gtk_button_new_from_icon_name ("help-browser", GTK_ICON_SIZE_BUTTON);
        g_signal_connect (help_btn, "clicked",
                          G_CALLBACK (help_clicked_cb), declare);
        gtk_widget_show (help_btn);
@@ -182,17 +182,18 @@ create_internal_layout (FkDeclare *decl)
        gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
        str = g_strdup_printf (_("Declare a foreign key for table '%s'"),
                               GDA_META_DB_OBJECT (decl->priv->mtable)->obj_short_name);
-       markup = g_markup_printf_escaped ("<big><b>%s:</b></big>\n%s", str,
-                                         _("define which table is references, which columns are "
+       markup = g_markup_printf_escaped ("<big><b>%s:</b></big>\n%s\n", str,
+                                         _("define which table is referenced, which columns are "
                                            "part of the foreign key, "
                                            "and which column each one references"));
        g_free (str);
-                                         
        gtk_label_set_markup (GTK_LABEL (label), markup);
+       gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+       gtk_label_set_width_chars (GTK_LABEL (label), 50);
        g_free (markup);
        gtk_widget_set_halign (label, GTK_ALIGN_START);
        gtk_box_pack_start (GTK_BOX (dcontents), label, FALSE, FALSE, 0);
-       gtk_widget_show_all (label);
+       gtk_widget_show (label);
 
        /* GtkTable to hold contents */
        grid = gtk_grid_new ();
diff --git a/tools/browser/ldap-browser/perspective-main.c b/tools/browser/ldap-browser/perspective-main.c
index e3320ea..4c99ab8 100644
--- a/tools/browser/ldap-browser/perspective-main.c
+++ b/tools/browser/ldap-browser/perspective-main.c
@@ -24,13 +24,14 @@
 #include <gmodule.h>
 #include "perspective-main.h"
 #include "ldap-browser-perspective.h"
+#include "../perspectives-names.h"
 
 static BrowserPerspectiveFactory bfact;
 
 BrowserPerspectiveFactory *
 ldap_browser_perspective_get_factory (void)
 {
-       bfact.id = "LDAPBrP";
+       bfact.id = LDAP_PERSPECTIVE_NAME;
        bfact.perspective_name = _("LDAP browser");
        bfact.menu_shortcut = "<control>P";
        bfact.perspective_create = ldap_browser_perspective_new;
diff --git a/tools/browser/perspectives-names.h b/tools/browser/perspectives-names.h
new file mode 100644
index 0000000..684399e
--- /dev/null
+++ b/tools/browser/perspectives-names.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 Vivien Malerba <malerba gnome-db org>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __PERSPECTIVES_NAMES_H__
+#define __PERSPECTIVES_NAMES_H__
+
+#define SCHEMA_BROWSER_PERSPECTIVE_NAME "SchBrowP"
+#define QUERY_EXEC_PERSPECTIVE_NAME "QueryExecP"
+#define DATA_MANAGER_PERSPECTIVE_NAME "DataManP"
+#define LDAP_PERSPECTIVE_NAME "LDAPBrP"
+
+#endif
diff --git a/tools/browser/query-exec/perspective-main.c b/tools/browser/query-exec/perspective-main.c
index 6c62e24..1b1fb3b 100644
--- a/tools/browser/query-exec/perspective-main.c
+++ b/tools/browser/query-exec/perspective-main.c
@@ -24,13 +24,14 @@
 #include <gmodule.h>
 #include "perspective-main.h"
 #include "query-exec-perspective.h"
+#include "../perspectives-names.h"
 
 static BrowserPerspectiveFactory bfact;
 
 BrowserPerspectiveFactory *
 query_exec_perspective_get_factory (void)
 {
-       bfact.id = "QueryExecP";
+       bfact.id = QUERY_EXEC_PERSPECTIVE_NAME;
        bfact.perspective_name = _("Query execution (SQL)");
        bfact.menu_shortcut = "<control>S";
        bfact.perspective_create = query_exec_perspective_new;
diff --git a/tools/browser/query-exec/query-console-page.c b/tools/browser/query-exec/query-console-page.c
index 2146b80..6757896 100644
--- a/tools/browser/query-exec/query-console-page.c
+++ b/tools/browser/query-exec/query-console-page.c
@@ -49,7 +49,7 @@ struct _QueryConsolePagePrivate {
        GdaSet *params; /* execution params */
        GtkWidget *params_popup; /* popup shown when invalid params are required */
 
-       GtkToggleButton *params_toggle;
+       GtkToggleToolButton *params_toggle;
        GtkWidget *params_top;
        GtkWidget *params_form_box;
        GtkWidget *params_form;
@@ -101,7 +101,7 @@ query_console_page_show_all (GtkWidget *widget)
        QueryConsolePage *tconsole = (QueryConsolePage *) widget;
        GTK_WIDGET_CLASS (parent_class)->show_all (widget);
 
-       if (gtk_toggle_button_get_active (tconsole->priv->params_toggle))
+       if (gtk_toggle_tool_button_get_active (tconsole->priv->params_toggle))
                gtk_widget_show (tconsole->priv->params_top);
        else
                gtk_widget_hide (tconsole->priv->params_top);
@@ -192,14 +192,14 @@ query_console_page_get_type (void)
 
 static void editor_changed_cb (QueryEditor *editor, QueryConsolePage *tconsole);
 static void editor_execute_request_cb (QueryEditor *editor, QueryConsolePage *tconsole);
-static void sql_clear_clicked_cb (GtkButton *button, QueryConsolePage *tconsole);
-static void sql_variables_clicked_cb (GtkToggleButton *button, QueryConsolePage *tconsole);
-static void sql_execute_clicked_cb (GtkButton *button, QueryConsolePage *tconsole);
-static void sql_indent_clicked_cb (GtkButton *button, QueryConsolePage *tconsole);
-static void sql_favorite_clicked_cb (GtkButton *button, QueryConsolePage *tconsole);
-
-static void history_copy_clicked_cb (GtkButton *button, QueryConsolePage *tconsole);
-static void history_clear_clicked_cb (GtkButton *button, QueryConsolePage *tconsole);
+static void sql_clear_clicked_cb (GtkToolButton *button, QueryConsolePage *tconsole);
+static void sql_variables_clicked_cb (GtkToggleToolButton *button, QueryConsolePage *tconsole);
+static void sql_execute_clicked_cb (GtkToolButton *button, QueryConsolePage *tconsole);
+static void sql_indent_clicked_cb (GtkToolButton *button, QueryConsolePage *tconsole);
+static void sql_favorite_clicked_cb (GtkToolButton *button, QueryConsolePage *tconsole);
+
+static void history_copy_clicked_cb (GtkToolButton *button, QueryConsolePage *tconsole);
+static void history_clear_clicked_cb (GtkToolButton *button, QueryConsolePage *tconsole);
 static void history_changed_cb (QueryEditor *history, QueryConsolePage *tconsole);
 
 static void rerun_requested_cb (QueryResult *qres, QueryEditorHistoryBatch *batch,
@@ -233,17 +233,15 @@ query_console_page_new (TConnection *tcnc)
        /* main contents */
        GtkWidget *vpaned;
        vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
+       gtk_style_context_add_class (gtk_widget_get_style_context (vpaned), "paned-no-border");
        tconsole->priv->vpaned = NULL;
-       gtk_box_pack_start (GTK_BOX (tconsole), vpaned, TRUE, TRUE, 6); 
+       gtk_box_pack_start (GTK_BOX (tconsole), vpaned, TRUE, TRUE, 0); 
 
        /* top paned for the editor */
-       GtkWidget *wid, *vbox, *hbox, *bbox, *hpaned, *button;
-
-       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-       gtk_paned_pack1 (GTK_PANED (vpaned), hbox, TRUE, FALSE);
+       GtkWidget *wid, *vbox, *bbox, *hpaned;
 
        hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
-       gtk_box_pack_start (GTK_BOX (hbox), hpaned, TRUE, TRUE, 0);
+       gtk_style_context_add_class (gtk_widget_get_style_context (hpaned), "paned-no-border");
 
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
        gtk_paned_pack1 (GTK_PANED (hpaned), vbox, TRUE, FALSE);
@@ -285,61 +283,69 @@ query_console_page_new (TConnection *tcnc)
        gtk_viewport_set_shadow_type (GTK_VIEWPORT (tconsole->priv->params_form_box), GTK_SHADOW_NONE);
        gtk_container_add (GTK_CONTAINER (sw), tconsole->priv->params_form_box);
        gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
-       gtk_widget_set_size_request (tconsole->priv->params_form_box, 250, -1);
+       gtk_widget_set_size_request (sw, 250, -1);
 
        wid = gtk_label_new ("");
        gtk_label_set_markup (GTK_LABEL (wid), VARIABLES_HELP);
        gtk_widget_set_halign (wid, GTK_ALIGN_START);
        gtk_container_add (GTK_CONTAINER (tconsole->priv->params_form_box), wid);
        tconsole->priv->params_form = wid;
-       
-       bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
-       gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
-       gtk_box_pack_start (GTK_BOX (hbox), bbox, FALSE, FALSE, 5);
-
-       button = ui_make_small_button (FALSE, FALSE, _("Clear"),
-                                      "_Clear", _("Clear the editor's\ncontents"));
-       gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-       g_signal_connect (button, "clicked",
+
+       GtkWidget *packed;
+       GtkWidget *toolbar;
+       packed = ui_widget_add_toolbar (hpaned, &toolbar);
+       gtk_paned_pack1 (GTK_PANED (vpaned), packed, TRUE, FALSE);
+
+       GtkToolItem *titem;
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "edit-clear-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Clear the editor's\ncontents"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       g_signal_connect (titem, "clicked",
                          G_CALLBACK (sql_clear_clicked_cb), tconsole);
 
-       button = ui_make_small_button (TRUE, FALSE, _("Variables"),
-                                      NULL, _("Show variables needed\nto execute SQL"));
-       gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-       tconsole->priv->params_toggle = GTK_TOGGLE_BUTTON (button);
-       g_signal_connect (button, "toggled",
+       titem = gtk_toggle_tool_button_new ();
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "insert-object-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Show variables needed\nto execute SQL"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       tconsole->priv->params_toggle = GTK_TOGGLE_TOOL_BUTTON (titem);
+       g_signal_connect (titem, "toggled",
                          G_CALLBACK (sql_variables_clicked_cb), tconsole);
 
-       button = ui_make_small_button (FALSE, FALSE, _("Execute"),
-                                      "_Execute", _("Execute SQL in editor"));
-       tconsole->priv->exec_button = button;
-       gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-       g_signal_connect (button, "clicked",
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "system-run-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Execute SQL in editor"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       tconsole->priv->exec_button = GTK_WIDGET (titem);
+       g_signal_connect (titem, "clicked",
                          G_CALLBACK (sql_execute_clicked_cb), tconsole);
+
        
-       button = ui_make_small_button (FALSE, FALSE, _("Indent"),
-                                      NULL, _("Indent SQL in editor\n"
-                                              "and make the code more readable\n"
-                                              "(removes comments)"));
-       tconsole->priv->indent_button = button;
-       gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-       g_signal_connect (button, "clicked",
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "format-indent-more-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Indent SQL in editor\n"
+                                                          "and make the code more readable\n"
+                                                          "(removes comments)"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       tconsole->priv->indent_button = GTK_WIDGET (titem);
+       g_signal_connect (titem, "clicked",
                          G_CALLBACK (sql_indent_clicked_cb), tconsole);
 
-       button = ui_make_small_button (FALSE, TRUE, _("Favorite"),
-                                      NULL, _("Add SQL to favorite"));
-       gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-       g_signal_connect (button, "clicked",
+       
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "starred-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Add SQL to favorite"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       g_signal_connect (titem, "clicked",
                          G_CALLBACK (sql_favorite_clicked_cb), tconsole);
 
        /* bottom paned for the results and history */
        hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
+       gtk_style_context_add_class (gtk_widget_get_style_context (hpaned), "paned-no-border");
        gtk_paned_pack2 (GTK_PANED (vpaned), hpaned, TRUE, FALSE);
 
        /* bottom left */
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-       gtk_paned_pack1 (GTK_PANED (hpaned), vbox, FALSE, FALSE);
-
        wid = gtk_label_new ("");
        str = g_strdup_printf ("<b>%s</b>", _("Execution history:"));
        gtk_label_set_markup (GTK_LABEL (wid), str);
@@ -355,30 +361,31 @@ query_console_page_new (TConnection *tcnc)
        g_signal_connect (wid, "changed",
                          G_CALLBACK (history_changed_cb), tconsole);
 
-       bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
-       gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0);
-       gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
+       packed = ui_widget_add_toolbar (vbox, &toolbar);
+       gtk_paned_pack1 (GTK_PANED (hpaned), packed, FALSE, FALSE);
 
-       button = ui_make_small_button (FALSE, FALSE, _("Copy"),
-                                      "_Copy", _("Copy selected history\nto editor"));
-       gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-       g_signal_connect (button, "clicked",
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "edit-copy-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Copy selected history\nto editor"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       tconsole->priv->history_copy_button = GTK_WIDGET (titem);
+       gtk_widget_set_sensitive (GTK_WIDGET (titem), FALSE);
+       g_signal_connect (titem, "clicked",
                          G_CALLBACK (history_copy_clicked_cb), tconsole);
-       tconsole->priv->history_copy_button = button;
-       gtk_widget_set_sensitive (button, FALSE);
 
-       button = ui_make_small_button (FALSE, FALSE, _("Clear"),
-                                      "_Clear", _("Clear history"));
-       gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-       g_signal_connect (button, "clicked",
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "edit-clear-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Clear history"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       tconsole->priv->history_del_button = GTK_WIDGET (titem);
+       gtk_widget_set_sensitive (GTK_WIDGET (titem), FALSE);
+       g_signal_connect (titem, "clicked",
                          G_CALLBACK (history_clear_clicked_cb), tconsole);
-       tconsole->priv->history_del_button = button;
-       gtk_widget_set_sensitive (button, FALSE);
 
        /* bottom right */
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
        gtk_paned_pack2 (GTK_PANED (hpaned), vbox, TRUE, FALSE);
-       
+
        wid = gtk_label_new ("");
        str = g_strdup_printf ("<b>%s</b>", _("Execution Results:"));
        gtk_label_set_markup (GTK_LABEL (wid), str);
@@ -447,13 +454,13 @@ history_changed_cb (G_GNUC_UNUSED QueryEditor *history, QueryConsolePage *tconso
 }
 
 static void
-history_clear_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsole)
+history_clear_clicked_cb (G_GNUC_UNUSED GtkToolButton *button, QueryConsolePage *tconsole)
 {
        query_editor_del_all_history_items (tconsole->priv->history);
 }
 
 static void
-history_copy_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsole)
+history_copy_clicked_cb (G_GNUC_UNUSED GtkToolButton *button, QueryConsolePage *tconsole)
 {
        QueryEditorHistoryItem *qih;
        QueryEditor *qe;
@@ -545,8 +552,8 @@ compute_params (QueryConsolePage *tconsole)
                if (tconsole->priv->params && show_variables &&
                    gda_set_is_valid (tconsole->priv->params, NULL))
                        show_variables = FALSE;
-               if (show_variables && !gtk_toggle_button_get_active (tconsole->priv->params_toggle))
-                       gtk_toggle_button_set_active (tconsole->priv->params_toggle, TRUE);
+               if (show_variables && !gtk_toggle_tool_button_get_active (tconsole->priv->params_toggle))
+                       gtk_toggle_tool_button_set_active (tconsole->priv->params_toggle, TRUE);
        }
        else {
                tconsole->priv->params_form = gtk_label_new ("");
@@ -578,16 +585,16 @@ editor_execute_request_cb (G_GNUC_UNUSED QueryEditor *editor, QueryConsolePage *
 }
        
 static void
-sql_variables_clicked_cb (GtkToggleButton *button, QueryConsolePage *tconsole)
+sql_variables_clicked_cb (GtkToggleToolButton *button, QueryConsolePage *tconsole)
 {
-       if (gtk_toggle_button_get_active (button))
+       if (gtk_toggle_tool_button_get_active (button))
                gtk_widget_show (tconsole->priv->params_top);
        else
                gtk_widget_hide (tconsole->priv->params_top);
 }
 
 static void
-sql_clear_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsole)
+sql_clear_clicked_cb (G_GNUC_UNUSED GtkToolButton *button, QueryConsolePage *tconsole)
 {
        query_editor_set_text (tconsole->priv->editor, NULL);
        tconsole->priv->fav_id = -1;
@@ -595,7 +602,7 @@ sql_clear_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsol
 }
 
 static void
-sql_indent_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsole)
+sql_indent_clicked_cb (G_GNUC_UNUSED GtkToolButton *button, QueryConsolePage *tconsole)
 {
        gchar *sql;
        GdaBatch *batch;
@@ -633,7 +640,7 @@ static void sql_favorite_new_mitem_cb (G_GNUC_UNUSED GtkMenuItem *mitem, QueryCo
 static void sql_favorite_modify_mitem_cb (G_GNUC_UNUSED GtkMenuItem *mitem, QueryConsolePage *tconsole);
 
 static void
-sql_favorite_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsole)
+sql_favorite_clicked_cb (G_GNUC_UNUSED GtkToolButton *button, QueryConsolePage *tconsole)
 {
        GtkWidget *menu, *mitem;
        TFavorites *tfav;
@@ -671,7 +678,7 @@ sql_favorite_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tcon
 
        GSList *allfav;
        allfav = t_favorites_list (tfav, 0, T_FAVORITES_QUERIES, ORDER_KEY_QUERIES, NULL);
-       if (allfav) {
+       if (allfav && allfav->next) {
                GtkWidget *submenu;
                GSList *list;
 
@@ -831,7 +838,7 @@ params_form_changed_cb (GdauiBasicForm *form, G_GNUC_UNUSED GdaHolder *param,
 static void actually_execute (QueryConsolePage *tconsole, const gchar *sql, GdaSet *params,
                              gboolean add_editor_history);
 static void
-sql_execute_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsole)
+sql_execute_clicked_cb (G_GNUC_UNUSED GtkToolButton *button, QueryConsolePage *tconsole)
 {
        gchar *sql;
 
diff --git a/tools/browser/query-exec/query-editor.c b/tools/browser/query-exec/query-editor.c
index 5d11196..73e1f51 100644
--- a/tools/browser/query-exec/query-editor.c
+++ b/tools/browser/query-exec/query-editor.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  * Copyright (C) 2015 Gergely Polonkai <gergely polonkai eu>
@@ -94,10 +94,6 @@ struct _QueryEditorPrivate {
        GtkTreeView *completion_treeview;
        GtkCellRenderer *completion_renderer;
        GtkWidget *completion_sw;
-
-       /* tooltip */
-       GtkWidget *ovl;
-       GtkWidget *tooltip_widget;
 };
 
 static void query_editor_class_init (QueryEditorClass *klass);
@@ -693,14 +689,18 @@ copy_all_in_signle_line_cb (GtkMenuItem *mitem, QueryEditor *editor)
 }
 
 static void
-text_view_populate_popup_cb (GtkTextView *entry, GtkMenu *menu, QueryEditor *editor)
+text_view_populate_popup_cb (GtkTextView *entry, GtkWidget *menu, QueryEditor *editor)
 {
-       GtkWidget *mitem;
-       mitem = gtk_menu_item_new_with_label (_("Copy all in a single line"));
-       g_signal_connect (G_OBJECT (mitem), "activate", G_CALLBACK (copy_all_in_signle_line_cb),
-                         editor);
-        gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), mitem);
-        gtk_widget_show (mitem);
+       if (GTK_IS_MENU (menu)) {
+               if (editor->priv->mode != QUERY_EDITOR_HISTORY) {
+                       GtkWidget *mitem;
+                       mitem = gtk_menu_item_new_with_label (_("Copy all in a single line"));
+                       g_signal_connect (G_OBJECT (mitem), "activate",
+                                         G_CALLBACK (copy_all_in_signle_line_cb), editor);
+                       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), mitem);
+                       gtk_widget_show (mitem);
+               }
+       }
 }
 
 static void
@@ -709,7 +709,7 @@ query_editor_init (QueryEditor *editor, G_GNUC_UNUSED QueryEditorClass *klass)
        int tab = 8;
        gboolean highlight = TRUE;
        gboolean showlinesno = FALSE;
-       GtkWidget *ovl, *wid;
+       GtkWidget *wid;
 
        g_return_if_fail (QUERY_IS_EDITOR (editor));
 
@@ -729,32 +729,12 @@ query_editor_init (QueryEditor *editor, G_GNUC_UNUSED QueryEditorClass *klass)
        editor->priv->completion_popup = NULL;
 
        /* set up widgets */
-       ovl = widget_overlay_new ();
-       editor->priv->ovl = ovl;
-       gtk_box_pack_start (GTK_BOX (editor), ovl, TRUE, TRUE, 2);
-
        editor->priv->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+       gtk_box_pack_start (GTK_BOX (editor), editor->priv->scrolled_window, TRUE, TRUE, 2);
         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (editor->priv->scrolled_window),
-                                            GTK_SHADOW_ETCHED_OUT);
+                                            GTK_SHADOW_NONE);
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (editor->priv->scrolled_window),
                                        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-       gtk_container_add (GTK_CONTAINER (ovl), editor->priv->scrolled_window);
-       widget_overlay_set_child_props (WIDGET_OVERLAY (ovl), editor->priv->scrolled_window,
-                                       WIDGET_OVERLAY_CHILD_HALIGN, WIDGET_OVERLAY_ALIGN_FILL,
-                                       WIDGET_OVERLAY_CHILD_VALIGN, WIDGET_OVERLAY_ALIGN_FILL,
-                                       -1);
-
-       wid = gtk_label_new ("");
-       editor->priv->tooltip_widget = wid;
-       gtk_label_set_markup (GTK_LABEL (wid), QUERY_EDITOR_TOOLTIP);
-       gtk_container_add (GTK_CONTAINER (ovl), wid);
-       widget_overlay_set_child_props (WIDGET_OVERLAY (ovl), wid,
-                                       WIDGET_OVERLAY_CHILD_HALIGN, WIDGET_OVERLAY_ALIGN_CENTER,
-                                       WIDGET_OVERLAY_CHILD_VALIGN, WIDGET_OVERLAY_ALIGN_CENTER,
-                                       WIDGET_OVERLAY_CHILD_ALPHA, .8,
-                                       WIDGET_OVERLAY_CHILD_TOOLTIP, TRUE,
-                                       -1);
-
 #ifdef HAVE_GTKSOURCEVIEW
        editor->priv->text = gtk_source_view_new ();
        gtk_source_buffer_set_highlight_syntax (GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW 
(editor->priv->text))),
@@ -764,6 +744,7 @@ query_editor_init (QueryEditor *editor, G_GNUC_UNUSED QueryEditorClass *klass)
 #else
        editor->priv->text = gtk_text_view_new ();
 #endif
+       gtk_widget_set_tooltip_markup (editor->priv->text, QUERY_EDITOR_TOOLTIP);
 
        gtk_container_add (GTK_CONTAINER (editor->priv->scrolled_window), editor->priv->text);
        g_signal_connect (editor->priv->text, "event", 
@@ -804,10 +785,10 @@ query_editor_init (QueryEditor *editor, G_GNUC_UNUSED QueryEditorClass *klass)
 
        create_tags_for_sql (editor, QUERY_EDITOR_LANGUAGE_SQL);
 
-       gtk_widget_show_all (ovl);
-
        /* timeout function to update timestamps */
        editor->priv->ts_timeout_id = 0;
+
+       gtk_widget_show_all (GTK_WIDGET (editor));
 }
 
 static void
@@ -1000,8 +981,6 @@ query_editor_set_mode (QueryEditor *editor, QueryEditorMode mode)
                gtk_widget_set_tooltip_markup (editor->priv->text, NULL);
                gtk_text_view_set_editable (GTK_TEXT_VIEW (editor->priv->text), FALSE);
                gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (editor->priv->text), FALSE);
-               gtk_widget_destroy (editor->priv->tooltip_widget);
-               editor->priv->tooltip_widget = NULL;
                break;
        default:
                g_assert_not_reached ();
diff --git a/tools/browser/schema-browser/objects-index.c b/tools/browser/schema-browser/objects-index.c
index b31aa19..52945aa 100644
--- a/tools/browser/schema-browser/objects-index.c
+++ b/tools/browser/schema-browser/objects-index.c
@@ -172,7 +172,7 @@ objects_index_new (TConnection *tcnc)
        GtkWidget *label;
        gchar *str;
 
-       str = g_strdup_printf ("<b>%s</b>", _("Tables' index"));
+       str = g_strdup_printf ("<b>%s</b>\n", _("Index of tables and views"));
        label = gdaui_bar_new (str);
        g_free (str);
         gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
diff --git a/tools/browser/schema-browser/perspective-main.c b/tools/browser/schema-browser/perspective-main.c
index d470d91..a36596b 100644
--- a/tools/browser/schema-browser/perspective-main.c
+++ b/tools/browser/schema-browser/perspective-main.c
@@ -24,13 +24,14 @@
 #include <gmodule.h>
 #include "perspective-main.h"
 #include "schema-browser-perspective.h"
+#include "../perspectives-names.h"
 
 static BrowserPerspectiveFactory bfact;
 
 BrowserPerspectiveFactory *
 schema_browser_perspective_get_factory (void)
 {
-       bfact.id = "SchBrowP";
+       bfact.id = SCHEMA_BROWSER_PERSPECTIVE_NAME;
        bfact.perspective_name = _("Schema browser");
        bfact.menu_shortcut = "<control>B";
        bfact.perspective_create = schema_browser_perspective_new;
diff --git a/tools/browser/schema-browser/schema-browser-perspective.c 
b/tools/browser/schema-browser/schema-browser-perspective.c
index adae26d..646b9c0 100644
--- a/tools/browser/schema-browser/schema-browser-perspective.c
+++ b/tools/browser/schema-browser/schema-browser-perspective.c
@@ -1,5 +1,5 @@
 /*
-5 4* Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
diff --git a/tools/browser/schema-browser/table-info.c b/tools/browser/schema-browser/table-info.c
index d574d0c..a8d88f7 100644
--- a/tools/browser/schema-browser/table-info.c
+++ b/tools/browser/schema-browser/table-info.c
@@ -40,6 +40,11 @@
 #include <libgda/gda-data-model-extra.h>
 #include "../fk-declare.h"
 #include <libgda/gda-debug-macros.h>
+#include "../perspectives-names.h"
+
+#define PAGE_COLUMNS "C"
+#define PAGE_RELATIONS "R"
+#define PAGE_PREFS "P"
 
 struct _TableInfoPrivate {
        TConnection *tcnc;
@@ -49,9 +54,8 @@ struct _TableInfoPrivate {
        gchar *table_short_name;
 
        GdauiBar *header;
-       GtkWidget *contents; /* notebook with pageO <=> @unknown_table_notice, page1 <=> @pages */
+       GtkWidget *contents; /* notebook with pageO <=> @unknown_table_notice, page1 <=> pages stack */
        GtkWidget *unknown_table_notice;
-       GtkWidget *pages; /* notebook to store individual pages */
 
        GtkWidget *insert_popup;
        GHashTable *insert_columns_hash; /* key = column index as a pointer, value = GdaHolder in the
@@ -258,10 +262,46 @@ source_drag_data_get_cb (G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED GdkDragC
        }
 }
 
+static GdaMetaDbObject *
+get_table_meta_data (TableInfo *tinfo)
+{
+       gtk_widget_set_sensitive (GTK_WIDGET (tinfo), FALSE);
+       GdaMetaStruct *mstruct;
+       mstruct = t_connection_get_meta_struct (tinfo->priv->tcnc);
+       if (!mstruct) {
+               BrowserWindow *bwin;
+               bwin = (BrowserWindow*) gtk_widget_get_toplevel ((GtkWidget*) tinfo);
+               gtk_widget_set_sensitive (GTK_WIDGET (tinfo), TRUE);
+               ui_show_error (GTK_WINDOW (bwin), _("Meta data not yet available"));
+               return NULL;
+       }
+
+       /* get table's information */
+       GdaMetaDbObject *dbo;
+       GValue *v1, *v2;
+       g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)),
+                           tinfo->priv->schema);
+       g_value_set_string ((v2 = gda_value_new (G_TYPE_STRING)),
+                           tinfo->priv->table_name);
+       dbo = gda_meta_struct_complement (mstruct,
+                                         GDA_META_DB_TABLE, NULL, v1, v2, NULL);
+       gda_value_free (v1);
+       gda_value_free (v2);
+
+       if (! dbo) {
+               BrowserWindow *bwin;
+               bwin = (BrowserWindow*) gtk_widget_get_toplevel ((GtkWidget*) tinfo);
+               gtk_widget_set_sensitive (GTK_WIDGET (tinfo), TRUE);
+               ui_show_error (GTK_WINDOW (bwin), _("Can't find information about table"));
+       }
+
+       gtk_widget_set_sensitive (GTK_WIDGET (tinfo), TRUE);
+       return dbo;
+}
+
 static void
 meta_changed_cb (G_GNUC_UNUSED TConnection *tcnc, GdaMetaStruct *mstruct, TableInfo *tinfo)
 {
-       GdaMetaDbObject *dbo;
        GValue *schema_v = NULL, *name_v;
 
        if (tinfo->priv->insert_columns_hash) {
@@ -273,13 +313,6 @@ meta_changed_cb (G_GNUC_UNUSED TConnection *tcnc, GdaMetaStruct *mstruct, TableI
                tinfo->priv->insert_popup = NULL;
        }
 
-       g_value_set_string ((schema_v = gda_value_new (G_TYPE_STRING)), tinfo->priv->schema);
-       g_value_set_string ((name_v = gda_value_new (G_TYPE_STRING)), tinfo->priv->table_name);
-       dbo = gda_meta_struct_get_db_object (mstruct, NULL, schema_v, name_v);
-       if (schema_v)
-               gda_value_free (schema_v);
-       gda_value_free (name_v);
-
        if (tinfo->priv->table_short_name) {
                g_free (tinfo->priv->table_short_name);
                tinfo->priv->table_short_name = NULL;
@@ -288,6 +321,9 @@ meta_changed_cb (G_GNUC_UNUSED TConnection *tcnc, GdaMetaStruct *mstruct, TableI
                g_signal_handlers_disconnect_by_func (tinfo->priv->header,
                                                      G_CALLBACK (source_drag_data_get_cb), tinfo);
        }
+
+       GdaMetaDbObject *dbo;
+       dbo = get_table_meta_data (tinfo);
        if (dbo) {
                tinfo->priv->table_short_name = g_strdup (dbo->obj_short_name);
                gtk_drag_source_set ((GtkWidget *) tinfo->priv->header, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
@@ -323,14 +359,32 @@ table_info_new (TConnection *tcnc,
                          G_CALLBACK (meta_changed_cb), tinfo);
        tinfo->priv->schema = g_strdup (schema);
        tinfo->priv->table_name = g_strdup (table);
-       
+
+       GdaMetaDbObject *dbo;
+       dbo = get_table_meta_data (tinfo);
+
        /* header */
         GtkWidget *label;
        gchar *str, *tmp;
 
+       /* To translators: "Object" is used when we can't determine if @table is a table or a view */
+       const gchar *otype = _("Object");
+       if (dbo) {
+               switch (dbo->obj_type) {
+               case GDA_META_DB_TABLE:
+                       otype = _("Table");
+                       break;
+               case GDA_META_DB_VIEW:
+                       otype = _("View");
+                       break;
+               default:
+                       break;
+               }
+       }
+
        /* To translators: "In schema" refers to the database schema an object is in */
        tmp = g_strdup_printf (_("In schema '%s'"), schema);
-       str = g_strdup_printf ("<b>%s</b>\n%s", table, tmp);
+       str = g_markup_printf_escaped ("%s <b>%s</b>\n%s", otype, table, tmp);
        g_free (tmp);
        label = gdaui_bar_new (str);
        g_free (str);
@@ -364,44 +418,39 @@ table_info_new (TConnection *tcnc,
        tinfo->priv->unknown_table_notice = label;
 
        /* notebook for the pages */
-       GtkWidget *sub_nb;
-       sub_nb = gtk_notebook_new ();
-       tinfo->priv->pages = sub_nb;
-       gtk_notebook_append_page (GTK_NOTEBOOK (top_nb), sub_nb, NULL);
-       gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sub_nb), GTK_POS_BOTTOM);
+       GtkWidget *sub_stack;
+       sub_stack = gtk_stack_new ();
+       gtk_stack_set_transition_type (GTK_STACK (sub_stack), GTK_STACK_TRANSITION_TYPE_CROSSFADE);
+       GtkWidget *vbox;
+       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+       gtk_box_pack_start (GTK_BOX (vbox), sub_stack, TRUE, TRUE, 0);
+       GtkWidget *ss;
+       ss = gtk_stack_switcher_new ();
+       gdaui_bar_add_widget (tinfo->priv->header, ss);
+       gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (ss), GTK_STACK (sub_stack));
+       gtk_widget_show (ss);
+       gtk_notebook_append_page (GTK_NOTEBOOK (top_nb), vbox, NULL);
 
        /* append pages */
        GtkWidget *page;
        page = table_columns_new (tinfo);
        if (page) {
-               label = gtk_label_new ("");
-               str = g_strdup_printf ("<small>%s</small>", _("Columns"));
-               gtk_label_set_markup (GTK_LABEL (label), str);
-               g_free (str);
                gtk_widget_show (page);
-               gtk_notebook_append_page (GTK_NOTEBOOK (sub_nb), page, label);
+               gtk_stack_add_titled (GTK_STACK (sub_stack), page, PAGE_COLUMNS, _("Columns"));
        }
 #ifdef HAVE_GOOCANVAS
        page = table_relations_new (tinfo);
        if (page) {
-               label = gtk_label_new ("");
-               str = g_strdup_printf ("<small>%s</small>", _("Relations"));
-               gtk_label_set_markup (GTK_LABEL (label), str);
-               g_free (str);
                gtk_widget_show (page);
-               gtk_notebook_append_page (GTK_NOTEBOOK (sub_nb), page, label);
+               gtk_stack_add_titled (GTK_STACK (sub_stack), page, PAGE_RELATIONS, _("Relations"));
        }
 #endif
        page = table_preferences_new (tinfo);
        if (page) {
-               label = gtk_label_new ("");
-               str = g_strdup_printf ("<small>%s</small>", _("Preferences"));
-               gtk_label_set_markup (GTK_LABEL (label), str);
-               g_free (str);
                gtk_widget_show (page);
-               gtk_notebook_append_page (GTK_NOTEBOOK (sub_nb), page, label);
+               gtk_stack_add_titled (GTK_STACK (sub_stack), page, PAGE_PREFS, _("Preferences"));
        }
-       gtk_notebook_set_current_page (GTK_NOTEBOOK (sub_nb), 0);
+       gtk_stack_set_visible_child_name (GTK_STACK (sub_stack), PAGE_COLUMNS);
 
        /* show everything */
         gtk_widget_show_all (top_nb);
@@ -411,6 +460,8 @@ table_info_new (TConnection *tcnc,
        mstruct = t_connection_get_meta_struct (tinfo->priv->tcnc);
        if (mstruct)
                meta_changed_cb (tinfo->priv->tcnc, mstruct, tinfo);
+       else
+               display_table_not_found_error (tinfo, dbo ? FALSE : TRUE);
 
        return (GtkWidget*) tinfo;
 }
@@ -487,7 +538,7 @@ action_view_contents_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVar
        BrowserWindow *bwin;
        BrowserPerspective *pers;
        bwin = (BrowserWindow*) gtk_widget_get_toplevel ((GtkWidget*) tinfo);
-       pers = browser_window_change_perspective (bwin, _("Data manager"));
+       pers = browser_window_change_perspective (bwin, DATA_MANAGER_PERSPECTIVE_NAME);
 
        xmlDocPtr doc;
        xmlNodePtr node, topnode;
@@ -662,31 +713,11 @@ action_insert_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *s
                return;
        }
 
-       BrowserWindow *bwin;
-       GdaMetaStruct *mstruct;
-       bwin = (BrowserWindow*) gtk_widget_get_toplevel ((GtkWidget*) tinfo);
-       mstruct = t_connection_get_meta_struct (tinfo->priv->tcnc);
-       if (!mstruct) {
-               ui_show_error (GTK_WINDOW (bwin), _("Meta data not yet available"));
-               return;
-       }
-
        /* get table's information */
        GdaMetaDbObject *dbo;
-       GValue *v1, *v2;
-       g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)),
-                           tinfo->priv->schema);
-       g_value_set_string ((v2 = gda_value_new (G_TYPE_STRING)),
-                           tinfo->priv->table_name);
-       dbo = gda_meta_struct_complement (mstruct,
-                                         GDA_META_DB_TABLE, NULL, v1, v2, NULL);
-       gda_value_free (v1);
-       gda_value_free (v2);
-
-       if (! dbo) {
-               ui_show_error (GTK_WINDOW (bwin), _("Can't find information about table"));
+       dbo = get_table_meta_data (tinfo);
+       if (! dbo)
                return;
-       }
 
        /* build statement */
        GdaSqlBuilder *b;
@@ -713,6 +744,16 @@ action_insert_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *s
        g_free (sql);
 #endif
 
+       /* common data required further down */
+       BrowserWindow *bwin;
+       GdaMetaStruct *mstruct;
+       bwin = (BrowserWindow*) gtk_widget_get_toplevel ((GtkWidget*) tinfo);
+       mstruct = t_connection_get_meta_struct (tinfo->priv->tcnc);
+       if (!mstruct) {
+               ui_show_error (GTK_WINDOW (bwin), _("Meta data not yet available"));
+               return;
+       }
+
        /* handle user preferences */
        GdaSet *params;
        if (! gda_statement_get_parameters (stmt, &params, NULL)) {
@@ -720,7 +761,7 @@ action_insert_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *s
                sql = gda_statement_to_sql (stmt, NULL, NULL);
 
                ui_show_error (GTK_WINDOW (bwin),
-                                   _("Internal error while building INSERT statement:\n%s"), sql);
+                              _("Internal error while building INSERT statement:\n%s"), sql);
                g_free (sql);
                g_object_unref (stmt);
                return;
@@ -941,15 +982,10 @@ action_declarefk_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant
        GdaMetaStruct *mstruct;
        GdaMetaDbObject *dbo;
        gint response;
-       GValue *v1, *v2;
 
        parent = (GtkWidget*) gtk_widget_get_toplevel ((GtkWidget*) tinfo);
        mstruct = t_connection_get_meta_struct (tinfo->priv->tcnc);
-       g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)), tinfo->priv->schema);
-       g_value_set_string ((v2 = gda_value_new (G_TYPE_STRING)), tinfo->priv->table_name);
-       dbo = gda_meta_struct_get_db_object (mstruct, NULL, v1, v2);
-       gda_value_free (v1);
-       gda_value_free (v2);
+       dbo = get_table_meta_data (tinfo);
        if (!dbo || (dbo->obj_type != GDA_META_DB_TABLE)) {
                ui_show_error ((GtkWindow *) parent, _("Can't find information about table '%s'"),
                                    tinfo->priv->table_short_name);
diff --git a/tools/browser/schema-browser/table-info.h b/tools/browser/schema-browser/table-info.h
index 4e6aed6..cbdb147 100644
--- a/tools/browser/schema-browser/table-info.h
+++ b/tools/browser/schema-browser/table-info.h
@@ -50,7 +50,7 @@ GtkWidget               *table_info_new      (TConnection *tcnc,
                                              const gchar *schema, const gchar *table);
 const gchar             *table_info_get_table_schema (TableInfo *table_info);
 const gchar             *table_info_get_table_name (TableInfo *table_info);
-TConnection       *table_info_get_connection (TableInfo *table_info);
+TConnection             *table_info_get_connection (TableInfo *table_info);
 
 G_END_DECLS
 
diff --git a/tools/browser/schema-browser/table-preferences.c 
b/tools/browser/schema-browser/table-preferences.c
index 3bb572b..8bef034 100644
--- a/tools/browser/schema-browser/table-preferences.c
+++ b/tools/browser/schema-browser/table-preferences.c
@@ -50,8 +50,8 @@ struct _TablePreferencesPrivate {
        gboolean save_plugin_changes;
        GtkWidget *plugins_combo;
        GtkWidget *options_vbox;
-       GtkWidget *options_none;
        GtkWidget *options_wid;
+       GtkWidget *options_label;
        GtkWidget *preview_vbox;
        GtkWidget *preview_none;
        GtkWidget *preview_wid;
@@ -459,11 +459,9 @@ create_column_properties (TablePreferences *tpref)
        /* plugin options */
        tpref->priv->options_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
        gtk_grid_attach (GTK_GRID (grid), tpref->priv->options_vbox, 1, 1, 1, 1);
-       tpref->priv->options_none = gtk_label_new (_("none"));
-       gtk_widget_set_halign (tpref->priv->options_none, GTK_ALIGN_START);
-       gtk_box_pack_start (GTK_BOX (tpref->priv->options_vbox), tpref->priv->options_none, FALSE, FALSE, 0);
 
        label = gtk_label_new (_("Options:"));
+       tpref->priv->options_label = label;
        gtk_widget_set_halign (label, GTK_ALIGN_START);
        gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
 
@@ -639,8 +637,8 @@ plugins_combo_changed_cb (GtkComboBox *combo, TablePreferences *tpref)
 
                        if (tpref->priv->options_wid) {
                                plist = gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM 
(tpref->priv->options_wid));
-                               gtk_widget_hide (tpref->priv->options_none);
                                gtk_widget_show (tpref->priv->options_wid);
+                               gtk_widget_show (tpref->priv->options_label);
 
                                if (plist && !tpref->priv->save_plugin_changes) {
                                        /* load plugin options */
@@ -700,7 +698,7 @@ plugins_combo_changed_cb (GtkComboBox *combo, TablePreferences *tpref)
                gtk_widget_destroy (old_options);
 
        if (! tpref->priv->options_wid)
-               gtk_widget_show (tpref->priv->options_none);
+               gtk_widget_hide (tpref->priv->options_label);
 }
 
 static void
diff --git a/tools/browser/ui-support.c b/tools/browser/ui-support.c
index 1389000..b5d63db 100644
--- a/tools/browser/ui-support.c
+++ b/tools/browser/ui-support.c
@@ -376,12 +376,13 @@ ui_make_small_button (gboolean is_toggle, gboolean with_arrow,
                      const gchar *label, const gchar *icon_name,
                      const gchar *tooltip)
 {
-               GtkWidget *button, *hbox = NULL;
+       GtkWidget *button, *hbox = NULL;
 
        if (is_toggle)
                button = gtk_toggle_button_new ();
        else
                button = gtk_button_new ();
+       gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
        if ((label && icon_name) || with_arrow) {
                hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
                gtk_container_add (GTK_CONTAINER (button), hbox);
@@ -410,7 +411,7 @@ ui_make_small_button (gboolean is_toggle, gboolean with_arrow,
        if (with_arrow) {
                GtkWidget *arrow;
                arrow = gtk_image_new_from_icon_name ("go-next-symbolic", GTK_ICON_SIZE_MENU);
-               gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+               gtk_box_pack_start (GTK_BOX (hbox), arrow, FALSE, FALSE, 0);
                gtk_widget_set_halign (arrow, GTK_ALIGN_END);
                gtk_widget_set_valign (arrow, GTK_ALIGN_CENTER);
                gtk_widget_show (arrow);
@@ -574,3 +575,45 @@ ui_get_pixbuf_icon (UiIconType type)
                return pix;
        }
 }
+
+/**
+ * ui_widget_add_toolbar:
+ * @widget: the widget to wrap
+ * @out_toolbar: a place holder for the new toolbar
+ *
+ * Wraps @widget and add a toolbar. The call is then responsible to add things to the toolbar.
+ *
+ * The returned widget is the one which needs to be incorporated in the UI by the caller, who is also 
responsible
+ * for calling gtk_widget_show().
+ *
+ * Returns: a new #GtkWidget
+ */
+GtkWidget *
+ui_widget_add_toolbar (GtkWidget *widget, GtkWidget **out_toolbar)
+{
+       g_return_val_if_fail (out_toolbar, NULL);
+       g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+       GtkWidget *vbox;
+       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+       gtk_widget_set_margin_bottom (vbox, 6);
+
+       GtkWidget *frame;
+       frame = gtk_frame_new (NULL);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+       gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
+
+       gtk_container_add (GTK_CONTAINER (frame), widget);
+       gtk_widget_show (widget);
+
+       GtkWidget *toolbar;
+       toolbar = gtk_toolbar_new ();
+       gtk_widget_set_halign (toolbar, GTK_ALIGN_START);
+       gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_SMALL_TOOLBAR);
+       gtk_style_context_add_class (gtk_widget_get_style_context (toolbar), "inline-toolbar");
+       gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0);
+       gtk_widget_show (toolbar);
+       *out_toolbar = toolbar;
+
+       return vbox;
+}
diff --git a/tools/browser/ui-support.h b/tools/browser/ui-support.h
index d96984c..ce4cee6 100644
--- a/tools/browser/ui-support.h
+++ b/tools/browser/ui-support.h
@@ -58,6 +58,7 @@ GtkWidget           *ui_make_tab_label_with_icon (const gchar *label,
 GtkWidget           *ui_make_tab_label_with_pixbuf (const gchar *label,
                                                    GdkPixbuf *pixbuf, gboolean with_close,
                                                    GtkWidget **out_close_button);
+GtkWidget           *ui_widget_add_toolbar (GtkWidget *widget, GtkWidget **out_toolbar);
 
 /*
  * icons, use with ui_get_pixbuf_icon() for the associated icons



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]