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
30IMPLEMENT_DYNAMIC_CLASS(wxChoicebookXmlHandler, wxXmlResourceHandler)
31
32wxChoicebookXmlHandler::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
54wxObject *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
121bool 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