1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: rootfrm.hxx,v $
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 ************************************************************************/
46 class SwSelectionList
;
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
60 #define INV_SECTION 16
61 #define INV_LINENUM 32
62 #define INV_DIRECTION 64
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
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
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.
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
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
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
136 //Ein weiteres Problem ist dass Zerstoeren einer Shell waehrend sie aktiv
137 //ist. Der Pointer pCurrShell wird dann auf eine beliebige andere Shell
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.
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
164 virtual void MakeAll();
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
* );
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
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
);
208 virtual void Paste( SwFrm
* pParent
, SwFrm
* pSibling
= 0 );
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#
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
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
);
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
); }
317 // Wird zur Zeit nur fuer ASSERTs benutzt:
318 BOOL
IsInDelList( SwSectionFrm
* pSct
) const; // Ist der SectionFrm in der Liste enthalten?
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.
338 input parameter - physical page number of page frame to be searched and
341 @return pointer to the page frame with the given physical page number
343 SwPageFrm
* GetPageByPageNum( sal_uInt16 _nPageNum
) const;
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; }
353 inline long SwRootFrm::GetBrowseWidth() const
355 if ( !bBrowseWidthValid
)
356 ((SwRootFrm
*)this)->ImplCalcBrowseWidth();
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