xref: /aoo41x/main/sc/inc/dpsave.hxx (revision cdf0e10c)
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_DPSAVE_HXX
29 #define SC_DPSAVE_HXX
30 
31 #include <tools/string.hxx>
32 #include <tools/list.hxx>
33 #include <com/sun/star/sheet/XDimensionsSupplier.hpp>
34 #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
35 #include "scdllapi.h"
36 #include <hash_map>
37 #include <list>
38 #include <memory>
39 
40 namespace com { namespace sun { namespace star { namespace sheet {
41     struct DataPilotFieldReference;
42     struct DataPilotFieldSortInfo;
43     struct DataPilotFieldAutoShowInfo;
44     struct DataPilotFieldLayoutInfo;
45 } } } }
46 
47 class ScDPDimensionSaveData;
48 class ScDPTableData;
49 class ScDPObject;
50 
51 // --------------------------------------------------------------------
52 //
53 //	classes to save Data Pilot settings
54 //
55 
56 
57 class ScDPSaveMember
58 {
59 private:
60 	String		aName;
61     ::std::auto_ptr<rtl::OUString> mpLayoutName; // custom name to be displayed in the table.
62 	sal_uInt16		nVisibleMode;
63 	sal_uInt16		nShowDetailsMode;
64 
65 public:
66 							ScDPSaveMember(const String& rName);
67 							ScDPSaveMember(const ScDPSaveMember& r);
68 							~ScDPSaveMember();
69 
70 	sal_Bool		 			operator== ( const ScDPSaveMember& r ) const;
71 
72     const String&           GetName() const { return aName; }
73     SC_DLLPUBLIC sal_Bool   HasIsVisible() const;
74     SC_DLLPUBLIC void		SetIsVisible(sal_Bool bSet);
75     sal_Bool                GetIsVisible() const { return sal_Bool(nVisibleMode); }
76     SC_DLLPUBLIC sal_Bool   HasShowDetails() const;
77     SC_DLLPUBLIC void		SetShowDetails(sal_Bool bSet);
78     sal_Bool                GetShowDetails() const { return sal_Bool(nShowDetailsMode); }
79 
80     void                    SetName( const String& rNew );  // used if the source member was renamed (groups)
81 
82     SC_DLLPUBLIC void       SetLayoutName( const ::rtl::OUString& rName );
83     SC_DLLPUBLIC const ::rtl::OUString*  GetLayoutName() const;
84     void                    RemoveLayoutName();
85 
86 	void					WriteToSource( const com::sun::star::uno::Reference<
87                                             com::sun::star::uno::XInterface>& xMember,
88                                             sal_Int32 nPosition );
89 };
90 
91 
92 bool operator == (const ::com::sun::star::sheet::DataPilotFieldSortInfo &l, const ::com::sun::star::sheet::DataPilotFieldSortInfo &r );
93 bool operator == (const ::com::sun::star::sheet::DataPilotFieldAutoShowInfo &l, const ::com::sun::star::sheet::DataPilotFieldAutoShowInfo &r );
94 bool operator == (const ::com::sun::star::sheet::DataPilotFieldReference &l, const ::com::sun::star::sheet::DataPilotFieldReference &r );
95 class SC_DLLPUBLIC ScDPSaveDimension
96 {
97 private:
98 	String		aName;
99 	String*		pSelectedPage;
100     ::std::auto_ptr<rtl::OUString> mpLayoutName;
101     ::std::auto_ptr<rtl::OUString> mpSubtotalName;
102 	sal_Bool		bIsDataLayout;
103 	sal_Bool		bDupFlag;
104 	sal_uInt16		nOrientation;
105 	sal_uInt16		nFunction;			// enum GeneralFunction, for data dimensions
106 	long		nUsedHierarchy;
107 	sal_uInt16		nShowEmptyMode;		//!	at level
108 	sal_Bool		bSubTotalDefault;	//!	at level
109 	long		nSubTotalCount;
110 	sal_uInt16*		pSubTotalFuncs;		// enum GeneralFunction
111 	::com::sun::star::sheet::DataPilotFieldReference* pReferenceValue;
112     ::com::sun::star::sheet::DataPilotFieldSortInfo*  pSortInfo;            // (level)
113     ::com::sun::star::sheet::DataPilotFieldAutoShowInfo* pAutoShowInfo;     // (level)
114     ::com::sun::star::sheet::DataPilotFieldLayoutInfo* pLayoutInfo;         // (level)
115 
116 public:
117     typedef	std::hash_map <String, ScDPSaveMember*, rtl::OUStringHash> MemberHash;
118     typedef	std::list <ScDPSaveMember*>                                MemberList;
119 private:
120     MemberHash maMemberHash;
121     MemberList maMemberList;
122 public:
123 							ScDPSaveDimension(const String& rName, sal_Bool bDataLayout);
124 							ScDPSaveDimension(const ScDPSaveDimension& r);
125 							~ScDPSaveDimension();
126 
127 	sal_Bool		 			operator== ( const ScDPSaveDimension& r ) const;
128 
129     const MemberList&       GetMembers() const { return maMemberList; }
130 	void					AddMember(ScDPSaveMember* pMember);
131 
132 	void					SetDupFlag(sal_Bool bSet)	{ bDupFlag = bSet; }
133 	sal_Bool					GetDupFlag() const		{ return bDupFlag; }
134 
135 	const String&			GetName() const			{ return aName; }
136 	sal_Bool					IsDataLayout() const	{ return bIsDataLayout; }
137 
138     void                    SetName( const String& rNew );  // used if the source dim was renamed (groups)
139 
140     void					SetOrientation(sal_uInt16 nNew);
141     void					SetSubTotals(long nCount, const sal_uInt16* pFuncs);
142     long                    GetSubTotalsCount() const { return nSubTotalCount; }
143     sal_uInt16                  GetSubTotalFunc(long nIndex) const { return pSubTotalFuncs[nIndex]; }
144     bool                    HasShowEmpty() const;
145     void					SetShowEmpty(sal_Bool bSet);
146     sal_Bool                    GetShowEmpty() const { return sal_Bool(nShowEmptyMode); }
147     void					SetFunction(sal_uInt16 nNew);		// enum GeneralFunction
148     sal_uInt16                  GetFunction() const { return nFunction; }
149 	void					SetUsedHierarchy(long nNew);
150     long                    GetUsedHierarchy() const { return nUsedHierarchy; }
151 
152     void                    SetLayoutName(const ::rtl::OUString& rName);
153     const ::rtl::OUString*  GetLayoutName() const;
154     void                    RemoveLayoutName();
155     void                    SetSubtotalName(const ::rtl::OUString& rName);
156     const ::rtl::OUString*  GetSubtotalName() const;
157 
158     bool                    IsMemberNameInUse(const ::rtl::OUString& rName) const;
159 
160 	const ::com::sun::star::sheet::DataPilotFieldReference* GetReferenceValue() const	{ return pReferenceValue; }
161     void					SetReferenceValue(const ::com::sun::star::sheet::DataPilotFieldReference* pNew);
162 
163     const ::com::sun::star::sheet::DataPilotFieldSortInfo* GetSortInfo() const          { return pSortInfo; }
164     void                    SetSortInfo(const ::com::sun::star::sheet::DataPilotFieldSortInfo* pNew);
165     const ::com::sun::star::sheet::DataPilotFieldAutoShowInfo* GetAutoShowInfo() const  { return pAutoShowInfo; }
166     void                    SetAutoShowInfo(const ::com::sun::star::sheet::DataPilotFieldAutoShowInfo* pNew);
167     const ::com::sun::star::sheet::DataPilotFieldLayoutInfo* GetLayoutInfo() const      { return pLayoutInfo; }
168     void                    SetLayoutInfo(const ::com::sun::star::sheet::DataPilotFieldLayoutInfo* pNew);
169 
170     void					SetCurrentPage( const String* pPage );		// NULL = no selection (all)
171     sal_Bool					HasCurrentPage() const;
172     const String&			GetCurrentPage() const;
173 
174 	sal_uInt16					GetOrientation() const	{ return nOrientation; }
175 
176 	ScDPSaveMember* 		GetExistingMemberByName(const String& rName);
177     ScDPSaveMember*			GetMemberByName(const String& rName);
178 
179     void                    SetMemberPosition( const String& rName, sal_Int32 nNewPos );
180 
181 	void					WriteToSource( const com::sun::star::uno::Reference<
182 											com::sun::star::uno::XInterface>& xDim );
183 	void					Refresh( const com::sun::star::uno::Reference<
184 									com::sun::star::sheet::XDimensionsSupplier>& xSource ,
185 									const	std::list<String> & deletedDims);
186 
187     void                    UpdateMemberVisibility(const ::std::hash_map< ::rtl::OUString, bool, ::rtl::OUStringHash>& rData);
188 
189     bool                    HasInvisibleMember() const;
190 };
191 
192 
193 class ScDPSaveData
194 {
195 private:
196 	List		aDimList;
197     ScDPDimensionSaveData* pDimensionData;      // settings that create new dimensions
198 	sal_uInt16		nColumnGrandMode;
199 	sal_uInt16		nRowGrandMode;
200 	sal_uInt16		nIgnoreEmptyMode;
201 	sal_uInt16		nRepeatEmptyMode;
202     sal_Bool        bFilterButton;      // not passed to DataPilotSource
203     sal_Bool        bDrillDown;         // not passed to DataPilotSource
204     // Wang Xu Ming -- 2009-8-17
205     // DataPilot Migration - Cache&&Performance
206     long      mnCacheId;
207     // End Comments
208 
209     /** if true, all dimensions already have all of their member instances
210      *  created. */
211     bool        mbDimensionMembersBuilt;
212 
213     ::std::auto_ptr<rtl::OUString> mpGrandTotalName;
214 
215 public:
216     SC_DLLPUBLIC						ScDPSaveData();
217 							ScDPSaveData(const ScDPSaveData& r);
218     SC_DLLPUBLIC						~ScDPSaveData();
219 
220 	ScDPSaveData& 			operator= ( const ScDPSaveData& r );
221 
222 	sal_Bool		 			operator== ( const ScDPSaveData& r ) const;
223 
224     SC_DLLPUBLIC void                    SetGrandTotalName(const ::rtl::OUString& rName);
225     SC_DLLPUBLIC const ::rtl::OUString*  GetGrandTotalName() const;
226 
227 	const List&				GetDimensions() const { return aDimList; }
228 	void					AddDimension(ScDPSaveDimension* pDim) { aDimList.Insert(pDim, LIST_APPEND); }
229 
230 	ScDPSaveDimension*		GetDimensionByName(const String& rName);
231     SC_DLLPUBLIC ScDPSaveDimension*		GetDataLayoutDimension();
232     SC_DLLPUBLIC ScDPSaveDimension*      GetExistingDataLayoutDimension() const;
233 
234 	ScDPSaveDimension*		DuplicateDimension(const String& rName);
235     SC_DLLPUBLIC ScDPSaveDimension&      DuplicateDimension(const ScDPSaveDimension& rDim);
236 
237     SC_DLLPUBLIC ScDPSaveDimension*		GetExistingDimensionByName(const String& rName) const;
238     SC_DLLPUBLIC ScDPSaveDimension*		GetNewDimensionByName(const String& rName);
239 
240     void                    RemoveDimensionByName(const String& rName);
241 
242     ScDPSaveDimension*      GetInnermostDimension(sal_uInt16 nOrientation);
243     ScDPSaveDimension*      GetFirstDimension(::com::sun::star::sheet::DataPilotFieldOrientation eOrientation);
244     long                    GetDataDimensionCount() const;
245 
246 
247 	void					SetPosition( ScDPSaveDimension* pDim, long nNew );
248     SC_DLLPUBLIC void					SetColumnGrand( sal_Bool bSet );
249 	sal_Bool					GetColumnGrand() const { return sal_Bool(nColumnGrandMode); }
250     SC_DLLPUBLIC void					SetRowGrand( sal_Bool bSet );
251 	sal_Bool					GetRowGrand() const { return sal_Bool(nRowGrandMode); }
252 	void					SetIgnoreEmptyRows( sal_Bool bSet );
253 	sal_Bool					GetIgnoreEmptyRows() const { return sal_Bool(nIgnoreEmptyMode); }
254 	void					SetRepeatIfEmpty( sal_Bool bSet );
255 	sal_Bool					GetRepeatIfEmpty() const { return sal_Bool(nRepeatEmptyMode); }
256 
257     SC_DLLPUBLIC void                    SetFilterButton( sal_Bool bSet );
258     sal_Bool                    GetFilterButton() const { return bFilterButton; }
259     SC_DLLPUBLIC void                    SetDrillDown( sal_Bool bSet );
260     sal_Bool                    GetDrillDown() const { return bDrillDown; }
261 
262 	void					WriteToSource( const com::sun::star::uno::Reference<
263 		com::sun::star::sheet::XDimensionsSupplier>& xSource );
264     // Wang Xu Ming -- 2009-8-17
265     // DataPilot Migration - Cache&&Performance
266 	void					Refresh( const com::sun::star::uno::Reference<
267 											com::sun::star::sheet::XDimensionsSupplier>& xSource );
268 	sal_Bool					IsEmpty() const;
269     inline long GetCacheId() const{ return mnCacheId; }
270     inline void SetCacheId( long nCacheId ){ mnCacheId = nCacheId; }
271     // End Comments
272     const ScDPDimensionSaveData* GetExistingDimensionData() const   { return pDimensionData; }
273     SC_DLLPUBLIC ScDPDimensionSaveData*  GetDimensionData();     // create if not there
274     void                    SetDimensionData( const ScDPDimensionSaveData* pNew );      // copied
275     void                    BuildAllDimensionMembers(ScDPTableData* pData);
276     void                    BuildAllDimensionMembersFromSource(ScDPObject* pDPObj);
277 
278     /**
279      * Check whether a dimension has one or more invisible members.
280      *
281      * @param rDimName dimension name
282      */
283     SC_DLLPUBLIC bool       HasInvisibleMember(const ::rtl::OUString& rDimName) const;
284 };
285 
286 
287 #endif
288 
289