#include #include #include #include #include #include "bdb-list-store.h" static BdbListStore *store = NULL; static GtkWidget *treeview = NULL; void add_clicked (GtkButton *add) { GtkTreeIter iter; GValue value = {0,}; bdb_list_store_append (store, &iter); g_value_init (&value, G_TYPE_STRING); g_value_take_string (&value, g_strdup_printf ("This is row %d", GPOINTER_TO_INT (iter.user_data))); bdb_list_store_set_value (store, &iter, 0, &value); g_value_unset (&value); } void remove_clicked (GtkButton *remove) { GtkTreeIter iter; GtkTreeModel *model; GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); if (gtk_tree_selection_get_selected (selection, &model, &iter)) { if (bdb_list_store_remove (store, &iter)) { gtk_tree_selection_select_iter (selection, &iter); } } } void quit (void) { DB *db = bdb_list_store_get_db (store); g_assert (db != NULL); db->close (db, 0); gtk_main_quit (); } gint main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *scroller; GtkTreeViewColumn *column; GtkCellRenderer *ctext; GtkWidget *hbox; GtkWidget *add; GtkWidget *remove; GError *error = NULL; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width (GTK_CONTAINER (window), 12); g_signal_connect (window, "destroy", G_CALLBACK (quit), NULL); gtk_window_set_default_size (GTK_WINDOW (window), 300, 400); gtk_widget_show (window); vbox = gtk_vbox_new (FALSE, 6); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); scroller = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (vbox), scroller); gtk_widget_show (scroller); treeview = gtk_tree_view_new (); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); gtk_container_add (GTK_CONTAINER (scroller), treeview); gtk_widget_show (treeview); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, "Data"); gtk_tree_view_column_set_alignment (column, 0.5f); ctext = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, ctext, TRUE); gtk_tree_view_column_add_attribute (column, ctext, "text", 0); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); hbox = gtk_hbox_new (TRUE, 2); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); gtk_widget_show (hbox); add = gtk_button_new_from_stock (GTK_STOCK_ADD); g_signal_connect (add, "clicked", G_CALLBACK (add_clicked), NULL); gtk_box_pack_start (GTK_BOX (hbox), add, TRUE, TRUE, 0); gtk_widget_show (add); remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE); g_signal_connect (remove, "clicked", G_CALLBACK (remove_clicked), NULL); gtk_box_pack_start (GTK_BOX (hbox), remove, TRUE, TRUE, 0); gtk_widget_show (remove); DB *dbp = NULL; DB_ENV *db_env = NULL; int ret = 0; int db_env_flags = DB_CREATE | DB_INIT_LOG | DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN | DB_PRIVATE; if ((ret = db_env_create (&db_env, 0)) != 0) g_error ("db_env_create: %s", db_strerror (ret)); db_env->set_errpfx (db_env, "bdbliststore"); db_env->set_errfile (db_env, stderr); if ((ret = db_env->open (db_env, ".", db_env_flags, 0)) != 0) g_error ("db_env_open: %s", db_strerror (ret)); if ((ret = db_create (&dbp, db_env, 0)) != 0) g_error ("db_create: %s", db_strerror (ret)); dbp->set_flags (dbp, DB_RENUMBER); if ((ret = dbp->open (dbp, NULL, "test.db", NULL, DB_RECNO, DB_CREATE, 0)) != 0) g_error ("db_open: %s", db_strerror (ret)); store = bdb_list_store_new (); if (!bdb_list_store_set_db (store, dbp, &error)) { if (error) { g_printerr ("Could not attach database: %s\n", error->message); g_error_free (error); } return EXIT_FAILURE; } gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store)); gtk_main (); return 0; }