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