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"
28 // Ribbon bars can contain only pages which are usually panels but may contain
31 // Panels are usually for wxRibbonControls but may as well contain any
34 // Galleries are wxRibbonControl and simply contain bitmaps with IDs.
36 // Button bars are wxRibbonControl and contain buttons (normal/dropdown/mixed),
37 // with id/bitmap/label/short help.
39 wxIMPLEMENT_DYNAMIC_CLASS(wxRibbonXmlHandler
, wxXmlResourceHandler
);
41 wxRibbonXmlHandler::wxRibbonXmlHandler()
42 : wxXmlResourceHandler(),
45 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PAGE_LABELS
);
46 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PAGE_ICONS
);
47 XRC_ADD_STYLE(wxRIBBON_BAR_FLOW_HORIZONTAL
);
48 XRC_ADD_STYLE(wxRIBBON_BAR_FLOW_VERTICAL
);
49 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
);
50 XRC_ADD_STYLE(wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS
);
51 XRC_ADD_STYLE(wxRIBBON_BAR_ALWAYS_SHOW_TABS
);
52 XRC_ADD_STYLE(wxRIBBON_BAR_DEFAULT_STYLE
);
53 XRC_ADD_STYLE(wxRIBBON_BAR_FOLDBAR_STYLE
);
56 wxObject
*wxRibbonXmlHandler::DoCreateResource()
58 if (m_class
== wxT("button"))
59 return Handle_button();
60 if (m_class
== wxT("wxRibbonButtonBar"))
61 return Handle_buttonbar();
62 else if (m_class
== wxT("item"))
63 return Handle_galleryitem();
64 else if (m_class
== wxT("wxRibbonGallery"))
65 return Handle_gallery();
66 else if (m_class
== wxT("wxRibbonPanel") || m_class
== wxT("panel"))
67 return Handle_panel();
68 else if (m_class
== wxT("wxRibbonPage") || m_class
== wxT("page"))
70 else if (m_class
== wxT("wxRibbonBar"))
73 return Handle_control ();
76 bool wxRibbonXmlHandler::CanHandle(wxXmlNode
*node
)
78 return IsRibbonControl(node
) ||
79 (m_isInside
== &wxRibbonButtonBar::ms_classInfo
&&
80 IsOfClass(node
, wxT("button"))) ||
81 (m_isInside
== &wxRibbonBar::ms_classInfo
&&
82 IsOfClass(node
, wxT("page"))) ||
83 (m_isInside
== &wxRibbonPage::ms_classInfo
&&
84 IsOfClass(node
, wxT("panel"))) ||
85 (m_isInside
== &wxRibbonGallery::ms_classInfo
&&
86 IsOfClass(node
, wxT("item")));
89 bool wxRibbonXmlHandler::IsRibbonControl (wxXmlNode
*node
)
91 return IsOfClass(node
, wxT("wxRibbonBar")) ||
92 IsOfClass(node
, wxT("wxRibbonButtonBar")) ||
93 IsOfClass(node
, wxT("wxRibbonPage")) ||
94 IsOfClass(node
, wxT("wxRibbonPanel")) ||
95 IsOfClass(node
, wxT("wxRibbonGallery")) ||
96 IsOfClass(node
, wxT("wxRibbonControl"));
99 void wxRibbonXmlHandler::Handle_RibbonArtProvider(wxRibbonControl
*control
)
101 wxString provider
= GetText("art-provider", false);
103 if (provider
== "default" || provider
.IsEmpty())
104 control
->SetArtProvider(new wxRibbonDefaultArtProvider
);
105 else if (provider
.CmpNoCase("aui") == 0)
106 control
->SetArtProvider(new wxRibbonAUIArtProvider
);
107 else if (provider
.CmpNoCase("msw") == 0)
108 control
->SetArtProvider(new wxRibbonMSWArtProvider
);
110 ReportError("invalid ribbon art provider");
113 wxObject
* wxRibbonXmlHandler::Handle_buttonbar()
115 XRC_MAKE_INSTANCE (buttonBar
, wxRibbonButtonBar
);
117 if (!buttonBar
->Create (wxDynamicCast(m_parent
, wxWindow
), GetID(),
118 GetPosition(), GetSize(), GetStyle()))
120 ReportError("could not create ribbon panel");
124 const wxClassInfo
* const wasInside
= m_isInside
;
125 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
126 m_isInside
= &wxRibbonButtonBar::ms_classInfo
;
128 CreateChildren (buttonBar
, true);
130 buttonBar
->Realize();
136 wxObject
* wxRibbonXmlHandler::Handle_button()
138 wxRibbonButtonBar
*buttonBar
= wxStaticCast(m_parent
, wxRibbonButtonBar
);
140 wxRibbonButtonKind kind
= wxRIBBON_BUTTON_NORMAL
;
142 if (GetBool(wxT("hybrid")))
143 kind
= wxRIBBON_BUTTON_HYBRID
;
146 // check whether we have dropdown tag inside
147 wxMenu
*menu
= NULL
; // menu for drop down items
148 wxXmlNode
* const nodeDropdown
= GetParamNode("dropdown");
151 if (kind
== wxRIBBON_BUTTON_NORMAL
)
152 kind
= wxRIBBON_BUTTON_DROPDOWN
;
154 // also check for the menu specified inside dropdown (it is
155 // optional and may be absent for e.g. dynamically-created
157 wxXmlNode
* const nodeMenu
= nodeDropdown
->GetChildren();
160 wxObject
*res
= CreateResFromNode(nodeMenu
, NULL
);
161 menu
= wxDynamicCast(res
, wxMenu
);
167 "drop-down tool contents can only be a wxMenu"
171 if ( nodeMenu
->GetNext() )
176 "unexpected extra contents under drop-down tool"
181 #endif // wxUSE_MENUS
183 if (!buttonBar
->AddButton(GetID(),
185 GetBitmap ("bitmap"),
186 GetBitmap ("small-bitmap"),
187 GetBitmap ("disabled-bitmap"),
188 GetBitmap ("small-disabled-bitmap"),
192 ReportError ("could not create button");
195 if ( GetBool(wxT("disabled")) )
196 buttonBar
->EnableButton(GetID(), false);
198 return NULL
; // nothing to return
201 wxObject
* wxRibbonXmlHandler::Handle_control()
203 wxRibbonControl
*control
= wxDynamicCast (m_instance
, wxRibbonControl
);
206 ReportError("wxRibbonControl must be subclassed");
208 ReportError("controls must derive from wxRibbonControl");
210 control
->Create(wxDynamicCast(m_parent
, wxWindow
), GetID(),
211 GetPosition(), GetSize(), GetStyle());
216 wxObject
* wxRibbonXmlHandler::Handle_page()
218 XRC_MAKE_INSTANCE (ribbonPage
, wxRibbonPage
);
220 if (!ribbonPage
->Create (wxDynamicCast(m_parent
, wxRibbonBar
), GetID(),
221 GetText ("label"), GetBitmap ("icon"), GetStyle()))
223 ReportError("could not create ribbon page");
227 const wxClassInfo
* const wasInside
= m_isInside
;
228 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
229 m_isInside
= &wxRibbonPage::ms_classInfo
;
231 CreateChildren (ribbonPage
);
233 ribbonPage
->Realize();
239 wxObject
* wxRibbonXmlHandler::Handle_gallery()
241 XRC_MAKE_INSTANCE (ribbonGallery
, wxRibbonGallery
);
243 if (!ribbonGallery
->Create (wxDynamicCast(m_parent
, wxWindow
), GetID(),
244 GetPosition(), GetSize(), GetStyle()))
246 ReportError("could not create ribbon gallery");
250 const wxClassInfo
* const wasInside
= m_isInside
;
251 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
252 m_isInside
= &wxRibbonGallery::ms_classInfo
;
254 CreateChildren (ribbonGallery
);
256 ribbonGallery
->Realize();
259 return ribbonGallery
;
262 wxObject
* wxRibbonXmlHandler::Handle_galleryitem()
264 wxRibbonGallery
*gallery
= wxStaticCast(m_parent
, wxRibbonGallery
);
265 wxCHECK (gallery
, NULL
);
267 gallery
->Append (GetBitmap(), GetID());
269 return NULL
; // nothing to return
272 wxObject
* wxRibbonXmlHandler::Handle_panel()
274 XRC_MAKE_INSTANCE (ribbonPanel
, wxRibbonPanel
);
276 if (!ribbonPanel
->Create (wxDynamicCast(m_parent
, wxWindow
), GetID(),
277 GetText ("label"), GetBitmap ("icon"), GetPosition(), GetSize(),
278 GetStyle("style", wxRIBBON_PANEL_DEFAULT_STYLE
)))
280 ReportError("could not create ribbon panel");
284 CreateChildren (ribbonPanel
);
286 ribbonPanel
->Realize();
292 wxObject
* wxRibbonXmlHandler::Handle_bar()
294 XRC_MAKE_INSTANCE (ribbonBar
, wxRibbonBar
);
296 Handle_RibbonArtProvider (ribbonBar
);
298 if ( !ribbonBar
->Create(wxDynamicCast(m_parent
, wxWindow
),
302 GetStyle("style", wxRIBBON_BAR_DEFAULT_STYLE
)) )
304 ReportError ("could not create ribbonbar");
308 // Currently the art provider style must be explicitly set to the
310 ribbonBar
->GetArtProvider()
311 ->SetFlags(GetStyle("style", wxRIBBON_BAR_DEFAULT_STYLE
));
313 const wxClassInfo
* const wasInside
= m_isInside
;
314 wxON_BLOCK_EXIT_SET(m_isInside
, wasInside
);
315 m_isInside
= &wxRibbonBar::ms_classInfo
;
317 CreateChildren (ribbonBar
, true);
319 ribbonBar
->Realize();
325 #endif // wxUSE_XRC && wxUSE_RIBBON