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 
30 class wxUnknownControlContainer : public wxPanel
31 {
32 public:
wxUnknownControlContainer(wxWindow * parent,const wxString & controlName,wxWindowID id=wxID_ANY,const wxPoint & pos=wxDefaultPosition,const wxSize & size=wxDefaultSize,long style=0)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 
AddChild(wxWindowBase * child)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     SetSizerAndFit(sizer);
72 }
73 
RemoveChild(wxWindowBase * child)74 void wxUnknownControlContainer::RemoveChild(wxWindowBase *child)
75 {
76     wxPanel::RemoveChild(child);
77     m_controlAdded = false;
78     GetSizer()->Detach((wxWindow*)child);
79 }
80 
81 
IMPLEMENT_DYNAMIC_CLASS(wxUnknownWidgetXmlHandler,wxXmlResourceHandler)82 IMPLEMENT_DYNAMIC_CLASS(wxUnknownWidgetXmlHandler, wxXmlResourceHandler)
83 
84 wxUnknownWidgetXmlHandler::wxUnknownWidgetXmlHandler()
85 : wxXmlResourceHandler()
86 {
87     XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
88 }
89 
DoCreateResource()90 wxObject *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 
CanHandle(wxXmlNode * node)104 bool wxUnknownWidgetXmlHandler::CanHandle(wxXmlNode *node)
105 {
106     return IsOfClass(node, wxT("unknown"));
107 }
108 
109 #endif // wxUSE_XRC
110