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