xref: /trunk/main/sc/inc/dapiuno.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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_DAPIUNO_HXX
25 #define SC_DAPIUNO_HXX
26 
27 #include "global.hxx"
28 #include "dpobject.hxx"
29 #include "rangeutl.hxx"     // ScArea
30 #include "cellsuno.hxx"     // for XModifyListenerArr_Impl
31 
32 #include <svl/lstner.hxx>
33 #include <svl/itemprop.hxx>
34 
35 #include <com/sun/star/lang/XServiceInfo.hpp>
36 #include <com/sun/star/lang/XUnoTunnel.hpp>
37 #include <com/sun/star/beans/XPropertySet.hpp>
38 #include <com/sun/star/container/XEnumerationAccess.hpp>
39 #include <com/sun/star/container/XNameContainer.hpp>
40 #include <com/sun/star/util/XModifyBroadcaster.hpp>
41 
42 #include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
43 #include <com/sun/star/sheet/DataPilotFieldGroupInfo.hpp>
44 #include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
45 #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
46 #include <com/sun/star/sheet/DataPilotFieldReference.hpp>
47 #include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
48 #include <com/sun/star/sheet/GeneralFunction.hpp>
49 #include <com/sun/star/sheet/XDataPilotDataLayoutFieldSupplier.hpp>
50 #include <com/sun/star/sheet/XDataPilotDescriptor.hpp>
51 #include <com/sun/star/sheet/XDataPilotField.hpp>
52 #include <com/sun/star/sheet/XDataPilotFieldGrouping.hpp>
53 #include <com/sun/star/sheet/XDataPilotTable.hpp>
54 #include <com/sun/star/sheet/XDataPilotTable2.hpp>
55 #include <com/sun/star/sheet/XDataPilotTables.hpp>
56 
57 #include <cppuhelper/implbase2.hxx>
58 #include <cppuhelper/implbase3.hxx>
59 #include <cppuhelper/implbase4.hxx>
60 #include <cppuhelper/implbase5.hxx>
61 
62 #include <memory>
63 #include <vector>
64 
65 namespace com { namespace sun { namespace star { namespace sheet {
66     struct DataPilotFieldFilter;
67     struct DataPilotTablePositionData;
68 }}}}
69 
70 class ScDocShell;
71 class ScDPSaveDimension;
72 class ScDPSaveGroupDimension;
73 class ScDPSaveNumGroupDimension;
74 struct ScDPNumGroupInfo;
75 
76 class ScDataPilotTableObj;
77 class ScDataPilotFieldObj;
78 class ScDataPilotItemObj;
79 
80 
81 class ScDataPilotConversion
82 {
83 public:
84     static com::sun::star::sheet::GeneralFunction   FirstFunc( sal_uInt16 nBits );
85     static sal_uInt16           FunctionBit( com::sun::star::sheet::GeneralFunction eFunc );
86 
87     static void         FillGroupInfo(
88                             ::com::sun::star::sheet::DataPilotFieldGroupInfo& rInfo,
89                             const ScDPNumGroupInfo& rGroupInfo );
90 };
91 
92 // ============================================================================
93 
94 /** DataPilotTables collection per sheet. */
95 class ScDataPilotTablesObj : public cppu::WeakImplHelper4<
96                                         com::sun::star::sheet::XDataPilotTables,
97                                         com::sun::star::container::XEnumerationAccess,
98                                         com::sun::star::container::XIndexAccess,
99                                         com::sun::star::lang::XServiceInfo>,
100                                     public SfxListener
101 {
102 private:
103     ScDocShell*             pDocShell;
104     SCTAB                   nTab;
105 
106     ScDataPilotTableObj*    GetObjectByIndex_Impl( sal_Int32 nIndex );
107     ScDataPilotTableObj*    GetObjectByName_Impl(const ::rtl::OUString& aName);
108 
109 public:
110                             ScDataPilotTablesObj(ScDocShell* pDocSh, SCTAB nT);
111     virtual                 ~ScDataPilotTablesObj();
112 
113     virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
114 
115                             // XDataPilotTables
116     virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotDescriptor > SAL_CALL
117                             createDataPilotDescriptor();
118     virtual void SAL_CALL   insertNewByName( const ::rtl::OUString& aName,
119                                     const ::com::sun::star::table::CellAddress& aOutputAddress,
120                                     const ::com::sun::star::uno::Reference<
121                                         ::com::sun::star::sheet::XDataPilotDescriptor >& xDescriptor );
122     virtual void SAL_CALL   removeByName( const ::rtl::OUString& aName );
123 
124                             // XNameAccess
125     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName );
126     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames();
127     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName );
128 
129                             // XIndexAccess
130     virtual sal_Int32 SAL_CALL getCount();
131     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index );
132 
133                             // XEnumerationAccess
134     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
135                             createEnumeration();
136 
137                             // XElementAccess
138     virtual ::com::sun::star::uno::Type SAL_CALL getElementType();
139     virtual sal_Bool SAL_CALL hasElements();
140 
141                             // XServiceInfo
142     virtual ::rtl::OUString SAL_CALL getImplementationName();
143     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
144     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
145 };
146 
147 // ============================================================================
148 
149 //  ScDataPilotDescriptorBase is never instantiated directly
150 class ScDataPilotDescriptorBase : public com::sun::star::sheet::XDataPilotDescriptor,
151                                   public com::sun::star::beans::XPropertySet,
152                                   public com::sun::star::sheet::XDataPilotDataLayoutFieldSupplier,
153                                   public com::sun::star::lang::XServiceInfo,
154                                   public com::sun::star::lang::XUnoTunnel,
155                                   public com::sun::star::lang::XTypeProvider,
156                                   public cppu::OWeakObject,
157                                   public SfxListener
158 {
159 private:
160     SfxItemPropertySet  maPropSet;
161     ScDocShell*         pDocShell;
162 
163 public:
164                             ScDataPilotDescriptorBase(ScDocShell* pDocSh);
165     virtual                 ~ScDataPilotDescriptorBase();
166 
167     virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
168                                 const ::com::sun::star::uno::Type & rType );
169     virtual void SAL_CALL   acquire() throw();
170     virtual void SAL_CALL   release() throw();
171 
172     virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
173 
GetDocShell() const174     ScDocShell*             GetDocShell() const     { return pDocShell; }
175 
176                             // in den Ableitungen:
177     virtual ScDPObject* GetDPObject() const = 0;
178     virtual void SetDPObject(ScDPObject* pDPObj) = 0;
179 
180                             // XDataPilotDescriptor
181                             //  getName, setName, getTag, setTag in derived classes
182 
183     virtual ::com::sun::star::table::CellRangeAddress SAL_CALL getSourceRange();
184     virtual void SAL_CALL setSourceRange( const ::com::sun::star::table::CellRangeAddress& aSourceRange );
185     virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetFilterDescriptor > SAL_CALL
186                             getFilterDescriptor();
187     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
188                             getDataPilotFields();
189     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
190                             getColumnFields();
191     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
192                             getRowFields();
193     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
194                             getPageFields();
195     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
196                             getDataFields();
197     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL
198                             getHiddenFields();
199 
200                             // XPropertySet
201     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
202                             SAL_CALL getPropertySetInfo(  );
203     virtual void SAL_CALL   setPropertyValue( const ::rtl::OUString& aPropertyName,
204                                     const ::com::sun::star::uno::Any& aValue );
205     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
206                                     const ::rtl::OUString& PropertyName );
207     virtual void SAL_CALL   addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
208                                     const ::com::sun::star::uno::Reference<
209                                         ::com::sun::star::beans::XPropertyChangeListener >& xListener );
210     virtual void SAL_CALL   removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
211                                     const ::com::sun::star::uno::Reference<
212                                         ::com::sun::star::beans::XPropertyChangeListener >& aListener );
213     virtual void SAL_CALL   addVetoableChangeListener( const ::rtl::OUString& PropertyName,
214                                     const ::com::sun::star::uno::Reference<
215                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener );
216     virtual void SAL_CALL   removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
217                                     const ::com::sun::star::uno::Reference<
218                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener );
219 
220                             // XDataPilotDataLayoutFieldSupplier
221     virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >
222                             SAL_CALL getDataLayoutField();
223 
224                             // XUnoTunnel
225     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence<
226                                     sal_Int8 >& aIdentifier );
227 
228     static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId();
229     static ScDataPilotDescriptorBase* getImplementation( const com::sun::star::uno::Reference<
230                                     com::sun::star::sheet::XDataPilotDescriptor> xObj );
231 
232                             // XTypeProvider (overloaded in ScDataPilotTableObj)
233     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes();
234     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId();
235 
236                             // XServiceInfo is in derived classes
237 };
238 
239 // ============================================================================
240 
241 class ScDataPilotDescriptor : public ScDataPilotDescriptorBase
242 {
243 private:
244     ScDPObject*             mpDPObject;
245 
246 public:
247                             ScDataPilotDescriptor(ScDocShell* pDocSh);
248     virtual                 ~ScDataPilotDescriptor();
249 
250     virtual ScDPObject* GetDPObject() const;
251     virtual void SetDPObject(ScDPObject* pDPObj);
252 
253                             // rest of XDataPilotDescriptor (incl. XNamed)
254     virtual ::rtl::OUString SAL_CALL getName();
255     virtual void SAL_CALL   setName( const ::rtl::OUString& aName );
256     virtual ::rtl::OUString SAL_CALL getTag();
257     virtual void SAL_CALL   setTag( const ::rtl::OUString& aTag );
258 
259                             // XServiceInfo
260     virtual ::rtl::OUString SAL_CALL getImplementationName();
261     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
262     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
263 };
264 
265 // ============================================================================
266 
267 class ScDataPilotTableObj : public ScDataPilotDescriptorBase,
268                             public com::sun::star::sheet::XDataPilotTable2,
269                             public com::sun::star::util::XModifyBroadcaster
270 {
271 private:
272     SCTAB                   nTab;
273     String                  aName;
274     XModifyListenerArr_Impl aModifyListeners;
275 
276     void                    Refreshed_Impl();
277 
278 public:
279                             ScDataPilotTableObj(ScDocShell* pDocSh, SCTAB nT, const String& rN);
280     virtual                 ~ScDataPilotTableObj();
281 
282     virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
283                                 const ::com::sun::star::uno::Type & rType );
284     virtual void SAL_CALL   acquire() throw();
285     virtual void SAL_CALL   release() throw();
286 
287     virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
288 
289     virtual ScDPObject* GetDPObject() const;
290     virtual void SetDPObject(ScDPObject* pDPObj);
291 
292                             // rest of XDataPilotDescriptor (incl. XNamed)
293     virtual ::rtl::OUString SAL_CALL getName();
294     virtual void SAL_CALL   setName( const ::rtl::OUString& aName );
295     virtual ::rtl::OUString SAL_CALL getTag();
296     virtual void SAL_CALL   setTag( const ::rtl::OUString& aTag );
297 
298                             // XDataPilotTable
299     virtual ::com::sun::star::table::CellRangeAddress SAL_CALL getOutputRange();
300     virtual void SAL_CALL   refresh();
301 
302                             // XDataPilotTable2
303     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >
304         SAL_CALL getDrillDownData(const ::com::sun::star::table::CellAddress& aAddr);
305 
306     virtual ::com::sun::star::sheet::DataPilotTablePositionData
307         SAL_CALL getPositionData(const ::com::sun::star::table::CellAddress& aAddr);
308 
309     virtual void SAL_CALL insertDrillDownSheet(const ::com::sun::star::table::CellAddress& aAddr);
310 
311     virtual ::com::sun::star::table::CellRangeAddress SAL_CALL getOutputRangeByType( sal_Int32 nType );
312 
313                             // XModifyBroadcaster
314     virtual void SAL_CALL   addModifyListener( const ::com::sun::star::uno::Reference<
315                                                 ::com::sun::star::util::XModifyListener >& aListener );
316     virtual void SAL_CALL   removeModifyListener( const ::com::sun::star::uno::Reference<
317                                                 ::com::sun::star::util::XModifyListener >& aListener );
318 
319                             // XTypeProvider (overloaded)
320     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes();
321     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId();
322 
323                             // XServiceInfo
324     virtual ::rtl::OUString SAL_CALL getImplementationName();
325     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
326     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
327 };
328 
329 // ============================================================================
330 
331 struct ScFieldIdentifier
332 {
333     ::rtl::OUString     maFieldName;    /// Source field name.
334     sal_Int32           mnFieldIdx;     /// Field index (if several fields with same name exist).
335     bool                mbDataLayout;   /// True = data layout field collecting all data fields as items.
336 
ScFieldIdentifierScFieldIdentifier337     inline explicit     ScFieldIdentifier() :
338                             mnFieldIdx( 0 ), mbDataLayout( false ) {}
339 
ScFieldIdentifierScFieldIdentifier340     inline explicit     ScFieldIdentifier( const ::rtl::OUString& rFieldName, sal_Int32 nFieldIdx, bool bDataLayout ) :
341                             maFieldName( rFieldName ), mnFieldIdx( nFieldIdx ), mbDataLayout( bDataLayout ) {}
342 };
343 
344 // ============================================================================
345 
346 /** Base class of all implementation objects based on a DataPilot descriptor
347     or DataPilot table object. Wraps acquiring and releasing the parent. */
348 class ScDataPilotChildObjBase
349 {
350 protected:
351     explicit            ScDataPilotChildObjBase( ScDataPilotDescriptorBase& rParent );
352     explicit            ScDataPilotChildObjBase( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId );
353     virtual             ~ScDataPilotChildObjBase();
354 
355     /** Returns the wrapped DataPilot object (calls GetDPObject() at parent). */
356     ScDPObject*         GetDPObject() const;
357     /** Sets the passed DataPilot object (calls SetDPObject() at parent). */
358     void                SetDPObject( ScDPObject* pDPObject );
359 
360     /** Returns the DataPilot dimension object related to the field described by maFieldId. */
361     ScDPSaveDimension*  GetDPDimension( ScDPObject** ppDPObject = 0 ) const;
362 
363     /** Returns the number of members for the field described by maFieldId. */
364     sal_Int32           GetMemberCount() const;
365     /** Returns the collection of members for the field described by maFieldId. */
366     ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
367                         GetMembers() const;
368 
369 protected:
370     ScDataPilotDescriptorBase& mrParent;
371     ScFieldIdentifier   maFieldId;
372 
373 private:
374     ScDataPilotChildObjBase& operator=( const ScDataPilotChildObjBase& );
375 };
376 
377 // ============================================================================
378 
379 typedef ::cppu::WeakImplHelper4
380 <
381     ::com::sun::star::container::XEnumerationAccess,
382     ::com::sun::star::container::XIndexAccess,
383     ::com::sun::star::container::XNameAccess,
384     ::com::sun::star::lang::XServiceInfo
385 >
386 ScDataPilotFieldsObjImpl;
387 
388 /** Collection of all DataPilot fields, or of all fields from a specific dimension. */
389 class ScDataPilotFieldsObj : public ScDataPilotChildObjBase, public ScDataPilotFieldsObjImpl
390 {
391 public:
392     explicit            ScDataPilotFieldsObj(
393                             ScDataPilotDescriptorBase& rParent );
394 
395     explicit            ScDataPilotFieldsObj(
396                             ScDataPilotDescriptorBase& rParent,
397                             ::com::sun::star::sheet::DataPilotFieldOrientation eOrient );
398 
399     virtual             ~ScDataPilotFieldsObj();
400 
401                             // XNameAccess
402     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName );
403     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames();
404     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName );
405 
406                             // XIndexAccess
407     virtual sal_Int32 SAL_CALL getCount();
408     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index );
409 
410                             // XEnumerationAccess
411     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
412                             createEnumeration();
413 
414                             // XElementAccess
415     virtual ::com::sun::star::uno::Type SAL_CALL getElementType();
416     virtual sal_Bool SAL_CALL hasElements();
417 
418                             // XServiceInfo
419     virtual ::rtl::OUString SAL_CALL getImplementationName();
420     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
421     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
422 
423 private:
424     ScDataPilotFieldObj*    GetObjectByIndex_Impl( sal_Int32 nIndex ) const;
425     ScDataPilotFieldObj*    GetObjectByName_Impl( const ::rtl::OUString& rName ) const;
426 
427 private:
428     ::com::sun::star::uno::Any maOrient;    /// Field orientation, no value = all fields.
429 };
430 
431 // ============================================================================
432 
433 typedef ::cppu::WeakImplHelper5
434 <
435     ::com::sun::star::container::XNamed,
436     ::com::sun::star::beans::XPropertySet,
437     ::com::sun::star::sheet::XDataPilotField,
438     ::com::sun::star::sheet::XDataPilotFieldGrouping,
439     ::com::sun::star::lang::XServiceInfo
440 >
441 ScDataPilotFieldObjImpl;
442 
443 /** Implementation of a single DataPilot field. */
444 class ScDataPilotFieldObj : public ScDataPilotChildObjBase, public ScDataPilotFieldObjImpl
445 {
446 public:
447                         ScDataPilotFieldObj(
448                             ScDataPilotDescriptorBase& rParent,
449                             const ScFieldIdentifier& rIdent );
450 
451                         ScDataPilotFieldObj(
452                             ScDataPilotDescriptorBase& rParent,
453                             const ScFieldIdentifier& rIdent,
454                             const ::com::sun::star::uno::Any& rOrient );
455 
456     virtual             ~ScDataPilotFieldObj();
457 
458                             // XNamed
459     virtual ::rtl::OUString SAL_CALL getName();
460     virtual void SAL_CALL   setName( const ::rtl::OUString& aName );
461 
462                             // XPropertySet
463     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
464                             SAL_CALL getPropertySetInfo(  );
465     virtual void SAL_CALL   setPropertyValue( const ::rtl::OUString& aPropertyName,
466                                     const ::com::sun::star::uno::Any& aValue );
467     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
468                                     const ::rtl::OUString& PropertyName );
469     virtual void SAL_CALL   addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
470                                     const ::com::sun::star::uno::Reference<
471                                         ::com::sun::star::beans::XPropertyChangeListener >& xListener );
472     virtual void SAL_CALL   removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
473                                     const ::com::sun::star::uno::Reference<
474                                         ::com::sun::star::beans::XPropertyChangeListener >& aListener );
475     virtual void SAL_CALL   addVetoableChangeListener( const ::rtl::OUString& PropertyName,
476                                     const ::com::sun::star::uno::Reference<
477                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener );
478     virtual void SAL_CALL   removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
479                                     const ::com::sun::star::uno::Reference<
480                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener );
481 
482                             // XDatePilotField
483     virtual com::sun::star::uno::Reference<com::sun::star::container::XIndexAccess> SAL_CALL
484                                 getItems();
485 
486                             // nur noch aus Property-Funktionen gerufen:
487     com::sun::star::sheet::DataPilotFieldOrientation getOrientation(void) const;
488     void setOrientation(com::sun::star::sheet::DataPilotFieldOrientation Orientation);
489     com::sun::star::sheet::GeneralFunction getFunction(void) const;
490     void setFunction(com::sun::star::sheet::GeneralFunction Function);
491     com::sun::star::uno::Sequence< com::sun::star::sheet::GeneralFunction > getSubtotals() const;
492     void setSubtotals(const com::sun::star::uno::Sequence< com::sun::star::sheet::GeneralFunction >& rFunctions);
493     rtl::OUString getCurrentPage() const;
494     void setCurrentPage(const rtl::OUString& sPage);
495     sal_Bool getUseCurrentPage() const;
496     void setUseCurrentPage(sal_Bool bUse);
497     const com::sun::star::sheet::DataPilotFieldAutoShowInfo* getAutoShowInfo();
498     void setAutoShowInfo(const com::sun::star::sheet::DataPilotFieldAutoShowInfo* pInfo);
499     const com::sun::star::sheet::DataPilotFieldLayoutInfo* getLayoutInfo();
500     void setLayoutInfo(const com::sun::star::sheet::DataPilotFieldLayoutInfo* pInfo);
501     const com::sun::star::sheet::DataPilotFieldReference* getReference();
502     void setReference(const com::sun::star::sheet::DataPilotFieldReference* pInfo);
503     const com::sun::star::sheet::DataPilotFieldSortInfo* getSortInfo();
504     void setSortInfo(const com::sun::star::sheet::DataPilotFieldSortInfo* pInfo);
505     sal_Bool getShowEmpty() const;
506     void setShowEmpty(sal_Bool bShow);
507 
508     sal_Bool hasGroupInfo();
509     com::sun::star::sheet::DataPilotFieldGroupInfo getGroupInfo();
510     void setGroupInfo(const com::sun::star::sheet::DataPilotFieldGroupInfo* pInfo);
511 
512                             // XDataPilotFieldGrouping
513     sal_Bool HasString(const com::sun::star::uno::Sequence< ::rtl::OUString >& aItems, const ::rtl::OUString& aString);
514     virtual com::sun::star::uno::Reference < com::sun::star::sheet::XDataPilotField > SAL_CALL
515         createNameGroup(const com::sun::star::uno::Sequence< ::rtl::OUString >& aItems);
516     virtual com::sun::star::uno::Reference < com::sun::star::sheet::XDataPilotField > SAL_CALL
517         createDateGroup(const com::sun::star::sheet::DataPilotFieldGroupInfo& rInfo);
518 
519                             // XServiceInfo
520     virtual ::rtl::OUString SAL_CALL getImplementationName();
521     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
522     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
523 
524 private:
525     ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >
526                         mxItems;
527     SfxItemPropertySet  maPropSet;
528     ::com::sun::star::uno::Any maOrient;
529 };
530 
531 // ============================================================================
532 
533 typedef ::std::vector< ::rtl::OUString > ScFieldGroupMembers;
534 
535 struct ScFieldGroup
536 {
537     ::rtl::OUString     maName;
538     ScFieldGroupMembers maMembers;
539 };
540 
541 typedef ::std::vector< ScFieldGroup > ScFieldGroups;
542 
543 // ============================================================================
544 
545 typedef ::cppu::WeakImplHelper4
546 <
547     ::com::sun::star::container::XNameContainer,
548     ::com::sun::star::container::XEnumerationAccess,
549     ::com::sun::star::container::XIndexAccess,
550     ::com::sun::star::lang::XServiceInfo
551 >
552 ScDataPilotFieldGroupsObjImpl;
553 
554 /** Implementation of all grouped items in a DataPilot field.
555 
556     This is a stand-alone object without any connection to the base DataPilot
557     field. Grouping info has to be written back with the GroupInfo property of
558     the DataPilot field after modifying this object.
559  */
560 class ScDataPilotFieldGroupsObj : public ScDataPilotFieldGroupsObjImpl
561 {
562 public:
563     explicit            ScDataPilotFieldGroupsObj( const ScFieldGroups& rGroups );
564     virtual             ~ScDataPilotFieldGroupsObj();
565 
566                             // XNameAccess
567     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName );
568     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames();
569     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName );
570 
571                                 // XNameReplace
572     virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName,
573                                 const ::com::sun::star::uno::Any& aElement );
574 
575                             // XNameContainer
576     virtual void SAL_CALL insertByName( const ::rtl::OUString& aName,
577                                 const ::com::sun::star::uno::Any& aElement );
578     virtual void SAL_CALL removeByName( const ::rtl::OUString& Name );
579 
580                         // XIndexAccess
581     virtual sal_Int32 SAL_CALL getCount();
582     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index );
583 
584                             // XEnumerationAccess
585     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
586                             createEnumeration();
587 
588                             // XElementAccess
589     virtual ::com::sun::star::uno::Type SAL_CALL getElementType();
590     virtual sal_Bool SAL_CALL hasElements();
591 
592                             // XServiceInfo
593     virtual ::rtl::OUString SAL_CALL getImplementationName();
594     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
595     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
596 
597     // implementation
598     ScFieldGroup&       getFieldGroup( const ::rtl::OUString& rName );
599     void                renameFieldGroup( const ::rtl::OUString& rOldName, const ::rtl::OUString& rNewName );
600 
601 private:
602     ScFieldGroups::iterator implFindByName( const ::rtl::OUString& rName );
603 
604 private:
605     ScFieldGroups       maGroups;
606 };
607 
608 // ============================================================================
609 
610 typedef ::cppu::WeakImplHelper5
611 <
612     ::com::sun::star::container::XNameContainer,
613     ::com::sun::star::container::XEnumerationAccess,
614     ::com::sun::star::container::XIndexAccess,
615     ::com::sun::star::container::XNamed,
616     ::com::sun::star::lang::XServiceInfo
617 >
618 ScDataPilotFieldGroupObjImpl;
619 
620 class ScDataPilotFieldGroupObj : public ScDataPilotFieldGroupObjImpl
621 {
622 public:
623     explicit            ScDataPilotFieldGroupObj( ScDataPilotFieldGroupsObj& rParent, const ::rtl::OUString& rGroupName );
624     virtual             ~ScDataPilotFieldGroupObj();
625 
626                             // XNameAccess
627     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName );
628     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames();
629     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName );
630 
631                                 // XNameReplace
632     virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName,
633                                 const ::com::sun::star::uno::Any& aElement );
634 
635                                 // XNameContainer
636     virtual void SAL_CALL insertByName( const ::rtl::OUString& aName,
637                                 const ::com::sun::star::uno::Any& aElement );
638     virtual void SAL_CALL removeByName( const ::rtl::OUString& Name );
639 
640                     // XIndexAccess
641     virtual sal_Int32 SAL_CALL getCount();
642     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index );
643 
644                             // XEnumerationAccess
645     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
646                             createEnumeration();
647 
648                             // XElementAccess
649     virtual ::com::sun::star::uno::Type SAL_CALL getElementType();
650     virtual sal_Bool SAL_CALL hasElements();
651 
652                             // XNamed
653     virtual ::rtl::OUString SAL_CALL getName();
654     virtual void SAL_CALL   setName( const ::rtl::OUString& aName );
655 
656                             // XServiceInfo
657     virtual ::rtl::OUString SAL_CALL getImplementationName();
658     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
659     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
660 
661 private:
662     ScDataPilotFieldGroupsObj& mrParent;
663     ::rtl::OUString     maGroupName;
664 };
665 
666 // ============================================================================
667 
668 typedef ::cppu::WeakImplHelper2
669 <
670     ::com::sun::star::container::XNamed,
671     ::com::sun::star::lang::XServiceInfo
672 >
673 ScDataPilotFieldGroupItemObjImpl;
674 
675 class ScDataPilotFieldGroupItemObj : public ScDataPilotFieldGroupItemObjImpl
676 {
677 public:
678     explicit            ScDataPilotFieldGroupItemObj( ScDataPilotFieldGroupObj& rParent, const ::rtl::OUString& rName );
679     virtual             ~ScDataPilotFieldGroupItemObj();
680 
681                             // XNamed
682     virtual ::rtl::OUString SAL_CALL getName();
683     virtual void SAL_CALL   setName( const ::rtl::OUString& aName );
684 
685                             // XServiceInfo
686     virtual ::rtl::OUString SAL_CALL getImplementationName();
687     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
688     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
689 
690 private:
691     ScDataPilotFieldGroupObj& mrParent;
692     ::rtl::OUString     maName;
693 };
694 
695 // ============================================================================
696 
697 typedef ::cppu::WeakImplHelper4
698 <
699     ::com::sun::star::container::XEnumerationAccess,
700     ::com::sun::star::container::XIndexAccess,
701     ::com::sun::star::container::XNameAccess,
702     ::com::sun::star::lang::XServiceInfo
703 >
704 ScDataPilotItemsObjImpl;
705 
706 class ScDataPilotItemsObj : public ScDataPilotChildObjBase, public ScDataPilotItemsObjImpl
707 {
708 public:
709     explicit            ScDataPilotItemsObj( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId );
710     virtual             ~ScDataPilotItemsObj();
711 
712                             // XNameAccess
713     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName );
714     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames();
715     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName );
716 
717                             // XIndexAccess
718     virtual sal_Int32 SAL_CALL getCount();
719     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index );
720 
721                             // XEnumerationAccess
722     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
723                             createEnumeration();
724 
725                             // XElementAccess
726     virtual ::com::sun::star::uno::Type SAL_CALL getElementType();
727     virtual sal_Bool SAL_CALL hasElements();
728 
729                             // XServiceInfo
730     virtual ::rtl::OUString SAL_CALL getImplementationName();
731     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
732     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
733 
734 private:
735     ScDataPilotItemObj* GetObjectByIndex_Impl( sal_Int32 nIndex ) const;
736 };
737 
738 // ============================================================================
739 
740 typedef ::cppu::WeakImplHelper3
741 <
742     ::com::sun::star::container::XNamed,
743     ::com::sun::star::beans::XPropertySet,
744     ::com::sun::star::lang::XServiceInfo
745 >
746 ScDataPilotItemObjImpl;
747 
748 class ScDataPilotItemObj : public ScDataPilotChildObjBase, public ScDataPilotItemObjImpl
749 {
750 public:
751     explicit            ScDataPilotItemObj(
752                             ScDataPilotDescriptorBase& rParent,
753                             const ScFieldIdentifier& rFieldId,
754                             sal_Int32 nIndex );
755 
756     virtual             ~ScDataPilotItemObj();
757 
758                             // XNamed
759     virtual ::rtl::OUString SAL_CALL getName();
760     virtual void SAL_CALL   setName( const ::rtl::OUString& aName );
761 
762                             // XPropertySet
763     virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
764                             SAL_CALL getPropertySetInfo(  );
765     virtual void SAL_CALL   setPropertyValue( const ::rtl::OUString& aPropertyName,
766                                     const ::com::sun::star::uno::Any& aValue );
767     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(
768                                     const ::rtl::OUString& PropertyName );
769     virtual void SAL_CALL   addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
770                                     const ::com::sun::star::uno::Reference<
771                                         ::com::sun::star::beans::XPropertyChangeListener >& xListener );
772     virtual void SAL_CALL   removePropertyChangeListener( const ::rtl::OUString& aPropertyName,
773                                     const ::com::sun::star::uno::Reference<
774                                         ::com::sun::star::beans::XPropertyChangeListener >& aListener );
775     virtual void SAL_CALL   addVetoableChangeListener( const ::rtl::OUString& PropertyName,
776                                     const ::com::sun::star::uno::Reference<
777                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener );
778     virtual void SAL_CALL   removeVetoableChangeListener( const ::rtl::OUString& PropertyName,
779                                     const ::com::sun::star::uno::Reference<
780                                         ::com::sun::star::beans::XVetoableChangeListener >& aListener );
781 
782                             // XServiceInfo
783     virtual ::rtl::OUString SAL_CALL getImplementationName();
784     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
785     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
786 
787 private:
788     SfxItemPropertySet  maPropSet;
789     sal_Int32           mnIndex;
790 };
791 
792 // ============================================================================
793 
794 #endif
795