4#include "acme/parallelization/synchronous_lock.h"
5#include "acme/prototype/data/tree_base.h"
6#include "acme/prototype/data/tree_item.h"
13 template < prototype_item ITEM >
21 pointer_array < tree > m_treea;
24 index_array m_iaLevelNext;
32 virtual ::pointer < ::data::tree_item < ITEM > > create_tree_item();
33 ::pointer < ::data::tree_item_base > _create_tree_item()
override;
37 virtual void on_insert_tree(tree * ptree);
39 virtual ::i64 increment_reference_count()
override
41 return ::matter::increment_reference_count();
44 virtual ::i64 decrement_reference_count()
override
46 return ::matter::decrement_reference_count();
50 ::collection::count _tree_count()
override;
51 tree_base * _tree_at(::collection::index iIndex)
override;
54 void erase_all()
override;
56 void update_tree()
override;
58 tree_item < ITEM > * find(
const ITEM * pitem, ::collection::index * piIndex =
nullptr);
59 bool contains(
const ITEM * pitem);
61 bool contains(
const tree_item < ITEM > * pitem)
override;
63 void _001OnTreeDataChange()
override;
71 void erase(tree_item_ptr_array < ITEM > & itemptra);
72 void erase(tree_item < ITEM > * pitem);
73 void erase(
ITEM * pitem, ::collection::index i = 0);
85 void sort_children(const ::function <
bool(
const tree_item < ITEM > * p1,
const tree_item < ITEM > * p2) > & functionLess)
override;
87 tree_item < ITEM > * _get_proper_item(::collection::index iIndex, ::collection::index * piLevel, ::collection::index * piCount =
nullptr);
88 tree_item < ITEM > * get_proper_item(::collection::index iIndex, ::collection::index * piLevel)
override;
89 ::collection::index get_proper_item_index(tree_item < ITEM > * pitemParam, ::collection::index * piLevel, ::collection::index * piCount =
nullptr);
94 tree_item_base * _get_base_item()
override {
return get_base_item(); }
97 const tree_item_base * _get_base_item()
const override {
return get_base_item(); }
99 tree_item < ITEM > * get_base_item();
101 const tree_item < ITEM > * get_base_item()
const;
103 tree_item < ITEM > * insert_item(
ITEM * pitemNew, enum_relative erelativeNewItem = e_relative_last_child, tree_item < ITEM > * pitemRelative =
nullptr,
bool bVoidTreeDataChangeEvent =
false);
104 bool insert_item(tree_item < ITEM > * pitemNew, enum_relative erelativeNewItem = e_relative_last_child, tree_item < ITEM > * pitemRelative =
nullptr,
bool bVoidTreeDataChangeEvent =
false);
106 ::image::image_list * get_tree_image_list()
override;
108 virtual void _001ExpandItem(tree_item < ITEM > * pitem, const ::action_context &
action_context,
bool bExpand =
true,
bool bRedraw =
true,
bool bLayout =
true);
109 virtual void _001EnsureVisible(tree_item < ITEM > * pitem);
110 virtual void _001SelectItem(tree_item < ITEM > * pitem);
112 virtual void get_selection(::data::tree_item_ptr_array < ITEM> & itemptraSelected)
const;
113 virtual bool is_selected(
const tree_item < ITEM > * pitem)
const;
114 virtual bool is_selected(
const ITEM * pitem)
const;
116 virtual ::collection::count selection_set(::data::tree_item_ptr_array < ITEM> & itemptra);
117 virtual bool selection_set(tree_item < ITEM > * pitem,
bool bIfNotInSelection =
false,
bool bIfParentInSelection =
false);
118 virtual bool selection_set(
ITEM * pitem,
bool bIfNotInSelection =
false,
bool bIfParentInSelection =
false);
119 virtual bool selection_set(::collection::index iIndex,
ITEM * pitem,
bool bIfNotInSelection =
false,
bool bIfParentInSelection =
false);
126 virtual void on_fill_children()
override;
129 void on_tree_layout()
override;
131 void fill_children()
override;
139 template < prototype_item ITEM >
140 tree < ITEM >::tree()
156 this->m_etreeitemstate |= ::data::e_tree_item_state_expandable;
158 this->m_etreeitemstate |= ::data::e_tree_item_state_expanded;
160 this->m_ptree =
this;
162 this->m_ptreeitemParent = allocateø tree_item < ITEM >();
164 this->m_ptreeitemParent->insert(e_relative_first_child,
this);
169 template < prototype_item ITEM >
170 tree < ITEM >::~tree()
175 template < prototype_item ITEM >
176 tree_item < ITEM > * tree < ITEM >::find(
const ITEM * pitem, ::collection::index * piIndex)
179 ::collection::index iIndex;
181 if (pitem ==
nullptr)
188 if (piIndex ==
nullptr)
201 ::data::tree_item < ITEM > * ptreeitem =
this;
203 for (; ptreeitem !=
nullptr; ptreeitem = ptreeitem->get_item(e_tree_navigation_expanded_forward))
206 if (ptreeitem->_item() == pitem)
222 if (piIndex !=
nullptr)
234 template < prototype_item ITEM >
235 bool tree < ITEM >::contains(
const ITEM * pitem)
238 return find(pitem) !=
nullptr;
243 template < prototype_item ITEM >
244 bool tree < ITEM >::contains(
const tree_item < ITEM > * ptreeitemParam)
247 return tree_item < ITEM >::contains(ptreeitemParam);
274 template < prototype_item ITEM >
275 void tree < ITEM >::_001OnTreeDataChange()
282 template < prototype_item ITEM >
283 void tree < ITEM >::erase(ITEM * pitem, ::collection::index i)
286 tree_item < ITEM > * ptreeitem = find(pitem, &i);
288 if (ptreeitem ==
nullptr)
295 return erase(ptreeitem);
300 template < prototype_item ITEM >
304 for (::i32 i = 0; i < itemptra.get_count(); i++)
314 template < prototype_item ITEM >
315 void tree < ITEM >::erase(tree_item < ITEM > * ptreeitem)
318 if (ptreeitem->m_ptree ==
this)
321 ptreeitem->erase_tree_item();
328 template < prototype_item ITEM >
329 void tree < ITEM >::sort_children(const ::function < bool(const ::data::tree_item < ITEM > * p1, const ::data::tree_item < ITEM > * p2) > & functionLess)
332 if (!this->m_ptreeitema2)
339 this->m_ptreeitema2->predicate_sort(functionLess);
341 this->m_ptreeitema2->predicate_each([](
auto pitem) {pitem->clear_cache(); });
346 template < prototype_item ITEM >
347 ::data::tree_item < ITEM > * tree < ITEM >::_get_proper_item(::collection::index iIndex, ::collection::index * piLevel, ::collection::index * piCount)
350 ::collection::index iCount = 0;
359 ::pointer<::data::tree_item < ITEM >>pitem =
this;
361 while (pitem && iIndex >= 0)
364 pitem = pitem->get_proper_next(piLevel);
370 if (iIndex < 0 && pitem)
377 if (piCount !=
nullptr)
388 template < prototype_item ITEM >
389 ::data::tree_item < ITEM > * tree < ITEM >::get_proper_item(::collection::index iIndex, ::collection::index * piLevel)
399 ::pointer<::data::tree_item < ITEM >>pitem =
this;
401 while (pitem && iIndex >= 0)
404 pitem = pitem->get_proper_next(piLevel);
410 if (iIndex < 0 && pitem)
421 template < prototype_item ITEM >
422 ::collection::index tree < ITEM >::get_proper_item_index(::data::tree_item < ITEM > * pitemParam, ::collection::index * piLevel, ::collection::index * piCount)
427 ::collection::count iCount = 0;
429 if (piLevel !=
nullptr)
436 ::pointer<::data::tree_item < ITEM >>pitem = get_base_item();
438 while (pitem !=
nullptr)
441 pitem = pitem->get_proper_next(piLevel);
443 if (pitem == pitemParam)
446 if (piCount !=
nullptr)
463 if (piCount !=
nullptr)
484 template < prototype_item ITEM >
485 ::data::tree_item < ITEM > * tree < ITEM >::get_base_item()
492 template < prototype_item ITEM >
493 const ::data::tree_item < ITEM > * tree < ITEM >::get_base_item()
const
501 template < prototype_item ITEM >
502 ::data::tree_item_base * tree < ITEM >::__previous()
510 template < prototype_item ITEM >
511 ::data::tree_item_base * tree < ITEM >::__next()
519 template < prototype_item ITEM >
520 ::data::tree_item < ITEM > * tree < ITEM >::insert_item(ITEM * pitem, enum_relative erelativeNewItem, ::data::tree_item < ITEM > * pitemRelative,
bool bVoidTreeDataChangeEvent)
523 if (pitemRelative ==
nullptr)
526 pitemRelative =
this;
530 if (erelativeNewItem == e_relative_replace)
533 if (!contains(pitemRelative))
540 pitemRelative->m_pitem = pitem;
542 return pitemRelative;
546 auto ptreeitemNew = allocateø tree_item < ITEM >();
555 ptreeitemNew->m_pitem = pitem;
557 if (!insert_item(ptreeitemNew, erelativeNewItem, pitemRelative, bVoidTreeDataChangeEvent))
569 template < prototype_item ITEM >
570 ::pointer < ::data::tree_item < ITEM > > tree < ITEM >::create_tree_item()
573 return create_newø < ::data::tree_item < ITEM > >();
578 template < prototype_item ITEM >
579 ::pointer < ::data::tree_item_base > tree < ITEM >::_create_tree_item()
582 return this->create_tree_item();
587 template < prototype_item ITEM >
592 ::data::tree_item < ITEM >::destroy();
597 template < prototype_item ITEM >
598 void tree < ITEM >::on_insert_tree(
tree * ptree)
606 template < prototype_item ITEM >
607 bool tree < ITEM >::insert_item(::data::tree_item < ITEM > * pitemNew, enum_relative erelativeNewItem, ::data::tree_item < ITEM > * pitemRelative,
bool bVoidTreeDataChangeEvent)
610 ::pointer<tree>ptreeNew = pitemNew;
615 on_insert_tree(ptreeNew);
619 if (pitemRelative ==
nullptr)
622 pitemRelative =
this;
626 _synchronous_lock synchronouslock(this->synchronization(), DEFAULT_SYNCHRONOUS_LOCK_SUFFIX);
628 if (pitemNew ==
nullptr)
635 if (!contains(pitemRelative))
642 if (erelativeNewItem == e_relative_parent)
649 if (erelativeNewItem == e_relative_last_sibling)
652 if (pitemRelative ==
this)
655 erelativeNewItem = e_relative_first_child;
663 switch (erelativeNewItem)
665 case e_relative_first_child:
668 bOk = pitemRelative->insert(erelativeNewItem, pitemNew);
672 case e_relative_last_child:
675 bOk = pitemRelative->insert(erelativeNewItem, pitemNew);
679 case e_relative_previous_sibling:
682 bOk = pitemRelative->insert(erelativeNewItem, pitemNew);
686 case e_relative_next_sibling:
689 bOk = pitemRelative->insert(erelativeNewItem, pitemNew);
693 case e_relative_last_sibling:
696 bOk = pitemRelative->insert(erelativeNewItem, pitemNew);
700 case e_relative_replace:
703 pitemNew->m_dwUser = pitemRelative->m_dwUser;
704 pitemNew->m_dwMetaData = pitemRelative->m_dwMetaData;
705 pitemNew->m_etreeitemstate = pitemRelative->m_etreeitemstate;
706 pitemNew->m_pitem = pitemRelative->m_pitem;
708 pitemNew->m_iLevel = pitemRelative->m_iLevel;
710 bOk = pitemRelative->insert(erelativeNewItem, pitemNew);
715 case e_relative_macro_record:
718 if (pitemRelative->get_next() !=
nullptr)
721 bOk = insert_item(pitemNew, ::data::e_relative_first_child, pitemRelative);
727 bOk = insert_item(pitemNew, ::data::e_relative_last_sibling, pitemRelative);
735 throw ::exception(error_not_supported);
739 pitemNew->m_ptree =
this;
741 if (!bVoidTreeDataChangeEvent)
744 _001OnTreeDataChange();
752 template < prototype_item ITEM >
753 void tree < ITEM >::erase_all()
756 this->erase_tree_item_descendants();
761 template < prototype_item ITEM >
762 ::collection::count tree < ITEM >::_tree_count()
765 return this->m_treea.size();
770 template < prototype_item ITEM >
771 tree_base * tree < ITEM >::_tree_at(::collection::index iIndex)
774 return this->m_treea[iIndex];
779 template < prototype_item ITEM >
780 void tree < ITEM >::update_tree()
783 _001OnTreeDataChange();
805 template < prototype_item ITEM >
806 void tree < ITEM >::update_levels()
809 ::collection::index iLevel = -1;
811 ::pointer<tree_item < ITEM >>pitem = get_base_item();
813 while (pitem !=
nullptr)
816 pitem->m_iLevel = iLevel;
818 pitem = pitem->get_child_next_or_parent(&iLevel);
824 template < prototype_item ITEM >
825 void tree < ITEM >::_001ExpandItem(::data::tree_item < ITEM > * pitem, const ::action_context & context,
bool bExpand,
bool bRedraw,
bool bLayout)
830 template < prototype_item ITEM >
831 void tree < ITEM >::_001EnsureVisible(::data::tree_item < ITEM > * pitem)
837 template < prototype_item ITEM >
838 void tree < ITEM >::_001SelectItem(::data::tree_item < ITEM > * pitem)
843 template < prototype_item ITEM >
844 void tree < ITEM >::get_selection(::data::tree_item_ptr_array< ITEM> & itemptraSelected)
const
849 template < prototype_item ITEM >
851 bool tree < ITEM >::is_selected(const ::data::tree_item < ITEM > * pitem)
const
859 template < prototype_item ITEM >
860 bool tree < ITEM >::is_selected(
const ITEM * pitem)
const
868 template < prototype_item ITEM >
869 void tree < ITEM >::_001OnItemExpand(::data::tree_item_base * ptreeitembase, const ::action_context & context)
872 if (ptreeitembase->is_expanded())
875 ptreeitembase->on_fill_children();
877 if (ptreeitembase->get_children_count() > 0)
879 ptreeitembase->m_etreeitemstate |= ::data::e_tree_item_state_expanded;
880 ptreeitembase->m_etreeitemstate |= ::data::e_tree_item_state_expandable;
895 template < prototype_item ITEM >
896 void tree < ITEM >::_001OnItemCollapse(::data::tree_item_base * ptreeitembase, const ::action_context & context)
899 if (!ptreeitembase->is_expanded())
901 if (ptreeitembase->get_children_count() > 0)
903 ptreeitembase->m_etreeitemstate |= ::data::e_tree_item_state_expandable;
905 ptreeitembase->m_etreeitemstate -= ::data::e_tree_item_state_expanded;
915 template < prototype_item ITEM >
916 void tree < ITEM >::_001OnOpenItem(::data::tree_item_base * ptreeitembase, const ::action_context & context)
934 template < prototype_item ITEM >
935 void tree < ITEM >::_001OnItemContextMenu(::data::tree_item_base * ptreeitembase, const ::action_context & context, ::user::element * ptree, const ::i32_point & point)
941 template < prototype_item ITEM >
942 ::collection::count tree < ITEM >::selection_set(::data::tree_item_ptr_array< ITEM> & itemptra)
949 template < prototype_item ITEM >
950 bool tree < ITEM >::selection_set(::data::tree_item < ITEM > * pitem,
bool bIfNotInSelection,
bool bIfParentInSelection)
957 template < prototype_item ITEM >
958 bool tree < ITEM >::selection_set( ITEM * pitem,
bool bIfNotInSelection,
bool bIfParentInSelection)
965 template < prototype_item ITEM >
966 bool tree < ITEM >::selection_set(::collection::index iIndex, ITEM * pitem,
bool bIfNotInSelection,
bool bIfParentInSelection)
974 template < prototype_item ITEM >
975 ::image::image_list * tree < ITEM >::get_tree_image_list()
988 template < prototype_item ITEM >
989 void tree < ITEM >::handle(::topic * ptopic, ::handler_context * phandlercontext)
992 for (
auto & ptree : m_treea)
995 ptree->handle(ptopic, phandlercontext);
1009 template < prototype_item ITEM >
1010 void tree < ITEM >::on_fill_children()
1032 template < prototype_item ITEM >
1033 void tree < ITEM >::on_tree_layout()
1038 template < prototype_item ITEM >
1039 void tree < ITEM >::fill_children()
1079 template < prototype_item ITEM >
1080 tree_base * tree_item < ITEM >::_get_tree()
const
1087 template < prototype_item ITEM >
1088 void tree_item < ITEM >::_set_tree(
tree_base * ptreebase)
1091 m_ptree =
dynamic_cast <::data::tree < ITEM > *
>(ptreebase);
Definition action_context.h:9
Definition tree_base.h:20
Definition tree_item_base.h:18
Definition tree_item.h:1680
Definition tree_item.h:34
Definition handler_context.h:9
virtual void destroy() override
Definition bbb_context_object.cpp:242