LCOV - code coverage report
Current view: top level - sw/source/core/txtnode - txtatr2.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 136 145 93.8 %
Date: 2015-06-13 12:38:46 Functions: 27 48 56.2 %
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 <hintids.hxx>
      21             : #include <hints.hxx>
      22             : #include <sfx2/objsh.hxx>
      23             : #include <editeng/xmlcnitm.hxx>
      24             : #include <editeng/twolinesitem.hxx>
      25             : #include <txtinet.hxx>
      26             : #include <txtatr.hxx>
      27             : #include <fchrfmt.hxx>
      28             : #include <fmtinfmt.hxx>
      29             : #include <charfmt.hxx>
      30             : #include <ndtxt.hxx>
      31             : #include <poolfmt.hxx>
      32             : #include <doc.hxx>
      33             : #include <fmtruby.hxx>
      34             : #include <fmtmeta.hxx>
      35             : #include <IDocumentState.hxx>
      36             : #include <IDocumentStylePoolAccess.hxx>
      37             : 
      38          32 : TYPEINIT1(SwTextINetFormat,SwClient);
      39           0 : TYPEINIT1(SwTextRuby,SwClient);
      40             : 
      41        6318 : SwTextCharFormat::SwTextCharFormat( SwFormatCharFormat& rAttr,
      42             :                     sal_Int32 nStt, sal_Int32 nEnde )
      43             :     : SwTextAttr( rAttr, nStt )
      44             :     , SwTextAttrEnd( rAttr, nStt, nEnde )
      45             :     , m_pTextNode( 0 )
      46        6318 :     , m_nSortNumber( 0 )
      47             : {
      48        6318 :     rAttr.pTextAttr = this;
      49        6318 :     SetCharFormatAttr( true );
      50        6318 : }
      51             : 
      52       18954 : SwTextCharFormat::~SwTextCharFormat( )
      53             : {
      54       18954 : }
      55             : 
      56        4596 : void SwTextCharFormat::ModifyNotification( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
      57             : {
      58        4596 :     const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
      59             :     OSL_ENSURE(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
      60             :              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
      61             :         "SwTextCharFormat::Modify(): unknown Modify");
      62             : 
      63        4596 :     if ( m_pTextNode )
      64             :     {
      65             :         SwUpdateAttr aUpdateAttr(
      66        4527 :             GetStart(),
      67        4527 :             *GetEnd(),
      68       13581 :             nWhich);
      69             : 
      70        4527 :         m_pTextNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
      71             :     }
      72        4596 : }
      73             : 
      74           7 : bool SwTextCharFormat::GetInfo( SfxPoolItem& rInfo ) const
      75             : {
      76          14 :     if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode ||
      77           7 :         &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes )
      78             :     {
      79           0 :         return true;
      80             :     }
      81             : 
      82           7 :     static_cast<SwAutoFormatGetDocNode&>(rInfo).pContentNode = m_pTextNode;
      83           7 :     return false;
      84             : }
      85             : 
      86        2095 : SwTextAttrNesting::SwTextAttrNesting( SfxPoolItem & i_rAttr,
      87             :             const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
      88             :     : SwTextAttr( i_rAttr, i_nStart )
      89        2095 :     , SwTextAttrEnd( i_rAttr, i_nStart, i_nEnd )
      90             : {
      91        2095 :     SetDontExpand( true );  // never expand this attribute
      92             :     // lock the expand flag: simple guarantee that nesting will not be
      93             :     // invalidated by expand operations
      94        2095 :     SetLockExpandFlag( true );
      95        2095 :     SetDontExpandStartAttr( true );
      96        2095 :     SetNesting( true );
      97        2095 : }
      98             : 
      99        2095 : SwTextAttrNesting::~SwTextAttrNesting()
     100             : {
     101        2095 : }
     102             : 
     103        1804 : SwTextINetFormat::SwTextINetFormat( SwFormatINetFormat& rAttr,
     104             :                             sal_Int32 nStart, sal_Int32 nEnd )
     105             :     : SwTextAttr( rAttr, nStart )
     106             :     , SwTextAttrNesting( rAttr, nStart, nEnd )
     107             :     , SwClient( 0 )
     108             :     , m_pTextNode( 0 )
     109             :     , m_bVisited( false )
     110        1804 :     , m_bVisitedValid( false )
     111             : {
     112        1804 :     rAttr.mpTextAttr  = this;
     113        1804 :     SetCharFormatAttr( true );
     114        1804 : }
     115             : 
     116        5412 : SwTextINetFormat::~SwTextINetFormat( )
     117             : {
     118        5412 : }
     119             : 
     120       16045 : SwCharFormat* SwTextINetFormat::GetCharFormat()
     121             : {
     122       16045 :     const SwFormatINetFormat& rFormat = SwTextAttrEnd::GetINetFormat();
     123       16045 :     SwCharFormat* pRet = NULL;
     124             : 
     125       16045 :     if (!rFormat.GetValue().isEmpty())
     126             :     {
     127       16038 :         SwDoc* pDoc = GetTextNode().GetDoc();
     128       16038 :         if( !IsVisitedValid() )
     129             :         {
     130        1786 :             SetVisited( pDoc->IsVisitedURL( rFormat.GetValue() ) );
     131        1786 :             SetVisitedValid( true );
     132             :         }
     133             : 
     134       16038 :         const sal_uInt16 nId = IsVisited() ? rFormat.GetVisitedFormatId() : rFormat.GetINetFormatId();
     135       16038 :         const OUString& rStr = IsVisited() ? rFormat.GetVisitedFormat() : rFormat.GetINetFormat();
     136       16038 :         if (rStr.isEmpty())
     137             :         {
     138             :             OSL_ENSURE( false, "<SwTextINetFormat::GetCharFormat()> - missing character format at hyperlink attribute");
     139             :         }
     140             : 
     141             :         // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
     142             :         //      correct charstyle.
     143       16038 :         bool bResetMod = !pDoc->getIDocumentState().IsModified();
     144       16038 :         Link<> aOle2Lnk;
     145       16038 :         if ( bResetMod )
     146             :         {
     147        9729 :             aOle2Lnk = pDoc->GetOle2Link();
     148        9729 :             pDoc->SetOle2Link( Link<>() );
     149             :         }
     150             : 
     151       16038 :         pRet = IsPoolUserFormat( nId )
     152             :                ? pDoc->FindCharFormatByName( rStr )
     153       16038 :                : pDoc->getIDocumentStylePoolAccess().GetCharFormatFromPool( nId );
     154             : 
     155       16038 :         if ( bResetMod )
     156             :         {
     157        9729 :             pDoc->getIDocumentState().ResetModified();
     158        9729 :             pDoc->SetOle2Link( aOle2Lnk );
     159             :         }
     160             :     }
     161             : 
     162       16045 :     if ( pRet )
     163       15685 :         pRet->Add( this );
     164         360 :     else if ( GetRegisteredIn() )
     165           2 :         GetRegisteredInNonConst()->Remove( this );
     166             : 
     167       16045 :     return pRet;
     168             : }
     169             : 
     170         878 : void SwTextINetFormat::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
     171             : {
     172         878 :     const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
     173             :     OSL_ENSURE(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
     174             :              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
     175             :         "SwTextINetFormat::Modify(): unknown Modify");
     176             : 
     177         878 :     if ( m_pTextNode )
     178             :     {
     179             :         SwUpdateAttr aUpdateAttr(
     180         878 :             GetStart(),
     181         878 :             *GetEnd(),
     182        2634 :             nWhich);
     183             : 
     184         878 :         m_pTextNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
     185             :     }
     186         878 : }
     187             : 
     188             :     // erfrage vom Modify Informationen
     189           1 : bool SwTextINetFormat::GetInfo( SfxPoolItem& rInfo ) const
     190             : {
     191           2 :     if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode ||
     192           1 :         &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes )
     193             :     {
     194           0 :         return true;
     195             :     }
     196             : 
     197           1 :     static_cast<SwAutoFormatGetDocNode&>(rInfo).pContentNode = m_pTextNode;
     198           1 :     return false;
     199             : }
     200             : 
     201           0 : bool SwTextINetFormat::IsProtect( ) const
     202             : {
     203           0 :     return m_pTextNode && m_pTextNode->IsProtect();
     204             : }
     205             : 
     206         176 : SwTextRuby::SwTextRuby( SwFormatRuby& rAttr,
     207             :                       sal_Int32 nStart, sal_Int32 nEnd )
     208             :     : SwTextAttr( rAttr, nStart )
     209             :     , SwTextAttrNesting( rAttr, nStart, nEnd )
     210             :     , SwClient( 0 )
     211         176 :     , m_pTextNode( 0 )
     212             : {
     213         176 :     rAttr.pTextAttr  = this;
     214         176 : }
     215             : 
     216         528 : SwTextRuby::~SwTextRuby()
     217             : {
     218         528 : }
     219             : 
     220          71 : void SwTextRuby::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
     221             : {
     222          71 :     const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
     223             :     OSL_ENSURE(  isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich)
     224             :              || (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich),
     225             :         "SwTextRuby::Modify(): unknown Modify");
     226             : 
     227          71 :     if ( m_pTextNode )
     228             :     {
     229             :         SwUpdateAttr aUpdateAttr(
     230          71 :             GetStart(),
     231          71 :             *GetEnd(),
     232         213 :             nWhich);
     233             : 
     234          71 :         m_pTextNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr );
     235             :     }
     236          71 : }
     237             : 
     238           1 : bool SwTextRuby::GetInfo( SfxPoolItem& rInfo ) const
     239             : {
     240           2 :     if( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTextNode ||
     241           1 :         &m_pTextNode->GetNodes() != static_cast<SwAutoFormatGetDocNode&>(rInfo).pNodes )
     242             :     {
     243           0 :         return true;
     244             :     }
     245             : 
     246           1 :     static_cast<SwAutoFormatGetDocNode&>(rInfo).pContentNode = m_pTextNode;
     247           1 :     return false;
     248             : }
     249             : 
     250         157 : SwCharFormat* SwTextRuby::GetCharFormat()
     251             : {
     252         157 :     const SwFormatRuby& rFormat = SwTextAttrEnd::GetRuby();
     253         157 :     SwCharFormat* pRet = 0;
     254             : 
     255         157 :     if( !rFormat.GetText().isEmpty() )
     256             :     {
     257         157 :         const SwDoc* pDoc = GetTextNode().GetDoc();
     258         157 :         const OUString rStr = rFormat.GetCharFormatName();
     259         157 :         const sal_uInt16 nId = rStr.isEmpty()
     260             :                              ? static_cast<sal_uInt16>(RES_POOLCHR_RUBYTEXT)
     261         157 :                              : rFormat.GetCharFormatId();
     262             : 
     263             :         // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
     264             :         //              correct charstyle.
     265         157 :         const bool bResetMod = !pDoc->getIDocumentState().IsModified();
     266         157 :         Link<> aOle2Lnk;
     267         157 :         if( bResetMod )
     268             :         {
     269          12 :             aOle2Lnk = pDoc->GetOle2Link();
     270          12 :             const_cast<SwDoc*>(pDoc)->SetOle2Link( Link<>() );
     271             :         }
     272             : 
     273         157 :         pRet = IsPoolUserFormat( nId )
     274             :                 ? pDoc->FindCharFormatByName( rStr )
     275         157 :                 : const_cast<SwDoc*>(pDoc)->getIDocumentStylePoolAccess().GetCharFormatFromPool( nId );
     276             : 
     277         157 :         if( bResetMod )
     278             :         {
     279          12 :             const_cast<SwDoc*>(pDoc)->getIDocumentState().ResetModified();
     280          12 :             const_cast<SwDoc*>(pDoc)->SetOle2Link( aOle2Lnk );
     281         157 :         }
     282             :     }
     283             : 
     284         157 :     if( pRet )
     285         157 :         pRet->Add( this );
     286           0 :     else if( GetRegisteredIn() )
     287           0 :         GetRegisteredInNonConst()->Remove( this );
     288             : 
     289         157 :     return pRet;
     290             : }
     291             : 
     292             : SwTextMeta *
     293          97 : SwTextMeta::CreateTextMeta(
     294             :     ::sw::MetaFieldManager & i_rTargetDocManager,
     295             :     SwTextNode *const i_pTargetTextNode,
     296             :     SwFormatMeta & i_rAttr,
     297             :     sal_Int32 const i_nStart,
     298             :     sal_Int32 const i_nEnd,
     299             :     bool const i_bIsCopy)
     300             : {
     301          97 :     if (i_bIsCopy)
     302             :     {   // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta
     303             :         OSL_ENSURE(i_pTargetTextNode, "cannot copy Meta without target node");
     304           0 :         i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTextNode);
     305             :     }
     306          97 :     SwTextMeta *const pTextMeta(new SwTextMeta(i_rAttr, i_nStart, i_nEnd));
     307          97 :     return pTextMeta;
     308             : }
     309             : 
     310          97 : SwTextMeta::SwTextMeta( SwFormatMeta & i_rAttr,
     311             :         const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
     312             :     : SwTextAttr( i_rAttr, i_nStart )
     313          97 :     , SwTextAttrNesting( i_rAttr, i_nStart, i_nEnd )
     314             : {
     315          97 :     i_rAttr.SetTextAttr( this );
     316          97 :     SetHasDummyChar(true);
     317          97 : }
     318             : 
     319         388 : SwTextMeta::~SwTextMeta()
     320             : {
     321          97 :     SwFormatMeta & rFormatMeta( static_cast<SwFormatMeta &>(GetAttr()) );
     322          97 :     if (rFormatMeta.GetTextAttr() == this)
     323             :     {
     324          97 :         rFormatMeta.SetTextAttr(0);
     325             :     }
     326         291 : }
     327             : 
     328         194 : void SwTextMeta::ChgTextNode(SwTextNode * const pNode)
     329             : {
     330         194 :     SwFormatMeta & rFormatMeta( static_cast<SwFormatMeta &>(GetAttr()) );
     331         194 :     if (rFormatMeta.GetTextAttr() == this)
     332             :     {
     333         194 :         rFormatMeta.NotifyChangeTextNode(pNode);
     334             :     }
     335         371 : }
     336             : 
     337             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11