]>
git.saurik.com Git - wxWidgets.git/blob - src/common/sizer.cpp
76dca7a5f63eacdf338d098b799f3049a20afd02
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: provide wxNewSizer class for layounting
4 // Author: Robert Roebling and Robin Dunn
8 // Copyright: (c) Robin Dunn, Dirk Holtwick and Robert Roebling
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "sizer.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
26 //---------------------------------------------------------------------------
28 //---------------------------------------------------------------------------
30 wxNewSizerItem::wxNewSizerItem( int width
, int height
, int option
)
32 m_window
= (wxWindow
*) NULL
;
33 m_sizer
= (wxNewSizer
*) NULL
;
39 wxNewSizerItem::wxNewSizerItem( wxWindow
*window
, int option
)
42 m_sizer
= (wxNewSizer
*) NULL
;
43 m_minSize
= window
->GetSize();
47 wxNewSizerItem::wxNewSizerItem( wxNewSizer
*sizer
, int option
)
49 m_window
= (wxWindow
*) NULL
;
51 m_minSize
= sizer
->GetSize();
55 wxSize
wxNewSizerItem::GetSize()
58 return m_sizer
->GetSize();
61 return m_window
->GetSize();
66 wxSize
wxNewSizerItem::CalcMin()
69 return m_sizer
->CalcMin();
72 return m_window
->GetSize();
77 void wxNewSizerItem::SetDimension( wxPoint pos
, wxSize size
)
80 m_sizer
->SetDimension( pos
.x
, pos
.y
, size
.x
, size
.y
);
83 m_window
->SetSize( pos
.x
, pos
.y
, size
.x
, size
.y
);
88 bool wxNewSizerItem::IsWindow()
90 return (m_window
!= NULL
);
93 bool wxNewSizerItem::IsNewSizer()
95 return (m_sizer
!= NULL
);
98 bool wxNewSizerItem::IsSpacer()
100 return (m_window
== NULL
) && (m_sizer
== NULL
);
103 //---------------------------------------------------------------------------
105 //---------------------------------------------------------------------------
107 wxNewSizer::wxNewSizer()
109 m_children
.DeleteContents( TRUE
);
112 wxNewSizer::~wxNewSizer()
116 void wxNewSizer::Add( wxWindow
*window
, int option
)
118 m_children
.Append( new wxNewSizerItem( window
, option
) );
121 void wxNewSizer::Add( wxNewSizer
*sizer
, int option
)
123 m_children
.Append( new wxNewSizerItem( sizer
, option
) );
126 void wxNewSizer::Add( int width
, int height
, int option
)
128 m_children
.Append( new wxNewSizerItem( width
, height
, option
) );
131 void wxNewSizer::Fit( wxWindow
*window
)
133 window
->SetSize( GetMinWindowSize( window
) );
136 void wxNewSizer::Layout()
142 void wxNewSizer::SetSizeHints( wxWindow
*window
)
144 wxSize
size( GetMinWindowSize( window
) );
145 window
->SetSizeHints( size
.x
, size
.y
);
148 wxSize
wxNewSizer::GetMinWindowSize( wxWindow
*window
)
150 wxSize
minSize( GetMinSize() );
151 wxSize
size( window
->GetSize() );
152 wxSize
client_size( window
->GetClientSize() );
153 return wxSize( minSize
.x
+size
.x
-client_size
.x
,
154 minSize
.y
+size
.y
-client_size
.y
);
157 void wxNewSizer::SetDimension( int x
, int y
, int width
, int height
)
166 //---------------------------------------------------------------------------
168 //---------------------------------------------------------------------------
170 wxBorderNewSizer::wxBorderNewSizer( int sides
)
175 void wxBorderNewSizer::Add( wxWindow
*window
, int option
)
177 wxCHECK_RET( m_children
.GetCount() == 0, _T("border sizer can only hold one child") );
179 wxNewSizer::Add( window
, option
);
182 void wxBorderNewSizer::Add( wxNewSizer
*sizer
, int option
)
184 wxCHECK_RET( m_children
.GetCount() == 0, _T("border sizer can only hold one child") );
186 wxNewSizer::Add( sizer
, option
);
189 void wxBorderNewSizer::Add( int width
, int height
, int option
)
191 wxCHECK_RET( m_children
.GetCount() == 0, _T("border sizer can only hold one child") );
193 wxNewSizer::Add( width
, height
, option
);
196 void wxBorderNewSizer::RecalcSizes()
198 wxNode
*node
= m_children
.GetFirst();
202 SetDimension( m_position
.x
, m_position
.y
, 2, 2 );
206 wxNewSizerItem
*item
= (wxNewSizerItem
*) node
->Data();
208 wxSize
size( m_size
);
209 wxPoint
pt( m_position
);
210 int borderSize
= item
->GetOption();
212 if (m_sides
& wxWEST
)
214 size
.x
-= borderSize
;
217 if (m_sides
& wxEAST
)
219 size
.x
-= borderSize
;
221 if (m_sides
& wxNORTH
)
223 size
.y
-= borderSize
;
226 if (m_sides
& wxSOUTH
)
228 size
.y
-= borderSize
;
231 item
->SetDimension( pt
, size
);
234 wxSize
wxBorderNewSizer::CalcMin()
236 wxNode
*node
= m_children
.GetFirst();
241 wxNewSizerItem
*item
= (wxNewSizerItem
*) node
->Data();
243 wxSize
size( item
->CalcMin() );
245 int borderSize
= item
->GetOption();
247 if (m_sides
& wxWEST
)
248 size
.x
+= borderSize
;
249 if (m_sides
& wxEAST
)
250 size
.x
+= borderSize
;
251 if (m_sides
& wxNORTH
)
252 size
.y
+= borderSize
;
253 if (m_sides
& wxSOUTH
)
254 size
.y
+= borderSize
;
259 //---------------------------------------------------------------------------
261 //---------------------------------------------------------------------------
263 wxBoxNewSizer::wxBoxNewSizer( int orient
)
268 void wxBoxNewSizer::RecalcSizes()
270 if (m_children
.GetCount() == 0)
272 SetDimension( m_position
.x
, m_position
.y
, 2, 2 );
280 if (m_orient
== wxHORIZONTAL
)
282 delta
= (m_size
.x
- m_fixedWidth
) / m_stretchable
;
283 extra
= (m_size
.x
- m_fixedWidth
) % m_stretchable
;
287 delta
= (m_size
.y
- m_fixedHeight
) / m_stretchable
;
288 extra
= (m_size
.y
- m_fixedHeight
) % m_stretchable
;
292 wxPoint
pt( m_position
);
294 wxNode
*node
= m_children
.GetFirst();
297 wxNewSizerItem
*item
= (wxNewSizerItem
*) node
->Data();
300 if (item
->GetOption())
301 weight
= item
->GetOption();
303 wxSize
size( item
->CalcMin() );
305 if (m_orient
== wxVERTICAL
)
307 long height
= size
.y
;
308 if (item
->GetOption())
310 height
= (delta
* weight
) + extra
;
311 extra
= 0; // only the first item will get the remainder as extra size
313 item
->SetDimension( pt
, wxSize( size
.x
, height
) );
319 if (item
->GetOption())
321 width
= (delta
* weight
) + extra
;
322 extra
= 0; // only the first item will get the remainder as extra size
324 item
->SetDimension( pt
, wxSize(width
, size
.y
) );
332 wxSize
wxBoxNewSizer::CalcMin()
334 if (m_children
.GetCount() == 0)
343 wxNode
*node
= m_children
.GetFirst();
346 wxNewSizerItem
*item
= (wxNewSizerItem
*) node
->Data();
349 if (item
->GetOption())
350 weight
= item
->GetOption();
352 wxSize
size( item
->CalcMin() );
354 if (m_orient
== wxHORIZONTAL
)
356 m_minWidth
+= (size
.x
* weight
);
357 m_minHeight
= wxMax( m_minHeight
, size
.y
);
361 m_minHeight
+= (size
.y
* weight
);
362 m_minWidth
= wxMax( m_minWidth
, size
.x
);
365 if (item
->GetOption())
367 m_stretchable
+= weight
;
371 if (m_orient
== wxVERTICAL
)
373 m_fixedHeight
+= size
.y
;
374 m_fixedWidth
= wxMax( m_fixedWidth
, size
.x
);
378 m_fixedWidth
+= size
.x
;
379 m_fixedHeight
= wxMax( m_fixedHeight
, size
.y
);
386 return wxSize( m_minWidth
, m_minHeight
);