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