static GtkWidget * relations_diagram_get_tab_label (BrowserPage *page, GtkWidget **out_close_button) { GtkWidget *wid; RelationsDiagram *diagram; gchar *tab_name = NULL; GdkPixbuf *table_pixbuf; diagram = RELATIONS_DIAGRAM (page); if (diagram->priv->fav_id > 0) { TFavoritesAttributes fav; if (t_favorites_get (t_connection_get_favorites (diagram->priv->tcnc), diagram->priv->fav_id, &fav, NULL)) { tab_name = g_strdup (fav.name); t_favorites_reset_attributes (&fav); } } if (!tab_name) tab_name = g_strdup (_("Diagram")); table_pixbuf = ui_get_pixbuf_icon (UI_ICON_DIAGRAM); wid = ui_make_tab_label_with_pixbuf (tab_name, table_pixbuf, out_close_button ? TRUE : FALSE, out_close_button); g_free (tab_name); return wid; }
/** * 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); } }
/** * 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; }
static void action_view_contents_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data) { RelationsDiagram *diagram; diagram = RELATIONS_DIAGRAM (data); gchar *str; str = browser_canvas_db_relations_items_to_data_manager (BROWSER_CANVAS_DB_RELATIONS (diagram->priv->canvas)); g_print ("%s\n", str); if (str) { BrowserWindow *bwin; BrowserPerspective *pers; bwin = (BrowserWindow*) gtk_widget_get_toplevel ((GtkWidget*) diagram); pers = browser_window_change_perspective (bwin, _("Data manager")); data_manager_perspective_new_tab (DATA_MANAGER_PERSPECTIVE (pers), str); g_free (str); } }
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; }