/**
 * schema_browser_perspective_display_diagram
 *
 */
void
schema_browser_perspective_display_diagram (SchemaBrowserPerspective *bpers, gint fav_id)
{
	GtkWidget *diagram = NULL;

	if (fav_id >= 0) {
		gint ntabs, i;
		
		ntabs = gtk_notebook_get_n_pages (GTK_NOTEBOOK (bpers->priv->notebook));
		for (i = 0; i < ntabs; i++) {
			GtkWidget *child;
			child = gtk_notebook_get_nth_page (GTK_NOTEBOOK (bpers->priv->notebook), i);
			if (IS_RELATIONS_DIAGRAM (child)) {
				if (relations_diagram_get_fav_id (RELATIONS_DIAGRAM (child)) == fav_id) {
					gtk_notebook_set_current_page (GTK_NOTEBOOK (bpers->priv->notebook), i);
					return;
				}
			}
		}

		GError *error = NULL;
		diagram = relations_diagram_new_with_fav_id (browser_window_get_connection (bpers->priv->bwin),
							     fav_id, &error);
		if (! diagram) {
			ui_show_error ((GtkWindow*) gtk_widget_get_toplevel ((GtkWidget*) bpers),
					    error && error->message ? error->message :
					    _("Could not load diagram"));
			g_clear_error (&error);
		}
	}
	else
		diagram = relations_diagram_new (browser_window_get_connection (bpers->priv->bwin));

	if (diagram) {
		GtkWidget *close_btn;
		GtkWidget *tab_label;
		gint i;
		
		tab_label = browser_page_get_tab_label (BROWSER_PAGE (diagram), &close_btn);
		i = gtk_notebook_append_page (GTK_NOTEBOOK (bpers->priv->notebook), diagram, tab_label);
		g_signal_connect (close_btn, "clicked",
				  G_CALLBACK (close_button_clicked_cb), diagram);
		
		gtk_widget_show (diagram);

		tab_label = browser_page_get_tab_label (BROWSER_PAGE (diagram), NULL);
		gtk_notebook_set_menu_label (GTK_NOTEBOOK (bpers->priv->notebook), diagram, tab_label);

		gtk_notebook_set_current_page (GTK_NOTEBOOK (bpers->priv->notebook), i);
		gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (bpers->priv->notebook), diagram,
						  TRUE);
		gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (bpers->priv->notebook), diagram,
						 TRUE);
	}
}
Example #2
0
GtkWidget *
relations_diagram_new_with_fav_id (TConnection *tcnc, gint fav_id, GError **error)
{
    RelationsDiagram *diagram = NULL;
    TFavoritesAttributes fav;
    xmlDocPtr doc = NULL;

    if (! t_favorites_get (t_connection_get_favorites (tcnc),
                           fav_id, &fav, error))
        return FALSE;


    doc = xmlParseDoc (BAD_CAST fav.contents);
    if (!doc) {
        g_set_error (error, T_ERROR, T_INTERNAL_COMMAND_ERROR,
                     "%s", _("Error parsing favorite's contents"));
        goto out;
    }

    /* create diagram */
    diagram = RELATIONS_DIAGRAM (relations_diagram_new (tcnc));
    if (!diagram)
        goto out;
    gchar *str, *tmp;
    tmp = g_markup_printf_escaped (_("'%s' diagram"), fav.name);
    str = g_strdup_printf ("<b>%s</b>\n%s", _("Relations diagram"), tmp);
    g_free (tmp);
    gdaui_bar_set_text (diagram->priv->header, str);
    g_free (str);
    diagram->priv->fav_id = fav_id;
    relations_diagram_set_fav_id (diagram, fav_id, NULL);

    /* fill the diagram */
    xmlNodePtr root, node;
    root = xmlDocGetRootElement (doc);
    if (!root)
        goto out;
    for (node = root->children; node; node = node->next) {
        if (!strcmp ((gchar*) node->name, "table")) {
            xmlChar *schema;
            xmlChar *name;
            schema = xmlGetProp (node, BAD_CAST "schema");
            name = xmlGetProp (node, BAD_CAST "name");
            if (schema && name) {
                BrowserCanvasTable *table;
                GValue *v1, *v2;
                g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)), (gchar*) schema);
                g_value_set_string ((v2 = gda_value_new (G_TYPE_STRING)), (gchar*) name);
                xmlFree (schema);
                xmlFree (name);
                table = browser_canvas_db_relations_add_table (BROWSER_CANVAS_DB_RELATIONS (diagram->priv->canvas),
                        NULL, v1, v2);
                gda_value_free (v1);
                gda_value_free (v2);
                if (table) {
                    xmlChar *x, *y;
                    x = xmlGetProp (node, BAD_CAST "x");
                    y = xmlGetProp (node, BAD_CAST "y");
                    browser_canvas_translate_item (BROWSER_CANVAS (diagram->priv->canvas),
                                                   (BrowserCanvasItem*) table,
                                                   x ? g_ascii_strtod ((gchar*) x, NULL) : 0.,
                                                   y ? g_ascii_strtod ((gchar*) y, NULL) : 0.);
                    if (x)
                        xmlFree (x);
                    if (y)
                        xmlFree (y);
                }
            }
            else {
                if (schema)
                    xmlFree (schema);
                if (name)
                    xmlFree (name);
                g_set_error (error, T_ERROR, T_STORED_DATA_ERROR,
                             "%s", _("Missing table attribute in favorite's contents"));
                gtk_widget_destroy ((GtkWidget*) diagram);
                diagram = NULL;
                goto out;
            }
        }
    }

out:
    t_favorites_reset_attributes (&fav);
    if (doc)
        xmlFreeDoc (doc);
    return (GtkWidget*) diagram;
}