LCOV - code coverage report
Current view: top level - sw/source/core/txtnode - atrfld.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 218 280 77.9 %
Date: 2015-06-13 12:38:46 Functions: 43 52 82.7 %
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 "fldbas.hxx"
      21             : #include <fmtfld.hxx>
      22             : #include <txtfld.hxx>
      23             : #include <txtannotationfld.hxx>
      24             : #include <docfld.hxx>
      25             : #include <docufld.hxx>
      26             : #include <doc.hxx>
      27             : 
      28             : #include "pam.hxx"
      29             : #include "reffld.hxx"
      30             : #include "ddefld.hxx"
      31             : #include "usrfld.hxx"
      32             : #include "expfld.hxx"
      33             : #include "swfont.hxx"
      34             : #include "ndtxt.hxx"
      35             : #include "calc.hxx"
      36             : #include "hints.hxx"
      37             : #include <IDocumentFieldsAccess.hxx>
      38             : #include <fieldhint.hxx>
      39             : #include <svl/smplhint.hxx>
      40             : 
      41       38747 : TYPEINIT3(SwFormatField, SfxPoolItem, SwModify, SfxBroadcaster)
      42             : 
      43             : // constructor for default item in attribute-pool
      44         177 : SwFormatField::SwFormatField( sal_uInt16 nWhich )
      45             :     : SfxPoolItem( nWhich )
      46             :     , SwModify(0)
      47             :     , SfxBroadcaster()
      48             :     , mpField( NULL )
      49         177 :     , mpTextField( NULL )
      50             : {
      51         177 : }
      52             : 
      53        1325 : SwFormatField::SwFormatField( const SwField &rField )
      54             :     : SfxPoolItem( RES_TXTATR_FIELD )
      55        1325 :     , SwModify( rField.GetTyp() )
      56             :     , SfxBroadcaster()
      57        1325 :     , mpField( rField.CopyField() )
      58        3975 :     , mpTextField( NULL )
      59             : {
      60        1325 :     if ( GetField()->GetTyp()->Which() == RES_INPUTFLD )
      61             :     {
      62             :         // input field in-place editing
      63          14 :         SetWhich( RES_TXTATR_INPUTFIELD );
      64          14 :         static_cast<SwInputField*>(GetField())->SetFormatField( *this );
      65             :     }
      66        1311 :     else if (GetField()->GetTyp()->Which() == RES_SETEXPFLD)
      67             :     {
      68             :         // see SwWrtShell::StartInputFieldDlg
      69          62 :         static_cast<SwSetExpField *>(GetField())->SetFormatField(*this);
      70             :     }
      71        1249 :     else if ( GetField()->GetTyp()->Which() == RES_POSTITFLD )
      72             :     {
      73             :         // text annotation field
      74         135 :         SetWhich( RES_TXTATR_ANNOTATION );
      75             :     }
      76        1325 : }
      77             : 
      78             : // #i24434#
      79             : // Since Items are used in ItemPool and in default constructed ItemSets with
      80             : // full pool range, all items need to be clonable. Thus, this one needed to be
      81             : // corrected
      82        5112 : SwFormatField::SwFormatField( const SwFormatField& rAttr )
      83             :     : SfxPoolItem( RES_TXTATR_FIELD )
      84             :     , SwModify(0)
      85             :     , SfxBroadcaster()
      86             :     , mpField( NULL )
      87        5112 :     , mpTextField( NULL )
      88             : {
      89        5112 :     if ( rAttr.GetField() )
      90             :     {
      91        5112 :         rAttr.GetField()->GetTyp()->Add(this);
      92        5112 :         mpField = rAttr.GetField()->CopyField();
      93        5112 :         if ( GetField()->GetTyp()->Which() == RES_INPUTFLD )
      94             :         {
      95             :             // input field in-place editing
      96         158 :             SetWhich( RES_TXTATR_INPUTFIELD );
      97         158 :             SwInputField *pField = dynamic_cast<SwInputField*>(GetField());
      98             :             assert(pField);
      99         158 :             if (pField)
     100         158 :                 pField->SetFormatField( *this );
     101             :         }
     102        4954 :         else if (GetField()->GetTyp()->Which() == RES_SETEXPFLD)
     103             :         {
     104             :             // see SwWrtShell::StartInputFieldDlg
     105         188 :             static_cast<SwSetExpField *>(GetField())->SetFormatField(*this);
     106             :         }
     107        4766 :         else if ( GetField()->GetTyp()->Which() == RES_POSTITFLD )
     108             :         {
     109             :             // text annotation field
     110         447 :             SetWhich( RES_TXTATR_ANNOTATION );
     111             :         }
     112             :     }
     113        5112 : }
     114             : 
     115       18535 : SwFormatField::~SwFormatField()
     116             : {
     117        6603 :     SwFieldType* pType = mpField ? mpField->GetTyp() : 0;
     118             : 
     119        6603 :     if (pType && pType->Which() == RES_DBFLD)
     120         419 :         pType = 0;  // DB-Feldtypen zerstoeren sich selbst
     121             : 
     122        6603 :     Broadcast( SwFormatFieldHint( this, SwFormatFieldHintWhich::REMOVED ) );
     123        6603 :     delete mpField;
     124             : 
     125             :     // bei einige FeldTypen muessen wir den FeldTypen noch loeschen
     126        6603 :     if( pType && pType->HasOnlyOneListener() )
     127             :     {
     128         403 :         bool bDel = false;
     129         403 :         switch( pType->Which() )
     130             :         {
     131             :         case RES_USERFLD:
     132           2 :             bDel = static_cast<SwUserFieldType*>(pType)->IsDeleted();
     133           2 :             break;
     134             : 
     135             :         case RES_SETEXPFLD:
     136          34 :             bDel = static_cast<SwSetExpFieldType*>(pType)->IsDeleted();
     137          34 :             break;
     138             : 
     139             :         case RES_DDEFLD:
     140           0 :             bDel = static_cast<SwDDEFieldType*>(pType)->IsDeleted();
     141           0 :             break;
     142             :         }
     143             : 
     144         403 :         if( bDel )
     145             :         {
     146             :             // vorm loeschen erstmal austragen
     147           0 :             pType->Remove( this );
     148           0 :             delete pType;
     149             :         }
     150             :     }
     151       11932 : }
     152             : 
     153           0 : void SwFormatField::RegisterToFieldType( SwFieldType& rType )
     154             : {
     155           0 :     rType.Add(this);
     156           0 : }
     157             : 
     158             : // #111840#
     159           0 : void SwFormatField::SetField(SwField * _pField)
     160             : {
     161           0 :     delete mpField;
     162             : 
     163           0 :     mpField = _pField;
     164           0 :     if ( GetField()->GetTyp()->Which() == RES_INPUTFLD )
     165             :     {
     166           0 :         static_cast<SwInputField* >(GetField())->SetFormatField( *this );
     167             :     }
     168           0 :     else if (GetField()->GetTyp()->Which() == RES_SETEXPFLD)
     169             :     {
     170             :         // see SwWrtShell::StartInputFieldDlg
     171           0 :         static_cast<SwSetExpField *>(GetField())->SetFormatField(*this);
     172             :     }
     173           0 :     Broadcast( SwFormatFieldHint( this, SwFormatFieldHintWhich::CHANGED ) );
     174           0 : }
     175             : 
     176        2040 : void SwFormatField::SetTextField( SwTextField& rTextField )
     177             : {
     178        2040 :     mpTextField = &rTextField;
     179        2040 : }
     180             : 
     181        2031 : void SwFormatField::ClearTextField()
     182             : {
     183        2031 :     mpTextField = NULL;
     184        2031 : }
     185             : 
     186          13 : bool SwFormatField::operator==( const SfxPoolItem& rAttr ) const
     187             : {
     188             :     assert(SfxPoolItem::operator==(rAttr));
     189          13 :     return ( ( mpField && static_cast<const SwFormatField&>(rAttr).GetField()
     190           0 :                && mpField->GetTyp() == static_cast<const SwFormatField&>(rAttr).GetField()->GetTyp()
     191           0 :                && mpField->GetFormat() == static_cast<const SwFormatField&>(rAttr).GetField()->GetFormat() ) )
     192          26 :              || ( !mpField && !static_cast<const SwFormatField&>(rAttr).GetField() );
     193             : }
     194             : 
     195        5112 : SfxPoolItem* SwFormatField::Clone( SfxItemPool* ) const
     196             : {
     197        5112 :     return new SwFormatField( *this );
     198             : }
     199             : 
     200        2031 : void SwFormatField::InvalidateField()
     201             : {
     202             :     SwPtrMsgPoolItem const item(RES_REMOVE_UNO_OBJECT,
     203        2031 :             &static_cast<SwModify&>(*this)); // cast to base class (void*)
     204        2031 :     NotifyClients(&item, &item);
     205        2031 : }
     206             : 
     207        1778 : void SwFormatField::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
     208             : {
     209        1778 :     SwClient::SwClientNotify(rModify, rHint);
     210        1778 :     if( !mpTextField )
     211        1949 :         return;
     212             : 
     213        1607 :     const SwFieldHint* pHint = dynamic_cast<const SwFieldHint*>( &rHint );
     214        1607 :     if ( pHint )
     215             :     {
     216             :         // replace field content by text
     217           0 :         SwPaM* pPaM = pHint->GetPaM();
     218           0 :         SwDoc* pDoc = pPaM->GetDoc();
     219           0 :         const SwTextNode& rTextNode = mpTextField->GetTextNode();
     220           0 :         pPaM->GetPoint()->nNode = rTextNode;
     221           0 :         pPaM->GetPoint()->nContent.Assign( const_cast<SwTextNode*>(&rTextNode), mpTextField->GetStart() );
     222             : 
     223           0 :         OUString const aEntry( GetField()->ExpandField( pDoc->IsClipBoard() ) );
     224           0 :         pPaM->SetMark();
     225           0 :         pPaM->Move( fnMoveForward );
     226           0 :         pDoc->getIDocumentContentOperations().DeleteRange( *pPaM );
     227           0 :         pDoc->getIDocumentContentOperations().InsertString( *pPaM, aEntry );
     228             :     }
     229             : }
     230             : 
     231        1909 : void SwFormatField::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
     232             : {
     233        1909 :     if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which()))
     234             :     {   // invalidate cached UNO object
     235           0 :         SetXTextField(css::uno::Reference<css::text::XTextField>(0));
     236             :         // ??? why does this Modify method not already do this?
     237           0 :         NotifyClients(pOld, pNew);
     238           0 :         return;
     239             :     }
     240             : 
     241        1909 :     if( !mpTextField )
     242         171 :         return;
     243             : 
     244             :     // don't do anything, especially not expand!
     245        1738 :     if( pNew && pNew->Which() == RES_OBJECTDYING )
     246           0 :         return;
     247             : 
     248        1738 :     SwTextNode* pTextNd = &mpTextField->GetTextNode();
     249             :     OSL_ENSURE( pTextNd, "wo ist denn mein Node?" );
     250        1738 :     if( pNew )
     251             :     {
     252         423 :         switch( pNew->Which() )
     253             :         {
     254             :         case RES_TXTATR_FLDCHG:
     255             :                 // "Farbe hat sich geaendert !"
     256             :                 // this, this fuer "nur Painten"
     257           0 :                 pTextNd->ModifyNotification( this, this );
     258           0 :                 return;
     259             :         case RES_REFMARKFLD_UPDATE:
     260             :                 // GetReferenz-Felder aktualisieren
     261           0 :                 if( RES_GETREFFLD == GetField()->GetTyp()->Which() )
     262             :                 {
     263             :                     // #i81002#
     264           0 :                     static_cast<SwGetRefField*>(GetField())->UpdateField( mpTextField );
     265             :                 }
     266           0 :                 break;
     267             :         case RES_DOCPOS_UPDATE:
     268             :                 // Je nach DocPos aktualisieren (SwTextFrm::Modify())
     269         396 :                 pTextNd->ModifyNotification( pNew, this );
     270         396 :                 return;
     271             : 
     272             :         case RES_ATTRSET_CHG:
     273             :         case RES_FMT_CHG:
     274          27 :                 pTextNd->ModifyNotification( pOld, pNew );
     275          27 :                 return;
     276             :         default:
     277           0 :                 break;
     278             :         }
     279             :     }
     280             : 
     281        1315 :     switch (GetField()->GetTyp()->Which())
     282             :     {
     283             :         case RES_HIDDENPARAFLD:
     284           0 :             if( !pOld || RES_HIDDENPARA_PRINT != pOld->Which() )
     285           0 :                 break;
     286             :         case RES_DBSETNUMBERFLD:
     287             :         case RES_DBNUMSETFLD:
     288             :         case RES_DBNEXTSETFLD:
     289             :         case RES_DBNAMEFLD:
     290           0 :             pTextNd->ModifyNotification( 0, pNew);
     291           0 :             return;
     292             :     }
     293             : 
     294        1315 :     if( RES_USERFLD == GetField()->GetTyp()->Which() )
     295             :     {
     296           0 :         SwUserFieldType* pType = static_cast<SwUserFieldType*>(GetField()->GetTyp());
     297           0 :         if(!pType->IsValid())
     298             :         {
     299           0 :             SwCalc aCalc( *pTextNd->GetDoc() );
     300           0 :             pType->GetValue( aCalc );
     301             :         }
     302             :     }
     303             : 
     304        1315 :     const bool bForceNotify = (pOld == NULL) && (pNew == NULL);
     305        1315 :     mpTextField->ExpandTextField( bForceNotify );
     306             : }
     307             : 
     308          23 : bool SwFormatField::GetInfo( SfxPoolItem& rInfo ) const
     309             : {
     310             :     const SwTextNode* pTextNd;
     311          69 :     if( RES_AUTOFMT_DOCNODE != rInfo.Which() ||
     312          69 :         !mpTextField || 0 == ( pTextNd = mpTextField->GetpTextNode() ) ||
     313          23 :         &pTextNd->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes )
     314           0 :         return true;
     315             : 
     316          23 :     static_cast<SwAutoFormatGetDocNode&>(rInfo).pContentNode = pTextNd;
     317          23 :     return false;
     318             : }
     319             : 
     320        1518 : bool SwFormatField::IsFieldInDoc() const
     321             : {
     322        1518 :     return mpTextField != NULL
     323        1518 :            && mpTextField->IsFieldInDoc();
     324             : }
     325             : 
     326           0 : bool SwFormatField::IsProtect() const
     327             : {
     328           0 :     return mpTextField != NULL
     329           0 :            && mpTextField->GetpTextNode() != NULL
     330           0 :            && mpTextField->GetpTextNode()->IsProtect();
     331             : }
     332             : 
     333             : // class SwTextField ////////////////////////////////////////////////////
     334             : 
     335        2040 : SwTextField::SwTextField(
     336             :     SwFormatField & rAttr,
     337             :     sal_Int32 const nStartPos,
     338             :     bool const bInClipboard)
     339             :     : SwTextAttr( rAttr, nStartPos )
     340             : // fdo#39694 the ExpandField here may not give the correct result in all cases,
     341             : // but is better than nothing
     342             :     , m_aExpand( rAttr.GetField()->ExpandField(bInClipboard) )
     343        2040 :     , m_pTextNode( NULL )
     344             : {
     345        2040 :     rAttr.SetTextField( *this );
     346        2040 :     SetHasDummyChar(true);
     347        2040 : }
     348             : 
     349        7810 : SwTextField::~SwTextField( )
     350             : {
     351        2031 :     SwFormatField & rFormatField( static_cast<SwFormatField &>(GetAttr()) );
     352        2031 :     if ( this == rFormatField.GetTextField() )
     353             :     {
     354        2031 :         rFormatField.ClearTextField();
     355             :     }
     356        5779 : }
     357             : 
     358        1542 : bool SwTextField::IsFieldInDoc() const
     359             : {
     360        1542 :     return GetpTextNode() != NULL
     361        1542 :            && GetpTextNode()->GetNodes().IsDocNodes();
     362             : }
     363             : 
     364        1561 : void SwTextField::ExpandTextField(const bool bForceNotify) const
     365             : {
     366             :     OSL_ENSURE( m_pTextNode, "SwTextField: where is my TextNode?" );
     367             : 
     368        1561 :     const SwField* pField = GetFormatField().GetField();
     369        1561 :     const OUString aNewExpand( pField->ExpandField(m_pTextNode->GetDoc()->IsClipBoard()) );
     370             : 
     371        1561 :     if (aNewExpand == m_aExpand)
     372             :     {
     373             :         // Bei Seitennummernfeldern
     374        1339 :         const sal_uInt16 nWhich = pField->GetTyp()->Which();
     375        1339 :         if ( RES_CHAPTERFLD != nWhich
     376        1339 :              && RES_PAGENUMBERFLD != nWhich
     377        1294 :              && RES_REFPAGEGETFLD != nWhich
     378             :              // Page count fields to not use aExpand during formatting,
     379             :              // therefore an invalidation of the text frame has to be triggered even if aNewExpand == aExpand:
     380        1294 :              && ( RES_DOCSTATFLD != nWhich || DS_PAGE != static_cast<const SwDocStatField*>(pField)->GetSubType() )
     381        2578 :              && ( RES_GETEXPFLD != nWhich || static_cast<const SwGetExpField*>(pField)->IsInBodyText() ) )
     382             :         {
     383        1239 :             if( m_pTextNode->CalcHiddenParaField() )
     384             :             {
     385           0 :                 m_pTextNode->ModifyNotification( 0, 0 );
     386             :             }
     387        1239 :             if ( !bForceNotify )
     388             :             {
     389             :                 // done, if no further notification forced.
     390        1726 :                 return;
     391             :             }
     392             :         }
     393             :     }
     394             : 
     395        1396 :     m_aExpand = aNewExpand;
     396             : 
     397        1396 :     const_cast<SwTextField*>(this)->NotifyContentChange( const_cast<SwFormatField&>(GetFormatField()) );
     398             : }
     399             : 
     400          53 : void SwTextField::CopyTextField( SwTextField *pDest ) const
     401             : {
     402             :     OSL_ENSURE( m_pTextNode, "SwTextField: where is my TextNode?" );
     403             :     OSL_ENSURE( pDest->m_pTextNode, "SwTextField: where is pDest's TextNode?" );
     404             : 
     405          53 :     IDocumentFieldsAccess* pIDFA = m_pTextNode->getIDocumentFieldsAccess();
     406          53 :     IDocumentFieldsAccess* pDestIDFA = pDest->m_pTextNode->getIDocumentFieldsAccess();
     407             : 
     408          53 :     SwFormatField& rDestFormatField = (SwFormatField&)pDest->GetFormatField();
     409          53 :     const sal_uInt16 nFieldWhich = rDestFormatField.GetField()->GetTyp()->Which();
     410             : 
     411          53 :     if( pIDFA != pDestIDFA )
     412             :     {
     413             :         // Die Hints stehen in unterschiedlichen Dokumenten,
     414             :         // der Feldtyp muss im neuen Dokument angemeldet werden.
     415             :         // Z.B: Kopieren ins ClipBoard.
     416             :         SwFieldType* pFieldType;
     417          53 :         if( nFieldWhich != RES_DBFLD
     418          12 :             && nFieldWhich != RES_USERFLD
     419          12 :             && nFieldWhich != RES_SETEXPFLD
     420          12 :             && nFieldWhich != RES_DDEFLD
     421          12 :             && RES_AUTHORITY != nFieldWhich )
     422             :         {
     423          12 :             pFieldType = pDestIDFA->GetSysFieldType( nFieldWhich );
     424             :         }
     425             :         else
     426             :         {
     427          41 :             pFieldType = pDestIDFA->InsertFieldType( *rDestFormatField.GetField()->GetTyp() );
     428             :         }
     429             : 
     430             :         // Sonderbehandlung fuer DDE-Felder
     431          53 :         if( RES_DDEFLD == nFieldWhich )
     432             :         {
     433           0 :             if( rDestFormatField.GetTextField() )
     434             :             {
     435           0 :                 static_cast<SwDDEFieldType*>(rDestFormatField.GetField()->GetTyp())->DecRefCnt();
     436             :             }
     437           0 :             static_cast<SwDDEFieldType*>(pFieldType)->IncRefCnt();
     438             :         }
     439             : 
     440             :         OSL_ENSURE( pFieldType, "unbekannter FieldType" );
     441          53 :         pFieldType->Add( &rDestFormatField );          // ummelden
     442          53 :         rDestFormatField.GetField()->ChgTyp( pFieldType );
     443             :     }
     444             : 
     445             :     // Expressionfelder Updaten
     446          53 :     if( nFieldWhich == RES_SETEXPFLD
     447          53 :         || nFieldWhich == RES_GETEXPFLD
     448          53 :         || nFieldWhich == RES_HIDDENTXTFLD )
     449             :     {
     450           0 :         SwTextField* pField = const_cast<SwTextField*>(this);
     451           0 :         pDestIDFA->UpdateExpFields( pField, true );
     452             :     }
     453             :     // Tabellenfelder auf externe Darstellung
     454          53 :     else if( RES_TABLEFLD == nFieldWhich
     455          53 :              && static_cast<SwTableField*>(rDestFormatField.GetField())->IsIntrnlName() )
     456             :     {
     457             :         // erzeuge aus der internen (fuer CORE) die externe (fuer UI) Formel
     458           0 :         const SwTableNode* pTableNd = m_pTextNode->FindTableNode();
     459           0 :         if( pTableNd )        // steht in einer Tabelle
     460           0 :             static_cast<SwTableField*>(rDestFormatField.GetField())->PtrToBoxNm( &pTableNd->GetTable() );
     461             :     }
     462          53 : }
     463             : 
     464        1396 : void SwTextField::NotifyContentChange(SwFormatField& rFormatField)
     465             : {
     466             :     //if not in undo section notify the change
     467        1396 :     if (m_pTextNode && m_pTextNode->GetNodes().IsDocNodes())
     468             :     {
     469        1396 :         m_pTextNode->ModifyNotification(0, &rFormatField);
     470             :     }
     471        1396 : }
     472             : 
     473             : /*static*/
     474         452 : void SwTextField::GetPamForTextField(
     475             :     const SwTextField& rTextField,
     476             :     boost::shared_ptr< SwPaM >& rPamForTextField )
     477             : {
     478         452 :     if (rTextField.GetpTextNode() == NULL)
     479             :     {
     480             :         SAL_WARN("sw.core", "<SwTextField::GetPamForField> - missing <SwTextNode>");
     481         452 :         return;
     482             :     }
     483             : 
     484         452 :     const SwTextNode& rTextNode = rTextField.GetTextNode();
     485             : 
     486             :     rPamForTextField.reset( new SwPaM( rTextNode,
     487         904 :                                     (rTextField.End() != NULL) ? *(rTextField.End()) : ( rTextField.GetStart() + 1 ),
     488             :                                     rTextNode,
     489         904 :                                     rTextField.GetStart() ) );
     490             : 
     491             : }
     492             : 
     493             : /*static*/
     494           2 : void SwTextField::DeleteTextField( const SwTextField& rTextField )
     495             : {
     496           2 :     if (rTextField.GetpTextNode() != NULL)
     497             :     {
     498           2 :         boost::shared_ptr< SwPaM > pPamForTextField;
     499           2 :         GetPamForTextField(rTextField, pPamForTextField);
     500           2 :         if (pPamForTextField.get() != NULL)
     501             :         {
     502           2 :             rTextField.GetTextNode().GetDoc()->getIDocumentContentOperations().DeleteAndJoin(*pPamForTextField);
     503           2 :         }
     504             :     }
     505           2 : }
     506             : 
     507             : // class SwTextInputField ///////////////////////////////////////////////
     508             : 
     509             : // input field in-place editing
     510          18 : SwTextInputField::SwTextInputField(
     511             :     SwFormatField & rAttr,
     512             :     sal_Int32 const nStart,
     513             :     sal_Int32 const nEnd,
     514             :     bool const bInClipboard )
     515             : 
     516             :     : SwTextAttr( rAttr, nStart )
     517             :     , SwTextAttrNesting( rAttr, nStart, nEnd )
     518             :     , SwTextField( rAttr, nStart, bInClipboard )
     519          18 :     , m_bLockNotifyContentChange( false )
     520             : {
     521          18 :     SetHasDummyChar( false );
     522          18 :     SetHasContent( true );
     523          18 : }
     524             : 
     525          54 : SwTextInputField::~SwTextInputField()
     526             : {
     527          54 : }
     528             : 
     529           9 : void SwTextInputField::LockNotifyContentChange()
     530             : {
     531           9 :     m_bLockNotifyContentChange = true;
     532           9 : }
     533             : 
     534           9 : void SwTextInputField::UnlockNotifyContentChange()
     535             : {
     536           9 :     m_bLockNotifyContentChange = false;
     537           9 : }
     538             : 
     539           9 : void SwTextInputField::NotifyContentChange( SwFormatField& rFormatField )
     540             : {
     541           9 :     if ( !m_bLockNotifyContentChange )
     542             :     {
     543           9 :         LockNotifyContentChange();
     544             : 
     545           9 :         SwTextField::NotifyContentChange( rFormatField );
     546           9 :         UpdateTextNodeContent( GetFieldContent() );
     547             : 
     548           9 :         UnlockNotifyContentChange();
     549             :     }
     550           9 : }
     551             : 
     552          23 : const OUString SwTextInputField::GetFieldContent() const
     553             : {
     554          23 :     return GetFormatField().GetField()->ExpandField(false);
     555             : }
     556             : 
     557          16 : void SwTextInputField::UpdateFieldContent()
     558             : {
     559          32 :     if ( IsFieldInDoc()
     560          16 :          && GetStart() != (*End()) )
     561             :     {
     562             :         OSL_ENSURE( (*End()) - GetStart() >= 2,
     563             :                 "<SwTextInputField::UpdateFieldContent()> - Are CH_TXT_ATR_INPUTFIELDSTART and/or CH_TXT_ATR_INPUTFIELDEND missing?" );
     564             :         // skip CH_TXT_ATR_INPUTFIELDSTART character
     565          16 :         const sal_Int32 nIdx = GetStart() + 1;
     566             :         // skip CH_TXT_ATR_INPUTFIELDEND character
     567          16 :         const sal_Int32 nLen = static_cast<sal_Int32>(std::max<sal_Int32>( 0, ( (*End()) - 1 - nIdx ) ));
     568          16 :         const OUString aNewFieldContent = GetTextNode().GetExpandText( nIdx, nLen );
     569             : 
     570          16 :         const SwInputField* pInputField = dynamic_cast<const SwInputField*>(GetFormatField().GetField());
     571             :         OSL_ENSURE( pInputField != NULL,
     572             :                 "<SwTextInputField::GetContent()> - Missing <SwInputField> instance!" );
     573          16 :         if ( pInputField != NULL )
     574             :         {
     575          16 :             const_cast<SwInputField*>(pInputField)->applyFieldContent( aNewFieldContent );
     576             :             // trigger update of fields for scenarios in which the Input Field's content is part of e.g. a table formula
     577          16 :             GetTextNode().GetDoc()->getIDocumentFieldsAccess().GetUpdateFields().SetFieldsDirty(true);
     578          16 :         }
     579             :     }
     580          16 : }
     581             : 
     582           9 : void SwTextInputField::UpdateTextNodeContent( const OUString& rNewContent )
     583             : {
     584           9 :     if ( !IsFieldInDoc() )
     585             :     {
     586             :         OSL_ENSURE( false, "<SwTextInputField::UpdateTextNodeContent(..)> - misusage as Input Field is not in document content." );
     587           9 :         return;
     588             :     }
     589             : 
     590             :     OSL_ENSURE( (*End()) - GetStart() >= 2,
     591             :             "<SwTextInputField::UpdateTextNodeContent(..)> - Are CH_TXT_ATR_INPUTFIELDSTART and/or CH_TXT_ATR_INPUTFIELDEND missing?" );
     592             :     // skip CH_TXT_ATR_INPUTFIELDSTART character
     593           9 :     const sal_Int32 nIdx = GetStart() + 1;
     594             :     // skip CH_TXT_ATR_INPUTFIELDEND character
     595           9 :     const sal_Int32 nDelLen = std::max<sal_Int32>( 0, ( (*End()) - 1 - nIdx ) );
     596           9 :     SwIndex aIdx( &GetTextNode(), nIdx );
     597           9 :     GetTextNode().ReplaceText( aIdx, nDelLen, rNewContent );
     598             : }
     599             : 
     600             : // class SwTextAnnotationField //////////////////////////////////////////
     601             : 
     602             : // text annotation field
     603         139 : SwTextAnnotationField::SwTextAnnotationField(
     604             :     SwFormatField & rAttr,
     605             :     sal_Int32 const nStart,
     606             :     bool const bInClipboard )
     607             :     : SwTextAttr( rAttr, nStart )
     608         139 :     , SwTextField( rAttr, nStart, bInClipboard )
     609             : {
     610         139 : }
     611             : 
     612         417 : SwTextAnnotationField::~SwTextAnnotationField()
     613             : {
     614         417 : }
     615             : 
     616        1137 : ::sw::mark::IMark* SwTextAnnotationField::GetAnnotationMark(
     617             :     SwDoc* pDoc ) const
     618             : {
     619        1137 :     const SwPostItField* pPostItField = dynamic_cast<const SwPostItField*>(GetFormatField().GetField());
     620             :     OSL_ENSURE( pPostItField != NULL, "<SwTextAnnotationField::GetAnnotationMark()> - field missing" );
     621        1137 :     if ( pPostItField == NULL )
     622             :     {
     623           0 :         return NULL;
     624             :     }
     625             : 
     626        1137 :     if ( pDoc == NULL )
     627             :     {
     628        1137 :         pDoc = static_cast<const SwPostItFieldType*>(pPostItField->GetTyp())->GetDoc();
     629             :     }
     630             :     OSL_ENSURE( pDoc != NULL, "<SwTextAnnotationField::GetAnnotationMark()> - missing document" );
     631        1137 :     if ( pDoc == NULL )
     632             :     {
     633           0 :         return NULL;
     634             :     }
     635             : 
     636        1137 :     IDocumentMarkAccess* pMarksAccess = pDoc->getIDocumentMarkAccess();
     637        1137 :     IDocumentMarkAccess::const_iterator_t pMark = pMarksAccess->findAnnotationMark( pPostItField->GetName() );
     638        2274 :     return pMark != pMarksAccess->getAnnotationMarksEnd()
     639         787 :            ? pMark->get()
     640        1924 :            : NULL;
     641         177 : }
     642             : 
     643             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11