1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sw.hxx" 30 31 #include <tools/list.hxx> 32 #include <svx/svdobj.hxx> 33 #include <init.hxx> 34 #include <fesh.hxx> 35 #include <pagefrm.hxx> 36 #include <rootfrm.hxx> 37 #include <cntfrm.hxx> 38 #include <doc.hxx> 39 #include <frmtool.hxx> 40 #include <swtable.hxx> 41 #include <viewimp.hxx> 42 #include <dview.hxx> 43 #include <flyfrm.hxx> 44 #include <node.hxx> 45 #include <pam.hxx> 46 #include <sectfrm.hxx> 47 #include <fmtpdsc.hxx> 48 #include <fmtsrnd.hxx> 49 #include <fmtcntnt.hxx> 50 #include <tabfrm.hxx> 51 #include <cellfrm.hxx> 52 #include <flyfrms.hxx> 53 #include <txtfrm.hxx> // SwTxtFrm 54 #include <mdiexp.hxx> 55 #include <edimp.hxx> 56 #include <pagedesc.hxx> 57 #include <fmtanchr.hxx> 58 // OD 29.10.2003 #113049# 59 #include <environmentofanchoredobject.hxx> 60 // OD 12.11.2003 #i22341# 61 #include <ndtxt.hxx> 62 // OD 27.11.2003 #112045# 63 #include <dflyobj.hxx> 64 // OD 2004-03-29 #i26791# 65 #include <dcontact.hxx> 66 67 68 using namespace com::sun::star; 69 70 71 TYPEINIT1(SwFEShell,SwEditShell) 72 73 /*********************************************************************** 74 #* Class : SwFEShell 75 #* Methode : EndAllActionAndCall() 76 #* 77 #* Datum : MA 03. May. 93 78 #* Update : MA 31. Oct. 95 79 #***********************************************************************/ 80 81 void SwFEShell::EndAllActionAndCall() 82 { 83 ViewShell *pTmp = this; 84 do { 85 if( pTmp->IsA( TYPE(SwCrsrShell) ) ) 86 { 87 ((SwFEShell*)pTmp)->EndAction(); 88 ((SwFEShell*)pTmp)->CallChgLnk(); 89 } 90 else 91 pTmp->EndAction(); 92 } while( this != ( pTmp = (ViewShell*)pTmp->GetNext() )); 93 } 94 95 96 /*********************************************************************** 97 #* Class : SwFEShell 98 #* Methode : GetCntntPos 99 #* Beschreibung: Ermitteln des Cntnt's der dem Punkt am naechsten liegt 100 #* Datum : MA 02. Jun. 92 101 #* Update : MA 02. May. 95 102 #***********************************************************************/ 103 104 Point SwFEShell::GetCntntPos( const Point& rPoint, sal_Bool bNext ) const 105 { 106 SET_CURR_SHELL( (ViewShell*)this ); 107 return GetLayout()->GetNextPrevCntntPos( rPoint, bNext ); 108 } 109 110 111 const SwRect& SwFEShell::GetAnyCurRect( CurRectType eType, const Point* pPt, 112 const uno::Reference < embed::XEmbeddedObject >& xObj ) const 113 { 114 const SwFrm *pFrm = Imp()->HasDrawView() 115 ? ::GetFlyFromMarked( &Imp()->GetDrawView()->GetMarkedObjectList(), 116 (ViewShell*)this) 117 : 0; 118 119 if( !pFrm ) 120 { 121 if( pPt ) 122 { 123 SwPosition aPos( *GetCrsr()->GetPoint() ); 124 Point aPt( *pPt ); 125 GetLayout()->GetCrsrOfst( &aPos, aPt ); 126 SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode(); 127 pFrm = pNd->getLayoutFrm( GetLayout(), pPt ); 128 } 129 else 130 { 131 const bool bOldCallbackActionEnabled = GetLayout()->IsCallbackActionEnabled(); 132 if( bOldCallbackActionEnabled ) 133 GetLayout()->SetCallbackActionEnabled( sal_False ); 134 pFrm = GetCurrFrm(); 135 if( bOldCallbackActionEnabled ) 136 GetLayout()->SetCallbackActionEnabled( sal_True ); 137 } 138 } 139 140 if( !pFrm ) 141 return GetLayout()->Frm(); 142 143 sal_Bool bFrm = sal_True; 144 switch ( eType ) 145 { 146 case RECT_PAGE_PRT: bFrm = sal_False; /* no break */ 147 case RECT_PAGE : pFrm = pFrm->FindPageFrm(); 148 break; 149 150 case RECT_PAGE_CALC: pFrm->Calc(); 151 pFrm = pFrm->FindPageFrm(); 152 pFrm->Calc(); 153 break; 154 155 case RECT_FLY_PRT_EMBEDDED: bFrm = sal_False; /* no break */ 156 case RECT_FLY_EMBEDDED: pFrm = xObj.is() ? FindFlyFrm( xObj ) 157 : pFrm->IsFlyFrm() 158 ? pFrm 159 : pFrm->FindFlyFrm(); 160 break; 161 162 case RECT_OUTTABSECTION_PRT: 163 case RECT_OUTTABSECTION : if( pFrm->IsInTab() ) 164 pFrm = pFrm->FindTabFrm(); 165 else { 166 ASSERT( sal_False, "Missing Table" ); 167 } 168 /* KEIN BREAK */ 169 case RECT_SECTION_PRT: 170 case RECT_SECTION: if( pFrm->IsInSct() ) 171 pFrm = pFrm->FindSctFrm(); 172 else { 173 ASSERT( sal_False, "Missing section" ); 174 } 175 176 if( RECT_OUTTABSECTION_PRT == eType || 177 RECT_SECTION_PRT == eType ) 178 bFrm = sal_False; 179 break; 180 181 case RECT_HEADERFOOTER_PRT: bFrm = sal_False; /* no break */ 182 case RECT_HEADERFOOTER: if( 0 == (pFrm = pFrm->FindFooterOrHeader()) ) 183 return GetLayout()->Frm(); 184 break; 185 186 case RECT_PAGES_AREA: return GetLayout()->GetPagesArea(); 187 188 default: break; 189 } 190 return bFrm ? pFrm->Frm() : pFrm->Prt(); 191 } 192 193 194 sal_uInt16 SwFEShell::GetPageNumber( const Point &rPoint ) const 195 { 196 const SwFrm *pPage = GetLayout()->Lower(); 197 while ( pPage && !pPage->Frm().IsInside( rPoint ) ) 198 pPage = pPage->GetNext(); 199 if ( pPage ) 200 return ((const SwPageFrm*)pPage)->GetPhyPageNum(); 201 else 202 return 0; 203 } 204 205 206 sal_Bool SwFEShell::GetPageNumber( long nYPos, sal_Bool bAtCrsrPos, sal_uInt16& rPhyNum, sal_uInt16& rVirtNum, String &rDisplay) const 207 { 208 const SwFrm *pPage; 209 210 if ( bAtCrsrPos ) //Seite vom Crsr besorgen 211 { 212 pPage = GetCurrFrm( sal_False ); 213 if ( pPage ) 214 pPage = pPage->FindPageFrm(); 215 } 216 else if ( nYPos > -1 ) //Seite ueber die Positon ermitteln 217 { 218 pPage = GetLayout()->Lower(); 219 while( pPage && (pPage->Frm().Bottom() < nYPos || 220 nYPos < pPage->Frm().Top() ) ) 221 pPage = pPage->GetNext(); 222 } 223 else //Die erste sichtbare Seite 224 { 225 pPage = Imp()->GetFirstVisPage(); 226 if ( pPage && ((SwPageFrm*)pPage)->IsEmptyPage() ) 227 pPage = pPage->GetNext(); 228 } 229 230 if( pPage ) 231 { 232 rPhyNum = ((const SwPageFrm*)pPage)->GetPhyPageNum(); 233 rVirtNum = ((const SwPageFrm*)pPage)->GetVirtPageNum(); 234 const SvxNumberType& rNum = ((const SwPageFrm*)pPage)->GetPageDesc()->GetNumType(); 235 rDisplay = rNum.GetNumStr( rVirtNum ); 236 } 237 238 return 0 != pPage; 239 } 240 241 /************************************************************************* 242 |* 243 |* SwFEShell::IsDirectlyInSection() 244 |* 245 |* Hack for OS: 246 |* 247 *************************************************************************/ 248 249 bool SwFEShell::IsDirectlyInSection() const 250 { 251 SwFrm* pFrm = GetCurrFrm( sal_False ); 252 return pFrm && pFrm->GetUpper() && pFrm->GetUpper()->IsSctFrm(); 253 } 254 255 /************************************************************************* 256 |* 257 |* SwFEShell::GetFrmType() 258 |* 259 |* Ersterstellung MA 12. Jan. 93 260 |* Letzte Aenderung AMA 25. Nov. 98 261 |* 262 *************************************************************************/ 263 264 sal_uInt16 SwFEShell::GetFrmType( const Point *pPt, sal_Bool bStopAtFly ) const 265 { 266 sal_uInt16 nReturn = FRMTYPE_NONE; 267 const SwFrm *pFrm; 268 if ( pPt ) 269 { 270 SwPosition aPos( *GetCrsr()->GetPoint() ); 271 Point aPt( *pPt ); 272 GetLayout()->GetCrsrOfst( &aPos, aPt ); 273 SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode(); 274 pFrm = pNd->getLayoutFrm( GetLayout(), pPt ); 275 } 276 else 277 pFrm = GetCurrFrm( sal_False ); 278 while ( pFrm ) 279 { 280 switch ( pFrm->GetType() ) 281 { 282 case FRM_COLUMN: if( pFrm->GetUpper()->IsSctFrm() ) 283 { 284 // Check, if isn't not only a single column 285 // from a section with footnotes at the end. 286 if( pFrm->GetNext() || pFrm->GetPrev() ) 287 // Sectioncolumns 288 nReturn |= ( nReturn & FRMTYPE_TABLE ) ? 289 FRMTYPE_COLSECTOUTTAB : FRMTYPE_COLSECT; 290 } 291 else // nur Seiten und Rahmenspalten 292 nReturn |= FRMTYPE_COLUMN; 293 break; 294 case FRM_PAGE: nReturn |= FRMTYPE_PAGE; 295 if( ((SwPageFrm*)pFrm)->IsFtnPage() ) 296 nReturn |= FRMTYPE_FTNPAGE; 297 break; 298 case FRM_HEADER: nReturn |= FRMTYPE_HEADER; break; 299 case FRM_FOOTER: nReturn |= FRMTYPE_FOOTER; break; 300 case FRM_BODY: if( pFrm->GetUpper()->IsPageFrm() ) // nicht bei ColumnFrms 301 nReturn |= FRMTYPE_BODY; 302 break; 303 case FRM_FTN: nReturn |= FRMTYPE_FOOTNOTE; break; 304 case FRM_FLY: if( ((SwFlyFrm*)pFrm)->IsFlyLayFrm() ) 305 nReturn |= FRMTYPE_FLY_FREE; 306 else if ( ((SwFlyFrm*)pFrm)->IsFlyAtCntFrm() ) 307 nReturn |= FRMTYPE_FLY_ATCNT; 308 else 309 { 310 ASSERT( ((SwFlyFrm*)pFrm)->IsFlyInCntFrm(), 311 "Neuer Rahmentyp?" ); 312 nReturn |= FRMTYPE_FLY_INCNT; 313 } 314 nReturn |= FRMTYPE_FLY_ANY; 315 if( bStopAtFly ) 316 return nReturn; 317 break; 318 case FRM_TAB: 319 case FRM_ROW: 320 case FRM_CELL: nReturn |= FRMTYPE_TABLE; break; 321 default: /* do nothing */ break; 322 } 323 if ( pFrm->IsFlyFrm() ) 324 pFrm = ((SwFlyFrm*)pFrm)->GetAnchorFrm(); 325 else 326 pFrm = pFrm->GetUpper(); 327 } 328 return nReturn; 329 } 330 331 /************************************************************************* 332 |* 333 |* SwFEShell::ShLooseFcs(), ShGetFcs() 334 |* 335 |* Ersterstellung MA 10. May. 93 336 |* Letzte Aenderung MA 09. Sep. 98 337 |* 338 *************************************************************************/ 339 340 void SwFEShell::ShGetFcs( sal_Bool bUpdate ) 341 { 342 ::SetShell( this ); 343 SwCrsrShell::ShGetFcs( bUpdate ); 344 345 if ( HasDrawView() ) 346 { 347 Imp()->GetDrawView()->showMarkHandles(); 348 if ( Imp()->GetDrawView()->AreObjectsMarked() ) 349 FrameNotify( this, FLY_DRAG_START ); 350 } 351 } 352 353 void SwFEShell::ShLooseFcs() 354 { 355 SwCrsrShell::ShLooseFcs(); 356 357 if ( HasDrawView() && Imp()->GetDrawView()->AreObjectsMarked() ) 358 { 359 Imp()->GetDrawView()->hideMarkHandles(); 360 FrameNotify( this, FLY_DRAG_END ); 361 } 362 // ::ResetShell(); 363 } 364 365 /************************************************************************* 366 |* 367 |* SwFEShell::GetPhyPageNum() 368 |* SwFEShell::GetVirtPageNum() 369 |* 370 |* Ersterstellung OK 07.07.93 08:20 371 |* Letzte Aenderung MA 03. Jan. 94 372 |* 373 *************************************************************************/ 374 375 sal_uInt16 SwFEShell::GetPhyPageNum() 376 { 377 SwFrm *pFrm = GetCurrFrm(); 378 if ( pFrm ) 379 return pFrm->GetPhyPageNum(); 380 return 0; 381 } 382 383 sal_uInt16 SwFEShell::GetVirtPageNum( const sal_Bool bCalcFrm ) 384 { 385 SwFrm *pFrm = GetCurrFrm( bCalcFrm ); 386 if ( pFrm ) 387 return pFrm->GetVirtPageNum(); 388 return 0; 389 } 390 391 /************************************************************************* 392 |* 393 |* void lcl_SetAPageOffset() 394 |* void SwFEShell::SetNewPageOffset() 395 |* void SwFEShell::SetPageOffset() 396 |* sal_uInt16 SwFEShell::GetPageOffset() const 397 |* 398 |* Ersterstellung OK 07.07.93 08:20 399 |* Letzte Aenderung MA 30. Mar. 95 400 |* 401 *************************************************************************/ 402 403 void lcl_SetAPageOffset( sal_uInt16 nOffset, SwPageFrm* pPage, SwFEShell* pThis ) 404 { 405 pThis->StartAllAction(); 406 ASSERT( pPage->FindFirstBodyCntnt(), 407 "SwFEShell _SetAPageOffset() ohne CntntFrm" ); 408 409 SwFmtPageDesc aDesc( pPage->GetPageDesc() ); 410 aDesc.SetNumOffset( nOffset ); 411 412 SwFrm *pFrm = pThis->GetCurrFrm( sal_False ); 413 if ( pFrm->IsInTab() ) 414 pThis->GetDoc()->SetAttr( aDesc, *pFrm->FindTabFrm()->GetFmt() ); 415 else 416 { 417 pThis->GetDoc()->InsertPoolItem( *pThis->GetCrsr(), aDesc, 0 ); 418 } 419 420 pThis->EndAllAction(); 421 } 422 423 void SwFEShell::SetNewPageOffset( sal_uInt16 nOffset ) 424 { 425 GetLayout()->SetVirtPageNum( sal_True ); 426 const SwPageFrm *pPage = GetCurrFrm( sal_False )->FindPageFrm(); 427 lcl_SetAPageOffset( nOffset, (SwPageFrm*)pPage, this ); 428 } 429 430 void SwFEShell::SetPageOffset( sal_uInt16 nOffset ) 431 { 432 const SwPageFrm *pPage = GetCurrFrm( sal_False )->FindPageFrm(); 433 const SwRootFrm* pDocLayout = GetLayout(); 434 while ( pPage ) 435 { 436 const SwFrm *pFlow = pPage->FindFirstBodyCntnt(); 437 if ( pFlow ) 438 { 439 if ( pFlow->IsInTab() ) 440 pFlow = pFlow->FindTabFrm(); 441 const SwFmtPageDesc& rPgDesc = pFlow->GetAttrSet()->GetPageDesc(); 442 if ( rPgDesc.GetNumOffset() ) 443 { 444 pDocLayout->SetVirtPageNum( sal_True ); 445 lcl_SetAPageOffset( nOffset, (SwPageFrm*)pPage, this ); 446 break; 447 } 448 } 449 pPage = (SwPageFrm*)pPage->GetPrev(); 450 } 451 } 452 453 sal_uInt16 SwFEShell::GetPageOffset() const 454 { 455 const SwPageFrm *pPage = GetCurrFrm()->FindPageFrm(); 456 while ( pPage ) 457 { 458 const SwFrm *pFlow = pPage->FindFirstBodyCntnt(); 459 if ( pFlow ) 460 { 461 if ( pFlow->IsInTab() ) 462 pFlow = pFlow->FindTabFrm(); 463 const sal_uInt16 nOffset = pFlow->GetAttrSet()->GetPageDesc().GetNumOffset(); 464 if ( nOffset ) 465 return nOffset; 466 } 467 pPage = (SwPageFrm*)pPage->GetPrev(); 468 } 469 return 0; 470 } 471 472 /************************************************************************* 473 |* 474 |* SwFEShell::InsertLabel() 475 |* 476 |* Ersterstellung MA 10. Feb. 94 477 |* Letzte Aenderung MA 10. Feb. 94 478 |* 479 *************************************************************************/ 480 481 void SwFEShell::InsertLabel( const SwLabelType eType, const String &rTxt, const String& rSeparator, 482 const String& rNumberSeparator, 483 const sal_Bool bBefore, const sal_uInt16 nId, 484 const String& rCharacterStyle, 485 const sal_Bool bCpyBrd ) 486 { 487 //NodeIndex der CrsrPosition besorgen, den Rest kann das Dokument 488 //selbst erledigen. 489 SwCntntFrm *pCnt = LTYPE_DRAW==eType ? 0 : GetCurrFrm( sal_False ); 490 if( LTYPE_DRAW==eType || pCnt ) 491 { 492 StartAllAction(); 493 494 sal_uLong nIdx = 0; 495 SwFlyFrmFmt* pFlyFmt = 0; 496 switch( eType ) 497 { 498 case LTYPE_OBJECT: 499 case LTYPE_FLY: 500 if( pCnt->IsInFly() ) 501 { 502 //Bei Flys den Index auf den StartNode herunterreichen. 503 nIdx = pCnt->FindFlyFrm()-> 504 GetFmt()->GetCntnt().GetCntntIdx()->GetIndex(); 505 //warum?? Bug 61913 ParkCrsr( GetCrsr()->GetPoint()->nNode ); 506 } 507 break; 508 case LTYPE_TABLE: 509 if( pCnt->IsInTab() ) 510 { 511 //Bei Tabellen den Index auf den TblNode herunterreichen. 512 const SwTable& rTbl = *pCnt->FindTabFrm()->GetTable(); 513 nIdx = rTbl.GetTabSortBoxes()[ 0 ] 514 ->GetSttNd()->FindTableNode()->GetIndex(); 515 } 516 break; 517 case LTYPE_DRAW: 518 if( Imp()->GetDrawView() ) 519 { 520 SwDrawView *pDView = Imp()->GetDrawView(); 521 const SdrMarkList& rMrkList = pDView->GetMarkedObjectList(); 522 StartUndo(); 523 524 // OD 27.11.2003 #112045# - copy marked drawing objects to 525 // local list to perform the corresponding action for each object 526 std::vector<SdrObject*> aDrawObjs; 527 { 528 for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i ) 529 { 530 SdrObject* pDrawObj = rMrkList.GetMark(i)->GetMarkedSdrObj(); 531 if( pDrawObj ) 532 aDrawObjs.push_back( pDrawObj ); 533 } 534 } 535 // loop on marked drawing objects 536 while ( !aDrawObjs.empty() ) 537 { 538 SdrObject* pDrawObj = aDrawObjs.back(); 539 if ( !pDrawObj->ISA(SwVirtFlyDrawObj) && 540 !pDrawObj->ISA(SwFlyDrawObj) ) 541 { 542 SwFlyFrmFmt *pFmt = 543 GetDoc()->InsertDrawLabel( rTxt, rSeparator, rNumberSeparator, nId, rCharacterStyle, *pDrawObj ); 544 if( !pFlyFmt ) 545 pFlyFmt = pFmt; 546 } 547 548 aDrawObjs.pop_back(); 549 } 550 551 EndUndo(); 552 } 553 break; 554 default: 555 ASSERT( !this, "Crsr weder in Tabelle noch in Fly." ); 556 } 557 558 if( nIdx ) 559 pFlyFmt = GetDoc()->InsertLabel( eType, rTxt, rSeparator, rNumberSeparator, bBefore, nId, 560 nIdx, rCharacterStyle, bCpyBrd ); 561 562 SwFlyFrm* pFrm; 563 const Point aPt( GetCrsrDocPos() ); 564 if( pFlyFmt && 0 != ( pFrm = pFlyFmt->GetFrm( &aPt ))) 565 SelectFlyFrm( *pFrm, sal_True ); 566 567 EndAllActionAndCall(); 568 } 569 } 570 571 572 /*********************************************************************** 573 #* Class : SwFEShell 574 #* Methoden : Sort 575 #* Datum : ?? 576 #* Update : ?? 577 #***********************************************************************/ 578 579 sal_Bool SwFEShell::Sort(const SwSortOptions& rOpt) 580 { 581 if( !HasSelection() ) 582 return sal_False; 583 584 SET_CURR_SHELL( this ); 585 sal_Bool bRet; 586 StartAllAction(); 587 if(IsTableMode()) 588 { 589 // Tabelle sortieren 590 // pruefe ob vom aktuellen Crsr der SPoint/Mark in einer Tabelle stehen 591 SwFrm *pFrm = GetCurrFrm( sal_False ); 592 ASSERT( pFrm->FindTabFrm(), "Crsr nicht in Tabelle." ); 593 594 // lasse ueber das Layout die Boxen suchen 595 SwSelBoxes aBoxes; 596 GetTblSel(*this, aBoxes); 597 598 // die Crsr muessen noch aus dem Loesch Bereich entfernt 599 // werden. Setze sie immer hinter/auf die Tabelle; ueber die 600 // Dokument-Position werden sie dann immer an die alte Position gesetzt. 601 while( !pFrm->IsCellFrm() ) 602 pFrm = pFrm->GetUpper(); 603 { 604 /* #107993# ParkCursor->ParkCursorTab */ 605 ParkCursorInTab(); 606 } 607 608 // Sorting am Dokument aufrufen 609 bRet = pDoc->SortTbl(aBoxes, rOpt); 610 } 611 else 612 { 613 // Text sortieren und nichts anderes 614 FOREACHPAM_START(this) 615 616 SwPaM* pPam = PCURCRSR; 617 618 SwPosition* pStart = pPam->Start(); 619 SwPosition* pEnd = pPam->End(); 620 621 SwNodeIndex aPrevIdx( pStart->nNode, -1 ); 622 sal_uLong nOffset = pEnd->nNode.GetIndex() - pStart->nNode.GetIndex(); 623 xub_StrLen nCntStt = pStart->nContent.GetIndex(); 624 625 // Das Sortieren 626 bRet = pDoc->SortText(*pPam, rOpt); 627 628 // Selektion wieder setzen 629 pPam->DeleteMark(); 630 pPam->GetPoint()->nNode.Assign( aPrevIdx.GetNode(), +1 ); 631 SwCntntNode* pCNd = pPam->GetCntntNode(); 632 xub_StrLen nLen = pCNd->Len(); 633 if( nLen > nCntStt ) 634 nLen = nCntStt; 635 pPam->GetPoint()->nContent.Assign(pCNd, nLen ); 636 pPam->SetMark(); 637 638 pPam->GetPoint()->nNode += nOffset; 639 pCNd = pPam->GetCntntNode(); 640 pPam->GetPoint()->nContent.Assign( pCNd, pCNd->Len() ); 641 642 FOREACHPAM_END() 643 } 644 645 EndAllAction(); 646 return bRet; 647 } 648 649 /************************************************************************* 650 |* 651 |* SwFEShell::GetCurColNum(), _GetColNum() 652 |* 653 |* Ersterstellung MA 03. Feb. 95 654 |* Letzte Aenderung MA 20. Apr. 95 655 | 656 |*************************************************************************/ 657 658 sal_uInt16 SwFEShell::_GetCurColNum( const SwFrm *pFrm, 659 SwGetCurColNumPara* pPara ) const 660 { 661 sal_uInt16 nRet = 0; 662 while ( pFrm ) 663 { 664 pFrm = pFrm->GetUpper(); 665 if( pFrm && pFrm->IsColumnFrm() ) 666 { 667 const SwFrm *pCurFrm = pFrm; 668 do { 669 ++nRet; 670 pFrm = pFrm->GetPrev(); 671 } while ( pFrm ); 672 673 if( pPara ) 674 { 675 // dann suche mal das Format, was diese Spaltigkeit bestimmt 676 pFrm = pCurFrm->GetUpper(); 677 while( pFrm ) 678 { 679 if( ( FRM_PAGE | FRM_FLY | FRM_SECTION ) & pFrm->GetType() ) 680 { 681 pPara->pFrmFmt = ((SwLayoutFrm*)pFrm)->GetFmt(); 682 pPara->pPrtRect = &pFrm->Prt(); 683 pPara->pFrmRect = &pFrm->Frm(); 684 break; 685 } 686 pFrm = pFrm->GetUpper(); 687 } 688 if( !pFrm ) 689 { 690 pPara->pFrmFmt = 0; 691 pPara->pPrtRect = 0; 692 pPara->pFrmRect = 0; 693 } 694 } 695 break; 696 } 697 } 698 return nRet; 699 } 700 701 sal_uInt16 SwFEShell::GetCurColNum( SwGetCurColNumPara* pPara ) const 702 { 703 ASSERT( GetCurrFrm(), "Crsr geparkt?" ); 704 return _GetCurColNum( GetCurrFrm(), pPara ); 705 } 706 707 sal_uInt16 SwFEShell::GetCurOutColNum( SwGetCurColNumPara* pPara ) const 708 { 709 sal_uInt16 nRet = 0; 710 SwFrm* pFrm = GetCurrFrm(); 711 ASSERT( pFrm, "Crsr geparkt?" ); 712 if( pFrm ) 713 { 714 pFrm = pFrm->IsInTab() ? (SwFrm*)pFrm->FindTabFrm() 715 : (SwFrm*)pFrm->FindSctFrm(); 716 ASSERT( pFrm, "No Tab, no Sect" ); 717 if( pFrm ) 718 nRet = _GetCurColNum( pFrm, pPara ); 719 } 720 return nRet; 721 } 722 723 SwFEShell::SwFEShell( SwDoc& rDoc, Window *pWindow, const SwViewOption *pOptions ) 724 : SwEditShell( rDoc, pWindow, pOptions ), 725 pChainFrom( 0 ), pChainTo( 0 ), bCheckForOLEInCaption( sal_False ) 726 { 727 } 728 729 SwFEShell::SwFEShell( SwEditShell& rShell, Window *pWindow ) 730 : SwEditShell( rShell, pWindow ), 731 pChainFrom( 0 ), pChainTo( 0 ), bCheckForOLEInCaption( sal_False ) 732 { 733 } 734 735 SwFEShell::~SwFEShell() 736 { 737 delete pChainFrom; 738 delete pChainTo; 739 } 740 741 // OD 18.09.2003 #i17567#, #108749#, #110354# - adjustments for allowing 742 // negative vertical positions for fly frames anchored to paragraph/to character. 743 // OD 06.11.2003 #i22305# - adjustments for option 'Follow text flow' 744 // for to frame anchored objects. 745 // OD 12.11.2003 #i22341# - adjustments for vertical alignment at top of line 746 // for to character anchored objects. 747 void SwFEShell::CalcBoundRect( SwRect& _orRect, 748 const RndStdIds _nAnchorId, 749 const sal_Int16 _eHoriRelOrient, 750 const sal_Int16 _eVertRelOrient, 751 const SwPosition* _pToCharCntntPos, 752 const bool _bFollowTextFlow, 753 bool _bMirror, 754 Point* _opRef, 755 Size* _opPercent ) const 756 { 757 const SwFrm* pFrm; 758 const SwFlyFrm* pFly; 759 if( _opRef ) 760 { 761 pFrm = GetCurrFrm(); 762 if( 0 != ( pFly = pFrm->FindFlyFrm() ) ) 763 pFrm = pFly->GetAnchorFrm(); 764 } 765 else 766 { 767 pFly = FindFlyFrm(); 768 pFrm = pFly ? pFly->GetAnchorFrm() : GetCurrFrm(); 769 } 770 771 sal_Bool bWrapThrough = sal_False; 772 if ( pFly ) 773 { 774 SwFlyFrmFmt* pFmt = (SwFlyFrmFmt*)pFly->GetFmt(); 775 const SwFmtSurround& rSurround = pFmt->GetSurround(); 776 bWrapThrough = rSurround.GetSurround() == SURROUND_THROUGHT; 777 } 778 779 const SwPageFrm* pPage = pFrm->FindPageFrm(); 780 _bMirror = _bMirror && !pPage->OnRightPage(); 781 782 Point aPos; 783 bool bVertic = false; 784 sal_Bool bRTL = sal_False; 785 // --> OD 2009-09-01 #mongolianlayout# 786 bool bVerticalL2R = false; 787 // <-- 788 789 if ((FLY_AT_PAGE == _nAnchorId) || (FLY_AT_FLY == _nAnchorId)) // LAYER_IMPL 790 { 791 const SwFrm* pTmp = pFrm; 792 // OD 06.11.2003 #i22305# 793 if ((FLY_AT_PAGE == _nAnchorId) || 794 ((FLY_AT_FLY == _nAnchorId) && !_bFollowTextFlow)) 795 { 796 pFrm = pPage; 797 } 798 else 799 { 800 pFrm = pFrm->FindFlyFrm(); 801 } 802 if ( !pFrm ) 803 pFrm = pTmp; 804 _orRect = pFrm->Frm(); 805 SWRECTFN( pFrm ) 806 bRTL = pFrm->IsRightToLeft(); 807 if ( bRTL ) 808 aPos = pFrm->Frm().TopRight(); 809 else 810 aPos = (pFrm->Frm().*fnRect->fnGetPos)(); 811 812 // --> OD 2009-09-01 #mongolianlayout# 813 if( bVert || bVertL2R ) 814 // <-- 815 { 816 // --> OD 2009-09-01 #mongolianlayout# 817 bVertic = bVert ? true : false; 818 bVerticalL2R = bVertL2R ? true : false; 819 // <-- 820 _bMirror = false; // no mirroring in vertical environment 821 switch ( _eHoriRelOrient ) 822 { 823 case text::RelOrientation::PAGE_RIGHT: 824 case text::RelOrientation::FRAME_RIGHT: aPos.Y() += pFrm->Prt().Height(); 825 // no break! 826 case text::RelOrientation::PRINT_AREA: 827 case text::RelOrientation::PAGE_PRINT_AREA: aPos.Y() += pFrm->Prt().Top(); break; 828 default: break; 829 } 830 } 831 else if ( _bMirror ) 832 { 833 switch ( _eHoriRelOrient ) 834 { 835 case text::RelOrientation::PRINT_AREA: 836 case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Width(); 837 // kein break 838 case text::RelOrientation::PAGE_RIGHT: 839 case text::RelOrientation::FRAME_RIGHT: aPos.X() += pFrm->Prt().Left(); break; 840 default: aPos.X() += pFrm->Frm().Width(); 841 } 842 } 843 else if ( bRTL ) 844 { 845 switch ( _eHoriRelOrient ) 846 { 847 case text::RelOrientation::PRINT_AREA: 848 case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Width(); 849 // kein break! 850 case text::RelOrientation::PAGE_LEFT: 851 case text::RelOrientation::FRAME_LEFT: aPos.X() += pFrm->Prt().Left() - 852 pFrm->Frm().Width(); break; 853 default: break; 854 } 855 } 856 else 857 { 858 switch ( _eHoriRelOrient ) 859 { 860 case text::RelOrientation::PAGE_RIGHT: 861 case text::RelOrientation::FRAME_RIGHT: aPos.X() += pFrm->Prt().Width(); 862 // kein break! 863 case text::RelOrientation::PRINT_AREA: 864 case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Left(); break; 865 default:break; 866 } 867 } 868 // --> OD 2009-09-01 #mongolianlayout# 869 if ( bVert && !bVertL2R ) 870 // <-- 871 { 872 switch ( _eVertRelOrient ) 873 { 874 case text::RelOrientation::PRINT_AREA: 875 case text::RelOrientation::PAGE_PRINT_AREA: 876 { 877 aPos.X() -= pFrm->GetRightMargin(); 878 } 879 break; 880 } 881 } 882 // --> OD 2009-09-01 #mongolianlayout# 883 else if ( bVertL2R ) 884 { 885 switch ( _eVertRelOrient ) 886 { 887 case text::RelOrientation::PRINT_AREA: 888 case text::RelOrientation::PAGE_PRINT_AREA: 889 { 890 aPos.X() += pFrm->GetLeftMargin(); 891 } 892 break; 893 } 894 } 895 // <-- 896 else 897 { 898 switch ( _eVertRelOrient ) 899 { 900 case text::RelOrientation::PRINT_AREA: 901 case text::RelOrientation::PAGE_PRINT_AREA: 902 { 903 if ( pFrm->IsPageFrm() ) 904 { 905 aPos.Y() = 906 static_cast<const SwPageFrm*>(pFrm)->PrtWithoutHeaderAndFooter().Top(); 907 } 908 else 909 { 910 aPos.Y() += pFrm->Prt().Top(); 911 } 912 } 913 break; 914 } 915 } 916 // <-- 917 if ( _opPercent ) 918 *_opPercent = pFrm->Prt().SSize(); 919 } 920 else 921 { 922 const SwFrm* pUpper = ( pFrm->IsPageFrm() || pFrm->IsFlyFrm() ) ? 923 pFrm : pFrm->GetUpper(); 924 SWRECTFN( pUpper ); 925 if ( _opPercent ) 926 *_opPercent = pUpper->Prt().SSize(); 927 928 bRTL = pFrm->IsRightToLeft(); 929 if ( bRTL ) 930 aPos = pFrm->Frm().TopRight(); 931 else 932 aPos = (pFrm->Frm().*fnRect->fnGetPos)(); 933 // OD 08.09.2003 #i17567#, #108749#, #110354# - allow negative positions 934 // for fly frames anchor to paragraph/to character. 935 if ((_nAnchorId == FLY_AT_PARA) || (_nAnchorId == FLY_AT_CHAR)) 936 { 937 // The rectangle, the fly frame can be positioned in, is determined 938 // horizontally by the frame area of the horizontal environment 939 // and vertically by the printing area of the vertical environment, 940 // if the object follows the text flow, or by the frame area of the 941 // vertical environment, if the object doesn't follow the text flow. 942 // OD 29.10.2003 #113049# - new class <SwEnvironmentOfAnchoredObject> 943 objectpositioning::SwEnvironmentOfAnchoredObject aEnvOfObj( 944 _bFollowTextFlow ); 945 const SwLayoutFrm& rHoriEnvironLayFrm = 946 aEnvOfObj.GetHoriEnvironmentLayoutFrm( *pFrm ); 947 const SwLayoutFrm& rVertEnvironLayFrm = 948 aEnvOfObj.GetVertEnvironmentLayoutFrm( *pFrm ); 949 SwRect aHoriEnvironRect( rHoriEnvironLayFrm.Frm() ); 950 SwRect aVertEnvironRect; 951 if ( _bFollowTextFlow ) 952 { 953 aVertEnvironRect = rVertEnvironLayFrm.Prt(); 954 aVertEnvironRect.Pos() += rVertEnvironLayFrm.Frm().Pos(); 955 // OD 19.09.2003 #i18732# - adjust vertical 'virtual' anchor position 956 // (<aPos.Y()> respectively <aPos.X()>), if object is vertical aligned 957 // to page areas. 958 if ( _eVertRelOrient == text::RelOrientation::PAGE_FRAME || _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA ) 959 { 960 // --> OD 2009-09-01 #mongolianlayout# 961 if ( bVert && !bVertL2R ) 962 // <-- 963 { 964 aPos.X() = aVertEnvironRect.Right(); 965 } 966 // --> OD 2009-09-01 #mongolianlayout# 967 else if ( bVertL2R ) 968 { 969 aPos.X() = aVertEnvironRect.Left(); 970 } 971 else 972 { 973 aPos.Y() = aVertEnvironRect.Top(); 974 } 975 } 976 } 977 else 978 { 979 ASSERT( rVertEnvironLayFrm.IsPageFrm(), 980 "<SwFEShell::CalcBoundRect(..)> - not following text flow, but vertical environment *not* page!" ); 981 aVertEnvironRect = rVertEnvironLayFrm.Frm(); 982 // OD 19.09.2003 #i18732# - adjustment vertical 'virtual' anchor position 983 // (<aPos.Y()> respectively <aPos.X()>), if object is vertical aligned 984 // to page areas. 985 if ( _eVertRelOrient == text::RelOrientation::PAGE_FRAME || _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA ) 986 { 987 // --> OD 2009-09-01 #mongolianlayout# 988 if ( bVert && !bVertL2R ) 989 // <-- 990 { 991 aPos.X() = aVertEnvironRect.Right(); 992 if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA ) 993 { 994 aPos.X() -= rVertEnvironLayFrm.GetRightMargin(); 995 } 996 } 997 // --> OD 2009-09-01 #mongolianlayout# 998 else if ( bVertL2R ) 999 { 1000 aPos.X() = aVertEnvironRect.Left(); 1001 if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA ) 1002 { 1003 aPos.X() += rVertEnvironLayFrm.GetLeftMargin(); 1004 } 1005 } 1006 // <-- 1007 else 1008 { 1009 aPos.Y() = aVertEnvironRect.Top(); 1010 if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA ) 1011 { 1012 aPos.Y() += rVertEnvironLayFrm.GetTopMargin(); 1013 // add height of page header 1014 const SwFrm* pTmpFrm = rVertEnvironLayFrm.Lower(); 1015 if ( pTmpFrm->IsHeaderFrm() ) 1016 { 1017 aPos.Y() += pTmpFrm->Frm().Height(); 1018 } 1019 } 1020 } 1021 } 1022 } 1023 1024 // OD 12.11.2003 #i22341# - adjust vertical 'virtual' anchor position 1025 // (<aPos.Y()> respectively <aPos.X()>), if object is anchored to 1026 // character and vertical aligned at character or top of line 1027 // --> OD 2005-12-29 #125800# 1028 // <pFrm>, which is the anchor frame or the proposed anchor frame, 1029 // doesn't have to be a text frame (e.g. edit a to-page anchored 1030 // fly frame). Thus, assure this. 1031 const SwTxtFrm* pTxtFrm( dynamic_cast<const SwTxtFrm*>(pFrm) ); 1032 if ( pTxtFrm && 1033 (_nAnchorId == FLY_AT_CHAR) && 1034 ( _eVertRelOrient == text::RelOrientation::CHAR || 1035 _eVertRelOrient == text::RelOrientation::TEXT_LINE ) ) 1036 { 1037 SwTwips nTop = 0L; 1038 if ( _eVertRelOrient == text::RelOrientation::CHAR ) 1039 { 1040 SwRect aChRect; 1041 if ( _pToCharCntntPos ) 1042 { 1043 pTxtFrm->GetAutoPos( aChRect, *_pToCharCntntPos ); 1044 } 1045 else 1046 { 1047 // No content position provided. Thus, use a default one. 1048 SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) ); 1049 pTxtFrm->GetAutoPos( aChRect, aDefaultCntntPos ); 1050 } 1051 nTop = (aChRect.*fnRect->fnGetBottom)(); 1052 } 1053 else 1054 { 1055 if ( _pToCharCntntPos ) 1056 { 1057 pTxtFrm->GetTopOfLine( nTop, *_pToCharCntntPos ); 1058 } 1059 else 1060 { 1061 // No content position provided. Thus, use a default one. 1062 SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) ); 1063 pTxtFrm->GetTopOfLine( nTop, aDefaultCntntPos ); 1064 } 1065 } 1066 // --> OD 2009-09-01 #mongolianlayout# 1067 if ( bVert || bVertL2R ) 1068 { 1069 aPos.X() = nTop; 1070 } 1071 // <-- 1072 else 1073 { 1074 aPos.Y() = nTop; 1075 } 1076 } 1077 1078 // --> OD 2004-10-05 #i26945# - adjust horizontal 'virtual' anchor 1079 // position (<aPos.X()> respectively <aPos.Y()>), if object is 1080 // anchored to character and horizontal aligned at character. 1081 if ( pTxtFrm && 1082 (_nAnchorId == FLY_AT_CHAR) && 1083 _eHoriRelOrient == text::RelOrientation::CHAR ) 1084 { 1085 SwTwips nLeft = 0L; 1086 SwRect aChRect; 1087 if ( _pToCharCntntPos ) 1088 { 1089 pTxtFrm->GetAutoPos( aChRect, *_pToCharCntntPos ); 1090 } 1091 else 1092 { 1093 // No content position provided. Thus, use a default one. 1094 SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) ); 1095 pTxtFrm->GetAutoPos( aChRect, aDefaultCntntPos ); 1096 } 1097 nLeft = (aChRect.*fnRect->fnGetLeft)(); 1098 // --> OD 2009-09-01 #mongolianlayout# 1099 if ( bVert || bVertL2R ) 1100 { 1101 aPos.Y() = nLeft; 1102 } 1103 // <-- 1104 else 1105 { 1106 aPos.X() = nLeft; 1107 } 1108 } 1109 // <-- 1110 1111 // --> OD 2009-09-01 #mongolianlayout# 1112 if ( bVert || bVertL2R ) 1113 // <-- 1114 { 1115 _orRect = SwRect( aVertEnvironRect.Left(), 1116 aHoriEnvironRect.Top(), 1117 aVertEnvironRect.Width(), 1118 aHoriEnvironRect.Height() ); 1119 } 1120 else 1121 { 1122 _orRect = SwRect( aHoriEnvironRect.Left(), 1123 aVertEnvironRect.Top(), 1124 aHoriEnvironRect.Width(), 1125 aVertEnvironRect.Height() ); 1126 } 1127 } 1128 else 1129 { 1130 if( _opRef && pFly && pFly->IsFlyInCntFrm() ) 1131 *_opRef = ( (SwFlyInCntFrm*)pFly )->GetRefPoint(); 1132 1133 _orRect = pUpper->Frm(); 1134 if( !pUpper->IsBodyFrm() ) 1135 { 1136 _orRect += pUpper->Prt().Pos(); 1137 _orRect.SSize( pUpper->Prt().SSize() ); 1138 if ( pUpper->IsCellFrm() )//MA_FLY_HEIGHT 1139 { 1140 const SwFrm* pTab = pUpper->FindTabFrm(); 1141 long nBottom = (pTab->GetUpper()->*fnRect->fnGetPrtBottom)(); 1142 (_orRect.*fnRect->fnSetBottom)( nBottom ); 1143 } 1144 } 1145 // bei zeichengebundenen lieber nur 90% der Hoehe ausnutzen 1146 { 1147 // --> OD 2009-09-01 #mongolianlayout# 1148 if( bVert || bVertL2R ) 1149 // <-- 1150 _orRect.Width( (_orRect.Width()*9)/10 ); 1151 else 1152 _orRect.Height( (_orRect.Height()*9)/10 ); 1153 } 1154 } 1155 1156 const SwTwips nBaseOfstForFly = ( pFrm->IsTxtFrm() && pFly ) ? 1157 ((SwTxtFrm*)pFrm)->GetBaseOfstForFly( !bWrapThrough ) : 1158 0; 1159 // --> OD 2009-09-01 #mongolianlayout# 1160 if( bVert || bVertL2R ) 1161 // <-- 1162 { 1163 // --> OD 2009-09-01 #mongolianlayout# 1164 bVertic = bVert ? true : false; 1165 bVerticalL2R = bVertL2R ? true : false; 1166 // <-- 1167 _bMirror = false; 1168 1169 switch ( _eHoriRelOrient ) 1170 { 1171 case text::RelOrientation::FRAME_RIGHT: 1172 { 1173 aPos.Y() += pFrm->Prt().Height(); 1174 aPos += (pFrm->Prt().*fnRect->fnGetPos)(); 1175 break; 1176 } 1177 case text::RelOrientation::PRINT_AREA: 1178 { 1179 aPos += (pFrm->Prt().*fnRect->fnGetPos)(); 1180 aPos.Y() += nBaseOfstForFly; 1181 break; 1182 } 1183 case text::RelOrientation::PAGE_RIGHT: 1184 { 1185 aPos.Y() = pPage->Frm().Top() + pPage->Prt().Bottom(); 1186 break; 1187 } 1188 case text::RelOrientation::PAGE_PRINT_AREA: 1189 { 1190 aPos.Y() = pPage->Frm().Top() + pPage->Prt().Top(); 1191 break; 1192 } 1193 case text::RelOrientation::PAGE_LEFT: 1194 case text::RelOrientation::PAGE_FRAME: 1195 { 1196 aPos.Y() = pPage->Frm().Top(); 1197 break; 1198 } 1199 case text::RelOrientation::FRAME: 1200 { 1201 aPos.Y() += nBaseOfstForFly; 1202 break; 1203 } 1204 default: break; 1205 } 1206 } 1207 else if( _bMirror ) 1208 { 1209 switch ( _eHoriRelOrient ) 1210 { 1211 case text::RelOrientation::FRAME_RIGHT: aPos.X() += pFrm->Prt().Left(); break; 1212 case text::RelOrientation::FRAME: 1213 case text::RelOrientation::FRAME_LEFT: aPos.X() += pFrm->Frm().Width(); break; 1214 case text::RelOrientation::PRINT_AREA: aPos.X() += pFrm->Prt().Right(); break; 1215 case text::RelOrientation::PAGE_LEFT: 1216 case text::RelOrientation::PAGE_FRAME: aPos.X() = pPage->Frm().Right(); break; 1217 case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() = pPage->Frm().Left() 1218 + pPage->Prt().Left(); break; 1219 default: break; 1220 } 1221 } 1222 else if ( bRTL ) 1223 { 1224 switch ( _eHoriRelOrient ) 1225 { 1226 case text::RelOrientation::FRAME_LEFT: 1227 aPos.X() = pFrm->Frm().Left() + 1228 pFrm->Prt().Left(); 1229 break; 1230 1231 case text::RelOrientation::PRINT_AREA: 1232 aPos.X() = pFrm->Frm().Left() + pFrm->Prt().Left() + 1233 pFrm->Prt().Width(); 1234 aPos.X() += nBaseOfstForFly; 1235 break; 1236 1237 case text::RelOrientation::PAGE_LEFT: 1238 aPos.X() = pPage->Frm().Left() + pPage->Prt().Left(); 1239 break; 1240 1241 case text::RelOrientation::PAGE_PRINT_AREA: 1242 aPos.X() = pPage->Frm().Left() + pPage->Prt().Left() + 1243 pPage->Prt().Width() ; 1244 break; 1245 1246 case text::RelOrientation::PAGE_RIGHT: 1247 case text::RelOrientation::PAGE_FRAME: 1248 aPos.X() = pPage->Frm().Right(); 1249 break; 1250 1251 case text::RelOrientation::FRAME: 1252 aPos.X() += nBaseOfstForFly; 1253 break; 1254 default: break; 1255 } 1256 } 1257 else 1258 { 1259 switch ( _eHoriRelOrient ) 1260 { 1261 case text::RelOrientation::FRAME_RIGHT: 1262 aPos.X() += pFrm->Prt().Width(); 1263 aPos += pFrm->Prt().Pos(); 1264 break; 1265 case text::RelOrientation::PRINT_AREA: 1266 aPos += pFrm->Prt().Pos(); 1267 aPos.X() += nBaseOfstForFly; 1268 break; 1269 case text::RelOrientation::PAGE_RIGHT: 1270 aPos.X() = pPage->Frm().Left() + pPage->Prt().Right(); 1271 break; 1272 case text::RelOrientation::PAGE_PRINT_AREA: 1273 aPos.X() = pPage->Frm().Left() + pPage->Prt().Left(); 1274 break; 1275 case text::RelOrientation::PAGE_LEFT: 1276 case text::RelOrientation::PAGE_FRAME: 1277 aPos.X() = pPage->Frm().Left(); 1278 break; 1279 case text::RelOrientation::FRAME: 1280 aPos.X() += nBaseOfstForFly; 1281 break; 1282 default: break; 1283 } 1284 } 1285 1286 } 1287 if( !_opRef ) 1288 { 1289 if( bVertic && !bVerticalL2R ) 1290 _orRect.Pos( aPos.X() - _orRect.Width() - _orRect.Left(), _orRect.Top() - aPos.Y() ); 1291 // --> OD 2009-09-01 #mongolianlayout# 1292 else if( bVerticalL2R ) 1293 _orRect.Pos( _orRect.Left() - aPos.X(), _orRect.Top() - aPos.Y() ); 1294 // <-- 1295 else if ( bRTL ) 1296 _orRect.Pos( - ( _orRect.Right() - aPos.X() ), _orRect.Top() - aPos.Y() ); 1297 else 1298 _orRect.Pos( _orRect.Left() - aPos.X(), _orRect.Top() - aPos.Y() ); 1299 if( _bMirror ) 1300 _orRect.Pos( -_orRect.Right(), _orRect.Top() ); 1301 } 1302 } 1303 1304 Size SwFEShell::GetGraphicDefaultSize() const 1305 { 1306 Size aRet; 1307 SwFlyFrm *pFly = FindFlyFrm(); 1308 if ( pFly ) 1309 { 1310 // --> OD 2004-09-24 #i32951# - due to issue #i28701# no format of a 1311 // newly inserted Writer fly frame or its anchor frame is performed 1312 // any more. Thus, it could be possible (e.g. on insert of a horizontal 1313 // line) that the anchor frame isn't formatted and its printing area 1314 // size is (0,0). If this is the case the printing area of the upper 1315 // of the anchor frame is taken. 1316 const SwFrm* pAnchorFrm = pFly->GetAnchorFrm(); 1317 aRet = pAnchorFrm->Prt().SSize(); 1318 if ( aRet.Width() == 0 && aRet.Height() == 0 && 1319 pAnchorFrm->GetUpper() ) 1320 { 1321 aRet = pAnchorFrm->GetUpper()->Prt().SSize(); 1322 } 1323 // <-- 1324 1325 SwRect aBound; 1326 CalcBoundRect( aBound, pFly->GetFmt()->GetAnchor().GetAnchorId()); 1327 if ( pFly->GetAnchorFrm()->IsVertical() ) 1328 aRet.Width() = aBound.Width(); 1329 else 1330 aRet.Height() = aBound.Height(); 1331 } 1332 return aRet; 1333 } 1334 /* -----------------------------12.08.2002 12:51------------------------------ 1335 1336 ---------------------------------------------------------------------------*/ 1337 // --> OD 2009-08-31 #mongolianlayou# 1338 // add output parameter <bVertL2R> 1339 sal_Bool SwFEShell::IsFrmVertical(const sal_Bool bEnvironment, sal_Bool& bRTL, sal_Bool& bVertL2R) const 1340 { 1341 sal_Bool bVert = sal_False; 1342 bRTL = sal_False; 1343 bVertL2R = sal_False; 1344 1345 if ( Imp()->HasDrawView() ) 1346 { 1347 const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList(); 1348 if( rMrkList.GetMarkCount() != 1 ) 1349 return bVert; 1350 1351 SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); 1352 // --> OD 2006-01-06 #123831# - make code robust: 1353 if ( !pObj ) 1354 { 1355 ASSERT( false, 1356 "<SwFEShell::IsFrmVertical(..)> - missing SdrObject instance in marked object list -> This is a serious situation, please inform OD" ); 1357 return bVert; 1358 } 1359 // <-- 1360 // OD 2004-03-29 #i26791# 1361 SwContact* pContact = static_cast<SwContact*>(GetUserCall( pObj )); 1362 // --> OD 2006-01-06 #123831# - make code robust: 1363 if ( !pContact ) 1364 { 1365 ASSERT( false, 1366 "<SwFEShell::IsFrmVertical(..)> - missing SwContact instance at marked object -> This is a serious situation, please inform OD" ); 1367 return bVert; 1368 } 1369 // <-- 1370 const SwFrm* pRef = pContact->GetAnchoredObj( pObj )->GetAnchorFrm(); 1371 // --> OD 2006-01-06 #123831# - make code robust: 1372 if ( !pRef ) 1373 { 1374 ASSERT( false, 1375 "<SwFEShell::IsFrmVertical(..)> - missing anchor frame at marked object -> This is a serious situation, please inform OD" ); 1376 return bVert; 1377 } 1378 // <-- 1379 1380 if ( pObj->ISA(SwVirtFlyDrawObj) && !bEnvironment ) 1381 pRef = static_cast<const SwVirtFlyDrawObj*>(pObj)->GetFlyFrm(); 1382 1383 bVert = pRef->IsVertical(); 1384 bRTL = pRef->IsRightToLeft(); 1385 bVertL2R = pRef->IsVertLR(); 1386 } 1387 1388 return bVert; 1389 } 1390 // <-- 1391 1392 void SwFEShell::MoveObjectIfActive( svt::EmbeddedObjectRef&, const Point& ) 1393 { 1394 // does not do anything, only avoids crash if the method is used for wrong shell 1395 } 1396 1397