xref: /trunk/main/sc/inc/dptabsrc.hxx (revision a5b190bfa3e1bed4623e2958a8877664a3b5506c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SC_DPTABSRC_HXX
29 #define SC_DPTABSRC_HXX
30 
31 #include <vector>
32 #include <hash_map>
33 // Wang Xu Ming -- 2009-8-17
34 // DataPilot Migration - Cache&&Performance
35 #include <list>
36 // End Comments
37 #include <memory>
38 #include <tools/string.hxx>
39 #include <tools/list.hxx>
40 #include "global.hxx"       // enum ScSubTotalFunc
41 #include <com/sun/star/sheet/XDimensionsSupplier.hpp>
42 #include <com/sun/star/sheet/XHierarchiesSupplier.hpp>
43 #include <com/sun/star/sheet/XLevelsSupplier.hpp>
44 #include <com/sun/star/sheet/XMembersSupplier.hpp>
45 #include <com/sun/star/sheet/XDataPilotResults.hpp>
46 #include <com/sun/star/sheet/XDataPilotMemberResults.hpp>
47 #include <com/sun/star/sheet/MemberResult.hpp>
48 #include <com/sun/star/sheet/GeneralFunction.hpp>
49 #include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
50 #include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
51 #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
52 #include <com/sun/star/sheet/DataPilotFieldReference.hpp>
53 #include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
54 #include <com/sun/star/util/XRefreshable.hpp>
55 #include <com/sun/star/sheet/XDrillDownDataSupplier.hpp>
56 #include <com/sun/star/util/XCloneable.hpp>
57 #include <com/sun/star/beans/XPropertySet.hpp>
58 #include <com/sun/star/lang/XServiceInfo.hpp>
59 #include <com/sun/star/container/XNamed.hpp>
60 #include <cppuhelper/implbase2.hxx>
61 #include <cppuhelper/implbase3.hxx>
62 #include <cppuhelper/implbase5.hxx>
63 #include <cppuhelper/implbase6.hxx>
64 // Wang Xu Ming -- 2009-8-17
65 // DataPilot Migration - Cache&&Performance
66 #include "dpglobal.hxx"
67 // End Comments
68 #include "dptabdat.hxx"
69 
70 namespace com { namespace sun { namespace star {
71     namespace sheet {
72         struct DataPilotFieldFilter;
73     }
74     namespace table {
75         struct CellAddress;
76     }
77 }}}
78 
79 class ScDPResultMember;
80 class ScDPResultData;
81 // Wang Xu Ming -- 2009-8-17
82 // DataPilot Migration - Cache&&Performance
83 class ScDPItemData;
84 // End Comments
85 class ScDPTableData;
86 
87 // ------------------------------------------------------------------------
88 
89 
90 //  should be dynamic!
91 #define SC_DAPI_MAXFIELDS   256
92 
93 
94 // --------------------------------------------------------------------
95 //
96 //  implementation of DataPilotSource using ScDPTableData
97 //
98 
99 
100 class ScDPDimensions;
101 class ScDPDimension;
102 class ScDPHierarchies;
103 class ScDPHierarchy;
104 class ScDPLevels;
105 class ScDPLevel;
106 class ScDPMembers;
107 class ScDPMember;
108 
109 
110 class ScDPSource : public cppu::WeakImplHelper6<
111                             com::sun::star::sheet::XDimensionsSupplier,
112                             com::sun::star::sheet::XDataPilotResults,
113                             com::sun::star::util::XRefreshable,
114                             com::sun::star::sheet::XDrillDownDataSupplier,
115                             com::sun::star::beans::XPropertySet,
116                             com::sun::star::lang::XServiceInfo >
117 {
118 private:
119     ScDPTableData*          pData;              // data source (ScDPObject manages its life time)
120     ScDPDimensions*         pDimensions;        // api objects
121                                                 // settings:
122     long                    nColDims[SC_DAPI_MAXFIELDS];
123     long                    nRowDims[SC_DAPI_MAXFIELDS];
124     long                    nDataDims[SC_DAPI_MAXFIELDS];
125     long                    nPageDims[SC_DAPI_MAXFIELDS];
126     long                    nColDimCount;
127     long                    nRowDimCount;
128     long                    nDataDimCount;
129     long                    nPageDimCount;
130     sal_Bool                    bColumnGrand;
131     sal_Bool                    bRowGrand;
132     sal_Bool                    bIgnoreEmptyRows;
133     sal_Bool                    bRepeatIfEmpty;
134 
135     long                    nDupCount;
136 
137                                                 // results:
138     ScDPResultData*         pResData;           // keep the rest in this!
139     ScDPResultMember*       pColResRoot;
140     ScDPResultMember*       pRowResRoot;
141     com::sun::star::uno::Sequence<com::sun::star::sheet::MemberResult>* pColResults;
142     com::sun::star::uno::Sequence<com::sun::star::sheet::MemberResult>* pRowResults;
143     List                    aColLevelList;
144     List                    aRowLevelList;
145     sal_Bool                    bResultOverflow;
146     bool                    bPageFiltered;      // set if page field filters have been applied to cache table
147 
148     ::std::auto_ptr<rtl::OUString> mpGrandTotalName;
149 
150     void                    CreateRes_Impl();
151     void                    FillMemberResults();
152     void                    FillLevelList( sal_uInt16 nOrientation, List& rList );
153     void                    FillCalcInfo(bool bIsRow, ScDPTableData::CalcInfo& rInfo, bool &bHasAutoShow);
154 
155     /**
156      * Compile a list of dimension indices that are either, column, row or
157      * page dimensions (i.e. all but data dimensions).
158      */
159     void                    GetCategoryDimensionIndices(::std::hash_set<sal_Int32>& rCatDims);
160 
161     /**
162      * Set visibilities of individual rows in the cache table based on the
163      * page field data.
164      */
165     void                    FilterCacheTableByPageDimensions();
166 
167     void                    SetDupCount( long nNew );
168 
169 public:
170                                 ScDPSource( ScDPTableData* pD );    // TableData is deleted by Source
171     virtual                     ~ScDPSource();
172 
173     ScDPTableData*          GetData()       { return pData; }
174     const ScDPTableData*    GetData() const { return pData; }
175 
176     void                    SetGrandTotalName(const ::rtl::OUString& rName);
177     const ::rtl::OUString*  GetGrandTotalName() const;
178 
179     sal_uInt16                  GetOrientation(long nColumn);
180     void                    SetOrientation(long nColumn, sal_uInt16 nNew);
181     long                    GetPosition(long nColumn);
182 
183     long                    GetDataDimensionCount();
184     ScDPDimension*          GetDataDimension(long nIndex);
185     String                  GetDataDimName(long nIndex);
186     // Wang Xu Ming -- 2009-8-17
187     // DataPilot Migration - Cache&&Performance
188     ScDPTableDataCache*         GetCache();
189     const ScDPItemData*            GetItemDataById( long nDim, long nId );
190     long                                       GetDataLayoutDim(){ return pData->GetColumnCount(); }
191     SCROW                                GetMemberId(  long  nDim, const ScDPItemData& rData );
192     // End Comments
193     sal_Bool                    IsDataLayoutDimension(long nDim);
194     sal_uInt16                  GetDataLayoutOrientation();
195 
196     sal_Bool                    IsDateDimension(long nDim);
197     sal_uInt32                  GetNumberFormat(long nDim);
198 
199     sal_Bool                    SubTotalAllowed(long nColumn);      //! move to ScDPResultData
200 
201     ScDPDimension*          AddDuplicated(long nSource, const String& rNewName);
202     long                    GetDupCount() const { return nDupCount; }
203 
204     long                    GetSourceDim(long nDim);
205 
206     const com::sun::star::uno::Sequence<com::sun::star::sheet::MemberResult>*
207                             GetMemberResults( ScDPLevel* pLevel );
208 
209     ScDPDimensions*         GetDimensionsObject();
210 
211 //UNUSED2009-05 void                    DumpState( ScDocument* pDoc, const ScAddress& rPos );
212 
213                             // XDimensionsSupplier
214     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
215                             SAL_CALL getDimensions(  )
216                                 throw(::com::sun::star::uno::RuntimeException);
217 
218                             // XDataPilotResults
219     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence<
220                             ::com::sun::star::sheet::DataResult > > SAL_CALL getResults(  )
221                                 throw(::com::sun::star::uno::RuntimeException);
222 
223                             // XRefreshable
224     virtual void SAL_CALL   refresh() throw(::com::sun::star::uno::RuntimeException);
225     virtual void SAL_CALL   addRefreshListener( const ::com::sun::star::uno::Reference<
226                                     ::com::sun::star::util::XRefreshListener >& l )
227                                 throw(::com::sun::star::uno::RuntimeException);
228     virtual void SAL_CALL   removeRefreshListener( const ::com::sun::star::uno::Reference<
229                                     ::com::sun::star::util::XRefreshListener >& l )
230                                 throw(::com::sun::star::uno::RuntimeException);
231 
232                             // XDrillDownDataSupplier
233     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >
234         SAL_CALL getDrillDownData(const ::com::sun::star::uno::Sequence<
235                                       ::com::sun::star::sheet::DataPilotFieldFilter >& aFilters )
236                                 throw(::com::sun::star::uno::RuntimeException);
237 
238                             // XPropertySet
239     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
240                             SAL_CALL getPropertySetInfo(  )
241                                 throw(::com::sun::star::uno::RuntimeException);
242     virtual void SAL_CALL   setPropertyValue( const ::rtl::OUString& aPropertyName,
243                                     const ::com::sun::star::uno::Any& aValue )
244                                 throw(::com::sun::star::beans::UnknownPropertyException,
245                                     ::com::sun::star::beans::PropertyVetoException,
246                                     ::com::sun::star::lang::IllegalArgumentException,
247                                     ::com::sun::star::lang::WrappedTargetException,
248                                     ::com::sun::star::uno::RuntimeException);
249     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
250                                     const ::rtl::OUString& PropertyName )
251                                 throw(::com::sun::star::beans::UnknownPropertyException,
252                                     ::com::sun::star::lang::WrappedTargetException,
253                                     ::com::sun::star::uno::RuntimeException);
254     virtual void SAL_CALL   addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
255                                     const ::com::sun::star::uno::Reference<
256                                         ::com::sun::star::beans::XPropertyChangeListener >& xListener )
257                                 throw(::com::sun::star::beans::UnknownPropertyException,
258                                     ::com::sun::star::lang::WrappedTargetException,
259                                     ::com::sun::star::uno::RuntimeException);
260     virtual void SAL_CALL   removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
261                                     const ::com::sun::star::uno::Reference<
262                                         ::com::sun::star::beans::XPropertyChangeListener >& aListener )
263                                 throw(::com::sun::star::beans::UnknownPropertyException,
264                                     ::com::sun::star::lang::WrappedTargetException,
265                                     ::com::sun::star::uno::RuntimeException);
266     virtual void SAL_CALL   addVetoableChangeListener( const ::rtl::OUString& PropertyName,
267                                     const ::com::sun::star::uno::Reference<
268                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
269                                 throw(::com::sun::star::beans::UnknownPropertyException,
270                                     ::com::sun::star::lang::WrappedTargetException,
271                                     ::com::sun::star::uno::RuntimeException);
272     virtual void SAL_CALL   removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
273                                     const ::com::sun::star::uno::Reference<
274                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
275                                 throw(::com::sun::star::beans::UnknownPropertyException,
276                                     ::com::sun::star::lang::WrappedTargetException,
277                                     ::com::sun::star::uno::RuntimeException);
278 
279                             // XServiceInfo
280     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
281                                 throw(::com::sun::star::uno::RuntimeException);
282     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
283                                 throw(::com::sun::star::uno::RuntimeException);
284     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
285                                 throw(::com::sun::star::uno::RuntimeException);
286 
287     virtual String              getDataDescription();       //! ???
288 
289     virtual sal_Bool                getColumnGrand() const;
290     virtual void                setColumnGrand(sal_Bool bSet);
291     virtual sal_Bool                getRowGrand() const;
292     virtual void                setRowGrand(sal_Bool bSet);
293 
294     virtual sal_Bool                getIgnoreEmptyRows() const;
295     virtual void                setIgnoreEmptyRows(sal_Bool bSet);
296     virtual sal_Bool                getRepeatIfEmpty() const;
297     virtual void                setRepeatIfEmpty(sal_Bool bSet);
298 
299     virtual void                validate();     //! ???
300     virtual void                disposeData();
301 };
302 
303 class ScDPDimensions : public cppu::WeakImplHelper2<
304                             com::sun::star::container::XNameAccess,
305                             com::sun::star::lang::XServiceInfo >
306 {
307 private:
308     ScDPSource*         pSource;
309     long                nDimCount;
310     ScDPDimension**     ppDims;
311 
312 public:
313                             ScDPDimensions( ScDPSource* pSrc );
314     virtual                 ~ScDPDimensions();
315 
316     void                    CountChanged();
317 
318                             // XNameAccess
319     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
320                                 throw(::com::sun::star::container::NoSuchElementException,
321                                     ::com::sun::star::lang::WrappedTargetException,
322                                     ::com::sun::star::uno::RuntimeException);
323     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
324                                 throw(::com::sun::star::uno::RuntimeException);
325     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
326                                 throw(::com::sun::star::uno::RuntimeException);
327 
328                             // XElementAccess
329     virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
330                                 throw(::com::sun::star::uno::RuntimeException);
331     virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);
332 
333                             // XServiceInfo
334     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
335                                 throw(::com::sun::star::uno::RuntimeException);
336     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
337                                 throw(::com::sun::star::uno::RuntimeException);
338     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
339                                 throw(::com::sun::star::uno::RuntimeException);
340 
341     virtual long            getCount() const;
342     virtual ScDPDimension*  getByIndex(long nIndex) const;
343 };
344 
345 class ScDPDimension : public cppu::WeakImplHelper5<
346                             com::sun::star::sheet::XHierarchiesSupplier,
347                             com::sun::star::container::XNamed,
348                             com::sun::star::util::XCloneable,
349                             com::sun::star::beans::XPropertySet,
350                             com::sun::star::lang::XServiceInfo >
351 {
352 private:
353     ScDPSource*         pSource;
354     long                nDim;               // dimension index (== column ID)
355     ScDPHierarchies*    pHierarchies;
356     long                nUsedHier;
357     sal_uInt16              nFunction;          // enum GeneralFunction
358     String              aName;              // if empty, take from source
359     ::std::auto_ptr<rtl::OUString> mpLayoutName;
360     ::std::auto_ptr<rtl::OUString> mpSubtotalName;
361     long                nSourceDim;         // >=0 if dup'ed
362     ::com::sun::star::sheet::DataPilotFieldReference
363                         aReferenceValue;    // settings for "show data as" / "displayed value"
364     sal_Bool                bHasSelectedPage;
365     String              aSelectedPage;
366     ScDPItemData*       pSelectedData;      // internal, temporary, created from aSelectedPage
367     sal_Bool            mbHasHiddenMember;
368 
369 public:
370                             ScDPDimension( ScDPSource* pSrc, long nD );
371     virtual                 ~ScDPDimension();
372 
373     long                    GetDimension() const    { return nDim; }        // dimension index in source
374     long                    GetSourceDim() const    { return nSourceDim; }  // >=0 if dup'ed
375 
376     ScDPDimension*          CreateCloneObject();
377     ScDPHierarchies*        GetHierarchiesObject();
378 
379     SC_DLLPUBLIC const ::rtl::OUString*  GetLayoutName() const;
380     const ::rtl::OUString*  GetSubtotalName() const;
381 
382                             // XNamed
383     virtual ::rtl::OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
384     virtual void SAL_CALL   setName( const ::rtl::OUString& aName )
385                                 throw(::com::sun::star::uno::RuntimeException);
386 
387                             // XHierarchiesSupplier
388     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL
389                             getHierarchies() throw(::com::sun::star::uno::RuntimeException);
390 
391                             // XCloneable
392     virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL
393                             createClone() throw(::com::sun::star::uno::RuntimeException);
394 
395                             // XPropertySet
396     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
397                             SAL_CALL getPropertySetInfo(  )
398                                 throw(::com::sun::star::uno::RuntimeException);
399     virtual void SAL_CALL   setPropertyValue( const ::rtl::OUString& aPropertyName,
400                                     const ::com::sun::star::uno::Any& aValue )
401                                 throw(::com::sun::star::beans::UnknownPropertyException,
402                                     ::com::sun::star::beans::PropertyVetoException,
403                                     ::com::sun::star::lang::IllegalArgumentException,
404                                     ::com::sun::star::lang::WrappedTargetException,
405                                     ::com::sun::star::uno::RuntimeException);
406     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
407                                     const ::rtl::OUString& PropertyName )
408                                 throw(::com::sun::star::beans::UnknownPropertyException,
409                                     ::com::sun::star::lang::WrappedTargetException,
410                                     ::com::sun::star::uno::RuntimeException);
411     virtual void SAL_CALL   addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
412                                     const ::com::sun::star::uno::Reference<
413                                         ::com::sun::star::beans::XPropertyChangeListener >& xListener )
414                                 throw(::com::sun::star::beans::UnknownPropertyException,
415                                     ::com::sun::star::lang::WrappedTargetException,
416                                     ::com::sun::star::uno::RuntimeException);
417     virtual void SAL_CALL   removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
418                                     const ::com::sun::star::uno::Reference<
419                                         ::com::sun::star::beans::XPropertyChangeListener >& aListener )
420                                 throw(::com::sun::star::beans::UnknownPropertyException,
421                                     ::com::sun::star::lang::WrappedTargetException,
422                                     ::com::sun::star::uno::RuntimeException);
423     virtual void SAL_CALL   addVetoableChangeListener( const ::rtl::OUString& PropertyName,
424                                     const ::com::sun::star::uno::Reference<
425                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
426                                 throw(::com::sun::star::beans::UnknownPropertyException,
427                                     ::com::sun::star::lang::WrappedTargetException,
428                                     ::com::sun::star::uno::RuntimeException);
429     virtual void SAL_CALL   removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
430                                     const ::com::sun::star::uno::Reference<
431                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
432                                 throw(::com::sun::star::beans::UnknownPropertyException,
433                                     ::com::sun::star::lang::WrappedTargetException,
434                                     ::com::sun::star::uno::RuntimeException);
435 
436                             // XServiceInfo
437     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
438                                 throw(::com::sun::star::uno::RuntimeException);
439     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
440                                 throw(::com::sun::star::uno::RuntimeException);
441     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
442                                 throw(::com::sun::star::uno::RuntimeException);
443 
444     virtual sal_uInt16              getOrientation() const;
445     virtual void                setOrientation(sal_uInt16 nNew);
446     virtual long                getPosition() const;
447     virtual void                setPosition(long nNew);
448     virtual sal_Bool                getIsDataLayoutDimension() const;
449     virtual sal_uInt16              getFunction() const;
450     virtual void                setFunction(sal_uInt16 nNew);       // for data dimension
451     virtual long                getUsedHierarchy() const;
452     virtual void                setUsedHierarchy(long nNew);
453     virtual sal_Bool                isDuplicated() const;
454 
455     sal_Bool                        HasSelectedPage() const     { return bHasSelectedPage; }
456     const ScDPItemData&         GetSelectedData();
457 
458     const ::com::sun::star::sheet::DataPilotFieldReference& GetReferenceValue() const;
459 
460 //UNUSED2009-05 sal_Bool                        IsValidPage( const ScDPItemData& rData );
461 // Wang Xu Ming -- 2009-8-17
462 // DataPilot Migration - Cache&&Performance
463     sal_Bool                      IsVisible( const ScDPItemData& rData );
464 // End Comments
465 };
466 
467 class ScDPHierarchies : public cppu::WeakImplHelper2<
468                             com::sun::star::container::XNameAccess,
469                             com::sun::star::lang::XServiceInfo >
470 {
471 private:
472     ScDPSource*         pSource;
473     long                nDim;
474     long                nHierCount;
475     ScDPHierarchy**     ppHiers;
476 
477 public:
478                             ScDPHierarchies( ScDPSource* pSrc, long nD );
479     virtual                 ~ScDPHierarchies();
480 
481                             // XNameAccess
482     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
483                                 throw(::com::sun::star::container::NoSuchElementException,
484                                     ::com::sun::star::lang::WrappedTargetException,
485                                     ::com::sun::star::uno::RuntimeException);
486     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
487                                 throw(::com::sun::star::uno::RuntimeException);
488     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
489                                 throw(::com::sun::star::uno::RuntimeException);
490 
491                             // XElementAccess
492     virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
493                                 throw(::com::sun::star::uno::RuntimeException);
494     virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);
495 
496                             // XServiceInfo
497     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
498                                 throw(::com::sun::star::uno::RuntimeException);
499     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
500                                 throw(::com::sun::star::uno::RuntimeException);
501     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
502                                 throw(::com::sun::star::uno::RuntimeException);
503 
504     virtual long            getCount() const;
505     virtual ScDPHierarchy*  getByIndex(long nIndex) const;
506 };
507 
508 class ScDPHierarchy : public cppu::WeakImplHelper3<
509                             com::sun::star::sheet::XLevelsSupplier,
510                             com::sun::star::container::XNamed,
511                             com::sun::star::lang::XServiceInfo >
512 {
513 private:
514     ScDPSource*     pSource;
515     long            nDim;
516     long            nHier;
517     ScDPLevels*     pLevels;
518 
519 public:
520                             ScDPHierarchy( ScDPSource* pSrc, long nD, long nH );
521     virtual                 ~ScDPHierarchy();
522 
523     ScDPLevels*             GetLevelsObject();
524 
525                             // XNamed
526     virtual ::rtl::OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
527     virtual void SAL_CALL   setName( const ::rtl::OUString& aName )
528                                 throw(::com::sun::star::uno::RuntimeException);
529 
530                             // XLevelsSupplier
531     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL
532                             getLevels() throw(::com::sun::star::uno::RuntimeException);
533 
534                             // XServiceInfo
535     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
536                                 throw(::com::sun::star::uno::RuntimeException);
537     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
538                                 throw(::com::sun::star::uno::RuntimeException);
539     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
540                                 throw(::com::sun::star::uno::RuntimeException);
541 };
542 
543 class ScDPLevels : public cppu::WeakImplHelper2<
544                             com::sun::star::container::XNameAccess,
545                             com::sun::star::lang::XServiceInfo >
546 {
547 private:
548     ScDPSource*     pSource;
549     long            nDim;
550     long            nHier;
551     long            nLevCount;
552     ScDPLevel**     ppLevs;
553 
554 public:
555                             ScDPLevels( ScDPSource* pSrc, long nD, long nH );
556     virtual                 ~ScDPLevels();
557 
558                             // XNameAccess
559     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
560                                 throw(::com::sun::star::container::NoSuchElementException,
561                                     ::com::sun::star::lang::WrappedTargetException,
562                                     ::com::sun::star::uno::RuntimeException);
563     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
564                                 throw(::com::sun::star::uno::RuntimeException);
565     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
566                                 throw(::com::sun::star::uno::RuntimeException);
567 
568                             // XElementAccess
569     virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
570                                 throw(::com::sun::star::uno::RuntimeException);
571     virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);
572 
573                             // XServiceInfo
574     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
575                                 throw(::com::sun::star::uno::RuntimeException);
576     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
577                                 throw(::com::sun::star::uno::RuntimeException);
578     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
579                                 throw(::com::sun::star::uno::RuntimeException);
580 
581     virtual long            getCount() const;
582     virtual ScDPLevel*      getByIndex(long nIndex) const;
583 };
584 
585 class ScDPLevel : public cppu::WeakImplHelper5<
586                             com::sun::star::sheet::XMembersSupplier,
587                             com::sun::star::container::XNamed,
588                             com::sun::star::sheet::XDataPilotMemberResults,
589                             com::sun::star::beans::XPropertySet,
590                             com::sun::star::lang::XServiceInfo >
591 {
592 private:
593     ScDPSource*                 pSource;
594     long                        nDim;
595     long                        nHier;
596     long                        nLev;
597     ScDPMembers*                pMembers;
598     com::sun::star::uno::Sequence<com::sun::star::sheet::GeneralFunction> aSubTotals;
599     sal_Bool                        bShowEmpty;
600     ::com::sun::star::sheet::DataPilotFieldSortInfo     aSortInfo;      // stored user settings
601     ::com::sun::star::sheet::DataPilotFieldAutoShowInfo aAutoShowInfo;  // stored user settings
602     ::com::sun::star::sheet::DataPilotFieldLayoutInfo   aLayoutInfo;    // stored user settings
603                                                     // valid only from result calculation:
604     ::std::vector<sal_Int32>    aGlobalOrder;       // result of sorting by name or position
605     long                        nSortMeasure;       // measure (index of data dimension) to sort by
606     long                        nAutoMeasure;       // measure (index of data dimension) for AutoShow
607     sal_Bool                        bEnableLayout;      // enabled only for row fields, not for the innermost one
608 
609 public:
610                             ScDPLevel( ScDPSource* pSrc, long nD, long nH, long nL );
611     virtual                 ~ScDPLevel();
612 
613     ScDPMembers*            GetMembersObject();
614 
615                             // XNamed
616     virtual ::rtl::OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
617     virtual void SAL_CALL   setName( const ::rtl::OUString& aName )
618                                 throw(::com::sun::star::uno::RuntimeException);
619 
620                             // XMembersSupplier
621     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL
622                             getMembers() throw(::com::sun::star::uno::RuntimeException);
623 
624                             // XDataPilotMemberResults
625     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::MemberResult > SAL_CALL
626                             getResults() throw(::com::sun::star::uno::RuntimeException);
627 
628                             // XPropertySet
629     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
630                             SAL_CALL getPropertySetInfo(  )
631                                 throw(::com::sun::star::uno::RuntimeException);
632     virtual void SAL_CALL   setPropertyValue( const ::rtl::OUString& aPropertyName,
633                                     const ::com::sun::star::uno::Any& aValue )
634                                 throw(::com::sun::star::beans::UnknownPropertyException,
635                                     ::com::sun::star::beans::PropertyVetoException,
636                                     ::com::sun::star::lang::IllegalArgumentException,
637                                     ::com::sun::star::lang::WrappedTargetException,
638                                     ::com::sun::star::uno::RuntimeException);
639     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
640                                     const ::rtl::OUString& PropertyName )
641                                 throw(::com::sun::star::beans::UnknownPropertyException,
642                                     ::com::sun::star::lang::WrappedTargetException,
643                                     ::com::sun::star::uno::RuntimeException);
644     virtual void SAL_CALL   addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
645                                     const ::com::sun::star::uno::Reference<
646                                         ::com::sun::star::beans::XPropertyChangeListener >& xListener )
647                                 throw(::com::sun::star::beans::UnknownPropertyException,
648                                     ::com::sun::star::lang::WrappedTargetException,
649                                     ::com::sun::star::uno::RuntimeException);
650     virtual void SAL_CALL   removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
651                                     const ::com::sun::star::uno::Reference<
652                                         ::com::sun::star::beans::XPropertyChangeListener >& aListener )
653                                 throw(::com::sun::star::beans::UnknownPropertyException,
654                                     ::com::sun::star::lang::WrappedTargetException,
655                                     ::com::sun::star::uno::RuntimeException);
656     virtual void SAL_CALL   addVetoableChangeListener( const ::rtl::OUString& PropertyName,
657                                     const ::com::sun::star::uno::Reference<
658                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
659                                 throw(::com::sun::star::beans::UnknownPropertyException,
660                                     ::com::sun::star::lang::WrappedTargetException,
661                                     ::com::sun::star::uno::RuntimeException);
662     virtual void SAL_CALL   removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
663                                     const ::com::sun::star::uno::Reference<
664                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
665                                 throw(::com::sun::star::beans::UnknownPropertyException,
666                                     ::com::sun::star::lang::WrappedTargetException,
667                                     ::com::sun::star::uno::RuntimeException);
668 
669                             // XServiceInfo
670     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
671                                 throw(::com::sun::star::uno::RuntimeException);
672     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
673                                 throw(::com::sun::star::uno::RuntimeException);
674     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
675                                 throw(::com::sun::star::uno::RuntimeException);
676 
677     virtual com::sun::star::uno::Sequence<com::sun::star::sheet::GeneralFunction> getSubTotals() const;
678     virtual void            setSubTotals(const com::sun::star::uno::Sequence<
679                                             com::sun::star::sheet::GeneralFunction>& rNew);
680     virtual sal_Bool            getShowEmpty() const;
681     virtual void            setShowEmpty(sal_Bool bSet);
682 
683     const ::com::sun::star::sheet::DataPilotFieldSortInfo& GetSortInfo() const      { return aSortInfo; }
684     const ::com::sun::star::sheet::DataPilotFieldAutoShowInfo& GetAutoShow() const  { return aAutoShowInfo; }
685 
686     void                    EvaluateSortOrder();
687     void                    SetEnableLayout( sal_Bool bSet );
688 
689     const ::std::vector<sal_Int32>& GetGlobalOrder() const      { return aGlobalOrder; }
690     ::std::vector<sal_Int32>&  GetGlobalOrder()                 { return aGlobalOrder; }
691     long                    GetSortMeasure() const              { return nSortMeasure; }
692     long                    GetAutoMeasure() const              { return nAutoMeasure; }
693 
694     sal_Bool                    IsOutlineLayout() const
695                             { return bEnableLayout &&
696                                aLayoutInfo.LayoutMode !=
697                                 ::com::sun::star::sheet::DataPilotFieldLayoutMode::TABULAR_LAYOUT; }
698 
699     sal_Bool                    IsSubtotalsAtTop() const
700                             { return bEnableLayout &&
701                                aLayoutInfo.LayoutMode ==
702                                 ::com::sun::star::sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP; }
703 
704     sal_Bool                    IsAddEmpty() const          { return bEnableLayout && aLayoutInfo.AddEmptyLines; }
705 
706     //! number format (for data fields and date fields)
707 };
708 
709 // hash map from name to index in the member array, for fast name access
710 typedef ::std::hash_map< ::rtl::OUString, sal_Int32, ::rtl::OUStringHash > ScDPMembersHashMap;
711 
712 class ScDPMembers : public cppu::WeakImplHelper2<
713                             com::sun::star::container::XNameAccess,
714                             com::sun::star::lang::XServiceInfo >
715 {
716 private:
717     ScDPSource*     pSource;
718     long            nDim;
719     long            nHier;
720     long            nLev;
721     long            nMbrCount;
722     ScDPMember**    ppMbrs;
723     mutable ScDPMembersHashMap aHashMap;
724 
725 public:
726                             ScDPMembers( ScDPSource* pSrc, long nD, long nH, long nL );
727     virtual                 ~ScDPMembers();
728 
729                             // XNameAccess
730     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
731                                 throw(::com::sun::star::container::NoSuchElementException,
732                                     ::com::sun::star::lang::WrappedTargetException,
733                                     ::com::sun::star::uno::RuntimeException);
734     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
735                                 throw(::com::sun::star::uno::RuntimeException);
736     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
737                                 throw(::com::sun::star::uno::RuntimeException);
738 
739                             // XElementAccess
740     virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
741                                 throw(::com::sun::star::uno::RuntimeException);
742     virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);
743 
744                             // XServiceInfo
745     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
746                                 throw(::com::sun::star::uno::RuntimeException);
747     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
748                                 throw(::com::sun::star::uno::RuntimeException);
749     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
750                                 throw(::com::sun::star::uno::RuntimeException);
751 
752     virtual long            getCount() const;
753     virtual ScDPMember*     getByIndex(long nIndex) const;
754 
755     long                    getMinMembers() const;
756 
757     sal_Int32               GetIndexFromName( const ::rtl::OUString& rName ) const;     // <0 if not found
758     // Wang Xu Ming -- 2009-8-17
759     // DataPilot Migration - Cache&&Performance
760     const std::vector<sal_Int32>&    GetGlobalOrder();
761     const ScDPItemData*               GetSrcItemDataByIndex(  SCROW nIndex);
762     SCROW                                   GetSrcItemsCount();
763     // End Comments
764 };
765 
766 class ScDPMember : public cppu::WeakImplHelper3<
767                             com::sun::star::container::XNamed,
768                             com::sun::star::beans::XPropertySet,
769                             com::sun::star::lang::XServiceInfo >
770 {
771 private:
772     ScDPSource*     pSource;
773     long            nDim;
774     long            nHier;
775     long            nLev;
776 
777     // Wang Xu Ming -- 2009-8-17
778     // DataPilot Migration - Cache&&Performance
779     SCROW       mnDataId;
780     // End Comments
781 //  String          aCaption;           // visible name (changeable by user)
782     ::std::auto_ptr<rtl::OUString> mpLayoutName;
783 
784     sal_Int32       nPosition;          // manual sorting
785     sal_Bool            bVisible;
786     sal_Bool            bShowDet;
787 
788 public:
789     // Wang Xu Ming -- 2009-8-17
790     // DataPilot Migration - Cache&&Performance
791     ScDPMember( ScDPSource* pSrc, long nD, long nH, long nL,
792         SCROW nIndex /*const String& rN, double fV, sal_Bool bHV */);
793     // End Comments
794     virtual                 ~ScDPMember();
795 
796     sal_Bool                    IsNamedItem( const ScDPItemData& r ) const;
797     String                  GetNameStr() const;
798     void                    FillItemData( ScDPItemData& rData ) const;
799     // Wang Xu Ming -- 2009-8-17
800     // DataPilot Migration - Cache&&Performance
801     //  const ScDPItemData&  GetItemData() const{ return maData; }
802     const ScDPItemData&  GetItemData() const;
803     inline SCROW               GetItemDataId() const { return mnDataId; }
804     sal_Bool                           IsNamedItem( SCROW    nIndex  ) const;
805     // End Comments
806 
807     SC_DLLPUBLIC const ::rtl::OUString*  GetLayoutName() const;
808 
809     sal_Int32               Compare( const ScDPMember& rOther ) const;      // visible order
810 
811                             // XNamed
812     virtual ::rtl::OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
813     virtual void SAL_CALL   setName( const ::rtl::OUString& aName )
814                                 throw(::com::sun::star::uno::RuntimeException);
815 
816                             // XPropertySet
817     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
818                             SAL_CALL getPropertySetInfo(  )
819                                 throw(::com::sun::star::uno::RuntimeException);
820     virtual void SAL_CALL   setPropertyValue( const ::rtl::OUString& aPropertyName,
821                                     const ::com::sun::star::uno::Any& aValue )
822                                 throw(::com::sun::star::beans::UnknownPropertyException,
823                                     ::com::sun::star::beans::PropertyVetoException,
824                                     ::com::sun::star::lang::IllegalArgumentException,
825                                     ::com::sun::star::lang::WrappedTargetException,
826                                     ::com::sun::star::uno::RuntimeException);
827     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
828                                     const ::rtl::OUString& PropertyName )
829                                 throw(::com::sun::star::beans::UnknownPropertyException,
830                                     ::com::sun::star::lang::WrappedTargetException,
831                                     ::com::sun::star::uno::RuntimeException);
832     virtual void SAL_CALL   addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
833                                     const ::com::sun::star::uno::Reference<
834                                         ::com::sun::star::beans::XPropertyChangeListener >& xListener )
835                                 throw(::com::sun::star::beans::UnknownPropertyException,
836                                     ::com::sun::star::lang::WrappedTargetException,
837                                     ::com::sun::star::uno::RuntimeException);
838     virtual void SAL_CALL   removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
839                                     const ::com::sun::star::uno::Reference<
840                                         ::com::sun::star::beans::XPropertyChangeListener >& aListener )
841                                 throw(::com::sun::star::beans::UnknownPropertyException,
842                                     ::com::sun::star::lang::WrappedTargetException,
843                                     ::com::sun::star::uno::RuntimeException);
844     virtual void SAL_CALL   addVetoableChangeListener( const ::rtl::OUString& PropertyName,
845                                     const ::com::sun::star::uno::Reference<
846                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
847                                 throw(::com::sun::star::beans::UnknownPropertyException,
848                                     ::com::sun::star::lang::WrappedTargetException,
849                                     ::com::sun::star::uno::RuntimeException);
850     virtual void SAL_CALL   removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
851                                     const ::com::sun::star::uno::Reference<
852                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener )
853                                 throw(::com::sun::star::beans::UnknownPropertyException,
854                                     ::com::sun::star::lang::WrappedTargetException,
855                                     ::com::sun::star::uno::RuntimeException);
856 
857                             // XServiceInfo
858     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
859                                 throw(::com::sun::star::uno::RuntimeException);
860     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
861                                 throw(::com::sun::star::uno::RuntimeException);
862     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
863                                 throw(::com::sun::star::uno::RuntimeException);
864 
865     virtual sal_Bool            getIsVisible() const;
866     virtual void            setIsVisible(sal_Bool bSet);
867     virtual sal_Bool            getShowDetails() const;
868     virtual void            setShowDetails(sal_Bool bSet);
869 
870     sal_Int32               getPosition() const;
871     void                    setPosition(sal_Int32 nNew);
872 };
873 
874 
875 #endif
876 
877