ultimatepp/uppdev/ScrollArea/main.cpp
cxl 351994a6cc Adding uppdev....
git-svn-id: svn://ultimatepp.org/upp/trunk@328 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-08-15 08:36:24 +00:00

98 lines
1.6 KiB
C++

#include <CtrlLib/CtrlLib.h>
class ScrollArea : public StaticRect {
virtual void Layout();
virtual void ChildGotFocus();
private:
StaticRect std_pane;
Ctrl *pane;
ScrollBars sb;
void Init();
void SetSb();
void Scroll();
public:
void Reset();
void SetPaneSize(Size sz);
void SetPane(Ctrl& pane);
void Add(Ctrl& ctrl);
Ctrl& GetArea() { return *pane; }
Size GetPaneSize() { return pane->GetSize(); }
typedef ScrollArea CLASSNAME;
ScrollArea();
};
void ScrollArea::SetPaneSize(Size sz)
{
pane->LeftPos(0, sz.cx).TopPos(0, sz.cy);
}
Size ScrollArea::GetPaneSize()
{
return pane->GetRect().GetSize();
}
void ScrollArea::Scroll()
{
Size sz = GetPaneSize();
pane.LeftPos(-sb.x, sz.cx).TopPos(-sb.x, sz.cx);
}
void ScrollArea::SetPane(Ctrl& _pane)
{
pane = &_pane;
sb.x = 0;
sb.y = 0;
Layout();
}
void ScrollArea::Layout()
{
sb.SetTotal(GetPaneSize());
sb.SetPage(GetSize());
}
void ScrollArea::Reset()
{
area = &std_pane;
SetPaneSize(GetSize());
sb.Set(0, 0, 0);
while(pane.GetFirstChild())
pane.GetFirstChild()->Remove();
}
void ScrollArea::Add(Ctrl& c)
{
pane.Add(c);
}
void ScrollArea::ChildGotFocus()
{
Ctrl *f = GetFocusCtrl();
for(Ctrl *q = pane.GetFirstChild(); q; q = q->GetNext())
if(q->HasChildDeep(f)) {
Rect r = q->GetRect();
sb.ScrollInto(r.top, r.Height());
break;
}
}
void ScrollArea::AfterCreate()
{
Ctrl::Add(pane.HSizePos());
}
ScrollArea::ScrollArea()
{
Clear();
SetFrame(sb);
sb.AutoHide();
sb.WhenScroll = THISBACK(Scroll);
Color(SLtGray);
}