1*6d739b60SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*6d739b60SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*6d739b60SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*6d739b60SAndrew Rist  * distributed with this work for additional information
6*6d739b60SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*6d739b60SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*6d739b60SAndrew Rist  * "License"); you may not use this file except in compliance
9*6d739b60SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*6d739b60SAndrew Rist  *
11*6d739b60SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*6d739b60SAndrew Rist  *
13*6d739b60SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*6d739b60SAndrew Rist  * software distributed under the License is distributed on an
15*6d739b60SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*6d739b60SAndrew Rist  * KIND, either express or implied.  See the License for the
17*6d739b60SAndrew Rist  * specific language governing permissions and limitations
18*6d739b60SAndrew Rist  * under the License.
19*6d739b60SAndrew Rist  *
20*6d739b60SAndrew Rist  *************************************************************/
21*6d739b60SAndrew Rist 
22*6d739b60SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <stdio.h>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir //_________________________________________________________________________________________________________________
30cdf0e10cSrcweir //	my own includes
31cdf0e10cSrcweir //_________________________________________________________________________________________________________________
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
34cdf0e10cSrcweir #include <xml/toolboxdocumenthandler.hxx>
35cdf0e10cSrcweir #include <macros/debug.hxx>
36cdf0e10cSrcweir #include <xml/toolboxconfigurationdefines.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir //_________________________________________________________________________________________________________________
39cdf0e10cSrcweir //	interface includes
40cdf0e10cSrcweir //_________________________________________________________________________________________________________________
41cdf0e10cSrcweir #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
42cdf0e10cSrcweir #include <com/sun/star/ui/ItemType.hpp>
43cdf0e10cSrcweir #include <com/sun/star/ui/ItemStyle.hpp>
44cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir //_________________________________________________________________________________________________________________
47cdf0e10cSrcweir //	other includes
48cdf0e10cSrcweir //_________________________________________________________________________________________________________________
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #include <sal/config.h>
51cdf0e10cSrcweir #include <vcl/svapp.hxx>
52cdf0e10cSrcweir #include <vcl/toolbox.hxx>
53cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
54cdf0e10cSrcweir 
55cdf0e10cSrcweir #include <comphelper/attributelist.hxx>
56cdf0e10cSrcweir 
57cdf0e10cSrcweir //_________________________________________________________________________________________________________________
58cdf0e10cSrcweir //	namespace
59cdf0e10cSrcweir //_________________________________________________________________________________________________________________
60cdf0e10cSrcweir 
61cdf0e10cSrcweir using namespace ::com::sun::star::uno;
62cdf0e10cSrcweir using namespace ::com::sun::star::beans;
63cdf0e10cSrcweir using namespace ::com::sun::star::container;
64cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
65cdf0e10cSrcweir 
66cdf0e10cSrcweir 
67cdf0e10cSrcweir #define TOOLBAR_DOCTYPE				"<!DOCTYPE toolbar:toolbar PUBLIC \"-//OpenOffice.org//DTD OfficeDocument 1.0//EN\" \"toolbar.dtd\">"
68cdf0e10cSrcweir 
69cdf0e10cSrcweir namespace framework
70cdf0e10cSrcweir {
71cdf0e10cSrcweir 
72cdf0e10cSrcweir // Property names of a menu/menu item ItemDescriptor
73cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_COMMANDURL[]  = "CommandURL";
74cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_HELPURL[]     = "HelpURL";
75cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_TOOLTIP[]     = "Tooltip";
76cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_LABEL[]       = "Label";
77cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_TYPE[]        = "Type";
78cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_STYLE[]       = "Style";
79cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_VISIBLE[]     = "IsVisible";
80cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_WIDTH[]       = "Width";
81cdf0e10cSrcweir 
ExtractToolbarParameters(const Sequence<PropertyValue> rProp,::rtl::OUString & rCommandURL,::rtl::OUString & rLabel,::rtl::OUString & rHelpURL,::rtl::OUString & rTooltip,sal_Int16 & rStyle,sal_Int16 & rWidth,sal_Bool & rVisible,sal_Int16 & rType)82cdf0e10cSrcweir static void ExtractToolbarParameters( const Sequence< PropertyValue > rProp,
83cdf0e10cSrcweir                                       ::rtl::OUString&                       rCommandURL,
84cdf0e10cSrcweir                                       ::rtl::OUString&                       rLabel,
85cdf0e10cSrcweir                                       ::rtl::OUString&                       rHelpURL,
86cdf0e10cSrcweir                                       ::rtl::OUString&                       rTooltip,
87cdf0e10cSrcweir                                       sal_Int16&                      rStyle,
88cdf0e10cSrcweir                                       sal_Int16&                      rWidth,
89cdf0e10cSrcweir                                       sal_Bool&                       rVisible,
90cdf0e10cSrcweir                                       sal_Int16&                      rType )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     for ( sal_Int32 i = 0; i < rProp.getLength(); i++ )
93cdf0e10cSrcweir     {
94cdf0e10cSrcweir         if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL ))
95cdf0e10cSrcweir         {
96cdf0e10cSrcweir             rProp[i].Value >>= rCommandURL;
97cdf0e10cSrcweir             rCommandURL = rCommandURL.intern();
98cdf0e10cSrcweir         }
99cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_HELPURL ))
100cdf0e10cSrcweir             rProp[i].Value >>= rHelpURL;
101cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TOOLTIP ))
102cdf0e10cSrcweir             rProp[i].Value >>= rTooltip;
103cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL ))
104cdf0e10cSrcweir             rProp[i].Value >>= rLabel;
105cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TYPE ))
106cdf0e10cSrcweir             rProp[i].Value >>= rType;
107cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_VISIBLE ))
108cdf0e10cSrcweir             rProp[i].Value >>= rVisible;
109cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_WIDTH ))
110cdf0e10cSrcweir             rProp[i].Value >>= rWidth;
111cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE ))
112cdf0e10cSrcweir             rProp[i].Value >>= rStyle;
113cdf0e10cSrcweir     }
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir struct ToolboxStyleItem
117cdf0e10cSrcweir {
118cdf0e10cSrcweir     sal_Int16 nBit;
119cdf0e10cSrcweir     const char* attrName;
120cdf0e10cSrcweir };
121cdf0e10cSrcweir 
122cdf0e10cSrcweir ToolboxStyleItem Styles[ ] = {
123cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::RADIO_CHECK, ATTRIBUTE_ITEMSTYLE_RADIO },
124cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::ALIGN_LEFT, ATTRIBUTE_ITEMSTYLE_LEFT },
125cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::AUTO_SIZE, ATTRIBUTE_ITEMSTYLE_AUTO },
126cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::REPEAT, ATTRIBUTE_ITEMSTYLE_REPEAT },
127cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY, ATTRIBUTE_ITEMSTYLE_DROPDOWNONLY },
128cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::DROP_DOWN, ATTRIBUTE_ITEMSTYLE_DROPDOWN },
129cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::ICON, ATTRIBUTE_ITEMSTYLE_IMAGE },
130cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::TEXT, ATTRIBUTE_ITEMSTYLE_TEXT },
131cdf0e10cSrcweir };
132cdf0e10cSrcweir 
133cdf0e10cSrcweir sal_Int32 nStyleItemEntries = sizeof( Styles ) / sizeof( Styles[ 0 ] );
134cdf0e10cSrcweir 
135cdf0e10cSrcweir struct ToolBarEntryProperty
136cdf0e10cSrcweir {
137cdf0e10cSrcweir 	OReadToolBoxDocumentHandler::ToolBox_XML_Namespace	nNamespace;
138cdf0e10cSrcweir 	char												aEntryName[20];
139cdf0e10cSrcweir };
140cdf0e10cSrcweir 
141cdf0e10cSrcweir ToolBarEntryProperty ToolBoxEntries[OReadToolBoxDocumentHandler::TB_XML_ENTRY_COUNT] =
142cdf0e10cSrcweir {
143cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ELEMENT_TOOLBAR				},
144cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ELEMENT_TOOLBARITEM			},
145cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ELEMENT_TOOLBARSPACE		},
146cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ELEMENT_TOOLBARBREAK		},
147cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ELEMENT_TOOLBARSEPARATOR	},
148cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_TEXT				},
149cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_BITMAP			},
150cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_XLINK,		ATTRIBUTE_URL				},
151cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_ITEMBITS			},
152cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_VISIBLE			},
153cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_WIDTH				},
154cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_USER				},
155cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_HELPID			},
156cdf0e10cSrcweir 	{ OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_ITEMSTYLE			},
157cdf0e10cSrcweir     { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,   ATTRIBUTE_UINAME            },
158cdf0e10cSrcweir     { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR,	ATTRIBUTE_TOOLTIP			},
159cdf0e10cSrcweir };
160cdf0e10cSrcweir 
OReadToolBoxDocumentHandler(const Reference<XIndexContainer> & rItemContainer)161cdf0e10cSrcweir OReadToolBoxDocumentHandler::OReadToolBoxDocumentHandler( const Reference< XIndexContainer >& rItemContainer ) :
162cdf0e10cSrcweir 	ThreadHelpBase( &Application::GetSolarMutex() ),
163cdf0e10cSrcweir     m_rItemContainer( rItemContainer ),
164cdf0e10cSrcweir     m_aType( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_TYPE )),
165cdf0e10cSrcweir     m_aLabel( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_LABEL )),
166cdf0e10cSrcweir     m_aStyle( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_STYLE )),
167cdf0e10cSrcweir     m_aHelpURL( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_HELPURL )),
168cdf0e10cSrcweir     m_aTooltip( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_TOOLTIP )),
169cdf0e10cSrcweir     m_aIsVisible( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_VISIBLE )),
170cdf0e10cSrcweir     m_aCommandURL( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_COMMANDURL ))
171cdf0e10cSrcweir  {
172cdf0e10cSrcweir 	::rtl::OUString aNamespaceToolBar( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR ));
173cdf0e10cSrcweir 	::rtl::OUString aNamespaceXLink( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK ));
174cdf0e10cSrcweir 	::rtl::OUString aSeparator( RTL_CONSTASCII_USTRINGPARAM( XMLNS_FILTER_SEPARATOR ));
175cdf0e10cSrcweir 
176cdf0e10cSrcweir 	// create hash map
177cdf0e10cSrcweir 	for ( int i = 0; i < (int)TB_XML_ENTRY_COUNT; i++ )
178cdf0e10cSrcweir 	{
179cdf0e10cSrcweir 		if ( ToolBoxEntries[i].nNamespace == TB_NS_TOOLBAR )
180cdf0e10cSrcweir 		{
181cdf0e10cSrcweir 			::rtl::OUString temp( aNamespaceToolBar );
182cdf0e10cSrcweir 			temp += aSeparator;
183cdf0e10cSrcweir 			temp += ::rtl::OUString::createFromAscii( ToolBoxEntries[i].aEntryName );
184cdf0e10cSrcweir 			m_aToolBoxMap.insert( ToolBoxHashMap::value_type( temp, (ToolBox_XML_Entry)i ) );
185cdf0e10cSrcweir 		}
186cdf0e10cSrcweir 		else
187cdf0e10cSrcweir 		{
188cdf0e10cSrcweir 			::rtl::OUString temp( aNamespaceXLink );
189cdf0e10cSrcweir 			temp += aSeparator;
190cdf0e10cSrcweir 			temp += ::rtl::OUString::createFromAscii( ToolBoxEntries[i].aEntryName );
191cdf0e10cSrcweir 			m_aToolBoxMap.insert( ToolBoxHashMap::value_type( temp, (ToolBox_XML_Entry)i ) );
192cdf0e10cSrcweir 		}
193cdf0e10cSrcweir 	}
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 	// pre-calculate a hash code for all style strings to speed up xml read process
196cdf0e10cSrcweir 	m_nHashCode_Style_Radio		    = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_RADIO ).hashCode();
197cdf0e10cSrcweir 	m_nHashCode_Style_Auto		    = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_AUTO ).hashCode();
198cdf0e10cSrcweir 	m_nHashCode_Style_Left		    = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_LEFT ).hashCode();
199cdf0e10cSrcweir 	m_nHashCode_Style_AutoSize	    = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_AUTOSIZE ).hashCode();
200cdf0e10cSrcweir 	m_nHashCode_Style_DropDown	    = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_DROPDOWN ).hashCode();
201cdf0e10cSrcweir 	m_nHashCode_Style_Repeat	    = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_REPEAT ).hashCode();
202cdf0e10cSrcweir     m_nHashCode_Style_DropDownOnly  = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_DROPDOWNONLY ).hashCode();
203cdf0e10cSrcweir     m_nHashCode_Style_Text  = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_TEXT ).hashCode();
204cdf0e10cSrcweir     m_nHashCode_Style_Image  = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_IMAGE ).hashCode();
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	m_bToolBarStartFound			= sal_False;
207cdf0e10cSrcweir 	m_bToolBarEndFound				= sal_False;
208cdf0e10cSrcweir 	m_bToolBarItemStartFound		= sal_False;
209cdf0e10cSrcweir 	m_bToolBarSpaceStartFound		= sal_False;
210cdf0e10cSrcweir 	m_bToolBarBreakStartFound		= sal_False;
211cdf0e10cSrcweir 	m_bToolBarSeparatorStartFound	= sal_False;
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
~OReadToolBoxDocumentHandler()214cdf0e10cSrcweir OReadToolBoxDocumentHandler::~OReadToolBoxDocumentHandler()
215cdf0e10cSrcweir {
216cdf0e10cSrcweir }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir // XDocumentHandler
startDocument(void)219cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::startDocument(void)
220cdf0e10cSrcweir throw (	SAXException, RuntimeException )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
endDocument(void)224cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::endDocument(void)
225cdf0e10cSrcweir throw(	SAXException, RuntimeException )
226cdf0e10cSrcweir {
227cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 	if (( m_bToolBarStartFound && !m_bToolBarEndFound ) ||
230cdf0e10cSrcweir 		( !m_bToolBarStartFound && m_bToolBarEndFound )		)
231cdf0e10cSrcweir 	{
232cdf0e10cSrcweir 		::rtl::OUString aErrorMessage = getErrorLineString();
233cdf0e10cSrcweir 		aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No matching start or end element 'toolbar' found!" ));
234cdf0e10cSrcweir 		throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
235cdf0e10cSrcweir 	}
236cdf0e10cSrcweir }
237cdf0e10cSrcweir 
startElement(const::rtl::OUString & aName,const Reference<XAttributeList> & xAttribs)238cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::startElement(
239cdf0e10cSrcweir 	const ::rtl::OUString& aName, const Reference< XAttributeList > &xAttribs )
240cdf0e10cSrcweir throw(	SAXException, RuntimeException )
241cdf0e10cSrcweir {
242cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 	ToolBoxHashMap::const_iterator pToolBoxEntry = m_aToolBoxMap.find( aName ) ;
245cdf0e10cSrcweir 	if ( pToolBoxEntry != m_aToolBoxMap.end() )
246cdf0e10cSrcweir 	{
247cdf0e10cSrcweir 		switch ( pToolBoxEntry->second )
248cdf0e10cSrcweir 		{
249cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBAR:
250cdf0e10cSrcweir 			{
251cdf0e10cSrcweir 				if ( m_bToolBarStartFound )
252cdf0e10cSrcweir 				{
253cdf0e10cSrcweir 				    ::rtl::OUString aErrorMessage = getErrorLineString();
254cdf0e10cSrcweir 				    aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'toolbar:toolbar' cannot be embeded into 'toolbar:toolbar'!" ));
255cdf0e10cSrcweir 				    throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
256cdf0e10cSrcweir 				}
257cdf0e10cSrcweir                         else
258cdf0e10cSrcweir                         {
259cdf0e10cSrcweir                             // Check if we have a UI name set in our XML file
260cdf0e10cSrcweir                             ::rtl::OUString aUIName;
261cdf0e10cSrcweir                             for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ )
262cdf0e10cSrcweir 			          {
263cdf0e10cSrcweir 				        pToolBoxEntry = m_aToolBoxMap.find( xAttribs->getNameByIndex( n ) );
264cdf0e10cSrcweir 				        if ( pToolBoxEntry != m_aToolBoxMap.end() )
265cdf0e10cSrcweir 				        {
266cdf0e10cSrcweir                                     switch ( pToolBoxEntry->second )
267cdf0e10cSrcweir                                     {
268cdf0e10cSrcweir                                         case TB_ATTRIBUTE_UINAME:
269cdf0e10cSrcweir 				                    aUIName = xAttribs->getValueByIndex( n );
270cdf0e10cSrcweir                                             break;
271cdf0e10cSrcweir                                         default:
272cdf0e10cSrcweir                                             break;
273cdf0e10cSrcweir                                     }
274cdf0e10cSrcweir                                 }
275cdf0e10cSrcweir                             }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir                             if ( aUIName.getLength() > 0 )
278cdf0e10cSrcweir                             {
279cdf0e10cSrcweir                                 // Try to set UI name as a container property
280cdf0e10cSrcweir                                 Reference< XPropertySet > xPropSet( m_rItemContainer, UNO_QUERY );
281cdf0e10cSrcweir                                 if ( xPropSet.is() )
282cdf0e10cSrcweir                                 {
283cdf0e10cSrcweir                                     try
284cdf0e10cSrcweir                                     {
285cdf0e10cSrcweir                                         xPropSet->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" )), makeAny( aUIName ) );
286cdf0e10cSrcweir                                     }
287cdf0e10cSrcweir                                     catch ( UnknownPropertyException& )
288cdf0e10cSrcweir                                     {
289cdf0e10cSrcweir                                     }
290cdf0e10cSrcweir                                 }
291cdf0e10cSrcweir                             }
292cdf0e10cSrcweir                         }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 				m_bToolBarStartFound = sal_True;
295cdf0e10cSrcweir 			}
296cdf0e10cSrcweir 			break;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARITEM:
299cdf0e10cSrcweir 			{
300cdf0e10cSrcweir 				if ( !m_bToolBarStartFound )
301cdf0e10cSrcweir 				{
302cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
303cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'toolbar:toolbaritem' must be embeded into element 'toolbar:toolbar'!" ));
304cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
305cdf0e10cSrcweir 				}
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 				if ( m_bToolBarSeparatorStartFound ||
308cdf0e10cSrcweir 					 m_bToolBarBreakStartFound ||
309cdf0e10cSrcweir 					 m_bToolBarSpaceStartFound ||
310cdf0e10cSrcweir 					 m_bToolBarItemStartFound )
311cdf0e10cSrcweir 				{
312cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
313cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbaritem is not a container!" ));
314cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
315cdf0e10cSrcweir 				}
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 				::rtl::OUString aAttribute;
318cdf0e10cSrcweir 				sal_Bool bAttributeURL	= sal_False;
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 				m_bToolBarItemStartFound = sal_True;
321cdf0e10cSrcweir                 ::rtl::OUString        aLabel;
322cdf0e10cSrcweir                 ::rtl::OUString        aCommandURL;
323cdf0e10cSrcweir                 ::rtl::OUString        aHelpURL;
324cdf0e10cSrcweir                 ::rtl::OUString        aTooltip;
325cdf0e10cSrcweir                 ::rtl::OUString        aBitmapName;
326cdf0e10cSrcweir                 sal_uInt16      nItemBits( 0 );
327cdf0e10cSrcweir                 sal_uInt16      nWidth( 0 );
328cdf0e10cSrcweir                 sal_uInt16      nUserDef( 0 );
329cdf0e10cSrcweir                 sal_Bool        bVisible( sal_True );
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 				for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ )
332cdf0e10cSrcweir 				{
333cdf0e10cSrcweir 					pToolBoxEntry = m_aToolBoxMap.find( xAttribs->getNameByIndex( n ) );
334cdf0e10cSrcweir 					if ( pToolBoxEntry != m_aToolBoxMap.end() )
335cdf0e10cSrcweir 					{
336cdf0e10cSrcweir 						switch ( pToolBoxEntry->second )
337cdf0e10cSrcweir 						{
338cdf0e10cSrcweir 							case TB_ATTRIBUTE_TEXT:
339cdf0e10cSrcweir 							{
340cdf0e10cSrcweir 								aLabel = xAttribs->getValueByIndex( n );
341cdf0e10cSrcweir 							}
342cdf0e10cSrcweir 							break;
343cdf0e10cSrcweir 
344cdf0e10cSrcweir 							case TB_ATTRIBUTE_BITMAP:
345cdf0e10cSrcweir 							{
346cdf0e10cSrcweir 								aBitmapName = xAttribs->getValueByIndex( n );
347cdf0e10cSrcweir 							}
348cdf0e10cSrcweir 							break;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 							case TB_ATTRIBUTE_URL:
351cdf0e10cSrcweir 							{
352cdf0e10cSrcweir 								bAttributeURL	= sal_True;
353cdf0e10cSrcweir 								aCommandURL		= xAttribs->getValueByIndex( n ).intern();
354cdf0e10cSrcweir 							}
355cdf0e10cSrcweir 							break;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 							case TB_ATTRIBUTE_ITEMBITS:
358cdf0e10cSrcweir 							{
359cdf0e10cSrcweir 								nItemBits = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32());
360cdf0e10cSrcweir 							}
361cdf0e10cSrcweir 							break;
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 							case TB_ATTRIBUTE_VISIBLE:
364cdf0e10cSrcweir 							{
365cdf0e10cSrcweir 								if ( xAttribs->getValueByIndex( n ).equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_BOOLEAN_TRUE )) )
366cdf0e10cSrcweir 									bVisible = sal_True;
367cdf0e10cSrcweir 								else if ( xAttribs->getValueByIndex( n ).equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_BOOLEAN_FALSE )) )
368cdf0e10cSrcweir 									bVisible = sal_False;
369cdf0e10cSrcweir 								else
370cdf0e10cSrcweir 								{
371cdf0e10cSrcweir 									::rtl::OUString aErrorMessage = getErrorLineString();
372cdf0e10cSrcweir 									aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Attribute toolbar:visible must have value 'true' or 'false'!" ));
373cdf0e10cSrcweir 									throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
374cdf0e10cSrcweir 								}
375cdf0e10cSrcweir 							}
376cdf0e10cSrcweir 							break;
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 							case TB_ATTRIBUTE_WIDTH:
379cdf0e10cSrcweir 							{
380cdf0e10cSrcweir 								nWidth = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32());
381cdf0e10cSrcweir 							}
382cdf0e10cSrcweir 							break;
383cdf0e10cSrcweir 
384cdf0e10cSrcweir 							case TB_ATTRIBUTE_USER:
385cdf0e10cSrcweir 							{
386cdf0e10cSrcweir 								nUserDef = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32());
387cdf0e10cSrcweir 							}
388cdf0e10cSrcweir 							break;
389cdf0e10cSrcweir 
390cdf0e10cSrcweir 							case TB_ATTRIBUTE_HELPID:
391cdf0e10cSrcweir 							{
392cdf0e10cSrcweir 								aHelpURL = xAttribs->getValueByIndex( n );
393cdf0e10cSrcweir 							}
394cdf0e10cSrcweir 							break;
395cdf0e10cSrcweir 
396cdf0e10cSrcweir                             case TB_ATTRIBUTE_TOOLTIP:
397cdf0e10cSrcweir                             {
398cdf0e10cSrcweir                                 aTooltip = xAttribs->getValueByIndex( n );
399cdf0e10cSrcweir                             }
400cdf0e10cSrcweir                             break;
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 							case TB_ATTRIBUTE_STYLE:
403cdf0e10cSrcweir 							{
404cdf0e10cSrcweir 								// read space seperated item style list
405cdf0e10cSrcweir 								::rtl::OUString aTemp = xAttribs->getValueByIndex( n );
406cdf0e10cSrcweir 								sal_Int32 nIndex = 0;
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 								do
409cdf0e10cSrcweir 								{
410cdf0e10cSrcweir 									::rtl::OUString aToken	= aTemp.getToken( 0, ' ', nIndex );
411cdf0e10cSrcweir 									if ( aToken.getLength() > 0 )
412cdf0e10cSrcweir 									{
413cdf0e10cSrcweir 										sal_Int32 nHashCode = aToken.hashCode();
414cdf0e10cSrcweir 										if ( nHashCode == m_nHashCode_Style_Radio )
415cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::RADIO_CHECK;
416cdf0e10cSrcweir 										else if ( nHashCode == m_nHashCode_Style_Left )
417cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::ALIGN_LEFT;
418cdf0e10cSrcweir 										else if ( nHashCode == m_nHashCode_Style_AutoSize )
419cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::AUTO_SIZE;
420cdf0e10cSrcweir 										else if ( nHashCode == m_nHashCode_Style_DropDown )
421cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::DROP_DOWN;
422cdf0e10cSrcweir 										else if ( nHashCode == m_nHashCode_Style_Repeat )
423cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::REPEAT;
424cdf0e10cSrcweir                                         else if ( nHashCode == m_nHashCode_Style_DropDownOnly )
425cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY;
426cdf0e10cSrcweir                                         else if ( nHashCode == m_nHashCode_Style_DropDown )
427cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::DROP_DOWN;
428cdf0e10cSrcweir                                         else if ( nHashCode == m_nHashCode_Style_Text )
429cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::TEXT;
430cdf0e10cSrcweir                                         else if ( nHashCode == m_nHashCode_Style_Image )
431cdf0e10cSrcweir                                             nItemBits |= ::com::sun::star::ui::ItemStyle::ICON;
432cdf0e10cSrcweir 									}
433cdf0e10cSrcweir 								}
434cdf0e10cSrcweir 								while ( nIndex >= 0 );
435cdf0e10cSrcweir 							}
436cdf0e10cSrcweir 							break;
437cdf0e10cSrcweir 
438cdf0e10cSrcweir                                           default:
439cdf0e10cSrcweir                                               break;
440cdf0e10cSrcweir 						}
441cdf0e10cSrcweir 					}
442cdf0e10cSrcweir 				} // for
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 				if ( !bAttributeURL )
445cdf0e10cSrcweir 				{
446cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
447cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute toolbar:url must have a value!" ));
448cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
449cdf0e10cSrcweir 				}
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 		        if ( aCommandURL.getLength() > 0 )
452cdf0e10cSrcweir 		        {
453cdf0e10cSrcweir                     Sequence< PropertyValue > aToolbarItemProp( 7 );
454cdf0e10cSrcweir                     aToolbarItemProp[0].Name = m_aCommandURL;
455cdf0e10cSrcweir                     aToolbarItemProp[1].Name = m_aHelpURL;
456cdf0e10cSrcweir                     aToolbarItemProp[2].Name = m_aLabel;
457cdf0e10cSrcweir                     aToolbarItemProp[3].Name = m_aType;
458cdf0e10cSrcweir                     aToolbarItemProp[4].Name = m_aStyle;
459cdf0e10cSrcweir                     aToolbarItemProp[5].Name = m_aIsVisible;
460cdf0e10cSrcweir                     aToolbarItemProp[6].Name = m_aTooltip;
461cdf0e10cSrcweir 
462cdf0e10cSrcweir                     aToolbarItemProp[0].Value <<= aCommandURL;
463cdf0e10cSrcweir                     aToolbarItemProp[1].Value <<= aHelpURL;
464cdf0e10cSrcweir                     aToolbarItemProp[2].Value <<= aLabel;
465cdf0e10cSrcweir                     aToolbarItemProp[3].Value = makeAny( ::com::sun::star::ui::ItemType::DEFAULT );
466cdf0e10cSrcweir                     aToolbarItemProp[4].Value <<= nItemBits;
467cdf0e10cSrcweir                     aToolbarItemProp[5].Value <<= bVisible;
468cdf0e10cSrcweir                     aToolbarItemProp[6].Value <<= aTooltip;
469cdf0e10cSrcweir 
470cdf0e10cSrcweir                     m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) );
471cdf0e10cSrcweir 		        }
472cdf0e10cSrcweir 			}
473cdf0e10cSrcweir 			break;
474cdf0e10cSrcweir 
475cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARSPACE:
476cdf0e10cSrcweir 			{
477cdf0e10cSrcweir 				if ( m_bToolBarSeparatorStartFound ||
478cdf0e10cSrcweir 					 m_bToolBarBreakStartFound ||
479cdf0e10cSrcweir 					 m_bToolBarSpaceStartFound ||
480cdf0e10cSrcweir 					 m_bToolBarItemStartFound )
481cdf0e10cSrcweir 				{
482cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
483cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarspace is not a container!" ));
484cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
485cdf0e10cSrcweir 				}
486cdf0e10cSrcweir 
487cdf0e10cSrcweir 				m_bToolBarSpaceStartFound = sal_True;
488cdf0e10cSrcweir 
489cdf0e10cSrcweir                 Sequence< PropertyValue > aToolbarItemProp( 2 );
490cdf0e10cSrcweir                 aToolbarItemProp[0].Name = m_aCommandURL;
491cdf0e10cSrcweir                 aToolbarItemProp[1].Name = m_aType;
492cdf0e10cSrcweir 
493cdf0e10cSrcweir                 aToolbarItemProp[0].Value <<= rtl::OUString();
494cdf0e10cSrcweir                 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_SPACE;
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 				m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) );
497cdf0e10cSrcweir 			}
498cdf0e10cSrcweir 			break;
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARBREAK:
501cdf0e10cSrcweir 			{
502cdf0e10cSrcweir 				if ( m_bToolBarSeparatorStartFound ||
503cdf0e10cSrcweir 					 m_bToolBarBreakStartFound ||
504cdf0e10cSrcweir 					 m_bToolBarSpaceStartFound ||
505cdf0e10cSrcweir 					 m_bToolBarItemStartFound )
506cdf0e10cSrcweir 				{
507cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
508cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarbreak is not a container!" ));
509cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
510cdf0e10cSrcweir 				}
511cdf0e10cSrcweir 
512cdf0e10cSrcweir 				m_bToolBarBreakStartFound = sal_True;
513cdf0e10cSrcweir 
514cdf0e10cSrcweir                 Sequence< PropertyValue > aToolbarItemProp( 2 );
515cdf0e10cSrcweir                 aToolbarItemProp[0].Name = m_aCommandURL;
516cdf0e10cSrcweir                 aToolbarItemProp[1].Name = m_aType;
517cdf0e10cSrcweir 
518cdf0e10cSrcweir                 aToolbarItemProp[0].Value <<= rtl::OUString();
519cdf0e10cSrcweir                 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK;
520cdf0e10cSrcweir 
521cdf0e10cSrcweir 				m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) );
522cdf0e10cSrcweir 			}
523cdf0e10cSrcweir 			break;
524cdf0e10cSrcweir 
525cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARSEPARATOR:
526cdf0e10cSrcweir 			{
527cdf0e10cSrcweir 				if ( m_bToolBarSeparatorStartFound ||
528cdf0e10cSrcweir 					 m_bToolBarBreakStartFound ||
529cdf0e10cSrcweir 					 m_bToolBarSpaceStartFound ||
530cdf0e10cSrcweir 					 m_bToolBarItemStartFound )
531cdf0e10cSrcweir 				{
532cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
533cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarseparator is not a container!" ));
534cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
535cdf0e10cSrcweir 				}
536cdf0e10cSrcweir 
537cdf0e10cSrcweir 				m_bToolBarSeparatorStartFound = sal_True;
538cdf0e10cSrcweir 
539cdf0e10cSrcweir                 Sequence< PropertyValue > aToolbarItemProp( 2 );
540cdf0e10cSrcweir                 aToolbarItemProp[0].Name = m_aCommandURL;
541cdf0e10cSrcweir                 aToolbarItemProp[1].Name = m_aType;
542cdf0e10cSrcweir 
543cdf0e10cSrcweir                 aToolbarItemProp[0].Value <<= rtl::OUString();
544cdf0e10cSrcweir                 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_LINE;
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 				m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) );
547cdf0e10cSrcweir 			}
548cdf0e10cSrcweir 			break;
549cdf0e10cSrcweir 
550cdf0e10cSrcweir                   default:
551cdf0e10cSrcweir                       break;
552cdf0e10cSrcweir 		}
553cdf0e10cSrcweir 	}
554cdf0e10cSrcweir }
555cdf0e10cSrcweir 
endElement(const::rtl::OUString & aName)556cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::endElement(const ::rtl::OUString& aName)
557cdf0e10cSrcweir throw(	SAXException, RuntimeException )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 	ToolBoxHashMap::const_iterator pToolBoxEntry = m_aToolBoxMap.find( aName ) ;
562cdf0e10cSrcweir 	if ( pToolBoxEntry != m_aToolBoxMap.end() )
563cdf0e10cSrcweir 	{
564cdf0e10cSrcweir 		switch ( pToolBoxEntry->second )
565cdf0e10cSrcweir 		{
566cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBAR:
567cdf0e10cSrcweir 			{
568cdf0e10cSrcweir 				if ( !m_bToolBarStartFound )
569cdf0e10cSrcweir 				{
570cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
571cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar' found, but no start element 'toolbar'" ));
572cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
573cdf0e10cSrcweir 				}
574cdf0e10cSrcweir 
575cdf0e10cSrcweir 				m_bToolBarStartFound = sal_False;
576cdf0e10cSrcweir 			}
577cdf0e10cSrcweir 			break;
578cdf0e10cSrcweir 
579cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARITEM:
580cdf0e10cSrcweir 			{
581cdf0e10cSrcweir 				if ( !m_bToolBarItemStartFound )
582cdf0e10cSrcweir 				{
583cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
584cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbaritem' found, but no start element 'toolbar:toolbaritem'" ));
585cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
586cdf0e10cSrcweir 				}
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 				m_bToolBarItemStartFound = sal_False;
589cdf0e10cSrcweir 			}
590cdf0e10cSrcweir 			break;
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARBREAK:
593cdf0e10cSrcweir 			{
594cdf0e10cSrcweir 				if ( !m_bToolBarBreakStartFound )
595cdf0e10cSrcweir 				{
596cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
597cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarbreak' found, but no start element 'toolbar:toolbarbreak'" ));
598cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
599cdf0e10cSrcweir 				}
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 				m_bToolBarBreakStartFound = sal_False;
602cdf0e10cSrcweir 			}
603cdf0e10cSrcweir 			break;
604cdf0e10cSrcweir 
605cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARSPACE:
606cdf0e10cSrcweir 			{
607cdf0e10cSrcweir 				if ( !m_bToolBarSpaceStartFound )
608cdf0e10cSrcweir 				{
609cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
610cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarspace' found, but no start element 'toolbar:toolbarspace'" ));
611cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
612cdf0e10cSrcweir 				}
613cdf0e10cSrcweir 
614cdf0e10cSrcweir 				m_bToolBarSpaceStartFound = sal_False;
615cdf0e10cSrcweir 			}
616cdf0e10cSrcweir 			break;
617cdf0e10cSrcweir 
618cdf0e10cSrcweir 			case TB_ELEMENT_TOOLBARSEPARATOR:
619cdf0e10cSrcweir 			{
620cdf0e10cSrcweir 				if ( !m_bToolBarSeparatorStartFound )
621cdf0e10cSrcweir 				{
622cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
623cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarseparator' found, but no start element 'toolbar:toolbarseparator'" ));
624cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
625cdf0e10cSrcweir 				}
626cdf0e10cSrcweir 
627cdf0e10cSrcweir 				m_bToolBarSeparatorStartFound = sal_False;
628cdf0e10cSrcweir 			}
629cdf0e10cSrcweir 			break;
630cdf0e10cSrcweir 
631cdf0e10cSrcweir                   default:
632cdf0e10cSrcweir                       break;
633cdf0e10cSrcweir 		}
634cdf0e10cSrcweir 	}
635cdf0e10cSrcweir }
636cdf0e10cSrcweir 
characters(const::rtl::OUString &)637cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::characters(const ::rtl::OUString&)
638cdf0e10cSrcweir throw(	SAXException, RuntimeException )
639cdf0e10cSrcweir {
640cdf0e10cSrcweir }
641cdf0e10cSrcweir 
ignorableWhitespace(const::rtl::OUString &)642cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::ignorableWhitespace(const ::rtl::OUString&)
643cdf0e10cSrcweir throw(	SAXException, RuntimeException )
644cdf0e10cSrcweir {
645cdf0e10cSrcweir }
646cdf0e10cSrcweir 
processingInstruction(const::rtl::OUString &,const::rtl::OUString &)647cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::processingInstruction(
648cdf0e10cSrcweir 	const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ )
649cdf0e10cSrcweir throw(	SAXException, RuntimeException )
650cdf0e10cSrcweir {
651cdf0e10cSrcweir }
652cdf0e10cSrcweir 
setDocumentLocator(const Reference<XLocator> & xLocator)653cdf0e10cSrcweir void SAL_CALL OReadToolBoxDocumentHandler::setDocumentLocator(
654cdf0e10cSrcweir 	const Reference< XLocator > &xLocator)
655cdf0e10cSrcweir throw(	SAXException, RuntimeException )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
658cdf0e10cSrcweir 
659cdf0e10cSrcweir 	m_xLocator = xLocator;
660cdf0e10cSrcweir }
661cdf0e10cSrcweir 
getErrorLineString()662cdf0e10cSrcweir ::rtl::OUString OReadToolBoxDocumentHandler::getErrorLineString()
663cdf0e10cSrcweir {
664cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
665cdf0e10cSrcweir 
666cdf0e10cSrcweir 	char buffer[32];
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 	if ( m_xLocator.is() )
669cdf0e10cSrcweir 	{
670cdf0e10cSrcweir 		snprintf( buffer, sizeof(buffer), "Line: %ld - ", static_cast<long>( m_xLocator->getLineNumber() ));
671cdf0e10cSrcweir 		return ::rtl::OUString::createFromAscii( buffer );
672cdf0e10cSrcweir 	}
673cdf0e10cSrcweir 	else
674cdf0e10cSrcweir 		return ::rtl::OUString();
675cdf0e10cSrcweir }
676cdf0e10cSrcweir 
677cdf0e10cSrcweir 
678cdf0e10cSrcweir //_________________________________________________________________________________________________________________
679cdf0e10cSrcweir //	OWriteToolBoxDocumentHandler
680cdf0e10cSrcweir //_________________________________________________________________________________________________________________
681cdf0e10cSrcweir 
OWriteToolBoxDocumentHandler(const Reference<XIndexAccess> & rItemAccess,Reference<XDocumentHandler> & rWriteDocumentHandler)682cdf0e10cSrcweir OWriteToolBoxDocumentHandler::OWriteToolBoxDocumentHandler(
683cdf0e10cSrcweir     const Reference< XIndexAccess >& rItemAccess,
684cdf0e10cSrcweir     Reference< XDocumentHandler >& rWriteDocumentHandler ) :
685cdf0e10cSrcweir 	ThreadHelpBase( &Application::GetSolarMutex() ),
686cdf0e10cSrcweir 	m_xWriteDocumentHandler( rWriteDocumentHandler ),
687cdf0e10cSrcweir 	m_rItemAccess( rItemAccess )
688cdf0e10cSrcweir {
689cdf0e10cSrcweir     ::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
690cdf0e10cSrcweir 	m_xEmptyList		= Reference< XAttributeList >( (XAttributeList *) pList, UNO_QUERY );
691cdf0e10cSrcweir 	m_aAttributeType	= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE_CDATA ));
692cdf0e10cSrcweir 	m_aXMLXlinkNS		= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_PREFIX ));
693cdf0e10cSrcweir 	m_aXMLToolbarNS		= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR_PREFIX ));
694cdf0e10cSrcweir }
695cdf0e10cSrcweir 
~OWriteToolBoxDocumentHandler()696cdf0e10cSrcweir OWriteToolBoxDocumentHandler::~OWriteToolBoxDocumentHandler()
697cdf0e10cSrcweir {
698cdf0e10cSrcweir }
699cdf0e10cSrcweir 
WriteToolBoxDocument()700cdf0e10cSrcweir void OWriteToolBoxDocumentHandler::WriteToolBoxDocument() throw
701cdf0e10cSrcweir ( SAXException, RuntimeException )
702cdf0e10cSrcweir {
703cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
704cdf0e10cSrcweir 
705cdf0e10cSrcweir 	m_xWriteDocumentHandler->startDocument();
706cdf0e10cSrcweir 
707cdf0e10cSrcweir 	// write DOCTYPE line!
708cdf0e10cSrcweir 	Reference< XExtendedDocumentHandler > xExtendedDocHandler( m_xWriteDocumentHandler, UNO_QUERY );
709cdf0e10cSrcweir 	if ( xExtendedDocHandler.is() )
710cdf0e10cSrcweir 	{
711cdf0e10cSrcweir 		xExtendedDocHandler->unknown( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( TOOLBAR_DOCTYPE )) );
712cdf0e10cSrcweir 		m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
713cdf0e10cSrcweir 	}
714cdf0e10cSrcweir 
715cdf0e10cSrcweir     ::rtl::OUString aUIName;
716cdf0e10cSrcweir     Reference< XPropertySet > xPropSet( m_rItemAccess, UNO_QUERY );
717cdf0e10cSrcweir     if ( xPropSet.is() )
718cdf0e10cSrcweir     {
719cdf0e10cSrcweir         try
720cdf0e10cSrcweir         {
721cdf0e10cSrcweir             xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" ))) >>= aUIName;
722cdf0e10cSrcweir         }
723cdf0e10cSrcweir         catch ( UnknownPropertyException& )
724cdf0e10cSrcweir         {
725cdf0e10cSrcweir         }
726cdf0e10cSrcweir     }
727cdf0e10cSrcweir 
728cdf0e10cSrcweir     ::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
729cdf0e10cSrcweir 	Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY );
730cdf0e10cSrcweir 
731cdf0e10cSrcweir 	pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_TOOLBAR )),
732cdf0e10cSrcweir 						 m_aAttributeType,
733cdf0e10cSrcweir 						 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR )) );
734cdf0e10cSrcweir 
735cdf0e10cSrcweir 	pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_XLINK )),
736cdf0e10cSrcweir 						 m_aAttributeType,
737cdf0e10cSrcweir 						 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK )) );
738cdf0e10cSrcweir 
739cdf0e10cSrcweir     if ( aUIName.getLength() > 0 )
740cdf0e10cSrcweir         pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_UINAME )),
741cdf0e10cSrcweir                              m_aAttributeType,
742cdf0e10cSrcweir                              aUIName );
743cdf0e10cSrcweir 
744cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBAR )), pList );
745cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
746cdf0e10cSrcweir 
747cdf0e10cSrcweir 	sal_Int32  nItemCount = m_rItemAccess->getCount();
748cdf0e10cSrcweir     Any        aAny;
749cdf0e10cSrcweir 
750cdf0e10cSrcweir 	for ( sal_Int32 nItemPos = 0; nItemPos < nItemCount; nItemPos++ )
751cdf0e10cSrcweir 	{
752cdf0e10cSrcweir         Sequence< PropertyValue > aProps;
753cdf0e10cSrcweir         aAny = m_rItemAccess->getByIndex( nItemPos );
754cdf0e10cSrcweir         if ( aAny >>= aProps )
755cdf0e10cSrcweir         {
756cdf0e10cSrcweir             ::rtl::OUString    aCommandURL;
757cdf0e10cSrcweir             ::rtl::OUString    aLabel;
758cdf0e10cSrcweir             ::rtl::OUString    aHelpURL;
759cdf0e10cSrcweir             ::rtl::OUString    aTooltip;
760cdf0e10cSrcweir             sal_Bool    bVisible( sal_True );
761cdf0e10cSrcweir             sal_Int16   nType( ::com::sun::star::ui::ItemType::DEFAULT );
762cdf0e10cSrcweir             sal_Int16   nWidth( 0 );
763cdf0e10cSrcweir             sal_Int16   nStyle( 0 );
764cdf0e10cSrcweir 
765cdf0e10cSrcweir             ExtractToolbarParameters( aProps, aCommandURL, aLabel, aHelpURL, aTooltip, nStyle, nWidth, bVisible, nType );
766cdf0e10cSrcweir             if ( nType == ::com::sun::star::ui::ItemType::DEFAULT )
767cdf0e10cSrcweir                 WriteToolBoxItem( aCommandURL, aLabel, aHelpURL, aTooltip, nStyle, nWidth, bVisible );
768cdf0e10cSrcweir             else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_SPACE )
769cdf0e10cSrcweir 				WriteToolBoxSpace();
770cdf0e10cSrcweir             else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINE )
771cdf0e10cSrcweir 				WriteToolBoxSeparator();
772cdf0e10cSrcweir             else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK )
773cdf0e10cSrcweir 				WriteToolBoxBreak();
774cdf0e10cSrcweir 		}
775cdf0e10cSrcweir 	}
776cdf0e10cSrcweir 
777cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
778cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBAR )) );
779cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
780cdf0e10cSrcweir 	m_xWriteDocumentHandler->endDocument();
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
783cdf0e10cSrcweir //_________________________________________________________________________________________________________________
784cdf0e10cSrcweir //	protected member functions
785cdf0e10cSrcweir //_________________________________________________________________________________________________________________
786cdf0e10cSrcweir 
WriteToolBoxItem(const::rtl::OUString & rCommandURL,const::rtl::OUString & rLabel,const::rtl::OUString & rHelpURL,const::rtl::OUString & rTooltip,sal_Int16 nStyle,sal_Int16 nWidth,sal_Bool bVisible)787cdf0e10cSrcweir void OWriteToolBoxDocumentHandler::WriteToolBoxItem(
788cdf0e10cSrcweir     const ::rtl::OUString& rCommandURL,
789cdf0e10cSrcweir     const ::rtl::OUString& rLabel,
790cdf0e10cSrcweir     const ::rtl::OUString& rHelpURL,
791cdf0e10cSrcweir     const ::rtl::OUString& rTooltip,
792cdf0e10cSrcweir     sal_Int16       nStyle,
793cdf0e10cSrcweir     sal_Int16       nWidth,
794cdf0e10cSrcweir     sal_Bool        bVisible )
795cdf0e10cSrcweir throw ( SAXException, RuntimeException )
796cdf0e10cSrcweir {
797cdf0e10cSrcweir     ::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
798cdf0e10cSrcweir 	Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY );
799cdf0e10cSrcweir 
800cdf0e10cSrcweir 	if ( m_aAttributeURL.getLength() == 0 )
801cdf0e10cSrcweir 	{
802cdf0e10cSrcweir 		m_aAttributeURL = m_aXMLXlinkNS;
803cdf0e10cSrcweir 		m_aAttributeURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_URL ));
804cdf0e10cSrcweir 	}
805cdf0e10cSrcweir 
806cdf0e10cSrcweir     // save required attribute (URL)
807cdf0e10cSrcweir 	pList->AddAttribute( m_aAttributeURL, m_aAttributeType, rCommandURL );
808cdf0e10cSrcweir 
809cdf0e10cSrcweir 	if ( rLabel.getLength() > 0 )
810cdf0e10cSrcweir 	{
811cdf0e10cSrcweir 		pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TEXT )),
812cdf0e10cSrcweir 							 m_aAttributeType,
813cdf0e10cSrcweir 							 rLabel );
814cdf0e10cSrcweir 	}
815cdf0e10cSrcweir 
816cdf0e10cSrcweir 	if ( bVisible == sal_False )
817cdf0e10cSrcweir 	{
818cdf0e10cSrcweir 		pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_VISIBLE )),
819cdf0e10cSrcweir 							 m_aAttributeType,
820cdf0e10cSrcweir 							 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_BOOLEAN_FALSE )) );
821cdf0e10cSrcweir 	}
822cdf0e10cSrcweir 
823cdf0e10cSrcweir 	if ( rHelpURL.getLength() > 0 )
824cdf0e10cSrcweir 	{
825cdf0e10cSrcweir 		pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HELPID )),
826cdf0e10cSrcweir 							 m_aAttributeType,
827cdf0e10cSrcweir 							 rHelpURL );
828cdf0e10cSrcweir 	}
829cdf0e10cSrcweir 
830cdf0e10cSrcweir     if ( rTooltip.getLength() > 0 )
831cdf0e10cSrcweir     {
832cdf0e10cSrcweir         pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TOOLTIP )),
833cdf0e10cSrcweir                              m_aAttributeType,
834cdf0e10cSrcweir                              rTooltip );
835cdf0e10cSrcweir     }
836cdf0e10cSrcweir 
837cdf0e10cSrcweir     if ( nStyle > 0 )
838cdf0e10cSrcweir     {
839cdf0e10cSrcweir         rtl::OUString aValue;
840cdf0e10cSrcweir         ToolboxStyleItem* pStyle = Styles;
841cdf0e10cSrcweir 
842cdf0e10cSrcweir         for ( sal_Int32 nIndex = 0; nIndex < nStyleItemEntries; ++nIndex, ++pStyle )
843cdf0e10cSrcweir         {
844cdf0e10cSrcweir             if ( nStyle & pStyle->nBit )
845cdf0e10cSrcweir             {
846cdf0e10cSrcweir                 if ( aValue.getLength() )
847cdf0e10cSrcweir                     aValue = aValue.concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(" ") ) );
848cdf0e10cSrcweir                 aValue += rtl::OUString::createFromAscii( pStyle->attrName );
849cdf0e10cSrcweir             }
850cdf0e10cSrcweir         }
851cdf0e10cSrcweir         pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_ITEMSTYLE )),
852cdf0e10cSrcweir                              m_aAttributeType,
853cdf0e10cSrcweir                              aValue );
854cdf0e10cSrcweir     }
855cdf0e10cSrcweir 
856cdf0e10cSrcweir     if ( nWidth > 0 )
857cdf0e10cSrcweir     {
858cdf0e10cSrcweir 		pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_WIDTH )),
859cdf0e10cSrcweir 							 m_aAttributeType,
860cdf0e10cSrcweir                              ::rtl::OUString::valueOf( sal_Int32( nWidth )) );
861cdf0e10cSrcweir     }
862cdf0e10cSrcweir 
863cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
864cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARITEM )), xList );
865cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
866cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARITEM )) );
867cdf0e10cSrcweir }
868cdf0e10cSrcweir 
WriteToolBoxSpace()869cdf0e10cSrcweir void OWriteToolBoxDocumentHandler::WriteToolBoxSpace() throw
870cdf0e10cSrcweir ( SAXException, RuntimeException )
871cdf0e10cSrcweir {
872cdf0e10cSrcweir     m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
873cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSPACE )), m_xEmptyList );
874cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
875cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSPACE )) );
876cdf0e10cSrcweir }
877cdf0e10cSrcweir 
WriteToolBoxBreak()878cdf0e10cSrcweir void OWriteToolBoxDocumentHandler::WriteToolBoxBreak() throw
879cdf0e10cSrcweir ( SAXException, RuntimeException )
880cdf0e10cSrcweir {
881cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
882cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARBREAK )), m_xEmptyList );
883cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
884cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARBREAK )) );
885cdf0e10cSrcweir }
886cdf0e10cSrcweir 
WriteToolBoxSeparator()887cdf0e10cSrcweir void OWriteToolBoxDocumentHandler::WriteToolBoxSeparator() throw
888cdf0e10cSrcweir ( SAXException, RuntimeException )
889cdf0e10cSrcweir {
890cdf0e10cSrcweir     m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
891cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSEPARATOR )), m_xEmptyList );
892cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
893cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSEPARATOR )) );
894cdf0e10cSrcweir }
895cdf0e10cSrcweir 
896cdf0e10cSrcweir } // namespace framework
897cdf0e10cSrcweir 
898