They are practically always useless, often misleading or obsolete. Change-Id: I2d32182a31349c9fb3b982498fd22d93e84c0c0c
307 lines
9.7 KiB
C++
307 lines
9.7 KiB
C++
/* -*- 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 .
|
|
*/
|
|
|
|
|
|
#include "doc.hxx"
|
|
#include "frmtool.hxx"
|
|
#include "hints.hxx"
|
|
#include <fmtornt.hxx>
|
|
#include "txtfrm.hxx"
|
|
#include "flyfrms.hxx"
|
|
// OD 2004-01-19 #110582#
|
|
#include <dflyobj.hxx>
|
|
|
|
//from FlyCnt.cxx
|
|
void DeepCalc( const SwFrm *pFrm );
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::SwFlyInCntFrm(), ~SwFlyInCntFrm()
|
|
|*
|
|
|*************************************************************************/
|
|
SwFlyInCntFrm::SwFlyInCntFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) :
|
|
SwFlyFrm( pFmt, pSib, pAnch )
|
|
{
|
|
bInCnt = bInvalidLayout = bInvalidCntnt = sal_True;
|
|
SwTwips nRel = pFmt->GetVertOrient().GetPos();
|
|
// OD 2004-05-27 #i26791# - member <aRelPos> moved to <SwAnchoredObject>
|
|
Point aRelPos;
|
|
if( pAnch && pAnch->IsVertical() )
|
|
aRelPos.setX(pAnch->IsReverse() ? nRel : -nRel);
|
|
else
|
|
aRelPos.setY(nRel);
|
|
SetCurrRelPos( aRelPos );
|
|
}
|
|
|
|
SwFlyInCntFrm::~SwFlyInCntFrm()
|
|
{
|
|
//good bye
|
|
if ( !GetFmt()->GetDoc()->IsInDtor() && GetAnchorFrm() )
|
|
{
|
|
SwRect aTmp( GetObjRectWithSpaces() );
|
|
SwFlyInCntFrm::NotifyBackground( FindPageFrm(), aTmp, PREP_FLY_LEAVE );
|
|
}
|
|
}
|
|
|
|
// #i28701#
|
|
TYPEINIT1(SwFlyInCntFrm,SwFlyFrm);
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::SetRefPoint(),
|
|
|*
|
|
|*************************************************************************/
|
|
void SwFlyInCntFrm::SetRefPoint( const Point& rPoint,
|
|
const Point& rRelAttr,
|
|
const Point& rRelPos )
|
|
{
|
|
// OD 2004-05-27 #i26791# - member <aRelPos> moved to <SwAnchoredObject>
|
|
OSL_ENSURE( rPoint != aRef || rRelAttr != GetCurrRelPos(), "SetRefPoint: no change" );
|
|
SwFlyNotify *pNotify = NULL;
|
|
// No notify at a locked fly frame, if a fly frame is locked, there's
|
|
// already a SwFlyNotify object on the stack (MakeAll).
|
|
if( !IsLocked() )
|
|
pNotify = new SwFlyNotify( this );
|
|
aRef = rPoint;
|
|
SetCurrRelPos( rRelAttr );
|
|
SWRECTFN( GetAnchorFrm() )
|
|
(Frm().*fnRect->fnSetPos)( rPoint + rRelPos );
|
|
// #i68520#
|
|
InvalidateObjRectWithSpaces();
|
|
if( pNotify )
|
|
{
|
|
InvalidatePage();
|
|
mbValidPos = sal_False;
|
|
bInvalid = sal_True;
|
|
Calc();
|
|
delete pNotify;
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::Modify()
|
|
|*
|
|
|*************************************************************************/
|
|
void SwFlyInCntFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
|
|
{
|
|
bool bCallPrepare = false;
|
|
sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
|
|
if( RES_ATTRSET_CHG == nWhich )
|
|
{
|
|
if( SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->
|
|
GetItemState( RES_SURROUND, sal_False ) ||
|
|
SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->
|
|
GetItemState( RES_FRMMACRO, sal_False ) )
|
|
{
|
|
SwAttrSetChg aOld( *(SwAttrSetChg*)pOld );
|
|
SwAttrSetChg aNew( *(SwAttrSetChg*)pNew );
|
|
|
|
aOld.ClearItem( RES_SURROUND );
|
|
aNew.ClearItem( RES_SURROUND );
|
|
aOld.ClearItem( RES_FRMMACRO );
|
|
aNew.ClearItem( RES_FRMMACRO );
|
|
if( aNew.Count() )
|
|
{
|
|
SwFlyFrm::Modify( &aOld, &aNew );
|
|
bCallPrepare = true;
|
|
}
|
|
}
|
|
else if( ((SwAttrSetChg*)pNew)->GetChgSet()->Count())
|
|
{
|
|
SwFlyFrm::Modify( pOld, pNew );
|
|
bCallPrepare = true;
|
|
}
|
|
}
|
|
else if( nWhich != RES_SURROUND && RES_FRMMACRO != nWhich )
|
|
{
|
|
SwFlyFrm::Modify( pOld, pNew );
|
|
bCallPrepare = true;
|
|
}
|
|
|
|
if ( bCallPrepare && GetAnchorFrm() )
|
|
AnchorFrm()->Prepare( PREP_FLY_ATTR_CHG, GetFmt() );
|
|
}
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::Format()
|
|
|*
|
|
|* Here the content gets formatted initially.
|
|
|*
|
|
|*************************************************************************/
|
|
void SwFlyInCntFrm::Format( const SwBorderAttrs *pAttrs )
|
|
{
|
|
if ( !Frm().Height() )
|
|
{
|
|
Lock(); //don't format the anchor on the crook.
|
|
SwCntntFrm *pCntnt = ContainsCntnt();
|
|
while ( pCntnt )
|
|
{ pCntnt->Calc();
|
|
pCntnt = pCntnt->GetNextCntntFrm();
|
|
}
|
|
Unlock();
|
|
}
|
|
SwFlyFrm::Format( pAttrs );
|
|
}
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::MakeFlyPos()
|
|
|*
|
|
|* Description In contrast to other Frms we only calculate the RelPos
|
|
|* here. The absolute position is only calculated using SetAbsPos.
|
|
|*************************************************************************/
|
|
// OD 2004-03-23 #i26791#
|
|
//void SwFlyInCntFrm::MakeFlyPos()
|
|
void SwFlyInCntFrm::MakeObjPos()
|
|
{
|
|
if ( !mbValidPos )
|
|
{
|
|
mbValidPos = sal_True;
|
|
SwFlyFrmFmt *pFmt = (SwFlyFrmFmt*)GetFmt();
|
|
const SwFmtVertOrient &rVert = pFmt->GetVertOrient();
|
|
//Update the current values in the format if needed, during this we of
|
|
//course must not send any Modify.
|
|
const bool bVert = GetAnchorFrm()->IsVertical();
|
|
const bool bRev = GetAnchorFrm()->IsReverse();
|
|
SwTwips nOld = rVert.GetPos();
|
|
SwTwips nAct = bVert ? -GetCurrRelPos().X() : GetCurrRelPos().Y();
|
|
if( bRev )
|
|
nAct = -nAct;
|
|
if( nAct != nOld )
|
|
{
|
|
SwFmtVertOrient aVert( rVert );
|
|
aVert.SetPos( nAct );
|
|
pFmt->LockModify();
|
|
pFmt->SetFmtAttr( aVert );
|
|
pFmt->UnlockModify();
|
|
}
|
|
}
|
|
}
|
|
|
|
// #115759#
|
|
void SwFlyInCntFrm::_ActionOnInvalidation( const InvalidationType _nInvalid )
|
|
{
|
|
if ( INVALID_POS == _nInvalid || INVALID_ALL == _nInvalid )
|
|
AnchorFrm()->Prepare( PREP_FLY_ATTR_CHG, &GetFrmFmt() );
|
|
}
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::NotifyBackground()
|
|
|*
|
|
|*************************************************************************/
|
|
void SwFlyInCntFrm::NotifyBackground( SwPageFrm *, const SwRect& rRect,
|
|
PrepareHint eHint)
|
|
{
|
|
if ( eHint == PREP_FLY_ATTR_CHG )
|
|
AnchorFrm()->Prepare( PREP_FLY_ATTR_CHG );
|
|
else
|
|
AnchorFrm()->Prepare( eHint, (void*)&rRect );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::GetRelPos()
|
|
|*
|
|
|*************************************************************************/
|
|
const Point SwFlyInCntFrm::GetRelPos() const
|
|
{
|
|
Calc();
|
|
return GetCurrRelPos();
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::RegistFlys()
|
|
|*
|
|
|*************************************************************************/
|
|
void SwFlyInCntFrm::RegistFlys()
|
|
{
|
|
// vgl. SwRowFrm::RegistFlys()
|
|
SwPageFrm *pPage = FindPageFrm();
|
|
OSL_ENSURE( pPage, "Register Flys without pages?" );
|
|
::RegistFlys( pPage, this );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyInCntFrm::MakeAll()
|
|
|*
|
|
|*************************************************************************/
|
|
void SwFlyInCntFrm::MakeAll()
|
|
{
|
|
// OD 2004-01-19 #110582#
|
|
if ( !GetFmt()->GetDoc()->IsVisibleLayerId( GetVirtDrawObj()->GetLayer() ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( !GetAnchorFrm() || IsLocked() || IsColLocked() || !FindPageFrm() )
|
|
return;
|
|
|
|
Lock(); // The curtain falls
|
|
|
|
//does the notification in the DTor
|
|
const SwFlyNotify aNotify( this );
|
|
SwBorderAttrAccess aAccess( SwFrm::GetCache(), this );
|
|
const SwBorderAttrs &rAttrs = *aAccess.Get();
|
|
|
|
if ( IsClipped() )
|
|
mbValidSize = bHeightClipped = bWidthClipped = sal_False;
|
|
|
|
while ( !mbValidPos || !mbValidSize || !mbValidPrtArea )
|
|
{
|
|
//Only stop, if the flag is set!!
|
|
if ( !mbValidSize )
|
|
{
|
|
mbValidPrtArea = sal_False;
|
|
}
|
|
|
|
if ( !mbValidPrtArea )
|
|
MakePrtArea( rAttrs );
|
|
|
|
if ( !mbValidSize )
|
|
Format( &rAttrs );
|
|
|
|
if ( !mbValidPos )
|
|
{
|
|
// OD 2004-03-23 #i26791#
|
|
//MakeFlyPos();
|
|
MakeObjPos();
|
|
}
|
|
|
|
//
|
|
// re-activate clipping of as-character anchored Writer fly frames
|
|
// depending on compatibility option <ClipAsCharacterAnchoredWriterFlyFrames>
|
|
if ( mbValidPos && mbValidSize &&
|
|
GetFmt()->getIDocumentSettingAccess()->get( IDocumentSettingAccess::CLIP_AS_CHARACTER_ANCHORED_WRITER_FLY_FRAME ) )
|
|
{
|
|
SwFrm* pFrm = AnchorFrm();
|
|
if ( Frm().Left() == (pFrm->Frm().Left()+pFrm->Prt().Left()) &&
|
|
Frm().Width() > pFrm->Prt().Width() )
|
|
{
|
|
Frm().Width( pFrm->Prt().Width() );
|
|
mbValidPrtArea = sal_False;
|
|
bWidthClipped = sal_True;
|
|
}
|
|
}
|
|
}
|
|
Unlock();
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|