summaryrefslogtreecommitdiff
path: root/sw/source/core/layout/flyincnt.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/layout/flyincnt.cxx')
-rw-r--r--sw/source/core/layout/flyincnt.cxx360
1 files changed, 360 insertions, 0 deletions
diff --git a/sw/source/core/layout/flyincnt.cxx b/sw/source/core/layout/flyincnt.cxx
new file mode 100644
index 000000000000..61fb9163c6f1
--- /dev/null
+++ b/sw/source/core/layout/flyincnt.cxx
@@ -0,0 +1,360 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#include "cntfrm.hxx"
+#include "doc.hxx"
+#include "flyfrm.hxx"
+#include "frmtool.hxx"
+#include "frmfmt.hxx"
+#include "hints.hxx"
+#include <fmtornt.hxx>
+#include <fmtfsize.hxx>
+#include "txtfrm.hxx" //fuer IsLocked()
+#include "flyfrms.hxx"
+// OD 2004-01-19 #110582#
+#include <dflyobj.hxx>
+
+//aus FlyCnt.cxx
+void DeepCalc( const SwFrm *pFrm );
+
+/*************************************************************************
+|*
+|* SwFlyInCntFrm::SwFlyInCntFrm(), ~SwFlyInCntFrm()
+|*
+|* Ersterstellung MA 01. Dec. 92
+|* Letzte Aenderung MA 09. Apr. 99
+|*
+|*************************************************************************/
+SwFlyInCntFrm::SwFlyInCntFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) :
+ SwFlyFrm( pFmt, pAnch )
+{
+ bInCnt = bInvalidLayout = bInvalidCntnt = TRUE;
+ SwTwips nRel = pFmt->GetVertOrient().GetPos();
+ // OD 2004-05-27 #i26791# - member <aRelPos> moved to <SwAnchoredObject>
+ Point aRelPos;
+ if( pAnch && pAnch->IsVertical() )
+ aRelPos.X() = pAnch->IsReverse() ? nRel : -nRel;
+ else
+ aRelPos.Y() = nRel;
+ SetCurrRelPos( aRelPos );
+}
+
+SwFlyInCntFrm::~SwFlyInCntFrm()
+{
+ //und Tschuess.
+ if ( !GetFmt()->GetDoc()->IsInDtor() && GetAnchorFrm() )
+ {
+ SwRect aTmp( GetObjRectWithSpaces() );
+ SwFlyInCntFrm::NotifyBackground( FindPageFrm(), aTmp, PREP_FLY_LEAVE );
+ }
+}
+
+// --> OD 2004-06-29 #i28701#
+TYPEINIT1(SwFlyInCntFrm,SwFlyFrm);
+// <--
+/*************************************************************************
+|*
+|* SwFlyInCntFrm::SetRefPoint(),
+|*
+|* Ersterstellung MA 01. Dec. 92
+|* Letzte Aenderung MA 06. Aug. 95
+|*
+|*************************************************************************/
+void SwFlyInCntFrm::SetRefPoint( const Point& rPoint,
+ const Point& rRelAttr,
+ const Point& rRelPos )
+{
+ // OD 2004-05-27 #i26791# - member <aRelPos> moved to <SwAnchoredObject>
+ ASSERT( 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 );
+ // --> OD 2006-08-25 #i68520#
+ InvalidateObjRectWithSpaces();
+ // <--
+ if( pNotify )
+ {
+ InvalidatePage();
+ bValidPos = FALSE;
+ bInvalid = TRUE;
+ Calc();
+ delete pNotify;
+ }
+}
+
+/*************************************************************************
+|*
+|* SwFlyInCntFrm::Modify()
+|*
+|* Ersterstellung MA 16. Dec. 92
+|* Letzte Aenderung MA 02. Sep. 93
+|*
+|*************************************************************************/
+void SwFlyInCntFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew )
+{
+ BOOL bCallPrepare = FALSE;
+ USHORT nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
+ if( RES_ATTRSET_CHG == nWhich )
+ {
+ if( SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->
+ GetItemState( RES_SURROUND, FALSE ) ||
+ SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->
+ GetItemState( RES_FRMMACRO, 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()
+|*
+|* Beschreibung: Hier wird der Inhalt initial mit Formatiert.
+|* Ersterstellung MA 16. Dec. 92
+|* Letzte Aenderung MA 19. May. 93
+|*
+|*************************************************************************/
+void SwFlyInCntFrm::Format( const SwBorderAttrs *pAttrs )
+{
+ if ( !Frm().Height() )
+ {
+ Lock(); //nicht hintenherum den Anker formatieren.
+ SwCntntFrm *pCntnt = ContainsCntnt();
+ while ( pCntnt )
+ { pCntnt->Calc();
+ pCntnt = pCntnt->GetNextCntntFrm();
+ }
+ Unlock();
+ }
+ SwFlyFrm::Format( pAttrs );
+}
+/*************************************************************************
+|*
+|* SwFlyInCntFrm::MakeFlyPos()
+|*
+|* Beschreibung Im Unterschied zu anderen Frms wird hier nur die
+|* die RelPos berechnet. Die absolute Position wird ausschliesslich
+|* per SetAbsPos errechnet.
+|* Ersterstellung MA 03. Dec. 92
+|* Letzte Aenderung MA 12. Apr. 96
+|*
+|*************************************************************************/
+// OD 2004-03-23 #i26791#
+//void SwFlyInCntFrm::MakeFlyPos()
+void SwFlyInCntFrm::MakeObjPos()
+{
+ if ( !bValidPos )
+ {
+ bValidPos = TRUE;
+ SwFlyFrmFmt *pFmt = (SwFlyFrmFmt*)GetFmt();
+ const SwFmtVertOrient &rVert = pFmt->GetVertOrient();
+ //Und ggf. noch die aktuellen Werte im Format updaten, dabei darf
+ //zu diesem Zeitpunkt natuerlich kein Modify verschickt werden.
+ 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();
+ }
+ }
+}
+
+// --> OD 2004-12-02 #115759#
+void SwFlyInCntFrm::_ActionOnInvalidation( const InvalidationType _nInvalid )
+{
+ if ( INVALID_POS == _nInvalid || INVALID_ALL == _nInvalid )
+ AnchorFrm()->Prepare( PREP_FLY_ATTR_CHG, &GetFrmFmt() );
+}
+// <--
+/*************************************************************************
+|*
+|* SwFlyInCntFrm::NotifyBackground()
+|*
+|* Ersterstellung MA 03. Dec. 92
+|* Letzte Aenderung MA 26. Aug. 93
+|*
+|*************************************************************************/
+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()
+|*
+|* Ersterstellung MA 04. Dec. 92
+|* Letzte Aenderung MA 04. Dec. 92
+|*
+|*************************************************************************/
+const Point SwFlyInCntFrm::GetRelPos() const
+{
+ Calc();
+ return GetCurrRelPos();
+}
+
+/*************************************************************************
+|*
+|* SwFlyInCntFrm::RegistFlys()
+|*
+|* Ersterstellung MA 26. Nov. 93
+|* Letzte Aenderung MA 26. Nov. 93
+|*
+|*************************************************************************/
+void SwFlyInCntFrm::RegistFlys()
+{
+ // vgl. SwRowFrm::RegistFlys()
+ SwPageFrm *pPage = FindPageFrm();
+ ASSERT( pPage, "Flys ohne Seite anmelden?" );
+ ::RegistFlys( pPage, this );
+}
+
+/*************************************************************************
+|*
+|* SwFlyInCntFrm::MakeAll()
+|*
+|* Ersterstellung MA 18. Feb. 94
+|* Letzte Aenderung MA 13. Jun. 96
+|*
+|*************************************************************************/
+void SwFlyInCntFrm::MakeAll()
+{
+ // OD 2004-01-19 #110582#
+ if ( !GetFmt()->GetDoc()->IsVisibleLayerId( GetVirtDrawObj()->GetLayer() ) )
+ {
+ return;
+ }
+
+ if ( !GetAnchorFrm() || IsLocked() || IsColLocked() || !FindPageFrm() )
+ return;
+
+ Lock(); //Der Vorhang faellt
+
+ //uebernimmt im DTor die Benachrichtigung
+ const SwFlyNotify aNotify( this );
+ SwBorderAttrAccess aAccess( SwFrm::GetCache(), this );
+ const SwBorderAttrs &rAttrs = *aAccess.Get();
+
+ if ( IsClipped() )
+ bValidSize = bHeightClipped = bWidthClipped = FALSE;
+
+ while ( !bValidPos || !bValidSize || !bValidPrtArea )
+ {
+ //Nur einstellen wenn das Flag gesetzt ist!!
+ if ( !bValidSize )
+ {
+ bValidPrtArea = FALSE;
+/*
+ // This is also done in the Format function, so I think
+ // this code is not necessary anymore:
+ long nOldWidth = aFrm.Width();
+ const Size aRelSize( CalcRel( rFrmSz ) );
+ aFrm.Width( aRelSize.Width() );
+
+ if ( aFrm.Width() > nOldWidth )
+ //Damit sich der Inhalt anpasst
+ aFrm.Height( aRelSize.Height() );
+*/
+ }
+
+ if ( !bValidPrtArea )
+ MakePrtArea( rAttrs );
+
+ if ( !bValidSize )
+ Format( &rAttrs );
+
+ if ( !bValidPos )
+ {
+ // OD 2004-03-23 #i26791#
+ //MakeFlyPos();
+ MakeObjPos();
+ }
+
+ // --> OD 2006-04-13 #b6402800#
+ // re-activate clipping of as-character anchored Writer fly frames
+ // depending on compatibility option <ClipAsCharacterAnchoredWriterFlyFrames>
+ if ( bValidPos && bValidSize &&
+ 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() );
+ bValidPrtArea = FALSE;
+ bWidthClipped = TRUE;
+ }
+ }
+ // <--
+ }
+ Unlock();
+}