blob: 6eff636da3ab8c2a8976a6d89f7baa1387024851 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include "formatclipboard.hxx"
#include <hintids.hxx>
#ifndef _SVX_SVXIDS_HRC
#include <svx/svxids.hrc>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#include <format.hxx>
#include <charfmt.hxx>
#include <fmtcol.hxx>
#include <frmfmt.hxx>
#include <docstyle.hxx>
#include <fchrfmt.hxx>
#include <pam.hxx>
// header for class SdrView
#include <svx/svdview.hxx>
//SvxBrushItem
#include <editeng/brshitem.hxx>
#include <editeng/shaditem.hxx>
#include <frmatr.hxx>
// header for class SvxBoxInfoItem
#include <editeng/boxitem.hxx>
// header for class SvxFmtBreakItem
#include <editeng/brkitem.hxx>
// header for class SwFmtLayoutSplit
#include <fmtlsplt.hxx>
// header for class SvxFmtKeepItem
#include <editeng/keepitem.hxx>
// header for class SvxFrameDirectionItem
#include <editeng/frmdiritem.hxx>
#include <paratr.hxx>
#include <fmtpdsc.hxx>
#include <fmtrowsplt.hxx>
#include <swundo.hxx> // fuer die UndoIds
#include <boost/shared_ptr.hpp>
//#define FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES 1
#ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES
#include <cellatr.hxx>
#endif
/*--------------------------------------------------------------------
--------------------------------------------------------------------*/
namespace
{
#define FORMAT_PAINTBRUSH_FRAME_IDS \
RES_FRMATR_BEGIN, RES_FILL_ORDER, \
/* no RES_FRM_SIZE */ \
RES_PAPER_BIN, RES_SURROUND, \
/* no RES_VERT_ORIENT */ \
/* no RES_HORI_ORIENT */ \
/* no RES_ANCHOR */ \
RES_BACKGROUND, RES_SHADOW, \
/* no RES_FRMMACRO */ \
RES_COL, RES_KEEP, \
/* no RES_URL */ \
RES_EDIT_IN_READONLY, RES_LAYOUT_SPLIT, \
/* no RES_CHAIN */ \
RES_TEXTGRID, RES_FRMATR_END-1,
#define FORMAT_PAINTBRUSH_PARAGRAPH_IDS \
RES_PARATR_BEGIN, RES_PARATR_END -1, \
RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END -1, \
FORMAT_PAINTBRUSH_FRAME_IDS \
FN_NUMBER_NEWSTART, FN_NUMBER_NEWSTART, \
FN_NUMBER_NEWSTART_AT, FN_NUMBER_NEWSTART_AT,
SfxItemSet* lcl_CreateEmptyItemSet( int nSelectionType, SfxItemPool& rPool
, bool bNoCharacterFormats = false, bool bNoParagraphFormats = false )
{
SfxItemSet* pItemSet = 0;
if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
{
pItemSet = new SfxItemSet(rPool,
FORMAT_PAINTBRUSH_FRAME_IDS
0);
}
else if( nSelectionType & nsSelectionType::SEL_DRW )
{
//is handled different
}
else if( nSelectionType == nsSelectionType::SEL_TBL )
{
pItemSet = new SfxItemSet(rPool,
SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_SHADOW, //SID_ATTR_BORDER_OUTER is inbetween
RES_BACKGROUND, RES_SHADOW, //RES_BOX is inbetween
SID_ATTR_BRUSH_ROW, SID_ATTR_BRUSH_TABLE,
RES_BREAK, RES_BREAK,
RES_PAGEDESC, RES_PAGEDESC,
RES_LAYOUT_SPLIT, RES_LAYOUT_SPLIT,
RES_ROW_SPLIT, RES_ROW_SPLIT,
RES_KEEP, RES_KEEP,
RES_FRAMEDIR, RES_FRAMEDIR,
FN_PARAM_TABLE_HEADLINE, FN_PARAM_TABLE_HEADLINE,
FN_TABLE_BOX_TEXTDIRECTION, FN_TABLE_BOX_TEXTDIRECTION,
FN_TABLE_SET_VERT_ALIGN, FN_TABLE_SET_VERT_ALIGN,
#ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES
RES_BOXATR_FORMAT, RES_BOXATR_FORMAT,
#endif
0);
}
else if( nSelectionType & nsSelectionType::SEL_TXT )
{
if( bNoCharacterFormats )
pItemSet = new SfxItemSet(rPool,
FORMAT_PAINTBRUSH_PARAGRAPH_IDS
0);
else if( bNoParagraphFormats )
pItemSet = new SfxItemSet(rPool,
RES_CHRATR_BEGIN, RES_CHRATR_END - 1,
0);
else
pItemSet = new SfxItemSet(rPool,
RES_CHRATR_BEGIN, RES_CHRATR_END - 1,
FORMAT_PAINTBRUSH_PARAGRAPH_IDS
0);
}
return pItemSet;
}
void lcl_getTableAttributes( SfxItemSet& rSet, SwWrtShell &rSh )
{
SvxBrushItem aBrush( RES_BACKGROUND );
rSh.GetBoxBackground(aBrush);
rSet.Put( aBrush );
if(rSh.GetRowBackground(aBrush))
rSet.Put( aBrush, SID_ATTR_BRUSH_ROW );
else
rSet.InvalidateItem(SID_ATTR_BRUSH_ROW);
rSh.GetTabBackground(aBrush);
rSet.Put( aBrush, SID_ATTR_BRUSH_TABLE );
SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
rSet.Put(aBoxInfo);
rSh.GetTabBorders( rSet );
SvxFrameDirectionItem aBoxDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR );
if(rSh.GetBoxDirection( aBoxDirection ))
rSet.Put(aBoxDirection, FN_TABLE_BOX_TEXTDIRECTION);
rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, rSh.GetBoxAlign()));
rSet.Put( SfxUInt16Item( FN_PARAM_TABLE_HEADLINE, rSh.GetRowsToRepeat() ) );
SwFrmFmt *pFrmFmt = rSh.GetTableFmt();
if(pFrmFmt)
{
rSet.Put( pFrmFmt->GetShadow() );
rSet.Put( pFrmFmt->GetBreak() );
rSet.Put( pFrmFmt->GetPageDesc() );
rSet.Put( pFrmFmt->GetLayoutSplit() );
rSet.Put( pFrmFmt->GetKeep() );
rSet.Put( pFrmFmt->GetFrmDir() );
}
SwFmtRowSplit* pSplit = 0;
rSh.GetRowSplit(pSplit);
if(pSplit)
rSet.Put(*pSplit);
//-- numberformat in cells
#ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES
rSh.GetTblBoxFormulaAttrs( rSet ); //RES_BOXATR_FORMAT
#endif
}
void lcl_setTableAttributes( const SfxItemSet& rSet, SwWrtShell &rSh )
{
const SfxPoolItem* pItem = 0;
sal_Bool bBorder = ( SFX_ITEM_SET == rSet.GetItemState( RES_BOX ) ||
SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER ) );
pItem = 0;
sal_Bool bBackground = SFX_ITEM_SET == rSet.GetItemState( RES_BACKGROUND, sal_False, &pItem );
const SfxPoolItem* pRowItem = 0, *pTableItem = 0;
bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_ROW, sal_False, &pRowItem );
bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_TABLE, sal_False, &pTableItem );
if(bBackground)
{
if(pItem)
rSh.SetBoxBackground( *(const SvxBrushItem*)pItem );
if(pRowItem)
{
SvxBrushItem aBrush(*(const SvxBrushItem*)pRowItem);
aBrush.SetWhich(RES_BACKGROUND);
rSh.SetRowBackground(aBrush);
}
if(pTableItem)
{
SvxBrushItem aBrush(*(const SvxBrushItem*)pTableItem);
aBrush.SetWhich(RES_BACKGROUND);
rSh.SetTabBackground( aBrush );
}
}
if(bBorder)
rSh.SetTabBorders( rSet );
if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, sal_False, &pItem) )
rSh.SetRowsToRepeat( ((SfxUInt16Item*)pItem)->GetValue() );
SwFrmFmt* pFrmFmt = rSh.GetTableFmt();
if(pFrmFmt)
{
//RES_SHADOW
pItem=0;
rSet.GetItemState(rSet.GetPool()->GetWhich(RES_SHADOW), sal_False, &pItem);
if(pItem)
pFrmFmt->SetFmtAttr( *pItem );
//RES_BREAK
pItem=0;
rSet.GetItemState(rSet.GetPool()->GetWhich(RES_BREAK), sal_False, &pItem);
if(pItem)
pFrmFmt->SetFmtAttr( *pItem );
//RES_PAGEDESC
pItem=0;
rSet.GetItemState(rSet.GetPool()->GetWhich(RES_PAGEDESC), sal_False, &pItem);
if(pItem)
pFrmFmt->SetFmtAttr( *pItem );
//RES_LAYOUT_SPLIT
pItem=0;
rSet.GetItemState(rSet.GetPool()->GetWhich(RES_LAYOUT_SPLIT), sal_False, &pItem);
if(pItem)
pFrmFmt->SetFmtAttr( *pItem );
//RES_KEEP
pItem=0;
rSet.GetItemState(rSet.GetPool()->GetWhich(RES_KEEP), sal_False, &pItem);
if(pItem)
pFrmFmt->SetFmtAttr( *pItem );
//RES_FRAMEDIR
pItem=0;
rSet.GetItemState(rSet.GetPool()->GetWhich(RES_FRAMEDIR), sal_False, &pItem);
if(pItem)
pFrmFmt->SetFmtAttr( *pItem );
}
if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_BOX_TEXTDIRECTION, sal_False, &pItem) )
{
SvxFrameDirectionItem aDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR );
aDirection.SetValue(static_cast< const SvxFrameDirectionItem* >(pItem)->GetValue());
rSh.SetBoxDirection(aDirection);
}
if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_SET_VERT_ALIGN, sal_False, &pItem))
rSh.SetBoxAlign(((SfxUInt16Item*)(pItem))->GetValue());
if( SFX_ITEM_SET == rSet.GetItemState( RES_ROW_SPLIT, sal_False, &pItem) )
rSh.SetRowSplit(*static_cast<const SwFmtRowSplit*>(pItem));
//-- numberformat in cells
#ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES
if( SFX_ITEM_SET == rSet.GetItemState( RES_BOXATR_FORMAT, sal_False, &pItem ))
{
SfxItemSet aBoxSet( *rSet.GetPool(), RES_BOXATR_FORMAT, RES_BOXATR_FORMAT );
aBoxSet.Put( SwTblBoxNumFormat( ((SfxUInt32Item*)pItem)->GetValue() ));
rSh.SetTblBoxFormulaAttrs( aBoxSet );
}
#endif
}
}//end anonymous namespace
SwFormatClipboard::SwFormatClipboard()
: m_nSelectionType(0)
, m_pItemSet(0)
, m_pTableItemSet(0)
, m_bPersistentCopy(false)
{
}
SwFormatClipboard::~SwFormatClipboard()
{
if(m_pItemSet)
delete m_pItemSet;
if(m_pTableItemSet)
delete m_pTableItemSet;
}
bool SwFormatClipboard::HasContent() const
{
return m_pItemSet!=0
|| m_pTableItemSet != 0
|| m_aCharStyle.Len()
|| m_aParaStyle.Len()
;
}
bool SwFormatClipboard::HasContentForThisType( int nSelectionType ) const
{
if( !HasContent() )
return false;
if( m_nSelectionType == nSelectionType )
return true;
if( ( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
&&
( m_nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
)
return true;
if( nSelectionType & nsSelectionType::SEL_TXT && m_nSelectionType & nsSelectionType::SEL_TXT )
return true;
return false;
}
bool SwFormatClipboard::CanCopyThisType( int nSelectionType ) const
{
if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF
| nsSelectionType::SEL_TXT | nsSelectionType::SEL_DRW | nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS ) )
return true;
return false;
}
void SwFormatClipboard::Copy( SwWrtShell& rWrtShell, SfxItemPool& rPool, bool bPersistentCopy )
{
this->Erase();
m_bPersistentCopy = bPersistentCopy;
int nSelectionType = rWrtShell.GetSelectionType();
SfxItemSet* pItemSet = lcl_CreateEmptyItemSet( nSelectionType, rPool );
rWrtShell.StartAction();
rWrtShell.Push();
if( nSelectionType == nsSelectionType::SEL_TXT )
{
SwPaM* pCrsr = rWrtShell.GetCrsr();
//select one character only to get the attributes of this single character only
sal_Bool bHasSelection = pCrsr->HasMark();
sal_Bool bForwardSelection = sal_False;
if(!bHasSelection) //check for and handle multiselections
{
if( pCrsr->GetPrev() != pCrsr && pCrsr->GetPrev() != 0)
{
pCrsr = (SwPaM*)pCrsr->GetPrev();
bForwardSelection = (*pCrsr->GetPoint()) > (*pCrsr->GetMark());
bHasSelection = true;
pCrsr->DeleteMark();
pCrsr->SetMark();
rWrtShell.KillPams();
pCrsr = rWrtShell.GetCrsr();
}
}
else
bForwardSelection = (*pCrsr->GetPoint()) > (*pCrsr->GetMark());
pCrsr->DeleteMark();
pCrsr->SetMark();
if( !bHasSelection && rWrtShell.IsInRightToLeftText() )
bForwardSelection = !bForwardSelection;
if( !( !bHasSelection && rWrtShell.IsEndPara() ) )
pCrsr->Move( bForwardSelection ? fnMoveBackward : fnMoveForward );
}
if(pItemSet)
{
if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
rWrtShell.GetFlyFrmAttr(*pItemSet);
else
{
rWrtShell.GetCurAttr(*pItemSet);
// additional numbering properties for paragraph styles
if( nSelectionType & nsSelectionType::SEL_TXT && rWrtShell.GetCurNumRule() )
{
SfxBoolItem aStart(FN_NUMBER_NEWSTART, rWrtShell.IsNumRuleStart());
pItemSet->Put(aStart);
SfxUInt16Item aStartAt(FN_NUMBER_NEWSTART_AT, rWrtShell.GetNodeNumStart());
pItemSet->Put(aStartAt);
}
}
}
else if ( nSelectionType & nsSelectionType::SEL_DRW )
{
SdrView* pDrawView = rWrtShell.GetDrawView();
if(pDrawView)
{
sal_Bool bOnlyHardAttr = sal_True;
if( pDrawView->AreObjectsMarked() )
{
pItemSet = new SfxItemSet( pDrawView->GetAttrFromMarked(bOnlyHardAttr) );
//remove attributes defining the type/data of custom shapes
pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_ENGINE);
pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_DATA);
pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_GEOMETRY);
pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_REPLACEMENT_URL);
}
}
}
if( nSelectionType & nsSelectionType::SEL_TBL_CELLS )//only copy table attributes if really cells are selected (not only text in tables)
{
m_pTableItemSet = lcl_CreateEmptyItemSet( nsSelectionType::SEL_TBL, rPool );
lcl_getTableAttributes( *m_pTableItemSet, rWrtShell );
}
m_nSelectionType = nSelectionType;
m_pItemSet = pItemSet;
if( nSelectionType & nsSelectionType::SEL_TXT )
{
SwFmt* pFmt = rWrtShell.GetCurCharFmt();
if( pFmt )
m_aCharStyle = pFmt->GetName();
pFmt = rWrtShell.GetCurTxtFmtColl();
if( pFmt )
m_aParaStyle = pFmt->GetName();
}
rWrtShell.Pop(sal_False);
rWrtShell.EndAction();
}
typedef boost::shared_ptr< SfxPoolItem > SfxPoolItemSharedPtr;
typedef std::vector< SfxPoolItemSharedPtr > ItemVector;
// #144857# collect all PoolItems from the applied styles
void lcl_AppendSetItems( ItemVector& rItemVector, const SfxItemSet& rStyleAttrSet )
{
const sal_uInt16* pRanges = rStyleAttrSet.GetRanges();
while( *pRanges )
{
for ( sal_uInt16 nWhich = *pRanges; nWhich <= *(pRanges+1); ++nWhich )
{
const SfxPoolItem* pItem;
if( SFX_ITEM_SET == rStyleAttrSet.GetItemState( nWhich, sal_False, &pItem ) )
{
rItemVector.push_back( SfxPoolItemSharedPtr( pItem->Clone() ) );
}
}
pRanges += 2;
}
}
// #144857# remove all items that are inherited from the styles
void lcl_RemoveEqualItems( SfxItemSet& rTemplateItemSet, ItemVector& rItemVector )
{
ItemVector::iterator aEnd = rItemVector.end();
ItemVector::iterator aIter = rItemVector.begin();
while( aIter != aEnd )
{
const SfxPoolItem* pItem;
if( SFX_ITEM_SET == rTemplateItemSet.GetItemState( (*aIter)->Which(), sal_True, &pItem ) &&
*pItem == *(*aIter) )
{
rTemplateItemSet.ClearItem( (*aIter)->Which() );
}
++aIter;
}
}
void SwFormatClipboard::Paste( SwWrtShell& rWrtShell, SfxStyleSheetBasePool* pPool
, bool bNoCharacterFormats, bool bNoParagraphFormats )
{
int nSelectionType = rWrtShell.GetSelectionType();
if( !this->HasContentForThisType(nSelectionType) )
{
if(!m_bPersistentCopy)
this->Erase();
return;
}
rWrtShell.StartAction();
rWrtShell.StartUndo(UNDO_INSATTR);
ItemVector aItemVector;
if(pPool) //to find the styles we need the pool
{
if( nSelectionType & nsSelectionType::SEL_TXT )
{
if(m_aCharStyle.Len() && !bNoCharacterFormats )
{
SwDocStyleSheet* pStyle = (SwDocStyleSheet*)pPool->Find(m_aCharStyle, SFX_STYLE_FAMILY_CHAR);
if( pStyle )
{
SwFmtCharFmt aFmt(pStyle->GetCharFmt());
// #144857# collect items from character style
lcl_AppendSetItems( aItemVector, aFmt.GetCharFmt()->GetAttrSet());
sal_uInt16 nFlags=0; //(nMode & KEY_SHIFT) ? SETATTR_DONTREPLACE : SETATTR_DEFAULT;
rWrtShell.SetAttrItem( aFmt, nFlags );
}
}
if(m_aParaStyle.Len() && !bNoParagraphFormats )
{
SwDocStyleSheet* pStyle = (SwDocStyleSheet*)pPool->Find(m_aParaStyle, SFX_STYLE_FAMILY_PARA);
if( pStyle )
{
// #144857# collect items from paragraph style
lcl_AppendSetItems( aItemVector, pStyle->GetCollection()->GetAttrSet());
rWrtShell.SetTxtFmtColl( pStyle->GetCollection() );
}
}
}
}
if(m_pItemSet)
{
if( nSelectionType & nsSelectionType::SEL_DRW )
{
SdrView* pDrawView = rWrtShell.GetDrawView();
if(pDrawView)
{
sal_Bool bReplaceAll = sal_True;
pDrawView->SetAttrToMarked(*m_pItemSet, bReplaceAll);
}
}
else
{
SfxItemSet* pTemplateItemSet = lcl_CreateEmptyItemSet(
nSelectionType, *m_pItemSet->GetPool()
, bNoCharacterFormats, bNoParagraphFormats );
if(pTemplateItemSet)
{
pTemplateItemSet->Put( *m_pItemSet );
// #144857# only _set_ attributes that differ from style attributes should be applied - the style is applied anyway
lcl_RemoveEqualItems( *pTemplateItemSet, aItemVector );
if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) )
rWrtShell.SetFlyFrmAttr(*pTemplateItemSet);
else
{
rWrtShell.SetAttrSet(*pTemplateItemSet);
// additional numbering properties for paragraph styles
if( nSelectionType & nsSelectionType::SEL_TXT && rWrtShell.GetCurNumRule() )
{
if( SFX_ITEM_SET == pTemplateItemSet->GetItemState(FN_NUMBER_NEWSTART) )
{
sal_Bool bStart = ((SfxBoolItem&)pTemplateItemSet->Get(FN_NUMBER_NEWSTART)).GetValue();
sal_uInt16 nNumStart = USHRT_MAX;
if( SFX_ITEM_SET == pTemplateItemSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
{
nNumStart = ((SfxUInt16Item&)pTemplateItemSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue();
if(USHRT_MAX != nNumStart)
bStart = sal_False;
}
rWrtShell.SetNumRuleStart(bStart);
rWrtShell.SetNodeNumStart(nNumStart);
}
else if( SFX_ITEM_SET == pTemplateItemSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
{
sal_uInt16 nNumStart = ((SfxUInt16Item&)pTemplateItemSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue();
rWrtShell.SetNodeNumStart(nNumStart);
rWrtShell.SetNumRuleStart(sal_False);
}
}
}
delete pTemplateItemSet;
}
}
}
if( m_pTableItemSet && nSelectionType & (nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS) )
lcl_setTableAttributes( *m_pTableItemSet, rWrtShell );
rWrtShell.EndUndo(UNDO_INSATTR);
rWrtShell.EndAction();
if(!m_bPersistentCopy)
this->Erase();
}
void SwFormatClipboard::Erase()
{
m_nSelectionType = 0;
if(m_pItemSet)
{
delete m_pItemSet;
m_pItemSet = 0;
}
if(m_pTableItemSet)
{
delete m_pTableItemSet;
m_pTableItemSet = 0;
}
if( m_aCharStyle.Len() )
m_aCharStyle.Erase();
if( m_aParaStyle.Len() )
m_aParaStyle.Erase();
m_bPersistentCopy = false;
}