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

Generated by: LCOV version 1.10