packages feed

wxc-0.90: src/cpp/eljrc.cpp

#include "wrapper.h"
#include <wx/xrc/xmlres.h>

#ifdef wxUSE_STC
# include "wx/stc/stc.h"
#endif

class wxMDIParentFrameXmlHandler : public wxXmlResourceHandler
{
public:
    wxMDIParentFrameXmlHandler();
    virtual wxObject *DoCreateResource();
    virtual bool CanHandle(wxXmlNode *node);
};

class wxMDIChildFrameXmlHandler : public wxXmlResourceHandler
{
public:
    wxMDIChildFrameXmlHandler();
    virtual wxObject *DoCreateResource();
    virtual bool CanHandle(wxXmlNode *node);
};

class wxSplitterWindowXmlHandler : public wxXmlResourceHandler
{
public:
    wxSplitterWindowXmlHandler();
    virtual wxObject *DoCreateResource();
    virtual bool CanHandle(wxXmlNode *node);
};

#ifdef wxUSE_STC
class wxStyledTextCtrlXmlHandler : public wxXmlResourceHandler
{
public:
    wxStyledTextCtrlXmlHandler();
    virtual wxObject *DoCreateResource();
    virtual bool CanHandle(wxXmlNode *node);
};
#endif

class wxGridXmlHandler : public wxXmlResourceHandler
{
public:
    wxGridXmlHandler();
    virtual wxObject *DoCreateResource();
    virtual bool CanHandle(wxXmlNode *node);
};

wxMDIParentFrameXmlHandler::wxMDIParentFrameXmlHandler() : wxXmlResourceHandler()
{
    XRC_ADD_STYLE(wxSTAY_ON_TOP);
    XRC_ADD_STYLE(wxCAPTION);
    XRC_ADD_STYLE(wxDEFAULT_DIALOG_STYLE);
    XRC_ADD_STYLE(wxDEFAULT_FRAME_STYLE);
    XRC_ADD_STYLE(wxSYSTEM_MENU);
    XRC_ADD_STYLE(wxRESIZE_BORDER);

    XRC_ADD_STYLE(wxFRAME_TOOL_WINDOW);
    XRC_ADD_STYLE(wxFRAME_FLOAT_ON_PARENT);
    XRC_ADD_STYLE(wxMAXIMIZE_BOX);
    XRC_ADD_STYLE(wxMINIMIZE_BOX);
    XRC_ADD_STYLE(wxSTAY_ON_TOP);

    XRC_ADD_STYLE(wxTAB_TRAVERSAL);
    XRC_ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY);
    XRC_ADD_STYLE(wxCLIP_CHILDREN);

    AddWindowStyles();
}

wxObject *wxMDIParentFrameXmlHandler::DoCreateResource()
{
    XRC_MAKE_INSTANCE(frame, wxMDIParentFrame);

    frame->Create(m_parentAsWindow,
                  GetID(),
                  GetText(wxT("title")),
                  wxDefaultPosition, wxDefaultSize,
                  GetStyle(wxT("style"), wxDEFAULT_FRAME_STYLE),
                  GetName());

    if (HasParam(wxT("size")))
        frame->SetClientSize(GetSize());
    if (HasParam(wxT("pos")))
        frame->Move(GetPosition());

    SetupWindow(frame);

    CreateChildren(frame);

    if (GetBool(wxT("centered"), FALSE))
        frame->Centre();

    return frame;
}

bool wxMDIParentFrameXmlHandler::CanHandle(wxXmlNode *node)
{
    return IsOfClass(node, wxT("wxMDIParentFrame"));
}

wxMDIChildFrameXmlHandler::wxMDIChildFrameXmlHandler() : wxXmlResourceHandler()
{
    XRC_ADD_STYLE(wxSTAY_ON_TOP);
    XRC_ADD_STYLE(wxCAPTION);
    XRC_ADD_STYLE(wxDEFAULT_DIALOG_STYLE);
    XRC_ADD_STYLE(wxDEFAULT_FRAME_STYLE);
    XRC_ADD_STYLE(wxSYSTEM_MENU);
    XRC_ADD_STYLE(wxRESIZE_BORDER);

    XRC_ADD_STYLE(wxFRAME_TOOL_WINDOW);
    XRC_ADD_STYLE(wxFRAME_FLOAT_ON_PARENT);
    XRC_ADD_STYLE(wxMAXIMIZE_BOX);
    XRC_ADD_STYLE(wxMINIMIZE_BOX);
    XRC_ADD_STYLE(wxSTAY_ON_TOP);

    XRC_ADD_STYLE(wxTAB_TRAVERSAL);
    XRC_ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY);
    XRC_ADD_STYLE(wxCLIP_CHILDREN);

    AddWindowStyles();
}

wxObject *wxMDIChildFrameXmlHandler::DoCreateResource()
{
    XRC_MAKE_INSTANCE(frame, wxMDIChildFrame);
	
	wxMDIParentFrame* prt = wxDynamicCast (m_parentAsWindow, wxMDIParentFrame);

	if (prt == NULL)
	{
		wxLogError(wxT("Error in resource: wxMDIChildFrame has no wxMDIParentFrame."));
		return NULL;
	}

    frame->Create(prt,
                  GetID(),
                  GetText(wxT("title")),
                  wxDefaultPosition, wxDefaultSize,
                  GetStyle(wxT("style"), wxDEFAULT_FRAME_STYLE),
                  GetName());

    SetupWindow(frame);

    CreateChildren(frame);

    if (GetBool(wxT("centered"), FALSE))
        frame->Centre();

    return frame;
}

bool wxMDIChildFrameXmlHandler::CanHandle(wxXmlNode *node)
{
    return IsOfClass(node, wxT("wxMDIChildFrame"));
}

wxSplitterWindowXmlHandler::wxSplitterWindowXmlHandler() : wxXmlResourceHandler()
{
    XRC_ADD_STYLE(wxSP_3D);
    XRC_ADD_STYLE(wxSP_3DSASH);
    XRC_ADD_STYLE(wxSP_BORDER);
    XRC_ADD_STYLE(wxSP_NOBORDER);
    XRC_ADD_STYLE(wxSP_PERMIT_UNSPLIT);
    XRC_ADD_STYLE(wxSP_LIVE_UPDATE);

    XRC_ADD_STYLE(wxTAB_TRAVERSAL);
    XRC_ADD_STYLE(wxCLIP_CHILDREN);

    AddWindowStyles();
}

wxObject *wxSplitterWindowXmlHandler::DoCreateResource()
{
    XRC_MAKE_INSTANCE(frame, wxSplitterWindow);

    frame->Create(m_parentAsWindow,
                  GetID(),
                  wxDefaultPosition, wxDefaultSize,
                  GetStyle(wxT("style"), wxSP_3D),
                  GetName());

    SetupWindow(frame);

    CreateChildren(frame);
	
	if (frame->GetChildren().GetCount() != 2)
	{
		wxLogError(wxT("Error in resource: Splitter window needs exactly two children."));
		return NULL;
	}
	
	frame->SetSplitMode(GetLong (wxT("splitmode"), wxSPLIT_VERTICAL));
	long sashpos = GetLong (wxT("sashposition"), 100);
	
	wxWindowList::compatibility_iterator node = frame->GetChildren().GetFirst();
	wxWindow* wnd1 = node->GetData();
	wxWindow* wnd2 = node->GetNext()->GetData();

	if (frame->GetSplitMode() == wxSPLIT_VERTICAL)
		frame->SplitVertically (wnd1, wnd2, sashpos);
	else
		frame->SplitHorizontally (wnd1, wnd2, sashpos);
	
    return frame;
}

bool wxSplitterWindowXmlHandler::CanHandle(wxXmlNode *node)
{
    return IsOfClass(node, wxT("wxSplitterWindow"));
}

#ifdef wxUSE_STC
wxStyledTextCtrlXmlHandler::wxStyledTextCtrlXmlHandler() : wxXmlResourceHandler()
{
    AddWindowStyles();
}

wxObject *wxStyledTextCtrlXmlHandler::DoCreateResource()
{
    XRC_MAKE_INSTANCE(frame, wxStyledTextCtrl);
	
    frame->Create(m_parentAsWindow,
                  GetID(),
                  wxDefaultPosition, wxDefaultSize,
                  GetStyle(wxT("style"), 0),
                  GetName());

    if (HasParam(wxT("size")))
        frame->SetSize(GetSize());
    if (HasParam(wxT("pos")))
        frame->Move(GetPosition());

    SetupWindow(frame);

    return frame;
}

bool wxStyledTextCtrlXmlHandler::CanHandle(wxXmlNode *node)
{
    return IsOfClass(node, wxT("wxStyledTextCtrl"));
}
#endif

wxGridXmlHandler::wxGridXmlHandler() : wxXmlResourceHandler()
{
    XRC_ADD_STYLE(wxTAB_TRAVERSAL);
    XRC_ADD_STYLE(wxCLIP_CHILDREN);

    AddWindowStyles();
}

wxObject *wxGridXmlHandler::DoCreateResource()
{
	wxGrid* grid = new wxGrid(m_parentAsWindow,
                              GetID(),
                              wxDefaultPosition, wxDefaultSize,
                              GetStyle(wxT("style"), wxWANTS_CHARS),
                              GetName());

	long cols = GetLong (wxT("numcols"), 0);
	long rows = GetLong (wxT("numrows"), 0);
	
	if (cols && rows)
		grid->CreateGrid(cols, rows, (wxGrid::wxGridSelectionModes)GetLong (wxT("selmode"), 0));
	
    if (HasParam(wxT("size")))
        grid->SetSize(GetSize());
    if (HasParam(wxT("pos")))
        grid->Move(GetPosition());

	SetupWindow(grid);

	return grid;
}

bool wxGridXmlHandler::CanHandle(wxXmlNode *node)
{
    return IsOfClass(node, wxT("wxGrid"));
}

extern "C"
{

EWXWEXPORT(bool,wxXmlResource_Load)(wxXmlResource* self,wxString* filemask)
{
	wxGetApp().InitZipFileSystem();
	return self->Load(*filemask);
}
	
EWXWEXPORT(void,wxXmlResource_InitAllHandlers)(wxXmlResource* self)
{
	self->InitAllHandlers();
	self->AddHandler(new wxMDIParentFrameXmlHandler());
	self->AddHandler(new wxMDIChildFrameXmlHandler());
	self->AddHandler(new wxSplitterWindowXmlHandler());
#ifdef wxUSE_STC
	self->AddHandler(new wxStyledTextCtrlXmlHandler());
#endif
	self->AddHandler(new wxGridXmlHandler());
}
	
EWXWEXPORT(wxXmlResource*,wxXmlResource_Create)(int flags)
{
	wxXmlResource* self = wxXmlResource::Get();

	// Calling the wxc variant of InitAllHandlers() ensures additional
	// handlers for splitters etc. get initialized as well.
	wxXmlResource_InitAllHandlers(self);
	self->SetFlags(flags);
	return self;
}
	
EWXWEXPORT(wxXmlResource*,wxXmlResource_CreateFromFile)(wxString* filemask,int flags)
{
	wxXmlResource* self = wxXmlResource_Create(flags);
    if (self->Load(*filemask)) {
		return self;
    }
	else {
		delete self;
		return NULL;
	}
}
	
EWXWEXPORT(void,wxXmlResource_AddHandler)(wxXmlResource* self,wxXmlResourceHandler* handler)
{
	self->AddHandler(handler);
}
	
EWXWEXPORT(void,wxXmlResource_InsertHandler)(wxXmlResource* self,wxXmlResourceHandler* handler)
{
	self->InsertHandler(handler);
}
	
EWXWEXPORT(void,wxXmlResource_ClearHandlers)(wxXmlResource* self)
{
	self->ClearHandlers();
}
	
EWXWEXPORT(void,wxXmlResource_AddSubclassFactory)(wxXmlResource* self,wxXmlSubclassFactory* factory)
{
	self->AddSubclassFactory(factory);
}

EWXWEXPORT(wxMenu*,wxXmlResource_LoadMenu)(wxXmlResource* self,wxString* name)
{
	return self->LoadMenu(*name);
}
	
EWXWEXPORT(wxMenuBar*,wxXmlResource_LoadMenuBar)(wxXmlResource* self,wxWindow* parent,wxString* name)
{
	return self->LoadMenuBar(parent,*name);
}
	
EWXWEXPORT(wxToolBar*,wxXmlResource_LoadToolBar)(wxXmlResource* self,wxWindow* parent,wxString* name)
{
	return self->LoadToolBar(parent,*name);
}
	
EWXWEXPORT(wxDialog*,wxXmlResource_LoadDialog)(wxXmlResource* self,wxWindow* parent,wxString* name)
{
    wxDialog* dlg = new wxDialog;
    if (!self->LoadDialog(dlg, parent,*name)) {
        delete dlg;
        return NULL;
    } else {
        return dlg;
    }
}
	
EWXWEXPORT(wxPanel*,wxXmlResource_LoadPanel)(wxXmlResource* self,wxWindow* parent,wxString* name)
{
	return self->LoadPanel(parent,*name);
}
	
EWXWEXPORT(wxFrame*,wxXmlResource_LoadFrame)(wxXmlResource* self,wxWindow* parent,wxString* name)
{
    wxFrame* frame = new wxFrame;
    if (!self->LoadFrame(frame, parent,*name)) {
        delete frame;
        return NULL;
    } else {
        return frame;
    }
}
	
EWXWEXPORT(void,wxXmlResource_LoadBitmap)(wxXmlResource* self,wxString* name,wxBitmap* _ref)
{
	*_ref = self->LoadBitmap(*name);
}
	
EWXWEXPORT(void,wxXmlResource_LoadIcon)(wxXmlResource* self,wxString* name,wxIcon* _ref)
{
	*_ref = self->LoadIcon(*name);
}
	
EWXWEXPORT(bool,wxXmlResource_Unload)(wxXmlResource* self,wxString* name)
{
	return self->Unload(*name);
}
	
EWXWEXPORT(bool,wxXmlResource_AttachUnknownControl)(wxXmlResource* self,wxString* name,wxWindow* control,wxWindow* parent)
{
	return self->AttachUnknownControl(*name, control, parent);
}
	
EWXWEXPORT(int,wxXmlResource_GetXRCID)(wxXmlResource* self,wxString* str_id)
{
	return self->GetXRCID(*str_id);
}
	
EWXWEXPORT(long,wxXmlResource_GetVersion)(wxXmlResource* self)
{
	return self->GetVersion();
}
	
EWXWEXPORT(int,wxXmlResource_CompareVersion)(wxXmlResource* self,int major,int minor,int release,int revision)
{
	return self->CompareVersion(major, minor, release, revision);
}
	
EWXWEXPORT(wxXmlResource*,wxXmlResource_Get)(wxXmlResource* self)
{
  return wxXmlResource::Get();
}

// BUILD_XRCGETCTRL_FN constructs functions for geting control pointers out of 
// window hierarchies created from XRC files. The functions themselves 
#define BUILD_XRCGETCTRL_FN(_typ)                                                            \
  EWXWEXPORT(wx##_typ*,wxXmlResource_Get##_typ)(wxWindow* _win,wxString* _str_id)       \
  {                                                                                          \
  return reinterpret_cast<wx##_typ *>(_win->FindWindow(wxXmlResource::GetXRCID(*_str_id))); \
  }
// Construct the XRC control getter functions
BUILD_XRCGETCTRL_FN(Sizer)
BUILD_XRCGETCTRL_FN(BoxSizer)
BUILD_XRCGETCTRL_FN(StaticBoxSizer)
BUILD_XRCGETCTRL_FN(GridSizer)
BUILD_XRCGETCTRL_FN(FlexGridSizer)
BUILD_XRCGETCTRL_FN(BitmapButton)
BUILD_XRCGETCTRL_FN(Button)
BUILD_XRCGETCTRL_FN(CalendarCtrl)
BUILD_XRCGETCTRL_FN(CheckBox)
BUILD_XRCGETCTRL_FN(CheckListBox)
BUILD_XRCGETCTRL_FN(Choice)
BUILD_XRCGETCTRL_FN(ComboBox)
BUILD_XRCGETCTRL_FN(Gauge)
BUILD_XRCGETCTRL_FN(Grid)
BUILD_XRCGETCTRL_FN(HtmlWindow)
BUILD_XRCGETCTRL_FN(ListBox)
BUILD_XRCGETCTRL_FN(ListCtrl)
BUILD_XRCGETCTRL_FN(MDIChildFrame)
BUILD_XRCGETCTRL_FN(MDIParentFrame)
BUILD_XRCGETCTRL_FN(Menu)
BUILD_XRCGETCTRL_FN(MenuBar)
BUILD_XRCGETCTRL_FN(MenuItem)
BUILD_XRCGETCTRL_FN(Notebook)
BUILD_XRCGETCTRL_FN(Panel)
BUILD_XRCGETCTRL_FN(RadioButton)
BUILD_XRCGETCTRL_FN(RadioBox)
BUILD_XRCGETCTRL_FN(ScrollBar)
BUILD_XRCGETCTRL_FN(ScrolledWindow)
BUILD_XRCGETCTRL_FN(Slider)
BUILD_XRCGETCTRL_FN(SpinButton)
BUILD_XRCGETCTRL_FN(SpinCtrl)
BUILD_XRCGETCTRL_FN(SplitterWindow)
#ifdef wxUSE_STC
BUILD_XRCGETCTRL_FN(StyledTextCtrl)
#else
EWXWEXPORT(void*,wxXmlResource_GetStyledTextCtrl)(wxWindow* _win,wxString* _str_id)
{
  return NULL;
}
#endif
BUILD_XRCGETCTRL_FN(StaticBitmap)
BUILD_XRCGETCTRL_FN(StaticBox)
BUILD_XRCGETCTRL_FN(StaticLine)
BUILD_XRCGETCTRL_FN(StaticText)
BUILD_XRCGETCTRL_FN(TextCtrl)
BUILD_XRCGETCTRL_FN(TreeCtrl)
	
EWXWEXPORT(wxXmlResource*,wxXmlResource_Set)(wxXmlResource* self,wxXmlResource* res)
{
	return self->Set(res);
}

EWXWEXPORT(wxString*,wxXmlResource_GetDomain)(wxXmlResource* self)
{
	wxString* buf = new wxString();
	*buf = self->GetDomain();
	return buf;
}

EWXWEXPORT(void,wxXmlResource_SetDomain)(wxXmlResource* self,wxString* domain)
{
	self->SetDomain(*domain);
}

EWXWEXPORT(int,wxXmlResource_GetFlags)(wxXmlResource* self)
{
	return self->GetFlags();
}
	
EWXWEXPORT(void,wxXmlResource_SetFlags)(wxXmlResource* self,int flags)
{
	self->SetFlags(flags);
}
	
}