xref: /aoo41x/main/sc/source/ui/unoobj/dapiuno.cxx (revision b3f79822)
1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b3f79822SAndrew Rist  * distributed with this work for additional information
6*b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*b3f79822SAndrew Rist  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*b3f79822SAndrew Rist  *
13*b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b3f79822SAndrew Rist  * specific language governing permissions and limitations
18*b3f79822SAndrew Rist  * under the License.
19*b3f79822SAndrew Rist  *
20*b3f79822SAndrew Rist  *************************************************************/
21*b3f79822SAndrew Rist 
22*b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <algorithm>
28cdf0e10cSrcweir #include <svl/smplhint.hxx>
29cdf0e10cSrcweir #include <rtl/uuid.h>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include "dapiuno.hxx"
32cdf0e10cSrcweir #include "datauno.hxx"
33cdf0e10cSrcweir #include "miscuno.hxx"
34cdf0e10cSrcweir #include "convuno.hxx"
35cdf0e10cSrcweir #include "docsh.hxx"
36cdf0e10cSrcweir #include "tabvwsh.hxx"
37cdf0e10cSrcweir #include "pivot.hxx"
38cdf0e10cSrcweir #include "rangeutl.hxx"
39cdf0e10cSrcweir #include "unoguard.hxx"
40cdf0e10cSrcweir #include "dpobject.hxx"
41cdf0e10cSrcweir #include "dpshttab.hxx"
42cdf0e10cSrcweir #include "dpsdbtab.hxx"
43cdf0e10cSrcweir #include "dpsave.hxx"
44cdf0e10cSrcweir #include "dbdocfun.hxx"
45cdf0e10cSrcweir #include "unonames.hxx"
46cdf0e10cSrcweir #include "dpgroup.hxx"
47cdf0e10cSrcweir #include "dpdimsave.hxx"
48cdf0e10cSrcweir #include "hints.hxx"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #include <com/sun/star/sheet/XHierarchiesSupplier.hpp>
51cdf0e10cSrcweir #include <com/sun/star/sheet/XLevelsSupplier.hpp>
52cdf0e10cSrcweir #include <com/sun/star/sheet/XMembersSupplier.hpp>
53cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
54cdf0e10cSrcweir #include <com/sun/star/sheet/DataImportMode.hpp>
55cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
56cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
57cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotOutputRangeType.hpp>
58cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotTablePositionData.hpp>
59cdf0e10cSrcweir 
60cdf0e10cSrcweir #include <comphelper/extract.hxx>
61cdf0e10cSrcweir #include <comphelper/sequence.hxx>
62cdf0e10cSrcweir 
63cdf0e10cSrcweir using namespace com::sun::star;
64cdf0e10cSrcweir using namespace com::sun::star::sheet;
65cdf0e10cSrcweir 
66cdf0e10cSrcweir using ::rtl::OUString;
67cdf0e10cSrcweir 
68cdf0e10cSrcweir using ::com::sun::star::uno::Any;
69cdf0e10cSrcweir using ::com::sun::star::uno::Exception;
70cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
71cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException;
72cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
73cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY;
74cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW;
75cdf0e10cSrcweir 
76cdf0e10cSrcweir using ::com::sun::star::container::ElementExistException;
77cdf0e10cSrcweir using ::com::sun::star::container::NoSuchElementException;
78cdf0e10cSrcweir using ::com::sun::star::container::XEnumeration;
79cdf0e10cSrcweir using ::com::sun::star::container::XIndexAccess;
80cdf0e10cSrcweir using ::com::sun::star::container::XNameAccess;
81cdf0e10cSrcweir using ::com::sun::star::container::XNamed;
82cdf0e10cSrcweir 
83cdf0e10cSrcweir using ::com::sun::star::beans::PropertyVetoException;
84cdf0e10cSrcweir using ::com::sun::star::beans::UnknownPropertyException;
85cdf0e10cSrcweir using ::com::sun::star::beans::XPropertyChangeListener;
86cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet;
87cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySetInfo;
88cdf0e10cSrcweir using ::com::sun::star::beans::XVetoableChangeListener;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir using ::com::sun::star::lang::IllegalArgumentException;
91cdf0e10cSrcweir using ::com::sun::star::lang::IndexOutOfBoundsException;
92cdf0e10cSrcweir using ::com::sun::star::lang::WrappedTargetException;
93cdf0e10cSrcweir 
94cdf0e10cSrcweir using ::com::sun::star::table::CellAddress;
95cdf0e10cSrcweir using ::com::sun::star::table::CellRangeAddress;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir // ============================================================================
98cdf0e10cSrcweir 
99cdf0e10cSrcweir namespace {
100cdf0e10cSrcweir 
lcl_GetDataPilotDescriptorBaseMap()101cdf0e10cSrcweir const SfxItemPropertyMapEntry* lcl_GetDataPilotDescriptorBaseMap()
102cdf0e10cSrcweir {
103cdf0e10cSrcweir     static SfxItemPropertyMapEntry aDataPilotDescriptorBaseMap_Impl[] =
104cdf0e10cSrcweir 	{
105cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_COLGRAND),     0,  &getBooleanCppuType(),  0, 0 },
106cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_DRILLDOWN),    0,  &getBooleanCppuType(),  0, 0 },
107cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_GRANDTOTAL_NAME),0,&getCppuType((rtl::OUString*)0), beans::PropertyAttribute::MAYBEVOID, 0 },
108cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_IGNEMPROWS),   0,  &getBooleanCppuType(),  0, 0 },
109cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_IMPORTDESC),   0,  &getCppuType((uno::Sequence<beans::PropertyValue>*)0), 0, 0 },
110cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_RPTEMPTY),     0,  &getBooleanCppuType(),  0, 0 },
111cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_ROWGRAND),     0,  &getBooleanCppuType(),  0, 0 },
112cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_SERVICEARG),   0,  &getCppuType((uno::Sequence<beans::PropertyValue>*)0), 0, 0 },
113cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_SHOWFILT),     0,  &getBooleanCppuType(),  0, 0 },
114cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_SOURCESERV),   0,  &getCppuType((rtl::OUString*)0), 0, 0 },
115cdf0e10cSrcweir         {0,0,0,0,0,0}
116cdf0e10cSrcweir 	};
117cdf0e10cSrcweir 	return aDataPilotDescriptorBaseMap_Impl;
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
120cdf0e10cSrcweir // ----------------------------------------------------------------------------
121cdf0e10cSrcweir 
lcl_GetDataPilotFieldMap()122cdf0e10cSrcweir const SfxItemPropertyMapEntry* lcl_GetDataPilotFieldMap()
123cdf0e10cSrcweir {
124cdf0e10cSrcweir     using namespace ::com::sun::star::beans::PropertyAttribute;
125cdf0e10cSrcweir     static SfxItemPropertyMapEntry aDataPilotFieldMap_Impl[] =
126cdf0e10cSrcweir 	{
127cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_AUTOSHOW),     0,  &getCppuType((DataPilotFieldAutoShowInfo*)0),   MAYBEVOID, 0 },
128cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_FUNCTION),     0,  &getCppuType((GeneralFunction*)0),              0, 0 },
129cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_GROUPINFO),    0,  &getCppuType((DataPilotFieldGroupInfo*)0),      MAYBEVOID, 0 },
130cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_HASAUTOSHOW),  0,  &getBooleanCppuType(),                          0, 0 },
131cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_HASLAYOUTINFO),0,  &getBooleanCppuType(),                          0, 0 },
132cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_HASREFERENCE), 0,  &getBooleanCppuType(),                          0, 0 },
133cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_HASSORTINFO),  0,  &getBooleanCppuType(),                          0, 0 },
134cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ISGROUP),      0,  &getBooleanCppuType(),                          0, 0 },
135cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_LAYOUTINFO),   0,  &getCppuType((DataPilotFieldLayoutInfo*)0),     MAYBEVOID, 0 },
136cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ORIENT),       0,  &getCppuType((DataPilotFieldOrientation*)0),    MAYBEVOID, 0 },
137cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_REFERENCE),    0,  &getCppuType((DataPilotFieldReference*)0),      MAYBEVOID, 0 },
138cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SELPAGE),      0,  &getCppuType((OUString*)0),                     0, 0 },
139cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHOWEMPTY),    0,  &getBooleanCppuType(),                          0, 0 },
140cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SORTINFO),     0,  &getCppuType((DataPilotFieldSortInfo*)0),       MAYBEVOID, 0 },
141cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SUBTOTALS),    0,  &getCppuType((Sequence<GeneralFunction>*)0),    0, 0 },
142cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USESELPAGE),   0,  &getBooleanCppuType(),                          0, 0 },
143cdf0e10cSrcweir         {0,0,0,0,0,0}
144cdf0e10cSrcweir 	};
145cdf0e10cSrcweir 	return aDataPilotFieldMap_Impl;
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir // ----------------------------------------------------------------------------
149cdf0e10cSrcweir 
lcl_GetDataPilotItemMap()150cdf0e10cSrcweir const SfxItemPropertyMapEntry* lcl_GetDataPilotItemMap()
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     static SfxItemPropertyMapEntry aDataPilotItemMap_Impl[] =
153cdf0e10cSrcweir 	{
154cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ISHIDDEN),     0,  &getBooleanCppuType(),          0, 0 },
155cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_POS),          0,  &getCppuType((sal_Int32*)0),    0, 0 },
156cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHOWDETAIL),   0,  &getBooleanCppuType(),          0, 0 },
157cdf0e10cSrcweir         {0,0,0,0,0,0}
158cdf0e10cSrcweir 	};
159cdf0e10cSrcweir 	return aDataPilotItemMap_Impl;
160cdf0e10cSrcweir }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir // ----------------------------------------------------------------------------
163cdf0e10cSrcweir 
lclCheckValidDouble(double fValue,sal_Bool bAuto)164cdf0e10cSrcweir inline bool lclCheckValidDouble( double fValue, sal_Bool bAuto )
165cdf0e10cSrcweir {
166cdf0e10cSrcweir     return bAuto || ::rtl::math::isFinite( fValue );
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
lclCheckMinMaxStep(const DataPilotFieldGroupInfo & rInfo)169cdf0e10cSrcweir bool lclCheckMinMaxStep( const DataPilotFieldGroupInfo& rInfo )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir     return
172cdf0e10cSrcweir         lclCheckValidDouble( rInfo.Start, rInfo.HasAutoStart ) &&
173cdf0e10cSrcweir         lclCheckValidDouble( rInfo.End, rInfo.HasAutoEnd ) &&
174cdf0e10cSrcweir         (rInfo.HasAutoStart || rInfo.HasAutoEnd || (rInfo.Start <= rInfo.End)) &&
175cdf0e10cSrcweir         lclCheckValidDouble( rInfo.Step, sal_False ) &&
176cdf0e10cSrcweir         (0.0 <= rInfo.Step);
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
179cdf0e10cSrcweir } // namespace
180cdf0e10cSrcweir 
181cdf0e10cSrcweir // ============================================================================
182cdf0e10cSrcweir 
183cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotDescriptor, "ScDataPilotDescriptor", "stardiv::one::sheet::DataPilotDescriptor" )
184cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldObj, "ScDataPilotFieldObj", "com.sun.star.sheet.DataPilotField" )
185cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldsObj, "ScDataPilotFieldsObj", "com.sun.star.sheet.DataPilotFields" )
186cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotTableObj, "ScDataPilotTableObj", "com.sun.star.sheet.DataPilotTable" )
187cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotTablesObj, "ScDataPilotTablesObj", "com.sun.star.sheet.DataPilotTables" )
188cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotItemsObj, "ScDataPilotItemsObj", "com.sun.star.sheet.DataPilotItems" )
189cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotItemObj, "ScDataPilotItemObj", "com.sun.star.sheet.DataPilotItem" )
190cdf0e10cSrcweir 
191cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldGroupsObj, "ScDataPilotFieldGroupsObj", "com.sun.star.sheet.DataPilotFieldGroups" )
192cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldGroupObj, "ScDataPilotFieldGroupObj", "com.sun.star.sheet.DataPilotFieldGroup" )
193cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldGroupItemObj, "ScDataPilotFieldGroupItemObj", "com.sun.star.sheet.DataPilotFieldGroupItem" )
194cdf0e10cSrcweir 
195cdf0e10cSrcweir //------------------------------------------------------------------------
196cdf0e10cSrcweir 
197cdf0e10cSrcweir // name that is used in the API for the data layout field
198cdf0e10cSrcweir #define SC_DATALAYOUT_NAME  "Data"
199cdf0e10cSrcweir 
200cdf0e10cSrcweir //------------------------------------------------------------------------
201cdf0e10cSrcweir 
FirstFunc(sal_uInt16 nBits)202cdf0e10cSrcweir GeneralFunction ScDataPilotConversion::FirstFunc( sal_uInt16 nBits )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_SUM )       return GeneralFunction_SUM;
205cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_COUNT )     return GeneralFunction_COUNT;
206cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_AVERAGE )   return GeneralFunction_AVERAGE;
207cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_MAX )       return GeneralFunction_MAX;
208cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_MIN )       return GeneralFunction_MIN;
209cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_PRODUCT )   return GeneralFunction_PRODUCT;
210cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_COUNT_NUM ) return GeneralFunction_COUNTNUMS;
211cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_STD_DEV )   return GeneralFunction_STDEV;
212cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_STD_DEVP )  return GeneralFunction_STDEVP;
213cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_STD_VAR )   return GeneralFunction_VAR;
214cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_STD_VARP )  return GeneralFunction_VARP;
215cdf0e10cSrcweir     if ( nBits & PIVOT_FUNC_AUTO )      return GeneralFunction_AUTO;
216cdf0e10cSrcweir     return GeneralFunction_NONE;
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
FunctionBit(GeneralFunction eFunc)219cdf0e10cSrcweir sal_uInt16 ScDataPilotConversion::FunctionBit( GeneralFunction eFunc )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir 	sal_uInt16 nRet = PIVOT_FUNC_NONE;	// 0
222cdf0e10cSrcweir 	switch (eFunc)
223cdf0e10cSrcweir 	{
224cdf0e10cSrcweir         case GeneralFunction_SUM:       nRet = PIVOT_FUNC_SUM;       break;
225cdf0e10cSrcweir         case GeneralFunction_COUNT:     nRet = PIVOT_FUNC_COUNT;     break;
226cdf0e10cSrcweir         case GeneralFunction_AVERAGE:   nRet = PIVOT_FUNC_AVERAGE;   break;
227cdf0e10cSrcweir         case GeneralFunction_MAX:       nRet = PIVOT_FUNC_MAX;       break;
228cdf0e10cSrcweir         case GeneralFunction_MIN:       nRet = PIVOT_FUNC_MIN;       break;
229cdf0e10cSrcweir         case GeneralFunction_PRODUCT:   nRet = PIVOT_FUNC_PRODUCT;   break;
230cdf0e10cSrcweir         case GeneralFunction_COUNTNUMS: nRet = PIVOT_FUNC_COUNT_NUM; break;
231cdf0e10cSrcweir         case GeneralFunction_STDEV:     nRet = PIVOT_FUNC_STD_DEV;   break;
232cdf0e10cSrcweir         case GeneralFunction_STDEVP:    nRet = PIVOT_FUNC_STD_DEVP;  break;
233cdf0e10cSrcweir         case GeneralFunction_VAR:       nRet = PIVOT_FUNC_STD_VAR;   break;
234cdf0e10cSrcweir         case GeneralFunction_VARP:      nRet = PIVOT_FUNC_STD_VARP;  break;
235cdf0e10cSrcweir         case GeneralFunction_AUTO:      nRet = PIVOT_FUNC_AUTO;      break;
236cdf0e10cSrcweir         default:
237cdf0e10cSrcweir         {
238cdf0e10cSrcweir             // added to avoid warnings
239cdf0e10cSrcweir         }
240cdf0e10cSrcweir 	}
241cdf0e10cSrcweir 	return nRet;
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
FillGroupInfo(DataPilotFieldGroupInfo & rInfo,const ScDPNumGroupInfo & rGroupInfo)244cdf0e10cSrcweir void ScDataPilotConversion::FillGroupInfo( DataPilotFieldGroupInfo& rInfo, const ScDPNumGroupInfo& rGroupInfo )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir     rInfo.HasDateValues = rGroupInfo.DateValues;
247cdf0e10cSrcweir     rInfo.HasAutoStart  = rGroupInfo.AutoStart;
248cdf0e10cSrcweir     rInfo.Start         = rGroupInfo.Start;
249cdf0e10cSrcweir     rInfo.HasAutoEnd    = rGroupInfo.AutoEnd;
250cdf0e10cSrcweir     rInfo.End           = rGroupInfo.End;
251cdf0e10cSrcweir     rInfo.Step          = rGroupInfo.Step;
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir //------------------------------------------------------------------------
255cdf0e10cSrcweir 
lcl_GetDPObject(ScDocShell * pDocShell,SCTAB nTab,const String & rName)256cdf0e10cSrcweir ScDPObject* lcl_GetDPObject( ScDocShell* pDocShell, SCTAB nTab, const String& rName )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir 	if (pDocShell)
259cdf0e10cSrcweir 	{
260cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
261cdf0e10cSrcweir 		ScDPCollection* pColl = pDoc->GetDPCollection();
262cdf0e10cSrcweir 		if ( pColl )
263cdf0e10cSrcweir 		{
264cdf0e10cSrcweir 			sal_uInt16 nCount = pColl->GetCount();
265cdf0e10cSrcweir 			for (sal_uInt16 i=0; i<nCount; i++)
266cdf0e10cSrcweir 			{
267cdf0e10cSrcweir 				ScDPObject* pDPObj = (*pColl)[i];
268cdf0e10cSrcweir                 if ( pDPObj->GetOutRange().aStart.Tab() == nTab &&
269cdf0e10cSrcweir 					 pDPObj->GetName() == rName )
270cdf0e10cSrcweir 					return pDPObj;
271cdf0e10cSrcweir 			}
272cdf0e10cSrcweir 		}
273cdf0e10cSrcweir 	}
274cdf0e10cSrcweir 	return NULL;	// nicht gefunden
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
lcl_CreatePivotName(ScDocShell * pDocShell)277cdf0e10cSrcweir String lcl_CreatePivotName( ScDocShell* pDocShell )
278cdf0e10cSrcweir {
279cdf0e10cSrcweir 	if (pDocShell)
280cdf0e10cSrcweir 	{
281cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
282cdf0e10cSrcweir 		ScDPCollection* pColl = pDoc->GetDPCollection();
283cdf0e10cSrcweir 		if ( pColl )
284cdf0e10cSrcweir 			return pColl->CreateNewName();
285cdf0e10cSrcweir 	}
286cdf0e10cSrcweir 	return String();					// sollte nicht vorkommen
287cdf0e10cSrcweir }
288cdf0e10cSrcweir 
lcl_GetObjectIndex(ScDPObject * pDPObj,const ScFieldIdentifier & rFieldId)289cdf0e10cSrcweir sal_Int32 lcl_GetObjectIndex( ScDPObject* pDPObj, const ScFieldIdentifier& rFieldId )
290cdf0e10cSrcweir {
291cdf0e10cSrcweir     // used for items - nRepeat in identifier can be ignored
292cdf0e10cSrcweir     if ( pDPObj )
293cdf0e10cSrcweir     {
294cdf0e10cSrcweir         sal_Int32 nCount = pDPObj->GetDimCount();
295cdf0e10cSrcweir         for ( sal_Int32 nDim = 0; nDim < nCount; ++nDim )
296cdf0e10cSrcweir         {
297cdf0e10cSrcweir             sal_Bool bIsDataLayout = sal_False;
298cdf0e10cSrcweir             OUString aDimName( pDPObj->GetDimName( nDim, bIsDataLayout ) );
299cdf0e10cSrcweir             if ( rFieldId.mbDataLayout ? bIsDataLayout : (aDimName == rFieldId.maFieldName) )
300cdf0e10cSrcweir                 return nDim;
301cdf0e10cSrcweir         }
302cdf0e10cSrcweir     }
303cdf0e10cSrcweir     return -1;  // none
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir //------------------------------------------------------------------------
307cdf0e10cSrcweir 
ScDataPilotTablesObj(ScDocShell * pDocSh,SCTAB nT)308cdf0e10cSrcweir ScDataPilotTablesObj::ScDataPilotTablesObj(ScDocShell* pDocSh, SCTAB nT) :
309cdf0e10cSrcweir 	pDocShell( pDocSh ),
310cdf0e10cSrcweir 	nTab( nT )
311cdf0e10cSrcweir {
312cdf0e10cSrcweir 	pDocShell->GetDocument()->AddUnoObject(*this);
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
~ScDataPilotTablesObj()315cdf0e10cSrcweir ScDataPilotTablesObj::~ScDataPilotTablesObj()
316cdf0e10cSrcweir {
317cdf0e10cSrcweir 	if (pDocShell)
318cdf0e10cSrcweir 		pDocShell->GetDocument()->RemoveUnoObject(*this);
319cdf0e10cSrcweir }
320cdf0e10cSrcweir 
Notify(SfxBroadcaster &,const SfxHint & rHint)321cdf0e10cSrcweir void ScDataPilotTablesObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir 	//!	Referenz-Update
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 	if ( rHint.ISA( SfxSimpleHint ) &&
326cdf0e10cSrcweir 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
327cdf0e10cSrcweir 	{
328cdf0e10cSrcweir 		pDocShell = NULL;		// ungueltig geworden
329cdf0e10cSrcweir 	}
330cdf0e10cSrcweir }
331cdf0e10cSrcweir 
332cdf0e10cSrcweir // XDataPilotTables
333cdf0e10cSrcweir 
GetObjectByIndex_Impl(sal_Int32 nIndex)334cdf0e10cSrcweir ScDataPilotTableObj* ScDataPilotTablesObj::GetObjectByIndex_Impl( sal_Int32 nIndex )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir 	if (pDocShell)
337cdf0e10cSrcweir 	{
338cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
339cdf0e10cSrcweir 		ScDPCollection* pColl = pDoc->GetDPCollection();
340cdf0e10cSrcweir 		if ( pColl )
341cdf0e10cSrcweir 		{
342cdf0e10cSrcweir 			//	count tables on this sheet
343cdf0e10cSrcweir             sal_Int32 nFound = 0;
344cdf0e10cSrcweir 			sal_uInt16 nCount = pColl->GetCount();
345cdf0e10cSrcweir 			for (sal_uInt16 i=0; i<nCount; i++)
346cdf0e10cSrcweir 			{
347cdf0e10cSrcweir 				ScDPObject* pDPObj = (*pColl)[i];
348cdf0e10cSrcweir                 if ( pDPObj->GetOutRange().aStart.Tab() == nTab )
349cdf0e10cSrcweir 				{
350cdf0e10cSrcweir 					if ( nFound == nIndex )
351cdf0e10cSrcweir 					{
352cdf0e10cSrcweir 						String aName = pDPObj->GetName();
353cdf0e10cSrcweir 						return new ScDataPilotTableObj( pDocShell, nTab, aName );
354cdf0e10cSrcweir 					}
355cdf0e10cSrcweir 					++nFound;
356cdf0e10cSrcweir 				}
357cdf0e10cSrcweir 			}
358cdf0e10cSrcweir 		}
359cdf0e10cSrcweir 	}
360cdf0e10cSrcweir 	return NULL;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir 
GetObjectByName_Impl(const OUString & rName)363cdf0e10cSrcweir ScDataPilotTableObj* ScDataPilotTablesObj::GetObjectByName_Impl(const OUString& rName)
364cdf0e10cSrcweir {
365cdf0e10cSrcweir     if (hasByName(rName))
366cdf0e10cSrcweir         return new ScDataPilotTableObj( pDocShell, nTab, rName );
367cdf0e10cSrcweir     return 0;
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
createDataPilotDescriptor()370cdf0e10cSrcweir Reference<XDataPilotDescriptor> SAL_CALL ScDataPilotTablesObj::createDataPilotDescriptor()
371cdf0e10cSrcweir                                             throw(RuntimeException)
372cdf0e10cSrcweir {
373cdf0e10cSrcweir 	ScUnoGuard aGuard;
374cdf0e10cSrcweir 	if (pDocShell)
375cdf0e10cSrcweir 		return new ScDataPilotDescriptor(pDocShell);
376cdf0e10cSrcweir 	return NULL;
377cdf0e10cSrcweir }
378cdf0e10cSrcweir 
lcl_IsDuplicated(const Reference<XPropertySet> xDimProps)379cdf0e10cSrcweir bool lcl_IsDuplicated( const Reference<XPropertySet> xDimProps )
380cdf0e10cSrcweir {
381cdf0e10cSrcweir     try
382cdf0e10cSrcweir     {
383cdf0e10cSrcweir         Any aAny = xDimProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_ORIGINAL ) ) );
384cdf0e10cSrcweir         Reference< XNamed > xOriginal( aAny, UNO_QUERY );
385cdf0e10cSrcweir         return xOriginal.is();
386cdf0e10cSrcweir     }
387cdf0e10cSrcweir     catch( Exception& )
388cdf0e10cSrcweir     {
389cdf0e10cSrcweir     }
390cdf0e10cSrcweir     return false;
391cdf0e10cSrcweir }
392cdf0e10cSrcweir 
lcl_GetOriginalName(const Reference<XNamed> xDim)393cdf0e10cSrcweir OUString lcl_GetOriginalName( const Reference< XNamed > xDim )
394cdf0e10cSrcweir {
395cdf0e10cSrcweir     Reference< XNamed > xOriginal;
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     Reference< XPropertySet > xDimProps( xDim, UNO_QUERY );
398cdf0e10cSrcweir     if ( xDimProps.is() )
399cdf0e10cSrcweir     {
400cdf0e10cSrcweir         try
401cdf0e10cSrcweir         {
402cdf0e10cSrcweir             Any aAny = xDimProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ORIGINAL)));
403cdf0e10cSrcweir             aAny >>= xOriginal;
404cdf0e10cSrcweir         }
405cdf0e10cSrcweir         catch( Exception& )
406cdf0e10cSrcweir         {
407cdf0e10cSrcweir         }
408cdf0e10cSrcweir     }
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     if ( !xOriginal.is() )
411cdf0e10cSrcweir         xOriginal = xDim;
412cdf0e10cSrcweir 
413cdf0e10cSrcweir     return xOriginal->getName();
414cdf0e10cSrcweir }
415cdf0e10cSrcweir 
insertNewByName(const OUString & aNewName,const CellAddress & aOutputAddress,const Reference<XDataPilotDescriptor> & xDescriptor)416cdf0e10cSrcweir void SAL_CALL ScDataPilotTablesObj::insertNewByName( const OUString& aNewName,
417cdf0e10cSrcweir                                     const CellAddress& aOutputAddress,
418cdf0e10cSrcweir                                     const Reference<XDataPilotDescriptor>& xDescriptor )
419cdf0e10cSrcweir                                 throw(RuntimeException)
420cdf0e10cSrcweir {
421cdf0e10cSrcweir 	ScUnoGuard aGuard;
422cdf0e10cSrcweir 	if (!xDescriptor.is()) return;
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 	// inserting with already existing name?
425cdf0e10cSrcweir 	if ( aNewName.getLength() && hasByName( aNewName ) )
426cdf0e10cSrcweir         throw RuntimeException();       // no other exceptions specified
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 	sal_Bool bDone = sal_False;
429cdf0e10cSrcweir 	ScDataPilotDescriptorBase* pImp = ScDataPilotDescriptorBase::getImplementation( xDescriptor );
430cdf0e10cSrcweir 	if ( pDocShell && pImp )
431cdf0e10cSrcweir 	{
432cdf0e10cSrcweir         ScDPObject* pNewObj = pImp->GetDPObject();
433cdf0e10cSrcweir 
434cdf0e10cSrcweir         if (pNewObj)
435cdf0e10cSrcweir         {
436cdf0e10cSrcweir             ScRange aOutputRange((SCCOL)aOutputAddress.Column, (SCROW)aOutputAddress.Row, (SCTAB)aOutputAddress.Sheet,
437cdf0e10cSrcweir                                 (SCCOL)aOutputAddress.Column, (SCROW)aOutputAddress.Row, (SCTAB)aOutputAddress.Sheet);
438cdf0e10cSrcweir             pNewObj->SetOutRange(aOutputRange);
439cdf0e10cSrcweir 		    String aName = aNewName;
440cdf0e10cSrcweir 		    if (!aName.Len())
441cdf0e10cSrcweir 			    aName = lcl_CreatePivotName( pDocShell );
442cdf0e10cSrcweir             pNewObj->SetName(aName);
443cdf0e10cSrcweir 		    String aTag = xDescriptor->getTag();
444cdf0e10cSrcweir             pNewObj->SetTag(aTag);
445cdf0e10cSrcweir 
446cdf0e10cSrcweir     // todo: handle double fields (for more information see ScDPObject
447cdf0e10cSrcweir 
448cdf0e10cSrcweir             ScDBDocFunc aFunc(*pDocShell);
449cdf0e10cSrcweir 		    bDone = aFunc.DataPilotUpdate( NULL, pNewObj, sal_True, sal_True );
450cdf0e10cSrcweir         }
451cdf0e10cSrcweir 	}
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 	if (!bDone)
454cdf0e10cSrcweir         throw RuntimeException();       // no other exceptions specified
455cdf0e10cSrcweir }
456cdf0e10cSrcweir 
removeByName(const OUString & aName)457cdf0e10cSrcweir void SAL_CALL ScDataPilotTablesObj::removeByName( const OUString& aName )
458cdf0e10cSrcweir                                         throw(RuntimeException)
459cdf0e10cSrcweir {
460cdf0e10cSrcweir 	ScUnoGuard aGuard;
461cdf0e10cSrcweir 	String aNameStr(aName);
462cdf0e10cSrcweir 	ScDPObject* pDPObj = lcl_GetDPObject( pDocShell, nTab, aNameStr );
463cdf0e10cSrcweir 	if (pDPObj && pDocShell)
464cdf0e10cSrcweir 	{
465cdf0e10cSrcweir 		ScDBDocFunc aFunc(*pDocShell);
466cdf0e10cSrcweir 		aFunc.DataPilotUpdate( pDPObj, NULL, sal_True, sal_True );	// remove - incl. undo etc.
467cdf0e10cSrcweir 	}
468cdf0e10cSrcweir 	else
469cdf0e10cSrcweir         throw RuntimeException();       // no other exceptions specified
470cdf0e10cSrcweir }
471cdf0e10cSrcweir 
472cdf0e10cSrcweir // XEnumerationAccess
473cdf0e10cSrcweir 
createEnumeration()474cdf0e10cSrcweir Reference< XEnumeration > SAL_CALL ScDataPilotTablesObj::createEnumeration() throw(RuntimeException)
475cdf0e10cSrcweir {
476cdf0e10cSrcweir 	ScUnoGuard aGuard;
477cdf0e10cSrcweir     return new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DataPilotTablesEnumeration")));
478cdf0e10cSrcweir }
479cdf0e10cSrcweir 
480cdf0e10cSrcweir // XIndexAccess
481cdf0e10cSrcweir 
getCount()482cdf0e10cSrcweir sal_Int32 SAL_CALL ScDataPilotTablesObj::getCount() throw(RuntimeException)
483cdf0e10cSrcweir {
484cdf0e10cSrcweir 	ScUnoGuard aGuard;
485cdf0e10cSrcweir 	if ( pDocShell )
486cdf0e10cSrcweir 	{
487cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
488cdf0e10cSrcweir 		ScDPCollection* pColl = pDoc->GetDPCollection();
489cdf0e10cSrcweir 		if ( pColl )
490cdf0e10cSrcweir 		{
491cdf0e10cSrcweir 			//	count tables on this sheet
492cdf0e10cSrcweir 
493cdf0e10cSrcweir 			sal_uInt16 nFound = 0;
494cdf0e10cSrcweir 			sal_uInt16 nCount = pColl->GetCount();
495cdf0e10cSrcweir 			for (sal_uInt16 i=0; i<nCount; i++)
496cdf0e10cSrcweir 			{
497cdf0e10cSrcweir 				ScDPObject* pDPObj = (*pColl)[i];
498cdf0e10cSrcweir                 if ( pDPObj->GetOutRange().aStart.Tab() == nTab )
499cdf0e10cSrcweir 					++nFound;
500cdf0e10cSrcweir 			}
501cdf0e10cSrcweir 			return nFound;
502cdf0e10cSrcweir 		}
503cdf0e10cSrcweir 	}
504cdf0e10cSrcweir 
505cdf0e10cSrcweir 	return 0;
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
getByIndex(sal_Int32 nIndex)508cdf0e10cSrcweir Any SAL_CALL ScDataPilotTablesObj::getByIndex( sal_Int32 nIndex )
509cdf0e10cSrcweir         throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
510cdf0e10cSrcweir {
511cdf0e10cSrcweir 	ScUnoGuard aGuard;
512cdf0e10cSrcweir     Reference<XDataPilotTable2> xTable(GetObjectByIndex_Impl(nIndex));
513cdf0e10cSrcweir     if (!xTable.is())
514cdf0e10cSrcweir         throw IndexOutOfBoundsException();
515cdf0e10cSrcweir     return Any( xTable );
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
getElementType()518cdf0e10cSrcweir uno::Type SAL_CALL ScDataPilotTablesObj::getElementType() throw(RuntimeException)
519cdf0e10cSrcweir {
520cdf0e10cSrcweir 	ScUnoGuard aGuard;
521cdf0e10cSrcweir     return getCppuType((Reference<XDataPilotTable2>*)0);
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
hasElements()524cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotTablesObj::hasElements() throw(RuntimeException)
525cdf0e10cSrcweir {
526cdf0e10cSrcweir 	ScUnoGuard aGuard;
527cdf0e10cSrcweir 	return ( getCount() != 0 );
528cdf0e10cSrcweir }
529cdf0e10cSrcweir 
530cdf0e10cSrcweir // XNameAccess
531cdf0e10cSrcweir 
getByName(const OUString & aName)532cdf0e10cSrcweir Any SAL_CALL ScDataPilotTablesObj::getByName( const OUString& aName )
533cdf0e10cSrcweir         throw(NoSuchElementException, WrappedTargetException, RuntimeException)
534cdf0e10cSrcweir {
535cdf0e10cSrcweir 	ScUnoGuard aGuard;
536cdf0e10cSrcweir     Reference<XDataPilotTable2> xTable(GetObjectByName_Impl(aName));
537cdf0e10cSrcweir     if (!xTable.is())
538cdf0e10cSrcweir         throw NoSuchElementException();
539cdf0e10cSrcweir     return Any( xTable );
540cdf0e10cSrcweir }
541cdf0e10cSrcweir 
getElementNames()542cdf0e10cSrcweir Sequence<OUString> SAL_CALL ScDataPilotTablesObj::getElementNames()
543cdf0e10cSrcweir                                                 throw(RuntimeException)
544cdf0e10cSrcweir {
545cdf0e10cSrcweir 	ScUnoGuard aGuard;
546cdf0e10cSrcweir 	if (pDocShell)
547cdf0e10cSrcweir 	{
548cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
549cdf0e10cSrcweir 		ScDPCollection* pColl = pDoc->GetDPCollection();
550cdf0e10cSrcweir 		if ( pColl )
551cdf0e10cSrcweir 		{
552cdf0e10cSrcweir 			//	count tables on this sheet
553cdf0e10cSrcweir 
554cdf0e10cSrcweir 			sal_uInt16 nFound = 0;
555cdf0e10cSrcweir 			sal_uInt16 nCount = pColl->GetCount();
556cdf0e10cSrcweir 			sal_uInt16 i;
557cdf0e10cSrcweir 			for (i=0; i<nCount; i++)
558cdf0e10cSrcweir 			{
559cdf0e10cSrcweir 				ScDPObject* pDPObj = (*pColl)[i];
560cdf0e10cSrcweir                 if ( pDPObj->GetOutRange().aStart.Tab() == nTab )
561cdf0e10cSrcweir 					++nFound;
562cdf0e10cSrcweir 			}
563cdf0e10cSrcweir 
564cdf0e10cSrcweir 			sal_uInt16 nPos = 0;
565cdf0e10cSrcweir             Sequence<OUString> aSeq(nFound);
566cdf0e10cSrcweir             OUString* pAry = aSeq.getArray();
567cdf0e10cSrcweir 			for (i=0; i<nCount; i++)
568cdf0e10cSrcweir 			{
569cdf0e10cSrcweir 				ScDPObject* pDPObj = (*pColl)[i];
570cdf0e10cSrcweir                 if ( pDPObj->GetOutRange().aStart.Tab() == nTab )
571cdf0e10cSrcweir 					pAry[nPos++] = pDPObj->GetName();
572cdf0e10cSrcweir 			}
573cdf0e10cSrcweir 
574cdf0e10cSrcweir 			return aSeq;
575cdf0e10cSrcweir 		}
576cdf0e10cSrcweir 	}
577cdf0e10cSrcweir     return Sequence<OUString>(0);
578cdf0e10cSrcweir }
579cdf0e10cSrcweir 
hasByName(const OUString & aName)580cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotTablesObj::hasByName( const OUString& aName )
581cdf0e10cSrcweir                                         throw(RuntimeException)
582cdf0e10cSrcweir {
583cdf0e10cSrcweir 	ScUnoGuard aGuard;
584cdf0e10cSrcweir 	if (pDocShell)
585cdf0e10cSrcweir 	{
586cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
587cdf0e10cSrcweir 		ScDPCollection* pColl = pDoc->GetDPCollection();
588cdf0e10cSrcweir 		if ( pColl )
589cdf0e10cSrcweir 		{
590cdf0e10cSrcweir 			String aNamStr(aName);
591cdf0e10cSrcweir 			sal_uInt16 nCount = pColl->GetCount();
592cdf0e10cSrcweir 			for (sal_uInt16 i=0; i<nCount; i++)
593cdf0e10cSrcweir 			{
594cdf0e10cSrcweir 				ScDPObject* pDPObj = (*pColl)[i];
595cdf0e10cSrcweir                 if ( pDPObj->GetOutRange().aStart.Tab() == nTab &&
596cdf0e10cSrcweir 					 pDPObj->GetName() == aNamStr )
597cdf0e10cSrcweir 					return sal_True;
598cdf0e10cSrcweir 			}
599cdf0e10cSrcweir 		}
600cdf0e10cSrcweir 	}
601cdf0e10cSrcweir 	return sal_False;
602cdf0e10cSrcweir }
603cdf0e10cSrcweir 
604cdf0e10cSrcweir //------------------------------------------------------------------------
605cdf0e10cSrcweir 
ScDataPilotDescriptorBase(ScDocShell * pDocSh)606cdf0e10cSrcweir ScDataPilotDescriptorBase::ScDataPilotDescriptorBase(ScDocShell* pDocSh) :
607cdf0e10cSrcweir     maPropSet( lcl_GetDataPilotDescriptorBaseMap() ),
608cdf0e10cSrcweir 	pDocShell( pDocSh )
609cdf0e10cSrcweir {
610cdf0e10cSrcweir 	pDocShell->GetDocument()->AddUnoObject(*this);
611cdf0e10cSrcweir }
612cdf0e10cSrcweir 
~ScDataPilotDescriptorBase()613cdf0e10cSrcweir ScDataPilotDescriptorBase::~ScDataPilotDescriptorBase()
614cdf0e10cSrcweir {
615cdf0e10cSrcweir 	if (pDocShell)
616cdf0e10cSrcweir 		pDocShell->GetDocument()->RemoveUnoObject(*this);
617cdf0e10cSrcweir }
618cdf0e10cSrcweir 
queryInterface(const uno::Type & rType)619cdf0e10cSrcweir Any SAL_CALL ScDataPilotDescriptorBase::queryInterface( const uno::Type& rType )
620cdf0e10cSrcweir                                                 throw(RuntimeException)
621cdf0e10cSrcweir {
622cdf0e10cSrcweir     SC_QUERYINTERFACE( XDataPilotDescriptor )
623cdf0e10cSrcweir     SC_QUERYINTERFACE( XPropertySet )
624cdf0e10cSrcweir     SC_QUERYINTERFACE( XDataPilotDataLayoutFieldSupplier )
625cdf0e10cSrcweir     SC_QUERYINTERFACE( XNamed )                 // base of XDataPilotDescriptor
626cdf0e10cSrcweir 	SC_QUERYINTERFACE( lang::XUnoTunnel )
627cdf0e10cSrcweir 	SC_QUERYINTERFACE( lang::XTypeProvider )
628cdf0e10cSrcweir 	SC_QUERYINTERFACE( lang::XServiceInfo )
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 	return OWeakObject::queryInterface( rType );
631cdf0e10cSrcweir }
632cdf0e10cSrcweir 
acquire()633cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::acquire() throw()
634cdf0e10cSrcweir {
635cdf0e10cSrcweir 	OWeakObject::acquire();
636cdf0e10cSrcweir }
637cdf0e10cSrcweir 
release()638cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::release() throw()
639cdf0e10cSrcweir {
640cdf0e10cSrcweir 	OWeakObject::release();
641cdf0e10cSrcweir }
642cdf0e10cSrcweir 
getTypes()643cdf0e10cSrcweir Sequence< uno::Type > SAL_CALL ScDataPilotDescriptorBase::getTypes()
644cdf0e10cSrcweir                                                     throw(RuntimeException)
645cdf0e10cSrcweir {
646cdf0e10cSrcweir     static Sequence< uno::Type > aTypes;
647cdf0e10cSrcweir 	if ( aTypes.getLength() == 0 )
648cdf0e10cSrcweir 	{
649cdf0e10cSrcweir         aTypes.realloc( 6 );
650cdf0e10cSrcweir         uno::Type* pPtr = aTypes.getArray();
651cdf0e10cSrcweir         pPtr[ 0 ] = getCppuType( (const Reference< XDataPilotDescriptor >*)0 );
652cdf0e10cSrcweir         pPtr[ 1 ] = getCppuType( (const Reference< XPropertySet >*)0 );
653cdf0e10cSrcweir         pPtr[ 2 ] = getCppuType( (const Reference< XDataPilotDataLayoutFieldSupplier >*)0 );
654cdf0e10cSrcweir         pPtr[ 3 ] = getCppuType( (const Reference< lang::XUnoTunnel >*)0 );
655cdf0e10cSrcweir         pPtr[ 4 ] = getCppuType( (const Reference< lang::XTypeProvider >*)0 );
656cdf0e10cSrcweir         pPtr[ 5 ] = getCppuType( (const Reference< lang::XServiceInfo >*)0 );
657cdf0e10cSrcweir 	}
658cdf0e10cSrcweir 	return aTypes;
659cdf0e10cSrcweir }
660cdf0e10cSrcweir 
getImplementationId()661cdf0e10cSrcweir Sequence<sal_Int8> SAL_CALL ScDataPilotDescriptorBase::getImplementationId()
662cdf0e10cSrcweir                                                     throw(RuntimeException)
663cdf0e10cSrcweir {
664cdf0e10cSrcweir     static Sequence< sal_Int8 > aId;
665cdf0e10cSrcweir 	if( aId.getLength() == 0 )
666cdf0e10cSrcweir 	{
667cdf0e10cSrcweir 		aId.realloc( 16 );
668cdf0e10cSrcweir 		rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
669cdf0e10cSrcweir 	}
670cdf0e10cSrcweir 	return aId;
671cdf0e10cSrcweir }
672cdf0e10cSrcweir 
Notify(SfxBroadcaster &,const SfxHint & rHint)673cdf0e10cSrcweir void ScDataPilotDescriptorBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
674cdf0e10cSrcweir {
675cdf0e10cSrcweir 	//!	Referenz-Update?
676cdf0e10cSrcweir 
677cdf0e10cSrcweir 	if ( rHint.ISA( SfxSimpleHint ) &&
678cdf0e10cSrcweir 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
679cdf0e10cSrcweir 	{
680cdf0e10cSrcweir 		pDocShell = NULL;		// ungueltig geworden
681cdf0e10cSrcweir 	}
682cdf0e10cSrcweir }
683cdf0e10cSrcweir 
684cdf0e10cSrcweir // XDataPilotDescriptor
685cdf0e10cSrcweir 
getSourceRange()686cdf0e10cSrcweir CellRangeAddress SAL_CALL ScDataPilotDescriptorBase::getSourceRange()
687cdf0e10cSrcweir                                             throw(RuntimeException)
688cdf0e10cSrcweir {
689cdf0e10cSrcweir 	ScUnoGuard aGuard;
690cdf0e10cSrcweir 
691cdf0e10cSrcweir     ScDPObject* pDPObject(GetDPObject());
692cdf0e10cSrcweir     if (!pDPObject)
693cdf0e10cSrcweir         throw RuntimeException();
694cdf0e10cSrcweir 
695cdf0e10cSrcweir     CellRangeAddress aRet;
696cdf0e10cSrcweir     if (pDPObject->IsSheetData())
697cdf0e10cSrcweir         ScUnoConversion::FillApiRange( aRet, pDPObject->GetSheetDesc()->aSourceRange );
698cdf0e10cSrcweir     return aRet;
699cdf0e10cSrcweir }
700cdf0e10cSrcweir 
setSourceRange(const CellRangeAddress & aSourceRange)701cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::setSourceRange( const CellRangeAddress& aSourceRange ) throw(RuntimeException)
702cdf0e10cSrcweir {
703cdf0e10cSrcweir 	ScUnoGuard aGuard;
704cdf0e10cSrcweir 
705cdf0e10cSrcweir     ScDPObject* pDPObject = GetDPObject();
706cdf0e10cSrcweir     if (!pDPObject)
707cdf0e10cSrcweir         throw RuntimeException();
708cdf0e10cSrcweir 
709cdf0e10cSrcweir     ScSheetSourceDesc aSheetDesc;
710cdf0e10cSrcweir     if (pDPObject->IsSheetData())
711cdf0e10cSrcweir         aSheetDesc = *pDPObject->GetSheetDesc();
712cdf0e10cSrcweir     ScUnoConversion::FillScRange( aSheetDesc.aSourceRange, aSourceRange );
713cdf0e10cSrcweir     pDPObject->SetSheetDesc( aSheetDesc );
714cdf0e10cSrcweir     SetDPObject( pDPObject );
715cdf0e10cSrcweir }
716cdf0e10cSrcweir 
getFilterDescriptor()717cdf0e10cSrcweir Reference<XSheetFilterDescriptor> SAL_CALL ScDataPilotDescriptorBase::getFilterDescriptor()
718cdf0e10cSrcweir                                                 throw(RuntimeException)
719cdf0e10cSrcweir {
720cdf0e10cSrcweir 	ScUnoGuard aGuard;
721cdf0e10cSrcweir 	return new ScDataPilotFilterDescriptor( pDocShell, this );
722cdf0e10cSrcweir }
723cdf0e10cSrcweir 
getDataPilotFields()724cdf0e10cSrcweir Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getDataPilotFields()
725cdf0e10cSrcweir                                                 throw(RuntimeException)
726cdf0e10cSrcweir {
727cdf0e10cSrcweir 	ScUnoGuard aGuard;
728cdf0e10cSrcweir     return new ScDataPilotFieldsObj( *this );
729cdf0e10cSrcweir }
730cdf0e10cSrcweir 
getColumnFields()731cdf0e10cSrcweir Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getColumnFields()
732cdf0e10cSrcweir                                                 throw(RuntimeException)
733cdf0e10cSrcweir {
734cdf0e10cSrcweir 	ScUnoGuard aGuard;
735cdf0e10cSrcweir     return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_COLUMN );
736cdf0e10cSrcweir }
737cdf0e10cSrcweir 
getRowFields()738cdf0e10cSrcweir Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getRowFields()
739cdf0e10cSrcweir                                                 throw(RuntimeException)
740cdf0e10cSrcweir {
741cdf0e10cSrcweir 	ScUnoGuard aGuard;
742cdf0e10cSrcweir     return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_ROW );
743cdf0e10cSrcweir }
744cdf0e10cSrcweir 
getPageFields()745cdf0e10cSrcweir Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getPageFields()
746cdf0e10cSrcweir                                                 throw(RuntimeException)
747cdf0e10cSrcweir {
748cdf0e10cSrcweir 	ScUnoGuard aGuard;
749cdf0e10cSrcweir     return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_PAGE );
750cdf0e10cSrcweir }
751cdf0e10cSrcweir 
getDataFields()752cdf0e10cSrcweir Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getDataFields()
753cdf0e10cSrcweir                                                 throw(RuntimeException)
754cdf0e10cSrcweir {
755cdf0e10cSrcweir 	ScUnoGuard aGuard;
756cdf0e10cSrcweir     return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_DATA );
757cdf0e10cSrcweir }
758cdf0e10cSrcweir 
getHiddenFields()759cdf0e10cSrcweir Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getHiddenFields()
760cdf0e10cSrcweir                                                 throw(RuntimeException)
761cdf0e10cSrcweir {
762cdf0e10cSrcweir 	ScUnoGuard aGuard;
763cdf0e10cSrcweir     return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_HIDDEN );
764cdf0e10cSrcweir }
765cdf0e10cSrcweir 
766cdf0e10cSrcweir // XPropertySet
getPropertySetInfo()767cdf0e10cSrcweir Reference< XPropertySetInfo > SAL_CALL ScDataPilotDescriptorBase::getPropertySetInfo(  )
768cdf0e10cSrcweir                                                 throw(RuntimeException)
769cdf0e10cSrcweir {
770cdf0e10cSrcweir 	ScUnoGuard aGuard;
771cdf0e10cSrcweir     static Reference<XPropertySetInfo> aRef =
772cdf0e10cSrcweir         new SfxItemPropertySetInfo( maPropSet.getPropertyMap() );
773cdf0e10cSrcweir 	return aRef;
774cdf0e10cSrcweir }
775cdf0e10cSrcweir 
setPropertyValue(const OUString & aPropertyName,const Any & aValue)776cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
777cdf0e10cSrcweir         throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException,
778cdf0e10cSrcweir                 WrappedTargetException, RuntimeException)
779cdf0e10cSrcweir {
780cdf0e10cSrcweir 	ScUnoGuard aGuard;
781cdf0e10cSrcweir     ScDPObject* pDPObject = GetDPObject();
782cdf0e10cSrcweir     if (pDPObject)
783cdf0e10cSrcweir     {
784cdf0e10cSrcweir 	    ScDPSaveData* pOldData = pDPObject->GetSaveData();
785cdf0e10cSrcweir         DBG_ASSERT(pOldData, "Here should be a SaveData");
786cdf0e10cSrcweir 	    if ( pOldData )
787cdf0e10cSrcweir 	    {
788cdf0e10cSrcweir 		    ScDPSaveData aNewData( *pOldData );
789cdf0e10cSrcweir 
790cdf0e10cSrcweir     	    String aNameString = aPropertyName;
791cdf0e10cSrcweir     	    if ( aNameString.EqualsAscii( SC_UNO_COLGRAND ) )
792cdf0e10cSrcweir             {
793cdf0e10cSrcweir 	            aNewData.SetColumnGrand(::cppu::any2bool( aValue ));
794cdf0e10cSrcweir             }
795cdf0e10cSrcweir     	    else if ( aNameString.EqualsAscii( SC_UNO_IGNEMPROWS ) )
796cdf0e10cSrcweir             {
797cdf0e10cSrcweir                 aNewData.SetIgnoreEmptyRows(::cppu::any2bool( aValue ));
798cdf0e10cSrcweir             }
799cdf0e10cSrcweir     	    else if ( aNameString.EqualsAscii( SC_UNO_RPTEMPTY ) )
800cdf0e10cSrcweir             {
801cdf0e10cSrcweir     	        aNewData.SetRepeatIfEmpty(::cppu::any2bool( aValue ));
802cdf0e10cSrcweir             }
803cdf0e10cSrcweir     	    else if ( aNameString.EqualsAscii( SC_UNO_ROWGRAND ) )
804cdf0e10cSrcweir             {
805cdf0e10cSrcweir 	            aNewData.SetRowGrand(::cppu::any2bool( aValue ));
806cdf0e10cSrcweir             }
807cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_SHOWFILT ) )
808cdf0e10cSrcweir             {
809cdf0e10cSrcweir                 aNewData.SetFilterButton(::cppu::any2bool( aValue ));
810cdf0e10cSrcweir             }
811cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_DRILLDOWN ) )
812cdf0e10cSrcweir             {
813cdf0e10cSrcweir                 aNewData.SetDrillDown(::cppu::any2bool( aValue ));
814cdf0e10cSrcweir             }
815cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_GRANDTOTAL_NAME ) )
816cdf0e10cSrcweir             {
817cdf0e10cSrcweir                 rtl::OUString aStrVal;
818cdf0e10cSrcweir                 if ( aValue >>= aStrVal )
819cdf0e10cSrcweir                     aNewData.SetGrandTotalName(aStrVal);
820cdf0e10cSrcweir             }
821cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_IMPORTDESC ) )
822cdf0e10cSrcweir             {
823cdf0e10cSrcweir                 uno::Sequence<beans::PropertyValue> aArgSeq;
824cdf0e10cSrcweir                 if ( aValue >>= aArgSeq )
825cdf0e10cSrcweir                 {
826cdf0e10cSrcweir                     ScImportSourceDesc aImportDesc;
827cdf0e10cSrcweir 
828cdf0e10cSrcweir                     const ScImportSourceDesc* pOldDesc = pDPObject->GetImportSourceDesc();
829cdf0e10cSrcweir                     if (pOldDesc)
830cdf0e10cSrcweir                         aImportDesc = *pOldDesc;
831cdf0e10cSrcweir 
832cdf0e10cSrcweir                     ScImportParam aParam;
833cdf0e10cSrcweir                     ScImportDescriptor::FillImportParam( aParam, aArgSeq );
834cdf0e10cSrcweir 
835cdf0e10cSrcweir                     sal_uInt16 nNewType = sheet::DataImportMode_NONE;
836cdf0e10cSrcweir                     if ( aParam.bImport )
837cdf0e10cSrcweir                     {
838cdf0e10cSrcweir                         if ( aParam.bSql )
839cdf0e10cSrcweir                             nNewType = sheet::DataImportMode_SQL;
840cdf0e10cSrcweir                         else if ( aParam.nType == ScDbQuery )
841cdf0e10cSrcweir                             nNewType = sheet::DataImportMode_QUERY;
842cdf0e10cSrcweir                         else
843cdf0e10cSrcweir                             nNewType = sheet::DataImportMode_TABLE;
844cdf0e10cSrcweir                     }
845cdf0e10cSrcweir                     aImportDesc.nType   = nNewType;
846cdf0e10cSrcweir                     aImportDesc.aDBName = aParam.aDBName;
847cdf0e10cSrcweir                     aImportDesc.aObject = aParam.aStatement;
848cdf0e10cSrcweir                     aImportDesc.bNative = aParam.bNative;
849cdf0e10cSrcweir 
850cdf0e10cSrcweir                     pDPObject->SetImportDesc( aImportDesc );
851cdf0e10cSrcweir                 }
852cdf0e10cSrcweir             }
853cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_SOURCESERV ) )
854cdf0e10cSrcweir             {
855cdf0e10cSrcweir                 rtl::OUString aStrVal;
856cdf0e10cSrcweir                 if ( aValue >>= aStrVal )
857cdf0e10cSrcweir                 {
858cdf0e10cSrcweir                     String aEmpty;
859cdf0e10cSrcweir                     ScDPServiceDesc aServiceDesc(aEmpty, aEmpty, aEmpty, aEmpty, aEmpty);
860cdf0e10cSrcweir 
861cdf0e10cSrcweir                     const ScDPServiceDesc* pOldDesc = pDPObject->GetDPServiceDesc();
862cdf0e10cSrcweir                     if (pOldDesc)
863cdf0e10cSrcweir                         aServiceDesc = *pOldDesc;
864cdf0e10cSrcweir 
865cdf0e10cSrcweir                     aServiceDesc.aServiceName = aStrVal;
866cdf0e10cSrcweir 
867cdf0e10cSrcweir                     pDPObject->SetServiceData( aServiceDesc );
868cdf0e10cSrcweir                 }
869cdf0e10cSrcweir             }
870cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_SERVICEARG ) )
871cdf0e10cSrcweir             {
872cdf0e10cSrcweir                 uno::Sequence<beans::PropertyValue> aArgSeq;
873cdf0e10cSrcweir                 if ( aValue >>= aArgSeq )
874cdf0e10cSrcweir                 {
875cdf0e10cSrcweir                     String aEmpty;
876cdf0e10cSrcweir                     ScDPServiceDesc aServiceDesc(aEmpty, aEmpty, aEmpty, aEmpty, aEmpty);
877cdf0e10cSrcweir 
878cdf0e10cSrcweir                     const ScDPServiceDesc* pOldDesc = pDPObject->GetDPServiceDesc();
879cdf0e10cSrcweir                     if (pOldDesc)
880cdf0e10cSrcweir                         aServiceDesc = *pOldDesc;
881cdf0e10cSrcweir 
882cdf0e10cSrcweir                     rtl::OUString aStrVal;
883cdf0e10cSrcweir                     sal_Int32 nArgs = aArgSeq.getLength();
884cdf0e10cSrcweir                     for (sal_Int32 nArgPos=0; nArgPos<nArgs; ++nArgPos)
885cdf0e10cSrcweir                     {
886cdf0e10cSrcweir                         const beans::PropertyValue& rProp = aArgSeq[nArgPos];
887cdf0e10cSrcweir                         String aPropName(rProp.Name);
888cdf0e10cSrcweir 
889cdf0e10cSrcweir                         if (aPropName.EqualsAscii( SC_UNO_SOURCENAME ))
890cdf0e10cSrcweir                         {
891cdf0e10cSrcweir                             if ( rProp.Value >>= aStrVal )
892cdf0e10cSrcweir                                 aServiceDesc.aParSource = aStrVal;
893cdf0e10cSrcweir                         }
894cdf0e10cSrcweir                         else if (aPropName.EqualsAscii( SC_UNO_OBJECTNAME ))
895cdf0e10cSrcweir                         {
896cdf0e10cSrcweir                             if ( rProp.Value >>= aStrVal )
897cdf0e10cSrcweir                                 aServiceDesc.aParName = aStrVal;
898cdf0e10cSrcweir                         }
899cdf0e10cSrcweir                         else if (aPropName.EqualsAscii( SC_UNO_USERNAME ))
900cdf0e10cSrcweir                         {
901cdf0e10cSrcweir                             if ( rProp.Value >>= aStrVal )
902cdf0e10cSrcweir                                 aServiceDesc.aParUser = aStrVal;
903cdf0e10cSrcweir                         }
904cdf0e10cSrcweir                         else if (aPropName.EqualsAscii( SC_UNO_PASSWORD ))
905cdf0e10cSrcweir                         {
906cdf0e10cSrcweir                             if ( rProp.Value >>= aStrVal )
907cdf0e10cSrcweir                                 aServiceDesc.aParPass = aStrVal;
908cdf0e10cSrcweir                         }
909cdf0e10cSrcweir                     }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir                     pDPObject->SetServiceData( aServiceDesc );
912cdf0e10cSrcweir                 }
913cdf0e10cSrcweir             }
914cdf0e10cSrcweir             else
915cdf0e10cSrcweir                 throw UnknownPropertyException();
916cdf0e10cSrcweir 
917cdf0e10cSrcweir             pDPObject->SetSaveData( aNewData );
918cdf0e10cSrcweir         }
919cdf0e10cSrcweir 
920cdf0e10cSrcweir         SetDPObject(pDPObject);
921cdf0e10cSrcweir     }
922cdf0e10cSrcweir }
923cdf0e10cSrcweir 
getPropertyValue(const OUString & aPropertyName)924cdf0e10cSrcweir Any SAL_CALL ScDataPilotDescriptorBase::getPropertyValue( const OUString& aPropertyName )
925cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
926cdf0e10cSrcweir {
927cdf0e10cSrcweir 	ScUnoGuard aGuard;
928cdf0e10cSrcweir     Any aRet;
929cdf0e10cSrcweir 
930cdf0e10cSrcweir     ScDPObject* pDPObject(GetDPObject());
931cdf0e10cSrcweir     if (pDPObject)
932cdf0e10cSrcweir     {
933cdf0e10cSrcweir 	    ScDPSaveData* pOldData = pDPObject->GetSaveData();
934cdf0e10cSrcweir         DBG_ASSERT(pOldData, "Here should be a SaveData");
935cdf0e10cSrcweir 	    if ( pOldData )
936cdf0e10cSrcweir 	    {
937cdf0e10cSrcweir 		    ScDPSaveData aNewData( *pOldData );
938cdf0e10cSrcweir 
939cdf0e10cSrcweir     	    String aNameString = aPropertyName;
940cdf0e10cSrcweir     	    if ( aNameString.EqualsAscii( SC_UNO_COLGRAND ) )
941cdf0e10cSrcweir             {
942cdf0e10cSrcweir 	            aRet = ::cppu::bool2any( aNewData.GetColumnGrand() );
943cdf0e10cSrcweir             }
944cdf0e10cSrcweir     	    else if ( aNameString.EqualsAscii( SC_UNO_IGNEMPROWS ) )
945cdf0e10cSrcweir             {
946cdf0e10cSrcweir                 aRet = ::cppu::bool2any( aNewData.GetIgnoreEmptyRows() );
947cdf0e10cSrcweir             }
948cdf0e10cSrcweir     	    else if ( aNameString.EqualsAscii( SC_UNO_RPTEMPTY ) )
949cdf0e10cSrcweir             {
950cdf0e10cSrcweir     	        aRet = ::cppu::bool2any( aNewData.GetRepeatIfEmpty() );
951cdf0e10cSrcweir             }
952cdf0e10cSrcweir     	    else if ( aNameString.EqualsAscii( SC_UNO_ROWGRAND ) )
953cdf0e10cSrcweir             {
954cdf0e10cSrcweir 	            aRet = ::cppu::bool2any( aNewData.GetRowGrand() );
955cdf0e10cSrcweir             }
956cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_SHOWFILT ) )
957cdf0e10cSrcweir             {
958cdf0e10cSrcweir                 aRet = ::cppu::bool2any( aNewData.GetFilterButton() );
959cdf0e10cSrcweir             }
960cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_DRILLDOWN ) )
961cdf0e10cSrcweir             {
962cdf0e10cSrcweir                 aRet = ::cppu::bool2any( aNewData.GetDrillDown() );
963cdf0e10cSrcweir             }
964cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_GRANDTOTAL_NAME ) )
965cdf0e10cSrcweir             {
966cdf0e10cSrcweir                 const rtl::OUString* pGrandTotalName = aNewData.GetGrandTotalName();
967cdf0e10cSrcweir                 if (pGrandTotalName)
968cdf0e10cSrcweir                     aRet <<= *pGrandTotalName;      // same behavior as in ScDPSource
969cdf0e10cSrcweir             }
970cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_IMPORTDESC ) )
971cdf0e10cSrcweir             {
972cdf0e10cSrcweir                 const ScImportSourceDesc* pImportDesc = pDPObject->GetImportSourceDesc();
973cdf0e10cSrcweir                 if ( pImportDesc )
974cdf0e10cSrcweir                 {
975cdf0e10cSrcweir                     // fill ScImportParam so ScImportDescriptor::FillProperties can be used
976cdf0e10cSrcweir                     ScImportParam aParam;
977cdf0e10cSrcweir                     aParam.bImport    = ( pImportDesc->nType != sheet::DataImportMode_NONE );
978cdf0e10cSrcweir                     aParam.aDBName    = pImportDesc->aDBName;
979cdf0e10cSrcweir                     aParam.aStatement = pImportDesc->aObject;
980cdf0e10cSrcweir                     aParam.bNative    = pImportDesc->bNative;
981cdf0e10cSrcweir                     aParam.bSql       = ( pImportDesc->nType == sheet::DataImportMode_SQL );
982cdf0e10cSrcweir                     aParam.nType      = static_cast<sal_uInt8>(( pImportDesc->nType == sheet::DataImportMode_QUERY ) ? ScDbQuery : ScDbTable);
983cdf0e10cSrcweir 
984cdf0e10cSrcweir                     uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() );
985cdf0e10cSrcweir                     ScImportDescriptor::FillProperties( aSeq, aParam );
986cdf0e10cSrcweir                     aRet <<= aSeq;
987cdf0e10cSrcweir                 }
988cdf0e10cSrcweir                 else
989cdf0e10cSrcweir                 {
990cdf0e10cSrcweir                     // empty sequence
991cdf0e10cSrcweir                     uno::Sequence<beans::PropertyValue> aEmpty(0);
992cdf0e10cSrcweir                     aRet <<= aEmpty;
993cdf0e10cSrcweir                 }
994cdf0e10cSrcweir             }
995cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_SOURCESERV ) )
996cdf0e10cSrcweir             {
997cdf0e10cSrcweir                 rtl::OUString aServiceName;
998cdf0e10cSrcweir                 const ScDPServiceDesc* pServiceDesc = pDPObject->GetDPServiceDesc();
999cdf0e10cSrcweir                 if (pServiceDesc)
1000cdf0e10cSrcweir                     aServiceName = pServiceDesc->aServiceName;
1001cdf0e10cSrcweir                 aRet <<= aServiceName;      // empty string if no ServiceDesc set
1002cdf0e10cSrcweir             }
1003cdf0e10cSrcweir             else if ( aNameString.EqualsAscii( SC_UNO_SERVICEARG ) )
1004cdf0e10cSrcweir             {
1005cdf0e10cSrcweir                 const ScDPServiceDesc* pServiceDesc = pDPObject->GetDPServiceDesc();
1006cdf0e10cSrcweir                 if (pServiceDesc)
1007cdf0e10cSrcweir                 {
1008cdf0e10cSrcweir                     uno::Sequence<beans::PropertyValue> aSeq( 4 );
1009cdf0e10cSrcweir                     beans::PropertyValue* pArray = aSeq.getArray();
1010cdf0e10cSrcweir                     pArray[0].Name = rtl::OUString::createFromAscii( SC_UNO_SOURCENAME );
1011cdf0e10cSrcweir                     pArray[0].Value <<= rtl::OUString( pServiceDesc->aParSource );
1012cdf0e10cSrcweir                     pArray[1].Name = rtl::OUString::createFromAscii( SC_UNO_OBJECTNAME );
1013cdf0e10cSrcweir                     pArray[1].Value <<= rtl::OUString( pServiceDesc->aParName );
1014cdf0e10cSrcweir                     pArray[2].Name = rtl::OUString::createFromAscii( SC_UNO_USERNAME );
1015cdf0e10cSrcweir                     pArray[2].Value <<= rtl::OUString( pServiceDesc->aParUser );
1016cdf0e10cSrcweir                     pArray[3].Name = rtl::OUString::createFromAscii( SC_UNO_PASSWORD );
1017cdf0e10cSrcweir                     pArray[3].Value <<= rtl::OUString( pServiceDesc->aParPass );
1018cdf0e10cSrcweir                     aRet <<= aSeq;
1019cdf0e10cSrcweir                 }
1020cdf0e10cSrcweir                 else
1021cdf0e10cSrcweir                 {
1022cdf0e10cSrcweir                     // empty sequence
1023cdf0e10cSrcweir                     uno::Sequence<beans::PropertyValue> aEmpty(0);
1024cdf0e10cSrcweir                     aRet <<= aEmpty;
1025cdf0e10cSrcweir                 }
1026cdf0e10cSrcweir             }
1027cdf0e10cSrcweir             else
1028cdf0e10cSrcweir                 throw UnknownPropertyException();
1029cdf0e10cSrcweir         }
1030cdf0e10cSrcweir     }
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir     return aRet;
1033cdf0e10cSrcweir }
1034cdf0e10cSrcweir 
addPropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)1035cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::addPropertyChangeListener(
1036cdf0e10cSrcweir         const OUString& /* aPropertyName */, const Reference<XPropertyChangeListener >& /* xListener */ )
1037cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1038cdf0e10cSrcweir {
1039cdf0e10cSrcweir }
1040cdf0e10cSrcweir 
removePropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)1041cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::removePropertyChangeListener(
1042cdf0e10cSrcweir         const OUString& /* aPropertyName */, const Reference<XPropertyChangeListener >& /* aListener */ )
1043cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1044cdf0e10cSrcweir {
1045cdf0e10cSrcweir }
1046cdf0e10cSrcweir 
addVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)1047cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::addVetoableChangeListener(
1048cdf0e10cSrcweir         const OUString& /* PropertyName */, const Reference<XVetoableChangeListener >& /* aListener */ )
1049cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1050cdf0e10cSrcweir {
1051cdf0e10cSrcweir }
1052cdf0e10cSrcweir 
removeVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)1053cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptorBase::removeVetoableChangeListener(
1054cdf0e10cSrcweir         const OUString& /* PropertyName */, const Reference<XVetoableChangeListener >& /* aListener */ )
1055cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1056cdf0e10cSrcweir {
1057cdf0e10cSrcweir }
1058cdf0e10cSrcweir 
1059cdf0e10cSrcweir // XDataPilotDataLayoutFieldSupplier
1060cdf0e10cSrcweir 
getDataLayoutField()1061cdf0e10cSrcweir Reference< XDataPilotField > SAL_CALL ScDataPilotDescriptorBase::getDataLayoutField() throw(RuntimeException)
1062cdf0e10cSrcweir {
1063cdf0e10cSrcweir     ScUnoGuard aGuard;
1064cdf0e10cSrcweir     if( ScDPObject* pDPObject = GetDPObject() )
1065cdf0e10cSrcweir     {
1066cdf0e10cSrcweir         if( ScDPSaveData* pSaveData = pDPObject->GetSaveData() )
1067cdf0e10cSrcweir         {
1068cdf0e10cSrcweir             if( /*ScDPSaveDimension* pDataDim =*/ pSaveData->GetDataLayoutDimension() )
1069cdf0e10cSrcweir             {
1070cdf0e10cSrcweir                 ScFieldIdentifier aFieldId( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_DATALAYOUT_NAME ) ), 0, true );
1071cdf0e10cSrcweir                 return new ScDataPilotFieldObj( *this, aFieldId );
1072cdf0e10cSrcweir             }
1073cdf0e10cSrcweir         }
1074cdf0e10cSrcweir     }
1075cdf0e10cSrcweir     return 0;
1076cdf0e10cSrcweir }
1077cdf0e10cSrcweir 
1078cdf0e10cSrcweir // XUnoTunnel
1079cdf0e10cSrcweir 
getSomething(const Sequence<sal_Int8> & rId)1080cdf0e10cSrcweir sal_Int64 SAL_CALL ScDataPilotDescriptorBase::getSomething(
1081cdf0e10cSrcweir                 const Sequence<sal_Int8 >& rId ) throw(RuntimeException)
1082cdf0e10cSrcweir {
1083cdf0e10cSrcweir 	if ( rId.getLength() == 16 &&
1084cdf0e10cSrcweir           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
1085cdf0e10cSrcweir 									rId.getConstArray(), 16 ) )
1086cdf0e10cSrcweir 	{
1087cdf0e10cSrcweir         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
1088cdf0e10cSrcweir 	}
1089cdf0e10cSrcweir 	return 0;
1090cdf0e10cSrcweir }
1091cdf0e10cSrcweir 
1092cdf0e10cSrcweir // static
getUnoTunnelId()1093cdf0e10cSrcweir const Sequence<sal_Int8>& ScDataPilotDescriptorBase::getUnoTunnelId()
1094cdf0e10cSrcweir {
1095cdf0e10cSrcweir     static Sequence<sal_Int8> * pSeq = 0;
1096cdf0e10cSrcweir 	if( !pSeq )
1097cdf0e10cSrcweir 	{
1098cdf0e10cSrcweir 		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
1099cdf0e10cSrcweir 		if( !pSeq )
1100cdf0e10cSrcweir 		{
1101cdf0e10cSrcweir             static Sequence< sal_Int8 > aSeq( 16 );
1102cdf0e10cSrcweir 			rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
1103cdf0e10cSrcweir 			pSeq = &aSeq;
1104cdf0e10cSrcweir 		}
1105cdf0e10cSrcweir 	}
1106cdf0e10cSrcweir 	return *pSeq;
1107cdf0e10cSrcweir }
1108cdf0e10cSrcweir 
1109cdf0e10cSrcweir // static
getImplementation(const Reference<XDataPilotDescriptor> xObj)1110cdf0e10cSrcweir ScDataPilotDescriptorBase* ScDataPilotDescriptorBase::getImplementation(
1111cdf0e10cSrcweir                                 const Reference<XDataPilotDescriptor> xObj )
1112cdf0e10cSrcweir {
1113cdf0e10cSrcweir 	ScDataPilotDescriptorBase* pRet = NULL;
1114cdf0e10cSrcweir     Reference<lang::XUnoTunnel> xUT( xObj, UNO_QUERY );
1115cdf0e10cSrcweir 	if (xUT.is())
1116cdf0e10cSrcweir         pRet = reinterpret_cast<ScDataPilotDescriptorBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
1117cdf0e10cSrcweir 	return pRet;
1118cdf0e10cSrcweir }
1119cdf0e10cSrcweir 
1120cdf0e10cSrcweir //------------------------------------------------------------------------
1121cdf0e10cSrcweir 
ScDataPilotTableObj(ScDocShell * pDocSh,SCTAB nT,const String & rN)1122cdf0e10cSrcweir ScDataPilotTableObj::ScDataPilotTableObj(ScDocShell* pDocSh, SCTAB nT, const String& rN) :
1123cdf0e10cSrcweir 	ScDataPilotDescriptorBase( pDocSh ),
1124cdf0e10cSrcweir 	nTab( nT ),
1125cdf0e10cSrcweir     aName( rN ),
1126cdf0e10cSrcweir     aModifyListeners( 0 )
1127cdf0e10cSrcweir {
1128cdf0e10cSrcweir }
1129cdf0e10cSrcweir 
~ScDataPilotTableObj()1130cdf0e10cSrcweir ScDataPilotTableObj::~ScDataPilotTableObj()
1131cdf0e10cSrcweir {
1132cdf0e10cSrcweir }
1133cdf0e10cSrcweir 
queryInterface(const uno::Type & rType)1134cdf0e10cSrcweir Any SAL_CALL ScDataPilotTableObj::queryInterface( const uno::Type& rType )
1135cdf0e10cSrcweir                                                 throw(RuntimeException)
1136cdf0e10cSrcweir {
1137cdf0e10cSrcweir     // since we manually do resolve the query for XDataPilotTable2
1138cdf0e10cSrcweir     // we also need to do the same for XDataPilotTable
1139cdf0e10cSrcweir     SC_QUERYINTERFACE( XDataPilotTable )
1140cdf0e10cSrcweir     SC_QUERYINTERFACE( XDataPilotTable2 )
1141cdf0e10cSrcweir     SC_QUERYINTERFACE( XModifyBroadcaster )
1142cdf0e10cSrcweir 
1143cdf0e10cSrcweir 	return ScDataPilotDescriptorBase::queryInterface( rType );
1144cdf0e10cSrcweir }
1145cdf0e10cSrcweir 
acquire()1146cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::acquire() throw()
1147cdf0e10cSrcweir {
1148cdf0e10cSrcweir 	ScDataPilotDescriptorBase::acquire();
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir 
release()1151cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::release() throw()
1152cdf0e10cSrcweir {
1153cdf0e10cSrcweir 	ScDataPilotDescriptorBase::release();
1154cdf0e10cSrcweir }
1155cdf0e10cSrcweir 
getTypes()1156cdf0e10cSrcweir Sequence< uno::Type > SAL_CALL ScDataPilotTableObj::getTypes() throw(RuntimeException)
1157cdf0e10cSrcweir {
1158cdf0e10cSrcweir     static Sequence< uno::Type > aTypes;
1159cdf0e10cSrcweir 	if ( aTypes.getLength() == 0 )
1160cdf0e10cSrcweir 	{
1161cdf0e10cSrcweir         Sequence< uno::Type > aParentTypes = ScDataPilotDescriptorBase::getTypes();
1162cdf0e10cSrcweir         sal_Int32 nParentLen = aParentTypes.getLength();
1163cdf0e10cSrcweir 		const uno::Type* pParentPtr = aParentTypes.getConstArray();
1164cdf0e10cSrcweir 
1165cdf0e10cSrcweir         aTypes.realloc( nParentLen + 2 );
1166cdf0e10cSrcweir 		uno::Type* pPtr = aTypes.getArray();
1167cdf0e10cSrcweir         for (sal_Int32 i = 0; i < nParentLen; ++i)
1168cdf0e10cSrcweir             pPtr[ i ] = pParentPtr[ i ];               // parent types first
1169cdf0e10cSrcweir 
1170cdf0e10cSrcweir         pPtr[ nParentLen ] = getCppuType( (const Reference< XDataPilotTable2 >*)0 );
1171cdf0e10cSrcweir         pPtr[ nParentLen+1 ] = getCppuType( (const Reference< XModifyBroadcaster >*)0 );
1172cdf0e10cSrcweir 	}
1173cdf0e10cSrcweir 	return aTypes;
1174cdf0e10cSrcweir }
1175cdf0e10cSrcweir 
getImplementationId()1176cdf0e10cSrcweir Sequence<sal_Int8> SAL_CALL ScDataPilotTableObj::getImplementationId()
1177cdf0e10cSrcweir                                                     throw(RuntimeException)
1178cdf0e10cSrcweir {
1179cdf0e10cSrcweir     static Sequence< sal_Int8 > aId;
1180cdf0e10cSrcweir 	if( aId.getLength() == 0 )
1181cdf0e10cSrcweir 	{
1182cdf0e10cSrcweir 		aId.realloc( 16 );
1183cdf0e10cSrcweir 		rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
1184cdf0e10cSrcweir 	}
1185cdf0e10cSrcweir 	return aId;
1186cdf0e10cSrcweir }
1187cdf0e10cSrcweir 
1188cdf0e10cSrcweir // ---
GetDPObject() const1189cdf0e10cSrcweir ScDPObject* ScDataPilotTableObj::GetDPObject() const
1190cdf0e10cSrcweir {
1191cdf0e10cSrcweir     return lcl_GetDPObject(GetDocShell(), nTab, aName);
1192cdf0e10cSrcweir }
1193cdf0e10cSrcweir 
SetDPObject(ScDPObject * pDPObject)1194cdf0e10cSrcweir void ScDataPilotTableObj::SetDPObject( ScDPObject* pDPObject )
1195cdf0e10cSrcweir {
1196cdf0e10cSrcweir 	ScDocShell* pDocSh = GetDocShell();
1197cdf0e10cSrcweir 	ScDPObject* pDPObj = lcl_GetDPObject(pDocSh, nTab, aName);
1198cdf0e10cSrcweir 	if ( pDPObj && pDocSh )
1199cdf0e10cSrcweir 	{
1200cdf0e10cSrcweir         ScDBDocFunc aFunc(*pDocSh);
1201cdf0e10cSrcweir         aFunc.DataPilotUpdate( pDPObj, pDPObject, sal_True, sal_True );
1202cdf0e10cSrcweir     }
1203cdf0e10cSrcweir }
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir // "rest of XDataPilotDescriptor"
1206cdf0e10cSrcweir 
getName()1207cdf0e10cSrcweir OUString SAL_CALL ScDataPilotTableObj::getName() throw(RuntimeException)
1208cdf0e10cSrcweir {
1209cdf0e10cSrcweir 	ScUnoGuard aGuard;
1210cdf0e10cSrcweir 	ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName);
1211cdf0e10cSrcweir 	if (pDPObj)
1212cdf0e10cSrcweir 		return pDPObj->GetName();
1213cdf0e10cSrcweir     return OUString();
1214cdf0e10cSrcweir }
1215cdf0e10cSrcweir 
setName(const OUString & aNewName)1216cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::setName( const OUString& aNewName )
1217cdf0e10cSrcweir                                                 throw(RuntimeException)
1218cdf0e10cSrcweir {
1219cdf0e10cSrcweir 	ScUnoGuard aGuard;
1220cdf0e10cSrcweir 	ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName);
1221cdf0e10cSrcweir 	if (pDPObj)
1222cdf0e10cSrcweir 	{
1223cdf0e10cSrcweir 		//!	test for existing names !!!
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir 		String aString(aNewName);
1226cdf0e10cSrcweir 		pDPObj->SetName( aString );		//! Undo - DBDocFunc ???
1227cdf0e10cSrcweir 		aName = aString;
1228cdf0e10cSrcweir 
1229cdf0e10cSrcweir 		//	DataPilotUpdate would do too much (output table is not changed)
1230cdf0e10cSrcweir 		GetDocShell()->SetDocumentModified();
1231cdf0e10cSrcweir 	}
1232cdf0e10cSrcweir }
1233cdf0e10cSrcweir 
getTag()1234cdf0e10cSrcweir OUString SAL_CALL ScDataPilotTableObj::getTag() throw(RuntimeException)
1235cdf0e10cSrcweir {
1236cdf0e10cSrcweir 	ScUnoGuard aGuard;
1237cdf0e10cSrcweir 	ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName);
1238cdf0e10cSrcweir 	if (pDPObj)
1239cdf0e10cSrcweir 		return pDPObj->GetTag();
1240cdf0e10cSrcweir     return OUString();
1241cdf0e10cSrcweir }
1242cdf0e10cSrcweir 
setTag(const OUString & aNewTag)1243cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::setTag( const OUString& aNewTag )
1244cdf0e10cSrcweir                                                 throw(RuntimeException)
1245cdf0e10cSrcweir {
1246cdf0e10cSrcweir 	ScUnoGuard aGuard;
1247cdf0e10cSrcweir 	ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName);
1248cdf0e10cSrcweir 	if (pDPObj)
1249cdf0e10cSrcweir 	{
1250cdf0e10cSrcweir 		String aString(aNewTag);
1251cdf0e10cSrcweir 		pDPObj->SetTag( aString );		//! Undo - DBDocFunc ???
1252cdf0e10cSrcweir 
1253cdf0e10cSrcweir 		//	DataPilotUpdate would do too much (output table is not changed)
1254cdf0e10cSrcweir 		GetDocShell()->SetDocumentModified();
1255cdf0e10cSrcweir 	}
1256cdf0e10cSrcweir }
1257cdf0e10cSrcweir 
1258cdf0e10cSrcweir // XDataPilotTable
1259cdf0e10cSrcweir 
getOutputRange()1260cdf0e10cSrcweir CellRangeAddress SAL_CALL ScDataPilotTableObj::getOutputRange() throw(RuntimeException)
1261cdf0e10cSrcweir {
1262cdf0e10cSrcweir 	ScUnoGuard aGuard;
1263cdf0e10cSrcweir     CellRangeAddress aRet;
1264cdf0e10cSrcweir 	ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName);
1265cdf0e10cSrcweir 	if (pDPObj)
1266cdf0e10cSrcweir 	{
1267cdf0e10cSrcweir 		ScRange aRange(pDPObj->GetOutRange());
1268cdf0e10cSrcweir 		aRet.Sheet		 = aRange.aStart.Tab();
1269cdf0e10cSrcweir 		aRet.StartColumn = aRange.aStart.Col();
1270cdf0e10cSrcweir 		aRet.StartRow	 = aRange.aStart.Row();
1271cdf0e10cSrcweir 		aRet.EndColumn	 = aRange.aEnd.Col();
1272cdf0e10cSrcweir 		aRet.EndRow		 = aRange.aEnd.Row();
1273cdf0e10cSrcweir 	}
1274cdf0e10cSrcweir 	return aRet;
1275cdf0e10cSrcweir }
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir sal_uLong RefreshDPObject( ScDPObject *pDPObj, ScDocument *pDoc, ScDocShell *pDocSh, sal_Bool bRecord, sal_Bool bApi );
1278cdf0e10cSrcweir 
refresh()1279cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::refresh() throw(RuntimeException)
1280cdf0e10cSrcweir {
1281cdf0e10cSrcweir 	ScUnoGuard aGuard;
1282cdf0e10cSrcweir 	if( ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName) )
1283cdf0e10cSrcweir 		RefreshDPObject( pDPObj, NULL, GetDocShell(), sal_True, sal_True );
1284cdf0e10cSrcweir 	//if (pDPObj)
1285cdf0e10cSrcweir 	//{
1286cdf0e10cSrcweir 	//	ScDPObject* pNew = new ScDPObject(*pDPObj);
1287cdf0e10cSrcweir 	//	ScDBDocFunc aFunc(*GetDocShell());
1288cdf0e10cSrcweir 	//	aFunc.DataPilotUpdate( pDPObj, pNew, sal_True, sal_True );
1289cdf0e10cSrcweir 	//	delete pNew;		// DataPilotUpdate copies settings from "new" object
1290cdf0e10cSrcweir 	//}
1291cdf0e10cSrcweir 
1292cdf0e10cSrcweir }
1293cdf0e10cSrcweir 
getDrillDownData(const CellAddress & aAddr)1294cdf0e10cSrcweir Sequence< Sequence<Any> > SAL_CALL ScDataPilotTableObj::getDrillDownData(const CellAddress& aAddr)
1295cdf0e10cSrcweir     throw (RuntimeException)
1296cdf0e10cSrcweir {
1297cdf0e10cSrcweir     ScUnoGuard aGuard;
1298cdf0e10cSrcweir     Sequence< Sequence<Any> > aTabData;
1299cdf0e10cSrcweir     ScAddress aAddr2(static_cast<SCCOL>(aAddr.Column), static_cast<SCROW>(aAddr.Row), aAddr.Sheet);
1300cdf0e10cSrcweir     ScDPObject* pObj = GetDPObject();
1301cdf0e10cSrcweir     if (!pObj)
1302cdf0e10cSrcweir         throw RuntimeException();
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir     pObj->GetDrillDownData(aAddr2, aTabData);
1305cdf0e10cSrcweir     return aTabData;
1306cdf0e10cSrcweir }
1307cdf0e10cSrcweir 
getPositionData(const CellAddress & aAddr)1308cdf0e10cSrcweir DataPilotTablePositionData SAL_CALL ScDataPilotTableObj::getPositionData(const CellAddress& aAddr)
1309cdf0e10cSrcweir     throw (RuntimeException)
1310cdf0e10cSrcweir {
1311cdf0e10cSrcweir     ScUnoGuard aGuard;
1312cdf0e10cSrcweir     DataPilotTablePositionData aPosData;
1313cdf0e10cSrcweir     ScAddress aAddr2(static_cast<SCCOL>(aAddr.Column), static_cast<SCROW>(aAddr.Row), aAddr.Sheet);
1314cdf0e10cSrcweir     ScDPObject* pObj = GetDPObject();
1315cdf0e10cSrcweir     if (!pObj)
1316cdf0e10cSrcweir         throw RuntimeException();
1317cdf0e10cSrcweir 
1318cdf0e10cSrcweir     pObj->GetPositionData(aAddr2, aPosData);
1319cdf0e10cSrcweir     return aPosData;
1320cdf0e10cSrcweir }
1321cdf0e10cSrcweir 
insertDrillDownSheet(const CellAddress & aAddr)1322cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::insertDrillDownSheet(const CellAddress& aAddr)
1323cdf0e10cSrcweir     throw (RuntimeException)
1324cdf0e10cSrcweir {
1325cdf0e10cSrcweir     ScUnoGuard aGuard;
1326cdf0e10cSrcweir     ScDPObject* pDPObj = GetDPObject();
1327cdf0e10cSrcweir     if (!pDPObj)
1328cdf0e10cSrcweir         throw RuntimeException();
1329cdf0e10cSrcweir 
1330cdf0e10cSrcweir     Sequence<DataPilotFieldFilter> aFilters;
1331cdf0e10cSrcweir     pDPObj->GetDataFieldPositionData(
1332cdf0e10cSrcweir         ScAddress(static_cast<SCCOL>(aAddr.Column), static_cast<SCROW>(aAddr.Row), aAddr.Sheet), aFilters);
1333cdf0e10cSrcweir     GetDocShell()->GetBestViewShell()->ShowDataPilotSourceData(*pDPObj, aFilters);
1334cdf0e10cSrcweir }
1335cdf0e10cSrcweir 
getOutputRangeByType(sal_Int32 nType)1336cdf0e10cSrcweir CellRangeAddress SAL_CALL ScDataPilotTableObj::getOutputRangeByType( sal_Int32 nType )
1337cdf0e10cSrcweir     throw (IllegalArgumentException, RuntimeException)
1338cdf0e10cSrcweir {
1339cdf0e10cSrcweir     ScUnoGuard aGuard;
1340cdf0e10cSrcweir     if (nType < 0 || nType > DataPilotOutputRangeType::RESULT)
1341cdf0e10cSrcweir         throw IllegalArgumentException();
1342cdf0e10cSrcweir 
1343cdf0e10cSrcweir     CellRangeAddress aRet;
1344cdf0e10cSrcweir     if (ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName))
1345cdf0e10cSrcweir         ScUnoConversion::FillApiRange( aRet, pDPObj->GetOutputRangeByType( nType ) );
1346cdf0e10cSrcweir     return aRet;
1347cdf0e10cSrcweir }
1348cdf0e10cSrcweir 
addModifyListener(const uno::Reference<util::XModifyListener> & aListener)1349cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::addModifyListener( const uno::Reference<util::XModifyListener>& aListener )
1350cdf0e10cSrcweir     throw (uno::RuntimeException)
1351cdf0e10cSrcweir {
1352cdf0e10cSrcweir     ScUnoGuard aGuard;
1353cdf0e10cSrcweir 
1354cdf0e10cSrcweir     uno::Reference<util::XModifyListener> *pObj = new uno::Reference<util::XModifyListener>( aListener );
1355cdf0e10cSrcweir     aModifyListeners.Insert( pObj, aModifyListeners.Count() );
1356cdf0e10cSrcweir 
1357cdf0e10cSrcweir     if ( aModifyListeners.Count() == 1 )
1358cdf0e10cSrcweir     {
1359cdf0e10cSrcweir         acquire();  // don't lose this object (one ref for all listeners)
1360cdf0e10cSrcweir     }
1361cdf0e10cSrcweir }
1362cdf0e10cSrcweir 
removeModifyListener(const uno::Reference<util::XModifyListener> & aListener)1363cdf0e10cSrcweir void SAL_CALL ScDataPilotTableObj::removeModifyListener( const uno::Reference<util::XModifyListener>& aListener )
1364cdf0e10cSrcweir     throw (uno::RuntimeException)
1365cdf0e10cSrcweir {
1366cdf0e10cSrcweir     ScUnoGuard aGuard;
1367cdf0e10cSrcweir 
1368cdf0e10cSrcweir     acquire();      // in case the listeners have the last ref - released below
1369cdf0e10cSrcweir 
1370cdf0e10cSrcweir     sal_uInt16 nCount = aModifyListeners.Count();
1371cdf0e10cSrcweir     for ( sal_uInt16 n=nCount; n--; )
1372cdf0e10cSrcweir     {
1373cdf0e10cSrcweir         uno::Reference<util::XModifyListener> *pObj = aModifyListeners[n];
1374cdf0e10cSrcweir         if ( *pObj == aListener )
1375cdf0e10cSrcweir         {
1376cdf0e10cSrcweir             aModifyListeners.DeleteAndDestroy( n );
1377cdf0e10cSrcweir 
1378cdf0e10cSrcweir             if ( aModifyListeners.Count() == 0 )
1379cdf0e10cSrcweir             {
1380cdf0e10cSrcweir                 release();      // release the ref for the listeners
1381cdf0e10cSrcweir             }
1382cdf0e10cSrcweir 
1383cdf0e10cSrcweir             break;
1384cdf0e10cSrcweir         }
1385cdf0e10cSrcweir     }
1386cdf0e10cSrcweir 
1387cdf0e10cSrcweir     release();      // might delete this object
1388cdf0e10cSrcweir }
1389cdf0e10cSrcweir 
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)1390cdf0e10cSrcweir void ScDataPilotTableObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1391cdf0e10cSrcweir {
1392cdf0e10cSrcweir     if ( rHint.ISA(ScDataPilotModifiedHint) &&
1393cdf0e10cSrcweir          static_cast<const ScDataPilotModifiedHint&>(rHint).GetName() == aName )
1394cdf0e10cSrcweir     {
1395cdf0e10cSrcweir         Refreshed_Impl();
1396cdf0e10cSrcweir     }
1397cdf0e10cSrcweir     else if ( rHint.ISA( ScUpdateRefHint ) )
1398cdf0e10cSrcweir     {
1399cdf0e10cSrcweir         ScRange aRange( 0, 0, nTab );
1400cdf0e10cSrcweir         ScRangeList aRanges;
1401cdf0e10cSrcweir         aRanges.Append( aRange );
1402cdf0e10cSrcweir         const ScUpdateRefHint& rRef = static_cast< const ScUpdateRefHint& >( rHint );
1403cdf0e10cSrcweir         if ( aRanges.UpdateReference( rRef.GetMode(), GetDocShell()->GetDocument(), rRef.GetRange(),
1404cdf0e10cSrcweir                  rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ) &&
1405cdf0e10cSrcweir              aRanges.Count() == 1 )
1406cdf0e10cSrcweir         {
1407cdf0e10cSrcweir             const ScRange* pRange = aRanges.GetObject( 0 );
1408cdf0e10cSrcweir             if ( pRange )
1409cdf0e10cSrcweir             {
1410cdf0e10cSrcweir                 nTab = pRange->aStart.Tab();
1411cdf0e10cSrcweir             }
1412cdf0e10cSrcweir         }
1413cdf0e10cSrcweir     }
1414cdf0e10cSrcweir 
1415cdf0e10cSrcweir     ScDataPilotDescriptorBase::Notify( rBC, rHint );
1416cdf0e10cSrcweir }
1417cdf0e10cSrcweir 
Refreshed_Impl()1418cdf0e10cSrcweir void ScDataPilotTableObj::Refreshed_Impl()
1419cdf0e10cSrcweir {
1420cdf0e10cSrcweir     lang::EventObject aEvent;
1421cdf0e10cSrcweir     aEvent.Source.set((cppu::OWeakObject*)this);
1422cdf0e10cSrcweir 
1423cdf0e10cSrcweir     // the EventObject holds a Ref to this object until after the listener calls
1424cdf0e10cSrcweir 
1425cdf0e10cSrcweir     ScDocument* pDoc = GetDocShell()->GetDocument();
1426cdf0e10cSrcweir     for ( sal_uInt16 n=0; n<aModifyListeners.Count(); n++ )
1427cdf0e10cSrcweir         pDoc->AddUnoListenerCall( *aModifyListeners[n], aEvent );
1428cdf0e10cSrcweir }
1429cdf0e10cSrcweir 
1430cdf0e10cSrcweir // ============================================================================
1431cdf0e10cSrcweir 
ScDataPilotDescriptor(ScDocShell * pDocSh)1432cdf0e10cSrcweir ScDataPilotDescriptor::ScDataPilotDescriptor(ScDocShell* pDocSh) :
1433cdf0e10cSrcweir 	ScDataPilotDescriptorBase( pDocSh ),
1434cdf0e10cSrcweir     mpDPObject(new ScDPObject(pDocSh ? pDocSh->GetDocument() : NULL) )
1435cdf0e10cSrcweir {
1436cdf0e10cSrcweir     mpDPObject->SetAlive(sal_True);
1437cdf0e10cSrcweir     ScDPSaveData aSaveData;
1438cdf0e10cSrcweir     // set defaults like in ScPivotParam constructor
1439cdf0e10cSrcweir  	aSaveData.SetColumnGrand( sal_True );
1440cdf0e10cSrcweir 	aSaveData.SetRowGrand( sal_True );
1441cdf0e10cSrcweir 	aSaveData.SetIgnoreEmptyRows( sal_False );
1442cdf0e10cSrcweir 	aSaveData.SetRepeatIfEmpty( sal_False );
1443cdf0e10cSrcweir     mpDPObject->SetSaveData(aSaveData);
1444cdf0e10cSrcweir     ScSheetSourceDesc aSheetDesc;
1445cdf0e10cSrcweir     mpDPObject->SetSheetDesc(aSheetDesc);
1446cdf0e10cSrcweir     mpDPObject->GetSource();
1447cdf0e10cSrcweir }
1448cdf0e10cSrcweir 
~ScDataPilotDescriptor()1449cdf0e10cSrcweir ScDataPilotDescriptor::~ScDataPilotDescriptor()
1450cdf0e10cSrcweir {
1451cdf0e10cSrcweir     delete mpDPObject;
1452cdf0e10cSrcweir }
1453cdf0e10cSrcweir 
GetDPObject() const1454cdf0e10cSrcweir ScDPObject* ScDataPilotDescriptor::GetDPObject() const
1455cdf0e10cSrcweir {
1456cdf0e10cSrcweir     return mpDPObject;
1457cdf0e10cSrcweir }
1458cdf0e10cSrcweir 
SetDPObject(ScDPObject * pDPObject)1459cdf0e10cSrcweir void ScDataPilotDescriptor::SetDPObject( ScDPObject* pDPObject )
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir     if (mpDPObject != pDPObject)
1462cdf0e10cSrcweir     {
1463cdf0e10cSrcweir         delete mpDPObject;
1464cdf0e10cSrcweir         mpDPObject = pDPObject;
1465cdf0e10cSrcweir         DBG_ERROR("replace DPObject should not happen");
1466cdf0e10cSrcweir     }
1467cdf0e10cSrcweir }
1468cdf0e10cSrcweir 
1469cdf0e10cSrcweir // "rest of XDataPilotDescriptor"
1470cdf0e10cSrcweir 
getName()1471cdf0e10cSrcweir OUString SAL_CALL ScDataPilotDescriptor::getName() throw(RuntimeException)
1472cdf0e10cSrcweir {
1473cdf0e10cSrcweir 	ScUnoGuard aGuard;
1474cdf0e10cSrcweir 	return mpDPObject->GetName();
1475cdf0e10cSrcweir }
1476cdf0e10cSrcweir 
setName(const OUString & aNewName)1477cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptor::setName( const OUString& aNewName )
1478cdf0e10cSrcweir                                                 throw(RuntimeException)
1479cdf0e10cSrcweir {
1480cdf0e10cSrcweir 	ScUnoGuard aGuard;
1481cdf0e10cSrcweir 	mpDPObject->SetName( aNewName );
1482cdf0e10cSrcweir }
1483cdf0e10cSrcweir 
getTag()1484cdf0e10cSrcweir OUString SAL_CALL ScDataPilotDescriptor::getTag() throw(RuntimeException)
1485cdf0e10cSrcweir {
1486cdf0e10cSrcweir 	ScUnoGuard aGuard;
1487cdf0e10cSrcweir 	return mpDPObject->GetTag();
1488cdf0e10cSrcweir }
1489cdf0e10cSrcweir 
setTag(const OUString & aNewTag)1490cdf0e10cSrcweir void SAL_CALL ScDataPilotDescriptor::setTag( const OUString& aNewTag )
1491cdf0e10cSrcweir                                                 throw(RuntimeException)
1492cdf0e10cSrcweir {
1493cdf0e10cSrcweir 	ScUnoGuard aGuard;
1494cdf0e10cSrcweir 	mpDPObject->SetTag( aNewTag );
1495cdf0e10cSrcweir }
1496cdf0e10cSrcweir 
1497cdf0e10cSrcweir // ============================================================================
1498cdf0e10cSrcweir 
ScDataPilotChildObjBase(ScDataPilotDescriptorBase & rParent)1499cdf0e10cSrcweir ScDataPilotChildObjBase::ScDataPilotChildObjBase( ScDataPilotDescriptorBase& rParent ) :
1500cdf0e10cSrcweir     mrParent( rParent )
1501cdf0e10cSrcweir {
1502cdf0e10cSrcweir     mrParent.acquire();
1503cdf0e10cSrcweir }
1504cdf0e10cSrcweir 
ScDataPilotChildObjBase(ScDataPilotDescriptorBase & rParent,const ScFieldIdentifier & rFieldId)1505cdf0e10cSrcweir ScDataPilotChildObjBase::ScDataPilotChildObjBase( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId ) :
1506cdf0e10cSrcweir     mrParent( rParent ),
1507cdf0e10cSrcweir     maFieldId( rFieldId )
1508cdf0e10cSrcweir {
1509cdf0e10cSrcweir     mrParent.acquire();
1510cdf0e10cSrcweir }
1511cdf0e10cSrcweir 
~ScDataPilotChildObjBase()1512cdf0e10cSrcweir ScDataPilotChildObjBase::~ScDataPilotChildObjBase()
1513cdf0e10cSrcweir {
1514cdf0e10cSrcweir     mrParent.release();
1515cdf0e10cSrcweir }
1516cdf0e10cSrcweir 
GetDPObject() const1517cdf0e10cSrcweir ScDPObject* ScDataPilotChildObjBase::GetDPObject() const
1518cdf0e10cSrcweir {
1519cdf0e10cSrcweir     return mrParent.GetDPObject();
1520cdf0e10cSrcweir }
1521cdf0e10cSrcweir 
SetDPObject(ScDPObject * pDPObject)1522cdf0e10cSrcweir void ScDataPilotChildObjBase::SetDPObject( ScDPObject* pDPObject )
1523cdf0e10cSrcweir {
1524cdf0e10cSrcweir     mrParent.SetDPObject( pDPObject );
1525cdf0e10cSrcweir }
1526cdf0e10cSrcweir 
GetDPDimension(ScDPObject ** ppDPObject) const1527cdf0e10cSrcweir ScDPSaveDimension* ScDataPilotChildObjBase::GetDPDimension( ScDPObject** ppDPObject ) const
1528cdf0e10cSrcweir {
1529cdf0e10cSrcweir     if( ScDPObject* pDPObj = GetDPObject() )
1530cdf0e10cSrcweir     {
1531cdf0e10cSrcweir         if( ppDPObject ) *ppDPObject = pDPObj;
1532cdf0e10cSrcweir         if( ScDPSaveData* pSaveData = pDPObj->GetSaveData() )
1533cdf0e10cSrcweir         {
1534cdf0e10cSrcweir             if( maFieldId.mbDataLayout )
1535cdf0e10cSrcweir                 return pSaveData->GetDataLayoutDimension();
1536cdf0e10cSrcweir 
1537cdf0e10cSrcweir             if( maFieldId.mnFieldIdx == 0 )
1538cdf0e10cSrcweir                 return pSaveData->GetDimensionByName( maFieldId.maFieldName );
1539cdf0e10cSrcweir 
1540cdf0e10cSrcweir             // find dimension with specified index (search in duplicated dimensions)
1541cdf0e10cSrcweir             String aFieldName = maFieldId.maFieldName;  // needed for comparison
1542cdf0e10cSrcweir             const List& rDimensions = pSaveData->GetDimensions();
1543cdf0e10cSrcweir             sal_uLong nDimCount = rDimensions.Count();
1544cdf0e10cSrcweir             sal_Int32 nFoundIdx = 0;
1545cdf0e10cSrcweir             for( sal_uLong nDim = 0; nDim < nDimCount; ++nDim )
1546cdf0e10cSrcweir             {
1547cdf0e10cSrcweir                 ScDPSaveDimension* pDim = static_cast< ScDPSaveDimension* >( rDimensions.GetObject( nDim ) );
1548cdf0e10cSrcweir                 if( !pDim->IsDataLayout() && (pDim->GetName() == aFieldName) )
1549cdf0e10cSrcweir                 {
1550cdf0e10cSrcweir                     if( nFoundIdx == maFieldId.mnFieldIdx )
1551cdf0e10cSrcweir                         return pDim;
1552cdf0e10cSrcweir                     ++nFoundIdx;
1553cdf0e10cSrcweir                 }
1554cdf0e10cSrcweir             }
1555cdf0e10cSrcweir         }
1556cdf0e10cSrcweir     }
1557cdf0e10cSrcweir     return 0;
1558cdf0e10cSrcweir }
1559cdf0e10cSrcweir 
GetMemberCount() const1560cdf0e10cSrcweir sal_Int32 ScDataPilotChildObjBase::GetMemberCount() const
1561cdf0e10cSrcweir {
1562cdf0e10cSrcweir     sal_Int32 nRet = 0;
1563cdf0e10cSrcweir     Reference<XNameAccess> xMembersNA = GetMembers();
1564cdf0e10cSrcweir     if (xMembersNA.is())
1565cdf0e10cSrcweir     {
1566cdf0e10cSrcweir         Reference< XIndexAccess > xMembersIA( new ScNameToIndexAccess( xMembersNA ) );
1567cdf0e10cSrcweir         nRet = xMembersIA->getCount();
1568cdf0e10cSrcweir     }
1569cdf0e10cSrcweir     return nRet;
1570cdf0e10cSrcweir }
1571cdf0e10cSrcweir 
GetMembers() const1572cdf0e10cSrcweir Reference< XNameAccess > ScDataPilotChildObjBase::GetMembers() const
1573cdf0e10cSrcweir {
1574cdf0e10cSrcweir     Reference< XNameAccess > xMembersNA;
1575cdf0e10cSrcweir     if( ScDPObject* pDPObj = GetDPObject() )
1576cdf0e10cSrcweir         pDPObj->GetMembersNA( lcl_GetObjectIndex( pDPObj, maFieldId ), xMembersNA );
1577cdf0e10cSrcweir     return xMembersNA;
1578cdf0e10cSrcweir }
1579cdf0e10cSrcweir 
1580cdf0e10cSrcweir // ============================================================================
1581cdf0e10cSrcweir 
ScDataPilotFieldsObj(ScDataPilotDescriptorBase & rParent)1582cdf0e10cSrcweir ScDataPilotFieldsObj::ScDataPilotFieldsObj( ScDataPilotDescriptorBase& rParent ) :
1583cdf0e10cSrcweir     ScDataPilotChildObjBase( rParent )
1584cdf0e10cSrcweir {
1585cdf0e10cSrcweir }
1586cdf0e10cSrcweir 
ScDataPilotFieldsObj(ScDataPilotDescriptorBase & rParent,DataPilotFieldOrientation eOrient)1587cdf0e10cSrcweir ScDataPilotFieldsObj::ScDataPilotFieldsObj( ScDataPilotDescriptorBase& rParent, DataPilotFieldOrientation eOrient ) :
1588cdf0e10cSrcweir     ScDataPilotChildObjBase( rParent ),
1589cdf0e10cSrcweir     maOrient( eOrient )
1590cdf0e10cSrcweir {
1591cdf0e10cSrcweir }
1592cdf0e10cSrcweir 
~ScDataPilotFieldsObj()1593cdf0e10cSrcweir ScDataPilotFieldsObj::~ScDataPilotFieldsObj()
1594cdf0e10cSrcweir {
1595cdf0e10cSrcweir }
1596cdf0e10cSrcweir 
lcl_GetFieldCount(const Reference<XDimensionsSupplier> & rSource,const Any & rOrient)1597cdf0e10cSrcweir sal_Int32 lcl_GetFieldCount( const Reference<XDimensionsSupplier>& rSource, const Any& rOrient )
1598cdf0e10cSrcweir {
1599cdf0e10cSrcweir     sal_Int32 nRet = 0;
1600cdf0e10cSrcweir 
1601cdf0e10cSrcweir     Reference<XNameAccess> xDimsName(rSource->getDimensions());
1602cdf0e10cSrcweir     Reference<XIndexAccess> xIntDims(new ScNameToIndexAccess( xDimsName ));
1603cdf0e10cSrcweir 	sal_Int32 nIntCount = xIntDims->getCount();
1604cdf0e10cSrcweir     if (rOrient.hasValue())
1605cdf0e10cSrcweir     {
1606cdf0e10cSrcweir         // all fields of the specified orientation, including duplicated
1607cdf0e10cSrcweir         Reference<XPropertySet> xDim;
1608cdf0e10cSrcweir         for (sal_Int32 i = 0; i < nIntCount; ++i)
1609cdf0e10cSrcweir         {
1610cdf0e10cSrcweir             xDim.set(xIntDims->getByIndex(i), UNO_QUERY);
1611cdf0e10cSrcweir             if (xDim.is() && (xDim->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ORIENTAT))) == rOrient))
1612cdf0e10cSrcweir                 ++nRet;
1613cdf0e10cSrcweir         }
1614cdf0e10cSrcweir     }
1615cdf0e10cSrcweir     else
1616cdf0e10cSrcweir     {
1617cdf0e10cSrcweir         // count all non-duplicated fields
1618cdf0e10cSrcweir 
1619cdf0e10cSrcweir         Reference<XPropertySet> xDim;
1620cdf0e10cSrcweir         for (sal_Int32 i = 0; i < nIntCount; ++i)
1621cdf0e10cSrcweir         {
1622cdf0e10cSrcweir             xDim.set(xIntDims->getByIndex(i), UNO_QUERY);
1623cdf0e10cSrcweir             if ( xDim.is() && !lcl_IsDuplicated( xDim ) )
1624cdf0e10cSrcweir                 ++nRet;
1625cdf0e10cSrcweir         }
1626cdf0e10cSrcweir     }
1627cdf0e10cSrcweir 
1628cdf0e10cSrcweir 	return nRet;
1629cdf0e10cSrcweir }
1630cdf0e10cSrcweir 
lcl_GetFieldDataByIndex(const Reference<XDimensionsSupplier> & rSource,const Any & rOrient,SCSIZE nIndex,ScFieldIdentifier & rFieldId)1631cdf0e10cSrcweir sal_Bool lcl_GetFieldDataByIndex( const Reference<XDimensionsSupplier>& rSource,
1632cdf0e10cSrcweir                                 const Any& rOrient, SCSIZE nIndex, ScFieldIdentifier& rFieldId )
1633cdf0e10cSrcweir {
1634cdf0e10cSrcweir 	sal_Bool bOk = sal_False;
1635cdf0e10cSrcweir 	SCSIZE nPos = 0;
1636cdf0e10cSrcweir 	sal_Int32 nDimIndex = 0;
1637cdf0e10cSrcweir 
1638cdf0e10cSrcweir     Reference<XNameAccess> xDimsName(rSource->getDimensions());
1639cdf0e10cSrcweir     Reference<XIndexAccess> xIntDims(new ScNameToIndexAccess( xDimsName ));
1640cdf0e10cSrcweir 	sal_Int32 nIntCount = xIntDims->getCount();
1641cdf0e10cSrcweir     Reference<XPropertySet> xDim;
1642cdf0e10cSrcweir     if (rOrient.hasValue())
1643cdf0e10cSrcweir     {
1644cdf0e10cSrcweir         sal_Int32 i = 0;
1645cdf0e10cSrcweir         while (i < nIntCount && !bOk)
1646cdf0e10cSrcweir         {
1647cdf0e10cSrcweir             xDim.set(xIntDims->getByIndex(i), UNO_QUERY);
1648cdf0e10cSrcweir             if (xDim.is() && (xDim->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ORIENTAT))) == rOrient))
1649cdf0e10cSrcweir             {
1650cdf0e10cSrcweir                 if (nPos == nIndex)
1651cdf0e10cSrcweir                 {
1652cdf0e10cSrcweir                     bOk = sal_True;
1653cdf0e10cSrcweir                     nDimIndex = i;
1654cdf0e10cSrcweir                 }
1655cdf0e10cSrcweir                 else
1656cdf0e10cSrcweir                     ++nPos;
1657cdf0e10cSrcweir             }
1658cdf0e10cSrcweir             ++i;
1659cdf0e10cSrcweir         }
1660cdf0e10cSrcweir     }
1661cdf0e10cSrcweir     else
1662cdf0e10cSrcweir     {
1663cdf0e10cSrcweir         sal_Int32 i = 0;
1664cdf0e10cSrcweir         while (i < nIntCount && !bOk)
1665cdf0e10cSrcweir         {
1666cdf0e10cSrcweir             xDim.set(xIntDims->getByIndex(i), UNO_QUERY);
1667cdf0e10cSrcweir             if ( xDim.is() && !lcl_IsDuplicated( xDim ) )
1668cdf0e10cSrcweir             {
1669cdf0e10cSrcweir                 if (nPos == nIndex)
1670cdf0e10cSrcweir                 {
1671cdf0e10cSrcweir                     bOk = sal_True;
1672cdf0e10cSrcweir                     nDimIndex = i;
1673cdf0e10cSrcweir                 }
1674cdf0e10cSrcweir                 else
1675cdf0e10cSrcweir                     ++nPos;
1676cdf0e10cSrcweir             }
1677cdf0e10cSrcweir             ++i;
1678cdf0e10cSrcweir         }
1679cdf0e10cSrcweir     }
1680cdf0e10cSrcweir 
1681cdf0e10cSrcweir     if ( bOk )
1682cdf0e10cSrcweir     {
1683cdf0e10cSrcweir         xDim.set( xIntDims->getByIndex(nDimIndex), UNO_QUERY );
1684cdf0e10cSrcweir         Reference<XNamed> xDimName( xDim, UNO_QUERY );
1685cdf0e10cSrcweir         if ( xDimName.is() )
1686cdf0e10cSrcweir         {
1687cdf0e10cSrcweir             OUString sOriginalName( lcl_GetOriginalName( xDimName ) );
1688cdf0e10cSrcweir             rFieldId.maFieldName = sOriginalName;
1689cdf0e10cSrcweir             rFieldId.mbDataLayout = ScUnoHelpFunctions::GetBoolProperty( xDim,
1690cdf0e10cSrcweir                         OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ISDATALA)) );
1691cdf0e10cSrcweir 
1692cdf0e10cSrcweir             sal_Int32 nRepeat = 0;
1693cdf0e10cSrcweir             if ( rOrient.hasValue() && lcl_IsDuplicated( xDim ) )
1694cdf0e10cSrcweir             {
1695cdf0e10cSrcweir                 // find the repeat count
1696cdf0e10cSrcweir                 // (this relies on the original dimension always being before the duplicates)
1697cdf0e10cSrcweir 
1698cdf0e10cSrcweir                 Reference<XNamed> xPrevName;
1699cdf0e10cSrcweir                 for (sal_Int32 i = 0; i < nDimIndex; ++i)
1700cdf0e10cSrcweir                 {
1701cdf0e10cSrcweir                     xPrevName.set( xIntDims->getByIndex(i), UNO_QUERY );
1702cdf0e10cSrcweir                     if ( xPrevName.is() && lcl_GetOriginalName( xPrevName ) == sOriginalName )
1703cdf0e10cSrcweir                         ++nRepeat;
1704cdf0e10cSrcweir                 }
1705cdf0e10cSrcweir             }
1706cdf0e10cSrcweir             rFieldId.mnFieldIdx = nRepeat;
1707cdf0e10cSrcweir         }
1708cdf0e10cSrcweir         else
1709cdf0e10cSrcweir             bOk = sal_False;
1710cdf0e10cSrcweir     }
1711cdf0e10cSrcweir 
1712cdf0e10cSrcweir 	return bOk;
1713cdf0e10cSrcweir }
1714cdf0e10cSrcweir 
lcl_GetFieldDataByName(ScDPObject * pDPObj,const OUString & rFieldName,ScFieldIdentifier & rFieldId)1715cdf0e10cSrcweir sal_Bool lcl_GetFieldDataByName( ScDPObject* pDPObj, const OUString& rFieldName, ScFieldIdentifier& rFieldId )
1716cdf0e10cSrcweir {
1717cdf0e10cSrcweir     // "By name" is always the first match.
1718cdf0e10cSrcweir     // The name "Data" always refers to the data layout field.
1719cdf0e10cSrcweir     rFieldId.maFieldName = rFieldName;
1720cdf0e10cSrcweir     rFieldId.mnFieldIdx = 0;
1721cdf0e10cSrcweir     rFieldId.mbDataLayout = rFieldName.equalsAscii( SC_DATALAYOUT_NAME );
1722cdf0e10cSrcweir 
1723cdf0e10cSrcweir     pDPObj->GetSource();    // IsDimNameInUse doesn't update source data
1724cdf0e10cSrcweir 
1725cdf0e10cSrcweir     // check if the named field exists (not for data layout)
1726cdf0e10cSrcweir     return rFieldId.mbDataLayout || pDPObj->IsDimNameInUse( rFieldName );
1727cdf0e10cSrcweir }
1728cdf0e10cSrcweir 
1729cdf0e10cSrcweir // XDataPilotFields
1730cdf0e10cSrcweir 
GetObjectByIndex_Impl(sal_Int32 nIndex) const1731cdf0e10cSrcweir ScDataPilotFieldObj* ScDataPilotFieldsObj::GetObjectByIndex_Impl( sal_Int32 nIndex ) const
1732cdf0e10cSrcweir {
1733cdf0e10cSrcweir // TODO
1734cdf0e10cSrcweir     if (ScDPObject* pObj = GetDPObject())
1735cdf0e10cSrcweir     {
1736cdf0e10cSrcweir         ScFieldIdentifier aFieldId;
1737cdf0e10cSrcweir         if (lcl_GetFieldDataByIndex( pObj->GetSource(), maOrient, nIndex, aFieldId ))
1738cdf0e10cSrcweir             return new ScDataPilotFieldObj( mrParent, aFieldId, maOrient );
1739cdf0e10cSrcweir     }
1740cdf0e10cSrcweir     return 0;
1741cdf0e10cSrcweir }
1742cdf0e10cSrcweir 
GetObjectByName_Impl(const OUString & aName) const1743cdf0e10cSrcweir ScDataPilotFieldObj* ScDataPilotFieldsObj::GetObjectByName_Impl(const OUString& aName) const
1744cdf0e10cSrcweir {
1745cdf0e10cSrcweir     if (ScDPObject* pDPObj = GetDPObject())
1746cdf0e10cSrcweir     {
1747cdf0e10cSrcweir         ScFieldIdentifier aFieldId;
1748cdf0e10cSrcweir         if (lcl_GetFieldDataByName( pDPObj, aName, aFieldId ))
1749cdf0e10cSrcweir             return new ScDataPilotFieldObj( mrParent, aFieldId, maOrient );
1750cdf0e10cSrcweir     }
1751cdf0e10cSrcweir     return 0;
1752cdf0e10cSrcweir }
1753cdf0e10cSrcweir 
1754cdf0e10cSrcweir // XEnumerationAccess
1755cdf0e10cSrcweir 
createEnumeration()1756cdf0e10cSrcweir Reference<XEnumeration> SAL_CALL ScDataPilotFieldsObj::createEnumeration()
1757cdf0e10cSrcweir                                                     throw(RuntimeException)
1758cdf0e10cSrcweir {
1759cdf0e10cSrcweir 	ScUnoGuard aGuard;
1760cdf0e10cSrcweir     return new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DataPilotFieldsEnumeration")));
1761cdf0e10cSrcweir }
1762cdf0e10cSrcweir 
1763cdf0e10cSrcweir // XIndexAccess
1764cdf0e10cSrcweir 
getCount()1765cdf0e10cSrcweir sal_Int32 SAL_CALL ScDataPilotFieldsObj::getCount() throw(RuntimeException)
1766cdf0e10cSrcweir {
1767cdf0e10cSrcweir 	ScUnoGuard aGuard;
1768cdf0e10cSrcweir // TODO
1769cdf0e10cSrcweir     ScDPObject* pDPObj = GetDPObject();
1770cdf0e10cSrcweir     return pDPObj ? lcl_GetFieldCount( pDPObj->GetSource(), maOrient ) : 0;
1771cdf0e10cSrcweir }
1772cdf0e10cSrcweir 
getByIndex(sal_Int32 nIndex)1773cdf0e10cSrcweir Any SAL_CALL ScDataPilotFieldsObj::getByIndex( sal_Int32 nIndex )
1774cdf0e10cSrcweir         throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
1775cdf0e10cSrcweir {
1776cdf0e10cSrcweir 	ScUnoGuard aGuard;
1777cdf0e10cSrcweir     Reference< XPropertySet > xField( GetObjectByIndex_Impl( nIndex ) );
1778cdf0e10cSrcweir     if (!xField.is())
1779cdf0e10cSrcweir         throw IndexOutOfBoundsException();
1780cdf0e10cSrcweir     return Any( xField );
1781cdf0e10cSrcweir }
1782cdf0e10cSrcweir 
getElementType()1783cdf0e10cSrcweir uno::Type SAL_CALL ScDataPilotFieldsObj::getElementType() throw(RuntimeException)
1784cdf0e10cSrcweir {
1785cdf0e10cSrcweir 	ScUnoGuard aGuard;
1786cdf0e10cSrcweir     return getCppuType((Reference<XPropertySet>*)0);
1787cdf0e10cSrcweir }
1788cdf0e10cSrcweir 
hasElements()1789cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotFieldsObj::hasElements() throw(RuntimeException)
1790cdf0e10cSrcweir {
1791cdf0e10cSrcweir 	ScUnoGuard aGuard;
1792cdf0e10cSrcweir 	return ( getCount() != 0 );
1793cdf0e10cSrcweir }
1794cdf0e10cSrcweir 
getByName(const OUString & aName)1795cdf0e10cSrcweir Any SAL_CALL ScDataPilotFieldsObj::getByName( const OUString& aName )
1796cdf0e10cSrcweir         throw(NoSuchElementException, WrappedTargetException, RuntimeException)
1797cdf0e10cSrcweir {
1798cdf0e10cSrcweir 	ScUnoGuard aGuard;
1799cdf0e10cSrcweir     Reference<XPropertySet> xField(GetObjectByName_Impl(aName));
1800cdf0e10cSrcweir     if (!xField.is())
1801cdf0e10cSrcweir         throw NoSuchElementException();
1802cdf0e10cSrcweir     return Any( xField );
1803cdf0e10cSrcweir }
1804cdf0e10cSrcweir 
getElementNames()1805cdf0e10cSrcweir Sequence<OUString> SAL_CALL ScDataPilotFieldsObj::getElementNames()
1806cdf0e10cSrcweir                                                 throw(RuntimeException)
1807cdf0e10cSrcweir {
1808cdf0e10cSrcweir 	ScUnoGuard aGuard;
1809cdf0e10cSrcweir // TODO
1810cdf0e10cSrcweir     if (ScDPObject* pDPObj = GetDPObject())
1811cdf0e10cSrcweir     {
1812cdf0e10cSrcweir         Sequence< OUString > aSeq( lcl_GetFieldCount( pDPObj->GetSource(), maOrient ) );
1813cdf0e10cSrcweir         OUString* pAry = aSeq.getArray();
1814cdf0e10cSrcweir         const List& rDimensions = pDPObj->GetSaveData()->GetDimensions();
1815cdf0e10cSrcweir         sal_Int32 nDimCount = rDimensions.Count();
1816cdf0e10cSrcweir 	    for (sal_Int32 nDim = 0; nDim < nDimCount; nDim++)
1817cdf0e10cSrcweir 	    {
1818cdf0e10cSrcweir             ScDPSaveDimension* pDim = (ScDPSaveDimension*)rDimensions.GetObject(nDim);
1819cdf0e10cSrcweir             if(maOrient.hasValue() && (pDim->GetOrientation() == maOrient.get< DataPilotFieldOrientation >()))
1820cdf0e10cSrcweir             {
1821cdf0e10cSrcweir                 *pAry = pDim->GetName();
1822cdf0e10cSrcweir                 ++pAry;
1823cdf0e10cSrcweir             }
1824cdf0e10cSrcweir         }
1825cdf0e10cSrcweir     	return aSeq;
1826cdf0e10cSrcweir     }
1827cdf0e10cSrcweir     return Sequence<OUString>();
1828cdf0e10cSrcweir }
1829cdf0e10cSrcweir 
hasByName(const OUString & aName)1830cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotFieldsObj::hasByName( const OUString& aName )
1831cdf0e10cSrcweir                                         throw(RuntimeException)
1832cdf0e10cSrcweir {
1833cdf0e10cSrcweir 	ScUnoGuard aGuard;
1834cdf0e10cSrcweir 
1835cdf0e10cSrcweir 	return GetObjectByName_Impl(aName) != NULL;
1836cdf0e10cSrcweir }
1837cdf0e10cSrcweir 
1838cdf0e10cSrcweir //------------------------------------------------------------------------
1839cdf0e10cSrcweir 
ScDataPilotFieldObj(ScDataPilotDescriptorBase & rParent,const ScFieldIdentifier & rFieldId)1840cdf0e10cSrcweir ScDataPilotFieldObj::ScDataPilotFieldObj(
1841cdf0e10cSrcweir         ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId ) :
1842cdf0e10cSrcweir     ScDataPilotChildObjBase( rParent, rFieldId ),
1843cdf0e10cSrcweir     maPropSet( lcl_GetDataPilotFieldMap() )
1844cdf0e10cSrcweir {
1845cdf0e10cSrcweir }
1846cdf0e10cSrcweir 
ScDataPilotFieldObj(ScDataPilotDescriptorBase & rParent,const ScFieldIdentifier & rFieldId,const Any & rOrient)1847cdf0e10cSrcweir ScDataPilotFieldObj::ScDataPilotFieldObj( ScDataPilotDescriptorBase& rParent,
1848cdf0e10cSrcweir         const ScFieldIdentifier& rFieldId, const Any& rOrient ) :
1849cdf0e10cSrcweir     ScDataPilotChildObjBase( rParent, rFieldId ),
1850cdf0e10cSrcweir     maPropSet( lcl_GetDataPilotFieldMap() ),
1851cdf0e10cSrcweir     maOrient( rOrient )
1852cdf0e10cSrcweir {
1853cdf0e10cSrcweir }
1854cdf0e10cSrcweir 
~ScDataPilotFieldObj()1855cdf0e10cSrcweir ScDataPilotFieldObj::~ScDataPilotFieldObj()
1856cdf0e10cSrcweir {
1857cdf0e10cSrcweir }
1858cdf0e10cSrcweir 
1859cdf0e10cSrcweir // XNamed
1860cdf0e10cSrcweir 
getName()1861cdf0e10cSrcweir OUString SAL_CALL ScDataPilotFieldObj::getName() throw(RuntimeException)
1862cdf0e10cSrcweir {
1863cdf0e10cSrcweir 	ScUnoGuard aGuard;
1864cdf0e10cSrcweir     OUString aName;
1865cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension() )
1866cdf0e10cSrcweir     {
1867cdf0e10cSrcweir         if( pDim->IsDataLayout() )
1868cdf0e10cSrcweir             aName = OUString( RTL_CONSTASCII_USTRINGPARAM( SC_DATALAYOUT_NAME ) );
1869cdf0e10cSrcweir         else
1870cdf0e10cSrcweir         {
1871cdf0e10cSrcweir             const rtl::OUString* pLayoutName = pDim->GetLayoutName();
1872cdf0e10cSrcweir             if (pLayoutName)
1873cdf0e10cSrcweir                 aName = *pLayoutName;
1874cdf0e10cSrcweir             else
1875cdf0e10cSrcweir                 aName = pDim->GetName();
1876cdf0e10cSrcweir         }                                                                }
1877cdf0e10cSrcweir     return aName;
1878cdf0e10cSrcweir }
1879cdf0e10cSrcweir 
setName(const OUString & rName)1880cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldObj::setName( const OUString& rName ) throw(RuntimeException)
1881cdf0e10cSrcweir {
1882cdf0e10cSrcweir 	ScUnoGuard aGuard;
1883cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
1884cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension( &pDPObj );
1885cdf0e10cSrcweir     if( pDim && !pDim->IsDataLayout() )
1886cdf0e10cSrcweir     {
1887cdf0e10cSrcweir         String aName( rName );
1888cdf0e10cSrcweir         pDim->SetLayoutName(aName);
1889cdf0e10cSrcweir         SetDPObject( pDPObj );
1890cdf0e10cSrcweir     }
1891cdf0e10cSrcweir }
1892cdf0e10cSrcweir 
1893cdf0e10cSrcweir // XPropertySet
1894cdf0e10cSrcweir 
getPropertySetInfo()1895cdf0e10cSrcweir Reference<XPropertySetInfo> SAL_CALL ScDataPilotFieldObj::getPropertySetInfo()
1896cdf0e10cSrcweir                                                         throw(RuntimeException)
1897cdf0e10cSrcweir {
1898cdf0e10cSrcweir 	ScUnoGuard aGuard;
1899cdf0e10cSrcweir     static Reference<XPropertySetInfo> aRef(
1900cdf0e10cSrcweir         new SfxItemPropertySetInfo( maPropSet.getPropertyMap() ));
1901cdf0e10cSrcweir 	return aRef;
1902cdf0e10cSrcweir }
1903cdf0e10cSrcweir 
setPropertyValue(const OUString & aPropertyName,const Any & aValue)1904cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldObj::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
1905cdf0e10cSrcweir         throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
1906cdf0e10cSrcweir {
1907cdf0e10cSrcweir 	ScUnoGuard aGuard;
1908cdf0e10cSrcweir 	String aNameString(aPropertyName);
1909cdf0e10cSrcweir 	if ( aNameString.EqualsAscii( SC_UNONAME_FUNCTION ) )
1910cdf0e10cSrcweir 	{
1911cdf0e10cSrcweir         // #i109350# use GetEnumFromAny because it also allows sal_Int32
1912cdf0e10cSrcweir         GeneralFunction eFunction = (GeneralFunction)
1913cdf0e10cSrcweir                             ScUnoHelpFunctions::GetEnumFromAny( aValue );
1914cdf0e10cSrcweir         setFunction( eFunction );
1915cdf0e10cSrcweir 	}
1916cdf0e10cSrcweir     else if ( aNameString.EqualsAscii( SC_UNONAME_SUBTOTALS ) )
1917cdf0e10cSrcweir     {
1918cdf0e10cSrcweir         Sequence< GeneralFunction > aSubtotals;
1919cdf0e10cSrcweir         if( aValue >>= aSubtotals )
1920cdf0e10cSrcweir             setSubtotals( aSubtotals );
1921cdf0e10cSrcweir     }
1922cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_ORIENT ) )
1923cdf0e10cSrcweir 	{
1924cdf0e10cSrcweir 		//!	test for correct enum type?
1925cdf0e10cSrcweir         DataPilotFieldOrientation eOrient = (DataPilotFieldOrientation)
1926cdf0e10cSrcweir 							ScUnoHelpFunctions::GetEnumFromAny( aValue );
1927cdf0e10cSrcweir 		setOrientation( eOrient );
1928cdf0e10cSrcweir 	}
1929cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_SELPAGE ) )
1930cdf0e10cSrcweir     {
1931cdf0e10cSrcweir         OUString sCurrentPage;
1932cdf0e10cSrcweir         if (aValue >>= sCurrentPage)
1933cdf0e10cSrcweir             setCurrentPage(sCurrentPage);
1934cdf0e10cSrcweir     }
1935cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_USESELPAGE ) )
1936cdf0e10cSrcweir     {
1937cdf0e10cSrcweir         setUseCurrentPage(cppu::any2bool(aValue));
1938cdf0e10cSrcweir     }
1939cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASAUTOSHOW ) )
1940cdf0e10cSrcweir     {
1941cdf0e10cSrcweir         if (!cppu::any2bool(aValue))
1942cdf0e10cSrcweir             setAutoShowInfo(NULL);
1943cdf0e10cSrcweir     }
1944cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_AUTOSHOW ) )
1945cdf0e10cSrcweir     {
1946cdf0e10cSrcweir         DataPilotFieldAutoShowInfo aInfo;
1947cdf0e10cSrcweir         if (aValue >>= aInfo)
1948cdf0e10cSrcweir             setAutoShowInfo(&aInfo);
1949cdf0e10cSrcweir     }
1950cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASLAYOUTINFO ) )
1951cdf0e10cSrcweir     {
1952cdf0e10cSrcweir         if (!cppu::any2bool(aValue))
1953cdf0e10cSrcweir             setLayoutInfo(NULL);
1954cdf0e10cSrcweir     }
1955cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_LAYOUTINFO ) )
1956cdf0e10cSrcweir     {
1957cdf0e10cSrcweir         DataPilotFieldLayoutInfo aInfo;
1958cdf0e10cSrcweir         if (aValue >>= aInfo)
1959cdf0e10cSrcweir             setLayoutInfo(&aInfo);
1960cdf0e10cSrcweir     }
1961cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASREFERENCE ) )
1962cdf0e10cSrcweir     {
1963cdf0e10cSrcweir         if (!cppu::any2bool(aValue))
1964cdf0e10cSrcweir             setReference(NULL);
1965cdf0e10cSrcweir     }
1966cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_REFERENCE ) )
1967cdf0e10cSrcweir     {
1968cdf0e10cSrcweir         DataPilotFieldReference aRef;
1969cdf0e10cSrcweir         if (aValue >>= aRef)
1970cdf0e10cSrcweir             setReference(&aRef);
1971cdf0e10cSrcweir     }
1972cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASSORTINFO ) )
1973cdf0e10cSrcweir     {
1974cdf0e10cSrcweir         if (!cppu::any2bool(aValue))
1975cdf0e10cSrcweir             setSortInfo(NULL);
1976cdf0e10cSrcweir     }
1977cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_SORTINFO ) )
1978cdf0e10cSrcweir     {
1979cdf0e10cSrcweir         DataPilotFieldSortInfo aInfo;
1980cdf0e10cSrcweir         if (aValue >>= aInfo)
1981cdf0e10cSrcweir             setSortInfo(&aInfo);
1982cdf0e10cSrcweir     }
1983cdf0e10cSrcweir     else if ( aNameString.EqualsAscii( SC_UNONAME_ISGROUP ) )
1984cdf0e10cSrcweir     {
1985cdf0e10cSrcweir         if (!cppu::any2bool(aValue))
1986cdf0e10cSrcweir             setGroupInfo(NULL);
1987cdf0e10cSrcweir     }
1988cdf0e10cSrcweir     else if ( aNameString.EqualsAscii( SC_UNONAME_GROUPINFO ) )
1989cdf0e10cSrcweir     {
1990cdf0e10cSrcweir         DataPilotFieldGroupInfo aInfo;
1991cdf0e10cSrcweir         if (aValue >>= aInfo)
1992cdf0e10cSrcweir             setGroupInfo(&aInfo);
1993cdf0e10cSrcweir     }
1994cdf0e10cSrcweir     else if ( aNameString.EqualsAscii( SC_UNONAME_SHOWEMPTY ) )
1995cdf0e10cSrcweir     {
1996cdf0e10cSrcweir         setShowEmpty(cppu::any2bool(aValue));
1997cdf0e10cSrcweir     }
1998cdf0e10cSrcweir }
1999cdf0e10cSrcweir 
getPropertyValue(const OUString & aPropertyName)2000cdf0e10cSrcweir Any SAL_CALL ScDataPilotFieldObj::getPropertyValue( const OUString& aPropertyName )
2001cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
2002cdf0e10cSrcweir {
2003cdf0e10cSrcweir 	ScUnoGuard aGuard;
2004cdf0e10cSrcweir 	String aNameString(aPropertyName);
2005cdf0e10cSrcweir     Any aRet;
2006cdf0e10cSrcweir 
2007cdf0e10cSrcweir 	if ( aNameString.EqualsAscii( SC_UNONAME_FUNCTION ) )
2008cdf0e10cSrcweir 		aRet <<= getFunction();
2009cdf0e10cSrcweir     else if ( aNameString.EqualsAscii( SC_UNONAME_SUBTOTALS ) )
2010cdf0e10cSrcweir         aRet <<= getSubtotals();
2011cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_ORIENT ) )
2012cdf0e10cSrcweir 		aRet <<= getOrientation();
2013cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_SELPAGE ) )
2014cdf0e10cSrcweir         aRet <<= getCurrentPage();
2015cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_USESELPAGE ) )
2016cdf0e10cSrcweir         aRet <<= getUseCurrentPage();
2017cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASAUTOSHOW ) )
2018cdf0e10cSrcweir         aRet = ::cppu::bool2any(getAutoShowInfo() != NULL);
2019cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_AUTOSHOW ) )
2020cdf0e10cSrcweir     {
2021cdf0e10cSrcweir         const DataPilotFieldAutoShowInfo* pInfo = getAutoShowInfo();
2022cdf0e10cSrcweir         if (pInfo)
2023cdf0e10cSrcweir             aRet <<= DataPilotFieldAutoShowInfo(*pInfo);
2024cdf0e10cSrcweir     }
2025cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASLAYOUTINFO ) )
2026cdf0e10cSrcweir         aRet = ::cppu::bool2any(getLayoutInfo() != NULL);
2027cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_LAYOUTINFO ) )
2028cdf0e10cSrcweir     {
2029cdf0e10cSrcweir         const DataPilotFieldLayoutInfo* pInfo = getLayoutInfo();
2030cdf0e10cSrcweir         if (pInfo)
2031cdf0e10cSrcweir             aRet <<= DataPilotFieldLayoutInfo(*pInfo);
2032cdf0e10cSrcweir     }
2033cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASREFERENCE ) )
2034cdf0e10cSrcweir         aRet = ::cppu::bool2any(getReference() != NULL);
2035cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_REFERENCE ) )
2036cdf0e10cSrcweir     {
2037cdf0e10cSrcweir         const DataPilotFieldReference* pRef = getReference();
2038cdf0e10cSrcweir         if (pRef)
2039cdf0e10cSrcweir             aRet <<= DataPilotFieldReference(*pRef);
2040cdf0e10cSrcweir     }
2041cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_HASSORTINFO ) )
2042cdf0e10cSrcweir         aRet = ::cppu::bool2any(getSortInfo() != NULL);
2043cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_SORTINFO ) )
2044cdf0e10cSrcweir     {
2045cdf0e10cSrcweir         const DataPilotFieldSortInfo* pInfo = getSortInfo();
2046cdf0e10cSrcweir         if (pInfo)
2047cdf0e10cSrcweir             aRet <<= DataPilotFieldSortInfo(*pInfo);
2048cdf0e10cSrcweir     }
2049cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_ISGROUP ) )
2050cdf0e10cSrcweir         aRet = ::cppu::bool2any(hasGroupInfo());
2051cdf0e10cSrcweir 	else if ( aNameString.EqualsAscii( SC_UNONAME_GROUPINFO ) )
2052cdf0e10cSrcweir     {
2053cdf0e10cSrcweir         aRet <<= getGroupInfo();
2054cdf0e10cSrcweir     }
2055cdf0e10cSrcweir     else if ( aNameString.EqualsAscii( SC_UNONAME_SHOWEMPTY ) )
2056cdf0e10cSrcweir         aRet <<= getShowEmpty();
2057cdf0e10cSrcweir 
2058cdf0e10cSrcweir 	return aRet;
2059cdf0e10cSrcweir }
2060cdf0e10cSrcweir 
2061cdf0e10cSrcweir // XDatePilotField
2062cdf0e10cSrcweir 
getItems()2063cdf0e10cSrcweir Reference<XIndexAccess> SAL_CALL ScDataPilotFieldObj::getItems()
2064cdf0e10cSrcweir                 throw (RuntimeException)
2065cdf0e10cSrcweir {
2066cdf0e10cSrcweir     ScUnoGuard aGuard;
2067cdf0e10cSrcweir     if (!mxItems.is())
2068cdf0e10cSrcweir         mxItems.set( new ScDataPilotItemsObj( mrParent, maFieldId ) );
2069cdf0e10cSrcweir     return mxItems;
2070cdf0e10cSrcweir }
2071cdf0e10cSrcweir 
SC_IMPL_DUMMY_PROPERTY_LISTENER(ScDataPilotFieldObj)2072cdf0e10cSrcweir SC_IMPL_DUMMY_PROPERTY_LISTENER( ScDataPilotFieldObj )
2073cdf0e10cSrcweir 
2074cdf0e10cSrcweir DataPilotFieldOrientation ScDataPilotFieldObj::getOrientation() const
2075cdf0e10cSrcweir {
2076cdf0e10cSrcweir     ScUnoGuard aGuard;
2077cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2078cdf0e10cSrcweir     return pDim ? static_cast< DataPilotFieldOrientation >( pDim->GetOrientation() ) : DataPilotFieldOrientation_HIDDEN;
2079cdf0e10cSrcweir }
2080cdf0e10cSrcweir 
setOrientation(DataPilotFieldOrientation eNew)2081cdf0e10cSrcweir void ScDataPilotFieldObj::setOrientation(DataPilotFieldOrientation eNew)
2082cdf0e10cSrcweir {
2083cdf0e10cSrcweir     ScUnoGuard aGuard;
2084cdf0e10cSrcweir     if (maOrient.hasValue() && (eNew == maOrient.get< DataPilotFieldOrientation >()))
2085cdf0e10cSrcweir         return;
2086cdf0e10cSrcweir 
2087cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2088cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2089cdf0e10cSrcweir     {
2090cdf0e10cSrcweir         ScDPSaveData* pSaveData = pDPObj->GetSaveData();
2091cdf0e10cSrcweir 
2092cdf0e10cSrcweir         /*  If the field was taken from getDataPilotFields(), don't reset the
2093cdf0e10cSrcweir             orientation for an existing use, but create a duplicated field
2094cdf0e10cSrcweir             instead (for "Data" orientation only). */
2095cdf0e10cSrcweir         if ( !maOrient.hasValue() && !maFieldId.mbDataLayout &&
2096cdf0e10cSrcweir              (pDim->GetOrientation() != DataPilotFieldOrientation_HIDDEN) &&
2097cdf0e10cSrcweir              (eNew == DataPilotFieldOrientation_DATA) )
2098cdf0e10cSrcweir         {
2099cdf0e10cSrcweir 
2100cdf0e10cSrcweir             ScDPSaveDimension* pNewDim = 0;
2101cdf0e10cSrcweir 
2102cdf0e10cSrcweir             // look for existing duplicate with orientation "hidden"
2103cdf0e10cSrcweir 
2104cdf0e10cSrcweir             String aNameStr( maFieldId.maFieldName );
2105cdf0e10cSrcweir             const List& rDimensions = pSaveData->GetDimensions();
2106cdf0e10cSrcweir             sal_Int32 nDimCount = rDimensions.Count();
2107cdf0e10cSrcweir             sal_Int32 nFound = 0;
2108cdf0e10cSrcweir             for ( sal_Int32 nDim = 0; nDim < nDimCount && !pNewDim; nDim++ )
2109cdf0e10cSrcweir             {
2110cdf0e10cSrcweir                 ScDPSaveDimension* pOneDim = static_cast<ScDPSaveDimension*>(rDimensions.GetObject(nDim));
2111cdf0e10cSrcweir                 if ( !pOneDim->IsDataLayout() && (pOneDim->GetName() == aNameStr) )
2112cdf0e10cSrcweir                 {
2113cdf0e10cSrcweir                     if ( pOneDim->GetOrientation() == DataPilotFieldOrientation_HIDDEN )
2114cdf0e10cSrcweir                         pNewDim = pOneDim;      // use this one
2115cdf0e10cSrcweir                     else
2116cdf0e10cSrcweir                         ++nFound;               // count existing non-hidden occurences
2117cdf0e10cSrcweir                 }
2118cdf0e10cSrcweir             }
2119cdf0e10cSrcweir 
2120cdf0e10cSrcweir             if ( !pNewDim )     // if none found, create a new duplicated dimension
2121cdf0e10cSrcweir                 pNewDim = &pSaveData->DuplicateDimension( *pDim );
2122cdf0e10cSrcweir 
2123cdf0e10cSrcweir             maFieldId.mnFieldIdx = nFound;      // keep accessing the new one
2124cdf0e10cSrcweir             pDim = pNewDim;
2125cdf0e10cSrcweir         }
2126cdf0e10cSrcweir 
2127cdf0e10cSrcweir         pDim->SetOrientation(sal::static_int_cast<sal_uInt16>(eNew));
2128cdf0e10cSrcweir 
2129cdf0e10cSrcweir         // move changed field behind all other fields (make it the last field in dimension)
2130cdf0e10cSrcweir         pSaveData->SetPosition( pDim, pSaveData->GetDimensions().Count() );
2131cdf0e10cSrcweir 
2132cdf0e10cSrcweir         SetDPObject( pDPObj );
2133cdf0e10cSrcweir 
2134cdf0e10cSrcweir         maOrient <<= eNew;   // modifying the same object's orientation again doesn't create another duplicate
2135cdf0e10cSrcweir     }
2136cdf0e10cSrcweir }
2137cdf0e10cSrcweir 
getFunction() const2138cdf0e10cSrcweir GeneralFunction ScDataPilotFieldObj::getFunction() const
2139cdf0e10cSrcweir {
2140cdf0e10cSrcweir     ScUnoGuard aGuard;
2141cdf0e10cSrcweir     GeneralFunction eRet = GeneralFunction_NONE;
2142cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension() )
2143cdf0e10cSrcweir     {
2144cdf0e10cSrcweir         if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA )
2145cdf0e10cSrcweir         {
2146cdf0e10cSrcweir             // for non-data fields, property Function is the subtotals
2147cdf0e10cSrcweir             long nSubCount = pDim->GetSubTotalsCount();
2148cdf0e10cSrcweir             if ( nSubCount > 0 )
2149cdf0e10cSrcweir                 eRet = (GeneralFunction)pDim->GetSubTotalFunc(0);    // always use the first one
2150cdf0e10cSrcweir             // else keep NONE
2151cdf0e10cSrcweir         }
2152cdf0e10cSrcweir         else
2153cdf0e10cSrcweir             eRet = (GeneralFunction)pDim->GetFunction();
2154cdf0e10cSrcweir     }
2155cdf0e10cSrcweir     return eRet;
2156cdf0e10cSrcweir }
2157cdf0e10cSrcweir 
setFunction(GeneralFunction eNewFunc)2158cdf0e10cSrcweir void ScDataPilotFieldObj::setFunction(GeneralFunction eNewFunc)
2159cdf0e10cSrcweir {
2160cdf0e10cSrcweir     ScUnoGuard aGuard;
2161cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2162cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2163cdf0e10cSrcweir     {
2164cdf0e10cSrcweir         if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA )
2165cdf0e10cSrcweir         {
2166cdf0e10cSrcweir             // for non-data fields, property Function is the subtotals
2167cdf0e10cSrcweir             if ( eNewFunc == GeneralFunction_NONE )
2168cdf0e10cSrcweir                 pDim->SetSubTotals( 0, NULL );
2169cdf0e10cSrcweir             else
2170cdf0e10cSrcweir             {
2171cdf0e10cSrcweir                 sal_uInt16 nFunc = sal::static_int_cast<sal_uInt16>( eNewFunc );
2172cdf0e10cSrcweir                 pDim->SetSubTotals( 1, &nFunc );
2173cdf0e10cSrcweir             }
2174cdf0e10cSrcweir         }
2175cdf0e10cSrcweir         else
2176cdf0e10cSrcweir             pDim->SetFunction( sal::static_int_cast<sal_uInt16>( eNewFunc ) );
2177cdf0e10cSrcweir         SetDPObject( pDPObj );
2178cdf0e10cSrcweir     }
2179cdf0e10cSrcweir }
2180cdf0e10cSrcweir 
getSubtotals() const2181cdf0e10cSrcweir Sequence< GeneralFunction > ScDataPilotFieldObj::getSubtotals() const
2182cdf0e10cSrcweir {
2183cdf0e10cSrcweir     ScUnoGuard aGuard;
2184cdf0e10cSrcweir     Sequence< GeneralFunction > aRet;
2185cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension() )
2186cdf0e10cSrcweir     {
2187cdf0e10cSrcweir         if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA )
2188cdf0e10cSrcweir         {
2189cdf0e10cSrcweir             // for non-data fields, property Functions is the sequence of subtotals
2190cdf0e10cSrcweir             sal_Int32 nCount = static_cast< sal_Int32 >( pDim->GetSubTotalsCount() );
2191cdf0e10cSrcweir             if ( nCount > 0 )
2192cdf0e10cSrcweir             {
2193cdf0e10cSrcweir                 aRet.realloc( nCount );
2194cdf0e10cSrcweir                 for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx )
2195cdf0e10cSrcweir                     aRet[ nIdx ] = (GeneralFunction)pDim->GetSubTotalFunc( nIdx );
2196cdf0e10cSrcweir             }
2197cdf0e10cSrcweir         }
2198cdf0e10cSrcweir     }
2199cdf0e10cSrcweir     return aRet;
2200cdf0e10cSrcweir }
2201cdf0e10cSrcweir 
setSubtotals(const Sequence<GeneralFunction> & rSubtotals)2202cdf0e10cSrcweir void ScDataPilotFieldObj::setSubtotals( const Sequence< GeneralFunction >& rSubtotals )
2203cdf0e10cSrcweir {
2204cdf0e10cSrcweir     ScUnoGuard aGuard;
2205cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2206cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2207cdf0e10cSrcweir     {
2208cdf0e10cSrcweir         if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA )
2209cdf0e10cSrcweir         {
2210cdf0e10cSrcweir             sal_Int32 nCount = rSubtotals.getLength();
2211cdf0e10cSrcweir             if( nCount == 1 )
2212cdf0e10cSrcweir             {
2213cdf0e10cSrcweir                 // count 1: all values are allowed (including NONE and AUTO)
2214cdf0e10cSrcweir                 if( rSubtotals[ 0 ] == GeneralFunction_NONE )
2215cdf0e10cSrcweir                     pDim->SetSubTotals( 0, NULL );
2216cdf0e10cSrcweir                 else
2217cdf0e10cSrcweir                 {
2218cdf0e10cSrcweir                     sal_uInt16 nFunc = sal::static_int_cast<sal_uInt16>( rSubtotals[ 0 ] );
2219cdf0e10cSrcweir                     pDim->SetSubTotals( 1, &nFunc );
2220cdf0e10cSrcweir                 }
2221cdf0e10cSrcweir             }
2222cdf0e10cSrcweir             else if( nCount > 1 )
2223cdf0e10cSrcweir             {
2224cdf0e10cSrcweir                 // set multiple functions, ignore NONE and AUTO in this case
2225cdf0e10cSrcweir                 ::std::vector< sal_uInt16 > aSubt;
2226cdf0e10cSrcweir                 for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx )
2227cdf0e10cSrcweir                 {
2228cdf0e10cSrcweir                     GeneralFunction eFunc = rSubtotals[ nIdx ];
2229cdf0e10cSrcweir                     if( (eFunc != GeneralFunction_NONE) && (eFunc != GeneralFunction_AUTO) )
2230cdf0e10cSrcweir                     {
2231cdf0e10cSrcweir                         // do not insert functions twice
2232cdf0e10cSrcweir                         sal_uInt16 nFunc = static_cast< sal_uInt16 >( eFunc );
2233cdf0e10cSrcweir                         if( ::std::find( aSubt.begin(), aSubt.end(), nFunc ) == aSubt.end() )
2234cdf0e10cSrcweir                             aSubt.push_back( nFunc );
2235cdf0e10cSrcweir                     }
2236cdf0e10cSrcweir                 }
2237cdf0e10cSrcweir                 // set values from vector to ScDPSaveDimension
2238cdf0e10cSrcweir                 if ( aSubt.empty() )
2239cdf0e10cSrcweir                     pDim->SetSubTotals( 0, NULL );
2240cdf0e10cSrcweir                 else
2241cdf0e10cSrcweir                     pDim->SetSubTotals( static_cast< long >( aSubt.size() ), &aSubt.front() );
2242cdf0e10cSrcweir             }
2243cdf0e10cSrcweir         }
2244cdf0e10cSrcweir         SetDPObject( pDPObj );
2245cdf0e10cSrcweir     }
2246cdf0e10cSrcweir }
2247cdf0e10cSrcweir 
getCurrentPage() const2248cdf0e10cSrcweir OUString ScDataPilotFieldObj::getCurrentPage() const
2249cdf0e10cSrcweir {
2250cdf0e10cSrcweir     ScUnoGuard aGuard;
2251cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2252cdf0e10cSrcweir     if( pDim && pDim->HasCurrentPage() )
2253cdf0e10cSrcweir         return pDim->GetCurrentPage();
2254cdf0e10cSrcweir     return OUString();
2255cdf0e10cSrcweir }
2256cdf0e10cSrcweir 
setCurrentPage(const OUString & rPage)2257cdf0e10cSrcweir void ScDataPilotFieldObj::setCurrentPage( const OUString& rPage )
2258cdf0e10cSrcweir {
2259cdf0e10cSrcweir     ScUnoGuard aGuard;
2260cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2261cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2262cdf0e10cSrcweir     {
2263cdf0e10cSrcweir         String aPage( rPage );
2264cdf0e10cSrcweir         pDim->SetCurrentPage( &aPage );
2265cdf0e10cSrcweir         SetDPObject( pDPObj );
2266cdf0e10cSrcweir     }
2267cdf0e10cSrcweir }
2268cdf0e10cSrcweir 
getUseCurrentPage() const2269cdf0e10cSrcweir sal_Bool ScDataPilotFieldObj::getUseCurrentPage() const
2270cdf0e10cSrcweir {
2271cdf0e10cSrcweir     ScUnoGuard aGuard;
2272cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2273cdf0e10cSrcweir     return pDim && pDim->HasCurrentPage();
2274cdf0e10cSrcweir }
2275cdf0e10cSrcweir 
setUseCurrentPage(sal_Bool bUse)2276cdf0e10cSrcweir void ScDataPilotFieldObj::setUseCurrentPage( sal_Bool bUse )
2277cdf0e10cSrcweir {
2278cdf0e10cSrcweir     ScUnoGuard aGuard;
2279cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2280cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2281cdf0e10cSrcweir     {
2282cdf0e10cSrcweir         if( bUse )
2283cdf0e10cSrcweir         {
2284cdf0e10cSrcweir             /*  It is somehow useless to set the property "HasSelectedPage" to
2285cdf0e10cSrcweir                 true, because it is still needed to set an explicit page name. */
2286cdf0e10cSrcweir             if( !pDim->HasCurrentPage() )
2287cdf0e10cSrcweir             {
2288cdf0e10cSrcweir                 String aPage;
2289cdf0e10cSrcweir                 pDim->SetCurrentPage( &aPage );
2290cdf0e10cSrcweir             }
2291cdf0e10cSrcweir         }
2292cdf0e10cSrcweir         else
2293cdf0e10cSrcweir             pDim->SetCurrentPage( 0 );
2294cdf0e10cSrcweir         SetDPObject( pDPObj );
2295cdf0e10cSrcweir     }
2296cdf0e10cSrcweir }
2297cdf0e10cSrcweir 
getAutoShowInfo()2298cdf0e10cSrcweir const DataPilotFieldAutoShowInfo* ScDataPilotFieldObj::getAutoShowInfo()
2299cdf0e10cSrcweir {
2300cdf0e10cSrcweir     ScUnoGuard aGuard;
2301cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2302cdf0e10cSrcweir     return pDim ? pDim->GetAutoShowInfo() : 0;
2303cdf0e10cSrcweir }
2304cdf0e10cSrcweir 
setAutoShowInfo(const DataPilotFieldAutoShowInfo * pInfo)2305cdf0e10cSrcweir void ScDataPilotFieldObj::setAutoShowInfo( const DataPilotFieldAutoShowInfo* pInfo )
2306cdf0e10cSrcweir {
2307cdf0e10cSrcweir     ScUnoGuard aGuard;
2308cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2309cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2310cdf0e10cSrcweir     {
2311cdf0e10cSrcweir         pDim->SetAutoShowInfo( pInfo );
2312cdf0e10cSrcweir         SetDPObject( pDPObj );
2313cdf0e10cSrcweir     }
2314cdf0e10cSrcweir }
2315cdf0e10cSrcweir 
getLayoutInfo()2316cdf0e10cSrcweir const DataPilotFieldLayoutInfo* ScDataPilotFieldObj::getLayoutInfo()
2317cdf0e10cSrcweir {
2318cdf0e10cSrcweir     ScUnoGuard aGuard;
2319cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2320cdf0e10cSrcweir     return pDim ? pDim->GetLayoutInfo() : 0;
2321cdf0e10cSrcweir }
2322cdf0e10cSrcweir 
setLayoutInfo(const DataPilotFieldLayoutInfo * pInfo)2323cdf0e10cSrcweir void ScDataPilotFieldObj::setLayoutInfo( const DataPilotFieldLayoutInfo* pInfo )
2324cdf0e10cSrcweir {
2325cdf0e10cSrcweir     ScUnoGuard aGuard;
2326cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2327cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2328cdf0e10cSrcweir     {
2329cdf0e10cSrcweir         pDim->SetLayoutInfo( pInfo );
2330cdf0e10cSrcweir         SetDPObject( pDPObj );
2331cdf0e10cSrcweir     }
2332cdf0e10cSrcweir }
2333cdf0e10cSrcweir 
getReference()2334cdf0e10cSrcweir const DataPilotFieldReference* ScDataPilotFieldObj::getReference()
2335cdf0e10cSrcweir {
2336cdf0e10cSrcweir     ScUnoGuard aGuard;
2337cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2338cdf0e10cSrcweir     return pDim ? pDim->GetReferenceValue() : 0;
2339cdf0e10cSrcweir }
2340cdf0e10cSrcweir 
setReference(const DataPilotFieldReference * pInfo)2341cdf0e10cSrcweir void ScDataPilotFieldObj::setReference( const DataPilotFieldReference* pInfo )
2342cdf0e10cSrcweir {
2343cdf0e10cSrcweir     ScUnoGuard aGuard;
2344cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2345cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2346cdf0e10cSrcweir     {
2347cdf0e10cSrcweir         pDim->SetReferenceValue( pInfo );
2348cdf0e10cSrcweir         SetDPObject( pDPObj );
2349cdf0e10cSrcweir     }
2350cdf0e10cSrcweir }
2351cdf0e10cSrcweir 
getSortInfo()2352cdf0e10cSrcweir const DataPilotFieldSortInfo* ScDataPilotFieldObj::getSortInfo()
2353cdf0e10cSrcweir {
2354cdf0e10cSrcweir     ScUnoGuard aGuard;
2355cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2356cdf0e10cSrcweir     return pDim ? pDim->GetSortInfo() : 0;
2357cdf0e10cSrcweir }
2358cdf0e10cSrcweir 
setSortInfo(const DataPilotFieldSortInfo * pInfo)2359cdf0e10cSrcweir void ScDataPilotFieldObj::setSortInfo( const DataPilotFieldSortInfo* pInfo )
2360cdf0e10cSrcweir {
2361cdf0e10cSrcweir     ScUnoGuard aGuard;
2362cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2363cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2364cdf0e10cSrcweir     {
2365cdf0e10cSrcweir         pDim->SetSortInfo( pInfo );
2366cdf0e10cSrcweir         SetDPObject( pDPObj );
2367cdf0e10cSrcweir     }
2368cdf0e10cSrcweir }
2369cdf0e10cSrcweir 
getShowEmpty() const2370cdf0e10cSrcweir sal_Bool ScDataPilotFieldObj::getShowEmpty() const
2371cdf0e10cSrcweir {
2372cdf0e10cSrcweir     ScUnoGuard aGuard;
2373cdf0e10cSrcweir     ScDPSaveDimension* pDim = GetDPDimension();
2374cdf0e10cSrcweir     return pDim && pDim->GetShowEmpty();
2375cdf0e10cSrcweir }
2376cdf0e10cSrcweir 
setShowEmpty(sal_Bool bShow)2377cdf0e10cSrcweir void ScDataPilotFieldObj::setShowEmpty( sal_Bool bShow )
2378cdf0e10cSrcweir {
2379cdf0e10cSrcweir     ScUnoGuard aGuard;
2380cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2381cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2382cdf0e10cSrcweir     {
2383cdf0e10cSrcweir         pDim->SetShowEmpty( bShow );
2384cdf0e10cSrcweir         SetDPObject( pDPObj );
2385cdf0e10cSrcweir     }
2386cdf0e10cSrcweir }
2387cdf0e10cSrcweir 
hasGroupInfo()2388cdf0e10cSrcweir sal_Bool ScDataPilotFieldObj::hasGroupInfo()
2389cdf0e10cSrcweir {
2390cdf0e10cSrcweir     ScUnoGuard aGuard;
2391cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2392cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2393cdf0e10cSrcweir         if( const ScDPDimensionSaveData* pDimData = pDPObj->GetSaveData()->GetExistingDimensionData() )
2394cdf0e10cSrcweir             return pDimData->GetNamedGroupDim( pDim->GetName() ) || pDimData->GetNumGroupDim( pDim->GetName() );
2395cdf0e10cSrcweir     return sal_False;
2396cdf0e10cSrcweir }
2397cdf0e10cSrcweir 
getGroupInfo()2398cdf0e10cSrcweir DataPilotFieldGroupInfo ScDataPilotFieldObj::getGroupInfo()
2399cdf0e10cSrcweir {
2400cdf0e10cSrcweir     ScUnoGuard aGuard;
2401cdf0e10cSrcweir     DataPilotFieldGroupInfo aInfo;
2402cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2403cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2404cdf0e10cSrcweir     {
2405cdf0e10cSrcweir         if( const ScDPDimensionSaveData* pDimData = pDPObj->GetSaveData()->GetExistingDimensionData() )
2406cdf0e10cSrcweir         {
2407cdf0e10cSrcweir             if( const ScDPSaveGroupDimension* pGroupDim = pDimData->GetNamedGroupDim( pDim->GetName() ) )
2408cdf0e10cSrcweir             {
2409cdf0e10cSrcweir                 // grouped by ...
2410cdf0e10cSrcweir                 aInfo.GroupBy = pGroupDim->GetDatePart();
2411cdf0e10cSrcweir 
2412cdf0e10cSrcweir                 // find source field
2413cdf0e10cSrcweir                 try
2414cdf0e10cSrcweir                 {
2415cdf0e10cSrcweir                     Reference< XNameAccess > xFields( mrParent.getDataPilotFields(), UNO_QUERY_THROW );
2416cdf0e10cSrcweir                     aInfo.SourceField.set( xFields->getByName( pGroupDim->GetSourceDimName() ), UNO_QUERY );
2417cdf0e10cSrcweir                 }
2418cdf0e10cSrcweir                 catch( Exception& )
2419cdf0e10cSrcweir                 {
2420cdf0e10cSrcweir                 }
2421cdf0e10cSrcweir 
2422cdf0e10cSrcweir                 ScDataPilotConversion::FillGroupInfo( aInfo, pGroupDim->GetDateInfo() );
2423cdf0e10cSrcweir                 if( pGroupDim->GetDatePart() == 0 )
2424cdf0e10cSrcweir                 {
2425cdf0e10cSrcweir                     // fill vector of group and group member information
2426cdf0e10cSrcweir                     ScFieldGroups aGroups;
2427cdf0e10cSrcweir                     for( sal_Int32 nIdx = 0, nCount = pGroupDim->GetGroupCount(); nIdx < nCount; ++nIdx )
2428cdf0e10cSrcweir                     {
2429cdf0e10cSrcweir                         if( const ScDPSaveGroupItem* pGroup = pGroupDim->GetGroupByIndex( nIdx ) )
2430cdf0e10cSrcweir                         {
2431cdf0e10cSrcweir                             ScFieldGroup aGroup;
2432cdf0e10cSrcweir                             aGroup.maName = pGroup->GetGroupName();
2433cdf0e10cSrcweir                             for( sal_Int32 nMemIdx = 0, nMemCount = pGroup->GetElementCount(); nMemIdx < nMemCount; ++nMemIdx )
2434cdf0e10cSrcweir                                 if( const String* pMem = pGroup->GetElementByIndex( nMemIdx ) )
2435cdf0e10cSrcweir                                     aGroup.maMembers.push_back( *pMem );
2436cdf0e10cSrcweir                             aGroups.push_back( aGroup );
2437cdf0e10cSrcweir                         }
2438cdf0e10cSrcweir                     }
2439cdf0e10cSrcweir                     aInfo.Groups = new ScDataPilotFieldGroupsObj( aGroups );
2440cdf0e10cSrcweir                 }
2441cdf0e10cSrcweir             }
2442cdf0e10cSrcweir             else if( const ScDPSaveNumGroupDimension* pNumGroupDim = pDimData->GetNumGroupDim( pDim->GetName() ) )
2443cdf0e10cSrcweir             {
2444cdf0e10cSrcweir                 if (pNumGroupDim->GetDatePart())
2445cdf0e10cSrcweir                 {
2446cdf0e10cSrcweir                     ScDataPilotConversion::FillGroupInfo( aInfo, pNumGroupDim->GetDateInfo() );
2447cdf0e10cSrcweir                     aInfo.GroupBy = pNumGroupDim->GetDatePart();
2448cdf0e10cSrcweir                 }
2449cdf0e10cSrcweir                 else
2450cdf0e10cSrcweir                 {
2451cdf0e10cSrcweir                     ScDataPilotConversion::FillGroupInfo( aInfo, pNumGroupDim->GetInfo() );
2452cdf0e10cSrcweir                 }
2453cdf0e10cSrcweir             }
2454cdf0e10cSrcweir         }
2455cdf0e10cSrcweir     }
2456cdf0e10cSrcweir     return aInfo;
2457cdf0e10cSrcweir }
2458cdf0e10cSrcweir 
setGroupInfo(const DataPilotFieldGroupInfo * pInfo)2459cdf0e10cSrcweir void ScDataPilotFieldObj::setGroupInfo( const DataPilotFieldGroupInfo* pInfo )
2460cdf0e10cSrcweir {
2461cdf0e10cSrcweir     ScUnoGuard aGuard;
2462cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2463cdf0e10cSrcweir     if( /*ScDPSaveDimension* pDim =*/ GetDPDimension( &pDPObj ) )
2464cdf0e10cSrcweir     {
2465cdf0e10cSrcweir         ScDPSaveData* pSaveData = pDPObj->GetSaveData();
2466cdf0e10cSrcweir         if( pInfo && lclCheckMinMaxStep( *pInfo ) )
2467cdf0e10cSrcweir         {
2468cdf0e10cSrcweir             ScDPNumGroupInfo aInfo;
2469cdf0e10cSrcweir             aInfo.Enable = sal_True;
2470cdf0e10cSrcweir             aInfo.DateValues = pInfo->HasDateValues;
2471cdf0e10cSrcweir             aInfo.AutoStart = pInfo->HasAutoStart;
2472cdf0e10cSrcweir             aInfo.AutoEnd = pInfo->HasAutoEnd;
2473cdf0e10cSrcweir             aInfo.Start = pInfo->Start;
2474cdf0e10cSrcweir             aInfo.End = pInfo->End;
2475cdf0e10cSrcweir             aInfo.Step = pInfo->Step;
2476cdf0e10cSrcweir             Reference< XNamed > xNamed( pInfo->SourceField, UNO_QUERY );
2477cdf0e10cSrcweir             if( xNamed.is() )
2478cdf0e10cSrcweir             {
2479cdf0e10cSrcweir                 ScDPSaveGroupDimension aGroupDim( xNamed->getName(), getName() );
2480cdf0e10cSrcweir                 if( pInfo->GroupBy )
2481cdf0e10cSrcweir                     aGroupDim.SetDateInfo(aInfo, pInfo->GroupBy);
2482cdf0e10cSrcweir                 else
2483cdf0e10cSrcweir                 {
2484cdf0e10cSrcweir                     Reference<XIndexAccess> xIndex(pInfo->Groups, UNO_QUERY);
2485cdf0e10cSrcweir                     if (xIndex.is())
2486cdf0e10cSrcweir                     {
2487cdf0e10cSrcweir                         sal_Int32 nCount(xIndex->getCount());
2488cdf0e10cSrcweir                         for(sal_Int32 i = 0; i < nCount; i++)
2489cdf0e10cSrcweir                         {
2490cdf0e10cSrcweir                             Reference<XNamed> xGroupNamed(xIndex->getByIndex(i), UNO_QUERY);
2491cdf0e10cSrcweir                             if (xGroupNamed.is())
2492cdf0e10cSrcweir                             {
2493cdf0e10cSrcweir                                 ScDPSaveGroupItem aItem(xGroupNamed->getName());
2494cdf0e10cSrcweir                                 Reference<XIndexAccess> xGroupIndex(xGroupNamed, UNO_QUERY);
2495cdf0e10cSrcweir                                 if (xGroupIndex.is())
2496cdf0e10cSrcweir                                 {
2497cdf0e10cSrcweir                                     sal_Int32 nItemCount(xGroupIndex->getCount());
2498cdf0e10cSrcweir                                     for (sal_Int32 j = 0; j < nItemCount; ++j)
2499cdf0e10cSrcweir                                     {
2500cdf0e10cSrcweir                                         Reference<XNamed> xItemNamed(xGroupIndex->getByIndex(j), UNO_QUERY);
2501cdf0e10cSrcweir                                         if (xItemNamed.is())
2502cdf0e10cSrcweir                                             aItem.AddElement(xItemNamed->getName());
2503cdf0e10cSrcweir                                     }
2504cdf0e10cSrcweir                                 }
2505cdf0e10cSrcweir                                 aGroupDim.AddGroupItem(aItem);
2506cdf0e10cSrcweir                             }
2507cdf0e10cSrcweir                         }
2508cdf0e10cSrcweir                     }
2509cdf0e10cSrcweir                 }
2510cdf0e10cSrcweir 
2511cdf0e10cSrcweir                 // get dimension savedata or create new if none
2512cdf0e10cSrcweir                 ScDPDimensionSaveData& rDimSaveData = *pSaveData->GetDimensionData();
2513cdf0e10cSrcweir                 rDimSaveData.ReplaceGroupDimension( aGroupDim );
2514cdf0e10cSrcweir             }
2515cdf0e10cSrcweir             else    // no source field in group info -> numeric group
2516cdf0e10cSrcweir             {
2517cdf0e10cSrcweir                 ScDPDimensionSaveData* pDimData = pSaveData->GetDimensionData();     // created if not there
2518cdf0e10cSrcweir 
2519cdf0e10cSrcweir                 ScDPSaveNumGroupDimension* pExisting = pDimData->GetNumGroupDimAcc( getName() );
2520cdf0e10cSrcweir                 if ( pExisting )
2521cdf0e10cSrcweir                 {
2522cdf0e10cSrcweir                     if (pInfo->GroupBy)
2523cdf0e10cSrcweir                         pExisting->SetDateInfo(aInfo, pInfo->GroupBy);
2524cdf0e10cSrcweir                     // modify existing group dimension
2525cdf0e10cSrcweir                     pExisting->SetGroupInfo( aInfo );
2526cdf0e10cSrcweir                 }
2527cdf0e10cSrcweir                 else if (pInfo->GroupBy)
2528cdf0e10cSrcweir                 {
2529cdf0e10cSrcweir                     // create new group dimension
2530cdf0e10cSrcweir                     ScDPSaveNumGroupDimension aNumGroupDim( getName(), aInfo, pInfo->GroupBy );
2531cdf0e10cSrcweir                     pDimData->AddNumGroupDimension( aNumGroupDim );
2532cdf0e10cSrcweir                 }
2533cdf0e10cSrcweir                 else
2534cdf0e10cSrcweir                 {
2535cdf0e10cSrcweir                     // create new group dimension
2536cdf0e10cSrcweir                     ScDPSaveNumGroupDimension aNumGroupDim( getName(), aInfo );
2537cdf0e10cSrcweir                     pDimData->AddNumGroupDimension( aNumGroupDim );
2538cdf0e10cSrcweir                 }
2539cdf0e10cSrcweir             }
2540cdf0e10cSrcweir         }
2541cdf0e10cSrcweir         else    // null passed as argument
2542cdf0e10cSrcweir         {
2543cdf0e10cSrcweir             pSaveData->SetDimensionData( 0 );
2544cdf0e10cSrcweir         }
2545cdf0e10cSrcweir 
2546cdf0e10cSrcweir         pDPObj->SetSaveData( *pSaveData );
2547cdf0e10cSrcweir         SetDPObject( pDPObj );
2548cdf0e10cSrcweir     }
2549cdf0e10cSrcweir }
2550cdf0e10cSrcweir 
HasString(const Sequence<OUString> & rItems,const OUString & aString)2551cdf0e10cSrcweir sal_Bool ScDataPilotFieldObj::HasString(const Sequence< OUString >& rItems, const OUString& aString)
2552cdf0e10cSrcweir {
2553cdf0e10cSrcweir     sal_Bool bRet = sal_False;
2554cdf0e10cSrcweir 
2555cdf0e10cSrcweir     sal_Int32 nCount(rItems.getLength());
2556cdf0e10cSrcweir     sal_Int32 nItem(0);
2557cdf0e10cSrcweir     while (nItem < nCount && !bRet)
2558cdf0e10cSrcweir     {
2559cdf0e10cSrcweir         bRet = rItems[nItem] == aString;
2560cdf0e10cSrcweir         ++nItem;
2561cdf0e10cSrcweir     }
2562cdf0e10cSrcweir 
2563cdf0e10cSrcweir     return bRet;
2564cdf0e10cSrcweir }
2565cdf0e10cSrcweir 
2566cdf0e10cSrcweir // XDataPilotFieldGrouping
createNameGroup(const Sequence<OUString> & rItems)2567cdf0e10cSrcweir Reference< XDataPilotField > SAL_CALL ScDataPilotFieldObj::createNameGroup( const Sequence< OUString >& rItems )
2568cdf0e10cSrcweir          throw (RuntimeException, IllegalArgumentException)
2569cdf0e10cSrcweir {
2570cdf0e10cSrcweir 	ScUnoGuard aGuard;
2571cdf0e10cSrcweir 
2572cdf0e10cSrcweir     Reference< XDataPilotField > xRet;
2573cdf0e10cSrcweir     OUString sNewDim;
2574cdf0e10cSrcweir 
2575cdf0e10cSrcweir     if( !rItems.hasElements() )
2576cdf0e10cSrcweir         throw IllegalArgumentException();
2577cdf0e10cSrcweir 
2578cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2579cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2580cdf0e10cSrcweir     {
2581cdf0e10cSrcweir         String aDimName = pDim->GetName();
2582cdf0e10cSrcweir 
2583cdf0e10cSrcweir         ScDPSaveData aSaveData = *pDPObj->GetSaveData();
2584cdf0e10cSrcweir         ScDPDimensionSaveData* pDimData = aSaveData.GetDimensionData();     // created if not there
2585cdf0e10cSrcweir 
2586cdf0e10cSrcweir         // find original base
2587cdf0e10cSrcweir         String aBaseDimName( aDimName );
2588cdf0e10cSrcweir         const ScDPSaveGroupDimension* pBaseGroupDim = pDimData->GetNamedGroupDim( aDimName );
2589cdf0e10cSrcweir         if ( pBaseGroupDim )
2590cdf0e10cSrcweir         {
2591cdf0e10cSrcweir             // any entry's SourceDimName is the original base
2592cdf0e10cSrcweir             aBaseDimName = pBaseGroupDim->GetSourceDimName();
2593cdf0e10cSrcweir         }
2594cdf0e10cSrcweir 
2595cdf0e10cSrcweir         // find existing group dimension
2596cdf0e10cSrcweir         // (using the selected dim, can be intermediate group dim)
2597cdf0e10cSrcweir         ScDPSaveGroupDimension* pGroupDimension = pDimData->GetGroupDimAccForBase( aDimName );
2598cdf0e10cSrcweir 
2599cdf0e10cSrcweir         // remove the selected items from their groups
2600cdf0e10cSrcweir         // (empty groups are removed, too)
2601cdf0e10cSrcweir         sal_Int32 nEntryCount = rItems.getLength();
2602cdf0e10cSrcweir         sal_Int32 nEntry;
2603cdf0e10cSrcweir         if ( pGroupDimension )
2604cdf0e10cSrcweir         {
2605cdf0e10cSrcweir             for (nEntry=0; nEntry<nEntryCount; nEntry++)
2606cdf0e10cSrcweir             {
2607cdf0e10cSrcweir                 String aEntryName(rItems[nEntry]);
2608cdf0e10cSrcweir                 if ( pBaseGroupDim )
2609cdf0e10cSrcweir                 {
2610cdf0e10cSrcweir                     // for each selected (intermediate) group, remove all its items
2611cdf0e10cSrcweir                     // (same logic as for adding, below)
2612cdf0e10cSrcweir                     const ScDPSaveGroupItem* pBaseGroup = pBaseGroupDim->GetNamedGroup( aEntryName );
2613cdf0e10cSrcweir                     if ( pBaseGroup )
2614cdf0e10cSrcweir                         pBaseGroup->RemoveElementsFromGroups( *pGroupDimension );   // remove all elements
2615cdf0e10cSrcweir                     else
2616cdf0e10cSrcweir                         pGroupDimension->RemoveFromGroups( aEntryName );
2617cdf0e10cSrcweir                 }
2618cdf0e10cSrcweir                 else
2619cdf0e10cSrcweir                     pGroupDimension->RemoveFromGroups( aEntryName );
2620cdf0e10cSrcweir             }
2621cdf0e10cSrcweir         }
2622cdf0e10cSrcweir 
2623cdf0e10cSrcweir         ScDPSaveGroupDimension* pNewGroupDim = 0;
2624cdf0e10cSrcweir         if ( !pGroupDimension )
2625cdf0e10cSrcweir         {
2626cdf0e10cSrcweir             // create a new group dimension
2627cdf0e10cSrcweir             String aGroupDimName = pDimData->CreateGroupDimName( aBaseDimName, *pDPObj, false, NULL );
2628cdf0e10cSrcweir             pNewGroupDim = new ScDPSaveGroupDimension( aBaseDimName, aGroupDimName );
2629cdf0e10cSrcweir             sNewDim = aGroupDimName;
2630cdf0e10cSrcweir 
2631cdf0e10cSrcweir             pGroupDimension = pNewGroupDim;     // make changes to the new dim if none existed
2632cdf0e10cSrcweir 
2633cdf0e10cSrcweir             if ( pBaseGroupDim )
2634cdf0e10cSrcweir             {
2635cdf0e10cSrcweir                 // If it's a higher-order group dimension, pre-allocate groups for all
2636cdf0e10cSrcweir                 // non-selected original groups, so the individual base members aren't
2637cdf0e10cSrcweir                 // used for automatic groups (this would make the original groups hard
2638cdf0e10cSrcweir                 // to find).
2639cdf0e10cSrcweir                 //! Also do this when removing groups?
2640cdf0e10cSrcweir                 //! Handle this case dynamically with automatic groups?
2641cdf0e10cSrcweir 
2642cdf0e10cSrcweir                 long nGroupCount = pBaseGroupDim->GetGroupCount();
2643cdf0e10cSrcweir                 for ( long nGroup = 0; nGroup < nGroupCount; nGroup++ )
2644cdf0e10cSrcweir                 {
2645cdf0e10cSrcweir                     const ScDPSaveGroupItem* pBaseGroup = pBaseGroupDim->GetGroupByIndex( nGroup );
2646cdf0e10cSrcweir 
2647cdf0e10cSrcweir                     StrData aStrData( pBaseGroup->GetGroupName() );
2648cdf0e10cSrcweir                     if ( !HasString(rItems, aStrData.GetString()) )    //! ignore case?
2649cdf0e10cSrcweir                     {
2650cdf0e10cSrcweir                         // add an additional group for each item that is not in the selection
2651cdf0e10cSrcweir                         ScDPSaveGroupItem aGroup( pBaseGroup->GetGroupName() );
2652cdf0e10cSrcweir                         aGroup.AddElementsFromGroup( *pBaseGroup );
2653cdf0e10cSrcweir                         pGroupDimension->AddGroupItem( aGroup );
2654cdf0e10cSrcweir                     }
2655cdf0e10cSrcweir                 }
2656cdf0e10cSrcweir             }
2657cdf0e10cSrcweir         }
2658cdf0e10cSrcweir         String aGroupDimName = pGroupDimension->GetGroupDimName();
2659cdf0e10cSrcweir 
2660cdf0e10cSrcweir         //! localized prefix string
2661cdf0e10cSrcweir         String aGroupName = pGroupDimension->CreateGroupName( String( RTL_CONSTASCII_USTRINGPARAM( "Group" ) ) );
2662cdf0e10cSrcweir         ScDPSaveGroupItem aGroup( aGroupName );
2663cdf0e10cSrcweir         Reference< XNameAccess > xMembers = GetMembers();
2664cdf0e10cSrcweir         if (!xMembers.is())
2665cdf0e10cSrcweir         {
2666cdf0e10cSrcweir             delete pNewGroupDim;
2667cdf0e10cSrcweir             throw RuntimeException();
2668cdf0e10cSrcweir         }
2669cdf0e10cSrcweir 
2670cdf0e10cSrcweir         for (nEntry=0; nEntry<nEntryCount; nEntry++)
2671cdf0e10cSrcweir         {
2672cdf0e10cSrcweir             String aEntryName(rItems[nEntry]);
2673cdf0e10cSrcweir 
2674cdf0e10cSrcweir             if (!xMembers->hasByName(aEntryName))
2675cdf0e10cSrcweir             {
2676cdf0e10cSrcweir                 delete pNewGroupDim;
2677cdf0e10cSrcweir                 throw IllegalArgumentException();
2678cdf0e10cSrcweir             }
2679cdf0e10cSrcweir 
2680cdf0e10cSrcweir             if ( pBaseGroupDim )
2681cdf0e10cSrcweir             {
2682cdf0e10cSrcweir                 // for each selected (intermediate) group, add all its items
2683cdf0e10cSrcweir                 const ScDPSaveGroupItem* pBaseGroup = pBaseGroupDim->GetNamedGroup( aEntryName );
2684cdf0e10cSrcweir                 if ( pBaseGroup )
2685cdf0e10cSrcweir                     aGroup.AddElementsFromGroup( *pBaseGroup );
2686cdf0e10cSrcweir                 else
2687cdf0e10cSrcweir                     aGroup.AddElement( aEntryName );    // no group found -> automatic group, add the item itself
2688cdf0e10cSrcweir             }
2689cdf0e10cSrcweir             else
2690cdf0e10cSrcweir                 aGroup.AddElement( aEntryName );        // no group dimension, add all items directly
2691cdf0e10cSrcweir         }
2692cdf0e10cSrcweir 
2693cdf0e10cSrcweir         pGroupDimension->AddGroupItem( aGroup );
2694cdf0e10cSrcweir 
2695cdf0e10cSrcweir         if ( pNewGroupDim )
2696cdf0e10cSrcweir         {
2697cdf0e10cSrcweir             pDimData->AddGroupDimension( *pNewGroupDim );
2698cdf0e10cSrcweir             delete pNewGroupDim;        // AddGroupDimension copies the object
2699cdf0e10cSrcweir             // don't access pGroupDimension after here
2700cdf0e10cSrcweir         }
2701cdf0e10cSrcweir         pGroupDimension = pNewGroupDim = NULL;
2702cdf0e10cSrcweir 
2703cdf0e10cSrcweir         // set orientation
2704cdf0e10cSrcweir         ScDPSaveDimension* pSaveDimension = aSaveData.GetDimensionByName( aGroupDimName );
2705cdf0e10cSrcweir         if ( pSaveDimension->GetOrientation() == DataPilotFieldOrientation_HIDDEN )
2706cdf0e10cSrcweir         {
2707cdf0e10cSrcweir             ScDPSaveDimension* pOldDimension = aSaveData.GetDimensionByName( aDimName );
2708cdf0e10cSrcweir             pSaveDimension->SetOrientation( pOldDimension->GetOrientation() );
2709cdf0e10cSrcweir             long nPosition = 0;     //! before (immediate) base
2710cdf0e10cSrcweir             aSaveData.SetPosition( pSaveDimension, nPosition );
2711cdf0e10cSrcweir         }
2712cdf0e10cSrcweir 
2713cdf0e10cSrcweir         // apply changes
2714cdf0e10cSrcweir         pDPObj->SetSaveData( aSaveData );
2715cdf0e10cSrcweir         SetDPObject( pDPObj );
2716cdf0e10cSrcweir     }
2717cdf0e10cSrcweir 
2718cdf0e10cSrcweir     // if new grouping field has been created (on first group), return it
2719cdf0e10cSrcweir     if( sNewDim.getLength() > 0 )
2720cdf0e10cSrcweir     {
2721cdf0e10cSrcweir         Reference< XNameAccess > xFields(mrParent.getDataPilotFields(), UNO_QUERY);
2722cdf0e10cSrcweir         if (xFields.is())
2723cdf0e10cSrcweir         {
2724cdf0e10cSrcweir             xRet.set(xFields->getByName(sNewDim), UNO_QUERY);
2725cdf0e10cSrcweir             DBG_ASSERT(xRet.is(), "there is a name, so there should be also a field");
2726cdf0e10cSrcweir         }
2727cdf0e10cSrcweir     }
2728cdf0e10cSrcweir     return xRet;
2729cdf0e10cSrcweir }
2730cdf0e10cSrcweir 
createDateGroup(const DataPilotFieldGroupInfo & rInfo)2731cdf0e10cSrcweir Reference < XDataPilotField > SAL_CALL ScDataPilotFieldObj::createDateGroup( const DataPilotFieldGroupInfo& rInfo )
2732cdf0e10cSrcweir         throw (RuntimeException, IllegalArgumentException)
2733cdf0e10cSrcweir {
2734cdf0e10cSrcweir 	ScUnoGuard aGuard;
2735cdf0e10cSrcweir     using namespace ::com::sun::star::sheet::DataPilotFieldGroupBy;
2736cdf0e10cSrcweir 
2737cdf0e10cSrcweir     // check min/max/step, HasDateValues must be set always
2738cdf0e10cSrcweir     if( !rInfo.HasDateValues || !lclCheckMinMaxStep( rInfo ) )
2739cdf0e10cSrcweir         throw IllegalArgumentException();
2740cdf0e10cSrcweir     // only a single date flag is allowed
2741cdf0e10cSrcweir     if( (rInfo.GroupBy == 0) || (rInfo.GroupBy > YEARS) || ((rInfo.GroupBy & (rInfo.GroupBy - 1)) != 0) )
2742cdf0e10cSrcweir         throw IllegalArgumentException();
2743cdf0e10cSrcweir     // step must be zero, if something else than DAYS is specified
2744cdf0e10cSrcweir     if( rInfo.Step >= ((rInfo.GroupBy == DAYS) ? 32768.0 : 1.0) )
2745cdf0e10cSrcweir         throw IllegalArgumentException();
2746cdf0e10cSrcweir 
2747cdf0e10cSrcweir     String aGroupDimName;
2748cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
2749cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
2750cdf0e10cSrcweir     {
2751cdf0e10cSrcweir         ScDPNumGroupInfo aInfo;
2752cdf0e10cSrcweir         aInfo.Enable = sal_True;
2753cdf0e10cSrcweir         aInfo.DateValues = (rInfo.GroupBy == DAYS) && (rInfo.Step >= 1.0);
2754cdf0e10cSrcweir         aInfo.AutoStart = rInfo.HasAutoStart;
2755cdf0e10cSrcweir         aInfo.AutoEnd = rInfo.HasAutoEnd;
2756cdf0e10cSrcweir         aInfo.Start = rInfo.Start;
2757cdf0e10cSrcweir         aInfo.End = rInfo.End;
2758cdf0e10cSrcweir         aInfo.Step = static_cast< sal_Int32 >( rInfo.Step );
2759cdf0e10cSrcweir 
2760cdf0e10cSrcweir         // create a local copy of the entire save data (will be written back below)
2761cdf0e10cSrcweir         ScDPSaveData aSaveData = *pDPObj->GetSaveData();
2762cdf0e10cSrcweir         // get or create dimension save data
2763cdf0e10cSrcweir         ScDPDimensionSaveData& rDimData = *aSaveData.GetDimensionData();
2764cdf0e10cSrcweir 
2765cdf0e10cSrcweir         // find source dimension name
2766cdf0e10cSrcweir         const String& rDimName = pDim->GetName();
2767cdf0e10cSrcweir         const ScDPSaveGroupDimension* pGroupDim = rDimData.GetNamedGroupDim( rDimName );
2768cdf0e10cSrcweir         String aSrcDimName = pGroupDim ? pGroupDim->GetSourceDimName() : rDimName;
2769cdf0e10cSrcweir 
2770cdf0e10cSrcweir         // find a group dimension for the base field, or get numeric grouping
2771cdf0e10cSrcweir         pGroupDim = rDimData.GetFirstNamedGroupDim( aSrcDimName );
2772cdf0e10cSrcweir         const ScDPSaveNumGroupDimension* pNumGroupDim = rDimData.GetNumGroupDim( aSrcDimName );
2773cdf0e10cSrcweir 
2774cdf0e10cSrcweir         // do not group by dates, if named groups or numeric grouping is present
2775cdf0e10cSrcweir         bool bHasNamedGrouping = pGroupDim && !pGroupDim->GetDateInfo().Enable;
2776cdf0e10cSrcweir         bool bHasNumGrouping = pNumGroupDim && pNumGroupDim->GetInfo().Enable && !pNumGroupDim->GetInfo().DateValues && !pNumGroupDim->GetDateInfo().Enable;
2777cdf0e10cSrcweir         if( bHasNamedGrouping || bHasNumGrouping )
2778cdf0e10cSrcweir             throw IllegalArgumentException();
2779cdf0e10cSrcweir 
2780cdf0e10cSrcweir         if( aInfo.DateValues )  // create day ranges grouping
2781cdf0e10cSrcweir         {
2782cdf0e10cSrcweir             // first remove all named group dimensions
2783cdf0e10cSrcweir             while( pGroupDim )
2784cdf0e10cSrcweir             {
2785cdf0e10cSrcweir                 String aGroupDimName2 = pGroupDim->GetGroupDimName();
2786cdf0e10cSrcweir                 // find next group dimension before deleting this group
2787cdf0e10cSrcweir                 pGroupDim = rDimData.GetNextNamedGroupDim( aGroupDimName2 );
2788cdf0e10cSrcweir                 // remove from dimension save data
2789cdf0e10cSrcweir                 rDimData.RemoveGroupDimension( aGroupDimName2 );
2790cdf0e10cSrcweir                 // also remove save data settings for the dimension that no longer exists
2791cdf0e10cSrcweir                 aSaveData.RemoveDimensionByName( aGroupDimName2 );
2792cdf0e10cSrcweir             }
2793cdf0e10cSrcweir             // create or replace the number grouping dimension
2794cdf0e10cSrcweir             ScDPSaveNumGroupDimension aNumGroupDim( aSrcDimName, aInfo );
2795cdf0e10cSrcweir             rDimData.ReplaceNumGroupDimension( aNumGroupDim );
2796cdf0e10cSrcweir         }
2797cdf0e10cSrcweir         else    // create date grouping
2798cdf0e10cSrcweir         {
2799cdf0e10cSrcweir             // collect all existing date flags
2800cdf0e10cSrcweir             sal_Int32 nDateParts = rDimData.CollectDateParts( aSrcDimName );
2801cdf0e10cSrcweir             if( nDateParts == 0 )
2802cdf0e10cSrcweir             {
2803cdf0e10cSrcweir                 // insert numeric group dimension, if no date groups exist yet (or replace day range grouping)
2804cdf0e10cSrcweir                 ScDPSaveNumGroupDimension aNumGroupDim( aSrcDimName, aInfo, rInfo.GroupBy );
2805cdf0e10cSrcweir                 rDimData.ReplaceNumGroupDimension( aNumGroupDim );
2806cdf0e10cSrcweir             }
2807cdf0e10cSrcweir             else if( (nDateParts & rInfo.GroupBy) == 0 )    // do nothing if date field exists already
2808cdf0e10cSrcweir             {
2809cdf0e10cSrcweir                 // create new named group dimension for additional date groups
2810cdf0e10cSrcweir                 aGroupDimName = rDimData.CreateDateGroupDimName( rInfo.GroupBy, *pDPObj, true, 0 );
2811cdf0e10cSrcweir                 ScDPSaveGroupDimension aGroupDim( aSrcDimName, aGroupDimName, aInfo, rInfo.GroupBy );
2812cdf0e10cSrcweir                 rDimData.AddGroupDimension( aGroupDim );
2813cdf0e10cSrcweir 
2814cdf0e10cSrcweir                 // set orientation of new named group dimension
2815cdf0e10cSrcweir                 ScDPSaveDimension& rSaveDim = *aSaveData.GetDimensionByName( aGroupDimName );
2816cdf0e10cSrcweir                 if( rSaveDim.GetOrientation() == DataPilotFieldOrientation_HIDDEN )
2817cdf0e10cSrcweir                 {
2818cdf0e10cSrcweir                     ScDPSaveDimension& rOldDim = *aSaveData.GetDimensionByName( aSrcDimName );
2819cdf0e10cSrcweir                     rSaveDim.SetOrientation( rOldDim.GetOrientation() );
2820cdf0e10cSrcweir                     aSaveData.SetPosition( &rSaveDim, 0 );  //! before (immediate) base
2821cdf0e10cSrcweir                 }
2822cdf0e10cSrcweir             }
2823cdf0e10cSrcweir         }
2824cdf0e10cSrcweir 
2825cdf0e10cSrcweir         // apply changes
2826cdf0e10cSrcweir         pDPObj->SetSaveData( aSaveData );
2827cdf0e10cSrcweir         SetDPObject( pDPObj );
2828cdf0e10cSrcweir     }
2829cdf0e10cSrcweir 
2830cdf0e10cSrcweir     // return the UNO object of the new dimension, after writing back saved data
2831cdf0e10cSrcweir     Reference< XDataPilotField > xRet;
2832cdf0e10cSrcweir     if( aGroupDimName.Len() > 0 ) try
2833cdf0e10cSrcweir     {
2834cdf0e10cSrcweir         Reference< XNameAccess > xFields( mrParent.getDataPilotFields(), UNO_QUERY_THROW );
2835cdf0e10cSrcweir         xRet.set( xFields->getByName( aGroupDimName ), UNO_QUERY );
2836cdf0e10cSrcweir     }
2837cdf0e10cSrcweir     catch( Exception& )
2838cdf0e10cSrcweir     {
2839cdf0e10cSrcweir     }
2840cdf0e10cSrcweir     return xRet;
2841cdf0e10cSrcweir }
2842cdf0e10cSrcweir 
2843cdf0e10cSrcweir // ============================================================================
2844cdf0e10cSrcweir 
2845cdf0e10cSrcweir namespace {
2846cdf0e10cSrcweir 
lclExtractGroupMembers(ScFieldGroupMembers & rMembers,const Any & rElement)2847cdf0e10cSrcweir bool lclExtractGroupMembers( ScFieldGroupMembers& rMembers, const Any& rElement )
2848cdf0e10cSrcweir {
2849cdf0e10cSrcweir     // allow empty value to create a new group
2850cdf0e10cSrcweir     if( !rElement.hasValue() )
2851cdf0e10cSrcweir         return true;
2852cdf0e10cSrcweir 
2853cdf0e10cSrcweir     // try to extract a simple sequence of strings
2854cdf0e10cSrcweir     Sequence< OUString > aSeq;
2855cdf0e10cSrcweir     if( rElement >>= aSeq )
2856cdf0e10cSrcweir     {
2857cdf0e10cSrcweir         if( aSeq.hasElements() )
2858cdf0e10cSrcweir             rMembers.insert( rMembers.end(), aSeq.getConstArray(), aSeq.getConstArray() + aSeq.getLength() );
2859cdf0e10cSrcweir         return true;
2860cdf0e10cSrcweir     }
2861cdf0e10cSrcweir 
2862cdf0e10cSrcweir     // try to use XIndexAccess providing objects that support XNamed
2863cdf0e10cSrcweir     Reference< XIndexAccess > xItemsIA( rElement, UNO_QUERY );
2864cdf0e10cSrcweir     if( xItemsIA.is() )
2865cdf0e10cSrcweir     {
2866cdf0e10cSrcweir         for( sal_Int32 nIdx = 0, nCount = xItemsIA->getCount(); nIdx < nCount; ++nIdx )
2867cdf0e10cSrcweir         {
2868cdf0e10cSrcweir             try // getByIndex() should not throw, but we cannot be sure
2869cdf0e10cSrcweir             {
2870cdf0e10cSrcweir                 Reference< XNamed > xItemName( xItemsIA->getByIndex( nIdx ), UNO_QUERY_THROW );
2871cdf0e10cSrcweir                 rMembers.push_back( xItemName->getName() );
2872cdf0e10cSrcweir             }
2873cdf0e10cSrcweir             catch( Exception& )
2874cdf0e10cSrcweir             {
2875cdf0e10cSrcweir                 // ignore exceptions, go ahead with next element in the array
2876cdf0e10cSrcweir             }
2877cdf0e10cSrcweir         }
2878cdf0e10cSrcweir         return true;
2879cdf0e10cSrcweir     }
2880cdf0e10cSrcweir 
2881cdf0e10cSrcweir     // nothing valid inside the Any -> return false
2882cdf0e10cSrcweir     return false;
2883cdf0e10cSrcweir }
2884cdf0e10cSrcweir 
2885cdf0e10cSrcweir } // namespace
2886cdf0e10cSrcweir 
2887cdf0e10cSrcweir // ----------------------------------------------------------------------------
2888cdf0e10cSrcweir 
ScDataPilotFieldGroupsObj(const ScFieldGroups & rGroups)2889cdf0e10cSrcweir ScDataPilotFieldGroupsObj::ScDataPilotFieldGroupsObj( const ScFieldGroups& rGroups ) :
2890cdf0e10cSrcweir     maGroups( rGroups )
2891cdf0e10cSrcweir {
2892cdf0e10cSrcweir }
2893cdf0e10cSrcweir 
~ScDataPilotFieldGroupsObj()2894cdf0e10cSrcweir ScDataPilotFieldGroupsObj::~ScDataPilotFieldGroupsObj()
2895cdf0e10cSrcweir {
2896cdf0e10cSrcweir }
2897cdf0e10cSrcweir 
2898cdf0e10cSrcweir // XNameAccess
2899cdf0e10cSrcweir 
getByName(const OUString & rName)2900cdf0e10cSrcweir Any SAL_CALL ScDataPilotFieldGroupsObj::getByName( const OUString& rName )
2901cdf0e10cSrcweir         throw(NoSuchElementException, WrappedTargetException, RuntimeException)
2902cdf0e10cSrcweir {
2903cdf0e10cSrcweir 	ScUnoGuard aGuard;
2904cdf0e10cSrcweir     if( implFindByName( rName ) == maGroups.end() )
2905cdf0e10cSrcweir         throw NoSuchElementException();
2906cdf0e10cSrcweir     return Any( Reference< XNameAccess >( new ScDataPilotFieldGroupObj( *this, rName ) ) );
2907cdf0e10cSrcweir }
2908cdf0e10cSrcweir 
getElementNames()2909cdf0e10cSrcweir Sequence< OUString > SAL_CALL ScDataPilotFieldGroupsObj::getElementNames() throw(RuntimeException)
2910cdf0e10cSrcweir {
2911cdf0e10cSrcweir 	ScUnoGuard aGuard;
2912cdf0e10cSrcweir     Sequence< OUString > aSeq;
2913cdf0e10cSrcweir     if( !maGroups.empty() )
2914cdf0e10cSrcweir     {
2915cdf0e10cSrcweir         aSeq.realloc( static_cast< sal_Int32 >( maGroups.size() ) );
2916cdf0e10cSrcweir         OUString* pName = aSeq.getArray();
2917cdf0e10cSrcweir         for( ScFieldGroups::iterator aIt = maGroups.begin(), aEnd = maGroups.end(); aIt != aEnd; ++aIt, ++pName )
2918cdf0e10cSrcweir             *pName = aIt->maName;
2919cdf0e10cSrcweir     }
2920cdf0e10cSrcweir     return aSeq;
2921cdf0e10cSrcweir }
2922cdf0e10cSrcweir 
hasByName(const OUString & rName)2923cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotFieldGroupsObj::hasByName( const OUString& rName ) throw(RuntimeException)
2924cdf0e10cSrcweir {
2925cdf0e10cSrcweir 	ScUnoGuard aGuard;
2926cdf0e10cSrcweir     return implFindByName( rName ) != maGroups.end();
2927cdf0e10cSrcweir }
2928cdf0e10cSrcweir 
2929cdf0e10cSrcweir // XNameReplace
2930cdf0e10cSrcweir 
replaceByName(const OUString & rName,const Any & rElement)2931cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupsObj::replaceByName( const OUString& rName, const Any& rElement )
2932cdf0e10cSrcweir         throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException)
2933cdf0e10cSrcweir {
2934cdf0e10cSrcweir     ScUnoGuard aGuard;
2935cdf0e10cSrcweir 
2936cdf0e10cSrcweir     if( rName.getLength() == 0 )
2937cdf0e10cSrcweir         throw IllegalArgumentException();
2938cdf0e10cSrcweir 
2939cdf0e10cSrcweir     ScFieldGroups::iterator aIt = implFindByName( rName );
2940cdf0e10cSrcweir     if( aIt == maGroups.end() )
2941cdf0e10cSrcweir         throw NoSuchElementException();
2942cdf0e10cSrcweir 
2943cdf0e10cSrcweir     // read all item names provided by the passed object
2944cdf0e10cSrcweir     ScFieldGroupMembers aMembers;
2945cdf0e10cSrcweir     if( !lclExtractGroupMembers( aMembers, rElement ) )
2946cdf0e10cSrcweir         throw IllegalArgumentException();
2947cdf0e10cSrcweir 
2948cdf0e10cSrcweir     // copy and forget, faster than vector assignment
2949cdf0e10cSrcweir     aIt->maMembers.swap( aMembers );
2950cdf0e10cSrcweir }
2951cdf0e10cSrcweir 
2952cdf0e10cSrcweir // XNameContainer
2953cdf0e10cSrcweir 
insertByName(const OUString & rName,const Any & rElement)2954cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupsObj::insertByName( const OUString& rName, const Any& rElement )
2955cdf0e10cSrcweir         throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException)
2956cdf0e10cSrcweir {
2957cdf0e10cSrcweir     ScUnoGuard aGuard;
2958cdf0e10cSrcweir 
2959cdf0e10cSrcweir     if( rName.getLength() == 0 )
2960cdf0e10cSrcweir         throw IllegalArgumentException();
2961cdf0e10cSrcweir 
2962cdf0e10cSrcweir     ScFieldGroups::iterator aIt = implFindByName( rName );
2963cdf0e10cSrcweir     if( aIt != maGroups.end() )
2964cdf0e10cSrcweir         throw ElementExistException();
2965cdf0e10cSrcweir 
2966cdf0e10cSrcweir     // read all item names provided by the passed object
2967cdf0e10cSrcweir     ScFieldGroupMembers aMembers;
2968cdf0e10cSrcweir     if( !lclExtractGroupMembers( aMembers, rElement ) )
2969cdf0e10cSrcweir         throw IllegalArgumentException();
2970cdf0e10cSrcweir 
2971cdf0e10cSrcweir     // create the new entry if no error has been occured
2972cdf0e10cSrcweir     maGroups.resize( maGroups.size() + 1 );
2973cdf0e10cSrcweir     ScFieldGroup& rGroup = maGroups.back();
2974cdf0e10cSrcweir     rGroup.maName = rName;
2975cdf0e10cSrcweir     rGroup.maMembers.swap( aMembers );
2976cdf0e10cSrcweir }
2977cdf0e10cSrcweir 
removeByName(const OUString & rName)2978cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupsObj::removeByName( const OUString& rName )
2979cdf0e10cSrcweir         throw (NoSuchElementException, WrappedTargetException, RuntimeException)
2980cdf0e10cSrcweir {
2981cdf0e10cSrcweir     ScUnoGuard aGuard;
2982cdf0e10cSrcweir 
2983cdf0e10cSrcweir     if( rName.getLength() == 0 )
2984cdf0e10cSrcweir         throw IllegalArgumentException();
2985cdf0e10cSrcweir 
2986cdf0e10cSrcweir     ScFieldGroups::iterator aIt = implFindByName( rName );
2987cdf0e10cSrcweir     if( aIt == maGroups.end() )
2988cdf0e10cSrcweir         throw NoSuchElementException();
2989cdf0e10cSrcweir 
2990cdf0e10cSrcweir     maGroups.erase( aIt );
2991cdf0e10cSrcweir }
2992cdf0e10cSrcweir 
2993cdf0e10cSrcweir // XIndexAccess
2994cdf0e10cSrcweir 
getCount()2995cdf0e10cSrcweir sal_Int32 SAL_CALL ScDataPilotFieldGroupsObj::getCount() throw(RuntimeException)
2996cdf0e10cSrcweir {
2997cdf0e10cSrcweir 	ScUnoGuard aGuard;
2998cdf0e10cSrcweir     return static_cast< sal_Int32 >( maGroups.size() );
2999cdf0e10cSrcweir }
3000cdf0e10cSrcweir 
getByIndex(sal_Int32 nIndex)3001cdf0e10cSrcweir Any SAL_CALL ScDataPilotFieldGroupsObj::getByIndex( sal_Int32 nIndex )
3002cdf0e10cSrcweir         throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
3003cdf0e10cSrcweir {
3004cdf0e10cSrcweir 	ScUnoGuard aGuard;
3005cdf0e10cSrcweir     if ((nIndex < 0) || (nIndex >= static_cast< sal_Int32 >( maGroups.size() )))
3006cdf0e10cSrcweir         throw IndexOutOfBoundsException();
3007cdf0e10cSrcweir     return Any( Reference< XNameAccess >( new ScDataPilotFieldGroupObj( *this, maGroups[ nIndex ].maName ) ) );
3008cdf0e10cSrcweir }
3009cdf0e10cSrcweir 
3010cdf0e10cSrcweir // XEnumerationAccess
3011cdf0e10cSrcweir 
createEnumeration()3012cdf0e10cSrcweir Reference<XEnumeration> SAL_CALL ScDataPilotFieldGroupsObj::createEnumeration() throw(RuntimeException)
3013cdf0e10cSrcweir {
3014cdf0e10cSrcweir     ScUnoGuard aGuard;
3015cdf0e10cSrcweir     return new ScIndexEnumeration( this, OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.DataPilotFieldGroupsEnumeration" ) ) );
3016cdf0e10cSrcweir }
3017cdf0e10cSrcweir 
3018cdf0e10cSrcweir // XElementAccess
3019cdf0e10cSrcweir 
getElementType()3020cdf0e10cSrcweir uno::Type SAL_CALL ScDataPilotFieldGroupsObj::getElementType() throw(RuntimeException)
3021cdf0e10cSrcweir {
3022cdf0e10cSrcweir 	ScUnoGuard aGuard;
3023cdf0e10cSrcweir     return getCppuType( (Reference< XNameAccess >*)0 );
3024cdf0e10cSrcweir }
3025cdf0e10cSrcweir 
hasElements()3026cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotFieldGroupsObj::hasElements() throw(RuntimeException)
3027cdf0e10cSrcweir {
3028cdf0e10cSrcweir 	ScUnoGuard aGuard;
3029cdf0e10cSrcweir     return !maGroups.empty();
3030cdf0e10cSrcweir }
3031cdf0e10cSrcweir 
3032cdf0e10cSrcweir // implementation
3033cdf0e10cSrcweir 
getFieldGroup(const OUString & rName)3034cdf0e10cSrcweir ScFieldGroup& ScDataPilotFieldGroupsObj::getFieldGroup( const OUString& rName ) throw(RuntimeException)
3035cdf0e10cSrcweir {
3036cdf0e10cSrcweir     ScUnoGuard aGuard;
3037cdf0e10cSrcweir     ScFieldGroups::iterator aIt = implFindByName( rName );
3038cdf0e10cSrcweir     if( aIt == maGroups.end() )
3039cdf0e10cSrcweir         throw RuntimeException();
3040cdf0e10cSrcweir      return *aIt;
3041cdf0e10cSrcweir }
3042cdf0e10cSrcweir 
renameFieldGroup(const OUString & rOldName,const OUString & rNewName)3043cdf0e10cSrcweir void ScDataPilotFieldGroupsObj::renameFieldGroup( const OUString& rOldName, const OUString& rNewName ) throw(RuntimeException)
3044cdf0e10cSrcweir {
3045cdf0e10cSrcweir     ScUnoGuard aGuard;
3046cdf0e10cSrcweir     ScFieldGroups::iterator aOldIt = implFindByName( rOldName );
3047cdf0e10cSrcweir     ScFieldGroups::iterator aNewIt = implFindByName( rNewName );
3048cdf0e10cSrcweir     // new name must not exist yet
3049cdf0e10cSrcweir     if( (aOldIt == maGroups.end()) || ((aNewIt != maGroups.end()) && (aNewIt != aOldIt)) )
3050cdf0e10cSrcweir         throw RuntimeException();
3051cdf0e10cSrcweir     aOldIt->maName = rNewName;
3052cdf0e10cSrcweir }
3053cdf0e10cSrcweir 
3054cdf0e10cSrcweir // private
3055cdf0e10cSrcweir 
implFindByName(const OUString & rName)3056cdf0e10cSrcweir ScFieldGroups::iterator ScDataPilotFieldGroupsObj::implFindByName( const OUString& rName )
3057cdf0e10cSrcweir {
3058cdf0e10cSrcweir     for( ScFieldGroups::iterator aIt = maGroups.begin(), aEnd = maGroups.end(); aIt != aEnd; ++aIt )
3059cdf0e10cSrcweir         if( aIt->maName == rName )
3060cdf0e10cSrcweir             return aIt;
3061cdf0e10cSrcweir     return maGroups.end();
3062cdf0e10cSrcweir }
3063cdf0e10cSrcweir 
3064cdf0e10cSrcweir // ============================================================================
3065cdf0e10cSrcweir 
3066cdf0e10cSrcweir namespace {
3067cdf0e10cSrcweir 
lclExtractMember(const Any & rElement)3068cdf0e10cSrcweir OUString lclExtractMember( const Any& rElement )
3069cdf0e10cSrcweir {
3070cdf0e10cSrcweir     if( rElement.has< OUString >() )
3071cdf0e10cSrcweir         return rElement.get< OUString >();
3072cdf0e10cSrcweir 
3073cdf0e10cSrcweir     Reference< XNamed > xNamed( rElement, UNO_QUERY );
3074cdf0e10cSrcweir     if( xNamed.is() )
3075cdf0e10cSrcweir         return xNamed->getName();
3076cdf0e10cSrcweir 
3077cdf0e10cSrcweir     return OUString();
3078cdf0e10cSrcweir }
3079cdf0e10cSrcweir 
3080cdf0e10cSrcweir } // namespace
3081cdf0e10cSrcweir 
3082cdf0e10cSrcweir // ----------------------------------------------------------------------------
3083cdf0e10cSrcweir 
ScDataPilotFieldGroupObj(ScDataPilotFieldGroupsObj & rParent,const OUString & rGroupName)3084cdf0e10cSrcweir ScDataPilotFieldGroupObj::ScDataPilotFieldGroupObj( ScDataPilotFieldGroupsObj& rParent, const OUString& rGroupName ) :
3085cdf0e10cSrcweir     mrParent( rParent ),
3086cdf0e10cSrcweir     maGroupName( rGroupName )
3087cdf0e10cSrcweir {
3088cdf0e10cSrcweir     mrParent.acquire();
3089cdf0e10cSrcweir }
3090cdf0e10cSrcweir 
~ScDataPilotFieldGroupObj()3091cdf0e10cSrcweir ScDataPilotFieldGroupObj::~ScDataPilotFieldGroupObj()
3092cdf0e10cSrcweir {
3093cdf0e10cSrcweir     mrParent.release();
3094cdf0e10cSrcweir }
3095cdf0e10cSrcweir 
3096cdf0e10cSrcweir // XNameAccess
3097cdf0e10cSrcweir 
getByName(const OUString & rName)3098cdf0e10cSrcweir Any SAL_CALL ScDataPilotFieldGroupObj::getByName( const OUString& rName )
3099cdf0e10cSrcweir         throw(NoSuchElementException, WrappedTargetException, RuntimeException)
3100cdf0e10cSrcweir {
3101cdf0e10cSrcweir 	ScUnoGuard aGuard;
3102cdf0e10cSrcweir     ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers;
3103cdf0e10cSrcweir     ScFieldGroupMembers::iterator aIt = ::std::find( rMembers.begin(), rMembers.end(), rName );
3104cdf0e10cSrcweir     if( aIt == rMembers.end() )
3105cdf0e10cSrcweir         throw NoSuchElementException();
3106cdf0e10cSrcweir     return Any( Reference< XNamed >( new ScDataPilotFieldGroupItemObj( *this, *aIt ) ) );
3107cdf0e10cSrcweir }
3108cdf0e10cSrcweir 
getElementNames()3109cdf0e10cSrcweir Sequence< OUString > SAL_CALL ScDataPilotFieldGroupObj::getElementNames() throw(RuntimeException)
3110cdf0e10cSrcweir {
3111cdf0e10cSrcweir 	ScUnoGuard aGuard;
3112cdf0e10cSrcweir     return ::comphelper::containerToSequence( mrParent.getFieldGroup( maGroupName ).maMembers );
3113cdf0e10cSrcweir }
3114cdf0e10cSrcweir 
hasByName(const OUString & rName)3115cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotFieldGroupObj::hasByName( const OUString& rName ) throw(RuntimeException)
3116cdf0e10cSrcweir {
3117cdf0e10cSrcweir 	ScUnoGuard aGuard;
3118cdf0e10cSrcweir     ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers;
3119cdf0e10cSrcweir     return ::std::find( rMembers.begin(), rMembers.end(), rName ) != rMembers.end();
3120cdf0e10cSrcweir }
3121cdf0e10cSrcweir 
3122cdf0e10cSrcweir // XNameReplace
3123cdf0e10cSrcweir 
replaceByName(const OUString & rName,const Any & rElement)3124cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupObj::replaceByName( const OUString& rName, const Any& rElement )
3125cdf0e10cSrcweir         throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException)
3126cdf0e10cSrcweir {
3127cdf0e10cSrcweir     ScUnoGuard aGuard;
3128cdf0e10cSrcweir 
3129cdf0e10cSrcweir     // it should be possible to quickly rename an item -> accept string or XNamed
3130cdf0e10cSrcweir     OUString aNewName = lclExtractMember( rElement );
3131cdf0e10cSrcweir     if( (rName.getLength() == 0) || (aNewName.getLength() == 0) )
3132cdf0e10cSrcweir         throw IllegalArgumentException();
3133cdf0e10cSrcweir     if( rName == aNewName )
3134cdf0e10cSrcweir         return;
3135cdf0e10cSrcweir 
3136cdf0e10cSrcweir     ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers;
3137cdf0e10cSrcweir     ScFieldGroupMembers::iterator aOldIt = ::std::find( rMembers.begin(), rMembers.end(), rName );
3138cdf0e10cSrcweir     ScFieldGroupMembers::iterator aNewIt = ::std::find( rMembers.begin(), rMembers.end(), aNewName );
3139cdf0e10cSrcweir     // throw if passed member name does not exist
3140cdf0e10cSrcweir     if( aOldIt == rMembers.end() )
3141cdf0e10cSrcweir         throw NoSuchElementException();
3142cdf0e10cSrcweir     // throw if new name already exists
3143cdf0e10cSrcweir     if( aNewIt != rMembers.end() )
3144cdf0e10cSrcweir         throw IllegalArgumentException();
3145cdf0e10cSrcweir     *aOldIt = aNewName;
3146cdf0e10cSrcweir }
3147cdf0e10cSrcweir 
3148cdf0e10cSrcweir // XNameContainer
3149cdf0e10cSrcweir 
insertByName(const OUString & rName,const Any &)3150cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupObj::insertByName( const OUString& rName, const Any& /*rElement*/ )
3151cdf0e10cSrcweir         throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException)
3152cdf0e10cSrcweir {
3153cdf0e10cSrcweir     ScUnoGuard aGuard;
3154cdf0e10cSrcweir 
3155cdf0e10cSrcweir     // we will ignore the passed element and just try to insert the name
3156cdf0e10cSrcweir     if( rName.getLength() == 0 )
3157cdf0e10cSrcweir         throw IllegalArgumentException();
3158cdf0e10cSrcweir 
3159cdf0e10cSrcweir     ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers;
3160cdf0e10cSrcweir     ScFieldGroupMembers::iterator aIt = ::std::find( rMembers.begin(), rMembers.end(), rName );
3161cdf0e10cSrcweir     // throw if passed name already exists
3162cdf0e10cSrcweir     if( aIt != rMembers.end() )
3163cdf0e10cSrcweir         throw IllegalArgumentException();
3164cdf0e10cSrcweir     rMembers.push_back( rName );
3165cdf0e10cSrcweir }
3166cdf0e10cSrcweir 
removeByName(const OUString & rName)3167cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupObj::removeByName( const OUString& rName )
3168cdf0e10cSrcweir         throw (NoSuchElementException, WrappedTargetException, RuntimeException)
3169cdf0e10cSrcweir {
3170cdf0e10cSrcweir     ScUnoGuard aGuard;
3171cdf0e10cSrcweir 
3172cdf0e10cSrcweir     if( rName.getLength() == 0 )
3173cdf0e10cSrcweir         throw IllegalArgumentException();
3174cdf0e10cSrcweir     ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers;
3175cdf0e10cSrcweir     ScFieldGroupMembers::iterator aIt = ::std::find( rMembers.begin(), rMembers.end(), rName );
3176cdf0e10cSrcweir     // throw if passed name does not exist
3177cdf0e10cSrcweir     if( aIt == rMembers.end() )
3178cdf0e10cSrcweir         throw NoSuchElementException();
3179cdf0e10cSrcweir     rMembers.erase( aIt );
3180cdf0e10cSrcweir }
3181cdf0e10cSrcweir 
3182cdf0e10cSrcweir // XIndexAccess
3183cdf0e10cSrcweir 
getCount()3184cdf0e10cSrcweir sal_Int32 SAL_CALL ScDataPilotFieldGroupObj::getCount() throw(RuntimeException)
3185cdf0e10cSrcweir {
3186cdf0e10cSrcweir 	ScUnoGuard aGuard;
3187cdf0e10cSrcweir     return static_cast< sal_Int32 >( mrParent.getFieldGroup( maGroupName ).maMembers.size() );
3188cdf0e10cSrcweir }
3189cdf0e10cSrcweir 
getByIndex(sal_Int32 nIndex)3190cdf0e10cSrcweir Any SAL_CALL ScDataPilotFieldGroupObj::getByIndex( sal_Int32 nIndex )
3191cdf0e10cSrcweir         throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
3192cdf0e10cSrcweir {
3193cdf0e10cSrcweir 	ScUnoGuard aGuard;
3194cdf0e10cSrcweir     ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers;
3195cdf0e10cSrcweir     if ((nIndex < 0) || (nIndex >= static_cast< sal_Int32 >( rMembers.size() )))
3196cdf0e10cSrcweir         throw IndexOutOfBoundsException();
3197cdf0e10cSrcweir     return Any( Reference< XNamed >( new ScDataPilotFieldGroupItemObj( *this, rMembers[ nIndex ] ) ) );
3198cdf0e10cSrcweir }
3199cdf0e10cSrcweir 
3200cdf0e10cSrcweir // XEnumerationAccess
3201cdf0e10cSrcweir 
createEnumeration()3202cdf0e10cSrcweir Reference< XEnumeration > SAL_CALL ScDataPilotFieldGroupObj::createEnumeration() throw(RuntimeException)
3203cdf0e10cSrcweir {
3204cdf0e10cSrcweir     ScUnoGuard aGuard;
3205cdf0e10cSrcweir     return new ScIndexEnumeration( this, OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.DataPilotFieldGroupEnumeration" ) ) );
3206cdf0e10cSrcweir }
3207cdf0e10cSrcweir 
3208cdf0e10cSrcweir // XElementAccess
3209cdf0e10cSrcweir 
getElementType()3210cdf0e10cSrcweir uno::Type SAL_CALL ScDataPilotFieldGroupObj::getElementType() throw(RuntimeException)
3211cdf0e10cSrcweir {
3212cdf0e10cSrcweir 	ScUnoGuard aGuard;
3213cdf0e10cSrcweir     return getCppuType( (Reference< XNamed >*)0 );
3214cdf0e10cSrcweir }
3215cdf0e10cSrcweir 
hasElements()3216cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotFieldGroupObj::hasElements() throw(RuntimeException)
3217cdf0e10cSrcweir {
3218cdf0e10cSrcweir 	ScUnoGuard aGuard;
3219cdf0e10cSrcweir     return !mrParent.getFieldGroup( maGroupName ).maMembers.empty();
3220cdf0e10cSrcweir }
3221cdf0e10cSrcweir 
3222cdf0e10cSrcweir // XNamed
3223cdf0e10cSrcweir 
getName()3224cdf0e10cSrcweir OUString SAL_CALL ScDataPilotFieldGroupObj::getName() throw(RuntimeException)
3225cdf0e10cSrcweir {
3226cdf0e10cSrcweir 	ScUnoGuard aGuard;
3227cdf0e10cSrcweir     return maGroupName;
3228cdf0e10cSrcweir }
3229cdf0e10cSrcweir 
setName(const OUString & rName)3230cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupObj::setName( const OUString& rName ) throw(RuntimeException)
3231cdf0e10cSrcweir {
3232cdf0e10cSrcweir 	ScUnoGuard aGuard;
3233cdf0e10cSrcweir     mrParent.renameFieldGroup( maGroupName, rName );
3234cdf0e10cSrcweir     // if call to renameFieldGroup() did not throw, remember the new name
3235cdf0e10cSrcweir     maGroupName = rName;
3236cdf0e10cSrcweir }
3237cdf0e10cSrcweir 
3238cdf0e10cSrcweir // ============================================================================
3239cdf0e10cSrcweir 
ScDataPilotFieldGroupItemObj(ScDataPilotFieldGroupObj & rParent,const OUString & rName)3240cdf0e10cSrcweir ScDataPilotFieldGroupItemObj::ScDataPilotFieldGroupItemObj( ScDataPilotFieldGroupObj& rParent, const OUString& rName ) :
3241cdf0e10cSrcweir     mrParent( rParent ),
3242cdf0e10cSrcweir     maName( rName )
3243cdf0e10cSrcweir {
3244cdf0e10cSrcweir     mrParent.acquire();
3245cdf0e10cSrcweir }
3246cdf0e10cSrcweir 
~ScDataPilotFieldGroupItemObj()3247cdf0e10cSrcweir ScDataPilotFieldGroupItemObj::~ScDataPilotFieldGroupItemObj()
3248cdf0e10cSrcweir {
3249cdf0e10cSrcweir     mrParent.release();
3250cdf0e10cSrcweir }
3251cdf0e10cSrcweir 
3252cdf0e10cSrcweir // XNamed
3253cdf0e10cSrcweir 
getName()3254cdf0e10cSrcweir OUString SAL_CALL ScDataPilotFieldGroupItemObj::getName() throw(RuntimeException)
3255cdf0e10cSrcweir {
3256cdf0e10cSrcweir 	ScUnoGuard aGuard;
3257cdf0e10cSrcweir     return maName;
3258cdf0e10cSrcweir }
3259cdf0e10cSrcweir 
setName(const OUString & rName)3260cdf0e10cSrcweir void SAL_CALL ScDataPilotFieldGroupItemObj::setName( const OUString& rName ) throw(RuntimeException)
3261cdf0e10cSrcweir {
3262cdf0e10cSrcweir 	ScUnoGuard aGuard;
3263cdf0e10cSrcweir     mrParent.replaceByName( maName, Any( rName ) );
3264cdf0e10cSrcweir     // if call to replaceByName() did not throw, remember the new name
3265cdf0e10cSrcweir     maName = rName;
3266cdf0e10cSrcweir }
3267cdf0e10cSrcweir 
3268cdf0e10cSrcweir // ============================================================================
3269cdf0e10cSrcweir 
ScDataPilotItemsObj(ScDataPilotDescriptorBase & rParent,const ScFieldIdentifier & rFieldId)3270cdf0e10cSrcweir ScDataPilotItemsObj::ScDataPilotItemsObj( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId ) :
3271cdf0e10cSrcweir     ScDataPilotChildObjBase( rParent, rFieldId )
3272cdf0e10cSrcweir {
3273cdf0e10cSrcweir }
3274cdf0e10cSrcweir 
~ScDataPilotItemsObj()3275cdf0e10cSrcweir ScDataPilotItemsObj::~ScDataPilotItemsObj()
3276cdf0e10cSrcweir {
3277cdf0e10cSrcweir }
3278cdf0e10cSrcweir 
3279cdf0e10cSrcweir // XDataPilotItems
3280cdf0e10cSrcweir 
GetObjectByIndex_Impl(sal_Int32 nIndex) const3281cdf0e10cSrcweir ScDataPilotItemObj* ScDataPilotItemsObj::GetObjectByIndex_Impl( sal_Int32 nIndex ) const
3282cdf0e10cSrcweir {
3283cdf0e10cSrcweir     return ((0 <= nIndex) && (nIndex < GetMemberCount())) ?
3284cdf0e10cSrcweir         new ScDataPilotItemObj( mrParent, maFieldId, nIndex ) : 0;
3285cdf0e10cSrcweir }
3286cdf0e10cSrcweir 
3287cdf0e10cSrcweir // XNameAccess
3288cdf0e10cSrcweir 
getByName(const OUString & aName)3289cdf0e10cSrcweir Any SAL_CALL ScDataPilotItemsObj::getByName( const OUString& aName )
3290cdf0e10cSrcweir         throw(NoSuchElementException, WrappedTargetException, RuntimeException)
3291cdf0e10cSrcweir {
3292cdf0e10cSrcweir 	ScUnoGuard aGuard;
3293cdf0e10cSrcweir     Reference<XNameAccess> xMembers = GetMembers();
3294cdf0e10cSrcweir     if (xMembers.is())
3295cdf0e10cSrcweir     {
3296cdf0e10cSrcweir         Reference<XIndexAccess> xMembersIndex(new ScNameToIndexAccess( xMembers ));
3297cdf0e10cSrcweir         sal_Int32 nCount = xMembersIndex->getCount();
3298cdf0e10cSrcweir         sal_Bool bFound(sal_False);
3299cdf0e10cSrcweir         sal_Int32 nItem = 0;
3300cdf0e10cSrcweir         while (nItem < nCount && !bFound )
3301cdf0e10cSrcweir         {
3302cdf0e10cSrcweir             Reference<XNamed> xMember(xMembersIndex->getByIndex(nItem), UNO_QUERY);
3303cdf0e10cSrcweir             if (xMember.is() && (aName == xMember->getName()))
3304cdf0e10cSrcweir                 return Any( Reference< XPropertySet >( GetObjectByIndex_Impl( nItem ) ) );
3305cdf0e10cSrcweir             ++nItem;
3306cdf0e10cSrcweir         }
3307cdf0e10cSrcweir         if (!bFound)
3308cdf0e10cSrcweir             throw NoSuchElementException();
3309cdf0e10cSrcweir     }
3310cdf0e10cSrcweir     return Any();
3311cdf0e10cSrcweir }
3312cdf0e10cSrcweir 
getElementNames()3313cdf0e10cSrcweir Sequence<OUString> SAL_CALL ScDataPilotItemsObj::getElementNames()
3314cdf0e10cSrcweir                                                 throw(RuntimeException)
3315cdf0e10cSrcweir {
3316cdf0e10cSrcweir 	ScUnoGuard aGuard;
3317cdf0e10cSrcweir     Sequence< OUString > aSeq;
3318cdf0e10cSrcweir     if( ScDPObject* pDPObj = GetDPObject() )
3319cdf0e10cSrcweir         pDPObj->GetMemberNames( lcl_GetObjectIndex( pDPObj, maFieldId ), aSeq );
3320cdf0e10cSrcweir     return aSeq;
3321cdf0e10cSrcweir }
3322cdf0e10cSrcweir 
hasByName(const OUString & aName)3323cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotItemsObj::hasByName( const OUString& aName )
3324cdf0e10cSrcweir                                         throw(RuntimeException)
3325cdf0e10cSrcweir {
3326cdf0e10cSrcweir 	ScUnoGuard aGuard;
3327cdf0e10cSrcweir     sal_Bool bFound = sal_False;
3328cdf0e10cSrcweir     Reference<XNameAccess> xMembers = GetMembers();
3329cdf0e10cSrcweir     if (xMembers.is())
3330cdf0e10cSrcweir     {
3331cdf0e10cSrcweir         Reference<XIndexAccess> xMembersIndex(new ScNameToIndexAccess( xMembers ));
3332cdf0e10cSrcweir         sal_Int32 nCount = xMembersIndex->getCount();
3333cdf0e10cSrcweir         sal_Int32 nItem = 0;
3334cdf0e10cSrcweir         while (nItem < nCount && !bFound )
3335cdf0e10cSrcweir         {
3336cdf0e10cSrcweir             Reference<XNamed> xMember(xMembersIndex->getByIndex(nItem), UNO_QUERY);
3337cdf0e10cSrcweir             if (xMember.is() && aName == xMember->getName())
3338cdf0e10cSrcweir                 bFound = sal_True;
3339cdf0e10cSrcweir             else
3340cdf0e10cSrcweir                 nItem++;
3341cdf0e10cSrcweir         }
3342cdf0e10cSrcweir     }
3343cdf0e10cSrcweir     return bFound;
3344cdf0e10cSrcweir }
3345cdf0e10cSrcweir 
3346cdf0e10cSrcweir // XEnumerationAccess
3347cdf0e10cSrcweir 
createEnumeration()3348cdf0e10cSrcweir Reference<XEnumeration> SAL_CALL ScDataPilotItemsObj::createEnumeration()
3349cdf0e10cSrcweir                                                     throw(RuntimeException)
3350cdf0e10cSrcweir {
3351cdf0e10cSrcweir 	ScUnoGuard aGuard;
3352cdf0e10cSrcweir     return new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DataPilotItemsEnumeration")));
3353cdf0e10cSrcweir }
3354cdf0e10cSrcweir 
3355cdf0e10cSrcweir // XIndexAccess
3356cdf0e10cSrcweir 
getCount()3357cdf0e10cSrcweir sal_Int32 SAL_CALL ScDataPilotItemsObj::getCount() throw(RuntimeException)
3358cdf0e10cSrcweir {
3359cdf0e10cSrcweir 	ScUnoGuard aGuard;
3360cdf0e10cSrcweir     return GetMemberCount();
3361cdf0e10cSrcweir }
3362cdf0e10cSrcweir 
getByIndex(sal_Int32 nIndex)3363cdf0e10cSrcweir Any SAL_CALL ScDataPilotItemsObj::getByIndex( sal_Int32 nIndex )
3364cdf0e10cSrcweir         throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
3365cdf0e10cSrcweir {
3366cdf0e10cSrcweir 	ScUnoGuard aGuard;
3367cdf0e10cSrcweir     Reference< XPropertySet > xItem( GetObjectByIndex_Impl( nIndex ) );
3368cdf0e10cSrcweir     if (!xItem.is())
3369cdf0e10cSrcweir         throw IndexOutOfBoundsException();
3370cdf0e10cSrcweir     return Any( xItem );
3371cdf0e10cSrcweir }
3372cdf0e10cSrcweir 
getElementType()3373cdf0e10cSrcweir uno::Type SAL_CALL ScDataPilotItemsObj::getElementType() throw(RuntimeException)
3374cdf0e10cSrcweir {
3375cdf0e10cSrcweir 	ScUnoGuard aGuard;
3376cdf0e10cSrcweir     return getCppuType((Reference<XPropertySet>*)0);
3377cdf0e10cSrcweir }
3378cdf0e10cSrcweir 
hasElements()3379cdf0e10cSrcweir sal_Bool SAL_CALL ScDataPilotItemsObj::hasElements() throw(RuntimeException)
3380cdf0e10cSrcweir {
3381cdf0e10cSrcweir 	ScUnoGuard aGuard;
3382cdf0e10cSrcweir 	return ( getCount() != 0 );
3383cdf0e10cSrcweir }
3384cdf0e10cSrcweir 
3385cdf0e10cSrcweir //------------------------------------------------------------------------
3386cdf0e10cSrcweir 
ScDataPilotItemObj(ScDataPilotDescriptorBase & rParent,const ScFieldIdentifier & rFieldId,sal_Int32 nIndex)3387cdf0e10cSrcweir ScDataPilotItemObj::ScDataPilotItemObj( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId, sal_Int32 nIndex ) :
3388cdf0e10cSrcweir     ScDataPilotChildObjBase( rParent, rFieldId ),
3389cdf0e10cSrcweir     maPropSet( lcl_GetDataPilotItemMap() ),
3390cdf0e10cSrcweir     mnIndex( nIndex )
3391cdf0e10cSrcweir {
3392cdf0e10cSrcweir }
3393cdf0e10cSrcweir 
~ScDataPilotItemObj()3394cdf0e10cSrcweir ScDataPilotItemObj::~ScDataPilotItemObj()
3395cdf0e10cSrcweir {
3396cdf0e10cSrcweir }
3397cdf0e10cSrcweir 
3398cdf0e10cSrcweir 							// XNamed
getName()3399cdf0e10cSrcweir OUString SAL_CALL ScDataPilotItemObj::getName() throw(RuntimeException)
3400cdf0e10cSrcweir {
3401cdf0e10cSrcweir 	ScUnoGuard aGuard;
3402cdf0e10cSrcweir     OUString sRet;
3403cdf0e10cSrcweir     Reference<XNameAccess> xMembers = GetMembers();
3404cdf0e10cSrcweir     if (xMembers.is())
3405cdf0e10cSrcweir     {
3406cdf0e10cSrcweir         Reference<XIndexAccess> xMembersIndex(new ScNameToIndexAccess( xMembers ));
3407cdf0e10cSrcweir         sal_Int32 nCount = xMembersIndex->getCount();
3408cdf0e10cSrcweir         if (mnIndex < nCount)
3409cdf0e10cSrcweir         {
3410cdf0e10cSrcweir             Reference<XNamed> xMember(xMembersIndex->getByIndex(mnIndex), UNO_QUERY);
3411cdf0e10cSrcweir             sRet = xMember->getName();
3412cdf0e10cSrcweir         }
3413cdf0e10cSrcweir     }
3414cdf0e10cSrcweir     return sRet;
3415cdf0e10cSrcweir }
3416cdf0e10cSrcweir 
setName(const OUString &)3417cdf0e10cSrcweir void SAL_CALL ScDataPilotItemObj::setName( const OUString& /* aName */ )
3418cdf0e10cSrcweir                                 throw(RuntimeException)
3419cdf0e10cSrcweir {
3420cdf0e10cSrcweir }
3421cdf0e10cSrcweir 
3422cdf0e10cSrcweir 							// XPropertySet
3423cdf0e10cSrcweir Reference< XPropertySetInfo >
getPropertySetInfo()3424cdf0e10cSrcweir 							SAL_CALL ScDataPilotItemObj::getPropertySetInfo(  )
3425cdf0e10cSrcweir                                 throw(RuntimeException)
3426cdf0e10cSrcweir {
3427cdf0e10cSrcweir 	ScUnoGuard aGuard;
3428cdf0e10cSrcweir     static Reference<XPropertySetInfo> aRef =
3429cdf0e10cSrcweir         new SfxItemPropertySetInfo( maPropSet.getPropertyMap() );
3430cdf0e10cSrcweir 	return aRef;
3431cdf0e10cSrcweir }
3432cdf0e10cSrcweir 
setPropertyValue(const OUString & aPropertyName,const Any & aValue)3433cdf0e10cSrcweir void SAL_CALL ScDataPilotItemObj::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
3434cdf0e10cSrcweir         throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
3435cdf0e10cSrcweir {
3436cdf0e10cSrcweir 	ScUnoGuard aGuard;
3437cdf0e10cSrcweir     ScDPObject* pDPObj = 0;
3438cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) )
3439cdf0e10cSrcweir     {
3440cdf0e10cSrcweir         Reference<XNameAccess> xMembers = GetMembers();
3441cdf0e10cSrcweir         if( xMembers.is() )
3442cdf0e10cSrcweir         {
3443cdf0e10cSrcweir             Reference<XIndexAccess> xMembersIndex( new ScNameToIndexAccess( xMembers ) );
3444cdf0e10cSrcweir             sal_Int32 nCount = xMembersIndex->getCount();
3445cdf0e10cSrcweir             if( mnIndex < nCount )
3446cdf0e10cSrcweir 	        {
3447cdf0e10cSrcweir                 Reference<XNamed> xMember(xMembersIndex->getByIndex(mnIndex), UNO_QUERY);
3448cdf0e10cSrcweir                 String sName(xMember->getName());
3449cdf0e10cSrcweir                 ScDPSaveMember* pMember = pDim->GetMemberByName(sName);
3450cdf0e10cSrcweir                 if (pMember)
3451cdf0e10cSrcweir                 {
3452cdf0e10cSrcweir                     bool bGetNewIndex = false;
3453cdf0e10cSrcweir                     if ( aPropertyName.equalsAscii( SC_UNONAME_SHOWDETAIL ) )
3454cdf0e10cSrcweir                         pMember->SetShowDetails(cppu::any2bool(aValue));
3455cdf0e10cSrcweir                     else if ( aPropertyName.equalsAscii( SC_UNONAME_ISHIDDEN ) )
3456cdf0e10cSrcweir                         pMember->SetIsVisible(!cppu::any2bool(aValue));
3457cdf0e10cSrcweir                     else if ( aPropertyName.equalsAscii( SC_UNONAME_POS ) )
3458cdf0e10cSrcweir                     {
3459cdf0e10cSrcweir                         sal_Int32 nNewPos = 0;
3460cdf0e10cSrcweir                         if ( ( aValue >>= nNewPos ) && nNewPos >= 0 && nNewPos < nCount )
3461cdf0e10cSrcweir                         {
3462cdf0e10cSrcweir                             pDim->SetMemberPosition( sName, nNewPos );
3463cdf0e10cSrcweir                             // get new effective index (depends on sorting mode, which isn't modified)
3464cdf0e10cSrcweir                             bGetNewIndex = true;
3465cdf0e10cSrcweir                         }
3466cdf0e10cSrcweir                         else
3467cdf0e10cSrcweir                             throw IllegalArgumentException();
3468cdf0e10cSrcweir                     }
3469cdf0e10cSrcweir                     SetDPObject( pDPObj );
3470cdf0e10cSrcweir 
3471cdf0e10cSrcweir                     if ( bGetNewIndex )     // after SetDPObject, get the new index
3472cdf0e10cSrcweir                     {
3473cdf0e10cSrcweir                         OUString aOUName( sName );
3474cdf0e10cSrcweir                         Sequence< OUString > aItemNames = xMembers->getElementNames();
3475cdf0e10cSrcweir                         sal_Int32 nItemCount = aItemNames.getLength();
3476cdf0e10cSrcweir                         for (sal_Int32 nItem=0; nItem<nItemCount; ++nItem)
3477cdf0e10cSrcweir                             if (aItemNames[nItem] == aOUName)
3478cdf0e10cSrcweir                                 mnIndex = nItem;
3479cdf0e10cSrcweir                     }
3480cdf0e10cSrcweir                 }
3481cdf0e10cSrcweir             }
3482cdf0e10cSrcweir         }
3483cdf0e10cSrcweir     }
3484cdf0e10cSrcweir }
3485cdf0e10cSrcweir 
getPropertyValue(const OUString & aPropertyName)3486cdf0e10cSrcweir Any SAL_CALL ScDataPilotItemObj::getPropertyValue( const OUString& aPropertyName )
3487cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
3488cdf0e10cSrcweir {
3489cdf0e10cSrcweir 	ScUnoGuard aGuard;
3490cdf0e10cSrcweir     Any aRet;
3491cdf0e10cSrcweir     if( ScDPSaveDimension* pDim = GetDPDimension() )
3492cdf0e10cSrcweir     {
3493cdf0e10cSrcweir         Reference< XNameAccess > xMembers = GetMembers();
3494cdf0e10cSrcweir         if( xMembers.is() )
3495cdf0e10cSrcweir         {
3496cdf0e10cSrcweir             Reference< XIndexAccess > xMembersIndex( new ScNameToIndexAccess( xMembers ) );
3497cdf0e10cSrcweir             sal_Int32 nCount = xMembersIndex->getCount();
3498cdf0e10cSrcweir             if( mnIndex < nCount )
3499cdf0e10cSrcweir 	        {
3500cdf0e10cSrcweir                 Reference< XNamed > xMember( xMembersIndex->getByIndex( mnIndex ), UNO_QUERY );
3501cdf0e10cSrcweir                 String sName( xMember->getName() );
3502cdf0e10cSrcweir                 ScDPSaveMember* pMember = pDim->GetExistingMemberByName( sName );
3503cdf0e10cSrcweir                 if( aPropertyName.equalsAscii( SC_UNONAME_SHOWDETAIL ) )
3504cdf0e10cSrcweir                 {
3505cdf0e10cSrcweir                     if (pMember && pMember->HasShowDetails())
3506cdf0e10cSrcweir                     {
3507cdf0e10cSrcweir                         aRet <<= (bool)pMember->GetShowDetails();
3508cdf0e10cSrcweir                     }
3509cdf0e10cSrcweir                     else
3510cdf0e10cSrcweir                     {
3511cdf0e10cSrcweir                         Reference< XPropertySet > xMemberProps( xMember, UNO_QUERY );
3512cdf0e10cSrcweir                         if( xMemberProps.is() )
3513cdf0e10cSrcweir                             aRet = xMemberProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_SHOWDETA ) ) );
3514cdf0e10cSrcweir                         else
3515cdf0e10cSrcweir                             aRet <<= true;
3516cdf0e10cSrcweir                     }
3517cdf0e10cSrcweir                 }
3518cdf0e10cSrcweir                 else if ( aPropertyName.equalsAscii( SC_UNONAME_ISHIDDEN ) )
3519cdf0e10cSrcweir                 {
3520cdf0e10cSrcweir                     if (pMember && pMember->HasIsVisible())
3521cdf0e10cSrcweir                     {
3522cdf0e10cSrcweir                         aRet <<= !pMember->GetIsVisible();
3523cdf0e10cSrcweir                     }
3524cdf0e10cSrcweir                     else
3525cdf0e10cSrcweir                     {
3526cdf0e10cSrcweir                         Reference< XPropertySet > xMemberProps( xMember, UNO_QUERY );
3527cdf0e10cSrcweir                         if( xMemberProps.is() )
3528cdf0e10cSrcweir                             aRet <<= !cppu::any2bool( xMemberProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_ISVISIBL ) ) ) );
3529cdf0e10cSrcweir                         else
3530cdf0e10cSrcweir                             aRet <<= false;
3531cdf0e10cSrcweir                     }
3532cdf0e10cSrcweir                 }
3533cdf0e10cSrcweir                 else if ( aPropertyName.equalsAscii( SC_UNONAME_POS ) )
3534cdf0e10cSrcweir                 {
3535cdf0e10cSrcweir                     aRet <<= mnIndex;
3536cdf0e10cSrcweir                 }
3537cdf0e10cSrcweir             }
3538cdf0e10cSrcweir         }
3539cdf0e10cSrcweir     }
3540cdf0e10cSrcweir     return aRet;
3541cdf0e10cSrcweir }
3542cdf0e10cSrcweir 
addPropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)3543cdf0e10cSrcweir void SAL_CALL ScDataPilotItemObj::addPropertyChangeListener(
3544cdf0e10cSrcweir         const OUString& /* aPropertyName */, const Reference< XPropertyChangeListener >& /* xListener */ )
3545cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
3546cdf0e10cSrcweir {
3547cdf0e10cSrcweir }
3548cdf0e10cSrcweir 
removePropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)3549cdf0e10cSrcweir void SAL_CALL ScDataPilotItemObj::removePropertyChangeListener(
3550cdf0e10cSrcweir         const OUString& /* aPropertyName */, const Reference< XPropertyChangeListener >& /* aListener */ )
3551cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
3552cdf0e10cSrcweir {
3553cdf0e10cSrcweir }
3554cdf0e10cSrcweir 
addVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)3555cdf0e10cSrcweir void SAL_CALL ScDataPilotItemObj::addVetoableChangeListener(
3556cdf0e10cSrcweir         const OUString& /* PropertyName */, const Reference< XVetoableChangeListener >& /* aListener */ )
3557cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
3558cdf0e10cSrcweir {
3559cdf0e10cSrcweir }
3560cdf0e10cSrcweir 
removeVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)3561cdf0e10cSrcweir void SAL_CALL ScDataPilotItemObj::removeVetoableChangeListener(
3562cdf0e10cSrcweir         const OUString& /* PropertyName */, const Reference< XVetoableChangeListener >& /* aListener */ )
3563cdf0e10cSrcweir         throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
3564cdf0e10cSrcweir {
3565cdf0e10cSrcweir }
3566cdf0e10cSrcweir 
3567cdf0e10cSrcweir //------------------------------------------------------------------------
3568cdf0e10cSrcweir 
3569cdf0e10cSrcweir 
3570cdf0e10cSrcweir 
3571cdf0e10cSrcweir 
3572