summaryrefslogtreecommitdiff
path: root/sw/source/ui/uiview/formatclipboard.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/uiview/formatclipboard.cxx')
-rw-r--r--sw/source/ui/uiview/formatclipboard.cxx590
1 files changed, 590 insertions, 0 deletions
diff --git a/sw/source/ui/uiview/formatclipboard.cxx b/sw/source/ui/uiview/formatclipboard.cxx
new file mode 100644
index 000000000000..0fa7a6a00071
--- /dev/null
+++ b/sw/source/ui/uiview/formatclipboard.cxx
@@ -0,0 +1,590 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#include "formatclipboard.hxx"
+
+
+#include <hintids.hxx>
+#include <svx/svxids.hrc>
+#include <cmdid.h>
+#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>
+
+
+
+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,
+ 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);
+}
+
+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));
+}
+}//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;
+// 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;
+ }
+}
+// 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());
+ // collect items from character style
+ lcl_AppendSetItems( aItemVector, aFmt.GetCharFmt()->GetAttrSet());
+ sal_uInt16 nFlags=0;
+ rWrtShell.SetAttr( aFmt, nFlags );
+ }
+ }
+ if(m_aParaStyle.Len() && !bNoParagraphFormats )
+ {
+ SwDocStyleSheet* pStyle = (SwDocStyleSheet*)pPool->Find(m_aParaStyle, SFX_STYLE_FAMILY_PARA);
+ if( pStyle )
+ {
+ // 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 );
+ // 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.SetAttr(*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;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */