1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/xrc/xh_choicbk.cpp
3 // Purpose:     XRC resource for wxChoicebook
4 // Author:      Vaclav Slavik
5 // Created:     2000/03/21
6 // RCS-ID:      $Id: xh_choicbk.cpp 39627 2006-06-08 06:57:39Z ABX $
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 && wxUSE_CHOICEBOOK
19 
20 #include "wx/xrc/xh_choicbk.h"
21 
22 #ifndef WX_PRECOMP
23     #include "wx/log.h"
24     #include "wx/sizer.h"
25 #endif
26 
27 #include "wx/choicebk.h"
28 #include "wx/imaglist.h"
29 
IMPLEMENT_DYNAMIC_CLASS(wxChoicebookXmlHandler,wxXmlResourceHandler)30 IMPLEMENT_DYNAMIC_CLASS(wxChoicebookXmlHandler, wxXmlResourceHandler)
31 
32 wxChoicebookXmlHandler::wxChoicebookXmlHandler()
33                        :wxXmlResourceHandler(),
34                         m_isInside(false),
35                         m_choicebook(NULL)
36 {
37     XRC_ADD_STYLE(wxBK_DEFAULT);
38     XRC_ADD_STYLE(wxBK_LEFT);
39     XRC_ADD_STYLE(wxBK_RIGHT);
40     XRC_ADD_STYLE(wxBK_TOP);
41     XRC_ADD_STYLE(wxBK_BOTTOM);
42 
43 #if WXWIN_COMPATIBILITY_2_6
44     XRC_ADD_STYLE(wxCHB_DEFAULT);
45     XRC_ADD_STYLE(wxCHB_LEFT);
46     XRC_ADD_STYLE(wxCHB_RIGHT);
47     XRC_ADD_STYLE(wxCHB_TOP);
48     XRC_ADD_STYLE(wxCHB_BOTTOM);
49 #endif
50 
51     AddWindowStyles();
52 }
53 
DoCreateResource()54 wxObject *wxChoicebookXmlHandler::DoCreateResource()
55 {
56     if (m_class == wxT("choicebookpage"))
57     {
58         wxXmlNode *n = GetParamNode(wxT("object"));
59 
60         if ( !n )
61             n = GetParamNode(wxT("object_ref"));
62 
63         if (n)
64         {
65             bool old_ins = m_isInside;
66             m_isInside = false;
67             wxObject *item = CreateResFromNode(n, m_choicebook, NULL);
68             m_isInside = old_ins;
69             wxWindow *wnd = wxDynamicCast(item, wxWindow);
70 
71             if (wnd)
72             {
73                 m_choicebook->AddPage(wnd, GetText(wxT("label")),
74                                            GetBool(wxT("selected")));
75                 if ( HasParam(wxT("bitmap")) )
76                 {
77                     wxBitmap bmp = GetBitmap(wxT("bitmap"), wxART_OTHER);
78                     wxImageList *imgList = m_choicebook->GetImageList();
79                     if ( imgList == NULL )
80                     {
81                         imgList = new wxImageList( bmp.GetWidth(), bmp.GetHeight() );
82                         m_choicebook->AssignImageList( imgList );
83                     }
84                     int imgIndex = imgList->Add(bmp);
85                     m_choicebook->SetPageImage(m_choicebook->GetPageCount()-1, imgIndex );
86                 }
87             }
88             else
89                 wxLogError(wxT("Error in resource."));
90             return wnd;
91         }
92         else
93         {
94             wxLogError(wxT("Error in resource: no control within choicebook's <page> tag."));
95             return NULL;
96         }
97     }
98 
99     else
100     {
101         XRC_MAKE_INSTANCE(nb, wxChoicebook)
102 
103         nb->Create(m_parentAsWindow,
104                    GetID(),
105                    GetPosition(), GetSize(),
106                    GetStyle(wxT("style")),
107                    GetName());
108 
109         wxChoicebook *old_par = m_choicebook;
110         m_choicebook = nb;
111         bool old_ins = m_isInside;
112         m_isInside = true;
113         CreateChildren(m_choicebook, true/*only this handler*/);
114         m_isInside = old_ins;
115         m_choicebook = old_par;
116 
117         return nb;
118     }
119 }
120 
CanHandle(wxXmlNode * node)121 bool wxChoicebookXmlHandler::CanHandle(wxXmlNode *node)
122 {
123     return ((!m_isInside && IsOfClass(node, wxT("wxChoicebook"))) ||
124             (m_isInside && IsOfClass(node, wxT("choicebookpage"))));
125 }
126 
127 #endif // wxUSE_XRC && wxUSE_CHOICEBOOK
128