LCOV - code coverage report
Current view: top level - sc/source/ui/unoobj - fielduno.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 728 0.0 %
Date: 2014-04-14 Functions: 0 93 0.0 %
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 "fielduno.hxx"
      21             : #include "textuno.hxx"
      22             : #include "miscuno.hxx"
      23             : #include "docsh.hxx"
      24             : #include "hints.hxx"
      25             : #include "editsrc.hxx"
      26             : #include "cellsuno.hxx"
      27             : #include "servuno.hxx"
      28             : #include "unonames.hxx"
      29             : #include "editutil.hxx"
      30             : 
      31             : #include <svl/smplhint.hxx>
      32             : #include <vcl/svapp.hxx>
      33             : 
      34             : 
      35             : #include <editeng/eeitem.hxx>
      36             : 
      37             : #include <editeng/editeng.hxx>
      38             : #include <editeng/editobj.hxx>
      39             : #include <editeng/flditem.hxx>
      40             : #include <comphelper/servicehelper.hxx>
      41             : #include <cppuhelper/supportsservice.hxx>
      42             : 
      43             : #include <com/sun/star/beans/PropertyAttribute.hpp>
      44             : #include <com/sun/star/text/TextContentAnchorType.hpp>
      45             : #include <com/sun/star/text/WrapTextMode.hpp>
      46             : #include <com/sun/star/text/FilenameDisplayFormat.hpp>
      47             : #include <com/sun/star/text/textfield/Type.hpp>
      48             : 
      49             : using namespace com::sun::star;
      50             : 
      51             : namespace {
      52             : 
      53             : //  alles ohne Which-ID, Map nur fuer PropertySetInfo
      54             : 
      55           0 : const SfxItemPropertySet* getDateTimePropertySet()
      56             : {
      57             :     static const SfxItemPropertyMapEntry aMapContent[] =
      58             :     {
      59           0 :         { OUString(SC_UNONAME_DATETIME), 0, getCppuType((const util::DateTime*)0), 0, 0 },
      60           0 :         { OUString(SC_UNONAME_ISFIXED),  0, getBooleanCppuType(),                  0, 0 },
      61           0 :         { OUString(SC_UNONAME_ISDATE),   0, getBooleanCppuType(),                  0, 0 },
      62           0 :         { OUString(SC_UNONAME_NUMFMT),   0, getCppuType((const sal_Int32*)0),      0, 0 },
      63             :         { OUString(), 0, css::uno::Type(), 0, 0 }
      64           0 :     };
      65           0 :     static SfxItemPropertySet aMap(aMapContent);
      66           0 :     return &aMap;
      67             : }
      68             : 
      69           0 : const SfxItemPropertySet* getEmptyPropertySet()
      70             : {
      71             :     static const SfxItemPropertyMapEntry aMapContent[] =
      72             :     {
      73             :         { OUString(), 0, css::uno::Type(), 0, 0 }
      74           0 :     };
      75           0 :     static SfxItemPropertySet aMap(aMapContent);
      76           0 :     return &aMap;
      77             : }
      78             : 
      79           0 : const SfxItemPropertySet* lcl_GetURLPropertySet()
      80             : {
      81             :     static const SfxItemPropertyMapEntry aURLPropertyMap_Impl[] =
      82             :     {
      83           0 :         {OUString(SC_UNONAME_ANCTYPE),  0,  getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 },
      84           0 :         {OUString(SC_UNONAME_ANCTYPES), 0,  getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 },
      85           0 :         {OUString(SC_UNONAME_REPR),     0,  getCppuType((OUString*)0),    0, 0},
      86           0 :         {OUString(SC_UNONAME_TARGET),   0,  getCppuType((OUString*)0),    0, 0},
      87           0 :         {OUString(SC_UNONAME_TEXTWRAP), 0,  getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 },
      88           0 :         {OUString(SC_UNONAME_URL),      0,  getCppuType((OUString*)0),    0, 0},
      89             :         { OUString(), 0, css::uno::Type(), 0, 0 }
      90           0 :     };
      91           0 :     static SfxItemPropertySet aURLPropertySet_Impl( aURLPropertyMap_Impl );
      92           0 :     return &aURLPropertySet_Impl;
      93             : }
      94             : 
      95           0 : const SfxItemPropertySet* lcl_GetHeaderFieldPropertySet()
      96             : {
      97             :     static const SfxItemPropertyMapEntry aHeaderFieldPropertyMap_Impl[] =
      98             :     {
      99           0 :         {OUString(SC_UNONAME_ANCTYPE),  0,  getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 },
     100           0 :         {OUString(SC_UNONAME_ANCTYPES), 0,  getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 },
     101           0 :         {OUString(SC_UNONAME_TEXTWRAP), 0,  getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 },
     102             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     103           0 :     };
     104           0 :     static SfxItemPropertySet aHeaderFieldPropertySet_Impl( aHeaderFieldPropertyMap_Impl );
     105           0 :     return &aHeaderFieldPropertySet_Impl;
     106             : }
     107             : 
     108           0 : const SfxItemPropertySet* lcl_GetFileFieldPropertySet()
     109             : {
     110             :     static const SfxItemPropertyMapEntry aFileFieldPropertyMap_Impl[] =
     111             :     {
     112           0 :         {OUString(SC_UNONAME_ANCTYPE),  0,  getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 },
     113           0 :         {OUString(SC_UNONAME_ANCTYPES), 0,  getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 },
     114           0 :         {OUString(SC_UNONAME_FILEFORM), 0,  getCppuType((sal_Int16*)0),        0, 0 },
     115           0 :         {OUString(SC_UNONAME_TEXTWRAP), 0,  getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 },
     116             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     117           0 :     };
     118           0 :     static SfxItemPropertySet aFileFieldPropertySet_Impl( aFileFieldPropertyMap_Impl );
     119           0 :     return &aFileFieldPropertySet_Impl;
     120             : }
     121             : 
     122           0 : SvxFileFormat lcl_UnoToSvxFileFormat( sal_Int16 nUnoValue )
     123             : {
     124           0 :     switch( nUnoValue )
     125             :     {
     126           0 :         case text::FilenameDisplayFormat::FULL: return SVXFILEFORMAT_FULLPATH;
     127           0 :         case text::FilenameDisplayFormat::PATH: return SVXFILEFORMAT_PATH;
     128           0 :         case text::FilenameDisplayFormat::NAME: return SVXFILEFORMAT_NAME;
     129             :         default:
     130           0 :             return SVXFILEFORMAT_NAME_EXT;
     131             :     }
     132             : }
     133             : 
     134           0 : sal_Int16 lcl_SvxToUnoFileFormat( SvxFileFormat nSvxValue )
     135             : {
     136           0 :     switch( nSvxValue )
     137             :     {
     138           0 :         case SVXFILEFORMAT_NAME_EXT:    return text::FilenameDisplayFormat::NAME_AND_EXT;
     139           0 :         case SVXFILEFORMAT_FULLPATH:    return text::FilenameDisplayFormat::FULL;
     140           0 :         case SVXFILEFORMAT_PATH:        return text::FilenameDisplayFormat::PATH;
     141             :         default:
     142           0 :             return text::FilenameDisplayFormat::NAME;
     143             :     }
     144             : }
     145             : 
     146             : }
     147             : 
     148             : 
     149           0 : SC_SIMPLE_SERVICE_INFO( ScCellFieldsObj, "ScCellFieldsObj", "com.sun.star.text.TextFields" )
     150           0 : SC_SIMPLE_SERVICE_INFO( ScHeaderFieldsObj, "ScHeaderFieldsObj", "com.sun.star.text.TextFields" )
     151             : 
     152             : //  ScUnoEditEngine nur um aus einer EditEngine die Felder herauszubekommen...
     153             : 
     154             : enum ScUnoCollectMode
     155             : {
     156             :     SC_UNO_COLLECT_NONE,
     157             :     SC_UNO_COLLECT_COUNT,
     158             :     SC_UNO_COLLECT_FINDINDEX,
     159             :     SC_UNO_COLLECT_FINDPOS
     160             : };
     161             : 
     162             : /**
     163             :  * This class exists solely to allow searching through field items.  TODO:
     164             :  * Look into providing the same functionality directly in EditEngine, to
     165             :  * avoid having this class altogether.
     166             :  */
     167             : class ScUnoEditEngine : public ScEditEngineDefaulter
     168             : {
     169             :     ScUnoCollectMode    eMode;
     170             :     sal_uInt16              nFieldCount;
     171             :     sal_Int32           mnFieldType;
     172             :     SvxFieldData*       pFound;         // lokale Kopie
     173             :     sal_Int32           nFieldPar;
     174             :     sal_Int32           nFieldPos;
     175             :     sal_uInt16              nFieldIndex;
     176             : 
     177             : public:
     178             :                 ScUnoEditEngine(ScEditEngineDefaulter* pSource);
     179             :                 virtual ~ScUnoEditEngine();
     180             : 
     181             :     virtual OUString  CalcFieldValue( const SvxFieldItem& rField, sal_Int32 nPara, sal_Int32 nPos,
     182             :                                     Color*& rTxtColor, Color*& rFldColor ) SAL_OVERRIDE;
     183             : 
     184             :     sal_uInt16 CountFields();
     185             :     SvxFieldData* FindByIndex(sal_uInt16 nIndex);
     186             :     SvxFieldData* FindByPos(sal_Int32 nPar, sal_Int32 nPos, sal_Int32 nType);
     187             : 
     188           0 :     sal_Int32       GetFieldPar() const     { return nFieldPar; }
     189           0 :     sal_Int32       GetFieldPos() const     { return nFieldPos; }
     190             : };
     191             : 
     192           0 : ScUnoEditEngine::ScUnoEditEngine(ScEditEngineDefaulter* pSource)
     193             :     : ScEditEngineDefaulter(*pSource)
     194             :     , eMode(SC_UNO_COLLECT_NONE)
     195             :     , nFieldCount(0)
     196             :     , mnFieldType(text::textfield::Type::UNSPECIFIED)
     197             :     , pFound(NULL)
     198             :     , nFieldPar(0)
     199             :     , nFieldPos(0)
     200           0 :     , nFieldIndex(0)
     201             : {
     202           0 :     if (pSource)
     203             :     {
     204           0 :         EditTextObject* pData = pSource->CreateTextObject();
     205           0 :         SetText( *pData );
     206           0 :         delete pData;
     207             :     }
     208           0 : }
     209             : 
     210           0 : ScUnoEditEngine::~ScUnoEditEngine()
     211             : {
     212           0 :     delete pFound;
     213           0 : }
     214             : 
     215           0 : OUString ScUnoEditEngine::CalcFieldValue( const SvxFieldItem& rField,
     216             :             sal_Int32 nPara, sal_Int32 nPos, Color*& rTxtColor, Color*& rFldColor )
     217             : {
     218           0 :     OUString aRet(EditEngine::CalcFieldValue( rField, nPara, nPos, rTxtColor, rFldColor ));
     219           0 :     if (eMode != SC_UNO_COLLECT_NONE)
     220             :     {
     221           0 :         const SvxFieldData* pFieldData = rField.GetField();
     222           0 :         if ( pFieldData )
     223             :         {
     224           0 :             if (mnFieldType == text::textfield::Type::UNSPECIFIED || pFieldData->GetClassId() == mnFieldType)
     225             :             {
     226           0 :                 if ( eMode == SC_UNO_COLLECT_FINDINDEX && !pFound && nFieldCount == nFieldIndex )
     227             :                 {
     228           0 :                     pFound = pFieldData->Clone();
     229           0 :                     nFieldPar = nPara;
     230           0 :                     nFieldPos = nPos;
     231             :                 }
     232           0 :                 if ( eMode == SC_UNO_COLLECT_FINDPOS && !pFound &&
     233           0 :                         nPara == nFieldPar && nPos == nFieldPos )
     234             :                 {
     235           0 :                     pFound = pFieldData->Clone();
     236           0 :                     nFieldIndex = nFieldCount;
     237             :                 }
     238           0 :                 ++nFieldCount;
     239             :             }
     240             :         }
     241             :     }
     242           0 :     return aRet;
     243             : }
     244             : 
     245           0 : sal_uInt16 ScUnoEditEngine::CountFields()
     246             : {
     247           0 :     eMode = SC_UNO_COLLECT_COUNT;
     248           0 :     mnFieldType = text::textfield::Type::UNSPECIFIED;
     249           0 :     nFieldCount = 0;
     250           0 :     UpdateFields();
     251           0 :     eMode = SC_UNO_COLLECT_NONE;
     252             : 
     253           0 :     return nFieldCount;
     254             : }
     255             : 
     256           0 : SvxFieldData* ScUnoEditEngine::FindByIndex(sal_uInt16 nIndex)
     257             : {
     258           0 :     eMode = SC_UNO_COLLECT_FINDINDEX;
     259           0 :     nFieldIndex = nIndex;
     260           0 :     mnFieldType = text::textfield::Type::UNSPECIFIED;
     261           0 :     nFieldCount = 0;
     262           0 :     UpdateFields();
     263           0 :     eMode = SC_UNO_COLLECT_NONE;
     264             : 
     265           0 :     return pFound;
     266             : }
     267             : 
     268           0 : SvxFieldData* ScUnoEditEngine::FindByPos(sal_Int32 nPar, sal_Int32 nPos, sal_Int32 nType)
     269             : {
     270           0 :     eMode = SC_UNO_COLLECT_FINDPOS;
     271           0 :     nFieldPar = nPar;
     272           0 :     nFieldPos = nPos;
     273           0 :     mnFieldType = nType;
     274           0 :     nFieldCount = 0;
     275           0 :     UpdateFields();
     276           0 :     mnFieldType = text::textfield::Type::UNSPECIFIED;
     277           0 :     eMode = SC_UNO_COLLECT_NONE;
     278             : 
     279           0 :     return pFound;
     280             : }
     281             : 
     282           0 : ScCellFieldsObj::ScCellFieldsObj(
     283             :     const uno::Reference<text::XTextRange>& xContent,
     284             :     ScDocShell* pDocSh, const ScAddress& rPos) :
     285             :     mxContent(xContent),
     286             :     pDocShell( pDocSh ),
     287             :     aCellPos( rPos ),
     288           0 :     mpRefreshListeners( NULL )
     289             : {
     290           0 :     pDocShell->GetDocument()->AddUnoObject(*this);
     291             : 
     292           0 :     mpEditSource = new ScCellEditSource( pDocShell, aCellPos );
     293           0 : }
     294             : 
     295           0 : ScCellFieldsObj::~ScCellFieldsObj()
     296             : {
     297           0 :     if (pDocShell)
     298           0 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
     299             : 
     300           0 :     delete mpEditSource;
     301             : 
     302             :     // increment refcount to prevent double call off dtor
     303           0 :     osl_atomic_increment( &m_refCount );
     304             : 
     305           0 :     if (mpRefreshListeners)
     306             :     {
     307           0 :         lang::EventObject aEvent;
     308           0 :         aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
     309           0 :         if (mpRefreshListeners)
     310             :         {
     311           0 :             mpRefreshListeners->disposeAndClear(aEvent);
     312           0 :             DELETEZ( mpRefreshListeners );
     313           0 :         }
     314             :     }
     315           0 : }
     316             : 
     317           0 : void ScCellFieldsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
     318             : {
     319           0 :     if ( rHint.ISA( ScUpdateRefHint ) )
     320             :     {
     321             :         //! Ref-Update
     322             :     }
     323           0 :     else if ( rHint.ISA( SfxSimpleHint ) &&
     324           0 :             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
     325             :     {
     326           0 :         pDocShell = NULL;       // ungueltig geworden
     327             :     }
     328             : 
     329             :     //  EditSource hat sich selber als Listener angemeldet
     330           0 : }
     331             : 
     332             : // XIndexAccess (via XTextFields)
     333             : 
     334           0 : uno::Reference<text::XTextField> ScCellFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) const
     335             : {
     336             :     //! Feld-Funktionen muessen an den Forwarder !!!
     337           0 :     ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     338           0 :     ScUnoEditEngine aTempEngine(pEditEngine);
     339           0 :     SvxFieldData* pData = aTempEngine.FindByIndex(static_cast<sal_uInt16>(Index));
     340           0 :     if (!pData)
     341           0 :         return uno::Reference<text::XTextField>();
     342             : 
     343           0 :     sal_Int32 nPar = aTempEngine.GetFieldPar();
     344           0 :     sal_Int32 nPos = aTempEngine.GetFieldPos();
     345           0 :     ESelection aSelection( nPar, nPos, nPar, nPos+1 );      // Feld ist 1 Zeichen
     346             : 
     347           0 :     sal_Int32 eType = pData->GetClassId();
     348             :     uno::Reference<text::XTextField> xRet(
     349           0 :         new ScEditFieldObj(mxContent, new ScCellEditSource(pDocShell, aCellPos), eType, aSelection));
     350           0 :     return xRet;
     351             : }
     352             : 
     353           0 : sal_Int32 SAL_CALL ScCellFieldsObj::getCount() throw(uno::RuntimeException, std::exception)
     354             : {
     355           0 :     SolarMutexGuard aGuard;
     356             : 
     357             :     //! Feld-Funktionen muessen an den Forwarder !!!
     358           0 :     ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     359           0 :     ScUnoEditEngine aTempEngine(pEditEngine);
     360             : 
     361           0 :     return aTempEngine.CountFields();       // Felder zaehlen, in Zelle ist der Typ egal
     362             : }
     363             : 
     364           0 : uno::Any SAL_CALL ScCellFieldsObj::getByIndex( sal_Int32 nIndex )
     365             :                             throw(lang::IndexOutOfBoundsException,
     366             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
     367             : {
     368           0 :     SolarMutexGuard aGuard;
     369           0 :     uno::Reference<text::XTextField> xField(GetObjectByIndex_Impl(nIndex));
     370           0 :     if (xField.is())
     371           0 :         return uno::makeAny(xField);
     372             :     else
     373           0 :         throw lang::IndexOutOfBoundsException();
     374             : }
     375             : 
     376           0 : uno::Type SAL_CALL ScCellFieldsObj::getElementType() throw(uno::RuntimeException, std::exception)
     377             : {
     378           0 :     SolarMutexGuard aGuard;
     379           0 :     return getCppuType((uno::Reference<text::XTextField>*)0);
     380             : }
     381             : 
     382           0 : sal_Bool SAL_CALL ScCellFieldsObj::hasElements() throw(uno::RuntimeException, std::exception)
     383             : {
     384           0 :     SolarMutexGuard aGuard;
     385           0 :     return ( getCount() != 0 );
     386             : }
     387             : 
     388           0 : uno::Reference<container::XEnumeration> SAL_CALL ScCellFieldsObj::createEnumeration()
     389             :                                                     throw(uno::RuntimeException, std::exception)
     390             : {
     391           0 :     SolarMutexGuard aGuard;
     392           0 :     return new ScIndexEnumeration(this, OUString("com.sun.star.text.TextFieldEnumeration"));
     393             : }
     394             : 
     395           0 : void SAL_CALL ScCellFieldsObj::addContainerListener(
     396             :                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
     397             :                                     throw(uno::RuntimeException, std::exception)
     398             : {
     399             :     OSL_FAIL("not implemented");
     400           0 : }
     401             : 
     402           0 : void SAL_CALL ScCellFieldsObj::removeContainerListener(
     403             :                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
     404             :                                     throw(uno::RuntimeException, std::exception)
     405             : {
     406             :     OSL_FAIL("not implemented");
     407           0 : }
     408             : 
     409             : // XRefreshable
     410           0 : void SAL_CALL ScCellFieldsObj::refresh(  )
     411             :                                     throw (uno::RuntimeException, std::exception)
     412             : {
     413           0 :     if (mpRefreshListeners)
     414             :     {
     415             :         //  Call all listeners.
     416           0 :         uno::Sequence< uno::Reference< uno::XInterface > > aListeners(mpRefreshListeners->getElements());
     417           0 :         sal_uInt32 nLength(aListeners.getLength());
     418           0 :         if (nLength)
     419             :         {
     420           0 :             const uno::Reference< uno::XInterface >* pInterfaces = aListeners.getConstArray();
     421           0 :             if (pInterfaces)
     422             :             {
     423           0 :                 lang::EventObject aEvent;
     424           0 :                 aEvent.Source.set(uno::Reference< util::XRefreshable >(const_cast<ScCellFieldsObj*>(this)));
     425           0 :                 sal_uInt32 i(0);
     426           0 :                 while (i < nLength)
     427             :                 {
     428             :                     try
     429             :                     {
     430           0 :                         while(i < nLength)
     431             :                         {
     432           0 :                             static_cast< util::XRefreshListener* >(pInterfaces->get())->refreshed(aEvent);
     433           0 :                             ++pInterfaces;
     434           0 :                             ++i;
     435             :                         }
     436             :                     }
     437           0 :                     catch(uno::RuntimeException&)
     438             :                     {
     439           0 :                         ++pInterfaces;
     440           0 :                         ++i;
     441             :                     }
     442           0 :                 }
     443             :             }
     444           0 :         }
     445             :     }
     446           0 : }
     447             : 
     448           0 : void SAL_CALL ScCellFieldsObj::addRefreshListener( const uno::Reference< util::XRefreshListener >& xListener )
     449             :                                     throw (uno::RuntimeException, std::exception)
     450             : {
     451           0 :     if (xListener.is())
     452             :     {
     453           0 :         SolarMutexGuard aGuard;
     454           0 :         if (!mpRefreshListeners)
     455           0 :             mpRefreshListeners = new cppu::OInterfaceContainerHelper(aMutex);
     456           0 :         mpRefreshListeners->addInterface(xListener);
     457             :     }
     458           0 : }
     459             : 
     460           0 : void SAL_CALL ScCellFieldsObj::removeRefreshListener( const uno::Reference<util::XRefreshListener >& xListener )
     461             :                                     throw (uno::RuntimeException, std::exception)
     462             : {
     463           0 :     if (xListener.is())
     464             :     {
     465           0 :         SolarMutexGuard aGuard;
     466           0 :         if (mpRefreshListeners)
     467           0 :             mpRefreshListeners->removeInterface(xListener);
     468             :     }
     469           0 : }
     470             : 
     471           0 : ScHeaderFieldsObj::ScHeaderFieldsObj(ScHeaderFooterTextData& rData) :
     472             :     mrData(rData),
     473           0 :     mpRefreshListeners( NULL )
     474             : {
     475           0 :     mpEditSource = new ScHeaderFooterEditSource(rData);
     476           0 : }
     477             : 
     478           0 : ScHeaderFieldsObj::~ScHeaderFieldsObj()
     479             : {
     480           0 :     delete mpEditSource;
     481             : 
     482             :     // increment refcount to prevent double call off dtor
     483           0 :     osl_atomic_increment( &m_refCount );
     484             : 
     485           0 :     if (mpRefreshListeners)
     486             :     {
     487           0 :         lang::EventObject aEvent;
     488           0 :         aEvent.Source = static_cast<cppu::OWeakObject*>(this);
     489           0 :         if (mpRefreshListeners)
     490             :         {
     491           0 :             mpRefreshListeners->disposeAndClear(aEvent);
     492           0 :             DELETEZ( mpRefreshListeners );
     493           0 :         }
     494             :     }
     495           0 : }
     496             : 
     497             : // XIndexAccess (via XTextFields)
     498             : 
     499           0 : uno::Reference<text::XTextField> ScHeaderFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) const
     500             : {
     501             :     //! Feld-Funktionen muessen an den Forwarder !!!
     502           0 :     ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     503           0 :     ScUnoEditEngine aTempEngine(pEditEngine);
     504             : 
     505           0 :     SvxFieldData* pData = aTempEngine.FindByIndex(static_cast<sal_uInt16>(Index));
     506           0 :     if (!pData)
     507           0 :         return NULL;
     508             : 
     509             :     // Get the parent text range instance.
     510           0 :     uno::Reference<text::XTextRange> xTextRange;
     511           0 :     ScHeaderFooterContentObj& rContentObj = mrData.GetContentObj();
     512           0 :     uno::Reference<text::XText> xText;
     513           0 :     sal_uInt16 nPart = mrData.GetPart();
     514           0 :     if (nPart == SC_HDFT_LEFT)
     515           0 :         xText = rContentObj.getLeftText();
     516           0 :     else if (nPart == SC_HDFT_CENTER)
     517           0 :         xText = rContentObj.getCenterText();
     518             :     else
     519           0 :         xText = rContentObj.getRightText();
     520             : 
     521           0 :     uno::Reference<text::XTextRange> xTemp(xText, uno::UNO_QUERY);
     522           0 :     xTextRange = xTemp;
     523             : 
     524           0 :     sal_Int32 nPar = aTempEngine.GetFieldPar();
     525           0 :     sal_Int32 nPos = aTempEngine.GetFieldPos();
     526           0 :     ESelection aSelection( nPar, nPos, nPar, nPos+1 );      // Field is 1 character
     527             : 
     528           0 :     sal_Int32 eRealType = pData->GetClassId();
     529             :     uno::Reference<text::XTextField> xRet(
     530           0 :         new ScEditFieldObj(xTextRange, new ScHeaderFooterEditSource(mrData), eRealType, aSelection));
     531           0 :     return xRet;
     532             : }
     533             : 
     534           0 : sal_Int32 SAL_CALL ScHeaderFieldsObj::getCount() throw(uno::RuntimeException, std::exception)
     535             : {
     536           0 :     SolarMutexGuard aGuard;
     537             : 
     538             :     //! Feld-Funktionen muessen an den Forwarder !!!
     539           0 :     ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     540           0 :     ScUnoEditEngine aTempEngine(pEditEngine);
     541           0 :     return aTempEngine.CountFields();
     542             : }
     543             : 
     544           0 : uno::Any SAL_CALL ScHeaderFieldsObj::getByIndex( sal_Int32 nIndex )
     545             :                             throw(lang::IndexOutOfBoundsException,
     546             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
     547             : {
     548           0 :     SolarMutexGuard aGuard;
     549           0 :     uno::Reference<text::XTextField> xField(GetObjectByIndex_Impl(nIndex));
     550           0 :     if (xField.is())
     551           0 :         return uno::makeAny(xField);
     552             :     else
     553           0 :         throw lang::IndexOutOfBoundsException();
     554             : }
     555             : 
     556           0 : uno::Type SAL_CALL ScHeaderFieldsObj::getElementType() throw(uno::RuntimeException, std::exception)
     557             : {
     558           0 :     SolarMutexGuard aGuard;
     559           0 :     return getCppuType((uno::Reference<text::XTextField>*)0);
     560             : }
     561             : 
     562           0 : sal_Bool SAL_CALL ScHeaderFieldsObj::hasElements() throw(uno::RuntimeException, std::exception)
     563             : {
     564           0 :     SolarMutexGuard aGuard;
     565           0 :     return ( getCount() != 0 );
     566             : }
     567             : 
     568           0 : uno::Reference<container::XEnumeration> SAL_CALL ScHeaderFieldsObj::createEnumeration()
     569             :                                                     throw(uno::RuntimeException, std::exception)
     570             : {
     571           0 :     SolarMutexGuard aGuard;
     572           0 :     return new ScIndexEnumeration(this, OUString("com.sun.star.text.TextFieldEnumeration"));
     573             : }
     574             : 
     575           0 : void SAL_CALL ScHeaderFieldsObj::addContainerListener(
     576             :                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
     577             :                                     throw(uno::RuntimeException, std::exception)
     578             : {
     579             :     OSL_FAIL("not implemented");
     580           0 : }
     581             : 
     582           0 : void SAL_CALL ScHeaderFieldsObj::removeContainerListener(
     583             :                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
     584             :                                     throw(uno::RuntimeException, std::exception)
     585             : {
     586             :     OSL_FAIL("not implemented");
     587           0 : }
     588             : 
     589             : // XRefreshable
     590           0 : void SAL_CALL ScHeaderFieldsObj::refresh(  )
     591             :                                     throw (uno::RuntimeException, std::exception)
     592             : {
     593           0 :     if (mpRefreshListeners)
     594             :     {
     595             :         //  Call all listeners.
     596           0 :         uno::Sequence< uno::Reference< uno::XInterface > > aListeners(mpRefreshListeners->getElements());
     597           0 :         sal_uInt32 nLength(aListeners.getLength());
     598           0 :         if (nLength)
     599             :         {
     600           0 :             const uno::Reference< uno::XInterface >* pInterfaces = aListeners.getConstArray();
     601           0 :             if (pInterfaces)
     602             :             {
     603           0 :                 lang::EventObject aEvent;
     604           0 :                 aEvent.Source.set(uno::Reference< util::XRefreshable >(const_cast<ScHeaderFieldsObj*>(this)));
     605           0 :                 sal_uInt32 i(0);
     606           0 :                 while (i < nLength)
     607             :                 {
     608             :                     try
     609             :                     {
     610           0 :                         while(i < nLength)
     611             :                         {
     612           0 :                             static_cast< util::XRefreshListener* >(pInterfaces->get())->refreshed(aEvent);
     613           0 :                             ++pInterfaces;
     614           0 :                             ++i;
     615             :                         }
     616             :                     }
     617           0 :                     catch(uno::RuntimeException&)
     618             :                     {
     619           0 :                         ++pInterfaces;
     620           0 :                         ++i;
     621             :                     }
     622           0 :                 }
     623             :             }
     624           0 :         }
     625             :     }
     626           0 : }
     627             : 
     628           0 : void SAL_CALL ScHeaderFieldsObj::addRefreshListener( const uno::Reference< util::XRefreshListener >& xListener )
     629             :                                     throw (uno::RuntimeException, std::exception)
     630             : {
     631           0 :     if (xListener.is())
     632             :     {
     633           0 :         SolarMutexGuard aGuard;
     634           0 :         if (!mpRefreshListeners)
     635           0 :             mpRefreshListeners = new cppu::OInterfaceContainerHelper(aMutex);
     636           0 :         mpRefreshListeners->addInterface(xListener);
     637             :     }
     638           0 : }
     639             : 
     640           0 : void SAL_CALL ScHeaderFieldsObj::removeRefreshListener( const uno::Reference<util::XRefreshListener >& xListener )
     641             :                                     throw (uno::RuntimeException, std::exception)
     642             : {
     643           0 :     if (xListener.is())
     644             :     {
     645           0 :         SolarMutexGuard aGuard;
     646           0 :         if (mpRefreshListeners)
     647           0 :             mpRefreshListeners->removeInterface(xListener);
     648             :     }
     649           0 : }
     650             : 
     651           0 : SvxFieldData* ScEditFieldObj::getData()
     652             : {
     653           0 :     if (!mpData)
     654             :     {
     655           0 :         switch (meType)
     656             :         {
     657             :             case text::textfield::Type::DATE:
     658           0 :                 mpData.reset(new SvxDateField);
     659           0 :             break;
     660             :             case text::textfield::Type::EXTENDED_FILE:
     661             :                 mpData.reset(
     662           0 :                     new SvxExtFileField(OUString(), SVXFILETYPE_VAR, SVXFILEFORMAT_NAME_EXT));
     663           0 :             break;
     664             :             case text::textfield::Type::PAGE:
     665           0 :                 mpData.reset(new SvxPageField);
     666           0 :             break;
     667             :             case text::textfield::Type::PAGES:
     668           0 :                 mpData.reset(new SvxPagesField);
     669           0 :             break;
     670             :             case text::textfield::Type::TABLE:
     671           0 :                 mpData.reset(new SvxTableField);
     672           0 :             break;
     673             :             case text::textfield::Type::TIME:
     674           0 :                 mpData.reset(new SvxTimeField);
     675           0 :             break;
     676             :             case text::textfield::Type::EXTENDED_TIME:
     677             :             {
     678           0 :                 if (mbIsDate)
     679           0 :                     mpData.reset(new SvxDateField);
     680             :                 else
     681           0 :                     mpData.reset(new SvxExtTimeField);
     682             :             }
     683           0 :             break;
     684             :             case text::textfield::Type::DOCINFO_TITLE:
     685           0 :                 mpData.reset(new SvxFileField);
     686           0 :             break;
     687             :             case text::textfield::Type::URL:
     688             :                 mpData.reset(
     689           0 :                     new SvxURLField(OUString(), OUString(), SVXURLFORMAT_APPDEFAULT));
     690           0 :             break;
     691             :             default:
     692           0 :                 mpData.reset(new SvxFieldData);
     693             :         }
     694             :     }
     695           0 :     return mpData.get();
     696             : }
     697             : 
     698           0 : void ScEditFieldObj::setPropertyValueURL(const OUString& rName, const com::sun::star::uno::Any& rVal)
     699             : {
     700           0 :     OUString aStrVal;
     701           0 :     if (mpEditSource)
     702             :     {
     703             :         // Edit engine instance already exists for this field item.  Use it.
     704           0 :         ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     705           0 :         ScUnoEditEngine aTempEngine(pEditEngine);
     706             : 
     707             :         //  Typ egal (in Zellen gibts nur URLs)
     708             :         SvxFieldData* pField = aTempEngine.FindByPos(
     709           0 :             aSelection.nStartPara, aSelection.nStartPos, text::textfield::Type::UNSPECIFIED);
     710             :         OSL_ENSURE(pField,"setPropertyValue: Feld nicht gefunden");
     711           0 :         if (!pField)
     712           0 :             return;
     713             : 
     714           0 :         if (pField->GetClassId() != text::textfield::Type::URL)
     715             :             // Make sure this is indeed a URL field.
     716           0 :             return;
     717             : 
     718           0 :         SvxURLField* pURL = static_cast<SvxURLField*>(pField);
     719             : 
     720           0 :         if (rName == SC_UNONAME_URL)
     721             :         {
     722           0 :             if (rVal >>= aStrVal)
     723           0 :                 pURL->SetURL(aStrVal);
     724             :         }
     725           0 :         else if (rName == SC_UNONAME_REPR)
     726             :         {
     727           0 :             if (rVal >>= aStrVal)
     728           0 :                 pURL->SetRepresentation(aStrVal);
     729             :         }
     730           0 :         else if (rName == SC_UNONAME_TARGET)
     731             :         {
     732           0 :             if (rVal >>= aStrVal)
     733           0 :                 pURL->SetTargetFrame(aStrVal);
     734             :         }
     735             :         else
     736           0 :             throw beans::UnknownPropertyException();
     737             : 
     738           0 :         pEditEngine->QuickInsertField( SvxFieldItem(*pField, EE_FEATURE_FIELD), aSelection );
     739           0 :         mpEditSource->UpdateData();
     740           0 :         return;
     741             :     }
     742             : 
     743             :     // Edit engine instance not yet present.  Store the item data for later use.
     744           0 :     SvxFieldData* pData = getData();
     745           0 :     if (!pData)
     746           0 :         throw uno::RuntimeException();
     747             : 
     748           0 :     SvxURLField* p = static_cast<SvxURLField*>(pData);
     749           0 :     if (rName == SC_UNONAME_URL)
     750             :     {
     751           0 :         if (rVal >>= aStrVal)
     752           0 :             p->SetURL(aStrVal);
     753             :     }
     754           0 :     else if (rName == SC_UNONAME_REPR)
     755             :     {
     756           0 :         if (rVal >>= aStrVal)
     757           0 :             p->SetRepresentation(aStrVal);
     758             :     }
     759           0 :     else if (rName == SC_UNONAME_TARGET)
     760             :     {
     761           0 :         if (rVal >>= aStrVal)
     762           0 :             p->SetTargetFrame(aStrVal);
     763             :     }
     764             :     else
     765           0 :         throw beans::UnknownPropertyException();
     766             : }
     767             : 
     768           0 : uno::Any ScEditFieldObj::getPropertyValueURL(const OUString& rName)
     769             : {
     770           0 :     uno::Any aRet;
     771             : 
     772             :     // anchor type is always "as character", text wrap always "none"
     773             : 
     774           0 :     if (mpEditSource)
     775             :     {
     776             :         //! Feld-Funktionen muessen an den Forwarder !!!
     777           0 :         ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     778           0 :         ScUnoEditEngine aTempEngine(pEditEngine);
     779             : 
     780             :         //  Typ egal (in Zellen gibts nur URLs)
     781             :         const SvxFieldData* pField = aTempEngine.FindByPos(
     782           0 :             aSelection.nStartPara, aSelection.nStartPos, text::textfield::Type::UNSPECIFIED);
     783             :         OSL_ENSURE(pField,"getPropertyValue: Feld nicht gefunden");
     784           0 :         if (!pField)
     785           0 :             throw uno::RuntimeException();
     786             : 
     787           0 :         if (pField->GetClassId() != text::textfield::Type::URL)
     788           0 :             throw uno::RuntimeException();
     789             : 
     790           0 :         const SvxURLField* pURL = static_cast<const SvxURLField*>(pField);
     791             : 
     792           0 :         if (rName == SC_UNONAME_URL)
     793           0 :             aRet <<= pURL->GetURL();
     794           0 :         else if (rName == SC_UNONAME_REPR)
     795           0 :             aRet <<= pURL->GetRepresentation();
     796           0 :         else if (rName == SC_UNONAME_TARGET)
     797           0 :             aRet <<= pURL->GetTargetFrame();
     798             :         else
     799           0 :             throw beans::UnknownPropertyException();
     800             :     }
     801             :     else        // noch nicht eingefuegt
     802             :     {
     803           0 :         const SvxFieldData* pField = getData();
     804           0 :         if (!pField)
     805           0 :             return aRet;
     806             : 
     807           0 :         const SvxURLField* pURL = static_cast<const SvxURLField*>(pField);
     808           0 :         if (rName == SC_UNONAME_URL)
     809           0 :             aRet <<= pURL->GetURL();
     810           0 :         else if (rName == SC_UNONAME_REPR)
     811           0 :             aRet <<= pURL->GetRepresentation();
     812           0 :         else if (rName == SC_UNONAME_TARGET)
     813           0 :             aRet <<= pURL->GetTargetFrame();
     814             :         else
     815           0 :             throw beans::UnknownPropertyException();
     816             :     }
     817           0 :     return aRet;
     818             : }
     819             : 
     820           0 : void ScEditFieldObj::setPropertyValueFile(const OUString& rName, const uno::Any& rVal)
     821             : {
     822           0 :     if (rName == SC_UNONAME_FILEFORM)
     823             :     {
     824           0 :         sal_Int16 nIntVal = 0;
     825           0 :         if (rVal >>= nIntVal)
     826             :         {
     827           0 :             SvxFileFormat eFormat = lcl_UnoToSvxFileFormat(nIntVal);
     828           0 :             if (mpEditSource)
     829             :             {
     830           0 :                 ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     831           0 :                 ScUnoEditEngine aTempEngine(pEditEngine);
     832             :                 SvxFieldData* pField = aTempEngine.FindByPos(
     833           0 :                         aSelection.nStartPara, aSelection.nStartPos, text::textfield::Type::EXTENDED_FILE);
     834             :                 OSL_ENSURE(pField, "setPropertyValueFile: Field not found");
     835           0 :                 if (pField)
     836             :                 {
     837           0 :                     SvxExtFileField* pExtFile = static_cast<SvxExtFileField*>(pField);   // local to the ScUnoEditEngine
     838           0 :                     pExtFile->SetFormat(eFormat);
     839           0 :                     pEditEngine->QuickInsertField(SvxFieldItem(*pField, EE_FEATURE_FIELD), aSelection);
     840           0 :                     mpEditSource->UpdateData();
     841           0 :                 }
     842             :             }
     843             :             else
     844             :             {
     845           0 :                 SvxFieldData* pField = getData();
     846           0 :                 SvxExtFileField* pExtFile = static_cast<SvxExtFileField*>(pField);
     847           0 :                 pExtFile->SetFormat(eFormat);
     848             :             }
     849             :         }
     850             :     }
     851             :     else
     852           0 :         throw beans::UnknownPropertyException();
     853           0 : }
     854             : 
     855           0 : uno::Any ScEditFieldObj::getPropertyValueFile(const OUString& rName)
     856             : {
     857           0 :     uno::Any aRet;
     858           0 :     if (rName == SC_UNONAME_FILEFORM)
     859             :     {
     860           0 :         SvxFileFormat eFormat = SVXFILEFORMAT_NAME_EXT;
     861           0 :         const SvxFieldData* pField = NULL;
     862           0 :         if (mpEditSource)
     863             :         {
     864           0 :             ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     865           0 :             ScUnoEditEngine aTempEngine(pEditEngine);
     866             :             pField = aTempEngine.FindByPos(
     867           0 :                 aSelection.nStartPara, aSelection.nStartPos, text::textfield::Type::EXTENDED_FILE);
     868             :         }
     869             :         else
     870           0 :             pField = getData();
     871             : 
     872             :         OSL_ENSURE(pField, "setPropertyValueFile: Field not found");
     873           0 :         if (!pField)
     874           0 :             throw uno::RuntimeException();
     875             : 
     876           0 :         const SvxExtFileField* pExtFile = static_cast<const SvxExtFileField*>(pField);
     877           0 :         eFormat = pExtFile->GetFormat();
     878           0 :         sal_Int16 nIntVal = lcl_SvxToUnoFileFormat(eFormat);
     879           0 :         aRet <<= nIntVal;
     880             :     }
     881             :     else
     882           0 :         throw beans::UnknownPropertyException();
     883             : 
     884           0 :     return aRet;
     885             : }
     886             : 
     887           0 : void ScEditFieldObj::setPropertyValueDateTime(const OUString& rName, const uno::Any& rVal)
     888             : {
     889           0 :     if (mpEditSource)
     890             :     {
     891             :         // Field already inserted.
     892           0 :         ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     893           0 :         ScUnoEditEngine aTempEngine(pEditEngine);
     894           0 :         SvxFieldData* pField = aTempEngine.FindByPos(aSelection.nStartPara, aSelection.nStartPos, meType);
     895           0 :         if (!pField)
     896           0 :             return;
     897             : 
     898           0 :         switch (meType)
     899             :         {
     900             :             case text::textfield::Type::DATE:
     901             :             {
     902           0 :                 SvxDateField* p = static_cast<SvxDateField*>(pField);
     903           0 :                 if (rName == SC_UNONAME_ISDATE)
     904             :                 {
     905             :                     // Do nothing for now.
     906             :                 }
     907           0 :                 else if (rName == SC_UNONAME_ISFIXED)
     908             :                 {
     909           0 :                     SvxDateType eType = rVal.get<sal_Bool>() ? SVXDATETYPE_FIX : SVXDATETYPE_VAR;
     910           0 :                     p->SetType(eType);
     911             :                 }
     912           0 :                 else if (rName == SC_UNONAME_DATETIME)
     913             :                 {
     914           0 :                     maDateTime = rVal.get<util::DateTime>();
     915           0 :                     Date aDate(maDateTime.Day, maDateTime.Month, maDateTime.Year);
     916           0 :                     p->SetFixDate(aDate);
     917             :                 }
     918           0 :                 else if (rName == SC_UNONAME_NUMFMT)
     919             :                 {
     920           0 :                     mnNumFormat = rVal.get<sal_Int32>();
     921           0 :                     p->SetFormat(static_cast<SvxDateFormat>(mnNumFormat));
     922             :                 }
     923             :                 else
     924           0 :                     throw beans::UnknownPropertyException();
     925             :             }
     926           0 :             break;
     927             :             case text::textfield::Type::TIME:
     928             :             {
     929             :                 // SvxTimeField doesn't have any attributes.
     930           0 :                 if (rName != SC_UNONAME_ISDATE && rName != SC_UNONAME_ISFIXED &&
     931           0 :                     rName != SC_UNONAME_DATETIME && rName != SC_UNONAME_NUMFMT)
     932           0 :                     throw beans::UnknownPropertyException();
     933             :             }
     934           0 :             break;
     935             :             case text::textfield::Type::EXTENDED_TIME:
     936             :             {
     937           0 :                 SvxExtTimeField* p = static_cast<SvxExtTimeField*>(pField);
     938           0 :                 if (rName == SC_UNONAME_ISDATE)
     939             :                 {
     940             :                     // Do nothing for now.
     941             :                 }
     942           0 :                 else if (rName == SC_UNONAME_ISFIXED)
     943             :                 {
     944           0 :                     SvxTimeType eType = rVal.get<sal_Bool>() ? SVXTIMETYPE_FIX : SVXTIMETYPE_VAR;
     945           0 :                     p->SetType(eType);
     946             :                 }
     947           0 :                 else if (rName == SC_UNONAME_DATETIME)
     948             :                 {
     949           0 :                     maDateTime = rVal.get<util::DateTime>();
     950           0 :                     Time aTime(maDateTime.Hours, maDateTime.Minutes, maDateTime.Seconds, maDateTime.NanoSeconds);
     951           0 :                     p->SetFixTime(aTime);
     952             :                 }
     953           0 :                 else if (rName == SC_UNONAME_NUMFMT)
     954             :                 {
     955           0 :                     mnNumFormat = rVal.get<sal_Int32>();
     956           0 :                     p->SetFormat(static_cast<SvxTimeFormat>(mnNumFormat));
     957             :                 }
     958             :                 else
     959           0 :                     throw beans::UnknownPropertyException();
     960             :             }
     961           0 :             break;
     962             :             default:
     963           0 :                 throw beans::UnknownPropertyException();
     964           0 :         }
     965             :     }
     966             :     else
     967             :     {
     968           0 :         if (rName == SC_UNONAME_ISDATE)
     969           0 :             mbIsDate = rVal.get<sal_Bool>();
     970           0 :         else if (rName == SC_UNONAME_ISFIXED)
     971           0 :             mbIsFixed = rVal.get<sal_Bool>();
     972           0 :         else if (rName == SC_UNONAME_DATETIME)
     973           0 :             maDateTime = rVal.get<util::DateTime>();
     974           0 :         else if (rName == SC_UNONAME_NUMFMT)
     975           0 :             mnNumFormat = rVal.get<sal_Int32>();
     976             :         else
     977           0 :             throw beans::UnknownPropertyException();
     978             :     }
     979             : }
     980             : 
     981           0 : uno::Any ScEditFieldObj::getPropertyValueDateTime(const OUString& rName)
     982             : {
     983           0 :     if (mpEditSource)
     984             :     {
     985             :         // Field already inserted.
     986           0 :         ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
     987           0 :         ScUnoEditEngine aTempEngine(pEditEngine);
     988           0 :         SvxFieldData* pField = aTempEngine.FindByPos(aSelection.nStartPara, aSelection.nStartPos, meType);
     989           0 :         if (!pField)
     990           0 :             throw uno::RuntimeException();
     991             : 
     992           0 :         switch (meType)
     993             :         {
     994             :             case text::textfield::Type::DATE:
     995             :             {
     996           0 :                 SvxDateField* p = static_cast<SvxDateField*>(pField);
     997           0 :                 if (rName == SC_UNONAME_ISDATE)
     998           0 :                     return uno::makeAny(sal_True);
     999             : 
    1000           0 :                 if (rName == SC_UNONAME_ISFIXED)
    1001           0 :                     return uno::makeAny<sal_Bool>(p->GetType() == SVXDATETYPE_FIX);
    1002             : 
    1003           0 :                 if (rName == SC_UNONAME_DATETIME)
    1004             :                 {
    1005           0 :                     Date aD(p->GetFixDate());
    1006           0 :                     maDateTime.Year = aD.GetYear();
    1007           0 :                     maDateTime.Month = aD.GetMonth();
    1008           0 :                     maDateTime.Day = aD.GetDay();
    1009           0 :                     maDateTime.Hours = 0;
    1010           0 :                     maDateTime.Minutes = 0;
    1011           0 :                     maDateTime.Seconds = 0;
    1012           0 :                     maDateTime.NanoSeconds = 0;
    1013           0 :                     return uno::makeAny(maDateTime);
    1014             :                 }
    1015             : 
    1016           0 :                 if (rName == SC_UNONAME_NUMFMT)
    1017           0 :                     return uno::makeAny<sal_Int32>(p->GetFormat());
    1018             :             }
    1019           0 :             break;
    1020             :             case text::textfield::Type::TIME:
    1021             :             {
    1022             :                 // SvxTimeField doesn't have any attributes.
    1023           0 :                 if (rName == SC_UNONAME_ISDATE)
    1024           0 :                     return uno::makeAny(sal_False);
    1025             : 
    1026           0 :                 if (rName == SC_UNONAME_ISFIXED)
    1027           0 :                     return uno::makeAny(sal_False);
    1028             : 
    1029           0 :                 if (rName == SC_UNONAME_DATETIME)
    1030             :                     // This is the best we can do.
    1031           0 :                     return uno::makeAny(maDateTime);
    1032             : 
    1033           0 :                 if (rName == SC_UNONAME_NUMFMT)
    1034             :                     // Same as above.
    1035           0 :                     return uno::makeAny<sal_Int32>(0);
    1036             :             }
    1037           0 :             break;
    1038             :             case text::textfield::Type::EXTENDED_TIME:
    1039             :             {
    1040           0 :                 SvxExtTimeField* p = static_cast<SvxExtTimeField*>(pField);
    1041           0 :                 if (rName == SC_UNONAME_ISDATE)
    1042           0 :                     return uno::makeAny(sal_False);
    1043             : 
    1044           0 :                 if (rName == SC_UNONAME_ISFIXED)
    1045           0 :                     return uno::makeAny<sal_Bool>(p->GetType() == SVXTIMETYPE_FIX);
    1046             : 
    1047           0 :                 if (rName == SC_UNONAME_DATETIME)
    1048             :                 {
    1049           0 :                     Time aT(p->GetFixTime());
    1050           0 :                     maDateTime.Year = 0;
    1051           0 :                     maDateTime.Month = 0;
    1052           0 :                     maDateTime.Day = 0;
    1053           0 :                     maDateTime.Hours = aT.GetHour();
    1054           0 :                     maDateTime.Minutes = aT.GetMin();
    1055           0 :                     maDateTime.Seconds = aT.GetSec();
    1056           0 :                     maDateTime.NanoSeconds = aT.GetNanoSec();
    1057           0 :                     return uno::makeAny(maDateTime);
    1058             :                 }
    1059             : 
    1060           0 :                 if (rName == SC_UNONAME_NUMFMT)
    1061           0 :                     return uno::makeAny<sal_Int32>(p->GetFormat());
    1062             :             }
    1063           0 :             break;
    1064             :             default:
    1065             :                 ;
    1066           0 :         }
    1067             :     }
    1068             :     else
    1069             :     {
    1070           0 :         if (rName == SC_UNONAME_ISDATE)
    1071           0 :             return uno::makeAny<sal_Bool>(mbIsDate);
    1072             : 
    1073           0 :         if (rName == SC_UNONAME_ISFIXED)
    1074           0 :             return uno::makeAny<sal_Bool>(mbIsFixed);
    1075             : 
    1076           0 :         if (rName == SC_UNONAME_DATETIME)
    1077           0 :             return uno::makeAny(maDateTime);
    1078             : 
    1079           0 :         if (rName == SC_UNONAME_NUMFMT)
    1080           0 :             return uno::makeAny(mnNumFormat);
    1081             :     }
    1082             : 
    1083           0 :     throw beans::UnknownPropertyException();
    1084             : }
    1085             : 
    1086           0 : void ScEditFieldObj::setPropertyValueSheet(const OUString& rName, const uno::Any& rVal)
    1087             : {
    1088           0 :     if (mpEditSource)
    1089             :     {
    1090             :         // Edit engine instance already exists for this field item.  Use it.
    1091           0 :         ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
    1092           0 :         ScUnoEditEngine aTempEngine(pEditEngine);
    1093             : 
    1094             :         //  Typ egal (in Zellen gibts nur URLs)
    1095             :         SvxFieldData* pField = aTempEngine.FindByPos(
    1096           0 :             aSelection.nStartPara, aSelection.nStartPos, text::textfield::Type::UNSPECIFIED);
    1097             :         OSL_ENSURE(pField,"setPropertyValue: Feld nicht gefunden");
    1098           0 :         if (!pField)
    1099           0 :             return;
    1100             : 
    1101           0 :         if (pField->GetClassId() != text::textfield::Type::TABLE)
    1102             :             // Make sure this is indeed a URL field.
    1103           0 :             return;
    1104             : 
    1105           0 :         SvxTableField* p = static_cast<SvxTableField*>(pField);
    1106             : 
    1107           0 :         if (rName == SC_UNONAME_TABLEPOS)
    1108             :         {
    1109           0 :             sal_Int32 nTab = rVal.get<sal_Int32>();
    1110           0 :             p->SetTab(nTab);
    1111             :         }
    1112             :         else
    1113           0 :             throw beans::UnknownPropertyException();
    1114             : 
    1115           0 :         pEditEngine->QuickInsertField(SvxFieldItem(*pField, EE_FEATURE_FIELD), aSelection);
    1116           0 :         mpEditSource->UpdateData();
    1117           0 :         return;
    1118             :     }
    1119             : 
    1120             :     // Edit engine instance not yet present.  Store the item data for later use.
    1121           0 :     SvxFieldData* pData = getData();
    1122           0 :     if (!pData)
    1123           0 :         throw uno::RuntimeException();
    1124             : 
    1125           0 :     SvxTableField* p = static_cast<SvxTableField*>(pData);
    1126           0 :     if (rName == SC_UNONAME_TABLEPOS)
    1127             :     {
    1128           0 :         sal_Int32 nTab = rVal.get<sal_Int32>();
    1129           0 :         p->SetTab(nTab);
    1130             :     }
    1131             :     else
    1132           0 :         throw beans::UnknownPropertyException();
    1133             : 
    1134             : }
    1135             : 
    1136           0 : ScEditFieldObj::ScEditFieldObj(
    1137             :     const uno::Reference<text::XTextRange>& rContent,
    1138             :     ScEditSource* pEditSrc, sal_Int32 eType, const ESelection& rSel) :
    1139           0 :     OComponentHelper(getMutex()),
    1140             :     pPropSet(NULL),
    1141             :     mpEditSource(pEditSrc),
    1142             :     aSelection(rSel),
    1143           0 :     meType(eType), mpData(NULL), mpContent(rContent), mnNumFormat(0), mbIsDate(false), mbIsFixed(false)
    1144             : {
    1145           0 :     switch (meType)
    1146             :     {
    1147             :         case text::textfield::Type::DOCINFO_TITLE:
    1148           0 :             pPropSet = getEmptyPropertySet();
    1149           0 :         break;
    1150             :         case text::textfield::Type::EXTENDED_FILE:
    1151           0 :             pPropSet = lcl_GetFileFieldPropertySet();
    1152           0 :         break;
    1153             :         case text::textfield::Type::URL:
    1154           0 :             pPropSet = lcl_GetURLPropertySet();
    1155           0 :         break;
    1156             :         case text::textfield::Type::DATE:
    1157             :         case text::textfield::Type::TIME:
    1158             :         case text::textfield::Type::EXTENDED_TIME:
    1159           0 :             pPropSet = getDateTimePropertySet();
    1160           0 :         break;
    1161             :         default:
    1162           0 :             pPropSet = lcl_GetHeaderFieldPropertySet();
    1163             :     }
    1164             : 
    1165           0 :     if (meType == text::textfield::Type::DATE)
    1166           0 :         mbIsDate = true;
    1167           0 : }
    1168             : 
    1169           0 : void ScEditFieldObj::InitDoc(
    1170             :     const uno::Reference<text::XTextRange>& rContent, ScEditSource* pEditSrc, const ESelection& rSel)
    1171             : {
    1172           0 :     if (!mpEditSource)
    1173             :     {
    1174           0 :         mpContent = rContent;
    1175           0 :         mpData.reset();
    1176             : 
    1177           0 :         aSelection = rSel;
    1178           0 :         mpEditSource = pEditSrc;
    1179             :     }
    1180           0 : }
    1181             : 
    1182           0 : ScEditFieldObj::~ScEditFieldObj()
    1183             : {
    1184           0 :     delete mpEditSource;
    1185           0 : }
    1186             : 
    1187           0 : SvxFieldItem ScEditFieldObj::CreateFieldItem()
    1188             : {
    1189             :     OSL_ENSURE( !mpEditSource, "CreateFieldItem mit eingefuegtem Feld" );
    1190           0 :     return SvxFieldItem(*getData(), EE_FEATURE_FIELD);
    1191             : }
    1192             : 
    1193           0 : sal_Int32 ScEditFieldObj::GetFieldType() const
    1194             : {
    1195           0 :     return meType;
    1196             : }
    1197             : 
    1198           0 : void ScEditFieldObj::DeleteField()
    1199             : {
    1200           0 :     if (mpEditSource)
    1201             :     {
    1202           0 :         SvxTextForwarder* pForwarder = mpEditSource->GetTextForwarder();
    1203           0 :         pForwarder->QuickInsertText( OUString(), aSelection );
    1204           0 :         mpEditSource->UpdateData();
    1205             : 
    1206           0 :         aSelection.nEndPara = aSelection.nStartPara;
    1207           0 :         aSelection.nEndPos  = aSelection.nStartPos;
    1208             : 
    1209             :         //! Broadcast, um Selektion in anderen Objekten anzupassen
    1210             :         //! (auch bei anderen Aktionen)
    1211             :     }
    1212           0 : }
    1213             : 
    1214           0 : bool ScEditFieldObj::IsInserted() const
    1215             : {
    1216           0 :     return mpEditSource != NULL;
    1217             : }
    1218             : 
    1219             : // XTextField
    1220             : 
    1221           0 : OUString SAL_CALL ScEditFieldObj::getPresentation( sal_Bool bShowCommand )
    1222             :                                                     throw(uno::RuntimeException, std::exception)
    1223             : {
    1224           0 :     SolarMutexGuard aGuard;
    1225             : 
    1226           0 :     if (!mpEditSource)
    1227           0 :         return OUString();
    1228             : 
    1229             :     //! Feld-Funktionen muessen an den Forwarder !!!
    1230           0 :     ScEditEngineDefaulter* pEditEngine = mpEditSource->GetEditEngine();
    1231           0 :     ScUnoEditEngine aTempEngine(pEditEngine);
    1232             : 
    1233             :     //  Typ egal (in Zellen gibts nur URLs)
    1234             :     const SvxFieldData* pField = aTempEngine.FindByPos(
    1235           0 :         aSelection.nStartPara, aSelection.nStartPos, text::textfield::Type::UNSPECIFIED);
    1236             :     OSL_ENSURE(pField,"getPresentation: Feld nicht gefunden");
    1237           0 :     if (!pField)
    1238           0 :         return OUString();
    1239             : 
    1240           0 :     switch (meType)
    1241             :     {
    1242             :         case text::textfield::Type::URL:
    1243             :         {
    1244           0 :             if (pField->GetClassId() != text::textfield::Type::URL)
    1245             :                 // Not an URL field, but URL is expected.
    1246           0 :                 throw uno::RuntimeException();
    1247             : 
    1248           0 :             const SvxURLField* pURL = static_cast<const SvxURLField*>(pField);
    1249           0 :             return bShowCommand ? pURL->GetURL() : pURL->GetRepresentation();
    1250             :         }
    1251             :         break;
    1252             :         default:
    1253             :             ;
    1254             :     }
    1255           0 :     return OUString();
    1256             : }
    1257             : 
    1258             : // XTextContent
    1259             : 
    1260           0 : void SAL_CALL ScEditFieldObj::attach( const uno::Reference<text::XTextRange>& xTextRange )
    1261             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    1262             : {
    1263           0 :     SolarMutexGuard aGuard;
    1264           0 :     if (xTextRange.is())
    1265             :     {
    1266           0 :         uno::Reference<text::XText> xText(xTextRange->getText());
    1267           0 :         if (xText.is())
    1268             :         {
    1269           0 :             xText->insertTextContent( xTextRange, this, sal_True );
    1270           0 :         }
    1271           0 :     }
    1272           0 : }
    1273             : 
    1274           0 : uno::Reference<text::XTextRange> SAL_CALL ScEditFieldObj::getAnchor() throw(uno::RuntimeException, std::exception)
    1275             : {
    1276           0 :     SolarMutexGuard aGuard;
    1277           0 :     return mpContent;
    1278             : }
    1279             : 
    1280             : // XComponent
    1281             : 
    1282           0 : void SAL_CALL ScEditFieldObj::dispose() throw(uno::RuntimeException, std::exception)
    1283             : {
    1284           0 :     OComponentHelper::dispose();
    1285           0 : }
    1286             : 
    1287           0 : void SAL_CALL ScEditFieldObj::addEventListener(
    1288             :                         const uno::Reference<lang::XEventListener>& xListener )
    1289             :                                                     throw(uno::RuntimeException, std::exception)
    1290             : {
    1291           0 :     OComponentHelper::addEventListener( xListener );
    1292           0 : }
    1293             : 
    1294           0 : void SAL_CALL ScEditFieldObj::removeEventListener(
    1295             :                         const uno::Reference<lang::XEventListener>& xListener )
    1296             :                                                     throw(uno::RuntimeException, std::exception)
    1297             : {
    1298           0 :     OComponentHelper::removeEventListener( xListener );
    1299           0 : }
    1300             : 
    1301             : // XPropertySet
    1302             : 
    1303           0 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScEditFieldObj::getPropertySetInfo()
    1304             :                                                         throw(uno::RuntimeException, std::exception)
    1305             : {
    1306           0 :     SolarMutexGuard aGuard;
    1307           0 :     uno::Reference<beans::XPropertySetInfo> aRef = pPropSet->getPropertySetInfo();
    1308           0 :     return aRef;
    1309             : }
    1310             : 
    1311           0 : void SAL_CALL ScEditFieldObj::setPropertyValue(
    1312             :                         const OUString& aPropertyName, const uno::Any& aValue )
    1313             :                 throw (beans::UnknownPropertyException, beans::PropertyVetoException,
    1314             :                        lang::IllegalArgumentException, lang::WrappedTargetException,
    1315             :                        uno::RuntimeException, std::exception)
    1316             : {
    1317           0 :     SolarMutexGuard aGuard;
    1318           0 :     if (aPropertyName == SC_UNONAME_ANCHOR)
    1319             :     {
    1320           0 :         aValue >>= mpContent;
    1321           0 :         return;
    1322             :     }
    1323             : 
    1324           0 :     switch (meType)
    1325             :     {
    1326             :         case text::textfield::Type::URL:
    1327           0 :             setPropertyValueURL(aPropertyName, aValue);
    1328           0 :         break;
    1329             :         case text::textfield::Type::EXTENDED_FILE:
    1330           0 :             setPropertyValueFile(aPropertyName, aValue);
    1331           0 :         break;
    1332             :         case text::textfield::Type::DATE:
    1333             :         case text::textfield::Type::TIME:
    1334             :         case text::textfield::Type::EXTENDED_TIME:
    1335           0 :             setPropertyValueDateTime(aPropertyName, aValue);
    1336           0 :         break;
    1337             :         case text::textfield::Type::TABLE:
    1338           0 :             setPropertyValueSheet(aPropertyName, aValue);
    1339           0 :         break;
    1340             :         case text::textfield::Type::DOCINFO_TITLE:
    1341             :         default:
    1342           0 :             throw beans::UnknownPropertyException();
    1343           0 :     }
    1344             : }
    1345             : 
    1346           0 : uno::Any SAL_CALL ScEditFieldObj::getPropertyValue( const OUString& aPropertyName )
    1347             :                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    1348             :                         uno::RuntimeException, std::exception)
    1349             : {
    1350           0 :     SolarMutexGuard aGuard;
    1351           0 :     if (aPropertyName.equals(SC_UNONAME_TEXTFIELD_TYPE))
    1352           0 :         return uno::makeAny(meType);
    1353             : 
    1354           0 :     if (aPropertyName == SC_UNONAME_ANCHOR)
    1355           0 :         return uno::makeAny(mpContent);
    1356             : 
    1357           0 :     if (aPropertyName == SC_UNONAME_ANCTYPE)
    1358             :     {
    1359           0 :         uno::Any aRet;
    1360           0 :         aRet <<= text::TextContentAnchorType_AS_CHARACTER;
    1361           0 :         return aRet;
    1362             :     }
    1363           0 :     if (aPropertyName == SC_UNONAME_ANCTYPES)
    1364             :     {
    1365           0 :         uno::Any aRet;
    1366           0 :         uno::Sequence<text::TextContentAnchorType> aSeq(1);
    1367           0 :         aSeq[0] = text::TextContentAnchorType_AS_CHARACTER;
    1368           0 :         aRet <<= aSeq;
    1369           0 :         return aRet;
    1370             :     }
    1371           0 :     if (aPropertyName == SC_UNONAME_TEXTWRAP)
    1372             :     {
    1373           0 :         uno::Any aRet;
    1374           0 :         aRet <<= text::WrapTextMode_NONE;
    1375           0 :         return aRet;
    1376             :     }
    1377             : 
    1378           0 :     switch (meType)
    1379             :     {
    1380             :         case text::textfield::Type::URL:
    1381           0 :             return getPropertyValueURL(aPropertyName);
    1382             :         case text::textfield::Type::EXTENDED_FILE:
    1383           0 :             return getPropertyValueFile(aPropertyName);
    1384             :         case text::textfield::Type::DATE:
    1385             :         case text::textfield::Type::TIME:
    1386             :         case text::textfield::Type::EXTENDED_TIME:
    1387           0 :             return getPropertyValueDateTime(aPropertyName);
    1388             :         case text::textfield::Type::DOCINFO_TITLE:
    1389             :         default:
    1390           0 :             throw beans::UnknownPropertyException();
    1391           0 :     }
    1392             : }
    1393             : 
    1394           0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScEditFieldObj )
    1395             : 
    1396             : // XUnoTunnel
    1397             : 
    1398           0 : sal_Int64 SAL_CALL ScEditFieldObj::getSomething(
    1399             :                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException, std::exception)
    1400             : {
    1401           0 :     if ( rId.getLength() == 16 &&
    1402           0 :           0 == memcmp( getUnoTunnelId().getConstArray(),
    1403           0 :                                     rId.getConstArray(), 16 ) )
    1404             :     {
    1405           0 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
    1406             :     }
    1407           0 :     return 0;
    1408             : }
    1409             : 
    1410             : namespace
    1411             : {
    1412             :     class theScEditFieldObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScEditFieldObjUnoTunnelId> {};
    1413             : }
    1414             : 
    1415           0 : const uno::Sequence<sal_Int8>& ScEditFieldObj::getUnoTunnelId()
    1416             : {
    1417           0 :     return theScEditFieldObjUnoTunnelId::get().getSeq();
    1418             : }
    1419             : 
    1420           0 : ScEditFieldObj* ScEditFieldObj::getImplementation(const uno::Reference<text::XTextContent>& xObj)
    1421             : {
    1422           0 :     ScEditFieldObj* pRet = NULL;
    1423           0 :     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
    1424           0 :     if (xUT.is())
    1425           0 :         pRet = reinterpret_cast<ScEditFieldObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
    1426           0 :     return pRet;
    1427             : }
    1428             : 
    1429             : // XServiceInfo
    1430             : 
    1431           0 : OUString SAL_CALL ScEditFieldObj::getImplementationName() throw(uno::RuntimeException, std::exception)
    1432             : {
    1433           0 :     return OUString("ScEditFieldObj");
    1434             : }
    1435             : 
    1436           0 : sal_Bool SAL_CALL ScEditFieldObj::supportsService( const OUString& rServiceName )
    1437             :                                                     throw(uno::RuntimeException, std::exception)
    1438             : {
    1439           0 :     return cppu::supportsService(this, rServiceName);
    1440             : }
    1441             : 
    1442           0 : uno::Sequence<OUString> SAL_CALL ScEditFieldObj::getSupportedServiceNames()
    1443             :                                                     throw(uno::RuntimeException, std::exception)
    1444             : {
    1445           0 :     uno::Sequence<OUString> aRet(2);
    1446           0 :     OUString* pArray = aRet.getArray();
    1447           0 :     pArray[0] = "com.sun.star.text.TextField";
    1448           0 :     pArray[1] = "com.sun.star.text.TextContent";
    1449           0 :     return aRet;
    1450             : }
    1451             : 
    1452           0 : uno::Sequence<uno::Type> SAL_CALL ScEditFieldObj::getTypes() throw(uno::RuntimeException, std::exception)
    1453             : {
    1454           0 :     static uno::Sequence<uno::Type> aTypes;
    1455           0 :     if ( aTypes.getLength() == 0 )
    1456             :     {
    1457           0 :         uno::Sequence<uno::Type> aParentTypes(OComponentHelper::getTypes());
    1458           0 :         long nParentLen = aParentTypes.getLength();
    1459           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    1460             : 
    1461           0 :         aTypes.realloc( nParentLen + 4 );
    1462           0 :         uno::Type* pPtr = aTypes.getArray();
    1463           0 :         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<text::XTextField>*)0);
    1464           0 :         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<beans::XPropertySet>*)0);
    1465           0 :         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
    1466           0 :         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0);
    1467             : 
    1468           0 :         for (long i=0; i<nParentLen; i++)
    1469           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    1470             :     }
    1471           0 :     return aTypes;
    1472             : }
    1473             : 
    1474           0 : uno::Sequence<sal_Int8> SAL_CALL ScEditFieldObj::getImplementationId()
    1475             :                                                     throw(uno::RuntimeException, std::exception)
    1476             : {
    1477           0 :     return css::uno::Sequence<sal_Int8>();
    1478             : }
    1479             : 
    1480             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10