]> git.saurik.com Git - wxWidgets.git/blob - src/xrc/xh_unkwn.cpp
avoid multiple reallocations in wxString::PrintfV() if vsnprintf() returns the total...
[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 // 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 #include "wx/window.h"
22 #include "wx/log.h"
23 #include "wx/sizer.h"
24 #include "wx/panel.h"
25
26
27 class wxUnknownControlContainer : public wxPanel
28 {
29 public:
30 wxUnknownControlContainer(wxWindow *parent,
31 const wxString& controlName,
32 wxWindowID id = wxID_ANY,
33 const wxPoint& pos = wxDefaultPosition,
34 const wxSize& size = wxDefaultSize,
35 long style = 0)
36 // Always add the wxTAB_TRAVERSAL and wxNO_BORDER styles to what comes
37 // from the XRC if anything.
38 : wxPanel(parent, id, pos, size, style | wxTAB_TRAVERSAL | wxNO_BORDER,
39 controlName + wxT("_container")),
40 m_controlName(controlName), m_controlAdded(false)
41 {
42 m_bg = GetBackgroundColour();
43 SetBackgroundColour(wxColour(255, 0, 255));
44 }
45
46 virtual void AddChild(wxWindowBase *child);
47 virtual void RemoveChild(wxWindowBase *child);
48
49 protected:
50 wxString m_controlName;
51 bool m_controlAdded;
52 wxColour m_bg;
53 };
54
55 void wxUnknownControlContainer::AddChild(wxWindowBase *child)
56 {
57 wxASSERT_MSG( !m_controlAdded, wxT("Couldn't add two unknown controls to the same container!") );
58
59 wxPanel::AddChild(child);
60
61 SetBackgroundColour(m_bg);
62 child->SetName(m_controlName);
63 child->SetId(wxXmlResource::GetXRCID(m_controlName));
64 m_controlAdded = true;
65
66 wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
67 sizer->Add((wxWindow*)child, 1, wxEXPAND);
68 SetSizer(sizer);
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 IMPLEMENT_DYNAMIC_CLASS(wxUnknownWidgetXmlHandler, wxXmlResourceHandler)
81
82 wxUnknownWidgetXmlHandler::wxUnknownWidgetXmlHandler()
83 : wxXmlResourceHandler()
84 {
85 XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
86 }
87
88 wxObject *wxUnknownWidgetXmlHandler::DoCreateResource()
89 {
90 wxASSERT_MSG( m_instance == NULL,
91 _T("'unknown' controls can't be subclassed, use wxXmlResource::AttachUnknownControl") );
92
93 wxPanel *panel =
94 new wxUnknownControlContainer(m_parentAsWindow,
95 GetName(), wxID_ANY,
96 GetPosition(), GetSize(),
97 GetStyle(wxT("style")));
98 SetupWindow(panel);
99 return panel;
100 }
101
102 bool wxUnknownWidgetXmlHandler::CanHandle(wxXmlNode *node)
103 {
104 return IsOfClass(node, wxT("unknown"));
105 }
106
107 #endif // wxUSE_XRC