#include "../wxsheaders.h"
#include "wxsstdmanager.h"

#include "wxsbutton.h"
#include "wxsframe.h"
#include "wxspanel.h"
#include "wxsdialog.h"
#include "wxsgridsizer.h"
#include "wxsstatictext.h"
#include "wxscheckbox.h"
#include "wxstogglebutton.h"
#include "wxscombobox.h"
#include "wxslistbox.h"
#include "wxsspacer.h"
#include "wxsboxsizer.h"
#include "wxsstaticboxsizer.h"
#include "wxsflexgridsizer.h"
#include "wxstextctrl.h"
#include "wxsgauge.h"
#include "wxsradiobutton.h"
#include "wxsscrollbar.h"
#include "wxsspinbutton.h"
#include "wxsspinctrl.h"
#include "wxstreectrl.h"
#include "wxsradiobox.h"
#include "wxsdatepickerctrl.h"
#include "wxsstaticline.h"
#include "wxssplitterwindow.h"
#include "wxsnotebook.h"
#include "wxslistbook.h"


#include <wx/xrc/xmlres.h>
#include <configmanager.h>
#include <wx/fs_zip.h>

/******************************************************************************/
/* Infos for standard widgets                                                 */
/******************************************************************************/

static const wxString DefLicence     = _("wxWidgets License");
static const wxString DefAuthor      = _("wxWidgets Team");
static const wxString DefAuthorEmail = _T("");
static const wxString DefAuthorSite  = _("www.wxwidgets.org");
static const wxString DefCategory    = _("Standard");
static const wxString DefSizerCat    = _("Layout");


#define Entry2Headers(Name,Link,Header1,Header2)        \
    {   _T("wx") _T(#Name),                             \
        DefLicence,                                     \
        DefAuthor,                                      \
        DefAuthorEmail,                                 \
        DefAuthorSite,                                  \
        _T("http://www.wxwidgets.org/manuals/2.6.2/") _T(Link),  \
        DefCategory,                                    \
        _T(#Name),                                      \
        false,                                          \
        false,                                          \
        false,                                          \
        2, 6,                                           \
        NULL,                                           \
        &wxsStdManager,                                 \
        wxs##Name##Id,                                  \
        0,                                              \
        wxs##Name##Styles,                              \
        wxs##Name##Events,                              \
        _T(Header1),                                    \
        _T(Header2),                                    \
        wxsWidgetInfo::exNone                           \
    },

#define Entry(Name,Link,Header)                         \
    Entry2Headers(Name,Link,Header,"")

#define WindowEntry(Name,Link,Header)                   \
    {   _T("wx") _T(#Name),                             \
        DefLicence,                                     \
        DefAuthor,                                      \
        DefAuthorEmail,                                 \
        DefAuthorSite,                                  \
        _T("http://www.wxwidgets.org/manuals/2.6.2/") _T(Link),  \
        _T(""),                                         \
        _T(""),                                         \
        false,                                          \
        false,                                          \
        false,                                          \
        2, 6,                                           \
        NULL,                                           \
        &wxsStdManager,                                 \
        wxs##Name##Id,                                  \
        0,                                              \
        wxs##Name##Styles,                              \
        wxs##Name##Events,                              \
        _T(Header),                                     \
        _T(""),                                         \
        wxsWidgetInfo::exNone                           \
    },

#define SpacerEntry()                                   \
    {   _T("Spacer"),                                   \
        DefLicence,                                     \
        DefAuthor,                                      \
        DefAuthorEmail,                                 \
        DefAuthorSite,                                  \
        _T("http://www.wxwidgets.org/manuals/2.6.2/wx_wxsizer.html#wxsizeradd"),    \
        DefSizerCat,                                    \
        _T(""),                                         \
        false,                                          \
        false,                                          \
        true,                                           \
        2, 6,                                           \
        NULL,                                           \
        &wxsStdManager,                                 \
        wxsSpacerId,                                    \
        0,                                              \
        NULL,                                           \
        NULL,                                           \
        _T("<wx/sizer.h>"),                             \
        _T(""),                                         \
        wxsWidgetInfo::exNone                           \
    },


#define SizerEntry(Name,Link,Header)                            \
    {   _T("wx") _T(#Name),                                     \
        DefLicence,                                             \
        DefAuthor,                                              \
        DefAuthorEmail,                                         \
        DefAuthorSite,                                          \
        _T("http://www.wxwidgets.org/manuals/2.6.2/") _T(Link), \
        DefSizerCat,                                            \
        _T(#Name),                                              \
        true,                                                   \
        true,                                                   \
        false,                                                  \
        2, 6,                                                   \
        NULL,                                                   \
        &wxsStdManager,                                         \
        wxs##Name##Id,                                          \
        0,                                                      \
        NULL,                                                   \
        NULL,                                                   \
        _T(Header),                                             \
        _T(""),                                                 \
        wxsWidgetInfo::exNone                                   \
    },


static wxsWidgetInfo StdInfos[] =
{
    { _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), false,
      false, false, 0, 0, NULL, NULL, wxsNoneId, 0, NULL, NULL, _T(""), _T(""),
      wxsWidgetInfo::exNone },  // NONE

    SizerEntry(GridSizer,"wx_wxgridsizer.html#wxgridsizer","<wx/sizer.h>")
    SizerEntry(BoxSizer,"wx_wxboxsizer.html#wxboxsizer","<wx/sizer.h>")
    SizerEntry(StaticBoxSizer,"wx_wxstaticboxsizer.html#wxstaticboxsizer","<wx/sizer.h>")
    SizerEntry(FlexGridSizer,"wx_wxflexgridsizer.html#wxflexgridsizer","<wx/sizer.h>")
    SpacerEntry()

    Entry(Button,      "wx_wxbutton.htm#wxbutton","<wx/button.h>")
    Entry(ToggleButton,"wx_wxtogglebutton.html#wxtogglebutton","<wx/tglbtn.h>")
    Entry(CheckBox,    "wx_wxcheckbox.html#wxcheckbox","<wx/checkbox.h>")
    Entry(StaticText,  "wx_wxstatictext.html#wxstatictext","<wx/stattext.h>")
    Entry(ComboBox,    "wx_wxcombobox.html#wxcombobox","<wx/combobox.h>")
    Entry(ListBox,     "wx_wxlistbox.html#wxlistbox","<wx/listbox.h>")
    Entry(Panel,       "wx_wxpanel.html#wxpanel","<wx/panel.h>")
    Entry(TextCtrl,    "wx_wxtextctrl.html#wxtextctrl","<wx/textctrl.h>")
    Entry(Gauge,       "wx_wxgauge.html#wxgauge","<wx/gauge.h>")
    Entry(RadioButton,   "wx_wxradiobutton.html#wxradiobutton","<wx/radiobut.h>")
    Entry(ScrollBar,     "wx_wxscrollbar.html#wxscrollbar","<wx/scrolbar.h>")
    Entry(SpinButton,    "wx_wxspinbutton.html#wxspinbutton","<wx/spinbutt.h>")
    Entry(SpinCtrl,      "wx_wxspinctrl.html#wxspinctrl","<wx/spinctrl.h>")
    Entry(TreeCtrl,      "wx_wxtreectrl.html#wxtreectrl","<wx/treectrl.h>")
    Entry(RadioBox,      "wx_wxradiobox.html#wxradiobox","<wx/radiobox.h>")
    Entry2Headers(DatePickerCtrl,"wx_wxdatepickerctrl.html#wxdatepickerctrl","<wx/datectrl.h>","<wx/dateevt.h>")
    Entry(StaticLine,    "wx_wxstaticline.html#wxstaticline","<wx/statline.h>")
    Entry(SplitterWindow,"wx_wxsplitterwindow.html#wxsplitterwindow","<wx/splitter.h>")
    Entry(Notebook,      "wx_wxnotebook.html#wxnotebook","<wx/notebook.h>")
    Entry(Listbook,      "wx_wxlistbook.html#wxlistbook","<wx/listbook.h>")

    WindowEntry(Dialog,"wx_wxdialog.html#wxdialog","<wx/dialog.h>")
    WindowEntry(Frame, "wx_wxframe.html#wxframe","<wx/frame.h>")
    WindowEntry(Panelr,"wx_wxpanel.html#wxpanel","<wx/panel.h>")

};

static const int StdInfosCnt = sizeof(StdInfos) / sizeof(StdInfos[0]);


wxsStdManagerT::wxsStdManagerT()
{
}

wxsStdManagerT::~wxsStdManagerT()
{
    for ( int i=0; i<StdInfosCnt; i++ )
    {
        if ( StdInfos[i].Icon )
        {
            delete StdInfos[i].Icon;
            StdInfos[i].Icon = NULL;
        }
    }
}

bool wxsStdManagerT::Initialize()
{
    wxString resPath = ConfigManager::Get()->Read(_T("data_path"), wxEmptyString);
    for ( int i=1; i<StdInfosCnt; i++ )
    {
        wxString FileName = resPath + _T("/images/wxsmith/") + StdInfos[i].Name + _T(".png");
        wxBitmap* Bmp = new wxBitmap;
        if ( wxFileName::FileExists(FileName) )
        {
            Bmp->LoadFile(FileName,wxBITMAP_TYPE_PNG);

            if ( Bmp->Ok() )
            {
                StdInfos[i].Icon = Bmp;
            }
            else
            {
                StdInfos[i].Icon = NULL;
                delete Bmp;
            }
        }
        else
        {
            StdInfos[i].Icon = NULL;
        }
    }
    return true;
}

int wxsStdManagerT::GetCount()
{
    return wxsStdIdCount;
}

/** Getting widget's info */
const wxsWidgetInfo* wxsStdManagerT::GetWidgetInfo(int Number)
{
    if ( Number < 0 || Number >= StdInfosCnt ) Number = wxsNoneId;
    assert ( StdInfos[Number].Id == Number );
    return &StdInfos[Number];
}

/** Getting new widget */
wxsWidget* wxsStdManagerT::ProduceWidget(int Id,wxsWindowRes* Res)
{
    switch ( Id )
    {
        case wxsGridSizerId:        return new wxsGridSizer(this,Res);
        case wxsBoxSizerId:         return new wxsBoxSizer(this,Res);
        case wxsStaticBoxSizerId:   return new wxsStaticBoxSizer(this,Res);
        case wxsFlexGridSizerId:    return new wxsFlexGridSizer(this,Res);
        case wxsButtonId:           return new wxsButton(this,Res);
        case wxsCheckBoxId:         return new wxsCheckBox(this,Res);
        case wxsStaticTextId:       return new wxsStaticText(this,Res);
        case wxsToggleButtonId:     return new wxsToggleButton(this,Res);
        case wxsComboBoxId:         return new wxsComboBox(this,Res);
        case wxsListBoxId:          return new wxsListBox(this,Res);
        case wxsPanelId:            return new wxsPanel(this,Res);
        case wxsTextCtrlId:         return new wxsTextCtrl(this,Res);
        case wxsGaugeId:            return new wxsGauge(this,Res);
        case wxsSpacerId:           return new wxsSpacer(this,Res);
        case wxsDialogId:           return new wxsDialog(this,Res);
        case wxsFrameId:            return new wxsFrame(this,Res);
        case wxsPanelrId:           return new wxsPanelr(this,Res);
        case wxsRadioButtonId:      return new wxsRadioButton(this,Res);
        case wxsScrollBarId:        return new wxsScrollBar(this,Res);
        case wxsSpinButtonId:       return new wxsSpinButton(this,Res);
        case wxsSpinCtrlId:         return new wxsSpinCtrl(this,Res);
        case wxsTreeCtrlId:         return new wxsTreeCtrl(this,Res);
        case wxsRadioBoxId:         return new wxsRadioBox(this,Res);
        case wxsDatePickerCtrlId:   return new wxsDatePickerCtrl(this,Res);
        case wxsStaticLineId:       return new wxsStaticLine(this,Res);
        case wxsSplitterWindowId:   return new wxsSplitterWindow(this,Res);
        case wxsNotebookId:         return new wxsNotebook(this,Res);
        case wxsListbookId:         return new wxsListbook(this,Res);
    }

    return NULL;
}

/** Killing widget */
void wxsStdManagerT::KillWidget(wxsWidget* Widget)
{
    if ( Widget ) delete Widget;
}

wxsStdManagerT wxsStdManager;


syntax highlighted by Code2HTML, v. 0.9.1