Thanks to Lars Wirzenius for the original version of this tutorial written for PyGtk. Changes to the document were only to reflect the current state of the Gtk+ codebase and to be applicable to PHP-Gtk2.
Version 2.0 of Gtk+ introduces its third generation of tree and list widgets. Version 1.0 had GtkList and GtkTree, version 1.2 had GtkCList and GtkCTree, and now version 2.0 has GtkTreeView, which servers both as a list and a tree. With each version, the power and usefulness of the widgets have increased.
GtkTreeView uses a Model/View/Controller approach. This means that the code is divided into a data structure representing user's data ("the model"), the widgets that display the data and interact with the user ("the view"), and some logic to tie things nicely together ("the controller"). The model is implemented by GtkTreeModel (actually, classes implementing that interface), the view by GtkTreeView with some helpers, and the controller by the user code.
This sounds unnecessarily complicated, but the complexity is local, and this aproach actually simplifies overall program structure. For example, it is often necessary to view the same data (i.e., model) in different ways, or in different windows. Think, for example, of a programmer's editor: the same source code may be viewed in several windows at the same time, and changes in one window should be shown in all the others, as well. Thus, it makes sense to separate the storage of the text from its display, rather than storing the text in each window widget.
The example application in this article lets the user manage a folder tree. The folders are virtual, not real directories in the filesystem, to keep the code simpler. The example is actually derived from Lodju, in which the folders have nothing to do with the filesystem.
The official Gtk+ 2.0 API reference documentation for GtkTreeView should be read together with this tutorial, even if it is a bit sparse in some details.
I thank the people on the Gtk+ developer IRC channel for encouragement and feedback.