Include wx/sizer.h and wx/layout.h according to precompiled headers of wx/wx.h (with...
[wxWidgets.git] / src / xrc / xh_unkwn.cpp
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$
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
30 class wxUnknownControlContainer : public wxPanel
31 {
32 public:
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
52 protected:
53 wxString m_controlName;
54 bool m_controlAdded;
55 wxColour m_bg;
56 };
57
58 void 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 SetSizer(sizer);
72 Layout();
73 }
74
75 void wxUnknownControlContainer::RemoveChild(wxWindowBase *child)
76 {
77 wxPanel::RemoveChild(child);
78 m_controlAdded = false;
79 GetSizer()->Detach((wxWindow*)child);
80 }
81
82
83 IMPLEMENT_DYNAMIC_CLASS(wxUnknownWidgetXmlHandler, wxXmlResourceHandler)
84
85 wxUnknownWidgetXmlHandler::wxUnknownWidgetXmlHandler()
86 : wxXmlResourceHandler()
87 {
88 XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
89 }
90
91 wxObject *wxUnknownWidgetXmlHandler::DoCreateResource()
92 {
93 wxASSERT_MSG( m_instance == NULL,
94 _T("'unknown' controls can't be subclassed, use wxXmlResource::AttachUnknownControl") );
95
96 wxPanel *panel =
97 new wxUnknownControlContainer(m_parentAsWindow,
98 GetName(), wxID_ANY,
99 GetPosition(), GetSize(),
100 GetStyle(wxT("style")));
101 SetupWindow(panel);
102 return panel;
103 }
104
105 bool wxUnknownWidgetXmlHandler::CanHandle(wxXmlNode *node)
106 {
107 return IsOfClass(node, wxT("unknown"));
108 }
109
110 #endif // wxUSE_XRC