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:
@@ -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__
|
||||
|
Reference in New Issue
Block a user