#include "../wxsheaders.h"
#include "wxssplitterwindow.h"

#include <wx/splitter.h>
#include "../properties/wxsenumproperty.h"

WXS_ST_BEGIN(wxsSplitterWindowStyles)
    WXS_ST_CATEGORY("wxSplitterWindow")
    WXS_ST(wxSP_3D)
    WXS_ST(wxSP_3DSASH)
    WXS_ST(wxSP_3DBORDER)
    WXS_ST(wxSP_BORDER)
    WXS_ST(wxSP_NOBORDER)
    WXS_ST(wxSP_NO_XP_THEME)
    WXS_ST(wxSP_PERMIT_UNSPLIT)
    WXS_ST(wxSP_LIVE_UPDATE)
WXS_ST_END(wxsSplitterWindowStyles)

WXS_EV_BEGIN(wxsSplitterWindowEvents)
    WXS_EVI(EVT_SPLITTER_SASH_POS_CHANGING,wxSplitterEvent,SashPosChanging)
    WXS_EVI(EVT_SPLITTER_SASH_POS_CHANGED,wxSplitterEvent,SashPosChanged)
    WXS_EVI(EVT_SPLITTER_UNSPLIT,wxSplitterEvent,Unsplit)
    WXS_EVI(EVT_SPLITTER_DCLICK,wxSplitterEvent,DClick)
WXS_EV_END(wxsSplitterWindowEvents)


wxsSplitterWindow::wxsSplitterWindow(wxsWidgetManager* Man,wxsWindowRes* Res):
    wxsContainer(Man,Res,true,2,propWidget),
    SashPos(0),
    MinSize(-1),
    Orientation(wxHORIZONTAL)
{
}

wxsSplitterWindow::~wxsSplitterWindow()
{
}

int wxsSplitterWindow::AddChild(wxsWidget* NewWidget,int InsertBeforeThis)
{
	if ( GetChildCount() == 2 )
	{
		wxMessageBox(_("Splitter can have 2 children max"));
		return -1;
	}

	if ( NewWidget->GetInfo().Sizer )
	{
		wxMessageBox(_("Can not add sizer into Splitter.\nAdd panels first"));
		return -1;
	}

	if ( NewWidget->GetInfo().Spacer )
	{
		wxMessageBox(_("Spacer can be added to sizers only"));
		return -1;
	}

	return wxsContainer::AddChild(NewWidget,InsertBeforeThis);
}

wxWindow* wxsSplitterWindow::MyCreatePreview(wxWindow* Parent)
{
	return new wxSplitterWindow(Parent,-1,GetPosition(),GetSize(),GetStyle());
}

void wxsSplitterWindow::MyFinalUpdatePreview(wxWindow* Preview)
{
	wxSplitterWindow* Wnd = (wxSplitterWindow*)Preview;
	if ( MinSize >= 0 ) Wnd->SetMinimumPaneSize(MinSize);
	if ( GetChildCount() == 0 ) return;
	if ( GetChildCount() == 1 )
	{
		Wnd->Initialize(GetChild(0)->GetPreview());
		return;
	}

	if ( Orientation==wxVERTICAL )
	{
		Wnd->SplitVertically(GetChild(0)->GetPreview(),GetChild(1)->GetPreview(),SashPos);
	}
	else
	{
		Wnd->SplitHorizontally(GetChild(0)->GetPreview(),GetChild(1)->GetPreview(),SashPos);
	}
}

wxString wxsSplitterWindow::GetProducingCode(wxsCodeParams& Params)
{
	const CodeDefines& CD = GetCodeDefines();
	return wxString::Format(
        _T("%s = new wxSplitterWindow(%s,%s,%s,%s,%s);"),
        BaseParams.VarName.c_str(),
        Params.ParentName.c_str(),
        BaseParams.IdName.c_str(),
        CD.Pos.c_str(),
        CD.Size.c_str(),
        CD.Style.c_str());
}

wxString wxsSplitterWindow::GetFinalizingCode(wxsCodeParams& Params)
{
	wxString Code;
	if ( MinSize >= 0 )
	{
		Code.Printf(_T("%s->SetMinimumPaneSize(%d);\n"),BaseParams.VarName.c_str(),MinSize);
	}

	if ( GetChildCount() == 0 ) return Code;
	if ( GetChildCount() == 1 )
	{
		return Code + wxString::Format(_T("%s->Initialize(%s);\n"),
            BaseParams.VarName.c_str(),
            GetChild(0)->GetBaseParams().VarName.c_str());
	}

	if ( Orientation==wxVERTICAL )
	{
		return Code + wxString::Format(_T("%s->SplitVertically(%s,%s,%d);\n"),
            BaseParams.VarName.c_str(),
            GetChild(0)->GetBaseParams().VarName.c_str(),
            GetChild(1)->GetBaseParams().VarName.c_str(),
            SashPos);
	}
    return Code + wxString::Format(_T("%s->SplitHorizontally(%s,%s,%d);\n"),
        BaseParams.VarName.c_str(),
        GetChild(0)->GetBaseParams().VarName.c_str(),
        GetChild(1)->GetBaseParams().VarName.c_str(),
        SashPos);
}

wxString wxsSplitterWindow::GetDeclarationCode(wxsCodeParams& Params)
{
	return wxString::Format(_T("wxSplitterWindow* %s;"),BaseParams.VarName.c_str());
}

bool wxsSplitterWindow::MyXmlLoad()
{
	wxString Value = XmlGetVariable(_T("orientation"));
	Orientation = ( Value == _T("vertical") ) ? wxVERTICAL : wxHORIZONTAL;
	SashPos = XmlGetInteger(_T("sashpos"),0);
	MinSize = XmlGetInteger(_T("minsize"),-1);
    return true;
}

bool wxsSplitterWindow::MyXmlSave()
{
    if ( Orientation == wxVERTICAL ) XmlSetVariable(_T("orientation"),_T("vertical"));
    if ( SashPos != 0 ) XmlSetInteger(_T("sashpos"),SashPos);
    if ( MinSize >= 0 ) XmlSetInteger(_T("minsize"),MinSize);
    return true;
}


void wxsSplitterWindow::CreateObjectProperties()
{
	static const wxChar* Names[] = { _("Horizontal"), _("Vertical"), NULL };
	static long Values[] = { wxHORIZONTAL, wxVERTICAL };
    wxsWidget::CreateObjectProperties();
    PropertiesObject.AddProperty( _("Sash Position:"), SashPos,0);
    PropertiesObject.AddProperty( _("Min panel size:"),MinSize,1);
    PropertiesObject.AddProperty( _("Orientation:"), new wxsEnumProperty(&PropertiesObject,Orientation,Names,Values), 2);
}



syntax highlighted by Code2HTML, v. 0.9.1