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