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