maskfld.cpp Corretta cornice delle TField_window

tree.cpp     Corretta gestione nodi espansi ma senza figli
             Aggiunto tasto K_ENTER per espandere i nodi
             Corretta gestione tasti su' e giu'


git-svn-id: svn://10.65.10.50/trunk@6203 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1998-02-17 10:15:46 +00:00
parent a177471ae5
commit 9cd0090e05
2 changed files with 27 additions and 16 deletions

View File

@ -4236,7 +4236,7 @@ void TField_window::update()
if (CAMPI_SCAVATI) if (CAMPI_SCAVATI)
{ {
RCT rct; xvt_vobj_get_outer_rect(me, &rct); RCT rct; xvt_vobj_get_outer_rect(me, &rct);
rct.left -= 2; rct.top -= 2; rct.right += 3; rct.bottom += 3; rct.left -= 2; rct.top -= 2; rct.right += 2; rct.bottom += 2;
xi_draw_3d_rect(pa, &rct, TRUE, 2, xi_draw_3d_rect(pa, &rct, TRUE, 2,
MASK_LIGHT_COLOR, MASK_BACK_COLOR, MASK_DARK_COLOR); MASK_LIGHT_COLOR, MASK_BACK_COLOR, MASK_DARK_COLOR);
} }

View File

@ -701,15 +701,17 @@ bool TString_tree::get_description(TString& str) const
class TNode_info : public TSortable class TNode_info : public TSortable
{ {
public: public:
bool _valid : 1;
bool _expandable : 1;
bool _expanded : 1;
TString _id; TString _id;
long _plusx; long _plusx;
long _startx; long _startx;
long _endx; long _endx;
bool _expandable;
bool _expanded;
const TNode_info& operator =(const TNode_info& ni) const TNode_info& operator =(const TNode_info& ni)
{ {
_valid = ni._valid;
_id = ni._id; _id = ni._id;
_startx = ni._startx; _startx = ni._startx;
_endx = ni._endx; _endx = ni._endx;
@ -725,10 +727,10 @@ public:
return _id.compare(ni._id); return _id.compare(ni._id);
} }
virtual bool ok() const { return _id.not_empty(); } virtual bool ok() const { return _valid; }
void reset() { _id.cut(0); } void reset() { _valid = FALSE; }
TNode_info() : _plusx(0), _startx(0), _endx(0) { } TNode_info() : _valid(FALSE) { }
}; };
class TNode_info_array : public TObject class TNode_info_array : public TObject
@ -759,13 +761,13 @@ TNode_info& TNode_info_array::operator[](int index)
void TNode_info_array::reset() void TNode_info_array::reset()
{ {
for (int i = _data.last(); i >= 0; i = _data.pred(i)) for (int i = _data.last(); i >= 0; i = _data.pred(i))
(*this)[i].reset(); ((TNode_info*)_data.objptr(i))->reset();
} }
int TNode_info_array::last() const int TNode_info_array::last() const
{ {
for (int i = _data.last(); i >= 0; i = _data.pred(i)) for (int i = _data.last(); i >= 0; i = _data.pred(i))
if ((*this)[i].ok()) if (_data[i].ok())
break; break;
return i; return i;
} }
@ -774,7 +776,7 @@ int TNode_info_array::find(const TNode_info& ni) const
{ {
for (int i = last(); i >= 0; i = _data.pred(i)) for (int i = last(); i >= 0; i = _data.pred(i))
{ {
if ((*this)[i] == ni) if (((TNode_info*)_data.objptr(i))->compare(ni) == 0)
break; break;
} }
return i; return i;
@ -883,6 +885,7 @@ bool TTree_window::callback_draw_node(TTree& node, void* jolly, word when)
TNode_info& ni = (*ui->_node_info)[ry]; TNode_info& ni = (*ui->_node_info)[ry];
node.curr_id(ni._id); node.curr_id(ni._id);
ni._valid = TRUE;
ni._startx = ui->_x; ni._startx = ui->_x;
ni._endx = ui->_x + text_len + 2; ni._endx = ui->_x + text_len + 2;
ni._expandable = node.has_son(); ni._expandable = node.has_son();
@ -1050,19 +1053,26 @@ bool TTree_window::index2info(long index, TNode_info& ni)
_tree->curr_id(ni._id); _tree->curr_id(ni._id);
} }
} else } else
if (index == last+1) if (index == last+1 && last >= 0)
{ {
if (index2info(last, ni) && _tree->goto_node(ni._id)) if (index2info(last, ni) && _tree->goto_node(ni._id))
{ {
ok = _tree->expanded() && _tree->goto_firstson(); ok = _tree->expanded() && _tree->goto_firstson();
if (ok && _hide_leaves && !_tree->has_son())
{
_tree->goto_node(ni._id); // Ritorno al padre perche' ignoro le foglie
ok = FALSE;
}
if (!ok) if (!ok)
{ {
ok = _tree->goto_rbrother(); ok = _tree->goto_rbrother();
ni._startx += TABX; ni._startx += TABX;
} }
if (ok) if (ok)
{
_tree->curr_id(ni._id); _tree->curr_id(ni._id);
} }
}
} else } else
if (index >= 0 && index <= last) if (index >= 0 && index <= last)
{ {
@ -1099,7 +1109,8 @@ bool TTree_window::on_key(KEY key)
} }
else else
{ {
ok = index2info(0, ni) && _tree->goto_node(ni._id); const int index = key == K_UP ? 0 : _node_info.last();
ok = index2info(index, ni) && _tree->goto_node(ni._id);
} }
if (ok && _curr_info != ni) if (ok && _curr_info != ni)
@ -1115,13 +1126,13 @@ bool TTree_window::on_key(KEY key)
if (key == K_ENTER) if (key == K_ENTER)
{ {
if (_curr_info._expandable && _tree->goto_node(_curr_info._id)) if (_tree->goto_node(_curr_info._id))
{ {
bool ok; bool ok;
if (_curr_info._expanded) if (_tree->expanded())
ok = _tree->expand();
else
ok = _tree->shrink(); ok = _tree->shrink();
else
ok = _tree->expand();
if (ok) if (ok)
force_update(); force_update();
} }