35 template<
class childtype,
class default_sorter=tag_sort_policy>
43 typedef std::list<childtype *> child_list;
44 typedef typename std::list<childtype *>::iterator child_iterator;
48 child_iterator realitem;
50 child_list *parent_list;
53 :
tree_levelref(x), realitem(x.realitem), parent_list(x.parent_list) {}
54 levelref(
const child_iterator &_realitem, child_list *_parent_list)
55 :realitem(_realitem), parent_list(_parent_list)
59 treeitem *get_item() {eassert(realitem!=parent_list->end());
return *realitem;}
60 virtual void advance_next() {++realitem;}
61 virtual void return_prev() {--realitem;}
62 bool is_begin() {
return realitem==parent_list->begin();}
63 bool is_end() {
return realitem==parent_list->end();}
73 child_iterator get_children_begin() {
return children.begin();}
74 child_iterator get_children_end() {
return children.end();}
78 typedef default_sorter default_sort;
82 bool get_expanded() {
return expanded;}
84 void expand() {expanded=
true;}
89 for(child_iterator i=children.begin(); i!=children.end(); i++)
96 for(child_iterator i=children.begin(); i!=children.end(); i++)
100 void paint(
tree *win,
int y,
bool hierarchical,
101 const std::wstring &str,
int depth_shift=2)
104 int basex=hierarchical?depth_shift*get_depth():0;
105 win->getmaxyx(height,width);
110 while(x<basex && x<width)
121 ws=get_expanded()?L
"--\\ ":L
"--- ";
125 while(*ws!=0 && x<width)
136 while(i<str.size() && x<width)
152 void set_depth(
int _depth)
154 for(child_iterator i=children.begin(); i!=children.end(); i++)
155 (*i)->set_depth(_depth+1);
157 treeitem::set_depth(_depth);
160 void add_child(childtype *newchild)
162 newchild->set_depth(get_depth()+1);
164 children.push_back(newchild);
172 for(child_iterator i=children.begin(); i!=children.end(); i++)
173 (*i)->sort(sort_method);
186 if(tree::bindings->key_matches(k,
"ToggleExpanded"))
191 else if(tree::bindings->key_matches(k,
"ExpandTree"))
201 else if(tree::bindings->key_matches(k,
"CollapseTree"))
210 else if(tree::bindings->key_matches(k,
"ExpandAll"))
215 else if(tree::bindings->key_matches(k,
"CollapseAll"))
226 virtual void dispatch_mouse(
short id,
int x, mmask_t bstate,
tree *owner)
228 if(bstate & (BUTTON1_DOUBLE_CLICKED | BUTTON2_DOUBLE_CLICKED |
229 BUTTON3_DOUBLE_CLICKED | BUTTON4_DOUBLE_CLICKED |
230 BUTTON1_TRIPLE_CLICKED | BUTTON2_TRIPLE_CLICKED |
231 BUTTON3_TRIPLE_CLICKED | BUTTON4_TRIPLE_CLICKED))
235 virtual levelref *begin() {
return new levelref(children.begin(), &children);}
238 bool has_visible_children() {
return expanded && children.size()>0;}
239 bool has_children() {
return children.size()>0;}
244 for(i=children.begin(); i!=children.end(); i=j)
Support for defining and remapping keybindings.