ultimatepp/bazaar/CtrlFinder/CtrlFinder.cpp
kohait 1770922ed8 bazaar: CtrlFinder CtrlMover CtrlPos reworking, see TestCases. Reordering and Parent change support for CtrlPos
git-svn-id: svn://ultimatepp.org/upp/trunk@3294 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-03-21 13:13:20 +00:00

102 lines
1.8 KiB
C++

#include "CtrlFinder.h"
Ctrl* CtrlFinder::ChildAtPoint(Ctrl& par, Point& pt, int f)
{
GuiLock __;
Ctrl *q;
Point p = pt;
Rect view = par.GetView();
if(f & VIEW)
if(view.Contains(p)) {
Point vp = p - view.TopLeft();
for(q = par.GetLastChild(); q; q = q->GetPrev()) {
if((f & VIEW) && q->InView())
if((f & VISIBLE) && q->IsVisible())
if((f & ENABLED) && q->IsEnabled())
{
Rect r = q->GetRect();
if(r.Contains(vp)) {
pt = vp - r.TopLeft();
return q;
}
}
}
return NULL;
}
if(f & FRAME)
for(q = par.GetLastChild(); q; q = q->GetPrev()) {
if((f & FRAME) && q->InFrame())
if((f & VISIBLE) && q->IsVisible())
if((f & ENABLED) && q->IsEnabled())
{
Rect r = q->GetRect();
if(r.Contains(p)) {
pt = p - r.TopLeft();
return q;
}
}
}
return NULL;
}
Ctrl* CtrlFinder::GetCtrl(Ctrl& c, Point& p, int f)
{
Ctrl* q = ChildAtPoint(c, p, f);
if(q && (f & DEEP))
{
Point pt(p);
Ctrl* qc = GetCtrl(*q, pt, f);
if(qc)
{
p = pt;
return qc;
}
}
return q;
}
void CtrlFinder::Reload()
{
if(IsEmpty()) return;
V::Reload();
Remove();
Get().GetParent()->AddChild(&SetPos(Get().GetPos()), &Get());
}
void CtrlFinder::Visit(Ctrl& c)
{
ASSERT(c.GetParent());
V::Visit(c);
Enable();
}
void CtrlFinder::Clear()
{
ctrl = NULL;
Remove();
V::Clear();
}
void CtrlFinder::LeftDown(Point p, dword keyflags)
{
ctrl = NULL;
if(IsEmpty()) return;
Point pt(p);
ctrl = GetCtrl(Get(), pt, flags);
if(!ctrl) ctrl = &Get();
WhenLeftDown(*ctrl, p, keyflags);
Action();
}
void CtrlFinder::RightDown(Point p, dword keyflags)
{
ctrl = NULL;
if(IsEmpty()) return;
Point pt(p);
ctrl = GetCtrl(Get(), pt, flags);
if(!ctrl) ctrl = &Get();
WhenRightDown(*ctrl, p, keyflags);
Action();
}