Exemple #1
0
/**
 * ui_formgrid_handle_user_prefs
 * @formgrid: a #UiFormGrid widget
 * @tcnc: (allow-none): a #TConnection, or %NULL to let @formgrid determine it itself
 * @stmt: the #GdaStatement which has been executed to produce the #GdaDataModel displayed in @formgrid
 *
 * Takes into account the UI preferences of the user
 */
void
ui_formgrid_handle_user_prefs (UiFormGrid *formgrid, TConnection *tcnc, GdaStatement *stmt)
{
	g_return_if_fail (UI_IS_FORMGRID (formgrid));
	if (tcnc)
		g_return_if_fail (T_IS_CONNECTION (tcnc));
	else {
		tcnc = get_t_connection (formgrid);
		if (!tcnc)
			return;
	}
	if (stmt)
		g_return_if_fail (GDA_IS_STATEMENT (stmt));
	else
		return;

	GdaSqlStatement *sqlst;
	g_object_get ((GObject*) stmt, "structure", &sqlst, NULL);
	if (!sqlst)
		return;
	
	GError *lerror = NULL;
	if (((sqlst->stmt_type != GDA_SQL_STATEMENT_SELECT) &&
	     (sqlst->stmt_type != GDA_SQL_STATEMENT_COMPOUND)) ||
	    !t_connection_normalize_sql_statement (tcnc, sqlst, &lerror)) {
		if (lerror)
			g_print ("[%s]\n", lerror->message);
		goto out;	
	}
	
	handle_user_prefs_for_sql_statement (formgrid, tcnc, sqlst);
 out:
	gda_sql_statement_free (sqlst);
}
Exemple #2
0
/**
 * vtable_dialog_new:
 *
 * Returns: a new #GtkWidget
 */
GtkWidget *
vtable_dialog_new (GtkWindow *parent, TConnection *tcnc)
{
	VtableDialog *dlg;
	g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);

	dlg = VTABLE_DIALOG (g_object_new (VTABLE_DIALOG_TYPE, NULL));
	dlg->priv->tcnc = g_object_ref (tcnc);

	if (parent)
		gtk_window_set_transient_for (GTK_WINDOW (dlg), parent);
	gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
	gtk_container_set_border_width (GTK_CONTAINER (dlg), SPACING * 2);
	gtk_window_set_title (GTK_WINDOW (dlg), _("Define LDAP search as a virtual table"));

	GtkWidget *dcontents;
	GtkWidget *label, *entry, *grid, *button;
	gchar *str;
	dcontents = gtk_dialog_get_content_area (GTK_DIALOG (dlg));
	label = gtk_label_new (NULL);
	gtk_widget_set_halign (label, GTK_ALIGN_START);
	str = g_markup_printf_escaped ("<b>%s:</b>\n<small>%s</small>",
				       _("Name of the virtual LDAP table to create"),
				       _("Everytime data is selected from the virtual table which will "
					 "be created, the LDAP search will be executed and data "
					 "returned as the contents of the table."));
	gtk_label_set_markup (GTK_LABEL (label), str);
	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
	g_free (str);
	gtk_box_pack_start (GTK_BOX (dcontents), label, FALSE, FALSE, SPACING);

	grid = gtk_grid_new ();
	gtk_grid_set_column_spacing (GTK_GRID (grid), SPACING);
	gtk_grid_set_row_spacing (GTK_GRID (grid), SPACING);
	gtk_box_pack_start (GTK_BOX (dcontents), grid, FALSE, FALSE, SPACING);

	label = gtk_label_new (_("Table name:"));
	gtk_widget_set_halign (label, GTK_ALIGN_START);
	gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);

	entry = gtk_entry_new ();
	gtk_grid_attach (GTK_GRID (grid), entry, 1, 0, 1, 1);
	dlg->priv->tname_entry = entry;

	label = gtk_label_new (_("Replace if exists:"));
	gtk_widget_set_halign (label, GTK_ALIGN_START);
	gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);

	button = gtk_check_button_new ();
	gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
	dlg->priv->tname_replace = button;

	gtk_widget_show_all (dcontents);
	gtk_dialog_add_buttons (GTK_DIALOG (dlg),
				_("_Ok"), GTK_RESPONSE_OK,
				_("_Cancel"), GTK_RESPONSE_CANCEL, NULL);

	return (GtkWidget*) dlg;
}
Exemple #3
0
/**
 * class_properties_new:
 *
 * Returns: a new #GtkWidget
 */
GtkWidget *
class_properties_new (TConnection *tcnc)
{
	ClassProperties *cprop;
	g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);

	cprop = CLASS_PROPERTIES (g_object_new (CLASS_PROPERTIES_TYPE, NULL));
	cprop->priv->tcnc = g_object_ref (tcnc);
	
	GtkWidget *sw;
        sw = gtk_scrolled_window_new (NULL, NULL);
        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE);
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
                                        GTK_POLICY_AUTOMATIC,
                                        GTK_POLICY_AUTOMATIC);
	gtk_box_pack_start (GTK_BOX (cprop), sw, TRUE, TRUE, 0);

	GtkWidget *textview;
	textview = gtk_text_view_new ();
        gtk_container_add (GTK_CONTAINER (sw), textview);
        gtk_text_view_set_left_margin (GTK_TEXT_VIEW (textview), 5);
        gtk_text_view_set_right_margin (GTK_TEXT_VIEW (textview), 5);
        gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE);
	gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview), FALSE);
        cprop->priv->text = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
	cprop->priv->view = GTK_TEXT_VIEW (textview);
        gtk_widget_show_all (sw);

        gtk_text_buffer_create_tag (cprop->priv->text, "section",
                                    "weight", PANGO_WEIGHT_BOLD,
                                    "foreground", "blue", NULL);

        gtk_text_buffer_create_tag (cprop->priv->text, "error",
                                    "foreground", "red", NULL);

        gtk_text_buffer_create_tag (cprop->priv->text, "data",
                                    "left-margin", 20, NULL);

        gtk_text_buffer_create_tag (cprop->priv->text, "starter",
                                    "indent", -10,
                                    "left-margin", 20, NULL);

	g_signal_connect (textview, "key-press-event", 
			  G_CALLBACK (key_press_event), cprop);
	g_signal_connect (textview, "event-after", 
			  G_CALLBACK (event_after), cprop);
	g_signal_connect (textview, "motion-notify-event", 
			  G_CALLBACK (motion_notify_event), cprop);
	g_signal_connect (textview, "visibility-notify-event", 
			  G_CALLBACK (visibility_notify_event), cprop);

	class_properties_set_class (cprop, NULL);

	return (GtkWidget*) cprop;
}
Exemple #4
0
/**
 * ui_formgrid_set_connection
 * @formgrid: a #UiFormGrid widget
 * @tcnc: (allow-none): a #TConnection, or %NULL
 *
 * Tells @formgrid to use @tcnc as connection when actions have to be executed
 */
void
ui_formgrid_set_connection (UiFormGrid *formgrid, TConnection *tcnc)
{
	g_return_if_fail (UI_IS_FORMGRID (formgrid));
	g_return_if_fail (!tcnc || T_IS_CONNECTION (tcnc));

	if (formgrid->priv->tcnc) {
		g_object_unref (formgrid->priv->tcnc);
		formgrid->priv->tcnc = NULL;
	}
	if (tcnc)
		formgrid->priv->tcnc = g_object_ref (tcnc);
}
Exemple #5
0
/**
 * relations_diagram_new
 *
 * Returns: a new #GtkWidget
 */
GtkWidget *
relations_diagram_new (TConnection *tcnc)
{
    RelationsDiagram *diagram;

    g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);

    diagram = RELATIONS_DIAGRAM (g_object_new (RELATIONS_DIAGRAM_TYPE, NULL));

    diagram->priv->tcnc = g_object_ref (tcnc);
    g_signal_connect (diagram->priv->tcnc, "meta-changed",
                      G_CALLBACK (meta_changed_cb), diagram);
    g_signal_connect (tcnc, "favorites-changed",
                      G_CALLBACK (favorites_changed_cb), diagram);


    /* header */
    GtkWidget *hbox, *wid;
    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
    gtk_box_pack_start (GTK_BOX (diagram), hbox, FALSE, FALSE, 0);

    GtkWidget *label;
    gchar *str;
    str = g_strdup_printf ("<b>%s</b>\n%s", _("Relations diagram"), _("Unsaved"));
    label = gdaui_bar_new (str);
    g_free (str);
    gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
    diagram->priv->header = GDAUI_BAR (label);

    wid = gdaui_bar_add_button_from_icon_name (GDAUI_BAR (label), "document-save");
    diagram->priv->save_button = wid;

    g_signal_connect (wid, "clicked",
                      G_CALLBACK (save_clicked_cb), diagram);

    gtk_widget_show_all (hbox);

    /* main contents */
    wid = browser_canvas_db_relations_new (NULL);
    diagram->priv->canvas = wid;
    gtk_box_pack_start (GTK_BOX (diagram), wid, TRUE, TRUE, 0);
    gtk_widget_show_all (wid);

    GdaMetaStruct *mstruct;
    mstruct = t_connection_get_meta_struct (diagram->priv->tcnc);
    if (mstruct)
        meta_changed_cb (diagram->priv->tcnc, mstruct, diagram);

    return (GtkWidget*) diagram;
}
Exemple #6
0
/**
 * mgr_columns_new
 * @tcnc: a #TConnection object
 * @schema: the schema the table is in
 * @name: the table's name
 *
 * Creates a new #GdaTreeManager object which will add one tree node for column found in the
 * table @schema.@table
 *
 * Returns: a new #GdaTreeManager object
 */
GdaTreeManager*
mgr_columns_new (TConnection *tcnc, const gchar *schema, const gchar *table)
{
	MgrColumns *mgr;
	g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);
	g_return_val_if_fail (schema, NULL);
	g_return_val_if_fail (table, NULL);

	mgr = (MgrColumns*) g_object_new (MGR_COLUMNS_TYPE,
					  "browser-connection", tcnc, NULL);
	mgr->priv->schema = g_strdup (schema);
	mgr->priv->table_name = g_strdup (table);

	return (GdaTreeManager*) mgr;
}
Exemple #7
0
/**
 * objects_index_new:
 *
 *
 *
 * Returns:
 */
GtkWidget *
objects_index_new (TConnection *tcnc)
{
	ObjectsIndex *index;

	g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);
	index = OBJECTS_INDEX (g_object_new (OBJECTS_INDEX_TYPE, NULL));

	index->priv->tcnc = g_object_ref (tcnc);
	g_signal_connect (index->priv->tcnc, "meta-changed",
			  G_CALLBACK (meta_changed_cb), index);

	/* header */
	GtkWidget *hbox, *wid;
	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
	gtk_box_pack_start (GTK_BOX (index), hbox, FALSE, FALSE, 0);

	GtkWidget *label;
	gchar *str;

	str = g_strdup_printf ("<b>%s</b>", _("Tables' index"));
	label = gdaui_bar_new (str);
	g_free (str);
        gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
        gtk_widget_show (label);

	/* cloud */
	GdaMetaStruct *mstruct;
	GtkWidget *cloud;
	mstruct = t_connection_get_meta_struct (index->priv->tcnc);
	cloud = objects_cloud_new (mstruct, OBJECTS_CLOUD_TYPE_TABLE);
	objects_cloud_show_schemas (OBJECTS_CLOUD (cloud), TRUE);
	gtk_box_pack_start (GTK_BOX (index), cloud, TRUE, TRUE, 0);
	index->priv->cloud = OBJECTS_CLOUD (cloud);
	g_signal_connect (cloud, "selected",
			  G_CALLBACK (cloud_object_selected_cb), index);

	/* search entry */
	wid = gdaui_bar_add_search_entry (GDAUI_BAR (label));
	
	g_signal_connect (wid, "changed",
			  G_CALLBACK (find_changed_cb), index);

	return (GtkWidget*) index;
}
/**
 * query_favorite_selector_new
 *
 * Returns: a new #GtkWidget
 */
GtkWidget *
query_favorite_selector_new (TConnection *tcnc)
{
	QueryFavoriteSelector *tsel;
	GdaTreeManager *manager;

	g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);
	tsel = QUERY_FAVORITE_SELECTOR (g_object_new (QUERY_FAVORITE_SELECTOR_TYPE, NULL));

	tsel->priv->tcnc = g_object_ref (tcnc);
	g_signal_connect (t_connection_get_favorites (tsel->priv->tcnc), "favorites-changed",
			  G_CALLBACK (favorites_changed_cb), tsel);
	
	/* create tree managers */
	tsel->priv->tree = gda_tree_new ();
	manager = mgr_favorites_new (tcnc, T_FAVORITES_QUERIES, ORDER_KEY_QUERIES);
        gda_tree_add_manager (tsel->priv->tree, manager);
	g_object_unref (manager);

	/* update the tree's contents */
	if (! gda_tree_update_all (tsel->priv->tree, NULL)) {
		if (tsel->priv->idle_update_favorites == 0)
			tsel->priv->idle_update_favorites = g_idle_add ((GSourceFunc) idle_update_favorites, tsel);
	}

	/* header */
	GtkWidget *label;
	gchar *str;
	str = g_strdup_printf ("<b>%s</b>", _("Favorites"));
	label = gdaui_bar_new (str);
	g_free (str);
	gdaui_bar_set_icon_from_resource (GDAUI_BAR (label), "/images/gda-browser-bookmark.png");
        gtk_box_pack_start (GTK_BOX (tsel), label, FALSE, FALSE, 0);
        gtk_widget_show (label);

	/* tree model */
	GtkTreeModel *model;
	GtkWidget *treeview;
	GtkCellRenderer *renderer;
	GtkTreeViewColumn *column;

	model = gdaui_tree_store_new (tsel->priv->tree, 7,
				      G_TYPE_INT, MGR_FAVORITES_POSITION_ATT_NAME,
				      G_TYPE_OBJECT, "icon",
				      G_TYPE_STRING, MGR_FAVORITES_CONTENTS_ATT_NAME,
				      G_TYPE_UINT, MGR_FAVORITES_TYPE_ATT_NAME,
				      G_TYPE_INT, MGR_FAVORITES_ID_ATT_NAME,
				      G_TYPE_STRING, MGR_FAVORITES_NAME_ATT_NAME,
				      G_TYPE_STRING, "summary");
	treeview = ui_make_tree_view (model);
	tsel->priv->treeview = treeview;
	g_object_unref (model);

	/* icon */
	column = gtk_tree_view_column_new ();

	renderer = gtk_cell_renderer_pixbuf_new ();
	gtk_tree_view_column_pack_start (column, renderer, FALSE);
	gtk_tree_view_column_add_attribute (column, renderer, "pixbuf", COLUMN_ICON);
	g_object_set ((GObject*) renderer, "yalign", 0., NULL);

	/* text */
	renderer = gtk_cell_renderer_text_new ();
	gtk_tree_view_column_pack_start (column, renderer, TRUE);
	gtk_tree_view_column_set_cell_data_func (column, renderer, (GtkTreeCellDataFunc) cell_data_func,
						 NULL, NULL);
	gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
	gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
	
	/* scrolled window packing */
	GtkWidget *sw;
	sw = gtk_scrolled_window_new (NULL, NULL);
	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
					     GTK_SHADOW_ETCHED_IN);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
					GTK_POLICY_NEVER,
					GTK_POLICY_AUTOMATIC);
	gtk_container_add (GTK_CONTAINER (sw), treeview);
	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);	

	gtk_box_pack_start (GTK_BOX (tsel), sw, TRUE, TRUE, 0);
	gtk_widget_show_all (sw);
	g_signal_connect (G_OBJECT (treeview), "row-activated",
			  G_CALLBACK (selection_changed_cb), tsel);
	g_signal_connect (G_OBJECT (treeview), "key-press-event",
			  G_CALLBACK (key_press_event_cb), tsel);
	g_signal_connect (G_OBJECT (treeview), "popup-menu",
			  G_CALLBACK (popup_menu_cb), tsel);
	g_signal_connect (G_OBJECT (treeview), "button-press-event",
			  G_CALLBACK (button_press_event_cb), tsel);

	/* DnD */
	gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (treeview), dbo_table, G_N_ELEMENTS (dbo_table),
					      GDK_ACTION_COPY);
	gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (treeview), GDK_BUTTON1_MASK,
						dbo_table, G_N_ELEMENTS (dbo_table),
						GDK_ACTION_COPY | GDK_ACTION_MOVE);
	g_signal_connect (model, "drag-drop",
			  G_CALLBACK (tree_store_drag_drop_cb), tsel);
	g_signal_connect (model, "drag-can-drag",
			  G_CALLBACK (tree_store_drag_can_drag_cb), tsel);
	g_signal_connect (model, "drag-get",
			  G_CALLBACK (tree_store_drag_get_cb), tsel);

	return (GtkWidget*) tsel;
}
Exemple #9
0
/**
 * filter_editor_new:
 *
 * Returns: a new #GtkWidget
 */
GtkWidget *
filter_editor_new (TConnection *tcnc)
{
	FilterEditor *feditor;
	GtkWidget *grid, *label, *entry;
	GdaDataModel *model;
	GList *values;
	GValue *v1, *v2;

	g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);

	feditor = FILTER_EDITOR (g_object_new (FILTER_EDITOR_TYPE, NULL));
	feditor->priv->tcnc = g_object_ref ((GObject*) tcnc);

	grid = gtk_grid_new ();
	gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
	gtk_box_pack_start (GTK_BOX (feditor), grid, TRUE, TRUE, 0);
	
	label = gtk_label_new (_("Base DN:"));
	gtk_widget_set_halign (label, GTK_ALIGN_START);
	gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
	label = gtk_label_new (_("Filter expression:"));
	gtk_widget_set_halign (label, GTK_ALIGN_START);
	gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
	label = gtk_label_new (_("Attributes to fetch:"));
	gtk_widget_set_halign (label, GTK_ALIGN_START);
	gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
	label = gtk_label_new (_("Search scope:"));
	gtk_widget_set_halign (label, GTK_ALIGN_START);
	gtk_grid_attach (GTK_GRID (grid), label, 0, 3, 1, 1);
	
	entry = gtk_entry_new ();
	gtk_widget_set_hexpand (entry, TRUE);
	gtk_grid_attach (GTK_GRID (grid), entry, 1, 0, 1, 1);
	feditor->priv->base_dn = entry;
	g_signal_connect (entry, "activate",
			  G_CALLBACK (activated_cb), feditor);

	entry = gtk_entry_new ();
	gtk_widget_set_hexpand (entry, TRUE);
	gtk_grid_attach (GTK_GRID (grid), entry, 1, 1, 1, 1);
	feditor->priv->filter = entry;
	g_signal_connect (entry, "activate",
			  G_CALLBACK (activated_cb), feditor);

	entry = gtk_entry_new ();
	gtk_widget_set_hexpand (entry, TRUE);
	gtk_grid_attach (GTK_GRID (grid), entry, 1, 2, 1, 1);
	feditor->priv->attributes = entry;
	g_signal_connect (entry, "activate",
			  G_CALLBACK (activated_cb), feditor);

	model = gda_data_model_array_new_with_g_types (2, G_TYPE_INT, G_TYPE_STRING);
	g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)), "Base (search the base DN only)");
	values = g_list_prepend (NULL, v1);
	g_value_set_int ((v2 = gda_value_new (G_TYPE_INT)), GDA_LDAP_SEARCH_BASE);
	values = g_list_prepend (values, v2);
	g_assert (gda_data_model_append_values (model, values, NULL) >= 0);
	gda_value_free (v1);
	gda_value_free (v2);

	g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)), "Onelevel (search immediate children of base DN only)");
	values = g_list_prepend (NULL, v1);
	g_value_set_int ((v2 = gda_value_new (G_TYPE_INT)), GDA_LDAP_SEARCH_ONELEVEL);
	values = g_list_prepend (values, v2);
	g_assert (gda_data_model_append_values (model, values, NULL) >= 0);
	gda_value_free (v1);
	gda_value_free (v2);

	g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)), "Subtree (search of the base DN and the entire subtree below)");
	values = g_list_prepend (NULL, v1);
	g_value_set_int ((v2 = gda_value_new (G_TYPE_INT)), GDA_LDAP_SEARCH_SUBTREE);
	values = g_list_prepend (values, v2);
	g_assert (gda_data_model_append_values (model, values, NULL) >= 0);
	gda_value_free (v1);
	gda_value_free (v2);

	gint cols[] = {1};
	entry = gdaui_combo_new_with_model (model, 1, cols);
	gtk_widget_set_hexpand (entry, TRUE);
	g_object_unref (model);
	gtk_grid_attach (GTK_GRID (grid), entry, 1, 3, 1, 1);
	feditor->priv->scope = entry;
	filter_editor_clear (feditor);

	gtk_widget_show_all (grid);
	return (GtkWidget*) feditor;
}
Exemple #10
0
/**
 * query_console_page_new
 *
 * Returns: a new #GtkWidget
 */
GtkWidget *
query_console_page_new (TConnection *tcnc)
{
	QueryConsolePage *tconsole;

	g_return_val_if_fail (T_IS_CONNECTION (tcnc), NULL);

	tconsole = QUERY_CONSOLE_PAGE (g_object_new (QUERY_CONSOLE_PAGE_TYPE, NULL));

	tconsole->priv->tcnc = g_object_ref (tcnc);
	
	/* header */
        GtkWidget *label;
	gchar *str;
	str = g_strdup_printf ("<b>%s</b>", _("Query editor"));
	label = gdaui_bar_new (str);
	g_free (str);
        gtk_box_pack_start (GTK_BOX (tconsole), label, FALSE, FALSE, 0);
        gtk_widget_show (label);
	tconsole->priv->header = GDAUI_BAR (label);

	/* main contents */
	GtkWidget *vpaned;
	vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
	tconsole->priv->vpaned = NULL;
	gtk_box_pack_start (GTK_BOX (tconsole), vpaned, TRUE, TRUE, 6);	

	/* 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);

	hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
	gtk_box_pack_start (GTK_BOX (hbox), hpaned, TRUE, TRUE, 0);

	vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
	gtk_paned_pack1 (GTK_PANED (hpaned), vbox, TRUE, FALSE);

	wid = gtk_label_new ("");
	str = g_strdup_printf ("<b>%s</b>", _("SQL code to execute:"));
	gtk_label_set_markup (GTK_LABEL (wid), str);
	g_free (str);
	gtk_widget_set_halign (wid, GTK_ALIGN_START);
	gtk_widget_set_tooltip_markup (wid, QUERY_EDITOR_TOOLTIP);
	gtk_box_pack_start (GTK_BOX (vbox), wid, FALSE, FALSE, 0);

	wid = query_editor_new ();
	tconsole->priv->editor = QUERY_EDITOR (wid);
	gtk_box_pack_start (GTK_BOX (vbox), wid, TRUE, TRUE, 0);
	g_signal_connect (wid, "changed",
			  G_CALLBACK (editor_changed_cb), tconsole);
	g_signal_connect (wid, "execute-request",
			  G_CALLBACK (editor_execute_request_cb), tconsole);
	
	vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
	tconsole->priv->params_top = vbox;
	gtk_paned_pack2 (GTK_PANED (hpaned), vbox, FALSE, FALSE);
	
	wid = gtk_label_new ("");
	str = g_strdup_printf ("<b>%s</b>", _("Variables' values:"));
	gtk_label_set_markup (GTK_LABEL (wid), str);
	g_free (str);
	gtk_widget_set_halign (wid, GTK_ALIGN_START);
	gtk_box_pack_start (GTK_BOX (vbox), wid, FALSE, FALSE, 0);
	
	GtkWidget *sw;
	sw = gtk_scrolled_window_new (NULL, NULL);
	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
					GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
	tconsole->priv->params_form_box = gtk_viewport_new (NULL, NULL);
	gtk_widget_set_name (tconsole->priv->params_form_box, "gdaui-transparent-background");
	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);

	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",
			  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",
			  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",
			  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",
			  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",
			  G_CALLBACK (sql_favorite_clicked_cb), tconsole);

	/* bottom paned for the results and history */
	hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
	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);
	g_free (str);
	gtk_widget_set_halign (wid, GTK_ALIGN_START);
	gtk_box_pack_start (GTK_BOX (vbox), wid, FALSE, FALSE, 0);

	wid = query_editor_new ();
	tconsole->priv->history = QUERY_EDITOR (wid);
	query_editor_set_mode (tconsole->priv->history, QUERY_EDITOR_HISTORY);
	gtk_widget_set_size_request (wid, 200, -1);
	gtk_box_pack_start (GTK_BOX (vbox), wid, TRUE, TRUE, 6);
	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);

	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",
			  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",
			  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);
	g_free (str);
	gtk_widget_set_halign (wid, GTK_ALIGN_START);
	gtk_box_pack_start (GTK_BOX (vbox), wid, FALSE, FALSE, 0);

	wid = query_result_new (tconsole->priv->history);
	tconsole->priv->query_result = wid;
	gtk_box_pack_start (GTK_BOX (vbox), wid, TRUE, TRUE, 0);
	g_signal_connect (wid, "rerun-requested",
			  G_CALLBACK (rerun_requested_cb), tconsole);

	/* show everything */
        gtk_widget_show_all (vpaned);
	gtk_widget_hide (tconsole->priv->params_top);

	/* busy connection handling */
	connection_status_changed_cb (tconsole->priv->tcnc,
				      gda_connection_get_status (t_connection_get_cnc (tconsole->priv->tcnc)),
				      tconsole);

	g_signal_connect (tconsole->priv->tcnc, "status-changed",
			  G_CALLBACK (connection_status_changed_cb), tconsole);

	return (GtkWidget*) tconsole;
}