LCOV - code coverage report
Current view: top level - sw/source/core/fields - docufld.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 452 1189 38.0 %
Date: 2015-06-13 12:38:46 Functions: 78 163 47.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 <config_features.h>
      21             : 
      22             : #include <textapi.hxx>
      23             : 
      24             : #include <hintids.hxx>
      25             : #include <com/sun/star/text/XText.hpp>
      26             : #include <com/sun/star/script/Converter.hpp>
      27             : #include <com/sun/star/text/SetVariableType.hpp>
      28             : #include <com/sun/star/text/XTextFieldsSupplier.hpp>
      29             : #include <com/sun/star/text/UserDataPart.hpp>
      30             : #include <com/sun/star/text/ChapterFormat.hpp>
      31             : #include <com/sun/star/text/XTextField.hpp>
      32             : #include <com/sun/star/text/PlaceholderType.hpp>
      33             : #include <com/sun/star/text/TemplateDisplayFormat.hpp>
      34             : #include <com/sun/star/text/UserFieldFormat.hpp>
      35             : #include <com/sun/star/text/PageNumberType.hpp>
      36             : #include <com/sun/star/text/ReferenceFieldPart.hpp>
      37             : #include <com/sun/star/text/FilenameDisplayFormat.hpp>
      38             : #include <com/sun/star/text/XDependentTextField.hpp>
      39             : #include <com/sun/star/text/DocumentStatistic.hpp>
      40             : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
      41             : #include <com/sun/star/document/XDocumentProperties.hpp>
      42             : #include <com/sun/star/util/Date.hpp>
      43             : #include <com/sun/star/util/Duration.hpp>
      44             : #include <unotools/localedatawrapper.hxx>
      45             : #include <editeng/unolingu.hxx>
      46             : #include <comphelper/processfactory.hxx>
      47             : #include <comphelper/types.hxx>
      48             : #include <comphelper/string.hxx>
      49             : #include <tools/urlobj.hxx>
      50             : #include <vcl/svapp.hxx>
      51             : #include <svl/urihelper.hxx>
      52             : #include <unotools/useroptions.hxx>
      53             : #include <unotools/syslocale.hxx>
      54             : #include <svl/zforlist.hxx>
      55             : 
      56             : #include <tools/time.hxx>
      57             : #include <tools/datetime.hxx>
      58             : 
      59             : #include <com/sun/star/beans/PropertyAttribute.hpp>
      60             : #include <com/sun/star/util/DateTime.hpp>
      61             : #include <com/sun/star/util/Time.hpp>
      62             : 
      63             : #include <swmodule.hxx>
      64             : #include <sfx2/app.hxx>
      65             : #include <sfx2/docfile.hxx>
      66             : #include <sfx2/doctempl.hxx>
      67             : #include <fmtfld.hxx>
      68             : #include <txtfld.hxx>
      69             : #include <charfmt.hxx>
      70             : #include <docstat.hxx>
      71             : #include <pagedesc.hxx>
      72             : #include <fmtpdsc.hxx>
      73             : #include <doc.hxx>
      74             : #include <IDocumentFieldsAccess.hxx>
      75             : #include <IDocumentStatistics.hxx>
      76             : #include <IDocumentStylePoolAccess.hxx>
      77             : #include <IDocumentLayoutAccess.hxx>
      78             : #include <rootfrm.hxx>
      79             : #include <pagefrm.hxx>
      80             : #include <cntfrm.hxx>
      81             : #include <pam.hxx>
      82             : #include <viewsh.hxx>
      83             : #include <dbmgr.hxx>
      84             : #include <shellres.hxx>
      85             : #include <docufld.hxx>
      86             : #include <flddat.hxx>
      87             : #include <docfld.hxx>
      88             : #include <ndtxt.hxx>
      89             : #include <expfld.hxx>
      90             : #include <poolfmt.hxx>
      91             : #include <docsh.hxx>
      92             : #include <unofldmid.h>
      93             : #include <swunohelper.hxx>
      94             : #include <comcore.hrc>
      95             : 
      96             : #include <editeng/outliner.hxx>
      97             : #include <editeng/outlobj.hxx>
      98             : #include <calbck.hxx>
      99             : #include <docary.hxx>
     100             : 
     101             : #define URL_DECODE  INetURLObject::DECODE_UNAMBIGUOUS
     102             : 
     103             : using namespace ::com::sun::star;
     104             : using namespace ::com::sun::star::uno;
     105             : using namespace nsSwDocInfoSubType;
     106             : 
     107        2958 : SwPageNumberFieldType::SwPageNumberFieldType()
     108             :     : SwFieldType( RES_PAGENUMBERFLD ),
     109             :     nNumberingType( SVX_NUM_ARABIC ),
     110        2958 :     bVirtuell( false )
     111             : {
     112        2958 : }
     113             : 
     114        3189 : OUString SwPageNumberFieldType::Expand( sal_uInt32 nFormat, short nOff,
     115             :          sal_uInt16 const nPageNumber, sal_uInt16 const nMaxPage,
     116             :          const OUString& rUserStr ) const
     117             : {
     118        3189 :     sal_uInt32 nTmpFormat = (SVX_NUM_PAGEDESC == nFormat) ? (sal_uInt32)nNumberingType : nFormat;
     119        3189 :     int const nTmp = nPageNumber + nOff;
     120             : 
     121        3189 :     if (0 > nTmp || SVX_NUM_NUMBER_NONE == nTmpFormat || (!bVirtuell && nTmp > nMaxPage))
     122           0 :         return OUString();
     123             : 
     124        3189 :     if( SVX_NUM_CHAR_SPECIAL == nTmpFormat )
     125           0 :         return rUserStr;
     126             : 
     127        3189 :     return FormatNumber( nTmp, nTmpFormat );
     128             : }
     129             : 
     130           0 : SwFieldType* SwPageNumberFieldType::Copy() const
     131             : {
     132           0 :     SwPageNumberFieldType *pTmp = new SwPageNumberFieldType();
     133             : 
     134           0 :     pTmp->nNumberingType = nNumberingType;
     135           0 :     pTmp->bVirtuell  = bVirtuell;
     136             : 
     137           0 :     return pTmp;
     138             : }
     139             : 
     140        1504 : void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc,
     141             :                                             bool bVirt,
     142             :                                             const sal_Int16* pNumFormat )
     143             : {
     144        1504 :     if( pNumFormat )
     145        1453 :         nNumberingType = *pNumFormat;
     146             : 
     147        1504 :     bVirtuell = false;
     148        1504 :     if (bVirt && pDoc)
     149             :     {
     150             :         // check the flag since the layout NEVER sets it back
     151         311 :         const SfxItemPool &rPool = pDoc->GetAttrPool();
     152         311 :         sal_uInt32 nMaxItems = rPool.GetItemCount2( RES_PAGEDESC );
     153        2097 :         for( sal_uInt32 n = 0; n < nMaxItems; ++n )
     154             :         {
     155             :             const SwFormatPageDesc *pDesc;
     156        4426 :             if( 0 != (pDesc = static_cast<const SwFormatPageDesc*>(rPool.GetItem2( RES_PAGEDESC, n )) )
     157        5194 :                 && pDesc->GetNumOffset() && pDesc->GetDefinedIn() )
     158             :             {
     159         378 :                 const SwContentNode* pNd = PTR_CAST( SwContentNode, pDesc->GetDefinedIn() );
     160         378 :                 if( pNd )
     161             :                 {
     162         240 :                     if ( SwIterator<SwFrm,SwContentNode>(*pNd).First() )
     163         139 :                         bVirtuell = true;
     164             :                 }
     165         138 :                 else if( pDesc->GetDefinedIn()->ISA( SwFormat ))
     166             :                 {
     167         138 :                     SwAutoFormatGetDocNode aGetHt( &pDoc->GetNodes() );
     168         138 :                     bVirtuell = !pDesc->GetDefinedIn()->GetInfo( aGetHt );
     169         138 :                     break;
     170             :                 }
     171             :             }
     172             :         }
     173             :     }
     174        1504 : }
     175             : 
     176        4416 : SwPageNumberField::SwPageNumberField(SwPageNumberFieldType* pTyp,
     177             :           sal_uInt16 nSub, sal_uInt32 nFormat, short nOff,
     178             :           sal_uInt16 const nPageNumber, sal_uInt16 const nMaxPage)
     179             :     : SwField(pTyp, nFormat), nSubType(nSub), nOffset(nOff)
     180             :     , m_nPageNumber(nPageNumber)
     181        4416 :     , m_nMaxPage(nMaxPage)
     182             : {
     183        4416 : }
     184             : 
     185        1504 : void SwPageNumberField::ChangeExpansion(sal_uInt16 const nPageNumber,
     186             :         sal_uInt16 const nMaxPage)
     187             : {
     188        1504 :     m_nPageNumber = nPageNumber;
     189        1504 :     m_nMaxPage = nMaxPage;
     190        1504 : }
     191             : 
     192        3189 : OUString SwPageNumberField::Expand() const
     193             : {
     194        3189 :     OUString sRet;
     195        3189 :     SwPageNumberFieldType* pFieldType = static_cast<SwPageNumberFieldType*>(GetTyp());
     196             : 
     197        3189 :     if( PG_NEXT == nSubType && 1 != nOffset )
     198             :     {
     199           0 :         sRet = pFieldType->Expand(GetFormat(), 1, m_nPageNumber, m_nMaxPage, sUserStr);
     200           0 :         if (!sRet.isEmpty())
     201             :         {
     202           0 :             sRet = pFieldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage, sUserStr);
     203             :         }
     204             :     }
     205        3189 :     else if( PG_PREV == nSubType && -1 != nOffset )
     206             :     {
     207           0 :         sRet = pFieldType->Expand(GetFormat(), -1, m_nPageNumber, m_nMaxPage, sUserStr);
     208           0 :         if (!sRet.isEmpty())
     209             :         {
     210           0 :             sRet = pFieldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage, sUserStr);
     211             :         }
     212             :     }
     213             :     else
     214        3189 :         sRet = pFieldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage, sUserStr);
     215        3189 :     return sRet;
     216             : }
     217             : 
     218        3686 : SwField* SwPageNumberField::Copy() const
     219             : {
     220             :     SwPageNumberField *pTmp = new SwPageNumberField(
     221        3686 :                 static_cast<SwPageNumberFieldType*>(GetTyp()), nSubType,
     222        3686 :                 GetFormat(), nOffset, m_nPageNumber, m_nMaxPage);
     223        3686 :     pTmp->SetLanguage( GetLanguage() );
     224        3686 :     pTmp->SetUserString( sUserStr );
     225        3686 :     return pTmp;
     226             : }
     227             : 
     228           0 : OUString SwPageNumberField::GetPar2() const
     229             : {
     230           0 :     return OUString::number(nOffset);
     231             : }
     232             : 
     233           0 : void SwPageNumberField::SetPar2(const OUString& rStr)
     234             : {
     235           0 :     nOffset = (short)rStr.toInt32();
     236           0 : }
     237             : 
     238        3473 : sal_uInt16 SwPageNumberField::GetSubType() const
     239             : {
     240        3473 :     return nSubType;
     241             : }
     242             : 
     243          54 : bool SwPageNumberField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     244             : {
     245          54 :     switch( nWhichId )
     246             :     {
     247             :     case FIELD_PROP_FORMAT:
     248          36 :         rAny <<= (sal_Int16)GetFormat();
     249          36 :         break;
     250             :     case FIELD_PROP_USHORT1:
     251           9 :         rAny <<= nOffset;
     252           9 :         break;
     253             :     case FIELD_PROP_SUBTYPE:
     254             :         {
     255             :              text::PageNumberType eType;
     256           9 :             eType = text::PageNumberType_CURRENT;
     257           9 :             if(nSubType == PG_PREV)
     258           0 :                 eType = text::PageNumberType_PREV;
     259           9 :             else if(nSubType == PG_NEXT)
     260           0 :                 eType = text::PageNumberType_NEXT;
     261           9 :             rAny.setValue(&eType, cppu::UnoType<text::PageNumberType>::get());
     262             :         }
     263           9 :         break;
     264             :     case FIELD_PROP_PAR1:
     265           0 :         rAny <<= sUserStr;
     266           0 :         break;
     267             : 
     268             :     default:
     269             :         OSL_FAIL("illegal property");
     270             :     }
     271          54 :     return true;
     272             : }
     273             : 
     274         253 : bool SwPageNumberField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     275             : {
     276         253 :     bool bRet = true;
     277         253 :     sal_Int16 nSet = 0;
     278         253 :     switch( nWhichId )
     279             :     {
     280             :     case FIELD_PROP_FORMAT:
     281           0 :         rAny >>= nSet;
     282             : 
     283             :         // TODO: woher kommen die defines?
     284           0 :         if(nSet <= SVX_NUM_PAGEDESC )
     285           0 :             SetFormat(nSet);
     286             :         else {
     287             :         }
     288           0 :         break;
     289             :     case FIELD_PROP_USHORT1:
     290           0 :         rAny >>= nSet;
     291           0 :         nOffset = nSet;
     292           0 :         break;
     293             :     case FIELD_PROP_SUBTYPE:
     294         253 :         switch( SWUnoHelper::GetEnumAsInt32( rAny ) )
     295             :         {
     296             :             case text::PageNumberType_CURRENT:
     297         253 :                 nSubType = PG_RANDOM;
     298         253 :             break;
     299             :             case text::PageNumberType_PREV:
     300           0 :                 nSubType = PG_PREV;
     301           0 :             break;
     302             :             case text::PageNumberType_NEXT:
     303           0 :                 nSubType = PG_NEXT;
     304           0 :             break;
     305             :             default:
     306           0 :                 bRet = false;
     307             :         }
     308         253 :         break;
     309             :     case FIELD_PROP_PAR1:
     310           0 :         rAny >>= sUserStr;
     311           0 :         break;
     312             : 
     313             :     default:
     314             :         OSL_FAIL("illegal property");
     315             :     }
     316         253 :     return bRet;
     317             : }
     318             : 
     319        2958 : SwAuthorFieldType::SwAuthorFieldType()
     320        2958 :     : SwFieldType( RES_AUTHORFLD )
     321             : {
     322        2958 : }
     323             : 
     324         149 : OUString SwAuthorFieldType::Expand(sal_uLong nFormat)
     325             : {
     326         149 :     SvtUserOptions&  rOpt = SW_MOD()->GetUserOptions();
     327         149 :     if((nFormat & 0xff) == AF_NAME)
     328          15 :         return rOpt.GetFullName();
     329             : 
     330         134 :     return rOpt.GetID();
     331             : }
     332             : 
     333           0 : SwFieldType* SwAuthorFieldType::Copy() const
     334             : {
     335           0 :     return new SwAuthorFieldType;
     336             : }
     337             : 
     338         145 : SwAuthorField::SwAuthorField(SwAuthorFieldType* pTyp, sal_uInt32 nFormat)
     339         145 :     : SwField(pTyp, nFormat)
     340             : {
     341         145 :     aContent = SwAuthorFieldType::Expand(GetFormat());
     342         145 : }
     343             : 
     344          62 : OUString SwAuthorField::Expand() const
     345             : {
     346          62 :     if (!IsFixed())
     347           8 :         const_cast<SwAuthorField*>(this)->aContent =
     348           8 :                     SwAuthorFieldType::Expand(GetFormat());
     349             : 
     350          62 :     return aContent;
     351             : }
     352             : 
     353         124 : SwField* SwAuthorField::Copy() const
     354             : {
     355         124 :     SwAuthorField *pTmp = new SwAuthorField( static_cast<SwAuthorFieldType*>(GetTyp()),
     356         124 :                                                 GetFormat());
     357         124 :     pTmp->SetExpansion(aContent);
     358         124 :     return pTmp;
     359             : }
     360             : 
     361          40 : bool SwAuthorField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     362             : {
     363          40 :     switch( nWhichId )
     364             :     {
     365             :     case FIELD_PROP_BOOL1:
     366           0 :         rAny <<= (GetFormat() & 0xff) == AF_NAME;
     367           0 :         break;
     368             : 
     369             :     case FIELD_PROP_BOOL2:
     370          20 :         rAny <<= IsFixed();
     371          20 :         break;
     372             : 
     373             :     case FIELD_PROP_PAR1:
     374          20 :         rAny <<= GetContent();
     375          20 :         break;
     376             : 
     377             :     default:
     378             :         OSL_FAIL("illegal property");
     379             :     }
     380          40 :     return true;
     381             : }
     382             : 
     383           0 : bool SwAuthorField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     384             : {
     385           0 :     switch( nWhichId )
     386             :     {
     387             :     case FIELD_PROP_BOOL1:
     388           0 :         SetFormat( *static_cast<sal_Bool const *>(rAny.getValue()) ? AF_NAME : AF_SHORTCUT );
     389           0 :         break;
     390             : 
     391             :     case FIELD_PROP_BOOL2:
     392           0 :         if( *static_cast<sal_Bool const *>(rAny.getValue()) )
     393           0 :             SetFormat( GetFormat() | AF_FIXED);
     394             :         else
     395           0 :             SetFormat( GetFormat() & ~AF_FIXED);
     396           0 :         break;
     397             : 
     398             :     case FIELD_PROP_PAR1:
     399           0 :         rAny >>= aContent;
     400           0 :         break;
     401             : 
     402             :     default:
     403             :         OSL_FAIL("illegal property");
     404             :     }
     405           0 :     return true;
     406             : }
     407             : 
     408        2959 : SwFileNameFieldType::SwFileNameFieldType(SwDoc *pDocument)
     409        2959 :     : SwFieldType( RES_FILENAMEFLD )
     410             : {
     411        2959 :     pDoc = pDocument;
     412        2959 : }
     413             : 
     414         156 : OUString SwFileNameFieldType::Expand(sal_uLong nFormat) const
     415             : {
     416         156 :     OUString aRet;
     417         156 :     const SwDocShell* pDShell = pDoc->GetDocShell();
     418         156 :     if( pDShell && pDShell->HasName() )
     419             :     {
     420         116 :         const INetURLObject& rURLObj = pDShell->GetMedium()->GetURLObject();
     421         116 :         switch( nFormat & ~FF_FIXED )
     422             :         {
     423             :             case FF_PATH:
     424             :                 {
     425           1 :                     if( INetProtocol::File == rURLObj.GetProtocol() )
     426             :                     {
     427           1 :                         INetURLObject aTemp(rURLObj);
     428           1 :                         aTemp.removeSegment();
     429             :                         // last slash should belong to the pathname
     430           1 :                         aRet = aTemp.PathToFileName();
     431             :                     }
     432             :                     else
     433             :                     {
     434           0 :                         aRet = URIHelper::removePassword(
     435             :                                     rURLObj.GetMainURL( INetURLObject::NO_DECODE ),
     436           0 :                                     INetURLObject::WAS_ENCODED, URL_DECODE );
     437           0 :                         const sal_Int32 nPos = aRet.indexOf(rURLObj.GetLastName( URL_DECODE ));
     438           0 :                         if (nPos>=0)
     439             :                         {
     440           0 :                             aRet = aRet.copy(0, nPos);
     441             :                         }
     442             :                     }
     443             :                 }
     444           1 :                 break;
     445             : 
     446             :             case FF_NAME:
     447           7 :                 aRet = rURLObj.GetLastName( INetURLObject::DECODE_WITH_CHARSET );
     448           7 :                 break;
     449             : 
     450             :             case FF_NAME_NOEXT:
     451           5 :                 aRet = rURLObj.GetBase();
     452           5 :                 break;
     453             : 
     454             :             default:
     455         103 :                 if( INetProtocol::File == rURLObj.GetProtocol() )
     456         103 :                     aRet = rURLObj.GetFull();
     457             :                 else
     458           0 :                     aRet = URIHelper::removePassword(
     459             :                                     rURLObj.GetMainURL( INetURLObject::NO_DECODE ),
     460           0 :                                     INetURLObject::WAS_ENCODED, URL_DECODE );
     461             :         }
     462             :     }
     463         156 :     return aRet;
     464             : }
     465             : 
     466           0 : SwFieldType* SwFileNameFieldType::Copy() const
     467             : {
     468           0 :     SwFieldType *pTmp = new SwFileNameFieldType(pDoc);
     469           0 :     return pTmp;
     470             : }
     471             : 
     472          77 : SwFileNameField::SwFileNameField(SwFileNameFieldType* pTyp, sal_uInt32 nFormat)
     473          77 :     : SwField(pTyp, nFormat)
     474             : {
     475          77 :     aContent = static_cast<SwFileNameFieldType*>(GetTyp())->Expand(GetFormat());
     476          77 : }
     477             : 
     478          75 : OUString SwFileNameField::Expand() const
     479             : {
     480          75 :     if (!IsFixed())
     481          75 :         const_cast<SwFileNameField*>(this)->aContent = static_cast<SwFileNameFieldType*>(GetTyp())->Expand(GetFormat());
     482             : 
     483          75 :     return aContent;
     484             : }
     485             : 
     486          67 : SwField* SwFileNameField::Copy() const
     487             : {
     488             :     SwFileNameField *pTmp =
     489          67 :         new SwFileNameField(static_cast<SwFileNameFieldType*>(GetTyp()), GetFormat());
     490          67 :     pTmp->SetExpansion(aContent);
     491             : 
     492          67 :     return pTmp;
     493             : }
     494             : 
     495           0 : bool SwFileNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     496             : {
     497           0 :     switch( nWhichId )
     498             :     {
     499             :     case FIELD_PROP_FORMAT:
     500             :         {
     501             :             sal_Int16 nRet;
     502           0 :             switch( GetFormat() &(~FF_FIXED) )
     503             :             {
     504             :                 case FF_PATH:
     505           0 :                     nRet = text::FilenameDisplayFormat::PATH;
     506           0 :                 break;
     507             :                 case FF_NAME_NOEXT:
     508           0 :                     nRet = text::FilenameDisplayFormat::NAME;
     509           0 :                 break;
     510             :                 case FF_NAME:
     511           0 :                     nRet = text::FilenameDisplayFormat::NAME_AND_EXT;
     512           0 :                 break;
     513           0 :                 default:    nRet = text::FilenameDisplayFormat::FULL;
     514             :             }
     515           0 :             rAny <<= nRet;
     516             :         }
     517           0 :         break;
     518             : 
     519             :     case FIELD_PROP_BOOL2:
     520           0 :         rAny <<= IsFixed();
     521           0 :         break;
     522             : 
     523             :     case FIELD_PROP_PAR3:
     524           0 :         rAny <<= GetContent();
     525           0 :         break;
     526             :     default:
     527             :         OSL_FAIL("illegal property");
     528             :     }
     529           0 :     return true;
     530             : }
     531             : 
     532          10 : bool SwFileNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     533             : {
     534          10 :     switch( nWhichId )
     535             :     {
     536             :     case FIELD_PROP_FORMAT:
     537             :         {
     538             :             //JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
     539             :             //              called with a int32 value! But normally we need
     540             :             //              here only a int16
     541          10 :             sal_Int32 nType = 0;
     542          10 :             rAny >>= nType;
     543          10 :             bool bFixed = IsFixed();
     544          10 :             switch( nType )
     545             :             {
     546             :                 case text::FilenameDisplayFormat::PATH:
     547           0 :                     nType = FF_PATH;
     548           0 :                 break;
     549             :                 case text::FilenameDisplayFormat::NAME:
     550           4 :                     nType = FF_NAME_NOEXT;
     551           4 :                 break;
     552             :                 case text::FilenameDisplayFormat::NAME_AND_EXT:
     553           0 :                     nType = FF_NAME;
     554           0 :                 break;
     555           6 :                 default:    nType = FF_PATHNAME;
     556             :             }
     557          10 :             if(bFixed)
     558           0 :                 nType |= FF_FIXED;
     559          10 :             SetFormat(nType);
     560             :         }
     561          10 :         break;
     562             : 
     563             :     case FIELD_PROP_BOOL2:
     564           0 :         if( *static_cast<sal_Bool const *>(rAny.getValue()) )
     565           0 :             SetFormat( GetFormat() | FF_FIXED);
     566             :         else
     567           0 :             SetFormat( GetFormat() & ~FF_FIXED);
     568           0 :         break;
     569             : 
     570             :     case FIELD_PROP_PAR3:
     571           0 :         rAny >>= aContent;
     572           0 :         break;
     573             : 
     574             :     default:
     575             :         OSL_FAIL("illegal property");
     576             :     }
     577          10 :     return true;
     578             : }
     579             : 
     580        5916 : SwTemplNameFieldType::SwTemplNameFieldType(SwDoc *pDocument)
     581        5916 :     : SwFieldType( RES_TEMPLNAMEFLD )
     582             : {
     583        5916 :     pDoc = pDocument;
     584        5916 : }
     585             : 
     586           0 : OUString SwTemplNameFieldType::Expand(sal_uLong nFormat) const
     587             : {
     588             :     OSL_ENSURE( nFormat < FF_END, "Expand: no valid Format!" );
     589             : 
     590           0 :     OUString aRet;
     591           0 :     SwDocShell *pDocShell(pDoc->GetDocShell());
     592             :     OSL_ENSURE(pDocShell, "no SwDocShell");
     593           0 :     if (pDocShell) {
     594             :         uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
     595           0 :             pDocShell->GetModel(), uno::UNO_QUERY_THROW);
     596             :         uno::Reference<document::XDocumentProperties> xDocProps(
     597           0 :             xDPS->getDocumentProperties());
     598             :         OSL_ENSURE(xDocProps.is(), "Doc has no DocumentProperties");
     599             : 
     600           0 :         if( FF_UI_NAME == nFormat )
     601           0 :             aRet = xDocProps->getTemplateName();
     602           0 :         else if( !xDocProps->getTemplateURL().isEmpty() )
     603             :         {
     604           0 :             if( FF_UI_RANGE == nFormat )
     605             :             {
     606             :                 // for getting region names!
     607           0 :                 SfxDocumentTemplates aFac;
     608           0 :                 OUString sTmp;
     609           0 :                 OUString sRegion;
     610           0 :                 aFac.GetLogicNames( xDocProps->getTemplateURL(), sRegion, sTmp );
     611           0 :                 aRet = sRegion;
     612             :             }
     613             :             else
     614             :             {
     615           0 :                 INetURLObject aPathName( xDocProps->getTemplateURL() );
     616           0 :                 if( FF_NAME == nFormat )
     617           0 :                     aRet = aPathName.GetName(URL_DECODE);
     618           0 :                 else if( FF_NAME_NOEXT == nFormat )
     619           0 :                     aRet = aPathName.GetBase();
     620             :                 else
     621             :                 {
     622           0 :                     if( FF_PATH == nFormat )
     623             :                     {
     624           0 :                         aPathName.removeSegment();
     625           0 :                         aRet = aPathName.GetFull();
     626             :                     }
     627             :                     else
     628           0 :                         aRet = aPathName.GetFull();
     629           0 :                 }
     630             :             }
     631           0 :         }
     632             :     }
     633           0 :     return aRet;
     634             : }
     635             : 
     636           0 : SwFieldType* SwTemplNameFieldType::Copy() const
     637             : {
     638           0 :     SwFieldType *pTmp = new SwTemplNameFieldType(pDoc);
     639           0 :     return pTmp;
     640             : }
     641             : 
     642           0 : SwTemplNameField::SwTemplNameField(SwTemplNameFieldType* pTyp, sal_uInt32 nFormat)
     643           0 :     : SwField(pTyp, nFormat)
     644           0 : {}
     645             : 
     646           0 : OUString SwTemplNameField::Expand() const
     647             : {
     648           0 :     return static_cast<SwTemplNameFieldType*>(GetTyp())->Expand(GetFormat());
     649             : }
     650             : 
     651           0 : SwField* SwTemplNameField::Copy() const
     652             : {
     653             :     SwTemplNameField *pTmp =
     654           0 :         new SwTemplNameField(static_cast<SwTemplNameFieldType*>(GetTyp()), GetFormat());
     655           0 :     return pTmp;
     656             : }
     657             : 
     658           0 : bool SwTemplNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     659             : {
     660           0 :     switch ( nWhichId )
     661             :     {
     662             :     case FIELD_PROP_FORMAT:
     663             :         {
     664             :             sal_Int16 nRet;
     665           0 :             switch( GetFormat() )
     666             :             {
     667           0 :                 case FF_PATH:       nRet = text::FilenameDisplayFormat::PATH; break;
     668           0 :                 case FF_NAME_NOEXT: nRet = text::FilenameDisplayFormat::NAME; break;
     669           0 :                 case FF_NAME:       nRet = text::FilenameDisplayFormat::NAME_AND_EXT; break;
     670           0 :                 case FF_UI_RANGE:   nRet = text::TemplateDisplayFormat::AREA; break;
     671           0 :                 case FF_UI_NAME:    nRet = text::TemplateDisplayFormat::TITLE;  break;
     672           0 :                 default:    nRet = text::FilenameDisplayFormat::FULL;
     673             : 
     674             :             }
     675           0 :             rAny <<= nRet;
     676             :         }
     677           0 :         break;
     678             :     default:
     679             :         OSL_FAIL("illegal property");
     680             :     }
     681           0 :     return true;
     682             : }
     683             : 
     684           0 : bool SwTemplNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     685             : {
     686           0 :     switch ( nWhichId )
     687             :     {
     688             :     case FIELD_PROP_FORMAT:
     689             :         {
     690             :             //JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
     691             :             //              called with a int32 value! But normally we need
     692             :             //              here only a int16
     693           0 :             sal_Int32 nType = 0;
     694           0 :             rAny >>= nType;
     695           0 :             switch( nType )
     696             :             {
     697             :             case text::FilenameDisplayFormat::PATH:
     698           0 :                 SetFormat(FF_PATH);
     699           0 :             break;
     700             :             case text::FilenameDisplayFormat::NAME:
     701           0 :                 SetFormat(FF_NAME_NOEXT);
     702           0 :             break;
     703             :             case text::FilenameDisplayFormat::NAME_AND_EXT:
     704           0 :                 SetFormat(FF_NAME);
     705           0 :             break;
     706             :             case text::TemplateDisplayFormat::AREA  :
     707           0 :                 SetFormat(FF_UI_RANGE);
     708           0 :             break;
     709             :             case text::TemplateDisplayFormat::TITLE  :
     710           0 :                 SetFormat(FF_UI_NAME);
     711           0 :             break;
     712           0 :             default:    SetFormat(FF_PATHNAME);
     713             :             }
     714             :         }
     715           0 :         break;
     716             :     default:
     717             :         OSL_FAIL("illegal property");
     718             :     }
     719           0 :     return true;
     720             : }
     721             : 
     722        2958 : SwDocStatFieldType::SwDocStatFieldType(SwDoc* pDocument)
     723        2958 :     : SwFieldType( RES_DOCSTATFLD ), nNumberingType( SVX_NUM_ARABIC )
     724             : {
     725        2958 :     pDoc = pDocument;
     726        2958 : }
     727             : 
     728         486 : OUString SwDocStatFieldType::Expand(sal_uInt16 nSubType, sal_uInt32 nFormat) const
     729             : {
     730         486 :     sal_uInt32 nVal = 0;
     731         486 :     const SwDocStat& rDStat = pDoc->getIDocumentStatistics().GetDocStat();
     732         486 :     switch( nSubType )
     733             :     {
     734           0 :         case DS_TBL:  nVal = rDStat.nTable;   break;
     735           0 :         case DS_GRF:  nVal = rDStat.nGrf;   break;
     736           0 :         case DS_OLE:  nVal = rDStat.nOLE;   break;
     737           0 :         case DS_PARA: nVal = rDStat.nPara;  break;
     738           0 :         case DS_WORD: nVal = rDStat.nWord;  break;
     739           0 :         case DS_CHAR: nVal = rDStat.nChar;  break;
     740             :         case DS_PAGE:
     741         486 :             if( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() )
     742         417 :                 ((SwDocStat &)rDStat).nPage = pDoc->getIDocumentLayoutAccess().GetCurrentLayout()->GetPageNum();
     743         486 :             nVal = rDStat.nPage;
     744         486 :             if( SVX_NUM_PAGEDESC == nFormat )
     745         411 :                 nFormat = (sal_uInt32)nNumberingType;
     746         486 :             break;
     747             :         default:
     748             :             OSL_FAIL( "SwDocStatFieldType::Expand: unknown SubType" );
     749             :     }
     750             : 
     751         486 :     if( nVal <= SHRT_MAX )
     752         486 :         return FormatNumber( nVal, nFormat );
     753             : 
     754           0 :     return OUString::number( nVal );
     755             : }
     756             : 
     757           0 : SwFieldType* SwDocStatFieldType::Copy() const
     758             : {
     759           0 :     SwDocStatFieldType *pTmp = new SwDocStatFieldType(pDoc);
     760           0 :     return pTmp;
     761             : }
     762             : 
     763             : /**
     764             :  * @param pTyp
     765             :  * @param nSub SubType
     766             :  * @param nFormat
     767             :  */
     768         215 : SwDocStatField::SwDocStatField(SwDocStatFieldType* pTyp, sal_uInt16 nSub, sal_uInt32 nFormat)
     769             :     : SwField(pTyp, nFormat),
     770         215 :     nSubType(nSub)
     771         215 : {}
     772             : 
     773         486 : OUString SwDocStatField::Expand() const
     774             : {
     775         486 :     return static_cast<SwDocStatFieldType*>(GetTyp())->Expand(nSubType, GetFormat());
     776             : }
     777             : 
     778         183 : SwField* SwDocStatField::Copy() const
     779             : {
     780             :     SwDocStatField *pTmp = new SwDocStatField(
     781         183 :                     static_cast<SwDocStatFieldType*>(GetTyp()), nSubType, GetFormat() );
     782         183 :     return pTmp;
     783             : }
     784             : 
     785         118 : sal_uInt16 SwDocStatField::GetSubType() const
     786             : {
     787         118 :     return nSubType;
     788             : }
     789             : 
     790           0 : void SwDocStatField::SetSubType(sal_uInt16 nSub)
     791             : {
     792           0 :     nSubType = nSub;
     793           0 : }
     794             : 
     795         262 : void SwDocStatField::ChangeExpansion( const SwFrm* pFrm )
     796             : {
     797         262 :     if( DS_PAGE == nSubType && SVX_NUM_PAGEDESC == GetFormat() )
     798         238 :         static_cast<SwDocStatFieldType*>(GetTyp())->SetNumFormat(
     799         476 :                 pFrm->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType() );
     800         262 : }
     801             : 
     802           4 : bool SwDocStatField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     803             : {
     804           4 :     switch ( nWhichId )
     805             :     {
     806             :     case FIELD_PROP_USHORT2:
     807           4 :         rAny <<= (sal_Int16)GetFormat();
     808           4 :         break;
     809             :     default:
     810             :         OSL_FAIL("illegal property");
     811             :     }
     812           4 :     return true;
     813             : }
     814             : 
     815           0 : bool SwDocStatField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     816             : {
     817           0 :     bool bRet = false;
     818           0 :     switch ( nWhichId )
     819             :     {
     820             :     case FIELD_PROP_USHORT2:
     821             :         {
     822           0 :             sal_Int16 nSet = 0;
     823           0 :             rAny >>= nSet;
     824           0 :             if(nSet <= SVX_NUM_CHARS_LOWER_LETTER_N &&
     825           0 :                 nSet != SVX_NUM_CHAR_SPECIAL &&
     826           0 :                     nSet != SVX_NUM_BITMAP)
     827             :             {
     828           0 :                 SetFormat(nSet);
     829           0 :                 bRet = true;
     830             :             }
     831             :         }
     832           0 :         break;
     833             : 
     834             :     default:
     835             :         OSL_FAIL("illegal property");
     836             :     }
     837           0 :     return bRet;
     838             : }
     839             : 
     840             : // Document info field type
     841             : 
     842        2958 : SwDocInfoFieldType::SwDocInfoFieldType(SwDoc* pDc)
     843        2958 :     : SwValueFieldType( pDc, RES_DOCINFOFLD )
     844             : {
     845        2958 : }
     846             : 
     847           0 : SwFieldType* SwDocInfoFieldType::Copy() const
     848             : {
     849           0 :     SwDocInfoFieldType* pTyp = new SwDocInfoFieldType(GetDoc());
     850           0 :     return pTyp;
     851             : }
     852             : 
     853          28 : static void lcl_GetLocalDataWrapper( sal_uLong nLang,
     854             :                               const LocaleDataWrapper **ppAppLocalData,
     855             :                               const LocaleDataWrapper **ppLocalData )
     856             : {
     857          28 :     SvtSysLocale aLocale;
     858          28 :     *ppAppLocalData = &aLocale.GetLocaleData();
     859          28 :     *ppLocalData = *ppAppLocalData;
     860          28 :     if( nLang != (*ppLocalData)->getLanguageTag().getLanguageType() )
     861             :         *ppLocalData = new LocaleDataWrapper(
     862          28 :                         LanguageTag( static_cast<LanguageType>(nLang) ));
     863          28 : }
     864             : 
     865         485 : OUString SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat,
     866             :                                     sal_uInt16 nLang, const OUString& rName ) const
     867             : {
     868         485 :     const LocaleDataWrapper *pAppLocalData = 0, *pLocalData = 0;
     869         485 :     SwDocShell *pDocShell(GetDoc()->GetDocShell());
     870             :     OSL_ENSURE(pDocShell, "no SwDocShell");
     871         485 :     if (!pDocShell) { return OUString(); }
     872             : 
     873             :     uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
     874         485 :         pDocShell->GetModel(), uno::UNO_QUERY_THROW);
     875             :     uno::Reference<document::XDocumentProperties> xDocProps(
     876         970 :         xDPS->getDocumentProperties());
     877             :     OSL_ENSURE(xDocProps.is(), "Doc has no DocumentProperties");
     878             : 
     879         485 :     sal_uInt16 nExtSub = nSub & 0xff00;
     880         485 :     nSub &= 0xff;   // do not consider extended SubTypes
     881             : 
     882         970 :     OUString aStr;
     883         485 :     switch(nSub)
     884             :     {
     885         313 :     case DI_TITEL:  aStr = xDocProps->getTitle();       break;
     886          14 :     case DI_THEMA:  aStr = xDocProps->getSubject();     break;
     887           0 :     case DI_KEYS:   aStr = ::comphelper::string::convertCommaSeparated(
     888           0 :                                 xDocProps->getKeywords());
     889           0 :                     break;
     890           0 :     case DI_COMMENT:aStr = xDocProps->getDescription(); break;
     891          56 :     case DI_DOCNO:  aStr = OUString::number(
     892          56 :                                         xDocProps->getEditingCycles() );
     893          28 :                     break;
     894             :     case DI_EDIT:
     895          28 :         if ( !nFormat )
     896             :         {
     897          28 :             lcl_GetLocalDataWrapper( nLang, &pAppLocalData, &pLocalData );
     898          28 :             sal_Int32 dur = xDocProps->getEditingDuration();
     899             :             // If Seconds > 0 then bSec should be TRUE otherwise Seconds
     900             :             // information will be lost if file has EditTime in Seconds format.
     901          56 :             aStr = pLocalData->getTime( tools::Time(dur/3600, (dur%3600)/60, dur%60),
     902          56 :                                         dur%60 > 0, false);
     903             :         }
     904             :         else
     905             :         {
     906           0 :             sal_Int32 dur = xDocProps->getEditingDuration();
     907           0 :             double fVal = tools::Time(dur/3600, (dur%3600)/60, dur%60).GetTimeInDays();
     908           0 :             aStr = ExpandValue(fVal, nFormat, nLang);
     909             :         }
     910          28 :         break;
     911             :     case DI_CUSTOM:
     912             :         {
     913          12 :             OUString sVal;
     914             :             try
     915             :             {
     916          12 :                 uno::Any aAny;
     917             :                 uno::Reference < beans::XPropertySet > xSet(
     918          12 :                     xDocProps->getUserDefinedProperties(),
     919          24 :                     uno::UNO_QUERY_THROW);
     920          12 :                 aAny = xSet->getPropertyValue( rName );
     921             : 
     922          24 :                 uno::Reference < script::XTypeConverter > xConverter( script::Converter::create(comphelper::getProcessComponentContext()) );
     923          24 :                 uno::Any aNew;
     924          12 :                     aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
     925          18 :                 aNew >>= sVal;
     926             :             }
     927           6 :             catch (uno::Exception&) {}
     928          12 :             return sVal;
     929             :         }
     930             : 
     931             :     default:
     932             :         {
     933          90 :             OUString aName( xDocProps->getAuthor() );
     934          90 :             util::DateTime uDT( xDocProps->getCreationDate() );
     935          90 :             DateTime aDate(uDT);
     936          90 :             if( nSub == DI_CREATE )
     937             :                 ;       // das wars schon!!
     938          68 :             else if( nSub == DI_CHANGE )
     939             :             {
     940          68 :                 aName = xDocProps->getModifiedBy();
     941          68 :                 uDT = xDocProps->getModificationDate();
     942          68 :                 aDate = DateTime(uDT);
     943             :             }
     944           0 :             else if( nSub == DI_PRINT )
     945             :             {
     946           0 :                 aName = xDocProps->getPrintedBy();
     947           0 :                 uDT = xDocProps->getPrintDate();
     948           0 :                 aDate = DateTime(uDT);
     949             :             }
     950             :             else
     951           0 :                 break;
     952             : 
     953          90 :             if (aDate.IsValidAndGregorian())
     954             :             {
     955          90 :                 switch (nExtSub & ~DI_SUB_FIXED)
     956             :                 {
     957             :                 case DI_SUB_AUTHOR:
     958          28 :                     aStr = aName;
     959          28 :                     break;
     960             : 
     961             :                 case DI_SUB_TIME:
     962          22 :                     if (!nFormat)
     963             :                     {
     964             :                         lcl_GetLocalDataWrapper( nLang, &pAppLocalData,
     965           0 :                                                         &pLocalData );
     966           0 :                         aStr = pLocalData->getTime( aDate,
     967           0 :                                                     false, false);
     968             :                     }
     969             :                     else
     970             :                     {
     971             :                         // Numberformatter anwerfen!
     972             :                         double fVal = SwDateTimeField::GetDateTime( GetDoc(),
     973          22 :                                                     aDate);
     974          22 :                         aStr = ExpandValue(fVal, nFormat, nLang);
     975             :                     }
     976          22 :                     break;
     977             : 
     978             :                 case DI_SUB_DATE:
     979          40 :                     if (!nFormat)
     980             :                     {
     981             :                         lcl_GetLocalDataWrapper( nLang, &pAppLocalData,
     982           0 :                                                  &pLocalData );
     983           0 :                         aStr = pLocalData->getDate( aDate );
     984             :                     }
     985             :                     else
     986             :                     {
     987             :                         // Numberformatter anwerfen!
     988             :                         double fVal = SwDateTimeField::GetDateTime( GetDoc(),
     989          40 :                                                     aDate);
     990          40 :                         aStr = ExpandValue(fVal, nFormat, nLang);
     991             :                     }
     992          40 :                     break;
     993             :                 }
     994          90 :             }
     995             :         }
     996          90 :         break;
     997             :     }
     998             : 
     999         473 :     if( pAppLocalData != pLocalData )
    1000          28 :         delete pLocalData;
    1001             : 
    1002         958 :     return aStr;
    1003             : }
    1004             : 
    1005             : // document info field
    1006             : 
    1007         314 : SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const OUString& rName, sal_uInt32 nFormat) :
    1008         314 :     SwValueField(pTyp, nFormat), nSubType(nSub)
    1009             : {
    1010         314 :     aName = rName;
    1011         314 :     aContent = static_cast<SwDocInfoFieldType*>(GetTyp())->Expand(nSubType, nFormat, GetLanguage(), aName);
    1012         314 : }
    1013             : 
    1014           0 : SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const OUString& rName, const OUString& rValue, sal_uInt32 nFormat) :
    1015           0 :     SwValueField(pTyp, nFormat), nSubType(nSub)
    1016             : {
    1017           0 :     aName = rName;
    1018           0 :     aContent = rValue;
    1019           0 : }
    1020             : 
    1021             : template<class T>
    1022           3 : static double lcl_TimeToDouble( const T& rTime )
    1023             : {
    1024           3 :     const double fNanoSecondsPerDay = 86400000000000.0;
    1025             :     return (  (rTime.Hours   * SAL_CONST_INT64(3600000000000))
    1026             :             + (rTime.Minutes * SAL_CONST_INT64(  60000000000))
    1027             :             + (rTime.Seconds * SAL_CONST_INT64(   1000000000))
    1028             :             + (rTime.NanoSeconds))
    1029           3 :         / fNanoSecondsPerDay;
    1030             : }
    1031             : 
    1032             : template<class D>
    1033           3 : static double lcl_DateToDouble( const D& rDate, const Date& rNullDate )
    1034             : {
    1035           3 :     long nDate = Date::DateToDays( rDate.Day, rDate.Month, rDate.Year );
    1036           3 :     long nNullDate = Date::DateToDays( rNullDate.GetDay(), rNullDate.GetMonth(), rNullDate.GetYear() );
    1037           3 :     return double( nDate - nNullDate );
    1038             : }
    1039             : 
    1040         177 : OUString SwDocInfoField::Expand() const
    1041             : {
    1042         177 :     if ( ( nSubType & 0xFF ) == DI_CUSTOM )
    1043             :     {
    1044             :         // custom properties currently need special treatment
    1045             :         // We don't have a secure way to detect "real" custom properties in Word import of text
    1046             :         // fields, so we treat *every* unknown property as a custom property, even the "built-in"
    1047             :         // section in Word's document summary information stream as these properties have not been
    1048             :         // inserted when the document summary information was imported, we do it here.
    1049             :         // This approach is still a lot better than the old one to import such fields as
    1050             :         // "user fields" and simple text
    1051           6 :         SwDocShell* pDocShell = GetDoc()->GetDocShell();
    1052           6 :         if( !pDocShell )
    1053           0 :             return aContent;
    1054             :         try
    1055             :         {
    1056           6 :             uno::Reference<document::XDocumentPropertiesSupplier> xDPS( pDocShell->GetModel(), uno::UNO_QUERY_THROW);
    1057          12 :             uno::Reference<document::XDocumentProperties> xDocProps( xDPS->getDocumentProperties());
    1058          12 :             uno::Reference < beans::XPropertySet > xSet( xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
    1059          12 :             uno::Reference < beans::XPropertySetInfo > xSetInfo = xSet->getPropertySetInfo();
    1060             : 
    1061          12 :             uno::Any aAny;
    1062           6 :             if( xSetInfo->hasPropertyByName( aName ) )
    1063           6 :                 aAny = xSet->getPropertyValue( aName );
    1064           6 :             if ( aAny.getValueType() != cppu::UnoType<void>::get() )
    1065             :             {
    1066             :                 // "void" type means that the property has not been inserted until now
    1067           6 :                 if ( !IsFixed() )
    1068             :                 {
    1069             :                     // if the field is "fixed" we don't update it from the property
    1070           6 :                     OUString sVal;
    1071          12 :                     uno::Reference < script::XTypeConverter > xConverter( script::Converter::create(comphelper::getProcessComponentContext()) );
    1072           6 :                     util::Date aDate;
    1073           6 :                     util::DateTime aDateTime;
    1074           6 :                     util::Duration aDuration;
    1075           6 :                     if( aAny >>= aDate)
    1076             :                     {
    1077           0 :                         SvNumberFormatter* pFormatter = pDocShell->GetDoc()->GetNumberFormatter();
    1078           0 :                         Date* pNullDate = pFormatter->GetNullDate();
    1079           0 :                         sVal = ExpandValue( lcl_DateToDouble<util::Date>( aDate, *pNullDate ), GetFormat(), GetLanguage());
    1080             :                     }
    1081           6 :                     else if( aAny >>= aDateTime )
    1082             :                     {
    1083           3 :                         double fDateTime = lcl_TimeToDouble<util::DateTime>( aDateTime );
    1084           3 :                         SvNumberFormatter* pFormatter = pDocShell->GetDoc()->GetNumberFormatter();
    1085           3 :                         Date* pNullDate = pFormatter->GetNullDate();
    1086           3 :                         fDateTime += lcl_DateToDouble<util::DateTime>( aDateTime, *pNullDate );
    1087           3 :                         sVal = ExpandValue( fDateTime, GetFormat(), GetLanguage());
    1088             :                     }
    1089           3 :                     else if( aAny >>= aDuration )
    1090             :                     {
    1091           0 :                         sVal = OUString(aDuration.Negative ? '-' : '+')
    1092           0 :                              + SwViewShell::GetShellRes()->sDurationFormat;
    1093           0 :                         sVal = sVal.replaceFirst("%1", OUString::number( aDuration.Years  ) );
    1094           0 :                         sVal = sVal.replaceFirst("%2", OUString::number( aDuration.Months ) );
    1095           0 :                         sVal = sVal.replaceFirst("%3", OUString::number( aDuration.Days   ) );
    1096           0 :                         sVal = sVal.replaceFirst("%4", OUString::number( aDuration.Hours  ) );
    1097           0 :                         sVal = sVal.replaceFirst("%5", OUString::number( aDuration.Minutes) );
    1098           0 :                         sVal = sVal.replaceFirst("%6", OUString::number( aDuration.Seconds) );
    1099             :                     }
    1100             :                     else
    1101             :                     {
    1102           3 :                         uno::Any aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
    1103           3 :                         aNew >>= sVal;
    1104             :                     }
    1105          12 :                     const_cast<SwDocInfoField*>(this)->aContent = sVal;
    1106             :                 }
    1107           6 :             }
    1108             :         }
    1109           0 :         catch (uno::Exception&) {}
    1110             :     }
    1111         171 :     else if ( !IsFixed() )
    1112         171 :         const_cast<SwDocInfoField*>(this)->aContent = static_cast<SwDocInfoFieldType*>(GetTyp())->Expand(nSubType, GetFormat(), GetLanguage(), aName);
    1113             : 
    1114         177 :     return aContent;
    1115             : }
    1116             : 
    1117           0 : OUString SwDocInfoField::GetFieldName() const
    1118             : {
    1119           0 :     OUString aStr(SwFieldType::GetTypeStr(GetTypeId()) + ":");
    1120             : 
    1121           0 :     sal_uInt16 const nSub = nSubType & 0xff;
    1122             : 
    1123           0 :     switch (nSub)
    1124             :     {
    1125             :         case DI_CUSTOM:
    1126           0 :             aStr += aName;
    1127           0 :             break;
    1128             : 
    1129             :         default:
    1130           0 :             aStr += SwViewShell::GetShellRes()
    1131           0 :                      ->aDocInfoLst[ nSub - DI_SUBTYPE_BEGIN ];
    1132           0 :             break;
    1133             :     }
    1134           0 :     if (IsFixed())
    1135             :     {
    1136           0 :         aStr += " " + OUString(SwViewShell::GetShellRes()->aFixedStr);
    1137             :     }
    1138           0 :     return aStr;
    1139             : }
    1140             : 
    1141         274 : SwField* SwDocInfoField::Copy() const
    1142             : {
    1143         274 :     SwDocInfoField* pField = new SwDocInfoField(static_cast<SwDocInfoFieldType*>(GetTyp()), nSubType, aName, GetFormat());
    1144         274 :     pField->SetAutomaticLanguage(IsAutomaticLanguage());
    1145         274 :     pField->aContent = aContent;
    1146             : 
    1147         274 :     return pField;
    1148             : }
    1149             : 
    1150         236 : sal_uInt16 SwDocInfoField::GetSubType() const
    1151             : {
    1152         236 :     return nSubType;
    1153             : }
    1154             : 
    1155           0 : void SwDocInfoField::SetSubType(sal_uInt16 nSub)
    1156             : {
    1157           0 :     nSubType = nSub;
    1158           0 : }
    1159             : 
    1160          19 : void SwDocInfoField::SetLanguage(sal_uInt16 nLng)
    1161             : {
    1162          19 :     if (!GetFormat())
    1163          13 :         SwField::SetLanguage(nLng);
    1164             :     else
    1165           6 :         SwValueField::SetLanguage(nLng);
    1166          19 : }
    1167             : 
    1168           3 : bool SwDocInfoField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    1169             : {
    1170           3 :     switch( nWhichId )
    1171             :     {
    1172             :     case FIELD_PROP_PAR1:
    1173           0 :         rAny <<= aContent;
    1174           0 :         break;
    1175             : 
    1176             :     case FIELD_PROP_PAR4:
    1177           0 :         rAny <<= aName;
    1178           0 :         break;
    1179             : 
    1180             :     case FIELD_PROP_USHORT1:
    1181           0 :         rAny  <<= (sal_Int16)aContent.toInt32();
    1182           0 :         break;
    1183             : 
    1184             :     case FIELD_PROP_BOOL1:
    1185           3 :         rAny <<= 0 != (nSubType & DI_SUB_FIXED);
    1186           3 :         break;
    1187             : 
    1188             :     case FIELD_PROP_FORMAT:
    1189           0 :         rAny  <<= (sal_Int32)GetFormat();
    1190           0 :         break;
    1191             : 
    1192             :     case FIELD_PROP_DOUBLE:
    1193             :         {
    1194           0 :             double fVal = GetValue();
    1195           0 :             rAny.setValue(&fVal, cppu::UnoType<decltype(fVal)>::get());
    1196             :         }
    1197           0 :         break;
    1198             :     case FIELD_PROP_PAR3:
    1199           0 :         rAny <<= Expand();
    1200           0 :         break;
    1201             :     case FIELD_PROP_BOOL2:
    1202             :         {
    1203           0 :             sal_uInt16 nExtSub = (nSubType & 0xff00) & ~DI_SUB_FIXED;
    1204           0 :             rAny <<= nExtSub == DI_SUB_DATE;
    1205             :         }
    1206           0 :         break;
    1207             :     default:
    1208           0 :         return SwField::QueryValue(rAny, nWhichId);
    1209             :     }
    1210           3 :     return true;
    1211             : }
    1212             : 
    1213           0 : bool SwDocInfoField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    1214             : {
    1215           0 :     sal_Int32 nValue = 0;
    1216           0 :     switch( nWhichId )
    1217             :     {
    1218             :     case FIELD_PROP_PAR1:
    1219           0 :         if( nSubType & DI_SUB_FIXED )
    1220           0 :             rAny >>= aContent;
    1221           0 :         break;
    1222             : 
    1223             :     case FIELD_PROP_USHORT1:
    1224           0 :         if( nSubType & DI_SUB_FIXED )
    1225             :         {
    1226           0 :             rAny >>= nValue;
    1227           0 :             aContent = OUString::number(nValue);
    1228             :         }
    1229           0 :         break;
    1230             : 
    1231             :     case FIELD_PROP_BOOL1:
    1232           0 :         if(*static_cast<sal_Bool const *>(rAny.getValue()))
    1233           0 :             nSubType |= DI_SUB_FIXED;
    1234             :         else
    1235           0 :             nSubType &= ~DI_SUB_FIXED;
    1236           0 :         break;
    1237             :     case FIELD_PROP_FORMAT:
    1238             :         {
    1239           0 :             rAny >>= nValue;
    1240           0 :             if( nValue >= 0)
    1241           0 :                 SetFormat(nValue);
    1242             :         }
    1243           0 :         break;
    1244             : 
    1245             :     case FIELD_PROP_PAR3:
    1246           0 :         rAny >>= aContent;
    1247           0 :         break;
    1248             :     case FIELD_PROP_BOOL2:
    1249           0 :         nSubType &= 0xf0ff;
    1250           0 :         if(*static_cast<sal_Bool const *>(rAny.getValue()))
    1251           0 :             nSubType |= DI_SUB_DATE;
    1252             :         else
    1253           0 :             nSubType |= DI_SUB_TIME;
    1254           0 :         break;
    1255             :     default:
    1256           0 :         return SwField::PutValue(rAny, nWhichId);
    1257             :     }
    1258           0 :     return true;
    1259             : }
    1260             : 
    1261        2958 : SwHiddenTextFieldType::SwHiddenTextFieldType( bool bSetHidden )
    1262        2958 :     : SwFieldType( RES_HIDDENTXTFLD ), bHidden( bSetHidden )
    1263             : {
    1264        2958 : }
    1265             : 
    1266           0 : SwFieldType* SwHiddenTextFieldType::Copy() const
    1267             : {
    1268           0 :     return new SwHiddenTextFieldType( bHidden );
    1269             : }
    1270             : 
    1271        3112 : void SwHiddenTextFieldType::SetHiddenFlag( bool bSetHidden )
    1272             : {
    1273        3112 :     if( bHidden != bSetHidden )
    1274             :     {
    1275           3 :         bHidden = bSetHidden;
    1276           3 :         UpdateFields();       // notify all HiddenTexts
    1277             :     }
    1278        3112 : }
    1279             : 
    1280           0 : SwHiddenTextField::SwHiddenTextField( SwHiddenTextFieldType* pFieldType,
    1281             :                                     bool    bConditional,
    1282             :                                     const OUString& rCond,
    1283             :                                     const OUString& rStr,
    1284             :                                     bool    bHidden,
    1285             :                                     sal_uInt16  nSub) :
    1286             :     SwField( pFieldType ), aCond(rCond), nSubType(nSub),
    1287           0 :     bCanToggle(bConditional), bIsHidden(bHidden), bValid(false)
    1288             : {
    1289           0 :     if(nSubType == TYP_CONDTXTFLD)
    1290             :     {
    1291           0 :         sal_Int32 nPos = 0;
    1292           0 :         aTRUEText = rStr.getToken(0, '|', nPos);
    1293             : 
    1294           0 :         if(nPos != -1)
    1295             :         {
    1296           0 :             aFALSEText = rStr.getToken(0, '|', nPos);
    1297           0 :             if(nPos != -1)
    1298             :             {
    1299           0 :                 aContent = rStr.getToken(0, '|', nPos);
    1300           0 :                 bValid = true;
    1301             :             }
    1302             :         }
    1303             :     }
    1304             :     else
    1305           0 :         aTRUEText = rStr;
    1306           0 : }
    1307             : 
    1308           0 : SwHiddenTextField::SwHiddenTextField( SwHiddenTextFieldType* pFieldType,
    1309             :                                     const OUString& rCond,
    1310             :                                     const OUString& rTrue,
    1311             :                                     const OUString& rFalse,
    1312             :                                     sal_uInt16 nSub)
    1313             :     : SwField( pFieldType ), aTRUEText(rTrue), aFALSEText(rFalse), aCond(rCond), nSubType(nSub),
    1314           0 :       bIsHidden(true), bValid(false)
    1315             : {
    1316           0 :     bCanToggle = !aCond.isEmpty();
    1317           0 : }
    1318             : 
    1319           0 : OUString SwHiddenTextField::Expand() const
    1320             : {
    1321             :     // Type: !Hidden  -> show always
    1322             :     //        Hide    -> evaluate condition
    1323             : 
    1324           0 :     if( TYP_CONDTXTFLD == nSubType )
    1325             :     {
    1326           0 :         if( bValid )
    1327           0 :             return aContent;
    1328             : 
    1329           0 :         if( bCanToggle && !bIsHidden )
    1330           0 :             return aTRUEText;
    1331             :     }
    1332           0 :     else if( !static_cast<SwHiddenTextFieldType*>(GetTyp())->GetHiddenFlag() ||
    1333           0 :         ( bCanToggle && bIsHidden ))
    1334           0 :         return aTRUEText;
    1335             : 
    1336           0 :     return aFALSEText;
    1337             : }
    1338             : 
    1339             : /// get current field value and cache it
    1340           0 : void SwHiddenTextField::Evaluate(SwDoc* pDoc)
    1341             : {
    1342             :     OSL_ENSURE(pDoc, "got no document");
    1343             : 
    1344           0 :     if( TYP_CONDTXTFLD == nSubType )
    1345             :     {
    1346             : #if !HAVE_FEATURE_DBCONNECTIVITY
    1347             :         (void) pDoc;
    1348             : #else
    1349           0 :         SwDBManager* pMgr = pDoc->GetDBManager();
    1350             : #endif
    1351           0 :         bValid = false;
    1352           0 :         OUString sTmpName = (bCanToggle && !bIsHidden) ? aTRUEText : aFALSEText;
    1353             : 
    1354             :         // Database expressions need to be different from normal text. Therefore, normal text is set
    1355             :         // in quotes. If the latter exist they will be removed. If not, check if potential DB name.
    1356             :         // Only if there are two or more dots and no quotes, we assume a database.
    1357           0 :         if (sTmpName.getLength()>1 &&
    1358           0 :             sTmpName.startsWith("\"") &&
    1359           0 :             sTmpName.endsWith("\""))
    1360             :         {
    1361           0 :             aContent = sTmpName.copy(1, sTmpName.getLength() - 2);
    1362           0 :             bValid = true;
    1363             :         }
    1364           0 :         else if(sTmpName.indexOf('\"')<0 &&
    1365           0 :             comphelper::string::getTokenCount(sTmpName, '.') > 2)
    1366             :         {
    1367           0 :             sTmpName = ::ReplacePoint(sTmpName);
    1368           0 :             if(sTmpName.startsWith("[") && sTmpName.endsWith("]"))
    1369             :             {   // remove brackets
    1370           0 :                 sTmpName = sTmpName.copy(1, sTmpName.getLength() - 2);
    1371             :             }
    1372             : #if HAVE_FEATURE_DBCONNECTIVITY
    1373           0 :             if( pMgr)
    1374             :             {
    1375           0 :                 OUString sDBName( GetDBName( sTmpName, pDoc ));
    1376           0 :                 OUString sDataSource(sDBName.getToken(0, DB_DELIM));
    1377           0 :                 OUString sDataTableOrQuery(sDBName.getToken(1, DB_DELIM));
    1378           0 :                 if( pMgr->IsInMerge() && !sDBName.isEmpty() &&
    1379             :                     pMgr->IsDataSourceOpen( sDataSource,
    1380           0 :                                                 sDataTableOrQuery, false))
    1381             :                 {
    1382             :                     double fNumber;
    1383             :                     pMgr->GetMergeColumnCnt(GetColumnName( sTmpName ),
    1384           0 :                         GetLanguage(), aContent, &fNumber );
    1385           0 :                     bValid = true;
    1386             :                 }
    1387           0 :                 else if( !sDBName.isEmpty() && !sDataSource.isEmpty() &&
    1388           0 :                          !sDataTableOrQuery.isEmpty() )
    1389           0 :                     bValid = true;
    1390             :             }
    1391             : #endif
    1392           0 :         }
    1393             :     }
    1394           0 : }
    1395             : 
    1396           0 : OUString SwHiddenTextField::GetFieldName() const
    1397             : {
    1398           0 :     OUString aStr = SwFieldType::GetTypeStr(nSubType) +
    1399           0 :         " " + aCond + " " + aTRUEText;
    1400             : 
    1401           0 :     if (nSubType == TYP_CONDTXTFLD)
    1402             :     {
    1403           0 :         aStr += " : " + aFALSEText;
    1404             :     }
    1405           0 :     return aStr;
    1406             : }
    1407             : 
    1408           0 : SwField* SwHiddenTextField::Copy() const
    1409             : {
    1410             :     SwHiddenTextField* pField =
    1411           0 :         new SwHiddenTextField(static_cast<SwHiddenTextFieldType*>(GetTyp()), aCond,
    1412           0 :                               aTRUEText, aFALSEText);
    1413           0 :     pField->bIsHidden = bIsHidden;
    1414           0 :     pField->bValid    = bValid;
    1415           0 :     pField->aContent  = aContent;
    1416           0 :     pField->SetFormat(GetFormat());
    1417           0 :     pField->nSubType  = nSubType;
    1418           0 :     return pField;
    1419             : }
    1420             : 
    1421             : /// set condition
    1422           0 : void SwHiddenTextField::SetPar1(const OUString& rStr)
    1423             : {
    1424           0 :     aCond = rStr;
    1425           0 :     bCanToggle = !aCond.isEmpty();
    1426           0 : }
    1427             : 
    1428           0 : OUString SwHiddenTextField::GetPar1() const
    1429             : {
    1430           0 :     return aCond;
    1431             : }
    1432             : 
    1433             : /// set True/False text
    1434           0 : void SwHiddenTextField::SetPar2(const OUString& rStr)
    1435             : {
    1436           0 :     if (nSubType == TYP_CONDTXTFLD)
    1437             :     {
    1438           0 :         sal_Int32 nPos = rStr.indexOf('|');
    1439           0 :         if (nPos == -1)
    1440           0 :             aTRUEText = rStr;
    1441             :         else
    1442             :         {
    1443           0 :             aTRUEText = rStr.copy(0, nPos);
    1444           0 :             aFALSEText = rStr.copy(nPos + 1);
    1445             :         }
    1446             :     }
    1447             :     else
    1448           0 :         aTRUEText = rStr;
    1449           0 : }
    1450             : 
    1451             : /// get True/False text
    1452           0 : OUString SwHiddenTextField::GetPar2() const
    1453             : {
    1454           0 :     if(nSubType != TYP_CONDTXTFLD)
    1455             :     {
    1456           0 :         return aTRUEText;
    1457             :     }
    1458           0 :     return aTRUEText + "|" + aFALSEText;
    1459             : }
    1460             : 
    1461           0 : sal_uInt16 SwHiddenTextField::GetSubType() const
    1462             : {
    1463           0 :     return nSubType;
    1464             : }
    1465             : 
    1466           0 : bool SwHiddenTextField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    1467             : {
    1468           0 :     switch( nWhichId )
    1469             :     {
    1470             :     case FIELD_PROP_PAR1:
    1471           0 :         rAny <<= aCond;
    1472           0 :         break;
    1473             :     case FIELD_PROP_PAR2:
    1474           0 :         rAny <<= aTRUEText;
    1475           0 :         break;
    1476             :     case FIELD_PROP_PAR3:
    1477           0 :         rAny <<= aFALSEText;
    1478           0 :         break;
    1479             :     case FIELD_PROP_PAR4 :
    1480           0 :         rAny <<= aContent;
    1481           0 :         break;
    1482             :     case FIELD_PROP_BOOL1:
    1483           0 :         rAny <<= bIsHidden;
    1484           0 :         break;
    1485             :     default:
    1486             :         OSL_FAIL("illegal property");
    1487             :     }
    1488           0 :     return true;
    1489             : }
    1490             : 
    1491           0 : bool SwHiddenTextField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    1492             : {
    1493           0 :     switch( nWhichId )
    1494             :     {
    1495             :     case FIELD_PROP_PAR1:
    1496             :         {
    1497           0 :             OUString sVal;
    1498           0 :             rAny >>= sVal;
    1499           0 :             SetPar1(sVal);
    1500             :         }
    1501           0 :         break;
    1502             :     case FIELD_PROP_PAR2:
    1503           0 :         rAny >>= aTRUEText;
    1504           0 :         break;
    1505             :     case FIELD_PROP_PAR3:
    1506           0 :         rAny >>= aFALSEText;
    1507           0 :         break;
    1508             :     case FIELD_PROP_BOOL1:
    1509           0 :         bIsHidden = *static_cast<sal_Bool const *>(rAny.getValue());
    1510           0 :         break;
    1511             :     case FIELD_PROP_PAR4:
    1512           0 :         rAny >>= aContent;
    1513           0 :         bValid = true;
    1514           0 :     break;
    1515             :     default:
    1516             :         OSL_FAIL("illegal property");
    1517             :     }
    1518           0 :     return true;
    1519             : }
    1520             : 
    1521           0 : OUString SwHiddenTextField::GetColumnName(const OUString& rName)
    1522             : {
    1523           0 :     sal_Int32 nPos = rName.indexOf(DB_DELIM);
    1524           0 :     if( nPos>=0 )
    1525             :     {
    1526           0 :         nPos = rName.indexOf(DB_DELIM, nPos + 1);
    1527             : 
    1528           0 :         if( nPos>=0 )
    1529           0 :             return rName.copy(nPos + 1);
    1530             :     }
    1531           0 :     return rName;
    1532             : }
    1533             : 
    1534           0 : OUString SwHiddenTextField::GetDBName(const OUString& rName, SwDoc *pDoc)
    1535             : {
    1536           0 :     sal_Int32 nPos = rName.indexOf(DB_DELIM);
    1537           0 :     if( nPos>=0 )
    1538             :     {
    1539           0 :         nPos = rName.indexOf(DB_DELIM, nPos + 1);
    1540             : 
    1541           0 :         if( nPos>=0 )
    1542           0 :             return rName.copy(0, nPos);
    1543             :     }
    1544             : 
    1545           0 :     SwDBData aData = pDoc->GetDBData();
    1546           0 :     return aData.sDataSource + OUString(DB_DELIM) + aData.sCommand;
    1547             : }
    1548             : 
    1549             : // field type for line height 0
    1550             : 
    1551        2958 : SwHiddenParaFieldType::SwHiddenParaFieldType()
    1552        2958 :     : SwFieldType( RES_HIDDENPARAFLD )
    1553             : {
    1554        2958 : }
    1555             : 
    1556           0 : SwFieldType* SwHiddenParaFieldType::Copy() const
    1557             : {
    1558           0 :     SwHiddenParaFieldType* pTyp = new SwHiddenParaFieldType();
    1559           0 :     return pTyp;
    1560             : }
    1561             : 
    1562             : // field for line height 0
    1563             : 
    1564           0 : SwHiddenParaField::SwHiddenParaField(SwHiddenParaFieldType* pTyp, const OUString& rStr)
    1565           0 :     : SwField(pTyp), aCond(rStr)
    1566             : {
    1567           0 :     bIsHidden = false;
    1568           0 : }
    1569             : 
    1570           0 : OUString SwHiddenParaField::Expand() const
    1571             : {
    1572           0 :     return OUString();
    1573             : }
    1574             : 
    1575           0 : SwField* SwHiddenParaField::Copy() const
    1576             : {
    1577           0 :     SwHiddenParaField* pField = new SwHiddenParaField(static_cast<SwHiddenParaFieldType*>(GetTyp()), aCond);
    1578           0 :     pField->bIsHidden = bIsHidden;
    1579             : 
    1580           0 :     return pField;
    1581             : }
    1582             : 
    1583           0 : bool SwHiddenParaField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    1584             : {
    1585           0 :     switch ( nWhichId )
    1586             :     {
    1587             :     case FIELD_PROP_PAR1:
    1588           0 :         rAny <<= aCond;
    1589           0 :         break;
    1590             :     case  FIELD_PROP_BOOL1:
    1591           0 :         rAny <<= bIsHidden;
    1592           0 :         break;
    1593             : 
    1594             :     default:
    1595             :         OSL_FAIL("illegal property");
    1596             :     }
    1597           0 :     return true;
    1598             : }
    1599             : 
    1600           0 : bool SwHiddenParaField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    1601             : {
    1602           0 :     switch ( nWhichId )
    1603             :     {
    1604             :     case FIELD_PROP_PAR1:
    1605           0 :         rAny >>= aCond;
    1606           0 :         break;
    1607             :     case FIELD_PROP_BOOL1:
    1608           0 :         bIsHidden = *static_cast<sal_Bool const *>(rAny.getValue());
    1609           0 :         break;
    1610             : 
    1611             :     default:
    1612             :         OSL_FAIL("illegal property");
    1613             :     }
    1614           0 :     return true;
    1615             : }
    1616             : 
    1617             : /// set condition
    1618           0 : void SwHiddenParaField::SetPar1(const OUString& rStr)
    1619             : {
    1620           0 :     aCond = rStr;
    1621           0 : }
    1622             : 
    1623           0 : OUString SwHiddenParaField::GetPar1() const
    1624             : {
    1625           0 :     return aCond;
    1626             : }
    1627             : 
    1628             : // PostIt field type
    1629             : 
    1630        2958 : SwPostItFieldType::SwPostItFieldType(SwDoc *pDoc)
    1631             :     : SwFieldType( RES_POSTITFLD )
    1632        2958 :     , mpDoc(pDoc)
    1633        2958 : {}
    1634             : 
    1635           0 : SwFieldType* SwPostItFieldType::Copy() const
    1636             : {
    1637           0 :     return new SwPostItFieldType(mpDoc);
    1638             : }
    1639             : 
    1640             : // PostIt field
    1641             : 
    1642         716 : SwPostItField::SwPostItField( SwPostItFieldType* pT,
    1643             :         const OUString& rAuthor,
    1644             :         const OUString& rText,
    1645             :         const OUString& rInitials,
    1646             :         const OUString& rName,
    1647             :         const DateTime& rDateTime )
    1648             :     : SwField( pT )
    1649             :     , sText( rText )
    1650             :     , sAuthor( rAuthor )
    1651             :     , sInitials( rInitials )
    1652             :     , sName( rName )
    1653             :     , aDateTime( rDateTime )
    1654             :     , mpText( NULL )
    1655         716 :     , m_pTextObject( NULL )
    1656             : {
    1657         716 : }
    1658             : 
    1659        2107 : SwPostItField::~SwPostItField()
    1660             : {
    1661         716 :     if ( m_pTextObject != NULL )
    1662             :     {
    1663          16 :         m_pTextObject->DisposeEditSource();
    1664          16 :         m_pTextObject->release();
    1665             :     }
    1666             : 
    1667         716 :     delete mpText;
    1668        1391 : }
    1669             : 
    1670         173 : OUString SwPostItField::Expand() const
    1671             : {
    1672         173 :     return OUString();
    1673             : }
    1674             : 
    1675           1 : OUString SwPostItField::GetDescription() const
    1676             : {
    1677           1 :     return SW_RES(STR_NOTE);
    1678             : }
    1679             : 
    1680         600 : SwField* SwPostItField::Copy() const
    1681             : {
    1682         600 :     SwPostItField* pRet = new SwPostItField( static_cast<SwPostItFieldType*>(GetTyp()), sAuthor, sText, sInitials, sName,
    1683         600 :                                 aDateTime);
    1684         600 :     if (mpText)
    1685         505 :         pRet->SetTextObject( new OutlinerParaObject(*mpText) );
    1686             : 
    1687             :     // Note: member <m_pTextObject> not copied.
    1688             : 
    1689         600 :     return pRet;
    1690             : }
    1691             : 
    1692             : /// set author
    1693           0 : void SwPostItField::SetPar1(const OUString& rStr)
    1694             : {
    1695           0 :     sAuthor = rStr;
    1696           0 : }
    1697             : 
    1698             : /// get author
    1699         277 : OUString SwPostItField::GetPar1() const
    1700             : {
    1701         277 :     return sAuthor;
    1702             : }
    1703             : 
    1704             : /// set the PostIt's text
    1705          75 : void SwPostItField::SetPar2(const OUString& rStr)
    1706             : {
    1707          75 :     sText = rStr;
    1708          75 : }
    1709             : 
    1710             : /// get the PostIt's text
    1711          84 : OUString SwPostItField::GetPar2() const
    1712             : {
    1713          84 :     return sText;
    1714             : }
    1715             : 
    1716             : 
    1717          45 : void SwPostItField::SetName(const OUString& rName)
    1718             : {
    1719          45 :     sName = rName;
    1720          45 : }
    1721             : 
    1722             : 
    1723             : 
    1724         604 : void SwPostItField::SetTextObject( OutlinerParaObject* pText )
    1725             : {
    1726         604 :     delete mpText;
    1727         604 :     mpText = pText;
    1728         604 : }
    1729             : 
    1730          44 : sal_Int32 SwPostItField::GetNumberOfParagraphs() const
    1731             : {
    1732          44 :     return (mpText) ? mpText->Count() : 1;
    1733             : }
    1734             : 
    1735         163 : bool SwPostItField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    1736             : {
    1737         163 :     switch( nWhichId )
    1738             :     {
    1739             :     case FIELD_PROP_PAR1:
    1740          17 :         rAny <<= sAuthor;
    1741          17 :         break;
    1742             :     case FIELD_PROP_PAR2:
    1743             :         {
    1744          14 :         rAny <<= sText;
    1745          14 :         break;
    1746             :         }
    1747             :     case FIELD_PROP_PAR3:
    1748          25 :         rAny <<= sInitials;
    1749          25 :         break;
    1750             :     case FIELD_PROP_PAR4:
    1751          52 :         rAny <<= sName;
    1752          52 :         break;
    1753             :     case FIELD_PROP_TEXT:
    1754             :         {
    1755          38 :             if ( !m_pTextObject )
    1756             :             {
    1757          16 :                 SwPostItFieldType* pGetType = static_cast<SwPostItFieldType*>(GetTyp());
    1758          16 :                 SwDoc* pDoc = pGetType->GetDoc();
    1759          16 :                 SwTextAPIEditSource* pObj = new SwTextAPIEditSource( pDoc );
    1760          16 :                 const_cast <SwPostItField*> (this)->m_pTextObject = new SwTextAPIObject( pObj );
    1761          16 :                 m_pTextObject->acquire();
    1762             :             }
    1763             : 
    1764          38 :             if ( mpText )
    1765          38 :                 m_pTextObject->SetText( *mpText );
    1766             :             else
    1767           0 :                 m_pTextObject->SetString( sText );
    1768             : 
    1769          38 :             uno::Reference < text::XText > xText( m_pTextObject );
    1770          38 :             rAny <<= xText;
    1771          38 :             break;
    1772             :         }
    1773             :     case FIELD_PROP_DATE:
    1774             :         {
    1775           0 :             css::util::Date aSetDate = aDateTime.GetUNODate();
    1776           0 :             rAny.setValue(&aSetDate, ::cppu::UnoType<util::Date>::get());
    1777             :         }
    1778           0 :         break;
    1779             :     case FIELD_PROP_DATE_TIME:
    1780             :         {
    1781          17 :             rAny <<= aDateTime.GetUNODateTime();
    1782             :         }
    1783          17 :         break;
    1784             :     default:
    1785             :         OSL_FAIL("illegal property");
    1786             :     }
    1787         163 :     return true;
    1788             : }
    1789             : 
    1790           0 : bool SwPostItField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    1791             : {
    1792           0 :     switch( nWhichId )
    1793             :     {
    1794             :     case FIELD_PROP_PAR1:
    1795           0 :         rAny >>= sAuthor;
    1796           0 :         break;
    1797             :     case FIELD_PROP_PAR2:
    1798           0 :         rAny >>= sText;
    1799             :         //#i100374# new string via api, delete complex text object so SwPostItNote picks up the new string
    1800           0 :         if (mpText)
    1801             :         {
    1802           0 :             delete mpText;
    1803           0 :             mpText = 0;
    1804             :         }
    1805           0 :         break;
    1806             :     case FIELD_PROP_PAR3:
    1807           0 :         rAny >>= sInitials;
    1808           0 :         break;
    1809             :     case FIELD_PROP_PAR4:
    1810           0 :         rAny >>= sName;
    1811           0 :         break;
    1812             :     case FIELD_PROP_TEXT:
    1813             :         OSL_FAIL("Not implemented!");
    1814           0 :         break;
    1815             :     case FIELD_PROP_DATE:
    1816           0 :         if( rAny.getValueType() == ::cppu::UnoType<util::Date>::get() )
    1817             :         {
    1818           0 :             util::Date aSetDate = *static_cast<util::Date const *>(rAny.getValue());
    1819           0 :             aDateTime = Date(aSetDate.Day, aSetDate.Month, aSetDate.Year);
    1820             :         }
    1821           0 :         break;
    1822             :     case FIELD_PROP_DATE_TIME:
    1823             :     {
    1824           0 :         util::DateTime aDateTimeValue;
    1825           0 :         if(!(rAny >>= aDateTimeValue))
    1826           0 :             return false;
    1827           0 :         aDateTime = DateTime(aDateTimeValue);
    1828             :     }
    1829           0 :     break;
    1830             :     default:
    1831             :         OSL_FAIL("illegal property");
    1832             :     }
    1833           0 :     return true;
    1834             : }
    1835             : 
    1836             : // extended user information field type
    1837             : 
    1838        2958 : SwExtUserFieldType::SwExtUserFieldType()
    1839        2958 :     : SwFieldType( RES_EXTUSERFLD )
    1840             : {
    1841        2958 : }
    1842             : 
    1843           0 : SwFieldType* SwExtUserFieldType::Copy() const
    1844             : {
    1845           0 :     SwExtUserFieldType* pTyp = new SwExtUserFieldType;
    1846           0 :     return pTyp;
    1847             : }
    1848             : 
    1849          48 : OUString SwExtUserFieldType::Expand(sal_uInt16 nSub, sal_uInt32 )
    1850             : {
    1851          48 :     UserOptToken nRet = static_cast<UserOptToken>(USHRT_MAX);
    1852          48 :     switch(nSub)
    1853             :     {
    1854           0 :     case EU_FIRSTNAME:      nRet = UserOptToken::FirstName; break;
    1855           0 :     case EU_NAME:           nRet = UserOptToken::LastName;  break;
    1856           0 :     case EU_SHORTCUT:       nRet = UserOptToken::ID; break;
    1857             : 
    1858           0 :     case EU_COMPANY:        nRet = UserOptToken::Company;        break;
    1859           8 :     case EU_STREET:         nRet = UserOptToken::Street;         break;
    1860           0 :     case EU_TITLE:          nRet = UserOptToken::Title;          break;
    1861           0 :     case EU_POSITION:       nRet = UserOptToken::Position;       break;
    1862           8 :     case EU_PHONE_PRIVATE:  nRet = UserOptToken::TelephoneHome;    break;
    1863           0 :     case EU_PHONE_COMPANY:  nRet = UserOptToken::TelephoneWork;    break;
    1864           0 :     case EU_FAX:            nRet = UserOptToken::Fax;            break;
    1865           8 :     case EU_EMAIL:          nRet = UserOptToken::Email;          break;
    1866           0 :     case EU_COUNTRY:        nRet = UserOptToken::Country;        break;
    1867           8 :     case EU_ZIP:            nRet = UserOptToken::Zip;            break;
    1868           8 :     case EU_CITY:           nRet = UserOptToken::City;           break;
    1869           8 :     case EU_STATE:          nRet = UserOptToken::State;          break;
    1870           0 :     case EU_FATHERSNAME:    nRet = UserOptToken::FathersName;    break;
    1871           0 :     case EU_APARTMENT:      nRet = UserOptToken::Apartment;      break;
    1872             :     default:             OSL_ENSURE( false, "Field unknown");
    1873             :     }
    1874          48 :     if( static_cast<UserOptToken>(USHRT_MAX) != nRet )
    1875             :     {
    1876          48 :         SvtUserOptions&  rUserOpt = SW_MOD()->GetUserOptions();
    1877          48 :         return rUserOpt.GetToken( nRet );
    1878             :     }
    1879           0 :     return OUString();
    1880             : }
    1881             : 
    1882             : // extended user information field
    1883             : 
    1884          36 : SwExtUserField::SwExtUserField(SwExtUserFieldType* pTyp, sal_uInt16 nSubTyp, sal_uInt32 nFormat) :
    1885          36 :     SwField(pTyp, nFormat), nType(nSubTyp)
    1886             : {
    1887          36 :     aContent = SwExtUserFieldType::Expand(nType, GetFormat());
    1888          36 : }
    1889             : 
    1890          12 : OUString SwExtUserField::Expand() const
    1891             : {
    1892          12 :     if (!IsFixed())
    1893          12 :         const_cast<SwExtUserField*>(this)->aContent = SwExtUserFieldType::Expand(nType, GetFormat());
    1894             : 
    1895          12 :     return aContent;
    1896             : }
    1897             : 
    1898          30 : SwField* SwExtUserField::Copy() const
    1899             : {
    1900          30 :     SwExtUserField* pField = new SwExtUserField(static_cast<SwExtUserFieldType*>(GetTyp()), nType, GetFormat());
    1901          30 :     pField->SetExpansion(aContent);
    1902             : 
    1903          30 :     return pField;
    1904             : }
    1905             : 
    1906          18 : sal_uInt16 SwExtUserField::GetSubType() const
    1907             : {
    1908          18 :     return nType;
    1909             : }
    1910             : 
    1911           0 : void SwExtUserField::SetSubType(sal_uInt16 nSub)
    1912             : {
    1913           0 :     nType = nSub;
    1914           0 : }
    1915             : 
    1916           0 : bool SwExtUserField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    1917             : {
    1918           0 :     switch( nWhichId )
    1919             :     {
    1920             :     case FIELD_PROP_PAR1:
    1921           0 :         rAny <<= aContent;
    1922           0 :         break;
    1923             : 
    1924             :     case FIELD_PROP_USHORT1:
    1925             :         {
    1926           0 :             sal_Int16 nTmp = nType;
    1927           0 :             rAny <<= nTmp;
    1928             :         }
    1929           0 :         break;
    1930             :     case FIELD_PROP_BOOL1:
    1931           0 :         rAny <<= IsFixed();
    1932           0 :         break;
    1933             :     default:
    1934             :         OSL_FAIL("illegal property");
    1935             :     }
    1936           0 :     return true;
    1937             : }
    1938             : 
    1939           0 : bool SwExtUserField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    1940             : {
    1941           0 :     switch( nWhichId )
    1942             :     {
    1943             :     case FIELD_PROP_PAR1:
    1944           0 :         rAny >>= aContent;
    1945           0 :         break;
    1946             : 
    1947             :     case FIELD_PROP_USHORT1:
    1948             :         {
    1949           0 :             sal_Int16 nTmp = 0;
    1950           0 :             rAny >>= nTmp;
    1951           0 :             nType = nTmp;
    1952             :         }
    1953           0 :         break;
    1954             :     case FIELD_PROP_BOOL1:
    1955           0 :         if( *static_cast<sal_Bool const *>(rAny.getValue()) )
    1956           0 :             SetFormat(GetFormat() | AF_FIXED);
    1957             :         else
    1958           0 :             SetFormat(GetFormat() & ~AF_FIXED);
    1959           0 :         break;
    1960             :     default:
    1961             :         OSL_FAIL("illegal property");
    1962             :     }
    1963           0 :     return true;
    1964             : }
    1965             : 
    1966             : // field type for relative page numbers
    1967             : 
    1968        2958 : SwRefPageSetFieldType::SwRefPageSetFieldType()
    1969        2958 :     : SwFieldType( RES_REFPAGESETFLD )
    1970             : {
    1971        2958 : }
    1972             : 
    1973           0 : SwFieldType* SwRefPageSetFieldType::Copy() const
    1974             : {
    1975           0 :     return new SwRefPageSetFieldType;
    1976             : }
    1977             : 
    1978             : // overridden since there is nothing to update
    1979           0 : void SwRefPageSetFieldType::Modify( const SfxPoolItem*, const SfxPoolItem * )
    1980             : {
    1981           0 : }
    1982             : 
    1983             : // field for relative page numbers
    1984             : 
    1985           0 : SwRefPageSetField::SwRefPageSetField( SwRefPageSetFieldType* pTyp,
    1986             :                     short nOff, bool bFlag )
    1987           0 :     : SwField( pTyp ), nOffset( nOff ), bOn( bFlag )
    1988             : {
    1989           0 : }
    1990             : 
    1991           0 : OUString SwRefPageSetField::Expand() const
    1992             : {
    1993           0 :     return OUString();
    1994             : }
    1995             : 
    1996           0 : SwField* SwRefPageSetField::Copy() const
    1997             : {
    1998           0 :     return new SwRefPageSetField( static_cast<SwRefPageSetFieldType*>(GetTyp()), nOffset, bOn );
    1999             : }
    2000             : 
    2001           0 : OUString SwRefPageSetField::GetPar2() const
    2002             : {
    2003           0 :     return OUString::number(GetOffset());
    2004             : }
    2005             : 
    2006           0 : void SwRefPageSetField::SetPar2(const OUString& rStr)
    2007             : {
    2008           0 :     SetOffset( (short) rStr.toInt32() );
    2009           0 : }
    2010             : 
    2011           0 : bool SwRefPageSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    2012             : {
    2013           0 :     switch( nWhichId )
    2014             :     {
    2015             :     case FIELD_PROP_BOOL1:
    2016           0 :         rAny <<= bOn;
    2017           0 :         break;
    2018             :     case FIELD_PROP_USHORT1:
    2019           0 :         rAny <<= (sal_Int16)nOffset;
    2020           0 :         break;
    2021             :     default:
    2022             :         OSL_FAIL("illegal property");
    2023             :     }
    2024           0 :     return true;
    2025             : }
    2026             : 
    2027           0 : bool SwRefPageSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    2028             : {
    2029           0 :     switch( nWhichId )
    2030             :     {
    2031             :     case FIELD_PROP_BOOL1:
    2032           0 :         bOn = *static_cast<sal_Bool const *>(rAny.getValue());
    2033           0 :         break;
    2034             :     case FIELD_PROP_USHORT1:
    2035           0 :         rAny >>=nOffset;
    2036           0 :         break;
    2037             :     default:
    2038             :         OSL_FAIL("illegal property");
    2039             :     }
    2040           0 :     return true;
    2041             : }
    2042             : 
    2043             : // relative page numbers - query field
    2044             : 
    2045        2958 : SwRefPageGetFieldType::SwRefPageGetFieldType( SwDoc* pDc )
    2046        2958 :     : SwFieldType( RES_REFPAGEGETFLD ), pDoc( pDc ), nNumberingType( SVX_NUM_ARABIC )
    2047             : {
    2048        2958 : }
    2049             : 
    2050           0 : SwFieldType* SwRefPageGetFieldType::Copy() const
    2051             : {
    2052           0 :     SwRefPageGetFieldType* pNew = new SwRefPageGetFieldType( pDoc );
    2053           0 :     pNew->nNumberingType = nNumberingType;
    2054           0 :     return pNew;
    2055             : }
    2056             : 
    2057        4236 : void SwRefPageGetFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
    2058             : {
    2059             :     // update all GetReference fields
    2060        4236 :     if( !pNew && !pOld && HasWriterListeners() )
    2061             :     {
    2062             :         // first collect all SetPageRefFields
    2063           0 :         _SetGetExpFields aTmpLst;
    2064           0 :         if( MakeSetList( aTmpLst ) )
    2065             :         {
    2066           0 :             SwIterator<SwFormatField,SwFieldType> aIter( *this );
    2067           0 :             for ( SwFormatField* pFormatField = aIter.First(); pFormatField; pFormatField = aIter.Next() )
    2068             :                     // update only the GetRef fields
    2069           0 :                     if( pFormatField->GetTextField() )
    2070           0 :                         UpdateField( pFormatField->GetTextField(), aTmpLst );
    2071           0 :         }
    2072             :     }
    2073             : 
    2074             :     // forward to text fields, they "expand" the text
    2075        4236 :     NotifyClients( pOld, pNew );
    2076        4236 : }
    2077             : 
    2078           0 : bool SwRefPageGetFieldType::MakeSetList( _SetGetExpFields& rTmpLst )
    2079             : {
    2080           0 :     SwIterator<SwFormatField,SwFieldType> aIter(*pDoc->getIDocumentFieldsAccess().GetSysFieldType( RES_REFPAGESETFLD));
    2081           0 :     for ( SwFormatField* pFormatField = aIter.First(); pFormatField; pFormatField = aIter.Next() )
    2082             :     {
    2083             :             // update only the GetRef fields
    2084           0 :             const SwTextField* pTField = pFormatField->GetTextField();
    2085           0 :             if( pTField )
    2086             :             {
    2087           0 :                 const SwTextNode& rTextNd = pTField->GetTextNode();
    2088             : 
    2089             :                 // Always the first! (in Tab-Headline, header/footer )
    2090           0 :                 Point aPt;
    2091           0 :                 const SwContentFrm* pFrm = rTextNd.getLayoutFrm( rTextNd.GetDoc()->getIDocumentLayoutAccess().GetCurrentLayout(), &aPt, 0, false );
    2092             : 
    2093             :                 _SetGetExpField* pNew;
    2094             : 
    2095           0 :                 if( !pFrm ||
    2096           0 :                      pFrm->IsInDocBody() ||
    2097             :                     // #i31868#
    2098             :                     // Check if pFrm is not yet connected to the layout.
    2099           0 :                     !pFrm->FindPageFrm() )
    2100             :                 {
    2101             :                     //  create index for determination of the TextNode
    2102           0 :                     SwNodeIndex aIdx( rTextNd );
    2103           0 :                     pNew = new _SetGetExpField( aIdx, pTField );
    2104             :                 }
    2105             :                 else
    2106             :                 {
    2107             :                     //  create index for determination of the TextNode
    2108           0 :                     SwPosition aPos( pDoc->GetNodes().GetEndOfPostIts() );
    2109           0 :                     bool const bResult = GetBodyTextNode( *pDoc, aPos, *pFrm );
    2110             :                     OSL_ENSURE(bResult, "where is the Field?");
    2111             :                     (void) bResult; // unused in non-debug
    2112             :                     pNew = new _SetGetExpField( aPos.nNode, pTField,
    2113           0 :                                                 &aPos.nContent );
    2114             :                 }
    2115             : 
    2116           0 :                 if( !rTmpLst.insert( pNew ).second)
    2117           0 :                     delete pNew;
    2118             :             }
    2119             :     }
    2120             : 
    2121           0 :     return !rTmpLst.empty();
    2122             : }
    2123             : 
    2124           0 : void SwRefPageGetFieldType::UpdateField( SwTextField* pTextField,
    2125             :                                         _SetGetExpFields& rSetList )
    2126             : {
    2127           0 :     SwRefPageGetField* pGetField = const_cast<SwRefPageGetField*>(static_cast<const SwRefPageGetField*>(pTextField->GetFormatField().GetField()));
    2128           0 :     pGetField->SetText( OUString() );
    2129             : 
    2130             :     // then search the correct RefPageSet field
    2131           0 :     SwTextNode* pTextNode = &pTextField->GetTextNode();
    2132           0 :     if( pTextNode->StartOfSectionIndex() >
    2133           0 :         pDoc->GetNodes().GetEndOfExtras().GetIndex() )
    2134             :     {
    2135           0 :         SwNodeIndex aIdx( *pTextNode );
    2136           0 :         _SetGetExpField aEndField( aIdx, pTextField );
    2137             : 
    2138           0 :         _SetGetExpFields::const_iterator itLast = rSetList.lower_bound( &aEndField );
    2139             : 
    2140           0 :         if( itLast != rSetList.begin() )
    2141             :         {
    2142           0 :             --itLast;
    2143           0 :             const SwTextField* pRefTextField = (*itLast)->GetTextField();
    2144             :             const SwRefPageSetField* pSetField =
    2145           0 :                         static_cast<const SwRefPageSetField*>(pRefTextField->GetFormatField().GetField());
    2146           0 :             if( pSetField->IsOn() )
    2147             :             {
    2148             :                 // determine the correct offset
    2149           0 :                 Point aPt;
    2150           0 :                 const SwContentFrm* pFrm = pTextNode->getLayoutFrm( pTextNode->GetDoc()->getIDocumentLayoutAccess().GetCurrentLayout(), &aPt, 0, false );
    2151           0 :                 const SwContentFrm* pRefFrm = pRefTextField->GetTextNode().getLayoutFrm( pRefTextField->GetTextNode().GetDoc()->getIDocumentLayoutAccess().GetCurrentLayout(), &aPt, 0, false );
    2152           0 :                 const SwPageFrm* pPgFrm = 0;
    2153           0 :                 const short nDiff = ( pFrm && pRefFrm )
    2154           0 :                         ?   (pPgFrm = pFrm->FindPageFrm())->GetPhyPageNum() -
    2155           0 :                             pRefFrm->FindPageFrm()->GetPhyPageNum() + 1
    2156           0 :                         : 1;
    2157             : 
    2158           0 :                 sal_uInt32 nTmpFormat = SVX_NUM_PAGEDESC == pGetField->GetFormat()
    2159             :                         ? ( !pPgFrm
    2160             :                                 ? (sal_uInt32)SVX_NUM_ARABIC
    2161           0 :                                 : pPgFrm->GetPageDesc()->GetNumType().GetNumberingType() )
    2162           0 :                         : pGetField->GetFormat();
    2163           0 :                 const short nPageNum = std::max<short>(0, pSetField->GetOffset() + nDiff);
    2164           0 :                 pGetField->SetText( FormatNumber( nPageNum, nTmpFormat ) );
    2165             :             }
    2166           0 :         }
    2167             :     }
    2168             :     // start formatting
    2169           0 :     const_cast<SwFormatField&>(pTextField->GetFormatField()).ModifyNotification( 0, 0 );
    2170           0 : }
    2171             : 
    2172             : // queries for relative page numbering
    2173             : 
    2174           0 : SwRefPageGetField::SwRefPageGetField( SwRefPageGetFieldType* pTyp,
    2175             :                                     sal_uInt32 nFormat )
    2176           0 :     : SwField( pTyp, nFormat )
    2177             : {
    2178           0 : }
    2179             : 
    2180           0 : OUString SwRefPageGetField::Expand() const
    2181             : {
    2182           0 :     return sText;
    2183             : }
    2184             : 
    2185           0 : SwField* SwRefPageGetField::Copy() const
    2186             : {
    2187             :     SwRefPageGetField* pCpy = new SwRefPageGetField(
    2188           0 :                         static_cast<SwRefPageGetFieldType*>(GetTyp()), GetFormat() );
    2189           0 :     pCpy->SetText( sText );
    2190           0 :     return pCpy;
    2191             : }
    2192             : 
    2193           0 : void SwRefPageGetField::ChangeExpansion( const SwFrm* pFrm,
    2194             :                                         const SwTextField* pField )
    2195             : {
    2196             :     // only fields in Footer, Header, FootNote, Flys
    2197           0 :     SwRefPageGetFieldType* pGetType = static_cast<SwRefPageGetFieldType*>(GetTyp());
    2198           0 :     SwDoc* pDoc = pGetType->GetDoc();
    2199           0 :     if( pField->GetTextNode().StartOfSectionIndex() >
    2200           0 :         pDoc->GetNodes().GetEndOfExtras().GetIndex() )
    2201           0 :         return;
    2202             : 
    2203           0 :     sText.clear();
    2204             : 
    2205             :     OSL_ENSURE( !pFrm->IsInDocBody(), "Flag incorrect, frame is in DocBody" );
    2206             : 
    2207             :     // collect all SetPageRefFields
    2208           0 :     _SetGetExpFields aTmpLst;
    2209           0 :     if( !pGetType->MakeSetList( aTmpLst ) )
    2210           0 :         return ;
    2211             : 
    2212             :     //  create index for determination of the TextNode
    2213           0 :     SwPosition aPos( SwNodeIndex( pDoc->GetNodes() ) );
    2214           0 :     SwTextNode* pTextNode = const_cast<SwTextNode*>(GetBodyTextNode( *pDoc, aPos, *pFrm ));
    2215             : 
    2216             :     // If no layout exists, ChangeExpansion is called for header and
    2217             :     // footer lines via layout formatting without existing TextNode.
    2218           0 :     if(!pTextNode)
    2219           0 :         return;
    2220             : 
    2221           0 :     _SetGetExpField aEndField( aPos.nNode, pField, &aPos.nContent );
    2222             : 
    2223           0 :     _SetGetExpFields::const_iterator itLast = aTmpLst.lower_bound( &aEndField );
    2224             : 
    2225           0 :     if( itLast == aTmpLst.begin() )
    2226           0 :         return;        // there is no corresponding set-field in front
    2227           0 :     --itLast;
    2228             : 
    2229           0 :     const SwTextField* pRefTextField = (*itLast)->GetTextField();
    2230             :     const SwRefPageSetField* pSetField =
    2231           0 :                         static_cast<const SwRefPageSetField*>(pRefTextField->GetFormatField().GetField());
    2232           0 :     Point aPt;
    2233           0 :     const SwContentFrm* pRefFrm = pRefTextField->GetTextNode().getLayoutFrm( pFrm->getRootFrm(), &aPt, 0, false );
    2234           0 :     if( pSetField->IsOn() && pRefFrm )
    2235             :     {
    2236             :         // determine the correct offset
    2237           0 :         const SwPageFrm* pPgFrm = pFrm->FindPageFrm();
    2238           0 :         const short nDiff = pPgFrm->GetPhyPageNum() -
    2239           0 :                             pRefFrm->FindPageFrm()->GetPhyPageNum() + 1;
    2240             : 
    2241           0 :         SwRefPageGetField* pGetField = const_cast<SwRefPageGetField*>(static_cast<const SwRefPageGetField*>(pField->GetFormatField().GetField()));
    2242           0 :         sal_uInt32 nTmpFormat = SVX_NUM_PAGEDESC == pGetField->GetFormat()
    2243           0 :                             ? pPgFrm->GetPageDesc()->GetNumType().GetNumberingType()
    2244           0 :                             : pGetField->GetFormat();
    2245           0 :         const short nPageNum = std::max<short>(0, pSetField->GetOffset() + nDiff);
    2246           0 :         pGetField->SetText( FormatNumber( nPageNum, nTmpFormat ) );
    2247           0 :     }
    2248             : }
    2249             : 
    2250           0 : bool SwRefPageGetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    2251             : {
    2252           0 :     switch( nWhichId )
    2253             :     {
    2254             :         case FIELD_PROP_USHORT1:
    2255           0 :             rAny <<= (sal_Int16)GetFormat();
    2256           0 :         break;
    2257             :         case FIELD_PROP_PAR1:
    2258           0 :             rAny <<= sText;
    2259           0 :         break;
    2260             :         default:
    2261             :             OSL_FAIL("illegal property");
    2262             :     }
    2263           0 :     return true;
    2264             : }
    2265             : 
    2266           0 : bool SwRefPageGetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    2267             : {
    2268           0 :     switch( nWhichId )
    2269             :     {
    2270             :         case FIELD_PROP_USHORT1:
    2271             :         {
    2272           0 :             sal_Int16 nSet = 0;
    2273           0 :             rAny >>= nSet;
    2274           0 :             if(nSet <= SVX_NUM_PAGEDESC )
    2275           0 :                 SetFormat(nSet);
    2276             :             else {
    2277             :             }
    2278             :         }
    2279           0 :         break;
    2280             :         case FIELD_PROP_PAR1:
    2281           0 :             rAny >>= sText;
    2282           0 :         break;
    2283             :     default:
    2284             :         OSL_FAIL("illegal property");
    2285             :     }
    2286           0 :     return true;
    2287             : }
    2288             : 
    2289             : // field type to jump to and edit
    2290             : 
    2291        2958 : SwJumpEditFieldType::SwJumpEditFieldType( SwDoc* pD )
    2292        2958 :     : SwFieldType( RES_JUMPEDITFLD ), pDoc( pD ), aDep( this, 0 )
    2293             : {
    2294        2958 : }
    2295             : 
    2296           0 : SwFieldType* SwJumpEditFieldType::Copy() const
    2297             : {
    2298           0 :     return new SwJumpEditFieldType( pDoc );
    2299             : }
    2300             : 
    2301          14 : SwCharFormat* SwJumpEditFieldType::GetCharFormat()
    2302             : {
    2303          14 :     SwCharFormat* pFormat = pDoc->getIDocumentStylePoolAccess().GetCharFormatFromPool( RES_POOLCHR_JUMPEDIT );
    2304             : 
    2305             :     // not registered yet?
    2306          14 :     if( !aDep.GetRegisteredIn() )
    2307           2 :         pFormat->Add( &aDep );     // register
    2308             : 
    2309          14 :     return pFormat;
    2310             : }
    2311             : 
    2312         196 : SwJumpEditField::SwJumpEditField( SwJumpEditFieldType* pTyp, sal_uInt32 nForm,
    2313             :                                 const OUString& rText, const OUString& rHelp )
    2314         196 :     : SwField( pTyp, nForm ), sText( rText ), sHelp( rHelp )
    2315             : {
    2316         196 : }
    2317             : 
    2318          48 : OUString SwJumpEditField::Expand() const
    2319             : {
    2320          48 :     return "<" + sText + ">";
    2321             : }
    2322             : 
    2323         162 : SwField* SwJumpEditField::Copy() const
    2324             : {
    2325         324 :     return new SwJumpEditField( static_cast<SwJumpEditFieldType*>(GetTyp()), GetFormat(),
    2326         324 :                                 sText, sHelp );
    2327             : }
    2328             : 
    2329             : /// get place holder text
    2330          27 : OUString SwJumpEditField::GetPar1() const
    2331             : {
    2332          27 :     return sText;
    2333             : }
    2334             : 
    2335             : /// set place holder text
    2336           0 : void SwJumpEditField::SetPar1(const OUString& rStr)
    2337             : {
    2338           0 :     sText = rStr;
    2339           0 : }
    2340             : 
    2341             : /// get hint text
    2342          39 : OUString SwJumpEditField::GetPar2() const
    2343             : {
    2344          39 :     return sHelp;
    2345             : }
    2346             : 
    2347             : /// set hint text
    2348           0 : void SwJumpEditField::SetPar2(const OUString& rStr)
    2349             : {
    2350           0 :     sHelp = rStr;
    2351           0 : }
    2352             : 
    2353           0 : bool SwJumpEditField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
    2354             : {
    2355           0 :     switch( nWhichId )
    2356             :     {
    2357             :     case FIELD_PROP_USHORT1:
    2358             :         {
    2359             :             sal_Int16 nRet;
    2360           0 :             switch( GetFormat() )
    2361             :             {
    2362           0 :             case JE_FMT_TABLE:  nRet = text::PlaceholderType::TABLE; break;
    2363           0 :             case JE_FMT_FRAME:  nRet = text::PlaceholderType::TEXTFRAME; break;
    2364           0 :             case JE_FMT_GRAPHIC:nRet = text::PlaceholderType::GRAPHIC; break;
    2365           0 :             case JE_FMT_OLE:    nRet = text::PlaceholderType::OBJECT; break;
    2366             :             default:
    2367           0 :                 nRet = text::PlaceholderType::TEXT; break;
    2368             :             }
    2369           0 :             rAny <<= nRet;
    2370             :         }
    2371           0 :         break;
    2372             :     case FIELD_PROP_PAR1 :
    2373           0 :         rAny <<= sHelp;
    2374           0 :         break;
    2375             :     case FIELD_PROP_PAR2 :
    2376           0 :          rAny <<= sText;
    2377           0 :          break;
    2378             :     default:
    2379             :         OSL_FAIL("illegal property");
    2380             :     }
    2381           0 :     return true;
    2382             : }
    2383             : 
    2384           0 : bool SwJumpEditField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
    2385             : {
    2386           0 :     switch( nWhichId )
    2387             :     {
    2388             :     case FIELD_PROP_USHORT1:
    2389             :         {
    2390             :             //JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
    2391             :             //              called with a int32 value! But normally we need
    2392             :             //              here only a int16
    2393           0 :             sal_Int32 nSet = 0;
    2394           0 :             rAny >>= nSet;
    2395           0 :             switch( nSet )
    2396             :             {
    2397           0 :                 case text::PlaceholderType::TEXT     : SetFormat(JE_FMT_TEXT); break;
    2398           0 :                 case text::PlaceholderType::TABLE    : SetFormat(JE_FMT_TABLE); break;
    2399           0 :                 case text::PlaceholderType::TEXTFRAME: SetFormat(JE_FMT_FRAME); break;
    2400           0 :                 case text::PlaceholderType::GRAPHIC  : SetFormat(JE_FMT_GRAPHIC); break;
    2401           0 :                 case text::PlaceholderType::OBJECT   : SetFormat(JE_FMT_OLE); break;
    2402             :             }
    2403             :         }
    2404           0 :         break;
    2405             :     case FIELD_PROP_PAR1 :
    2406           0 :         rAny >>= sHelp;
    2407           0 :         break;
    2408             :     case FIELD_PROP_PAR2 :
    2409           0 :          rAny >>= sText;
    2410           0 :          break;
    2411             :     default:
    2412             :         OSL_FAIL("illegal property");
    2413             :     }
    2414           0 :     return true;
    2415             : }
    2416             : 
    2417             : // combined character field type
    2418             : 
    2419        2958 : SwCombinedCharFieldType::SwCombinedCharFieldType()
    2420        2958 :     : SwFieldType( RES_COMBINED_CHARS )
    2421             : {
    2422        2958 : }
    2423             : 
    2424           0 : SwFieldType* SwCombinedCharFieldType::Copy() const
    2425             : {
    2426           0 :     return new SwCombinedCharFieldType;
    2427             : }
    2428             : 
    2429             : // combined character field
    2430             : 
    2431           0 : SwCombinedCharField::SwCombinedCharField( SwCombinedCharFieldType* pFTyp,
    2432             :                                             const OUString& rChars )
    2433             :     : SwField( pFTyp, 0 ),
    2434           0 :     sCharacters( rChars.copy( 0, std::min<sal_Int32>(rChars.getLength(), MAX_COMBINED_CHARACTERS) ))
    2435             : {
    2436           0 : }
    2437             : 
    2438           0 : OUString SwCombinedCharField::Expand() const
    2439             : {
    2440           0 :     return sCharacters;
    2441             : }
    2442             : 
    2443           0 : SwField* SwCombinedCharField::Copy() const
    2444             : {
    2445           0 :     return new SwCombinedCharField( static_cast<SwCombinedCharFieldType*>(GetTyp()),
    2446           0 :                                         sCharacters );
    2447             : }
    2448             : 
    2449           0 : OUString SwCombinedCharField::GetPar1() const
    2450             : {
    2451           0 :     return sCharacters;
    2452             : }
    2453             : 
    2454           0 : void SwCombinedCharField::SetPar1(const OUString& rStr)
    2455             : {
    2456           0 :     sCharacters = rStr.copy(0, std::min<sal_Int32>(rStr.getLength(), MAX_COMBINED_CHARACTERS));
    2457           0 : }
    2458             : 
    2459           0 : bool SwCombinedCharField::QueryValue( uno::Any& rAny,
    2460             :                                         sal_uInt16 nWhichId ) const
    2461             : {
    2462           0 :     switch( nWhichId )
    2463             :     {
    2464             :     case FIELD_PROP_PAR1:
    2465           0 :         rAny <<= sCharacters;
    2466           0 :         break;
    2467             :     default:
    2468             :         OSL_FAIL("illegal property");
    2469             :     }
    2470           0 :     return true;
    2471             : }
    2472             : 
    2473           0 : bool SwCombinedCharField::PutValue( const uno::Any& rAny,
    2474             :                                         sal_uInt16 nWhichId )
    2475             : {
    2476           0 :     switch( nWhichId )
    2477             :     {
    2478             :         case FIELD_PROP_PAR1:
    2479             :         {
    2480           0 :             OUString sTmp;
    2481           0 :             rAny >>= sTmp;
    2482           0 :             SetPar1(sTmp);
    2483             :         }
    2484           0 :         break;
    2485             :         default:
    2486             :             OSL_FAIL("illegal property");
    2487             :     }
    2488           0 :     return true;
    2489         177 : }
    2490             : 
    2491             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11