Modificato metodo TTree::image e corretto disegno alberi autunnali
git-svn-id: svn://10.65.10.50/trunk@6199 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
78144a59db
commit
a177471ae5
228
include/tree.cpp
228
include/tree.cpp
@ -72,28 +72,32 @@ HIDDEN bool callback_find_brother(TTree& node, void* jolly, word when)
|
||||
|
||||
bool TTree::scan_depth_first(NODE_HANDLER nh, void* jolly, word flags)
|
||||
{
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
return FALSE;
|
||||
|
||||
if ((flags & 0x7) == 0);
|
||||
flags |= SCAN_PRE_ORDER;
|
||||
|
||||
bool test_myself = TRUE;
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
test_myself = FALSE;
|
||||
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
|
||||
TString myself;
|
||||
curr_id(myself);
|
||||
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
|
||||
if (test_myself)
|
||||
{
|
||||
if (scan_depth_first(nh, jolly, flags))
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
{
|
||||
if (scan_depth_first(nh, jolly, flags))
|
||||
return TRUE;
|
||||
goto_node(myself);
|
||||
}
|
||||
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
goto_node(myself);
|
||||
}
|
||||
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
|
||||
if (goto_rbrother())
|
||||
{
|
||||
@ -102,23 +106,30 @@ bool TTree::scan_depth_first(NODE_HANDLER nh, void* jolly, word flags)
|
||||
goto_node(myself);
|
||||
}
|
||||
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
|
||||
if (test_myself)
|
||||
{
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool TTree::scan_breadth_first(NODE_HANDLER nh, void* jolly, word flags)
|
||||
{
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
return FALSE;
|
||||
|
||||
if ((flags & 0x7) == 0);
|
||||
flags |= SCAN_PRE_ORDER;
|
||||
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
bool test_myself = TRUE;
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
test_myself = FALSE;
|
||||
|
||||
if (test_myself)
|
||||
{
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TString myself;
|
||||
curr_id(myself);
|
||||
|
||||
@ -129,19 +140,21 @@ bool TTree::scan_breadth_first(NODE_HANDLER nh, void* jolly, word flags)
|
||||
goto_node(myself);
|
||||
}
|
||||
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
if (test_myself)
|
||||
{
|
||||
if (scan_breadth_first(nh, jolly, flags))
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
goto_node(myself);
|
||||
}
|
||||
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
{
|
||||
if (scan_breadth_first(nh, jolly, flags))
|
||||
return TRUE;
|
||||
goto_node(myself);
|
||||
}
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@ -267,11 +280,11 @@ TImage* TTree::get_res_image(short bmp_id) const
|
||||
return bmp;
|
||||
}
|
||||
|
||||
TImage* TTree::image() const
|
||||
{
|
||||
TImage* TTree::image(bool selected) const
|
||||
{
|
||||
short bmp_id = BMP_FILE;
|
||||
if (has_son())
|
||||
bmp_id = expanded() ? BMP_DIRDN : BMP_DIR;
|
||||
bmp_id = selected ? BMP_DIRDN : BMP_DIR;
|
||||
return get_res_image(bmp_id);
|
||||
}
|
||||
|
||||
@ -282,25 +295,29 @@ TImage* TTree::image() const
|
||||
|
||||
bool TBidirectional_tree::scan_depth_first(NODE_HANDLER nh, void* jolly, word flags)
|
||||
{
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
return FALSE;
|
||||
|
||||
if ((flags & 0x7) == 0);
|
||||
flags |= SCAN_PRE_ORDER;
|
||||
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
bool test_myself = TRUE;
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
test_myself = FALSE;
|
||||
|
||||
if (test_myself)
|
||||
{
|
||||
if (scan_depth_first(nh, jolly, flags))
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
goto_father();
|
||||
}
|
||||
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
{
|
||||
if (scan_depth_first(nh, jolly, flags))
|
||||
return TRUE;
|
||||
goto_father();
|
||||
}
|
||||
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (goto_rbrother())
|
||||
{
|
||||
@ -309,22 +326,29 @@ bool TBidirectional_tree::scan_depth_first(NODE_HANDLER nh, void* jolly, word fl
|
||||
goto_lbrother();
|
||||
}
|
||||
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
|
||||
if (test_myself)
|
||||
{
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool TBidirectional_tree::scan_breadth_first(NODE_HANDLER nh, void* jolly, word flags)
|
||||
{
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
return FALSE;
|
||||
|
||||
if ((flags & 0x7) == 0);
|
||||
flags |= SCAN_PRE_ORDER;
|
||||
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
bool test_myself = TRUE;
|
||||
if ((flags & SCAN_IGNORING_LEAVES) && !has_son())
|
||||
test_myself = FALSE;
|
||||
|
||||
if (test_myself)
|
||||
{
|
||||
if ((flags & SCAN_PRE_ORDER) && nh(*this, jolly, SCAN_PRE_ORDER))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (goto_rbrother())
|
||||
{
|
||||
@ -333,20 +357,21 @@ bool TBidirectional_tree::scan_breadth_first(NODE_HANDLER nh, void* jolly, word
|
||||
goto_lbrother();
|
||||
}
|
||||
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
if (test_myself)
|
||||
{
|
||||
if (scan_breadth_first(nh, jolly, flags))
|
||||
if ((flags & SCAN_IN_ORDER) && nh(*this, jolly, SCAN_IN_ORDER))
|
||||
return TRUE;
|
||||
goto_father();
|
||||
}
|
||||
const bool stop = (flags & SCAN_IGNORING_UNEXPANDED) && !expanded();
|
||||
if (!stop && goto_firstson())
|
||||
{
|
||||
if (scan_breadth_first(nh, jolly, flags))
|
||||
return TRUE;
|
||||
goto_father();
|
||||
}
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if ((flags & SCAN_POST_ORDER) && nh(*this, jolly, SCAN_POST_ORDER))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -680,6 +705,7 @@ public:
|
||||
long _plusx;
|
||||
long _startx;
|
||||
long _endx;
|
||||
bool _expandable;
|
||||
bool _expanded;
|
||||
|
||||
const TNode_info& operator =(const TNode_info& ni)
|
||||
@ -689,6 +715,7 @@ public:
|
||||
_endx = ni._endx;
|
||||
_plusx = ni._plusx;
|
||||
_expanded = ni._expanded;
|
||||
_expandable = ni._expandable;
|
||||
return ni;
|
||||
}
|
||||
|
||||
@ -850,16 +877,25 @@ bool TTree_window::callback_draw_node(TTree& node, void* jolly, word when)
|
||||
q.v = (by+1)*CHARY;
|
||||
xvt_dwin_draw_line(win, q);
|
||||
|
||||
TImage* bmp = node.image();
|
||||
TImage* bmp = node.image(is_selected);
|
||||
if (bmp)
|
||||
bmp->draw(win, p.h, p.v + (CHARY - bmp->height()) / 2);
|
||||
|
||||
TNode_info& ni = (*ui->_node_info)[ry];
|
||||
node.curr_id(ni._id);
|
||||
ni._startx = ui->_x;
|
||||
ni._endx = ui->_x + text_len + 2;
|
||||
ni._plusx = node.has_son() ? ui->_x - TABX + 1 : 0;
|
||||
ni._expanded = ni._plusx > 0 ? node.expanded() : FALSE;
|
||||
ni._startx = ui->_x;
|
||||
ni._endx = ui->_x + text_len + 2;
|
||||
ni._expandable = node.has_son();
|
||||
if (ni._expandable)
|
||||
{
|
||||
ni._plusx = ui->_x - TABX + 1;
|
||||
ni._expanded = node.expanded();
|
||||
}
|
||||
else
|
||||
{
|
||||
ni._plusx = 0;
|
||||
ni._expanded = FALSE;
|
||||
}
|
||||
}
|
||||
ui->_y++;
|
||||
|
||||
@ -878,11 +914,29 @@ bool TTree_window::callback_draw_node(TTree& node, void* jolly, word when)
|
||||
void TTree_window::draw_plus_minus()
|
||||
{
|
||||
const long firsty = origin().y;
|
||||
for (int i = _node_info.last(); i >= 0; i--)
|
||||
const int last_drawn = _node_info.last();
|
||||
for (int i = last_drawn; i >= 0; i--)
|
||||
{
|
||||
const TNode_info& ni = _node_info[i];
|
||||
TNode_info& ni = _node_info[i];
|
||||
if (ni._plusx > 0)
|
||||
{
|
||||
if (ni._expanded)
|
||||
{
|
||||
bool spudorato = i == last_drawn; // Falso espandibile
|
||||
if (!spudorato)
|
||||
{
|
||||
const TNode_info& nni = _node_info[i+1];
|
||||
spudorato = nni._startx <= ni._startx;
|
||||
}
|
||||
if (spudorato)
|
||||
{
|
||||
ni._expandable = FALSE;
|
||||
ni._expanded = FALSE;
|
||||
ni._plusx = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
WINDOW w = win();
|
||||
PNT r = log2dev(ni._plusx, firsty + i);
|
||||
r.v += CHARY/2;
|
||||
@ -1023,7 +1077,10 @@ bool TTree_window::index2info(long index, TNode_info& ni)
|
||||
|
||||
bool TTree_window::on_key(KEY key)
|
||||
{
|
||||
if (_tree && (key == K_UP || key == K_DOWN))
|
||||
if (_tree == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (key == K_UP || key == K_DOWN)
|
||||
{
|
||||
int index = info2index(_curr_info);
|
||||
if (key == K_UP)
|
||||
@ -1055,6 +1112,21 @@ bool TTree_window::on_key(KEY key)
|
||||
if (!scroll)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (key == K_ENTER)
|
||||
{
|
||||
if (_curr_info._expandable && _tree->goto_node(_curr_info._id))
|
||||
{
|
||||
bool ok;
|
||||
if (_curr_info._expanded)
|
||||
ok = _tree->expand();
|
||||
else
|
||||
ok = _tree->shrink();
|
||||
if (ok)
|
||||
force_update();
|
||||
}
|
||||
}
|
||||
|
||||
return TField_window::on_key(key);
|
||||
}
|
||||
|
||||
@ -1062,8 +1134,8 @@ void TTree_window::handler(WINDOW win, EVENT* ep)
|
||||
{
|
||||
switch(ep->type)
|
||||
{
|
||||
case E_MOUSE_DOWN:
|
||||
case E_MOUSE_DBL:
|
||||
case E_MOUSE_DOWN:
|
||||
if (_tree)
|
||||
{
|
||||
const int c = ep->v.mouse.where.h / CHARX;
|
||||
@ -1073,7 +1145,7 @@ void TTree_window::handler(WINDOW win, EVENT* ep)
|
||||
if (ok && (c == ni._plusx || (c >= ni._startx && c < ni._endx)) &&
|
||||
_tree->goto_node(ni._id))
|
||||
{
|
||||
if (ep->type == E_MOUSE_DBL || c == ni._plusx)
|
||||
if (c == ni._plusx || (ni._expandable && ep->type == E_MOUSE_DBL))
|
||||
{
|
||||
if (_tree->expanded())
|
||||
ok = _tree->shrink();
|
||||
|
@ -24,7 +24,7 @@ protected:
|
||||
TAssoc_array _expanded;
|
||||
TArray _image;
|
||||
|
||||
TImage* get_res_image(short id) const; // helper for get_image
|
||||
TImage* get_res_image(short id) const; // helper for image(bool)
|
||||
|
||||
protected:
|
||||
virtual void node2id(const TObject* node, TString& id) const pure;
|
||||
@ -62,7 +62,7 @@ public:
|
||||
virtual bool expanded() const;
|
||||
virtual bool shrunk() const { return !expanded(); }
|
||||
virtual bool expand_all();
|
||||
virtual TImage* image() const;
|
||||
virtual TImage* image(bool selected) const;
|
||||
|
||||
virtual bool scan_depth_first(NODE_HANDLER nh, void* jolly, word flags = SCAN_PRE_ORDER);
|
||||
virtual bool scan_breadth_first(NODE_HANDLER nh, void* jolly, word flags = SCAN_PRE_ORDER);
|
||||
|
Loading…
x
Reference in New Issue
Block a user