diff options
author | Kurt Zenker <kz@openoffice.org> | 2004-08-02 13:11:47 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2004-08-02 13:11:47 +0000 |
commit | 1e773f526173c7dbf2525b65ea1fc54b0425f9ab (patch) | |
tree | fec9ae1ac22eaa0c27d38ec8dc4ef99c2a6f34a5 /sw/source/core/layout/objectformattertxtfrm.cxx | |
parent | 182adb6421d048da235d360dd2c6c3b0669067c2 (diff) |
INTEGRATION: CWS swobjpos04 (1.1.2); FILE ADDED
2004/07/23 13:09:24 od 1.1.2.5: #i28701# - further adjustments for the new object positioning algorithm
2004/07/22 08:55:24 od 1.1.2.4: #i28701# - further adjustments for the new object positioning algorithm
2004/07/12 08:15:40 od 1.1.2.3: #i28701# - further adjustments for the new object positioning algorithm
2004/07/02 14:58:25 od 1.1.2.2: #i28701# - further adjustments for the new object positioning
2004/06/30 15:04:13 od 1.1.2.1: #i28701# - implementation of new class <SwObjectFormatter> and
declaration and implementation of its subclasses
Diffstat (limited to 'sw/source/core/layout/objectformattertxtfrm.cxx')
-rw-r--r-- | sw/source/core/layout/objectformattertxtfrm.cxx | 373 |
1 files changed, 373 insertions, 0 deletions
diff --git a/sw/source/core/layout/objectformattertxtfrm.cxx b/sw/source/core/layout/objectformattertxtfrm.cxx new file mode 100644 index 000000000000..ddba6907a587 --- /dev/null +++ b/sw/source/core/layout/objectformattertxtfrm.cxx @@ -0,0 +1,373 @@ +/************************************************************************* + * + * $RCSfile: objectformattertxtfrm.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: kz $ $Date: 2004-08-02 14:11:47 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _OBJECTFORMATTERTXTFRM_HXX +#include <objectformattertxtfrm.hxx> +#endif + +#ifndef _ANCHOREDOBJECT_HXX +#include <anchoredobject.hxx> +#endif +#ifndef _SORTEDOBJS_HXX +#include <sortedobjs.hxx> +#endif + +#ifndef _FLYFRMS_HXX +#include <flyfrms.hxx> +#endif +#ifndef _TXTFRM_HXX +#include <txtfrm.hxx> +#endif +#ifndef _PAGEFRM_HXX +#include <pagefrm.hxx> +#endif + +#ifndef _LAYOUTER_HXX +#include <layouter.hxx> +#endif + +#ifndef _FRMFMT_HXX +#include <frmfmt.hxx> +#endif +#ifndef _FMTANCHR_HXX +#include <fmtanchr.hxx> +#endif +#ifndef _FMTWRAPINFLUENCEONOBJPOS_HXX +#include <fmtwrapinfluenceonobjpos.hxx> +#endif + +#ifndef _LAYACT_HXX +#include <layact.hxx> +#endif + +// ============================================================================= +// implementation of class <SwObjectFormatterTxtFrm> +// ============================================================================= +SwObjectFormatterTxtFrm::SwObjectFormatterTxtFrm( SwTxtFrm& _rAnchorTxtFrm, + const SwPageFrm& _rPageFrm, + SwTxtFrm* _pMasterAnchorTxtFrm, + SwLayAction* _pLayAction ) + : SwObjectFormatter( _rPageFrm, _pLayAction, true ), + mrAnchorTxtFrm( _rAnchorTxtFrm ), + mpMasterAnchorTxtFrm( _pMasterAnchorTxtFrm ) +{ +} + +SwObjectFormatterTxtFrm::~SwObjectFormatterTxtFrm() +{ +} + +SwObjectFormatterTxtFrm* SwObjectFormatterTxtFrm::CreateObjFormatter( + SwTxtFrm& _rAnchorTxtFrm, + const SwPageFrm& _rPageFrm, + SwLayAction* _pLayAction ) +{ + SwObjectFormatterTxtFrm* pObjFormatter = 0L; + + // determine 'master' of <_rAnchorTxtFrm>, if anchor frame is a follow text frame. + SwTxtFrm* pMasterOfAnchorFrm = 0L; + if ( _rAnchorTxtFrm.IsFollow() ) + { + pMasterOfAnchorFrm = _rAnchorTxtFrm.FindMaster(); + while ( pMasterOfAnchorFrm->IsFollow() ) + { + pMasterOfAnchorFrm = pMasterOfAnchorFrm->FindMaster(); + } + } + + // create object formatter, if floating screen objects are registered + // at anchor frame (or at 'master' anchor frame) + if ( _rAnchorTxtFrm.GetDrawObjs() || + ( pMasterOfAnchorFrm && pMasterOfAnchorFrm->GetDrawObjs() ) ) + { + pObjFormatter = + new SwObjectFormatterTxtFrm( _rAnchorTxtFrm, _rPageFrm, + pMasterOfAnchorFrm, _pLayAction ); + } + + return pObjFormatter; +} + +SwFrm& SwObjectFormatterTxtFrm::GetAnchorFrm() +{ + return mrAnchorTxtFrm; +} + +bool SwObjectFormatterTxtFrm::DoFormatObj( SwAnchoredObject& _rAnchoredObj ) +{ + // check, if only as-character anchored object have to be formatted, and + // check the anchor type + if ( FormatOnlyAsCharAnchored() && + !_rAnchoredObj.GetFrmFmt().GetAnchor().GetAnchorId() == FLY_IN_CNTNT ) + { + return true; + } + + bool bSuccess( true ); + + if ( _rAnchoredObj.IsFormatPossible() ) + { + _rAnchoredObj.SetRestartLayoutProcess( false ); + + _FormatObj( _rAnchoredObj ); + + // check, if layout process has to be restarted. + // if yes, perform needed invalidations. + if ( _rAnchoredObj.RestartLayoutProcess() ) + { + bSuccess = false; + _InvalidatePrevObjs( _rAnchoredObj ); + _InvalidateFollowObjs( _rAnchoredObj, true ); + } + + // format anchor text frame, if wrapping style influence of the object + // has to be considered and it's <NONE_SUCCESSIVE_POSITIONED> + if ( bSuccess && + _rAnchoredObj.ConsiderObjWrapInfluenceOnObjPos() && + _rAnchoredObj.GetFrmFmt().GetWrapInfluenceOnObjPos(). + GetWrapInfluenceOnObjPos() == + text::WrapInfluenceOnPosition::NONE_SUCCESSIVE_POSITIONED ) + { + mrAnchorTxtFrm.Calc(); + } + } + + return bSuccess; +} + +bool SwObjectFormatterTxtFrm::DoFormatObjs() +{ + if ( !mrAnchorTxtFrm.IsValid() ) + { + if ( GetLayAction() && + mrAnchorTxtFrm.FindPageFrm() != &GetPageFrm() ) + { + // notify layout action, thus is can restart the layout process on + // a previous page. + GetLayAction()->SetAgain(); + } + else + { + // the anchor text frame has to be valid, thus assert. + ASSERT( false, + "<SwObjectFormatterTxtFrm::DoFormatObjs()> called for invalidate anchor text frame." ); + } + + return false; + } + + bool bSuccess( true ); + + if ( mrAnchorTxtFrm.IsFollow() ) + { + // Only floating screen objects anchored as-character are directly + // registered at a follow text frame. The other floating screen objects + // are registered at the 'master' anchor text frame. + // Thus, format the other floating screen objects through the 'master' + // anchor text frame + ASSERT( mpMasterAnchorTxtFrm, + "SwObjectFormatterTxtFrm::DoFormatObjs() - missing 'master' anchor text frame" ); + SwObjectFormatterTxtFrm aObjFormatterMasterTxtFrm( *(mpMasterAnchorTxtFrm), + GetPageFrm(), + 0L, + GetLayAction() ); + bSuccess = aObjFormatterMasterTxtFrm.DoFormatObjs(); + + if ( bSuccess ) + { + // format of as-character anchored floating screen objects - no failure + // excepted on the format of these objects. + _FormatObjsAtFrm(); + } + } + else + { + bSuccess = _FormatObjsAtFrm(); + } + + if ( bSuccess && ConsiderWrapOnObjPos() ) + { + const bool bDoesAnchorHadPrev = ( mrAnchorTxtFrm.GetIndPrev() != 0 ); + + // Format anchor text frame after its objects are formatted. + // Note: The format of the anchor frame also formats the invalid + // previous frames of the anchor frame. The format of the previous + // frames is needed to get a correct result of format of the + // anchor frame for the following check for moved forward anchors + mrAnchorTxtFrm.Calc(); + + sal_uInt32 nToPageNum( 0L ); + SwAnchoredObject* pObj = 0L; + if ( !mrAnchorTxtFrm.IsFollow() ) + { + pObj = _GetFirstObjWithMovedFwdAnchor( + text::WrapInfluenceOnPosition::NONE_CONCURRENT_POSITIONED, + nToPageNum ); + } + if ( pObj ) + { + // Object found, whose anchor is moved forward + + if ( bDoesAnchorHadPrev ) + { + // Indicate that anchor text frame has to move forward and + // invalidate its position to force a re-format. + SwLayouter::InsertMovedFwdFrm( *(GetPageFrm().GetFmt()->GetDoc()), + mrAnchorTxtFrm, + nToPageNum ); + mrAnchorTxtFrm.InvalidatePos(); + } + + // Indicate restart of the layout process + bSuccess = false; + + // If needed, invalidate previous objects anchored at same anchor + // text frame. + _InvalidatePrevObjs( *pObj ); + + // Invalidate object and following objects for the restart of the + // layout process + _InvalidateFollowObjs( *pObj, true ); + } + } + + return bSuccess; +} + +void SwObjectFormatterTxtFrm::_InvalidatePrevObjs( SwAnchoredObject& _rAnchoredObj ) +{ + // invalidate all previous objects, whose wrapping influence on the object + // positioning is <NONE_CONCURRENT_POSIITIONED>. + // Note: list of objects at anchor frame is sorted by this property. + if ( _rAnchoredObj.GetFrmFmt().GetWrapInfluenceOnObjPos(). + GetWrapInfluenceOnObjPos() == + text::WrapInfluenceOnPosition::NONE_CONCURRENT_POSITIONED ) + { + const SwSortedObjs* pObjs = GetAnchorFrm().GetDrawObjs(); + if ( pObjs ) + { + // determine start index + sal_Int32 i = pObjs->ListPosOf( _rAnchoredObj ) - 1; + for ( ; i >= 0; --i ) + { + SwAnchoredObject* pAnchoredObj = (*pObjs)[i]; + if ( pAnchoredObj->GetFrmFmt().GetWrapInfluenceOnObjPos(). + GetWrapInfluenceOnObjPos() == + text::WrapInfluenceOnPosition::NONE_CONCURRENT_POSITIONED ) + { + pAnchoredObj->InvalidateObjPosForConsiderWrapInfluence( true ); + } + } + } + } +} + +void SwObjectFormatterTxtFrm::_InvalidateFollowObjs( SwAnchoredObject& _rAnchoredObj, + const bool _bInclObj ) +{ + if ( _bInclObj ) + { + _rAnchoredObj.InvalidateObjPosForConsiderWrapInfluence( true ); + } + + const SwSortedObjs* pObjs = GetPageFrm().GetSortedObjs(); + if ( pObjs ) + { + // determine start index + sal_uInt32 i = pObjs->ListPosOf( _rAnchoredObj ) + 1; + for ( ; i < pObjs->Count(); ++i ) + { + SwAnchoredObject* pAnchoredObj = (*pObjs)[i]; + pAnchoredObj->InvalidateObjPosForConsiderWrapInfluence( true ); + } + } +} + +SwAnchoredObject* SwObjectFormatterTxtFrm::_GetFirstObjWithMovedFwdAnchor( + const sal_Int16 _nWrapInfluenceOnPosition, + sal_uInt32& _noToPageNum ) +{ + ASSERT( _nWrapInfluenceOnPosition == text::WrapInfluenceOnPosition::NONE_SUCCESSIVE_POSITIONED || + _nWrapInfluenceOnPosition == text::WrapInfluenceOnPosition::NONE_CONCURRENT_POSITIONED, + "<SwObjectFormatterTxtFrm::_GetFirstObjWithMovedFwdAnchor(..)> - invalid value for parameter <_nWrapInfluenceOnPosition>" ); + + SwAnchoredObject* pRetAnchoredObj = 0L; + + sal_uInt32 i = 0L; + for ( ; i < CountOfCollected(); ++i ) + { + SwAnchoredObject* pAnchoredObj = GetCollectedObj(i); + if ( pAnchoredObj->ConsiderObjWrapInfluenceOnObjPos() && + pAnchoredObj->GetFrmFmt().GetWrapInfluenceOnObjPos(). + GetWrapInfluenceOnObjPos() == _nWrapInfluenceOnPosition ) + { + sal_uInt32 nFromPageNum = GetPgNumOfCollected(i); + sal_uInt32 nPageNum = pAnchoredObj->GetPageFrmOfAnchor().GetPhyPageNum(); + if ( nPageNum > nFromPageNum ) + { + _noToPageNum = nPageNum; + pRetAnchoredObj = pAnchoredObj; + break; + } + } + } + + return pRetAnchoredObj; +} |