xref: /trunk/main/sc/source/filter/inc/excrecds.hxx (revision 38d50f7b)
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 
24 #ifndef SC_EXCRECDS_HXX
25 #define SC_EXCRECDS_HXX
26 
27 #include <tools/solar.h>
28 #include <svl/zforlist.hxx>
29 #include <tools/string.hxx>
30 #include <vcl/vclenum.hxx>
31 #include <tools/color.hxx>
32 
33 
34 #include <vector>
35 #include "olinetab.hxx"
36 #include "filter.hxx"
37 #include "rangelst.hxx"
38 #include "xerecord.hxx"
39 #include "xeroot.hxx"
40 #include "xeformula.hxx"
41 #include "xestring.hxx"
42 #include "root.hxx"
43 #include "excdefs.hxx"
44 #include "cell.hxx"
45 
46 //------------------------------------------------------------------ Forwards -
47 
48 class SvxBorderLine;
49 
50 class SvStream;
51 class Font;
52 class List;
53 class ScPatternAttr;
54 class ScTokenArray;
55 class ScRangeData;
56 class ScDBData;
57 class ScEditCell;
58 class SfxItemSet;
59 class EditTextObject;
60 class ScPageHFItem;
61 class ScProgress;
62 
63 class ExcTable;
64 
65 //----------------------------------------------------------- class ExcRecord -
66 
67 class ExcRecord : public XclExpRecord
68 {
69 public:
70 	virtual void			Save( XclExpStream& rStrm );
71 
72 	virtual sal_uInt16			GetNum() const = 0;
73     virtual sal_Size        GetLen() const = 0;
74 
75 protected:
76 	virtual void			SaveCont( XclExpStream& rStrm );
77 
78 private:
79     /** Writes the body of the record. */
80     virtual void            WriteBody( XclExpStream& rStrm );
81 };
82 
83 
84 //--------------------------------------------------------- class ExcEmptyRec -
85 
86 class ExcEmptyRec : public ExcRecord
87 {
88 private:
89 protected:
90 public:
91 	virtual void			Save( XclExpStream& rStrm );
92 	virtual sal_uInt16			GetNum() const;
93     virtual sal_Size        GetLen() const;
94 };
95 
96 
97 //------------------------------------------------------- class ExcRecordList -
98 
99 class ExcRecordList : protected List, public ExcEmptyRec
100 {
101 private:
102 protected:
103 public:
104 	virtual					~ExcRecordList();
105 
106     using                   List::Count;
107 
First(void)108 	inline ExcRecord*		First( void )				{ return ( ExcRecord* ) List::First(); }
Next(void)109 	inline ExcRecord*		Next( void )				{ return ( ExcRecord* ) List::Next(); }
110 
Append(ExcRecord * pNew)111 	inline void				Append( ExcRecord* pNew )	{ if( pNew ) List::Insert( pNew, LIST_APPEND ); }
Get(sal_uInt32 nNum) const112 	inline const ExcRecord*	Get( sal_uInt32 nNum ) const	{ return ( ExcRecord* ) List::GetObject( nNum ); }
113 
114 	virtual void			Save( XclExpStream& rStrm );
115 };
116 
117 
118 //--------------------------------------------------------- class ExcDummyRec -
119 
120 class ExcDummyRec : public ExcRecord
121 {
122 protected:
123 public:
124 	virtual void			Save( XclExpStream& rStrm );
125 	virtual sal_uInt16			GetNum() const;
126 	virtual	const sal_uInt8*		GetData() const = 0;	// byte data must contain header and body
127 };
128 
129 
130 //------------------------------------------------------- class ExcBoolRecord -
131 // stores sal_Bool as 16bit val ( 0x0000 | 0x0001 )
132 
133 class ExcBoolRecord : public ExcRecord
134 {
135 private:
136 	virtual void			SaveCont( XclExpStream& rStrm );
137 
138 protected:
139 	sal_Bool					bVal;
140 
ExcBoolRecord()141 	inline					ExcBoolRecord() : bVal( sal_False ) {}
142 
143 public:
ExcBoolRecord(const sal_Bool bDefault)144 	inline					ExcBoolRecord( const sal_Bool bDefault ) : bVal( bDefault )	{}
145 
146     virtual sal_Size        GetLen( void ) const;
147 };
148 
149 
150 //--------------------------------------------------------- class ExcBof_Base -
151 
152 class ExcBof_Base : public ExcRecord
153 {
154 private:
155 protected:
156 	sal_uInt16					nDocType;
157 	sal_uInt16					nVers;
158 	sal_uInt16					nRupBuild;
159 	sal_uInt16					nRupYear;
160 public:
161 							ExcBof_Base( void );
162 };
163 
164 
165 //-------------------------------------------------------------- class ExcBof -
166 // Header Record fuer WORKSHEETS
167 
168 class ExcBof : public ExcBof_Base
169 {
170 private:
171 	virtual void			SaveCont( XclExpStream& rStrm );
172 public:
173 							ExcBof( void );
174 
175 	virtual sal_uInt16			GetNum( void ) const;
176     virtual sal_Size        GetLen( void ) const;
177 };
178 
179 
180 //------------------------------------------------------------- class ExcBofW -
181 // Header Record fuer WORKBOOKS
182 
183 class ExcBofW : public ExcBof_Base
184 {
185 private:
186 	virtual void			SaveCont( XclExpStream& rStrm );
187 public:
188 							ExcBofW( void );
189 
190 	virtual sal_uInt16			GetNum( void ) const;
191     virtual sal_Size        GetLen( void ) const;
192 };
193 
194 
195 //-------------------------------------------------------------- class ExcEof -
196 
197 class ExcEof : public ExcRecord
198 {
199 private:
200 public:
201 	virtual sal_uInt16			GetNum( void ) const;
202     virtual sal_Size        GetLen( void ) const;
203 };
204 
205 
206 //--------------------------------------------------------- class ExcDummy_00 -
207 // INTERFACEHDR to FNGROUPCOUNT (see excrecds.cxx)
208 
209 class ExcDummy_00 : public ExcDummyRec
210 {
211 private:
212 	static const sal_uInt8		pMyData[];
213     static const sal_Size   nMyLen;
214 public:
215     virtual sal_Size        GetLen( void ) const;
216 	virtual	const sal_uInt8*		GetData( void ) const;
217 };
218 
219 // EXC_ID_WINDOWPROTECTION
220 class XclExpWindowProtection : public	XclExpBoolRecord
221 {
222 	public:
223 		XclExpWindowProtection(bool bValue);
224 
225     virtual void            SaveXml( XclExpXmlStream& rStrm );
226 };
227 
228 // EXC_ID_PROTECT  Document Protection
229 class XclExpProtection : public	XclExpBoolRecord
230 {
231 	public:
232 		XclExpProtection(bool bValue);
233 };
234 
235 class XclExpPassHash : public XclExpRecord
236 {
237 public:
238     XclExpPassHash(const ::com::sun::star::uno::Sequence<sal_Int8>& aHash);
239     virtual ~XclExpPassHash();
240 
241 private:
242     virtual void    WriteBody(XclExpStream& rStrm);
243 
244 private:
245     sal_uInt16  mnHash;
246 };
247 
248 
249 //-------------------------------------------------------- class ExcDummy_04x -
250 // PASSWORD to BOOKBOOL (see excrecds.cxx), no 1904
251 
252 class ExcDummy_040 : public ExcDummyRec
253 {
254 private:
255 	static const sal_uInt8		pMyData[];
256     static const sal_Size   nMyLen;
257 public:
258     virtual sal_Size        GetLen( void ) const;
259 	virtual	const sal_uInt8*		GetData( void ) const;
260 };
261 
262 
263 
264 class ExcDummy_041 : public ExcDummyRec
265 {
266 private:
267 	static const sal_uInt8		pMyData[];
268     static const sal_Size   nMyLen;
269 public:
270     virtual sal_Size        GetLen( void ) const;
271 	virtual	const sal_uInt8*		GetData( void ) const;
272 };
273 
274 
275 //------------------------------------------------------------- class Exc1904 -
276 
277 class Exc1904 : public ExcBoolRecord
278 {
279 public:
280 							Exc1904( ScDocument& rDoc );
281 	virtual sal_uInt16			GetNum( void ) const;
282 
283     virtual void            SaveXml( XclExpXmlStream& rStrm );
284 };
285 
286 
287 //------------------------------------------------------ class ExcBundlesheet -
288 
289 class ExcBundlesheetBase : public ExcRecord
290 {
291 protected:
292     sal_Size                nStrPos;
293     sal_Size                nOwnPos;    // Position NACH # und Len
294 	sal_uInt16					nGrbit;
295     SCTAB                   nTab;
296 
297 							ExcBundlesheetBase();
298 
299 public:
300 							ExcBundlesheetBase( RootData& rRootData, SCTAB nTab );
301 
SetStreamPos(sal_Size nNewStrPos)302     inline void             SetStreamPos( sal_Size nNewStrPos ) { nStrPos = nNewStrPos; }
303 	void					UpdateStreamPos( XclExpStream& rStrm );
304 
305 	virtual sal_uInt16			GetNum() const;
306 };
307 
308 
309 
310 class ExcBundlesheet : public ExcBundlesheetBase
311 {
312 private:
313 	ByteString				aName;
314 
315 	virtual void			SaveCont( XclExpStream& rStrm );
316 
317 public:
318 							ExcBundlesheet( RootData& rRootData, SCTAB nTab );
319     virtual sal_Size        GetLen() const;
320 };
321 
322 //--------------------------------------------------------- class ExcDummy_02 -
323 // sheet dummies: CALCMODE to SETUP
324 
325 class ExcDummy_02a : public ExcDummyRec
326 {
327 private:
328 	static const sal_uInt8		pMyData[];
329     static const sal_Size   nMyLen;
330 public:
331     virtual sal_Size        GetLen( void ) const;
332 	virtual	const sal_uInt8*		GetData( void ) const;
333 };
334 
335 
336 // ----------------------------------------------------------------------------
337 
338 /** This record contains the Windows country IDs for the UI and document language. */
339 class XclExpCountry : public XclExpRecord
340 {
341 public:
342     explicit                    XclExpCountry( const XclExpRoot& rRoot );
343 
344 private:
345     sal_uInt16                  mnUICountry;        /// The UI country ID.
346     sal_uInt16                  mnDocCountry;       /// The document country ID.
347 
348     /** Writes the body of the COUNTRY record. */
349     virtual void                WriteBody( XclExpStream& rStrm );
350 };
351 
352 
353 // XclExpWsbool ===============================================================
354 
355 class XclExpWsbool : public XclExpUInt16Record
356 {
357 public:
358     explicit                    XclExpWsbool( bool bFitToPages, SCTAB nScTab = -1, XclExpFilterManager* pManager = NULL );
359 
360     virtual void                SaveXml( XclExpXmlStream& rStrm );
361 private:
362     SCTAB                       mnScTab;
363     XclExpFilterManager*        mpManager;
364 };
365 
366 
367 // ============================================================================
368 
369 class XclExpFiltermode : public XclExpEmptyRecord
370 {
371 public:
372     explicit            XclExpFiltermode();
373 };
374 
375 // ----------------------------------------------------------------------------
376 
377 class XclExpAutofilterinfo : public XclExpUInt16Record
378 {
379 public:
380     explicit            XclExpAutofilterinfo( const ScAddress& rStartPos, SCCOL nScCol );
381 
GetStartPos() const382     inline const ScAddress GetStartPos() const { return maStartPos; }
GetColCount() const383     inline SCCOL        GetColCount() const { return static_cast< SCCOL >( GetValue() ); }
384 
385 private:
386     ScAddress           maStartPos;
387 };
388 
389 // ----------------------------------------------------------------------------
390 
391 class ExcFilterCondition
392 {
393 private:
394 	sal_uInt8					nType;
395 	sal_uInt8					nOper;
396 	double					fVal;
397     XclExpString*           pText;
398 
399 protected:
400 public:
401 							ExcFilterCondition();
402 							~ExcFilterCondition();
403 
IsEmpty() const404 	inline sal_Bool				IsEmpty() const 	{ return (nType == EXC_AFTYPE_NOTUSED); }
HasEqual() const405 	inline sal_Bool				HasEqual() const	{ return (nOper == EXC_AFOPER_EQUAL); }
406 	sal_uLong					GetTextBytes() const;
407 
408 	void					SetCondition( sal_uInt8 nTp, sal_uInt8 nOp, double fV, String* pT );
409 
410 	void					Save( XclExpStream& rStrm );
411 	void					SaveXml( XclExpXmlStream& rStrm );
412 	void					SaveText( XclExpStream& rStrm );
413 };
414 
415 // ----------------------------------------------------------------------------
416 
417 class XclExpAutofilter : public XclExpRecord, protected XclExpRoot
418 {
419 private:
420 	sal_uInt16					nCol;
421 	sal_uInt16					nFlags;
422 	ExcFilterCondition		aCond[ 2 ];
423 
424 	sal_Bool					AddCondition( ScQueryConnect eConn, sal_uInt8 nType,
425 								sal_uInt8 nOp, double fVal, String* pText,
426 								sal_Bool bSimple = sal_False );
427 
428     virtual void            WriteBody( XclExpStream& rStrm );
429 
430 protected:
431 public:
432                             XclExpAutofilter( const XclExpRoot& rRoot, sal_uInt16 nC );
433 
GetCol() const434 	inline sal_uInt16			GetCol() const			{ return nCol; }
HasCondition() const435 	inline sal_Bool				HasCondition() const	{ return !aCond[ 0 ].IsEmpty(); }
HasTop10() const436     inline sal_Bool             HasTop10() const        { return ::get_flag( nFlags, EXC_AFFLAG_TOP10 ); }
437 
438     sal_Bool                    AddEntry( const ScQueryEntry& rEntry );
439 
440     virtual void            SaveXml( XclExpXmlStream& rStrm );
441 };
442 
443 // ----------------------------------------------------------------------------
444 
445 class ExcAutoFilterRecs : public XclExpRecordBase, protected XclExpRoot
446 {
447 public:
448     explicit            ExcAutoFilterRecs( const XclExpRoot& rRoot, SCTAB nTab );
449     virtual             ~ExcAutoFilterRecs();
450 
451     void                AddObjRecs();
452 
453     virtual void        Save( XclExpStream& rStrm );
454     virtual void        SaveXml( XclExpXmlStream& rStrm );
455 
456     bool                HasFilterMode() const;
457 
458 private:
459     XclExpAutofilter*   GetByCol( SCCOL nCol ); // always 0-based
460     sal_Bool                IsFiltered( SCCOL nCol );
461 
462 private:
463     typedef XclExpRecordList< XclExpAutofilter >    XclExpAutofilterList;
464     typedef XclExpAutofilterList::RecordRefType     XclExpAutofilterRef;
465 
466     XclExpAutofilterList maFilterList;
467     XclExpFiltermode*   pFilterMode;
468     XclExpAutofilterinfo* pFilterInfo;
469     ScRange                 maRef;
470 };
471 
472 // ----------------------------------------------------------------------------
473 
474 /** Sheet filter manager. Contains auto filters or advanced filters from all sheets. */
475 class XclExpFilterManager : protected XclExpRoot
476 {
477 public:
478     explicit            XclExpFilterManager( const XclExpRoot& rRoot );
479 
480     /** Creates the filter records for the specified sheet.
481         @descr  Creates and inserts related built-in NAME records. Therefore this
482             function is called from the name buffer itself. */
483     void                InitTabFilter( SCTAB nScTab );
484 
485     /** Returns a record object containing all filter records for the specified sheet. */
486     XclExpRecordRef     CreateRecord( SCTAB nScTab );
487 
488     /** Returns whether or not FilterMode is present */
489     bool                HasFilterMode( SCTAB nScTab );
490 
491 private:
492     using               XclExpRoot::CreateRecord;
493 
494     typedef ScfRef< ExcAutoFilterRecs >             XclExpTabFilterRef;
495     typedef ::std::map< SCTAB, XclExpTabFilterRef > XclExpTabFilterMap;
496 
497     XclExpTabFilterMap  maFilterMap;
498 };
499 
500 
501 #endif
502 
503