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