1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/xrc/xh_radbx.cpp
3// Purpose:     XRC resource for wxRadioBox
4// Author:      Bob Mitchell
5// Created:     2000/03/21
6// RCS-ID:      $Id: xh_radbx.cpp 40728 2006-08-21 18:27:15Z RD $
7// Copyright:   (c) 2000 Bob Mitchell and Verant Interactive
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_RADIOBOX
19
20#include "wx/xrc/xh_radbx.h"
21
22#ifndef WX_PRECOMP
23    #include "wx/intl.h"
24    #include "wx/radiobox.h"
25#endif
26
27IMPLEMENT_DYNAMIC_CLASS(wxRadioBoxXmlHandler, wxXmlResourceHandler)
28
29wxRadioBoxXmlHandler::wxRadioBoxXmlHandler()
30: wxXmlResourceHandler(), m_insideBox(false)
31{
32    XRC_ADD_STYLE(wxRA_SPECIFY_COLS);
33    XRC_ADD_STYLE(wxRA_HORIZONTAL);
34    XRC_ADD_STYLE(wxRA_SPECIFY_ROWS);
35    XRC_ADD_STYLE(wxRA_VERTICAL);
36    AddWindowStyles();
37}
38
39wxObject *wxRadioBoxXmlHandler::DoCreateResource()
40{
41    if ( m_class == wxT("wxRadioBox"))
42    {
43        // find the selection
44        long selection = GetLong( wxT("selection"), -1 );
45
46        // need to build the list of strings from children
47        m_insideBox = true;
48        CreateChildrenPrivately( NULL, GetParamNode(wxT("content")));
49
50        wxString *strings;
51        if ( !labels.empty() )
52        {
53            strings = new wxString[labels.size()];
54            const unsigned count = labels.size();
55            for( unsigned i = 0; i < count; i++ )
56                strings[i] = labels[i];
57        }
58        else
59        {
60            strings = NULL;
61        }
62
63        XRC_MAKE_INSTANCE(control, wxRadioBox)
64
65        control->Create(m_parentAsWindow,
66                        GetID(),
67                        GetText(wxT("label")),
68                        GetPosition(), GetSize(),
69                        labels.size(),
70                        strings,
71                        GetLong(wxT("dimension"), 1),
72                        GetStyle(),
73                        wxDefaultValidator,
74                        GetName());
75
76        delete[] strings;
77
78        if (selection != -1)
79            control->SetSelection(selection);
80
81        SetupWindow(control);
82
83        const unsigned count = labels.size();
84        for( unsigned i = 0; i < count; i++ )
85        {
86#if wxUSE_TOOLTIPS
87            if ( !tooltips[i].empty() )
88                control->SetItemToolTip(i, tooltips[i]);
89#endif // wxUSE_TOOLTIPS
90#if wxUSE_HELP
91            if ( helptextSpecified[i] )
92                control->SetItemHelpText(i, helptexts[i]);
93#endif // wxUSE_HELP
94        }
95
96        labels.clear();    // dump the strings
97
98        tooltips.clear();    // dump the tooltips
99
100        helptexts.clear();   // dump the helptexts
101        helptextSpecified.clear();
102
103        return control;
104    }
105    else // inside the radiobox element
106    {
107        // we handle handle <item tooltip="..." helptext="...">Label</item> constructs here
108
109        wxString str = GetNodeContent(m_node);
110
111        wxString tooltip;
112        m_node->GetPropVal(wxT("tooltip"), &tooltip);
113
114        wxString helptext;
115        bool hasHelptext = m_node->GetPropVal(wxT("helptext"), &helptext);
116
117        if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
118        {
119            str = wxGetTranslation(str, m_resource->GetDomain());
120            if ( !tooltip.empty() )
121                tooltip = wxGetTranslation(tooltip, m_resource->GetDomain());
122            if ( hasHelptext )
123                helptext = wxGetTranslation(helptext, m_resource->GetDomain());
124        }
125
126        labels.push_back(str);
127        tooltips.push_back(tooltip);
128        helptexts.push_back(helptext);
129        helptextSpecified.push_back(hasHelptext);
130
131        return NULL;
132    }
133
134}
135
136bool wxRadioBoxXmlHandler::CanHandle(wxXmlNode *node)
137{
138    return (IsOfClass(node, wxT("wxRadioBox")) ||
139           (m_insideBox && node->GetName() == wxT("item")));
140}
141
142#endif // wxUSE_XRC && wxUSE_RADIOBOX
143