diff options
Diffstat (limited to 'libs/gtkmm2/gtk/src/treemodelfilter.ccg')
-rw-r--r-- | libs/gtkmm2/gtk/src/treemodelfilter.ccg | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/libs/gtkmm2/gtk/src/treemodelfilter.ccg b/libs/gtkmm2/gtk/src/treemodelfilter.ccg new file mode 100644 index 0000000000..ee52b6216d --- /dev/null +++ b/libs/gtkmm2/gtk/src/treemodelfilter.ccg @@ -0,0 +1,160 @@ +// -*- c++ -*- +/* $Id: treemodelfilter.ccg,v 1.9 2006/05/11 11:40:24 murrayc Exp $ */ + +/* Copyright 1998-2002 The gtkmm Development Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <gtk/gtktreemodelfilter.h> + + +static gboolean SignalProxy_Visible_gtk_callback(GtkTreeModel* model, GtkTreeIter* iter, gpointer data) +{ + Gtk::TreeModelFilter::SlotVisible* the_slot = static_cast<Gtk::TreeModelFilter::SlotVisible*>(data); + + #ifdef GLIBMM_EXCEPTIONS_ENABLED + try + { + #endif //GLIBMM_EXCEPTIONS_ENAB + return (*the_slot)( Gtk::TreeModel::const_iterator(model, iter) ); + #ifdef GLIBMM_EXCEPTIONS_ENABLED + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + #endif //GLIBMM_EXCEPTIONS_ENABLED + + return FALSE; //An arbitary default, just to avoid the compiler warning. +} + +static void SignalProxy_Visible_gtk_callback_destroy(void* data) +{ + delete static_cast<Gtk::TreeModelFilter::SlotVisible*>(data); +} + + +static void SignalProxy_Modify_gtk_callback(GtkTreeModel* model, GtkTreeIter* iter, GValue* value, gint column, gpointer data) +{ + Gtk::TreeModelFilter::SlotModify* the_slot = static_cast<Gtk::TreeModelFilter::SlotModify*>(data); + + #ifdef GLIBMM_EXCEPTIONS_ENABLED + try + { + #endif //GLIBMM_EXCEPTIONS_ENABLED + //Initialize the input parameter with the appropriate type for this column. + //Then the C++ handler can just use operator==() without calling init on the value output arg: + Glib::ValueBase cppValue; + GType column_type = gtk_tree_model_get_column_type(model, column); + cppValue.init(column_type); + + (*the_slot)( Gtk::TreeModel::const_iterator(model, iter), cppValue, column ); + + //GTK+ has already done this for us: g_value_init(value, column_type); + + //If the C++ handler has inited value with an inappropriate GType, then this will fail, + //but they should not do that because it makes no sense. + g_value_copy(cppValue.gobj() /* source */, value /* destination */); + #ifdef GLIBMM_EXCEPTIONS_ENABLED + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + #endif //GLIBMM_EXCEPTIONS_ENABLED +} + +static void SignalProxy_Modify_gtk_callback_destroy(void* data) +{ + delete static_cast<Gtk::TreeModelFilter::SlotModify*>(data); +} + + +typedef Gtk::TreeModel::Path Path; //So that the generated method implemenations can use this a return type. + +namespace Gtk +{ + +TreeModelFilter::TreeModelFilter(const Glib::RefPtr<TreeModel>& child_model) +: + _CONSTRUCT("child_model", child_model->gobj()) +{ +} + +TreeModelFilter::TreeModelFilter(const Glib::RefPtr<TreeModel>& child_model, const TreeModel::Path& virtual_root) +: + _CONSTRUCT("child_model", child_model->gobj(), "virtual_root", (virtual_root.empty() ? 0 : const_cast<GtkTreePath*>((virtual_root).gobj())) ) +{ +} + +void TreeModelFilter::set_visible_func(const SlotVisible& slot) +{ + // Create a copy of the slot. A pointer to this will be passed + // through the callback's data parameter. It will be deleted + // when SignalProxy_Visible_gtk_callback_destroy() is called. + SlotVisible* slot_copy = new SlotVisible(slot); + + gtk_tree_model_filter_set_visible_func(gobj(), + &SignalProxy_Visible_gtk_callback, slot_copy, + &SignalProxy_Visible_gtk_callback_destroy); +} + + +TreeModel::iterator TreeModelFilter::convert_child_iter_to_iter(const iterator& child_iter) const +{ + TreeIter filter_iter (const_cast<TreeModelFilter*>(this)); + + gtk_tree_model_filter_convert_child_iter_to_iter( + const_cast<GtkTreeModelFilter*>(gobj()), filter_iter.gobj(), + const_cast<GtkTreeIter*>(child_iter.gobj())); + + return filter_iter; +} + +TreeModel::iterator TreeModelFilter::convert_iter_to_child_iter(const iterator& filter_iter) const +{ + GtkTreeModel *const child_model = gtk_tree_model_filter_get_model(const_cast<GtkTreeModelFilter*>(gobj())); + + TreeIter child_iter (dynamic_cast<TreeModel*>(Glib::wrap_auto((GObject*) child_model, false))); + + gtk_tree_model_filter_convert_iter_to_child_iter( + const_cast<GtkTreeModelFilter*>(gobj()), child_iter.gobj(), + const_cast<GtkTreeIter*>(filter_iter.gobj())); + + return child_iter; +} + +void TreeModelFilter::set_modify_func(const TreeModelColumnRecord& columns, const SlotModify& slot) +{ + // Create a copy of the slot. A pointer to this will be passed + // through the callback's data parameter. It will be deleted + // when SignalProxy_Modify_gtk_callback_destroy() is called. + SlotModify* slot_copy = new SlotModify(slot); + + gtk_tree_model_filter_set_modify_func(gobj(), + columns.size(), const_cast<GType*>(columns.types()), + &SignalProxy_Modify_gtk_callback, slot_copy, + &SignalProxy_Modify_gtk_callback_destroy); +} + +void TreeModelFilter::set_value_impl(const iterator& /* row */, int /* column */, const Glib::ValueBase& /* value */) +{ + g_warning("Attempt to set a value of a row in a TreeModelFilter instead of in the child model."); +} + + +} // namespace Gtk + |