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