xref: /trunk/main/sw/source/core/layout/layhelp.hxx (revision 1d2dbeb0)
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 _LAYHELP_HXX
24 #define _LAYHELP_HXX
25 #ifndef _SVSTDARR_HXX
26 #define _SVSTDARR_USHORTS
27 #define _SVSTDARR_ULONGS
28 #define _SVSTDARR_BYTES
29 #define _SVSTDARR_XUB_STRLEN
30 #include <svl/svstdarr.hxx>
31 #endif
32 #include <swrect.hxx>
33 
34 class SwDoc;
35 class SwFrm;
36 class SwLayoutFrm;
37 class SwPageFrm;
38 class SwFlyFrm;
39 class SwSectionFrm;
40 class SwSectionNode;
41 class SvStream;
42 
43 /*************************************************************************
44  *                      class SwLayCacheImpl
45  * contains the page break information and the text frame positions
46  * of the document (after loading)
47  * and is used inside the constructor of the layout rootframe to
48  * insert content and text frames at the right pages.
49  * For every page of the main text (body content, no footnotes, text frames etc.)
50  * we have the nodeindex of the first content at the page,
51  * the type of content ( table or paragraph )
52  * and if it's not the first part of the table/paragraph,
53  * the row/character-offset inside the table/paragraph.
54  * The text frame positions are stored in the SwPageFlyCache array.
55  *************************************************************************/
56 
57 class SwFlyCache;
58 typedef SwFlyCache* SwFlyCachePtr;
59 SV_DECL_PTRARR_DEL( SwPageFlyCache, SwFlyCachePtr, 0, 4 )
60 
61 class SwLayCacheImpl : public SvULongs
62 {
63     SvXub_StrLens aOffset;
64     SvUShorts aType;
65     SwPageFlyCache aFlyCache;
66     sal_Bool bUseFlyCache;
67 	void Insert( sal_uInt16 nType, sal_uLong nIndex, xub_StrLen nOffset );
68 
69 public:
SwLayCacheImpl()70     SwLayCacheImpl() : SvULongs( 20, 10 ), aType( 20, 10 ) {}
71     sal_Bool Read( SvStream& rStream );
72 
GetBreakIndex(sal_uInt16 nIdx) const73     sal_uLong GetBreakIndex( sal_uInt16 nIdx ) const { return GetObject( nIdx ); }
GetBreakOfst(size_t nIdx) const74     xub_StrLen GetBreakOfst( size_t nIdx ) const { return aOffset[ nIdx ]; }
GetBreakType(sal_uInt16 nIdx) const75     sal_uInt16 GetBreakType( sal_uInt16 nIdx ) const { return aType[ nIdx ]; }
76 
GetFlyCount() const77     sal_uInt16 GetFlyCount() const { return aFlyCache.Count(); }
GetFlyCache(sal_uInt16 nIdx) const78     SwFlyCache *GetFlyCache( sal_uInt16 nIdx ) const { return aFlyCache[ nIdx ]; }
79 
IsUseFlyCache() const80     sal_Bool IsUseFlyCache() const { return bUseFlyCache; }
81 };
82 
83 /*************************************************************************
84  *                      class SwActualSection
85  * helps to create the sectionframes during the _InsertCnt-function
86  * by controlling nested sections.
87  *************************************************************************/
88 
89 class SwActualSection
90 {
91 	SwActualSection *pUpper;
92 	SwSectionFrm	*pSectFrm;
93 	SwSectionNode	*pSectNode;
94 public:
95 	SwActualSection( SwActualSection *pUpper,
96 					 SwSectionFrm	 *pSect,
97 					 SwSectionNode	 *pNd );
98 
GetSectionFrm()99 	SwSectionFrm	*GetSectionFrm()					{ return pSectFrm; }
SetSectionFrm(SwSectionFrm * p)100 	void			 SetSectionFrm( SwSectionFrm *p )	{ pSectFrm = p; }
GetSectionNode()101 	SwSectionNode   *GetSectionNode()					{ return pSectNode;}
GetUpper()102 	SwActualSection *GetUpper()							{ return pUpper; }
103 };
104 
105 /*************************************************************************
106  *                      class SwLayHelper
107  * helps during the _InsertCnt-function to create new pages.
108  * If there's a layoutcache available, this information is used.
109  *************************************************************************/
110 
111 class SwLayHelper
112 {
113     SwFrm* &rpFrm;
114     SwFrm* &rpPrv;
115     SwPageFrm* &rpPage;
116     SwLayoutFrm* &rpLay;
117     SwActualSection* &rpActualSection;
118     sal_Bool &rbBreakAfter;
119     SwDoc* pDoc;
120     SwLayCacheImpl* pImpl;
121     sal_uLong nMaxParaPerPage;
122     sal_uLong nParagraphCnt;
123     sal_uLong nStartOfContent;
124     sal_uInt16 nIndex;                      // the index in the page break array
125     sal_uInt16 nFlyIdx;                     // the index in the fly cache array
126     sal_Bool bFirst : 1;
127     void _CheckFlyCache( SwPageFrm* pPage );
128 public:
129     SwLayHelper( SwDoc *pD, SwFrm* &rpF, SwFrm* &rpP, SwPageFrm* &rpPg,
130             SwLayoutFrm* &rpL, SwActualSection* &rpA, sal_Bool &rBrk,
131             sal_uLong nNodeIndex, sal_Bool bCache );
132     ~SwLayHelper();
133     sal_uLong CalcPageCount();
134     sal_Bool CheckInsert( sal_uLong nNodeIndex );
135 
136     sal_Bool BreakPage( xub_StrLen& rOffs, sal_uLong nNodeIndex );
137     sal_Bool CheckInsertPage();
138 
139     // Look for fresh text frames at this (new) page and set them to the right
140     // position, if they are in the fly cache.
CheckFlyCache(SwPageFrm * pPage)141     void CheckFlyCache( SwPageFrm* pPage )
142     { if( pImpl && nFlyIdx < pImpl->GetFlyCount() ) _CheckFlyCache( pPage ); }
143 
144     // Look for this text frame and set it to the right position,
145     // if it's in the fly cache.
146     static sal_Bool CheckPageFlyCache( SwPageFrm* &rpPage, SwFlyFrm* pFly );
147 };
148 
149 /*************************************************************************
150  *                      class SwLayCacheIoImpl
151  * contains the data structures that are required to read and write a
152  * layout cache.
153  *************************************************************************/
154 
155 #define SW_LAYCACHE_IO_REC_PAGES	'p'
156 #define SW_LAYCACHE_IO_REC_PARA		'P'
157 #define SW_LAYCACHE_IO_REC_TABLE	'T'
158 #define SW_LAYCACHE_IO_REC_FLY      'F'
159 
160 #define SW_LAYCACHE_IO_VERSION_MAJOR	1
161 #define SW_LAYCACHE_IO_VERSION_MINOR    1
162 
163 class SwLayCacheIoImpl
164 {
165 	SvBytes		   	aRecTypes;
166 	SvULongs		aRecSizes;
167 
168 	SvStream       	*pStream;
169 
170 	sal_uLong			nFlagRecEnd;
171 
172 	sal_uInt16			nMajorVersion;
173 	sal_uInt16 			nMinorVersion;
174 
175 	sal_Bool			bWriteMode : 1;
176 	sal_Bool			bError : 1;
177 
178 public:
179 	SwLayCacheIoImpl( SvStream& rStrm, sal_Bool bWrtMd );
180 
181 	// Get input or output stream
GetStream() const182 	SvStream& GetStream() const { return *pStream; }
183 
184 	// Open a record of type "nType"
185 	sal_Bool OpenRec( sal_uInt8 nType );
186 
187 	// Close a record of type "nType". This skips any unread data that
188 	// remains in the record.
189 	sal_Bool CloseRec( sal_uInt8 nType );
190 
191 	// Return the number of bytes contained in the current record that
192 	// haven't been read by now.
193 	sal_uInt32 BytesLeft();
194 
195 	// Return the current record's type
196 	sal_uInt8 Peek();
197 
198 	// Skip the current record
199 	void SkipRec();
200 
201 	// Open a flag record for reading. The uppermost four bits are flags,
202 	// while the lowermost are the flag record's size. Flag records cannot
203 	// be nested.
204 	sal_uInt8 OpenFlagRec();
205 
206 	// Open flag record for writing;
207 	void OpenFlagRec( sal_uInt8 nFlags, sal_uInt8 nLen );
208 
209 	// Close a flag record. Any bytes left are skipped.
210 	void CloseFlagRec();
211 
HasError() const212 	sal_Bool HasError() const { return bError; }
213 
GetMajorVersion() const214 	sal_uInt16 GetMajorVersion() const { return nMajorVersion; }
GetMinorVersion() const215 	sal_uInt16 GetMinorVersion() const { return nMinorVersion; }
216 };
217 
218 // Stored information about text frames:
219 class SwFlyCache : public SwRect // position and size
220 {
221 public:
222     sal_uLong nOrdNum;      // Id to recognize text frames
223     sal_uInt16 nPageNum;    // page number
SwFlyCache(sal_uInt16 nP,sal_uLong nO,long nXL,long nYL,long nWL,long nHL)224     SwFlyCache( sal_uInt16 nP, sal_uLong nO, long nXL, long nYL, long nWL, long nHL ) :
225         SwRect( nXL, nYL, nWL, nHL ), nOrdNum( nO ), nPageNum( nP ){}
226 };
227 
228 #endif
229