9 #define YUILogComponent "gtk"
10 #include <yui/Libyui_config.h>
14 #include "YSelectionWidget.h"
15 #include "YGSelectionStore.h"
16 #include "ygtktreeview.h"
30 YGTreeView (YWidget *ywidget, YWidget *parent,
const std::string &label,
bool tree)
31 :
YGScrolledWidget (ywidget, parent, label, YD_VERT, YGTK_TYPE_TREE_VIEW, NULL),
34 gtk_tree_view_set_headers_visible (getView(), FALSE);
39 gtk_tree_selection_set_mode (getSelection(), GTK_SELECTION_BROWSE);
41 connect (getSelection(),
"changed", G_CALLBACK (selection_changed_cb),
this);
42 connect (getWidget(),
"row-activated", G_CALLBACK (activated_cb),
this);
43 connect (getWidget(),
"right-click", G_CALLBACK (right_click_cb),
this);
46 markColumn = -1; m_count = NULL;
48 g_signal_connect (getWidget(),
"map", G_CALLBACK (block_init_cb),
this);
52 {
if (m_blockTimeout) g_source_remove (m_blockTimeout); }
54 inline GtkTreeView *getView()
55 {
return GTK_TREE_VIEW (getWidget()); }
56 inline GtkTreeSelection *getSelection()
57 {
return gtk_tree_view_get_selection (getView()); }
59 void addTextColumn (
int iconCol,
int textCol)
60 { addTextColumn (
"", YAlignUnchanged, iconCol, textCol); }
62 void addTextColumn (
const std::string &header, YAlignmentType align,
int icon_col,
int text_col)
66 case YAlignBegin: xalign = 0.0;
break;
67 case YAlignCenter: xalign = 0.5;
break;
68 case YAlignEnd: xalign = 1.0;
break;
69 case YAlignUnchanged:
break;
72 GtkTreeViewColumn *column = gtk_tree_view_column_new();
73 gtk_tree_view_column_set_title (column, header.c_str());
75 GtkCellRenderer *renderer;
76 renderer = gtk_cell_renderer_pixbuf_new();
77 gtk_tree_view_column_pack_start (column, renderer, FALSE);
78 gtk_tree_view_column_set_attributes (column, renderer,
"pixbuf", icon_col, NULL);
80 renderer = gtk_cell_renderer_text_new();
81 gtk_tree_view_column_pack_start (column, renderer, TRUE);
82 gtk_tree_view_column_set_attributes (column, renderer,
"text", text_col, NULL);
84 g_object_set (renderer,
"xalign", xalign, NULL);
86 gtk_tree_view_column_set_resizable (column, TRUE);
87 gtk_tree_view_append_column (getView(), column);
88 if (gtk_tree_view_get_search_column (getView()) == -1)
89 gtk_tree_view_set_search_column (getView(), text_col);
92 void addCheckColumn (
int check_col)
94 GtkCellRenderer *renderer = gtk_cell_renderer_toggle_new();
95 g_object_set_data (G_OBJECT (renderer),
"column", GINT_TO_POINTER (check_col));
96 GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (
97 NULL, renderer,
"active", check_col, NULL);
98 gtk_tree_view_column_set_cell_data_func (column, renderer, inconsistent_mark_cb,
this, NULL);
99 g_signal_connect (G_OBJECT (renderer),
"toggled",
100 G_CALLBACK (toggled_cb),
this);
102 gtk_tree_view_column_set_resizable (column, TRUE);
103 gtk_tree_view_append_column (getView(), column);
104 if (markColumn == -1)
105 markColumn = check_col;
109 { gtk_tree_view_set_model (getView(), getModel()); }
111 void addCountWidget (YWidget *yparent)
113 bool mainWidget = !yparent || !strcmp (yparent->widgetClass(),
"YVBox") || !strcmp (yparent->widgetClass(),
"YReplacePoint");
115 m_count = gtk_label_new (
"0");
116 GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
117 gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE);
119 GtkWidget *label = gtk_label_new (_(
"Total selected:"));
121 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
122 gtk_box_pack_start (GTK_BOX (hbox), m_count, FALSE, TRUE, 0);
123 gtk_box_pack_start (GTK_BOX (YGWidget::getWidget()), hbox, FALSE, TRUE, 0);
124 gtk_widget_show_all (hbox);
130 if (!m_count)
return;
133 static gboolean
foreach (
134 GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer _pThis)
138 gtk_tree_model_get (model, iter, pThis->markColumn, &mark, -1);
140 int count = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model),
"count"));
141 g_object_set_data (G_OBJECT (model),
"count", GINT_TO_POINTER (count+1));
147 GtkTreeModel *model = getModel();
148 g_object_set_data (G_OBJECT (model),
"count", 0);
149 gtk_tree_model_foreach (model, inner::foreach,
this);
151 int count = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model),
"count"));
152 gchar *str = g_strdup_printf (
"%d", count);
153 gtk_label_set_text (GTK_LABEL (m_count), str);
157 void focusItem (YItem *item,
bool select)
160 getTreeIter (item, &iter);
164 GtkTreePath *path = gtk_tree_model_get_path (getModel(), &iter);
165 gtk_tree_view_expand_to_path (getView(), path);
167 if (gtk_tree_selection_get_mode (getSelection()) != GTK_SELECTION_MULTIPLE)
168 gtk_tree_view_scroll_to_cell (getView(), path, NULL, TRUE, 0.5, 0);
169 gtk_tree_path_free (path);
171 gtk_tree_selection_select_iter (getSelection(), &iter);
174 gtk_tree_selection_unselect_iter (getSelection(), &iter);
177 void unfocusAllItems()
180 gtk_tree_selection_unselect_all (getSelection());
186 static gboolean foreach_unmark (
187 GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer _pThis)
190 pThis->setRowMark (iter, pThis->markColumn, FALSE);
195 gtk_tree_model_foreach (getModel(), inner::foreach_unmark,
this);
198 YItem *getFocusItem()
201 if (gtk_tree_selection_get_selected (getSelection(), NULL, &iter))
202 return getYItem (&iter);
206 virtual bool _immediateMode() {
return true; }
207 virtual bool _shrinkable() {
return false; }
208 virtual bool _recursiveSelection() {
return false; }
210 void setMark (GtkTreeIter *iter, YItem *yitem, gint column,
bool state,
bool recursive)
212 setRowMark (iter, column, state);
213 yitem->setSelected (state);
216 for (YItemConstIterator it = yitem->childrenBegin();
217 it != yitem->childrenEnd(); it++) {
219 getTreeIter (*it, &_iter);
220 setMark (&_iter, *it, column, state,
true);
224 void toggleMark (GtkTreePath *path, gint column)
227 if (!gtk_tree_model_get_iter (getModel(), &iter, path))
230 gtk_tree_model_get (getModel(), &iter, column, &state, -1);
233 YItem *yitem = getYItem (&iter);
234 YTableItem *pYTableItem =
dynamic_cast<YTableItem*
>(yitem);
237 YTable * pTable =
dynamic_cast<YTable*
>(
this);
240 if ( (pTable->selectionMode() == YTableMode::YTableCheckBoxOnFirstColumn && column == 0)
242 (pTable->selectionMode() == YTableMode::YTableCheckBoxOnLastColumn && column == pTable->columns()*3 ))
244 setRowMark (&iter, column, state);
245 emitEvent (YEvent::ValueChanged);
252 setMark (&iter, yitem, column, state, _recursiveSelection());
254 emitEvent (YEvent::ValueChanged);
260 virtual unsigned int getMinSize (YUIDimension dim)
263 return YGUtils::getCharsHeight (getWidget(), _shrinkable() ? 2 : 5);
268 static gboolean block_selected_timeout_cb (gpointer data)
271 pThis->m_blockTimeout = 0;
277 if (m_blockTimeout) g_source_remove (m_blockTimeout);
278 m_blockTimeout = g_timeout_add_full (G_PRIORITY_LOW, 50, block_selected_timeout_cb,
this, NULL);
281 static void block_init_cb (GtkWidget *widget,
YGTreeView *pThis)
282 { pThis->blockSelected(); }
286 static bool all_marked (GtkTreeModel *model, GtkTreeIter *iter,
int mark_col)
289 GtkTreeIter child_iter;
290 if (gtk_tree_model_iter_children (model, &child_iter, iter))
292 gtk_tree_model_get (model, &child_iter, mark_col, &marked, -1);
293 if (!marked)
return false;
294 all_marked (model, &child_iter, mark_col);
295 }
while (gtk_tree_model_iter_next (model, &child_iter));
299 static void inconsistent_mark_cb (GtkTreeViewColumn *column,
300 GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
304 gtk_tree_model_get (model, iter, pThis->markColumn, &marked, -1);
305 gboolean consistent = !marked || all_marked (model, iter, pThis->markColumn);
306 g_object_set (G_OBJECT (cell),
"inconsistent", !consistent, NULL);
309 static void selection_changed_cb (GtkTreeSelection *selection,
YGTreeView *pThis)
312 static gboolean foreach_sync_select (
313 GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer _pThis)
316 GtkTreeSelection *selection = pThis->getSelection();
317 bool sel = gtk_tree_selection_iter_is_selected (selection, iter);
318 pThis->getYItem (iter)->setSelected (sel);
323 if (pThis->m_blockTimeout)
return;
324 if (pThis->markColumn == -1)
325 gtk_tree_model_foreach (pThis->getModel(), inner::foreach_sync_select, pThis);
326 if (pThis->_immediateMode())
327 pThis->emitEvent (YEvent::SelectionChanged, IF_NOT_PENDING_EVENT);
330 static void activated_cb (GtkTreeView *tree_view, GtkTreePath *path,
333 if (pThis->markColumn >= 0)
335 YTable *pTable =
dynamic_cast<YTable*
>(pThis);
338 GtkTreeViewColumn* col = gtk_tree_view_get_column (pThis->getView(), pThis->markColumn);
340 pThis->toggleMark (path, pThis->markColumn);
342 pThis->emitEvent (YEvent::Activated);
345 pThis->toggleMark (path, pThis->markColumn);
349 if (gtk_tree_view_row_expanded (tree_view, path))
350 gtk_tree_view_collapse_row (tree_view, path);
352 gtk_tree_view_expand_row (tree_view, path, FALSE);
354 pThis->emitEvent (YEvent::Activated);
358 static void toggled_cb (GtkCellRendererToggle *renderer, gchar *path_str,
361 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
362 gint column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (renderer),
"column"));
363 pThis->toggleMark (path, column);
364 gtk_tree_path_free (path);
367 if (gtk_tree_path_get_depth (path) >= 2)
368 gtk_widget_queue_draw (pThis->getWidget());
372 { pThis->emitEvent (YEvent::ContextMenuActivated); }
375 #include "YGDialog.h"
376 #include <gdk/gdkkeysyms.h>
382 YGTable (YWidget *parent, YTableHeader *headers, YTableMode mode)
383 : YTable (NULL, headers, mode),
384 YGTreeView (
this, parent, std::string(),
false)
386 gtk_tree_view_set_headers_visible (getView(), TRUE);
387 gtk_tree_view_set_rules_hint (getView(), columns() > 1);
388 ygtk_tree_view_set_empty_text (YGTK_TREE_VIEW (getView()), _(
"No entries."));
389 if ( mode == YTableMultiSelection )
390 gtk_tree_selection_set_mode (getSelection(), GTK_SELECTION_MULTIPLE);
391 int columnNumber = columns();
392 int columnOffset = 0;
394 yuiMilestone() <<
" Slection mode " << mode << std::endl;
396 if (mode == YTableCheckBoxOnFirstColumn)
401 else if ( mode == YTableCheckBoxOnLastColumn)
403 GType types [columnNumber*3];
404 for (
int i = 0; i < columnNumber; i++) {
406 types[t+0] = G_TYPE_BOOLEAN;
407 types[t+1] = GDK_TYPE_PIXBUF;
408 types[t+2] = G_TYPE_STRING;
409 if ( (i==0 && mode == YTableCheckBoxOnFirstColumn) ||
410 (i == columnNumber-1 && mode == YTableCheckBoxOnLastColumn))
413 addTextColumn (header(i-columnOffset), alignment (i-columnOffset), t+1, t+2);
415 createStore (columnNumber*3, types);
421 YAlignmentType lastAlign = alignment (columns()-1);
422 if (lastAlign == YAlignCenter || lastAlign == YAlignEnd)
423 gtk_tree_view_append_column (getView(), gtk_tree_view_column_new());
425 g_signal_connect (getWidget(),
"key-press-event", G_CALLBACK (key_press_event_cb),
this);
428 void setSortable (
bool sortable)
430 if (!sortable && !gtk_widget_get_realized (getWidget()))
433 GList *columns = gtk_tree_view_get_columns (getView());
434 for (GList *i = columns; i; i = i->next, n++) {
435 GtkTreeViewColumn *column = (GtkTreeViewColumn *) i->data;
436 if (n >= YGTable::columns())
443 gtk_tree_sortable_set_sort_func (
444 GTK_TREE_SORTABLE (getModel()), index, tree_sort_cb,
445 GINT_TO_POINTER (index), NULL);
446 gtk_tree_view_column_set_sort_column_id (column, index);
449 gtk_tree_view_column_set_sort_column_id (column, -1);
451 g_list_free (columns);
454 void setCell (GtkTreeIter *iter,
int column,
const YTableCell *cell)
457 std::string label (cell->label());
459 label = YUI::app()->glyph (YUIGlyph_CheckMark);
461 int index = column * 3;
462 setRowText (iter, index+1, cell->iconName(), index+2, label,
this);
467 virtual bool _immediateMode() {
return immediateMode(); }
471 virtual void setKeepSorting (
bool keepSorting)
473 YTable::setKeepSorting (keepSorting);
474 setSortable (!keepSorting);
476 GtkTreeViewColumn *column = gtk_tree_view_get_column (getView(), 0);
478 gtk_tree_view_column_clicked (column);
482 virtual void cellChanged (
const YTableCell *cell)
485 getTreeIter (cell->parent(), &iter);
486 setCell (&iter, cell->column(), cell);
491 void doAddItem (YItem *_item)
493 YTableItem *item = dynamic_cast <YTableItem *> (_item);
496 addRow (item, &iter);
498 int column_offset = 0;
499 if (selectionMode() == YTableMode::YTableCheckBoxOnFirstColumn )
502 setRowMark(&iter, i++, item->selected());
504 for (YTableCellIterator it = item->cellsBegin();
505 it != item->cellsEnd(); it++)
507 if ((i-column_offset) > columns())
509 yuiWarning() <<
"Item contains too many columns, current is " << i-column_offset
510 <<
" but only " << columns() <<
" columns are configured" << std::endl;
513 setCell (&iter, i++, *it);
515 if (selectionMode() == YTableMode::YTableCheckBoxOnLastColumn )
517 yuiMilestone() <<
" columns " << columns() << std::endl;
518 setRowMark(&iter, columns()*3, item->selected());
520 if (item->selected())
521 focusItem (item,
true);
524 yuiError() <<
"Can only add YTableItems to a YTable.\n";
527 void doSelectItem (YItem *item,
bool select)
528 { focusItem (item, select); }
530 void doDeselectAllItems()
531 { unfocusAllItems(); }
535 static void activateButton (YWidget *button)
537 YWidgetEvent *
event =
new YWidgetEvent (button, YEvent::Activated);
538 YGUI::ui()->sendEvent (event);
543 if (pThis->notifyContextMenu())
544 return YGTreeView::right_click_cb (view, outreach, pThis);
549 static void key_activate_cb (GtkMenuItem *item, YWidget *button)
550 { activateButton (button); }
551 static void appendItem (GtkWidget *menu,
const gchar *stock,
int key)
553 YWidget *button = YGDialog::currentDialog()->getFunctionWidget (key);
556 item = gtk_image_menu_item_new_from_stock (stock, NULL);
557 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
558 g_signal_connect (G_OBJECT (item),
"activate",
559 G_CALLBACK (key_activate_cb), button);
564 GtkWidget *menu = gtk_menu_new();
565 YGDialog *dialog = YGDialog::currentDialog();
566 if (dialog->getClassWidgets (
"YTable").size() == 1) {
569 if (dialog->getFunctionWidget(3))
570 inner::appendItem (menu, GTK_STOCK_ADD, 3);
573 if (dialog->getFunctionWidget(4))
574 inner::appendItem (menu, GTK_STOCK_EDIT, 4);
575 if (dialog->getFunctionWidget(5))
576 inner::appendItem (menu, GTK_STOCK_DELETE, 5);
580 menu = ygtk_tree_view_append_show_columns_item (YGTK_TREE_VIEW (view), menu);
581 ygtk_tree_view_popup_menu (view, menu);
584 static gboolean key_press_event_cb (GtkWidget *widget, GdkEventKey *event,
YGTable *pThis)
586 if (event->keyval == GDK_KEY_Delete) {
587 YWidget *button = YGDialog::currentDialog()->getFunctionWidget (5);
589 activateButton (button);
591 gtk_widget_error_bell (widget);
597 static gint tree_sort_cb (
598 GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer _index)
600 int index = GPOINTER_TO_INT (_index);
601 gchar *str_a, *str_b;
602 gtk_tree_model_get (model, a, index, &str_a, -1);
603 gtk_tree_model_get (model, b, index, &str_b, -1);
604 if (!str_a) str_a = g_strdup (
"");
605 if (!str_b) str_b = g_strdup (
"");
606 int ret = strcmp (str_a, str_b);
607 g_free (str_a); g_free (str_b);
611 YGLABEL_WIDGET_IMPL (YTable)
612 YGSELECTION_WIDGET_IMPL (YTable)
615 YTable *YGWidgetFactory::createTable (YWidget *parent, YTableHeader *headers,
618 return new YGTable (parent, headers, (multiSelection ? YTableMode::YTableMultiSelection : YTableMode::YTableSingleLineSelection) );
621 YTable *YGWidgetFactory::createTable (YWidget *parent, YTableHeader *headers,
624 return new YGTable (parent, headers, mode);
627 #include "YSelectionBox.h"
633 : YSelectionBox (NULL, label),
636 GType types [2] = { GDK_TYPE_PIXBUF, G_TYPE_STRING };
637 addTextColumn (0, 1);
638 createStore (2, types);
644 virtual bool _shrinkable() {
return shrinkable(); }
648 void doAddItem (YItem *item)
651 addRow (item, &iter);
652 setRowText (&iter, 0, item->iconName(), 1, item->label(),
this);
653 if (item->selected())
654 focusItem (item,
true);
657 void doSelectItem (YItem *item,
bool select)
658 { focusItem (item, select); }
660 void doDeselectAllItems()
661 { unfocusAllItems(); }
663 YGLABEL_WIDGET_IMPL (YSelectionBox)
664 YGSELECTION_WIDGET_IMPL (YSelectionBox)
667 YSelectionBox *YGWidgetFactory::createSelectionBox (YWidget *parent,
const std::string &label)
670 #include "YMultiSelectionBox.h"
676 : YMultiSelectionBox (NULL, label),
679 GType types [3] = { G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, G_TYPE_STRING };
681 addTextColumn (1, 2);
682 createStore (3, types);
684 addCountWidget (parent);
689 virtual bool _shrinkable() {
return shrinkable(); }
693 void doAddItem (YItem *item)
696 addRow (item, &iter);
697 setRowMark (&iter, 0, item->selected());
698 setRowText (&iter, 1, item->iconName(), 2, item->label(),
this);
702 void doSelectItem (YItem *item,
bool select)
705 getTreeIter (item, &iter);
706 setRowMark (&iter, 0, select);
710 void doDeselectAllItems()
711 { unmarkAll(); syncCount(); }
715 virtual YItem *currentItem()
716 {
return getFocusItem(); }
718 virtual void setCurrentItem (YItem *item)
719 { focusItem (item,
true); }
721 YGLABEL_WIDGET_IMPL (YMultiSelectionBox)
722 YGSELECTION_WIDGET_IMPL (YMultiSelectionBox)
725 YMultiSelectionBox *YGWidgetFactory::createMultiSelectionBox (YWidget *parent,
const std::string &label)
729 #include "YTreeItem.h"
734 YGTree (YWidget *parent,
const std::string &label,
bool multiselection,
bool recursiveSelection)
735 : YTree (NULL, label, multiselection, recursiveSelection),
738 if (multiselection) {
739 GType types [3] = { GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN };
741 addTextColumn (0, 1);
742 createStore (3, types);
743 addCountWidget (parent);
747 GType types [2] = { GDK_TYPE_PIXBUF, G_TYPE_STRING };
748 addTextColumn (0, 1);
749 createStore (2, types);
753 g_signal_connect (getWidget(),
"row-collapsed", G_CALLBACK (row_collapsed_cb),
this);
754 g_signal_connect (getWidget(),
"row-expanded", G_CALLBACK (row_expanded_cb),
this);
757 virtual bool _recursiveSelection() {
return recursiveSelection(); }
759 void addNode (YItem *item, GtkTreeIter *parent)
762 addRow (item, &iter, parent);
763 setRowText (&iter, 0, item->iconName(), 1, item->label(),
this);
764 #if 0 // yast2-qt ignores `selected flag
765 if (item->selected()) {
766 if (hasMultiSelection())
767 setRowMark (&iter, 2, item->selected());
769 focusItem (item,
true);
771 if (((YTreeItem *) item)->isOpen())
774 for (YItemConstIterator it = item->childrenBegin();
775 it != item->childrenEnd(); it++)
776 addNode (*it, &iter);
780 void expand (GtkTreeIter *iter)
782 GtkTreePath *path = gtk_tree_model_get_path (getModel(), iter);
783 gtk_tree_view_expand_row (getView(), path, FALSE);
784 gtk_tree_path_free (path);
787 bool isReallyOpen (YTreeItem *item)
789 for (YTreeItem *i = item; i; i = i->parent())
798 virtual void rebuildTree()
803 for (YItemConstIterator it = YTree::itemsBegin(); it != YTree::itemsEnd(); it++)
806 int depth = getTreeDepth();
807 gtk_tree_view_set_show_expanders (getView(), depth > 1);
808 gtk_tree_view_set_enable_tree_lines (getView(), depth > 3);
813 static gboolean foreach_sync_open (
814 GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer _pThis)
817 YTreeItem *item = (YTreeItem *) pThis->getYItem (iter);
819 gtk_tree_view_expand_row (pThis->getView(), path, FALSE);
824 g_signal_handlers_block_by_func (getWidget(), (gpointer) row_expanded_cb,
this);
825 gtk_tree_model_foreach (getModel(), inner::foreach_sync_open,
this);
826 g_signal_handlers_unblock_by_func (getWidget(), (gpointer) row_expanded_cb,
this);
831 virtual YTreeItem *currentItem()
832 {
return (YTreeItem *) getFocusItem(); }
834 void _markItem (YItem *item,
bool select,
bool recursive) {
836 getTreeIter (item, &iter);
837 setRowMark (&iter, 2, select);
840 YTreeItem *_item = (YTreeItem *) item;
841 for (YItemConstIterator it = _item->childrenBegin();
842 it != _item->childrenEnd(); it++)
843 _markItem (*it, select,
true);
849 void doAddItem (YItem *item) {}
851 void doSelectItem (YItem *item,
bool select)
853 if (hasMultiSelection()) {
854 _markItem (item, select, recursiveSelection());
858 focusItem (item, select);
861 void doDeselectAllItems()
863 if (hasMultiSelection()) {
873 void reportRowOpen (GtkTreeIter *iter,
bool open)
875 YTreeItem *item = static_cast <YTreeItem *> (getYItem (iter));
876 item->setOpen (open);
879 static void row_collapsed_cb (GtkTreeView *view, GtkTreeIter *iter,
880 GtkTreePath *path,
YGTree *pThis)
881 { pThis->reportRowOpen (iter,
false); }
883 static void row_expanded_cb (GtkTreeView *view, GtkTreeIter *iter,
884 GtkTreePath *path,
YGTree *pThis)
885 { pThis->reportRowOpen (iter,
true); }
891 YTreeItem *item = static_cast <YTreeItem *> (pThis->getYItem (iter));
892 for (YItemConstIterator it = item->childrenBegin();
893 it != item->childrenEnd(); it++) {
894 const YTreeItem *child = static_cast <YTreeItem *> (*it);
895 if (child->isOpen()) {
897 if (pThis->getIter (child, &iter))
898 pThis->expand (&iter);
903 YGLABEL_WIDGET_IMPL (YTree)
904 YGSELECTION_WIDGET_IMPL (YTree)
907 YTree *YGWidgetFactory::createTree (YWidget *parent,
const std::string &label,
bool multiselection,
bool recursiveSelection)
908 {
return new YGTree (parent, label, multiselection, recursiveSelection); }