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/statusbardocumenthandler.hxx>
23 :
24 : #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
25 : #include <com/sun/star/ui/ItemStyle.hpp>
26 : #include <com/sun/star/ui/ItemType.hpp>
27 : #include <com/sun/star/beans/PropertyValue.hpp>
28 :
29 : #include <vcl/svapp.hxx>
30 : #include <vcl/status.hxx>
31 :
32 : #include <comphelper/attributelist.hxx>
33 :
34 : using namespace ::com::sun::star::uno;
35 : using namespace ::com::sun::star::beans;
36 : using namespace ::com::sun::star::xml::sax;
37 : using namespace ::com::sun::star::ui;
38 : using namespace ::com::sun::star::container;
39 :
40 : #define XMLNS_STATUSBAR "http://openoffice.org/2001/statusbar"
41 : #define XMLNS_XLINK "http://www.w3.org/1999/xlink"
42 : #define XMLNS_STATUSBAR_PREFIX "statusbar:"
43 : #define XMLNS_XLINK_PREFIX "xlink:"
44 :
45 : #define XMLNS_FILTER_SEPARATOR "^"
46 :
47 : #define ELEMENT_STATUSBAR "statusbar"
48 : #define ELEMENT_STATUSBARITEM "statusbaritem"
49 :
50 : #define ATTRIBUTE_ALIGN "align"
51 : #define ATTRIBUTE_STYLE "style"
52 : #define ATTRIBUTE_URL "href"
53 : #define ATTRIBUTE_WIDTH "width"
54 : #define ATTRIBUTE_OFFSET "offset"
55 : #define ATTRIBUTE_AUTOSIZE "autosize"
56 : #define ATTRIBUTE_OWNERDRAW "ownerdraw"
57 : #define ATTRIBUTE_HELPURL "helpid"
58 :
59 : #define ELEMENT_NS_STATUSBAR "statusbar:statusbar"
60 : #define ELEMENT_NS_STATUSBARITEM "statusbar:statusbaritem"
61 :
62 : #define ATTRIBUTE_XMLNS_STATUSBAR "xmlns:statusbar"
63 : #define ATTRIBUTE_XMLNS_XLINK "xmlns:xlink"
64 :
65 : #define ATTRIBUTE_TYPE_CDATA "CDATA"
66 :
67 : #define ATTRIBUTE_BOOLEAN_TRUE "true"
68 : #define ATTRIBUTE_BOOLEAN_FALSE "false"
69 :
70 : #define ATTRIBUTE_ALIGN_LEFT "left"
71 : #define ATTRIBUTE_ALIGN_RIGHT "right"
72 : #define ATTRIBUTE_ALIGN_CENTER "center"
73 :
74 : #define ATTRIBUTE_STYLE_IN "in"
75 : #define ATTRIBUTE_STYLE_OUT "out"
76 : #define ATTRIBUTE_STYLE_FLAT "flat"
77 :
78 : #define STATUSBAR_DOCTYPE "<!DOCTYPE statusbar:statusbar PUBLIC \"-//OpenOffice.org//DTD OfficeDocument 1.0//EN\" \"statusbar.dtd\">"
79 :
80 : namespace framework
81 : {
82 :
83 : // Property names of a menu/menu item ItemDescriptor
84 : static const char ITEM_DESCRIPTOR_COMMANDURL[] = "CommandURL";
85 : static const char ITEM_DESCRIPTOR_HELPURL[] = "HelpURL";
86 : static const char ITEM_DESCRIPTOR_OFFSET[] = "Offset";
87 : static const char ITEM_DESCRIPTOR_STYLE[] = "Style";
88 : static const char ITEM_DESCRIPTOR_WIDTH[] = "Width";
89 : static const char ITEM_DESCRIPTOR_TYPE[] = "Type";
90 :
91 0 : static void ExtractStatusbarItemParameters(
92 : const Sequence< PropertyValue >& rProp,
93 : OUString& rCommandURL,
94 : OUString& rHelpURL,
95 : sal_Int16& rOffset,
96 : sal_Int16& rStyle,
97 : sal_Int16& rWidth )
98 : {
99 0 : for ( sal_Int32 i = 0; i < rProp.getLength(); i++ )
100 : {
101 0 : if ( rProp[i].Name == ITEM_DESCRIPTOR_COMMANDURL )
102 : {
103 0 : rProp[i].Value >>= rCommandURL;
104 0 : rCommandURL = rCommandURL.intern();
105 : }
106 0 : else if ( rProp[i].Name == ITEM_DESCRIPTOR_HELPURL )
107 : {
108 0 : rProp[i].Value >>= rHelpURL;
109 : }
110 0 : else if ( rProp[i].Name == ITEM_DESCRIPTOR_OFFSET )
111 : {
112 0 : rProp[i].Value >>= rOffset;
113 : }
114 0 : else if ( rProp[i].Name == ITEM_DESCRIPTOR_STYLE )
115 : {
116 0 : rProp[i].Value >>= rStyle;
117 : }
118 0 : else if ( rProp[i].Name == ITEM_DESCRIPTOR_WIDTH )
119 : {
120 0 : rProp[i].Value >>= rWidth;
121 : }
122 : }
123 0 : }
124 :
125 : struct StatusBarEntryProperty
126 : {
127 : OReadStatusBarDocumentHandler::StatusBar_XML_Namespace nNamespace;
128 : char aEntryName[20];
129 : };
130 :
131 : StatusBarEntryProperty StatusBarEntries[OReadStatusBarDocumentHandler::SB_XML_ENTRY_COUNT] =
132 : {
133 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ELEMENT_STATUSBAR },
134 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ELEMENT_STATUSBARITEM },
135 : { OReadStatusBarDocumentHandler::SB_NS_XLINK, ATTRIBUTE_URL },
136 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ATTRIBUTE_ALIGN },
137 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ATTRIBUTE_STYLE },
138 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ATTRIBUTE_AUTOSIZE },
139 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ATTRIBUTE_OWNERDRAW },
140 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ATTRIBUTE_WIDTH },
141 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ATTRIBUTE_OFFSET },
142 : { OReadStatusBarDocumentHandler::SB_NS_STATUSBAR, ATTRIBUTE_HELPURL }
143 : };
144 :
145 58 : OReadStatusBarDocumentHandler::OReadStatusBarDocumentHandler(
146 : const Reference< XIndexContainer >& rStatusBarItems ) :
147 58 : m_aStatusBarItems( rStatusBarItems )
148 : {
149 58 : OUString aNamespaceStatusBar( XMLNS_STATUSBAR );
150 116 : OUString aNamespaceXLink( XMLNS_XLINK );
151 116 : OUString aSeparator( XMLNS_FILTER_SEPARATOR );
152 :
153 : // create hash map
154 638 : for ( int i = 0; i < (int)SB_XML_ENTRY_COUNT; i++ )
155 : {
156 580 : if ( StatusBarEntries[i].nNamespace == SB_NS_STATUSBAR )
157 : {
158 522 : OUString temp( aNamespaceStatusBar );
159 522 : temp += aSeparator;
160 522 : temp += OUString::createFromAscii( StatusBarEntries[i].aEntryName );
161 522 : m_aStatusBarMap.insert( StatusBarHashMap::value_type( temp, (StatusBar_XML_Entry)i ) );
162 : }
163 : else
164 : {
165 58 : OUString temp( aNamespaceXLink );
166 58 : temp += aSeparator;
167 58 : temp += OUString::createFromAscii( StatusBarEntries[i].aEntryName );
168 58 : m_aStatusBarMap.insert( StatusBarHashMap::value_type( temp, (StatusBar_XML_Entry)i ) );
169 : }
170 : }
171 :
172 58 : m_bStatusBarStartFound = false;
173 58 : m_bStatusBarEndFound = false;
174 116 : m_bStatusBarItemStartFound = false;
175 58 : }
176 :
177 116 : OReadStatusBarDocumentHandler::~OReadStatusBarDocumentHandler()
178 : {
179 116 : }
180 :
181 : // XDocumentHandler
182 0 : void SAL_CALL OReadStatusBarDocumentHandler::startDocument()
183 : throw ( SAXException, RuntimeException, std::exception )
184 : {
185 0 : }
186 :
187 0 : void SAL_CALL OReadStatusBarDocumentHandler::endDocument()
188 : throw( SAXException, RuntimeException, std::exception )
189 : {
190 0 : SolarMutexGuard g;
191 :
192 0 : if (( m_bStatusBarStartFound && !m_bStatusBarEndFound ) ||
193 0 : ( !m_bStatusBarStartFound && m_bStatusBarEndFound ) )
194 : {
195 0 : OUString aErrorMessage = getErrorLineString();
196 0 : aErrorMessage += "No matching start or end element 'statusbar' found!";
197 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
198 0 : }
199 0 : }
200 :
201 644 : void SAL_CALL OReadStatusBarDocumentHandler::startElement(
202 : const OUString& aName, const Reference< XAttributeList > &xAttribs )
203 : throw( SAXException, RuntimeException, std::exception )
204 : {
205 644 : SolarMutexGuard g;
206 :
207 644 : StatusBarHashMap::const_iterator pStatusBarEntry = m_aStatusBarMap.find( aName );
208 644 : if ( pStatusBarEntry != m_aStatusBarMap.end() )
209 : {
210 644 : switch ( pStatusBarEntry->second )
211 : {
212 : case SB_ELEMENT_STATUSBAR:
213 : {
214 58 : if ( m_bStatusBarStartFound )
215 : {
216 0 : OUString aErrorMessage = getErrorLineString();
217 0 : aErrorMessage += "Element 'statusbar:statusbar' cannot be embedded into 'statusbar:statusbar'!";
218 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
219 : }
220 :
221 58 : m_bStatusBarStartFound = true;
222 : }
223 58 : break;
224 :
225 : case SB_ELEMENT_STATUSBARITEM:
226 : {
227 586 : if ( !m_bStatusBarStartFound )
228 : {
229 0 : OUString aErrorMessage = getErrorLineString();
230 0 : aErrorMessage += "Element 'statusbar:statusbaritem' must be embedded into element 'statusbar:statusbar'!";
231 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
232 : }
233 :
234 586 : if ( m_bStatusBarItemStartFound )
235 : {
236 0 : OUString aErrorMessage = getErrorLineString();
237 0 : aErrorMessage += "Element statusbar:statusbaritem is not a container!";
238 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
239 : }
240 :
241 586 : OUString aCommandURL;
242 1172 : OUString aHelpURL;
243 586 : sal_Int16 nItemBits( ItemStyle::ALIGN_CENTER|ItemStyle::DRAW_IN3D );
244 586 : sal_Int16 nWidth( 0 );
245 586 : sal_Int16 nOffset( STATUSBAR_OFFSET );
246 586 : bool bCommandURL( false );
247 :
248 586 : m_bStatusBarItemStartFound = true;
249 2838 : for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ )
250 : {
251 2252 : pStatusBarEntry = m_aStatusBarMap.find( xAttribs->getNameByIndex( n ) );
252 2252 : if ( pStatusBarEntry != m_aStatusBarMap.end() )
253 : {
254 2252 : switch ( pStatusBarEntry->second )
255 : {
256 : case SB_ATTRIBUTE_URL:
257 : {
258 586 : bCommandURL = true;
259 586 : aCommandURL = xAttribs->getValueByIndex( n );
260 : }
261 586 : break;
262 :
263 : case SB_ATTRIBUTE_ALIGN:
264 : {
265 586 : if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_ALIGN_LEFT )
266 : {
267 192 : nItemBits |= ItemStyle::ALIGN_LEFT;
268 192 : nItemBits &= ~ItemStyle::ALIGN_CENTER;
269 : }
270 394 : else if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_ALIGN_CENTER )
271 : {
272 392 : nItemBits |= ItemStyle::ALIGN_CENTER;
273 392 : nItemBits &= ~ItemStyle::ALIGN_LEFT;
274 : }
275 2 : else if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_ALIGN_RIGHT )
276 : {
277 2 : nItemBits |= ItemStyle::ALIGN_RIGHT;
278 : }
279 : else
280 : {
281 0 : OUString aErrorMessage = getErrorLineString();
282 0 : aErrorMessage += "Attribute statusbar:align must have one value of 'left','right' or 'center'!";
283 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
284 : }
285 : }
286 586 : break;
287 :
288 : case SB_ATTRIBUTE_STYLE:
289 : {
290 0 : if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_STYLE_IN )
291 : {
292 0 : nItemBits |= ItemStyle::DRAW_IN3D;
293 0 : nItemBits &= ~ItemStyle::DRAW_OUT3D;
294 : }
295 0 : else if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_STYLE_OUT )
296 : {
297 0 : nItemBits |= ItemStyle::DRAW_OUT3D;
298 0 : nItemBits &= ~ItemStyle::DRAW_IN3D;
299 : }
300 0 : else if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_STYLE_FLAT )
301 : {
302 0 : nItemBits |= ItemStyle::DRAW_FLAT;
303 : }
304 : else
305 : {
306 0 : OUString aErrorMessage = getErrorLineString();
307 0 : aErrorMessage += "Attribute statusbar:autosize must have value 'true' or 'false'!";
308 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
309 : }
310 : }
311 0 : break;
312 :
313 : case SB_ATTRIBUTE_AUTOSIZE:
314 : {
315 221 : if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_BOOLEAN_TRUE )
316 221 : nItemBits |= ItemStyle::AUTO_SIZE;
317 0 : else if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_BOOLEAN_FALSE )
318 0 : nItemBits &= ~ItemStyle::AUTO_SIZE;
319 : else
320 : {
321 0 : OUString aErrorMessage = getErrorLineString();
322 0 : aErrorMessage += "Attribute statusbar:autosize must have value 'true' or 'false'!";
323 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
324 : }
325 : }
326 221 : break;
327 :
328 : case SB_ATTRIBUTE_OWNERDRAW:
329 : {
330 298 : if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_BOOLEAN_TRUE )
331 298 : nItemBits |= ItemStyle::OWNER_DRAW;
332 0 : else if ( xAttribs->getValueByIndex( n ) == ATTRIBUTE_BOOLEAN_FALSE )
333 0 : nItemBits &= ~ItemStyle::OWNER_DRAW;
334 : else
335 : {
336 0 : OUString aErrorMessage = getErrorLineString();
337 0 : aErrorMessage += "Attribute statusbar:ownerdraw must have value 'true' or 'false'!";
338 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
339 : }
340 : }
341 298 : break;
342 :
343 : case SB_ATTRIBUTE_WIDTH:
344 : {
345 561 : nWidth = (sal_Int16)(xAttribs->getValueByIndex( n ).toInt32());
346 : }
347 561 : break;
348 :
349 : case SB_ATTRIBUTE_OFFSET:
350 : {
351 0 : nOffset = (sal_Int16)(xAttribs->getValueByIndex( n ).toInt32());
352 : }
353 0 : break;
354 :
355 : case SB_ATTRIBUTE_HELPURL:
356 : {
357 0 : aHelpURL = xAttribs->getValueByIndex( n );
358 : }
359 0 : break;
360 :
361 : default:
362 0 : break;
363 : }
364 : }
365 : } // for
366 :
367 586 : if ( !bCommandURL )
368 : {
369 0 : OUString aErrorMessage = getErrorLineString();
370 0 : aErrorMessage += "Required attribute statusbar:url must have a value!";
371 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
372 : }
373 : else
374 : {
375 586 : Sequence< PropertyValue > aStatusbarItemProp( 6 );
376 586 : aStatusbarItemProp[0].Name = ITEM_DESCRIPTOR_COMMANDURL;
377 586 : aStatusbarItemProp[1].Name = ITEM_DESCRIPTOR_HELPURL;
378 586 : aStatusbarItemProp[2].Name = ITEM_DESCRIPTOR_OFFSET;
379 586 : aStatusbarItemProp[3].Name = ITEM_DESCRIPTOR_STYLE;
380 586 : aStatusbarItemProp[4].Name = ITEM_DESCRIPTOR_WIDTH;
381 586 : aStatusbarItemProp[5].Name = ITEM_DESCRIPTOR_TYPE;
382 :
383 586 : aStatusbarItemProp[0].Value <<= aCommandURL;
384 586 : aStatusbarItemProp[1].Value <<= aHelpURL;
385 586 : aStatusbarItemProp[2].Value <<= nOffset;
386 586 : aStatusbarItemProp[3].Value <<= nItemBits;
387 586 : aStatusbarItemProp[4].Value <<= nWidth;
388 586 : aStatusbarItemProp[5].Value = makeAny( ::com::sun::star::ui::ItemType::DEFAULT );
389 :
390 586 : m_aStatusBarItems->insertByIndex( m_aStatusBarItems->getCount(), makeAny( aStatusbarItemProp ) );
391 586 : }
392 : }
393 586 : break;
394 :
395 : default:
396 0 : break;
397 : }
398 644 : }
399 644 : }
400 :
401 644 : void SAL_CALL OReadStatusBarDocumentHandler::endElement(const OUString& aName)
402 : throw( SAXException, RuntimeException, std::exception )
403 : {
404 644 : SolarMutexGuard g;
405 :
406 644 : StatusBarHashMap::const_iterator pStatusBarEntry = m_aStatusBarMap.find( aName );
407 644 : if ( pStatusBarEntry != m_aStatusBarMap.end() )
408 : {
409 644 : switch ( pStatusBarEntry->second )
410 : {
411 : case SB_ELEMENT_STATUSBAR:
412 : {
413 58 : if ( !m_bStatusBarStartFound )
414 : {
415 0 : OUString aErrorMessage = getErrorLineString();
416 0 : aErrorMessage += "End element 'statusbar' found, but no start element 'statusbar'";
417 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
418 : }
419 :
420 58 : m_bStatusBarStartFound = false;
421 : }
422 58 : break;
423 :
424 : case SB_ELEMENT_STATUSBARITEM:
425 : {
426 586 : if ( !m_bStatusBarItemStartFound )
427 : {
428 0 : OUString aErrorMessage = getErrorLineString();
429 0 : aErrorMessage += "End element 'statusbar:statusbaritem' found, but no start element 'statusbar:statusbaritem'";
430 0 : throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
431 : }
432 :
433 586 : m_bStatusBarItemStartFound = false;
434 : }
435 586 : break;
436 :
437 : default:
438 0 : break;
439 : }
440 644 : }
441 644 : }
442 :
443 1230 : void SAL_CALL OReadStatusBarDocumentHandler::characters(const OUString&)
444 : throw( SAXException, RuntimeException, std::exception )
445 : {
446 1230 : }
447 :
448 0 : void SAL_CALL OReadStatusBarDocumentHandler::ignorableWhitespace(const OUString&)
449 : throw( SAXException, RuntimeException, std::exception )
450 : {
451 0 : }
452 :
453 0 : void SAL_CALL OReadStatusBarDocumentHandler::processingInstruction(
454 : const OUString& /*aTarget*/, const OUString& /*aData*/ )
455 : throw( SAXException, RuntimeException, std::exception )
456 : {
457 0 : }
458 :
459 58 : void SAL_CALL OReadStatusBarDocumentHandler::setDocumentLocator(
460 : const Reference< XLocator > &xLocator)
461 : throw( SAXException, RuntimeException, std::exception )
462 : {
463 58 : SolarMutexGuard g;
464 :
465 58 : m_xLocator = xLocator;
466 58 : }
467 :
468 0 : OUString OReadStatusBarDocumentHandler::getErrorLineString()
469 : {
470 0 : SolarMutexGuard g;
471 :
472 0 : if ( m_xLocator.is() )
473 : {
474 : char buffer[32];
475 0 : snprintf( buffer, sizeof(buffer), "Line: %ld - ", static_cast<long>( m_xLocator->getLineNumber() ));
476 0 : return OUString::createFromAscii( buffer );
477 : }
478 : else
479 0 : return OUString();
480 : }
481 :
482 : // OWriteStatusBarDocumentHandler
483 :
484 0 : OWriteStatusBarDocumentHandler::OWriteStatusBarDocumentHandler(
485 : const Reference< XIndexAccess >& aStatusBarItems,
486 : const Reference< XDocumentHandler >& rWriteDocumentHandler ) :
487 : m_aStatusBarItems( aStatusBarItems ),
488 0 : m_xWriteDocumentHandler( rWriteDocumentHandler )
489 : {
490 0 : ::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
491 0 : m_xEmptyList = Reference< XAttributeList >( static_cast<XAttributeList *>(pList), UNO_QUERY );
492 0 : m_aAttributeType = ATTRIBUTE_TYPE_CDATA;
493 0 : m_aXMLXlinkNS = XMLNS_XLINK_PREFIX;
494 0 : m_aXMLStatusBarNS = XMLNS_STATUSBAR_PREFIX;
495 0 : }
496 :
497 0 : OWriteStatusBarDocumentHandler::~OWriteStatusBarDocumentHandler()
498 : {
499 0 : }
500 :
501 0 : void OWriteStatusBarDocumentHandler::WriteStatusBarDocument() throw
502 : ( SAXException, RuntimeException )
503 : {
504 0 : SolarMutexGuard g;
505 :
506 0 : m_xWriteDocumentHandler->startDocument();
507 :
508 : // write DOCTYPE line!
509 0 : Reference< XExtendedDocumentHandler > xExtendedDocHandler( m_xWriteDocumentHandler, UNO_QUERY );
510 0 : if ( xExtendedDocHandler.is() )
511 : {
512 0 : xExtendedDocHandler->unknown( OUString( STATUSBAR_DOCTYPE ) );
513 0 : m_xWriteDocumentHandler->ignorableWhitespace( OUString() );
514 : }
515 :
516 0 : ::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
517 0 : Reference< XAttributeList > xList( static_cast<XAttributeList *>(pList) , UNO_QUERY );
518 :
519 : pList->AddAttribute( OUString( ATTRIBUTE_XMLNS_STATUSBAR ),
520 : m_aAttributeType,
521 0 : OUString( XMLNS_STATUSBAR ) );
522 :
523 : pList->AddAttribute( OUString( ATTRIBUTE_XMLNS_XLINK ),
524 : m_aAttributeType,
525 0 : OUString( XMLNS_XLINK ) );
526 :
527 0 : m_xWriteDocumentHandler->startElement( OUString( ELEMENT_NS_STATUSBAR ), pList );
528 0 : m_xWriteDocumentHandler->ignorableWhitespace( OUString() );
529 :
530 0 : sal_Int32 nItemCount = m_aStatusBarItems->getCount();
531 0 : Any aAny;
532 :
533 0 : for ( sal_Int32 nItemPos = 0; nItemPos < nItemCount; nItemPos++ )
534 : {
535 0 : Sequence< PropertyValue > aProps;
536 0 : aAny = m_aStatusBarItems->getByIndex( nItemPos );
537 0 : if ( aAny >>= aProps )
538 : {
539 0 : OUString aCommandURL;
540 0 : OUString aHelpURL;
541 0 : sal_Int16 nStyle( ItemStyle::ALIGN_CENTER|ItemStyle::DRAW_IN3D );
542 0 : sal_Int16 nWidth( 0 );
543 0 : sal_Int16 nOffset( STATUSBAR_OFFSET );
544 :
545 : ExtractStatusbarItemParameters(
546 : aProps,
547 : aCommandURL,
548 : aHelpURL,
549 : nOffset,
550 : nStyle,
551 0 : nWidth );
552 :
553 0 : if ( !aCommandURL.isEmpty() )
554 0 : WriteStatusBarItem( aCommandURL, aHelpURL, nOffset, nStyle, nWidth );
555 : }
556 0 : }
557 :
558 0 : m_xWriteDocumentHandler->ignorableWhitespace( OUString() );
559 0 : m_xWriteDocumentHandler->endElement( OUString( ELEMENT_NS_STATUSBAR ) );
560 0 : m_xWriteDocumentHandler->ignorableWhitespace( OUString() );
561 0 : m_xWriteDocumentHandler->endDocument();
562 0 : }
563 :
564 : // protected member functions
565 :
566 0 : void OWriteStatusBarDocumentHandler::WriteStatusBarItem(
567 : const OUString& rCommandURL,
568 : const OUString& /*rHelpURL*/,
569 : sal_Int16 nOffset,
570 : sal_Int16 nStyle,
571 : sal_Int16 nWidth )
572 : throw ( SAXException, RuntimeException )
573 : {
574 0 : ::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
575 0 : Reference< XAttributeList > xList( static_cast<XAttributeList *>(pList) , UNO_QUERY );
576 :
577 0 : if (m_aAttributeURL.isEmpty() )
578 : {
579 0 : m_aAttributeURL = m_aXMLXlinkNS;
580 0 : m_aAttributeURL += OUString( ATTRIBUTE_URL );
581 : }
582 :
583 : // save required attribute (URL)
584 0 : pList->AddAttribute( m_aAttributeURL, m_aAttributeType, rCommandURL );
585 :
586 : // alignment
587 0 : if ( nStyle & ItemStyle::ALIGN_RIGHT )
588 : {
589 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_ALIGN,
590 : m_aAttributeType,
591 0 : OUString( ATTRIBUTE_ALIGN_RIGHT ) );
592 : }
593 0 : else if ( nStyle & ItemStyle::ALIGN_CENTER )
594 : {
595 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_ALIGN,
596 : m_aAttributeType,
597 0 : OUString( ATTRIBUTE_ALIGN_CENTER ) );
598 : }
599 : else
600 : {
601 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_ALIGN,
602 : m_aAttributeType,
603 0 : OUString( ATTRIBUTE_ALIGN_LEFT ) );
604 : }
605 :
606 : // style ( SIB_IN is default )
607 0 : if ( nStyle & ItemStyle::DRAW_FLAT )
608 : {
609 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_STYLE,
610 : m_aAttributeType,
611 0 : OUString( ATTRIBUTE_STYLE_FLAT ) );
612 : }
613 0 : else if ( nStyle & ItemStyle::DRAW_OUT3D )
614 : {
615 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_STYLE,
616 : m_aAttributeType,
617 0 : OUString( ATTRIBUTE_STYLE_OUT ) );
618 : }
619 :
620 : // autosize (default sal_False)
621 0 : if ( nStyle & ItemStyle::AUTO_SIZE )
622 : {
623 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_AUTOSIZE,
624 : m_aAttributeType,
625 0 : OUString( ATTRIBUTE_BOOLEAN_TRUE ) );
626 : }
627 :
628 : // ownerdraw (default sal_False)
629 0 : if ( nStyle & ItemStyle::OWNER_DRAW )
630 : {
631 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_OWNERDRAW,
632 : m_aAttributeType,
633 0 : OUString( ATTRIBUTE_BOOLEAN_TRUE ) );
634 : }
635 :
636 : // width (default 0)
637 0 : if ( nWidth > 0 )
638 : {
639 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_WIDTH,
640 : m_aAttributeType,
641 0 : OUString::number( nWidth ) );
642 : }
643 :
644 : // offset (default STATUSBAR_OFFSET)
645 0 : if ( nOffset != STATUSBAR_OFFSET )
646 : {
647 0 : pList->AddAttribute( m_aXMLStatusBarNS + ATTRIBUTE_OFFSET,
648 : m_aAttributeType,
649 0 : OUString::number( nOffset ) );
650 : }
651 :
652 0 : m_xWriteDocumentHandler->ignorableWhitespace( OUString() );
653 0 : m_xWriteDocumentHandler->startElement( OUString( ELEMENT_NS_STATUSBARITEM ), xList );
654 0 : m_xWriteDocumentHandler->ignorableWhitespace( OUString() );
655 0 : m_xWriteDocumentHandler->endElement( OUString( ELEMENT_NS_STATUSBARITEM ) );
656 0 : }
657 :
658 : } // namespace framework
659 :
660 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|