1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/xrc/xh_ribbon.cpp
3 // Purpose: XML resource handler for wxRibbon related classes
4 // Author: Armel Asselin
7 // Copyright: (c) 2010 Armel Asselin
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
18 #if wxUSE_XRC && wxUSE_RIBBON
20 #include "wx/xrc/xh_ribbon.h"
22 #include "wx/ribbon/bar.h"
23 #include "wx/ribbon/buttonbar.h"
24 #include "wx/ribbon/gallery.h"
26 #include "wx/scopeguard.h"
32 // Ribbon bars can contain only pages which are usually panels but may contain
35 // Panels are usually for wxRibbonControls but may as well contain any
38 // Galleries are wxRibbonControl and simply contain bitmaps with IDs.
40 // Button bars are wxRibbonControl and contain buttons (normal/dropdown/mixed),
41 // with id/bitmap/label/short help.
43 wxIMPLEMENT_DYNAMIC_CLASS(wxRibbonXmlHandler
, wxXmlResourceHandler
);
45 wxRibbonXmlHandler::wxRibbonXmlHandler()
46 : wxXmlResourceHandler(),
49 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PAGE_LABELS
);
50 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PAGE_ICONS
);
51 XRC_ADD_STYLE(wxRIBBON_BAR_FLOW_HORIZONTAL
);
52 XRC_ADD_STYLE(wxRIBBON_BAR_FLOW_VERTICAL
);
53 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
);
54 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS
);
55 XRC_ADD_STYLE(wxRIBBON_BAR_ALWAYS_SHOW_TABS
);
56 XRC_ADD_STYLE(wxRIBBON_BAR_DEFAULT_STYLE
);
57 XRC_ADD_STYLE(wxRIBBON_BAR_FOLDBAR_STYLE
);
60 wxObject
*wxRibbonXmlHandler::DoCreateResource()
62 if (m_class
== wxT("button"))
63 return Handle_button();
64 if (m_class
== wxT("wxRibbonButtonBar"))
65 return Handle_buttonbar();
66 else if (m_class
== wxT("item"))
67 return Handle_galleryitem();
68 else if (m_class
== wxT("wxRibbonGallery"))
69 return Handle_gallery();
70 else if (m_class
== wxT("wxRibbonPanel") || m_class
== wxT("panel"))
71 return Handle_panel();
72 else if (m_class
== wxT("wxRibbonPage") || m_class
== wxT("page"))
74 else if (m_class
== wxT("wxRibbonBar"))
77 return Handle_control ();
80 bool wxRibbonXmlHandler::CanHandle(wxXmlNode
*node
)
82 return IsRibbonControl(node
) ||
83 (m_isInside
== &wxRibbonButtonBar::ms_classInfo
&&
84 IsOfClass(node
, wxT("button"))) ||
85 (m_isInside
== &wxRibbonBar::ms_classInfo
&&
86 IsOfClass(node
, wxT("page"))) ||
87 (m_isInside
== &wxRibbonPage::ms_classInfo
&&
88 IsOfClass(node
, wxT("panel"))) ||
89 (m_isInside
== &wxRibbonGallery::ms_classInfo
&&
90 IsOfClass(node
, wxT("item")));
93 bool wxRibbonXmlHandler::IsRibbonControl (wxXmlNode
*node
)
95 return IsOfClass(node
, wxT("wxRibbonBar")) ||
96 IsOfClass(node
, wxT("wxRibbonButtonBar")) ||
97 IsOfClass(node
, wxT("wxRibbonPage")) ||
98 IsOfClass(node
, wxT("wxRibbonPanel")) ||
99 IsOfClass(node
, wxT("wxRibbonGallery")) ||
100 IsOfClass(node
, wxT("wxRibbonControl"));
103 void wxRibbonXmlHandler::Handle_RibbonArtProvider(wxRibbonControl
*control
)
105 wxString provider
= GetText("art-provider", false);
107 if (provider
== "default" || provider
.IsEmpty())
108 control
->SetArtProvider(new wxRibbonDefaultArtProvider
);
109 else if (provider
.CmpNoCase("aui") == 0)
110 control
->SetArtProvider(new wxRibbonAUIArtProvider
);
111 else if (provider
.CmpNoCase("msw") == 0)
112 control
->SetArtProvider(new wxRibbonMSWArtProvider
);
114 ReportError("invalid ribbon art provider");
117 wxObject
* wxRibbonXmlHandler::Handle_buttonbar()
119 XRC_MAKE_INSTANCE (buttonBar
, wxRibbonButtonBar
);
121 if (!buttonBar
->Create (wxDynamicCast(m_parent
, wxWindow
), GetID(),
122 GetPosition(), GetSize(), GetStyle()))
124 ReportError("could not create ribbon panel");
128 const wxClassInfo
* const wasInside
= m_isInside
;
129 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
130 m_isInside
= &wxRibbonButtonBar::ms_classInfo
;
132 CreateChildren (buttonBar
, true);
134 buttonBar
->Realize();
140 wxObject
* wxRibbonXmlHandler::Handle_button()
142 wxRibbonButtonBar
*buttonBar
= wxStaticCast(m_parent
, wxRibbonButtonBar
);
144 wxRibbonButtonKind kind
= wxRIBBON_BUTTON_NORMAL
;
146 if (GetBool(wxT("hybrid")))
147 kind
= wxRIBBON_BUTTON_HYBRID
;
150 // check whether we have dropdown tag inside
151 wxMenu
*menu
= NULL
; // menu for drop down items
152 wxXmlNode
* const nodeDropdown
= GetParamNode("dropdown");
155 if (kind
== wxRIBBON_BUTTON_NORMAL
)
156 kind
= wxRIBBON_BUTTON_DROPDOWN
;
158 // also check for the menu specified inside dropdown (it is
159 // optional and may be absent for e.g. dynamically-created
161 wxXmlNode
* const nodeMenu
= nodeDropdown
->GetChildren();
164 wxObject
*res
= CreateResFromNode(nodeMenu
, NULL
);
165 menu
= wxDynamicCast(res
, wxMenu
);
171 "drop-down tool contents can only be a wxMenu"
175 if ( nodeMenu
->GetNext() )
180 "unexpected extra contents under drop-down tool"
185 #endif // wxUSE_MENUS
187 if (!buttonBar
->AddButton(GetID(),
189 GetBitmap ("bitmap"),
190 GetBitmap ("small-bitmap"),
191 GetBitmap ("disabled-bitmap"),
192 GetBitmap ("small-disabled-bitmap"),
196 ReportError ("could not create button");
199 if ( GetBool(wxT("disabled")) )
200 buttonBar
->EnableButton(GetID(), false);
202 return NULL
; // nothing to return
205 wxObject
* wxRibbonXmlHandler::Handle_control()
207 wxRibbonControl
*control
= wxDynamicCast (m_instance
, wxRibbonControl
);
210 ReportError("wxRibbonControl must be subclassed");
212 ReportError("controls must derive from wxRibbonControl");
214 control
->Create(wxDynamicCast(m_parent
, wxWindow
), GetID(),
215 GetPosition(), GetSize(), GetStyle());
220 wxObject
* wxRibbonXmlHandler::Handle_page()
222 XRC_MAKE_INSTANCE (ribbonPage
, wxRibbonPage
);
224 if (!ribbonPage
->Create (wxDynamicCast(m_parent
, wxRibbonBar
), GetID(),
225 GetText ("label"), GetBitmap ("icon"), GetStyle()))
227 ReportError("could not create ribbon page");
231 const wxClassInfo
* const wasInside
= m_isInside
;
232 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
233 m_isInside
= &wxRibbonPage::ms_classInfo
;
235 CreateChildren (ribbonPage
);
237 ribbonPage
->Realize();
243 wxObject
* wxRibbonXmlHandler::Handle_gallery()
245 XRC_MAKE_INSTANCE (ribbonGallery
, wxRibbonGallery
);
247 if (!ribbonGallery
->Create (wxDynamicCast(m_parent
, wxWindow
), GetID(),
248 GetPosition(), GetSize(), GetStyle()))
250 ReportError("could not create ribbon gallery");
254 const wxClassInfo
* const wasInside
= m_isInside
;
255 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
256 m_isInside
= &wxRibbonGallery::ms_classInfo
;
258 CreateChildren (ribbonGallery
);
260 ribbonGallery
->Realize();
263 return ribbonGallery
;
266 wxObject
* wxRibbonXmlHandler::Handle_galleryitem()
268 wxRibbonGallery
*gallery
= wxStaticCast(m_parent
, wxRibbonGallery
);
269 wxCHECK (gallery
, NULL
);
271 gallery
->Append (GetBitmap(), GetID());
273 return NULL
; // nothing to return
276 wxObject
* wxRibbonXmlHandler::Handle_panel()
278 XRC_MAKE_INSTANCE (ribbonPanel
, wxRibbonPanel
);
280 if (!ribbonPanel
->Create (wxDynamicCast(m_parent
, wxWindow
), GetID(),
281 GetText ("label"), GetBitmap ("icon"), GetPosition(), GetSize(),
282 GetStyle("style", wxRIBBON_PANEL_DEFAULT_STYLE
)))
284 ReportError("could not create ribbon panel");
288 CreateChildren (ribbonPanel
);
290 ribbonPanel
->Realize();
296 wxObject
* wxRibbonXmlHandler::Handle_bar()
298 XRC_MAKE_INSTANCE (ribbonBar
, wxRibbonBar
);
300 Handle_RibbonArtProvider (ribbonBar
);
302 if ( !ribbonBar
->Create(wxDynamicCast(m_parent
, wxWindow
),
306 GetStyle("style", wxRIBBON_BAR_DEFAULT_STYLE
)) )
308 ReportError ("could not create ribbonbar");
312 // Currently the art provider style must be explicitly set to the
314 ribbonBar
->GetArtProvider()
315 ->SetFlags(GetStyle("style", wxRIBBON_BAR_DEFAULT_STYLE
));
317 const wxClassInfo
* const wasInside
= m_isInside
;
318 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
319 m_isInside
= &wxRibbonBar::ms_classInfo
;
321 CreateChildren (ribbonBar
, true);
323 ribbonBar
->Realize();
329 #endif // wxUSE_XRC && wxUSE_RIBBON