]> Pileus Git - ~andy/gtk/commitdiff
Got rid of GtkTreeNode, and changed it to GtkTreeIter. Added iterators
authorJonathan Blandford <jrb@redhat.com>
Thu, 26 Oct 2000 00:36:47 +0000 (00:36 +0000)
committerJonathan Blandford <jrb@src.gnome.org>
Thu, 26 Oct 2000 00:36:47 +0000 (00:36 +0000)
Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>

* gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
GtkTreeIter.  Added iterators everywhere.

* gtk/gtktreeviewcolumn.c: Changed to use the iterators.

* gtk/gtktreeviewselection.c: Changed to use the iterators.

* gtk/gtktreestore.c: Changed to use the iterators.

* gtk/gtkliststore.c: Commented out the code.  Will convert to
iterators tomorrow.

* gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
iterators tomorrow.

* gtk/treestoretest.c: Changed to use iterators.

* demos/testgtk/main.c: Moved to use the new iterator system.

27 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
demos/gtk-demo/main.c
demos/testgtk/main.c
gtk/gtkliststore.c
gtk/gtkliststore.h
gtk/gtkmodelsimple.c
gtk/gtkmodelsimple.h
gtk/gtkrbtree.c
gtk/gtktreedatalist.c
gtk/gtktreemodel.c
gtk/gtktreemodel.h
gtk/gtktreeselection.c
gtk/gtktreeselection.h
gtk/gtktreestore.c
gtk/gtktreestore.h
gtk/gtktreeview.c
gtk/gtktreeview.h
gtk/gtktreeviewcolumn.c
gtk/gtktreeviewcolumn.h
gtk/treestoretest.c
tests/treestoretest.c

index eaa3b04add45e1b5d09866b30c8ce05bd6a4f1e9..7937b6a67d790a00a60239644790d8e2a0dd6f03 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
+       GtkTreeIter.  Added iterators everywhere.
+
+       * gtk/gtktreeviewcolumn.c: Changed to use the iterators.
+
+       * gtk/gtktreeviewselection.c: Changed to use the iterators.
+
+       * gtk/gtktreestore.c: Changed to use the iterators.
+
+       * gtk/gtkliststore.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/treestoretest.c: Changed to use iterators.
+
+       * demos/testgtk/main.c: Moved to use the new iterator system.
+
 Thu Oct 26 02:10:32 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/Makefile.am: invoke maketypes.awk with LC_ALL=C to avoid
index eaa3b04add45e1b5d09866b30c8ce05bd6a4f1e9..7937b6a67d790a00a60239644790d8e2a0dd6f03 100644 (file)
@@ -1,3 +1,24 @@
+Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
+       GtkTreeIter.  Added iterators everywhere.
+
+       * gtk/gtktreeviewcolumn.c: Changed to use the iterators.
+
+       * gtk/gtktreeviewselection.c: Changed to use the iterators.
+
+       * gtk/gtktreestore.c: Changed to use the iterators.
+
+       * gtk/gtkliststore.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/treestoretest.c: Changed to use iterators.
+
+       * demos/testgtk/main.c: Moved to use the new iterator system.
+
 Thu Oct 26 02:10:32 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/Makefile.am: invoke maketypes.awk with LC_ALL=C to avoid
index eaa3b04add45e1b5d09866b30c8ce05bd6a4f1e9..7937b6a67d790a00a60239644790d8e2a0dd6f03 100644 (file)
@@ -1,3 +1,24 @@
+Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
+       GtkTreeIter.  Added iterators everywhere.
+
+       * gtk/gtktreeviewcolumn.c: Changed to use the iterators.
+
+       * gtk/gtktreeviewselection.c: Changed to use the iterators.
+
+       * gtk/gtktreestore.c: Changed to use the iterators.
+
+       * gtk/gtkliststore.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/treestoretest.c: Changed to use iterators.
+
+       * demos/testgtk/main.c: Moved to use the new iterator system.
+
 Thu Oct 26 02:10:32 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/Makefile.am: invoke maketypes.awk with LC_ALL=C to avoid
index eaa3b04add45e1b5d09866b30c8ce05bd6a4f1e9..7937b6a67d790a00a60239644790d8e2a0dd6f03 100644 (file)
@@ -1,3 +1,24 @@
+Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
+       GtkTreeIter.  Added iterators everywhere.
+
+       * gtk/gtktreeviewcolumn.c: Changed to use the iterators.
+
+       * gtk/gtktreeviewselection.c: Changed to use the iterators.
+
+       * gtk/gtktreestore.c: Changed to use the iterators.
+
+       * gtk/gtkliststore.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/treestoretest.c: Changed to use iterators.
+
+       * demos/testgtk/main.c: Moved to use the new iterator system.
+
 Thu Oct 26 02:10:32 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/Makefile.am: invoke maketypes.awk with LC_ALL=C to avoid
index eaa3b04add45e1b5d09866b30c8ce05bd6a4f1e9..7937b6a67d790a00a60239644790d8e2a0dd6f03 100644 (file)
@@ -1,3 +1,24 @@
+Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
+       GtkTreeIter.  Added iterators everywhere.
+
+       * gtk/gtktreeviewcolumn.c: Changed to use the iterators.
+
+       * gtk/gtktreeviewselection.c: Changed to use the iterators.
+
+       * gtk/gtktreestore.c: Changed to use the iterators.
+
+       * gtk/gtkliststore.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/treestoretest.c: Changed to use iterators.
+
+       * demos/testgtk/main.c: Moved to use the new iterator system.
+
 Thu Oct 26 02:10:32 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/Makefile.am: invoke maketypes.awk with LC_ALL=C to avoid
index eaa3b04add45e1b5d09866b30c8ce05bd6a4f1e9..7937b6a67d790a00a60239644790d8e2a0dd6f03 100644 (file)
@@ -1,3 +1,24 @@
+Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
+       GtkTreeIter.  Added iterators everywhere.
+
+       * gtk/gtktreeviewcolumn.c: Changed to use the iterators.
+
+       * gtk/gtktreeviewselection.c: Changed to use the iterators.
+
+       * gtk/gtktreestore.c: Changed to use the iterators.
+
+       * gtk/gtkliststore.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/treestoretest.c: Changed to use iterators.
+
+       * demos/testgtk/main.c: Moved to use the new iterator system.
+
 Thu Oct 26 02:10:32 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/Makefile.am: invoke maketypes.awk with LC_ALL=C to avoid
index eaa3b04add45e1b5d09866b30c8ce05bd6a4f1e9..7937b6a67d790a00a60239644790d8e2a0dd6f03 100644 (file)
@@ -1,3 +1,24 @@
+Wed Oct 25 20:40:25 2000  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreemodel.h: Got rid of GtkTreeNode, and changed it to
+       GtkTreeIter.  Added iterators everywhere.
+
+       * gtk/gtktreeviewcolumn.c: Changed to use the iterators.
+
+       * gtk/gtktreeviewselection.c: Changed to use the iterators.
+
+       * gtk/gtktreestore.c: Changed to use the iterators.
+
+       * gtk/gtkliststore.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/gtkmodelsimple.c: Commented out the code.  Will convert to
+       iterators tomorrow.
+
+       * gtk/treestoretest.c: Changed to use iterators.
+
+       * demos/testgtk/main.c: Moved to use the new iterator system.
+
 Thu Oct 26 02:10:32 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/Makefile.am: invoke maketypes.awk with LC_ALL=C to avoid
index 2e0649f7c71b8aeb4e75daf3ae9c76b25eba8b9b..df207085c650f87053a37af6b048cf4c755503b5 100644 (file)
@@ -9,9 +9,16 @@
 
 static GtkTextBuffer *info_buffer;
 static GtkTextBuffer *source_buffer;
-static GtkWidget *demo_clist;
 
-static Demo *current_demo;
+static gchar *current_file = NULL;
+
+enum {
+  TITLE_COLUMN,
+  FILENAME_COLUMN,
+  FUNC_COLUMN,
+  ITALIC_COLUMN,
+  NUM_COLUMNS
+};
 
 gboolean
 read_line (FILE *stream, GString *str)
@@ -60,7 +67,7 @@ read_line (FILE *stream, GString *str)
 }
 
 void
-load_file (Demo *demo)
+load_file (const gchar *filename)
 {
   FILE *file;
   GtkTextIter start, end;
@@ -68,10 +75,11 @@ load_file (Demo *demo)
   int state = 0;
   gboolean in_para = 0;
 
-  if (current_demo == demo)
+  if (current_file && !strcmp (current_file, filename))
     return;
 
-  current_demo = demo;
+  g_free (current_file);
+  current_file = g_strdup (filename);
   
   gtk_text_buffer_get_bounds (info_buffer, &start, &end);
   gtk_text_buffer_delete (info_buffer, &start, &end);
@@ -79,10 +87,10 @@ load_file (Demo *demo)
   gtk_text_buffer_get_bounds (source_buffer, &start, &end);
   gtk_text_buffer_delete (source_buffer, &start, &end);
 
-  file = fopen (demo->filename, "r");
+  file = fopen (filename, "r");
   if (!file)
     {
-      g_warning ("Cannot open %s: %s\n", demo->filename, g_strerror (errno));
+      g_warning ("Cannot open %s: %s\n", filename, g_strerror (errno));
       return;
     }
 
@@ -184,41 +192,65 @@ load_file (Demo *demo)
 }
 
 gboolean
-button_press_event_cb (GtkCList       *clist,
-                      GdkEventButton *event)
+button_press_event_cb (GtkTreeView    *tree_view,
+                      GdkEventButton *event,
+                      GtkTreeModel   *model)
 {
-  if (event->type == GDK_2BUTTON_PRESS &&
-      event->window == clist->clist_window)
+  if (event->type == GDK_2BUTTON_PRESS)
     {
-      gint row, column;
-      
-      if (gtk_clist_get_selection_info (clist,
-                                       event->x, event->y,
-                                       &row, &column))
+      GtkTreePath *path = NULL;
+
+      gtk_tree_view_get_path_at_pos (tree_view,
+                                    event->window,
+                                    event->x,
+                                    event->y,
+                                    &path,
+                                    NULL);
 
+      if (path)
        {
-         Demo *demo = gtk_clist_get_row_data (clist, row);
-         demo->func();
+         GtkTreeIter iter;
+         gboolean italic;
+         GVoidFunc func;
+
+         gtk_tree_model_get_iter (model, &iter, path);
+         gtk_tree_store_iter_get (model, &iter,
+                                  FUNC_COLUMN, &func,
+                                  ITALIC_COLUMN, &italic,
+                                  -1);
+         (func) ();
+         gtk_tree_store_iter_set (model, &iter,
+                                  ITALIC_COLUMN, !italic,
+                                  -1);
+         gtk_tree_path_free (path);
        }
 
-      gtk_signal_emit_stop_by_name (GTK_OBJECT (clist), "button_press_event");
+      gtk_signal_emit_stop_by_name (GTK_OBJECT (tree_view),
+                                   "button_press_event");
       return TRUE;
     }
   
   return FALSE;
 }
 
-void
-select_row_cb (GtkCList *clist,
-              gint      row,
-              gint      column,
-              GdkEvent *event)
+static void
+selection_cb (GtkTreeSelection *selection,
+             GtkTreeModel     *model)
 {
-  Demo *demo = gtk_clist_get_row_data (clist, row);
-  load_file (demo);
+  GtkTreeIter iter;
+  GValue value = {0, };
+
+  if (! gtk_tree_selection_get_selected (selection, &iter))
+    return;
+
+  gtk_tree_model_iter_get_value (model, &iter,
+                                FILENAME_COLUMN,
+                                &value);
+  load_file (g_value_get_string (&value));
+  g_value_unset (&value);
 }
 
-GtkWidget *
+static GtkWidget *
 create_text (GtkTextBuffer **buffer,
             gboolean        is_source)
 {
@@ -253,14 +285,62 @@ create_text (GtkTextBuffer **buffer,
   return scrolled_window;
 }
 
+/* Technically a list, but if we do go to 80 demos, we may want to move to a tree */
+static GtkWidget *
+create_tree (void)
+{
+  GtkTreeSelection *selection;
+  GtkCellRenderer *cell;
+  GtkWidget *tree_view;
+  GtkObject *column;
+  GtkObject *model;
+  GtkTreeIter iter;
+  gint i;
+
+  model = gtk_tree_store_new_with_values (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
+  tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
+
+  gtk_tree_selection_set_type (GTK_TREE_SELECTION (selection),
+                              GTK_TREE_SELECTION_SINGLE);
+  gtk_widget_set_usize (tree_view, 200, -1);
+
+  for (i=0; i < G_N_ELEMENTS (testgtk_demos); i++)
+    {
+      gtk_tree_store_iter_append (GTK_TREE_STORE (model), &iter, NULL);
+
+      gtk_tree_store_iter_set (GTK_TREE_STORE (model),
+                              &iter,
+                              TITLE_COLUMN, testgtk_demos[i].title,
+                              FILENAME_COLUMN, testgtk_demos[i].filename,
+                              FUNC_COLUMN, testgtk_demos[i].func,
+                              ITALIC_COLUMN, FALSE,
+                              -1);
+    }
+
+  cell = gtk_cell_renderer_text_new ();
+  column = gtk_tree_view_column_new_with_attributes ("Widget",
+                                                    cell,
+                                                    "text", TITLE_COLUMN,
+                                                    "italic", ITALIC_COLUMN,
+                                                    NULL);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view),
+                              GTK_TREE_VIEW_COLUMN (column));
+
+  gtk_signal_connect (GTK_OBJECT (selection), "selection_changed", selection_cb, model);
+  gtk_signal_connect (GTK_OBJECT (tree_view), "button_press_event", GTK_SIGNAL_FUNC (button_press_event_cb), model);
+
+  return tree_view;
+}
+
 int
 main (int argc, char **argv)
 {
   GtkWidget *window;
   GtkWidget *notebook;
   GtkWidget *hbox;
+  GtkWidget *tree;
   GtkTextTag *tag;
-  int i;
 
   gtk_init (&argc, &argv);
   
@@ -271,11 +351,8 @@ main (int argc, char **argv)
   hbox = gtk_hbox_new (FALSE, 0);
   gtk_container_add (GTK_CONTAINER (window), hbox);
 
-  demo_clist = gtk_clist_new (1);
-  gtk_clist_set_selection_mode (GTK_CLIST (demo_clist), GTK_SELECTION_BROWSE);
-
-  gtk_widget_set_usize (demo_clist, 200, -1);
-  gtk_box_pack_start (GTK_BOX (hbox), demo_clist, FALSE, FALSE, 0);
+  tree = create_tree ();
+  gtk_box_pack_start (GTK_BOX (hbox), tree, FALSE, FALSE, 0);
 
   notebook = gtk_notebook_new ();
   gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
@@ -304,19 +381,8 @@ main (int argc, char **argv)
   gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
   gtk_widget_show_all (window);
   
-  for (i=0; i < G_N_ELEMENTS (testgtk_demos); i++)
-    {
-      gint row = gtk_clist_append (GTK_CLIST (demo_clist), &testgtk_demos[i].title);
-      gtk_clist_set_row_data (GTK_CLIST (demo_clist), row, &testgtk_demos[i]);
-    }
 
-  load_file (&testgtk_demos[0]);
-  
-  gtk_signal_connect (GTK_OBJECT (demo_clist), "button_press_event",
-                     GTK_SIGNAL_FUNC (button_press_event_cb), NULL);
-  
-  gtk_signal_connect (GTK_OBJECT (demo_clist), "select_row",
-                     GTK_SIGNAL_FUNC (select_row_cb), NULL);
+  load_file (testgtk_demos[0].filename);
   
   gtk_main ();
 
index 2e0649f7c71b8aeb4e75daf3ae9c76b25eba8b9b..df207085c650f87053a37af6b048cf4c755503b5 100644 (file)
@@ -9,9 +9,16 @@
 
 static GtkTextBuffer *info_buffer;
 static GtkTextBuffer *source_buffer;
-static GtkWidget *demo_clist;
 
-static Demo *current_demo;
+static gchar *current_file = NULL;
+
+enum {
+  TITLE_COLUMN,
+  FILENAME_COLUMN,
+  FUNC_COLUMN,
+  ITALIC_COLUMN,
+  NUM_COLUMNS
+};
 
 gboolean
 read_line (FILE *stream, GString *str)
@@ -60,7 +67,7 @@ read_line (FILE *stream, GString *str)
 }
 
 void
-load_file (Demo *demo)
+load_file (const gchar *filename)
 {
   FILE *file;
   GtkTextIter start, end;
@@ -68,10 +75,11 @@ load_file (Demo *demo)
   int state = 0;
   gboolean in_para = 0;
 
-  if (current_demo == demo)
+  if (current_file && !strcmp (current_file, filename))
     return;
 
-  current_demo = demo;
+  g_free (current_file);
+  current_file = g_strdup (filename);
   
   gtk_text_buffer_get_bounds (info_buffer, &start, &end);
   gtk_text_buffer_delete (info_buffer, &start, &end);
@@ -79,10 +87,10 @@ load_file (Demo *demo)
   gtk_text_buffer_get_bounds (source_buffer, &start, &end);
   gtk_text_buffer_delete (source_buffer, &start, &end);
 
-  file = fopen (demo->filename, "r");
+  file = fopen (filename, "r");
   if (!file)
     {
-      g_warning ("Cannot open %s: %s\n", demo->filename, g_strerror (errno));
+      g_warning ("Cannot open %s: %s\n", filename, g_strerror (errno));
       return;
     }
 
@@ -184,41 +192,65 @@ load_file (Demo *demo)
 }
 
 gboolean
-button_press_event_cb (GtkCList       *clist,
-                      GdkEventButton *event)
+button_press_event_cb (GtkTreeView    *tree_view,
+                      GdkEventButton *event,
+                      GtkTreeModel   *model)
 {
-  if (event->type == GDK_2BUTTON_PRESS &&
-      event->window == clist->clist_window)
+  if (event->type == GDK_2BUTTON_PRESS)
     {
-      gint row, column;
-      
-      if (gtk_clist_get_selection_info (clist,
-                                       event->x, event->y,
-                                       &row, &column))
+      GtkTreePath *path = NULL;
+
+      gtk_tree_view_get_path_at_pos (tree_view,
+                                    event->window,
+                                    event->x,
+                                    event->y,
+                                    &path,
+                                    NULL);
 
+      if (path)
        {
-         Demo *demo = gtk_clist_get_row_data (clist, row);
-         demo->func();
+         GtkTreeIter iter;
+         gboolean italic;
+         GVoidFunc func;
+
+         gtk_tree_model_get_iter (model, &iter, path);
+         gtk_tree_store_iter_get (model, &iter,
+                                  FUNC_COLUMN, &func,
+                                  ITALIC_COLUMN, &italic,
+                                  -1);
+         (func) ();
+         gtk_tree_store_iter_set (model, &iter,
+                                  ITALIC_COLUMN, !italic,
+                                  -1);
+         gtk_tree_path_free (path);
        }
 
-      gtk_signal_emit_stop_by_name (GTK_OBJECT (clist), "button_press_event");
+      gtk_signal_emit_stop_by_name (GTK_OBJECT (tree_view),
+                                   "button_press_event");
       return TRUE;
     }
   
   return FALSE;
 }
 
-void
-select_row_cb (GtkCList *clist,
-              gint      row,
-              gint      column,
-              GdkEvent *event)
+static void
+selection_cb (GtkTreeSelection *selection,
+             GtkTreeModel     *model)
 {
-  Demo *demo = gtk_clist_get_row_data (clist, row);
-  load_file (demo);
+  GtkTreeIter iter;
+  GValue value = {0, };
+
+  if (! gtk_tree_selection_get_selected (selection, &iter))
+    return;
+
+  gtk_tree_model_iter_get_value (model, &iter,
+                                FILENAME_COLUMN,
+                                &value);
+  load_file (g_value_get_string (&value));
+  g_value_unset (&value);
 }
 
-GtkWidget *
+static GtkWidget *
 create_text (GtkTextBuffer **buffer,
             gboolean        is_source)
 {
@@ -253,14 +285,62 @@ create_text (GtkTextBuffer **buffer,
   return scrolled_window;
 }
 
+/* Technically a list, but if we do go to 80 demos, we may want to move to a tree */
+static GtkWidget *
+create_tree (void)
+{
+  GtkTreeSelection *selection;
+  GtkCellRenderer *cell;
+  GtkWidget *tree_view;
+  GtkObject *column;
+  GtkObject *model;
+  GtkTreeIter iter;
+  gint i;
+
+  model = gtk_tree_store_new_with_values (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
+  tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
+
+  gtk_tree_selection_set_type (GTK_TREE_SELECTION (selection),
+                              GTK_TREE_SELECTION_SINGLE);
+  gtk_widget_set_usize (tree_view, 200, -1);
+
+  for (i=0; i < G_N_ELEMENTS (testgtk_demos); i++)
+    {
+      gtk_tree_store_iter_append (GTK_TREE_STORE (model), &iter, NULL);
+
+      gtk_tree_store_iter_set (GTK_TREE_STORE (model),
+                              &iter,
+                              TITLE_COLUMN, testgtk_demos[i].title,
+                              FILENAME_COLUMN, testgtk_demos[i].filename,
+                              FUNC_COLUMN, testgtk_demos[i].func,
+                              ITALIC_COLUMN, FALSE,
+                              -1);
+    }
+
+  cell = gtk_cell_renderer_text_new ();
+  column = gtk_tree_view_column_new_with_attributes ("Widget",
+                                                    cell,
+                                                    "text", TITLE_COLUMN,
+                                                    "italic", ITALIC_COLUMN,
+                                                    NULL);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view),
+                              GTK_TREE_VIEW_COLUMN (column));
+
+  gtk_signal_connect (GTK_OBJECT (selection), "selection_changed", selection_cb, model);
+  gtk_signal_connect (GTK_OBJECT (tree_view), "button_press_event", GTK_SIGNAL_FUNC (button_press_event_cb), model);
+
+  return tree_view;
+}
+
 int
 main (int argc, char **argv)
 {
   GtkWidget *window;
   GtkWidget *notebook;
   GtkWidget *hbox;
+  GtkWidget *tree;
   GtkTextTag *tag;
-  int i;
 
   gtk_init (&argc, &argv);
   
@@ -271,11 +351,8 @@ main (int argc, char **argv)
   hbox = gtk_hbox_new (FALSE, 0);
   gtk_container_add (GTK_CONTAINER (window), hbox);
 
-  demo_clist = gtk_clist_new (1);
-  gtk_clist_set_selection_mode (GTK_CLIST (demo_clist), GTK_SELECTION_BROWSE);
-
-  gtk_widget_set_usize (demo_clist, 200, -1);
-  gtk_box_pack_start (GTK_BOX (hbox), demo_clist, FALSE, FALSE, 0);
+  tree = create_tree ();
+  gtk_box_pack_start (GTK_BOX (hbox), tree, FALSE, FALSE, 0);
 
   notebook = gtk_notebook_new ();
   gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
@@ -304,19 +381,8 @@ main (int argc, char **argv)
   gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
   gtk_widget_show_all (window);
   
-  for (i=0; i < G_N_ELEMENTS (testgtk_demos); i++)
-    {
-      gint row = gtk_clist_append (GTK_CLIST (demo_clist), &testgtk_demos[i].title);
-      gtk_clist_set_row_data (GTK_CLIST (demo_clist), row, &testgtk_demos[i]);
-    }
 
-  load_file (&testgtk_demos[0]);
-  
-  gtk_signal_connect (GTK_OBJECT (demo_clist), "button_press_event",
-                     GTK_SIGNAL_FUNC (button_press_event_cb), NULL);
-  
-  gtk_signal_connect (GTK_OBJECT (demo_clist), "select_row",
-                     GTK_SIGNAL_FUNC (select_row_cb), NULL);
+  load_file (testgtk_demos[0].filename);
   
   gtk_main ();
 
index 8c861c5c0f1e3e9a89a10c1e1e08bb16bf6977c1..dae38c6f2d82972c2f88f9273fe95691eafa1b0f 100644 (file)
 #include "gtksignal.h"
 
 #define G_SLIST(x) ((GSList *) x)
-
+#if 0
 enum {
-  NODE_CHANGED,
-  NODE_INSERTED,
-  NODE_CHILD_TOGGLED,
-  NODE_DELETED,
+  CHANGED,
+  INSERTED,
+  CHILD_TOGGLED,
+  DELETED,
   LAST_SIGNAL
 };
 
@@ -39,27 +39,27 @@ static void           gtk_list_store_init            (GtkListStore      *list_st
 static void           gtk_list_store_class_init      (GtkListStoreClass *class);
 static void           gtk_list_store_tree_model_init (GtkTreeModelIface *iface);
 static gint           gtk_list_store_get_n_columns   (GtkTreeModel      *tree_model);
-static GtkTreeNode    gtk_list_store_get_node        (GtkTreeModel      *tree_model,
+static GtkTreeIter   *gtk_list_store_get_iter        (GtkTreeModel      *tree_model,
                                                      GtkTreePath       *path);
 static GtkTreePath   *gtk_list_store_get_path        (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static void           gtk_list_store_node_get_value  (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node,
+                                                     GtkTreeIter       *iter);
+static void           gtk_list_store_iter_get_value  (GtkTreeModel      *tree_model,
+                                                     GtkTreeIter       *iter,
                                                      gint               column,
                                                      GValue            *value);
-static gboolean       gtk_list_store_node_next       (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode       *node);
-static GtkTreeNode    gtk_list_store_node_children   (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static gboolean       gtk_list_store_node_has_child  (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static gint           gtk_list_store_node_n_children (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static GtkTreeNode    gtk_list_store_node_nth_child  (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node,
+static gboolean       gtk_list_store_iter_next       (GtkTreeModel      *tree_model,
+                                                     GtkTreeIter       *iter);
+static GtkTreeIter   *gtk_list_store_iter_children   (GtkTreeModel      *tree_model,
+                                                     GtkTreeIter       *iter);
+static gboolean       gtk_list_store_iter_has_child  (GtkTreeModel      *tree_model,
+                                                     GtkTreeIter       *iter);
+static gint           gtk_list_store_iter_n_children (GtkTreeModel      *tree_model,
+                                                     GtkTreeIter       *iter);
+static GtkTreeIter   *gtk_list_store_iter_nth_child  (GtkTreeModel      *tree_model,
+                                                     GtkTreeIter       *iter,
                                                      gint               n);
-static GtkTreeNode    gtk_list_store_node_parent     (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
+static GtkTreeIter   *gtk_list_store_iter_parent     (GtkTreeModel      *tree_model,
+                                                     GtkTreeIter       *iter);
 
 
 GtkType
@@ -105,38 +105,38 @@ gtk_list_store_class_init (GtkListStoreClass *class)
 
   object_class = (GtkObjectClass*) class;
 
-  list_store_signals[NODE_CHANGED] =
-    gtk_signal_new ("node_changed",
+  list_store_signals[CHANGED] =
+    gtk_signal_new ("changed",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_changed),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, changed),
                     gtk_marshal_VOID__POINTER_POINTER,
                     GTK_TYPE_NONE, 2,
                    GTK_TYPE_POINTER,
                    GTK_TYPE_POINTER);
-  list_store_signals[NODE_INSERTED] =
-    gtk_signal_new ("node_inserted",
+  list_store_signals[INSERTED] =
+    gtk_signal_new ("inserted",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_inserted),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, inserted),
                     gtk_marshal_VOID__POINTER_POINTER,
                     GTK_TYPE_NONE, 2,
                    GTK_TYPE_POINTER,
                    GTK_TYPE_POINTER);
-  list_store_signals[NODE_CHILD_TOGGLED] =
-    gtk_signal_new ("node_child_toggled",
+  list_store_signals[CHILD_TOGGLED] =
+    gtk_signal_new ("child_toggled",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_child_toggled),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, child_toggled),
                     gtk_marshal_VOID__POINTER_POINTER,
                     GTK_TYPE_NONE, 2,
                    GTK_TYPE_POINTER,
                    GTK_TYPE_POINTER);
-  list_store_signals[NODE_DELETED] =
-    gtk_signal_new ("node_deleted",
+  list_store_signals[DELETED] =
+    gtk_signal_new ("deleted",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_deleted),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, deleted),
                     gtk_marshal_VOID__POINTER,
                     GTK_TYPE_NONE, 1,
                    GTK_TYPE_POINTER);
@@ -149,15 +149,15 @@ static void
 gtk_list_store_tree_model_init (GtkTreeModelIface *iface)
 {
   iface->get_n_columns = gtk_list_store_get_n_columns;
-  iface->get_node = gtk_list_store_get_node;
+  iface->get_iter = gtk_list_store_get_iter;
   iface->get_path = gtk_list_store_get_path;
-  iface->node_get_value = gtk_list_store_node_get_value;
-  iface->node_next = gtk_list_store_node_next;
-  iface->node_children = gtk_list_store_node_children;
-  iface->node_has_child = gtk_list_store_node_has_child;
-  iface->node_n_children = gtk_list_store_node_n_children;
-  iface->node_nth_child = gtk_list_store_node_nth_child;
-  iface->node_parent = gtk_list_store_node_parent;
+  iface->iter_get_value = gtk_list_store_iter_get_value;
+  iface->iter_next = gtk_list_store_iter_next;
+  iface->iter_children = gtk_list_store_iter_children;
+  iface->iter_has_child = gtk_list_store_iter_has_child;
+  iface->iter_n_children = gtk_list_store_iter_n_children;
+  iface->iter_nth_child = gtk_list_store_iter_nth_child;
+  iface->iter_parent = gtk_list_store_iter_parent;
 }
 
 static void
@@ -246,19 +246,19 @@ gtk_list_store_get_n_columns (GtkTreeModel *tree_model)
   return GTK_LIST_STORE (tree_model)->n_columns;
 }
 
-static GtkTreeNode
-gtk_list_store_get_node (GtkTreeModel *tree_model,
+static GtkTreeIter *
+gtk_list_store_get_iter (GtkTreeModel *tree_model,
                         GtkTreePath  *path)
 {
   g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, NULL);
 
-  return (GtkTreeNode) g_slist_nth (G_SLIST (GTK_LIST_STORE (tree_model)->root),
+  return (GtkTreeIter) g_slist_nth (G_SLIST (GTK_LIST_STORE (tree_model)->root),
                                    gtk_tree_path_get_indices (path)[0]);
 }
 
 static GtkTreePath *
 gtk_list_store_get_path (GtkTreeModel *tree_model,
-                        GtkTreeNode   node)
+                        GtkTreeIter   iter)
 {
   GtkTreePath *retval;
   GSList *list;
@@ -269,7 +269,7 @@ gtk_list_store_get_path (GtkTreeModel *tree_model,
   for (list = G_SLIST (GTK_LIST_STORE (tree_model)->root); list; list = list->next)
     {
       i++;
-      if (list == G_SLIST (node))
+      if (list == G_SLIST (iter))
        break;
     }
   if (list == NULL)
@@ -282,8 +282,8 @@ gtk_list_store_get_path (GtkTreeModel *tree_model,
 }
 
 static void
-gtk_list_store_node_get_value (GtkTreeModel *tree_model,
-                              GtkTreeNode   node,
+gtk_list_store_iter_get_value (GtkTreeModel *tree_model,
+                              GtkTreeIter   iter,
                               gint          column,
                               GValue       *value)
 {
@@ -292,74 +292,74 @@ gtk_list_store_node_get_value (GtkTreeModel *tree_model,
 
   g_return_if_fail (tree_model != NULL);
   g_return_if_fail (GTK_IS_LIST_STORE (tree_model));
-  g_return_if_fail (node != NULL);
+  g_return_if_fail (iter != NULL);
   g_return_if_fail (column < GTK_LIST_STORE (tree_model)->n_columns);
 
-  list = G_SLIST (node)->data;
+  list = G_SLIST (iter)->data;
 
   while (tmp_column-- > 0 && list)
     list = list->next;
 
   g_return_if_fail (list != NULL);
 
-  gtk_tree_data_list_node_to_value (list,
+  gtk_tree_data_list_iter_to_value (list,
                                    GTK_LIST_STORE (tree_model)->column_headers[column],
                                    value);
 }
 
 static gboolean
-gtk_list_store_node_next (GtkTreeModel  *tree_model,
-                         GtkTreeNode   *node)
+gtk_list_store_iter_next (GtkTreeModel  *tree_model,
+                         GtkTreeIter   *iter)
 {
-  if (node == NULL || *node == NULL)
+  if (iter == NULL || *iter == NULL)
     return FALSE;
 
-  *node = (GtkTreeNode) G_SLIST (*node)->next;
+  *iter = (GtkTreeIter) G_SLIST (*iter)->next;
 
-  return (*node != NULL);
+  return (*iter != NULL);
 }
 
-static GtkTreeNode
-gtk_list_store_node_children (GtkTreeModel *tree_model,
-                             GtkTreeNode   node)
+static GtkTreeIter
+gtk_list_store_iter_children (GtkTreeModel *tree_model,
+                             GtkTreeIter   iter)
 {
   return NULL;
 }
 
 static gboolean
-gtk_list_store_node_has_child (GtkTreeModel *tree_model,
-                              GtkTreeNode   node)
+gtk_list_store_iter_has_child (GtkTreeModel *tree_model,
+                              GtkTreeIter   iter)
 {
   return FALSE;
 }
 
 static gint
-gtk_list_store_node_n_children (GtkTreeModel *tree_model,
-                               GtkTreeNode   node)
+gtk_list_store_iter_n_children (GtkTreeModel *tree_model,
+                               GtkTreeIter   iter)
 {
   return 0;
 }
 
-static GtkTreeNode
-gtk_list_store_node_nth_child (GtkTreeModel *tree_model,
-                              GtkTreeNode   node,
+static GtkTreeIter
+gtk_list_store_iter_nth_child (GtkTreeModel *tree_model,
+                              GtkTreeIter   iter,
                               gint          n)
 {
   return NULL;
 }
 
-static GtkTreeNode
-gtk_list_store_node_parent (GtkTreeModel *tree_model,
-                           GtkTreeNode   node)
+static GtkTreeIter
+gtk_list_store_iter_parent (GtkTreeModel *tree_model,
+                           GtkTreeIter   iter)
 {
   return NULL;
 }
 
 /* Public accessors */
-GtkTreeNode
-gtk_list_store_node_new (void)
+GtkTreeIter
+gtk_list_store_iter_new (void)
 {
-  GtkTreeNode retval = (GtkTreeNode) g_slist_alloc ();
+  GtkTreeIter retval = (GtkTreeIter) g_slist_alloc ();
 
   return retval;
 }
@@ -368,8 +368,8 @@ gtk_list_store_node_new (void)
  * manipulations on it's own.
  */
 void
-gtk_list_store_node_set_cell (GtkListStore *list_store,
-                             GtkTreeNode   node,
+gtk_list_store_iter_set_cell (GtkListStore *list_store,
+                             GtkTreeIter   iter,
                              gint          column,
                              GValue       *value)
 {
@@ -378,16 +378,16 @@ gtk_list_store_node_set_cell (GtkListStore *list_store,
 
   g_return_if_fail (list_store != NULL);
   g_return_if_fail (GTK_IS_LIST_STORE (list_store));
-  g_return_if_fail (node != NULL);
+  g_return_if_fail (iter != NULL);
   g_return_if_fail (column >= 0 && column < list_store->n_columns);
 
-  prev = list = G_SLIST (node)->data;
+  prev = list = G_SLIST (iter)->data;
 
   while (list != NULL)
     {
       if (column == 0)
        {
-         gtk_tree_data_list_value_to_node (list, value);
+         gtk_tree_data_list_value_to_iter (list, value);
          return;
        }
 
@@ -396,9 +396,9 @@ gtk_list_store_node_set_cell (GtkListStore *list_store,
       list = list->next;
     }
 
-  if (G_SLIST (node)->data == NULL)
+  if (G_SLIST (iter)->data == NULL)
     {
-      G_SLIST (node)->data = list = gtk_tree_data_list_alloc ();
+      G_SLIST (iter)->data = list = gtk_tree_data_list_alloc ();
       list->next = NULL;
     }
   else
@@ -414,104 +414,105 @@ gtk_list_store_node_set_cell (GtkListStore *list_store,
       list->next = NULL;
       column --;
     }
-  gtk_tree_data_list_value_to_node (list, value);
+  gtk_tree_data_list_value_to_iter (list, value);
 }
 
 void
-gtk_list_store_node_remove (GtkListStore *list_store,
-                           GtkTreeNode   node)
+gtk_list_store_iter_remove (GtkListStore *list_store,
+                           GtkTreeIter   iter)
 {
   /* FIXME: implement */
   g_warning ("Remember to implement this function\n");
 }
 
-GtkTreeNode
-gtk_list_store_node_insert (GtkListStore *list_store,
+GtkTreeIter
+gtk_list_store_iter_insert (GtkListStore *list_store,
                            gint          position,
-                           GtkTreeNode   node)
+                           GtkTreeIter   iter)
 {
   GSList *list;
 
-  g_return_val_if_fail (list_store != NULL, node);
-  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), node);
-  g_return_val_if_fail (node != NULL, node);
-  g_return_val_if_fail (position < 0, node);
-  g_return_val_if_fail (G_SLIST (node)->next == NULL, node);
+  g_return_val_if_fail (list_store != NULL, iter);
+  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), iter);
+  g_return_val_if_fail (iter != NULL, iter);
+  g_return_val_if_fail (position < 0, iter);
+  g_return_val_if_fail (G_SLIST (iter)->next == NULL, iter);
 
   if (position == 0)
     {
-      gtk_list_store_node_prepend (list_store, node);
-      return node;
+      gtk_list_store_iter_prepend (list_store, iter);
+      return iter;
     }
 
   list = g_slist_nth (G_SLIST (list_store->root), position);
   if (list)
     {
-      G_SLIST (node)->next = list->next;
-      list->next = G_SLIST (node)->next;
+      G_SLIST (iter)->next = list->next;
+      list->next = G_SLIST (iter)->next;
     }
 
-  return node;
+  return iter;
 }
 
 
-GtkTreeNode
-gtk_list_store_node_insert_before (GtkListStore *list_store,
-                                  GtkTreeNode   sibling,
-                                  GtkTreeNode   node)
+GtkTreeIter
+gtk_list_store_iter_insert_before (GtkListStore *list_store,
+                                  GtkTreeIter   sibling,
+                                  GtkTreeIter   iter)
 {
-  g_return_val_if_fail (list_store != NULL, node);
-  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), node);
-  g_return_val_if_fail (node != NULL, node);
+  g_return_val_if_fail (list_store != NULL, iter);
+  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), iter);
+  g_return_val_if_fail (iter != NULL, iter);
 
   /* FIXME: This is all wrong.  This is actually insert_after */
   if (sibling == NULL)
-    return gtk_list_store_node_prepend (list_store, node);
+    return gtk_list_store_iter_prepend (list_store, iter);
 
-  G_SLIST (node)->next = G_SLIST (sibling)->next;
-  G_SLIST (sibling)->next = G_SLIST (node);
-  return node;
+  G_SLIST (iter)->next = G_SLIST (sibling)->next;
+  G_SLIST (sibling)->next = G_SLIST (iter);
+  return iter;
 }
 
-GtkTreeNode
-gtk_list_store_node_prepend (GtkListStore *list_store,
-                            GtkTreeNode   node)
+GtkTreeIter
+gtk_list_store_iter_prepend (GtkListStore *list_store,
+                            GtkTreeIter   iter)
 {
-  g_return_val_if_fail (list_store != NULL, node);
-  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), node);
-  g_return_val_if_fail (node != NULL, node);
+  g_return_val_if_fail (list_store != NULL, iter);
+  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), iter);
+  g_return_val_if_fail (iter != NULL, iter);
 
-  G_SLIST (node)->next = G_SLIST (list_store->root);
-  list_store->root = node;
+  G_SLIST (iter)->next = G_SLIST (list_store->root);
+  list_store->root = iter;
 
-  return node;
+  return iter;
 }
 
-GtkTreeNode
-gtk_list_store_node_append (GtkListStore *list_store,
-                           GtkTreeNode   node)
+GtkTreeIter
+gtk_list_store_iter_append (GtkListStore *list_store,
+                           GtkTreeIter   iter)
 {
   GSList *list;
 
-  g_return_val_if_fail (list_store != NULL, node);
-  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), node);
-  g_return_val_if_fail (node != NULL, node);
-  g_return_val_if_fail (G_SLIST (node)->next == NULL, node);
+  g_return_val_if_fail (list_store != NULL, iter);
+  g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), iter);
+  g_return_val_if_fail (iter != NULL, iter);
+  g_return_val_if_fail (G_SLIST (iter)->next == NULL, iter);
 
   list = g_slist_last (G_SLIST (list_store->root));
   if (list == NULL)
-    list_store->root = node;
+    list_store->root = iter;
   else
-    list->next = G_SLIST (node);
+    list->next = G_SLIST (iter);
 
-  return node;
+  return iter;
 }
 
-GtkTreeNode
-gtk_list_store_node_get_root (GtkListStore *list_store)
+GtkTreeIter
+gtk_list_store_iter_get_root (GtkListStore *list_store)
 {
   g_return_val_if_fail (list_store != NULL, NULL);
   g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), NULL);
 
-  return (GtkTreeNode *) list_store->root;
+  return (GtkTreeIter *) list_store->root;
 }
+#endif
index 1bfee422caa39a07ccc6abcdfa71681c70e1c1b3..4bb562b32d266d30713f487ca6d6fbaedcc8ab65 100644 (file)
@@ -40,7 +40,8 @@ struct _GtkListStore
   GtkObject parent;
 
   /*< private >*/
-  GtkTreeNode root;
+  gint stamp;
+  gpointer root;
   gint n_columns;
   GType *column_headers;
 };
@@ -51,17 +52,17 @@ struct _GtkListStoreClass
 
   /* signals */
   /* Will be moved into the GtkTreeModelIface eventually */
-  void       (* node_changed)         (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_inserted)        (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_child_toggled)   (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_deleted)         (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path);
+  void       (* changed)         (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path,
+                                 GtkTreeIter  *iter);
+  void       (* inserted)        (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path,
+                                 GtkTreeIter  *iter);
+  void       (* child_toggled)   (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path,
+                                 GtkTreeIter  *iter);
+  void       (* deleted)         (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path);
 };
 
 GtkType      gtk_list_store_get_type           (void);
@@ -73,23 +74,23 @@ void         gtk_list_store_set_n_columns      (GtkListStore *store,
 void         gtk_list_store_set_column_type    (GtkListStore *store,
                                                gint          column,
                                                GType         type);
-GtkTreeNode  gtk_list_store_node_new           (void);
+GtkTreeIter *gtk_list_store_node_new           (void);
 void         gtk_list_store_node_set_cell      (GtkListStore *store,
-                                               GtkTreeNode   node,
+                                               GtkTreeIter  *iter,
                                                gint          column,
                                                GValue       *value);
 void         gtk_list_store_node_remove        (GtkListStore *store,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_list_store_node_insert        (GtkListStore *store,
+                                               GtkTreeIter  *iter);
+GtkTreeIter *gtk_list_store_node_insert        (GtkListStore *store,
                                                gint          position,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_list_store_node_insert_before (GtkListStore *store,
-                                               GtkTreeNode   sibling,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_list_store_node_prepend       (GtkListStore *store,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_list_store_node_append        (GtkListStore *store,
-                                               GtkTreeNode   node);
+                                               GtkTreeIter  *iter);
+GtkTreeIter *gtk_list_store_node_insert_before (GtkListStore *store,
+                                               GtkTreeIter   sibling,
+                                               GtkTreeIter  *iter);
+GtkTreeIter *gtk_list_store_node_prepend       (GtkListStore *store,
+                                               GtkTreeIter  *iter);
+GtkTreeIter *gtk_list_store_node_append        (GtkListStore *store,
+                                               GtkTreeIter  *iter);
 
 
 
index 1d32e48f16bad138dac575fea31febb4c905bb1f..6502701d9d519ada9d81d0109a988e70d458c4fa 100644 (file)
@@ -16,7 +16,7 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
-
+#if 0
 #include "gtkmodelsimple.h"
 #include "gtksignal.h"
 enum {
@@ -418,3 +418,4 @@ gtk_model_simple_node_deleted (GtkModelSimple *simple,
 
   gtk_signal_emit_by_name (GTK_OBJECT (simple), "node_deleted", path, node);
 }
+#endif
index fb0b21b17804645d3557c8d08a560171de049982..b637d78155b5f78e19f6dd7fb8dab3af453e4de0 100644 (file)
 extern "C" {
 #endif /* __cplusplus */
 
+#if 0
+
 #define GTK_TYPE_MODEL_SIMPLE                  (gtk_model_simple_get_type ())
 #define GTK_MODEL_SIMPLE(obj)                  (GTK_CHECK_CAST ((obj), GTK_TYPE_MODEL_SIMPLE, GtkModelSimple))
 #define GTK_MODEL_SIMPLE_CLASS(klass)          (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_MODEL_SIMPLE, GtkModelSimpleClass))
 #define GTK_IS_MODEL_SIMPLE(obj)               (GTK_CHECK_TYPE ((obj), GTK_TYPE_MODEL_SIMPLE))
 #define GTK_IS_MODEL_SIMPLE_CLASS(klass)       (GTK_CHECK_CLASS_TYPE ((obj), GTK_TYPE_MODEL_SIMPLE))
 
-
 typedef struct _GtkModelSimple       GtkModelSimple;
 typedef struct _GtkModelSimpleClass  GtkModelSimpleClass;
 
@@ -47,16 +48,16 @@ struct _GtkModelSimpleClass
 
   /* signals */
   /* Will be moved into the GtkTreeModelIface eventually */
-  void       (* node_changed)         (GtkTreeModel *tree_model,
+  void       (* changed)         (GtkTreeModel *tree_model,
                                       GtkTreePath  *path,
                                       GtkTreeNode   node);
-  void       (* node_inserted)        (GtkTreeModel *tree_model,
+  void       (* inserted)        (GtkTreeModel *tree_model,
                                       GtkTreePath  *path,
                                       GtkTreeNode   node);
-  void       (* node_child_toggled)   (GtkTreeModel *tree_model,
+  void       (* child_toggled)   (GtkTreeModel *tree_model,
                                       GtkTreePath  *path,
                                       GtkTreeNode   node);
-  void       (* node_deleted)         (GtkTreeModel *tree_model,
+  void       (* deleted)         (GtkTreeModel *tree_model,
                                       GtkTreePath  *path);
 };
 
@@ -78,7 +79,7 @@ void       gtk_model_simple_node_deleted       (GtkModelSimple *simple,
                                                GtkTreeNode     node);
 
 
-
+#endif
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 92b170d1ff7dcc5e7fa8e7a8350aed475bbc0f55..6afc080ecf3c24f326abcbcf2dcb6e305546911e 100644 (file)
@@ -661,6 +661,13 @@ _gtk_rbtree_find_offset (GtkRBTree  *tree,
 {
   GtkRBNode *tmp_node;
 
+  if (height < 0)
+    {
+      *new_tree = NULL;
+      *new_node = NULL;
+      return 0;
+    }
+    
   tmp_node = tree->root;
   while (tmp_node != tree->nil &&
         (tmp_node->left->offset > height ||
index 3ed9fd287a1773a6833c88a408dfcefd6d2ee350..f89eef824720a64a7108e1de8172f6fdee93dd18 100644 (file)
@@ -152,6 +152,9 @@ gtk_tree_data_list_node_to_value (GtkTreeDataList *list,
     case G_TYPE_UINT:
       g_value_set_uint (value, list->data.v_uint);
       break;
+    case G_TYPE_POINTER:
+      g_value_set_pointer (value, (gpointer) list->data.v_pointer);
+      break;
     case G_TYPE_FLOAT:
       g_value_set_float (value, list->data.v_float);
       break;
@@ -161,6 +164,9 @@ gtk_tree_data_list_node_to_value (GtkTreeDataList *list,
     case G_TYPE_OBJECT:
       g_value_set_object (value, (GObject *) list->data.v_pointer);
       break;
+    default:
+      g_warning ("Unsupported type (%s) retrieved.", g_type_name (value->g_type));
+      return;
     }
 }
 
@@ -185,6 +191,9 @@ gtk_tree_data_list_value_to_node (GtkTreeDataList *list,
     case G_TYPE_UINT:
       list->data.v_uint = g_value_get_uint (value);
       break;
+    case G_TYPE_POINTER:
+      list->data.v_pointer = g_value_get_pointer (value);
+      break;
     case G_TYPE_FLOAT:
       list->data.v_float = g_value_get_float (value);
       break;
index a4c8f69d403e225e395eae44e9d7a848410af816..e0f19611b835859d640c4b56a6bb6009dd57b369 100644 (file)
@@ -393,169 +393,240 @@ gint
 gtk_tree_model_get_n_columns (GtkTreeModel *tree_model)
 {
   g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->get_n_columns != NULL, 0);
+
   return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_n_columns) (tree_model);
 }
 
 /**
- * gtk_tree_model_get_node:
+ * gtk_tree_model_get_iter:
  * @tree_model: A #GtkTreeModel.
- * @path: The @GtkTreePath.
+ * @iter: The uninitialized #GtkTreeIter.
+ * @path: The #GtkTreePath.
  * 
- * Returns a #GtkTreeNode located at @path.  If such a node does not exist, NULL
- * is returned.
+ * Sets @iter to a valid iterator pointing to @path.  If the model does not
+ * provide an implementation of this function, it is implemented in terms of
+ * @gtk_tree_model_iter_nth_child.
  * 
- * Return value: A #GtkTreeNode located at @path, or NULL.
+ * Return value: TRUE, if @iter was set.
  **/
-GtkTreeNode
-gtk_tree_model_get_node (GtkTreeModel *tree_model,
+gboolean
+gtk_tree_model_get_iter (GtkTreeModel *tree_model,
+                        GtkTreeIter  *iter,
                         GtkTreePath  *path)
 {
-  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->get_node != NULL, NULL);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_node) (tree_model, path);
+  GtkTreeIter parent;
+  gint *indices;
+  gint depth, i;
+
+  if (GTK_TREE_MODEL_GET_IFACE (tree_model)->get_iter != NULL)
+    return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_iter) (tree_model, iter, path);
+
+  g_return_val_if_fail (path != NULL, FALSE);
+  indices = gtk_tree_path_get_indices (path);
+  depth = gtk_tree_path_get_depth (path);
+
+  g_return_val_if_fail (depth > 0, FALSE);
+
+  if (! gtk_tree_model_iter_nth_child (tree_model, iter, NULL, indices[0]))
+    return FALSE;
+
+  for (i = 1; i < depth; i++)
+    {
+      parent = *iter;
+      if (! gtk_tree_model_iter_nth_child (tree_model, iter, &parent, indices[i]))
+       return FALSE;
+    }
+
+  return TRUE;
+}
+
+
+/**
+ * gtk_tree_model_iter_invalid:
+ * @tree_model: A #GtkTreeModel.
+ * @iter: The #GtkTreeIter.
+ * 
+ * Tests the validity of @iter, and returns TRUE if it is invalid.
+ * 
+ * Return value: TRUE, if @iter is invalid.
+ **/
+gboolean
+gtk_tree_model_iter_invalid (GtkTreeModel *tree_model,
+                            GtkTreeIter  *iter)
+{
+  g_return_val_if_fail (tree_model != NULL, FALSE);
+  if (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_invalid)
+    return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_invalid) (tree_model, iter);
+
+  /* Default implementation.  Returns false if iter is false, or the stamp is 0 */
+  if (iter == NULL || iter->stamp == 0)
+    return TRUE;
+
+  return FALSE;
 }
 
 /**
  * gtk_tree_model_get_path:
  * @tree_model: A #GtkTreeModel.
- * @node: The #GtkTreeNode.
+ * @iter: The #GtkTreeIter.
  * 
- * Returns a newly created #GtkTreePath that points to @node.  This path should
+ * Returns a newly created #GtkTreePath referenced by @iter.  This path should
  * be freed with #gtk_tree_path_free.
  * 
  * Return value: a newly created #GtkTreePath.
  **/
 GtkTreePath *
 gtk_tree_model_get_path (GtkTreeModel *tree_model,
-                        GtkTreeNode   node)
+                        GtkTreeIter  *iter)
 {
   g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->get_path != NULL, NULL);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_path) (tree_model, node);
+
+  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_path) (tree_model, iter);
 }
 
 /**
- * gtk_tree_model_node_get_value:
+ * gtk_tree_model_iter_get_value:
  * @tree_model: A #GtkTreeModel.
- * @node: The #GtkTreeNode.
- * @column: A column on the node.
+ * @iter: The #GtkTreeIter.
+ * @column: The column to lookup the value at.
  * @value: An empty #GValue to set.
  * 
  * Sets initializes and sets @value to that at @column.  When done with value,
  * #g_value_unset needs to be called on it.
  **/
 void
-gtk_tree_model_node_get_value (GtkTreeModel *tree_model,
-                              GtkTreeNode   node,
+gtk_tree_model_iter_get_value (GtkTreeModel *tree_model,
+                              GtkTreeIter  *iter,
                               gint          column,
                               GValue       *value)
 {
-  g_return_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_get_value != NULL);
-  (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_get_value) (tree_model, node, column, value);
+  g_return_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_get_value != NULL);
+
+  (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_get_value) (tree_model, iter, column, value);
 }
 
 /**
- * gtk_tree_model_node_next:
+ * gtk_tree_model_iter_next:
  * @tree_model: A #GtkTreeModel.
- * @node: A reference to a #GtkTreeNode.
+ * @iter: The #GtkTreeIter.
  * 
- * Sets @node to be the node following it at the current level.  If there is no
- * next @node, FALSE is returned, and *@node is set to NULL.
+ * Sets @iter to point to the node following it at the current level.  If there
+ * is no next @iter, FALSE is returned and @iter is set to be invalid.
  * 
- * Return value: TRUE if @node has been changed to the next node.
+ * Return value: TRUE if @iter has been changed to the next node.
  **/
 gboolean
-gtk_tree_model_node_next (GtkTreeModel  *tree_model,
-                         GtkTreeNode   *node)
+gtk_tree_model_iter_next (GtkTreeModel  *tree_model,
+                         GtkTreeIter   *iter)
 {
-  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_next != NULL, FALSE);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_next) (tree_model, node);
+  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_next != NULL, FALSE);
+
+  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_next) (tree_model, iter);
 }
 
 /**
- * gtk_tree_model_node_children:
+ * gtk_tree_model_iter_children:
  * @tree_model: A #GtkTreeModel.
- * @node: The #GtkTreeNode to get children from.
+ * @iter: The #GtkTreeIter.
+ * @child: The new #GtkTreeIter.
  * 
- * Returns the first child node of @node.  If it has no children, then NULL is
- * returned.
+ * Sets @iter to point to the first child of @parent.  If @parent has no children,
+ * FALSE is returned and @iter is set to be invalid.  @parent will remain a valid
+ * node after this function has been called.
  * 
- * Return value: The first child of @node, or NULL.
+ * Return value: TRUE, if @child has been set to the first child.
  **/
-GtkTreeNode
-gtk_tree_model_node_children (GtkTreeModel *tree_model,
-                             GtkTreeNode   node)
+gboolean
+gtk_tree_model_iter_children (GtkTreeModel *tree_model,
+                             GtkTreeIter  *iter,
+                             GtkTreeIter  *parent)
 {
-  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_children != NULL, NULL);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_children) (tree_model, node);
+  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_children != NULL, FALSE);
+
+  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_children) (tree_model, iter, parent);
 }
 
 /**
- * gtk_tree_model_node_has_child:
+ * gtk_tree_model_iter_has_child:
  * @tree_model: A #GtkTreeModel.
- * @node: The #GtkTreeNode to test for children.
+ * @iter: The #GtkTreeIter to test for children.
  * 
- * Returns TRUE if @node has children, FALSE otherwise.
+ * Returns TRUE if @iter has children, FALSE otherwise.
  * 
- * Return value: TRUE if @node has children.
+ * Return value: TRUE if @iter has children.
  **/
 gboolean
-gtk_tree_model_node_has_child (GtkTreeModel *tree_model,
-                              GtkTreeNode   node)
+gtk_tree_model_iter_has_child (GtkTreeModel *tree_model,
+                              GtkTreeIter  *iter)
 {
-  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_has_child != NULL, FALSE);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_has_child) (tree_model, node);
+  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_has_child != NULL, FALSE);
+
+  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_has_child) (tree_model, iter);
 }
 
 /**
- * gtk_tree_model_node_n_children:
+ * gtk_tree_model_iter_n_children:
  * @tree_model: A #GtkTreeModel.
- * @node: The #GtkTreeNode.
+ * @iter: The #GtkTreeIter.
  * 
- * Returns the number of children that @node has.
+ * Returns the number of children that @iter has.
  * 
- * Return value: The number of children of @node.
+ * Return value: The number of children of @iter.
  **/
 gint
-gtk_tree_model_node_n_children (GtkTreeModel *tree_model,
-                               GtkTreeNode   node)
+gtk_tree_model_iter_n_children (GtkTreeModel *tree_model,
+                               GtkTreeIter  *iter)
 {
-  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_n_children != NULL, -1);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_n_children) (tree_model, node);
+  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_n_children != NULL, -1);
+
+  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_n_children) (tree_model, iter);
 }
 
 /**
- * gtk_tree_model_node_nth_child:
+ * gtk_tree_model_iter_nth_child:
  * @tree_model: A #GtkTreeModel.
- * @node: The #GtkTreeNode to get the child from.
- * @n: The index of the desired #GtkTreeNode.
+ * @iter: The #GtkTreeIter to set to the nth child.
+ * @parent: The #GtkTreeIter to get the child from, or NULL.
+ * @n: Then index of the desired child.
  * 
- * Returns a child of @node, using the given index.  The first index is 0.  If
- * the index is too big, NULL is returned.
+ * Sets @iter to be the child of @parent, using the given index.  The first index
+ * is 0.  If the index is too big, or @parent has no children, @iter is set to an
+ * invalid iterator and FALSE is returned.  @parent will remain a valid node after
+ * this function has been called.  If @parent is NULL, then the root node is assumed.
  * 
- * Return value: the child of @node at index @n.
+ * Return value: TRUE, if @parent has an nth child.
  **/
-GtkTreeNode
-gtk_tree_model_node_nth_child (GtkTreeModel *tree_model,
-                              GtkTreeNode   node,
+gboolean
+gtk_tree_model_iter_nth_child (GtkTreeModel *tree_model,
+                              GtkTreeIter  *iter,
+                              GtkTreeIter  *parent,
                               gint          n)
 {
-  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_nth_child != NULL, NULL);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_nth_child) (tree_model, node, n);
+  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_nth_child != NULL, FALSE);
+
+  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_nth_child) (tree_model, iter, parent, n);
 }
 
 /**
- * gtk_tree_model_node_parent:
- * @tree_model: A #GtkTreeModel.
- * @node: The #GtkTreeNode.
+ * gtk_tree_model_iter_parent:
+ * @tree_model: A #GtkTreeModel
+ * @iter: The #GtkTreeIter.
+ * @parent: The #GtkTreeIter to set to the parent
  * 
- * Returns the parent of @node.  If @node is at depth 0, then NULL is returned.
+ * Sets @iter to be the parent of @child.  If @child is at the toplevel, and
+ * doesn't have a parent, then @iter is set to an invalid iterator and FALSE
+ * is returned.  @child will remain a valid node after this function has been
+ * called.
  * 
- * Return value: Returns the parent node of @node, or NULL.
+ * Return value: TRUE, if @iter is set to the parent of @child.
  **/
-GtkTreeNode
-gtk_tree_model_node_parent (GtkTreeModel *tree_model,
-                           GtkTreeNode   node)
+gboolean
+gtk_tree_model_iter_parent (GtkTreeModel *tree_model,
+                           GtkTreeIter  *iter,
+                           GtkTreeIter  *child)
 {
-  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_parent != NULL, NULL);
-  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_parent) (tree_model, node);
+  g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_parent != NULL, FALSE);
+
+  return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->iter_parent) (tree_model, iter, child);
 }
 
index 36aca525da316c37113ba50a80a38bce8e3f703b..364a3c8d9c593628b54d12c2a10b012de4812346 100644 (file)
@@ -32,11 +32,17 @@ extern "C" {
 #define GTK_TREE_MODEL_GET_IFACE(obj)  ((GtkTreeModelIface *)g_type_interface_peek (((GTypeInstance *)GTK_TREE_MODEL (obj))->g_class, GTK_TYPE_TREE_MODEL))
                                        
 
-typedef gpointer                  GtkTreeNode;
+typedef struct _GtkTreeIter       GtkTreeIter;
 typedef struct _GtkTreePath       GtkTreePath;
 typedef struct _GtkTreeModel      GtkTreeModel; /* Dummy typedef */
 typedef struct _GtkTreeModelIface GtkTreeModelIface;
 
+struct _GtkTreeIter
+{
+  gint stamp;
+  gpointer tree_node;
+};
+
 struct _GtkTreeModelIface
 {
   GTypeInterface g_iface;
@@ -46,92 +52,111 @@ struct _GtkTreeModelIface
    * objects implementing this interface need this.  Later, it will be moved
    * back here.
    */
-  void       (* node_changed)         (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_inserted)        (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_child_toggled)   (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_deleted)         (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path);
+  void         (* changed)           (GtkTreeModel *tree_model,
+                                     GtkTreePath  *path,
+                                     GtkTreeIter  *iter);
+  void         (* inserted)          (GtkTreeModel *tree_model,
+                                     GtkTreePath  *path,
+                                     GtkTreeIter  *iter);
+  void         (* child_toggled)     (GtkTreeModel *tree_model,
+                                     GtkTreePath  *path,
+                                     GtkTreeIter  *iter);
+  void         (* deleted)           (GtkTreeModel *tree_model,
+                                     GtkTreePath  *path);
 
   /* VTable - not signals */
   gint         (* get_n_columns)   (GtkTreeModel *tree_model);
-  GtkTreeNode  (* get_node)        (GtkTreeModel *tree_model,
+  GType        (* get_column_type) (GtkTreeModel *tree_model,
+                                   gint          index);
+  gboolean     (* get_iter)        (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter,
                                    GtkTreePath  *path);
+  gboolean     (* iter_invalid)    (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter);
   GtkTreePath *(* get_path)        (GtkTreeModel *tree_model,
-                                   GtkTreeNode   node);
-  void         (* node_get_value)  (GtkTreeModel *tree_model,
-                                   GtkTreeNode   node,
+                                   GtkTreeIter  *iter);
+  void         (* iter_get_value)  (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter,
                                    gint          column,
                                    GValue       *value);
-  gboolean     (* node_next)       (GtkTreeModel *tree_model,
-                                   GtkTreeNode  *node);
-  GtkTreeNode  (* node_children)   (GtkTreeModel *tree_model,
-                                   GtkTreeNode   node);
-  gboolean     (* node_has_child)  (GtkTreeModel *tree_model,
-                                   GtkTreeNode   node);
-  gint         (* node_n_children) (GtkTreeModel *tree_model,
-                                   GtkTreeNode   node);
-  GtkTreeNode  (* node_nth_child)  (GtkTreeModel *tree_model,
-                                   GtkTreeNode   node,
+  gboolean     (* iter_next)       (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter);
+  gboolean     (* iter_children)   (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter,
+                                   GtkTreeIter  *child);
+  gboolean     (* iter_has_child)  (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter);
+  gint         (* iter_n_children) (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter);
+  gboolean     (* iter_nth_child)  (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter,
+                                   GtkTreeIter  *parent,
                                    gint          n);
-  GtkTreeNode  (* node_parent)     (GtkTreeModel *tree_model,
-                                   GtkTreeNode   node);
+  gboolean     (* iter_parent)     (GtkTreeModel *tree_model,
+                                   GtkTreeIter  *iter,
+                                   GtkTreeIter  *parent);
 };
 
 
-/* Basic tree_model operations */
-GtkType        gtk_tree_model_get_type        (void) G_GNUC_CONST;
-
-/* GtkTreePath Operations */
-GtkTreePath   *gtk_tree_path_new              (void);
-GtkTreePath   *gtk_tree_path_new_from_string  (gchar        *path);
-gchar         *gtk_tree_path_to_string        (GtkTreePath  *path);
-GtkTreePath   *gtk_tree_path_new_root         (void);
-void           gtk_tree_path_append_index     (GtkTreePath  *path,
-                                              gint          index);
-void           gtk_tree_path_prepend_index    (GtkTreePath  *path,
-                                              gint          index);
-gint           gtk_tree_path_get_depth        (GtkTreePath  *path);
-gint          *gtk_tree_path_get_indices      (GtkTreePath  *path);
-void           gtk_tree_path_free             (GtkTreePath  *path);
-GtkTreePath   *gtk_tree_path_copy             (GtkTreePath  *path);
-gint           gtk_tree_path_compare          (const GtkTreePath *a,
-                                              const GtkTreePath *b);
-void           gtk_tree_path_next             (GtkTreePath  *path);
-gint           gtk_tree_path_prev             (GtkTreePath  *path);
-gint           gtk_tree_path_up               (GtkTreePath  *path);
-void           gtk_tree_path_down             (GtkTreePath  *path);
-
-/* Header operations */
-gint           gtk_tree_model_get_n_columns   (GtkTreeModel *tree_model);
-
-/* Node operations */
-GtkTreeNode    gtk_tree_model_get_node        (GtkTreeModel *tree_model,
-                                              GtkTreePath  *path);
-GtkTreePath   *gtk_tree_model_get_path        (GtkTreeModel *tree_model,
-                                              GtkTreeNode   node);
-void           gtk_tree_model_node_get_value  (GtkTreeModel *tree_model,
-                                              GtkTreeNode   node,
-                                              gint          column,
-                                              GValue       *value);
-gboolean       gtk_tree_model_node_next       (GtkTreeModel *tree_model,
-                                              GtkTreeNode  *node);
-GtkTreeNode    gtk_tree_model_node_children   (GtkTreeModel *tree_model,
-                                              GtkTreeNode   node);
-gboolean       gtk_tree_model_node_has_child  (GtkTreeModel *tree_model,
-                                              GtkTreeNode   node);
-gint           gtk_tree_model_node_n_children (GtkTreeModel *tree_model,
-                                              GtkTreeNode   node);
-GtkTreeNode    gtk_tree_model_node_nth_child  (GtkTreeModel *tree_model,
-                                              GtkTreeNode   node,
-                                              gint          n);
-GtkTreeNode    gtk_tree_model_node_parent     (GtkTreeModel *tree_model,
-                                              GtkTreeNode   node);
+/* Path operations */
+GtkTreePath *gtk_tree_path_new              (void);
+GtkTreePath *gtk_tree_path_new_from_string  (gchar             *path);
+gchar       *gtk_tree_path_to_string        (GtkTreePath       *path);
+GtkTreePath *gtk_tree_path_new_root         (void);
+void         gtk_tree_path_append_index     (GtkTreePath       *path,
+                                            gint               index);
+void         gtk_tree_path_prepend_index    (GtkTreePath       *path,
+                                            gint               index);
+gint         gtk_tree_path_get_depth        (GtkTreePath       *path);
+gint        *gtk_tree_path_get_indices      (GtkTreePath       *path);
+void         gtk_tree_path_free             (GtkTreePath       *path);
+GtkTreePath *gtk_tree_path_copy             (GtkTreePath       *path);
+gint         gtk_tree_path_compare          (const GtkTreePath *a,
+                                            const GtkTreePath *b);
+void         gtk_tree_path_next             (GtkTreePath       *path);
+gint         gtk_tree_path_prev             (GtkTreePath       *path);
+gint         gtk_tree_path_up               (GtkTreePath       *path);
+void         gtk_tree_path_down             (GtkTreePath       *path);
+
+
+/* GtkTreeModel stuff */
+GtkType      gtk_tree_model_get_type        (void) G_GNUC_CONST;
+
+
+/* Column information */
+gint         gtk_tree_model_get_n_columns   (GtkTreeModel      *tree_model);
+GType        gtk_tree_model_get_column_type (GtkTreeModel      *tree_model,
+                                            gint               index);
+
+
+/* Iterator movement */
+gboolean     gtk_tree_model_get_iter        (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter,
+                                            GtkTreePath       *path);
+gboolean     gtk_tree_model_iter_invalid    (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter);
+GtkTreePath *gtk_tree_model_get_path        (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter);
+void         gtk_tree_model_iter_get_value  (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter,
+                                            gint               column,
+                                            GValue            *value);
+gboolean     gtk_tree_model_iter_next       (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter);
+gboolean     gtk_tree_model_iter_children   (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter,
+                                            GtkTreeIter       *parent);
+gboolean     gtk_tree_model_iter_has_child  (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter);
+gint         gtk_tree_model_iter_n_children (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter);
+gboolean     gtk_tree_model_iter_nth_child  (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter,
+                                            GtkTreeIter       *parent,
+                                            gint               n);
+gboolean     gtk_tree_model_iter_parent     (GtkTreeModel      *tree_model,
+                                            GtkTreeIter       *iter,
+                                            GtkTreeIter       *child);
 
 
 #ifdef __cplusplus
@@ -140,4 +165,3 @@ GtkTreeNode    gtk_tree_model_node_parent     (GtkTreeModel *tree_model,
 
 
 #endif /* __GTK_TREE_MODEL_H__ */
-
index 802d806ecfd99f1694192dea4bb8ecab9f5ff0ba..74e0771209a2398a444221933e10dbfd204e4fc8 100644 (file)
@@ -243,26 +243,29 @@ gtk_tree_selection_get_user_data (GtkTreeSelection *selection)
  * gtk_tree_selection_get_selected:
  * @selection: A #GtkTreeSelection.
  * 
- * Returns the currently selected node if @selection is set to
- * #GTK_TREE_SELECTION_SINGLE.  Otherwise, it returns the anchor.
+ * Sets @iter to the currently selected node if @selection is set to
+ * #GTK_TREE_SELECTION_SINGLE.  Otherwise, it uses the anchor.  @iter may be
+ * NULL if you just want to test if @selection has any selected nodes.
  * 
- * Return value: The selected #GtkTreeNode.
+ * Return value: The if a node is selected.
  **/
-GtkTreeNode
-gtk_tree_selection_get_selected (GtkTreeSelection *selection)
+gboolean
+gtk_tree_selection_get_selected (GtkTreeSelection *selection,
+                                GtkTreeIter      *iter)
 {
-  GtkTreeNode *retval;
   GtkRBTree *tree;
   GtkRBNode *node;
 
-  g_return_val_if_fail (selection != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_TREE_SELECTION (selection), NULL);
+  g_return_val_if_fail (selection != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_TREE_SELECTION (selection), FALSE);
 
   if (selection->tree_view->priv->anchor == NULL)
-    return NULL;
+    return FALSE;
+  else if (iter == NULL)
+    return TRUE;
 
-  g_return_val_if_fail (selection->tree_view != NULL, NULL);
-  g_return_val_if_fail (selection->tree_view->priv->model != NULL, NULL);
+  g_return_val_if_fail (selection->tree_view != NULL, FALSE);
+  g_return_val_if_fail (selection->tree_view->priv->model != NULL, FALSE);
 
   if (!_gtk_tree_view_find_node (selection->tree_view,
                                selection->tree_view->priv->anchor,
@@ -272,11 +275,11 @@ gtk_tree_selection_get_selected (GtkTreeSelection *selection)
     /* We don't want to return the anchor if it isn't actually selected.
      */
 
-      return NULL;
+      return FALSE;
 
-  retval = gtk_tree_model_get_node (selection->tree_view->priv->model,
-                                   selection->tree_view->priv->anchor);
-  return retval;
+  return gtk_tree_model_get_iter (selection->tree_view->priv->model,
+                                 iter,
+                                 selection->tree_view->priv->anchor);
 }
 
 /**
@@ -295,7 +298,7 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection            *selection,
   GtkTreePath *path;
   GtkRBTree *tree;
   GtkRBNode *node;
-  GtkTreeNode tree_node;
+  GtkTreeIter iter;
 
   g_return_if_fail (selection != NULL);
   g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
@@ -315,23 +318,28 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection            *selection,
 
   /* find the node internally */
   path = gtk_tree_path_new_root ();
-  tree_node = gtk_tree_model_get_node (selection->tree_view->priv->model, path);
+  gtk_tree_model_get_iter (selection->tree_view->priv->model,
+                          &iter, path);
   gtk_tree_path_free (path);
 
   do
     {
       if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
-       (* func) (selection->tree_view->priv->model, tree_node, data);
+       (* func) (selection->tree_view->priv->model, &iter, data);
       if (node->children)
        {
+         gboolean has_child;
+         GtkTreeIter tmp;
+
          tree = node->children;
          node = tree->root;
          while (node->left != tree->nil)
            node = node->left;
-         tree_node = gtk_tree_model_node_children (selection->tree_view->priv->model, tree_node);
+         tmp = iter;
+         has_child = gtk_tree_model_iter_children (selection->tree_view->priv->model, &iter, &tmp);
 
          /* Sanity Check! */
-         TREE_VIEW_INTERNAL_ASSERT_VOID (tree_node != NULL);
+         TREE_VIEW_INTERNAL_ASSERT_VOID (has_child);
        }
       else
        {
@@ -341,24 +349,29 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection            *selection,
              node = _gtk_rbtree_next (tree, node);
              if (node != NULL)
                {
-                 gtk_tree_model_node_next (selection->tree_view->priv->model, &tree_node);
+                 gboolean has_next;
+
+                 has_next = gtk_tree_model_iter_next (selection->tree_view->priv->model, &iter);
                  done = TRUE;
 
                  /* Sanity Check! */
-                 TREE_VIEW_INTERNAL_ASSERT_VOID (tree_node != NULL);
+                 TREE_VIEW_INTERNAL_ASSERT_VOID (has_next);
                }
              else
                {
+                 gboolean has_parent;
+                 GtkTreeIter tmp_iter = iter;
+
                  node = tree->parent_node;
                  tree = tree->parent_tree;
                  if (tree == NULL)
                    /* we've run out of tree */
                    /* We're done with this function */
                    return;
-                 tree_node = gtk_tree_model_node_parent (selection->tree_view->priv->model, tree_node);
+                 has_parent = gtk_tree_model_iter_parent (selection->tree_view->priv->model, &iter, &tmp_iter);
 
                  /* Sanity check */
-                 TREE_VIEW_INTERNAL_ASSERT_VOID (tree_node != NULL);
+                 TREE_VIEW_INTERNAL_ASSERT_VOID (has_parent);
                }
            }
          while (!done);
@@ -440,15 +453,15 @@ gtk_tree_selection_unselect_path (GtkTreeSelection *selection,
 }
 
 /**
- * gtk_tree_selection_select_node:
+ * gtk_tree_selection_select_iter:
  * @selection: A #GtkTreeSelection.
- * @tree_node: The #GtkTreeNode to be selected.
+ * @iter: The #GtkTreeIter to be selected.
  * 
- * Selects the specified node.
+ * Selects the specified iterator.
  **/
 void
-gtk_tree_selection_select_node (GtkTreeSelection *selection,
-                               GtkTreeNode       tree_node)
+gtk_tree_selection_select_iter (GtkTreeSelection *selection,
+                               GtkTreeIter      *iter)
 {
   GtkTreePath *path;
 
@@ -456,9 +469,10 @@ gtk_tree_selection_select_node (GtkTreeSelection *selection,
   g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
   g_return_if_fail (selection->tree_view != NULL);
   g_return_if_fail (selection->tree_view->priv->model != NULL);
+  g_return_if_fail (iter == NULL);
 
   path = gtk_tree_model_get_path (selection->tree_view->priv->model,
-                                 tree_node);
+                                 iter);
 
   if (path == NULL)
     return;
@@ -469,24 +483,26 @@ gtk_tree_selection_select_node (GtkTreeSelection *selection,
 
 
 /**
- * gtk_tree_selection_unselect_node:
+ * gtk_tree_selection_unselect_iter:
  * @selection: A #GtkTreeSelection.
- * @tree_node: The #GtkTreeNode to be unselected.
+ * @iter: The #GtkTreeIter to be unselected.
  * 
- * Unselects the specified node.
+ * Unselects the specified iterator.
  **/
 void
-gtk_tree_selection_unselect_node (GtkTreeSelection *selection,
-                                 GtkTreeNode       tree_node)
+gtk_tree_selection_unselect_iter (GtkTreeSelection *selection,
+                                 GtkTreeIter      *iter)
 {
   GtkTreePath *path;
 
   g_return_if_fail (selection != NULL);
   g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
   g_return_if_fail (selection->tree_view != NULL);
+  g_return_if_fail (selection->tree_view->priv->model != NULL);
+  g_return_if_fail (iter == NULL);
 
   path = gtk_tree_model_get_path (selection->tree_view->priv->model,
-                                 tree_node);
+                                 iter);
 
   if (path == NULL)
     return;
@@ -875,9 +891,6 @@ gtk_tree_selection_real_select_node (GtkTreeSelection *selection,
     }
   if (selected == TRUE)
     {
-      GtkTreeNode tree_node;
-      tree_node = gtk_tree_model_get_node (selection->tree_view->priv->model, path);
-
       node->flags ^= GTK_RBNODE_IS_SELECTED;
 
       /* FIXME: just draw the one node*/
index 61849016b0dfb6205c28e7eb1c3a87bf2c75f092..cafedf7dd8981c1c31cc7572c3536dea0e1f45f7 100644 (file)
@@ -45,7 +45,7 @@ typedef gboolean (* GtkTreeSelectionFunc)    (GtkTreeSelection  *selection,
                                              GtkTreePath       *path,
                                              gpointer           data);
 typedef void (* GtkTreeSelectionForeachFunc) (GtkTreeModel      *model,
-                                             GtkTreeNode        node,
+                                             GtkTreeIter       *iter,
                                              gpointer           data);
 
 struct _GtkTreeSelection
@@ -78,7 +78,8 @@ gpointer         gtk_tree_selection_get_user_data       (GtkTreeSelection
 
 /* Only meaningful if GTK_TREE_SELECTION_SINGLE is set */
 /* Use selected_foreach for GTK_TREE_SELECTION_MULTI */
-GtkTreeNode      gtk_tree_selection_get_selected        (GtkTreeSelection            *selection);
+gboolean         gtk_tree_selection_get_selected        (GtkTreeSelection            *selection,
+                                                        GtkTreeIter                 *iter);
 
 /* FIXME: Get a more convenient get_selection function????  one returning GSList?? */
 void             gtk_tree_selection_selected_foreach    (GtkTreeSelection            *selection,
@@ -88,10 +89,10 @@ void             gtk_tree_selection_select_path         (GtkTreeSelection
                                                         GtkTreePath                 *path);
 void             gtk_tree_selection_unselect_path       (GtkTreeSelection            *selection,
                                                         GtkTreePath                 *path);
-void             gtk_tree_selection_select_node         (GtkTreeSelection            *selection,
-                                                        GtkTreeNode                  tree_node);
-void             gtk_tree_selection_unselect_node       (GtkTreeSelection            *selection,
-                                                        GtkTreeNode                  tree_node);
+void             gtk_tree_selection_select_iter         (GtkTreeSelection            *selection,
+                                                        GtkTreeIter                 *iter);
+void             gtk_tree_selection_unselect_iter       (GtkTreeSelection            *selection,
+                                                        GtkTreeIter                 *iter);
 void             gtk_tree_selection_select_all          (GtkTreeSelection            *selection);
 void             gtk_tree_selection_unselect_all        (GtkTreeSelection            *selection);
 void             gtk_tree_selection_select_range        (GtkTreeSelection            *selection,
index 96daafe89b29da8a9a27155834dbc08c0be8da53..a557ce4f155614118136285d19eaf724346c90c2 100644 (file)
 #include "gtktreedatalist.h"
 #include "gtksignal.h"
 #include <string.h>
+#include <gobject/gvaluecollector.h>
 
 #define G_NODE(node) ((GNode *)node)
 
 enum {
-  NODE_CHANGED,
-  NODE_INSERTED,
-  NODE_CHILD_TOGGLED,
-  NODE_DELETED,
+  CHANGED,
+  INSERTED,
+  CHILD_TOGGLED,
+  DELETED,
   LAST_SIGNAL
 };
 
 static guint tree_store_signals[LAST_SIGNAL] = { 0 };
 
-static void           gtk_tree_store_init            (GtkTreeStore      *tree_store);
-static void           gtk_tree_store_class_init      (GtkTreeStoreClass *tree_store_class);
-static void           gtk_tree_store_tree_model_init (GtkTreeModelIface *iface);
-static gint           gtk_tree_store_get_n_columns   (GtkTreeModel      *tree_model);
-static GtkTreeNode    gtk_tree_store_get_node        (GtkTreeModel      *tree_model,
-                                                     GtkTreePath       *path);
-static GtkTreePath   *gtk_tree_store_get_path        (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static void           gtk_tree_store_node_get_value  (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node,
-                                                     gint               column,
-                                                     GValue            *value);
-static gboolean       gtk_tree_store_node_next       (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode       *node);
-static GtkTreeNode    gtk_tree_store_node_children   (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static gboolean       gtk_tree_store_node_has_child  (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static gint           gtk_tree_store_node_n_children (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
-static GtkTreeNode    gtk_tree_store_node_nth_child  (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node,
-                                                     gint               n);
-static GtkTreeNode    gtk_tree_store_node_parent     (GtkTreeModel      *tree_model,
-                                                     GtkTreeNode        node);
 
+static void         gtk_tree_store_init            (GtkTreeStore      *tree_store);
+static void         gtk_tree_store_class_init      (GtkTreeStoreClass *tree_store_class);
+static void         gtk_tree_store_tree_model_init (GtkTreeModelIface *iface);
+static gint         gtk_tree_store_get_n_columns   (GtkTreeModel      *tree_model);
+static GtkTreePath *gtk_tree_store_get_path        (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter);
+static void         gtk_tree_store_iter_get_value  (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter,
+                                                   gint               column,
+                                                   GValue            *value);
+static gboolean     gtk_tree_store_iter_next       (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter);
+static gboolean     gtk_tree_store_iter_children   (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter,
+                                                   GtkTreeIter       *parent);
+static gboolean     gtk_tree_store_iter_has_child  (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter);
+static gint         gtk_tree_store_iter_n_children (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter);
+static gboolean     gtk_tree_store_iter_nth_child  (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter,
+                                                   GtkTreeIter       *child,
+                                                   gint               n);
+static gboolean     gtk_tree_store_iter_parent     (GtkTreeModel      *tree_model,
+                                                   GtkTreeIter       *iter,
+                                                   GtkTreeIter       *parent);
 
 
 GtkType
@@ -106,38 +108,38 @@ gtk_tree_store_class_init (GtkTreeStoreClass *tree_store_class)
 
   object_class = (GtkObjectClass *) tree_store_class;
 
-  tree_store_signals[NODE_CHANGED] =
-    gtk_signal_new ("node_changed",
+  tree_store_signals[CHANGED] =
+    gtk_signal_new ("changed",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, node_changed),
+                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, changed),
                     gtk_marshal_VOID__POINTER_POINTER,
                     GTK_TYPE_NONE, 2,
                    GTK_TYPE_POINTER,
                    GTK_TYPE_POINTER);
-  tree_store_signals[NODE_INSERTED] =
-    gtk_signal_new ("node_inserted",
+  tree_store_signals[INSERTED] =
+    gtk_signal_new ("inserted",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, node_inserted),
+                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, inserted),
                     gtk_marshal_VOID__POINTER_POINTER,
                     GTK_TYPE_NONE, 2,
                    GTK_TYPE_POINTER,
                    GTK_TYPE_POINTER);
-  tree_store_signals[NODE_CHILD_TOGGLED] =
-    gtk_signal_new ("node_child_toggled",
+  tree_store_signals[CHILD_TOGGLED] =
+    gtk_signal_new ("child_toggled",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, node_child_toggled),
+                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, child_toggled),
                     gtk_marshal_VOID__POINTER_POINTER,
                     GTK_TYPE_NONE, 2,
                    GTK_TYPE_POINTER,
                    GTK_TYPE_POINTER);
-  tree_store_signals[NODE_DELETED] =
-    gtk_signal_new ("node_deleted",
+  tree_store_signals[DELETED] =
+    gtk_signal_new ("deleted",
                     GTK_RUN_FIRST,
                     GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, node_deleted),
+                    GTK_SIGNAL_OFFSET (GtkTreeStoreClass, deleted),
                     gtk_marshal_VOID__POINTER,
                     GTK_TYPE_NONE, 1,
                    GTK_TYPE_POINTER);
@@ -149,47 +151,46 @@ static void
 gtk_tree_store_tree_model_init (GtkTreeModelIface *iface)
 {
   iface->get_n_columns = gtk_tree_store_get_n_columns;
-  iface->get_node = gtk_tree_store_get_node;
   iface->get_path = gtk_tree_store_get_path;
-  iface->node_get_value = gtk_tree_store_node_get_value;
-  iface->node_next = gtk_tree_store_node_next;
-  iface->node_children = gtk_tree_store_node_children;
-  iface->node_has_child = gtk_tree_store_node_has_child;
-  iface->node_n_children = gtk_tree_store_node_n_children;
-  iface->node_nth_child = gtk_tree_store_node_nth_child;
-  iface->node_parent = gtk_tree_store_node_parent;
+  iface->iter_get_value = gtk_tree_store_iter_get_value;
+  iface->iter_next = gtk_tree_store_iter_next;
+  iface->iter_children = gtk_tree_store_iter_children;
+  iface->iter_has_child = gtk_tree_store_iter_has_child;
+  iface->iter_n_children = gtk_tree_store_iter_n_children;
+  iface->iter_nth_child = gtk_tree_store_iter_nth_child;
+  iface->iter_parent = gtk_tree_store_iter_parent;
 }
 
 static void
 gtk_tree_store_init (GtkTreeStore *tree_store)
 {
-  tree_store->root = gtk_tree_store_node_new ();
+  tree_store->root = g_node_new (NULL);
+  tree_store->stamp = 1;
 }
 
-GtkObject *
+GtkTreeStore *
 gtk_tree_store_new (void)
 {
-  return GTK_OBJECT (gtk_type_new (gtk_tree_store_get_type ()));
+  return GTK_TREE_STORE (gtk_type_new (gtk_tree_store_get_type ()));
 }
 
-GtkObject *
+GtkTreeStore *
 gtk_tree_store_new_with_values (gint n_columns,
                                ...)
 {
-  GtkObject *retval;
+  GtkTreeStore *retval;
   va_list args;
   gint i;
 
   g_return_val_if_fail (n_columns > 0, NULL);
 
   retval = gtk_tree_store_new ();
-  gtk_tree_store_set_n_columns (GTK_TREE_STORE (retval),
-                               n_columns);
+  gtk_tree_store_set_n_columns (retval, n_columns);
 
   va_start (args, n_columns);
+
   for (i = 0; i < n_columns; i++)
-    gtk_tree_store_set_column_type (GTK_TREE_STORE (retval),
-                                   i, va_arg (args, GType));
+    gtk_tree_store_set_column_type (retval, i, va_arg (args, GType));
 
   va_end (args);
 
@@ -250,56 +251,39 @@ gtk_tree_store_get_n_columns (GtkTreeModel *tree_model)
   return GTK_TREE_STORE (tree_model)->n_columns;
 }
 
-static GtkTreeNode
-gtk_tree_store_get_node (GtkTreeModel *tree_model,
-                        GtkTreePath  *path)
-{
-  gint i;
-  GtkTreeNode node;
-  gint *indices = gtk_tree_path_get_indices (path);
-
-  node = GTK_TREE_STORE (tree_model)->root;
-
-  for (i = 0; i < gtk_tree_path_get_depth (path); i ++)
-    {
-      node = (GtkTreeNode) gtk_tree_store_node_nth_child (tree_model,
-                                                         (GtkTreeNode) node,
-                                                         indices[i]);
-      if (node == NULL)
-       return NULL;
-    }
-  return (GtkTreeNode) node;
-}
-
 static GtkTreePath *
 gtk_tree_store_get_path (GtkTreeModel *tree_model,
-                        GtkTreeNode   node)
+                        GtkTreeIter  *iter)
 {
   GtkTreePath *retval;
   GNode *tmp_node;
   gint i = 0;
 
   g_return_val_if_fail (tree_model != NULL, NULL);
-
-  if (node == NULL)
-    return NULL;
-  if (node == G_NODE (GTK_TREE_STORE (tree_model)->root))
+  g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), NULL);
+  g_return_val_if_fail (iter != NULL, NULL);
+  g_return_val_if_fail (GTK_TREE_STORE (tree_model)->stamp == iter->stamp, NULL);
+  if (iter->tree_node == NULL)
     return NULL;
 
-  if (G_NODE (node)->parent == G_NODE (GTK_TREE_STORE (tree_model)->root))
+  if (G_NODE (iter->tree_node)->parent == G_NODE (GTK_TREE_STORE (tree_model)->root))
     {
       retval = gtk_tree_path_new ();
       tmp_node = G_NODE (GTK_TREE_STORE (tree_model)->root)->children;
     }
   else
     {
+      GtkTreeIter tmp_iter = *iter;
+      tmp_iter.tree_node = G_NODE (tmp_iter.tree_node)->parent;
+
       retval = gtk_tree_store_get_path (tree_model,
-                                       G_NODE (node)->parent);
-      tmp_node = G_NODE (node)->parent->children;
+                                       &tmp_iter);
+      tmp_node = G_NODE (iter->tree_node)->parent->children;
     }
 
   if (retval == NULL)
     return NULL;
+
   if (tmp_node == NULL)
     {
       gtk_tree_path_free (retval);
@@ -308,13 +292,15 @@ gtk_tree_store_get_path (GtkTreeModel *tree_model,
 
   for (; tmp_node; tmp_node = tmp_node->next)
     {
-      if (tmp_node == G_NODE (node))
+      if (tmp_node == G_NODE (iter->tree_node))
        break;
       i++;
     }
+
   if (tmp_node == NULL)
     {
       /* We couldn't find node, meaning it's prolly not ours */
+      /* Perhaps I should do a g_return_if_fail here. */
       gtk_tree_path_free (retval);
       return NULL;
     }
@@ -326,8 +312,8 @@ gtk_tree_store_get_path (GtkTreeModel *tree_model,
 
 
 static void
-gtk_tree_store_node_get_value (GtkTreeModel *tree_model,
-                              GtkTreeNode   node,
+gtk_tree_store_iter_get_value (GtkTreeModel *tree_model,
+                              GtkTreeIter  *iter,
                               gint          column,
                               GValue       *value)
 {
@@ -336,87 +322,129 @@ gtk_tree_store_node_get_value (GtkTreeModel *tree_model,
 
   g_return_if_fail (tree_model != NULL);
   g_return_if_fail (GTK_IS_TREE_STORE (tree_model));
-  g_return_if_fail (node != NULL);
+  g_return_if_fail (iter != NULL);
+  g_return_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->stamp);
   g_return_if_fail (column < GTK_TREE_STORE (tree_model)->n_columns);
 
-  list = G_NODE (node)->data;
+  list = G_NODE (iter->tree_node)->data;
 
   while (tmp_column-- > 0 && list)
     list = list->next;
 
-  g_return_if_fail (list != NULL);
-
-  gtk_tree_data_list_node_to_value (list,
-                                   GTK_TREE_STORE (tree_model)->column_headers[column],
-                                   value);
+  if (list)
+    {
+      gtk_tree_data_list_node_to_value (list,
+                                       GTK_TREE_STORE (tree_model)->column_headers[column],
+                                       value);
+    }
+  else
+    {
+      /* We want to return an initialized but empty (default) value */
+      g_value_init (value, GTK_TREE_STORE (tree_model)->column_headers[column]);
+    }
 }
 
 static gboolean
-gtk_tree_store_node_next (GtkTreeModel  *tree_model,
-                         GtkTreeNode   *node)
+gtk_tree_store_iter_next (GtkTreeModel  *tree_model,
+                         GtkTreeIter   *iter)
 {
-  if (node == NULL || *node == NULL)
+  if (iter->tree_node == NULL)
     return FALSE;
 
-  *node = (GtkTreeNode) G_NODE (*node)->next;
-  return (*node != NULL);
+  iter->tree_node = G_NODE (iter->tree_node)->next;
+
+  return (iter->tree_node != NULL);
 }
 
-static GtkTreeNode
-gtk_tree_store_node_children (GtkTreeModel *tree_model,
-                             GtkTreeNode   node)
+static gboolean
+gtk_tree_store_iter_children (GtkTreeModel *tree_model,
+                             GtkTreeIter  *iter,
+                             GtkTreeIter  *parent)
 {
-  return (GtkTreeNode) G_NODE (node)->children;
+  iter->stamp = GTK_TREE_STORE (tree_model)->stamp;
+  iter->tree_node = G_NODE (parent->tree_node)->children;
+
+  return iter->tree_node != NULL;
 }
 
 static gboolean
-gtk_tree_store_node_has_child (GtkTreeModel *tree_model,
-                              GtkTreeNode   node)
+gtk_tree_store_iter_has_child (GtkTreeModel *tree_model,
+                              GtkTreeIter  *iter)
 {
-  return G_NODE (node)->children != NULL;
+  g_return_val_if_fail (tree_model != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), FALSE);
+  g_return_val_if_fail (iter != NULL, FALSE);
+  g_return_val_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->stamp, FALSE);
+
+  return G_NODE (iter->tree_node)->children != NULL;
 }
 
 static gint
-gtk_tree_store_node_n_children (GtkTreeModel *tree_model,
-                               GtkTreeNode   node)
+gtk_tree_store_iter_n_children (GtkTreeModel *tree_model,
+                               GtkTreeIter  *iter)
 {
+  GNode *node;
   gint i = 0;
 
-  node = (GtkTreeNode) G_NODE (node)->children;
-  while (node != NULL)
+  g_return_val_if_fail (tree_model != NULL, 0);
+  g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), 0);
+  g_return_val_if_fail (iter != NULL, 0);
+  g_return_val_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->stamp, 0);
+
+  node = G_NODE (iter->tree_node)->children;
+  while (node)
     {
       i++;
-      node = (GtkTreeNode) G_NODE (node)->next;
+      node = node->next;
     }
 
   return i;
 }
 
-static GtkTreeNode
-gtk_tree_store_node_nth_child (GtkTreeModel *tree_model,
-                              GtkTreeNode   node,
+static gboolean
+gtk_tree_store_iter_nth_child (GtkTreeModel *tree_model,
+                              GtkTreeIter  *iter,
+                              GtkTreeIter  *parent,
                               gint          n)
 {
-  g_return_val_if_fail (node != NULL, NULL);
+  GNode *parent_node;
 
-  return (GtkTreeNode) g_node_nth_child (G_NODE (node), n);
-}
+  g_return_val_if_fail (tree_model != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), FALSE);
+  g_return_val_if_fail (iter != NULL, FALSE);
+  if (parent)
+    g_return_val_if_fail (parent->stamp == GTK_TREE_STORE (tree_model)->stamp, FALSE);
 
-static GtkTreeNode
-gtk_tree_store_node_parent (GtkTreeModel *tree_model,
-                           GtkTreeNode   node)
-{
-  return (GtkTreeNode) G_NODE (node)->parent;
+  if (parent == NULL)
+    parent_node = GTK_TREE_STORE (tree_model)->root;
+  else
+    parent_node = parent->tree_node;
+
+  iter->tree_node = g_node_nth_child (parent_node, n);
+
+  if (iter->tree_node == NULL)
+    iter->stamp = 0;
+  else
+    iter->stamp = GTK_TREE_STORE (tree_model)->stamp;
+
+  return (iter->tree_node != NULL);
 }
 
-/* Public accessors */
-GtkTreeNode
-gtk_tree_store_node_new (void)
+static gboolean
+gtk_tree_store_iter_parent (GtkTreeModel *tree_model,
+                           GtkTreeIter  *iter,
+                           GtkTreeIter  *child)
 {
-  GtkTreeNode retval;
+  iter->stamp = GTK_TREE_STORE (tree_model)->stamp;
+  iter->tree_node = G_NODE (child->tree_node)->parent;
 
-  retval = (GtkTreeNode) g_node_new (NULL);
-  return retval;
+  if (iter->tree_node == GTK_TREE_STORE (tree_model)->root)
+    {
+      iter->stamp = 0;
+      return FALSE;
+    }
+
+  return TRUE;
 }
 
 /*
@@ -424,8 +452,8 @@ gtk_tree_store_node_new (void)
  * manipulations on it's own.
  */
 void
-gtk_tree_store_node_set_cell (GtkTreeStore *tree_store,
-                             GtkTreeNode   node,
+gtk_tree_store_iter_set_cell (GtkTreeStore *tree_store,
+                             GtkTreeIter  *iter,
                              gint          column,
                              GValue       *value)
 {
@@ -434,10 +462,9 @@ gtk_tree_store_node_set_cell (GtkTreeStore *tree_store,
 
   g_return_if_fail (tree_store != NULL);
   g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
-  g_return_if_fail (node != NULL);
   g_return_if_fail (column >= 0 && column < tree_store->n_columns);
 
-  prev = list = G_NODE (node)->data;
+  prev = list = G_NODE (iter->tree_node)->data;
 
   while (list != NULL)
     {
@@ -452,9 +479,9 @@ gtk_tree_store_node_set_cell (GtkTreeStore *tree_store,
       list = list->next;
     }
 
-  if (G_NODE (node)->data == NULL)
+  if (G_NODE (iter->tree_node)->data == NULL)
     {
-      G_NODE (node)->data = list = gtk_tree_data_list_alloc ();
+      G_NODE (iter->tree_node)->data = list = gtk_tree_data_list_alloc ();
       list->next = NULL;
     }
   else
@@ -474,239 +501,392 @@ gtk_tree_store_node_set_cell (GtkTreeStore *tree_store,
 }
 
 void
-gtk_tree_store_node_remove (GtkTreeStore *model,
-                           GtkTreeNode   node)
+gtk_tree_store_iter_setv (GtkTreeStore *tree_store,
+                         GtkTreeIter  *iter,
+                         va_list       var_args)
+{
+  gint column;
+
+  g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+
+  column = va_arg (var_args, gint);
+
+  while (column >= 0)
+    {
+      GValue value = { 0, };
+      gchar *error = NULL;
+
+      if (column >= tree_store->n_columns)
+       {
+         g_warning ("Invalid column number %d added to iter", column);
+         break;
+       }
+      g_value_init (&value, tree_store->column_headers[column]);
+
+      G_VALUE_COLLECT (&value, var_args, &error);
+      if (error)
+       {
+         g_warning ("%s: %s", G_STRLOC, error);
+         g_free (error);
+
+         /* we purposely leak the value here, it might not be
+          * in a sane state if an error condition occoured
+          */
+         break;
+       }
+
+      gtk_tree_store_iter_set_cell (tree_store,
+                                   iter,
+                                   column,
+                                   &value);
+
+      g_value_unset (&value);
+
+      column = va_arg (var_args, gint);
+    }
+}
+
+void
+gtk_tree_store_iter_set (GtkTreeStore *tree_store,
+                        GtkTreeIter  *iter,
+                        ...)
+{
+  va_list var_args;
+
+  g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+
+  va_start (var_args, iter);
+  gtk_tree_store_iter_setv (tree_store, iter, var_args);
+  va_end (var_args);
+}
+
+void
+gtk_tree_store_iter_getv (GtkTreeStore *tree_store,
+                         GtkTreeIter  *iter,
+                         va_list       var_args)
+{
+  gint column;
+
+  g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+
+  column = va_arg (var_args, gint);
+
+  while (column >= 0)
+    {
+      GValue value = { 0, };
+      gchar *error = NULL;
+
+      if (column >= tree_store->n_columns)
+       {
+         g_warning ("Invalid column number %d accessed", column);
+         break;
+       }
+
+      gtk_tree_store_iter_get_value (GTK_TREE_MODEL (tree_store), iter, column, &value);
+
+      G_VALUE_LCOPY (&value, var_args, &error);
+      if (error)
+       {
+         g_warning ("%s: %s", G_STRLOC, error);
+         g_free (error);
+
+         /* we purposely leak the value here, it might not be
+          * in a sane state if an error condition occoured
+          */
+         break;
+       }
+
+      g_value_unset (&value);
+
+      column = va_arg (var_args, gint);
+    }
+}
+
+void
+gtk_tree_store_iter_get (GtkTreeStore *tree_store,
+                        GtkTreeIter  *iter,
+                        ...)
+{
+  va_list var_args;
+
+  g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+
+  va_start (var_args, iter);
+  gtk_tree_store_iter_getv (tree_store, iter, var_args);
+  va_end (var_args);
+}
+
+void
+gtk_tree_store_iter_remove (GtkTreeStore *model,
+                           GtkTreeIter  *iter)
 {
   GtkTreePath *path;
   GNode *parent;
 
   g_return_if_fail (model != NULL);
   g_return_if_fail (GTK_IS_TREE_STORE (model));
-  g_return_if_fail (node != NULL);
-  /* FIXME: if node is NULL, do I want to free the tree? */
 
-  parent = G_NODE (node)->parent;
+  parent = G_NODE (iter->tree_node)->parent;
 
-  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), node);
-  g_node_destroy (G_NODE (node));
+  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), iter);
+  g_node_destroy (G_NODE (iter->tree_node));
   gtk_signal_emit_by_name (GTK_OBJECT (model),
-                          "node_deleted",
+                          "deleted",
                           path);
   if (parent != G_NODE (model->root) && parent->children == NULL)
     {
       gtk_tree_path_up (path);
       gtk_signal_emit_by_name (GTK_OBJECT (model),
-                              "node_child_toggled",
+                              "child_toggled",
                               path,
                               parent);
     }
   gtk_tree_path_free (path);
 }
 
-GtkTreeNode
-gtk_tree_store_node_insert (GtkTreeStore *model,
-                           GtkTreeNode   parent,
-                           gint          position,
-                           GtkTreeNode   node)
+void
+gtk_tree_store_iter_insert (GtkTreeStore *model,
+                           GtkTreeIter  *iter,
+                           GtkTreeIter  *parent,
+                           gint          position)
 {
   GtkTreePath *path;
 
-  g_return_val_if_fail (model != NULL, node);
-  g_return_val_if_fail (GTK_IS_TREE_STORE (model), node);
-  g_return_val_if_fail (node != NULL, node);
-
-  if (parent == NULL)
-    parent = model->root;
+  g_return_if_fail (model != NULL);
+  g_return_if_fail (GTK_IS_TREE_STORE (model));
 
-  g_node_insert (G_NODE (parent), position, G_NODE (node));
+  if (parent->tree_node == NULL)
+    parent->tree_node = model->root;
 
-  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), node);
+  iter->stamp = model->stamp;
+  iter->tree_node = g_node_new (NULL);
+  g_node_insert (G_NODE (parent->tree_node), position, G_NODE (iter->tree_node));
+  
+  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), iter);
   gtk_signal_emit_by_name (GTK_OBJECT (model),
-                          "node_inserted",
-                          path, node);
+                          "inserted",
+                          path, iter);
   gtk_tree_path_free (path);
-
-  return node;
 }
 
-GtkTreeNode
-gtk_tree_store_node_insert_before (GtkTreeStore *model,
-                                  GtkTreeNode   parent,
-                                  GtkTreeNode   sibling,
-                                  GtkTreeNode   node)
+void
+gtk_tree_store_iter_insert_before (GtkTreeStore *model,
+                                  GtkTreeIter  *iter,
+                                  GtkTreeIter  *parent,
+                                  GtkTreeIter  *sibling)
 {
   GtkTreePath *path;
+  GNode *parent_node = NULL;
 
-  g_return_val_if_fail (model != NULL, node);
-  g_return_val_if_fail (GTK_IS_TREE_STORE (model), node);
-  g_return_val_if_fail (node != NULL, node);
+  g_return_if_fail (model != NULL);
+  g_return_if_fail (GTK_IS_TREE_STORE (model));
+  g_return_if_fail (iter != NULL);
+  if (parent != NULL)
+    g_return_if_fail (parent->stamp == model->stamp);
+  if (sibling != NULL)
+    g_return_if_fail (sibling->stamp == model->stamp);
 
-  if (parent == NULL && sibling == NULL)
-    parent = model->root;
+  iter->stamp = model->stamp;
+  iter->tree_node = g_node_new (NULL);
 
-  if (parent == NULL)
-    parent = (GtkTreeNode) G_NODE (sibling)->parent;
+  if (parent == NULL && sibling == NULL)
+    parent_node = model->root;
+  else if (parent == NULL)
+    parent_node = G_NODE (sibling->tree_node)->parent;
+  else
+    parent_node = G_NODE (parent->tree_node);
 
-  g_node_insert_before (G_NODE (parent), G_NODE (sibling), G_NODE (node));
+  g_node_insert_before (parent_node,
+                       sibling ? G_NODE (sibling->tree_node) : NULL,
+                       G_NODE (iter->tree_node));
 
-  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), node);
+  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), iter);
   gtk_signal_emit_by_name (GTK_OBJECT (model),
-                          "node_inserted",
-                          path, node);
+                          "inserted",
+                          path, iter);
   gtk_tree_path_free (path);
-
-  return node;
 }
 
-GtkTreeNode
-gtk_tree_store_node_insert_after (GtkTreeStore *model,
-                                 GtkTreeNode   parent,
-                                 GtkTreeNode   sibling,
-                                 GtkTreeNode   node)
+void
+gtk_tree_store_iter_insert_after (GtkTreeStore *model,
+                                 GtkTreeIter  *iter,
+                                 GtkTreeIter  *parent,
+                                 GtkTreeIter  *sibling)
 {
   GtkTreePath *path;
+  GNode *parent_node;
 
-  g_return_val_if_fail (model != NULL, node);
-  g_return_val_if_fail (GTK_IS_TREE_STORE (model), node);
-  g_return_val_if_fail (node != NULL, node);
+  g_return_if_fail (model != NULL);
+  g_return_if_fail (GTK_IS_TREE_STORE (model));
+  g_return_if_fail (iter != NULL);
+  if (parent != NULL)
+    g_return_if_fail (parent->stamp == model->stamp);
+  if (sibling != NULL)
+    g_return_if_fail (sibling->stamp == model->stamp);
 
-  if (parent == NULL && sibling == NULL)
-    parent = model->root;
+  iter->stamp = model->stamp;
+  iter->tree_node = g_node_new (NULL);
 
-  if (parent == NULL)
-    parent = (GtkTreeNode) G_NODE (sibling)->parent;
+  if (parent == NULL && sibling == NULL)
+    parent_node = model->root;
+  else if (parent == NULL)
+    parent_node = G_NODE (sibling->tree_node)->parent;
+  else
+    parent_node = G_NODE (parent->tree_node);
 
-  g_node_insert_after (G_NODE (parent), G_NODE (sibling), G_NODE (node));
+  g_node_insert_after (parent_node,
+                      sibling ? G_NODE (sibling->tree_node) : NULL,
+                      G_NODE (iter->tree_node));
 
-  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), node);
+  path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), iter);
   gtk_signal_emit_by_name (GTK_OBJECT (model),
-                          "node_inserted",
-                          path, node);
+                          "inserted",
+                          path, iter);
   gtk_tree_path_free (path);
-  return node;
 }
 
-GtkTreeNode
-gtk_tree_store_node_prepend (GtkTreeStore *model,
-                            GtkTreeNode   parent,
-                            GtkTreeNode   node)
+void
+gtk_tree_store_iter_prepend (GtkTreeStore *model,
+                            GtkTreeIter  *iter,
+                            GtkTreeIter  *parent)
 {
-  g_return_val_if_fail (model != NULL, node);
-  g_return_val_if_fail (GTK_IS_TREE_STORE (model), node);
-  g_return_val_if_fail (node != NULL, node);
+  GNode *parent_node;
+
+  g_return_if_fail (model != NULL);
+  g_return_if_fail (GTK_IS_TREE_STORE (model));
+  g_return_if_fail (iter != NULL);
+  if (parent != NULL)
+    g_return_if_fail (parent->stamp == model->stamp);
 
   if (parent == NULL)
-    parent = model->root;
+    parent_node = model->root;
+  else
+    parent_node = parent->tree_node;
 
-  if (G_NODE (parent)->children == NULL)
+  iter->stamp = model->stamp;
+  iter->tree_node = g_node_new (NULL);
+
+  if (parent_node->children == NULL)
     {
       GtkTreePath *path;
-      g_node_prepend (G_NODE (parent), G_NODE (node));
-      if (parent != model->root)
+
+      g_node_prepend (parent_node, G_NODE (iter->tree_node));
+
+      if (parent_node != model->root)
        {
          path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), parent);
          gtk_signal_emit_by_name (GTK_OBJECT (model),
-                                  "node_child_toggled",
+                                  "child_toggled",
                                   path,
                                   parent);
-         gtk_tree_path_append_index (path, 1);
+         gtk_tree_path_append_index (path, 0);
        }
       else
        {
-         path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), G_NODE (parent)->children);
+         path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), iter);
        }
       gtk_signal_emit_by_name (GTK_OBJECT (model),
-                              "node_inserted",
+                              "inserted",
                               path,
-                              G_NODE (parent)->children);
+                              iter);
       gtk_tree_path_free (path);
     }
   else
     {
-      gtk_tree_store_node_insert_after (model,
-                                        parent == model->root?NULL:parent,
-                                        NULL,
-                                        node);
+      gtk_tree_store_iter_insert_after (model, iter, parent, NULL);
     }
-  return node;
 }
 
-GtkTreeNode
-gtk_tree_store_node_append (GtkTreeStore *model,
-                           GtkTreeNode   parent,
-                           GtkTreeNode   node)
+void
+gtk_tree_store_iter_append (GtkTreeStore *model,
+                           GtkTreeIter  *iter,
+                           GtkTreeIter  *parent)
 {
-  g_return_val_if_fail (model != NULL, node);
-  g_return_val_if_fail (GTK_IS_TREE_STORE (model), node);
-  g_return_val_if_fail (node != NULL, node);
+  GNode *parent_node;
+
+  g_return_if_fail (model != NULL);
+  g_return_if_fail (GTK_IS_TREE_STORE (model));
+  g_return_if_fail (iter != NULL);
+  if (parent != NULL)
+    g_return_if_fail (parent->stamp == model->stamp);
 
   if (parent == NULL)
-    parent = model->root;
+    parent_node = model->root;
+  else
+    parent_node = parent->tree_node;
 
-  if (G_NODE (parent)->children == NULL)
+  iter->stamp = model->stamp;
+  iter->tree_node = g_node_new (NULL);
+
+  if (parent_node->children == NULL)
     {
       GtkTreePath *path;
-      g_node_append (G_NODE (parent), G_NODE (node));
-      if (parent != model->root)
+
+      g_node_append (parent_node, G_NODE (iter->tree_node));
+
+      if (parent_node != model->root)
        {
          path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), parent);
          gtk_signal_emit_by_name (GTK_OBJECT (model),
-                                  "node_child_toggled",
+                                  "child_toggled",
                                   path,
                                   parent);
-         gtk_tree_path_append_index (path, 1);
+         gtk_tree_path_append_index (path, 0);
        }
       else
        {
-         path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), G_NODE (parent)->children);
+         path = gtk_tree_store_get_path (GTK_TREE_MODEL (model), iter);
        }
       gtk_signal_emit_by_name (GTK_OBJECT (model),
-                              "node_inserted",
+                              "inserted",
                               path,
-                              G_NODE (parent)->children);
+                              iter);
       gtk_tree_path_free (path);
     }
   else
     {
-      gtk_tree_store_node_insert_before (model,
-                                        parent == model->root?NULL:parent,
-                                        NULL,
-                                        node);
+      gtk_tree_store_iter_insert_before (model, iter, parent, NULL);
     }
-  return node;
 }
 
-GtkTreeNode
-gtk_tree_store_node_get_root (GtkTreeStore *model)
+void
+gtk_tree_store_get_root (GtkTreeStore *model,
+                        GtkTreeIter  *iter)
 {
-  g_return_val_if_fail (model != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_TREE_STORE (model), NULL);
+  g_return_if_fail (model != NULL);
+  g_return_if_fail (GTK_IS_TREE_STORE (model));
+  g_return_if_fail (iter != NULL);
 
-  return (GtkTreeNode) model->root;
+  iter->stamp = model->stamp;
+  iter->tree_node = G_NODE (model->root)->children;
 }
 
 
 gboolean
-gtk_tree_store_node_is_ancestor (GtkTreeStore *model,
-                                GtkTreeNode   node,
-                                GtkTreeNode   descendant)
+gtk_tree_store_iter_is_ancestor (GtkTreeStore *model,
+                                GtkTreeIter  *iter,
+                                GtkTreeIter  *descendant)
 {
   g_return_val_if_fail (model != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_TREE_STORE (model), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  g_return_val_if_fail (iter != NULL, FALSE);
   g_return_val_if_fail (descendant != NULL, FALSE);
+  g_return_val_if_fail (iter->stamp == model->stamp, FALSE);
+  g_return_val_if_fail (descendant->stamp == model->stamp, FALSE);
 
-  return g_node_is_ancestor (G_NODE (node), G_NODE (descendant));
+  return g_node_is_ancestor (G_NODE (iter->tree_node),
+                            G_NODE (descendant->tree_node));
 }
 
 
 gint
-gtk_tree_store_node_depth (GtkTreeStore *model,
-                          GtkTreeNode   node)
+gtk_tree_store_iter_depth (GtkTreeStore *model,
+                          GtkTreeIter  *iter)
 {
   g_return_val_if_fail (model != NULL, 0);
   g_return_val_if_fail (GTK_IS_TREE_STORE (model), 0);
-  g_return_val_if_fail (node != NULL, 0);
+  g_return_val_if_fail (iter != NULL, 0);
+  g_return_val_if_fail (iter->stamp == model->stamp, 0);
 
-  return g_node_depth (G_NODE (node));
+  return g_node_depth (G_NODE (iter->tree_node)) - 1;
 }
index ba4265289bcd936495627d46b3b68b683714d005..3f65aafbff369809e64fddeec4c655af5b9957ae 100644 (file)
@@ -21,6 +21,7 @@
 #define __GTK_TREE_STORE_H__
 
 #include <gtk/gtktreemodel.h>
+#include <stdarg.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -38,7 +39,9 @@ typedef struct _GtkTreeStoreClass  GtkTreeStoreClass;
 struct _GtkTreeStore
 {
   GtkObject parent;
-  GtkTreeNode root;
+
+  gint stamp;
+  gpointer root;
   gint n_columns;
   GType *column_headers;
 };
@@ -49,62 +52,72 @@ struct _GtkTreeStoreClass
 
   /* signals */
   /* Will be moved into the GtkTreeModelIface eventually */
-  void       (* node_changed)         (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_inserted)        (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_child_toggled)   (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path,
-                                      GtkTreeNode   node);
-  void       (* node_deleted)         (GtkTreeModel *tree_model,
-                                      GtkTreePath  *path);
+  void       (* changed)         (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path,
+                                 GtkTreeIter  *iter);
+  void       (* inserted)        (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path,
+                                 GtkTreeIter  *iter);
+  void       (* child_toggled)   (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path,
+                                 GtkTreeIter  *iter);
+  void       (* deleted)         (GtkTreeModel *tree_model,
+                                 GtkTreePath  *path);
 };
 
 
-GtkType      gtk_tree_store_get_type           (void);
-GtkObject   *gtk_tree_store_new                (void);
-GtkObject   *gtk_tree_store_new_with_values    (gint          n_columns,
-                                               ...);
-void         gtk_tree_store_set_n_columns      (GtkTreeStore *tree_store,
-                                               gint          n_columns);
-void         gtk_tree_store_set_column_type    (GtkTreeStore *store,
-                                               gint          column,
-                                               GType         type);
-
-GtkTreeNode  gtk_tree_store_node_new           (void);
-void         gtk_tree_store_node_set_cell      (GtkTreeStore *tree_store,
-                                               GtkTreeNode   node,
-                                               gint          column,
-                                               GValue       *value);
-void         gtk_tree_store_node_remove        (GtkTreeStore *tree_store,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_tree_store_node_insert        (GtkTreeStore *tree_store,
-                                               GtkTreeNode   parent,
-                                               gint          position,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_tree_store_node_insert_before (GtkTreeStore *tree_store,
-                                               GtkTreeNode   parent,
-                                               GtkTreeNode   sibling,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_tree_store_node_insert_after  (GtkTreeStore *tree_store,
-                                               GtkTreeNode   parent,
-                                               GtkTreeNode   sibling,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_tree_store_node_prepend       (GtkTreeStore *tree_store,
-                                               GtkTreeNode   parent,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_tree_store_node_append        (GtkTreeStore *tree_store,
-                                               GtkTreeNode   parent,
-                                               GtkTreeNode   node);
-GtkTreeNode  gtk_tree_store_node_get_root      (GtkTreeStore *tree_store);
-gboolean     gtk_tree_store_node_is_ancestor   (GtkTreeStore *tree_store,
-                                               GtkTreeNode   node,
-                                               GtkTreeNode   descendant);
-gint         gtk_tree_store_node_depth         (GtkTreeStore *tree_store,
-                                               GtkTreeNode   node);
-
+GtkType       gtk_tree_store_get_type           (void);
+GtkTreeStore *gtk_tree_store_new                (void);
+GtkTreeStore *gtk_tree_store_new_with_values    (gint          n_columns,
+                                                ...);
+void          gtk_tree_store_set_n_columns      (GtkTreeStore *tree_store,
+                                                gint          n_columns);
+void          gtk_tree_store_set_column_type    (GtkTreeStore *store,
+                                                gint          column,
+                                                GType         type);
+void          gtk_tree_store_iter_set_cell      (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                gint          column,
+                                                GValue       *value);
+void          gtk_tree_store_iter_set           (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                ...);
+void          gtk_tree_store_iter_setv          (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                va_list       var_args);
+void          gtk_tree_store_iter_get           (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                ...);
+void          gtk_tree_store_iter_getv          (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                va_list       var_args);
+void          gtk_tree_store_iter_remove        (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter);
+void          gtk_tree_store_iter_insert        (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                GtkTreeIter  *parent,
+                                                gint          position);
+void          gtk_tree_store_iter_insert_before (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                GtkTreeIter  *parent,
+                                                GtkTreeIter  *sibling);
+void          gtk_tree_store_iter_insert_after  (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                GtkTreeIter  *parent,
+                                                GtkTreeIter  *sibling);
+void          gtk_tree_store_iter_prepend       (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                GtkTreeIter  *parent);
+void          gtk_tree_store_iter_append        (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                GtkTreeIter  *parent);
+void          gtk_tree_store_get_root           (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter);
+gboolean      gtk_tree_store_iter_is_ancestor   (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter,
+                                                GtkTreeIter  *descendant);
+gint          gtk_tree_store_iter_depth         (GtkTreeStore *tree_store,
+                                                GtkTreeIter  *iter);
 
 
 #ifdef __cplusplus
index e951107833dab169c5b863f7da756e7e26c72f35..26afe3899c4db6c0eab8a6f78c5782482924f4b0 100644 (file)
@@ -95,19 +95,19 @@ static void     gtk_tree_view_forall               (GtkContainer     *container,
 static void     gtk_tree_view_set_adjustments      (GtkTreeView      *tree_view,
                                                    GtkAdjustment    *hadj,
                                                    GtkAdjustment    *vadj);
-static void     gtk_tree_view_node_changed         (GtkTreeModel     *model,
+static void     gtk_tree_view_changed              (GtkTreeModel     *model,
                                                    GtkTreePath      *path,
-                                                   GtkTreeNode       tree_node,
+                                                   GtkTreeIter      *iter,
                                                    gpointer          data);
-static void     gtk_tree_view_node_inserted        (GtkTreeModel     *model,
+static void     gtk_tree_view_inserted             (GtkTreeModel     *model,
                                                    GtkTreePath      *path,
-                                                   GtkTreeNode       tree_node,
+                                                   GtkTreeIter      *iter,
                                                    gpointer          data);
-static void     gtk_tree_view_node_child_toggled   (GtkTreeModel     *model,
+static void     gtk_tree_view_child_toggled        (GtkTreeModel     *model,
                                                    GtkTreePath      *path,
-                                                   GtkTreeNode       tree_node,
+                                                   GtkTreeIter      *iter,
                                                    gpointer          data);
-static void     gtk_tree_view_node_deleted         (GtkTreeModel     *model,
+static void     gtk_tree_view_deleted              (GtkTreeModel     *model,
                                                    GtkTreePath      *path,
                                                    gpointer          data);
 
@@ -122,27 +122,27 @@ static gint     gtk_tree_view_new_column_width     (GtkTreeView      *tree_view,
                                                    gint             *x);
 static void     gtk_tree_view_adjustment_changed   (GtkAdjustment    *adjustment,
                                                    GtkTreeView      *tree_view);
-static gint     gtk_tree_view_insert_node_height   (GtkTreeView      *tree_view,
+static gint     gtk_tree_view_insert_iter_height   (GtkTreeView      *tree_view,
                                                    GtkRBTree        *tree,
-                                                   GtkTreeNode       node,
+                                                   GtkTreeIter      *iter,
                                                    gint              depth);
 static void     gtk_tree_view_build_tree           (GtkTreeView      *tree_view,
                                                    GtkRBTree        *tree,
-                                                   GtkTreeNode       node,
+                                                   GtkTreeIter      *iter,
                                                    gint              depth,
                                                    gboolean          recurse,
                                                    gboolean          calc_bounds);
 static void     gtk_tree_view_calc_size            (GtkTreeView      *priv,
                                                    GtkRBTree        *tree,
-                                                   GtkTreeNode       node,
+                                                   GtkTreeIter      *iter,
                                                    gint              depth);
-static gboolean gtk_tree_view_discover_dirty_node  (GtkTreeView      *tree_view,
-                                                   GtkTreeNode       node,
+static gboolean gtk_tree_view_discover_dirty_iter  (GtkTreeView      *tree_view,
+                                                   GtkTreeIter      *iter,
                                                    gint              depth,
                                                    gint             *height);
 static void     gtk_tree_view_discover_dirty       (GtkTreeView      *tree_view,
                                                    GtkRBTree        *tree,
-                                                   GtkTreeNode       node,
+                                                   GtkTreeIter      *iter,
                                                    gint              depth);
 static void     gtk_tree_view_check_dirty          (GtkTreeView      *tree_view);
 static void     gtk_tree_view_create_button        (GtkTreeView      *tree_view,
@@ -205,7 +205,6 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
   widget_class->size_allocate = gtk_tree_view_size_allocate;
   widget_class->draw = gtk_tree_view_draw;
   widget_class->expose_event = gtk_tree_view_expose;
-  //  widget_class->key_press_event = gtk_tree_view_key_press;
   widget_class->motion_notify_event = gtk_tree_view_motion;
   widget_class->enter_notify_event = gtk_tree_view_enter_notify;
   widget_class->leave_notify_event = gtk_tree_view_leave_notify;
@@ -686,7 +685,7 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
   GtkRBNode *node, *last_node = NULL;
   GtkRBNode *cursor = NULL;
   GtkRBTree *cursor_tree = NULL, *last_tree = NULL;
-  GtkTreeNode tree_node;
+  GtkTreeIter iter;
   GtkCellRenderer *cell;
   gint new_y;
   gint y_offset, x_offset, cell_offset;
@@ -726,7 +725,9 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
   path = _gtk_tree_view_find_path ((GtkTreeView *)widget,
                                   tree,
                                   node);
-  tree_node = gtk_tree_model_get_node (tree_view->priv->model, path);
+  gtk_tree_model_get_iter (tree_view->priv->model,
+                          &iter,
+                          path);
   depth = gtk_tree_path_get_depth (path);
   gtk_tree_path_free (path);
 
@@ -786,7 +787,7 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
          cell = column->cell;
          gtk_tree_view_column_set_cell_data (column,
                                              tree_view->priv->model,
-                                             tree_node);
+                                             &iter);
 
          background_area.x = cell_offset;
          background_area.width = TREE_VIEW_COLUMN_SIZE (column);
@@ -833,16 +834,21 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
       y_offset += max_height;
       if (node->children)
        {
+         GtkTreeIter parent = iter;
+         gboolean has_child;
+
          tree = node->children;
          node = tree->root;
          while (node->left != tree->nil)
            node = node->left;
-         tree_node = gtk_tree_model_node_children (tree_view->priv->model, tree_node);
+         has_child = gtk_tree_model_iter_children (tree_view->priv->model,
+                                                   &iter,
+                                                   &parent);
          cell = gtk_tree_view_get_column (tree_view, 0)->cell;
          depth++;
 
          /* Sanity Check! */
-         TREE_VIEW_INTERNAL_ASSERT (tree_node != NULL, FALSE);
+         TREE_VIEW_INTERNAL_ASSERT (has_child, FALSE);
        }
       else
        {
@@ -852,26 +858,31 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
              node = _gtk_rbtree_next (tree, node);
              if (node != NULL)
                {
-                 gtk_tree_model_node_next (tree_view->priv->model, &tree_node);
+                 gboolean has_next = gtk_tree_model_iter_next (tree_view->priv->model, &iter);
                  cell = gtk_tree_view_get_column (tree_view, 0)->cell;
                  done = TRUE;
 
                  /* Sanity Check! */
-                 TREE_VIEW_INTERNAL_ASSERT (tree_node != NULL, FALSE);
+                 TREE_VIEW_INTERNAL_ASSERT (has_next, FALSE);
                }
              else
                {
+                 GtkTreeIter parent_iter = iter;
+                 gboolean has_parent;
+
                  node = tree->parent_node;
                  tree = tree->parent_tree;
                  if (tree == NULL)
-                   /* we've run out of tree.  It's okay though, as we'd only break
-                    * out of the while loop below. */
+                   /* we've run out of tree.  It's okay to return though, as
+                    * we'd only break out of the while loop below. */
                    return TRUE;
-                 tree_node = gtk_tree_model_node_parent (tree_view->priv->model, tree_node);
+                 has_parent = gtk_tree_model_iter_parent (tree_view->priv->model,
+                                                          &iter,
+                                                          &parent_iter);
                  depth--;
 
                  /* Sanity check */
-                 TREE_VIEW_INTERNAL_ASSERT (tree_node != NULL, FALSE);
+                 TREE_VIEW_INTERNAL_ASSERT (has_parent, FALSE);
                }
            }
          while (!done);
@@ -1151,7 +1162,7 @@ gtk_tree_view_button_press (GtkWidget      *widget,
        {
          GtkTreeViewColumn *column = list->data;
          GtkCellRenderer *cell;
-         GtkTreeNode tree_node;
+         GtkTreeIter iter;
 
          if (!column->visible)
            continue;
@@ -1179,11 +1190,12 @@ gtk_tree_view_button_press (GtkWidget      *widget,
              continue;
            }
 
-         tree_node = gtk_tree_model_get_node (tree_view->priv->model,
-                                              path);
+         gtk_tree_model_get_iter (tree_view->priv->model,
+                                  &iter,
+                                  path);
          gtk_tree_view_column_set_cell_data (column,
                                              tree_view->priv->model,
-                                             tree_node);
+                                             &iter);
 
          path_string = gtk_tree_path_to_string (path);
          if (gtk_cell_renderer_event (cell,
@@ -1298,23 +1310,24 @@ gtk_tree_view_button_release (GtkWidget      *widget,
       if (tree_view->priv->button_pressed_node == tree_view->priv->prelight_node && GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT))
        {
          GtkTreePath *path;
-         GtkTreeNode tree_node;
+         GtkTreeIter iter;
 
          /* Actually activate the node */
          if (tree_view->priv->button_pressed_node->children == NULL)
            {
+             GtkTreeIter child;
              path = _gtk_tree_view_find_path (GTK_TREE_VIEW (widget),
                                               tree_view->priv->button_pressed_tree,
                                               tree_view->priv->button_pressed_node);
              tree_view->priv->button_pressed_node->children = _gtk_rbtree_new ();
              tree_view->priv->button_pressed_node->children->parent_tree = tree_view->priv->button_pressed_tree;
              tree_view->priv->button_pressed_node->children->parent_node = tree_view->priv->button_pressed_node;
-             tree_node = gtk_tree_model_get_node (tree_view->priv->model, path);
-             tree_node = gtk_tree_model_node_children (tree_view->priv->model, tree_node);
+             gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
+             gtk_tree_model_iter_children (tree_view->priv->model, &child, &iter);
 
              gtk_tree_view_build_tree (tree_view,
                                        tree_view->priv->button_pressed_node->children,
-                                       tree_node,
+                                       &child,
                                        gtk_tree_path_get_depth (path) + 1,
                                        FALSE,
                                        GTK_WIDGET_REALIZED (widget));
@@ -1324,11 +1337,13 @@ gtk_tree_view_button_release (GtkWidget      *widget,
              path = _gtk_tree_view_find_path (GTK_TREE_VIEW (widget),
                                               tree_view->priv->button_pressed_node->children,
                                               tree_view->priv->button_pressed_node->children->root);
-             tree_node = gtk_tree_model_get_node (tree_view->priv->model, path);
+             gtk_tree_model_get_iter (tree_view->priv->model,
+                                      &iter,
+                                      path);
 
              gtk_tree_view_discover_dirty (GTK_TREE_VIEW (widget),
                                            tree_view->priv->button_pressed_node->children,
-                                           tree_node,
+                                           &iter,
                                            gtk_tree_path_get_depth (path));
              _gtk_rbtree_remove (tree_view->priv->button_pressed_node->children);
            }
@@ -1891,10 +1906,10 @@ gtk_tree_view_forall (GtkContainer *container,
  */
 
 static void
-gtk_tree_view_node_changed (GtkTreeModel *model,
-                           GtkTreePath  *path,
-                           GtkTreeNode   tree_node,
-                           gpointer      data)
+gtk_tree_view_changed (GtkTreeModel *model,
+                      GtkTreePath  *path,
+                      GtkTreeIter  *iter,
+                      gpointer      data)
 {
   GtkTreeView *tree_view = (GtkTreeView *)data;
   GtkRBTree *tree;
@@ -1905,9 +1920,9 @@ gtk_tree_view_node_changed (GtkTreeModel *model,
   g_return_if_fail (path != NULL || node != NULL);
 
   if (path == NULL)
-    path = gtk_tree_model_get_path (model, tree_node);
-  else if (tree_node == NULL)
-    tree_node = gtk_tree_model_get_node (model, path);
+    path = gtk_tree_model_get_path (model, iter);
+  else if (iter == NULL)
+    gtk_tree_model_get_iter (model, iter, path);
 
   if (_gtk_tree_view_find_node (tree_view,
                                path,
@@ -1916,8 +1931,8 @@ gtk_tree_view_node_changed (GtkTreeModel *model,
     /* We aren't actually showing the node */
     return;
 
-  dirty_marked = gtk_tree_view_discover_dirty_node (tree_view,
-                                                   tree_node,
+  dirty_marked = gtk_tree_view_discover_dirty_iter (tree_view,
+                                                   iter,
                                                    gtk_tree_path_get_depth (path),
                                                    &height);
 
@@ -1937,10 +1952,10 @@ gtk_tree_view_node_changed (GtkTreeModel *model,
 }
 
 static void
-gtk_tree_view_node_inserted (GtkTreeModel *model,
-                            GtkTreePath  *path,
-                            GtkTreeNode   tree_node,
-                            gpointer      data)
+gtk_tree_view_inserted (GtkTreeModel *model,
+                       GtkTreePath  *path,
+                       GtkTreeIter  *iter,
+                       gpointer      data)
 {
   GtkTreeView *tree_view = (GtkTreeView *) data;
   gint *indices;
@@ -1951,12 +1966,12 @@ gtk_tree_view_node_inserted (GtkTreeModel *model,
   gint i = 0;
 
   tmptree = tree = tree_view->priv->tree;
-  g_return_if_fail (path != NULL || tree_node != NULL);
+  g_return_if_fail (path != NULL || iter != NULL);
 
   if (path == NULL)
-    path = gtk_tree_model_get_path (model, tree_node);
-  else if (tree_node == NULL)
-    tree_node = gtk_tree_model_get_node (model, path);
+    path = gtk_tree_model_get_path (model, iter);
+  else if (iter == NULL)
+    gtk_tree_model_get_iter (model, iter, path);
 
   depth = gtk_tree_path_get_depth (path);
   indices = gtk_tree_path_get_indices (path);
@@ -1986,7 +2001,7 @@ gtk_tree_view_node_inserted (GtkTreeModel *model,
          GtkTreePath *tmppath = _gtk_tree_view_find_path (tree_view,
                                                           tree,
                                                           tmpnode);
-         gtk_tree_view_node_child_toggled (model, tmppath, NULL, data);
+         gtk_tree_view_child_toggled (model, tmppath, NULL, data);
          gtk_tree_path_free (tmppath);
          return;
        }
@@ -2022,9 +2037,9 @@ gtk_tree_view_node_inserted (GtkTreeModel *model,
        }
     }
 
-  max_height = gtk_tree_view_insert_node_height (tree_view,
+  max_height = gtk_tree_view_insert_iter_height (tree_view,
                                                 tree,
-                                                tree_node,
+                                                iter,
                                                 depth);
   if (indices[depth - 1] == 0)
     {
@@ -2041,22 +2056,26 @@ gtk_tree_view_node_inserted (GtkTreeModel *model,
 }
 
 static void
-gtk_tree_view_node_child_toggled (GtkTreeModel *model,
-                                 GtkTreePath  *path,
-                                 GtkTreeNode   tree_node,
-                                 gpointer      data)
+gtk_tree_view_child_toggled (GtkTreeModel *model,
+                            GtkTreePath  *path,
+                            GtkTreeIter  *iter,
+                            gpointer      data)
 {
   GtkTreeView *tree_view = (GtkTreeView *)data;
+  GtkTreeIter real_iter;
   gboolean has_child;
   GtkRBTree *tree;
   GtkRBNode *node;
 
   g_return_if_fail (path != NULL || node != NULL);
 
+  if (iter)
+    real_iter = *iter;
+
   if (path == NULL)
-    path = gtk_tree_model_get_path (model, tree_node);
-  else if (tree_node == NULL)
-    tree_node = gtk_tree_model_get_node (model, path);
+    path = gtk_tree_model_get_path (model, iter);
+  else if (iter == NULL)
+    gtk_tree_model_get_iter (model, &real_iter, path);
 
   if (_gtk_tree_view_find_node (tree_view,
                                path,
@@ -2065,7 +2084,7 @@ gtk_tree_view_node_child_toggled (GtkTreeModel *model,
     /* We aren't actually showing the node */
     return;
 
-  has_child = gtk_tree_model_node_has_child (model, tree_node);
+  has_child = gtk_tree_model_iter_has_child (model, &real_iter);
   /* Sanity check.
    */
   if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT) == has_child)
@@ -2099,9 +2118,9 @@ gtk_tree_view_node_child_toggled (GtkTreeModel *model,
 }
 
 static void
-gtk_tree_view_node_deleted (GtkTreeModel *model,
-                           GtkTreePath  *path,
-                           gpointer      data)
+gtk_tree_view_deleted (GtkTreeModel *model,
+                      GtkTreePath  *path,
+                      gpointer      data)
 {
   GtkTreeView *tree_view = (GtkTreeView *)data;
   GtkRBTree *tree;
@@ -2165,9 +2184,9 @@ gtk_tree_view_node_deleted (GtkTreeModel *model,
 
 /* Internal tree functions */
 static gint
-gtk_tree_view_insert_node_height (GtkTreeView *tree_view,
+gtk_tree_view_insert_iter_height (GtkTreeView *tree_view,
                                  GtkRBTree   *tree,
-                                 GtkTreeNode  node,
+                                 GtkTreeIter *iter,
                                  gint         depth)
 {
   GtkTreeViewColumn *column;
@@ -2191,7 +2210,7 @@ gtk_tree_view_insert_node_height (GtkTreeView *tree_view,
        }
 
       cell = column->cell;
-      gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, node);
+      gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, iter);
 
       gtk_cell_renderer_get_size (cell, GTK_WIDGET (tree_view), &width, &height);
       max_height = MAX (max_height, TREE_VIEW_VERTICAL_SEPERATOR + height);
@@ -2210,55 +2229,56 @@ gtk_tree_view_insert_node_height (GtkTreeView *tree_view,
 static void
 gtk_tree_view_build_tree (GtkTreeView *tree_view,
                          GtkRBTree   *tree,
-                         GtkTreeNode  node,
+                         GtkTreeIter *iter,
                          gint         depth,
                          gboolean     recurse,
                          gboolean     calc_bounds)
 {
   GtkRBNode *temp = NULL;
-  GtkTreeNode child;
   gint max_height;
 
-  if (!node)
+  if (gtk_tree_model_iter_invalid (tree_view->priv->model, iter))
     return;
+
   do
     {
       max_height = 0;
       if (calc_bounds)
-       max_height = gtk_tree_view_insert_node_height (tree_view,
+       max_height = gtk_tree_view_insert_iter_height (tree_view,
                                                       tree,
-                                                      node,
+                                                      iter,
                                                       depth);
       temp = _gtk_rbtree_insert_after (tree, temp, max_height);
       if (recurse)
        {
-         child = gtk_tree_model_node_children (tree_view->priv->model, node);
-         if (child != NULL)
+         GtkTreeIter child;
+
+         if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter));
            {
              temp->children = _gtk_rbtree_new ();
              temp->children->parent_tree = tree;
              temp->children->parent_node = temp;
-             gtk_tree_view_build_tree (tree_view, temp->children, child, depth + 1, recurse, calc_bounds);
+             gtk_tree_view_build_tree (tree_view, temp->children, &child, depth + 1, recurse, calc_bounds);
            }
        }
-      if (gtk_tree_model_node_has_child (tree_view->priv->model, node))
+      if (gtk_tree_model_iter_has_child (tree_view->priv->model, iter))
        {
          if ((temp->flags&GTK_RBNODE_IS_PARENT) != GTK_RBNODE_IS_PARENT)
            temp->flags ^= GTK_RBNODE_IS_PARENT;
          GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_IS_LIST);
        }
     }
-  while (gtk_tree_model_node_next (tree_view->priv->model, &node));
+  while (gtk_tree_model_iter_next (tree_view->priv->model, iter));
 }
 
 static void
 gtk_tree_view_calc_size (GtkTreeView *tree_view,
                         GtkRBTree   *tree,
-                        GtkTreeNode  node,
+                        GtkTreeIter *iter,
                         gint         depth)
 {
   GtkRBNode *temp = tree->root;
-  GtkTreeNode child;
+  GtkTreeIter child;
   GtkCellRenderer *cell;
   GList *list;
   GtkTreeViewColumn *column;
@@ -2266,8 +2286,9 @@ gtk_tree_view_calc_size (GtkTreeView *tree_view,
   gint i;
 
   /* FIXME: Make this function robust against internal inconsistencies! */
-  if (!node)
+  if (gtk_tree_model_iter_invalid (tree_view->priv->model, iter))
     return;
+
   TREE_VIEW_INTERNAL_ASSERT_VOID (tree != NULL);
 
   while (temp->left != tree->nil)
@@ -2285,7 +2306,7 @@ gtk_tree_view_calc_size (GtkTreeView *tree_view,
          if (!column->visible)
            continue;
 
-         gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, node);
+         gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, iter);
          cell = column->cell;
          gtk_cell_renderer_get_size (cell, GTK_WIDGET (tree_view), &width, &height);
          max_height = MAX (max_height, TREE_VIEW_VERTICAL_SEPERATOR + height);
@@ -2300,17 +2321,17 @@ gtk_tree_view_calc_size (GtkTreeView *tree_view,
            column->size = MAX (column->size, width);
        }
       _gtk_rbtree_node_set_height (tree, temp, max_height);
-      child = gtk_tree_model_node_children (tree_view->priv->model, node);
-      if (child != NULL && temp->children != NULL)
-       gtk_tree_view_calc_size (tree_view, temp->children, child, depth + 1);
+      if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter) &&
+         temp->children != NULL)
+       gtk_tree_view_calc_size (tree_view, temp->children, &child, depth + 1);
       temp = _gtk_rbtree_next (tree, temp);
     }
-  while (gtk_tree_model_node_next (tree_view->priv->model, &node));
+  while (gtk_tree_model_iter_next (tree_view->priv->model, iter));
 }
 
 static gboolean
-gtk_tree_view_discover_dirty_node (GtkTreeView *tree_view,
-                                  GtkTreeNode  node,
+gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
+                                  GtkTreeIter *iter,
                                   gint         depth,
                                   gint        *height)
 {
@@ -2321,7 +2342,6 @@ gtk_tree_view_discover_dirty_node (GtkTreeView *tree_view,
   gint retval = FALSE;
   gint tmpheight;
 
-  /* Do stuff with node */
   if (height)
     *height = 0;
 
@@ -2335,7 +2355,7 @@ gtk_tree_view_discover_dirty_node (GtkTreeView *tree_view,
        continue;
 
       cell = column->cell;
-      gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, node);
+      gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, iter);
 
       if (height)
        {
@@ -2370,18 +2390,20 @@ gtk_tree_view_discover_dirty_node (GtkTreeView *tree_view,
 static void
 gtk_tree_view_discover_dirty (GtkTreeView *tree_view,
                              GtkRBTree   *tree,
-                             GtkTreeNode  node,
+                             GtkTreeIter *iter,
                              gint         depth)
 {
   GtkRBNode *temp = tree->root;
   GtkTreeViewColumn *column;
   GList *list;
-  GtkTreeNode child;
+  GtkTreeIter child;
   gboolean is_all_dirty;
 
   /* FIXME: Make this function robust against internal inconsistencies! */
-  if (!node)
+  if (gtk_tree_model_iter_invalid (tree_view->priv->model,
+                                  iter))
     return;
+
   TREE_VIEW_INTERNAL_ASSERT_VOID (tree != NULL);
 
   while (temp->left != tree->nil)
@@ -2399,19 +2421,20 @@ gtk_tree_view_discover_dirty (GtkTreeView *tree_view,
              break;
            }
        }
+
       if (is_all_dirty)
        return;
 
-      gtk_tree_view_discover_dirty_node (tree_view,
-                                        node,
+      gtk_tree_view_discover_dirty_iter (tree_view,
+                                        iter,
                                         depth,
                                         FALSE);
-      child = gtk_tree_model_node_children (tree_view->priv->model, node);
-      if (child != NULL && temp->children != NULL)
-       gtk_tree_view_discover_dirty (tree_view, temp->children, child, depth + 1);
+      if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter) &&
+         temp->children != NULL)
+       gtk_tree_view_discover_dirty (tree_view, temp->children, &child, depth + 1);
       temp = _gtk_rbtree_next (tree, temp);
     }
-  while (gtk_tree_model_node_next (tree_view->priv->model, &node));
+  while (gtk_tree_model_iter_next (tree_view->priv->model, iter));
 }
 
 
@@ -2419,7 +2442,6 @@ static void
 gtk_tree_view_check_dirty (GtkTreeView *tree_view)
 {
   GtkTreePath *path;
-  GtkTreeNode tree_node;
   gboolean dirty = FALSE;
   GList *list;
   GtkTreeViewColumn *column;
@@ -2442,9 +2464,11 @@ gtk_tree_view_check_dirty (GtkTreeView *tree_view)
   path = gtk_tree_path_new_root ();
   if (path != NULL)
     {
-      tree_node = gtk_tree_model_get_node (tree_view->priv->model, path);
+      GtkTreeIter iter;
+
+      gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
       gtk_tree_path_free (path);
-      gtk_tree_view_calc_size (tree_view, tree_view->priv->tree, tree_node, 1);
+      gtk_tree_view_calc_size (tree_view, tree_view->priv->tree, &iter, 1);
       _gtk_tree_view_set_size (tree_view, -1, -1);
     }
 
@@ -2457,7 +2481,7 @@ gtk_tree_view_check_dirty (GtkTreeView *tree_view)
 
 static void
 gtk_tree_view_create_button (GtkTreeView *tree_view,
-                            gint       i)
+                            gint         i)
 {
   GtkWidget *button;
   GtkTreeViewColumn *column;
@@ -2565,7 +2589,8 @@ gtk_tree_view_button_clicked (GtkWidget *widget,
     if (GTK_TREE_VIEW_COLUMN (list->data)->button == widget)
       break;
 
-  //  gtk_signal_emit (GTK_OBJECT (clist), clist_signals[CLICK_COLUMN], i);
+  /* FIXME:
+   * gtk_signal_emit (GTK_OBJECT (clist), clist_signals[CLICK_COLUMN], i); */
 }
 
 /* Make sure the node is visible vertically */
@@ -2920,25 +2945,25 @@ static void
 gtk_tree_view_set_model_realized (GtkTreeView *tree_view)
 {
   GtkTreePath *path;
-  GtkTreeNode  node;
+  GtkTreeIter iter;
 
   tree_view->priv->tree = _gtk_rbtree_new ();
 
   gtk_signal_connect (GTK_OBJECT (tree_view->priv->model),
-                     "node_changed",
-                     gtk_tree_view_node_changed,
+                     "changed",
+                     gtk_tree_view_changed,
                      tree_view);
   gtk_signal_connect (GTK_OBJECT (tree_view->priv->model),
-                     "node_inserted",
-                     gtk_tree_view_node_inserted,
+                     "inserted",
+                     gtk_tree_view_inserted,
                      tree_view);
   gtk_signal_connect (GTK_OBJECT (tree_view->priv->model),
-                     "node_child_toggled",
-                     gtk_tree_view_node_child_toggled,
+                     "child_toggled",
+                     gtk_tree_view_child_toggled,
                      tree_view);
   gtk_signal_connect (GTK_OBJECT (tree_view->priv->model),
-                     "node_deleted",
-                     gtk_tree_view_node_deleted,
+                     "deleted",
+                     gtk_tree_view_deleted,
                      tree_view);
 
   if (tree_view->priv->column == NULL)
@@ -2948,9 +2973,9 @@ gtk_tree_view_set_model_realized (GtkTreeView *tree_view)
   if (path == NULL)
     return;
 
-  node = gtk_tree_model_get_node (tree_view->priv->model, path);
+  gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
   gtk_tree_path_free (path);
-  gtk_tree_view_build_tree (tree_view, tree_view->priv->tree, node, 1, FALSE, GTK_WIDGET_REALIZED (tree_view));
+  gtk_tree_view_build_tree (tree_view, tree_view->priv->tree, &iter, 1, FALSE, GTK_WIDGET_REALIZED (tree_view));
 
   gtk_tree_view_create_buttons (tree_view);
   GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_MODEL_SETUP);
@@ -2990,16 +3015,16 @@ gtk_tree_view_set_model (GtkTreeView  *tree_view,
       if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_MODEL_SETUP))
        {
          gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
-                                        gtk_tree_view_node_changed,
+                                        gtk_tree_view_changed,
                                         tree_view);
          gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
-                                        gtk_tree_view_node_inserted,
+                                        gtk_tree_view_inserted,
                                         tree_view);
          gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
-                                        gtk_tree_view_node_child_toggled,
+                                        gtk_tree_view_child_toggled,
                                         tree_view);
          gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
-                                        gtk_tree_view_node_deleted,
+                                        gtk_tree_view_deleted,
                                         tree_view);
          _gtk_rbtree_free (tree_view->priv->tree);
        }
@@ -3487,6 +3512,105 @@ gtk_tree_view_move_to (GtkTreeView       *tree_view,
     }
 }
 
+/**
+ * gtk_tree_view_get_path_at_pos:
+ * @tree_view: A #GtkTreeView.
+ * @window: The #GtkWindow to check against.
+ * @x: The x position to be identified.
+ * @y: The y position to be identified.
+ * @path: A pointer to a #GtkTreePath pointer to be filled in, or NULL
+ * @column: A pointer to a #GtkTreeViewColumn pointer to be filled in, or NULL
+ * 
+ * Finds the path at the point (@x, @y) relative to @window.  If @window is
+ * NULL, then the point is found relative to the widget coordinates.  This
+ * function is expected to be called after an event, with event->window being
+ * passed in as @window.  It is primarily for things like popup menus.  If @path
+ * is non-NULL, then it will be filled with the #GtkTreePath at that point.
+ * This path should be freed with #gtk_tree_path_free.  If @column is non-NULL,
+ * then it will be filled with the column at that point.
+ * 
+ * Return value: TRUE if a row exists at that coordinate.
+ **/
+gboolean
+gtk_tree_view_get_path_at_pos (GtkTreeView        *tree_view,
+                              GdkWindow          *window,
+                              gint                x,
+                              gint                y,
+                              GtkTreePath       **path,
+                              GtkTreeViewColumn **column)
+
+{
+  GtkRBTree *tree;
+  GtkRBNode *node;
+
+  g_return_val_if_fail (tree_view != NULL, FALSE);
+  g_return_val_if_fail (tree_view->priv->tree != NULL, FALSE);
+  g_return_val_if_fail (x >= 0, FALSE);
+  g_return_val_if_fail (y >= 0, FALSE);
+  g_return_val_if_fail (tree_view->priv->bin_window != NULL, FALSE);
+
+  if (window)
+    g_return_val_if_fail (window == tree_view->priv->bin_window, FALSE);
+
+  if (path)
+    *path = NULL;
+  if (column)
+    *column = NULL;
+
+  if (x > tree_view->priv->hadjustment->upper)
+    return FALSE;
+
+  if (column)
+    {
+      GtkTreeViewColumn *tmp_column;
+      GtkTreeViewColumn *last_column = NULL;
+      GList *list;
+
+      for (list = tree_view->priv->column; list; list = list->next)
+       {
+         tmp_column = list->data;
+
+         if (tmp_column->visible == FALSE)
+           continue;
+
+         last_column = tmp_column;
+         if (x <= tmp_column->size)
+           {
+             *column = tmp_column;
+             break;
+           }
+         x -= tmp_column->size;
+       }
+
+      if (*column == NULL)
+       *column = last_column;
+    }
+
+  if (window)
+    {
+      _gtk_rbtree_find_offset (tree_view->priv->tree,
+                              y - TREE_VIEW_HEADER_HEIGHT (tree_view),
+                              &tree, &node);
+    }
+  else
+    {
+      if (y < TREE_VIEW_HEADER_HEIGHT (tree_view))
+       return FALSE;
+
+      _gtk_rbtree_find_offset (tree_view->priv->tree, y - TREE_VIEW_HEADER_HEIGHT (tree_view) +
+                              tree_view->priv->vadjustment->value,
+                              &tree, &node);
+    }
+
+  if (tree == NULL)
+    return FALSE;
+
+  if (path)
+    *path = _gtk_tree_view_find_path (tree_view, tree, node);
+
+  return TRUE;
+}
+
 static void
 gtk_tree_view_expand_all_helper (GtkRBTree  *tree,
                                 GtkRBNode  *node,
@@ -3503,17 +3627,18 @@ gtk_tree_view_expand_all_helper (GtkRBTree  *tree,
   else if ((node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT && node->children == NULL)
     {
       GtkTreePath *path;
-      GtkTreeNode tree_node;
+      GtkTreeIter iter;
+      GtkTreeIter child;
 
       node->children = _gtk_rbtree_new ();
       node->children->parent_tree = tree;
       node->children->parent_node = node;
       path = _gtk_tree_view_find_path (tree_view, tree, node);
-      tree_node = gtk_tree_model_get_node (tree_view->priv->model, path);
-      tree_node = gtk_tree_model_node_children (tree_view->priv->model, tree_node);
+      gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
+      gtk_tree_model_iter_children (tree_view->priv->model, &child, &iter);
       gtk_tree_view_build_tree (tree_view,
                                node->children,
-                               tree_node,
+                               &child,
                                gtk_tree_path_get_depth (path) + 1,
                                TRUE,
                                GTK_WIDGET_REALIZED (tree_view));
@@ -3546,20 +3671,22 @@ gtk_tree_view_expand_all (GtkTreeView *tree_view)
 static void
 gtk_tree_view_collapse_all_helper (GtkRBTree  *tree,
                                   GtkRBNode  *node,
-                                  gpointer  data)
+                                  gpointer    data)
 {
   if (node->children)
     {
       GtkTreePath *path;
-      GtkTreeNode tree_node;
+      GtkTreeIter iter;
 
       path = _gtk_tree_view_find_path (GTK_TREE_VIEW (data),
                                       node->children,
                                       node->children->root);
-      tree_node = gtk_tree_model_get_node (GTK_TREE_VIEW (data)->priv->model, path);
+      gtk_tree_model_get_iter (GTK_TREE_VIEW (data)->priv->model,
+                              &iter,
+                              path);
       gtk_tree_view_discover_dirty (GTK_TREE_VIEW (data),
                                    node->children,
-                                   tree_node,
+                                   &iter,
                                    gtk_tree_path_get_depth (path));
       _gtk_rbtree_remove (node->children);
       gtk_tree_path_free (path);
index b90ea566a2d5ac9664d1157f871ba39bb1973edb..5c9b6d0f15d1d464703047c33d9591c3251b529f 100644 (file)
@@ -56,47 +56,53 @@ struct _GtkTreeViewClass
                                  GtkAdjustment *hadjustment,
                                  GtkAdjustment *vadjustment);
   gint (*expand_row)             (GtkTreeView   *tree_view,
-                                 GtkTreeNode    node);
+                                 GtkTreeIter   *iter);
 };
 
-/* Creators */
 GtkType                gtk_tree_view_get_type            (void);
 GtkWidget             *gtk_tree_view_new                 (void);
-GtkWidget             *gtk_tree_view_new_with_model      (GtkTreeModel      *model);
-GtkTreeModel          *gtk_tree_view_get_model           (GtkTreeView       *tree_view);
-void                   gtk_tree_view_set_model           (GtkTreeView       *tree_view,
-                                                         GtkTreeModel      *tree_model);
-GtkTreeSelection      *gtk_tree_view_get_selection       (GtkTreeView       *tree_view);
-GtkAdjustment         *gtk_tree_view_get_hadjustment     (GtkTreeView       *layout);
-void                   gtk_tree_view_set_hadjustment     (GtkTreeView       *layout,
-                                                         GtkAdjustment     *adjustment);
-GtkAdjustment         *gtk_tree_view_get_vadjustment     (GtkTreeView       *layout);
-void                   gtk_tree_view_set_vadjustment     (GtkTreeView       *layout,
-                                                         GtkAdjustment     *adjustment);
-gboolean               gtk_tree_view_get_headers_visible (GtkTreeView       *tree_view);
-void                   gtk_tree_view_set_headers_visible (GtkTreeView       *tree_view,
-                                                         gboolean           headers_visible);
-void                   gtk_tree_view_columns_autosize    (GtkTreeView       *tree_view);
-void                   gtk_tree_view_set_headers_active  (GtkTreeView       *tree_view,
-                                                         gboolean           active);
-gint                   gtk_tree_view_append_column       (GtkTreeView       *tree_view,
-                                                         GtkTreeViewColumn *column);
-gint                   gtk_tree_view_remove_column       (GtkTreeView       *tree_view,
-                                                         GtkTreeViewColumn *column);
-gint                   gtk_tree_view_insert_column       (GtkTreeView       *tree_view,
-                                                         GtkTreeViewColumn *column,
-                                                         gint               position);
-GtkTreeViewColumn     *gtk_tree_view_get_column          (GtkTreeView       *tree_view,
-                                                         gint               n);
+GtkWidget             *gtk_tree_view_new_with_model      (GtkTreeModel       *model);
+
+GtkTreeModel          *gtk_tree_view_get_model           (GtkTreeView        *tree_view);
+void                   gtk_tree_view_set_model           (GtkTreeView        *tree_view,
+                                                         GtkTreeModel       *tree_model);
+GtkTreeSelection      *gtk_tree_view_get_selection       (GtkTreeView        *tree_view);
+GtkAdjustment         *gtk_tree_view_get_hadjustment     (GtkTreeView        *layout);
+void                   gtk_tree_view_set_hadjustment     (GtkTreeView        *layout,
+                                                         GtkAdjustment      *adjustment);
+GtkAdjustment         *gtk_tree_view_get_vadjustment     (GtkTreeView        *layout);
+void                   gtk_tree_view_set_vadjustment     (GtkTreeView        *layout,
+                                                         GtkAdjustment      *adjustment);
+gboolean               gtk_tree_view_get_headers_visible (GtkTreeView        *tree_view);
+void                   gtk_tree_view_set_headers_visible (GtkTreeView        *tree_view,
+                                                         gboolean            headers_visible);
+void                   gtk_tree_view_columns_autosize    (GtkTreeView        *tree_view);
+void                   gtk_tree_view_set_headers_active  (GtkTreeView        *tree_view,
+                                                         gboolean            active);
+gint                   gtk_tree_view_append_column       (GtkTreeView        *tree_view,
+                                                         GtkTreeViewColumn  *column);
+gint                   gtk_tree_view_remove_column       (GtkTreeView        *tree_view,
+                                                         GtkTreeViewColumn  *column);
+gint                   gtk_tree_view_insert_column       (GtkTreeView        *tree_view,
+                                                         GtkTreeViewColumn  *column,
+                                                         gint                position);
+GtkTreeViewColumn     *gtk_tree_view_get_column          (GtkTreeView        *tree_view,
+                                                         gint                n);
 
 /* Actions */
-void                   gtk_tree_view_move_to             (GtkTreeView       *tree_view,
-                                                         GtkTreePath       *path,
-                                                         GtkTreeViewColumn *column,
-                                                         gfloat             row_align,
-                                                         gfloat             col_align);
-void                   gtk_tree_view_expand_all          (GtkTreeView       *tree_view);
-void                   gtk_tree_view_collapse_all        (GtkTreeView       *tree_view);
+void                   gtk_tree_view_move_to             (GtkTreeView        *tree_view,
+                                                         GtkTreePath        *path,
+                                                         GtkTreeViewColumn  *column,
+                                                         gfloat              row_align,
+                                                         gfloat              col_align);
+gboolean               gtk_tree_view_get_path_at_pos     (GtkTreeView        *tree_view,
+                                                         GdkWindow          *window,
+                                                         gint                x,
+                                                         gint                y,
+                                                         GtkTreePath       **path,
+                                                         GtkTreeViewColumn **column);
+void                   gtk_tree_view_expand_all          (GtkTreeView        *tree_view);
+void                   gtk_tree_view_collapse_all        (GtkTreeView        *tree_view);
 
 
 #ifdef __cplusplus
index f8810d72472cc90ca6e88ab9d084f94bfe15099f..af0afc7cc7b782948e39d202f14442b4823d2806 100644 (file)
@@ -315,7 +315,7 @@ gtk_tree_view_column_set_attributes (GtkTreeViewColumn *tree_column,
 void
 gtk_tree_view_column_set_cell_data (GtkTreeViewColumn *tree_column,
                                    GtkTreeModel      *tree_model,
-                                   GtkTreeNode        tree_node)
+                                   GtkTreeIter       *iter)
 {
   GSList *list;
   GValue value = { 0, };
@@ -327,7 +327,7 @@ gtk_tree_view_column_set_cell_data (GtkTreeViewColumn *tree_column,
 
   if (tree_column->func && (* tree_column->func) (tree_column,
                                                  tree_model,
-                                                 tree_node,
+                                                 iter,
                                                  tree_column->func_data))
     return;
 
@@ -336,8 +336,8 @@ gtk_tree_view_column_set_cell_data (GtkTreeViewColumn *tree_column,
 
   while (list && list->next)
     {
-      gtk_tree_model_node_get_value (tree_model,
-                                    tree_node,
+      gtk_tree_model_iter_get_value (tree_model,
+                                    iter,
                                     GPOINTER_TO_INT (list->next->data),
                                     &value);
       g_object_set_param (cell, (gchar *) list->data, &value);
index b82066e780d5da3ff3d17b0ee7515507a6a931be..7b7544ee3c1cbf6a917a18392a699109dd282060 100644 (file)
@@ -46,7 +46,7 @@ typedef struct _GtkTreeViewColumnClass GtkTreeViewColumnClass;
 
 typedef gboolean (* GtkTreeViewColumnFunc) (GtkTreeViewColumn *tree_column,
                                            GtkTreeModel      *tree_model,
-                                           GtkTreeNode        tree_node,
+                                           GtkTreeIter       *iter,
                                            gpointer           data);
 
 struct _GtkTreeViewColumn
@@ -96,7 +96,7 @@ void             gtk_tree_view_column_set_attributes      (GtkTreeViewColumn
                                                           ...);
 void             gtk_tree_view_column_set_cell_data       (GtkTreeViewColumn     *tree_column,
                                                           GtkTreeModel          *tree_model,
-                                                          GtkTreeNode            tree_node);
+                                                          GtkTreeIter           *iter);
 void             gtk_tree_view_column_set_visible         (GtkTreeViewColumn     *tree_column,
                                                           gboolean               visible);
 gboolean         gtk_tree_view_column_get_visible         (GtkTreeViewColumn     *tree_column);
index 13a4b0b64d692df38ae566d5910255bd28e8e8c3..84423e97a240eb068f760a4d60cb4e068f7699a6 100644 (file)
@@ -5,89 +5,160 @@ GtkObject *model;
 
 static void
 selection_changed (GtkTreeSelection *selection,
-                  GtkWidget         *button)
+                  GtkWidget        *button)
 {
-  if (gtk_tree_selection_get_selected (selection))
+  if (gtk_tree_selection_get_selected (selection,
+                                      NULL))
     gtk_widget_set_sensitive (button, TRUE);
   else
     gtk_widget_set_sensitive (button, FALSE);
 }
 
-static GtkTreeNode *
-node_new ()
+static void
+node_set (GtkTreeIter *iter)
 {
-  static GValue value = {0, };
   static gint i = 0;
   gchar *str;
-  GtkTreeNode *node = gtk_tree_store_node_new ();
 
-  g_value_init (&value, G_TYPE_STRING);
   str = g_strdup_printf ("FOO: %d", i++);
-  g_value_set_string (&value, str);
+  gtk_tree_store_iter_set (GTK_TREE_STORE (model), iter, 0, str, -1);
   g_free (str);
-  gtk_tree_store_node_set_cell (GTK_TREE_STORE (model), node, 0, &value);
-  g_value_unset (&value);
 
-  return node;
 }
 
 static void
-node_remove (GtkWidget *button, GtkTreeView *tree_view)
+iter_remove (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_remove (GTK_TREE_STORE (model),
-                             selected);
+  GtkTreeIter selected;
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_remove (GTK_TREE_STORE (model),
+                                 &selected);
+    }
 }
 
 static void
-node_insert (GtkWidget *button, GtkTreeView *tree_view)
+iter_insert (GtkWidget *button, GtkTreeView *tree_view)
 {
   GtkWidget *entry;
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
+  GtkTreeIter iter;
+  GtkTreeIter selected;
 
   entry = gtk_object_get_user_data (GTK_OBJECT (button));
-  gtk_tree_store_node_insert (GTK_TREE_STORE (model),
-                             selected,
-                             atoi (gtk_entry_get_text (GTK_ENTRY (entry))),
-                             node_new ());
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_insert (GTK_TREE_STORE (model),
+                                 &iter,
+                                 &selected,
+                                 atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
+    }
+  else
+    {
+      gtk_tree_store_iter_insert (GTK_TREE_STORE (model),
+                                 &iter,
+                                 NULL,
+                                 atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
+iter_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_insert_before (GTK_TREE_STORE (model),
-                                   NULL,
-                                   selected,
-                                   node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_insert_before (GTK_TREE_STORE (model),
+                                        &iter,
+                                        NULL,
+                                        &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_insert_before (GTK_TREE_STORE (model),
+                                        &iter,
+                                        NULL,
+                                        NULL);
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_insert_after (GtkWidget *button, GtkTreeView *tree_view)
+iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_insert_after (GTK_TREE_STORE (model),
-                                   NULL,
-                                   selected,
-                                   node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_insert_after (GTK_TREE_STORE (model),
+                                        &iter,
+                                        NULL,
+                                        &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_insert_after (GTK_TREE_STORE (model),
+                                       &iter,
+                                       NULL,
+                                       &selected);
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_prepend (GtkWidget *button, GtkTreeView *tree_view)
+iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_prepend (GTK_TREE_STORE (model),
-                              selected,
-                              node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_prepend (GTK_TREE_STORE (model),
+                                  &iter,
+                                  &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_prepend (GTK_TREE_STORE (model),
+                                  &iter,
+                                  NULL);
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_append (GtkWidget *button, GtkTreeView *tree_view)
+iter_append (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_append (GTK_TREE_STORE (model),
-                             selected,
-                             node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_append (GTK_TREE_STORE (model),
+                                 &iter,
+                                 &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_append (GTK_TREE_STORE (model),
+                                 &iter,
+                                 NULL);
+    }
+
+  node_set (&iter);
 }
 
 static void
@@ -123,56 +194,61 @@ make_window ()
   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
 
   /* buttons */
-  button = gtk_button_new_with_label ("gtk_tree_store_node_remove");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_remove");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
   gtk_signal_connect (GTK_OBJECT (selection),
                      "selection_changed",
                      selection_changed,
                      button);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_remove, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_remove, tree_view);
   gtk_widget_set_sensitive (button, FALSE);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_insert");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_insert");
   hbox = gtk_hbox_new (FALSE, 8);
   entry = gtk_entry_new ();
   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
   gtk_object_set_user_data (GTK_OBJECT (button), entry);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert, tree_view);
 
   
-  button = gtk_button_new_with_label ("gtk_tree_store_node_insert_before");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_insert_before");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert_before, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_before, tree_view);
   gtk_signal_connect (GTK_OBJECT (selection),
                      "selection_changed",
                      selection_changed,
                      button);
   gtk_widget_set_sensitive (button, FALSE);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_insert_after");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_insert_after");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert_after, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_after, tree_view);
   gtk_signal_connect (GTK_OBJECT (selection),
                      "selection_changed",
                      selection_changed,
                      button);
   gtk_widget_set_sensitive (button, FALSE);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_prepend");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_prepend");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_prepend, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_prepend, tree_view);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_append");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_append");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_append, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_append, tree_view);
 
   /* The selected column */
   cell = gtk_cell_renderer_text_new ();
   column = gtk_tree_view_column_new_with_attributes ("nodes", cell, "text", 0, NULL);
   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column));
 
+  /* A few to start */
+  iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
+  iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
+  iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
+
   /* Show it all */
   gtk_widget_show_all (window);
 }
@@ -187,11 +263,6 @@ main (int argc, char *argv[])
   make_window ();
   make_window ();
 
-  /* A few to start */
-  gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
-  gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
-  gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
-
   gtk_main ();
 
   return 0;
index 13a4b0b64d692df38ae566d5910255bd28e8e8c3..84423e97a240eb068f760a4d60cb4e068f7699a6 100644 (file)
@@ -5,89 +5,160 @@ GtkObject *model;
 
 static void
 selection_changed (GtkTreeSelection *selection,
-                  GtkWidget         *button)
+                  GtkWidget        *button)
 {
-  if (gtk_tree_selection_get_selected (selection))
+  if (gtk_tree_selection_get_selected (selection,
+                                      NULL))
     gtk_widget_set_sensitive (button, TRUE);
   else
     gtk_widget_set_sensitive (button, FALSE);
 }
 
-static GtkTreeNode *
-node_new ()
+static void
+node_set (GtkTreeIter *iter)
 {
-  static GValue value = {0, };
   static gint i = 0;
   gchar *str;
-  GtkTreeNode *node = gtk_tree_store_node_new ();
 
-  g_value_init (&value, G_TYPE_STRING);
   str = g_strdup_printf ("FOO: %d", i++);
-  g_value_set_string (&value, str);
+  gtk_tree_store_iter_set (GTK_TREE_STORE (model), iter, 0, str, -1);
   g_free (str);
-  gtk_tree_store_node_set_cell (GTK_TREE_STORE (model), node, 0, &value);
-  g_value_unset (&value);
 
-  return node;
 }
 
 static void
-node_remove (GtkWidget *button, GtkTreeView *tree_view)
+iter_remove (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_remove (GTK_TREE_STORE (model),
-                             selected);
+  GtkTreeIter selected;
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_remove (GTK_TREE_STORE (model),
+                                 &selected);
+    }
 }
 
 static void
-node_insert (GtkWidget *button, GtkTreeView *tree_view)
+iter_insert (GtkWidget *button, GtkTreeView *tree_view)
 {
   GtkWidget *entry;
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
+  GtkTreeIter iter;
+  GtkTreeIter selected;
 
   entry = gtk_object_get_user_data (GTK_OBJECT (button));
-  gtk_tree_store_node_insert (GTK_TREE_STORE (model),
-                             selected,
-                             atoi (gtk_entry_get_text (GTK_ENTRY (entry))),
-                             node_new ());
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_insert (GTK_TREE_STORE (model),
+                                 &iter,
+                                 &selected,
+                                 atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
+    }
+  else
+    {
+      gtk_tree_store_iter_insert (GTK_TREE_STORE (model),
+                                 &iter,
+                                 NULL,
+                                 atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
+iter_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_insert_before (GTK_TREE_STORE (model),
-                                   NULL,
-                                   selected,
-                                   node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_insert_before (GTK_TREE_STORE (model),
+                                        &iter,
+                                        NULL,
+                                        &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_insert_before (GTK_TREE_STORE (model),
+                                        &iter,
+                                        NULL,
+                                        NULL);
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_insert_after (GtkWidget *button, GtkTreeView *tree_view)
+iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_insert_after (GTK_TREE_STORE (model),
-                                   NULL,
-                                   selected,
-                                   node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_insert_after (GTK_TREE_STORE (model),
+                                        &iter,
+                                        NULL,
+                                        &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_insert_after (GTK_TREE_STORE (model),
+                                       &iter,
+                                       NULL,
+                                       &selected);
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_prepend (GtkWidget *button, GtkTreeView *tree_view)
+iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_prepend (GTK_TREE_STORE (model),
-                              selected,
-                              node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_prepend (GTK_TREE_STORE (model),
+                                  &iter,
+                                  &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_prepend (GTK_TREE_STORE (model),
+                                  &iter,
+                                  NULL);
+    }
+
+  node_set (&iter);
 }
 
 static void
-node_append (GtkWidget *button, GtkTreeView *tree_view)
+iter_append (GtkWidget *button, GtkTreeView *tree_view)
 {
-  GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
-  gtk_tree_store_node_append (GTK_TREE_STORE (model),
-                             selected,
-                             node_new ());
+  GtkTreeIter iter;
+  GtkTreeIter selected;
+
+  if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
+                                      &selected))
+    {
+      gtk_tree_store_iter_append (GTK_TREE_STORE (model),
+                                 &iter,
+                                 &selected);
+    }
+  else
+    {
+      gtk_tree_store_iter_append (GTK_TREE_STORE (model),
+                                 &iter,
+                                 NULL);
+    }
+
+  node_set (&iter);
 }
 
 static void
@@ -123,56 +194,61 @@ make_window ()
   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
 
   /* buttons */
-  button = gtk_button_new_with_label ("gtk_tree_store_node_remove");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_remove");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
   gtk_signal_connect (GTK_OBJECT (selection),
                      "selection_changed",
                      selection_changed,
                      button);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_remove, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_remove, tree_view);
   gtk_widget_set_sensitive (button, FALSE);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_insert");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_insert");
   hbox = gtk_hbox_new (FALSE, 8);
   entry = gtk_entry_new ();
   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
   gtk_object_set_user_data (GTK_OBJECT (button), entry);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert, tree_view);
 
   
-  button = gtk_button_new_with_label ("gtk_tree_store_node_insert_before");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_insert_before");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert_before, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_before, tree_view);
   gtk_signal_connect (GTK_OBJECT (selection),
                      "selection_changed",
                      selection_changed,
                      button);
   gtk_widget_set_sensitive (button, FALSE);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_insert_after");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_insert_after");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert_after, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_after, tree_view);
   gtk_signal_connect (GTK_OBJECT (selection),
                      "selection_changed",
                      selection_changed,
                      button);
   gtk_widget_set_sensitive (button, FALSE);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_prepend");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_prepend");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_prepend, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_prepend, tree_view);
 
-  button = gtk_button_new_with_label ("gtk_tree_store_node_append");
+  button = gtk_button_new_with_label ("gtk_tree_store_iter_append");
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-  gtk_signal_connect (GTK_OBJECT (button), "clicked", node_append, tree_view);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_append, tree_view);
 
   /* The selected column */
   cell = gtk_cell_renderer_text_new ();
   column = gtk_tree_view_column_new_with_attributes ("nodes", cell, "text", 0, NULL);
   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column));
 
+  /* A few to start */
+  iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
+  iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
+  iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
+
   /* Show it all */
   gtk_widget_show_all (window);
 }
@@ -187,11 +263,6 @@ main (int argc, char *argv[])
   make_window ();
   make_window ();
 
-  /* A few to start */
-  gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
-  gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
-  gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
-
   gtk_main ();
 
   return 0;