1*efeef26fSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*efeef26fSAndrew Rist * distributed with this work for additional information 6*efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*efeef26fSAndrew Rist * "License"); you may not use this file except in compliance 9*efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*efeef26fSAndrew Rist * software distributed under the License is distributed on an 15*efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*efeef26fSAndrew Rist * KIND, either express or implied. See the License for the 17*efeef26fSAndrew Rist * specific language governing permissions and limitations 18*efeef26fSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*efeef26fSAndrew Rist *************************************************************/ 21*efeef26fSAndrew Rist 22*efeef26fSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sw.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "formatclipboard.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include <hintids.hxx> 31cdf0e10cSrcweir #ifndef _SVX_SVXIDS_HRC 32cdf0e10cSrcweir #include <svx/svxids.hrc> 33cdf0e10cSrcweir #endif 34cdf0e10cSrcweir #ifndef _CMDID_H 35cdf0e10cSrcweir #include <cmdid.h> 36cdf0e10cSrcweir #endif 37cdf0e10cSrcweir #include <format.hxx> 38cdf0e10cSrcweir #include <charfmt.hxx> 39cdf0e10cSrcweir #include <fmtcol.hxx> 40cdf0e10cSrcweir #include <frmfmt.hxx> 41cdf0e10cSrcweir #include <docstyle.hxx> 42cdf0e10cSrcweir #include <fchrfmt.hxx> 43cdf0e10cSrcweir #include <pam.hxx> 44cdf0e10cSrcweir // header for class SdrView 45cdf0e10cSrcweir #include <svx/svdview.hxx> 46cdf0e10cSrcweir //SvxBrushItem 47cdf0e10cSrcweir #include <editeng/brshitem.hxx> 48cdf0e10cSrcweir #include <editeng/shaditem.hxx> 49cdf0e10cSrcweir #include <frmatr.hxx> 50cdf0e10cSrcweir // header for class SvxBoxInfoItem 51cdf0e10cSrcweir #include <editeng/boxitem.hxx> 52cdf0e10cSrcweir // header for class SvxFmtBreakItem 53cdf0e10cSrcweir #include <editeng/brkitem.hxx> 54cdf0e10cSrcweir // header for class SwFmtLayoutSplit 55cdf0e10cSrcweir #include <fmtlsplt.hxx> 56cdf0e10cSrcweir // header for class SvxFmtKeepItem 57cdf0e10cSrcweir #include <editeng/keepitem.hxx> 58cdf0e10cSrcweir // header for class SvxFrameDirectionItem 59cdf0e10cSrcweir #include <editeng/frmdiritem.hxx> 60cdf0e10cSrcweir #include <paratr.hxx> 61cdf0e10cSrcweir #include <fmtpdsc.hxx> 62cdf0e10cSrcweir #include <fmtrowsplt.hxx> 63cdf0e10cSrcweir #include <swundo.hxx> // fuer die UndoIds 64cdf0e10cSrcweir #include <boost/shared_ptr.hpp> 65cdf0e10cSrcweir 66cdf0e10cSrcweir //#define FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES 1 67cdf0e10cSrcweir 68cdf0e10cSrcweir #ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES 69cdf0e10cSrcweir #include <cellatr.hxx> 70cdf0e10cSrcweir #endif 71cdf0e10cSrcweir 72cdf0e10cSrcweir /*-------------------------------------------------------------------- 73cdf0e10cSrcweir --------------------------------------------------------------------*/ 74cdf0e10cSrcweir 75cdf0e10cSrcweir namespace 76cdf0e10cSrcweir { 77cdf0e10cSrcweir #define FORMAT_PAINTBRUSH_FRAME_IDS \ 78cdf0e10cSrcweir RES_FRMATR_BEGIN, RES_FILL_ORDER, \ 79cdf0e10cSrcweir /* no RES_FRM_SIZE */ \ 80cdf0e10cSrcweir RES_PAPER_BIN, RES_SURROUND, \ 81cdf0e10cSrcweir /* no RES_VERT_ORIENT */ \ 82cdf0e10cSrcweir /* no RES_HORI_ORIENT */ \ 83cdf0e10cSrcweir /* no RES_ANCHOR */ \ 84cdf0e10cSrcweir RES_BACKGROUND, RES_SHADOW, \ 85cdf0e10cSrcweir /* no RES_FRMMACRO */ \ 86cdf0e10cSrcweir RES_COL, RES_KEEP, \ 87cdf0e10cSrcweir /* no RES_URL */ \ 88cdf0e10cSrcweir RES_EDIT_IN_READONLY, RES_LAYOUT_SPLIT, \ 89cdf0e10cSrcweir /* no RES_CHAIN */ \ 90cdf0e10cSrcweir RES_TEXTGRID, RES_FRMATR_END-1, 91cdf0e10cSrcweir 92cdf0e10cSrcweir #define FORMAT_PAINTBRUSH_PARAGRAPH_IDS \ 93cdf0e10cSrcweir RES_PARATR_BEGIN, RES_PARATR_END -1, \ 94cdf0e10cSrcweir RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END -1, \ 95cdf0e10cSrcweir FORMAT_PAINTBRUSH_FRAME_IDS \ 96cdf0e10cSrcweir FN_NUMBER_NEWSTART, FN_NUMBER_NEWSTART, \ 97cdf0e10cSrcweir FN_NUMBER_NEWSTART_AT, FN_NUMBER_NEWSTART_AT, 98cdf0e10cSrcweir 99cdf0e10cSrcweir SfxItemSet* lcl_CreateEmptyItemSet( int nSelectionType, SfxItemPool& rPool 100cdf0e10cSrcweir , bool bNoCharacterFormats = false, bool bNoParagraphFormats = false ) 101cdf0e10cSrcweir { 102cdf0e10cSrcweir SfxItemSet* pItemSet = 0; 103cdf0e10cSrcweir if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) ) 104cdf0e10cSrcweir { 105cdf0e10cSrcweir pItemSet = new SfxItemSet(rPool, 106cdf0e10cSrcweir FORMAT_PAINTBRUSH_FRAME_IDS 107cdf0e10cSrcweir 0); 108cdf0e10cSrcweir } 109cdf0e10cSrcweir else if( nSelectionType & nsSelectionType::SEL_DRW ) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir //is handled different 112cdf0e10cSrcweir } 113cdf0e10cSrcweir else if( nSelectionType == nsSelectionType::SEL_TBL ) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir pItemSet = new SfxItemSet(rPool, 116cdf0e10cSrcweir SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_SHADOW, //SID_ATTR_BORDER_OUTER is inbetween 117cdf0e10cSrcweir RES_BACKGROUND, RES_SHADOW, //RES_BOX is inbetween 118cdf0e10cSrcweir SID_ATTR_BRUSH_ROW, SID_ATTR_BRUSH_TABLE, 119cdf0e10cSrcweir RES_BREAK, RES_BREAK, 120cdf0e10cSrcweir RES_PAGEDESC, RES_PAGEDESC, 121cdf0e10cSrcweir RES_LAYOUT_SPLIT, RES_LAYOUT_SPLIT, 122cdf0e10cSrcweir RES_ROW_SPLIT, RES_ROW_SPLIT, 123cdf0e10cSrcweir RES_KEEP, RES_KEEP, 124cdf0e10cSrcweir RES_FRAMEDIR, RES_FRAMEDIR, 125cdf0e10cSrcweir FN_PARAM_TABLE_HEADLINE, FN_PARAM_TABLE_HEADLINE, 126cdf0e10cSrcweir FN_TABLE_BOX_TEXTDIRECTION, FN_TABLE_BOX_TEXTDIRECTION, 127cdf0e10cSrcweir FN_TABLE_SET_VERT_ALIGN, FN_TABLE_SET_VERT_ALIGN, 128cdf0e10cSrcweir #ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES 129cdf0e10cSrcweir RES_BOXATR_FORMAT, RES_BOXATR_FORMAT, 130cdf0e10cSrcweir #endif 131cdf0e10cSrcweir 0); 132cdf0e10cSrcweir } 133cdf0e10cSrcweir else if( nSelectionType & nsSelectionType::SEL_TXT ) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir if( bNoCharacterFormats ) 136cdf0e10cSrcweir pItemSet = new SfxItemSet(rPool, 137cdf0e10cSrcweir FORMAT_PAINTBRUSH_PARAGRAPH_IDS 138cdf0e10cSrcweir 0); 139cdf0e10cSrcweir else if( bNoParagraphFormats ) 140cdf0e10cSrcweir pItemSet = new SfxItemSet(rPool, 141cdf0e10cSrcweir RES_CHRATR_BEGIN, RES_CHRATR_END - 1, 142cdf0e10cSrcweir 0); 143cdf0e10cSrcweir else 144cdf0e10cSrcweir pItemSet = new SfxItemSet(rPool, 145cdf0e10cSrcweir RES_CHRATR_BEGIN, RES_CHRATR_END - 1, 146cdf0e10cSrcweir FORMAT_PAINTBRUSH_PARAGRAPH_IDS 147cdf0e10cSrcweir 0); 148cdf0e10cSrcweir } 149cdf0e10cSrcweir return pItemSet; 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir void lcl_getTableAttributes( SfxItemSet& rSet, SwWrtShell &rSh ) 153cdf0e10cSrcweir { 154cdf0e10cSrcweir SvxBrushItem aBrush( RES_BACKGROUND ); 155cdf0e10cSrcweir rSh.GetBoxBackground(aBrush); 156cdf0e10cSrcweir rSet.Put( aBrush ); 157cdf0e10cSrcweir if(rSh.GetRowBackground(aBrush)) 158cdf0e10cSrcweir rSet.Put( aBrush, SID_ATTR_BRUSH_ROW ); 159cdf0e10cSrcweir else 160cdf0e10cSrcweir rSet.InvalidateItem(SID_ATTR_BRUSH_ROW); 161cdf0e10cSrcweir rSh.GetTabBackground(aBrush); 162cdf0e10cSrcweir rSet.Put( aBrush, SID_ATTR_BRUSH_TABLE ); 163cdf0e10cSrcweir 164cdf0e10cSrcweir SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER ); 165cdf0e10cSrcweir rSet.Put(aBoxInfo); 166cdf0e10cSrcweir rSh.GetTabBorders( rSet ); 167cdf0e10cSrcweir 168cdf0e10cSrcweir SvxFrameDirectionItem aBoxDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR ); 169cdf0e10cSrcweir if(rSh.GetBoxDirection( aBoxDirection )) 170cdf0e10cSrcweir rSet.Put(aBoxDirection, FN_TABLE_BOX_TEXTDIRECTION); 171cdf0e10cSrcweir 172cdf0e10cSrcweir rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, rSh.GetBoxAlign())); 173cdf0e10cSrcweir 174cdf0e10cSrcweir rSet.Put( SfxUInt16Item( FN_PARAM_TABLE_HEADLINE, rSh.GetRowsToRepeat() ) ); 175cdf0e10cSrcweir 176cdf0e10cSrcweir SwFrmFmt *pFrmFmt = rSh.GetTableFmt(); 177cdf0e10cSrcweir if(pFrmFmt) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir rSet.Put( pFrmFmt->GetShadow() ); 180cdf0e10cSrcweir rSet.Put( pFrmFmt->GetBreak() ); 181cdf0e10cSrcweir rSet.Put( pFrmFmt->GetPageDesc() ); 182cdf0e10cSrcweir rSet.Put( pFrmFmt->GetLayoutSplit() ); 183cdf0e10cSrcweir rSet.Put( pFrmFmt->GetKeep() ); 184cdf0e10cSrcweir rSet.Put( pFrmFmt->GetFrmDir() ); 185cdf0e10cSrcweir } 186cdf0e10cSrcweir 187cdf0e10cSrcweir SwFmtRowSplit* pSplit = 0; 188cdf0e10cSrcweir rSh.GetRowSplit(pSplit); 189cdf0e10cSrcweir if(pSplit) 190cdf0e10cSrcweir rSet.Put(*pSplit); 191cdf0e10cSrcweir 192cdf0e10cSrcweir //-- numberformat in cells 193cdf0e10cSrcweir #ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES 194cdf0e10cSrcweir rSh.GetTblBoxFormulaAttrs( rSet ); //RES_BOXATR_FORMAT 195cdf0e10cSrcweir #endif 196cdf0e10cSrcweir } 197cdf0e10cSrcweir 198cdf0e10cSrcweir void lcl_setTableAttributes( const SfxItemSet& rSet, SwWrtShell &rSh ) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir const SfxPoolItem* pItem = 0; 201cdf0e10cSrcweir sal_Bool bBorder = ( SFX_ITEM_SET == rSet.GetItemState( RES_BOX ) || 202cdf0e10cSrcweir SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER ) ); 203cdf0e10cSrcweir pItem = 0; 204cdf0e10cSrcweir sal_Bool bBackground = SFX_ITEM_SET == rSet.GetItemState( RES_BACKGROUND, sal_False, &pItem ); 205cdf0e10cSrcweir const SfxPoolItem* pRowItem = 0, *pTableItem = 0; 206cdf0e10cSrcweir bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_ROW, sal_False, &pRowItem ); 207cdf0e10cSrcweir bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_TABLE, sal_False, &pTableItem ); 208cdf0e10cSrcweir 209cdf0e10cSrcweir if(bBackground) 210cdf0e10cSrcweir { 211cdf0e10cSrcweir if(pItem) 212cdf0e10cSrcweir rSh.SetBoxBackground( *(const SvxBrushItem*)pItem ); 213cdf0e10cSrcweir if(pRowItem) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir SvxBrushItem aBrush(*(const SvxBrushItem*)pRowItem); 216cdf0e10cSrcweir aBrush.SetWhich(RES_BACKGROUND); 217cdf0e10cSrcweir rSh.SetRowBackground(aBrush); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir if(pTableItem) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir SvxBrushItem aBrush(*(const SvxBrushItem*)pTableItem); 222cdf0e10cSrcweir aBrush.SetWhich(RES_BACKGROUND); 223cdf0e10cSrcweir rSh.SetTabBackground( aBrush ); 224cdf0e10cSrcweir } 225cdf0e10cSrcweir } 226cdf0e10cSrcweir if(bBorder) 227cdf0e10cSrcweir rSh.SetTabBorders( rSet ); 228cdf0e10cSrcweir 229cdf0e10cSrcweir if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, sal_False, &pItem) ) 230cdf0e10cSrcweir rSh.SetRowsToRepeat( ((SfxUInt16Item*)pItem)->GetValue() ); 231cdf0e10cSrcweir 232cdf0e10cSrcweir SwFrmFmt* pFrmFmt = rSh.GetTableFmt(); 233cdf0e10cSrcweir if(pFrmFmt) 234cdf0e10cSrcweir { 235cdf0e10cSrcweir //RES_SHADOW 236cdf0e10cSrcweir pItem=0; 237cdf0e10cSrcweir rSet.GetItemState(rSet.GetPool()->GetWhich(RES_SHADOW), sal_False, &pItem); 238cdf0e10cSrcweir if(pItem) 239cdf0e10cSrcweir pFrmFmt->SetFmtAttr( *pItem ); 240cdf0e10cSrcweir 241cdf0e10cSrcweir //RES_BREAK 242cdf0e10cSrcweir pItem=0; 243cdf0e10cSrcweir rSet.GetItemState(rSet.GetPool()->GetWhich(RES_BREAK), sal_False, &pItem); 244cdf0e10cSrcweir if(pItem) 245cdf0e10cSrcweir pFrmFmt->SetFmtAttr( *pItem ); 246cdf0e10cSrcweir 247cdf0e10cSrcweir //RES_PAGEDESC 248cdf0e10cSrcweir pItem=0; 249cdf0e10cSrcweir rSet.GetItemState(rSet.GetPool()->GetWhich(RES_PAGEDESC), sal_False, &pItem); 250cdf0e10cSrcweir if(pItem) 251cdf0e10cSrcweir pFrmFmt->SetFmtAttr( *pItem ); 252cdf0e10cSrcweir 253cdf0e10cSrcweir //RES_LAYOUT_SPLIT 254cdf0e10cSrcweir pItem=0; 255cdf0e10cSrcweir rSet.GetItemState(rSet.GetPool()->GetWhich(RES_LAYOUT_SPLIT), sal_False, &pItem); 256cdf0e10cSrcweir if(pItem) 257cdf0e10cSrcweir pFrmFmt->SetFmtAttr( *pItem ); 258cdf0e10cSrcweir 259cdf0e10cSrcweir //RES_KEEP 260cdf0e10cSrcweir pItem=0; 261cdf0e10cSrcweir rSet.GetItemState(rSet.GetPool()->GetWhich(RES_KEEP), sal_False, &pItem); 262cdf0e10cSrcweir if(pItem) 263cdf0e10cSrcweir pFrmFmt->SetFmtAttr( *pItem ); 264cdf0e10cSrcweir 265cdf0e10cSrcweir //RES_FRAMEDIR 266cdf0e10cSrcweir pItem=0; 267cdf0e10cSrcweir rSet.GetItemState(rSet.GetPool()->GetWhich(RES_FRAMEDIR), sal_False, &pItem); 268cdf0e10cSrcweir if(pItem) 269cdf0e10cSrcweir pFrmFmt->SetFmtAttr( *pItem ); 270cdf0e10cSrcweir } 271cdf0e10cSrcweir 272cdf0e10cSrcweir if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_BOX_TEXTDIRECTION, sal_False, &pItem) ) 273cdf0e10cSrcweir { 274cdf0e10cSrcweir SvxFrameDirectionItem aDirection( FRMDIR_ENVIRONMENT, RES_FRAMEDIR ); 275cdf0e10cSrcweir aDirection.SetValue(static_cast< const SvxFrameDirectionItem* >(pItem)->GetValue()); 276cdf0e10cSrcweir rSh.SetBoxDirection(aDirection); 277cdf0e10cSrcweir } 278cdf0e10cSrcweir 279cdf0e10cSrcweir if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_SET_VERT_ALIGN, sal_False, &pItem)) 280cdf0e10cSrcweir rSh.SetBoxAlign(((SfxUInt16Item*)(pItem))->GetValue()); 281cdf0e10cSrcweir 282cdf0e10cSrcweir if( SFX_ITEM_SET == rSet.GetItemState( RES_ROW_SPLIT, sal_False, &pItem) ) 283cdf0e10cSrcweir rSh.SetRowSplit(*static_cast<const SwFmtRowSplit*>(pItem)); 284cdf0e10cSrcweir 285cdf0e10cSrcweir //-- numberformat in cells 286cdf0e10cSrcweir #ifdef FORMAT_PAINTBRUSH_ALSO_COPY_NUMBERFORMAT_FOR_TABLES 287cdf0e10cSrcweir if( SFX_ITEM_SET == rSet.GetItemState( RES_BOXATR_FORMAT, sal_False, &pItem )) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir SfxItemSet aBoxSet( *rSet.GetPool(), RES_BOXATR_FORMAT, RES_BOXATR_FORMAT ); 290cdf0e10cSrcweir aBoxSet.Put( SwTblBoxNumFormat( ((SfxUInt32Item*)pItem)->GetValue() )); 291cdf0e10cSrcweir rSh.SetTblBoxFormulaAttrs( aBoxSet ); 292cdf0e10cSrcweir 293cdf0e10cSrcweir } 294cdf0e10cSrcweir #endif 295cdf0e10cSrcweir } 296cdf0e10cSrcweir }//end anonymous namespace 297cdf0e10cSrcweir 298cdf0e10cSrcweir SwFormatClipboard::SwFormatClipboard() 299cdf0e10cSrcweir : m_nSelectionType(0) 300cdf0e10cSrcweir , m_pItemSet(0) 301cdf0e10cSrcweir , m_pTableItemSet(0) 302cdf0e10cSrcweir , m_bPersistentCopy(false) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir } 305cdf0e10cSrcweir SwFormatClipboard::~SwFormatClipboard() 306cdf0e10cSrcweir { 307cdf0e10cSrcweir if(m_pItemSet) 308cdf0e10cSrcweir delete m_pItemSet; 309cdf0e10cSrcweir if(m_pTableItemSet) 310cdf0e10cSrcweir delete m_pTableItemSet; 311cdf0e10cSrcweir } 312cdf0e10cSrcweir 313cdf0e10cSrcweir bool SwFormatClipboard::HasContent() const 314cdf0e10cSrcweir { 315cdf0e10cSrcweir return m_pItemSet!=0 316cdf0e10cSrcweir || m_pTableItemSet != 0 317cdf0e10cSrcweir || m_aCharStyle.Len() 318cdf0e10cSrcweir || m_aParaStyle.Len() 319cdf0e10cSrcweir ; 320cdf0e10cSrcweir } 321cdf0e10cSrcweir bool SwFormatClipboard::HasContentForThisType( int nSelectionType ) const 322cdf0e10cSrcweir { 323cdf0e10cSrcweir if( !HasContent() ) 324cdf0e10cSrcweir return false; 325cdf0e10cSrcweir 326cdf0e10cSrcweir if( m_nSelectionType == nSelectionType ) 327cdf0e10cSrcweir return true; 328cdf0e10cSrcweir 329cdf0e10cSrcweir if( ( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) ) 330cdf0e10cSrcweir && 331cdf0e10cSrcweir ( m_nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) ) 332cdf0e10cSrcweir ) 333cdf0e10cSrcweir return true; 334cdf0e10cSrcweir 335cdf0e10cSrcweir if( nSelectionType & nsSelectionType::SEL_TXT && m_nSelectionType & nsSelectionType::SEL_TXT ) 336cdf0e10cSrcweir return true; 337cdf0e10cSrcweir 338cdf0e10cSrcweir return false; 339cdf0e10cSrcweir } 340cdf0e10cSrcweir 341cdf0e10cSrcweir bool SwFormatClipboard::CanCopyThisType( int nSelectionType ) const 342cdf0e10cSrcweir { 343cdf0e10cSrcweir if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF 344cdf0e10cSrcweir | nsSelectionType::SEL_TXT | nsSelectionType::SEL_DRW | nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS ) ) 345cdf0e10cSrcweir return true; 346cdf0e10cSrcweir return false; 347cdf0e10cSrcweir } 348cdf0e10cSrcweir 349cdf0e10cSrcweir void SwFormatClipboard::Copy( SwWrtShell& rWrtShell, SfxItemPool& rPool, bool bPersistentCopy ) 350cdf0e10cSrcweir { 351cdf0e10cSrcweir this->Erase(); 352cdf0e10cSrcweir m_bPersistentCopy = bPersistentCopy; 353cdf0e10cSrcweir 354cdf0e10cSrcweir int nSelectionType = rWrtShell.GetSelectionType(); 355cdf0e10cSrcweir SfxItemSet* pItemSet = lcl_CreateEmptyItemSet( nSelectionType, rPool ); 356cdf0e10cSrcweir 357cdf0e10cSrcweir rWrtShell.StartAction(); 358cdf0e10cSrcweir rWrtShell.Push(); 359cdf0e10cSrcweir if( nSelectionType == nsSelectionType::SEL_TXT ) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir SwPaM* pCrsr = rWrtShell.GetCrsr(); 362cdf0e10cSrcweir //select one character only to get the attributes of this single character only 363cdf0e10cSrcweir sal_Bool bHasSelection = pCrsr->HasMark(); 364cdf0e10cSrcweir sal_Bool bForwardSelection = sal_False; 365cdf0e10cSrcweir 366cdf0e10cSrcweir if(!bHasSelection) //check for and handle multiselections 367cdf0e10cSrcweir { 368cdf0e10cSrcweir if( pCrsr->GetPrev() != pCrsr && pCrsr->GetPrev() != 0) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir pCrsr = (SwPaM*)pCrsr->GetPrev(); 371cdf0e10cSrcweir bForwardSelection = (*pCrsr->GetPoint()) > (*pCrsr->GetMark()); 372cdf0e10cSrcweir bHasSelection = true; 373cdf0e10cSrcweir pCrsr->DeleteMark(); 374cdf0e10cSrcweir pCrsr->SetMark(); 375cdf0e10cSrcweir rWrtShell.KillPams(); 376cdf0e10cSrcweir pCrsr = rWrtShell.GetCrsr(); 377cdf0e10cSrcweir } 378cdf0e10cSrcweir } 379cdf0e10cSrcweir else 380cdf0e10cSrcweir bForwardSelection = (*pCrsr->GetPoint()) > (*pCrsr->GetMark()); 381cdf0e10cSrcweir pCrsr->DeleteMark(); 382cdf0e10cSrcweir pCrsr->SetMark(); 383cdf0e10cSrcweir 384cdf0e10cSrcweir if( !bHasSelection && rWrtShell.IsInRightToLeftText() ) 385cdf0e10cSrcweir bForwardSelection = !bForwardSelection; 386cdf0e10cSrcweir 387cdf0e10cSrcweir if( !( !bHasSelection && rWrtShell.IsEndPara() ) ) 388cdf0e10cSrcweir pCrsr->Move( bForwardSelection ? fnMoveBackward : fnMoveForward ); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir 391cdf0e10cSrcweir if(pItemSet) 392cdf0e10cSrcweir { 393cdf0e10cSrcweir if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) ) 394cdf0e10cSrcweir rWrtShell.GetFlyFrmAttr(*pItemSet); 395cdf0e10cSrcweir else 396cdf0e10cSrcweir { 397cdf0e10cSrcweir rWrtShell.GetCurAttr(*pItemSet); 398cdf0e10cSrcweir 399cdf0e10cSrcweir // additional numbering properties for paragraph styles 400cdf0e10cSrcweir if( nSelectionType & nsSelectionType::SEL_TXT && rWrtShell.GetCurNumRule() ) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir SfxBoolItem aStart(FN_NUMBER_NEWSTART, rWrtShell.IsNumRuleStart()); 403cdf0e10cSrcweir pItemSet->Put(aStart); 404cdf0e10cSrcweir SfxUInt16Item aStartAt(FN_NUMBER_NEWSTART_AT, rWrtShell.GetNodeNumStart()); 405cdf0e10cSrcweir pItemSet->Put(aStartAt); 406cdf0e10cSrcweir } 407cdf0e10cSrcweir } 408cdf0e10cSrcweir } 409cdf0e10cSrcweir else if ( nSelectionType & nsSelectionType::SEL_DRW ) 410cdf0e10cSrcweir { 411cdf0e10cSrcweir SdrView* pDrawView = rWrtShell.GetDrawView(); 412cdf0e10cSrcweir if(pDrawView) 413cdf0e10cSrcweir { 414cdf0e10cSrcweir sal_Bool bOnlyHardAttr = sal_True; 415cdf0e10cSrcweir if( pDrawView->AreObjectsMarked() ) 416cdf0e10cSrcweir { 417cdf0e10cSrcweir pItemSet = new SfxItemSet( pDrawView->GetAttrFromMarked(bOnlyHardAttr) ); 418cdf0e10cSrcweir //remove attributes defining the type/data of custom shapes 419cdf0e10cSrcweir pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_ENGINE); 420cdf0e10cSrcweir pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_DATA); 421cdf0e10cSrcweir pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_GEOMETRY); 422cdf0e10cSrcweir pItemSet->ClearItem(SDRATTR_CUSTOMSHAPE_REPLACEMENT_URL); 423cdf0e10cSrcweir } 424cdf0e10cSrcweir } 425cdf0e10cSrcweir } 426cdf0e10cSrcweir if( nSelectionType & nsSelectionType::SEL_TBL_CELLS )//only copy table attributes if really cells are selected (not only text in tables) 427cdf0e10cSrcweir { 428cdf0e10cSrcweir m_pTableItemSet = lcl_CreateEmptyItemSet( nsSelectionType::SEL_TBL, rPool ); 429cdf0e10cSrcweir lcl_getTableAttributes( *m_pTableItemSet, rWrtShell ); 430cdf0e10cSrcweir } 431cdf0e10cSrcweir 432cdf0e10cSrcweir m_nSelectionType = nSelectionType; 433cdf0e10cSrcweir m_pItemSet = pItemSet; 434cdf0e10cSrcweir 435cdf0e10cSrcweir if( nSelectionType & nsSelectionType::SEL_TXT ) 436cdf0e10cSrcweir { 437cdf0e10cSrcweir SwFmt* pFmt = rWrtShell.GetCurCharFmt(); 438cdf0e10cSrcweir if( pFmt ) 439cdf0e10cSrcweir m_aCharStyle = pFmt->GetName(); 440cdf0e10cSrcweir 441cdf0e10cSrcweir pFmt = rWrtShell.GetCurTxtFmtColl(); 442cdf0e10cSrcweir if( pFmt ) 443cdf0e10cSrcweir m_aParaStyle = pFmt->GetName(); 444cdf0e10cSrcweir } 445cdf0e10cSrcweir rWrtShell.Pop(sal_False); 446cdf0e10cSrcweir rWrtShell.EndAction(); 447cdf0e10cSrcweir } 448cdf0e10cSrcweir typedef boost::shared_ptr< SfxPoolItem > SfxPoolItemSharedPtr; 449cdf0e10cSrcweir typedef std::vector< SfxPoolItemSharedPtr > ItemVector; 450cdf0e10cSrcweir // #144857# collect all PoolItems from the applied styles 451cdf0e10cSrcweir void lcl_AppendSetItems( ItemVector& rItemVector, const SfxItemSet& rStyleAttrSet ) 452cdf0e10cSrcweir { 453cdf0e10cSrcweir const sal_uInt16* pRanges = rStyleAttrSet.GetRanges(); 454cdf0e10cSrcweir while( *pRanges ) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir for ( sal_uInt16 nWhich = *pRanges; nWhich <= *(pRanges+1); ++nWhich ) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir const SfxPoolItem* pItem; 459cdf0e10cSrcweir if( SFX_ITEM_SET == rStyleAttrSet.GetItemState( nWhich, sal_False, &pItem ) ) 460cdf0e10cSrcweir { 461cdf0e10cSrcweir rItemVector.push_back( SfxPoolItemSharedPtr( pItem->Clone() ) ); 462cdf0e10cSrcweir } 463cdf0e10cSrcweir } 464cdf0e10cSrcweir pRanges += 2; 465cdf0e10cSrcweir } 466cdf0e10cSrcweir } 467cdf0e10cSrcweir // #144857# remove all items that are inherited from the styles 468cdf0e10cSrcweir void lcl_RemoveEqualItems( SfxItemSet& rTemplateItemSet, ItemVector& rItemVector ) 469cdf0e10cSrcweir { 470cdf0e10cSrcweir ItemVector::iterator aEnd = rItemVector.end(); 471cdf0e10cSrcweir ItemVector::iterator aIter = rItemVector.begin(); 472cdf0e10cSrcweir while( aIter != aEnd ) 473cdf0e10cSrcweir { 474cdf0e10cSrcweir const SfxPoolItem* pItem; 475cdf0e10cSrcweir if( SFX_ITEM_SET == rTemplateItemSet.GetItemState( (*aIter)->Which(), sal_True, &pItem ) && 476cdf0e10cSrcweir *pItem == *(*aIter) ) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir rTemplateItemSet.ClearItem( (*aIter)->Which() ); 479cdf0e10cSrcweir } 480cdf0e10cSrcweir ++aIter; 481cdf0e10cSrcweir } 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir void SwFormatClipboard::Paste( SwWrtShell& rWrtShell, SfxStyleSheetBasePool* pPool 485cdf0e10cSrcweir , bool bNoCharacterFormats, bool bNoParagraphFormats ) 486cdf0e10cSrcweir { 487cdf0e10cSrcweir int nSelectionType = rWrtShell.GetSelectionType(); 488cdf0e10cSrcweir if( !this->HasContentForThisType(nSelectionType) ) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir if(!m_bPersistentCopy) 491cdf0e10cSrcweir this->Erase(); 492cdf0e10cSrcweir return; 493cdf0e10cSrcweir } 494cdf0e10cSrcweir 495cdf0e10cSrcweir rWrtShell.StartAction(); 496cdf0e10cSrcweir rWrtShell.StartUndo(UNDO_INSATTR); 497cdf0e10cSrcweir 498cdf0e10cSrcweir ItemVector aItemVector; 499cdf0e10cSrcweir if(pPool) //to find the styles we need the pool 500cdf0e10cSrcweir { 501cdf0e10cSrcweir if( nSelectionType & nsSelectionType::SEL_TXT ) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir if(m_aCharStyle.Len() && !bNoCharacterFormats ) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir SwDocStyleSheet* pStyle = (SwDocStyleSheet*)pPool->Find(m_aCharStyle, SFX_STYLE_FAMILY_CHAR); 506cdf0e10cSrcweir if( pStyle ) 507cdf0e10cSrcweir { 508cdf0e10cSrcweir SwFmtCharFmt aFmt(pStyle->GetCharFmt()); 509cdf0e10cSrcweir // #144857# collect items from character style 510cdf0e10cSrcweir lcl_AppendSetItems( aItemVector, aFmt.GetCharFmt()->GetAttrSet()); 511cdf0e10cSrcweir sal_uInt16 nFlags=0; //(nMode & KEY_SHIFT) ? SETATTR_DONTREPLACE : SETATTR_DEFAULT; 512cdf0e10cSrcweir rWrtShell.SetAttr( aFmt, nFlags ); 513cdf0e10cSrcweir } 514cdf0e10cSrcweir } 515cdf0e10cSrcweir if(m_aParaStyle.Len() && !bNoParagraphFormats ) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir SwDocStyleSheet* pStyle = (SwDocStyleSheet*)pPool->Find(m_aParaStyle, SFX_STYLE_FAMILY_PARA); 518cdf0e10cSrcweir if( pStyle ) 519cdf0e10cSrcweir { 520cdf0e10cSrcweir // #144857# collect items from paragraph style 521cdf0e10cSrcweir lcl_AppendSetItems( aItemVector, pStyle->GetCollection()->GetAttrSet()); 522cdf0e10cSrcweir rWrtShell.SetTxtFmtColl( pStyle->GetCollection() ); 523cdf0e10cSrcweir } 524cdf0e10cSrcweir } 525cdf0e10cSrcweir } 526cdf0e10cSrcweir } 527cdf0e10cSrcweir if(m_pItemSet) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir if( nSelectionType & nsSelectionType::SEL_DRW ) 530cdf0e10cSrcweir { 531cdf0e10cSrcweir SdrView* pDrawView = rWrtShell.GetDrawView(); 532cdf0e10cSrcweir if(pDrawView) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir sal_Bool bReplaceAll = sal_True; 535cdf0e10cSrcweir pDrawView->SetAttrToMarked(*m_pItemSet, bReplaceAll); 536cdf0e10cSrcweir } 537cdf0e10cSrcweir } 538cdf0e10cSrcweir else 539cdf0e10cSrcweir { 540cdf0e10cSrcweir SfxItemSet* pTemplateItemSet = lcl_CreateEmptyItemSet( 541cdf0e10cSrcweir nSelectionType, *m_pItemSet->GetPool() 542cdf0e10cSrcweir , bNoCharacterFormats, bNoParagraphFormats ); 543cdf0e10cSrcweir if(pTemplateItemSet) 544cdf0e10cSrcweir { 545cdf0e10cSrcweir pTemplateItemSet->Put( *m_pItemSet ); 546cdf0e10cSrcweir // #144857# only _set_ attributes that differ from style attributes should be applied - the style is applied anyway 547cdf0e10cSrcweir lcl_RemoveEqualItems( *pTemplateItemSet, aItemVector ); 548cdf0e10cSrcweir 549cdf0e10cSrcweir if( nSelectionType & (nsSelectionType::SEL_FRM | nsSelectionType::SEL_OLE | nsSelectionType::SEL_GRF) ) 550cdf0e10cSrcweir rWrtShell.SetFlyFrmAttr(*pTemplateItemSet); 551cdf0e10cSrcweir else 552cdf0e10cSrcweir { 553cdf0e10cSrcweir rWrtShell.SetAttr(*pTemplateItemSet); 554cdf0e10cSrcweir 555cdf0e10cSrcweir // additional numbering properties for paragraph styles 556cdf0e10cSrcweir if( nSelectionType & nsSelectionType::SEL_TXT && rWrtShell.GetCurNumRule() ) 557cdf0e10cSrcweir { 558cdf0e10cSrcweir if( SFX_ITEM_SET == pTemplateItemSet->GetItemState(FN_NUMBER_NEWSTART) ) 559cdf0e10cSrcweir { 560cdf0e10cSrcweir sal_Bool bStart = ((SfxBoolItem&)pTemplateItemSet->Get(FN_NUMBER_NEWSTART)).GetValue(); 561cdf0e10cSrcweir sal_uInt16 nNumStart = USHRT_MAX; 562cdf0e10cSrcweir if( SFX_ITEM_SET == pTemplateItemSet->GetItemState(FN_NUMBER_NEWSTART_AT) ) 563cdf0e10cSrcweir { 564cdf0e10cSrcweir nNumStart = ((SfxUInt16Item&)pTemplateItemSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue(); 565cdf0e10cSrcweir if(USHRT_MAX != nNumStart) 566cdf0e10cSrcweir bStart = sal_False; 567cdf0e10cSrcweir } 568cdf0e10cSrcweir rWrtShell.SetNumRuleStart(bStart); 569cdf0e10cSrcweir rWrtShell.SetNodeNumStart(nNumStart); 570cdf0e10cSrcweir } 571cdf0e10cSrcweir else if( SFX_ITEM_SET == pTemplateItemSet->GetItemState(FN_NUMBER_NEWSTART_AT) ) 572cdf0e10cSrcweir { 573cdf0e10cSrcweir sal_uInt16 nNumStart = ((SfxUInt16Item&)pTemplateItemSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue(); 574cdf0e10cSrcweir rWrtShell.SetNodeNumStart(nNumStart); 575cdf0e10cSrcweir rWrtShell.SetNumRuleStart(sal_False); 576cdf0e10cSrcweir } 577cdf0e10cSrcweir } 578cdf0e10cSrcweir } 579cdf0e10cSrcweir delete pTemplateItemSet; 580cdf0e10cSrcweir } 581cdf0e10cSrcweir } 582cdf0e10cSrcweir } 583cdf0e10cSrcweir 584cdf0e10cSrcweir if( m_pTableItemSet && nSelectionType & (nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS) ) 585cdf0e10cSrcweir lcl_setTableAttributes( *m_pTableItemSet, rWrtShell ); 586cdf0e10cSrcweir 587cdf0e10cSrcweir rWrtShell.EndUndo(UNDO_INSATTR); 588cdf0e10cSrcweir rWrtShell.EndAction(); 589cdf0e10cSrcweir 590cdf0e10cSrcweir if(!m_bPersistentCopy) 591cdf0e10cSrcweir this->Erase(); 592cdf0e10cSrcweir } 593cdf0e10cSrcweir 594cdf0e10cSrcweir void SwFormatClipboard::Erase() 595cdf0e10cSrcweir { 596cdf0e10cSrcweir m_nSelectionType = 0; 597cdf0e10cSrcweir if(m_pItemSet) 598cdf0e10cSrcweir { 599cdf0e10cSrcweir delete m_pItemSet; 600cdf0e10cSrcweir m_pItemSet = 0; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir if(m_pTableItemSet) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir delete m_pTableItemSet; 605cdf0e10cSrcweir m_pTableItemSet = 0; 606cdf0e10cSrcweir } 607cdf0e10cSrcweir if( m_aCharStyle.Len() ) 608cdf0e10cSrcweir m_aCharStyle.Erase(); 609cdf0e10cSrcweir if( m_aParaStyle.Len() ) 610cdf0e10cSrcweir m_aParaStyle.Erase(); 611cdf0e10cSrcweir 612cdf0e10cSrcweir m_bPersistentCopy = false; 613cdf0e10cSrcweir } 614