1 // Generated by gtkmmproc -- DO NOT MODIFY!
3 #include <gtkmm/treeiter.h>
4 #include <gtkmm/private/treeiter_p.h>
9 /* Copyright 1998-2002 The gtkmm Development Team
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Library General Public
13 * License as published by the Free Software Foundation; either
14 * version 2 of the License, or (at your option) any later version.
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Library General Public License for more details.
21 * You should have received a copy of the GNU Library General Public
22 * License along with this library; if not, write to the Free
23 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <gtkmm/treemodel.h>
31 // This is copied from Totem. In future there might be a version in GTK+ itself - see bug #
32 void gtkmm_gtk_tree_model_iter_previous(GtkTreeModel* tree_model, GtkTreeIter* iter)
34 GtkTreePath *const path = gtk_tree_model_get_path(tree_model, iter);
36 if(gtk_tree_path_prev(path))
37 gtk_tree_model_get_iter(tree_model, iter, path);
39 g_assert_not_reached();
41 gtk_tree_path_free(path);
44 } // anonymous namespace
50 /**** Gtk::TreeIter ********************************************************/
59 TreeIter::TreeIter(TreeModel* model)
66 TreeIter::TreeIter(GtkTreeModel* model, const GtkTreeIter* iter)
69 model_ (dynamic_cast<TreeModel*>(Glib::wrap_auto((GObject*) model))),
73 TreeIter& TreeIter::operator++()
77 GtkTreeIter previous = gobject_;
79 if(!gtk_tree_model_iter_next(model_->gobj(), &gobject_))
82 gtk_tree_model_iter_parent(model_->gobj(), &gobject_, &previous);
88 const TreeIter TreeIter::operator++(int)
92 TreeIter previous (*this);
94 if(!gtk_tree_model_iter_next(model_->gobj(), &gobject_))
97 gtk_tree_model_iter_parent(model_->gobj(), &gobject_, &previous.gobject_);
103 TreeIter& TreeIter::operator--()
107 gtkmm_gtk_tree_model_iter_previous(model_->gobj(), &gobject_);
109 else // --end yields last
111 GtkTreeIter next = gobject_;
112 GtkTreeIter *const parent = (next.stamp != 0) ? &next : 0;
114 const int index = gtk_tree_model_iter_n_children(model_->gobj(), parent) - 1;
115 is_end_ = !gtk_tree_model_iter_nth_child(model_->gobj(), &gobject_, parent, index);
123 const TreeIter TreeIter::operator--(int)
125 TreeIter next (*this);
129 gtkmm_gtk_tree_model_iter_previous(model_->gobj(), &gobject_);
131 else // --end yields last
133 GtkTreeIter *const parent = (next.gobject_.stamp != 0) ? &next.gobject_ : 0;
135 const int index = gtk_tree_model_iter_n_children(model_->gobj(), parent) - 1;
136 is_end_ = !gtk_tree_model_iter_nth_child(model_->gobj(), &gobject_, parent, index);
144 /* There is no public gtk_tree_iter_equal(), so we must write our own.
146 bool TreeIter::equal(const TreeIter& other) const
148 g_assert(model_ == other.model_);
150 // A GtkTreeIter has the same stamp value as its model.
151 g_assert(gobject_.stamp == other.gobject_.stamp || is_end_ || other.is_end_);
153 //TODO: Allow custom treemodels to provide a different implementation.
155 // If all user_data pointers are equal we can assume the iterators to be
156 // equal. This should be safe since GtkTreeIter lacks destroy notification,
157 // thus there is no way to attach more data fields to the iterator.
158 return (is_end_ == other.is_end_) &&
159 (gobject_.user_data == other.gobject_.user_data) &&
160 (gobject_.user_data2 == other.gobject_.user_data2) &&
161 (gobject_.user_data3 == other.gobject_.user_data3);
164 TreeIter::operator bool() const
166 // Test whether the GtkTreeIter is valid and not an end iterator. This check
167 // is almost the same as the private VALID_ITER() macro in gtkliststore.c and
169 return (!is_end_ && gobject_.stamp != 0);
172 void TreeIter::setup_end_iterator(const TreeIter& last_valid)
174 g_assert(model_ == last_valid.model_);
176 if(last_valid.is_end_)
177 gobject_ = last_valid.gobject_;
179 gtk_tree_model_iter_parent(model_->gobj(), &gobject_, const_cast<GtkTreeIter*>(&last_valid.gobject_));
184 void TreeIter::set_model_refptr(const Glib::RefPtr<TreeModel>& model)
186 model_ = model.operator->();
189 void TreeIter::set_model_gobject(GtkTreeModel* model)
191 model_ = dynamic_cast<TreeModel*>(Glib::wrap_auto((GObject*) model));
194 GtkTreeModel* TreeIter::get_model_gobject() const
196 return (model_) ? model_->gobj() : 0;
200 int TreeIter::get_stamp() const
202 return gobj()->stamp;
205 void TreeIter::set_stamp(int stamp)
207 gobj()->stamp = stamp;
211 /**** Gtk::TreeRow *********************************************************/
213 const TreeNodeChildren& TreeRow::children() const
217 return static_cast<const TreeNodeChildren&>(static_cast<const TreeIter&>(*this));
220 TreeIter TreeRow::parent() const
222 TreeIter iter (model_);
225 iter.gobject_ = gobject_;
227 gtk_tree_model_iter_parent(model_->gobj(), iter.gobj(), const_cast<GtkTreeIter*>(&gobject_));
232 void TreeRow::set_value_impl(int column, const Glib::ValueBase& value) const
234 model_->set_value_impl(*this, column, value);
237 void TreeRow::get_value_impl(int column, Glib::ValueBase& value) const
239 model_->get_value_impl(*this, column, value);
242 TreeRow::operator bool() const
244 return TreeIter::operator bool();
248 /**** Gtk::TreeNodeChildren ************************************************/
250 TreeNodeChildren::iterator TreeNodeChildren::begin()
252 iterator iter (model_);
254 // If the iterator is invalid (stamp == 0), assume a 'virtual' toplevel
255 // node. This behaviour is needed to implement Gtk::TreeModel::children().
257 if(gobject_.stamp != 0)
259 if(!gtk_tree_model_iter_children(model_->gobj(), iter.gobj(), const_cast<GtkTreeIter*>(&gobject_)))
261 // Assign the already known parent, in order to create an end iterator.
262 iter.gobject_ = gobject_;
268 if(!gtk_tree_model_get_iter_first(model_->gobj(), iter.gobj()))
270 // No need to copy the GtkTreeIter, since iter.gobject_ is already empty.
278 TreeNodeChildren::const_iterator TreeNodeChildren::begin() const
280 //TODO: Reduce the copy/paste from the non-const begin()?
282 const_iterator iter (model_);
284 // If the iterator is invalid (stamp == 0), assume a 'virtual' toplevel
285 // node. This behaviour is needed to implement Gtk::TreeModel::children().
287 if(gobject_.stamp != 0)
289 if(!gtk_tree_model_iter_children(model_->gobj(), iter.gobj(), const_cast<GtkTreeIter*>(&gobject_)))
291 // Assign the already known parent, in order to create an end iterator.
292 iter.gobject_ = gobject_;
298 if(!gtk_tree_model_get_iter_first(model_->gobj(), iter.gobj()))
300 // No need to copy the GtkTreeIter, since iter.gobject_ is already empty.
308 TreeNodeChildren::iterator TreeNodeChildren::end()
310 // Just copy the parent, and turn it into an end iterator.
311 iterator iter (*this);
316 TreeNodeChildren::const_iterator TreeNodeChildren::end() const
318 // Just copy the parent, and turn it into an end iterator.
319 const_iterator iter (*this);
324 TreeNodeChildren::value_type TreeNodeChildren::operator[](TreeNodeChildren::size_type index) const
326 iterator iter (model_);
328 GtkTreeIter *const parent = const_cast<GtkTreeIter*>(get_parent_gobject());
330 if(!gtk_tree_model_iter_nth_child(model_->gobj(), iter.gobj(), parent, index))
332 // Assign the already known parent, in order to create an end iterator.
333 iter.gobject_ = gobject_;
340 TreeNodeChildren::size_type TreeNodeChildren::size() const
342 GtkTreeIter *const parent = const_cast<GtkTreeIter*>(get_parent_gobject());
344 return gtk_tree_model_iter_n_children(model_->gobj(), parent);
347 bool TreeNodeChildren::empty() const
349 // If the iterator is invalid (stamp == 0), assume a 'virtual' toplevel
350 // node. This behaviour is needed to implement Gtk::TreeModel::children().
352 if(gobject_.stamp == 0)
355 return !gtk_tree_model_get_iter_first(model_->gobj(), &dummy);
358 return !gtk_tree_model_iter_has_child(model_->gobj(), const_cast<GtkTreeIter*>(&gobject_));
366 } // anonymous namespace
374 GType TreeIterBase::get_type()
376 return gtk_tree_iter_get_type();
379 TreeIterBase::TreeIterBase()
381 GLIBMM_INITIALIZE_STRUCT(gobject_, GtkTreeIter);
384 TreeIterBase::TreeIterBase(const GtkTreeIter* gobject)
389 GLIBMM_INITIALIZE_STRUCT(gobject_, GtkTreeIter);