]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/wrapsizer.h
added template wxScopedArray<> too
[wxWidgets.git] / include / wx / wrapsizer.h
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: wx/wrapsizer.h
3// Purpose: provide wrapping sizer for layout (wxWrapSizer)
4// Author: Arne Steinarson
5// Created: 2008-05-08
6// RCS-ID: $Id$
7// Copyright: (c) Arne Steinarson
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11#ifndef _WX_WRAPSIZER_H_
12#define _WX_WRAPSIZER_H_
13
14#include "wx/sizer.h"
15
16// flags for wxWrapSizer
17enum
18{
19 wxEXTEND_LAST_ON_EACH_LINE = 1,
20 // don't leave spacers in the beginning of a new row
21 wxREMOVE_LEADING_SPACES = 2,
22
23 wxWRAPSIZER_DEFAULT_FLAGS = wxEXTEND_LAST_ON_EACH_LINE |
24 wxREMOVE_LEADING_SPACES
25};
26
27// ----------------------------------------------------------------------------
28// A box sizer that can wrap items on several lines when sum of widths exceed
29// available line width.
30// ----------------------------------------------------------------------------
31
32class WXDLLEXPORT wxWrapSizer : public wxBoxSizer
33{
34public:
35 wxWrapSizer(int orient = wxHORIZONTAL, int flags = wxWRAPSIZER_DEFAULT_FLAGS);
36 virtual ~wxWrapSizer();
37
38 // override base class virtual methods
39 virtual wxSize CalcMin();
40 virtual void RecalcSizes();
41
42 virtual bool InformFirstDirection(int direction,
43 int size,
44 int availableOtherDir);
45
46protected:
47 // This method is called to decide if an item represents empty space or
48 // not. We do this to avoid having space-only items first or last on a
49 // wrapped line (left alignment).
50 //
51 // By default only spacers are considered to be empty items but a derived
52 // class may override this item if some other kind of sizer elements should
53 // be also considered empty for some reason.
54 virtual bool IsSpaceItem(wxSizerItem *item) const
55 {
56 return item->IsSpacer();
57 }
58
59 // helpers of CalcMin()
60 void CalcMinFromMinor(int totMinor);
61 void CalcMinFromMajor(int totMajor);
62 void CalcMinUsingCurrentLayout();
63 void CalcMinFittingSize(const wxSize& szBoundary);
64 void CalcMaxSingleItemSize();
65
66 // temporarily change the proportion of the last item of the N-th row to
67 // extend to the end of line if the appropriate flag is set
68 void AdjustLastRowItemProp(size_t n, wxSizerItem *itemLast);
69
70 // remove all the items from m_rows
71 void ClearRows();
72
73 // return the N-th row sizer from m_rows creating it if necessary
74 wxSizer *GetRowSizer(size_t n);
75
76 // should be called after completion of each row
77 void FinishRow(size_t n, int rowMajor, int rowMinor, wxSizerItem *itemLast);
78
79
80 const int m_flags; // Flags specified in the ctor
81
82 int m_dirInform; // Direction for size information
83 int m_availSize; // Size available in m_dirInform direction
84 int m_availableOtherDir; // Size available in the other direction
85 bool m_lastUsed; // Indicates whether value from InformFirst... has
86 // been used yet
87
88 // The sizes below are computed by RecalcSizes(), i.e. they don't have
89 // valid values during the initial call to CalcMin() and they are only
90 // valid for the current layout (i.e. the current number of rows)
91 int m_minSizeMinor; // Min size in minor direction
92 int m_maxSizeMajor; // Size of longest row
93 int m_minItemMajor; // Size of smallest item in major direction
94
95 wxBoxSizer m_rows; // Sizer containing multiple rows of our items
96
97 DECLARE_DYNAMIC_CLASS_NO_COPY(wxWrapSizer)
98};
99
100#endif // _WX_WRAPSIZER_H_