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