LCOV - code coverage report
Current view: top level - framework/source/fwe/xml - statusbardocumenthandler.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 100 266 37.6 %
Date: 2015-06-13 12:38:46 Functions: 7 18 38.9 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11