]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/layout.h
Centre() supports wxCENTER_FRAME flag now
[wxWidgets.git] / include / wx / layout.h
index 13ae082ee2bf25a97c68f43a8cf712aa24417a29..f0affc67edd24e65256591531de8df6418b7f7d5 100644 (file)
 // Created:     29/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Julian Smart
 // Created:     29/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Julian Smart
-// Licence:    wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef __LAYOUTH__
-#define __LAYOUTH__
+#ifndef _WX_LAYOUTH__
+#define _WX_LAYOUTH__
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
 
 #ifdef __GNUG__
 
 #ifdef __GNUG__
-#pragma interface "layout.h"
+    #pragma interface "layout.h"
 #endif
 
 #include "wx/defs.h"
 
 #endif
 
 #include "wx/defs.h"
 
-class WXDLLEXPORT wxWindow;
-
 // X stupidly defines these in X.h
 #ifdef Above
 // X stupidly defines these in X.h
 #ifdef Above
-#undef Above
+    #undef Above
 #endif
 #ifdef Below
 #endif
 #ifdef Below
-#undef Below
+    #undef Below
 #endif
 
 #endif
 
+// ----------------------------------------------------------------------------
+// forward declrations
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxWindowBase;
+class WXDLLEXPORT wxLayoutConstraints;
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
 #define wxLAYOUT_DEFAULT_MARGIN 0
 
 #define wxLAYOUT_DEFAULT_MARGIN 0
 
-enum wxEdge { wxLeft, wxTop, wxRight, wxBottom, wxWidth, wxHeight,
-  wxCentre, wxCenter = wxCentre, wxCentreX, wxCentreY };
-enum wxRelationship { wxUnconstrained = 0,
-                      wxAsIs,
-                      wxPercentOf,
-                      wxAbove,
-                      wxBelow,
-                      wxLeftOf,
-                      wxRightOf,
-                      wxSameAs,
-                      wxAbsolute };
+enum wxEdge
+{
+    wxLeft, wxTop, wxRight, wxBottom, wxWidth, wxHeight,
+    wxCentre, wxCenter = wxCentre, wxCentreX, wxCentreY
+};
 
 
-class WXDLLEXPORT wxLayoutConstraints;
-class WXDLLEXPORT wxIndividualLayoutConstraint: public wxObject
+enum wxRelationship
 {
 {
-  DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint)
-
- protected:
-   // 'This' window is the parent or sibling of otherWin
-   wxWindow *otherWin;
-
-   wxEdge myEdge;
-   wxRelationship relationship;
-   int margin;
-   int value;
-   int percent;
-   wxEdge otherEdge;
-   bool done;
-
- public:
-   wxIndividualLayoutConstraint(void);
-   ~wxIndividualLayoutConstraint(void);
-
-  void Set(wxRelationship rel, wxWindow *otherW, wxEdge otherE, int val = 0, int marg = wxLAYOUT_DEFAULT_MARGIN);
-
-  //
-  // Sibling relationships
-  //
-  void LeftOf(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
-  void RightOf(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
-  void Above(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
-  void Below(wxWindow *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
-
-  //
-  // 'Same edge' alignment
-  //
-  void SameAs(wxWindow *otherW, wxEdge edge, int marg = wxLAYOUT_DEFAULT_MARGIN);
-
-  // The edge is a percentage of the other window's edge
-  void PercentOf(wxWindow *otherW, wxEdge wh, int per);
-
-  //
-  // Edge has absolute value
-  //
-  void Absolute(int val);
-
-  //
-  // Dimension is unconstrained
-  //
-  inline void Unconstrained(void) { relationship = wxUnconstrained; }
-
-  //
-  // Dimension is 'as is' (use current size settings)
-  //
-  inline void AsIs(void) { relationship = wxAsIs; }
-
-  //
-  // Accessors
-  //
-  inline wxWindow *GetOtherWindow(void) { return otherWin; }
-  inline wxEdge GetMyEdge(void) { return myEdge; }
-  inline void SetEdge(wxEdge which) { myEdge = which; }
-  inline void SetValue(int v) { value = v; }
-  inline int GetMargin(void) { return margin; }
-  inline void SetMargin(int m) { margin = m; }
-  inline int GetValue(void) { return value; }
-  inline int GetPercent(void) { return percent; }
-  inline int GetOtherEdge(void) { return otherEdge; }
-  inline bool GetDone(void) { return done; }
-  inline void SetDone(bool d) { done = d; }
-  inline wxRelationship GetRelationship(void) { return relationship; }
-  inline void SetRelationship(wxRelationship r) { relationship = r; }
-
-  // Reset constraint if it mentions otherWin
-  bool ResetIfWin(wxWindow *otherW);
-
-  // Try to satisfy constraint
-  bool SatisfyConstraint(wxLayoutConstraints *constraints, wxWindow *win);
-
-  // Get the value of this edge or dimension, or if this
-  // is not determinable, -1.
-  int GetEdge(wxEdge which, wxWindow *thisWin, wxWindow *other);
+    wxUnconstrained = 0,
+    wxAsIs,
+    wxPercentOf,
+    wxAbove,
+    wxBelow,
+    wxLeftOf,
+    wxRightOf,
+    wxSameAs,
+    wxAbsolute
 };
 
 };
 
-class WXDLLEXPORT wxLayoutConstraints: public wxObject
+enum wxSizerBehaviour
+{
+    wxSizerShrink,
+    wxSizerExpand,
+    wxSizerNone
+};
+
+#define wxTYPE_SIZER        90
+
+// =============================================================================
+// classes
+// =============================================================================
+
+// ----------------------------------------------------------------------------
+// wxIndividualLayoutConstraint: a constraint on window position
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxIndividualLayoutConstraint : public wxObject
+{
+    DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint)
+
+protected:
+    // To be allowed to modify the internal variables
+    friend class wxIndividualLayoutConstraint_Serialize;
+
+    // 'This' window is the parent or sibling of otherWin
+    wxWindowBase *otherWin;
+
+    wxEdge myEdge;
+    wxRelationship relationship;
+    int margin;
+    int value;
+    int percent;
+    wxEdge otherEdge;
+    bool done;
+
+public:
+    wxIndividualLayoutConstraint();
+    ~wxIndividualLayoutConstraint();
+
+    void Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val = 0, int marg = wxLAYOUT_DEFAULT_MARGIN);
+
+    //
+    // Sibling relationships
+    //
+    void LeftOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
+    void RightOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
+    void Above(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
+    void Below(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN);
+
+    //
+    // 'Same edge' alignment
+    //
+    void SameAs(wxWindowBase *otherW, wxEdge edge, int marg = wxLAYOUT_DEFAULT_MARGIN);
+
+    // The edge is a percentage of the other window's edge
+    void PercentOf(wxWindowBase *otherW, wxEdge wh, int per);
+
+    //
+    // Edge has absolute value
+    //
+    void Absolute(int val);
+
+    //
+    // Dimension is unconstrained
+    //
+    void Unconstrained() { relationship = wxUnconstrained; }
+
+    //
+    // Dimension is 'as is' (use current size settings)
+    //
+    void AsIs() { relationship = wxAsIs; }
+
+    //
+    // Accessors
+    //
+    wxWindowBase *GetOtherWindow() { return otherWin; }
+    wxEdge GetMyEdge() const { return myEdge; }
+    void SetEdge(wxEdge which) { myEdge = which; }
+    void SetValue(int v) { value = v; }
+    int GetMargin() { return margin; }
+    void SetMargin(int m) { margin = m; }
+    int GetValue() const { return value; }
+    int GetPercent() const { return percent; }
+    int GetOtherEdge() const { return otherEdge; }
+    bool GetDone() const { return done; }
+    void SetDone(bool d) { done = d; }
+    wxRelationship GetRelationship() { return relationship; }
+    void SetRelationship(wxRelationship r) { relationship = r; }
+
+    // Reset constraint if it mentions otherWin
+    bool ResetIfWin(wxWindowBase *otherW);
+
+    // Try to satisfy constraint
+    bool SatisfyConstraint(wxLayoutConstraints *constraints, wxWindowBase *win);
+
+    // Get the value of this edge or dimension, or if this
+    // is not determinable, -1.
+    int GetEdge(wxEdge which, wxWindowBase *thisWin, wxWindowBase *other) const;
+};
+
+// ----------------------------------------------------------------------------
+// wxLayoutConstraints: the complete set of constraints for a window
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxLayoutConstraints : public wxObject
 {
 {
-  DECLARE_DYNAMIC_CLASS(wxLayoutConstraints)
-
- public:
-  // Edge constraints
-  wxIndividualLayoutConstraint left;
-  wxIndividualLayoutConstraint top;
-  wxIndividualLayoutConstraint right;
-  wxIndividualLayoutConstraint bottom;
-  // Size constraints
-  wxIndividualLayoutConstraint width;
-  wxIndividualLayoutConstraint height;
-  // Centre constraints
-  wxIndividualLayoutConstraint centreX;
-  wxIndividualLayoutConstraint centreY;
-
-  wxLayoutConstraints(void);
-  ~wxLayoutConstraints(void);
-
-  bool SatisfyConstraints(wxWindow *win, int *noChanges);
+    DECLARE_DYNAMIC_CLASS(wxLayoutConstraints)
+
+public:
+    // Edge constraints
+    wxIndividualLayoutConstraint left;
+    wxIndividualLayoutConstraint top;
+    wxIndividualLayoutConstraint right;
+    wxIndividualLayoutConstraint bottom;
+    // Size constraints
+    wxIndividualLayoutConstraint width;
+    wxIndividualLayoutConstraint height;
+    // Centre constraints
+    wxIndividualLayoutConstraint centreX;
+    wxIndividualLayoutConstraint centreY;
+
+    wxLayoutConstraints();
+    ~wxLayoutConstraints();
+
+    bool SatisfyConstraints(wxWindowBase *win, int *noChanges);
+    bool AreSatisfied() const
+    {
+        return left.GetDone() && top.GetDone() && right.GetDone() &&
+               bottom.GetDone() && centreX.GetDone() && centreY.GetDone();
+    }
 };
 
 };
 
-bool WXDLLEXPORT wxOldDoLayout(wxWindow *win);
+// ----------------------------------------------------------------------------
+// sizers
+// ----------------------------------------------------------------------------
 
 /*
 
 
 /*
 
@@ -156,7 +206,7 @@ Algorithm:
  Each sizer has a Layout function.
 
  wxExpandSizer::Layout                  ; E.g. for resizeable windows
  Each sizer has a Layout function.
 
  wxExpandSizer::Layout                  ; E.g. for resizeable windows
+
    - parent size must be known (i.e. called
       from OnSize or explicitly)
    - call Layout on each child to give it a chance to resize
    - parent size must be known (i.e. called
       from OnSize or explicitly)
    - call Layout on each child to give it a chance to resize
@@ -166,7 +216,7 @@ Algorithm:
 
  wxShrinkSizer::Layout                  ; E.g. fit-to-contents windows
                                         ; Perhaps 2 rowcols, one above other.
 
  wxShrinkSizer::Layout                  ; E.g. fit-to-contents windows
                                         ; Perhaps 2 rowcols, one above other.
+
    - call Layout on each child to give it a chance to resize
      (e.g. child shrinks around its own children):
      stop when each returns TRUE, or no change
    - call Layout on each child to give it a chance to resize
      (e.g. child shrinks around its own children):
      stop when each returns TRUE, or no change
@@ -185,120 +235,117 @@ Algorithm:
 
 How to relayout if a child sizer/window changes? Need to go all the way
 to the top of the hierarchy and call Layout() again.
 
 How to relayout if a child sizer/window changes? Need to go all the way
 to the top of the hierarchy and call Layout() again.
-     
+
  wxRowColSizer::Layout
 
    - Similar to wxShrinkSizer only instead of shrinking to fit
      contents, more sophisticated layout of contents, and THEN
      shrinking (possibly).
    - Do the same parent window check/setsize as for wxShrinkSizer.
  wxRowColSizer::Layout
 
    - Similar to wxShrinkSizer only instead of shrinking to fit
      contents, more sophisticated layout of contents, and THEN
      shrinking (possibly).
    - Do the same parent window check/setsize as for wxShrinkSizer.
+
 */
 
 */
 
-typedef enum {
-    wxSizerShrink,
-    wxSizerExpand,
-    wxSizerNone
-} wxSizerBehaviour;
+class WXDLLEXPORT wxSizer : public wxWindow
+{
+    DECLARE_DYNAMIC_CLASS(wxSizer)
 
 
-#define wxTYPE_SIZER        90
+protected:
+    wxSizerBehaviour sizerBehaviour;
+    int borderX;
+    int borderY;
+    int sizerWidth;
+    int sizerHeight;
+    int sizerX;
+    int sizerY;
 
 
-class WXDLLEXPORT wxSizer: public wxWindow
-{
-  DECLARE_DYNAMIC_CLASS(wxSizer)
-
- private:
- protected:
-  wxSizerBehaviour sizerBehaviour;
-  int borderX;
-  int borderY;
-  int sizerWidth;
-  int sizerHeight;
-  int sizerX;
-  int sizerY;
- public:
-  wxSizer(void);
-  wxSizer(wxWindow *parent, wxSizerBehaviour behav = wxSizerNone);
-  ~wxSizer(void);
-
-  bool Create(wxWindow *parent, wxSizerBehaviour behav = wxSizerNone);
-  virtual void SetSize(int x, int y, int w, int h, int flags = wxSIZE_AUTO);
-  // Avoid compiler warning
-  void SetSize(int w, int h) { wxWindow::SetSize(w, h); }
-  virtual void Move(int x, int y);
-  virtual void GetSize(int *w, int *h) const;
-  inline virtual void GetClientSize(int *w, int *h) const { GetSize(w, h); }
-  virtual void GetPosition(int *x, int *y) const;
-
-  inline void SizerSetSize(int x, int y, int w, int h)
-    { SetSize(x, y, w, h); }
-  inline void SizerMove(int x, int y)
-    { Move(x, y); }
-
-  virtual void SetBorder(int w, int h);
-  inline int GetBorderX(void) { return borderX ; }
-  inline int GetBorderY(void) { return borderY ; }
-
-  virtual void AddSizerChild(wxWindow *child);
-  virtual void RemoveSizerChild(wxWindow *child);
-
-  inline virtual void SetBehaviour(wxSizerBehaviour b) { sizerBehaviour = b; }
-  inline virtual wxSizerBehaviour GetBehaviour(void) { return sizerBehaviour; }
-
-  virtual bool LayoutPhase1(int *);
-  virtual bool LayoutPhase2(int *);
+public:
+    wxSizer();
+    wxSizer(wxWindowBase *parent, wxSizerBehaviour behav = wxSizerNone);
+    ~wxSizer();
+
+    bool Create(wxWindowBase *parent, wxSizerBehaviour behav = wxSizerNone);
+
+    virtual void DoGetSize(int *w, int *h) const;
+    virtual void DoGetClientSize(int *w, int *h) const { GetSize(w, h); }
+    virtual void DoGetPosition(int *x, int *y) const;
+
+    void SizerSetSize(int x, int y, int w, int h) { SetSize(x, y, w, h); }
+    void SizerMove(int x, int y) { Move(x, y); }
+
+    virtual void SetBorder(int w, int h);
+    int GetBorderX() { return borderX ; }
+    int GetBorderY() { return borderY ; }
+
+    virtual void AddSizerChild(wxWindowBase *child);
+    virtual void RemoveSizerChild(wxWindowBase *child);
+
+    virtual void SetBehaviour(wxSizerBehaviour b) { sizerBehaviour = b; }
+    virtual wxSizerBehaviour GetBehaviour() { return sizerBehaviour; }
+
+    virtual bool LayoutPhase1(int *);
+    virtual bool LayoutPhase2(int *);
+
+protected:
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
 };
 
 #define wxSIZER_ROWS  TRUE
 #define wxSIZER_COLS  FALSE
 
 };
 
 #define wxSIZER_ROWS  TRUE
 #define wxSIZER_COLS  FALSE
 
-class WXDLLEXPORT wxRowColSizer: public wxSizer
+class WXDLLEXPORT wxRowColSizer : public wxSizer
 {
 {
-  DECLARE_DYNAMIC_CLASS(wxRowColSizer)
-
- private:
- protected:
-  bool rowOrCol;
-  int rowOrColSize;
-  int xSpacing;
-  int ySpacing;
- public:
-  // rowOrCol = TRUE to be laid out in rows, otherwise in columns.
-  wxRowColSizer(void);
-  wxRowColSizer(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
-  ~wxRowColSizer(void);
-
-  bool Create(wxWindow *parent, bool rowOrCol = wxSIZER_ROWS, int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
-  void SetSize(int x, int y, int w, int h, int flags = wxSIZE_AUTO);
-  // Avoid compiler warning
-  void SetSize(int w, int h) { wxSizer::SetSize(w, h); }
-
-  inline virtual void SetRowOrCol(bool rc) { rowOrCol = rc; }
-  inline virtual bool GetRowOrCol(void) { return rowOrCol; }
-  inline virtual void SetRowOrColSize(int n) { rowOrColSize = n; }
-  inline virtual int GetRowOrColSize(void) { return rowOrColSize; }
-  inline virtual void SetSpacing(int x, int y) { xSpacing = x; ySpacing = y; }
-  inline virtual void GetSpacing(int *x, int *y) { *x = xSpacing; *y = ySpacing; }
-
-  bool LayoutPhase1(int *);
-  bool LayoutPhase2(int *);
+    DECLARE_DYNAMIC_CLASS(wxRowColSizer)
+
+protected:
+    bool rowOrCol;
+    int rowOrColSize;
+    int xSpacing;
+    int ySpacing;
+
+public:
+    // rowOrCol = TRUE to be laid out in rows, otherwise in columns.
+    wxRowColSizer();
+    wxRowColSizer(wxWindowBase *parent, bool rowOrCol = wxSIZER_ROWS,
+                  int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
+    ~wxRowColSizer();
+
+    bool Create(wxWindowBase *parent, bool rowOrCol = wxSIZER_ROWS,
+                int rowsOrColSize = 20, wxSizerBehaviour = wxSizerShrink);
+
+    virtual void SetRowOrCol(bool rc) { rowOrCol = rc; }
+    virtual bool GetRowOrCol() { return rowOrCol; }
+    virtual void SetRowOrColSize(int n) { rowOrColSize = n; }
+    virtual int GetRowOrColSize() { return rowOrColSize; }
+    virtual void SetSpacing(int x, int y) { xSpacing = x; ySpacing = y; }
+    virtual void GetSpacing(int *x, int *y) { *x = xSpacing; *y = ySpacing; }
+
+    bool LayoutPhase1(int *);
+    bool LayoutPhase2(int *);
 };
 
 };
 
-class WXDLLEXPORT wxSpacingSizer: public wxSizer
+class WXDLLEXPORT wxSpacingSizer : public wxSizer
 {
 {
-  DECLARE_DYNAMIC_CLASS(wxSpacingSizer)
-
- private:
- protected:
- public:
-  wxSpacingSizer(void);
-  wxSpacingSizer(wxWindow *parent, wxRelationship rel, wxWindow *other, int spacing);
-  wxSpacingSizer(wxWindow *parent);
-  ~wxSpacingSizer(void);
-
-  bool Create(wxWindow *parent, wxRelationship rel, wxWindow *other, int sp);
-  bool Create(wxWindow *parent);
+    DECLARE_DYNAMIC_CLASS(wxSpacingSizer)
+
+public:
+    wxSpacingSizer();
+    wxSpacingSizer(wxWindowBase *parent, wxRelationship rel, wxWindowBase *other, int spacing);
+    wxSpacingSizer(wxWindowBase *parent);
+    ~wxSpacingSizer();
+
+    bool Create(wxWindowBase *parent, wxRelationship rel, wxWindowBase *other, int sp);
+    bool Create(wxWindowBase *parent);
 };
 
 };
 
+// ----------------------------------------------------------------------------
+// global functions
+// ----------------------------------------------------------------------------
+
+#if WXWIN_COMPATIBILITY
+    extern bool WXDLLEXPORT wxOldDoLayout(wxWindowBase *win);
+#endif // WXWIN_COMPATIBILITY
+
 #endif
 #endif
-    // __LAYOUTH__
+    // _WX_LAYOUTH__