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