/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
SwFlyFreeFrame::~SwFlyFreeFrame()
{ #if 0 // we are possibly in ContourCache, make sure we vanish
::ClrContourCache(GetVirtDrawObj()); #endif
}
// #i28701# /** Notifies the background (all ContentFrames that currently are overlapping). * * Additionally, the window is also directly invalidated (especially where * there are no overlapping ContentFrames). * This also takes ContentFrames within other Flys into account.
*/ void SwFlyFreeFrame::NotifyBackground( SwPageFrame *pPageFrame, const SwRect& rRect, PrepareHint eHint )
{
::Notify_Background( GetVirtDrawObj(), pPageFrame, rRect, eHint, true );
}
// takes care of the notification in the dtor const SwFlyNotify aNotify( this );
if ( IsClipped() )
{
setFrameAreaSizeValid(false);
m_bHeightClipped = m_bWidthClipped = false; // no invalidation of position, // if anchored object is anchored inside a Writer fly frame, // its position is already locked, and it follows the text flow. // #i34753# - add condition: // no invalidation of position, if no direct move is requested in <CheckClip(..)> if ( !IsNoMoveOnCheckClip() &&
!( PositionLocked() &&
GetAnchorFrame()->IsInFly() &&
GetFrameFormat()->GetFollowTextFlow().GetValue() ) )
{
setFrameAreaPositionValid(false);
}
}
// #i81146# new loop control int nLoopControlRuns = 0; constint nLoopControlMax = 10;
if(bRotated)
{ // Re-layout may be partially (see all isFrameAreaDefinitionValid() flags), // so resetting the local SwFrame(s) in the local SwFrameAreaDefinition is // needed. Reset to BoundAreas will be done below automatically if(isTransformableSwFrame())
{
getTransformableSwFrame()->restoreFrameAreas();
}
}
while ( !isFrameAreaPositionValid() || !isFrameAreaSizeValid() || !isFramePrintAreaValid() || m_bFormatHeightOnly || !m_bValidContentPos )
{
SwRectFnSet aRectFnSet(this); const SwFormatFrameSize *pSz;
{ // Additional scope, so aAccess will be destroyed before the check!
// RotateFlyFrame3 - outer frame // Do not refresh transforms/Areas self here, this will be done // when inner and outer frame are layouted, in SwNoTextFrame::MakeAll if(bRotated)
{ // RotateFlyFrame3: Safe changes locally // get center from outer frame (layout frame) to be on the safe side const Point aCenter(getFrameArea().Center()); const basegfx::B2DPoint aB2DCenter(aCenter.X(), aCenter.Y());
getTransformableSwFrame()->createFrameAreaTransformations(
fRotation,
aB2DCenter);
getTransformableSwFrame()->adaptFrameAreasToTransformations();
} else
{ // RotateFlyFrame3: Also need to clear ContourCache (if used), // usually done in SwFlyFrame::NotifyDrawObj, but there relies on // being in transform mode which is already reset then if(isTransformableSwFrame())
{
::ClrContourCache(GetVirtDrawObj());
}
// reset transformations to show that they are not used
mpTransformableSwFrame.reset();
}
// RotateFlyFrameFix: For LO6.0 we need to deactivate the AutoContour feature again, it is simply // not clear how/if to use and save/load it in ODF. This has to be discussed. // The reason not to remove is that this may be used as-is now, using a new switch. // Even when not, the detection if it is possible will be needed in any case later. if(bOverrideHandleContourToAlwaysOff)
{ returnfalse;
}
if(!isTransformableSwFrame())
{ // support only when transformed, else there is no free space returnfalse;
}
// Check for Borders. If we have Borders, do (currently) not support, // since borders do not transform with the object. // (Will need to be enhanced to take into account if we have Borders and if these // transform with the object)
SwBorderAttrAccess aAccess(SwFrame::GetCache(), this); const SwBorderAttrs &rAttrs(*aAccess.Get());
if(rAttrs.IsLine())
{ returnfalse;
}
// Check for Padding. Do not support when padding is used, this will // produce a covered space around the object (filled with fill defines) const SvxBoxItem* pBoxItem(nullptr);
// check for Fill - if we have fill, it will fill the gaps and we will not // support AutoContour if(GetFormat() && GetFormat()->supportsFullDrawingLayerFillAttributeSet())
{ const drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes(GetFormat()->getSdrAllFillAttributesHelper());
// RotateFlyFrame3 - Support for Transformations void SwFlyFreeFrame::transform_translate(const Point& rOffset)
{ // call parent - this will do the basic transform for SwRect(s) // in the SwFrameAreaDefinition
SwFlyFrame::transform_translate(rOffset);
// check if the Transformations need to be adapted if(isTransformableSwFrame())
{ const basegfx::B2DHomMatrix aTransform(
basegfx::utils::createTranslateB2DHomMatrix(
rOffset.X(), rOffset.Y()));
// transform using TransformableSwFrame
getTransformableSwFrame()->transform(aTransform);
}
}
/** determines, if direct environment of fly frame has 'auto' size
#i17297# start with anchor frame and search via <GetUpper()> for a header, footer, row or fly frame stopping at page frame. return <true>, if such a frame is found and it has 'auto' size. otherwise <false> is returned.
@return boolean indicating, that direct environment has 'auto' size
*/ bool SwFlyFreeFrame::HasEnvironmentAutoSize() const
{ bool bRetVal = false;
void SwFlyFreeFrame::CheckClip( const SwFormatFrameSize &rSz )
{ // It's probably time now to take appropriate measures, if the Fly // doesn't fit into its surrounding. // First, the Fly gives up its position, then it's formatted. // Only if it still doesn't fit after giving up its position, the // width or height are given up as well. The frame will be squeezed // as much as needed.
constbool bBot = nBot > nClipBot; constbool bRig = nRig > nClipRig; if (( bBot || bRig ) && !IsDraggingOffPageAllowed(FindFrameFormat(GetDrawObj())))
{ bool bAgain = false; // #i37068# - no move, if it's requested if ( bBot && !IsNoMoveOnCheckClip() &&
!GetDrawObjs() && !GetAnchorFrame()->IsInTab() )
{
SwFrame* pHeader = FindFooterOrHeader(); // In a header, correction of the position is no good idea. // If the fly moves, some paragraphs have to be formatted, this // could cause a change of the height of the headerframe, // now the flyframe can change its position and so on ... if ( !pHeader || !pHeader->IsHeaderFrame() )
{ const tools::Long nOld = getFrameArea().Top();
// tdf#112443 disable positioning if content is completely off page bool bDisableOffPagePositioning = GetFormat()->getIDocumentSettingAccess().get(DocumentSettingId::DISABLE_OFF_PAGE_POSITIONING); if ( !bDisableOffPagePositioning || nOld <= nClipBot)
{
SwFrameAreaDefinition::FrameAreaWriteAccess aFrm(*this);
aFrm.Pos().setY( std::max( aClip.Top(), nClipBot - aFrm.Height() ) );
}
// tdf#112443 disable positioning if content is completely off page bool bDisableOffPagePositioning = GetFormat()->getIDocumentSettingAccess().get(DocumentSettingId::DISABLE_OFF_PAGE_POSITIONING); if ( !bDisableOffPagePositioning || nOld <= nClipRig )
{
SwFrameAreaDefinition::FrameAreaWriteAccess aFrm(*this);
aFrm.Pos().setX( std::max( aClip.Left(), nClipRig - aFrm.Width() ) );
}
if ( getFrameArea().Left() != nOld )
{ const SwFormatHoriOrient &rH = GetFormat()->GetHoriOrient(); // Left-aligned ones may not be moved to the left when they // are avoiding another one. if( rH.GetHoriOrient() == text::HoriOrientation::LEFT )
{
SwFrameAreaDefinition::FrameAreaWriteAccess aFrm(*this);
aFrm.Pos().setX( nOld );
} else
{
bAgain = true;
}
}
m_bWidthClipped = true;
} if ( bAgain )
{
setFrameAreaSizeValid(false);
} else
{ // If we reach this branch, the Frame protrudes into forbidden // areas, and correcting the position is not allowed or not // possible or not required.
// For Flys with OLE objects as lower, we make sure that // we always resize proportionally
Size aOldSize( getFrameArea().SSize() );
// First, setup the FrameRect, then transfer it to the Frame.
SwRect aFrameRect( getFrameArea() );
// #i17297# - no proportional // scaling of graphics in environments, which determines its size // by its content ('auto' size). Otherwise layout loops can occur and // layout sizes of the environment can be incorrect. // Such environment are: // (1) header and footer frames with 'auto' size // (2) table row frames with 'auto' size // (3) fly frames with 'auto' size // Note: section frames seems to be not critical - didn't found // any critical layout situation so far. if ( Lower() && Lower()->IsNoTextFrame() &&
(static_cast<SwNoTextFrame*>(Lower())->GetNode()->GetOLENode() ||
!HasEnvironmentAutoSize() ) )
{ // If width and height got adjusted, then the bigger // change is relevant. if ( aFrameRect.Width() != aOldSize.Width() &&
aFrameRect.Height()!= aOldSize.Height() )
{ if ( (aOldSize.Width() - aFrameRect.Width()) >
(aOldSize.Height()- aFrameRect.Height()) )
aFrameRect.Height( aOldSize.Height() ); else
aFrameRect.Width( aOldSize.Width() );
}
// #i17297# - reactivate change // of size attribute for fly frames containing an ole object.
// Added the aFrameRect.HasArea() hack, because // the environment of the ole object does not have to be valid // at this moment, or even worse, it does not have to have a // reasonable size. In this case we do not want to change to // attributes permanently. Maybe one day somebody dares to remove // this code. if ( aFrameRect.HasArea() && static_cast<SwNoTextFrame*>(Lower())->GetNode()->GetOLENode() &&
( m_bWidthClipped || m_bHeightClipped ) )
{
SwFlyFrameFormat *pFormat = GetFormat();
pFormat->LockModify();
SwFormatFrameSize aFrameSize( rSz );
aFrameSize.SetWidth( aFrameRect.Width() );
aFrameSize.SetHeight( aFrameRect.Height() );
pFormat->SetFormatAttr( aFrameSize );
pFormat->UnlockModify();
}
}
// Now change the Frame; for columns, we put the new values into the attributes, // otherwise we'll end up with unwanted side-effects/oscillations const tools::Long nPrtHeightDiff = getFrameArea().Height() - getFramePrintArea().Height(); const tools::Long nPrtWidthDiff = getFrameArea().Width() - getFramePrintArea().Width();
maUnclippedFrame = getFrameArea();
ChgLowersProp( aTmpOldSize ); do
{
pLower->Calc(getRootFrame()->GetCurrShell()->GetOut()); // also calculate the (Column)BodyFrame if (SwFrame* pLowerLower = static_cast<SwLayoutFrame*>(pLower)->Lower())
pLowerLower->Calc(getRootFrame()->GetCurrShell()->GetOut());
pLower = pLower->GetNext();
} while ( pLower );
::CalcContent( this );
ColUnlock();
/** method to determine, if a <MakeAll()> on the Writer fly frame is possible #i43771#
*/ bool SwFlyFreeFrame::IsFormatPossible() const
{ return SwFlyFrame::IsFormatPossible() &&
( GetPageFrame() ||
( GetAnchorFrame() && GetAnchorFrame()->IsInFly() ) );
}
// Unregister, get hold of the page, attach to the corresponding LayoutFrame.
SwRect aOld(GetObjRectWithSpaces()); // #i28701# - use new method <GetPageFrame()>
SwPageFrame* pOldPage = GetPageFrame();
AnchorFrame()->RemoveFly(this);
if ( GetUpper() )
{ static_cast<SwRootFrame*>(GetUpper())->SetIdleFlags(); static_cast<SwRootFrame*>(GetUpper())->InvalidateBrowseWidth();
}
SdrObject* pObj = pNew->GetVirtDrawObj();
OSL_ENSURE( pNew->GetAnchorFrame(), "Fly without Anchor" );
SwFlyFrame* pFly = const_cast<SwFlyFrame*>(pNew->GetAnchorFrame()->FindFlyFrame()); if ( pFly && pObj->GetOrdNum() < pFly->GetVirtDrawObj()->GetOrdNum() )
{ //#i119945# set pFly's OrdNum to _rNewObj's. So when pFly is removed by Undo, the original OrdNum will not be changed.
sal_uInt32 nNewNum = pObj->GetOrdNumDirect();
SdrObject* pDrawObj = nullptr; if (auto pFormat = pFly->GetFormat()) if (auto pShapeFormat = SwTextBoxHelper::getOtherTextBoxFormat(pFormat, RES_FLYFRMFMT))
pDrawObj = pShapeFormat->FindRealSdrObject();
if (pDrawObj)
{ if (auto pPage = pDrawObj->getSdrPageFromSdrObject())
pPage->SetObjectOrdNum(pDrawObj->GetOrdNumDirect(), nNewNum); else
pDrawObj->SetOrdNum(nNewNum);
}
// Don't look further at Flys that sit inside the Content. if ( pNew->IsFlyInContentFrame() )
InvalidateFlyInCnt(); else
{
InvalidateFlyContent();
if ( !m_pSortedObjs )
{
m_pSortedObjs.reset(new SwSortedObjs());
}
constbool bSuccessInserted = m_pSortedObjs->Insert( *pNew );
OSL_ENSURE( bSuccessInserted, "Fly not inserted in Sorted." );
// #i87493#
OSL_ENSURE( pNew->GetPageFrame() == nullptr || pNew->GetPageFrame() == this, " - anchored fly frame seems to be registered at another page frame. Serious defect." ); // #i28701# - use new method <SetPageFrame(..)>
pNew->SetPageFrame( this );
pNew->InvalidatePage( this ); // #i28701#
pNew->UnlockPosition(); // needed to reposition at-page anchored flys moved from different page
pNew->InvalidateObjPos();
// Notify accessible layout. That's required at this place for // frames only where the anchor is moved. Creation of new frames // is additionally handled by the SwFrameNotify class. #if !ENABLE_WASM_STRIP_ACCESSIBILITY if( GetUpper() && static_cast< SwRootFrame * >( GetUpper() )->IsAnyShellAccessible() && static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell() )
{ static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell()->Imp()
->AddAccessibleFrame( pNew );
} #endif
}
// #i28701# - correction: consider also drawing objects if ( !pNew->GetDrawObjs() ) return;
SwSortedObjs &rObjs = *pNew->GetDrawObjs(); for (SwAnchoredObject* pTmpObj : rObjs)
{ if ( auto pTmpFly = pTmpObj->DynCastFlyFrame() )
{ // #i28701# - use new method <GetPageFrame()> if ( pTmpFly->IsFlyFreeFrame() && !pTmpFly->GetPageFrame() )
AppendFlyToPage( pTmpFly );
} elseif ( dynamic_cast<const SwAnchoredDrawObject*>( pTmpObj) != nullptr )
{ // #i87493# if ( pTmpObj->GetPageFrame() != this )
{
pTmpObj->RegisterAtPage(*this);
}
}
}
}
if ( GetUpper() )
{ if ( !pToRemove->IsFlyInContentFrame() ) static_cast<SwRootFrame*>(GetUpper())->SetSuperfluous(); static_cast<SwRootFrame*>(GetUpper())->InvalidateBrowseWidth();
}
// Don't look further at Flys that sit inside the Content. if ( pToRemove->IsFlyInContentFrame() ) return;
// Don't delete collections just yet. This will happen at the end of the // action in the RemoveSuperfluous of the page, kicked off by a method of // the same name in the root. // The FlyColl might be gone already, because the page's dtor is being // executed. // Remove it _before_ disposing accessible frames to avoid accesses to // the Frame from event handlers. if (m_pSortedObjs)
{
m_pSortedObjs->Remove(*pToRemove); if (!m_pSortedObjs->size())
{
m_pSortedObjs.reset();
}
}
// Notify accessible layout. That's required at this place for // frames only where the anchor is moved. Creation of new frames // is additionally handled by the SwFrameNotify class. #if !ENABLE_WASM_STRIP_ACCESSIBILITY if( GetUpper() && static_cast< SwRootFrame * >( GetUpper() )->IsAnyShellAccessible() && static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell() )
{ static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell()->Imp()
->DisposeAccessibleFrame( pToRemove, true );
} #endif
// #i28701# - use new method <SetPageFrame(..)>
pToRemove->SetPageFrame( nullptr );
}
if ( pToMove->IsFlyInContentFrame() )
{
pDest->InvalidateFlyInCnt(); return;
}
// Notify accessible layout. That's required at this place for // frames only where the anchor is moved. Creation of new frames // is additionally handled by the SwFrameNotify class. #if !ENABLE_WASM_STRIP_ACCESSIBILITY if( GetUpper() && static_cast< SwRootFrame * >( GetUpper() )->IsAnyShellAccessible() && static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell() )
{ static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell()->Imp()
->DisposeAccessibleFrame( pToMove, true );
} #endif
// The FlyColl might be gone already, because the page's dtor is being executed. if ( m_pSortedObjs )
{
m_pSortedObjs->Remove( *pToMove ); if ( !m_pSortedObjs->size() )
{
m_pSortedObjs.reset();
}
// Removing a fly from the page affects the margin of tables, so update the frame print area // of the lowers of my body frame.
SwFrame* pBodyFrame = FindBodyCont(); if (pBodyFrame)
{ for (SwFrame* pFrame = pBodyFrame->GetLower(); pFrame; pFrame = pFrame->GetNext())
{ if (!pFrame->IsTabFrame())
{ // This is meant to match SwTabFrame::CalcFlyOffsets(), so not relevant for // other frame types. continue;
}
pFrame->InvalidatePrt();
}
}
}
// Register if ( !pDest->GetSortedObjs() )
pDest->m_pSortedObjs.reset(new SwSortedObjs());
constbool bSuccessInserted = pDest->GetSortedObjs()->Insert( *pToMove );
OSL_ENSURE( bSuccessInserted, "Fly not inserted in Sorted." );
// #i28701# - use new method <SetPageFrame(..)>
pToMove->SetPageFrame( pDest );
pToMove->InvalidatePage( pDest );
pToMove->SetNotifyBack();
pDest->InvalidateFlyContent(); // #i28701#
pToMove->UnlockPosition();
if (pToMove->IsFlySplitAllowed())
{ // Inserting a fly to the page affects the fly portions of the intersecting paragraphs, so // update the portions of the anchor of the fly frame.
SwTextFrame* pAnchor = pToMove->FindAnchorCharFrame(); if (pAnchor)
{
pAnchor->ClearPara();
}
}
// Notify accessible layout. That's required at this place for // frames only where the anchor is moved. Creation of new frames // is additionally handled by the SwFrameNotify class. #if !ENABLE_WASM_STRIP_ACCESSIBILITY if( GetUpper() && static_cast< SwRootFrame * >( GetUpper() )->IsAnyShellAccessible() && static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell() )
{ static_cast< SwRootFrame * >( GetUpper() )->GetCurrShell()->Imp()
->AddAccessibleFrame( pToMove );
} #endif
// #i28701# - correction: move lowers of Writer fly frame if ( !pToMove->GetDrawObjs() ) return;
void SwPageFrame::AppendDrawObjToPage( SwAnchoredObject& _rNewObj )
{ if ( dynamic_cast<const SwAnchoredDrawObject*>( &_rNewObj) == nullptr )
{
OSL_FAIL( "SwPageFrame::AppendDrawObjToPage(..) - anchored object of unexpected type -> object not appended" ); return;
}
if ( GetUpper() )
{ static_cast<SwRootFrame*>(GetUpper())->InvalidateBrowseWidth();
}
assert(_rNewObj.GetAnchorFrame());
SwFlyFrame* pFlyFrame = const_cast<SwFlyFrame*>(_rNewObj.GetAnchorFrame()->FindFlyFrame()); if ( pFlyFrame &&
_rNewObj.GetDrawObj()->GetOrdNum() < pFlyFrame->GetVirtDrawObj()->GetOrdNum() )
{ //#i119945# set pFly's OrdNum to _rNewObj's. So when pFly is removed by Undo, the original OrdNum will not be changed.
sal_uInt32 nNewNum = _rNewObj.GetDrawObj()->GetOrdNumDirect(); if ( _rNewObj.GetDrawObj()->getSdrPageFromSdrObject() )
_rNewObj.DrawObj()->getSdrPageFromSdrObject()->SetObjectOrdNum( pFlyFrame->GetVirtDrawObj()->GetOrdNumDirect(), nNewNum ); else
pFlyFrame->GetVirtDrawObj()->SetOrdNum( nNewNum );
}
if ( RndStdIds::FLY_AS_CHAR == _rNewObj.GetFrameFormat()->GetAnchor().GetAnchorId() )
{ return;
}
if ( !m_pSortedObjs )
{
m_pSortedObjs.reset(new SwSortedObjs());
} if ( !m_pSortedObjs->Insert( _rNewObj ) )
{
OSL_ENSURE( m_pSortedObjs->Contains( _rNewObj ), "Drawing object not appended into list ." );
} // #i87493#
OSL_ENSURE( _rNewObj.GetPageFrame() == nullptr || _rNewObj.GetPageFrame() == this, " - anchored draw object seems to be registered at another page frame. Serious defect." );
_rNewObj.SetPageFrame( this );
// invalidate page in order to force a reformat of object layout of the page.
InvalidateFlyLayout();
}
void SwPageFrame::RemoveDrawObjFromPage( SwAnchoredObject& _rToRemoveObj )
{ if ( dynamic_cast<const SwAnchoredDrawObject*>( &_rToRemoveObj) == nullptr )
{
OSL_FAIL( "SwPageFrame::RemoveDrawObjFromPage(..) - anchored object of unexpected type -> object not removed" ); return;
}
// #i50432# - adjust method description and synopsis. void SwPageFrame::PlaceFly( SwFlyFrame* pFly, SwFlyFrameFormat* pFormat )
{ // #i50432# - consider the case that page is an empty page: // In this case append the fly frame at the next page
OSL_ENSURE( !IsEmptyPage() || GetNext(), " - empty page with no next page! -> fly frame appended at empty page" ); if ( IsEmptyPage() && GetNext() )
{ static_cast<SwPageFrame*>(GetNext())->PlaceFly( pFly, pFormat );
} else
{ // If we received a Fly, we use that one. Otherwise, create a new // one using the Format. if ( pFly )
AppendFly( pFly ); else
{
OSL_ENSURE( pFormat, ":-( No Format given for Fly." );
pFly = new SwFlyLayFrame( pFormat, this, this );
AppendFly( pFly );
::RegistFlys( this, pFly );
}
}
}
// #i18732# - adjustments for following text flow or not // AND alignment at 'page areas' for to paragraph/to character anchored objects // #i22305# - adjustment for following text flow for to frame anchored objects // #i29778# - Because calculating the floating screen object's position // (Writer fly frame or drawing object) doesn't perform a calculation on its // upper frames and its anchor frame, a calculation of the upper frames in this // method is no longer sensible. // #i28701# - if document compatibility option 'Consider wrapping style influence // on object positioning' is ON, the clip area corresponds to the one as the // object doesn't follow the text flow. bool CalcClipRect( const SdrObject *pSdrObj, SwRect &rRect, bool bMove )
{ bool bRet = true; if ( auto pVirtFlyDrawObj = dynamic_cast<const SwVirtFlyDrawObj*>(pSdrObj) )
{ const SwFlyFrame* pFly = pVirtFlyDrawObj->GetFlyFrame(); constbool bFollowTextFlow = pFly->GetFormat()->GetFollowTextFlow().GetValue(); // #i28701# constbool bConsiderWrapOnObjPos =
pFly->GetFormat()->getIDocumentSettingAccess().get(DocumentSettingId::CONSIDER_WRAP_ON_OBJECT_POSITION); const SwFormatVertOrient &rV = pFly->GetFormat()->GetVertOrient(); if( pFly->IsFlyLayFrame() )
{ const SwFrame* pClip; // #i22305# // #i28701# if ( !bFollowTextFlow || bConsiderWrapOnObjPos )
{
pClip = pFly->GetAnchorFrame()->FindPageFrame();
} else
{
pClip = pFly->GetAnchorFrame();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.