1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/xrc/xh_unkwn.cpp
3// Purpose:     XRC resource for unknown widget
4// Author:      Vaclav Slavik
5// Created:     2000/09/09
6// RCS-ID:      $Id: xh_unkwn.cpp 44457 2007-02-11 02:34:57Z VZ $
7// Copyright:   (c) 2000 Vaclav Slavik
8// Licence:     wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11// For compilers that support precompilation, includes "wx.h".
12#include "wx/wxprec.h"
13
14#ifdef __BORLANDC__
15    #pragma hdrstop
16#endif
17
18#if wxUSE_XRC
19
20#include "wx/xrc/xh_unkwn.h"
21
22#ifndef WX_PRECOMP
23    #include "wx/log.h"
24    #include "wx/window.h"
25    #include "wx/panel.h"
26    #include "wx/sizer.h"
27#endif
28
29
30class wxUnknownControlContainer : public wxPanel
31{
32public:
33    wxUnknownControlContainer(wxWindow *parent,
34                              const wxString& controlName,
35                              wxWindowID id = wxID_ANY,
36                              const wxPoint& pos = wxDefaultPosition,
37                              const wxSize& size = wxDefaultSize,
38                              long style = 0)
39        // Always add the wxTAB_TRAVERSAL and wxNO_BORDER styles to what comes
40        // from the XRC if anything.
41        : wxPanel(parent, id, pos, size, style | wxTAB_TRAVERSAL | wxNO_BORDER,
42                  controlName + wxT("_container")),
43          m_controlName(controlName), m_controlAdded(false)
44    {
45        m_bg = GetBackgroundColour();
46        SetBackgroundColour(wxColour(255, 0, 255));
47    }
48
49    virtual void AddChild(wxWindowBase *child);
50    virtual void RemoveChild(wxWindowBase *child);
51
52protected:
53    wxString m_controlName;
54    bool m_controlAdded;
55    wxColour m_bg;
56};
57
58void wxUnknownControlContainer::AddChild(wxWindowBase *child)
59{
60    wxASSERT_MSG( !m_controlAdded, wxT("Couldn't add two unknown controls to the same container!") );
61
62    wxPanel::AddChild(child);
63
64    SetBackgroundColour(m_bg);
65    child->SetName(m_controlName);
66    child->SetId(wxXmlResource::GetXRCID(m_controlName));
67    m_controlAdded = true;
68
69    wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
70    sizer->Add((wxWindow*)child, 1, wxEXPAND);
71    SetSizerAndFit(sizer);
72}
73
74void wxUnknownControlContainer::RemoveChild(wxWindowBase *child)
75{
76    wxPanel::RemoveChild(child);
77    m_controlAdded = false;
78    GetSizer()->Detach((wxWindow*)child);
79}
80
81
82IMPLEMENT_DYNAMIC_CLASS(wxUnknownWidgetXmlHandler, wxXmlResourceHandler)
83
84wxUnknownWidgetXmlHandler::wxUnknownWidgetXmlHandler()
85: wxXmlResourceHandler()
86{
87    XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
88}
89
90wxObject *wxUnknownWidgetXmlHandler::DoCreateResource()
91{
92    wxASSERT_MSG( m_instance == NULL,
93                  _T("'unknown' controls can't be subclassed, use wxXmlResource::AttachUnknownControl") );
94
95    wxPanel *panel =
96        new wxUnknownControlContainer(m_parentAsWindow,
97                                      GetName(), wxID_ANY,
98                                      GetPosition(), GetSize(),
99                                      GetStyle(wxT("style")));
100    SetupWindow(panel);
101    return panel;
102}
103
104bool wxUnknownWidgetXmlHandler::CanHandle(wxXmlNode *node)
105{
106    return IsOfClass(node, wxT("unknown"));
107}
108
109#endif // wxUSE_XRC
110