merge the formfield patch from ooo-build
[ooovba.git] / sw / source / core / inc / rootfrm.hxx
blobee925015c543f03ac23db2d356fccb6b3c608df2
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: rootfrm.hxx,v $
10 * $Revision: 1.29 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
30 #ifndef _ROOTFRM_HXX
31 #define _ROOTFRM_HXX
32 #include "layfrm.hxx"
34 class SwCntntFrm;
35 class ViewShell;
36 class SdrPage;
37 class SwFrmFmt;
38 class SwPaM;
39 class SwCursor;
40 class SwShellCrsr;
41 class SwTableCursor;
42 class SwLayVout;
43 class SwDestroyList;
44 class SwCurrShells;
45 class SwViewOption;
46 class SwSelectionList;
47 struct SwPosition;
48 struct SwCrsrMoveState;
50 #define HACK_TABLEMODE_INIT 0
51 #define HACK_TABLEMODE_LOCKLINES 1
52 #define HACK_TABLEMODE_PAINTLINES 2
53 #define HACK_TABLEMODE_UNLOCKLINES 3
54 #define HACK_TABLEMODE_EXIT 4
56 #define INV_SIZE 1
57 #define INV_PRTAREA 2
58 #define INV_POS 4
59 #define INV_TABLE 8
60 #define INV_SECTION 16
61 #define INV_LINENUM 32
62 #define INV_DIRECTION 64
64 #include <vector>
66 class SwRootFrm: public SwLayoutFrm
68 //Muss das Superfluous temporaer abschalten.
69 friend void AdjustSizeChgNotify( SwRootFrm *pRoot );
71 //Pflegt pLastPage (Cut() und Paste() vom SwPageFrm
72 friend inline void SetLastPage( SwPageFrm* );
74 // Fuer das Anlegen und Zerstoeren des virtuellen Outputdevice-Managers
75 friend void _FrmInit(); //erzeugt pVout
76 friend void _FrmFinit(); //loescht pVout
78 // PAGES01
79 std::vector<SwRect> maPageRects;// returns the current rectangle for each page frame
80 // the rectangle is extended to the top/bottom/left/right
81 // for pages located at the outer borders
82 SwRect maPagesArea; // the area covered by the pages
83 long mnViewWidth; // the current page layout bases on this view width
84 USHORT mnColumns; // the current page layout bases on this number of columns
85 bool mbBookMode; // the current page layout is in book view
86 bool mbSidebarChanged; // the notes sidebar state has changed
87 // <--
89 bool mbNeedGrammarCheck; // true when sth needs to be checked (not necessarily started yet!)
91 static SwLayVout *pVout;
92 static BOOL bInPaint; //Schutz gegen doppelte Paints.
93 static BOOL bNoVirDev; //Bei SystemPaints kein virt. Device
95 BOOL bCheckSuperfluous :1; //Leere Seiten suchen?
96 BOOL bIdleFormat :1; //Idle-Formatierer anwerfen?
97 BOOL bBrowseWidthValid :1; //Ist nBrowseWidth gueltig?
98 BOOL bDummy2 :1; //Unbenutzt
99 BOOL bTurboAllowed :1;
100 BOOL bAssertFlyPages :1; //Ggf. weitere Seiten fuer Flys einfuegen?
101 BOOL bDummy :1; //Unbenutzt
102 BOOL bIsVirtPageNum :1; //gibt es eine virtuelle Seitennummer ?
103 BOOL bIsNewLayout :1; //Layout geladen oder neu erzeugt.
104 BOOL bCallbackActionEnabled:1; //Keine Action in Benachrichtung erwuenscht
105 //siehe dcontact.cxx, ::Changed()
107 //Fuer den BrowseMode. nBrowseWidth ist die Aeussere Kante des am weitesten
108 //rechts stehenden Objectes. Die rechte Kante der Seiten soll im BrowseMode
109 //nicht kleiner werden als dieser Wert.
110 long nBrowseWidth;
112 //Wenn nur _ein: CntntFrm zu formatieren ist, so steht dieser in pTurbo.
113 const SwCntntFrm *pTurbo;
115 //Die letzte Seite wollen wir uns nicht immer muehsam zusammensuchen.
116 SwPageFrm *pLastPage;
118 //Die Root kuemmert sich nun auch um den Shell-Zugriff. Ueber das Dokument
119 //sollte man auch immer an die Root herankommen und somit auch immer
120 //einen Zugriff auf die Shell haben.
121 //Der Pointer pCurrShell ist der Pointer auf irgendeine der Shells fuer
122 //das Dokument
123 //Da es durchaus nicht immer egal ist, auf welcher Shell gearbeitet wird,
124 //ist es notwendig die aktive Shell zu kennen. Das wird dadurch angenaehert,
125 //dass der Pointer pCurrShell immer dann umgesetzt wird, wenn eine
126 //Shell den Fokus erhaelt (FEShell). Zusaetzlich wird der Pointer
127 //Temporaer von SwCurrShell umgesetzt, dieses wird typischerweise
128 //ueber das Macro SET_CURR_SHELL erledigt. Makro + Klasse sind in der
129 //ViewShell zu finden. Diese Objekte koennen auch verschachtelt (auch fuer
130 //unterschiedliche Shells) erzeugt werden. Sie werden im Array pCurrShells
131 //gesammelt.
132 //Weiterhin kann es noch vorkommen, dass eine Shell aktiviert wird,
133 //waehrend noch ein CurrShell-Objekt "aktiv" ist. Dieses wird dann in
134 //pWaitingCurrShell eingetragen und vom letzten DTor der CurrShell
135 //"aktiviert".
136 //Ein weiteres Problem ist dass Zerstoeren einer Shell waehrend sie aktiv
137 //ist. Der Pointer pCurrShell wird dann auf eine beliebige andere Shell
138 //umgesetzt.
139 //Wenn zum Zeitpunkt der zerstoerung einer Shell diese noch in irgendwelchen
140 //CurrShell-Objekten referenziert wird, so wird auch dies aufgeklart.
141 friend class CurrShell;
142 friend void SetShell( ViewShell *pSh );
143 friend void InitCurrShells( SwRootFrm *pRoot );
144 ViewShell *pCurrShell;
145 ViewShell *pWaitingCurrShell;
146 SwCurrShells *pCurrShells;
148 //Eine Page im DrawModel pro Dokument, hat immer die Groesse der Root.
149 SdrPage *pDrawPage;
151 SwDestroyList* pDestroy;
153 USHORT nPhyPageNums; //Anzahl der Seiten.
154 sal_uInt16 nAccessibleShells; // Number of accessible shells
156 void ImplCalcBrowseWidth();
157 void ImplInvalidateBrowseWidth();
159 void _DeleteEmptySct(); // zerstoert ggf. die angemeldeten SectionFrms
160 void _RemoveFromList( SwSectionFrm* pSct ); // entfernt SectionFrms aus der Delete-Liste
162 protected:
164 virtual void MakeAll();
166 public:
168 //MasterObjekte aus der Page entfernen (von den Ctoren gerufen).
169 static void RemoveMasterObjs( SdrPage *pPg );
171 //Virtuelles Device ausgeben (z.B. wenn Animationen ins Spiel kommen)
172 static BOOL FlushVout();
173 //Clipping sparen, wenn im Vout eh genau das Cliprechteck ausgegeben wird
174 static BOOL HasSameRect( const SwRect& rRect );
176 SwRootFrm( SwFrmFmt*, ViewShell* );
177 ~SwRootFrm();
179 ViewShell *GetCurrShell() const { return pCurrShell; }
180 void DeRegisterShell( ViewShell *pSh );
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( BOOL bVirDev = FALSE );
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();
196 const SdrPage* GetDrawPage() const { return pDrawPage; }
197 SdrPage* GetDrawPage() { return pDrawPage; }
198 void SetDrawPage( SdrPage* pNew ){ pDrawPage = pNew; }
200 virtual BOOL GetCrsrOfst( SwPosition *, Point&,
201 SwCrsrMoveState* = 0 ) const;
203 virtual void Paint( const SwRect& ) const;
204 virtual SwTwips ShrinkFrm( SwTwips, BOOL bTst = FALSE, BOOL bInfo = FALSE );
205 virtual SwTwips GrowFrm ( SwTwips, BOOL bTst = FALSE, BOOL bInfo = FALSE );
206 #ifndef PRODUCT
207 virtual void Cut();
208 virtual void Paste( SwFrm* pParent, SwFrm* pSibling = 0 );
209 #endif
211 virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const;
213 Point GetNextPrevCntntPos( const Point &rPoint, BOOL bNext ) const;
215 virtual Size ChgSize( const Size& aNewSize );
217 void SetIdleFlags() { bIdleFormat = TRUE; }
218 BOOL IsIdleFormat() const { return bIdleFormat; }
219 void ResetIdleFormat() { bIdleFormat = FALSE; }
221 bool IsNeedGrammarCheck() const { return mbNeedGrammarCheck; }
222 void SetNeedGrammarCheck( bool bVal ) { mbNeedGrammarCheck = bVal; }
224 //Sorgt dafuer, dass alle gewuenschten Seitengebunden Flys eine Seite finden
225 void SetAssertFlyPages() { bAssertFlyPages = TRUE; }
226 void AssertFlyPages();
227 BOOL IsAssertFlyPages() { return bAssertFlyPages; }
229 //Stellt sicher, dass ab der uebergebenen Seite auf allen Seiten die
230 //Seitengebundenen Rahmen auf der richtigen Seite (Seitennummer) stehen.
231 void AssertPageFlys( SwPageFrm * );
233 //Saemtlichen Inhalt invalidieren, Size oder PrtArea
234 void InvalidateAllCntnt( BYTE nInvalidate = INV_SIZE );
236 /** method to invalidate/re-calculate the position of all floating
237 screen objects (Writer fly frames and drawing objects), which are
238 anchored to paragraph or to character.
240 OD 2004-03-16 #i11860#
242 @author OD
244 void InvalidateAllObjPos();
246 //Ueberfluessige Seiten entfernen.
247 void SetSuperfluous() { bCheckSuperfluous = TRUE; }
248 BOOL IsSuperfluous() const { return bCheckSuperfluous; }
249 void RemoveSuperfluous();
251 //abfragen/setzen der aktuellen Seite und der Gesamtzahl der Seiten.
252 //Es wird soweit wie notwendig Formatiert.
253 USHORT GetCurrPage( const SwPaM* ) const;
254 USHORT SetCurrPage( SwCursor*, USHORT nPageNum );
255 Point GetPagePos( USHORT nPageNum ) const;
256 USHORT GetPageNum() const { return nPhyPageNums; }
257 void DecrPhyPageNums() { --nPhyPageNums; }
258 void IncrPhyPageNums() { ++nPhyPageNums; }
259 BOOL IsVirtPageNum() const { return bIsVirtPageNum; }
260 inline void SetVirtPageNum( const BOOL bOf ) const;
261 BOOL IsDummyPage( USHORT nPageNum ) const;
263 // Point rPt: The point that should be used to find the page
264 // Size pSize: If given, we return the (first) page that overlaps with the
265 // rectangle defined by rPt and pSize
266 // bool bExtend: Extend each page to the left/right/top/botton up to the
267 // next page border
268 const SwPageFrm* GetPageAtPos( const Point& rPt, const Size* pSize = 0, bool bExtend = false ) const;
270 //Der Crsr moechte die zu selektierenden Bereiche wissen.
271 void CalcFrmRects( SwShellCrsr&, BOOL bIsTblSel );
273 // Calculates the cells included from the current selection
274 // false: There was no result because of an invalid layout
275 // true: Everything worked fine.
276 bool MakeTblCrsrs( SwTableCursor& );
278 void DisallowTurbo() const { ((SwRootFrm*)this)->bTurboAllowed = FALSE; }
279 void ResetTurboFlag() const { ((SwRootFrm*)this)->bTurboAllowed = TRUE; }
280 BOOL IsTurboAllowed() const { return bTurboAllowed; }
281 void SetTurbo( const SwCntntFrm *pCntnt ) { pTurbo = pCntnt; }
282 void ResetTurbo() { pTurbo = 0; }
283 const SwCntntFrm *GetTurbo() { return pTurbo; }
285 //Fussnotennummern aller Seiten auf den neuesten Stand bringen.
286 void UpdateFtnNums(); //nur bei Seitenweiser Nummerierung!
288 //Alle Fussnoten (nicht etwa die Referenzen) entfernen.
289 void RemoveFtns( SwPageFrm *pPage = 0, BOOL bPageOnly = FALSE,
290 BOOL bEndNotes = FALSE );
291 void CheckFtnPageDescs( BOOL bEndNote );
293 const SwPageFrm *GetLastPage() const { return pLastPage; }
294 SwPageFrm *GetLastPage() { return pLastPage; }
296 static BOOL IsInPaint() { return bInPaint; }
298 static void SetNoVirDev( const BOOL bNew ) { bNoVirDev = bNew; }
300 inline long GetBrowseWidth() const;
301 void SetBrowseWidth( long n ) { bBrowseWidthValid = TRUE; nBrowseWidth = n;}
302 inline void InvalidateBrowseWidth();
304 #ifdef LONG_TABLE_HACK
305 void HackPrepareLongTblPaint( int nMode );
306 #endif
308 BOOL IsNewLayout() const { return bIsNewLayout; }
309 void ResetNewLayout() { bIsNewLayout = FALSE;}
311 // Hier werden leere SwSectionFrms zur Zerstoerung angemeldet
312 // und spaeter zerstoert oder wieder abgemeldet
313 void InsertEmptySct( SwSectionFrm* pDel );
314 void DeleteEmptySct() { if( pDestroy ) _DeleteEmptySct(); }
315 void RemoveFromList( SwSectionFrm* pSct ) { if( pDestroy ) _RemoveFromList( pSct ); }
316 #ifndef PRODUCT
317 // Wird zur Zeit nur fuer ASSERTs benutzt:
318 BOOL IsInDelList( SwSectionFrm* pSct ) const; // Ist der SectionFrm in der Liste enthalten?
319 #endif
322 void SetCallbackActionEnabled( BOOL b ) { bCallbackActionEnabled = b; }
323 BOOL IsCallbackActionEnabled() const { return bCallbackActionEnabled; }
325 sal_Bool IsAnyShellAccessible() const { return nAccessibleShells > 0; }
326 void AddAccessibleShell() { ++nAccessibleShells; }
327 void RemoveAccessibleShell() { --nAccessibleShells; }
329 /** get page frame by phyiscal page number
331 OD 14.01.2003 #103492#
332 looping through the lowers, which are page frame, in order to find the
333 page frame with the given physical page number.
334 if no page frame is found, 0 is returned.
335 Note: Empty page frames are also returned.
337 @param _nPageNum
338 input parameter - physical page number of page frame to be searched and
339 returned.
341 @return pointer to the page frame with the given physical page number
343 SwPageFrm* GetPageByPageNum( sal_uInt16 _nPageNum ) const;
345 // --> PAGES01
346 void CheckViewLayout( const SwViewOption* pViewOpt, const SwRect* pVisArea );
347 bool IsLeftToRightViewLayout() const;
348 const SwRect& GetPagesArea() const { return maPagesArea; }
349 void SetSidebarChanged() { mbSidebarChanged = true; }
350 // <--
353 inline long SwRootFrm::GetBrowseWidth() const
355 if ( !bBrowseWidthValid )
356 ((SwRootFrm*)this)->ImplCalcBrowseWidth();
357 return nBrowseWidth;
360 inline void SwRootFrm::InvalidateBrowseWidth()
362 if ( bBrowseWidthValid )
363 ImplInvalidateBrowseWidth();
366 inline void SwRootFrm::SetVirtPageNum( const BOOL bOf) const
368 ((SwRootFrm*)this)->bIsVirtPageNum = bOf;
371 #endif //_ROOTFRM_HXX