ultimatepp/bazaar/DockCtrl/PaneSplitter.cpp
mdelfede d2b54f7989 changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-06-07 22:31:27 +00:00

161 lines
3.4 KiB
C++

#include "DockCtrl/DockCtrl.h"
PaneSplitter::PaneSplitter()
{
animating = false;
SetAnimationType(PANEANIMATION); // by default.
x = 0;
y = 0;
}
PaneSplitter::~PaneSplitter()
{
animating = false;
}
void PaneSplitter::AddChildDock(DockableCtrl& dock)
{
Splitter::Add((Ctrl &)dock.SizePos());
ReposChilds();
}
void PaneSplitter::AddChildDock(DockableCtrl& dock, int position)
{
int count = GetCount();
if(!HasChild() || position > count) AddChildDock(dock);
else AddChildBefore((Ctrl*) &dock, (Ctrl *) GetChildAt(position));
ReposChilds();
}
void PaneSplitter::RemoveChildDock(DockableCtrl& dock)
{
RemoveChildDock(dock.Position());
}
void PaneSplitter::RemoveChildDock(int position)
{
DockableCtrl* ctrl = GetChildAt(position);
if(ctrl) ctrl->Remove();
ReposChilds();
}
void PaneSplitter::RemoveChilds()
{
if(!HasChild()) return;
for(int i = 1; i < GetCount(); i++)
GetChildAt(i)->Shut();
}
void PaneSplitter::ReposChilds()
{
if(!HasChild()) return;
int i = 1;
DockableCtrl* ctrl = (DockableCtrl*) GetFirstChild();
ctrl->Posit(i);
while(ctrl = (DockableCtrl*) ctrl->GetNext())
ctrl->Posit(++i);
if(IsOpen())
Layout();
}
DockableCtrl* PaneSplitter::GetChildAt(int position)
{
if(HasChild())
{
Ctrl* ctrl = GetFirstChild();
while(ctrl)
{
if(ctrl != &animationctrl)
if(((DockableCtrl*)ctrl)->Position() == position)
return (DockableCtrl*) ctrl;
ctrl = ctrl->GetNext();
}
}
return NULL;
}
int PaneSplitter::GetChildCount()
{
int childcount = GetCount();
return IsAnimating() ? childcount - 1 : childcount;
}
bool PaneSplitter::HasChild()
{
return GetChildCount();
}
void PaneSplitter::StartAnimation(int position)
{
if(animationctrl.IsOpen()) return;
if(!HasChild() || position > GetCount())
Splitter::Add(animationctrl.SizePos());
else
AddChildBefore(&animationctrl.SizePos(), (Ctrl *) GetChildAt(position));
animating = true;
if(animationtype == TABANIMATION)
{
Ctrl* ctrl = GetChildAt(GetZoom() + 1);
if(ctrl)
{
const DockCtrlChStyle::Style& s = DockCtrlChStyle::StyleDefault();
Size sz = animationctrl.GetSize();
ImageDraw img(sz.cx, sz.cy);
ctrl->DrawCtrlWithParent(img, 0, 0);
img.DrawImage(sz,s.tabhighlight);
Image i = img;
animationctrl.SetAnimImage(i);
}
}
Animate(position);
}
void PaneSplitter::StartAnimation(DockableCtrl& dock, int position)
{
StartAnimation(position);
}
void PaneSplitter::StopAnimation()
{
if(!animationctrl.IsOpen()) return;
animationctrl.Type(animationtype);
animationctrl.Remove();
animating = false;
}
void PaneSplitter::Animate(int position)
{
}
void PaneSplitter::AnimateCallback()
{
}
void PaneSplitter::Layout()
{
Splitter::Layout();
}
void PaneSplitter::AnimationCtrl::Paint(Draw& d)
{
if(ctrltype != PaneSplitter::TABANIMATION)
d.DrawRect(GetSize(), GUI_GlobalStyle() >= GUISTYLE_XP ? Blend(SColorHighlight, SColorFace) : SColorShadow);
else
d.DrawImage(GetSize(), image);
}
//----------------------------------------------------------------------------------------------
void PaneSplitter::AnimationCtrl::AnimateHorz()
{
if(!IsVisible()) Show();
Ctrl::LeftPos(0, 0).Layout();
}
void PaneSplitter::AnimationCtrl::AnimateVert()
{
if(!IsVisible()) Show();
Ctrl::TopPos(0, 0).Layout();
}