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 #include <xml/menudocumenthandler.hxx>
33cdf0e10cSrcweir #include <framework/menuconfiguration.hxx>
34cdf0e10cSrcweir #include <framework/addonmenu.hxx>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir //_________________________________________________________________________________________________________________
37cdf0e10cSrcweir //	interface includes
38cdf0e10cSrcweir //_________________________________________________________________________________________________________________
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
41cdf0e10cSrcweir #include <com/sun/star/lang/XSingleComponentFactory.hpp>
42cdf0e10cSrcweir #include <com/sun/star/ui/ItemType.hpp>
43cdf0e10cSrcweir #include <com/sun/star/ui/ItemStyle.hpp>
44cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
45cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir //_________________________________________________________________________________________________________________
48cdf0e10cSrcweir //	other includes
49cdf0e10cSrcweir //_________________________________________________________________________________________________________________
50cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
51cdf0e10cSrcweir #include <rtl/logfile.hxx>
52cdf0e10cSrcweir #include <comphelper/attributelist.hxx>
53cdf0e10cSrcweir 
54cdf0e10cSrcweir //_________________________________________________________________________________________________________________
55cdf0e10cSrcweir //	defines
56cdf0e10cSrcweir //_________________________________________________________________________________________________________________
57cdf0e10cSrcweir 
58cdf0e10cSrcweir #define XMLNS_MENU				    "http://openoffice.org/2001/menu"
59cdf0e10cSrcweir #define XMLNS_PREFIX			    "menu:"
60cdf0e10cSrcweir 
61cdf0e10cSrcweir #define ELEMENT_MENUBAR			    "http://openoffice.org/2001/menu^menubar"
62cdf0e10cSrcweir #define ELEMENT_MENU			    "http://openoffice.org/2001/menu^menu"
63cdf0e10cSrcweir #define ELEMENT_MENUPOPUP		    "http://openoffice.org/2001/menu^menupopup"
64cdf0e10cSrcweir #define ELEMENT_MENUITEM		    "http://openoffice.org/2001/menu^menuitem"
65cdf0e10cSrcweir #define ELEMENT_MENUSEPARATOR	    "http://openoffice.org/2001/menu^menuseparator"
66cdf0e10cSrcweir 
67cdf0e10cSrcweir #define ELEMENT_NS_MENUBAR			"menu:menubar"
68cdf0e10cSrcweir #define ELEMENT_NS_MENU				"menu:menu"
69cdf0e10cSrcweir #define ELEMENT_NS_MENUPOPUP		"menu:menupopup"
70cdf0e10cSrcweir #define ELEMENT_NS_MENUITEM			"menu:menuitem"
71cdf0e10cSrcweir #define ELEMENT_NS_MENUSEPARATOR	"menu:menuseparator"
72cdf0e10cSrcweir 
73cdf0e10cSrcweir #define ATTRIBUTE_ID			    "http://openoffice.org/2001/menu^id"
74cdf0e10cSrcweir #define ATTRIBUTE_LABEL			    "http://openoffice.org/2001/menu^label"
75cdf0e10cSrcweir #define ATTRIBUTE_HELPID		    "http://openoffice.org/2001/menu^helpid"
76cdf0e10cSrcweir #define ATTRIBUTE_LINEBREAK		    "http://openoffice.org/2001/menu^linebreak"
77cdf0e10cSrcweir #define ATTRIBUTE_STYLE		    "http://openoffice.org/2001/menu^style"
78cdf0e10cSrcweir 
79cdf0e10cSrcweir #define ATTRIBUTE_NS_ID			    "menu:id"
80cdf0e10cSrcweir #define ATTRIBUTE_NS_LABEL		    "menu:label"
81cdf0e10cSrcweir #define ATTRIBUTE_NS_HELPID		    "menu:helpid"
82cdf0e10cSrcweir #define ATTRIBUTE_NS_LINEBREAK	    "menu:linebreak"
83cdf0e10cSrcweir #define ATTRIBUTE_NS_STYLE		    "menu:style"
84cdf0e10cSrcweir 
85cdf0e10cSrcweir #define ATTRIBUTE_XMLNS_MENU	    "xmlns:menu"
86cdf0e10cSrcweir 
87cdf0e10cSrcweir #define ATTRIBUTE_TYPE_CDATA	    "CDATA"
88cdf0e10cSrcweir 
89cdf0e10cSrcweir #define MENUBAR_DOCTYPE			    "<!DOCTYPE menu:menubar PUBLIC \"-//OpenOffice.org//DTD OfficeDocument 1.0//EN\" \"menubar.dtd\">"
90cdf0e10cSrcweir 
91cdf0e10cSrcweir #define ATTRIBUTE_ITEMSTYLE_TEXT    "text"
92cdf0e10cSrcweir #define ATTRIBUTE_ITEMSTYLE_IMAGE    "image"
93cdf0e10cSrcweir #define ATTRIBUTE_ITEMSTYLE_RADIO    "radio"
94cdf0e10cSrcweir 
95cdf0e10cSrcweir // Property names of a menu/menu item ItemDescriptor
96cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_COMMANDURL[]  = "CommandURL";
97cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_HELPURL[]     = "HelpURL";
98cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_CONTAINER[]   = "ItemDescriptorContainer";
99cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_LABEL[]       = "Label";
100cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_TYPE[]        = "Type";
101cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_STYLE[]       = "Style";
102cdf0e10cSrcweir 
103cdf0e10cSrcweir // special popup menus (filled during runtime) must be saved as an empty popup menu or menuitem!!!
104cdf0e10cSrcweir static const sal_Int32 CMD_PROTOCOL_SIZE        = 5;
105cdf0e10cSrcweir static const char CMD_PROTOCOL[]                = ".uno:";
106cdf0e10cSrcweir static const char ADDDIRECT_CMD[]               = ".uno:AddDirect" ;
107cdf0e10cSrcweir static const char AUTOPILOTMENU_CMD[]           = ".uno:AutoPilotMenu" ;
108cdf0e10cSrcweir static const char FILEMENU_CMD[]                = ".uno:Picklist" ;
109cdf0e10cSrcweir static const char WINDOWMENU_CMD[]              = ".uno:WindowList" ;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir //_________________________________________________________________________________________________________________
112cdf0e10cSrcweir //	using namespaces
113cdf0e10cSrcweir //_________________________________________________________________________________________________________________
114cdf0e10cSrcweir 
115cdf0e10cSrcweir using namespace ::com::sun::star::uno;
116cdf0e10cSrcweir using namespace ::com::sun::star::lang;
117cdf0e10cSrcweir using namespace ::com::sun::star::beans;
118cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
119cdf0e10cSrcweir using namespace ::com::sun::star::container;
120cdf0e10cSrcweir using namespace ::com::sun::star::ui;
121cdf0e10cSrcweir 
122cdf0e10cSrcweir namespace framework
123cdf0e10cSrcweir {
124cdf0e10cSrcweir 
125cdf0e10cSrcweir struct MenuStyleItem
126cdf0e10cSrcweir {
127cdf0e10cSrcweir     sal_Int16 nBit;
128cdf0e10cSrcweir     const char* attrName;
129cdf0e10cSrcweir };
130cdf0e10cSrcweir 
131cdf0e10cSrcweir MenuStyleItem MenuItemStyles[ ] = {
132cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::ICON, ATTRIBUTE_ITEMSTYLE_IMAGE },
133cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::TEXT, ATTRIBUTE_ITEMSTYLE_TEXT },
134cdf0e10cSrcweir     { ::com::sun::star::ui::ItemStyle::RADIO_CHECK, ATTRIBUTE_ITEMSTYLE_RADIO }
135cdf0e10cSrcweir };
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 
138cdf0e10cSrcweir sal_Int32 nMenuStyleItemEntries = sizeof( MenuItemStyles ) / sizeof( MenuItemStyles[ 0 ] );
139cdf0e10cSrcweir 
ExtractMenuParameters(const Sequence<PropertyValue> rProp,::rtl::OUString & rCommandURL,::rtl::OUString & rLabel,::rtl::OUString & rHelpURL,Reference<XIndexAccess> & rSubMenu,sal_Int16 & rType,sal_Int16 & rStyle)140cdf0e10cSrcweir static void ExtractMenuParameters( const Sequence< PropertyValue > rProp,
141cdf0e10cSrcweir                                    ::rtl::OUString&                       rCommandURL,
142cdf0e10cSrcweir                                    ::rtl::OUString&                       rLabel,
143cdf0e10cSrcweir                                    ::rtl::OUString&                       rHelpURL,
144cdf0e10cSrcweir                                    Reference< XIndexAccess >&      rSubMenu,
145cdf0e10cSrcweir                                    sal_Int16&                      rType,
146cdf0e10cSrcweir                                    sal_Int16&                      rStyle )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir     for ( sal_Int32 i = 0; i < rProp.getLength(); i++ )
149cdf0e10cSrcweir     {
150cdf0e10cSrcweir         if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL ))
151cdf0e10cSrcweir         {
152cdf0e10cSrcweir             rProp[i].Value >>= rCommandURL;
153cdf0e10cSrcweir             rCommandURL = rCommandURL.intern();
154cdf0e10cSrcweir         }
155cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_HELPURL ))
156cdf0e10cSrcweir         {
157cdf0e10cSrcweir             rProp[i].Value >>= rHelpURL;
158cdf0e10cSrcweir         }
159cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_CONTAINER ))
160cdf0e10cSrcweir         {
161cdf0e10cSrcweir             rProp[i].Value >>= rSubMenu;
162cdf0e10cSrcweir         }
163cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL ))
164cdf0e10cSrcweir         {
165cdf0e10cSrcweir             rProp[i].Value >>= rLabel;
166cdf0e10cSrcweir         }
167cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TYPE ))
168cdf0e10cSrcweir         {
169cdf0e10cSrcweir             rProp[i].Value >>= rType;
170cdf0e10cSrcweir         }
171cdf0e10cSrcweir         else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE ))
172cdf0e10cSrcweir         {
173cdf0e10cSrcweir             rProp[i].Value >>= rStyle;
174cdf0e10cSrcweir         }
175cdf0e10cSrcweir     }
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 
179cdf0e10cSrcweir // -----------------------------------------------------------------------------
180cdf0e10cSrcweir // Base class implementation
181cdf0e10cSrcweir 
ReadMenuDocumentHandlerBase()182cdf0e10cSrcweir ReadMenuDocumentHandlerBase::ReadMenuDocumentHandlerBase() :
183cdf0e10cSrcweir 	m_xLocator( 0 ),
184cdf0e10cSrcweir 	m_xReader( 0 ),
185cdf0e10cSrcweir 	m_aType( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_TYPE )),
186cdf0e10cSrcweir 	m_aLabel( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_LABEL )),
187cdf0e10cSrcweir 	m_aContainer( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_CONTAINER )),
188cdf0e10cSrcweir 	m_aHelpURL( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_HELPURL )),
189cdf0e10cSrcweir     m_aCommandURL( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_COMMANDURL )),
190cdf0e10cSrcweir     m_aStyle( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_STYLE ))
191cdf0e10cSrcweir {
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
~ReadMenuDocumentHandlerBase()194cdf0e10cSrcweir ReadMenuDocumentHandlerBase::~ReadMenuDocumentHandlerBase()
195cdf0e10cSrcweir {
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
ignorableWhitespace(const::rtl::OUString &)198cdf0e10cSrcweir void SAL_CALL ReadMenuDocumentHandlerBase::ignorableWhitespace(
199cdf0e10cSrcweir 	const ::rtl::OUString& )
200cdf0e10cSrcweir throw( SAXException, RuntimeException )
201cdf0e10cSrcweir {
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
processingInstruction(const::rtl::OUString &,const::rtl::OUString &)204cdf0e10cSrcweir void SAL_CALL ReadMenuDocumentHandlerBase::processingInstruction(
205cdf0e10cSrcweir 	const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ )
206cdf0e10cSrcweir throw( SAXException, RuntimeException )
207cdf0e10cSrcweir {
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
setDocumentLocator(const Reference<XLocator> & xLocator)210cdf0e10cSrcweir void SAL_CALL ReadMenuDocumentHandlerBase::setDocumentLocator(
211cdf0e10cSrcweir 	const Reference< XLocator > &xLocator)
212cdf0e10cSrcweir throw(	SAXException, RuntimeException )
213cdf0e10cSrcweir {
214cdf0e10cSrcweir 	m_xLocator = xLocator;
215cdf0e10cSrcweir }
216cdf0e10cSrcweir 
getErrorLineString()217cdf0e10cSrcweir ::rtl::OUString ReadMenuDocumentHandlerBase::getErrorLineString()
218cdf0e10cSrcweir {
219cdf0e10cSrcweir 	char buffer[32];
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 	if ( m_xLocator.is() )
222cdf0e10cSrcweir 	{
223cdf0e10cSrcweir 		snprintf( buffer, sizeof(buffer), "Line: %ld - ", static_cast<long>( m_xLocator->getLineNumber() ));
224cdf0e10cSrcweir 		return ::rtl::OUString::createFromAscii( buffer );
225cdf0e10cSrcweir 	}
226cdf0e10cSrcweir 	else
227cdf0e10cSrcweir 		return ::rtl::OUString();
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
initPropertyCommon(Sequence<PropertyValue> & rProps,const rtl::OUString & rCommandURL,const rtl::OUString & rHelpId,const rtl::OUString & rLabel,sal_Int16 nItemStyleBits)230cdf0e10cSrcweir void ReadMenuDocumentHandlerBase::initPropertyCommon(
231cdf0e10cSrcweir 	Sequence< PropertyValue > &rProps, const rtl::OUString &rCommandURL,
232cdf0e10cSrcweir     const rtl::OUString &rHelpId, const rtl::OUString &rLabel, sal_Int16 nItemStyleBits )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir 	rProps[0].Name = m_aCommandURL;
235cdf0e10cSrcweir 	rProps[1].Name = m_aHelpURL;
236cdf0e10cSrcweir 	rProps[2].Name = m_aContainer;
237cdf0e10cSrcweir 	rProps[3].Name = m_aLabel;
238cdf0e10cSrcweir     rProps[4].Name = m_aStyle;
239cdf0e10cSrcweir     rProps[5].Name = m_aType;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 	// Common values
242cdf0e10cSrcweir 	rProps[0].Value <<= rCommandURL.intern();
243cdf0e10cSrcweir 	rProps[1].Value <<= rHelpId;
244cdf0e10cSrcweir 	rProps[2].Value <<= Reference< XIndexContainer >();
245cdf0e10cSrcweir 	rProps[3].Value <<= rLabel;
246cdf0e10cSrcweir     rProps[4].Value <<= nItemStyleBits;
247cdf0e10cSrcweir     rProps[5].Value <<= ::com::sun::star::ui::ItemType::DEFAULT;
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir // -----------------------------------------------------------------------------
251cdf0e10cSrcweir 
OReadMenuDocumentHandler(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & xServiceFactory,const Reference<XIndexContainer> & rMenuBarContainer)252cdf0e10cSrcweir OReadMenuDocumentHandler::OReadMenuDocumentHandler(
253cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
254cdf0e10cSrcweir 	const Reference< XIndexContainer >& rMenuBarContainer )
255cdf0e10cSrcweir :	m_nElementDepth( 0 ),
256cdf0e10cSrcweir 	m_bMenuBarMode( sal_False ),
257cdf0e10cSrcweir 	m_xMenuBarContainer( rMenuBarContainer ),
258cdf0e10cSrcweir       m_xContainerFactory( rMenuBarContainer, UNO_QUERY ),
259cdf0e10cSrcweir 	mxServiceFactory(xServiceFactory)
260cdf0e10cSrcweir {
261cdf0e10cSrcweir }
262cdf0e10cSrcweir 
263cdf0e10cSrcweir // #110897#
getServiceFactory()264cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& OReadMenuDocumentHandler::getServiceFactory()
265cdf0e10cSrcweir {
266cdf0e10cSrcweir 	// #110897#
267cdf0e10cSrcweir 	return mxServiceFactory;
268cdf0e10cSrcweir }
269cdf0e10cSrcweir 
~OReadMenuDocumentHandler()270cdf0e10cSrcweir OReadMenuDocumentHandler::~OReadMenuDocumentHandler()
271cdf0e10cSrcweir {
272cdf0e10cSrcweir }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 
startDocument(void)275cdf0e10cSrcweir void SAL_CALL OReadMenuDocumentHandler::startDocument(void)
276cdf0e10cSrcweir 	throw ( SAXException, RuntimeException )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 
endDocument(void)281cdf0e10cSrcweir void SAL_CALL OReadMenuDocumentHandler::endDocument(void)
282cdf0e10cSrcweir 	throw( SAXException, RuntimeException )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir 	if ( m_nElementDepth > 0 )
285cdf0e10cSrcweir 	{
286cdf0e10cSrcweir 		::rtl::OUString aErrorMessage = getErrorLineString();
287cdf0e10cSrcweir 		aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "A closing element is missing!" ));
288cdf0e10cSrcweir 		throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
289cdf0e10cSrcweir 	}
290cdf0e10cSrcweir }
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 
startElement(const::rtl::OUString & aName,const Reference<XAttributeList> & xAttrList)293cdf0e10cSrcweir void SAL_CALL OReadMenuDocumentHandler::startElement(
294cdf0e10cSrcweir 	const ::rtl::OUString& aName, const Reference< XAttributeList > &xAttrList )
295cdf0e10cSrcweir throw( SAXException, RuntimeException )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir 	if ( m_bMenuBarMode )
298cdf0e10cSrcweir 	{
299cdf0e10cSrcweir 		++m_nElementDepth;
300cdf0e10cSrcweir 		m_xReader->startElement( aName, xAttrList );
301cdf0e10cSrcweir 	}
302cdf0e10cSrcweir 	else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUBAR )))
303cdf0e10cSrcweir 	{
304cdf0e10cSrcweir 		++m_nElementDepth;
305cdf0e10cSrcweir 		m_bMenuBarMode = sal_True;
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 		// #110897# m_xReader = Reference< XDocumentHandler >( new OReadMenuBarHandler( m_xMenuBarContainer, m_xContainerFactory ));
308cdf0e10cSrcweir 		m_xReader = Reference< XDocumentHandler >( new OReadMenuBarHandler( getServiceFactory(), m_xMenuBarContainer, m_xContainerFactory ));
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 		m_xReader->startDocument();
311cdf0e10cSrcweir 	}
312cdf0e10cSrcweir }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir 
characters(const rtl::OUString &)315cdf0e10cSrcweir void SAL_CALL OReadMenuDocumentHandler::characters(const rtl::OUString&)
316cdf0e10cSrcweir throw(	SAXException, RuntimeException )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 
endElement(const::rtl::OUString & aName)321cdf0e10cSrcweir void SAL_CALL OReadMenuDocumentHandler::endElement( const ::rtl::OUString& aName )
322cdf0e10cSrcweir 	throw( SAXException, RuntimeException )
323cdf0e10cSrcweir {
324cdf0e10cSrcweir 	if ( m_bMenuBarMode )
325cdf0e10cSrcweir 	{
326cdf0e10cSrcweir 		--m_nElementDepth;
327cdf0e10cSrcweir 		m_xReader->endElement( aName );
328cdf0e10cSrcweir 		if ( 0 == m_nElementDepth )
329cdf0e10cSrcweir 		{
330cdf0e10cSrcweir 			m_xReader->endDocument();
331cdf0e10cSrcweir 			m_xReader = Reference< XDocumentHandler >();
332cdf0e10cSrcweir 			m_bMenuBarMode = sal_False;
333cdf0e10cSrcweir 			if ( !aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUBAR )))
334cdf0e10cSrcweir 			{
335cdf0e10cSrcweir 				::rtl::OUString aErrorMessage = getErrorLineString();
336cdf0e10cSrcweir 				aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "closing element menubar expected!" ));
337cdf0e10cSrcweir 				throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
338cdf0e10cSrcweir 			}
339cdf0e10cSrcweir 		}
340cdf0e10cSrcweir 	}
341cdf0e10cSrcweir }
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 
344cdf0e10cSrcweir // -----------------------------------------------------------------------------
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 
347cdf0e10cSrcweir // #110897#
OReadMenuBarHandler(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & xServiceFactory,const Reference<XIndexContainer> & rMenuBarContainer,const Reference<XSingleComponentFactory> & rFactory)348cdf0e10cSrcweir OReadMenuBarHandler::OReadMenuBarHandler(
349cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
350cdf0e10cSrcweir     const Reference< XIndexContainer >& rMenuBarContainer,
351cdf0e10cSrcweir     const Reference< XSingleComponentFactory >& rFactory          )
352cdf0e10cSrcweir :	m_nElementDepth( 0 ),
353cdf0e10cSrcweir 	m_bMenuMode( sal_False ),
354cdf0e10cSrcweir 	m_xMenuBarContainer( rMenuBarContainer ),
355cdf0e10cSrcweir       m_xContainerFactory( rFactory ),
356cdf0e10cSrcweir 	mxServiceFactory( xServiceFactory )
357cdf0e10cSrcweir {
358cdf0e10cSrcweir }
359cdf0e10cSrcweir 
360cdf0e10cSrcweir // #110897#
getServiceFactory()361cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& OReadMenuBarHandler::getServiceFactory()
362cdf0e10cSrcweir {
363cdf0e10cSrcweir 	// #110897#
364cdf0e10cSrcweir 	return mxServiceFactory;
365cdf0e10cSrcweir }
366cdf0e10cSrcweir 
~OReadMenuBarHandler()367cdf0e10cSrcweir OReadMenuBarHandler::~OReadMenuBarHandler()
368cdf0e10cSrcweir {
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 
startDocument(void)372cdf0e10cSrcweir void SAL_CALL OReadMenuBarHandler::startDocument(void)
373cdf0e10cSrcweir 	throw ( SAXException, RuntimeException )
374cdf0e10cSrcweir {
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir 
endDocument(void)378cdf0e10cSrcweir void SAL_CALL OReadMenuBarHandler::endDocument(void)
379cdf0e10cSrcweir 	throw( SAXException, RuntimeException )
380cdf0e10cSrcweir {
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 
startElement(const::rtl::OUString & rName,const Reference<XAttributeList> & xAttrList)384cdf0e10cSrcweir void SAL_CALL OReadMenuBarHandler::startElement(
385cdf0e10cSrcweir 	const ::rtl::OUString& rName, const Reference< XAttributeList > &xAttrList )
386cdf0e10cSrcweir throw( SAXException, RuntimeException )
387cdf0e10cSrcweir {
388cdf0e10cSrcweir 	if ( m_bMenuMode )
389cdf0e10cSrcweir 	{
390cdf0e10cSrcweir 		++m_nElementDepth;
391cdf0e10cSrcweir 		m_xReader->startElement( rName, xAttrList );
392cdf0e10cSrcweir 	}
393cdf0e10cSrcweir 	else if ( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENU )))
394cdf0e10cSrcweir 	{
395cdf0e10cSrcweir 		++m_nElementDepth;
396cdf0e10cSrcweir 
397cdf0e10cSrcweir 		::rtl::OUString aHelpId;
398cdf0e10cSrcweir 		::rtl::OUString aCommandId;
399cdf0e10cSrcweir 		::rtl::OUString aLabel;
400cdf0e10cSrcweir         sal_Int16 nItemBits(0);
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 		m_bMenuMode = sal_True;
403cdf0e10cSrcweir 
404cdf0e10cSrcweir         // Container must be factory to create sub container
405cdf0e10cSrcweir         Reference< XComponentContext > xComponentContext;
406cdf0e10cSrcweir         Reference< XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY );
407cdf0e10cSrcweir         xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>=
408cdf0e10cSrcweir             xComponentContext;
409cdf0e10cSrcweir 
410cdf0e10cSrcweir         Reference< XIndexContainer > xSubItemContainer;
411cdf0e10cSrcweir         if ( m_xContainerFactory.is() )
412cdf0e10cSrcweir             xSubItemContainer = Reference< XIndexContainer >( m_xContainerFactory->createInstanceWithContext( xComponentContext ), UNO_QUERY );
413cdf0e10cSrcweir 
414cdf0e10cSrcweir 		if ( xSubItemContainer.is() )
415cdf0e10cSrcweir         {
416cdf0e10cSrcweir             // read attributes for menu
417cdf0e10cSrcweir 		    for ( sal_Int16 i=0; i< xAttrList->getLength(); i++ )
418cdf0e10cSrcweir 		    {
419cdf0e10cSrcweir 			    ::rtl::OUString aName = xAttrList->getNameByIndex( i );
420cdf0e10cSrcweir 			    ::rtl::OUString aValue = xAttrList->getValueByIndex( i );
421cdf0e10cSrcweir 			    if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ID )))
422cdf0e10cSrcweir 				    aCommandId = aValue;
423cdf0e10cSrcweir 			    else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_LABEL )))
424cdf0e10cSrcweir 				    aLabel = aValue;
425cdf0e10cSrcweir 			    else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_HELPID )))
426cdf0e10cSrcweir 				    aHelpId = aValue;
427cdf0e10cSrcweir                 else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_STYLE )))
428cdf0e10cSrcweir                 {
429cdf0e10cSrcweir                     ::rtl::OUString aTemp( aValue );
430cdf0e10cSrcweir                     sal_Int32 nIndex = 0;
431cdf0e10cSrcweir                     do
432cdf0e10cSrcweir                     {
433cdf0e10cSrcweir                         ::rtl::OUString aToken = aTemp.getToken( 0, '+', nIndex );
434cdf0e10cSrcweir                         if ( aToken.getLength() > 0 )
435cdf0e10cSrcweir                         {
436cdf0e10cSrcweir                             if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_TEXT ) ) )
437cdf0e10cSrcweir                                 nItemBits |= ::com::sun::star::ui::ItemStyle::TEXT;
438cdf0e10cSrcweir                             else if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_IMAGE ) ) )
439cdf0e10cSrcweir                                 nItemBits |= ::com::sun::star::ui::ItemStyle::ICON;
440cdf0e10cSrcweir                             else if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_RADIO ) ) )
441cdf0e10cSrcweir                                 nItemBits |= ::com::sun::star::ui::ItemStyle::RADIO_CHECK;
442cdf0e10cSrcweir                         }
443cdf0e10cSrcweir                     }
444cdf0e10cSrcweir                     while ( nIndex >= 0 );
445cdf0e10cSrcweir                 }
446cdf0e10cSrcweir 		    }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 		    if ( aCommandId.getLength() > 0 )
449cdf0e10cSrcweir 		    {
450cdf0e10cSrcweir                 Sequence< PropertyValue > aSubMenuProp( 6 );
451cdf0e10cSrcweir                 initPropertyCommon( aSubMenuProp, aCommandId, aHelpId, aLabel, nItemBits );
452cdf0e10cSrcweir 				aSubMenuProp[2].Value <<= xSubItemContainer;
453cdf0e10cSrcweir 
454cdf0e10cSrcweir                 m_xMenuBarContainer->insertByIndex( m_xMenuBarContainer->getCount(), makeAny( aSubMenuProp ) );
455cdf0e10cSrcweir 		    }
456cdf0e10cSrcweir 		    else
457cdf0e10cSrcweir 		    {
458cdf0e10cSrcweir 			    ::rtl::OUString aErrorMessage = getErrorLineString();
459cdf0e10cSrcweir 			    aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "attribute id for element menu required!" ));
460cdf0e10cSrcweir 			    throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
461cdf0e10cSrcweir 		    }
462cdf0e10cSrcweir 
463cdf0e10cSrcweir 		    m_xReader = Reference< XDocumentHandler >( new OReadMenuHandler( xSubItemContainer, m_xContainerFactory ));
464cdf0e10cSrcweir 		    m_xReader->startDocument();
465cdf0e10cSrcweir         }
466cdf0e10cSrcweir 	}
467cdf0e10cSrcweir 	else
468cdf0e10cSrcweir 	{
469cdf0e10cSrcweir 		::rtl::OUString aErrorMessage = getErrorLineString();
470cdf0e10cSrcweir 		aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "element menu expected!" ));
471cdf0e10cSrcweir 		throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
472cdf0e10cSrcweir 	}
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir 
characters(const rtl::OUString &)476cdf0e10cSrcweir void SAL_CALL OReadMenuBarHandler::characters(const rtl::OUString&)
477cdf0e10cSrcweir throw(	SAXException, RuntimeException )
478cdf0e10cSrcweir {
479cdf0e10cSrcweir }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 
endElement(const::rtl::OUString & aName)482cdf0e10cSrcweir void OReadMenuBarHandler::endElement( const ::rtl::OUString& aName )
483cdf0e10cSrcweir 	throw( SAXException, RuntimeException )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir 	if ( m_bMenuMode )
486cdf0e10cSrcweir 	{
487cdf0e10cSrcweir 		--m_nElementDepth;
488cdf0e10cSrcweir 		if ( 0 == m_nElementDepth )
489cdf0e10cSrcweir 		{
490cdf0e10cSrcweir 			m_xReader->endDocument();
491cdf0e10cSrcweir 			m_xReader = Reference< XDocumentHandler >();
492cdf0e10cSrcweir 			m_bMenuMode = sal_False;
493cdf0e10cSrcweir 			if ( !aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENU )))
494cdf0e10cSrcweir 			{
495cdf0e10cSrcweir 				::rtl::OUString aErrorMessage = getErrorLineString();
496cdf0e10cSrcweir 				aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "closing element menu expected!" ));
497cdf0e10cSrcweir 				throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
498cdf0e10cSrcweir 			}
499cdf0e10cSrcweir 		}
500cdf0e10cSrcweir 		else
501cdf0e10cSrcweir 			m_xReader->endElement( aName );
502cdf0e10cSrcweir 	}
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir 
506cdf0e10cSrcweir // -----------------------------------------------------------------------------
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 
OReadMenuHandler(const Reference<XIndexContainer> & rMenuContainer,const Reference<XSingleComponentFactory> & rFactory)509cdf0e10cSrcweir OReadMenuHandler::OReadMenuHandler(
510cdf0e10cSrcweir     const Reference< XIndexContainer >& rMenuContainer,
511cdf0e10cSrcweir     const Reference< XSingleComponentFactory >& rFactory          ) :
512cdf0e10cSrcweir     m_nElementDepth( 0 ),
513cdf0e10cSrcweir     m_bMenuPopupMode( sal_False ),
514cdf0e10cSrcweir     m_xMenuContainer( rMenuContainer ),
515cdf0e10cSrcweir     m_xContainerFactory( rFactory )
516cdf0e10cSrcweir {
517cdf0e10cSrcweir }
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 
~OReadMenuHandler()520cdf0e10cSrcweir OReadMenuHandler::~OReadMenuHandler()
521cdf0e10cSrcweir {
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir 
startDocument(void)525cdf0e10cSrcweir void SAL_CALL OReadMenuHandler::startDocument(void)
526cdf0e10cSrcweir 	throw ( SAXException, RuntimeException )
527cdf0e10cSrcweir {
528cdf0e10cSrcweir }
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 
endDocument(void)531cdf0e10cSrcweir void SAL_CALL OReadMenuHandler::endDocument(void)
532cdf0e10cSrcweir 	throw( SAXException, RuntimeException)
533cdf0e10cSrcweir {
534cdf0e10cSrcweir }
535cdf0e10cSrcweir 
536cdf0e10cSrcweir 
startElement(const::rtl::OUString & aName,const Reference<XAttributeList> & xAttrList)537cdf0e10cSrcweir void SAL_CALL OReadMenuHandler::startElement(
538cdf0e10cSrcweir 	const ::rtl::OUString& aName, const Reference< XAttributeList > &xAttrList )
539cdf0e10cSrcweir throw( SAXException, RuntimeException )
540cdf0e10cSrcweir {
541cdf0e10cSrcweir 	if ( m_bMenuPopupMode )
542cdf0e10cSrcweir 	{
543cdf0e10cSrcweir 		++m_nElementDepth;
544cdf0e10cSrcweir 		m_xReader->startElement( aName, xAttrList );
545cdf0e10cSrcweir 	}
546cdf0e10cSrcweir 	else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUPOPUP )))
547cdf0e10cSrcweir 	{
548cdf0e10cSrcweir 		++m_nElementDepth;
549cdf0e10cSrcweir 		m_bMenuPopupMode = sal_True;
550cdf0e10cSrcweir 		m_xReader = Reference< XDocumentHandler >( new OReadMenuPopupHandler( m_xMenuContainer, m_xContainerFactory ));
551cdf0e10cSrcweir 		m_xReader->startDocument();
552cdf0e10cSrcweir 	}
553cdf0e10cSrcweir 	else
554cdf0e10cSrcweir 	{
555cdf0e10cSrcweir 		::rtl::OUString aErrorMessage = getErrorLineString();
556cdf0e10cSrcweir 		aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "unknown element found!" ));
557cdf0e10cSrcweir 		throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
558cdf0e10cSrcweir 	}
559cdf0e10cSrcweir }
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 
characters(const rtl::OUString &)562cdf0e10cSrcweir void SAL_CALL OReadMenuHandler::characters(const rtl::OUString&)
563cdf0e10cSrcweir throw(	SAXException, RuntimeException )
564cdf0e10cSrcweir {
565cdf0e10cSrcweir }
566cdf0e10cSrcweir 
567cdf0e10cSrcweir 
endElement(const::rtl::OUString & aName)568cdf0e10cSrcweir void SAL_CALL OReadMenuHandler::endElement( const ::rtl::OUString& aName )
569cdf0e10cSrcweir 	throw( SAXException, RuntimeException )
570cdf0e10cSrcweir {
571cdf0e10cSrcweir 	if ( m_bMenuPopupMode )
572cdf0e10cSrcweir 	{
573cdf0e10cSrcweir 		--m_nElementDepth;
574cdf0e10cSrcweir 		if ( 0 == m_nElementDepth )
575cdf0e10cSrcweir 		{
576cdf0e10cSrcweir 			m_xReader->endDocument();
577cdf0e10cSrcweir 			m_xReader = Reference< XDocumentHandler >();
578cdf0e10cSrcweir 			m_bMenuPopupMode = sal_False;
579cdf0e10cSrcweir 			if ( !aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUPOPUP )))
580cdf0e10cSrcweir 			{
581cdf0e10cSrcweir 				::rtl::OUString aErrorMessage = getErrorLineString();
582cdf0e10cSrcweir 				aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "closing element menupopup expected!" ));
583cdf0e10cSrcweir 				throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
584cdf0e10cSrcweir 			}
585cdf0e10cSrcweir 		}
586cdf0e10cSrcweir 		else
587cdf0e10cSrcweir 			m_xReader->endElement( aName );
588cdf0e10cSrcweir 	}
589cdf0e10cSrcweir }
590cdf0e10cSrcweir 
591cdf0e10cSrcweir 
592cdf0e10cSrcweir // -----------------------------------------------------------------------------
593cdf0e10cSrcweir 
594cdf0e10cSrcweir 
OReadMenuPopupHandler(const Reference<XIndexContainer> & rMenuContainer,const Reference<XSingleComponentFactory> & rFactory)595cdf0e10cSrcweir OReadMenuPopupHandler::OReadMenuPopupHandler(
596cdf0e10cSrcweir     const Reference< XIndexContainer >& rMenuContainer,
597cdf0e10cSrcweir     const Reference< XSingleComponentFactory >& rFactory          ) :
598cdf0e10cSrcweir     m_nElementDepth( 0 ),
599cdf0e10cSrcweir     m_bMenuMode( sal_False ),
600cdf0e10cSrcweir     m_xMenuContainer( rMenuContainer ),
601cdf0e10cSrcweir     m_xContainerFactory( rFactory ),
602cdf0e10cSrcweir     m_nNextElementExpected( ELEM_CLOSE_NONE )
603cdf0e10cSrcweir {
604cdf0e10cSrcweir }
605cdf0e10cSrcweir 
606cdf0e10cSrcweir 
~OReadMenuPopupHandler()607cdf0e10cSrcweir OReadMenuPopupHandler::~OReadMenuPopupHandler()
608cdf0e10cSrcweir {
609cdf0e10cSrcweir }
610cdf0e10cSrcweir 
611cdf0e10cSrcweir 
startDocument(void)612cdf0e10cSrcweir void SAL_CALL OReadMenuPopupHandler::startDocument(void)
613cdf0e10cSrcweir 	throw ( SAXException, RuntimeException )
614cdf0e10cSrcweir {
615cdf0e10cSrcweir }
616cdf0e10cSrcweir 
617cdf0e10cSrcweir 
endDocument(void)618cdf0e10cSrcweir void SAL_CALL OReadMenuPopupHandler::endDocument(void)
619cdf0e10cSrcweir 	throw( SAXException, RuntimeException)
620cdf0e10cSrcweir {
621cdf0e10cSrcweir }
622cdf0e10cSrcweir 
startElement(const::rtl::OUString & rName,const Reference<XAttributeList> & xAttrList)623cdf0e10cSrcweir void SAL_CALL OReadMenuPopupHandler::startElement(
624cdf0e10cSrcweir 	const ::rtl::OUString& rName, const Reference< XAttributeList > &xAttrList )
625cdf0e10cSrcweir throw( SAXException, RuntimeException )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir 	++m_nElementDepth;
628cdf0e10cSrcweir 
629cdf0e10cSrcweir 	if ( m_bMenuMode )
630cdf0e10cSrcweir 		m_xReader->startElement( rName, xAttrList );
631cdf0e10cSrcweir 	else if ( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENU )))
632cdf0e10cSrcweir 	{
633cdf0e10cSrcweir 		::rtl::OUString aHelpId;
634cdf0e10cSrcweir 		::rtl::OUString aCommandId;
635cdf0e10cSrcweir 		::rtl::OUString aLabel;
636cdf0e10cSrcweir         sal_Int16 nItemBits(0);
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 		m_bMenuMode = sal_True;
639cdf0e10cSrcweir 
640cdf0e10cSrcweir         // Container must be factory to create sub container
641cdf0e10cSrcweir         if ( !m_xComponentContext.is() )
642cdf0e10cSrcweir         {
643cdf0e10cSrcweir             const Reference< XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW );
644cdf0e10cSrcweir             m_xComponentContext.set(xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), UNO_QUERY_THROW );
645cdf0e10cSrcweir         }
646cdf0e10cSrcweir 
647cdf0e10cSrcweir         Reference< XIndexContainer > xSubItemContainer;
648cdf0e10cSrcweir         if ( m_xContainerFactory.is() )
649cdf0e10cSrcweir             xSubItemContainer = Reference< XIndexContainer >( m_xContainerFactory->createInstanceWithContext( m_xComponentContext ), UNO_QUERY );
650cdf0e10cSrcweir 
651cdf0e10cSrcweir         // read attributes for menu
652cdf0e10cSrcweir 		for ( sal_Int16 i=0; i< xAttrList->getLength(); i++ )
653cdf0e10cSrcweir 		{
654cdf0e10cSrcweir 			::rtl::OUString aName = xAttrList->getNameByIndex( i );
655cdf0e10cSrcweir 			::rtl::OUString aValue = xAttrList->getValueByIndex( i );
656cdf0e10cSrcweir 			if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ID )))
657cdf0e10cSrcweir 				aCommandId = aValue;
658cdf0e10cSrcweir 			else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_LABEL )))
659cdf0e10cSrcweir 				aLabel = aValue;
660cdf0e10cSrcweir 			else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_HELPID )))
661cdf0e10cSrcweir 				aHelpId = aValue;
662cdf0e10cSrcweir             else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_STYLE )))
663cdf0e10cSrcweir             {
664cdf0e10cSrcweir                 ::rtl::OUString aTemp( aValue );
665cdf0e10cSrcweir                 sal_Int32 nIndex = 0;
666cdf0e10cSrcweir                 do
667cdf0e10cSrcweir                 {
668cdf0e10cSrcweir                     ::rtl::OUString aToken = aTemp.getToken( 0, '+', nIndex );
669cdf0e10cSrcweir                     if ( aToken.getLength() > 0 )
670cdf0e10cSrcweir                     {
671cdf0e10cSrcweir                         if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_TEXT ) ) )
672cdf0e10cSrcweir                             nItemBits |= ::com::sun::star::ui::ItemStyle::TEXT;
673cdf0e10cSrcweir                         else if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_IMAGE ) ) )
674cdf0e10cSrcweir                             nItemBits |= ::com::sun::star::ui::ItemStyle::ICON;
675cdf0e10cSrcweir                         else if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_RADIO ) ) )
676cdf0e10cSrcweir                             nItemBits |= ::com::sun::star::ui::ItemStyle::RADIO_CHECK;
677cdf0e10cSrcweir                     }
678cdf0e10cSrcweir                 }
679cdf0e10cSrcweir                 while ( nIndex >= 0 );
680cdf0e10cSrcweir             }
681cdf0e10cSrcweir 
682cdf0e10cSrcweir 		}
683cdf0e10cSrcweir 
684cdf0e10cSrcweir 		if ( aCommandId.getLength() > 0 )
685cdf0e10cSrcweir 		{
686cdf0e10cSrcweir             Sequence< PropertyValue > aSubMenuProp( 6 );
687cdf0e10cSrcweir             initPropertyCommon( aSubMenuProp, aCommandId, aHelpId, aLabel, nItemBits );
688cdf0e10cSrcweir 			aSubMenuProp[2].Value <<= xSubItemContainer;
689cdf0e10cSrcweir 
690cdf0e10cSrcweir             m_xMenuContainer->insertByIndex( m_xMenuContainer->getCount(), makeAny( aSubMenuProp ) );
691cdf0e10cSrcweir 		}
692cdf0e10cSrcweir 		else
693cdf0e10cSrcweir 		{
694cdf0e10cSrcweir 			::rtl::OUString aErrorMessage = getErrorLineString();
695cdf0e10cSrcweir 			aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "attribute id for element menu required!" ));
696cdf0e10cSrcweir 			throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
697cdf0e10cSrcweir 		}
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 		m_xReader = Reference< XDocumentHandler >( new OReadMenuHandler( xSubItemContainer, m_xContainerFactory ));
700cdf0e10cSrcweir 		m_xReader->startDocument();
701cdf0e10cSrcweir 	}
702cdf0e10cSrcweir 	else if ( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUITEM )))
703cdf0e10cSrcweir 	{
704cdf0e10cSrcweir 		::rtl::OUString aHelpId;
705cdf0e10cSrcweir 		::rtl::OUString aCommandId;
706cdf0e10cSrcweir 		::rtl::OUString aLabel;
707cdf0e10cSrcweir         sal_Int16 nItemBits(0);
708cdf0e10cSrcweir 		// read attributes for menu item
709cdf0e10cSrcweir 		for ( sal_Int16 i=0; i< xAttrList->getLength(); i++ )
710cdf0e10cSrcweir 		{
711cdf0e10cSrcweir 			::rtl::OUString aName = xAttrList->getNameByIndex( i );
712cdf0e10cSrcweir 			::rtl::OUString aValue = xAttrList->getValueByIndex( i );
713cdf0e10cSrcweir 			if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ID )))
714cdf0e10cSrcweir 				aCommandId = aValue;
715cdf0e10cSrcweir 			else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_LABEL )))
716cdf0e10cSrcweir 				aLabel = aValue;
717cdf0e10cSrcweir 			else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_HELPID )))
718cdf0e10cSrcweir 				aHelpId = aValue;
719cdf0e10cSrcweir             else if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_STYLE )))
720cdf0e10cSrcweir             {
721cdf0e10cSrcweir                 ::rtl::OUString aTemp( aValue );
722cdf0e10cSrcweir                 sal_Int32 nIndex = 0;
723cdf0e10cSrcweir                 do
724cdf0e10cSrcweir                 {
725cdf0e10cSrcweir                     ::rtl::OUString aToken = aTemp.getToken( 0, '+', nIndex );
726cdf0e10cSrcweir                     if ( aToken.getLength() > 0 )
727cdf0e10cSrcweir                     {
728cdf0e10cSrcweir                         if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_TEXT ) ) )
729cdf0e10cSrcweir                             nItemBits |= ::com::sun::star::ui::ItemStyle::TEXT;
730cdf0e10cSrcweir                         else if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_IMAGE ) ) )
731cdf0e10cSrcweir                             nItemBits |= ::com::sun::star::ui::ItemStyle::ICON;
732cdf0e10cSrcweir                         else if ( aToken.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_ITEMSTYLE_RADIO ) ) )
733cdf0e10cSrcweir                             nItemBits |= ::com::sun::star::ui::ItemStyle::RADIO_CHECK;
734cdf0e10cSrcweir                     }
735cdf0e10cSrcweir                 }
736cdf0e10cSrcweir                 while ( nIndex >= 0 );
737cdf0e10cSrcweir             }
738cdf0e10cSrcweir 
739cdf0e10cSrcweir 		}
740cdf0e10cSrcweir 
741cdf0e10cSrcweir 		if ( aCommandId.getLength() > 0 )
742cdf0e10cSrcweir 		{
743cdf0e10cSrcweir             Sequence< PropertyValue > aMenuItem( 6 );
744cdf0e10cSrcweir             initPropertyCommon( aMenuItem, aCommandId, aHelpId, aLabel, nItemBits );
745cdf0e10cSrcweir 			aMenuItem[2].Value <<= Reference< XIndexContainer >();
746cdf0e10cSrcweir 
747cdf0e10cSrcweir             m_xMenuContainer->insertByIndex( m_xMenuContainer->getCount(), makeAny( aMenuItem ) );
748cdf0e10cSrcweir 		}
749cdf0e10cSrcweir 
750cdf0e10cSrcweir 		m_nNextElementExpected = ELEM_CLOSE_MENUITEM;
751cdf0e10cSrcweir 	}
752cdf0e10cSrcweir 	else if ( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUSEPARATOR )))
753cdf0e10cSrcweir 	{
754cdf0e10cSrcweir         Sequence< PropertyValue > aMenuSeparator( 1 );
755cdf0e10cSrcweir         aMenuSeparator[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_TYPE ));
756cdf0e10cSrcweir         aMenuSeparator[0].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_LINE;
757cdf0e10cSrcweir 
758cdf0e10cSrcweir         m_xMenuContainer->insertByIndex( m_xMenuContainer->getCount(), makeAny( aMenuSeparator ) );
759cdf0e10cSrcweir 
760cdf0e10cSrcweir         m_nNextElementExpected = ELEM_CLOSE_MENUSEPARATOR;
761cdf0e10cSrcweir 	}
762cdf0e10cSrcweir 	else
763cdf0e10cSrcweir 	{
764cdf0e10cSrcweir 		::rtl::OUString aErrorMessage = getErrorLineString();
765cdf0e10cSrcweir 		aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "unknown element found!" ));
766cdf0e10cSrcweir 		throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
767cdf0e10cSrcweir 	}
768cdf0e10cSrcweir }
769cdf0e10cSrcweir 
770cdf0e10cSrcweir 
characters(const rtl::OUString &)771cdf0e10cSrcweir void SAL_CALL OReadMenuPopupHandler::characters(const rtl::OUString&)
772cdf0e10cSrcweir throw(	SAXException, RuntimeException )
773cdf0e10cSrcweir {
774cdf0e10cSrcweir }
775cdf0e10cSrcweir 
776cdf0e10cSrcweir 
endElement(const::rtl::OUString & aName)777cdf0e10cSrcweir void SAL_CALL OReadMenuPopupHandler::endElement( const ::rtl::OUString& aName )
778cdf0e10cSrcweir 	throw( SAXException, RuntimeException )
779cdf0e10cSrcweir {
780cdf0e10cSrcweir 	--m_nElementDepth;
781cdf0e10cSrcweir 	if ( m_bMenuMode )
782cdf0e10cSrcweir 	{
783cdf0e10cSrcweir 		if ( 0 == m_nElementDepth )
784cdf0e10cSrcweir 		{
785cdf0e10cSrcweir 			m_xReader->endDocument();
786cdf0e10cSrcweir 			m_xReader = Reference< XDocumentHandler >();
787cdf0e10cSrcweir 			m_bMenuMode = sal_False;
788cdf0e10cSrcweir 			if ( !aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENU )))
789cdf0e10cSrcweir 			{
790cdf0e10cSrcweir 				::rtl::OUString aErrorMessage = getErrorLineString();
791cdf0e10cSrcweir 				aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "closing element menu expected!" ));
792cdf0e10cSrcweir 				throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
793cdf0e10cSrcweir 			}
794cdf0e10cSrcweir 		}
795cdf0e10cSrcweir 		else
796cdf0e10cSrcweir 			m_xReader->endElement( aName );
797cdf0e10cSrcweir 	}
798cdf0e10cSrcweir 	else
799cdf0e10cSrcweir 	{
800cdf0e10cSrcweir 		if ( m_nNextElementExpected == ELEM_CLOSE_MENUITEM )
801cdf0e10cSrcweir 		{
802cdf0e10cSrcweir 			if ( !aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUITEM )))
803cdf0e10cSrcweir 			{
804cdf0e10cSrcweir 				::rtl::OUString aErrorMessage = getErrorLineString();
805cdf0e10cSrcweir 				aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "closing element menuitem expected!" ));
806cdf0e10cSrcweir 				throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
807cdf0e10cSrcweir 			}
808cdf0e10cSrcweir 		}
809cdf0e10cSrcweir 		else if ( m_nNextElementExpected == ELEM_CLOSE_MENUSEPARATOR )
810cdf0e10cSrcweir 		{
811cdf0e10cSrcweir 			if ( !aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ELEMENT_MENUSEPARATOR )))
812cdf0e10cSrcweir 			{
813cdf0e10cSrcweir 				::rtl::OUString aErrorMessage = getErrorLineString();
814cdf0e10cSrcweir 				aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "closing element menuseparator expected!" ));
815cdf0e10cSrcweir 				throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
816cdf0e10cSrcweir 			}
817cdf0e10cSrcweir 		}
818cdf0e10cSrcweir 
819cdf0e10cSrcweir 		m_nNextElementExpected = ELEM_CLOSE_NONE;
820cdf0e10cSrcweir 	}
821cdf0e10cSrcweir }
822cdf0e10cSrcweir 
823cdf0e10cSrcweir 
824cdf0e10cSrcweir // --------------------------------- Write XML ---------------------------------
825cdf0e10cSrcweir 
826cdf0e10cSrcweir 
OWriteMenuDocumentHandler(const Reference<XIndexAccess> & rMenuBarContainer,const Reference<XDocumentHandler> & rDocumentHandler)827cdf0e10cSrcweir OWriteMenuDocumentHandler::OWriteMenuDocumentHandler(
828cdf0e10cSrcweir     const Reference< XIndexAccess >& rMenuBarContainer,
829cdf0e10cSrcweir     const Reference< XDocumentHandler >& rDocumentHandler ) :
830cdf0e10cSrcweir 	m_xMenuBarContainer( rMenuBarContainer ),
831cdf0e10cSrcweir 	m_xWriteDocumentHandler( rDocumentHandler )
832cdf0e10cSrcweir {
833cdf0e10cSrcweir 	::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
834cdf0e10cSrcweir 	m_xEmptyList = Reference< XAttributeList >( (XAttributeList *) pList, UNO_QUERY );
835cdf0e10cSrcweir 	m_aAttributeType = 	::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE_CDATA ));
836cdf0e10cSrcweir }
837cdf0e10cSrcweir 
838cdf0e10cSrcweir 
~OWriteMenuDocumentHandler()839cdf0e10cSrcweir OWriteMenuDocumentHandler::~OWriteMenuDocumentHandler()
840cdf0e10cSrcweir {
841cdf0e10cSrcweir }
842cdf0e10cSrcweir 
843cdf0e10cSrcweir 
WriteMenuDocument()844cdf0e10cSrcweir void OWriteMenuDocumentHandler::WriteMenuDocument()
845cdf0e10cSrcweir throw ( SAXException, RuntimeException )
846cdf0e10cSrcweir {
847cdf0e10cSrcweir 	::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
848cdf0e10cSrcweir 	Reference< XAttributeList > rList( (XAttributeList *) pList , UNO_QUERY );
849cdf0e10cSrcweir 
850cdf0e10cSrcweir 	m_xWriteDocumentHandler->startDocument();
851cdf0e10cSrcweir 
852cdf0e10cSrcweir 	// write DOCTYPE line!
853cdf0e10cSrcweir 	Reference< XExtendedDocumentHandler > xExtendedDocHandler( m_xWriteDocumentHandler, UNO_QUERY );
854cdf0e10cSrcweir 	if ( xExtendedDocHandler.is() )
855cdf0e10cSrcweir 	{
856cdf0e10cSrcweir 		xExtendedDocHandler->unknown( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( MENUBAR_DOCTYPE )) );
857cdf0e10cSrcweir 		m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
858cdf0e10cSrcweir 	}
859cdf0e10cSrcweir 
860cdf0e10cSrcweir 	pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_MENU )),
861cdf0e10cSrcweir 						 m_aAttributeType,
862cdf0e10cSrcweir 						 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_MENU )) );
863cdf0e10cSrcweir 
864cdf0e10cSrcweir 	pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NS_ID )),
865cdf0e10cSrcweir 						 m_aAttributeType,
866cdf0e10cSrcweir 						 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "menubar" )) );
867cdf0e10cSrcweir 
868cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUBAR )), pList );
869cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
870cdf0e10cSrcweir 
871cdf0e10cSrcweir 	WriteMenu( m_xMenuBarContainer );
872cdf0e10cSrcweir 
873cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
874cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUBAR )) );
875cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
876cdf0e10cSrcweir 	m_xWriteDocumentHandler->endDocument();
877cdf0e10cSrcweir }
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 
WriteMenu(const Reference<XIndexAccess> & rMenuContainer)880cdf0e10cSrcweir void OWriteMenuDocumentHandler::WriteMenu( const Reference< XIndexAccess >& rMenuContainer )
881cdf0e10cSrcweir throw ( SAXException, RuntimeException )
882cdf0e10cSrcweir {
883cdf0e10cSrcweir 	sal_Int32  nItemCount = rMenuContainer->getCount();
884cdf0e10cSrcweir 	sal_Bool   bSeparator = sal_False;
885cdf0e10cSrcweir     Any        aAny;
886cdf0e10cSrcweir 
887cdf0e10cSrcweir 	for ( sal_Int32 nItemPos = 0; nItemPos < nItemCount; nItemPos++ )
888cdf0e10cSrcweir 	{
889cdf0e10cSrcweir         Sequence< PropertyValue > aProps;
890cdf0e10cSrcweir         aAny = rMenuContainer->getByIndex( nItemPos );
891cdf0e10cSrcweir         if ( aAny >>= aProps )
892cdf0e10cSrcweir         {
893cdf0e10cSrcweir             ::rtl::OUString    aCommandURL;
894cdf0e10cSrcweir             ::rtl::OUString    aLabel;
895cdf0e10cSrcweir             ::rtl::OUString    aHelpURL;
896cdf0e10cSrcweir             sal_Int16   nType( ::com::sun::star::ui::ItemType::DEFAULT );
897cdf0e10cSrcweir             sal_Int16   nItemBits( 0 );
898cdf0e10cSrcweir             Reference< XIndexAccess > xSubMenu;
899cdf0e10cSrcweir 
900cdf0e10cSrcweir             ExtractMenuParameters( aProps, aCommandURL, aLabel, aHelpURL, xSubMenu, nType, nItemBits );
901cdf0e10cSrcweir             if ( xSubMenu.is() )
902cdf0e10cSrcweir 		    {
903cdf0e10cSrcweir                 if ( aCommandURL.equalsAscii( ADDDIRECT_CMD ) ||
904cdf0e10cSrcweir                     aCommandURL.equalsAscii( AUTOPILOTMENU_CMD ))
905cdf0e10cSrcweir                 {
906cdf0e10cSrcweir                     WriteMenuItem( aCommandURL, aLabel, aHelpURL, nItemBits );
907cdf0e10cSrcweir                     bSeparator = sal_False;
908cdf0e10cSrcweir                 }
909cdf0e10cSrcweir 			    else if (( aCommandURL.getLength() > 0 ) && !AddonPopupMenu::IsCommandURLPrefix ( aCommandURL ))
910cdf0e10cSrcweir 			    {
911cdf0e10cSrcweir 				    ::comphelper::AttributeList* pListMenu = new ::comphelper::AttributeList;
912cdf0e10cSrcweir 				    Reference< XAttributeList > xListMenu( (XAttributeList *)pListMenu , UNO_QUERY );
913cdf0e10cSrcweir 
914cdf0e10cSrcweir                     pListMenu->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NS_ID )),
915cdf0e10cSrcweir                                             m_aAttributeType,
916cdf0e10cSrcweir                                             aCommandURL );
917cdf0e10cSrcweir 
918cdf0e10cSrcweir 				    if ( !( aCommandURL.copy( CMD_PROTOCOL_SIZE ).equalsAscii( CMD_PROTOCOL )))
919cdf0e10cSrcweir                         pListMenu->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NS_LABEL )),
920cdf0e10cSrcweir 						    					 m_aAttributeType,
921cdf0e10cSrcweir 							    				 aLabel );
922cdf0e10cSrcweir 
923cdf0e10cSrcweir 				    m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
924cdf0e10cSrcweir 				    m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENU )), xListMenu );
925cdf0e10cSrcweir 				    m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
926cdf0e10cSrcweir 				    m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUPOPUP )), m_xEmptyList );
927cdf0e10cSrcweir 				    m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
928cdf0e10cSrcweir 
929cdf0e10cSrcweir 				    WriteMenu( xSubMenu );
930cdf0e10cSrcweir 
931cdf0e10cSrcweir 				    m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
932cdf0e10cSrcweir 				    m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUPOPUP )) );
933cdf0e10cSrcweir 				    m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
934cdf0e10cSrcweir 				    m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENU )) );
935cdf0e10cSrcweir 				    m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
936cdf0e10cSrcweir 				    bSeparator = sal_False;
937cdf0e10cSrcweir 			    }
938cdf0e10cSrcweir 		    }
939cdf0e10cSrcweir 		    else
940cdf0e10cSrcweir 		    {
941cdf0e10cSrcweir                 if ( nType == ::com::sun::star::ui::ItemType::DEFAULT )
942cdf0e10cSrcweir                 {
943cdf0e10cSrcweir                     if ( aCommandURL.getLength() > 0 )
944cdf0e10cSrcweir                     {
945cdf0e10cSrcweir                         bSeparator = sal_False;
946cdf0e10cSrcweir                         WriteMenuItem( aCommandURL, aLabel, aHelpURL, nItemBits );
947cdf0e10cSrcweir                     }
948cdf0e10cSrcweir 			    }
949cdf0e10cSrcweir 			    else if ( !bSeparator )
950cdf0e10cSrcweir 			    {
951cdf0e10cSrcweir                     // Don't write two separators together
952cdf0e10cSrcweir 				    WriteMenuSeparator();
953cdf0e10cSrcweir 				    bSeparator = sal_True;
954cdf0e10cSrcweir 			    }
955cdf0e10cSrcweir 		    }
956cdf0e10cSrcweir         }
957cdf0e10cSrcweir 	}
958cdf0e10cSrcweir }
959cdf0e10cSrcweir 
960cdf0e10cSrcweir 
WriteMenuItem(const::rtl::OUString & aCommandURL,const::rtl::OUString & aLabel,const::rtl::OUString & aHelpURL,sal_Int16 nStyle)961cdf0e10cSrcweir void OWriteMenuDocumentHandler::WriteMenuItem( const ::rtl::OUString& aCommandURL, const ::rtl::OUString& aLabel, const ::rtl::OUString& aHelpURL, sal_Int16 nStyle )
962cdf0e10cSrcweir {
963cdf0e10cSrcweir 	::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
964cdf0e10cSrcweir 	Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir     pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NS_ID )),
967cdf0e10cSrcweir                                 m_aAttributeType,
968cdf0e10cSrcweir                                 aCommandURL );
969cdf0e10cSrcweir 
970cdf0e10cSrcweir 	if ( aHelpURL.getLength() > 0 )
971cdf0e10cSrcweir 	{
972cdf0e10cSrcweir 		pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NS_HELPID )),
973cdf0e10cSrcweir 							 m_aAttributeType,
974cdf0e10cSrcweir 							 aHelpURL );
975cdf0e10cSrcweir 	}
976cdf0e10cSrcweir 
977cdf0e10cSrcweir     if (( aLabel.getLength() > 0 ) && !( aCommandURL.copy( CMD_PROTOCOL_SIZE ).equalsAscii( CMD_PROTOCOL )))
978cdf0e10cSrcweir     {
979cdf0e10cSrcweir         pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NS_LABEL )),
980cdf0e10cSrcweir 							    m_aAttributeType,
981cdf0e10cSrcweir 							    aLabel );
982cdf0e10cSrcweir     }
983cdf0e10cSrcweir     if (( nStyle > 0 ) && !( aCommandURL.copy( CMD_PROTOCOL_SIZE ).equalsAscii( CMD_PROTOCOL )))
984cdf0e10cSrcweir     {
985cdf0e10cSrcweir         rtl::OUString aValue;
986cdf0e10cSrcweir         MenuStyleItem* pStyle = MenuItemStyles;
987cdf0e10cSrcweir 
988cdf0e10cSrcweir         for ( sal_Int32 nIndex = 0; nIndex < nMenuStyleItemEntries; ++nIndex, ++pStyle )
989cdf0e10cSrcweir         {
990cdf0e10cSrcweir             if ( nStyle & pStyle->nBit )
991cdf0e10cSrcweir             {
992cdf0e10cSrcweir                 if ( aValue.getLength() )
993cdf0e10cSrcweir                     aValue = aValue.concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("+") ) );
994cdf0e10cSrcweir                 aValue += rtl::OUString::createFromAscii( pStyle->attrName );
995cdf0e10cSrcweir             }
996cdf0e10cSrcweir         }
997cdf0e10cSrcweir         pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NS_STYLE )),
998cdf0e10cSrcweir                                 m_aAttributeType,
999cdf0e10cSrcweir                                 aValue );
1000cdf0e10cSrcweir     }
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
1003cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUITEM )), xList );
1004cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
1005cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUITEM )) );
1006cdf0e10cSrcweir }
1007cdf0e10cSrcweir 
1008cdf0e10cSrcweir 
WriteMenuSeparator()1009cdf0e10cSrcweir void OWriteMenuDocumentHandler::WriteMenuSeparator()
1010cdf0e10cSrcweir {
1011cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
1012cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUSEPARATOR )), m_xEmptyList );
1013cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
1014cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_MENUSEPARATOR )) );
1015cdf0e10cSrcweir }
1016cdf0e10cSrcweir 
1017cdf0e10cSrcweir } // namespace framework
1018cdf0e10cSrcweir 
1019