LCOV - code coverage report
Current view: top level - sw/source/core/frmedt - fews.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 110 610 18.0 %
Date: 2014-11-03 Functions: 17 36 47.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <svx/svdobj.hxx>
      21             : #include <init.hxx>
      22             : #include <fesh.hxx>
      23             : #include <pagefrm.hxx>
      24             : #include <rootfrm.hxx>
      25             : #include <cntfrm.hxx>
      26             : #include <doc.hxx>
      27             : #include <frmtool.hxx>
      28             : #include <swtable.hxx>
      29             : #include <viewimp.hxx>
      30             : #include <dview.hxx>
      31             : #include <flyfrm.hxx>
      32             : #include <node.hxx>
      33             : #include <pam.hxx>
      34             : #include <sectfrm.hxx>
      35             : #include <fmtpdsc.hxx>
      36             : #include <fmtsrnd.hxx>
      37             : #include <fmtcntnt.hxx>
      38             : #include <fmtfsize.hxx>
      39             : #include <tabfrm.hxx>
      40             : #include <cellfrm.hxx>
      41             : #include <flyfrms.hxx>
      42             : #include <txtfrm.hxx>
      43             : #include <mdiexp.hxx>
      44             : #include <edimp.hxx>
      45             : #include <pagedesc.hxx>
      46             : #include <fmtanchr.hxx>
      47             : #include <environmentofanchoredobject.hxx>
      48             : #include <ndtxt.hxx>
      49             : #include <dflyobj.hxx>
      50             : #include <dcontact.hxx>
      51             : 
      52             : using namespace com::sun::star;
      53             : 
      54     1864037 : TYPEINIT1(SwFEShell,SwEditShell)
      55             : 
      56           4 : void SwFEShell::EndAllActionAndCall()
      57             : {
      58           4 :     SwViewShell *pTmp = this;
      59           4 :     do {
      60           4 :         if( pTmp->IsA( TYPE(SwCrsrShell) ) )
      61             :         {
      62           4 :             ((SwFEShell*)pTmp)->EndAction();
      63           4 :             ((SwFEShell*)pTmp)->CallChgLnk();
      64             :         }
      65             :         else
      66           0 :             pTmp->EndAction();
      67           4 :     } while( this != ( pTmp = (SwViewShell*)pTmp->GetNext() ));
      68           4 : }
      69             : 
      70             : // Determine the Cntnt's nearest to the point
      71           0 : Point SwFEShell::GetCntntPos( const Point& rPoint, bool bNext ) const
      72             : {
      73           0 :     SET_CURR_SHELL( (SwViewShell*)this );
      74           0 :     return GetLayout()->GetNextPrevCntntPos( rPoint, bNext );
      75             : }
      76             : 
      77        5912 : const SwRect& SwFEShell::GetAnyCurRect( CurRectType eType, const Point* pPt,
      78             :                                         const uno::Reference < embed::XEmbeddedObject >& xObj ) const
      79             : {
      80        5912 :     const SwFrm *pFrm = Imp()->HasDrawView()
      81        5912 :                 ? ::GetFlyFromMarked( &Imp()->GetDrawView()->GetMarkedObjectList(),
      82        5912 :                                       (SwViewShell*)this)
      83       11824 :                 : 0;
      84             : 
      85        5912 :     if( !pFrm )
      86             :     {
      87        5912 :         if( pPt )
      88             :         {
      89           0 :             SwPosition aPos( *GetCrsr()->GetPoint() );
      90           0 :             Point aPt( *pPt );
      91           0 :             GetLayout()->GetCrsrOfst( &aPos, aPt );
      92           0 :             SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode();
      93           0 :             pFrm = pNd->getLayoutFrm( GetLayout(), pPt );
      94             :         }
      95             :         else
      96             :         {
      97        5912 :             const bool bOldCallbackActionEnabled = GetLayout()->IsCallbackActionEnabled();
      98        5912 :             if( bOldCallbackActionEnabled )
      99        5912 :                 GetLayout()->SetCallbackActionEnabled( false );
     100        5912 :             pFrm = GetCurrFrm();
     101        5912 :             if( bOldCallbackActionEnabled )
     102        5912 :                 GetLayout()->SetCallbackActionEnabled( true );
     103             :         }
     104             :     }
     105             : 
     106        5912 :     if( !pFrm )
     107           0 :         return GetLayout()->Frm();
     108             : 
     109        5912 :     bool bFrm = true;
     110        5912 :     switch ( eType )
     111             :     {
     112        2075 :         case RECT_PAGE_PRT:         bFrm = false; /* no break */
     113        3762 :         case RECT_PAGE :            pFrm = pFrm->FindPageFrm();
     114        3762 :                                     break;
     115             : 
     116        1075 :         case RECT_PAGE_CALC:        pFrm->Calc();
     117        1075 :                                     pFrm = pFrm->FindPageFrm();
     118        1075 :                                     pFrm->Calc();
     119        1075 :                                     break;
     120             : 
     121           0 :         case RECT_FLY_PRT_EMBEDDED: bFrm = false; /* no break */
     122           0 :         case RECT_FLY_EMBEDDED:     pFrm = xObj.is() ? FindFlyFrm( xObj )
     123           0 :                                                 : pFrm->IsFlyFrm()
     124             :                                                     ? pFrm
     125           0 :                                                     : pFrm->FindFlyFrm();
     126           0 :                                     break;
     127             : 
     128             :         case RECT_OUTTABSECTION_PRT:
     129           0 :         case RECT_OUTTABSECTION :   if( pFrm->IsInTab() )
     130           0 :                                         pFrm = pFrm->FindTabFrm();
     131             :                                     else {
     132             :                                         OSL_FAIL( "Missing Table" );
     133             :                                     }
     134             :                                     /* no break */
     135             :         case RECT_SECTION_PRT:
     136           0 :         case RECT_SECTION:          if( pFrm->IsInSct() )
     137           0 :                                         pFrm = pFrm->FindSctFrm();
     138             :                                     else {
     139             :                                         OSL_FAIL( "Missing section" );
     140             :                                     }
     141             : 
     142           0 :                                     if( RECT_OUTTABSECTION_PRT == eType ||
     143             :                                         RECT_SECTION_PRT == eType )
     144           0 :                                         bFrm = false;
     145           0 :                                     break;
     146             : 
     147           0 :         case RECT_HEADERFOOTER_PRT: bFrm = false; /* no break */
     148           0 :         case RECT_HEADERFOOTER:     if( 0 == (pFrm = pFrm->FindFooterOrHeader()) )
     149           0 :                                         return GetLayout()->Frm();
     150           0 :                                     break;
     151             : 
     152        1075 :         case RECT_PAGES_AREA:       return GetLayout()->GetPagesArea();
     153             : 
     154           0 :         default:                    break;
     155             :     }
     156        4837 :     return bFrm ? pFrm->Frm() : pFrm->Prt();
     157             : }
     158             : 
     159           0 : sal_uInt16 SwFEShell::GetPageNumber( const Point &rPoint ) const
     160             : {
     161           0 :     const SwFrm *pPage = GetLayout()->Lower();
     162           0 :     while ( pPage && !pPage->Frm().IsInside( rPoint ) )
     163           0 :         pPage = pPage->GetNext();
     164           0 :     if ( pPage )
     165           0 :         return ((const SwPageFrm*)pPage)->GetPhyPageNum();
     166             :     else
     167           0 :         return 0;
     168             : }
     169             : 
     170        1052 : bool SwFEShell::GetPageNumber( long nYPos, bool bAtCrsrPos, sal_uInt16& rPhyNum, sal_uInt16& rVirtNum, OUString &rDisplay) const
     171             : {
     172             :     const SwFrm *pPage;
     173             : 
     174        1052 :     if ( bAtCrsrPos )                   // get page of Crsr
     175             :     {
     176        1041 :         pPage = GetCurrFrm( false );
     177        1041 :         if ( pPage )
     178        1041 :             pPage = pPage->FindPageFrm();
     179             :     }
     180          11 :     else if ( nYPos > -1 )              // determine page via the position
     181             :     {
     182           0 :         pPage = GetLayout()->Lower();
     183           0 :         while( pPage &&  (pPage->Frm().Bottom() < nYPos ||
     184           0 :                             nYPos < pPage->Frm().Top() ) )
     185           0 :             pPage = pPage->GetNext();
     186             :     }
     187             :     else                                // first visible page
     188             :     {
     189          11 :         pPage = Imp()->GetFirstVisPage();
     190          11 :         if ( pPage && ((SwPageFrm*)pPage)->IsEmptyPage() )
     191           0 :             pPage = pPage->GetNext();
     192             :     }
     193             : 
     194        1052 :     if( pPage )
     195             :     {
     196        1052 :         rPhyNum  = ((const SwPageFrm*)pPage)->GetPhyPageNum();
     197        1052 :         rVirtNum = ((const SwPageFrm*)pPage)->GetVirtPageNum();
     198        1052 :         const SvxNumberType& rNum = ((const SwPageFrm*)pPage)->GetPageDesc()->GetNumType();
     199        1052 :         rDisplay = rNum.GetNumStr( rVirtNum );
     200             :     }
     201             : 
     202        1052 :     return 0 != pPage;
     203             : }
     204             : 
     205         398 : bool SwFEShell::IsDirectlyInSection() const
     206             : {
     207         398 :     SwFrm* pFrm = GetCurrFrm( false );
     208         398 :     return pFrm && pFrm->GetUpper() && pFrm->GetUpper()->IsSctFrm();
     209             : }
     210             : 
     211        5681 : sal_uInt16 SwFEShell::GetFrmType( const Point *pPt, bool bStopAtFly ) const
     212             : {
     213        5681 :     sal_uInt16 nReturn = FRMTYPE_NONE;
     214             :     const SwFrm *pFrm;
     215        5681 :     if ( pPt )
     216             :     {
     217           0 :         SwPosition aPos( *GetCrsr()->GetPoint() );
     218           0 :         Point aPt( *pPt );
     219           0 :         GetLayout()->GetCrsrOfst( &aPos, aPt );
     220           0 :         SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode();
     221           0 :         pFrm = pNd->getLayoutFrm( GetLayout(), pPt );
     222             :     }
     223             :     else
     224        5681 :         pFrm = GetCurrFrm( false );
     225       34170 :     while ( pFrm )
     226             :     {
     227       22808 :         switch ( pFrm->GetType() )
     228             :         {
     229           2 :             case FRM_COLUMN:    if( pFrm->GetUpper()->IsSctFrm() )
     230             :                                 {
     231             :                                     // Check, if isn't not only a single column
     232             :                                     // from a section with footnotes at the end.
     233           2 :                                     if( pFrm->GetNext() || pFrm->GetPrev() )
     234             :                                         // Sectioncolumns
     235           2 :                                         nReturn |= ( nReturn & FRMTYPE_TABLE ) ?
     236           2 :                                             FRMTYPE_COLSECTOUTTAB : FRMTYPE_COLSECT;
     237             :                                 }
     238             :                                 else // only pages and frame columns
     239           0 :                                     nReturn |= FRMTYPE_COLUMN;
     240           2 :                                 break;
     241        5681 :             case FRM_PAGE:      nReturn |= FRMTYPE_PAGE;
     242        5681 :                                 if( ((SwPageFrm*)pFrm)->IsFtnPage() )
     243           0 :                                     nReturn |= FRMTYPE_FTNPAGE;
     244        5681 :                                 break;
     245           0 :             case FRM_HEADER:    nReturn |= FRMTYPE_HEADER;      break;
     246           0 :             case FRM_FOOTER:    nReturn |= FRMTYPE_FOOTER;      break;
     247        5683 :             case FRM_BODY:      if( pFrm->GetUpper()->IsPageFrm() ) // not for ColumnFrms
     248        5681 :                                     nReturn |= FRMTYPE_BODY;
     249        5683 :                                 break;
     250           0 :             case FRM_FTN:       nReturn |= FRMTYPE_FOOTNOTE;    break;
     251           0 :             case FRM_FLY:       if( ((SwFlyFrm*)pFrm)->IsFlyLayFrm() )
     252           0 :                                     nReturn |= FRMTYPE_FLY_FREE;
     253           0 :                                 else if ( ((SwFlyFrm*)pFrm)->IsFlyAtCntFrm() )
     254           0 :                                     nReturn |= FRMTYPE_FLY_ATCNT;
     255             :                                 else
     256             :                                 {
     257             :                                     OSL_ENSURE( ((SwFlyFrm*)pFrm)->IsFlyInCntFrm(),
     258             :                                             "New frametype?" );
     259           0 :                                     nReturn |= FRMTYPE_FLY_INCNT;
     260             :                                 }
     261           0 :                                 nReturn |= FRMTYPE_FLY_ANY;
     262           0 :                                 if( bStopAtFly )
     263           0 :                                     return nReturn;
     264           0 :                                 break;
     265             :             case FRM_TAB:
     266             :             case FRM_ROW:
     267          60 :             case FRM_CELL:      nReturn |= FRMTYPE_TABLE;       break;
     268       11382 :             default:            /* do nothing */                break;
     269             :         }
     270       22808 :         if ( pFrm->IsFlyFrm() )
     271           0 :             pFrm = ((SwFlyFrm*)pFrm)->GetAnchorFrm();
     272             :         else
     273       22808 :             pFrm = pFrm->GetUpper();
     274             :     }
     275        5681 :     return nReturn;
     276             : }
     277             : 
     278        4650 : void SwFEShell::ShGetFcs( bool bUpdate )
     279             : {
     280        4650 :     ::SetShell( this );
     281        4650 :     SwCrsrShell::ShGetFcs( bUpdate );
     282             : 
     283        4650 :     if ( HasDrawView() )
     284             :     {
     285        4650 :         Imp()->GetDrawView()->showMarkHandles();
     286        4650 :         if ( Imp()->GetDrawView()->AreObjectsMarked() )
     287           0 :             FrameNotify( this, FLY_DRAG_START );
     288             :     }
     289        4650 : }
     290             : 
     291        4650 : void SwFEShell::ShLooseFcs()
     292             : {
     293        4650 :     SwCrsrShell::ShLooseFcs();
     294             : 
     295        4650 :     if ( HasDrawView() && Imp()->GetDrawView()->AreObjectsMarked() )
     296             :     {
     297           4 :         Imp()->GetDrawView()->hideMarkHandles();
     298           4 :         FrameNotify( this, FLY_DRAG_END );
     299             :     }
     300        4650 : }
     301             : 
     302          16 : sal_uInt16 SwFEShell::GetPhyPageNum()
     303             : {
     304          16 :     SwFrm *pFrm = GetCurrFrm();
     305          16 :     if ( pFrm )
     306          16 :         return pFrm->GetPhyPageNum();
     307           0 :     return 0;
     308             : }
     309             : 
     310           4 : sal_uInt16 SwFEShell::GetVirtPageNum( const bool bCalcFrm )
     311             : {
     312           4 :     SwFrm *pFrm = GetCurrFrm( bCalcFrm );
     313           4 :     if ( pFrm )
     314           4 :         return pFrm->GetVirtPageNum();
     315           0 :     return 0;
     316             : }
     317             : 
     318           0 : static void lcl_SetAPageOffset( sal_uInt16 nOffset, SwPageFrm* pPage, SwFEShell* pThis )
     319             : {
     320           0 :     pThis->StartAllAction();
     321             :     OSL_ENSURE( pPage->FindFirstBodyCntnt(),
     322             :             "SwFEShell _SetAPageOffset() without CntntFrm" );
     323             : 
     324           0 :     SwFmtPageDesc aDesc( pPage->GetPageDesc() );
     325           0 :     aDesc.SetNumOffset( nOffset );
     326             : 
     327           0 :     SwFrm *pFrm = pThis->GetCurrFrm( false );
     328           0 :     if ( pFrm->IsInTab() )
     329           0 :         pThis->GetDoc()->SetAttr( aDesc, *pFrm->FindTabFrm()->GetFmt() );
     330             :     else
     331             :     {
     332           0 :         pThis->GetDoc()->getIDocumentContentOperations().InsertPoolItem( *pThis->GetCrsr(), aDesc, 0 );
     333             :     }
     334             : 
     335           0 :     pThis->EndAllAction();
     336           0 : }
     337             : 
     338           0 : void SwFEShell::SetNewPageOffset( sal_uInt16 nOffset )
     339             : {
     340           0 :     GetLayout()->SetVirtPageNum( true );
     341           0 :     const SwPageFrm *pPage = GetCurrFrm( false )->FindPageFrm();
     342           0 :     lcl_SetAPageOffset( nOffset, (SwPageFrm*)pPage, this );
     343           0 : }
     344             : 
     345           0 : void SwFEShell::SetPageOffset( sal_uInt16 nOffset )
     346             : {
     347           0 :     const SwPageFrm *pPage = GetCurrFrm( false )->FindPageFrm();
     348           0 :     const SwRootFrm* pDocLayout = GetLayout();
     349           0 :     while ( pPage )
     350             :     {
     351           0 :         const SwFrm *pFlow = pPage->FindFirstBodyCntnt();
     352           0 :         if ( pFlow )
     353             :         {
     354           0 :             if ( pFlow->IsInTab() )
     355           0 :                 pFlow = pFlow->FindTabFrm();
     356           0 :             const SwFmtPageDesc& rPgDesc = pFlow->GetAttrSet()->GetPageDesc();
     357           0 :             if ( rPgDesc.GetNumOffset() )
     358             :             {
     359           0 :                 pDocLayout->SetVirtPageNum( true );
     360           0 :                 lcl_SetAPageOffset( nOffset, (SwPageFrm*)pPage, this );
     361           0 :                 break;
     362             :             }
     363             :         }
     364           0 :         pPage = (SwPageFrm*)pPage->GetPrev();
     365             :     }
     366           0 : }
     367             : 
     368           0 : sal_uInt16 SwFEShell::GetPageOffset() const
     369             : {
     370           0 :     const SwPageFrm *pPage = GetCurrFrm()->FindPageFrm();
     371           0 :     while ( pPage )
     372             :     {
     373           0 :         const SwFrm *pFlow = pPage->FindFirstBodyCntnt();
     374           0 :         if ( pFlow )
     375             :         {
     376           0 :             if ( pFlow->IsInTab() )
     377           0 :                 pFlow = pFlow->FindTabFrm();
     378           0 :             ::boost::optional<sal_uInt16> oNumOffset = pFlow->GetAttrSet()->GetPageDesc().GetNumOffset();
     379           0 :             if ( oNumOffset )
     380           0 :                 return oNumOffset.get();
     381             :         }
     382           0 :         pPage = (SwPageFrm*)pPage->GetPrev();
     383             :     }
     384           0 :     return 0;
     385             : }
     386             : 
     387           0 : void SwFEShell::InsertLabel( const SwLabelType eType, const OUString &rTxt, const OUString& rSeparator,
     388             :                              const OUString& rNumberSeparator,
     389             :                              const bool bBefore, const sal_uInt16 nId,
     390             :                              const OUString& rCharacterStyle,
     391             :                              const bool bCpyBrd )
     392             : {
     393             :     // get node index of cursor position, SwDoc can do everything else itself
     394           0 :     SwCntntFrm *pCnt = LTYPE_DRAW==eType ? 0 : GetCurrFrm( false );
     395           0 :     if( LTYPE_DRAW==eType || pCnt )
     396             :     {
     397           0 :         StartAllAction();
     398             : 
     399           0 :         sal_uLong nIdx = 0;
     400           0 :         SwFlyFrmFmt* pFlyFmt = 0;
     401           0 :         switch( eType )
     402             :         {
     403             :         case LTYPE_OBJECT:
     404             :         case LTYPE_FLY:
     405           0 :             if( pCnt->IsInFly() )
     406             :             {
     407             :                 // pass down index to the startnode for flys
     408           0 :                 nIdx = pCnt->FindFlyFrm()->
     409           0 :                             GetFmt()->GetCntnt().GetCntntIdx()->GetIndex();
     410             :             }
     411           0 :             break;
     412             :         case LTYPE_TABLE:
     413           0 :             if( pCnt->IsInTab() )
     414             :             {
     415             :                 // pass down index to the TblNode for tables
     416           0 :                 const SwTable& rTbl = *pCnt->FindTabFrm()->GetTable();
     417           0 :                 nIdx = rTbl.GetTabSortBoxes()[ 0 ]
     418           0 :                             ->GetSttNd()->FindTableNode()->GetIndex();
     419             :             }
     420           0 :             break;
     421             :         case LTYPE_DRAW:
     422           0 :             if( Imp()->GetDrawView() )
     423             :             {
     424           0 :                 SwDrawView *pDView = Imp()->GetDrawView();
     425           0 :                 const SdrMarkList& rMrkList = pDView->GetMarkedObjectList();
     426           0 :                 StartUndo();
     427             : 
     428             :                 // copy marked drawing objects to
     429             :                 // local list to perform the corresponding action for each object
     430           0 :                 std::vector<SdrObject*> aDrawObjs;
     431             :                 {
     432           0 :                     for ( size_t i = 0; i < rMrkList.GetMarkCount(); ++i )
     433             :                     {
     434           0 :                         SdrObject* pDrawObj = rMrkList.GetMark(i)->GetMarkedSdrObj();
     435           0 :                         if( pDrawObj )
     436           0 :                         aDrawObjs.push_back( pDrawObj );
     437             :                     }
     438             :                 }
     439             :                 // loop on marked drawing objects
     440           0 :                 while ( !aDrawObjs.empty() )
     441             :                 {
     442           0 :                     SdrObject* pDrawObj = aDrawObjs.back();
     443           0 :                     if ( !pDrawObj->ISA(SwVirtFlyDrawObj) &&
     444           0 :                          !pDrawObj->ISA(SwFlyDrawObj) )
     445             :                     {
     446             :                         SwFlyFrmFmt *pFmt =
     447           0 :                             GetDoc()->InsertDrawLabel( rTxt, rSeparator, rNumberSeparator, nId, rCharacterStyle, *pDrawObj );
     448           0 :                         if( !pFlyFmt )
     449           0 :                             pFlyFmt = pFmt;
     450             :                     }
     451             : 
     452           0 :                     aDrawObjs.pop_back();
     453             :                 }
     454             : 
     455           0 :                 EndUndo();
     456             :             }
     457           0 :             break;
     458             :         default:
     459             :             OSL_ENSURE( false, "Crsr neither in table nor in fly." );
     460             :         }
     461             : 
     462           0 :         if( nIdx )
     463             :             pFlyFmt = GetDoc()->InsertLabel( eType, rTxt, rSeparator, rNumberSeparator, bBefore, nId,
     464           0 :                                              nIdx, rCharacterStyle, bCpyBrd );
     465             : 
     466             :         SwFlyFrm* pFrm;
     467           0 :         const Point aPt( GetCrsrDocPos() );
     468           0 :         if( pFlyFmt && 0 != ( pFrm = pFlyFmt->GetFrm( &aPt )))
     469           0 :             SelectFlyFrm( *pFrm, true );
     470             : 
     471           0 :         EndAllActionAndCall();
     472             :     }
     473           0 : }
     474             : 
     475           0 : bool SwFEShell::Sort(const SwSortOptions& rOpt)
     476             : {
     477           0 :     if( !HasSelection() )
     478           0 :         return false;
     479             : 
     480           0 :     SET_CURR_SHELL( this );
     481             :     bool bRet;
     482           0 :     StartAllAction();
     483           0 :     if(IsTableMode())
     484             :     {
     485             :         // Sort table
     486             :         // check if Point/Mark of current Crsr are in one table
     487           0 :         SwFrm *pFrm = GetCurrFrm( false );
     488             :         OSL_ENSURE( pFrm->FindTabFrm(), "Crsr not in table." );
     489             : 
     490             :         // search boxes via the layout
     491           0 :         SwSelBoxes  aBoxes;
     492           0 :         GetTblSel(*this, aBoxes);
     493             : 
     494             :         // The Crsr should be removed from the deletion area.
     495             :         // Always put them behind/on the table; via the
     496             :         // document position they will always be set to the old position
     497           0 :         while( !pFrm->IsCellFrm() )
     498           0 :             pFrm = pFrm->GetUpper();
     499             :         {
     500             :             /* ParkCursor->ParkCursorTab */
     501           0 :             ParkCursorInTab();
     502             :         }
     503             : 
     504             :         // call sorting on document
     505           0 :         bRet = mpDoc->SortTbl(aBoxes, rOpt) ? sal_True : sal_False;
     506             :     }
     507             :     else
     508             :     {
     509             :         // Sort text nothing else
     510           0 :         FOREACHPAM_START(GetCrsr())
     511             : 
     512           0 :             SwPaM* pPam = PCURCRSR;
     513             : 
     514           0 :             SwPosition* pStart = pPam->Start();
     515           0 :             SwPosition* pEnd   = pPam->End();
     516             : 
     517           0 :             SwNodeIndex aPrevIdx( pStart->nNode, -1 );
     518           0 :             sal_uLong nOffset = pEnd->nNode.GetIndex() - pStart->nNode.GetIndex();
     519           0 :             const sal_Int32 nCntStt  = pStart->nContent.GetIndex();
     520             : 
     521             :             // Sorting
     522           0 :             bRet = mpDoc->SortText(*pPam, rOpt) ? sal_True : sal_False;
     523             : 
     524             :             // put selection again
     525           0 :             pPam->DeleteMark();
     526           0 :             pPam->GetPoint()->nNode.Assign( aPrevIdx.GetNode(), +1 );
     527           0 :             SwCntntNode* pCNd = pPam->GetCntntNode();
     528           0 :             sal_Int32 nLen = pCNd->Len();
     529           0 :             if( nLen > nCntStt )
     530           0 :                 nLen = nCntStt;
     531           0 :             pPam->GetPoint()->nContent.Assign(pCNd, nLen );
     532           0 :             pPam->SetMark();
     533             : 
     534           0 :             pPam->GetPoint()->nNode += nOffset;
     535           0 :             pCNd = pPam->GetCntntNode();
     536           0 :             pPam->GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
     537             : 
     538           0 :         FOREACHPAM_END()
     539             :     }
     540             : 
     541           0 :     EndAllAction();
     542           0 :     return bRet;
     543             : }
     544             : 
     545           0 : sal_uInt16 SwFEShell::_GetCurColNum( const SwFrm *pFrm,
     546             :                                 SwGetCurColNumPara* pPara ) const
     547             : {
     548           0 :     sal_uInt16 nRet = 0;
     549           0 :     while ( pFrm )
     550             :     {
     551           0 :         pFrm = pFrm->GetUpper();
     552           0 :         if( pFrm && pFrm->IsColumnFrm() )
     553             :         {
     554           0 :             const SwFrm *pCurFrm = pFrm;
     555           0 :             do {
     556           0 :                 ++nRet;
     557           0 :                 pFrm = pFrm->GetPrev();
     558             :             } while ( pFrm );
     559             : 
     560           0 :             if( pPara )
     561             :             {
     562             :                 // now search the format, determining the columness
     563           0 :                 pFrm = pCurFrm->GetUpper();
     564           0 :                 while( pFrm )
     565             :                 {
     566           0 :                     if( ( FRM_PAGE | FRM_FLY | FRM_SECTION ) & pFrm->GetType() )
     567             :                     {
     568           0 :                         pPara->pFrmFmt = ((SwLayoutFrm*)pFrm)->GetFmt();
     569           0 :                         pPara->pPrtRect = &pFrm->Prt();
     570           0 :                         pPara->pFrmRect = &pFrm->Frm();
     571           0 :                         break;
     572             :                     }
     573           0 :                     pFrm = pFrm->GetUpper();
     574             :                 }
     575           0 :                 if( !pFrm )
     576             :                 {
     577           0 :                     pPara->pFrmFmt = 0;
     578           0 :                     pPara->pPrtRect = 0;
     579           0 :                     pPara->pFrmRect = 0;
     580             :                 }
     581             :             }
     582           0 :             break;
     583             :         }
     584             :     }
     585           0 :     return nRet;
     586             : }
     587             : 
     588           0 : sal_uInt16 SwFEShell::GetCurColNum( SwGetCurColNumPara* pPara ) const
     589             : {
     590             :     OSL_ENSURE( GetCurrFrm(), "Crsr parked?" );
     591           0 :     return _GetCurColNum( GetCurrFrm(), pPara );
     592             : }
     593             : 
     594           0 : sal_uInt16 SwFEShell::GetCurOutColNum( SwGetCurColNumPara* pPara ) const
     595             : {
     596           0 :     sal_uInt16 nRet = 0;
     597           0 :     SwFrm* pFrm = GetCurrFrm();
     598             :     OSL_ENSURE( pFrm, "Crsr parked?" );
     599           0 :     if( pFrm )
     600             :     {
     601           0 :         pFrm = pFrm->IsInTab() ? (SwFrm*)pFrm->FindTabFrm()
     602           0 :                                : (SwFrm*)pFrm->FindSctFrm();
     603             :         OSL_ENSURE( pFrm, "No Tab, no Sect" );
     604           0 :         if( pFrm )
     605           0 :             nRet = _GetCurColNum( pFrm, pPara );
     606             :     }
     607           0 :     return nRet;
     608             : }
     609             : 
     610        4708 : SwFEShell::SwFEShell( SwDoc& rDoc, vcl::Window *pWindow, const SwViewOption *pOptions )
     611             :     : SwEditShell( rDoc, pWindow, pOptions ),
     612        4708 :     pChainFrom( 0 ), pChainTo( 0 ), bCheckForOLEInCaption( false )
     613             : {
     614        4708 : }
     615             : 
     616           0 : SwFEShell::SwFEShell( SwEditShell& rShell, vcl::Window *pWindow )
     617             :     : SwEditShell( rShell, pWindow ),
     618           0 :     pChainFrom( 0 ), pChainTo( 0 ), bCheckForOLEInCaption( false )
     619             : {
     620           0 : }
     621             : 
     622        9412 : SwFEShell::~SwFEShell()
     623             : {
     624        4706 :     delete pChainFrom;
     625        4706 :     delete pChainTo;
     626        4706 : }
     627             : 
     628             : // #i17567# - adjustments for allowing
     629             : //          negative vertical positions for fly frames anchored to paragraph/to character.
     630             : // #i22305# - adjustments for option 'Follow text flow'
     631             : //          for to frame anchored objects.
     632             : // #i22341# - adjustments for vertical alignment at top of line
     633             : //          for to character anchored objects.
     634           0 : void SwFEShell::CalcBoundRect( SwRect& _orRect,
     635             :                                const RndStdIds _nAnchorId,
     636             :                                const sal_Int16 _eHoriRelOrient,
     637             :                                const sal_Int16 _eVertRelOrient,
     638             :                                const SwPosition* _pToCharCntntPos,
     639             :                                const bool _bFollowTextFlow,
     640             :                                bool _bMirror,
     641             :                                Point* _opRef,
     642             :                                Size* _opPercent,
     643             :                                const SwFmtFrmSize* pFmtFrmSize) const
     644             : {
     645             :     const SwFrm* pFrm;
     646             :     const SwFlyFrm* pFly;
     647           0 :     if( _opRef )
     648             :     {
     649           0 :         pFrm = GetCurrFrm();
     650           0 :         if( 0 != ( pFly = pFrm->FindFlyFrm() ) )
     651           0 :             pFrm = pFly->GetAnchorFrm();
     652             :     }
     653             :     else
     654             :     {
     655           0 :         pFly = FindFlyFrm();
     656           0 :         pFrm = pFly ? pFly->GetAnchorFrm() : GetCurrFrm();
     657             :     }
     658             : 
     659           0 :     bool bWrapThrough = false;
     660           0 :     if ( pFly )
     661             :     {
     662           0 :         SwFlyFrmFmt* pFmt = (SwFlyFrmFmt*)pFly->GetFmt();
     663           0 :         const SwFmtSurround& rSurround = pFmt->GetSurround();
     664           0 :         bWrapThrough = rSurround.GetSurround() == SURROUND_THROUGHT;
     665             :     }
     666             : 
     667           0 :     const SwPageFrm* pPage = pFrm->FindPageFrm();
     668           0 :     _bMirror = _bMirror && !pPage->OnRightPage();
     669             : 
     670           0 :     Point aPos;
     671           0 :     bool bVertic = false;
     672           0 :     bool bRTL = false;
     673           0 :     bool bVerticalL2R = false;
     674             : 
     675           0 :     if ((FLY_AT_PAGE == _nAnchorId) || (FLY_AT_FLY == _nAnchorId)) // LAYER_IMPL
     676             :     {
     677           0 :         const SwFrm* pTmp = pFrm;
     678             :         // #i22305#
     679           0 :         if ((FLY_AT_PAGE == _nAnchorId) ||
     680           0 :             ((FLY_AT_FLY == _nAnchorId) && !_bFollowTextFlow))
     681             :         {
     682           0 :             pFrm = pPage;
     683             :         }
     684             :         else
     685             :         {
     686           0 :             pFrm = pFrm->FindFlyFrm();
     687             :         }
     688           0 :         if ( !pFrm )
     689           0 :             pFrm = pTmp;
     690           0 :         _orRect = pFrm->Frm();
     691           0 :         SWRECTFN( pFrm )
     692           0 :         bRTL = pFrm->IsRightToLeft();
     693           0 :         if ( bRTL )
     694           0 :             aPos = pFrm->Frm().TopRight();
     695             :         else
     696           0 :             aPos = (pFrm->Frm().*fnRect->fnGetPos)();
     697             : 
     698           0 :         if( bVert || bVertL2R )
     699             :         {
     700           0 :             bVertic = bVert;
     701           0 :             bVerticalL2R = bVertL2R;
     702           0 :             _bMirror = false; // no mirroring in vertical environment
     703           0 :             switch ( _eHoriRelOrient )
     704             :             {
     705             :                 case text::RelOrientation::PAGE_RIGHT:
     706           0 :                 case text::RelOrientation::FRAME_RIGHT: aPos.Y() += pFrm->Prt().Height();
     707             :                 // no break!
     708             :                 case text::RelOrientation::PRINT_AREA:
     709           0 :                 case text::RelOrientation::PAGE_PRINT_AREA: aPos.Y() += pFrm->Prt().Top(); break;
     710           0 :                 default: break;
     711             :             }
     712             :         }
     713           0 :         else if ( _bMirror )
     714             :         {
     715           0 :             switch ( _eHoriRelOrient )
     716             :             {
     717             :                 case text::RelOrientation::PRINT_AREA:
     718           0 :                 case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Width();
     719             :                 // no break
     720             :                 case text::RelOrientation::PAGE_RIGHT:
     721           0 :                 case text::RelOrientation::FRAME_RIGHT: aPos.X() += pFrm->Prt().Left(); break;
     722           0 :                 default: aPos.X() += pFrm->Frm().Width();
     723             :             }
     724             :         }
     725           0 :         else if ( bRTL )
     726             :         {
     727           0 :             switch ( _eHoriRelOrient )
     728             :             {
     729             :                 case text::RelOrientation::PRINT_AREA:
     730           0 :                 case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Width();
     731             :                 // no break!
     732             :                 case text::RelOrientation::PAGE_LEFT:
     733           0 :                 case text::RelOrientation::FRAME_LEFT: aPos.X() += pFrm->Prt().Left() -
     734           0 :                                                pFrm->Frm().Width(); break;
     735           0 :                 default: break;
     736             :             }
     737             :         }
     738             :         else
     739             :         {
     740           0 :             switch ( _eHoriRelOrient )
     741             :             {
     742             :                 case text::RelOrientation::PAGE_RIGHT:
     743           0 :                 case text::RelOrientation::FRAME_RIGHT:   aPos.X() += pFrm->Prt().Width();
     744             :                 // no break!
     745             :                 case text::RelOrientation::PRINT_AREA:
     746           0 :                 case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Left(); break;
     747           0 :                 default:break;
     748             :             }
     749             :         }
     750             : 
     751           0 :         if ( bVert && !bVertL2R )
     752             :         {
     753           0 :             switch ( _eVertRelOrient )
     754             :             {
     755             :                 case text::RelOrientation::PRINT_AREA:
     756             :                 case text::RelOrientation::PAGE_PRINT_AREA:
     757             :                 {
     758           0 :                     aPos.X() -= pFrm->GetRightMargin();
     759             :                 }
     760           0 :                 break;
     761             :             }
     762             :         }
     763           0 :         else if ( bVertL2R )
     764             :         {
     765           0 :             switch ( _eVertRelOrient )
     766             :             {
     767             :                 case text::RelOrientation::PRINT_AREA:
     768             :                 case text::RelOrientation::PAGE_PRINT_AREA:
     769             :                 {
     770           0 :                     aPos.X() += pFrm->GetLeftMargin();
     771             :                 }
     772           0 :                 break;
     773             :             }
     774             :         }
     775             :         else
     776             :         {
     777           0 :             switch ( _eVertRelOrient )
     778             :             {
     779             :                 case text::RelOrientation::PRINT_AREA:
     780             :                 case text::RelOrientation::PAGE_PRINT_AREA:
     781             :                 {
     782           0 :                     if ( pFrm->IsPageFrm() )
     783             :                     {
     784           0 :                         aPos.Y() =
     785           0 :                             static_cast<const SwPageFrm*>(pFrm)->PrtWithoutHeaderAndFooter().Top();
     786             :                     }
     787             :                     else
     788             :                     {
     789           0 :                         aPos.Y() += pFrm->Prt().Top();
     790             :                     }
     791             :                 }
     792           0 :                 break;
     793             :             }
     794             :         }
     795           0 :         if ( _opPercent )
     796           0 :             *_opPercent = pFrm->Prt().SSize();
     797             :     }
     798             :     else
     799             :     {
     800           0 :         const SwFrm* pUpper = ( pFrm->IsPageFrm() || pFrm->IsFlyFrm() ) ?
     801           0 :                               pFrm : pFrm->GetUpper();
     802           0 :         SWRECTFN( pUpper );
     803           0 :         if ( _opPercent )
     804             :         {
     805             :             // If the size is relative from page, then full size should be counted from the page frame.
     806           0 :             if (pFmtFrmSize && pFmtFrmSize->GetWidthPercentRelation() == text::RelOrientation::PAGE_FRAME)
     807           0 :                 _opPercent->setWidth(pPage->Frm().Width());
     808             :             else
     809           0 :                 _opPercent->setWidth(pUpper->Prt().Width());
     810             : 
     811           0 :             if (pFmtFrmSize && pFmtFrmSize->GetHeightPercentRelation() == text::RelOrientation::PAGE_FRAME)
     812             :                 // If the size is relative from page, then full size should be counted from the page frame.
     813           0 :                 _opPercent->setHeight(pPage->Frm().Height());
     814             :             else
     815           0 :                 _opPercent->setHeight(pUpper->Prt().Height());
     816             :         }
     817             : 
     818           0 :         bRTL = pFrm->IsRightToLeft();
     819           0 :         if ( bRTL )
     820           0 :             aPos = pFrm->Frm().TopRight();
     821             :         else
     822           0 :             aPos = (pFrm->Frm().*fnRect->fnGetPos)();
     823             :         // #i17567# - allow negative positions
     824             :         // for fly frames anchor to paragraph/to character.
     825           0 :         if ((_nAnchorId == FLY_AT_PARA) || (_nAnchorId == FLY_AT_CHAR))
     826             :         {
     827             :             // The rectangle, the fly frame can be positioned in, is determined
     828             :             // horizontally by the frame area of the horizontal environment
     829             :             // and vertically by the printing area of the vertical environment,
     830             :             // if the object follows the text flow, or by the frame area of the
     831             :             // vertical environment, if the object doesn't follow the text flow.
     832             :             // new class <SwEnvironmentOfAnchoredObject>
     833             :             objectpositioning::SwEnvironmentOfAnchoredObject aEnvOfObj(
     834           0 :                                                             _bFollowTextFlow );
     835             :             const SwLayoutFrm& rHoriEnvironLayFrm =
     836           0 :                                 aEnvOfObj.GetHoriEnvironmentLayoutFrm( *pFrm );
     837             :             const SwLayoutFrm& rVertEnvironLayFrm =
     838           0 :                                 aEnvOfObj.GetVertEnvironmentLayoutFrm( *pFrm );
     839           0 :             SwRect aHoriEnvironRect( rHoriEnvironLayFrm.Frm() );
     840           0 :             SwRect aVertEnvironRect;
     841           0 :             if ( _bFollowTextFlow )
     842             :             {
     843           0 :                 aVertEnvironRect = rVertEnvironLayFrm.Prt();
     844           0 :                 aVertEnvironRect.Pos() += rVertEnvironLayFrm.Frm().Pos();
     845             :                 // #i18732# - adjust vertical 'virtual' anchor position
     846             :                 // (<aPos.Y()> respectively <aPos.X()>), if object is vertical aligned
     847             :                 // to page areas.
     848           0 :                 if ( _eVertRelOrient == text::RelOrientation::PAGE_FRAME || _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
     849             :                 {
     850           0 :                     if ( bVert && !bVertL2R )
     851             :                     {
     852           0 :                         aPos.X() = aVertEnvironRect.Right();
     853             :                     }
     854           0 :                     else if ( bVertL2R )
     855             :                     {
     856           0 :                         aPos.X() = aVertEnvironRect.Left();
     857             :                     }
     858             :                     else
     859             :                     {
     860           0 :                         aPos.Y() = aVertEnvironRect.Top();
     861             :                     }
     862             :                 }
     863             :             }
     864             :             else
     865             :             {
     866             :                 OSL_ENSURE( rVertEnvironLayFrm.IsPageFrm(),
     867             :                         "<SwFEShell::CalcBoundRect(..)> - not following text flow, but vertical environment *not* page!" );
     868           0 :                 aVertEnvironRect = rVertEnvironLayFrm.Frm();
     869             :                 // #i18732# - adjustment vertical 'virtual' anchor position
     870             :                 // (<aPos.Y()> respectively <aPos.X()>), if object is vertical aligned
     871             :                 // to page areas.
     872           0 :                 if ( _eVertRelOrient == text::RelOrientation::PAGE_FRAME || _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
     873             :                 {
     874           0 :                     if ( bVert && !bVertL2R )
     875             :                     {
     876           0 :                         aPos.X() = aVertEnvironRect.Right();
     877           0 :                         if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
     878             :                         {
     879           0 :                             aPos.setX(aPos.getX() - rVertEnvironLayFrm.GetRightMargin());
     880             :                         }
     881             :                     }
     882           0 :                     else if ( bVertL2R )
     883             :                     {
     884           0 :                         aPos.X() = aVertEnvironRect.Left();
     885           0 :                         if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
     886             :                         {
     887           0 :                             aPos.setX(aPos.getX() + rVertEnvironLayFrm.GetLeftMargin());
     888             :                         }
     889             :                     }
     890             :                     else
     891             :                     {
     892           0 :                         aPos.Y() = aVertEnvironRect.Top();
     893           0 :                         if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
     894             :                         {
     895           0 :                             aPos.setY(aPos.getY() + rVertEnvironLayFrm.GetTopMargin());
     896             :                             // add height of page header
     897           0 :                             const SwFrm* pTmpFrm = rVertEnvironLayFrm.Lower();
     898           0 :                             if ( pTmpFrm->IsHeaderFrm() )
     899             :                             {
     900           0 :                                 aPos.setY(aPos.getY() + pTmpFrm->Frm().Height());
     901             :                             }
     902             :                         }
     903             :                     }
     904             :                 }
     905             :             }
     906             : 
     907             :             // #i22341# - adjust vertical 'virtual' anchor position
     908             :             // (<aPos.Y()> respectively <aPos.X()>), if object is anchored to
     909             :             // character and vertical aligned at character or top of line
     910             :             // <pFrm>, which is the anchor frame or the proposed anchor frame,
     911             :             // doesn't have to be a text frame (e.g. edit a to-page anchored
     912             :             // fly frame). Thus, assure this.
     913           0 :             const SwTxtFrm* pTxtFrm( dynamic_cast<const SwTxtFrm*>(pFrm) );
     914           0 :             if ( pTxtFrm &&
     915           0 :                  (_nAnchorId == FLY_AT_CHAR) &&
     916           0 :                  ( _eVertRelOrient == text::RelOrientation::CHAR ||
     917             :                    _eVertRelOrient == text::RelOrientation::TEXT_LINE ) )
     918             :             {
     919           0 :                 SwTwips nTop = 0L;
     920           0 :                 if ( _eVertRelOrient == text::RelOrientation::CHAR )
     921             :                 {
     922           0 :                     SwRect aChRect;
     923           0 :                     if ( _pToCharCntntPos )
     924             :                     {
     925           0 :                         pTxtFrm->GetAutoPos( aChRect, *_pToCharCntntPos );
     926             :                     }
     927             :                     else
     928             :                     {
     929             :                         // No content position provided. Thus, use a default one.
     930           0 :                         SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) );
     931           0 :                         pTxtFrm->GetAutoPos( aChRect, aDefaultCntntPos );
     932             :                     }
     933           0 :                     nTop = (aChRect.*fnRect->fnGetBottom)();
     934             :                 }
     935             :                 else
     936             :                 {
     937           0 :                     if ( _pToCharCntntPos )
     938             :                     {
     939           0 :                         pTxtFrm->GetTopOfLine( nTop, *_pToCharCntntPos );
     940             :                     }
     941             :                     else
     942             :                     {
     943             :                         // No content position provided. Thus, use a default one.
     944           0 :                         SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) );
     945           0 :                         pTxtFrm->GetTopOfLine( nTop, aDefaultCntntPos );
     946             :                     }
     947             :                 }
     948           0 :                 if ( bVert || bVertL2R )
     949             :                 {
     950           0 :                     aPos.setX(nTop);
     951             :                 }
     952             :                 else
     953             :                 {
     954           0 :                     aPos.setY(nTop);
     955             :                 }
     956             :             }
     957             : 
     958             :             // #i26945# - adjust horizontal 'virtual' anchor
     959             :             // position (<aPos.X()> respectively <aPos.Y()>), if object is
     960             :             // anchored to character and horizontal aligned at character.
     961           0 :             if ( pTxtFrm &&
     962           0 :                  (_nAnchorId == FLY_AT_CHAR) &&
     963             :                  _eHoriRelOrient == text::RelOrientation::CHAR )
     964             :             {
     965           0 :                 SwTwips nLeft = 0L;
     966           0 :                 SwRect aChRect;
     967           0 :                 if ( _pToCharCntntPos )
     968             :                 {
     969           0 :                     pTxtFrm->GetAutoPos( aChRect, *_pToCharCntntPos );
     970             :                 }
     971             :                 else
     972             :                 {
     973             :                     // No content position provided. Thus, use a default one.
     974           0 :                     SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) );
     975           0 :                     pTxtFrm->GetAutoPos( aChRect, aDefaultCntntPos );
     976             :                 }
     977           0 :                 nLeft = (aChRect.*fnRect->fnGetLeft)();
     978           0 :                 if ( bVert || bVertL2R )
     979             :                 {
     980           0 :                     aPos.setY(nLeft);
     981             :                 }
     982             :                 else
     983             :                 {
     984           0 :                     aPos.setX(nLeft);
     985             :                 }
     986             :             }
     987           0 :             if ( bVert || bVertL2R )
     988             :             {
     989           0 :                 _orRect = SwRect( aVertEnvironRect.Left(),
     990             :                                   aHoriEnvironRect.Top(),
     991             :                                   aVertEnvironRect.Width(),
     992           0 :                                   aHoriEnvironRect.Height() );
     993             :             }
     994             :             else
     995             :             {
     996           0 :                 _orRect = SwRect( aHoriEnvironRect.Left(),
     997             :                                   aVertEnvironRect.Top(),
     998             :                                   aHoriEnvironRect.Width(),
     999           0 :                                   aVertEnvironRect.Height() );
    1000           0 :             }
    1001             :         }
    1002             :         else
    1003             :         {
    1004           0 :             if( _opRef && pFly && pFly->IsFlyInCntFrm() )
    1005           0 :                 *_opRef = ( (SwFlyInCntFrm*)pFly )->GetRefPoint();
    1006             : 
    1007           0 :             _orRect = pUpper->Frm();
    1008           0 :             if( !pUpper->IsBodyFrm() )
    1009             :             {
    1010           0 :                 _orRect += pUpper->Prt().Pos();
    1011           0 :                 _orRect.SSize( pUpper->Prt().SSize() );
    1012           0 :                 if ( pUpper->IsCellFrm() )//MA_FLY_HEIGHT
    1013             :                 {
    1014           0 :                     const SwFrm* pTab = pUpper->FindTabFrm();
    1015           0 :                     long nBottom = (pTab->GetUpper()->*fnRect->fnGetPrtBottom)();
    1016           0 :                     (_orRect.*fnRect->fnSetBottom)( nBottom );
    1017             :                 }
    1018             :             }
    1019             :             // only use 90% of height for character bound
    1020             :             {
    1021           0 :                 if( bVert || bVertL2R )
    1022           0 :                     _orRect.Width( (_orRect.Width()*9)/10 );
    1023             :                 else
    1024           0 :                     _orRect.Height( (_orRect.Height()*9)/10 );
    1025             :             }
    1026             :         }
    1027             : 
    1028           0 :         const SwTwips nBaseOfstForFly = ( pFrm->IsTxtFrm() && pFly ) ?
    1029           0 :                                         ((SwTxtFrm*)pFrm)->GetBaseOfstForFly( !bWrapThrough ) :
    1030           0 :                                          0;
    1031           0 :         if( bVert || bVertL2R )
    1032             :         {
    1033           0 :             bVertic = bVert;
    1034           0 :             bVerticalL2R = bVertL2R;
    1035           0 :             _bMirror = false;
    1036             : 
    1037           0 :             switch ( _eHoriRelOrient )
    1038             :             {
    1039             :                 case text::RelOrientation::FRAME_RIGHT:
    1040             :                 {
    1041           0 :                     aPos.setY(aPos.getY() + pFrm->Prt().Height());
    1042           0 :                     aPos += (pFrm->Prt().*fnRect->fnGetPos)();
    1043           0 :                     break;
    1044             :                 }
    1045             :                 case text::RelOrientation::PRINT_AREA:
    1046             :                 {
    1047           0 :                     aPos += (pFrm->Prt().*fnRect->fnGetPos)();
    1048           0 :                     aPos.setY(aPos.getY() + nBaseOfstForFly);
    1049           0 :                     break;
    1050             :                 }
    1051             :                 case text::RelOrientation::PAGE_RIGHT:
    1052             :                 {
    1053           0 :                     aPos.setY(pPage->Frm().Top() + pPage->Prt().Bottom());
    1054           0 :                     break;
    1055             :                 }
    1056             :                 case text::RelOrientation::PAGE_PRINT_AREA:
    1057             :                 {
    1058           0 :                     aPos.setY(pPage->Frm().Top() + pPage->Prt().Top());
    1059           0 :                     break;
    1060             :                 }
    1061             :                 case text::RelOrientation::PAGE_LEFT:
    1062             :                 case text::RelOrientation::PAGE_FRAME:
    1063             :                 {
    1064           0 :                     aPos.setY(pPage->Frm().Top());
    1065           0 :                     break;
    1066             :                 }
    1067             :                 case text::RelOrientation::FRAME:
    1068             :                 {
    1069           0 :                     aPos.setY(aPos.getY() + nBaseOfstForFly);
    1070           0 :                     break;
    1071             :                 }
    1072           0 :                 default: break;
    1073             :             }
    1074             :         }
    1075           0 :         else if( _bMirror )
    1076             :         {
    1077           0 :             switch ( _eHoriRelOrient )
    1078             :             {
    1079           0 :                 case text::RelOrientation::FRAME_RIGHT:   aPos.setX(aPos.getX() + pFrm->Prt().Left()); break;
    1080             :                 case text::RelOrientation::FRAME:
    1081           0 :                 case text::RelOrientation::FRAME_LEFT: aPos.setX(aPos.getX() + pFrm->Frm().Width()); break;
    1082           0 :                 case text::RelOrientation::PRINT_AREA: aPos.setX(aPos.getX() + pFrm->Prt().Right()); break;
    1083             :                 case text::RelOrientation::PAGE_LEFT:
    1084           0 :                 case text::RelOrientation::PAGE_FRAME: aPos.setX(pPage->Frm().Right()); break;
    1085           0 :                 case text::RelOrientation::PAGE_PRINT_AREA: aPos.setX(pPage->Frm().Left()
    1086           0 :                                               + pPage->Prt().Left()); break;
    1087           0 :                 default: break;
    1088             :             }
    1089             :         }
    1090           0 :         else if ( bRTL )
    1091             :         {
    1092           0 :             switch ( _eHoriRelOrient )
    1093             :             {
    1094             :                 case text::RelOrientation::FRAME_LEFT:
    1095           0 :                     aPos.setX(pFrm->Frm().Left() +
    1096           0 :                                pFrm->Prt().Left());
    1097           0 :                     break;
    1098             : 
    1099             :                 case text::RelOrientation::PRINT_AREA:
    1100           0 :                     aPos.setX(pFrm->Frm().Left() + pFrm->Prt().Left() +
    1101           0 :                                pFrm->Prt().Width());
    1102           0 :                     aPos.setX(aPos.getX() + nBaseOfstForFly);
    1103           0 :                     break;
    1104             : 
    1105             :                 case text::RelOrientation::PAGE_LEFT:
    1106           0 :                     aPos.setX(pPage->Frm().Left() + pPage->Prt().Left());
    1107           0 :                     break;
    1108             : 
    1109             :                 case text::RelOrientation::PAGE_PRINT_AREA:
    1110           0 :                     aPos.setX(pPage->Frm().Left() + pPage->Prt().Left() +
    1111           0 :                                pPage->Prt().Width());
    1112           0 :                     break;
    1113             : 
    1114             :                 case text::RelOrientation::PAGE_RIGHT:
    1115             :                 case text::RelOrientation::PAGE_FRAME:
    1116           0 :                     aPos.setX(pPage->Frm().Right());
    1117           0 :                     break;
    1118             : 
    1119             :                 case text::RelOrientation::FRAME:
    1120           0 :                     aPos.setX(aPos.getX() + nBaseOfstForFly);
    1121           0 :                     break;
    1122           0 :                 default: break;
    1123             :             }
    1124             :         }
    1125             :         else
    1126             :         {
    1127           0 :             switch ( _eHoriRelOrient )
    1128             :             {
    1129             :                 case text::RelOrientation::FRAME_RIGHT:
    1130           0 :                     aPos.X() += pFrm->Prt().Width();
    1131           0 :                     aPos += pFrm->Prt().Pos();
    1132           0 :                     break;
    1133             :                 case text::RelOrientation::PRINT_AREA:
    1134           0 :                     aPos += pFrm->Prt().Pos();
    1135           0 :                     aPos.setX(aPos.getX() + nBaseOfstForFly);
    1136           0 :                     break;
    1137             :                 case text::RelOrientation::PAGE_RIGHT:
    1138           0 :                     aPos.setX(pPage->Frm().Left() + pPage->Prt().Right());
    1139           0 :                     break;
    1140             :                 case text::RelOrientation::PAGE_PRINT_AREA:
    1141           0 :                     aPos.setX(pPage->Frm().Left() + pPage->Prt().Left());
    1142           0 :                     break;
    1143             :                 case text::RelOrientation::PAGE_LEFT:
    1144             :                 case text::RelOrientation::PAGE_FRAME:
    1145           0 :                     aPos.setX(pPage->Frm().Left());
    1146           0 :                     break;
    1147             :                 case text::RelOrientation::FRAME:
    1148           0 :                     aPos.setX(aPos.getX() + nBaseOfstForFly);
    1149           0 :                     break;
    1150           0 :                 default: break;
    1151             :             }
    1152             :         }
    1153             : 
    1154             :     }
    1155           0 :     if( !_opRef )
    1156             :     {
    1157           0 :         if( bVertic && !bVerticalL2R )
    1158           0 :             _orRect.Pos( aPos.getX() - _orRect.Width() - _orRect.Left(), _orRect.Top() - aPos.getY() );
    1159           0 :         else if( bVerticalL2R )
    1160           0 :             _orRect.Pos( _orRect.Left() - aPos.getX(), _orRect.Top() - aPos.getY() );
    1161           0 :         else if ( bRTL )
    1162           0 :             _orRect.Pos( - ( _orRect.Right() - aPos.getX() ), _orRect.Top() - aPos.getY() );
    1163             :         else
    1164           0 :             _orRect.Pos( _orRect.Left() - aPos.getX(), _orRect.Top() - aPos.getY() );
    1165           0 :         if( _bMirror )
    1166           0 :             _orRect.Pos( -_orRect.Right(), _orRect.Top() );
    1167             :     }
    1168           0 : }
    1169             : 
    1170           0 : Size SwFEShell::GetGraphicDefaultSize() const
    1171             : {
    1172           0 :     Size aRet;
    1173           0 :     SwFlyFrm *pFly = FindFlyFrm();
    1174           0 :     if ( pFly )
    1175             :     {
    1176             :         // #i32951# - due to issue #i28701# no format of a
    1177             :         // newly inserted Writer fly frame or its anchor frame is performed
    1178             :         // any more. Thus, it could be possible (e.g. on insert of a horizontal
    1179             :         // line) that the anchor frame isn't formatted and its printing area
    1180             :         // size is (0,0). If this is the case the printing area of the upper
    1181             :         // of the anchor frame is taken.
    1182           0 :         const SwFrm* pAnchorFrm = pFly->GetAnchorFrm();
    1183           0 :         aRet = pAnchorFrm->Prt().SSize();
    1184           0 :         if ( aRet.Width() == 0 && aRet.Height() == 0 &&
    1185           0 :              pAnchorFrm->GetUpper() )
    1186             :         {
    1187           0 :             aRet = pAnchorFrm->GetUpper()->Prt().SSize();
    1188             :         }
    1189             : 
    1190           0 :         SwRect aBound;
    1191           0 :         CalcBoundRect( aBound, pFly->GetFmt()->GetAnchor().GetAnchorId());
    1192           0 :         if ( pFly->GetAnchorFrm()->IsVertical() )
    1193           0 :             aRet.Width() = aBound.Width();
    1194             :         else
    1195           0 :             aRet.Height() = aBound.Height();
    1196             :     }
    1197           0 :     return aRet;
    1198             : }
    1199             : 
    1200         804 : bool SwFEShell::IsFrmVertical(const bool bEnvironment, bool& bRTL, bool& bVertL2R) const
    1201             : {
    1202         804 :     bool bVert = false;
    1203         804 :     bRTL = false;
    1204         804 :     bVertL2R = false;
    1205             : 
    1206         804 :     if ( Imp()->HasDrawView() )
    1207             :     {
    1208         804 :         const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
    1209         804 :         if( rMrkList.GetMarkCount() != 1 )
    1210         804 :             return bVert;
    1211             : 
    1212           0 :         SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
    1213           0 :         if ( !pObj )
    1214             :         {
    1215             :             OSL_FAIL( "<SwFEShell::IsFrmVertical(..)> - missing SdrObject instance in marked object list -> This is a serious situation, please inform OD" );
    1216           0 :             return bVert;
    1217             :         }
    1218             :         // #i26791#
    1219           0 :         SwContact* pContact = static_cast<SwContact*>(GetUserCall( pObj ));
    1220           0 :         if ( !pContact )
    1221             :         {
    1222             :             OSL_FAIL( "<SwFEShell::IsFrmVertical(..)> - missing SwContact instance at marked object -> This is a serious situation, please inform OD" );
    1223           0 :             return bVert;
    1224             :         }
    1225           0 :         const SwFrm* pRef = pContact->GetAnchoredObj( pObj )->GetAnchorFrm();
    1226           0 :         if ( !pRef )
    1227             :         {
    1228             :             OSL_FAIL( "<SwFEShell::IsFrmVertical(..)> - missing anchor frame at marked object -> This is a serious situation, please inform OD" );
    1229           0 :             return bVert;
    1230             :         }
    1231             : 
    1232           0 :         if ( pObj->ISA(SwVirtFlyDrawObj) && !bEnvironment )
    1233           0 :             pRef = static_cast<const SwVirtFlyDrawObj*>(pObj)->GetFlyFrm();
    1234             : 
    1235           0 :         bVert = pRef->IsVertical();
    1236           0 :         bRTL = pRef->IsRightToLeft();
    1237           0 :         bVertL2R = pRef->IsVertLR();
    1238             :     }
    1239             : 
    1240           0 :     return bVert;
    1241             : }
    1242             : 
    1243           0 : void SwFEShell::MoveObjectIfActive( svt::EmbeddedObjectRef&, const Point& )
    1244             : {
    1245             :     // does not do anything, only avoids crash if the method is used for wrong shell
    1246           0 : }
    1247             : 
    1248           0 : void SwFEShell::ToggleHeaderFooterEdit()
    1249             : {
    1250             :     // Clear objects selection
    1251           0 :     if ( Imp()->GetDrawView()->AreObjectsMarked() )
    1252             :     {
    1253           0 :         Imp()->GetDrawView()->UnmarkAll();
    1254           0 :         ClearMark();
    1255             :     }
    1256             : 
    1257           0 :     SwCrsrShell::ToggleHeaderFooterEdit();
    1258         270 : }
    1259             : 
    1260             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10