ultimatepp/bazaar/CtrlFinder/CtrlFinder.cpp
kohait 0e787eb5f6 bazaar: AutoScroller scope simplification, CtrlFinder filter bugfix, CtrlPos: filter bugfix and SPACE key deselection
git-svn-id: svn://ultimatepp.org/upp/trunk@3859 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-09-13 16:45:17 +00:00

126 lines
2.6 KiB
C++

#include "CtrlFinder.h"
//this one filters
void CtrlFinder::StdCtrlFilter(Ctrl*& q, Point& pt, int& f)
{
if((f & VIEW) && q->InView())
{
if( ((f & VISIBLE) && q->IsShown())
|| ((f & INVISIBLE) && !q->IsShown())
|| ((f & ENABLED) && q->IsEnabled())
|| ((f & DISABLED) && !q->IsEnabled())
) return;
}
if((f & FRAME) && q->InFrame())
if( ((f & VISIBLE) && q->IsShown())
|| ((f & INVISIBLE) && !q->IsShown())
|| ((f & ENABLED) && q->IsEnabled())
|| ((f & DISABLED) && !q->IsEnabled())
) return;
q = NULL;
}
Ctrl* CtrlFinder::ChildAtPoint(Ctrl& par, Point& pt, int& f, const CtrlFilterType& filt)
{
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())
{
Rect r = q->GetRect();
if(r.Contains(vp)) {
pt = vp - r.TopLeft();
Ctrl* w(q);
filt(w, pt, f);
if(w) return w;
}
}
}
return NULL;
}
if(f & FRAME)
for(q = par.GetLastChild(); q; q = q->GetPrev()) {
if((f & FRAME) && q->InFrame())
{
Rect r = q->GetRect();
if(r.Contains(p)) {
pt = p - r.TopLeft();
Ctrl* w(q);
filt(w, pt, f);
if(w) return w;
}
}
}
return NULL;
}
Ctrl* CtrlFinder::GetCtrl(Ctrl& c, Point& p, int& f, const CtrlFilterType& filt)
{
Ctrl* q = ChildAtPoint(c, p, f, filt);
if(q && (f & DEEP))
{
Point pt(p);
Ctrl* qc = GetCtrl(*q, pt, f, filt);
if(qc) { p = pt; return qc; }
}
return q;
}
bool CtrlFinder::IsParentR(const Ctrl* p, const Ctrl* c)
{
while(c && p) {
if(c == p) return true;
c = c->GetParent();
}
return false;
}
void CtrlFinder::Updated()
{
if(!pctrl) return;
SetPos(pctrl->GetPos());
}
void CtrlFinder::UpdatedSource()
{
Remove();
ClearCtrl();
if(!pctrl) return;
ASSERT(pctrl->GetParent());
//finder adds itself on top of any child in the search ctrl's parent
pctrl->GetParent()->AddChild(this, pctrl);
}
void CtrlFinder::LeftDown(Point p, dword keyflags)
{
if(!pctrl) return;
Point pt(p);
int f(flags);
ctrl = GetCtrl(*pctrl, pt, f, filter);
if(!ctrl) ctrl = pctrl;
if(!ctrl) return;
WhenLeftDown(*ctrl, p, keyflags);
Action();
}
void CtrlFinder::RightDown(Point p, dword keyflags)
{
if(!pctrl) return;
Point pt(p);
int f(flags);
ctrl = GetCtrl(*pctrl, pt, f, filter);
if(!ctrl) ctrl = pctrl;
if(!ctrl) return;
WhenRightDown(*ctrl, p, keyflags);
Action();
if(WhenBar)
MenuBar::Execute(WhenBar);
}