LCOV - code coverage report
Current view: top level - sw/source/core/objectpositioning - anchoredobjectposition.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 394 0.0 %
Date: 2014-04-14 Functions: 0 19 0.0 %
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 <anchoredobjectposition.hxx>
      21             : #include <environmentofanchoredobject.hxx>
      22             : #include <flyfrm.hxx>
      23             : #include <flyfrms.hxx>
      24             : #include <txtfrm.hxx>
      25             : #include <pagefrm.hxx>
      26             : #include <frmtool.hxx>
      27             : #include <svx/svdobj.hxx>
      28             : #include <dflyobj.hxx>
      29             : #include <dcontact.hxx>
      30             : #include <frmfmt.hxx>
      31             : #include <fmtornt.hxx>
      32             : // #i62875#
      33             : #include <fmtfollowtextflow.hxx>
      34             : #include <editeng/lrspitem.hxx>
      35             : #include <editeng/ulspitem.hxx>
      36             : #include <ndtxt.hxx>
      37             : #include <IDocumentSettingAccess.hxx>
      38             : 
      39             : using namespace ::com::sun::star;
      40             : using namespace objectpositioning;
      41             : 
      42             : // **************************************************************************
      43             : // constructor, destructor, initialization
      44             : // **************************************************************************
      45           0 : SwAnchoredObjectPosition::SwAnchoredObjectPosition( SdrObject& _rDrawObj )
      46             :     : mrDrawObj( _rDrawObj ),
      47             :       mbIsObjFly( false ),
      48             :       mpAnchoredObj( 0 ),
      49             :       mpAnchorFrm( 0 ),
      50             :       mpContact( 0 ),
      51             :       // #i62875#
      52             :       mbFollowTextFlow( false ),
      53           0 :       mbDoNotCaptureAnchoredObj( false )
      54             : {
      55             : #if OSL_DEBUG_LEVEL > 0
      56             :     // assert, if object isn't of excepted type
      57             :     const bool bObjOfExceptedType =
      58             :             mrDrawObj.ISA(SwVirtFlyDrawObj) || // object representing fly frame
      59             :             mrDrawObj.ISA(SwDrawVirtObj)    || // 'virtual' drawing object
      60             :             ( !mrDrawObj.ISA(SdrVirtObj) &&    // 'master' drawing object
      61             :               !mrDrawObj.ISA(SwFlyDrawObj) );  // - indirectly checked
      62             :     (void) bObjOfExceptedType;
      63             :     OSL_ENSURE( bObjOfExceptedType,
      64             :             "SwAnchoredObjectPosition(..) - object of unexcepted type!" );
      65             : #endif
      66             : 
      67           0 :     _GetInfoAboutObj();
      68           0 : }
      69             : 
      70             : /** determine information about object
      71             : 
      72             :     members <mbIsObjFly>, <mpFrmOfObj>, <mpAnchorFrm>, <mpContact>,
      73             :     <mbFollowTextFlow> and <mbDoNotCaptureAnchoredObj> are set
      74             : */
      75           0 : void SwAnchoredObjectPosition::_GetInfoAboutObj()
      76             : {
      77             :     // determine, if object represents a fly frame
      78             :     {
      79           0 :         mbIsObjFly = mrDrawObj.ISA(SwVirtFlyDrawObj);
      80             :     }
      81             : 
      82             :     // determine contact object
      83             :     {
      84           0 :         mpContact = static_cast<SwContact*>(GetUserCall( &mrDrawObj ));
      85             :         OSL_ENSURE( mpContact,
      86             :                 "SwAnchoredObjectPosition::_GetInfoAboutObj() - missing SwContact-object." );
      87             :     }
      88             : 
      89             :     // determine anchored object, the object belongs to
      90             :     {
      91             :         // #i26791#
      92           0 :         mpAnchoredObj = mpContact->GetAnchoredObj( &mrDrawObj );
      93             :         OSL_ENSURE( mpAnchoredObj,
      94             :                 "SwAnchoredObjectPosition::_GetInfoAboutObj() - missing anchored object." );
      95             :     }
      96             : 
      97             :     // determine frame, the object is anchored at
      98             :     {
      99             :         // #i26791#
     100           0 :         mpAnchorFrm = mpAnchoredObj->AnchorFrm();
     101             :         OSL_ENSURE( mpAnchorFrm,
     102             :                 "SwAnchoredObjectPosition::_GetInfoAboutObj() - missing anchor frame." );
     103             :     }
     104             : 
     105             :     // determine format the object belongs to
     106             :     {
     107             :         // #i28701#
     108           0 :         mpFrmFmt = &mpAnchoredObj->GetFrmFmt();
     109             :         OSL_ENSURE( mpFrmFmt,
     110             :                 "<SwAnchoredObjectPosition::_GetInfoAboutObj() - missing frame format." );
     111             :     }
     112             : 
     113             :     // #i62875# - determine attribute value of <Follow-Text-Flow>
     114             :     {
     115           0 :         mbFollowTextFlow = mpFrmFmt->GetFollowTextFlow().GetValue();
     116             :     }
     117             : 
     118             :     // determine, if anchored object has not to be captured on the page.
     119             :     // the following conditions must be hold to *not* capture it:
     120             :     // - corresponding document compatibility flag is set
     121             :     // - it's a drawing object
     122             :     // - it doesn't follow the text flow
     123             :     {
     124           0 :         mbDoNotCaptureAnchoredObj = !mbIsObjFly && !mbFollowTextFlow &&
     125           0 :                                     mpFrmFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE);
     126             :     }
     127           0 : }
     128             : 
     129           0 : SwAnchoredObjectPosition::~SwAnchoredObjectPosition()
     130           0 : {}
     131             : 
     132           0 : bool SwAnchoredObjectPosition::IsAnchoredToChar() const
     133             : {
     134           0 :     return false;
     135             : }
     136             : 
     137           0 : const SwFrm* SwAnchoredObjectPosition::ToCharOrientFrm() const
     138             : {
     139           0 :     return NULL;
     140             : }
     141             : 
     142           0 : const SwRect* SwAnchoredObjectPosition::ToCharRect() const
     143             : {
     144           0 :     return NULL;
     145             : }
     146             : 
     147             : // #i22341#
     148           0 : SwTwips SwAnchoredObjectPosition::ToCharTopOfLine() const
     149             : {
     150           0 :     return 0L;
     151             : }
     152             : 
     153             : /** helper method to determine top of a frame for the vertical
     154             :     object positioning
     155             : 
     156             :     #i11860#
     157             : */
     158           0 : SwTwips SwAnchoredObjectPosition::_GetTopForObjPos( const SwFrm& _rFrm,
     159             :                                                     const SwRectFn& _fnRect,
     160             :                                                     const bool _bVert ) const
     161             : {
     162           0 :     SwTwips nTopOfFrmForObjPos = (_rFrm.Frm().*_fnRect->fnGetTop)();
     163             : 
     164           0 :     if ( _rFrm.IsTxtFrm() )
     165             :     {
     166           0 :         const SwTxtFrm& rTxtFrm = static_cast<const SwTxtFrm&>(_rFrm);
     167           0 :         if ( _bVert )
     168             :         {
     169             :             nTopOfFrmForObjPos -=
     170           0 :                 rTxtFrm.GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid();
     171             :         }
     172             :         else
     173             :         {
     174             :             nTopOfFrmForObjPos +=
     175           0 :                 rTxtFrm.GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid();
     176             :         }
     177             :     }
     178             : 
     179           0 :     return nTopOfFrmForObjPos;
     180             : }
     181             : 
     182           0 : void SwAnchoredObjectPosition::_GetVertAlignmentValues(
     183             :                                         const SwFrm& _rVertOrientFrm,
     184             :                                         const SwFrm& _rPageAlignLayFrm,
     185             :                                         const sal_Int16 _eRelOrient,
     186             :                                         SwTwips&      _orAlignAreaHeight,
     187             :                                         SwTwips&      _orAlignAreaOffset ) const
     188             : {
     189           0 :     SwTwips nHeight = 0;
     190           0 :     SwTwips nOffset = 0;
     191           0 :     SWRECTFN( (&_rVertOrientFrm) )
     192             :     // #i11860# - top of <_rVertOrientFrm> for object positioning
     193           0 :     const SwTwips nVertOrientTop = _GetTopForObjPos( _rVertOrientFrm, fnRect, bVert );
     194             :     // #i11860# - upper space amount of <_rVertOrientFrm> considered
     195             :     // for previous frame
     196             :     const SwTwips nVertOrientUpperSpaceForPrevFrmAndPageGrid =
     197           0 :             _rVertOrientFrm.IsTxtFrm()
     198             :             ? static_cast<const SwTxtFrm&>(_rVertOrientFrm).
     199           0 :                         GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid()
     200           0 :             : 0;
     201           0 :     switch ( _eRelOrient )
     202             :     {
     203             :         case text::RelOrientation::FRAME:
     204             :         {
     205             :             // #i11860# - consider upper space of previous frame
     206           0 :             nHeight = (_rVertOrientFrm.Frm().*fnRect->fnGetHeight)() -
     207           0 :                       nVertOrientUpperSpaceForPrevFrmAndPageGrid;
     208           0 :             nOffset = 0;
     209             :         }
     210           0 :         break;
     211             :         case text::RelOrientation::PRINT_AREA:
     212             :         {
     213           0 :             nHeight = (_rVertOrientFrm.Prt().*fnRect->fnGetHeight)();
     214             :             // #i11860# - consider upper space of previous frame
     215           0 :             nOffset = (_rVertOrientFrm.*fnRect->fnGetTopMargin)() -
     216           0 :                       nVertOrientUpperSpaceForPrevFrmAndPageGrid;
     217             :             // if aligned to page in horizontal layout, consider header and
     218             :             // footer frame height appropriately.
     219           0 :             if( _rVertOrientFrm.IsPageFrm() && !bVert )
     220             :             {
     221             :                 const SwFrm* pPrtFrm =
     222           0 :                         static_cast<const SwPageFrm&>(_rVertOrientFrm).Lower();
     223           0 :                 while( pPrtFrm )
     224             :                 {
     225           0 :                     if( pPrtFrm->IsHeaderFrm() )
     226             :                     {
     227           0 :                         nHeight -= pPrtFrm->Frm().Height();
     228           0 :                         nOffset += pPrtFrm->Frm().Height();
     229             :                     }
     230           0 :                     else if( pPrtFrm->IsFooterFrm() )
     231             :                     {
     232           0 :                         nHeight -= pPrtFrm->Frm().Height();
     233             :                     }
     234           0 :                     pPrtFrm = pPrtFrm->GetNext();
     235             :                 }
     236             :             }
     237             :         }
     238           0 :         break;
     239             :         case text::RelOrientation::PAGE_FRAME:
     240             :         {
     241           0 :             nHeight = (_rPageAlignLayFrm.Frm().*fnRect->fnGetHeight)();
     242             :             nOffset = (*fnRect->fnYDiff)(
     243           0 :                         (_rPageAlignLayFrm.Frm().*fnRect->fnGetTop)(),
     244           0 :                         nVertOrientTop );
     245             :         }
     246           0 :         break;
     247             :         case text::RelOrientation::PAGE_PRINT_AREA:
     248             :         {
     249           0 :             nHeight = (_rPageAlignLayFrm.Prt().*fnRect->fnGetHeight)();
     250           0 :             nOffset = (_rPageAlignLayFrm.*fnRect->fnGetTopMargin)() +
     251             :                       (*fnRect->fnYDiff)(
     252           0 :                         (_rPageAlignLayFrm.Frm().*fnRect->fnGetTop)(),
     253           0 :                         nVertOrientTop );
     254             :             // if aligned to page in horizontal layout, consider header and
     255             :             // footer frame height appropriately.
     256           0 :             if( _rPageAlignLayFrm.IsPageFrm() && !bVert )
     257             :             {
     258             :                 const SwFrm* pPrtFrm =
     259           0 :                         static_cast<const SwPageFrm&>(_rPageAlignLayFrm).Lower();
     260           0 :                 while( pPrtFrm )
     261             :                 {
     262           0 :                     if( pPrtFrm->IsHeaderFrm() )
     263             :                     {
     264           0 :                         nHeight -= pPrtFrm->Frm().Height();
     265           0 :                         nOffset += pPrtFrm->Frm().Height();
     266             :                     }
     267           0 :                     else if( pPrtFrm->IsFooterFrm() )
     268             :                     {
     269           0 :                         nHeight -= pPrtFrm->Frm().Height();
     270             :                     }
     271           0 :                     pPrtFrm = pPrtFrm->GetNext();
     272             :                 }
     273             :             }
     274             :         }
     275           0 :         break;
     276             :         // #i22341# - vertical alignment at top of line
     277             :         case text::RelOrientation::TEXT_LINE:
     278             :         {
     279           0 :             if ( IsAnchoredToChar() )
     280             :             {
     281           0 :                 nHeight = 0;
     282           0 :                 nOffset = (*fnRect->fnYDiff)( ToCharTopOfLine(), nVertOrientTop );
     283             :             }
     284             :             else
     285             :             {
     286             :                 OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertAlignmentValues(..)> - invalid relative alignment" );
     287             :             }
     288             :         }
     289           0 :         break;
     290             :         case text::RelOrientation::CHAR:
     291             :         {
     292           0 :             if ( IsAnchoredToChar() )
     293             :             {
     294           0 :                 nHeight = (ToCharRect()->*fnRect->fnGetHeight)();
     295           0 :                 nOffset = (*fnRect->fnYDiff)( (ToCharRect()->*fnRect->fnGetTop)(),
     296           0 :                                               nVertOrientTop );
     297             :             }
     298             :             else
     299             :             {
     300             :                 OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertAlignmentValues(..)> - invalid relative alignment" );
     301             :             }
     302             :         }
     303           0 :         break;
     304             :         // no break here, because text::RelOrientation::CHAR is invalid, if !mbAnchorToChar
     305             :         default:
     306             :         {
     307             :             OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertAlignmentValues(..)> - invalid relative alignment" );
     308             :         }
     309             :     }
     310             : 
     311           0 :     _orAlignAreaHeight = nHeight;
     312           0 :     _orAlignAreaOffset = nOffset;
     313           0 : }
     314             : 
     315             : // #i26791# - add output parameter <_roVertOffsetToFrmAnchorPos>
     316           0 : SwTwips SwAnchoredObjectPosition::_GetVertRelPos(
     317             :                                     const SwFrm& _rVertOrientFrm,
     318             :                                     const SwFrm& _rPageAlignLayFrm,
     319             :                                     const sal_Int16 _eVertOrient,
     320             :                                     const sal_Int16 _eRelOrient,
     321             :                                     const SwTwips          _nVertPos,
     322             :                                     const SvxLRSpaceItem& _rLRSpacing,
     323             :                                     const SvxULSpaceItem& _rULSpacing,
     324             :                                     SwTwips& _roVertOffsetToFrmAnchorPos ) const
     325             : {
     326           0 :     SwTwips nRelPosY = 0;
     327           0 :     SWRECTFN( (&_rVertOrientFrm) );
     328             : 
     329             :     SwTwips nAlignAreaHeight;
     330             :     SwTwips nAlignAreaOffset;
     331             :     _GetVertAlignmentValues( _rVertOrientFrm, _rPageAlignLayFrm,
     332           0 :                              _eRelOrient, nAlignAreaHeight, nAlignAreaOffset );
     333             : 
     334           0 :     nRelPosY = nAlignAreaOffset;
     335           0 :     const SwRect aObjBoundRect( GetAnchoredObj().GetObjRect() );
     336           0 :     const SwTwips nObjHeight = (aObjBoundRect.*fnRect->fnGetHeight)();
     337             : 
     338           0 :     switch ( _eVertOrient )
     339             :     {
     340             :         case text::VertOrientation::NONE:
     341             :         {
     342             :             // 'manual' vertical position
     343           0 :             nRelPosY += _nVertPos;
     344             :         }
     345           0 :         break;
     346             :         case text::VertOrientation::TOP:
     347             :         {
     348             :             //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
     349             :               nRelPosY +=   bVert
     350             :                             ? ( bVertL2R
     351             :                                 ? _rLRSpacing.GetLeft()
     352             :                                 : _rLRSpacing.GetRight() )
     353           0 :                             : _rULSpacing.GetUpper();
     354             :         }
     355           0 :         break;
     356             :         case text::VertOrientation::CENTER:
     357             :         {
     358           0 :             nRelPosY += (nAlignAreaHeight / 2) - (nObjHeight / 2);
     359             :         }
     360           0 :         break;
     361             :         case text::VertOrientation::BOTTOM:
     362             :         {
     363             :             //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
     364           0 :             nRelPosY += nAlignAreaHeight -
     365           0 :                         ( nObjHeight + ( bVert
     366             :                                          ? ( bVertL2R
     367             :                                              ? _rLRSpacing.GetRight()
     368             :                                              : _rLRSpacing.GetLeft() )
     369           0 :                                          : _rULSpacing.GetLower() ) );
     370             :         }
     371           0 :         break;
     372             :         default:
     373             :         {
     374             :             OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertRelPos(..) - invalid vertical positioning" );
     375             :         }
     376             :     }
     377             : 
     378             :     // #i26791#
     379           0 :     _roVertOffsetToFrmAnchorPos = nAlignAreaOffset;
     380             : 
     381           0 :     return nRelPosY;
     382             : }
     383             : 
     384             : /** adjust calculated vertical in order to keep object inside
     385             :     'page' alignment layout frame.
     386             : 
     387             :     #i28701# - parameter <_nTopOfAnch> and <_bVert> added
     388             :     #i31805# - add parameter <_bCheckBottom>
     389             :     #i26945# - add parameter <_bFollowTextFlow>
     390             :     #i62875# - method now private and renamed.
     391             :     OD 2009-09-01 #mongolianlayout# - add parameter <bVertL2R>
     392             : */
     393           0 : SwTwips SwAnchoredObjectPosition::_ImplAdjustVertRelPos( const SwTwips nTopOfAnch,
     394             :                                                          const bool bVert,
     395             :                                                          const bool bVertL2R,
     396             :                                                          const SwFrm& rPageAlignLayFrm,
     397             :                                                          const SwTwips nProposedRelPosY,
     398             :                                                          const bool bFollowTextFlow,
     399             :                                                          const bool bCheckBottom ) const
     400             : {
     401           0 :     SwTwips nAdjustedRelPosY = nProposedRelPosY;
     402             : 
     403           0 :     const Size aObjSize( GetAnchoredObj().GetObjRect().SSize() );
     404             : 
     405             :     // determine the area of 'page' alignment frame, to which the vertical
     406             :     // position is restricted.
     407             :     // #i28701# - Extend restricted area for the vertical
     408             :     // position to area of the page frame, if wrapping style influence is
     409             :     // considered on object positioning. Needed to avoid layout loops in the
     410             :     // object positioning algorithm considering the wrapping style influence
     411             :     // caused by objects, which follow the text flow and thus are restricted
     412             :     // to its environment (e.g. page header/footer).
     413           0 :     SwRect aPgAlignArea;
     414             :     {
     415             :         // #i26945# - no extension of restricted area, if
     416             :         // object's attribute follow text flow is set and its inside a table
     417           0 :         if ( GetFrmFmt().getIDocumentSettingAccess()->get(IDocumentSettingAccess::CONSIDER_WRAP_ON_OBJECT_POSITION) &&
     418           0 :              ( !bFollowTextFlow ||
     419           0 :                !GetAnchoredObj().GetAnchorFrm()->IsInTab() ) )
     420             :         {
     421           0 :             aPgAlignArea = rPageAlignLayFrm.FindPageFrm()->Frm();
     422             :         }
     423             :         else
     424             :         {
     425           0 :             aPgAlignArea = rPageAlignLayFrm.Frm();
     426             :         }
     427             :     }
     428             : 
     429           0 :     if ( bVert )
     430             :     {
     431             :         // #i31805# - consider value of <_bCheckBottom>
     432           0 :         if ( !bVertL2R )
     433             :         {
     434           0 :             if ( bCheckBottom &&
     435           0 :                  nTopOfAnch - nAdjustedRelPosY - aObjSize.Width() <
     436           0 :                     aPgAlignArea.Left() )
     437             :             {
     438           0 :                 nAdjustedRelPosY = aPgAlignArea.Left() +
     439             :                                    nTopOfAnch -
     440           0 :                                    aObjSize.Width();
     441             :             }
     442             :         // #i32964# - correction
     443           0 :             if ( nTopOfAnch - nAdjustedRelPosY > aPgAlignArea.Right() )
     444             :             {
     445           0 :                 nAdjustedRelPosY = nTopOfAnch - aPgAlignArea.Right();
     446             :             }
     447             :         }
     448             :         else
     449             :         {
     450           0 :             if ( bCheckBottom &&
     451           0 :                  nTopOfAnch + nAdjustedRelPosY + aObjSize.Width() >
     452           0 :                     aPgAlignArea.Right() )
     453             :             {
     454           0 :                 nAdjustedRelPosY = aPgAlignArea.Right() -
     455             :                                    nTopOfAnch -
     456           0 :                                    aObjSize.Width();
     457             :             }
     458           0 :             if ( nTopOfAnch + nAdjustedRelPosY < aPgAlignArea.Left() )
     459             :             {
     460           0 :                 nAdjustedRelPosY = aPgAlignArea.Left() - nTopOfAnch;
     461             :             }
     462             :         }
     463             :     }
     464             :     else
     465             :     {
     466             :         // #i31805# - consider value of <bCheckBottom>
     467           0 :         if ( bCheckBottom &&
     468           0 :              nTopOfAnch + nAdjustedRelPosY + aObjSize.Height() >
     469           0 :                 aPgAlignArea.Top() + aPgAlignArea.Height() )
     470             :         {
     471           0 :             nAdjustedRelPosY = aPgAlignArea.Top() + aPgAlignArea.Height() -
     472             :                                nTopOfAnch -
     473           0 :                                aObjSize.Height();
     474             :         }
     475           0 :         if ( nTopOfAnch + nAdjustedRelPosY < aPgAlignArea.Top() )
     476             :         {
     477           0 :             nAdjustedRelPosY = aPgAlignArea.Top() - nTopOfAnch;
     478             :         }
     479             :     }
     480             : 
     481           0 :     return nAdjustedRelPosY;
     482             : }
     483             : 
     484             : /** adjust calculated horizontal in order to keep object inside
     485             :     'page' alignment layout frame.
     486             : 
     487             :     #i62875# - method now private and renamed.
     488             : */
     489           0 : SwTwips SwAnchoredObjectPosition::_ImplAdjustHoriRelPos(
     490             :                                         const SwFrm&  _rPageAlignLayFrm,
     491             :                                         const SwTwips _nProposedRelPosX ) const
     492             : {
     493           0 :     SwTwips nAdjustedRelPosX = _nProposedRelPosX;
     494             : 
     495           0 :     const SwFrm& rAnchorFrm = GetAnchorFrm();
     496           0 :     const bool bVert = rAnchorFrm.IsVertical();
     497             : 
     498           0 :     const Size aObjSize( GetAnchoredObj().GetObjRect().SSize() );
     499             : 
     500           0 :     if( bVert )
     501             :     {
     502           0 :         if ( rAnchorFrm.Frm().Top() + nAdjustedRelPosX + aObjSize.Height() >
     503           0 :                 _rPageAlignLayFrm.Frm().Bottom() )
     504             :         {
     505           0 :             nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Bottom() -
     506           0 :                                rAnchorFrm.Frm().Top() -
     507           0 :                                aObjSize.Height();
     508             :         }
     509           0 :         if ( rAnchorFrm.Frm().Top() + nAdjustedRelPosX <
     510           0 :                 _rPageAlignLayFrm.Frm().Top() )
     511             :         {
     512           0 :             nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Top() -
     513           0 :                                rAnchorFrm.Frm().Top();
     514             :         }
     515             :     }
     516             :     else
     517             :     {
     518           0 :         if ( rAnchorFrm.Frm().Left() + nAdjustedRelPosX + aObjSize.Width() >
     519           0 :                 _rPageAlignLayFrm.Frm().Right() )
     520             :         {
     521           0 :             nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Right() -
     522           0 :                                rAnchorFrm.Frm().Left() -
     523           0 :                                aObjSize.Width();
     524             :         }
     525           0 :         if ( rAnchorFrm.Frm().Left() + nAdjustedRelPosX <
     526           0 :                 _rPageAlignLayFrm.Frm().Left() )
     527             :         {
     528           0 :             nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Left() -
     529           0 :                                rAnchorFrm.Frm().Left();
     530             :         }
     531             :     }
     532             : 
     533           0 :     return nAdjustedRelPosX;
     534             : }
     535             : 
     536             : /** determine alignment value for horizontal position of object */
     537           0 : void SwAnchoredObjectPosition::_GetHoriAlignmentValues( const SwFrm&  _rHoriOrientFrm,
     538             :                                                         const SwFrm&  _rPageAlignLayFrm,
     539             :                                                         const sal_Int16 _eRelOrient,
     540             :                                                         const bool    _bObjWrapThrough,
     541             :                                                         SwTwips&      _orAlignAreaWidth,
     542             :                                                         SwTwips&      _orAlignAreaOffset,
     543             :                                                         bool&         _obAlignedRelToPage ) const
     544             : {
     545           0 :     SwTwips nWidth = 0;
     546           0 :     SwTwips nOffset = 0;
     547           0 :     SWRECTFN( (&_rHoriOrientFrm) )
     548           0 :     switch ( _eRelOrient )
     549             :     {
     550             :         case text::RelOrientation::PRINT_AREA:
     551             :         {
     552           0 :             nWidth = (_rHoriOrientFrm.Prt().*fnRect->fnGetWidth)();
     553           0 :             nOffset = (_rHoriOrientFrm.*fnRect->fnGetLeftMargin)();
     554           0 :             if ( _rHoriOrientFrm.IsTxtFrm() )
     555             :             {
     556             :                 // consider movement of text frame left
     557           0 :                 nOffset += static_cast<const SwTxtFrm&>(_rHoriOrientFrm).GetBaseOfstForFly( !_bObjWrapThrough );
     558             :             }
     559           0 :             else if ( _rHoriOrientFrm.IsPageFrm() && bVert )
     560             :             {
     561             :                 // for to-page anchored objects, consider header/footer frame
     562             :                 // in vertical layout
     563             :                 const SwFrm* pPrtFrm =
     564           0 :                         static_cast<const SwPageFrm&>(_rHoriOrientFrm).Lower();
     565           0 :                 while( pPrtFrm )
     566             :                 {
     567           0 :                     if( pPrtFrm->IsHeaderFrm() )
     568             :                     {
     569           0 :                         nWidth -= pPrtFrm->Frm().Height();
     570           0 :                         nOffset += pPrtFrm->Frm().Height();
     571             :                     }
     572           0 :                     else if( pPrtFrm->IsFooterFrm() )
     573             :                     {
     574           0 :                         nWidth -= pPrtFrm->Frm().Height();
     575             :                     }
     576           0 :                     pPrtFrm = pPrtFrm->GetNext();
     577             :                 }
     578             :             }
     579           0 :             break;
     580             :         }
     581             :         case text::RelOrientation::PAGE_LEFT:
     582             :         {
     583             :             // align at left border of page frame/fly frame/cell frame
     584           0 :             nWidth = (_rPageAlignLayFrm.*fnRect->fnGetLeftMargin)();
     585             :             nOffset = (*fnRect->fnXDiff)(
     586           0 :                       (_rPageAlignLayFrm.Frm().*fnRect->fnGetLeft)(),
     587           0 :                       (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
     588           0 :             _obAlignedRelToPage = true;
     589             :         }
     590           0 :         break;
     591             :         case text::RelOrientation::PAGE_RIGHT:
     592             :         {
     593             :             // align at right border of page frame/fly frame/cell frame
     594           0 :             nWidth = (_rPageAlignLayFrm.*fnRect->fnGetRightMargin)();
     595             :             nOffset = (*fnRect->fnXDiff)(
     596           0 :                       (_rPageAlignLayFrm.*fnRect->fnGetPrtRight)(),
     597           0 :                       (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
     598           0 :             _obAlignedRelToPage = true;
     599             :         }
     600           0 :         break;
     601             :         case text::RelOrientation::FRAME_LEFT:
     602             :         {
     603             :             // align at left border of anchor frame
     604           0 :             nWidth = (_rHoriOrientFrm.*fnRect->fnGetLeftMargin)();
     605           0 :             nOffset = 0;
     606             :         }
     607           0 :         break;
     608             :         case text::RelOrientation::FRAME_RIGHT:
     609             :         {
     610             :             // align at right border of anchor frame
     611             :             // Unify and simplify
     612           0 :             nWidth = (_rHoriOrientFrm.*fnRect->fnGetRightMargin)();
     613           0 :             nOffset = (_rHoriOrientFrm.Prt().*fnRect->fnGetRight)();
     614             :         }
     615           0 :         break;
     616             :         case text::RelOrientation::CHAR:
     617             :         {
     618             :             // alignment relative to character - assure, that corresponding
     619             :             // character rectangle is set.
     620           0 :             if ( IsAnchoredToChar() )
     621             :             {
     622           0 :                 nWidth = 0;
     623             :                 nOffset = (*fnRect->fnXDiff)(
     624           0 :                             (ToCharRect()->*fnRect->fnGetLeft)(),
     625           0 :                             (ToCharOrientFrm()->Frm().*fnRect->fnGetLeft)() );
     626           0 :                 break;
     627             :             }
     628             :             // no break!
     629             :         }
     630             :         case text::RelOrientation::PAGE_PRINT_AREA:
     631             :         {
     632           0 :             nWidth = (_rPageAlignLayFrm.Prt().*fnRect->fnGetWidth)();
     633             :             nOffset = (*fnRect->fnXDiff)(
     634           0 :                         (_rPageAlignLayFrm.*fnRect->fnGetPrtLeft)(),
     635           0 :                         (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
     636           0 :             if ( _rHoriOrientFrm.IsPageFrm() && bVert )
     637             :             {
     638             :                 // for to-page anchored objects, consider header/footer frame
     639             :                 // in vertical layout
     640             :                 const SwFrm* pPrtFrm =
     641           0 :                         static_cast<const SwPageFrm&>(_rHoriOrientFrm).Lower();
     642           0 :                 while( pPrtFrm )
     643             :                 {
     644           0 :                     if( pPrtFrm->IsHeaderFrm() )
     645             :                     {
     646           0 :                         nWidth -= pPrtFrm->Frm().Height();
     647           0 :                         nOffset += pPrtFrm->Frm().Height();
     648             :                     }
     649           0 :                     else if( pPrtFrm->IsFooterFrm() )
     650             :                     {
     651           0 :                         nWidth -= pPrtFrm->Frm().Height();
     652             :                     }
     653           0 :                     pPrtFrm = pPrtFrm->GetNext();
     654             :                 }
     655             :             }
     656           0 :             _obAlignedRelToPage = true;
     657           0 :             break;
     658             :         }
     659             :         case text::RelOrientation::PAGE_FRAME:
     660             :         {
     661           0 :             nWidth = (_rPageAlignLayFrm.Frm().*fnRect->fnGetWidth)();
     662             :             nOffset = (*fnRect->fnXDiff)(
     663           0 :                         (_rPageAlignLayFrm.Frm().*fnRect->fnGetLeft)(),
     664           0 :                         (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
     665           0 :             _obAlignedRelToPage = true;
     666           0 :             break;
     667             :         }
     668             :         default:
     669             :         {
     670           0 :             nWidth = (_rHoriOrientFrm.Frm().*fnRect->fnGetWidth)();
     671           0 :             nOffset = _rHoriOrientFrm.IsTxtFrm() ?
     672           0 :                    static_cast<const SwTxtFrm&>(_rHoriOrientFrm).GetBaseOfstForFly( !_bObjWrapThrough ) :
     673           0 :                    0;
     674           0 :             break;
     675             :         }
     676             :     }
     677             : 
     678           0 :     _orAlignAreaWidth = nWidth;
     679           0 :     _orAlignAreaOffset = nOffset;
     680           0 : }
     681             : 
     682             : /** toggle given horizontal orientation and relative alignment */
     683           0 : void SwAnchoredObjectPosition::_ToggleHoriOrientAndAlign(
     684             :                                         const bool _bToggleLeftRight,
     685             :                                         sal_Int16& _ioeHoriOrient,
     686             :                                         sal_Int16& _iopeRelOrient
     687             :                                       ) const
     688             : {
     689           0 :     if( _bToggleLeftRight )
     690             :     {
     691             :         // toggle orientation
     692           0 :         switch ( _ioeHoriOrient )
     693             :         {
     694             :             case text::HoriOrientation::RIGHT :
     695             :                 {
     696           0 :                     _ioeHoriOrient = text::HoriOrientation::LEFT;
     697             :                 }
     698           0 :                 break;
     699             :             case text::HoriOrientation::LEFT :
     700             :                 {
     701           0 :                     _ioeHoriOrient = text::HoriOrientation::RIGHT;
     702             :                 }
     703           0 :                 break;
     704             :             default:
     705           0 :                 break;
     706             :         }
     707             : 
     708             :         // toggle relative alignment
     709           0 :         switch ( _iopeRelOrient )
     710             :         {
     711             :             case text::RelOrientation::PAGE_RIGHT :
     712             :                 {
     713           0 :                     _iopeRelOrient = text::RelOrientation::PAGE_LEFT;
     714             :                 }
     715           0 :                 break;
     716             :             case text::RelOrientation::PAGE_LEFT :
     717             :                 {
     718           0 :                     _iopeRelOrient = text::RelOrientation::PAGE_RIGHT;
     719             :                 }
     720           0 :                 break;
     721             :             case text::RelOrientation::FRAME_RIGHT :
     722             :                 {
     723           0 :                     _iopeRelOrient = text::RelOrientation::FRAME_LEFT;
     724             :                 }
     725           0 :                 break;
     726             :             case text::RelOrientation::FRAME_LEFT :
     727             :                 {
     728           0 :                     _iopeRelOrient = text::RelOrientation::FRAME_RIGHT;
     729             :                 }
     730           0 :                 break;
     731             :             default:
     732           0 :                 break;
     733             :         }
     734             :     }
     735           0 : }
     736             : 
     737             : /** calculate relative horizontal position */
     738           0 : SwTwips SwAnchoredObjectPosition::_CalcRelPosX(
     739             :                                 const SwFrm& _rHoriOrientFrm,
     740             :                                 const SwEnvironmentOfAnchoredObject& _rEnvOfObj,
     741             :                                 const SwFmtHoriOrient& _rHoriOrient,
     742             :                                 const SvxLRSpaceItem& _rLRSpacing,
     743             :                                 const SvxULSpaceItem& _rULSpacing,
     744             :                                 const bool _bObjWrapThrough,
     745             :                                 const SwTwips _nRelPosY,
     746             :                                 SwTwips& _roHoriOffsetToFrmAnchorPos
     747             :                               ) const
     748             : {
     749             :     // determine 'page' alignment layout frame
     750             :     const SwFrm& rPageAlignLayFrm =
     751           0 :             _rEnvOfObj.GetHoriEnvironmentLayoutFrm( _rHoriOrientFrm );
     752             : 
     753           0 :     const bool bEvenPage = !rPageAlignLayFrm.OnRightPage();
     754           0 :     const bool bToggle = _rHoriOrient.IsPosToggle() && bEvenPage;
     755             : 
     756             :     // determine orientation and relative alignment
     757           0 :     sal_Int16 eHoriOrient = _rHoriOrient.GetHoriOrient();
     758           0 :     sal_Int16 eRelOrient = _rHoriOrient.GetRelationOrient();
     759             :     // toggle orientation and relative alignment
     760           0 :     _ToggleHoriOrientAndAlign( bToggle, eHoriOrient, eRelOrient );
     761             : 
     762             :     // determine alignment parameter
     763             :     // <nWidth>:  'width' of alignment area
     764             :     // <nOffset>: offset of alignment area, relative to 'left' of anchor frame
     765           0 :     SwTwips nWidth = 0;
     766           0 :     SwTwips nOffset = 0;
     767           0 :     bool bAlignedRelToPage = false;
     768             :     _GetHoriAlignmentValues( _rHoriOrientFrm, rPageAlignLayFrm,
     769             :                              eRelOrient, _bObjWrapThrough,
     770           0 :                              nWidth, nOffset, bAlignedRelToPage );
     771             : 
     772           0 :     const SwFrm& rAnchorFrm = GetAnchorFrm();
     773           0 :     SWRECTFN( (&_rHoriOrientFrm) )
     774           0 :     SwTwips nObjWidth = (GetAnchoredObj().GetObjRect().*fnRect->fnGetWidth)();
     775           0 :     SwTwips nRelPosX = nOffset;
     776           0 :     if ( _rHoriOrient.GetHoriOrient() == text::HoriOrientation::NONE )
     777             :     {
     778             :         // 'manual' horizonal position
     779           0 :         const bool bR2L = rAnchorFrm.IsRightToLeft();
     780           0 :         if( IsAnchoredToChar() && text::RelOrientation::CHAR == eRelOrient )
     781             :         {
     782           0 :             if( bR2L )
     783           0 :                 nRelPosX -= _rHoriOrient.GetPos();
     784             :             else
     785           0 :                 nRelPosX += _rHoriOrient.GetPos();
     786             :         }
     787           0 :         else if ( bToggle || ( !_rHoriOrient.IsPosToggle() && bR2L ) )
     788             :         {
     789             :             // Correction: consider <nOffset> also for
     790             :             // toggling from left to right.
     791           0 :             nRelPosX += nWidth - nObjWidth - _rHoriOrient.GetPos();
     792             :         }
     793             :         else
     794             :         {
     795           0 :             nRelPosX += _rHoriOrient.GetPos();
     796             :         }
     797             :     }
     798           0 :     else if ( text::HoriOrientation::CENTER == eHoriOrient )
     799           0 :         nRelPosX += (nWidth / 2) - (nObjWidth / 2);
     800           0 :     else if ( text::HoriOrientation::RIGHT == eHoriOrient )
     801           0 :         nRelPosX += nWidth -
     802           0 :                     ( nObjWidth +
     803           0 :                       ( bVert ? _rULSpacing.GetLower() : _rLRSpacing.GetRight() ) );
     804             :     else
     805           0 :         nRelPosX += bVert ? _rULSpacing.GetUpper() : _rLRSpacing.GetLeft();
     806             : 
     807             :     // adjust relative position by distance between anchor frame and
     808             :     // the frame, the object is oriented at.
     809           0 :     if ( &rAnchorFrm != &_rHoriOrientFrm )
     810             :     {
     811           0 :         SwTwips nLeftOrient = (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)();
     812           0 :         SwTwips nLeftAnchor = (rAnchorFrm.Frm().*fnRect->fnGetLeft)();
     813           0 :         nRelPosX += (*fnRect->fnXDiff)( nLeftOrient, nLeftAnchor );
     814             :     }
     815             : 
     816             :     // adjust calculated relative horizontal position, in order to
     817             :     // keep object inside 'page' alignment layout frame
     818             :     const SwFrm& rEnvironmentLayFrm =
     819           0 :             _rEnvOfObj.GetHoriEnvironmentLayoutFrm( _rHoriOrientFrm );
     820           0 :     nRelPosX = _AdjustHoriRelPos( rEnvironmentLayFrm, nRelPosX );
     821             : 
     822             :     // if object is a Writer fly frame and it's anchored to a content and
     823             :     // it is horizontal positioned left or right, but not relative to character,
     824             :     // it has to be drawn aside another object, which have the same horizontal
     825             :     // position and lay below it.
     826           0 :     if ( GetAnchoredObj().ISA(SwFlyFrm) &&
     827           0 :          ( GetContact().ObjAnchoredAtPara() || GetContact().ObjAnchoredAtChar() ) &&
     828           0 :          ( eHoriOrient == text::HoriOrientation::LEFT || eHoriOrient == text::HoriOrientation::RIGHT ) &&
     829           0 :          eRelOrient != text::RelOrientation::CHAR )
     830             :     {
     831             :         nRelPosX = _AdjustHoriRelPosForDrawAside( _rHoriOrientFrm,
     832             :                                                   nRelPosX, _nRelPosY,
     833             :                                                   eHoriOrient, eRelOrient,
     834             :                                                   _rLRSpacing, _rULSpacing,
     835           0 :                                                   bEvenPage );
     836             :     }
     837             : 
     838             :     // #i26791#
     839           0 :     _roHoriOffsetToFrmAnchorPos = nOffset;
     840             : 
     841           0 :     return nRelPosX;
     842             : }
     843             : 
     844             : // **************************************************************************
     845             : // method incl. helper methods for adjusting proposed horizontal position,
     846             : // if object has to draw aside another object.
     847             : // **************************************************************************
     848             : /** adjust calculated horizontal position in order to draw object
     849             :     aside other objects with same positioning
     850             : */
     851           0 : SwTwips SwAnchoredObjectPosition::_AdjustHoriRelPosForDrawAside(
     852             :                                             const SwFrm&  _rHoriOrientFrm,
     853             :                                             const SwTwips _nProposedRelPosX,
     854             :                                             const SwTwips _nRelPosY,
     855             :                                             const sal_Int16 _eHoriOrient,
     856             :                                             const sal_Int16 _eRelOrient,
     857             :                                             const SvxLRSpaceItem& _rLRSpacing,
     858             :                                             const SvxULSpaceItem& _rULSpacing,
     859             :                                             const bool _bEvenPage
     860             :                                           ) const
     861             : {
     862             :     // #i26791#
     863           0 :     if ( !GetAnchorFrm().ISA(SwTxtFrm) ||
     864           0 :          !GetAnchoredObj().ISA(SwFlyAtCntFrm) )
     865             :     {
     866             :         OSL_FAIL( "<SwAnchoredObjectPosition::_AdjustHoriRelPosForDrawAside(..) - usage for wrong anchor type" );
     867           0 :         return _nProposedRelPosX;
     868             :     }
     869             : 
     870           0 :     const SwTxtFrm& rAnchorTxtFrm = static_cast<const SwTxtFrm&>(GetAnchorFrm());
     871             :     // #i26791#
     872             :     const SwFlyAtCntFrm& rFlyAtCntFrm =
     873           0 :                         static_cast<const SwFlyAtCntFrm&>(GetAnchoredObj());
     874           0 :     const SwRect aObjBoundRect( GetAnchoredObj().GetObjRect() );
     875           0 :     SWRECTFN( (&_rHoriOrientFrm) )
     876             : 
     877           0 :     SwTwips nAdjustedRelPosX = _nProposedRelPosX;
     878             : 
     879             :     // determine proposed object bound rectangle
     880           0 :     Point aTmpPos = (rAnchorTxtFrm.Frm().*fnRect->fnGetPos)();
     881           0 :     if( bVert )
     882             :     {
     883           0 :         aTmpPos.X() -= _nRelPosY + aObjBoundRect.Width();
     884           0 :         aTmpPos.Y() += nAdjustedRelPosX;
     885             :     }
     886             :     else
     887             :     {
     888           0 :         aTmpPos.X() += nAdjustedRelPosX;
     889           0 :         aTmpPos.Y() += _nRelPosY;
     890             :     }
     891           0 :     SwRect aTmpObjRect( aTmpPos, aObjBoundRect.SSize() );
     892             : 
     893           0 :     const sal_uInt32 nObjOrdNum = GetObject().GetOrdNum();
     894           0 :     const SwPageFrm* pObjPage = rFlyAtCntFrm.FindPageFrm();
     895           0 :     const SwFrm* pObjContext = ::FindKontext( &rAnchorTxtFrm, FRM_COLUMN );
     896           0 :     sal_uLong nObjIndex = rAnchorTxtFrm.GetTxtNode()->GetIndex();
     897           0 :     SwOrderIter aIter( pObjPage, sal_True );
     898           0 :     const SwFlyFrm* pFly = ((SwVirtFlyDrawObj*)aIter.Bottom())->GetFlyFrm();
     899           0 :     while ( pFly && nObjOrdNum > pFly->GetVirtDrawObj()->GetOrdNumDirect() )
     900             :     {
     901           0 :         if ( _DrawAsideFly( pFly, aTmpObjRect, pObjContext, nObjIndex,
     902           0 :                            _bEvenPage, _eHoriOrient, _eRelOrient ) )
     903             :         {
     904           0 :             if( bVert )
     905             :             {
     906           0 :                 const SvxULSpaceItem& rOtherUL = pFly->GetFmt()->GetULSpace();
     907           0 :                 const SwTwips nOtherTop = pFly->Frm().Top() - rOtherUL.GetUpper();
     908           0 :                 const SwTwips nOtherBot = pFly->Frm().Bottom() + rOtherUL.GetLower();
     909           0 :                 if ( nOtherTop <= aTmpObjRect.Bottom() + _rULSpacing.GetLower() &&
     910           0 :                      nOtherBot >= aTmpObjRect.Top() - _rULSpacing.GetUpper() )
     911             :                 {
     912           0 :                     if ( _eHoriOrient == text::HoriOrientation::LEFT )
     913             :                     {
     914           0 :                         SwTwips nTmp = nOtherBot + 1 + _rULSpacing.GetUpper() -
     915           0 :                                        rAnchorTxtFrm.Frm().Top();
     916           0 :                         if ( nTmp > nAdjustedRelPosX &&
     917           0 :                              rAnchorTxtFrm.Frm().Top() + nTmp +
     918           0 :                              aObjBoundRect.Height() + _rULSpacing.GetLower()
     919           0 :                              <= pObjPage->Frm().Height() + pObjPage->Frm().Top() )
     920             :                         {
     921           0 :                             nAdjustedRelPosX = nTmp;
     922             :                         }
     923             :                     }
     924           0 :                     else if ( _eHoriOrient == text::HoriOrientation::RIGHT )
     925             :                     {
     926           0 :                         SwTwips nTmp = nOtherTop - 1 - _rULSpacing.GetLower() -
     927           0 :                                        aObjBoundRect.Height() -
     928           0 :                                        rAnchorTxtFrm.Frm().Top();
     929           0 :                         if ( nTmp < nAdjustedRelPosX &&
     930           0 :                              rAnchorTxtFrm.Frm().Top() + nTmp - _rULSpacing.GetUpper()
     931           0 :                               >= pObjPage->Frm().Top() )
     932             :                         {
     933           0 :                             nAdjustedRelPosX = nTmp;
     934             :                         }
     935             :                     }
     936           0 :                     aTmpObjRect.Pos().Y() = rAnchorTxtFrm.Frm().Top() +
     937           0 :                                             nAdjustedRelPosX;
     938             :                 }
     939             :             }
     940             :             else
     941             :             {
     942           0 :                 const SvxLRSpaceItem& rOtherLR = pFly->GetFmt()->GetLRSpace();
     943           0 :                 const SwTwips nOtherLeft = pFly->Frm().Left() - rOtherLR.GetLeft();
     944           0 :                 const SwTwips nOtherRight = pFly->Frm().Right() + rOtherLR.GetRight();
     945           0 :                 if( nOtherLeft <= aTmpObjRect.Right() + _rLRSpacing.GetRight() &&
     946           0 :                     nOtherRight >= aTmpObjRect.Left() - _rLRSpacing.GetLeft() )
     947             :                 {
     948           0 :                     if ( _eHoriOrient == text::HoriOrientation::LEFT )
     949             :                     {
     950           0 :                         SwTwips nTmp = nOtherRight + 1 + _rLRSpacing.GetLeft() -
     951           0 :                                        rAnchorTxtFrm.Frm().Left();
     952           0 :                         if ( nTmp > nAdjustedRelPosX &&
     953           0 :                              rAnchorTxtFrm.Frm().Left() + nTmp +
     954           0 :                              aObjBoundRect.Width() + _rLRSpacing.GetRight()
     955           0 :                              <= pObjPage->Frm().Width() + pObjPage->Frm().Left() )
     956             :                         {
     957           0 :                             nAdjustedRelPosX = nTmp;
     958             :                         }
     959             :                     }
     960           0 :                     else if ( _eHoriOrient == text::HoriOrientation::RIGHT )
     961             :                     {
     962           0 :                         SwTwips nTmp = nOtherLeft - 1 - _rLRSpacing.GetRight() -
     963           0 :                                        aObjBoundRect.Width() -
     964           0 :                                        rAnchorTxtFrm.Frm().Left();
     965           0 :                         if ( nTmp < nAdjustedRelPosX &&
     966           0 :                              rAnchorTxtFrm.Frm().Left() + nTmp - _rLRSpacing.GetLeft()
     967           0 :                              >= pObjPage->Frm().Left() )
     968             :                         {
     969           0 :                             nAdjustedRelPosX = nTmp;
     970             :                         }
     971             :                     }
     972           0 :                     aTmpObjRect.Pos().X() = rAnchorTxtFrm.Frm().Left() +
     973           0 :                                             nAdjustedRelPosX;
     974             :                 }
     975             :             } // end of <if (bVert)>
     976             :         } // end of <if _DrawAsideFly(..)>
     977             : 
     978           0 :         pFly = ((SwVirtFlyDrawObj*)aIter.Next())->GetFlyFrm();
     979             :     } // end of <loop on fly frames
     980             : 
     981           0 :     return nAdjustedRelPosX;
     982             : }
     983             : 
     984             : /** detemine, if object has to draw aside given fly frame
     985             : 
     986             :     method used by <_AdjustHoriRelPosForDrawAside(..)>
     987             : */
     988           0 : bool SwAnchoredObjectPosition::_DrawAsideFly( const SwFlyFrm* _pFly,
     989             :                                               const SwRect&   _rObjRect,
     990             :                                               const SwFrm*    _pObjContext,
     991             :                                               const sal_uLong     _nObjIndex,
     992             :                                               const bool      _bEvenPage,
     993             :                                               const sal_Int16 _eHoriOrient,
     994             :                                               const sal_Int16 _eRelOrient
     995             :                                             ) const
     996             : {
     997           0 :     bool bRetVal = false;
     998             : 
     999           0 :     SWRECTFN( (&GetAnchorFrm()) )
    1000             : 
    1001           0 :     if ( _pFly->IsFlyAtCntFrm() &&
    1002           0 :          (_pFly->Frm().*fnRect->fnBottomDist)( (_rObjRect.*fnRect->fnGetTop)() ) < 0 &&
    1003           0 :          (_rObjRect.*fnRect->fnBottomDist)( (_pFly->Frm().*fnRect->fnGetTop)() ) < 0 &&
    1004           0 :          ::FindKontext( _pFly->GetAnchorFrm(), FRM_COLUMN ) == _pObjContext )
    1005             :     {
    1006             :         sal_uLong nOtherIndex =
    1007           0 :             static_cast<const SwTxtFrm*>(_pFly->GetAnchorFrm())->GetTxtNode()->GetIndex();
    1008           0 :         if( _nObjIndex >= nOtherIndex )
    1009             :         {
    1010           0 :             const SwFmtHoriOrient& rHori = _pFly->GetFmt()->GetHoriOrient();
    1011           0 :             sal_Int16 eOtherRelOrient = rHori.GetRelationOrient();
    1012           0 :             if( text::RelOrientation::CHAR != eOtherRelOrient )
    1013             :             {
    1014           0 :                 sal_Int16 eOtherHoriOrient = rHori.GetHoriOrient();
    1015           0 :                 _ToggleHoriOrientAndAlign( _bEvenPage && rHori.IsPosToggle(),
    1016             :                                            eOtherHoriOrient,
    1017           0 :                                            eOtherRelOrient );
    1018           0 :                 if ( eOtherHoriOrient == _eHoriOrient &&
    1019           0 :                     _Minor( _eRelOrient, eOtherRelOrient, text::HoriOrientation::LEFT == _eHoriOrient ) )
    1020             :                 {
    1021           0 :                     bRetVal = true;
    1022             :                 }
    1023             :             }
    1024             :         }
    1025             :     }
    1026             : 
    1027           0 :     return bRetVal;
    1028             : }
    1029             : 
    1030             : /** determine, if object has to draw aside another object
    1031             : 
    1032             :     the different alignments of the objects determines, if one has
    1033             :     to draw aside another one. Thus, the given alignment are checked
    1034             :     against each other, which one has to be drawn aside the other one.
    1035             :     depending on parameter _bLeft check is done for left or right
    1036             :     positioning.
    1037             :     method used by <_DrawAsideFly(..)>
    1038             : */
    1039           0 : bool SwAnchoredObjectPosition::_Minor( sal_Int16 _eRelOrient1,
    1040             :                                        sal_Int16 _eRelOrient2,
    1041             :                                        bool             _bLeft ) const
    1042             : {
    1043             :     bool bRetVal;
    1044             : 
    1045             :     // draw aside order for left horizontal position
    1046             :     //! one array entry for each value in text::RelOrientation
    1047             :     static sal_uInt16 const aLeft[ 10 ] =
    1048             :         { 5, 6, 0, 1, 8, 4, 7, 2, 3, 9 };
    1049             :     // draw aside order for right horizontal position
    1050             :     //! one array entry for each value in text::RelOrientation
    1051             :     static sal_uInt16 const aRight[ 10 ] =
    1052             :         { 5, 6, 0, 8, 1, 7, 4, 2, 3, 9 };
    1053             : 
    1054             :     // decide depending on given order, which frame has to draw aside another frame
    1055           0 :     if( _bLeft )
    1056           0 :         bRetVal = aLeft[ _eRelOrient1 ] >= aLeft[ _eRelOrient2 ];
    1057             :     else
    1058           0 :         bRetVal = aRight[ _eRelOrient1 ] >= aRight[ _eRelOrient2 ];
    1059             : 
    1060           0 :     return bRetVal;
    1061             : }
    1062             : 
    1063             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10