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 <hintids.hxx> 28 #include <svl/itemiter.hxx> 29 #include <svtools/imapobj.hxx> 30 #include <svtools/soerr.hxx> 31 #include <editeng/protitem.hxx> 32 #include <svx/svdogrp.hxx> 33 #include <svx/svdouno.hxx> 34 #include <svx/fmglob.hxx> 35 #include <com/sun/star/form/FormButtonType.hpp> 36 #include <com/sun/star/beans/XPropertySet.hpp> 37 #include <fmtanchr.hxx> 38 #include <txtflcnt.hxx> 39 #include <fmtcntnt.hxx> 40 #include <fmtornt.hxx> 41 #include <fmtflcnt.hxx> 42 #include <fmturl.hxx> 43 #include <fmtclds.hxx> 44 #include <fmtfsize.hxx> 45 #include <docary.hxx> 46 #include <fesh.hxx> 47 #include <rootfrm.hxx> 48 #include <pagefrm.hxx> 49 #include <cntfrm.hxx> 50 #include <txtfrm.hxx> 51 #include <viewimp.hxx> 52 #include <viscrs.hxx> 53 #include <doc.hxx> 54 #include <IDocumentUndoRedo.hxx> 55 #include <dview.hxx> 56 #include <dflyobj.hxx> 57 #include <dcontact.hxx> 58 #include <frmfmt.hxx> 59 #include <flyfrm.hxx> 60 #include <ndtxt.hxx> 61 #include <edimp.hxx> 62 #include <swtable.hxx> 63 #include <mvsave.hxx> // Strukturen zum Sichern beim Move/Delete 64 #include <ndgrf.hxx> 65 #include <flyfrms.hxx> 66 #include <flypos.hxx> 67 #include <fldbas.hxx> 68 #include <fmtfld.hxx> 69 #include <swundo.hxx> 70 #include <frame.hxx> 71 #include <notxtfrm.hxx> 72 // --> OD 2006-03-06 #125892# 73 #include <HandleAnchorNodeChg.hxx> 74 // <-- 75 #include <frmatr.hxx> 76 // --> 3.7.2010 #i972# 77 #include <ndole.hxx> 78 // <-- 79 // --> OD 2009-12-29 #i89920# 80 #include <fmtsrnd.hxx> 81 #include <editeng/opaqitem.hxx> 82 // <-- 83 84 using ::rtl::OUString; 85 using namespace ::com::sun::star; 86 87 //Zum anmelden von Flys in Flys in ... 88 //definiert in layout/frmtool.cxx 89 void RegistFlys( SwPageFrm*, const SwLayoutFrm* ); 90 91 /*********************************************************************** 92 #* Class : SwDoc 93 #* Methode : UseSpzLayoutFmt 94 #* Beschreibung: Anhand des Request werden zu dem Format entsprechende 95 #* Aenderungen an den Spezifischen Layouts vorgenommen. 96 #* Datum : MA 23. Sep. 92 97 #* Update : JP 09.03.98 98 #***********************************************************************/ 99 100 sal_Bool lcl_SetNewFlyPos( const SwNode& rNode, SwFmtAnchor& rAnchor, 101 const Point& rPt ) 102 { 103 sal_Bool bRet = sal_False; 104 const SwStartNode* pStNode = rNode.FindFlyStartNode(); 105 if( pStNode ) 106 { 107 SwPosition aPos( *pStNode ); 108 rAnchor.SetAnchor( &aPos ); 109 bRet = sal_True; 110 } 111 else 112 { 113 const SwCntntNode *pCntNd = rNode.GetCntntNode(); 114 const SwCntntFrm* pCFrm = pCntNd ? pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &rPt, 0, sal_False ) : 0; 115 const SwPageFrm *pPg = pCFrm ? pCFrm->FindPageFrm() : 0; 116 117 rAnchor.SetPageNum( pPg ? pPg->GetPhyPageNum() : 1 ); 118 rAnchor.SetType( FLY_AT_PAGE ); 119 } 120 return bRet; 121 } 122 123 sal_Bool lcl_FindAnchorPos( SwDoc& rDoc, const Point& rPt, const SwFrm& rFrm, 124 SfxItemSet& rSet ) 125 { 126 sal_Bool bRet = sal_True; 127 SwFmtAnchor aNewAnch( (SwFmtAnchor&)rSet.Get( RES_ANCHOR ) ); 128 RndStdIds nNew = aNewAnch.GetAnchorId(); 129 const SwFrm *pNewAnch; 130 131 //Neuen Anker ermitteln 132 Point aTmpPnt( rPt ); 133 switch( nNew ) 134 { 135 case FLY_AS_CHAR: // sollte der nicht auch mit hinein? 136 case FLY_AT_PARA: 137 case FLY_AT_CHAR: // LAYER_IMPL 138 { 139 //Ausgehend von der linken oberen Ecke des Fly den 140 //dichtesten CntntFrm suchen. 141 const SwFrm* pFrm = rFrm.IsFlyFrm() ? ((SwFlyFrm&)rFrm).GetAnchorFrm() 142 : &rFrm; 143 pNewAnch = ::FindAnchor( pFrm, aTmpPnt ); 144 if( pNewAnch->IsProtected() ) 145 { 146 bRet = sal_False; 147 break; 148 } 149 150 SwPosition aPos( *((SwCntntFrm*)pNewAnch)->GetNode() ); 151 if ((FLY_AT_CHAR == nNew) || (FLY_AS_CHAR == nNew)) 152 { 153 // es muss ein TextNode gefunden werden, denn nur in diesen 154 // ist ein Inhaltsgebundene Frames zu verankern 155 SwCrsrMoveState aState( MV_SETONLYTEXT ); 156 aTmpPnt.X() -= 1; //nicht im Fly landen!! 157 if( !pNewAnch->GetCrsrOfst( &aPos, aTmpPnt, &aState ) ) 158 { 159 SwCntntNode* pCNd = ((SwCntntFrm*)pNewAnch)->GetNode(); 160 if( pNewAnch->Frm().Bottom() < aTmpPnt.Y() ) 161 pCNd->MakeStartIndex( &aPos.nContent ); 162 else 163 pCNd->MakeEndIndex( &aPos.nContent ); 164 } 165 } 166 aNewAnch.SetAnchor( &aPos ); 167 } 168 break; 169 170 case FLY_AT_FLY: // LAYER_IMPL 171 { 172 //Ausgehend von der linken oberen Ecke des Fly den 173 //dichtesten SwFlyFrm suchen. 174 SwCrsrMoveState aState( MV_SETONLYTEXT ); 175 SwPosition aPos( rDoc.GetNodes() ); 176 aTmpPnt.X() -= 1; //nicht im Fly landen!! 177 rDoc.GetCurrentLayout()->GetCrsrOfst( &aPos, aTmpPnt, &aState ); //swmod 071108//swmod 071225 178 pNewAnch = ::FindAnchor( 179 aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( rFrm.getRootFrm(), 0, 0, sal_False ), 180 aTmpPnt )->FindFlyFrm(); 181 182 if( pNewAnch && &rFrm != pNewAnch && !pNewAnch->IsProtected() ) 183 { 184 aPos.nNode = *((SwFlyFrm*)pNewAnch)->GetFmt()->GetCntnt(). 185 GetCntntIdx(); 186 aNewAnch.SetAnchor( &aPos ); 187 break; 188 } 189 } 190 191 aNewAnch.SetType( nNew = FLY_AT_PAGE ); 192 // no break 193 194 case FLY_AT_PAGE: 195 pNewAnch = rFrm.FindPageFrm(); 196 aNewAnch.SetPageNum( pNewAnch->GetPhyPageNum() ); 197 break; 198 199 default: 200 ASSERT( !&rDoc, "Falsche ID fuer neuen Anker." ); 201 } 202 203 rSet.Put( aNewAnch ); 204 return bRet; 205 } 206 207 // 208 //! also used in unoframe.cxx 209 // 210 sal_Bool lcl_ChkAndSetNewAnchor( const SwFlyFrm& rFly, SfxItemSet& rSet ) 211 { 212 const SwFrmFmt& rFmt = *rFly.GetFmt(); 213 const SwFmtAnchor &rOldAnch = rFmt.GetAnchor(); 214 const RndStdIds nOld = rOldAnch.GetAnchorId(); 215 216 RndStdIds nNew = ((SwFmtAnchor&)rSet.Get( RES_ANCHOR )).GetAnchorId(); 217 218 if( nOld == nNew ) 219 return sal_False; 220 221 SwDoc* pDoc = (SwDoc*)rFmt.GetDoc(); 222 223 #ifdef DBG_UTIL 224 ASSERT( !(nNew == FLY_AT_PAGE && 225 (FLY_AT_PARA==nOld || FLY_AT_CHAR==nOld || FLY_AS_CHAR==nOld ) && 226 pDoc->IsInHeaderFooter( rOldAnch.GetCntntAnchor()->nNode )), 227 "Unerlaubter Ankerwechsel in Head/Foot." ); 228 #endif 229 230 return ::lcl_FindAnchorPos( *pDoc, rFly.Frm().Pos(), rFly, rSet ); 231 } 232 233 void SwFEShell::SelectFlyFrm( SwFlyFrm& rFrm, sal_Bool bNew ) 234 { 235 SET_CURR_SHELL( this ); 236 237 // Wenn es ein neuer Rahmen ist, so soll er selektiert sein. 238 // !!Rahmen immer selektieren, wenn sie nicht selektiert sind. 239 // - Es kann ein neuer 'alter' sein weil der Anker gewechselt wurde. 240 // - 'alte' Rahmen sind vorher immer selektiert denn sonst wird nix 241 // an ihnen veraendert. 242 // Der Rahmen darf nicht per Dokumentposition selektiert werden, weil er 243 // auf jedenfall selektiert sein muss! 244 SwViewImp *pImpl = Imp(); 245 if( GetWin() && (bNew || !pImpl->GetDrawView()->AreObjectsMarked()) ) 246 { 247 ASSERT( rFrm.IsFlyFrm(), "SelectFlyFrm will einen Fly" ); 248 249 //Wenn der Fly bereits selektiert ist gibt es hier ja wohl nichts 250 //zu tun. 251 if ( FindFlyFrm() == &rFrm ) 252 return; 253 254 //Damit der Anker ueberhaupt noch gepaintet wird. 255 if( rFrm.IsFlyInCntFrm() && rFrm.GetAnchorFrm() ) 256 rFrm.GetAnchorFrm()->SetCompletePaint(); 257 258 // --> OD 2004-06-11 #i28701# - no format at all. 259 // //Hier wurde immer kalkuliert. Leider ist der Sonderfall Fly in Fly mit 260 // //Spalten u.U. sehr kritisch wenn der innenliegende zuerst formatiert 261 // //wird. Um kein Risiko einzugehen entschaerfen wir nur diesen Sonderfall. 262 // if( !rFrm.GetAnchorFrm()->IsInFly() ) 263 // rFrm.Calc(); 264 265 if( pImpl->GetDrawView()->AreObjectsMarked() ) 266 pImpl->GetDrawView()->UnmarkAll(); 267 268 pImpl->GetDrawView()->MarkObj( rFrm.GetVirtDrawObj(), 269 pImpl->GetPageView(), sal_False, sal_False ); 270 KillPams(); 271 ClearMark(); 272 SelFlyGrabCrsr(); 273 } 274 } 275 276 /************************************************************************* 277 |* 278 |* SwFEShell::FindFlyFrm() 279 |* 280 |* Beschreibung Liefert den Fly wenn einer Selektiert ist. 281 |* Ersterstellung MA 03. Nov. 92 282 |* Letzte Aenderung MA 05. Mar. 96 283 |* 284 *************************************************************************/ 285 286 SwFlyFrm *SwFEShell::FindFlyFrm() const 287 { 288 if ( Imp()->HasDrawView() ) 289 { 290 // Ein Fly ist genau dann erreichbar, wenn er selektiert ist. 291 const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList(); 292 if( rMrkList.GetMarkCount() != 1 ) 293 return 0; 294 295 SdrObject *pO = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); 296 return ( pO && pO->ISA(SwVirtFlyDrawObj) ) ? ((SwVirtFlyDrawObj*)pO)->GetFlyFrm() : 0; 297 } 298 return 0; 299 } 300 301 /************************************************************************* 302 |* 303 |* SwFEShell::IsFlyInFly() 304 |* 305 |* Beschreibung Liefert sal_True, wenn der aktuelle Fly an einem anderen 306 |* verankert werden koennte (also innerhalb ist) 307 |* Ersterstellung AMA 11. Sep. 97 308 |* Letzte Aenderung AMA 14. Jan. 98 309 |* 310 *************************************************************************/ 311 312 const SwFrmFmt* SwFEShell::IsFlyInFly() 313 { 314 SET_CURR_SHELL( this ); 315 316 if ( !Imp()->HasDrawView() ) 317 return NULL; 318 319 const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList(); 320 if ( !rMrkList.GetMarkCount() ) 321 { 322 SwCntntFrm *pCntnt = GetCurrFrm( sal_False ); 323 if( !pCntnt ) 324 return NULL; 325 SwFlyFrm *pFly = pCntnt->FindFlyFrm(); 326 if ( !pFly ) 327 return NULL; 328 return pFly->GetFmt(); 329 } 330 else if ( rMrkList.GetMarkCount() != 1 || 331 !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()) ) 332 return NULL; 333 334 SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); 335 336 SwFrmFmt *pFmt = FindFrmFmt( pObj ); 337 if( pFmt && FLY_AT_FLY == pFmt->GetAnchor().GetAnchorId() ) 338 { 339 const SwFrm* pFly = pObj->ISA(SwVirtFlyDrawObj) ? 340 ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm()->GetAnchorFrm() : 341 ((SwDrawContact*)GetUserCall(pObj))->GetAnchorFrm( pObj ); 342 ASSERT( pFly, "IsFlyInFly: Where's my anchor?" ); 343 ASSERT( pFly->IsFlyFrm(), "IsFlyInFly: Funny anchor!" ); 344 return ((SwFlyFrm*)pFly)->GetFmt(); 345 } 346 347 Point aTmpPos = pObj->GetCurrentBoundRect().TopLeft(); 348 349 SwFrm *pTxtFrm; 350 { 351 SwCrsrMoveState aState( MV_SETONLYTEXT ); 352 SwNodeIndex aSwNodeIndex( GetDoc()->GetNodes() ); 353 SwPosition aPos( aSwNodeIndex ); 354 Point aPoint( aTmpPos ); 355 aPoint.X() -= 1; //nicht im Fly landen!! 356 GetLayout()->GetCrsrOfst( &aPos, aPoint, &aState ); 357 // OD 01.07.2003 #108784# - determine text frame by left-top-corner 358 // of object 359 //pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->GetFrm( 0, 0, sal_False ); 360 pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aTmpPos, 0, sal_False ); 361 } 362 const SwFrm *pTmp = ::FindAnchor( pTxtFrm, aTmpPos ); 363 const SwFlyFrm *pFly = pTmp->FindFlyFrm(); 364 if( pFly ) 365 return pFly->GetFmt(); 366 return NULL; 367 } 368 369 /************************************************************************* 370 |* 371 |* SwFEShell::SetFlyPos 372 |* 373 |* Ersterstellung MA 14. Jan. 93 374 |* Letzte Aenderung MA 14. Feb. 95 375 |* 376 *************************************************************************/ 377 378 void SwFEShell::SetFlyPos( const Point& rAbsPos ) 379 { 380 SET_CURR_SHELL( this ); 381 382 //Bezugspunkt in Dokumentkoordinaten bestimmen 383 SwCntntFrm *pCntnt = GetCurrFrm( sal_False ); 384 if( !pCntnt ) 385 return; 386 SwFlyFrm *pFly = pCntnt->FindFlyFrm(); 387 if ( !pFly ) 388 return; 389 390 //SwSaveHdl aSaveX( Imp() ); 391 392 //Bei Absatzgebundenen Flys muss ausgehend von der absoluten 393 //Position ein neuer Anker gesetzt werden. Anker und neue RelPos werden 394 //vom Fly selbst berechnet und gesetzt. 395 if ( pFly->IsFlyAtCntFrm() ) 396 ((SwFlyAtCntFrm*)pFly)->SetAbsPos( rAbsPos ); 397 else 398 { 399 const SwFrm *pAnch = pFly->GetAnchorFrm(); 400 // --> OD 2004-06-11 #i28701# - no format here 401 // pAnch->Calc(); 402 Point aOrient( pAnch->Frm().Pos() ); 403 404 if ( pFly->IsFlyInCntFrm() ) 405 aOrient.X() = rAbsPos.X(); 406 407 //RelPos errechnen. 408 aOrient.X() = rAbsPos.X() - aOrient.X(); 409 aOrient.Y() = rAbsPos.Y() - aOrient.Y(); 410 pFly->ChgRelPos( aOrient ); 411 } 412 // --> OD 2004-06-11 #i28701# - no format here 413 // pFly->Calc(); 414 CallChgLnk(); // rufe das AttrChangeNotify auf der UI-Seite. 415 } 416 417 /************************************************************************* 418 |* 419 |* SwFEShell::FindAnchorPos 420 |* 421 |* Ersterstellung AMA 24. Sep. 97 422 |* Letzte Aenderung AMA 24. Sep. 97 423 |* 424 *************************************************************************/ 425 426 Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt ) 427 { 428 Point aRet; 429 430 SET_CURR_SHELL( this ); 431 432 if ( !Imp()->HasDrawView() ) 433 return aRet; 434 435 const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList(); 436 if ( rMrkList.GetMarkCount() != 1 || 437 !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()) ) 438 return aRet; 439 440 SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); 441 // --> OD 2004-07-16 #i28701# 442 SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj ); 443 SwFrmFmt& rFmt = pAnchoredObj->GetFrmFmt(); 444 RndStdIds nAnchorId = rFmt.GetAnchor().GetAnchorId(); 445 446 if ( FLY_AS_CHAR == nAnchorId ) 447 return aRet; 448 449 sal_Bool bFlyFrame = pObj->ISA(SwVirtFlyDrawObj); 450 451 SwFlyFrm* pFly = 0L; 452 const SwFrm* pOldAnch; 453 const SwFrm* pFooterOrHeader = NULL; 454 455 if( bFlyFrame ) 456 { 457 //Bezugspunkt in Dokumentkoordinaten bestimmen 458 SwCntntFrm *pCntnt = GetCurrFrm( sal_False ); 459 if( !pCntnt ) 460 return aRet; 461 pFly = pCntnt->FindFlyFrm(); 462 if ( !pFly ) 463 return aRet; 464 pOldAnch = pFly->GetAnchorFrm(); 465 if( !pOldAnch ) 466 return aRet; 467 if ( FLY_AT_PAGE != nAnchorId ) 468 { 469 pFooterOrHeader = pCntnt->FindFooterOrHeader(); 470 } 471 } 472 // OD 26.06.2003 #108784# - set <pFooterOrHeader> also for drawing 473 // objects, but not for control objects. 474 // Necessary for moving 'anchor symbol' at the user interface inside header/footer. 475 else if ( !::CheckControlLayer( pObj ) ) 476 { 477 SwCntntFrm *pCntnt = GetCurrFrm( sal_False ); 478 if( !pCntnt ) 479 return aRet; 480 pFooterOrHeader = pCntnt->FindFooterOrHeader(); 481 } 482 483 //Ausgehend von der linken oberen Ecke des Fly den 484 //dichtesten SwFlyFrm suchen. 485 SwCntntFrm *pTxtFrm; 486 { 487 SwCrsrMoveState aState( MV_SETONLYTEXT ); 488 SwPosition aPos( GetDoc()->GetNodes().GetEndOfExtras() ); 489 Point aTmpPnt( rAbsPos ); 490 GetLayout()->GetCrsrOfst( &aPos, aTmpPnt, &aState ); 491 pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(),0,&aPos,sal_False ); 492 } 493 const SwFrm *pNewAnch; 494 if( pTxtFrm ) 495 { 496 if ( FLY_AT_PAGE == nAnchorId ) 497 { 498 pNewAnch = pTxtFrm->FindPageFrm(); 499 } 500 else 501 { 502 pNewAnch = ::FindAnchor( pTxtFrm, rAbsPos ); 503 504 if( FLY_AT_FLY == nAnchorId ) // LAYER_IMPL 505 { 506 pNewAnch = pNewAnch->FindFlyFrm(); 507 } 508 } 509 } 510 else 511 pNewAnch = 0; 512 513 if( pNewAnch && !pNewAnch->IsProtected() ) 514 { 515 const SwFlyFrm* pCheck = bFlyFrame ? pNewAnch->FindFlyFrm() : 0; 516 // Falls wir innerhalb eines Rahmens landen, muss sichergestellt werden, 517 // dass der Rahmen nicht in seinem eigenen Inhalt landet! 518 while( pCheck ) 519 { 520 if( pCheck == pFly ) 521 break; 522 const SwFrm *pTmp = pCheck->GetAnchorFrm(); 523 pCheck = pTmp ? pTmp->FindFlyFrm() : NULL; 524 } 525 // Es darf nicht aus einer Kopf-/Fusszeile in einen anderen Bereich 526 // gewechselt werden, es darf nicht in eine Kopf-/Fusszeile hinein- 527 // gewechselt werden. 528 if( !pCheck && 529 pFooterOrHeader == pNewAnch->FindFooterOrHeader() ) 530 { 531 aRet = pNewAnch->GetFrmAnchorPos( ::HasWrap( pObj ) ); 532 533 if ( bMoveIt || (nAnchorId == FLY_AT_CHAR) ) 534 { 535 SwFmtAnchor aAnch( rFmt.GetAnchor() ); 536 switch ( nAnchorId ) 537 { 538 case FLY_AT_PARA: 539 { 540 SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor(); 541 pPos->nNode = *pTxtFrm->GetNode(); 542 pPos->nContent.Assign(0,0); 543 break; 544 } 545 case FLY_AT_PAGE: 546 { 547 aAnch.SetPageNum( ((const SwPageFrm*)pNewAnch)-> 548 GetPhyPageNum() ); 549 break; 550 } 551 case FLY_AT_FLY: 552 { 553 SwPosition aPos( *((SwFlyFrm*)pNewAnch)->GetFmt()-> 554 GetCntnt().GetCntntIdx() ); 555 aAnch.SetAnchor( &aPos ); 556 break; 557 } 558 case FLY_AT_CHAR: 559 { 560 SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor(); 561 Point aTmpPnt( rAbsPos ); 562 if( pTxtFrm->GetCrsrOfst( pPos, aTmpPnt, NULL ) ) 563 { 564 SwRect aTmpRect; 565 pTxtFrm->GetCharRect( aTmpRect, *pPos ); 566 aRet = aTmpRect.Pos(); 567 } 568 else 569 { 570 pPos->nNode = *pTxtFrm->GetNode(); 571 pPos->nContent.Assign(0,0); 572 } 573 break; 574 } 575 default: 576 break; 577 } 578 if( bMoveIt ) 579 { 580 StartAllAction(); 581 // --> OD 2006-02-28 #125892# 582 // handle change of anchor node: 583 // if count of the anchor frame also change, the fly frames have to be 584 // re-created. Thus, delete all fly frames except the <this> before the 585 // anchor attribute is change and re-create them afterwards. 586 { 587 SwHandleAnchorNodeChg* pHandleAnchorNodeChg( 0L ); 588 SwFlyFrmFmt* pFlyFrmFmt( dynamic_cast<SwFlyFrmFmt*>(&rFmt) ); 589 if ( pFlyFrmFmt ) 590 { 591 pHandleAnchorNodeChg = 592 new SwHandleAnchorNodeChg( *pFlyFrmFmt, aAnch ); 593 } 594 rFmt.GetDoc()->SetAttr( aAnch, rFmt ); 595 delete pHandleAnchorNodeChg; 596 } 597 // <-- 598 // --> OD 2004-06-24 #i28701# - no call of method 599 // <CheckCharRectAndTopOfLine()> for to-character anchored 600 // Writer fly frame needed. This method call can cause a 601 // format of the anchor frame, which is no longer intended. 602 // Instead clear the anchor character rectangle and 603 // the top of line values for all to-character anchored objects. 604 pAnchoredObj->ClearCharRectAndTopOfLine(); 605 // <-- 606 EndAllAction(); 607 } 608 } 609 610 SwRect aTmpRect( aRet, rAbsPos ); 611 if( aTmpRect.HasArea() ) 612 MakeVisible( aTmpRect ); 613 #ifdef DBG_UTIL 614 //TODO: That doesn't seem to be intended 615 if( Color(COL_TRANSPARENT) != GetOut()->GetLineColor() ) 616 { 617 ASSERT( sal_False, "Hey, Joe: Where's my Null Pen?" ); 618 GetOut()->SetLineColor( Color(COL_TRANSPARENT) ); 619 } 620 #endif 621 } 622 } 623 624 return aRet; 625 } 626 627 /*********************************************************************** 628 #* Class : SwFEShell 629 #* Methode : NewFlyFrm 630 #* Beschreibung: 631 #* Datum : MA 03. Nov. 92 632 #* Update : JP 11. Aug. 93 633 #***********************************************************************/ 634 635 const SwFrmFmt *SwFEShell::NewFlyFrm( const SfxItemSet& rSet, sal_Bool bAnchValid, 636 SwFrmFmt *pParent ) 637 { 638 SET_CURR_SHELL( this ); 639 StartAllAction(); 640 641 SwPaM* pCrsr = GetCrsr(); 642 const Point aPt( GetCrsrDocPos() ); 643 644 SwSelBoxes aBoxes; 645 sal_Bool bMoveCntnt = sal_True; 646 if( IsTableMode() ) 647 { 648 GetTblSel( *this, aBoxes ); 649 if( aBoxes.Count() ) 650 { 651 // die Crsr muessen noch aus dem Loeschbereich entfernt 652 // werden. Setze sie immer hinter/auf die Tabelle; ueber die 653 // Dokument-Position werden sie dann immer an die alte 654 // Position gesetzt. 655 ParkCrsr( SwNodeIndex( *aBoxes[0]->GetSttNd() )); 656 657 // --> FME 2005-12-01 #i127787# pCurCrsr will be deleted in ParkCrsr, 658 // we better get the current pCurCrsr instead of working with the 659 // deleted one: 660 pCrsr = GetCrsr(); 661 // <-- 662 663 // KillPams(); 664 } 665 else 666 bMoveCntnt = sal_False; 667 } 668 else if( !pCrsr->HasMark() && pCrsr->GetNext() == pCrsr ) 669 bMoveCntnt = sal_False; 670 671 const SwPosition& rPos = *pCrsr->Start(); 672 673 SwFmtAnchor& rAnch = (SwFmtAnchor&)rSet.Get( RES_ANCHOR ); 674 RndStdIds eRndId = rAnch.GetAnchorId(); 675 switch( eRndId ) 676 { 677 case FLY_AT_PAGE: 678 if( !rAnch.GetPageNum() ) //HotFix: Bug in UpdateByExample 679 rAnch.SetPageNum( 1 ); 680 break; 681 682 case FLY_AT_FLY: 683 case FLY_AT_PARA: 684 case FLY_AT_CHAR: 685 case FLY_AS_CHAR: 686 if( !bAnchValid ) 687 { 688 if( FLY_AT_FLY != eRndId ) 689 { 690 rAnch.SetAnchor( &rPos ); 691 } 692 else if( lcl_SetNewFlyPos( rPos.nNode.GetNode(), rAnch, aPt ) ) 693 { 694 eRndId = FLY_AT_PAGE; 695 } 696 } 697 break; 698 699 default: 700 ASSERT( !this, "Was sollte das fuer ein Fly werden?" ) 701 break; 702 } 703 704 SwFlyFrmFmt *pRet; 705 if( bMoveCntnt ) 706 { 707 GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_INSLAYFMT, NULL ); 708 SwFmtAnchor* pOldAnchor = 0; 709 sal_Bool bHOriChgd = sal_False, bVOriChgd = sal_False; 710 SwFmtVertOrient aOldV; 711 SwFmtHoriOrient aOldH; 712 713 if ( FLY_AT_PAGE != eRndId ) 714 { 715 // erstmal als mit Seitenbindung, Absatz/Zeichenbindung erst wenn 716 // alles verschoben ist. Dann ist die Position gueltig! 717 // JP 13.05.98: ggfs. auch noch die Hori/Vert-Orientierung 718 // umsetzen, damit diese beim Umanker NICHT 719 // korrigiert wird 720 pOldAnchor = new SwFmtAnchor( rAnch ); 721 const_cast<SfxItemSet&>(rSet).Put( SwFmtAnchor( FLY_AT_PAGE, 1 ) ); 722 723 const SfxPoolItem* pItem; 724 if( SFX_ITEM_SET == rSet.GetItemState( RES_HORI_ORIENT, sal_False, &pItem ) 725 && text::HoriOrientation::NONE == ((SwFmtHoriOrient*)pItem)->GetHoriOrient() ) 726 { 727 bHOriChgd = sal_True; 728 aOldH = *((SwFmtHoriOrient*)pItem); 729 ((SfxItemSet&)rSet).Put( SwFmtHoriOrient( 0, text::HoriOrientation::LEFT ) ); 730 } 731 if( SFX_ITEM_SET == rSet.GetItemState( RES_VERT_ORIENT, sal_False, &pItem ) 732 && text::VertOrientation::NONE == ((SwFmtVertOrient*)pItem)->GetVertOrient() ) 733 { 734 bVOriChgd = sal_True; 735 aOldV = *((SwFmtVertOrient*)pItem); 736 ((SfxItemSet&)rSet).Put( SwFmtVertOrient( 0, text::VertOrientation::TOP ) ); 737 } 738 } 739 740 pRet = GetDoc()->MakeFlyAndMove( *pCrsr, rSet, &aBoxes, pParent ); 741 742 KillPams(); 743 744 if( pOldAnchor ) 745 { 746 if( pRet ) 747 { 748 // neue Position bestimmen 749 //JP 24.03.97: immer ueber die Seitenbindung gehen - der 750 // chaos::Anchor darf nie im verschobenen Bereich 751 // liegen 752 pRet->DelFrms(); 753 754 const SwFrm* pAnch = ::FindAnchor( GetLayout(), aPt, sal_False ); 755 SwPosition aPos( *((SwCntntFrm*)pAnch)->GetNode() ); 756 if ( FLY_AS_CHAR == eRndId ) 757 { 758 aPos.nContent.Assign( ((SwCntntFrm*)pAnch)->GetNode(), 0 ); 759 } 760 pOldAnchor->SetAnchor( &aPos ); 761 762 // das verschieben von TabelleSelektion ist noch nicht 763 // Undofaehig - also darf das UmAnkern auch nicht 764 // aufgezeichnet werden. 765 bool const bDoesUndo = 766 GetDoc()->GetIDocumentUndoRedo().DoesUndo(); 767 SwUndoId nLastUndoId(UNDO_EMPTY); 768 if (bDoesUndo && 769 GetDoc()->GetIDocumentUndoRedo().GetLastUndoInfo(0, 770 & nLastUndoId)) 771 { 772 if (UNDO_INSLAYFMT == nLastUndoId) 773 { 774 GetDoc()->GetIDocumentUndoRedo().DoUndo(false); 775 } 776 } 777 778 ((SfxItemSet&)rSet).Put( *pOldAnchor ); 779 780 if( bHOriChgd ) 781 ((SfxItemSet&)rSet).Put( aOldH ); 782 if( bVOriChgd ) 783 ((SfxItemSet&)rSet).Put( aOldV ); 784 785 GetDoc()->SetFlyFrmAttr( *pRet, (SfxItemSet&)rSet ); 786 GetDoc()->GetIDocumentUndoRedo().DoUndo(bDoesUndo); 787 } 788 delete pOldAnchor; 789 } 790 GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_INSLAYFMT, NULL ); 791 } 792 else 793 /* #109161# If called from a shell try to propagate an 794 existing adjust item from rPos to the content node of the 795 new frame. */ 796 pRet = GetDoc()->MakeFlySection( eRndId, &rPos, &rSet, pParent, sal_True ); 797 798 if( pRet ) 799 { 800 SwFlyFrm* pFrm = pRet->GetFrm( &aPt ); 801 if( pFrm ) 802 SelectFlyFrm( *pFrm, sal_True ); 803 else 804 { 805 GetLayout()->SetAssertFlyPages(); 806 pRet = 0; 807 } 808 } 809 EndAllActionAndCall(); 810 811 return pRet; 812 } 813 814 /*********************************************************************** 815 #* Class : SwFEShell 816 #* Methode : Insert 817 #* Datum : ?? 818 #* Update : MA 12. Sep. 94 819 #***********************************************************************/ 820 821 void SwFEShell::Insert( const String& rGrfName, const String& rFltName, 822 const Graphic* pGraphic, 823 const SfxItemSet* pFlyAttrSet, 824 const SfxItemSet* pGrfAttrSet, 825 SwFrmFmt* pFrmFmt ) 826 { 827 SwFlyFrmFmt* pFmt = 0; 828 SET_CURR_SHELL( this ); 829 StartAllAction(); 830 SwShellCrsr *pStartCursor = dynamic_cast<SwShellCrsr*>(this->GetSwCrsr()); 831 SwShellCrsr *pCursor = pStartCursor; 832 do { 833 834 // Anker noch nicht oder unvollstaendig gesetzt ? 835 if( pFlyAttrSet ) 836 { 837 const SfxPoolItem* pItem; 838 if( SFX_ITEM_SET == pFlyAttrSet->GetItemState( RES_ANCHOR, sal_False, 839 &pItem ) ) 840 { 841 SwFmtAnchor* pAnchor = (SwFmtAnchor*)pItem; 842 switch( pAnchor->GetAnchorId()) 843 { 844 case FLY_AT_PARA: 845 case FLY_AT_CHAR: // LAYER_IMPL 846 case FLY_AS_CHAR: 847 if( !pAnchor->GetCntntAnchor() ) 848 { 849 pAnchor->SetAnchor( pCursor->GetPoint() ); 850 } 851 break; 852 case FLY_AT_FLY: 853 if( !pAnchor->GetCntntAnchor() ) 854 { 855 lcl_SetNewFlyPos( *pCursor->GetNode(), 856 *pAnchor, GetCrsrDocPos() ); 857 } 858 break; 859 case FLY_AT_PAGE: 860 if( !pAnchor->GetPageNum() ) 861 { 862 pAnchor->SetPageNum( pCursor->GetPageNum( 863 sal_True, &pCursor->GetPtPos() ) ); 864 } 865 break; 866 default : 867 break; 868 } 869 } 870 } 871 pFmt = GetDoc()->Insert(*pCursor, rGrfName, 872 rFltName, pGraphic, 873 pFlyAttrSet, 874 pGrfAttrSet, pFrmFmt ); 875 ASSERT( pFmt, "Doc->Insert(notxt) failed." ); 876 877 } while( (pCursor = dynamic_cast<SwShellCrsr*>(pCursor->GetNext())) 878 != pStartCursor ); 879 880 EndAllAction(); 881 882 if( pFmt ) 883 { 884 const Point aPt( GetCrsrDocPos() ); 885 SwFlyFrm* pFrm = pFmt->GetFrm( &aPt ); 886 887 if( pFrm ) 888 SelectFlyFrm( *pFrm, sal_True ); 889 else 890 GetLayout()->SetAssertFlyPages(); 891 } 892 } 893 894 SwFlyFrmFmt* SwFEShell::InsertObject( const svt::EmbeddedObjectRef& xObj, 895 const SfxItemSet* pFlyAttrSet, 896 const SfxItemSet* pGrfAttrSet, 897 SwFrmFmt* pFrmFmt ) 898 { 899 SwFlyFrmFmt* pFmt = 0; 900 SET_CURR_SHELL( this ); 901 StartAllAction(); 902 FOREACHPAM_START( this ) 903 pFmt = GetDoc()->Insert(*PCURCRSR, xObj, 904 pFlyAttrSet, pGrfAttrSet, pFrmFmt ); 905 ASSERT( pFmt, "Doc->Insert(notxt) failed." ); 906 907 FOREACHPAM_END() 908 EndAllAction(); 909 910 if( pFmt ) 911 { 912 const Point aPt( GetCrsrDocPos() ); 913 SwFlyFrm* pFrm = pFmt->GetFrm( &aPt ); 914 915 if( pFrm ) 916 SelectFlyFrm( *pFrm, sal_True ); 917 else 918 GetLayout()->SetAssertFlyPages(); 919 } 920 921 return pFmt; 922 } 923 924 925 void SwFEShell::InsertDrawObj( SdrObject& rDrawObj, 926 const Point& rInsertPosition ) 927 { 928 SET_CURR_SHELL( this ); 929 930 SfxItemSet rFlyAttrSet( GetDoc()->GetAttrPool(), aFrmFmtSetRange ); 931 rFlyAttrSet.Put( SwFmtAnchor( FLY_AT_PARA )); 932 // --> OD 2009-12-29 #i89920# 933 rFlyAttrSet.Put( SwFmtSurround( SURROUND_THROUGHT ) ); 934 rDrawObj.SetLayer( getIDocumentDrawModelAccess()->GetHeavenId() ); 935 // <-- 936 937 // find anchor position 938 SwPaM aPam( pDoc->GetNodes() ); 939 { 940 SwCrsrMoveState aState( MV_SETONLYTEXT ); 941 Point aTmpPt( rInsertPosition ); 942 GetLayout()->GetCrsrOfst( aPam.GetPoint(), aTmpPt, &aState ); 943 const SwFrm* pFrm = aPam.GetCntntNode()->getLayoutFrm( GetLayout(), 0, 0, sal_False ); 944 const Point aRelPos( rInsertPosition.X() - pFrm->Frm().Left(), 945 rInsertPosition.Y() - pFrm->Frm().Top() ); 946 rDrawObj.SetRelativePos( aRelPos ); 947 ::lcl_FindAnchorPos( *GetDoc(), rInsertPosition, *pFrm, rFlyAttrSet ); 948 } 949 // insert drawing object into the document creating a new <SwDrawFrmFmt> instance 950 SwDrawFrmFmt* pFmt = GetDoc()->Insert( aPam, rDrawObj, &rFlyAttrSet, 0 ); 951 952 // move object to visible layer 953 SwContact* pContact = static_cast<SwContact*>(rDrawObj.GetUserCall()); 954 if ( pContact ) 955 { 956 pContact->MoveObjToVisibleLayer( &rDrawObj ); 957 } 958 959 if ( pFmt ) 960 { 961 // select drawing object 962 Imp()->GetDrawView()->MarkObj( &rDrawObj, Imp()->GetPageView(), 963 sal_False, sal_False ); 964 } 965 else 966 { 967 GetLayout()->SetAssertFlyPages(); 968 } 969 } 970 971 /*********************************************************************** 972 #* Class : SwFEShell 973 #* Methode : GetPageObjs 974 #* Datum : ?? 975 #* Update : MA 11. Jan. 95 976 #***********************************************************************/ 977 978 void SwFEShell::GetPageObjs( SvPtrarr& rFillArr ) 979 { 980 if( rFillArr.Count() ) 981 rFillArr.Remove( 0, rFillArr.Count() ); 982 983 const SwFrmFmt* pFmt; 984 for( sal_uInt16 n = 0; n < pDoc->GetSpzFrmFmts()->Count(); ++n ) 985 { 986 pFmt = (const SwFrmFmt*)(*pDoc->GetSpzFrmFmts())[n]; 987 if (FLY_AT_PAGE == pFmt->GetAnchor().GetAnchorId()) 988 { 989 rFillArr.Insert( (VoidPtr)pFmt, rFillArr.Count() ); 990 } 991 } 992 } 993 994 /*********************************************************************** 995 #* Class : SwFEShell 996 #* Methode : SetPageFlysNewPage 997 #* Datum : ?? 998 #* Update : MA 14. Feb. 95 999 #***********************************************************************/ 1000 1001 void SwFEShell::SetPageObjsNewPage( SvPtrarr& rFillArr, int nOffset ) 1002 { 1003 if( !rFillArr.Count() || !nOffset ) 1004 return; 1005 1006 StartAllAction(); 1007 StartUndo(); 1008 1009 SwFrmFmt* pFmt; 1010 long nNewPage; 1011 SwRootFrm* pTmpRootFrm = GetLayout();//swmod 080317 1012 sal_uInt16 nMaxPage = pTmpRootFrm->GetPageNum(); 1013 sal_Bool bTmpAssert = sal_False; 1014 for( sal_uInt16 n = 0; n < rFillArr.Count(); ++n ) 1015 { 1016 pFmt = (SwFrmFmt*)rFillArr[n]; 1017 if( USHRT_MAX != pDoc->GetSpzFrmFmts()->GetPos( pFmt )) 1018 { 1019 // FlyFmt ist noch gueltig, also behandeln 1020 SwFmtAnchor aNewAnchor( pFmt->GetAnchor() ); 1021 if ((FLY_AT_PAGE != aNewAnchor.GetAnchorId()) || 1022 0 >= ( nNewPage = aNewAnchor.GetPageNum() + nOffset ) ) 1023 // chaos::Anchor wurde veraendert oder ungueltige SeitenNummer, 1024 // also nicht veraendern !! 1025 continue; 1026 1027 if( sal_uInt16(nNewPage) > nMaxPage ) 1028 { 1029 if ( RES_DRAWFRMFMT == pFmt->Which() ) 1030 { 1031 SwContact *pCon = pFmt->FindContactObj(); 1032 if( pCon ) 1033 ((SwDrawContact*)pCon)->DisconnectFromLayout(); 1034 } 1035 else 1036 pFmt->DelFrms(); 1037 bTmpAssert = sal_True; 1038 } 1039 aNewAnchor.SetPageNum( sal_uInt16(nNewPage) ); 1040 pDoc->SetAttr( aNewAnchor, *pFmt ); 1041 } 1042 } 1043 1044 if( bTmpAssert ) 1045 pTmpRootFrm->SetAssertFlyPages(); 1046 1047 EndUndo(); 1048 EndAllAction(); 1049 } 1050 1051 /*********************************************************************** 1052 #* Class : SwFEShell 1053 #* Methode : GetFlyFrmAttr 1054 #* Beschreibung: Alle Attribute in dem 'Koerbchen' werden mit den 1055 #* Attributen des aktuellen FlyFrms gefuellt. 1056 #* Sind Attribute nicht zu fuellen weil fehl am Platz oder 1057 #* uneindeutig (Mehrfachtselektionen) so werden sie entfernt. 1058 #* Datum : MA 03. Nov. 92 1059 #* Update : MA 03. Feb. 94 1060 #***********************************************************************/ 1061 1062 sal_Bool SwFEShell::GetFlyFrmAttr( SfxItemSet &rSet ) const 1063 { 1064 SwFlyFrm *pFly = FindFlyFrm(); 1065 if ( !pFly ) 1066 { 1067 // --> OD 2006-11-08 #139670# - make code robust 1068 SwFrm* pCurrFrm( GetCurrFrm() ); 1069 if ( !pCurrFrm ) 1070 { 1071 ASSERT( false, 1072 "<SwFEShell::GetFlyFrmAttr(..)> - missing current frame. This is a serious defect, please inform OD." ); 1073 return sal_False; 1074 } 1075 // <-- 1076 pFly = GetCurrFrm()->FindFlyFrm(); 1077 if ( !pFly ) 1078 { 1079 ASSERT( !this, "GetFlyFrmAttr, no Fly selected." ); 1080 return sal_False; 1081 } 1082 } 1083 1084 SET_CURR_SHELL( (ViewShell*)this ); 1085 1086 if( !rSet.Set( pFly->GetFmt()->GetAttrSet(), sal_True ) ) 1087 return sal_False; 1088 1089 //Und die Attribute durchschaufeln. Unerlaubte Attribute entfernen, dann 1090 //alle restlichen Attribute besorgen und eintragen. 1091 const SfxPoolItem* pItem; 1092 if( SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, sal_False, &pItem ) ) 1093 { 1094 SwFmtAnchor* pAnchor = (SwFmtAnchor*)pItem; 1095 RndStdIds eType = pAnchor->GetAnchorId(); 1096 1097 if ( FLY_AT_PAGE != eType ) 1098 { 1099 // OD 12.11.2003 #i22341# - content anchor of anchor item is needed. 1100 // Thus, don't overwrite anchor item by default contructed anchor item. 1101 //rSet.Put( SwFmtAnchor( eType ) ); 1102 if ( FLY_AS_CHAR == eType ) 1103 { 1104 rSet.ClearItem( RES_OPAQUE ); 1105 rSet.ClearItem( RES_SURROUND ); 1106 } 1107 } 1108 } 1109 rSet.SetParent( pFly->GetFmt()->GetAttrSet().GetParent() ); 1110 //JP 11.02.97: Bug #35894#: die Attribute MUESSEN entfern werden! 1111 rSet.ClearItem( RES_FILL_ORDER ); 1112 rSet.ClearItem( RES_CNTNT ); 1113 //MA: Ersteinmal entfernen (Template by example usw.) 1114 rSet.ClearItem( RES_CHAIN ); 1115 return sal_True; 1116 } 1117 /*********************************************************************** 1118 #* Class : SwFEShell 1119 #* Methode : SetFlyFrmAttr 1120 #* Beschreibung: Die Attribute des aktuellen Flys aendern sich. 1121 #* Datum : MA 03. Nov. 92 1122 #* Update : MA 01. Aug. 95 1123 #***********************************************************************/ 1124 1125 sal_Bool SwFEShell::SetFlyFrmAttr( SfxItemSet& rSet ) 1126 { 1127 SET_CURR_SHELL( this ); 1128 sal_Bool bRet = sal_False; 1129 1130 if( rSet.Count() ) 1131 { 1132 SwFlyFrm *pFly = FindFlyFrm(); 1133 if( !pFly ) 1134 { 1135 ASSERT( GetCurrFrm(), "Crsr in parking zone" ); 1136 pFly = GetCurrFrm()->FindFlyFrm(); 1137 ASSERT( pFly, "SetFlyFrmAttr, no Fly selected." ); 1138 } 1139 if( pFly ) 1140 { 1141 StartAllAction(); 1142 const Point aPt( pFly->Frm().Pos() ); 1143 1144 if( SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, sal_False )) 1145 ::lcl_ChkAndSetNewAnchor( *pFly, rSet ); 1146 SwFlyFrmFmt* pFlyFmt = (SwFlyFrmFmt*)pFly->GetFmt(); 1147 1148 if( GetDoc()->SetFlyFrmAttr( *pFlyFmt, rSet )) 1149 { 1150 bRet = sal_True; 1151 SwFlyFrm* pFrm = pFlyFmt->GetFrm( &aPt ); 1152 if( pFrm ) 1153 SelectFlyFrm( *pFrm, sal_True ); 1154 else 1155 GetLayout()->SetAssertFlyPages(); 1156 } 1157 1158 EndAllActionAndCall(); 1159 } 1160 } 1161 return bRet; 1162 } 1163 /*-- 30.03.2004 15:05:07--------------------------------------------------- 1164 1165 -----------------------------------------------------------------------*/ 1166 sal_Bool SwFEShell::SetDrawingAttr( SfxItemSet& rSet ) 1167 { 1168 sal_Bool bRet = sal_False; 1169 SET_CURR_SHELL( this ); 1170 if ( !rSet.Count() || 1171 !Imp()->HasDrawView() ) 1172 return bRet; 1173 1174 const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList(); 1175 if ( rMrkList.GetMarkCount() != 1 ) 1176 return bRet; 1177 1178 StartUndo(); 1179 SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); 1180 SwFrmFmt *pFmt = FindFrmFmt( pObj ); 1181 StartAllAction(); 1182 if( SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, sal_False )) 1183 { 1184 RndStdIds nNew = ((SwFmtAnchor&)rSet.Get( RES_ANCHOR )).GetAnchorId(); 1185 if ( nNew != pFmt->GetAnchor().GetAnchorId() ) 1186 { 1187 ChgAnchor( nNew ); 1188 // --> OD 2004-06-17 #i26791# - clear anchor attribute in item set, 1189 // because method <ChgAnchor(..)> takes care of it. 1190 rSet.ClearItem( RES_ANCHOR ); 1191 } 1192 } 1193 1194 if( GetDoc()->SetFlyFrmAttr( *pFmt, rSet )) 1195 { 1196 bRet = sal_True; 1197 Point aTmp; 1198 SelectObj( aTmp, 0, pObj ); 1199 } 1200 EndAllActionAndCall(); 1201 EndUndo(); 1202 return bRet; 1203 } 1204 1205 1206 /*********************************************************************** 1207 #* Class : SwFEShell 1208 #* Methode : ResetFlyFrmAttr 1209 #* Beschreibung: Das gewuenschte Attribut oder die im Set befindlichen 1210 #* werden zurueckgesetzt. 1211 #* Datum : MA 14. Mar. 97 1212 #* Update : MA 14. Mar. 97 1213 #***********************************************************************/ 1214 1215 sal_Bool SwFEShell::ResetFlyFrmAttr( sal_uInt16 nWhich, const SfxItemSet* pSet ) 1216 { 1217 sal_Bool bRet = sal_False; 1218 1219 if( RES_ANCHOR != nWhich && RES_CHAIN != nWhich && RES_CNTNT != nWhich ) 1220 { 1221 SET_CURR_SHELL( this ); 1222 1223 SwFlyFrm *pFly = FindFlyFrm(); 1224 if( !pFly ) 1225 { 1226 ASSERT( GetCurrFrm(), "Crsr in parking zone" ); 1227 pFly = GetCurrFrm()->FindFlyFrm(); 1228 ASSERT( pFly, "SetFlyFrmAttr, no Fly selected." ); 1229 } 1230 1231 if( pFly ) 1232 { 1233 StartAllAction(); 1234 1235 if( pSet ) 1236 { 1237 SfxItemIter aIter( *pSet ); 1238 const SfxPoolItem* pItem = aIter.FirstItem(); 1239 while( pItem ) 1240 { 1241 if( !IsInvalidItem( pItem ) && 1242 RES_ANCHOR != ( nWhich = pItem->Which() ) && 1243 RES_CHAIN != nWhich && RES_CNTNT != nWhich ) 1244 pFly->GetFmt()->ResetFmtAttr( nWhich ); 1245 pItem = aIter.NextItem(); 1246 } 1247 } 1248 else 1249 pFly->GetFmt()->ResetFmtAttr( nWhich ); 1250 1251 bRet = sal_True; 1252 EndAllActionAndCall(); 1253 GetDoc()->SetModified(); 1254 } 1255 } 1256 return bRet; 1257 } 1258 1259 /*********************************************************************** 1260 #* Class : SwFEShell 1261 #* Methode : GetCurFrmFmt 1262 #* Beschreibung: liefert wenn Rahmen, dann Rahmenvorlage, sonst 0 1263 #* Datum : ST 04. Jun. 93 1264 #* Update : 1265 #***********************************************************************/ 1266 1267 SwFrmFmt* SwFEShell::GetCurFrmFmt() const 1268 { 1269 SwFrmFmt* pRet = 0; 1270 SwLayoutFrm *pFly = FindFlyFrm(); 1271 if( pFly && ( pRet = (SwFrmFmt*)pFly->GetFmt()->DerivedFrom() ) == 1272 GetDoc()->GetDfltFrmFmt() ) 1273 pRet = 0; 1274 return pRet; 1275 } 1276 1277 /****************************************************************************** 1278 * Methode : void SwFEShell::SetFrmFmt(SwFrmFmt *pNewFmt) 1279 * Beschreibung: 1280 * Erstellt : OK 14.04.94 15:40 1281 * Aenderung : MA 23. Apr. 97 1282 ******************************************************************************/ 1283 1284 void SwFEShell::SetFrmFmt( SwFrmFmt *pNewFmt, sal_Bool bKeepOrient, Point* pDocPos ) 1285 { 1286 SwFlyFrm *pFly = 0; 1287 if(pDocPos) 1288 { 1289 const SwFrmFmt* pFmt = GetFmtFromObj( *pDocPos ); 1290 1291 if(PTR_CAST(SwFlyFrmFmt, pFmt)) 1292 pFly = ((SwFlyFrmFmt*)pFmt)->GetFrm(); 1293 } 1294 else 1295 pFly = FindFlyFrm(); 1296 ASSERT( pFly, "SetFrmFmt: kein Frame" ); 1297 if( pFly ) 1298 { 1299 StartAllAction(); 1300 SET_CURR_SHELL( this ); 1301 1302 SwFlyFrmFmt* pFlyFmt = (SwFlyFrmFmt*)pFly->GetFmt(); 1303 const Point aPt( pFly->Frm().Pos() ); 1304 1305 SfxItemSet* pSet = 0; 1306 const SfxPoolItem* pItem; 1307 if( SFX_ITEM_SET == pNewFmt->GetItemState( RES_ANCHOR, sal_False, &pItem )) 1308 { 1309 pSet = new SfxItemSet( GetDoc()->GetAttrPool(), aFrmFmtSetRange ); 1310 pSet->Put( *pItem ); 1311 if( !::lcl_ChkAndSetNewAnchor( *pFly, *pSet )) 1312 delete pSet, pSet = 0; 1313 } 1314 1315 if( GetDoc()->SetFrmFmtToFly( *pFlyFmt, *pNewFmt, pSet, bKeepOrient )) 1316 { 1317 SwFlyFrm* pFrm = pFlyFmt->GetFrm( &aPt ); 1318 if( pFrm ) 1319 SelectFlyFrm( *pFrm, sal_True ); 1320 else 1321 GetLayout()->SetAssertFlyPages(); 1322 } 1323 if( pSet ) 1324 delete pSet; 1325 1326 EndAllActionAndCall(); 1327 } 1328 } 1329 1330 /************************************************************************* 1331 |* 1332 |* SwFEShell::GetFlyFrmFmt() 1333 |* 1334 |* Ersterstellung OK 23.06.93 13:15 1335 |* Letzte Aenderung OK 23.06.93 13:15 1336 |* 1337 *************************************************************************/ 1338 1339 const SwFrmFmt* SwFEShell::GetFlyFrmFmt() const 1340 { 1341 const SwFlyFrm* pFly = FindFlyFrm(); 1342 if ( !pFly ) 1343 { 1344 SwFrm* pCurrFrm = GetCurrFrm(); 1345 pFly = pCurrFrm ? pCurrFrm->FindFlyFrm() : 0; 1346 } 1347 if( pFly ) 1348 return pFly->GetFmt(); 1349 return 0; 1350 } 1351 1352 SwFrmFmt* SwFEShell::GetFlyFrmFmt() 1353 { 1354 SwFlyFrm* pFly = FindFlyFrm(); 1355 if ( !pFly ) 1356 { 1357 SwFrm* pCurrFrm = GetCurrFrm(); 1358 pFly = pCurrFrm ? pCurrFrm->FindFlyFrm() : 0; 1359 } 1360 if( pFly ) 1361 return pFly->GetFmt(); 1362 return 0; 1363 } 1364 1365 /************************************************************************* 1366 |* 1367 |* SwFEShell::GetFlyRect() 1368 |* 1369 |* Ersterstellung AMA 6. Mae. 97 1370 |* Letzte Aenderung AMA 6. Mae. 97 1371 |* 1372 *************************************************************************/ 1373 1374 SwRect SwFEShell::GetFlyRect() const 1375 { 1376 SwCntntFrm *pCntnt = GetCurrFrm( sal_False ); 1377 SwFlyFrm *pFly = pCntnt ? pCntnt->FindFlyFrm() : 0; 1378 if ( !pFly ) 1379 { 1380 SwRect aRect; 1381 return aRect; 1382 } 1383 else 1384 return pFly->Frm(); 1385 } 1386 1387 /************************************************************************* 1388 |* 1389 |* SwFEShell::GetObjRect() 1390 |* 1391 |* Ersterstellung MA 22. Aug. 93 1392 |* Letzte Aenderung MA 11. Jan. 95 1393 |* 1394 *************************************************************************/ 1395 1396 SwRect SwFEShell::GetObjRect() const 1397 { 1398 if( Imp()->HasDrawView() ) 1399 return Imp()->GetDrawView()->GetAllMarkedRect(); 1400 else 1401 { 1402 SwRect aRect; 1403 return aRect; 1404 } 1405 } 1406 1407 void SwFEShell::SetObjRect( const SwRect& rRect ) 1408 { 1409 if ( Imp()->HasDrawView() ) 1410 { 1411 Imp()->GetDrawView()->SetAllMarkedRect( rRect.SVRect() ); 1412 CallChgLnk(); // rufe das AttrChangeNotify auf der UI-Seite. 1413 } 1414 } 1415 1416 /*********************************************************************** 1417 #* Class : SwFEShell 1418 #* Methode : RequestObjectResize() 1419 #* Datum : MA 10. Feb. 95 1420 #* Update : MA 13. Jul. 95 1421 #***********************************************************************/ 1422 1423 Size SwFEShell::RequestObjectResize( const SwRect &rRect, const uno::Reference < embed::XEmbeddedObject >& xObj ) 1424 { 1425 Size aResult; 1426 1427 SwFlyFrm *pFly = FindFlyFrm( xObj ); 1428 if ( !pFly ) 1429 { 1430 aResult = rRect.SSize(); 1431 return aResult; 1432 } 1433 1434 aResult = pFly->Prt().SSize(); 1435 1436 sal_Bool bPosProt = pFly->GetFmt()->GetProtect().IsPosProtected(); 1437 sal_Bool bSizeProt = pFly->GetFmt()->GetProtect().IsSizeProtected(); 1438 1439 StartAllAction(); 1440 1441 //MA wir lassen den Fly nicht Clippen, damit die Ole-Server mit 1442 //beliebigen Wuenschen kommen koennen. Die Formatierung uebernimmt das 1443 //Clippen. Die richtige Darstellung wird per Scalierung erledigt. 1444 //Die Scalierung wird von SwNoTxtFrm::Format durch einen Aufruf von 1445 //SwWrtShell::CalcAndSetScale() erledigt. 1446 if ( rRect.SSize() != pFly->Prt().SSize() && !bSizeProt ) 1447 { 1448 Size aSz( rRect.SSize() ); 1449 1450 //JP 28.02.2001: Task 74707 - ask for fly in fly with automatic size 1451 // 1452 const SwFrm* pAnchor; 1453 const SwTxtNode* pTNd; 1454 const SwpHints* pHts; 1455 const SwFmtFrmSize& rFrmSz = pFly->GetFmt()->GetFrmSize(); 1456 if( bCheckForOLEInCaption && 1457 0 != rFrmSz.GetWidthPercent() && 1458 0 != (pAnchor = pFly->GetAnchorFrm()) && 1459 pAnchor->IsTxtFrm() && 1460 !pAnchor->GetNext() && !pAnchor->GetPrev() && 1461 pAnchor->GetUpper()->IsFlyFrm() && 1462 0 != ( pTNd = ((SwTxtFrm*)pAnchor)->GetNode()->GetTxtNode()) && 1463 0 != ( pHts = pTNd->GetpSwpHints() )) 1464 { 1465 // search for a sequence field: 1466 const SfxPoolItem* pItem; 1467 for( sal_uInt16 n = 0, nEnd = pHts->Count(); n < nEnd; ++n ) 1468 if( RES_TXTATR_FIELD == ( pItem = 1469 &(*pHts)[ n ]->GetAttr())->Which() && 1470 TYP_SEQFLD == ((SwFmtFld*)pItem)->GetField()->GetTypeId() ) 1471 { 1472 // sequence field found 1473 SwFlyFrm* pChgFly = (SwFlyFrm*)pAnchor->GetUpper(); 1474 // calculate the changed size: 1475 // width must change, height can change 1476 Size aNewSz( aSz.Width() + pChgFly->Frm().Width() - 1477 pFly->Prt().Width(), aSz.Height() ); 1478 1479 SwFrmFmt *pFmt = pChgFly->GetFmt(); 1480 SwFmtFrmSize aFrmSz( pFmt->GetFrmSize() ); 1481 aFrmSz.SetWidth( aNewSz.Width() ); 1482 if( ATT_MIN_SIZE != aFrmSz.GetHeightSizeType() ) 1483 { 1484 aNewSz.Height() += pChgFly->Frm().Height() - 1485 pFly->Prt().Height(); 1486 if( Abs( aNewSz.Height() - pChgFly->Frm().Height()) > 1 ) 1487 aFrmSz.SetHeight( aNewSz.Height() ); 1488 } 1489 // uebers Doc fuers Undo! 1490 pFmt->GetDoc()->SetAttr( aFrmSz, *pFmt ); 1491 break; 1492 } 1493 } 1494 1495 // set the new Size at the fly themself 1496 if ( pFly->Prt().Height() > 0 && pFly->Prt().Width() > 0 ) 1497 { 1498 aSz.Width() += pFly->Frm().Width() - pFly->Prt().Width(); 1499 aSz.Height()+= pFly->Frm().Height()- pFly->Prt().Height(); 1500 } 1501 aResult = pFly->ChgSize( aSz ); 1502 1503 //Wenn sich das Objekt aendert ist die Kontur hoechstwahrscheinlich daneben. 1504 ASSERT( pFly->Lower()->IsNoTxtFrm(), "Request ohne NoTxt" ); 1505 SwNoTxtNode *pNd = ((SwCntntFrm*)pFly->Lower())->GetNode()->GetNoTxtNode(); 1506 ASSERT( pNd, "Request ohne Node" ); 1507 pNd->SetContour( 0 ); 1508 ClrContourCache(); 1509 } 1510 1511 //Wenn nur die Size angepasst werden soll, so wird eine Pos mit 1512 //ausgezeichneten Werten transportiert. 1513 Point aPt( pFly->Prt().Pos() ); 1514 aPt += pFly->Frm().Pos(); 1515 if ( rRect.Top() != LONG_MIN && rRect.Pos() != aPt && !bPosProt ) 1516 { 1517 aPt = rRect.Pos(); 1518 aPt.X() -= pFly->Prt().Left(); 1519 aPt.Y() -= pFly->Prt().Top(); 1520 //Bei Absatzgebundenen Flys muss ausgehend von der neuen Position ein 1521 //neuer Anker gesetzt werden. Anker und neue RelPos werden vom Fly 1522 //selbst berechnet und gesetzt. 1523 if( pFly->IsFlyAtCntFrm() ) 1524 ((SwFlyAtCntFrm*)pFly)->SetAbsPos( aPt ); 1525 else 1526 { 1527 const SwFrmFmt *pFmt = pFly->GetFmt(); 1528 const SwFmtVertOrient &rVert = pFmt->GetVertOrient(); 1529 const SwFmtHoriOrient &rHori = pFmt->GetHoriOrient(); 1530 const long lXDiff = aPt.X() - pFly->Frm().Left(); 1531 const long lYDiff = aPt.Y() - pFly->Frm().Top(); 1532 const Point aTmp( rHori.GetPos() + lXDiff, 1533 rVert.GetPos() + lYDiff ); 1534 pFly->ChgRelPos( aTmp ); 1535 } 1536 } 1537 1538 SwFlyFrmFmt *pFlyFrmFmt = pFly->GetFmt(); 1539 ASSERT( pFlyFrmFmt, "fly frame format missing!" ); 1540 if ( pFlyFrmFmt ) 1541 pFlyFrmFmt->SetLastFlyFrmPrtRectPos( pFly->Prt().Pos() ); //stores the value of last Prt rect 1542 1543 EndAllAction(); 1544 1545 return aResult; 1546 } 1547 1548 1549 /*********************************************************************** 1550 #* Class : SwFEShell 1551 #* Methode : WizzardFindCurFrmFmt 1552 #* Datum : JP 31.07.95 1553 #* Update : JP 31.07.95 1554 #***********************************************************************/ 1555 1556 SwFrmFmt* SwFEShell::WizzardGetFly() 1557 { 1558 // mal nicht uebers Layout den Fly suchen. Dann kann auch ohne gueltiges 1559 // Layout ein Rahmen geloescht werden. ( z.B.: fuer die Wizard's ) 1560 SwSpzFrmFmts& rSpzArr = *pDoc->GetSpzFrmFmts(); 1561 sal_uInt16 nCnt = rSpzArr.Count(); 1562 if( nCnt ) 1563 { 1564 SwNodeIndex& rCrsrNd = GetCrsr()->GetPoint()->nNode; 1565 if( rCrsrNd.GetIndex() > pDoc->GetNodes().GetEndOfExtras().GetIndex() ) 1566 // Cusor steht im Body-Bereich! 1567 return 0; 1568 1569 for( sal_uInt16 n = 0; n < nCnt; ++n ) 1570 { 1571 SwFrmFmt* pFmt = rSpzArr[ n ]; 1572 const SwNodeIndex* pIdx = pFmt->GetCntnt( sal_False ).GetCntntIdx(); 1573 SwStartNode* pSttNd; 1574 if( pIdx && 1575 0 != ( pSttNd = pIdx->GetNode().GetStartNode() ) && 1576 pSttNd->GetIndex() < rCrsrNd.GetIndex() && 1577 rCrsrNd.GetIndex() < pSttNd->EndOfSectionIndex() ) 1578 { 1579 // gefunden: also raus damit 1580 return pFmt; 1581 } 1582 } 1583 } 1584 return 0; 1585 } 1586 1587 void SwFEShell::SetFlyName( const String& rName ) 1588 { 1589 SwLayoutFrm *pFly = FindFlyFrm(); 1590 if( pFly ) 1591 GetDoc()->SetFlyName( *(SwFlyFrmFmt*)pFly->GetFmt(), rName ); 1592 else { 1593 ASSERT( !this, "kein FlyFrame selektiert" ) 1594 } 1595 } 1596 1597 const String& SwFEShell::GetFlyName() const 1598 { 1599 SwLayoutFrm *pFly = FindFlyFrm(); 1600 if( pFly ) 1601 return pFly->GetFmt()->GetName(); 1602 1603 ASSERT( !this, "kein FlyFrame selektiert" ) 1604 return aEmptyStr; 1605 } 1606 1607 1608 const uno::Reference < embed::XEmbeddedObject > SwFEShell::GetOleRef() const 1609 { 1610 uno::Reference < embed::XEmbeddedObject > xObj; 1611 SwFlyFrm * pFly = FindFlyFrm(); 1612 if (pFly && pFly->Lower() && pFly->Lower()->IsNoTxtFrm()) 1613 { 1614 SwOLENode *pNd = ((SwNoTxtFrm*)pFly->Lower())->GetNode()->GetOLENode(); 1615 if (pNd) 1616 xObj = pNd->GetOLEObj().GetOleRef(); 1617 } 1618 return xObj; 1619 } 1620 1621 1622 String SwFEShell::GetUniqueGrfName() const 1623 { 1624 return GetDoc()->GetUniqueGrfName(); 1625 } 1626 1627 const SwFrmFmt* SwFEShell::IsURLGrfAtPos( const Point& rPt, String* pURL, 1628 String *pTargetFrameName, 1629 String *pDescription ) const 1630 { 1631 if( !Imp()->HasDrawView() ) 1632 return 0; 1633 1634 SdrObject* pObj; 1635 SdrPageView* pPV; 1636 const SwFrmFmt* pRet = 0; 1637 SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView(); 1638 1639 sal_uInt16 nOld = pDView->GetHitTolerancePixel(); 1640 pDView->SetHitTolerancePixel( 2 ); 1641 1642 if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPV,SDRSEARCH_PICKMACRO ) && 1643 pObj->ISA(SwVirtFlyDrawObj) ) 1644 { 1645 SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm(); 1646 const SwFmtURL &rURL = pFly->GetFmt()->GetURL(); 1647 if( rURL.GetURL().Len() || rURL.GetMap() ) 1648 { 1649 sal_Bool bSetTargetFrameName = pTargetFrameName != 0; 1650 sal_Bool bSetDescription = pDescription != 0; 1651 if ( rURL.GetMap() ) 1652 { 1653 IMapObject *pObject = pFly->GetFmt()->GetIMapObject( rPt, pFly ); 1654 if ( pObject && pObject->GetURL().Len() ) 1655 { 1656 if( pURL ) 1657 *pURL = pObject->GetURL(); 1658 if ( bSetTargetFrameName && pObject->GetTarget().Len() ) 1659 { 1660 bSetTargetFrameName = sal_False; 1661 *pTargetFrameName = pObject->GetTarget(); 1662 } 1663 if ( bSetDescription ) 1664 { 1665 bSetDescription = sal_False; 1666 *pDescription = pObject->GetAltText(); 1667 } 1668 pRet = pFly->GetFmt(); 1669 } 1670 } 1671 else 1672 { 1673 if( pURL ) 1674 { 1675 *pURL = rURL.GetURL(); 1676 if( rURL.IsServerMap() ) 1677 { 1678 // dann die rel. Pixel Position anhaengen !! 1679 Point aPt( rPt ); 1680 aPt -= pFly->Frm().Pos(); 1681 // ohne MapMode-Offset, ohne Offset, o ... !!!!! 1682 aPt = GetOut()->LogicToPixel( 1683 aPt, MapMode( MAP_TWIP ) ); 1684 ((( *pURL += '?' ) += String::CreateFromInt32( aPt.X() )) 1685 += ',' ) += String::CreateFromInt32(aPt.Y() ); 1686 } 1687 } 1688 pRet = pFly->GetFmt(); 1689 } 1690 if ( bSetTargetFrameName ) 1691 *pTargetFrameName = rURL.GetTargetFrameName(); 1692 if ( bSetDescription ) 1693 *pDescription = pFly->GetFmt()->GetName(); 1694 } 1695 } 1696 pDView->SetHitTolerancePixel( nOld ); 1697 return pRet; 1698 } 1699 1700 const Graphic *SwFEShell::GetGrfAtPos( const Point &rPt, 1701 String &rName, sal_Bool &rbLink ) const 1702 { 1703 if( !Imp()->HasDrawView() ) 1704 return 0; 1705 1706 SdrObject* pObj; 1707 SdrPageView* pPV; 1708 SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView(); 1709 1710 if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPV ) && pObj->ISA(SwVirtFlyDrawObj) ) 1711 { 1712 SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm(); 1713 if ( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() ) 1714 { 1715 SwGrfNode *pNd = ((SwCntntFrm*)pFly->Lower())->GetNode()->GetGrfNode(); 1716 if ( pNd ) 1717 { 1718 if ( pNd->IsGrfLink() ) 1719 { 1720 //Halbfertige Grafik? 1721 ::sfx2::SvLinkSource* pLnkObj = pNd->GetLink()->GetObj(); 1722 if( pLnkObj && pLnkObj->IsPending() ) 1723 return 0; 1724 rbLink = sal_True; 1725 } 1726 1727 pNd->GetFileFilterNms( &rName, 0 ); 1728 if ( !rName.Len() ) 1729 rName = pFly->GetFmt()->GetName(); 1730 pNd->SwapIn( sal_True ); 1731 return &pNd->GetGrf(); 1732 } 1733 } 1734 } 1735 return 0; 1736 } 1737 1738 1739 const SwFrmFmt* SwFEShell::GetFmtFromObj( const Point& rPt, SwRect** pRectToFill ) const 1740 { 1741 SwFrmFmt* pRet = 0; 1742 1743 if( Imp()->HasDrawView() ) 1744 { 1745 SdrObject* pObj; 1746 SdrPageView* pPView; 1747 1748 SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView(); 1749 1750 sal_uInt16 nOld = pDView->GetHitTolerancePixel(); 1751 // Tattergrenze fuer Drawing-SS 1752 pDView->SetHitTolerancePixel( pDView->GetMarkHdlSizePixel()/2 ); 1753 1754 if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPView, SDRSEARCH_PICKMARKABLE ) ) 1755 { 1756 // dann teste mal was es ist: 1757 if ( pObj->ISA(SwVirtFlyDrawObj) ) 1758 pRet = ((SwVirtFlyDrawObj*)pObj)->GetFmt(); 1759 else if ( pObj->GetUserCall() ) //nicht fuer Gruppenobjekte 1760 pRet = ((SwDrawContact*)pObj->GetUserCall())->GetFmt(); 1761 if(pRet && pRectToFill) 1762 **pRectToFill = pObj->GetCurrentBoundRect(); 1763 } 1764 pDView->SetHitTolerancePixel( nOld ); 1765 } 1766 return pRet; 1767 } 1768 1769 // returns a format too, if the point is over the text of any fly 1770 const SwFrmFmt* SwFEShell::GetFmtFromAnyObj( const Point& rPt ) const 1771 { 1772 const SwFrmFmt* pRet = GetFmtFromObj( rPt ); 1773 if( !pRet || RES_FLYFRMFMT == pRet->Which() ) 1774 { 1775 SwPosition aPos( *GetCrsr()->GetPoint() ); 1776 Point aPt( rPt ); 1777 GetLayout()->GetCrsrOfst( &aPos, aPt ); 1778 SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode(); 1779 SwFrm* pFrm = pNd->getLayoutFrm( GetLayout(), &rPt, 0, sal_False )->FindFlyFrm(); 1780 pRet = pFrm ? ((SwLayoutFrm*)pFrm)->GetFmt() : 0; 1781 } 1782 return pRet; 1783 } 1784 1785 ObjCntType SwFEShell::GetObjCntType( const SdrObject& rObj ) const 1786 { 1787 ObjCntType eType = OBJCNT_NONE; 1788 1789 // OD 23.06.2003 #108784# - investigate 'master' drawing object, if method 1790 // is called for a 'virtual' drawing object. 1791 const SdrObject* pInvestigatedObj; 1792 if ( rObj.ISA(SwDrawVirtObj) ) 1793 { 1794 const SwDrawVirtObj* pDrawVirtObj = static_cast<const SwDrawVirtObj*>(&rObj); 1795 pInvestigatedObj = &(pDrawVirtObj->GetReferencedObj()); 1796 } 1797 else 1798 { 1799 pInvestigatedObj = &rObj; 1800 } 1801 1802 if( FmFormInventor == pInvestigatedObj->GetObjInventor() ) 1803 { 1804 eType = OBJCNT_CONTROL; 1805 uno::Reference< awt::XControlModel > xModel = 1806 ((SdrUnoObj&)(*pInvestigatedObj)).GetUnoControlModel(); 1807 if( xModel.is() ) 1808 { 1809 uno::Any aVal; 1810 OUString sName = OUString::createFromAscii("ButtonType"); 1811 uno::Reference< beans::XPropertySet > xSet(xModel, uno::UNO_QUERY); 1812 1813 uno::Reference< beans::XPropertySetInfo > xInfo = xSet->getPropertySetInfo(); 1814 if(xInfo->hasPropertyByName( sName )) 1815 { 1816 beans::Property xProperty = xInfo->getPropertyByName( sName ); 1817 aVal = xSet->getPropertyValue( sName ); 1818 if( aVal.getValue() && form::FormButtonType_URL == *((form::FormButtonType*)aVal.getValue()) ) 1819 eType = OBJCNT_URLBUTTON; 1820 } 1821 } 1822 } 1823 else if( pInvestigatedObj->ISA(SwVirtFlyDrawObj) ) 1824 { 1825 SwFlyFrm *pFly = ((SwVirtFlyDrawObj&)(*pInvestigatedObj)).GetFlyFrm(); 1826 if ( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() ) 1827 { 1828 if ( ((SwCntntFrm*)pFly->Lower())->GetNode()->GetGrfNode() ) 1829 eType = OBJCNT_GRF; 1830 else 1831 eType = OBJCNT_OLE; 1832 } 1833 else 1834 eType = OBJCNT_FLY; 1835 } 1836 else if ( pInvestigatedObj->ISA( SdrObjGroup ) ) 1837 { 1838 SwDrawContact* pDrawContact( dynamic_cast<SwDrawContact*>(GetUserCall( pInvestigatedObj ) ) ); 1839 if ( !pDrawContact ) 1840 { 1841 ASSERT( false, 1842 "<SwFEShell::GetObjCntType(..)> - missing draw contact object" ); 1843 eType = OBJCNT_NONE; 1844 } 1845 else 1846 { 1847 SwFrmFmt* pFrmFmt( pDrawContact->GetFmt() ); 1848 if ( !pFrmFmt ) 1849 { 1850 ASSERT( false, 1851 "<SwFEShell::GetObjCntType(..)> - missing frame format" ); 1852 eType = OBJCNT_NONE; 1853 } 1854 else if ( FLY_AS_CHAR != pFrmFmt->GetAnchor().GetAnchorId() ) 1855 { 1856 eType = OBJCNT_GROUPOBJ; 1857 } 1858 } 1859 } 1860 else 1861 eType = OBJCNT_SIMPLE; 1862 return eType; 1863 } 1864 1865 ObjCntType SwFEShell::GetObjCntType( const Point &rPt, SdrObject *&rpObj ) const 1866 { 1867 ObjCntType eType = OBJCNT_NONE; 1868 1869 if( Imp()->HasDrawView() ) 1870 { 1871 SdrObject* pObj; 1872 SdrPageView* pPView; 1873 1874 SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView(); 1875 1876 sal_uInt16 nOld = pDView->GetHitTolerancePixel(); 1877 // Tattergrenze fuer Drawing-SS 1878 pDView->SetHitTolerancePixel( pDView->GetMarkHdlSizePixel()/2 ); 1879 1880 if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPView, SDRSEARCH_PICKMARKABLE ) ) 1881 eType = GetObjCntType( *(rpObj = pObj) ); 1882 1883 pDView->SetHitTolerancePixel( nOld ); 1884 } 1885 return eType; 1886 } 1887 1888 ObjCntType SwFEShell::GetObjCntTypeOfSelection( SdrObject** ppObj ) const 1889 { 1890 ObjCntType eType = OBJCNT_NONE; 1891 1892 if( Imp()->HasDrawView() ) 1893 { 1894 const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList(); 1895 for( sal_uInt32 i = 0, nE = rMrkList.GetMarkCount(); i < nE; ++i ) 1896 { 1897 SdrObject* pObj = rMrkList.GetMark( i )->GetMarkedSdrObj(); 1898 if( !pObj ) 1899 continue; 1900 ObjCntType eTmp = GetObjCntType( *pObj ); 1901 if( !i ) 1902 { 1903 eType = eTmp; 1904 if( ppObj ) *ppObj = pObj; 1905 } 1906 else if( eTmp != eType ) 1907 { 1908 eType = OBJCNT_DONTCARE; 1909 // einmal DontCare, immer DontCare! 1910 break; 1911 } 1912 } 1913 } 1914 return eType; 1915 } 1916 1917 1918 sal_Bool SwFEShell::ReplaceSdrObj( const String& rGrfName, const String& rFltName, 1919 const Graphic* pGrf ) 1920 { 1921 SET_CURR_SHELL( this ); 1922 1923 sal_Bool bRet = sal_False; 1924 const SdrMarkList *pMrkList; 1925 if( Imp()->HasDrawView() && 1 == 1926 ( pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList())->GetMarkCount() ) 1927 { 1928 SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj(); 1929 SwFrmFmt *pFmt = FindFrmFmt( pObj ); 1930 1931 // Attribute sichern und dann an der Grafik setzen 1932 SfxItemSet aFrmSet( pDoc->GetAttrPool(), 1933 pFmt->GetAttrSet().GetRanges() ); 1934 aFrmSet.Set( pFmt->GetAttrSet() ); 1935 1936 // Groesse und Position setzen ?? 1937 if( !pObj->ISA(SwVirtFlyDrawObj) ) 1938 { 1939 // dann mal los: 1940 const Rectangle &rBound = pObj->GetSnapRect(); 1941 Point aRelPos( pObj->GetRelativePos() ); 1942 1943 const long nWidth = rBound.Right() - rBound.Left(); 1944 const long nHeight= rBound.Bottom() - rBound.Top(); 1945 aFrmSet.Put( SwFmtFrmSize( ATT_MIN_SIZE, 1946 Max( nWidth, long(MINFLY) ), 1947 Max( nHeight, long(MINFLY) ))); 1948 1949 if( SFX_ITEM_SET != aFrmSet.GetItemState( RES_HORI_ORIENT )) 1950 aFrmSet.Put( SwFmtHoriOrient( aRelPos.X(), text::HoriOrientation::NONE, text::RelOrientation::FRAME )); 1951 1952 if( SFX_ITEM_SET != aFrmSet.GetItemState( RES_VERT_ORIENT )) 1953 aFrmSet.Put( SwFmtVertOrient( aRelPos.Y(), text::VertOrientation::NONE, text::RelOrientation::FRAME )); 1954 1955 } 1956 1957 pObj->GetOrdNum(); 1958 1959 StartAllAction(); 1960 StartUndo(); 1961 1962 // das "Sdr-Object" loeschen und dafuer die Grafik einfuegen 1963 DelSelectedObj(); 1964 1965 pFmt = GetDoc()->Insert( *GetCrsr(), rGrfName, rFltName, pGrf, &aFrmSet, NULL, NULL ); 1966 1967 // die Ordnungsnummer (Z-Order) noch uebertragen 1968 // JP 04.07.98: klappt aber nicht richtig! 1969 //SdrObject* pNewObj = ::FindSdrObject( pFmt ); 1970 //pNewObj->SetOrdNum( nOrdNum ); 1971 1972 EndUndo(); 1973 EndAllAction(); 1974 bRet = sal_True; 1975 } 1976 return bRet; 1977 } 1978 1979 static sal_uInt16 SwFmtGetPageNum(const SwFlyFrmFmt * pFmt) 1980 { 1981 ASSERT(pFmt != NULL, "invalid argument"); 1982 1983 SwFlyFrm * pFrm = pFmt->GetFrm(); 1984 1985 sal_uInt16 aResult; 1986 1987 if (pFrm != NULL) 1988 aResult = pFrm->GetPhyPageNum(); 1989 else 1990 aResult = pFmt->GetAnchor().GetPageNum(); 1991 1992 return aResult; 1993 } 1994 1995 #include <fmtcnct.hxx> 1996 1997 void SwFEShell::GetConnectableFrmFmts(SwFrmFmt & rFmt, 1998 const String & rReference, 1999 sal_Bool bSuccessors, 2000 ::std::vector< String > & aPrevPageVec, 2001 ::std::vector< String > & aThisPageVec, 2002 ::std::vector< String > & aNextPageVec, 2003 ::std::vector< String > & aRestVec) 2004 { 2005 StartAction(); 2006 2007 SwFmtChain rChain = rFmt.GetChain(); 2008 SwFrmFmt * pOldChainNext = (SwFrmFmt *) rChain.GetNext(); 2009 SwFrmFmt * pOldChainPrev = (SwFrmFmt *) rChain.GetPrev(); 2010 2011 if (pOldChainNext) 2012 pDoc->Unchain(rFmt); 2013 2014 if (pOldChainPrev) 2015 pDoc->Unchain(*pOldChainPrev); 2016 2017 sal_uInt16 nCnt = pDoc->GetFlyCount(FLYCNTTYPE_FRM); 2018 2019 /* potential successors resp. predecessors */ 2020 ::std::vector< const SwFrmFmt * > aTmpSpzArray; 2021 2022 (SwFrmFmt *) pDoc->FindFlyByName(rReference); 2023 2024 for (sal_uInt16 n = 0; n < nCnt; n++) 2025 { 2026 const SwFrmFmt & rFmt1 = *(pDoc->GetFlyNum(n, FLYCNTTYPE_FRM)); 2027 2028 /* 2029 pFmt is a potential successor of rFmt if it is chainable after 2030 rFmt. 2031 2032 pFmt is a potential predecessor of rFmt if rFmt is chainable 2033 after pFmt. 2034 */ 2035 2036 int nChainState; 2037 2038 if (bSuccessors) 2039 nChainState = pDoc->Chainable(rFmt, rFmt1); 2040 else 2041 nChainState = pDoc->Chainable(rFmt1, rFmt); 2042 2043 if (nChainState == SW_CHAIN_OK) 2044 { 2045 aTmpSpzArray.push_back(&rFmt1); 2046 2047 } 2048 2049 } 2050 2051 if (aTmpSpzArray.size() > 0) 2052 { 2053 aPrevPageVec.clear(); 2054 aThisPageVec.clear(); 2055 aNextPageVec.clear(); 2056 aRestVec.clear(); 2057 2058 /* number of page rFmt resides on */ 2059 sal_uInt16 nPageNum = SwFmtGetPageNum((SwFlyFrmFmt *) &rFmt); 2060 2061 ::std::vector< const SwFrmFmt * >::const_iterator aIt; 2062 2063 for (aIt = aTmpSpzArray.begin(); aIt != aTmpSpzArray.end(); aIt++) 2064 { 2065 String aString = (*aIt)->GetName(); 2066 2067 /* rFmt is not a vaild successor or predecessor of 2068 itself */ 2069 if (aString != rReference && aString != rFmt.GetName()) 2070 { 2071 sal_uInt16 nNum1 = 2072 SwFmtGetPageNum((SwFlyFrmFmt *) *aIt); 2073 2074 if (nNum1 == nPageNum -1) 2075 aPrevPageVec.push_back(aString); 2076 else if (nNum1 == nPageNum) 2077 aThisPageVec.push_back(aString); 2078 else if (nNum1 == nPageNum + 1) 2079 aNextPageVec.push_back(aString); 2080 else 2081 aRestVec.push_back(aString); 2082 } 2083 } 2084 2085 } 2086 2087 if (pOldChainNext) 2088 pDoc->Chain(rFmt, *pOldChainNext); 2089 2090 if (pOldChainPrev) 2091 pDoc->Chain(*pOldChainPrev, rFmt); 2092 2093 EndAction(); 2094 } 2095 2096 // --> OD 2009-07-13 #i73249# 2097 const String SwFEShell::GetObjTitle() const 2098 { 2099 String aTitle; 2100 2101 if ( Imp()->HasDrawView() ) 2102 { 2103 const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList(); 2104 if ( pMrkList->GetMarkCount() == 1 ) 2105 { 2106 const SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj(); 2107 const SwFrmFmt* pFmt = FindFrmFmt( pObj ); 2108 if ( pFmt->Which() == RES_FLYFRMFMT ) 2109 { 2110 aTitle = dynamic_cast<const SwFlyFrmFmt*>(pFmt)->GetObjTitle(); 2111 } 2112 else 2113 { 2114 aTitle = pObj->GetTitle(); 2115 } 2116 } 2117 } 2118 2119 return aTitle; 2120 } 2121 2122 void SwFEShell::SetObjTitle( const String& rTitle ) 2123 { 2124 if ( Imp()->HasDrawView() ) 2125 { 2126 const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList(); 2127 if ( pMrkList->GetMarkCount() == 1 ) 2128 { 2129 SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj(); 2130 SwFrmFmt* pFmt = FindFrmFmt( pObj ); 2131 if ( pFmt->Which() == RES_FLYFRMFMT ) 2132 { 2133 GetDoc()->SetFlyFrmTitle( *(dynamic_cast<SwFlyFrmFmt*>(pFmt)), 2134 rTitle ); 2135 } 2136 else 2137 { 2138 pObj->SetTitle( rTitle ); 2139 } 2140 } 2141 } 2142 } 2143 2144 const String SwFEShell::GetObjDescription() const 2145 { 2146 String aDescription; 2147 2148 if ( Imp()->HasDrawView() ) 2149 { 2150 const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList(); 2151 if ( pMrkList->GetMarkCount() == 1 ) 2152 { 2153 const SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj(); 2154 const SwFrmFmt* pFmt = FindFrmFmt( pObj ); 2155 if ( pFmt->Which() == RES_FLYFRMFMT ) 2156 { 2157 aDescription = dynamic_cast<const SwFlyFrmFmt*>(pFmt)->GetObjDescription(); 2158 } 2159 else 2160 { 2161 aDescription = pObj->GetDescription(); 2162 } 2163 } 2164 } 2165 2166 return aDescription; 2167 } 2168 2169 void SwFEShell::SetObjDescription( const String& rDescription ) 2170 { 2171 if ( Imp()->HasDrawView() ) 2172 { 2173 const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList(); 2174 if ( pMrkList->GetMarkCount() == 1 ) 2175 { 2176 SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj(); 2177 SwFrmFmt* pFmt = FindFrmFmt( pObj ); 2178 if ( pFmt->Which() == RES_FLYFRMFMT ) 2179 { 2180 GetDoc()->SetFlyFrmDescription( *(dynamic_cast<SwFlyFrmFmt*>(pFmt)), 2181 rDescription ); 2182 } 2183 else 2184 { 2185 pObj->SetDescription( rDescription ); 2186 } 2187 } 2188 } 2189 } 2190 2191 2192 void SwFEShell::AlignFormulaToBaseline( const uno::Reference < embed::XEmbeddedObject >& xObj, SwFlyFrm * pFly ) 2193 { 2194 #if OSL_DEBUG_LEVEL > 1 2195 SvGlobalName aCLSID( xObj->getClassID() ); 2196 const bool bStarMath = ( SotExchange::IsMath( aCLSID ) != 0 ); 2197 ASSERT( bStarMath, "AlignFormulaToBaseline should only be called for Math objects" ); 2198 2199 if ( !bStarMath ) 2200 return; 2201 #endif 2202 2203 if (!pFly) 2204 pFly = FindFlyFrm( xObj ); 2205 ASSERT( pFly , "No fly frame!" ); 2206 SwFrmFmt * pFrmFmt = pFly ? pFly->GetFmt() : 0; 2207 2208 // baseline to baseline alignment should only be applied to formulas anchored as char 2209 if ( pFly && pFrmFmt && FLY_AS_CHAR == pFrmFmt->GetAnchor().GetAnchorId() ) 2210 { 2211 // get baseline from Math object 2212 uno::Any aBaseline; 2213 if( svt::EmbeddedObjectRef::TryRunningState( xObj ) ) 2214 { 2215 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY ); 2216 if ( xSet.is() ) 2217 { 2218 try 2219 { 2220 aBaseline = xSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BaseLine") ) ); 2221 } 2222 catch ( uno::Exception& ) 2223 { 2224 ASSERT( sal_False , "Baseline could not be retrieved from Starmath!" ); 2225 } 2226 } 2227 } 2228 2229 sal_Int32 nBaseline = ::comphelper::getINT32(aBaseline); 2230 const MapMode aSourceMapMode( MAP_100TH_MM ); 2231 const MapMode aTargetMapMode( MAP_TWIP ); 2232 nBaseline = OutputDevice::LogicToLogic( nBaseline, aSourceMapMode.GetMapUnit(), aTargetMapMode.GetMapUnit() ); 2233 2234 ASSERT( nBaseline > 0, "Wrong value of Baseline while retrieving from Starmath!" ); 2235 //nBaseline must be moved by aPrt position 2236 const SwFlyFrmFmt *pFlyFrmFmt = pFly->GetFmt(); 2237 ASSERT( pFlyFrmFmt, "fly frame format missing!" ); 2238 if ( pFlyFrmFmt ) 2239 nBaseline += pFlyFrmFmt->GetLastFlyFrmPrtRectPos().Y(); 2240 2241 const SwFmtVertOrient &rVert = pFrmFmt->GetVertOrient(); 2242 SwFmtVertOrient aVert( rVert ); 2243 aVert.SetPos( -nBaseline ); 2244 aVert.SetVertOrient( com::sun::star::text::VertOrientation::NONE ); 2245 2246 pFrmFmt->LockModify(); 2247 pFrmFmt->SetFmtAttr( aVert ); 2248 pFrmFmt->UnlockModify(); 2249 pFly->InvalidatePos(); 2250 } 2251 } 2252 2253 2254 void SwFEShell::AlignAllFormulasToBaseline() 2255 { 2256 StartAllAction(); 2257 2258 SwStartNode *pStNd; 2259 SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 ); 2260 while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) ) 2261 { 2262 ++aIdx; 2263 SwOLENode *pOleNode = dynamic_cast< SwOLENode * >( &aIdx.GetNode() ); 2264 if ( pOleNode ) 2265 { 2266 const uno::Reference < embed::XEmbeddedObject > & xObj( pOleNode->GetOLEObj().GetOleRef() ); 2267 if (xObj.is()) 2268 { 2269 SvGlobalName aCLSID( xObj->getClassID() ); 2270 if ( SotExchange::IsMath( aCLSID ) ) 2271 AlignFormulaToBaseline( xObj ); 2272 } 2273 } 2274 2275 aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 ); 2276 } 2277 2278 EndAllAction(); 2279 } 2280