summaryrefslogtreecommitdiff
path: root/sw/source/core/text/txtfly.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/text/txtfly.hxx')
-rw-r--r--sw/source/core/text/txtfly.hxx259
1 files changed, 259 insertions, 0 deletions
diff --git a/sw/source/core/text/txtfly.hxx b/sw/source/core/text/txtfly.hxx
new file mode 100644
index 000000000000..8c128c52c015
--- /dev/null
+++ b/sw/source/core/text/txtfly.hxx
@@ -0,0 +1,259 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+#ifndef _TXTFLY_HXX
+#define _TXTFLY_HXX
+#include <svl/svarray.hxx>
+
+#include "swtypes.hxx"
+#include "swrect.hxx"
+
+class OutputDevice;
+class SwCntntFrm;
+class SwPageFrm;
+class SwTxtFly;
+class SdrObject;
+class SwTxtPaintInfo;
+class SwFmt;
+class TextRanger;
+class Color;
+// --> OD 2004-10-06 #i26945#
+class SwAnchoredObject;
+// <--
+
+// --> OD 2006-08-15 #i68520# - refactoring
+//typedef MSHORT _FlyCntnt;
+#include <fmtsrndenum.hxx>
+// <--
+
+// --> OD 2006-08-15 #i68520#
+//SV_DECL_PTRARR( SwFlyList, SdrObject*, 10, 10 )
+#include <vector>
+typedef std::vector< SwAnchoredObject* > SwAnchoredObjList;
+// <--
+
+/*************************************************************************
+ * class SwFlyIter
+ *************************************************************************/
+enum PAGESIDE { LEFT_SIDE, RIGHT_SIDE, DONTKNOW_SIDE };
+
+/*************************************************************************
+ * class SwContourCache
+ *************************************************************************/
+
+class SwDrawTextInfo;
+// Contour-Cache, globale Variable, in txtinit.cxx initialisiert/zerstoert
+// und in txtfly.cxx benutzt bei Konturumfluss
+class SwContourCache;
+extern SwContourCache *pContourCache;
+class SwTxtFrm;
+
+#define POLY_CNT 20
+#define POLY_MIN 5
+#define POLY_MAX 4000
+
+class SwContourCache
+{
+ friend void ClrContourCache();
+ const SdrObject *pSdrObj[ POLY_CNT ];
+ TextRanger *pTextRanger[ POLY_CNT ];
+ long nPntCnt;
+ MSHORT nObjCnt;
+ const SwRect ContourRect( const SwFmt* pFmt, const SdrObject* pObj,
+ const SwTxtFrm* pFrm, const SwRect &rLine, const long nXPos,
+ const sal_Bool bRight );
+
+public:
+ SwContourCache();
+ ~SwContourCache();
+ const SdrObject* GetObject( MSHORT nPos ){ return pSdrObj[ nPos ]; }
+ MSHORT GetCount() const { return nObjCnt; }
+ void ClrObject( MSHORT nPos );
+ // --> OD 2006-08-15 #i68520#
+ static const SwRect CalcBoundRect( const SwAnchoredObject* pAnchoredObj,
+ const SwRect &rLine,
+ const SwTxtFrm* pFrm,
+ const long nXPos,
+ const sal_Bool bRight );
+ // <--
+#ifdef DBG_UTIL
+ void ShowContour( OutputDevice* pOut, const SdrObject* pObj,
+ const Color& rClosedColor, const Color& rOpenColor );
+#endif
+};
+
+/*************************************************************************
+ * class SwTxtFly
+ *************************************************************************/
+
+class SwTxtFly
+{
+ const SwPageFrm *pPage;
+ // --> OD 2006-08-15 #i68520#
+ const SwAnchoredObject* mpCurrAnchoredObj;
+ // <--
+
+ const SwTxtFrm *pCurrFrm;
+
+ const SwCntntFrm *pMaster;
+ // --> OD 2006-08-15 #i68520#
+ SwAnchoredObjList* mpAnchoredObjList;
+ // <--
+
+ long nMinBottom;
+ long nNextTop; // Hier wird die Oberkante des "naechsten" Rahmens gespeichert
+ ULONG nIndex;
+ sal_Bool bOn : 1;
+ sal_Bool bLeftSide : 1;
+ sal_Bool bTopRule: 1;
+ sal_Bool mbIgnoreCurrentFrame: 1;
+ sal_Bool mbIgnoreContour: 1;
+ // --> OD 2004-12-17 #118809# - boolean, indicating if objects in page
+ // header|footer are considered for text frames not in page header|footer.
+ sal_Bool mbIgnoreObjsInHeaderFooter: 1;
+ // <--
+ SwRect _GetFrm( const SwRect &rPortion, sal_Bool bTop ) const;
+ // --> OD 2006-08-15 #i68520#
+ SwAnchoredObjList* InitAnchoredObjList();
+ inline SwAnchoredObjList* GetAnchoredObjList() const
+ {
+ return mpAnchoredObjList
+ ? mpAnchoredObjList
+ : const_cast<SwTxtFly*>(this)->InitAnchoredObjList();
+ }
+ // iterates over the anchored object list <mpAnchoredObjList>
+ sal_Bool ForEach( const SwRect &rRect, SwRect* pRect, sal_Bool bAvoid ) const;
+ SwSurround _GetSurroundForTextWrap( const SwAnchoredObject* pAnchoredObj ) const;
+ void CalcRightMargin( SwRect &rFly,
+ SwAnchoredObjList::size_type nPos,
+ const SwRect &rLine ) const;
+ void CalcLeftMargin( SwRect &rFly,
+ SwAnchoredObjList::size_type nPos,
+ const SwRect &rLine ) const;
+ SwAnchoredObjList::size_type GetPos( const SwAnchoredObject* pAnchoredObj ) const;
+ // <--
+ // --> OD 2004-10-06 #i26945# - change first parameter:
+ // Now it's the <SwAnchoredObject> instance of the floating screen object
+ sal_Bool GetTop( const SwAnchoredObject* _pAnchoredObj,
+ const sal_Bool bInFtn,
+ const sal_Bool bInFooterOrHeader );
+ // <--
+ SwTwips CalcMinBottom() const;
+ const SwCntntFrm* _GetMaster();
+
+public:
+ inline SwTxtFly()
+ {
+ mbIgnoreCurrentFrame = sal_False;
+ mbIgnoreCurrentFrame = sal_False;
+ // --> OD 2004-12-17 #118809#
+ mbIgnoreObjsInHeaderFooter = sal_False;
+ // <--
+ // --> OD 2006-08-15 #i68520#
+ mpCurrAnchoredObj = 0;
+ mpAnchoredObjList = 0;
+ // <--
+ pMaster = 0;
+ }
+ inline SwTxtFly( const SwTxtFrm *pFrm )
+ { CtorInitTxtFly( pFrm ); }
+
+ SwTxtFly( const SwTxtFly& rTxtFly );
+ // --> OD 2006-08-15 #i68520#
+ inline ~SwTxtFly() { delete mpAnchoredObjList; }
+ // <--
+ void CtorInitTxtFly( const SwTxtFrm *pFrm );
+ void SetTopRule(){ bTopRule = sal_False; }
+
+ inline SwRect GetFrm( const SwRect &rPortion, sal_Bool bTop = sal_True ) const;
+ inline sal_Bool IsOn() const { return bOn; }
+ inline sal_Bool Relax( const SwRect &rRect );
+ inline sal_Bool Relax();
+ inline SwTwips GetMinBottom() const
+ // --> OD 2006-08-15 #i68520#
+ { return mpAnchoredObjList ? nMinBottom : CalcMinBottom(); }
+ // <--
+ inline const SwCntntFrm* GetMaster() const
+ { return pMaster ? pMaster : ((SwTxtFly*)this)->_GetMaster(); }
+ inline long GetNextTop() const { return nNextTop; }
+ // Diese temporaere Variable darf auch in const-Methoden manipuliert werden
+ inline void SetNextTop( long nNew ) const
+ { ((SwTxtFly*)this)->nNextTop = nNew; }
+
+ // --> OD 2006-08-15 #i68520#
+ // determines the demanded rectangle for an anchored object,
+ // considering its surround for text wrapping.
+ SwRect AnchoredObjToRect( const SwAnchoredObject* pAnchoredObj,
+ const SwRect& rRect ) const;
+ // <--
+
+ // Die Drawmethoden stellen sicher, dass ueberlappende Frames
+ // (ausser bei transparenten Frames) nicht uebergepinselt werden.
+ sal_Bool DrawTextOpaque( SwDrawTextInfo &rInf );
+
+ void DrawFlyRect( OutputDevice* pOut, const SwRect &rRect,
+ const SwTxtPaintInfo &rInf, sal_Bool bNoGraphic = sal_False );
+
+ // Liefert zurueck, ob die Zeile von einem Frame ueberlappt wird.
+ sal_Bool IsAnyFrm( const SwRect &rLine ) const;
+ sal_Bool IsAnyFrm() const;
+ //Das Rechteck kann leer sein, es gilt dann der Frm.
+ sal_Bool IsAnyObj( const SwRect& ) const;
+
+ void SetIgnoreCurrentFrame( sal_Bool bNew ) { mbIgnoreCurrentFrame = bNew; }
+ void SetIgnoreContour( sal_Bool bNew ) { mbIgnoreContour = bNew; }
+ // --> OD 2004-12-17 #118809#
+ inline void SetIgnoreObjsInHeaderFooter( const sal_Bool _bNew )
+ {
+ mbIgnoreObjsInHeaderFooter = _bNew;
+ }
+ // <--
+
+#ifdef DBG_UTIL
+ void ShowContour( OutputDevice* pOut );
+#endif
+};
+
+// Wenn in das rRect (meist die aktuelle Zeile) kein freifliegender
+// Frame ragt, dann schalten wir uns ab.
+// rRect ist dokumentglobal !
+inline sal_Bool SwTxtFly::Relax( const SwRect &rRect )
+{
+ return 0 != (bOn = bOn && IsAnyFrm( rRect ));
+}
+
+inline sal_Bool SwTxtFly::Relax()
+{
+ return 0 != (bOn = bOn && IsAnyFrm());
+}
+
+inline SwRect SwTxtFly::GetFrm( const SwRect &rRect, sal_Bool bTop ) const
+{
+ return bOn ? _GetFrm( rRect, bTop ) : SwRect();
+}
+
+
+#endif