#ifndef WXSDEFSIZER_H
#define WXSDEFSIZER_H

#include "wxscontainer.h"
#include "defwidgets/wxsstdmanager.h"
#include <vector>

/** Structure containing additional parameters for each widget insidee sizer */
struct wxsSizerExtraParams
{    
    enum PlacementType              ///< Values used in Placement member
    {
        LeftTop = 0,
        CenterTop,
        RightTop,
        LeftCenter,
        Center,
        RightCenter,
        LeftBottom,
        CenterBottom,
        RightBottom
    };
    
    enum BorderFlagsValues          ///< Values which can be used in BorderFlags (ored values)
    {
        None   = 0,
        Top    = 1,
        Bottom = 2,
        Left   = 4,
        Right  = 8
    };
    
    int  Proportion;                ///< Proportion param (see wxW documentation for details)
    int  BorderFlags;               ///< Which sides should use additional bordeer ?
    bool Expand;                    ///< Expand flag
    bool Shaped;                    ///< Shaped flag
    bool FixedMinSize;              ///< FixedMinSize flag
    int  Placement;                 ///< Placement of this element
    int  Border;                    ///< Size of additional border (in pixels)
    
    wxsSizerExtraParams():
        Proportion(1),
        BorderFlags(Top|Bottom|Left|Right),
        Expand(false),
        Shaped(false),
        FixedMinSize(false),
        Placement(Center),
        Border(5)
    {}
};

/** Macro starting declaration of sizer class */
#define wxsDSDeclareBegin(Name,SizerId)                                 \
    class wxs##Name: public wxsDefSizer                                 \
    {                                                                   \
        public:                                                         \
            wxs##Name(wxsWidgetManager* Man,wxsWindowRes* Res):         \
                wxsDefSizer(Man,Res,propSizer)                          \
            {                                                           \
                Init();                                                 \
            }                                                           \
                                                                        \
            virtual const wxsWidgetInfo& GetInfo()                      \
            {                                                           \
            	return *wxsStdManager.GetWidgetInfo(SizerId);           \
            }                                                           \
                                                                        \
            virtual wxString GetProducingCode(wxsCodeParams& Params);   \
                                                                        \
            virtual wxString GetDeclarationCode(wxsCodeParams& Params)  \
            {                                                           \
                return wxString::Format(_T("wx") _T(#Name) _T("* %s;"), \
                    GetBaseParams().VarName.c_str());                   \
            }                                                           \
                                                                        \
            virtual wxSizer* ProduceSizer(wxWindow* Panel);             \
                                                                        \
        protected:                                                      \
                                                                        \
            virtual bool MyXmlLoad();                                   \
            virtual bool MyXmlSave();                                   \
            virtual void CreateObjectProperties();                      \
            virtual void Init();                                        \
                                                                        \
        private:

/** Macro finishing declaration of sizer class */        
#define wxsDSDeclareEnd()                                               \
    };

/** Base class for sizers */
class wxsDefSizer : public wxsContainer
{
	public:
		wxsDefSizer(wxsWidgetManager* Man,wxsWindowRes* Res,BasePropertiesType pType = propSizer);
		virtual ~wxsDefSizer();

        virtual wxString GetFinalizingCode(wxsCodeParams& Params);
        
        /** This function should produce sizer with properties handled by this objeect */
        virtual wxSizer* ProduceSizer(wxWindow* Panel) = 0;
        
        /** Getting wxsSierExtraParams for given widget */
        inline wxsSizerExtraParams* GetExtraParams(int Index)
        {
        	return (wxsSizerExtraParams*)GetExtra(Index);
        }
        
    protected:
    
        virtual bool XmlLoadChild(TiXmlElement* Element);
        virtual bool XmlSaveChild(int ChildIndex,TiXmlElement* AddHere);
        virtual void AddChildProperties(int ChildIndex);
        
        virtual wxWindow* MyCreatePreview(wxWindow* Parent);
        virtual void MyFinalUpdatePreview(wxWindow* Preview);
        
        virtual void* NewExtra() { return new wxsSizerExtraParams; }
        virtual void DelExtra(void* Data) { delete (wxsSizerExtraParams*)Data; }
        
    private:
    
        bool LoadSizerStuff(wxsSizerExtraParams* Params,TiXmlElement* Elem);
        bool SaveSizerStuff(wxsSizerExtraParams* Params,TiXmlElement* Elem);
        wxString GetFlagToSizer(wxsSizerExtraParams* Params);

};

#endif


syntax highlighted by Code2HTML, v. 0.9.1