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 SW_ROOTFRM_HXX 24 #define SW_ROOTFRM_HXX 25 26 #include "layfrm.hxx" 27 28 class SwCntntFrm; 29 class ViewShell; 30 class SdrPage; 31 class SwFrmFmt; 32 class SwPaM; 33 class SwCursor; 34 class SwShellCrsr; 35 class SwTableCursor; 36 class SwLayVout; 37 class SwDestroyList; 38 class SwCurrShells; 39 class SwViewOption; 40 class SwSelectionList; 41 struct SwPosition; 42 struct SwCrsrMoveState; 43 44 #define HACK_TABLEMODE_INIT 0 45 #define HACK_TABLEMODE_LOCKLINES 1 46 #define HACK_TABLEMODE_PAINTLINES 2 47 #define HACK_TABLEMODE_UNLOCKLINES 3 48 #define HACK_TABLEMODE_EXIT 4 49 50 #define INV_SIZE 1 51 #define INV_PRTAREA 2 52 #define INV_POS 4 53 #define INV_TABLE 8 54 #define INV_SECTION 16 55 #define INV_LINENUM 32 56 #define INV_DIRECTION 64 57 58 #include <vector> 59 60 class SwRootFrm: public SwLayoutFrm 61 { 62 //Muss das Superfluous temporaer abschalten. 63 friend void AdjustSizeChgNotify( SwRootFrm *pRoot ); 64 65 //Pflegt pLastPage (Cut() und Paste() vom SwPageFrm 66 friend inline void SetLastPage( SwPageFrm* ); 67 68 // Fuer das Anlegen und Zerstoeren des virtuellen Outputdevice-Managers 69 friend void _FrmInit(); //erzeugt pVout 70 friend void _FrmFinit(); //loescht pVout 71 72 // PAGES01 73 std::vector<SwRect> maPageRects;// returns the current rectangle for each page frame 74 // the rectangle is extended to the top/bottom/left/right 75 // for pages located at the outer borders 76 SwRect maPagesArea; // the area covered by the pages 77 long mnViewWidth; // the current page layout bases on this view width 78 sal_uInt16 mnColumns; // the current page layout bases on this number of columns 79 bool mbBookMode; // the current page layout is in book view 80 bool mbSidebarChanged; // the notes sidebar state has changed 81 // <-- 82 83 bool mbNeedGrammarCheck; // true when sth needs to be checked (not necessarily started yet!) 84 85 static SwLayVout *pVout; 86 static sal_Bool bInPaint; //Schutz gegen doppelte Paints. 87 static sal_Bool bNoVirDev; //Bei SystemPaints kein virt. Device 88 89 sal_Bool bCheckSuperfluous :1; //Leere Seiten suchen? 90 sal_Bool bIdleFormat :1; //Idle-Formatierer anwerfen? 91 sal_Bool bBrowseWidthValid :1; //Ist nBrowseWidth gueltig? 92 sal_Bool bDummy2 :1; //Unbenutzt 93 sal_Bool bTurboAllowed :1; 94 sal_Bool bAssertFlyPages :1; //Ggf. weitere Seiten fuer Flys einfuegen? 95 sal_Bool bDummy :1; //Unbenutzt 96 sal_Bool bIsVirtPageNum :1; //gibt es eine virtuelle Seitennummer ? 97 sal_Bool bIsNewLayout :1; //Layout geladen oder neu erzeugt. 98 sal_Bool bCallbackActionEnabled:1; //Keine Action in Benachrichtung erwuenscht 99 //siehe dcontact.cxx, ::Changed() 100 101 //Fuer den BrowseMode. nBrowseWidth ist die Aeussere Kante des am weitesten 102 //rechts stehenden Objectes. Die rechte Kante der Seiten soll im BrowseMode 103 //nicht kleiner werden als dieser Wert. 104 long nBrowseWidth; 105 106 //Wenn nur _ein: CntntFrm zu formatieren ist, so steht dieser in pTurbo. 107 const SwCntntFrm *pTurbo; 108 109 //Die letzte Seite wollen wir uns nicht immer muehsam zusammensuchen. 110 SwPageFrm *pLastPage; 111 112 //Die Root kuemmert sich nun auch um den Shell-Zugriff. Ueber das Dokument 113 //sollte man auch immer an die Root herankommen und somit auch immer 114 //einen Zugriff auf die Shell haben. 115 //Der Pointer pCurrShell ist der Pointer auf irgendeine der Shells fuer 116 //das Dokument 117 //Da es durchaus nicht immer egal ist, auf welcher Shell gearbeitet wird, 118 //ist es notwendig die aktive Shell zu kennen. Das wird dadurch angenaehert, 119 //dass der Pointer pCurrShell immer dann umgesetzt wird, wenn eine 120 //Shell den Fokus erhaelt (FEShell). Zusaetzlich wird der Pointer 121 //Temporaer von SwCurrShell umgesetzt, dieses wird typischerweise 122 //ueber das Macro SET_CURR_SHELL erledigt. Makro + Klasse sind in der 123 //ViewShell zu finden. Diese Objekte koennen auch verschachtelt (auch fuer 124 //unterschiedliche Shells) erzeugt werden. Sie werden im Array pCurrShells 125 //gesammelt. 126 //Weiterhin kann es noch vorkommen, dass eine Shell aktiviert wird, 127 //waehrend noch ein CurrShell-Objekt "aktiv" ist. Dieses wird dann in 128 //pWaitingCurrShell eingetragen und vom letzten DTor der CurrShell 129 //"aktiviert". 130 //Ein weiteres Problem ist dass Zerstoeren einer Shell waehrend sie aktiv 131 //ist. Der Pointer pCurrShell wird dann auf eine beliebige andere Shell 132 //umgesetzt. 133 //Wenn zum Zeitpunkt der zerstoerung einer Shell diese noch in irgendwelchen 134 //CurrShell-Objekten referenziert wird, so wird auch dies aufgeklart. 135 friend class CurrShell; 136 friend void SetShell( ViewShell *pSh ); 137 friend void InitCurrShells( SwRootFrm *pRoot ); 138 ViewShell *pCurrShell; 139 ViewShell *pWaitingCurrShell; 140 SwCurrShells *pCurrShells; 141 142 //Eine Page im DrawModel pro Dokument, hat immer die Groesse der Root. 143 SdrPage *pDrawPage; 144 145 SwDestroyList* pDestroy; 146 147 sal_uInt16 nPhyPageNums; //Anzahl der Seiten. 148 sal_uInt16 nAccessibleShells; // Number of accessible shells 149 150 void ImplCalcBrowseWidth(); 151 void ImplInvalidateBrowseWidth(); 152 153 void _DeleteEmptySct(); // zerstoert ggf. die angemeldeten SectionFrms 154 void _RemoveFromList( SwSectionFrm* pSct ); // entfernt SectionFrms aus der Delete-Liste 155 156 protected: 157 158 virtual void MakeAll(); 159 160 public: 161 162 //MasterObjekte aus der Page entfernen (von den Ctoren gerufen). 163 static void RemoveMasterObjs( SdrPage *pPg ); 164 165 void AllCheckPageDescs() const;//swmod 080226 166 void AllInvalidateAutoCompleteWords() const;//swmod 080305 167 void AllAddPaintRect() const; 168 void AllRemoveFtns() ;//swmod 080305 169 void AllInvalidateSmartTagsOrSpelling(sal_Bool bSmartTags) const;//swmod 080307 170 //Virtuelles Device ausgeben (z.B. wenn Animationen ins Spiel kommen) 171 static sal_Bool FlushVout(); 172 //Clipping sparen, wenn im Vout eh genau das Cliprechteck ausgegeben wird 173 static sal_Bool HasSameRect( const SwRect& rRect ); 174 175 SwRootFrm( SwFrmFmt*, ViewShell* ); 176 ~SwRootFrm(); 177 void Init(SwFrmFmt*); 178 179 ViewShell *GetCurrShell() const { return pCurrShell; } 180 void DeRegisterShell( ViewShell *pSh ); 181 182 //Start-/EndAction fuer alle Shells auf moeglichst hoeher 183 //(Shell-Ableitungs-)Ebene aufsetzen. Fuer die StarONE Anbindung, die 184 //die Shells nicht dirkt kennt. 185 //Der ChangeLinkd der CrsrShell (UI-Benachrichtigung) wird im EndAllAction 186 //automatisch gecallt. 187 void StartAllAction(); 188 void EndAllAction( sal_Bool bVirDev = sal_False ); 189 190 // fuer bestimmte UNO-Aktionen (Tabellencursor) ist es notwendig, dass alle Actions 191 // kurzfristig zurueckgesetzt werden. Dazu muss sich jede ViewShell ihren alten Action-zaehler 192 // merken 193 void UnoRemoveAllActions(); 194 void UnoRestoreAllActions(); 195 196 const SdrPage* GetDrawPage() const { return pDrawPage; } 197 SdrPage* GetDrawPage() { return pDrawPage; } 198 void SetDrawPage( SdrPage* pNew ){ pDrawPage = pNew; } 199 200 virtual sal_Bool GetCrsrOfst( SwPosition *, Point&, 201 SwCrsrMoveState* = 0 ) const; 202 203 virtual void Paint( SwRect const&, 204 SwPrintData const*const pPrintData = NULL ) const; 205 virtual SwTwips ShrinkFrm( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ); 206 virtual SwTwips GrowFrm ( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ); 207 #ifdef DBG_UTIL 208 virtual void Cut(); 209 virtual void Paste( SwFrm* pParent, SwFrm* pSibling = 0 ); 210 #endif 211 212 virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const; 213 214 Point GetNextPrevCntntPos( const Point &rPoint, sal_Bool bNext ) const; 215 216 virtual Size ChgSize( const Size& aNewSize ); 217 218 void SetIdleFlags() { bIdleFormat = sal_True; } 219 sal_Bool IsIdleFormat() const { return bIdleFormat; } 220 void ResetIdleFormat() { bIdleFormat = sal_False; } 221 222 bool IsNeedGrammarCheck() const { return mbNeedGrammarCheck; } 223 void SetNeedGrammarCheck( bool bVal ) { mbNeedGrammarCheck = bVal; } 224 225 //Sorgt dafuer, dass alle gewuenschten Seitengebunden Flys eine Seite finden 226 void SetAssertFlyPages() { bAssertFlyPages = sal_True; } 227 void AssertFlyPages(); 228 sal_Bool IsAssertFlyPages() { return bAssertFlyPages; } 229 230 //Stellt sicher, dass ab der uebergebenen Seite auf allen Seiten die 231 //Seitengebundenen Rahmen auf der richtigen Seite (Seitennummer) stehen. 232 void AssertPageFlys( SwPageFrm * ); 233 234 //Saemtlichen Inhalt invalidieren, Size oder PrtArea 235 void InvalidateAllCntnt( sal_uInt8 nInvalidate = INV_SIZE ); 236 237 /** method to invalidate/re-calculate the position of all floating 238 screen objects (Writer fly frames and drawing objects), which are 239 anchored to paragraph or to character. 240 241 OD 2004-03-16 #i11860# 242 243 @author OD 244 */ 245 void InvalidateAllObjPos(); 246 247 //Ueberfluessige Seiten entfernen. 248 void SetSuperfluous() { bCheckSuperfluous = sal_True; } 249 sal_Bool IsSuperfluous() const { return bCheckSuperfluous; } 250 void RemoveSuperfluous(); 251 252 //abfragen/setzen der aktuellen Seite und der Gesamtzahl der Seiten. 253 //Es wird soweit wie notwendig Formatiert. 254 sal_uInt16 GetCurrPage( const SwPaM* ) const; 255 sal_uInt16 SetCurrPage( SwCursor*, sal_uInt16 nPageNum ); 256 Point GetPagePos( sal_uInt16 nPageNum ) const; 257 sal_uInt16 GetPageNum() const { return nPhyPageNums; } 258 void DecrPhyPageNums() { --nPhyPageNums; } 259 void IncrPhyPageNums() { ++nPhyPageNums; } 260 sal_Bool IsVirtPageNum() const { return bIsVirtPageNum; } 261 inline void SetVirtPageNum( const sal_Bool bOf ) const; 262 sal_Bool IsDummyPage( sal_uInt16 nPageNum ) const; 263 264 // Point rPt: The point that should be used to find the page 265 // Size pSize: If given, we return the (first) page that overlaps with the 266 // rectangle defined by rPt and pSize 267 // bool bExtend: Extend each page to the left/right/top/botton up to the 268 // next page border 269 const SwPageFrm* GetPageAtPos( const Point& rPt, const Size* pSize = 0, bool bExtend = false ) const; 270 271 void CalcFrmRects( 272 SwShellCrsr&, 273 const sal_Bool bIsTblSel ); 274 275 // Calculates the cells included from the current selection 276 // false: There was no result because of an invalid layout 277 // true: Everything worked fine. 278 bool MakeTblCrsrs( SwTableCursor& ); 279 280 void DisallowTurbo() const { ((SwRootFrm*)this)->bTurboAllowed = sal_False; } 281 void ResetTurboFlag() const { ((SwRootFrm*)this)->bTurboAllowed = sal_True; } 282 sal_Bool IsTurboAllowed() const { return bTurboAllowed; } 283 void SetTurbo( const SwCntntFrm *pCntnt ) { pTurbo = pCntnt; } 284 void ResetTurbo() { pTurbo = 0; } 285 const SwCntntFrm *GetTurbo() { return pTurbo; } 286 287 //Fussnotennummern aller Seiten auf den neuesten Stand bringen. 288 void UpdateFtnNums(); //nur bei Seitenweiser Nummerierung! 289 290 //Alle Fussnoten (nicht etwa die Referenzen) entfernen. 291 void RemoveFtns( SwPageFrm *pPage = 0, sal_Bool bPageOnly = sal_False, 292 sal_Bool bEndNotes = sal_False ); 293 void CheckFtnPageDescs( sal_Bool bEndNote ); 294 295 const SwPageFrm *GetLastPage() const { return pLastPage; } 296 SwPageFrm *GetLastPage() { return pLastPage; } 297 298 static sal_Bool IsInPaint() { return bInPaint; } 299 300 static void SetNoVirDev( const sal_Bool bNew ) { bNoVirDev = bNew; } 301 302 inline long GetBrowseWidth() const; 303 void SetBrowseWidth( long n ) { bBrowseWidthValid = sal_True; nBrowseWidth = n;} 304 inline void InvalidateBrowseWidth(); 305 306 #ifdef LONG_TABLE_HACK 307 void HackPrepareLongTblPaint( int nMode ); 308 #endif 309 310 sal_Bool IsNewLayout() const { return bIsNewLayout; } 311 void ResetNewLayout() { bIsNewLayout = sal_False;} 312 313 // Hier werden leere SwSectionFrms zur Zerstoerung angemeldet 314 // und spaeter zerstoert oder wieder abgemeldet 315 void InsertEmptySct( SwSectionFrm* pDel ); 316 void DeleteEmptySct() { if( pDestroy ) _DeleteEmptySct(); } 317 void RemoveFromList( SwSectionFrm* pSct ) { if( pDestroy ) _RemoveFromList( pSct ); } 318 #ifdef DBG_UTIL 319 // Wird zur Zeit nur fuer ASSERTs benutzt: 320 sal_Bool IsInDelList( SwSectionFrm* pSct ) const; // Ist der SectionFrm in der Liste enthalten? 321 #endif 322 323 324 void SetCallbackActionEnabled( sal_Bool b ) { bCallbackActionEnabled = b; } 325 sal_Bool IsCallbackActionEnabled() const { return bCallbackActionEnabled; } 326 327 sal_Bool IsAnyShellAccessible() const { return nAccessibleShells > 0; } 328 void AddAccessibleShell() { ++nAccessibleShells; } 329 void RemoveAccessibleShell() { --nAccessibleShells; } 330 331 /** get page frame by phyiscal page number 332 333 OD 14.01.2003 #103492# 334 looping through the lowers, which are page frame, in order to find the 335 page frame with the given physical page number. 336 if no page frame is found, 0 is returned. 337 Note: Empty page frames are also returned. 338 339 @param _nPageNum 340 input parameter - physical page number of page frame to be searched and 341 returned. 342 343 @return pointer to the page frame with the given physical page number 344 */ 345 SwPageFrm* GetPageByPageNum( sal_uInt16 _nPageNum ) const; 346 347 // --> PAGES01 348 void CheckViewLayout( const SwViewOption* pViewOpt, const SwRect* pVisArea ); 349 bool IsLeftToRightViewLayout() const; 350 const SwRect& GetPagesArea() const { return maPagesArea; } 351 void SetSidebarChanged() { mbSidebarChanged = true; } 352 // <-- 353 }; 354 355 inline long SwRootFrm::GetBrowseWidth() const 356 { 357 if ( !bBrowseWidthValid ) 358 ((SwRootFrm*)this)->ImplCalcBrowseWidth(); 359 return nBrowseWidth; 360 } 361 362 inline void SwRootFrm::InvalidateBrowseWidth() 363 { 364 if ( bBrowseWidthValid ) 365 ImplInvalidateBrowseWidth(); 366 } 367 368 inline void SwRootFrm::SetVirtPageNum( const sal_Bool bOf) const 369 { 370 ((SwRootFrm*)this)->bIsVirtPageNum = bOf; 371 } 372 373 #endif // SW_ROOTFRM_HXX 374 375