+
+/* ------------------------ HildonTouchSelectorColumn implementation ---------------------- */
+G_DEFINE_TYPE_WITH_CODE (HildonTouchSelectorColumn, hildon_touch_selector_column, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
+ hildon_touch_selector_column_cell_layout_init))
+
+enum
+{
+ PROP_TEXT_COLUMN = 1
+};
+
+static void
+hildon_touch_selector_column_class_init (HildonTouchSelectorColumnClass *klass);
+
+static void
+hildon_touch_selector_column_get_property (GObject *object, guint property_id,
+ GValue *value, GParamSpec *pspec);
+
+static void
+hildon_touch_selector_column_set_property (GObject *object, guint property_id,
+ const GValue *value, GParamSpec *pspec);
+
+static void
+hildon_touch_selector_column_set_text_column (HildonTouchSelectorColumn *column,
+ gint text_column);
+static gint
+hildon_touch_selector_column_get_text_column (HildonTouchSelectorColumn *column);
+
+
+static void
+hildon_touch_selector_column_class_init (HildonTouchSelectorColumnClass *klass)
+{
+ GObjectClass *gobject_class = NULL;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (gobject_class, sizeof (HildonTouchSelectorColumnPrivate));
+
+ /* GObject */
+ gobject_class->get_property = hildon_touch_selector_column_get_property;
+ gobject_class->set_property = hildon_touch_selector_column_set_property;
+
+ g_object_class_install_property (G_OBJECT_CLASS(klass),
+ PROP_TEXT_COLUMN,
+ g_param_spec_int ("text-column",
+ "Text Column",
+ "A column in the data source model to get the strings from.",
+ -1,
+ G_MAXINT,
+ -1,
+ G_PARAM_READWRITE));
+}
+
+static void
+hildon_touch_selector_column_init (HildonTouchSelectorColumn *column)
+{
+ column->priv = G_TYPE_INSTANCE_GET_PRIVATE (column, HILDON_TYPE_TOUCH_SELECTOR_COLUMN,
+ HildonTouchSelectorColumnPrivate);
+ column->priv->text_column = -1;
+}
+
+static void
+hildon_touch_selector_column_set_text_column (HildonTouchSelectorColumn *column,
+ gint text_column)
+{
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (column));
+ g_return_if_fail (text_column >= -1);
+
+ column->priv->text_column = text_column;
+
+ g_object_notify (G_OBJECT (column), "text-column");
+}
+
+static gint
+hildon_touch_selector_column_get_text_column (HildonTouchSelectorColumn *column)
+{
+ g_return_val_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (column), -1);
+
+ return column->priv->text_column;
+}
+
+static void
+hildon_touch_selector_column_get_property (GObject *object, guint property_id,
+ GValue *value, GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_TEXT_COLUMN:
+ g_value_set_int (value,
+ hildon_touch_selector_column_get_text_column (HILDON_TOUCH_SELECTOR_COLUMN (object)));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+hildon_touch_selector_column_set_property (GObject *object, guint property_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_TEXT_COLUMN:
+ hildon_touch_selector_column_set_text_column (HILDON_TOUCH_SELECTOR_COLUMN (object),
+ g_value_get_int (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+/* ------------------------ GtkCellLayout implementation -------------------- */
+static void
+hildon_touch_selector_column_cell_layout_init (GtkCellLayoutIface *iface)
+{
+ iface->pack_start = hildon_touch_selector_column_cell_layout_pack_start;
+ iface->pack_end = hildon_touch_selector_column_cell_layout_pack_end;
+ iface->clear = hildon_touch_selector_column_cell_layout_clear;
+ iface->add_attribute = hildon_touch_selector_column_cell_layout_add_attribute;
+ iface->set_cell_data_func = hildon_touch_selector_column_cell_layout_set_cell_data_func;
+ iface->clear_attributes = hildon_touch_selector_column_cell_layout_clear_attributes;
+ iface->reorder = hildon_touch_selector_column_cell_layout_reorder;
+ iface->get_cells = hildon_touch_selector_column_cell_layout_get_cells;
+}
+
+static void
+hildon_touch_selector_column_cell_layout_pack_start (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gboolean expand)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout));
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(view_column), cell, expand);
+
+}
+
+static void
+hildon_touch_selector_column_cell_layout_pack_end (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gboolean expand)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout));
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ gtk_cell_layout_pack_end (GTK_CELL_LAYOUT(view_column), cell, expand);
+}
+
+static void
+hildon_touch_selector_column_cell_layout_clear (GtkCellLayout *cell_layout)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout));
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ gtk_cell_layout_clear (GTK_CELL_LAYOUT(view_column));
+}
+
+static void
+hildon_touch_selector_column_cell_layout_add_attribute (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ const gchar *attribute,
+ gint column)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout));
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(view_column), cell, attribute, column);
+}
+
+
+static void
+hildon_touch_selector_column_cell_layout_set_cell_data_func (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ GtkCellLayoutDataFunc func,
+ gpointer func_data,
+ GDestroyNotify destroy)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout));
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT(view_column), cell, func,
+ func_data, destroy);
+}
+
+static void
+hildon_touch_selector_column_cell_layout_clear_attributes (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout));
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (view_column), cell);
+}
+
+static void
+hildon_touch_selector_column_cell_layout_reorder (GtkCellLayout *cell_layout,
+ GtkCellRenderer *cell,
+ gint position)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout));
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ gtk_cell_layout_reorder (GTK_CELL_LAYOUT(view_column), cell, position);
+}
+
+static GList*
+hildon_touch_selector_column_cell_layout_get_cells (GtkCellLayout *cell_layout)
+{
+ HildonTouchSelectorColumn *sel_column = NULL;
+ GtkTreeViewColumn *view_column = NULL;
+
+ g_return_val_if_fail (HILDON_IS_TOUCH_SELECTOR_COLUMN (cell_layout), NULL);
+ sel_column = HILDON_TOUCH_SELECTOR_COLUMN (cell_layout);
+
+ view_column = gtk_tree_view_get_column (sel_column->priv->tree_view, 0);
+
+ return gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(view_column));
+}
+