LCOV - code coverage report
Current view: top level - libreoffice/sw/source/ui/uiview - formatclipboard.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 8 272 2.9 %
Date: 2012-12-27 Functions: 2 13 15.4 %
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             : 
      21             : #include "formatclipboard.hxx"
      22             : 
      23             : 
      24             : #include <hintids.hxx>
      25             : #include <svx/svxids.hrc>
      26             : #include <cmdid.h>
      27             : #include <format.hxx>
      28             : #include <charfmt.hxx>
      29             : #include <fmtcol.hxx>
      30             : #include <frmfmt.hxx>
      31             : #include <docstyle.hxx>
      32             : #include <fchrfmt.hxx>
      33             : #include <pam.hxx>
      34             : // header for class SdrView
      35             : #include <svx/svdview.hxx>
      36             : //SvxBrushItem
      37             : #include <editeng/brshitem.hxx>
      38             : #include <editeng/shaditem.hxx>
      39             : #include <frmatr.hxx>
      40             : // header for class SvxBoxInfoItem
      41             : #include <editeng/boxitem.hxx>
      42             : // header for class SvxFmtBreakItem
      43             : #include <editeng/brkitem.hxx>
      44             : // header for class SwFmtLayoutSplit
      45             : #include <fmtlsplt.hxx>
      46             : // header for class SvxFmtKeepItem
      47             : #include <editeng/keepitem.hxx>
      48             : // header for class SvxFrameDirectionItem
      49             : #include <editeng/frmdiritem.hxx>
      50             : #include <paratr.hxx>
      51             : #include <fmtpdsc.hxx>
      52             : #include <fmtrowsplt.hxx>
      53             : #include <swundo.hxx>           // fuer die UndoIds
      54             : #include <boost/shared_ptr.hpp>
      55             : 
      56             : 
      57             : 
      58             : namespace
      59             : {
      60             : #define FORMAT_PAINTBRUSH_FRAME_IDS \
      61             : RES_FRMATR_BEGIN, RES_FILL_ORDER, \
      62             : /* no RES_FRM_SIZE */ \
      63             : RES_PAPER_BIN, RES_SURROUND, \
      64             : /* no RES_VERT_ORIENT */ \
      65             : /* no RES_HORI_ORIENT */ \
      66             : /* no RES_ANCHOR */ \
      67             : RES_BACKGROUND, RES_SHADOW, \
      68             : /* no RES_FRMMACRO */ \
      69             : RES_COL, RES_KEEP, \
      70             : /* no RES_URL */ \
      71             : RES_EDIT_IN_READONLY, RES_LAYOUT_SPLIT, \
      72             : /* no RES_CHAIN */ \
      73             : RES_TEXTGRID, RES_FRMATR_END-1,
      74             : 
      75             : #define FORMAT_PAINTBRUSH_PARAGRAPH_IDS \
      76             : RES_PARATR_BEGIN, RES_PARATR_END -1, \
      77             : RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END -1, \
      78             : FORMAT_PAINTBRUSH_FRAME_IDS
      79             : 
      80           0 : SfxItemSet* lcl_CreateEmptyItemSet( int nSelectionType, SfxItemPool& rPool, bool bNoParagraphFormats = false )
      81             : {
      82           0 :     SfxItemSet* pItemSet = 0;
      83           0 :     if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
      84             :     {
      85             :         pItemSet = new SfxItemSet(rPool,
      86             :                         FORMAT_PAINTBRUSH_FRAME_IDS
      87           0 :                         0);
      88             :     }
      89           0 :     else if( nSelectionType & nsSelectionType::SEL_DRW )
      90             :     {
      91             :         //is handled different
      92             :     }
      93           0 :     else if( nSelectionType & nsSelectionType::SEL_TXT )
      94             :     {
      95           0 :         if( bNoParagraphFormats )
      96             :             pItemSet = new SfxItemSet(rPool,
      97             :                     RES_CHRATR_BEGIN, RES_CHRATR_END - 1,
      98           0 :                     0);
      99             :         else
     100             :             pItemSet = new SfxItemSet(rPool,
     101             :                     RES_CHRATR_BEGIN, RES_CHRATR_END - 1,
     102             :                     FORMAT_PAINTBRUSH_PARAGRAPH_IDS
     103           0 :                     0);
     104             :     }
     105           0 :     return pItemSet;
     106             : }
     107             : 
     108           0 : void lcl_getTableAttributes( SfxItemSet& rSet, SwWrtShell &rSh )
     109             : {
     110           0 :     SvxBrushItem aBrush( RES_BACKGROUND );
     111           0 :      rSh.GetBoxBackground(aBrush);
     112           0 :     rSet.Put( aBrush );
     113           0 :     if(rSh.GetRowBackground(aBrush))
     114           0 :         rSet.Put( aBrush, SID_ATTR_BRUSH_ROW );
     115             :     else
     116           0 :         rSet.InvalidateItem(SID_ATTR_BRUSH_ROW);
     117           0 :     rSh.GetTabBackground(aBrush);
     118           0 :     rSet.Put( aBrush, SID_ATTR_BRUSH_TABLE );
     119             : 
     120           0 :     SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
     121           0 :     rSet.Put(aBoxInfo);
     122           0 :     rSh.GetTabBorders( rSet );
     123             : 
     124           0 :     SvxFrameDirectionItem aBoxDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR );
     125           0 :     if(rSh.GetBoxDirection( aBoxDirection ))
     126           0 :         rSet.Put(aBoxDirection, FN_TABLE_BOX_TEXTORIENTATION);
     127             : 
     128           0 :     rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, rSh.GetBoxAlign()));
     129             : 
     130           0 :     rSet.Put( SfxUInt16Item( FN_PARAM_TABLE_HEADLINE, rSh.GetRowsToRepeat() ) );
     131             : 
     132           0 :     SwFrmFmt *pFrmFmt = rSh.GetTableFmt();
     133           0 :     if(pFrmFmt)
     134             :     {
     135           0 :         rSet.Put( pFrmFmt->GetShadow() );
     136           0 :         rSet.Put( pFrmFmt->GetBreak() );
     137           0 :         rSet.Put( pFrmFmt->GetPageDesc() );
     138           0 :         rSet.Put( pFrmFmt->GetLayoutSplit() );
     139           0 :         rSet.Put( pFrmFmt->GetKeep() );
     140           0 :         rSet.Put( pFrmFmt->GetFrmDir() );
     141             :     }
     142             : 
     143           0 :     SwFmtRowSplit* pSplit = 0;
     144           0 :     rSh.GetRowSplit(pSplit);
     145           0 :     if(pSplit)
     146           0 :         rSet.Put(*pSplit);
     147           0 : }
     148             : 
     149           0 : void lcl_setTableAttributes( const SfxItemSet& rSet, SwWrtShell &rSh )
     150             : {
     151           0 :     const SfxPoolItem* pItem = 0;
     152           0 :     sal_Bool bBorder = ( SFX_ITEM_SET == rSet.GetItemState( RES_BOX ) ||
     153           0 :             SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER ) );
     154           0 :     sal_Bool bBackground = SFX_ITEM_SET == rSet.GetItemState( RES_BACKGROUND, sal_False, &pItem );
     155           0 :     const SfxPoolItem* pRowItem = 0, *pTableItem = 0;
     156           0 :     bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_ROW, sal_False, &pRowItem );
     157           0 :     bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_TABLE, sal_False, &pTableItem );
     158             : 
     159           0 :     if(bBackground)
     160             :     {
     161           0 :         if(pItem)
     162           0 :             rSh.SetBoxBackground( *(const SvxBrushItem*)pItem );
     163           0 :         if(pRowItem)
     164             :         {
     165           0 :             SvxBrushItem aBrush(*(const SvxBrushItem*)pRowItem);
     166           0 :             aBrush.SetWhich(RES_BACKGROUND);
     167           0 :             rSh.SetRowBackground(aBrush);
     168             :         }
     169           0 :         if(pTableItem)
     170             :         {
     171           0 :             SvxBrushItem aBrush(*(const SvxBrushItem*)pTableItem);
     172           0 :             aBrush.SetWhich(RES_BACKGROUND);
     173           0 :             rSh.SetTabBackground( aBrush );
     174             :         }
     175             :     }
     176           0 :     if(bBorder)
     177           0 :         rSh.SetTabBorders( rSet );
     178             : 
     179           0 :     if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, sal_False, &pItem) )
     180           0 :         rSh.SetRowsToRepeat( ((SfxUInt16Item*)pItem)->GetValue() );
     181             : 
     182           0 :     SwFrmFmt* pFrmFmt = rSh.GetTableFmt();
     183           0 :     if(pFrmFmt)
     184             :     {
     185             :         //RES_SHADOW
     186           0 :         pItem=0;
     187           0 :         rSet.GetItemState(rSet.GetPool()->GetWhich(RES_SHADOW), sal_False, &pItem);
     188           0 :         if(pItem)
     189           0 :             pFrmFmt->SetFmtAttr( *pItem );
     190             : 
     191             :         //RES_BREAK
     192           0 :         pItem=0;
     193           0 :         rSet.GetItemState(rSet.GetPool()->GetWhich(RES_BREAK), sal_False, &pItem);
     194           0 :         if(pItem)
     195           0 :             pFrmFmt->SetFmtAttr( *pItem );
     196             : 
     197             :         //RES_PAGEDESC
     198           0 :         pItem=0;
     199           0 :         rSet.GetItemState(rSet.GetPool()->GetWhich(RES_PAGEDESC), sal_False, &pItem);
     200           0 :         if(pItem)
     201           0 :             pFrmFmt->SetFmtAttr( *pItem );
     202             : 
     203             :         //RES_LAYOUT_SPLIT
     204           0 :         pItem=0;
     205           0 :         rSet.GetItemState(rSet.GetPool()->GetWhich(RES_LAYOUT_SPLIT), sal_False, &pItem);
     206           0 :         if(pItem)
     207           0 :             pFrmFmt->SetFmtAttr( *pItem );
     208             : 
     209             :         //RES_KEEP
     210           0 :         pItem=0;
     211           0 :         rSet.GetItemState(rSet.GetPool()->GetWhich(RES_KEEP), sal_False, &pItem);
     212           0 :         if(pItem)
     213           0 :             pFrmFmt->SetFmtAttr( *pItem );
     214             : 
     215             :         //RES_FRAMEDIR
     216           0 :         pItem=0;
     217           0 :         rSet.GetItemState(rSet.GetPool()->GetWhich(RES_FRAMEDIR), sal_False, &pItem);
     218           0 :         if(pItem)
     219           0 :             pFrmFmt->SetFmtAttr( *pItem );
     220             :     }
     221             : 
     222           0 :     if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_BOX_TEXTORIENTATION, sal_False, &pItem) )
     223             :     {
     224           0 :         SvxFrameDirectionItem aDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR );
     225           0 :         aDirection.SetValue(static_cast< const SvxFrameDirectionItem* >(pItem)->GetValue());
     226           0 :         rSh.SetBoxDirection(aDirection);
     227             :     }
     228             : 
     229           0 :     if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_SET_VERT_ALIGN, sal_False, &pItem))
     230           0 :         rSh.SetBoxAlign(((SfxUInt16Item*)(pItem))->GetValue());
     231             : 
     232           0 :     if( SFX_ITEM_SET == rSet.GetItemState( RES_ROW_SPLIT, sal_False, &pItem) )
     233           0 :         rSh.SetRowSplit(*static_cast<const SwFmtRowSplit*>(pItem));
     234           0 : }
     235             : }//end anonymous namespace
     236             : 
     237         236 : SwFormatClipboard::SwFormatClipboard()
     238             :         : m_nSelectionType(0)
     239             :         , m_pItemSet_TxtAttr(0)
     240             :         , m_pItemSet_ParAttr(0)
     241             :         , m_pTableItemSet(0)
     242         236 :         , m_bPersistentCopy(false)
     243             : {
     244         236 : }
     245         126 : SwFormatClipboard::~SwFormatClipboard()
     246             : {
     247          63 :     delete m_pItemSet_TxtAttr;
     248          63 :     delete m_pItemSet_ParAttr;
     249          63 :     delete m_pTableItemSet;
     250          63 : }
     251             : 
     252           0 : bool SwFormatClipboard::HasContent() const
     253             : {
     254             :     return m_pItemSet_TxtAttr!=0
     255             :         || m_pItemSet_ParAttr!=0
     256             :         || m_pTableItemSet != 0
     257           0 :         || m_aCharStyle.Len()
     258           0 :         || m_aParaStyle.Len()
     259             :         ;
     260             : }
     261           0 : bool SwFormatClipboard::HasContentForThisType( int nSelectionType ) const
     262             : {
     263           0 :     if( !HasContent() )
     264           0 :         return false;
     265             : 
     266           0 :     if( m_nSelectionType == nSelectionType )
     267           0 :         return true;
     268             : 
     269           0 :     if(   ( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
     270             :         &&
     271             :         ( m_nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
     272             :         )
     273           0 :         return true;
     274             : 
     275           0 :     if( nSelectionType & nsSelectionType::SEL_TXT && m_nSelectionType & nsSelectionType::SEL_TXT )
     276           0 :         return true;
     277             : 
     278           0 :     return false;
     279             : }
     280             : 
     281           0 : bool SwFormatClipboard::CanCopyThisType( int nSelectionType ) const
     282             : {
     283           0 :     if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF
     284             :          | nsSelectionType::SEL_TXT | nsSelectionType::SEL_DRW | nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS ) )
     285           0 :          return true;
     286           0 :     return false;
     287             : }
     288             : 
     289           0 : void SwFormatClipboard::Copy( SwWrtShell& rWrtShell, SfxItemPool& rPool, bool bPersistentCopy )
     290             : {
     291             :     // first clear the previously stored attributes
     292           0 :     this->Erase();
     293           0 :     m_bPersistentCopy = bPersistentCopy;
     294             : 
     295           0 :     int nSelectionType = rWrtShell.GetSelectionType();
     296           0 :     SfxItemSet* pItemSet_TxtAttr = lcl_CreateEmptyItemSet( nSelectionType, rPool, true );
     297           0 :     SfxItemSet* pItemSet_ParAttr = lcl_CreateEmptyItemSet( nSelectionType, rPool, false );
     298             : 
     299           0 :     rWrtShell.StartAction();
     300           0 :     rWrtShell.Push();
     301             : 
     302             :     // modify the "Point and Mark" of the cursor
     303             :     // in order to select only the last character of the
     304             :     // selection(s) and then to get the attributes of this single character
     305           0 :     if( nSelectionType == nsSelectionType::SEL_TXT )
     306             :     {
     307             :         // get the current PaM, the cursor
     308             :         // if there several selection it curently point
     309             :         // on the last (sort by there creation time) selection
     310           0 :         SwPaM* pCrsr = rWrtShell.GetCrsr();
     311             : 
     312           0 :         sal_Bool bHasSelection = pCrsr->HasMark();
     313           0 :         sal_Bool bForwardSelection = sal_False;
     314             : 
     315           0 :         if(!bHasSelection && pCrsr->GetPrev() != pCrsr && pCrsr->GetPrev() != 0)
     316             :         {
     317             :             // if cursor has multiple selections
     318             : 
     319             :             // clear all the selections except the last
     320           0 :             rWrtShell.KillPams();
     321             : 
     322             :             // reset the cursor to the remaining selection
     323           0 :             pCrsr = rWrtShell.GetCrsr();
     324           0 :             bHasSelection = true;
     325             :         }
     326             : 
     327           0 :         bool dontMove = false;
     328           0 :         if (bHasSelection)
     329             :         {
     330           0 :             bForwardSelection = (*pCrsr->GetPoint()) > (*pCrsr->GetMark());
     331             : 
     332             :             // clear the selection leaving just the cursor
     333           0 :             pCrsr->DeleteMark();
     334           0 :             pCrsr->SetMark();
     335             :         }
     336             :         else
     337             :         {
     338           0 :             bool rightToLeft = rWrtShell.IsInRightToLeftText();
     339             :             // if there were no selection (only a cursor) and the cursor was at
     340             :             // the end of the paragraph then don't move
     341           0 :             if ( rWrtShell.IsEndPara() && !rightToLeft )
     342           0 :                 dontMove = true;
     343             : 
     344             :             // revert left and right
     345           0 :             if ( rightToLeft )
     346             :             {
     347           0 :                 if (pCrsr->GetPoint()->nContent == 0)
     348           0 :                     dontMove = true;
     349             :                 else
     350           0 :                     bForwardSelection = !bForwardSelection;
     351             :             }
     352             :         }
     353             : 
     354             :         // move the cursor in order to select one character
     355           0 :         if (!dontMove)
     356           0 :             pCrsr->Move( bForwardSelection ? fnMoveBackward : fnMoveForward );
     357             :     }
     358             : 
     359           0 :     if(pItemSet_TxtAttr)
     360             :     {
     361           0 :         if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
     362           0 :             rWrtShell.GetFlyFrmAttr(*pItemSet_TxtAttr);
     363             :         else
     364             :         {
     365             :             // get the text attributes from named and automatic formatting
     366           0 :             rWrtShell.GetCurAttr(*pItemSet_TxtAttr);
     367             : 
     368           0 :             if( nSelectionType & nsSelectionType::SEL_TXT )
     369             :             {
     370             :                 // get the paragraph attributes (could be character properties)
     371             :                 // from named and automatic formatting
     372           0 :                 rWrtShell.GetCurParAttr(*pItemSet_ParAttr);
     373             :             }
     374             :         }
     375             :     }
     376           0 :     else if ( nSelectionType & nsSelectionType::SEL_DRW )
     377             :     {
     378           0 :         SdrView* pDrawView = rWrtShell.GetDrawView();
     379           0 :         if(pDrawView)
     380             :         {
     381           0 :             sal_Bool bOnlyHardAttr = sal_True;
     382           0 :             if( pDrawView->AreObjectsMarked() )
     383             :             {
     384           0 :                 pItemSet_TxtAttr = new SfxItemSet( pDrawView->GetAttrFromMarked(bOnlyHardAttr) );
     385             :                 //remove attributes defining the type/data of custom shapes
     386           0 :                 pItemSet_TxtAttr->ClearItem(SDRATTR_CUSTOMSHAPE_ENGINE);
     387           0 :                 pItemSet_TxtAttr->ClearItem(SDRATTR_CUSTOMSHAPE_DATA);
     388           0 :                 pItemSet_TxtAttr->ClearItem(SDRATTR_CUSTOMSHAPE_GEOMETRY);
     389           0 :                 pItemSet_TxtAttr->ClearItem(SDRATTR_CUSTOMSHAPE_REPLACEMENT_URL);
     390             :             }
     391             :         }
     392             :     }
     393             : 
     394           0 :     if( nSelectionType & nsSelectionType::SEL_TBL_CELLS )//only copy table attributes if really cells are selected (not only text in tables)
     395             :     {
     396             :         m_pTableItemSet = new SfxItemSet(rPool,
     397             :                         SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_SHADOW, //SID_ATTR_BORDER_OUTER is inbetween
     398             :                         RES_BACKGROUND,         RES_SHADOW, //RES_BOX is inbetween
     399             :                         SID_ATTR_BRUSH_ROW,     SID_ATTR_BRUSH_TABLE,
     400             :                         RES_BREAK,              RES_BREAK,
     401             :                         RES_PAGEDESC,           RES_PAGEDESC,
     402             :                         RES_LAYOUT_SPLIT,       RES_LAYOUT_SPLIT,
     403             :                         RES_ROW_SPLIT,          RES_ROW_SPLIT,
     404             :                         RES_KEEP,               RES_KEEP,
     405             :                         RES_FRAMEDIR,           RES_FRAMEDIR,
     406             :                         FN_PARAM_TABLE_HEADLINE, FN_PARAM_TABLE_HEADLINE,
     407             :                         FN_TABLE_BOX_TEXTORIENTATION, FN_TABLE_BOX_TEXTORIENTATION,
     408             :                         FN_TABLE_SET_VERT_ALIGN, FN_TABLE_SET_VERT_ALIGN,
     409           0 :                         0);
     410           0 :         lcl_getTableAttributes( *m_pTableItemSet, rWrtShell );
     411             :     }
     412             : 
     413           0 :     m_nSelectionType = nSelectionType;
     414           0 :     m_pItemSet_TxtAttr = pItemSet_TxtAttr;
     415           0 :     m_pItemSet_ParAttr = pItemSet_ParAttr;
     416             : 
     417           0 :     if( nSelectionType & nsSelectionType::SEL_TXT )
     418             :     {
     419             :         // if text is selected save the named character format
     420           0 :         SwFmt* pFmt = rWrtShell.GetCurCharFmt();
     421           0 :         if( pFmt )
     422           0 :             m_aCharStyle = pFmt->GetName();
     423             : 
     424             :         // and the named paragraph format
     425           0 :         pFmt = rWrtShell.GetCurTxtFmtColl();
     426           0 :         if( pFmt )
     427           0 :             m_aParaStyle = pFmt->GetName();
     428             :     }
     429             : 
     430           0 :     rWrtShell.Pop(sal_False);
     431           0 :     rWrtShell.EndAction();
     432           0 : }
     433             : 
     434             : typedef boost::shared_ptr< SfxPoolItem > SfxPoolItemSharedPtr;
     435             : typedef std::vector< SfxPoolItemSharedPtr > ItemVector;
     436             : // collect all PoolItems from the applied styles
     437           0 : static void lcl_AppendSetItems( ItemVector& rItemVector, const SfxItemSet& rStyleAttrSet )
     438             : {
     439           0 :     const sal_uInt16*  pRanges = rStyleAttrSet.GetRanges();
     440           0 :     while( *pRanges )
     441             :     {
     442           0 :         for ( sal_uInt16 nWhich = *pRanges; nWhich <= *(pRanges+1); ++nWhich )
     443             :         {
     444             :             const SfxPoolItem* pItem;
     445           0 :             if( SFX_ITEM_SET == rStyleAttrSet.GetItemState( nWhich, sal_False, &pItem ) )
     446             :             {
     447           0 :                 rItemVector.push_back( SfxPoolItemSharedPtr( pItem->Clone() ) );
     448             :             }
     449             :         }
     450           0 :         pRanges += 2;
     451             :     }
     452           0 : }
     453             : // remove all items that are inherited from the styles
     454           0 : static void lcl_RemoveEqualItems( SfxItemSet& rTemplateItemSet, const ItemVector& rItemVector )
     455             : {
     456           0 :     ItemVector::const_iterator aEnd = rItemVector.end();
     457           0 :     ItemVector::const_iterator aIter = rItemVector.begin();
     458           0 :     while( aIter != aEnd )
     459             :     {
     460             :         const SfxPoolItem* pItem;
     461           0 :         if( SFX_ITEM_SET == rTemplateItemSet.GetItemState( (*aIter)->Which(), sal_True, &pItem ) &&
     462           0 :             *pItem == *(*aIter) )
     463             :         {
     464           0 :             rTemplateItemSet.ClearItem( (*aIter)->Which() );
     465             :         }
     466           0 :         ++aIter;
     467             :     }
     468           0 : }
     469             : 
     470           0 : void SwFormatClipboard::Paste( SwWrtShell& rWrtShell, SfxStyleSheetBasePool* pPool
     471             :                               , bool bNoCharacterFormats, bool bNoParagraphFormats )
     472             : {
     473           0 :     int nSelectionType = rWrtShell.GetSelectionType();
     474           0 :     if( !this->HasContentForThisType(nSelectionType) )
     475             :     {
     476           0 :         if(!m_bPersistentCopy)
     477           0 :             this->Erase();
     478           0 :         return;
     479             :     }
     480             : 
     481           0 :     rWrtShell.StartAction();
     482           0 :     rWrtShell.StartUndo(UNDO_INSATTR);
     483             : 
     484           0 :     ItemVector aItemVector;
     485             : 
     486           0 :     if( nSelectionType & nsSelectionType::SEL_TXT )
     487             :     {
     488             :         // apply the named text and paragraph formatting
     489           0 :         if( pPool )
     490             :         {
     491             :             // if there is a named text format recorded and the user wants to apply it
     492           0 :             if(m_aCharStyle.Len() && !bNoCharacterFormats )
     493             :             {
     494             :                 // look for the named text format in the pool
     495           0 :                 SwDocStyleSheet* pStyle = static_cast<SwDocStyleSheet*>(pPool->Find(m_aCharStyle, SFX_STYLE_FAMILY_CHAR));
     496             : 
     497             :                 // if the style is found
     498           0 :                 if( pStyle )
     499             :                 {
     500           0 :                     SwFmtCharFmt aFmt(pStyle->GetCharFmt());
     501             :                     // store the attributes from this style in aItemVector in order
     502             :                     // not to apply them as automatic formatting attributes later in the code
     503           0 :                     lcl_AppendSetItems( aItemVector, aFmt.GetCharFmt()->GetAttrSet());
     504             : 
     505             :                     // apply the named format
     506           0 :                     rWrtShell.SetAttr( aFmt );
     507             :                 }
     508             :             }
     509             : 
     510             :             // if there is a named paragraph format recorded and the user wants to apply it
     511           0 :             if(m_aParaStyle.Len() && !bNoParagraphFormats )
     512             :             {
     513             :                 // look for the named pragraph format in the pool
     514           0 :                 SwDocStyleSheet* pStyle = static_cast<SwDocStyleSheet*>(pPool->Find(m_aParaStyle, SFX_STYLE_FAMILY_PARA));
     515           0 :                 if( pStyle )
     516             :                 {
     517             :                     // store the attributes from this style in aItemVector in order
     518             :                     // not to apply them as automatic formatting attributes later in the code
     519           0 :                     lcl_AppendSetItems( aItemVector, pStyle->GetCollection()->GetAttrSet());
     520             : 
     521             :                     // apply the named format
     522           0 :                     rWrtShell.SetTxtFmtColl( pStyle->GetCollection() );
     523             :                 }
     524             :             }
     525             :         }
     526             : 
     527             :         // apply the paragraph automatic attributes
     528           0 :         if ( m_pItemSet_ParAttr && m_pItemSet_ParAttr->Count() != 0 && !bNoParagraphFormats )
     529             :         {
     530             :             // temporary SfxItemSet
     531             :             SfxItemSet* pTemplateItemSet = lcl_CreateEmptyItemSet(
     532           0 :                     nSelectionType, *m_pItemSet_ParAttr->GetPool(), false);
     533             :             // no need to verify the existance of pTemplateItemSet as we
     534             :             // know that here the selection type is SEL_TXT
     535             : 
     536           0 :             pTemplateItemSet->Put( *m_pItemSet_ParAttr );
     537             : 
     538             :             // remove attribute that were applied by named text and paragraph formatting
     539           0 :             lcl_RemoveEqualItems( *pTemplateItemSet, aItemVector );
     540             : 
     541             :             // it can't be a multiple selection
     542           0 :             SwPaM* pCrsr = rWrtShell.GetCrsr();
     543             : 
     544             :             // apply the paragraph automatic attributes to all the nodes in the selection
     545           0 :             for (SwNodeIndex pNodeIndexIterator = pCrsr->Start()->nNode,
     546           0 :                              pNodeIndexEnd = pCrsr->End()->nNode;
     547           0 :                     pNodeIndexIterator != pNodeIndexEnd;
     548             :                     ++pNodeIndexIterator )
     549             :             {
     550           0 :                 pNodeIndexIterator.GetNode().GetCntntNode()->SetAttr( *pTemplateItemSet );
     551           0 :             }
     552             :             // same as pCrsr->End()->nNode.GetNode().GetCntntNode()->SetAttr
     553           0 :             pCrsr->GetCntntNode()->SetAttr( *pTemplateItemSet );
     554             : 
     555             :             // store the attributes in aItemVector in order not to apply them as
     556             :             // text automatic formating attributes later in the code
     557           0 :             lcl_AppendSetItems( aItemVector, *pTemplateItemSet);
     558             : 
     559           0 :             delete pTemplateItemSet;
     560             :         }
     561             :     }
     562             : 
     563           0 :     if(m_pItemSet_TxtAttr)
     564             :     {
     565           0 :         if( nSelectionType & nsSelectionType::SEL_DRW )
     566             :         {
     567           0 :             SdrView* pDrawView = rWrtShell.GetDrawView();
     568           0 :             if(pDrawView)
     569             :             {
     570           0 :                 sal_Bool bReplaceAll = sal_True;
     571           0 :                 pDrawView->SetAttrToMarked(*m_pItemSet_TxtAttr, bReplaceAll);
     572             :             }
     573             :         }
     574             :         else
     575             :         {
     576             :             // temporary SfxItemSet
     577             :             SfxItemSet* pTemplateItemSet = lcl_CreateEmptyItemSet(
     578           0 :                     nSelectionType, *m_pItemSet_TxtAttr->GetPool(), true );
     579             : 
     580           0 :             if(pTemplateItemSet)
     581             :             {
     582             :                 // copy the stored automatic text attributes in a temporary SfxItemSet
     583           0 :                 pTemplateItemSet->Put( *m_pItemSet_TxtAttr );
     584             : 
     585             :                 // only attributes that were not apply by named style attributes and automatic
     586             :                 // paragraph attributes should be applied
     587           0 :                 lcl_RemoveEqualItems( *pTemplateItemSet, aItemVector );
     588             : 
     589             :                 // apply the character automatic attributes
     590           0 :                 if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
     591           0 :                     rWrtShell.SetFlyFrmAttr(*pTemplateItemSet);
     592           0 :                 else if ( !bNoCharacterFormats )
     593           0 :                     rWrtShell.SetAttr(*pTemplateItemSet);
     594             : 
     595           0 :                 delete pTemplateItemSet;
     596             :             }
     597             :         }
     598             :     }
     599             : 
     600           0 :     if( m_pTableItemSet && nSelectionType & (nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS) )
     601           0 :         lcl_setTableAttributes( *m_pTableItemSet, rWrtShell );
     602             : 
     603           0 :     rWrtShell.EndUndo(UNDO_INSATTR);
     604           0 :     rWrtShell.EndAction();
     605             : 
     606           0 :     if(!m_bPersistentCopy)
     607           0 :         this->Erase();
     608             : }
     609             : 
     610           0 : void SwFormatClipboard::Erase()
     611             : {
     612           0 :     m_nSelectionType = 0;
     613             : 
     614           0 :     delete m_pItemSet_TxtAttr;
     615           0 :     m_pItemSet_TxtAttr = 0;
     616             : 
     617           0 :     delete m_pItemSet_ParAttr;
     618           0 :     m_pItemSet_ParAttr = 0;
     619             : 
     620           0 :     delete m_pTableItemSet;
     621           0 :     m_pTableItemSet = 0;
     622             : 
     623           0 :     if( m_aCharStyle.Len() )
     624           0 :         m_aCharStyle.Erase();
     625           0 :     if( m_aParaStyle.Len() )
     626           0 :         m_aParaStyle.Erase();
     627             : 
     628           0 :     m_bPersistentCopy = false;
     629           0 : }
     630             : 
     631             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10