xref: /aoo4110/main/sw/source/core/inc/tabfrm.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #ifndef SW_TABFRM_HXX
24*b1cdbd2cSJim Jagielski #define SW_TABFRM_HXX
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <tools/mempool.hxx>
27*b1cdbd2cSJim Jagielski #include "layfrm.hxx"
28*b1cdbd2cSJim Jagielski #include "flowfrm.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski class SwTable;
31*b1cdbd2cSJim Jagielski class SwBorderAttrs;
32*b1cdbd2cSJim Jagielski class SwAttrSetChg;
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski class SwTabFrm: public SwLayoutFrm, public SwFlowFrm
35*b1cdbd2cSJim Jagielski {
36*b1cdbd2cSJim Jagielski     friend void CalcCntnt( SwLayoutFrm *pLay, bool bNoColl, bool bNoCalcFollow );
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski     //Fuert Spezialbehandlung fuer _Get[Next|Prev]Leaf() durch.
39*b1cdbd2cSJim Jagielski     using SwFrm::GetLeaf;
40*b1cdbd2cSJim Jagielski     SwLayoutFrm *GetLeaf( MakePageType eMakePage, sal_Bool bFwd );
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski     SwTable* pTable;
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski     sal_Bool bComplete	        :1; //Eintrage als Repaint ohne das CompletePaint
45*b1cdbd2cSJim Jagielski                                     //der Basisklasse gesetzt werden muss. Damit
46*b1cdbd2cSJim Jagielski                                     //sollen unertraegliche Tabellen-Repaints
47*b1cdbd2cSJim Jagielski                                     //vermieden werden.
48*b1cdbd2cSJim Jagielski     sal_Bool bCalcLowers        :1; //Im MakeAll auf jedenfall auch fuer Stabilitaet
49*b1cdbd2cSJim Jagielski     //des Inhaltes sorgen.
50*b1cdbd2cSJim Jagielski     sal_Bool bLowersFormatted   :1;//Kommunikation zwischen MakeAll und Layact
51*b1cdbd2cSJim Jagielski     sal_Bool bLockBackMove      :1; //BackMove-Test hat der Master erledigt.
52*b1cdbd2cSJim Jagielski     sal_Bool bResizeHTMLTable   :1; //Resize des HTMLTableLayout rufen im MakeAll
53*b1cdbd2cSJim Jagielski     //Zur Optimierung, damit dies nicht im
54*b1cdbd2cSJim Jagielski     //CntntFrm::Grow gerufen werden muss, denn dann
55*b1cdbd2cSJim Jagielski     //wird es ggf. fuer jede Zelle gerufen #47483#
56*b1cdbd2cSJim Jagielski     sal_Bool bONECalcLowers     :1; //Primaer fuer die StarONE-SS. Beim MakeAll werden
57*b1cdbd2cSJim Jagielski     //die Cntnts auf jedenfall per Calc() formatiert.
58*b1cdbd2cSJim Jagielski     //es finden keine zusaetzlichen Invalidierungen
59*b1cdbd2cSJim Jagielski     //statt und dieser Weg kann auch kaum garantien
60*b1cdbd2cSJim Jagielski     //geben.
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski     sal_Bool bHasFollowFlowLine :1; // Means that the first line in the follow
63*b1cdbd2cSJim Jagielski                                 // is indented to contain content from a broken
64*b1cdbd2cSJim Jagielski                                 // cell
65*b1cdbd2cSJim Jagielski     sal_Bool bIsRebuildLastLine :1; // Means that currently the last line of the
66*b1cdbd2cSJim Jagielski                                 // TabFrame is rebuilded. In this case we
67*b1cdbd2cSJim Jagielski                                 // do not want any notification to the master
68*b1cdbd2cSJim Jagielski                                 // table
69*b1cdbd2cSJim Jagielski     sal_Bool bRestrictTableGrowth :1;       // Usually, the table may grow infinite,
70*b1cdbd2cSJim Jagielski                                         // because the table can be split in
71*b1cdbd2cSJim Jagielski                                         // SwTabFrm::MakeAll. In MakeAll, this
72*b1cdbd2cSJim Jagielski                                         // flag is set to indicate that the table
73*b1cdbd2cSJim Jagielski                                         // may only grow inside its upper. This
74*b1cdbd2cSJim Jagielski                                         // is necessary, in order to let the text
75*b1cdbd2cSJim Jagielski                                         // flow into the FollowFlowLine
76*b1cdbd2cSJim Jagielski     sal_Bool bRemoveFollowFlowLinePending :1;
77*b1cdbd2cSJim Jagielski     sal_Bool bConsiderObjsForMinCellHeight :1; // Usually, the floating screen objects
78*b1cdbd2cSJim Jagielski                                            // are considered on the calculation
79*b1cdbd2cSJim Jagielski                                            // for the minimal cell height.
80*b1cdbd2cSJim Jagielski                                            // For splitting table rows algorithm
81*b1cdbd2cSJim Jagielski                                            // it's needed not to consider floating
82*b1cdbd2cSJim Jagielski                                            // screen object for the preparation
83*b1cdbd2cSJim Jagielski                                            // of the re-calculation of the
84*b1cdbd2cSJim Jagielski                                            // last table row.
85*b1cdbd2cSJim Jagielski     sal_Bool bObjsDoesFit :1; // For splitting table rows algorithm, this boolean
86*b1cdbd2cSJim Jagielski                           // indicates, if the floating screen objects fits
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     bool mbInRecalcLowerRow : 1;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     //Split() spaltet den Frm an der angegebenen Stelle, es wird ein
91*b1cdbd2cSJim Jagielski     //Follow erzeugt und aufgebaut und direkt hinter this gepastet.
92*b1cdbd2cSJim Jagielski     //Join() Holt sich den Inhalt aus dem Follow und vernichtet diesen.
93*b1cdbd2cSJim Jagielski     bool Split( const SwTwips nCutPos, bool bTryToSplit, bool bTableRowKeep );
94*b1cdbd2cSJim Jagielski     bool Join();
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski     void _UpdateAttr(
97*b1cdbd2cSJim Jagielski         const SfxPoolItem*,
98*b1cdbd2cSJim Jagielski         const SfxPoolItem*, sal_uInt8 &,
99*b1cdbd2cSJim Jagielski         SwAttrSetChg *pa = 0,
100*b1cdbd2cSJim Jagielski         SwAttrSetChg *pb = 0 );
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     virtual sal_Bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool bHead, sal_Bool &rReformat );
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski protected:
105*b1cdbd2cSJim Jagielski 	virtual void MakeAll();
106*b1cdbd2cSJim Jagielski 	virtual void Format( const SwBorderAttrs *pAttrs = 0 );
107*b1cdbd2cSJim Jagielski 	virtual	void Modify( const SfxPoolItem*, const SfxPoolItem* );
108*b1cdbd2cSJim Jagielski 		//Aendert nur die Framesize, nicht die PrtArea-SSize
109*b1cdbd2cSJim Jagielski     virtual SwTwips GrowFrm  ( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False );
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski public:
112*b1cdbd2cSJim Jagielski 	SwTabFrm( SwTable &, SwFrm* );	//Immer nach dem erzeugen _und_ pasten das
113*b1cdbd2cSJim Jagielski 							//Regist Flys rufen!
114*b1cdbd2cSJim Jagielski 	SwTabFrm( SwTabFrm & );	//_Nur_ zum erzeugen von Follows
115*b1cdbd2cSJim Jagielski 	~SwTabFrm();
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	void JoinAndDelFollows();	//Fuer DelFrms des TableNodes!
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 	//Ruft das RegistFlys der Zeilen.
120*b1cdbd2cSJim Jagielski 	void RegistFlys();
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski     inline const SwTabFrm *GetFollow() const;
123*b1cdbd2cSJim Jagielski 	inline		 SwTabFrm *GetFollow();
124*b1cdbd2cSJim Jagielski     SwTabFrm* FindMaster( bool bFirstMaster = false ) const;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 	virtual sal_Bool GetInfo( SfxPoolItem &rHnt ) const;
127*b1cdbd2cSJim Jagielski     virtual void Paint( SwRect const&,
128*b1cdbd2cSJim Jagielski                         SwPrintData const*const pPrintData = NULL ) const;
129*b1cdbd2cSJim Jagielski     virtual void  CheckDirection( sal_Bool bVert );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 	virtual void Cut();
132*b1cdbd2cSJim Jagielski 	virtual void Paste( SwFrm* pParent, SwFrm* pSibling = 0 );
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	virtual void Prepare( const PrepareHint ePrep = PREP_CLEAR,
135*b1cdbd2cSJim Jagielski 						  const void *pVoid = 0, sal_Bool bNotify = sal_True );
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski                  SwCntntFrm *FindLastCntnt();
138*b1cdbd2cSJim Jagielski 	inline const SwCntntFrm *FindLastCntnt() const;
139*b1cdbd2cSJim Jagielski 
GetTable() const140*b1cdbd2cSJim Jagielski 	const SwTable *GetTable() const { return pTable; }
GetTable()141*b1cdbd2cSJim Jagielski 		  SwTable *GetTable() 		{ return pTable; }
142*b1cdbd2cSJim Jagielski 
IsComplete()143*b1cdbd2cSJim Jagielski 	sal_Bool IsComplete()  { return bComplete; }
SetComplete()144*b1cdbd2cSJim Jagielski 	void SetComplete() { bComplete = sal_True; }
ResetComplete()145*b1cdbd2cSJim Jagielski 	void ResetComplete() { bComplete = sal_False; }
146*b1cdbd2cSJim Jagielski 
IsLowersFormatted() const147*b1cdbd2cSJim Jagielski 	sal_Bool IsLowersFormatted() const 		{ return bLowersFormatted; }
SetLowersFormatted(sal_Bool b)148*b1cdbd2cSJim Jagielski 	void SetLowersFormatted( sal_Bool b )	{ bLowersFormatted = b;    }
149*b1cdbd2cSJim Jagielski 
SetCalcLowers()150*b1cdbd2cSJim Jagielski 	void SetCalcLowers()		{ bCalcLowers = sal_True; 	   } //Sparsam einsetzen!
SetResizeHTMLTable()151*b1cdbd2cSJim Jagielski 	void SetResizeHTMLTable()   { bResizeHTMLTable = sal_True; } //dito
SetONECalcLowers()152*b1cdbd2cSJim Jagielski 	void SetONECalcLowers()		{ bONECalcLowers = sal_True;   }
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski     //
155*b1cdbd2cSJim Jagielski     // Start: New stuff for breaking table rows
156*b1cdbd2cSJim Jagielski     //
HasFollowFlowLine() const157*b1cdbd2cSJim Jagielski     sal_Bool HasFollowFlowLine() const { return bHasFollowFlowLine; }
SetFollowFlowLine(sal_Bool bNew)158*b1cdbd2cSJim Jagielski     void SetFollowFlowLine( sal_Bool bNew ) { bHasFollowFlowLine = bNew; }
159*b1cdbd2cSJim Jagielski 
IsRebuildLastLine() const160*b1cdbd2cSJim Jagielski     sal_Bool IsRebuildLastLine() const { return bIsRebuildLastLine; }
SetRebuildLastLine(sal_Bool bNew)161*b1cdbd2cSJim Jagielski     void SetRebuildLastLine( sal_Bool bNew ) { bIsRebuildLastLine = bNew; }
162*b1cdbd2cSJim Jagielski 
IsRestrictTableGrowth() const163*b1cdbd2cSJim Jagielski     sal_Bool IsRestrictTableGrowth() const { return bRestrictTableGrowth; }
SetRestrictTableGrowth(sal_Bool bNew)164*b1cdbd2cSJim Jagielski     void SetRestrictTableGrowth( sal_Bool bNew ) { bRestrictTableGrowth = bNew; }
165*b1cdbd2cSJim Jagielski 
IsRemoveFollowFlowLinePending() const166*b1cdbd2cSJim Jagielski     sal_Bool IsRemoveFollowFlowLinePending() const { return bRemoveFollowFlowLinePending; }
SetRemoveFollowFlowLinePending(sal_Bool bNew)167*b1cdbd2cSJim Jagielski     void SetRemoveFollowFlowLinePending( sal_Bool bNew ) { bRemoveFollowFlowLinePending = bNew; }
168*b1cdbd2cSJim Jagielski 
IsInRecalcLowerRow() const169*b1cdbd2cSJim Jagielski     bool IsInRecalcLowerRow() const
170*b1cdbd2cSJim Jagielski     {
171*b1cdbd2cSJim Jagielski         return mbInRecalcLowerRow;
172*b1cdbd2cSJim Jagielski     }
SetInRecalcLowerRow(bool bNew)173*b1cdbd2cSJim Jagielski     void SetInRecalcLowerRow( bool bNew )
174*b1cdbd2cSJim Jagielski     {
175*b1cdbd2cSJim Jagielski         mbInRecalcLowerRow = bNew;
176*b1cdbd2cSJim Jagielski     }
177*b1cdbd2cSJim Jagielski 
IsConsiderObjsForMinCellHeight() const178*b1cdbd2cSJim Jagielski     sal_Bool IsConsiderObjsForMinCellHeight() const
179*b1cdbd2cSJim Jagielski     {
180*b1cdbd2cSJim Jagielski         return bConsiderObjsForMinCellHeight;
181*b1cdbd2cSJim Jagielski     }
SetConsiderObjsForMinCellHeight(sal_Bool _bNewConsiderObjsForMinCellHeight)182*b1cdbd2cSJim Jagielski     void SetConsiderObjsForMinCellHeight( sal_Bool _bNewConsiderObjsForMinCellHeight )
183*b1cdbd2cSJim Jagielski     {
184*b1cdbd2cSJim Jagielski         bConsiderObjsForMinCellHeight = _bNewConsiderObjsForMinCellHeight;
185*b1cdbd2cSJim Jagielski     }
186*b1cdbd2cSJim Jagielski 
DoesObjsFit() const187*b1cdbd2cSJim Jagielski     sal_Bool DoesObjsFit() const
188*b1cdbd2cSJim Jagielski     {
189*b1cdbd2cSJim Jagielski         return bObjsDoesFit;
190*b1cdbd2cSJim Jagielski     }
SetDoesObjsFit(sal_Bool _bNewObjsDoesFit)191*b1cdbd2cSJim Jagielski     void SetDoesObjsFit( sal_Bool _bNewObjsDoesFit )
192*b1cdbd2cSJim Jagielski     {
193*b1cdbd2cSJim Jagielski         bObjsDoesFit = _bNewObjsDoesFit;
194*b1cdbd2cSJim Jagielski     }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski     bool RemoveFollowFlowLine();
197*b1cdbd2cSJim Jagielski     //
198*b1cdbd2cSJim Jagielski     // End: New stuff for breaking table rows
199*b1cdbd2cSJim Jagielski     //
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski     sal_Bool CalcFlyOffsets(
202*b1cdbd2cSJim Jagielski         SwTwips& rUpper,
203*b1cdbd2cSJim Jagielski         long& rLeftOffset,
204*b1cdbd2cSJim Jagielski         long& rRightOffset ) const;
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski     SwTwips CalcHeightOfFirstContentLine() const;
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski     bool IsInHeadline( const SwFrm& rFrm ) const;
209*b1cdbd2cSJim Jagielski     SwRowFrm* GetFirstNonHeadlineRow() const;
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski     bool IsLayoutSplitAllowed() const;
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski     bool IsCollapsingBorders() const;
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski     sal_uInt16 GetBottomLineSize() const;
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski     DECL_FIXEDMEMPOOL_NEWDEL(SwTabFrm)
218*b1cdbd2cSJim Jagielski };
219*b1cdbd2cSJim Jagielski 
FindLastCntnt() const220*b1cdbd2cSJim Jagielski inline const SwCntntFrm *SwTabFrm::FindLastCntnt() const
221*b1cdbd2cSJim Jagielski {
222*b1cdbd2cSJim Jagielski 	return ((SwTabFrm*)this)->FindLastCntnt();
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski 
GetFollow() const225*b1cdbd2cSJim Jagielski inline const SwTabFrm *SwTabFrm::GetFollow() const
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski 	return (const SwTabFrm*)SwFlowFrm::GetFollow();
228*b1cdbd2cSJim Jagielski }
GetFollow()229*b1cdbd2cSJim Jagielski inline SwTabFrm *SwTabFrm::GetFollow()
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski 	return (SwTabFrm*)SwFlowFrm::GetFollow();
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski #endif  // SW_TABFRM_HXX
235