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