Added wxNewSizer and wxBorderNewSizer with sample

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3319 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1999-08-08 16:45:57 +00:00
parent 29672bf006
commit c62ac5b6e4
6 changed files with 290 additions and 59 deletions

View File

@@ -1,6 +1,6 @@
/////////////////////////////////////////////////////////////////////////////
// Name: sizer.cpp
// Purpose: provide wxSizer class for layounting
// Purpose: provide wxNewSizer class for layounting
// Author: Robert Roebling and Robin Dunn
// Modified by:
// Created:
@@ -13,105 +13,135 @@
#define __WXSIZERS_H__
#ifdef __GNUG__
#pragma interface "sizers.h"
#pragma implementation "sizer.h"
#endif
#include "wx/sizer.h"
//---------------------------------------------------------------------------
// wxSizerItem
// wxNewSizerItem
//---------------------------------------------------------------------------
wxSizerItem::wxSizerItem( int width, int height, int option )
wxNewSizerItem::wxNewSizerItem( int width, int height, int option )
{
m_window = (wxWindow *) NULL;
m_sizer = (wxSizer *) NULL;
m_sizer = (wxNewSizer *) NULL;
m_minSize.x = width;
m_minSize.h = height;
m_minSize.y = height;
m_option = option;
}
wxSizerItem::wxSizerItem( wxWindow *window, int option )
wxNewSizerItem::wxNewSizerItem( wxWindow *window, int option )
{
m_window = window;
m_sizer = (wxSizer *) NULL;
m_sizer = (wxNewSizer *) NULL;
m_minSize = window->GetSize();
m_option = option;
}
wxSizerItem::wxSizerItem( wxSizer *sizer, int option )
wxNewSizerItem::wxNewSizerItem( wxNewSizer *sizer, int option )
{
m_window = (wxWindow *) NULL;
m_sizer = sizer;
m_minSize.x = -1;
m_minSize.h = -1;
m_minSize = sizer->GetSize();
m_option = option;
}
wxSize wxSizerItem::GetMinSize()
wxSize wxNewSizerItem::GetSize()
{
if (IsSizer())
return m_sizer->GetMinSize();
else
return m_minSize;
if (IsNewSizer())
return m_sizer->GetSize();
if (IsWindow())
return m_window->GetSize();
return m_minSize;
}
bool wxSizerItem::IsWindow()
wxSize wxNewSizerItem::CalcMin()
{
if (IsNewSizer())
return m_sizer->CalcMin();
if (IsWindow())
return m_window->GetSize();
return m_minSize;
}
void wxNewSizerItem::SetDimension( wxPoint pos, wxSize size )
{
if (IsNewSizer())
m_sizer->SetDimension( pos.x, pos.y, size.x, size.y );
if (IsWindow())
m_window->SetSize( pos.x, pos.y, size.x, size.y );
m_minSize = size;
}
bool wxNewSizerItem::IsWindow()
{
return (m_window != NULL);
}
bool wxSizerItem::IsSizer()
bool wxNewSizerItem::IsNewSizer()
{
return (m_sizer != NULL);
}
bool wxSizerItem::IsSpacer()
bool wxNewSizerItem::IsSpacer()
{
return (m_window == NULL) && (m_sizer == NULL);
}
//---------------------------------------------------------------------------
// wxSizer
// wxNewSizer
//---------------------------------------------------------------------------
wxSizer::wxSizer()
wxNewSizer::wxNewSizer()
{
m_children.DeleteContents( TRUE );
}
wxSizer::~wxSizer()
wxNewSizer::~wxNewSizer()
{
}
void wxSizer::Add( wxWindow *window, int option )
void wxNewSizer::Add( wxWindow *window, int option )
{
m_children.Append( new wxSizerItem( window, option ) );
m_children.Append( new wxNewSizerItem( window, option ) );
}
void wxSizer::Add( wxSizer *sizer, int option )
void wxNewSizer::Add( wxNewSizer *sizer, int option )
{
m_children.Append( new wxSizerItem( sizer, option ) );
m_children.Append( new wxNewSizerItem( sizer, option ) );
}
void wxSizer::Add( int width, int height, int option )
void wxNewSizer::Add( int width, int height, int option )
{
m_children.Append( new wxSizerItem( width, height, option ) );
m_children.Append( new wxNewSizerItem( width, height, option ) );
}
void wxSizer::Fit( wxWindow *window );
void wxNewSizer::Fit( wxWindow *window )
{
window->SetSize( GetMinWindowSize( window ) );
}
void wxSizer::SetSizeHints( wxWindow *window );
void wxNewSizer::Layout()
{
m_size = CalcMin();
RecalcSizes();
}
void wxNewSizer::SetSizeHints( wxWindow *window )
{
wxSize size( GetMinWindowSize( window ) );
window->SetSizeHints( size.x, size.y );
}
wxSize wxSizer::GetMinWindowSize( wxWindow *window )
wxSize wxNewSizer::GetMinWindowSize( wxWindow *window )
{
wxSize min( GetMinSize() );
wxSize size( window->GetSize() );
@@ -119,7 +149,7 @@ wxSize wxSizer::GetMinWindowSize( wxWindow *window )
return wxSize( min.x+size.x-client_size.x, min.y+size.y-client_size.y );
}
void wxSizer::DoSetDimension( int x, int y, int width, int height )
void wxNewSizer::SetDimension( int x, int y, int width, int height )
{
m_position.x = x;
m_position.y = y;
@@ -128,5 +158,98 @@ void wxSizer::DoSetDimension( int x, int y, int width, int height )
RecalcSizes();
}
//---------------------------------------------------------------------------
// wxBorderNewSizer
//---------------------------------------------------------------------------
wxBorderNewSizer::wxBorderNewSizer( int sides )
{
m_sides = sides;
}
void wxBorderNewSizer::Add( wxWindow *window, int option )
{
wxCHECK_RET( m_children.GetCount() == 0, _T("border sizer can only hold one child") );
wxNewSizer::Add( window, option );
}
void wxBorderNewSizer::Add( wxNewSizer *sizer, int option )
{
wxCHECK_RET( m_children.GetCount() == 0, _T("border sizer can only hold one child") );
wxNewSizer::Add( sizer, option );
}
void wxBorderNewSizer::Add( int width, int height, int option )
{
wxCHECK_RET( m_children.GetCount() == 0, _T("border sizer can only hold one child") );
wxNewSizer::Add( width, height, option );
}
void wxBorderNewSizer::RecalcSizes()
{
wxNode *node = m_children.GetFirst();
if (!node)
{
SetDimension( m_position.x, m_position.y, 2, 2 );
return;
}
wxNewSizerItem *item = (wxNewSizerItem*) node->Data();
wxSize size( m_size );
wxPoint pt( m_position );
int borderSize = item->GetOption();
if (m_sides & wxWEST)
{
size.x -= borderSize;
pt.x += borderSize;
}
if (m_sides & wxEAST)
{
size.x -= borderSize;
}
if (m_sides & wxNORTH)
{
size.y -= borderSize;
pt.y += borderSize;
}
if (m_sides & wxSOUTH)
{
size.y -= borderSize;
}
item->SetDimension( pt, size );
}
wxSize wxBorderNewSizer::CalcMin()
{
wxNode *node = m_children.GetFirst();
if (!node)
return wxSize(2,2);
wxNewSizerItem *item = (wxNewSizerItem*) node->Data();
wxSize size( item->CalcMin() );
int borderSize = item->GetOption();
if (m_sides & wxWEST)
size.x += borderSize;
if (m_sides & wxEAST)
size.x += borderSize;
if (m_sides & wxNORTH)
size.y += borderSize;
if (m_sides & wxSOUTH)
size.y += borderSize;
return size;
}
#endif
// __SIZERS_H__