#include "wxsheaders.h"
#include "wxscontainer.h"
#include "wxswidgetfactory.h"
wxsContainer::~wxsContainer()
{
DeletingAll = true;
for ( WidgetsI i = Widgets.begin(); i!=Widgets.end(); ++i )
{
wxsFACTORY()->Kill(*i);
}
for ( ExtraI i = Extra.begin(); i!=Extra.end(); ++i )
{
DelExtra(*i);
}
DeletingAll = false;
}
int wxsContainer::FindChild(wxsWidget* Widget,int Level)
{
if ( Level == 1 )
{
int Cnt = 0;
for ( WidgetsI i = Widgets.begin(); i!=Widgets.end(); ++i, ++Cnt )
{
if ( (*i)==Widget )
return Cnt;
}
return -1;
}
while ( Widget && (Widget != this) )
{
Widget = Widget->GetParent();
if ( --Level == 0 ) break;
}
return ( Widget == this ) ? 0 : -1;
}
int wxsContainer::AddChild(wxsWidget* NewWidget,int InsertBeforeThis)
{
if ( NewWidget == NULL ) return -1;
NewWidget->Parent = this;
if ( InsertBeforeThis < 0 || InsertBeforeThis >= (int)Widgets.size() )
{
Widgets.push_back(NewWidget);
Extra.push_back(NewExtra());
return Widgets.size() - 1;
}
Widgets.insert(Widgets.begin() + InsertBeforeThis,NewWidget);
Extra.insert(Extra.begin() + InsertBeforeThis,NewExtra());
return InsertBeforeThis;
}
bool wxsContainer::DelChildId(int Id)
{
if ( DeletingAll ) return false;
if ( Id<0 || Id>=(int)Widgets.size() ) return false;
Widgets.erase(Widgets.begin()+Id);
DelExtra(Extra[Id]);
Extra.erase(Extra.begin()+Id);
return true;
}
bool wxsContainer::DelChild(wxsWidget* Widget)
{
if ( DeletingAll ) return false;
WidgetsI i = Widgets.begin();
ExtraI ie = Extra.begin();
for ( ; i!=Widgets.end(); ++i, ++ie )
if ( (*i)==Widget )
{
Widgets.erase(i);
DelExtra(*ie);
Extra.erase(ie);
return true;
}
return false;
}
bool wxsContainer::ChangeChildPos(int PrevPos,int NewPos)
{
if ( PrevPos<0 || PrevPos >= (int)Widgets.size() ) return false;
if ( PrevPos < NewPos ) --NewPos;
if ( NewPos<0 || NewPos>=(int)Widgets.size() ) return false;
if ( PrevPos == NewPos ) return true;
wxsWidget* Changing = Widgets[PrevPos];
void* eChanging = Extra[PrevPos];
if ( PrevPos < NewPos )
{
while ( PrevPos++ < NewPos )
{
Widgets[PrevPos-1] = Widgets[PrevPos];
Extra[PrevPos-1] = Extra[PrevPos];
}
}
else
{
while ( PrevPos-- > NewPos )
{
Widgets[PrevPos+1] = Widgets[PrevPos];
Extra[PrevPos+1] = Extra[PrevPos];
}
}
Widgets[NewPos] = Changing;
Extra[NewPos] = eChanging;
return true;
}
syntax highlighted by Code2HTML, v. 0.9.1