1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #ifndef _TXTFLY_HXX 28 #define _TXTFLY_HXX 29 #include <svl/svarray.hxx> 30 31 #include "swtypes.hxx" 32 #include "swrect.hxx" 33 34 class OutputDevice; 35 class SwCntntFrm; 36 class SwPageFrm; 37 class SwTxtFly; 38 class SdrObject; 39 class SwTxtPaintInfo; 40 class SwFmt; 41 class TextRanger; 42 class Color; 43 // --> OD 2004-10-06 #i26945# 44 class SwAnchoredObject; 45 // <-- 46 47 // --> OD 2006-08-15 #i68520# - refactoring 48 //typedef MSHORT _FlyCntnt; 49 #include <fmtsrndenum.hxx> 50 // <-- 51 52 // --> OD 2006-08-15 #i68520# 53 //SV_DECL_PTRARR( SwFlyList, SdrObject*, 10, 10 ) 54 #include <vector> 55 typedef std::vector< SwAnchoredObject* > SwAnchoredObjList; 56 // <-- 57 58 /************************************************************************* 59 * class SwFlyIter 60 *************************************************************************/ 61 enum PAGESIDE { LEFT_SIDE, RIGHT_SIDE, DONTKNOW_SIDE }; 62 63 /************************************************************************* 64 * class SwContourCache 65 *************************************************************************/ 66 67 class SwDrawTextInfo; 68 // Contour-Cache, globale Variable, in txtinit.cxx initialisiert/zerstoert 69 // und in txtfly.cxx benutzt bei Konturumfluss 70 class SwContourCache; 71 extern SwContourCache *pContourCache; 72 class SwTxtFrm; 73 74 #define POLY_CNT 20 75 #define POLY_MIN 5 76 #define POLY_MAX 4000 77 78 class SwContourCache 79 { 80 friend void ClrContourCache(); 81 const SdrObject *pSdrObj[ POLY_CNT ]; 82 TextRanger *pTextRanger[ POLY_CNT ]; 83 long nPntCnt; 84 MSHORT nObjCnt; 85 const SwRect ContourRect( const SwFmt* pFmt, const SdrObject* pObj, 86 const SwTxtFrm* pFrm, const SwRect &rLine, const long nXPos, 87 const sal_Bool bRight ); 88 89 public: 90 SwContourCache(); 91 ~SwContourCache(); 92 const SdrObject* GetObject( MSHORT nPos ){ return pSdrObj[ nPos ]; } 93 MSHORT GetCount() const { return nObjCnt; } 94 void ClrObject( MSHORT nPos ); 95 // --> OD 2006-08-15 #i68520# 96 static const SwRect CalcBoundRect( const SwAnchoredObject* pAnchoredObj, 97 const SwRect &rLine, 98 const SwTxtFrm* pFrm, 99 const long nXPos, 100 const sal_Bool bRight ); 101 // <-- 102 #ifdef DBG_UTIL 103 void ShowContour( OutputDevice* pOut, const SdrObject* pObj, 104 const Color& rClosedColor, const Color& rOpenColor ); 105 #endif 106 }; 107 108 /************************************************************************* 109 * class SwTxtFly 110 *************************************************************************/ 111 112 class SwTxtFly 113 { 114 const SwPageFrm *pPage; 115 // --> OD 2006-08-15 #i68520# 116 const SwAnchoredObject* mpCurrAnchoredObj; 117 // <-- 118 119 const SwTxtFrm *pCurrFrm; 120 121 const SwCntntFrm *pMaster; 122 // --> OD 2006-08-15 #i68520# 123 SwAnchoredObjList* mpAnchoredObjList; 124 // <-- 125 126 long nMinBottom; 127 long nNextTop; // Hier wird die Oberkante des "naechsten" Rahmens gespeichert 128 sal_uLong nIndex; 129 sal_Bool bOn : 1; 130 sal_Bool bLeftSide : 1; 131 sal_Bool bTopRule: 1; 132 sal_Bool mbIgnoreCurrentFrame: 1; 133 sal_Bool mbIgnoreContour: 1; 134 // --> OD 2004-12-17 #118809# - boolean, indicating if objects in page 135 // header|footer are considered for text frames not in page header|footer. 136 sal_Bool mbIgnoreObjsInHeaderFooter: 1; 137 // <-- 138 SwRect _GetFrm( const SwRect &rPortion, sal_Bool bTop ) const; 139 // --> OD 2006-08-15 #i68520# 140 SwAnchoredObjList* InitAnchoredObjList(); 141 inline SwAnchoredObjList* GetAnchoredObjList() const 142 { 143 return mpAnchoredObjList 144 ? mpAnchoredObjList 145 : const_cast<SwTxtFly*>(this)->InitAnchoredObjList(); 146 } 147 // iterates over the anchored object list <mpAnchoredObjList> 148 sal_Bool ForEach( const SwRect &rRect, SwRect* pRect, sal_Bool bAvoid ) const; 149 SwSurround _GetSurroundForTextWrap( const SwAnchoredObject* pAnchoredObj ) const; 150 void CalcRightMargin( SwRect &rFly, 151 SwAnchoredObjList::size_type nPos, 152 const SwRect &rLine ) const; 153 void CalcLeftMargin( SwRect &rFly, 154 SwAnchoredObjList::size_type nPos, 155 const SwRect &rLine ) const; 156 SwAnchoredObjList::size_type GetPos( const SwAnchoredObject* pAnchoredObj ) const; 157 // <-- 158 // --> OD 2004-10-06 #i26945# - change first parameter: 159 // Now it's the <SwAnchoredObject> instance of the floating screen object 160 sal_Bool GetTop( const SwAnchoredObject* _pAnchoredObj, 161 const sal_Bool bInFtn, 162 const sal_Bool bInFooterOrHeader ); 163 // <-- 164 SwTwips CalcMinBottom() const; 165 const SwCntntFrm* _GetMaster(); 166 167 public: 168 inline SwTxtFly() 169 { 170 mbIgnoreCurrentFrame = sal_False; 171 mbIgnoreCurrentFrame = sal_False; 172 // --> OD 2004-12-17 #118809# 173 mbIgnoreObjsInHeaderFooter = sal_False; 174 // <-- 175 // --> OD 2006-08-15 #i68520# 176 mpCurrAnchoredObj = 0; 177 mpAnchoredObjList = 0; 178 // <-- 179 pMaster = 0; 180 } 181 inline SwTxtFly( const SwTxtFrm *pFrm ) 182 { CtorInitTxtFly( pFrm ); } 183 184 SwTxtFly( const SwTxtFly& rTxtFly ); 185 // --> OD 2006-08-15 #i68520# 186 inline ~SwTxtFly() { delete mpAnchoredObjList; } 187 // <-- 188 void CtorInitTxtFly( const SwTxtFrm *pFrm ); 189 void SetTopRule(){ bTopRule = sal_False; } 190 191 inline SwRect GetFrm( const SwRect &rPortion, sal_Bool bTop = sal_True ) const; 192 inline sal_Bool IsOn() const { return bOn; } 193 inline sal_Bool Relax( const SwRect &rRect ); 194 inline sal_Bool Relax(); 195 inline SwTwips GetMinBottom() const 196 // --> OD 2006-08-15 #i68520# 197 { return mpAnchoredObjList ? nMinBottom : CalcMinBottom(); } 198 // <-- 199 inline const SwCntntFrm* GetMaster() const 200 { return pMaster ? pMaster : ((SwTxtFly*)this)->_GetMaster(); } 201 inline long GetNextTop() const { return nNextTop; } 202 // Diese temporaere Variable darf auch in const-Methoden manipuliert werden 203 inline void SetNextTop( long nNew ) const 204 { ((SwTxtFly*)this)->nNextTop = nNew; } 205 206 // --> OD 2006-08-15 #i68520# 207 // determines the demanded rectangle for an anchored object, 208 // considering its surround for text wrapping. 209 SwRect AnchoredObjToRect( const SwAnchoredObject* pAnchoredObj, 210 const SwRect& rRect ) const; 211 // <-- 212 213 // Die Drawmethoden stellen sicher, dass ueberlappende Frames 214 // (ausser bei transparenten Frames) nicht uebergepinselt werden. 215 sal_Bool DrawTextOpaque( SwDrawTextInfo &rInf ); 216 217 void DrawFlyRect( OutputDevice* pOut, const SwRect &rRect, 218 const SwTxtPaintInfo &rInf, sal_Bool bNoGraphic = sal_False ); 219 220 // Liefert zurueck, ob die Zeile von einem Frame ueberlappt wird. 221 sal_Bool IsAnyFrm( const SwRect &rLine ) const; 222 sal_Bool IsAnyFrm() const; 223 //Das Rechteck kann leer sein, es gilt dann der Frm. 224 sal_Bool IsAnyObj( const SwRect& ) const; 225 226 void SetIgnoreCurrentFrame( sal_Bool bNew ) { mbIgnoreCurrentFrame = bNew; } 227 void SetIgnoreContour( sal_Bool bNew ) { mbIgnoreContour = bNew; } 228 // --> OD 2004-12-17 #118809# 229 inline void SetIgnoreObjsInHeaderFooter( const sal_Bool _bNew ) 230 { 231 mbIgnoreObjsInHeaderFooter = _bNew; 232 } 233 // <-- 234 235 #ifdef DBG_UTIL 236 void ShowContour( OutputDevice* pOut ); 237 #endif 238 }; 239 240 // Wenn in das rRect (meist die aktuelle Zeile) kein freifliegender 241 // Frame ragt, dann schalten wir uns ab. 242 // rRect ist dokumentglobal ! 243 inline sal_Bool SwTxtFly::Relax( const SwRect &rRect ) 244 { 245 return 0 != (bOn = bOn && IsAnyFrm( rRect )); 246 } 247 248 inline sal_Bool SwTxtFly::Relax() 249 { 250 return 0 != (bOn = bOn && IsAnyFrm()); 251 } 252 253 inline SwRect SwTxtFly::GetFrm( const SwRect &rRect, sal_Bool bTop ) const 254 { 255 return bOn ? _GetFrm( rRect, bTop ) : SwRect(); 256 } 257 258 259 #endif 260