xref: /aoo4110/main/sc/source/ui/unoobj/datauno.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
30*b1cdbd2cSJim Jagielski #include <svl/smplhint.hxx>
31*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
32*b1cdbd2cSJim Jagielski #include <rtl/uuid.h>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XBitmap.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/util/SortField.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/table/TableSortField.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/table/TableOrientation.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/table/CellRangeAddress.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/sheet/DataImportMode.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/sheet/FilterOperator2.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/sheet/TableFilterField2.hpp>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include "datauno.hxx"
45*b1cdbd2cSJim Jagielski #include "dapiuno.hxx"
46*b1cdbd2cSJim Jagielski #include "cellsuno.hxx"
47*b1cdbd2cSJim Jagielski #include "miscuno.hxx"
48*b1cdbd2cSJim Jagielski #include "targuno.hxx"
49*b1cdbd2cSJim Jagielski #include "rangeutl.hxx"
50*b1cdbd2cSJim Jagielski #include "dbcolect.hxx"
51*b1cdbd2cSJim Jagielski #include "docsh.hxx"
52*b1cdbd2cSJim Jagielski #include "dbdocfun.hxx"
53*b1cdbd2cSJim Jagielski #include "unoguard.hxx"
54*b1cdbd2cSJim Jagielski #include "unonames.hxx"
55*b1cdbd2cSJim Jagielski #include "globstr.hrc"
56*b1cdbd2cSJim Jagielski #ifndef SC_CONVUNO_HXX
57*b1cdbd2cSJim Jagielski #include "convuno.hxx"
58*b1cdbd2cSJim Jagielski #include "hints.hxx"
59*b1cdbd2cSJim Jagielski #endif
60*b1cdbd2cSJim Jagielski #include "attrib.hxx"
61*b1cdbd2cSJim Jagielski #include "dpshttab.hxx"
62*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
63*b1cdbd2cSJim Jagielski #include <svx/dataaccessdescriptor.hxx>
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski using namespace com::sun::star;
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR( XDBRefreshListenerArr_Impl, XDBRefreshListenerPtr );
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski //	alles ohne Which-ID, Map nur fuer PropertySetInfo
72*b1cdbd2cSJim Jagielski 
lcl_GetSubTotalPropertyMap()73*b1cdbd2cSJim Jagielski const SfxItemPropertyMapEntry* lcl_GetSubTotalPropertyMap()
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski 	// some old property names are for 5.2 compatibility
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski     static SfxItemPropertyMapEntry aSubTotalPropertyMap_Impl[] =
78*b1cdbd2cSJim Jagielski 	{
79*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_BINDFMT),  0,  &getBooleanCppuType(),       0, 0},
80*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_CASE),     0,  &getBooleanCppuType(),       0, 0},
81*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_ENABSORT), 0,  &getBooleanCppuType(),       0, 0},
82*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_ENUSLIST), 0,  &getBooleanCppuType(),       0, 0},
83*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_FORMATS),  0,  &getBooleanCppuType(),       0, 0},
84*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_INSBRK),   0,  &getBooleanCppuType(),       0, 0},
85*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_ISCASE),   0,  &getBooleanCppuType(),       0, 0},
86*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_MAXFLD),   0,  &getCppuType((sal_Int32*)0), beans::PropertyAttribute::READONLY, 0},
87*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_SORTASC),  0,  &getBooleanCppuType(),       0, 0},
88*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_ULIST),    0,  &getBooleanCppuType(),       0, 0},
89*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_UINDEX),   0,  &getCppuType((sal_Int32*)0), 0, 0},
90*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_USINDEX),  0,  &getCppuType((sal_Int32*)0), 0, 0},
91*b1cdbd2cSJim Jagielski         {0,0,0,0,0,0}
92*b1cdbd2cSJim Jagielski 	};
93*b1cdbd2cSJim Jagielski 	return aSubTotalPropertyMap_Impl;
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
lcl_GetFilterPropertyMap()96*b1cdbd2cSJim Jagielski const SfxItemPropertyMapEntry* lcl_GetFilterPropertyMap()
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski     static SfxItemPropertyMapEntry aFilterPropertyMap_Impl[] =
99*b1cdbd2cSJim Jagielski 	{
100*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_CONTHDR),  0,  &getBooleanCppuType(),                      0, 0},
101*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_COPYOUT),  0,  &getBooleanCppuType(),                      0, 0},
102*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_ISCASE),   0,  &getBooleanCppuType(),                      0, 0},
103*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_MAXFLD),   0,  &getCppuType((sal_Int32*)0),                beans::PropertyAttribute::READONLY, 0},
104*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_ORIENT),   0,  &getCppuType((table::TableOrientation*)0),  0, 0},
105*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_OUTPOS),   0,  &getCppuType((table::CellAddress*)0),       0, 0},
106*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_SAVEOUT),  0,  &getBooleanCppuType(),                      0, 0},
107*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_SKIPDUP),  0,  &getBooleanCppuType(),                      0, 0},
108*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_USEREGEX), 0,  &getBooleanCppuType(),                      0, 0},
109*b1cdbd2cSJim Jagielski         {0,0,0,0,0,0}
110*b1cdbd2cSJim Jagielski 	};
111*b1cdbd2cSJim Jagielski 	return aFilterPropertyMap_Impl;
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski 
lcl_GetDBRangePropertyMap()114*b1cdbd2cSJim Jagielski const SfxItemPropertyMapEntry* lcl_GetDBRangePropertyMap()
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski     static SfxItemPropertyMapEntry aDBRangePropertyMap_Impl[] =
117*b1cdbd2cSJim Jagielski 	{
118*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_AUTOFLT),  0,  &getBooleanCppuType(),                      0, 0},
119*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_FLTCRT),   0,  &getCppuType((table::CellRangeAddress*)0),  0, 0},
120*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_FROMSELECT),0, &getBooleanCppuType(),                      0, 0},
121*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_ISUSER),   0,  &getBooleanCppuType(),           beans::PropertyAttribute::READONLY, 0 },
122*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_KEEPFORM), 0,  &getBooleanCppuType(),                      0, 0},
123*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT),  0,  &getCppuType((uno::Reference<awt::XBitmap>*)0), beans::PropertyAttribute::READONLY, 0 },
124*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), 0,  &getCppuType((rtl::OUString*)0), beans::PropertyAttribute::READONLY, 0 },
125*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_MOVCELLS), 0,  &getBooleanCppuType(),                      0, 0},
126*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_REFPERIOD), 0, &getCppuType((sal_Int32*)0),                0, 0},
127*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_STRIPDAT), 0,  &getBooleanCppuType(),                      0, 0},
128*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_TOKENINDEX),0, &getCppuType((sal_Int32*)0),     beans::PropertyAttribute::READONLY, 0 },
129*b1cdbd2cSJim Jagielski         {MAP_CHAR_LEN(SC_UNONAME_USEFLTCRT),0,  &getBooleanCppuType(),                      0, 0},
130*b1cdbd2cSJim Jagielski         {0,0,0,0,0,0}
131*b1cdbd2cSJim Jagielski 	};
132*b1cdbd2cSJim Jagielski 	return aDBRangePropertyMap_Impl;
133*b1cdbd2cSJim Jagielski }
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski #define SCDATABASERANGEOBJ_SERVICE		"com.sun.star.sheet.DatabaseRange"
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski SC_SIMPLE_SERVICE_INFO( ScConsolidationDescriptor, "ScConsolidationDescriptor", "com.sun.star.sheet.ConsolidationDescriptor" )
141*b1cdbd2cSJim Jagielski SC_SIMPLE_SERVICE_INFO( ScDatabaseRangesObj, "ScDatabaseRangesObj", "com.sun.star.sheet.DatabaseRanges" )
142*b1cdbd2cSJim Jagielski SC_SIMPLE_SERVICE_INFO( ScFilterDescriptorBase, "ScFilterDescriptorBase", "com.sun.star.sheet.SheetFilterDescriptor" )
143*b1cdbd2cSJim Jagielski SC_SIMPLE_SERVICE_INFO( ScSubTotalDescriptorBase, "ScSubTotalDescriptorBase", "com.sun.star.sheet.SubTotalDescriptor" )
144*b1cdbd2cSJim Jagielski SC_SIMPLE_SERVICE_INFO( ScSubTotalFieldObj, "ScSubTotalFieldObj", "com.sun.star.sheet.SubTotalField" )
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski // static
GeneralToSubTotal(sheet::GeneralFunction eSummary)150*b1cdbd2cSJim Jagielski ScSubTotalFunc ScDataUnoConversion::GeneralToSubTotal( sheet::GeneralFunction eSummary )
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski 	ScSubTotalFunc eSubTotal;
153*b1cdbd2cSJim Jagielski 	switch (eSummary)
154*b1cdbd2cSJim Jagielski 	{
155*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_NONE:		eSubTotal = SUBTOTAL_FUNC_NONE;	break;
156*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_SUM:		eSubTotal = SUBTOTAL_FUNC_SUM;	break;
157*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_COUNT:		eSubTotal = SUBTOTAL_FUNC_CNT2;	break;
158*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_AVERAGE:	eSubTotal = SUBTOTAL_FUNC_AVE;	break;
159*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_MAX:		eSubTotal = SUBTOTAL_FUNC_MAX;	break;
160*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_MIN:		eSubTotal = SUBTOTAL_FUNC_MIN;	break;
161*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_PRODUCT:	eSubTotal = SUBTOTAL_FUNC_PROD;	break;
162*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_COUNTNUMS:	eSubTotal = SUBTOTAL_FUNC_CNT;	break;
163*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_STDEV:		eSubTotal = SUBTOTAL_FUNC_STD;	break;
164*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_STDEVP:		eSubTotal = SUBTOTAL_FUNC_STDP;	break;
165*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_VAR:		eSubTotal = SUBTOTAL_FUNC_VAR;	break;
166*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_VARP:		eSubTotal = SUBTOTAL_FUNC_VARP;	break;
167*b1cdbd2cSJim Jagielski 		case sheet::GeneralFunction_AUTO:
168*b1cdbd2cSJim Jagielski 		default:
169*b1cdbd2cSJim Jagielski 			DBG_ERROR("GeneralToSubTotal: falscher enum");
170*b1cdbd2cSJim Jagielski 			eSubTotal = SUBTOTAL_FUNC_NONE;
171*b1cdbd2cSJim Jagielski 	}
172*b1cdbd2cSJim Jagielski 	return eSubTotal;
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski // static
SubTotalToGeneral(ScSubTotalFunc eSubTotal)176*b1cdbd2cSJim Jagielski sheet::GeneralFunction	ScDataUnoConversion::SubTotalToGeneral( ScSubTotalFunc eSubTotal )
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski 	sheet::GeneralFunction eGeneral;
179*b1cdbd2cSJim Jagielski 	switch (eSubTotal)
180*b1cdbd2cSJim Jagielski 	{
181*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_NONE: eGeneral = sheet::GeneralFunction_NONE;	  break;
182*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_AVE:  eGeneral = sheet::GeneralFunction_AVERAGE;	  break;
183*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_CNT:  eGeneral = sheet::GeneralFunction_COUNTNUMS; break;
184*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_CNT2: eGeneral = sheet::GeneralFunction_COUNT;	  break;
185*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_MAX:  eGeneral = sheet::GeneralFunction_MAX;		  break;
186*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_MIN:  eGeneral = sheet::GeneralFunction_MIN;		  break;
187*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_PROD: eGeneral = sheet::GeneralFunction_PRODUCT;	  break;
188*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_STD:  eGeneral = sheet::GeneralFunction_STDEV;	  break;
189*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_STDP: eGeneral = sheet::GeneralFunction_STDEVP;	  break;
190*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_SUM:  eGeneral = sheet::GeneralFunction_SUM;		  break;
191*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_VAR:  eGeneral = sheet::GeneralFunction_VAR;		  break;
192*b1cdbd2cSJim Jagielski 		case SUBTOTAL_FUNC_VARP: eGeneral = sheet::GeneralFunction_VARP;	  break;
193*b1cdbd2cSJim Jagielski 		default:
194*b1cdbd2cSJim Jagielski 			DBG_ERROR("SubTotalToGeneral: falscher enum");
195*b1cdbd2cSJim Jagielski 			eGeneral = sheet::GeneralFunction_NONE;
196*b1cdbd2cSJim Jagielski 			break;
197*b1cdbd2cSJim Jagielski 	}
198*b1cdbd2cSJim Jagielski 	return eGeneral;
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski //	ScImportDescriptor: alles static
204*b1cdbd2cSJim Jagielski 
GetPropertyCount()205*b1cdbd2cSJim Jagielski long ScImportDescriptor::GetPropertyCount()
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski 	return 4;
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski 
FillProperties(uno::Sequence<beans::PropertyValue> & rSeq,const ScImportParam & rParam)210*b1cdbd2cSJim Jagielski void ScImportDescriptor::FillProperties( uno::Sequence<beans::PropertyValue>& rSeq, const ScImportParam& rParam )
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski 	DBG_ASSERT( rSeq.getLength() == GetPropertyCount(), "falscher Count" );
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	beans::PropertyValue* pArray = rSeq.getArray();
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski 	sheet::DataImportMode eMode = sheet::DataImportMode_NONE;
217*b1cdbd2cSJim Jagielski 	if ( rParam.bImport )
218*b1cdbd2cSJim Jagielski 	{
219*b1cdbd2cSJim Jagielski 		if ( rParam.bSql )
220*b1cdbd2cSJim Jagielski 			eMode = sheet::DataImportMode_SQL;
221*b1cdbd2cSJim Jagielski 		else if ( rParam.nType == ScDbQuery )
222*b1cdbd2cSJim Jagielski 			eMode = sheet::DataImportMode_QUERY;
223*b1cdbd2cSJim Jagielski 		else
224*b1cdbd2cSJim Jagielski 			eMode = sheet::DataImportMode_TABLE;		// Type ist immer ScDbQuery oder ScDbTable
225*b1cdbd2cSJim Jagielski 	}
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski     ::svx::ODataAccessDescriptor aDescriptor;
228*b1cdbd2cSJim Jagielski 	aDescriptor.setDataSource(rParam.aDBName);
229*b1cdbd2cSJim Jagielski     if (aDescriptor.has( svx::daDataSource ))
230*b1cdbd2cSJim Jagielski     {
231*b1cdbd2cSJim Jagielski 	    pArray[0].Name = rtl::OUString::createFromAscii( SC_UNONAME_DBNAME );
232*b1cdbd2cSJim Jagielski 	    pArray[0].Value <<= rtl::OUString( rParam.aDBName );
233*b1cdbd2cSJim Jagielski     }
234*b1cdbd2cSJim Jagielski     else if (aDescriptor.has( svx::daConnectionResource ))
235*b1cdbd2cSJim Jagielski     {
236*b1cdbd2cSJim Jagielski 	    pArray[0].Name = rtl::OUString::createFromAscii( SC_UNONAME_CONRES );
237*b1cdbd2cSJim Jagielski 	    pArray[0].Value <<= rtl::OUString( rParam.aDBName );
238*b1cdbd2cSJim Jagielski     }
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 	pArray[1].Name = rtl::OUString::createFromAscii( SC_UNONAME_SRCTYPE );
241*b1cdbd2cSJim Jagielski 	pArray[1].Value <<= eMode;
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski 	pArray[2].Name = rtl::OUString::createFromAscii( SC_UNONAME_SRCOBJ );
244*b1cdbd2cSJim Jagielski 	pArray[2].Value <<= rtl::OUString( rParam.aStatement );
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 	pArray[3].Name = rtl::OUString::createFromAscii( SC_UNONAME_ISNATIVE );
247*b1cdbd2cSJim Jagielski 	ScUnoHelpFunctions::SetBoolInAny( pArray[3].Value, rParam.bNative );
248*b1cdbd2cSJim Jagielski }
249*b1cdbd2cSJim Jagielski 
FillImportParam(ScImportParam & rParam,const uno::Sequence<beans::PropertyValue> & rSeq)250*b1cdbd2cSJim Jagielski void ScImportDescriptor::FillImportParam( ScImportParam& rParam, const uno::Sequence<beans::PropertyValue>& rSeq )
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski 	rtl::OUString aStrVal;
253*b1cdbd2cSJim Jagielski 	const beans::PropertyValue* pPropArray = rSeq.getConstArray();
254*b1cdbd2cSJim Jagielski 	long nPropCount = rSeq.getLength();
255*b1cdbd2cSJim Jagielski 	for (long i = 0; i < nPropCount; i++)
256*b1cdbd2cSJim Jagielski 	{
257*b1cdbd2cSJim Jagielski 		const beans::PropertyValue& rProp = pPropArray[i];
258*b1cdbd2cSJim Jagielski 		String aPropName(rProp.Name);
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 		if (aPropName.EqualsAscii( SC_UNONAME_ISNATIVE ))
261*b1cdbd2cSJim Jagielski 			rParam.bNative = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
262*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_DBNAME ))
263*b1cdbd2cSJim Jagielski 		{
264*b1cdbd2cSJim Jagielski 			if ( rProp.Value >>= aStrVal )
265*b1cdbd2cSJim Jagielski 				rParam.aDBName = String( aStrVal );
266*b1cdbd2cSJim Jagielski 		}
267*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_CONRES ))
268*b1cdbd2cSJim Jagielski 		{
269*b1cdbd2cSJim Jagielski 			if ( rProp.Value >>= aStrVal )
270*b1cdbd2cSJim Jagielski 				rParam.aDBName = String( aStrVal );
271*b1cdbd2cSJim Jagielski 		}
272*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_SRCOBJ ))
273*b1cdbd2cSJim Jagielski 		{
274*b1cdbd2cSJim Jagielski 			if ( rProp.Value >>= aStrVal )
275*b1cdbd2cSJim Jagielski 				rParam.aStatement = String( aStrVal );
276*b1cdbd2cSJim Jagielski 		}
277*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_SRCTYPE ))
278*b1cdbd2cSJim Jagielski 		{
279*b1cdbd2cSJim Jagielski 			//!	test for correct enum type?
280*b1cdbd2cSJim Jagielski 			sheet::DataImportMode eMode = (sheet::DataImportMode)
281*b1cdbd2cSJim Jagielski 								ScUnoHelpFunctions::GetEnumFromAny( rProp.Value );
282*b1cdbd2cSJim Jagielski 			switch (eMode)
283*b1cdbd2cSJim Jagielski 			{
284*b1cdbd2cSJim Jagielski 				case sheet::DataImportMode_NONE:
285*b1cdbd2cSJim Jagielski 					rParam.bImport = sal_False;
286*b1cdbd2cSJim Jagielski 					break;
287*b1cdbd2cSJim Jagielski 				case sheet::DataImportMode_SQL:
288*b1cdbd2cSJim Jagielski 					rParam.bImport = sal_True;
289*b1cdbd2cSJim Jagielski 					rParam.bSql    = sal_True;
290*b1cdbd2cSJim Jagielski 					break;
291*b1cdbd2cSJim Jagielski 				case sheet::DataImportMode_TABLE:
292*b1cdbd2cSJim Jagielski 					rParam.bImport = sal_True;
293*b1cdbd2cSJim Jagielski 					rParam.bSql    = sal_False;
294*b1cdbd2cSJim Jagielski 					rParam.nType   = ScDbTable;
295*b1cdbd2cSJim Jagielski 					break;
296*b1cdbd2cSJim Jagielski 				case sheet::DataImportMode_QUERY:
297*b1cdbd2cSJim Jagielski 					rParam.bImport = sal_True;
298*b1cdbd2cSJim Jagielski 					rParam.bSql    = sal_False;
299*b1cdbd2cSJim Jagielski 					rParam.nType   = ScDbQuery;
300*b1cdbd2cSJim Jagielski 					break;
301*b1cdbd2cSJim Jagielski 				default:
302*b1cdbd2cSJim Jagielski 					DBG_ERROR("falscher Mode");
303*b1cdbd2cSJim Jagielski 					rParam.bImport = sal_False;
304*b1cdbd2cSJim Jagielski 			}
305*b1cdbd2cSJim Jagielski 		}
306*b1cdbd2cSJim Jagielski 	}
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski //	ScSortDescriptor: alles static
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski //!	SortAscending muss aus der SheetSortDescriptor service-Beschreibung raus
314*b1cdbd2cSJim Jagielski 
GetPropertyCount()315*b1cdbd2cSJim Jagielski long ScSortDescriptor::GetPropertyCount()
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski 	return 9;		// TableSortDescriptor and SheetSortDescriptor
318*b1cdbd2cSJim Jagielski }
319*b1cdbd2cSJim Jagielski 
FillProperties(uno::Sequence<beans::PropertyValue> & rSeq,const ScSortParam & rParam)320*b1cdbd2cSJim Jagielski void ScSortDescriptor::FillProperties( uno::Sequence<beans::PropertyValue>& rSeq, const ScSortParam& rParam )
321*b1cdbd2cSJim Jagielski {
322*b1cdbd2cSJim Jagielski 	DBG_ASSERT( rSeq.getLength() == GetPropertyCount(), "falscher Count" );
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	beans::PropertyValue* pArray = rSeq.getArray();
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski 	//	Uno-Werte zusammensuchen
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 	table::CellAddress aOutPos;
329*b1cdbd2cSJim Jagielski 	aOutPos.Sheet  = rParam.nDestTab;
330*b1cdbd2cSJim Jagielski 	aOutPos.Column = rParam.nDestCol;
331*b1cdbd2cSJim Jagielski 	aOutPos.Row    = rParam.nDestRow;
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 	sal_uInt16 nSortCount = 0;
334*b1cdbd2cSJim Jagielski 	while ( nSortCount < MAXSORT && rParam.bDoSort[nSortCount] )
335*b1cdbd2cSJim Jagielski 		++nSortCount;
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 	uno::Sequence<table::TableSortField> aFields(nSortCount);
338*b1cdbd2cSJim Jagielski 	if (nSortCount)
339*b1cdbd2cSJim Jagielski 	{
340*b1cdbd2cSJim Jagielski 		table::TableSortField* pFieldArray = aFields.getArray();
341*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i=0; i<nSortCount; i++)
342*b1cdbd2cSJim Jagielski 		{
343*b1cdbd2cSJim Jagielski 			pFieldArray[i].Field		 = rParam.nField[i];
344*b1cdbd2cSJim Jagielski 			pFieldArray[i].IsAscending   = rParam.bAscending[i];
345*b1cdbd2cSJim Jagielski 			pFieldArray[i].FieldType	 = table::TableSortFieldType_AUTOMATIC;		// immer Automatic
346*b1cdbd2cSJim Jagielski             pFieldArray[i].IsCaseSensitive = rParam.bCaseSens;
347*b1cdbd2cSJim Jagielski             pFieldArray[i].CollatorLocale = rParam.aCollatorLocale;
348*b1cdbd2cSJim Jagielski             pFieldArray[i].CollatorAlgorithm = rtl::OUString( rParam.aCollatorAlgorithm );
349*b1cdbd2cSJim Jagielski 		}
350*b1cdbd2cSJim Jagielski 	}
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 	//	Sequence fuellen
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski 	pArray[0].Name = rtl::OUString::createFromAscii( SC_UNONAME_ISSORTCOLUMNS );
355*b1cdbd2cSJim Jagielski     pArray[0].Value = ::cppu::bool2any(!rParam.bByRow);
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 	pArray[1].Name = rtl::OUString::createFromAscii( SC_UNONAME_CONTHDR );
358*b1cdbd2cSJim Jagielski 	ScUnoHelpFunctions::SetBoolInAny( pArray[1].Value, rParam.bHasHeader );
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski 	pArray[2].Name = rtl::OUString::createFromAscii( SC_UNONAME_MAXFLD );
361*b1cdbd2cSJim Jagielski 	pArray[2].Value <<= (sal_Int32) MAXSORT;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	pArray[3].Name = rtl::OUString::createFromAscii( SC_UNONAME_SORTFLD );
364*b1cdbd2cSJim Jagielski 	pArray[3].Value <<= aFields;
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski 	pArray[4].Name = rtl::OUString::createFromAscii( SC_UNONAME_BINDFMT );
367*b1cdbd2cSJim Jagielski 	ScUnoHelpFunctions::SetBoolInAny( pArray[4].Value, rParam.bIncludePattern );
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski 	pArray[5].Name = rtl::OUString::createFromAscii( SC_UNONAME_COPYOUT );
370*b1cdbd2cSJim Jagielski 	ScUnoHelpFunctions::SetBoolInAny( pArray[5].Value, !rParam.bInplace );
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski 	pArray[6].Name = rtl::OUString::createFromAscii( SC_UNONAME_OUTPOS );
373*b1cdbd2cSJim Jagielski 	pArray[6].Value <<= aOutPos;
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 	pArray[7].Name = rtl::OUString::createFromAscii( SC_UNONAME_ISULIST );
376*b1cdbd2cSJim Jagielski 	ScUnoHelpFunctions::SetBoolInAny( pArray[7].Value, rParam.bUserDef );
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski 	pArray[8].Name = rtl::OUString::createFromAscii( SC_UNONAME_UINDEX );
379*b1cdbd2cSJim Jagielski 	pArray[8].Value <<= (sal_Int32) rParam.nUserIndex;
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski 
FillSortParam(ScSortParam & rParam,const uno::Sequence<beans::PropertyValue> & rSeq)382*b1cdbd2cSJim Jagielski void ScSortDescriptor::FillSortParam( ScSortParam& rParam, const uno::Sequence<beans::PropertyValue>& rSeq )
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski     sal_Bool bOldSortDescriptor(sal_False);
385*b1cdbd2cSJim Jagielski     sal_Bool bNewSortDescriptor(sal_False);
386*b1cdbd2cSJim Jagielski 	const beans::PropertyValue* pPropArray = rSeq.getConstArray();
387*b1cdbd2cSJim Jagielski 	long nPropCount = rSeq.getLength();
388*b1cdbd2cSJim Jagielski     for (long nProp = 0; nProp < nPropCount; nProp++)
389*b1cdbd2cSJim Jagielski 	{
390*b1cdbd2cSJim Jagielski         const beans::PropertyValue& rProp = pPropArray[nProp];
391*b1cdbd2cSJim Jagielski 		String aPropName(rProp.Name);
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 		if (aPropName.EqualsAscii( SC_UNONAME_ORIENT ))
394*b1cdbd2cSJim Jagielski 		{
395*b1cdbd2cSJim Jagielski             bOldSortDescriptor = sal_True;
396*b1cdbd2cSJim Jagielski 			//!	test for correct enum type?
397*b1cdbd2cSJim Jagielski 			table::TableOrientation eOrient = (table::TableOrientation)
398*b1cdbd2cSJim Jagielski 								ScUnoHelpFunctions::GetEnumFromAny( rProp.Value );
399*b1cdbd2cSJim Jagielski 			rParam.bByRow = ( eOrient != table::TableOrientation_COLUMNS );
400*b1cdbd2cSJim Jagielski 		}
401*b1cdbd2cSJim Jagielski         else if (aPropName.EqualsAscii( SC_UNONAME_ISSORTCOLUMNS ))
402*b1cdbd2cSJim Jagielski         {
403*b1cdbd2cSJim Jagielski             bNewSortDescriptor = sal_True;
404*b1cdbd2cSJim Jagielski             rParam.bByRow = !::cppu::any2bool(rProp.Value);
405*b1cdbd2cSJim Jagielski         }
406*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_CONTHDR ))
407*b1cdbd2cSJim Jagielski 			rParam.bHasHeader = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
408*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_MAXFLD ))
409*b1cdbd2cSJim Jagielski 		{
410*b1cdbd2cSJim Jagielski 			sal_Int32 nVal;
411*b1cdbd2cSJim Jagielski 			if ( (rProp.Value >>= nVal) && nVal > MAXSORT )
412*b1cdbd2cSJim Jagielski 			{
413*b1cdbd2cSJim Jagielski 				//!	specify exceptions
414*b1cdbd2cSJim Jagielski 				//! throw lang::IllegalArgumentException();
415*b1cdbd2cSJim Jagielski 			}
416*b1cdbd2cSJim Jagielski 		}
417*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_SORTFLD ))
418*b1cdbd2cSJim Jagielski 		{
419*b1cdbd2cSJim Jagielski 			uno::Sequence<util::SortField> aSeq;
420*b1cdbd2cSJim Jagielski             uno::Sequence<table::TableSortField> aNewSeq;
421*b1cdbd2cSJim Jagielski 			if ( rProp.Value >>= aSeq )
422*b1cdbd2cSJim Jagielski 			{
423*b1cdbd2cSJim Jagielski                 bOldSortDescriptor = sal_True;
424*b1cdbd2cSJim Jagielski 				sal_Int32 nCount = aSeq.getLength();
425*b1cdbd2cSJim Jagielski 				sal_Int32 i;
426*b1cdbd2cSJim Jagielski 				if ( nCount > MAXSORT )
427*b1cdbd2cSJim Jagielski 				{
428*b1cdbd2cSJim Jagielski 					DBG_ERROR("Zu viele Sortierfelder");
429*b1cdbd2cSJim Jagielski 					nCount = MAXSORT;
430*b1cdbd2cSJim Jagielski 				}
431*b1cdbd2cSJim Jagielski 				const util::SortField* pFieldArray = aSeq.getConstArray();
432*b1cdbd2cSJim Jagielski 				for (i=0; i<nCount; i++)
433*b1cdbd2cSJim Jagielski 				{
434*b1cdbd2cSJim Jagielski 					rParam.nField[i]	 = (SCCOLROW)pFieldArray[i].Field;
435*b1cdbd2cSJim Jagielski 					rParam.bAscending[i] = pFieldArray[i].SortAscending;
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski                     // FieldType wird ignoriert
438*b1cdbd2cSJim Jagielski 					rParam.bDoSort[i] = sal_True;
439*b1cdbd2cSJim Jagielski 				}
440*b1cdbd2cSJim Jagielski 				for (i=nCount; i<MAXSORT; i++)
441*b1cdbd2cSJim Jagielski 					rParam.bDoSort[i] = sal_False;
442*b1cdbd2cSJim Jagielski 			}
443*b1cdbd2cSJim Jagielski 			else if ( rProp.Value >>= aNewSeq )
444*b1cdbd2cSJim Jagielski             {
445*b1cdbd2cSJim Jagielski                 bNewSortDescriptor = sal_True;
446*b1cdbd2cSJim Jagielski 				sal_Int32 nCount = aNewSeq.getLength();
447*b1cdbd2cSJim Jagielski 				sal_Int32 i;
448*b1cdbd2cSJim Jagielski 				if ( nCount > MAXSORT )
449*b1cdbd2cSJim Jagielski 				{
450*b1cdbd2cSJim Jagielski 					DBG_ERROR("Zu viele Sortierfelder");
451*b1cdbd2cSJim Jagielski 					nCount = MAXSORT;
452*b1cdbd2cSJim Jagielski 				}
453*b1cdbd2cSJim Jagielski 				const table::TableSortField* pFieldArray = aNewSeq.getConstArray();
454*b1cdbd2cSJim Jagielski 				for (i=0; i<nCount; i++)
455*b1cdbd2cSJim Jagielski 				{
456*b1cdbd2cSJim Jagielski 					rParam.nField[i]	 = (SCCOLROW)pFieldArray[i].Field;
457*b1cdbd2cSJim Jagielski 					rParam.bAscending[i] = pFieldArray[i].IsAscending;
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski                     // only one is possible, sometime we should make it possible to have different for every entry
460*b1cdbd2cSJim Jagielski 			        rParam.bCaseSens = pFieldArray[i].IsCaseSensitive;
461*b1cdbd2cSJim Jagielski 			        rParam.aCollatorLocale = pFieldArray[i].CollatorLocale;
462*b1cdbd2cSJim Jagielski 				    rParam.aCollatorAlgorithm = pFieldArray[i].CollatorAlgorithm;
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski                     // FieldType wird ignoriert
465*b1cdbd2cSJim Jagielski 					rParam.bDoSort[i] = sal_True;
466*b1cdbd2cSJim Jagielski 				}
467*b1cdbd2cSJim Jagielski 				for (i=nCount; i<MAXSORT; i++)
468*b1cdbd2cSJim Jagielski 					rParam.bDoSort[i] = sal_False;
469*b1cdbd2cSJim Jagielski             }
470*b1cdbd2cSJim Jagielski 		}
471*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_ISCASE ))
472*b1cdbd2cSJim Jagielski         {
473*b1cdbd2cSJim Jagielski             bOldSortDescriptor = sal_True;
474*b1cdbd2cSJim Jagielski 			rParam.bCaseSens = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
475*b1cdbd2cSJim Jagielski         }
476*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_BINDFMT ))
477*b1cdbd2cSJim Jagielski 			rParam.bIncludePattern = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
478*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_COPYOUT ))
479*b1cdbd2cSJim Jagielski 			rParam.bInplace = !ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
480*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_OUTPOS ))
481*b1cdbd2cSJim Jagielski 		{
482*b1cdbd2cSJim Jagielski 			table::CellAddress aAddress;
483*b1cdbd2cSJim Jagielski 			if ( rProp.Value >>= aAddress )
484*b1cdbd2cSJim Jagielski 			{
485*b1cdbd2cSJim Jagielski 				rParam.nDestTab = aAddress.Sheet;
486*b1cdbd2cSJim Jagielski 				rParam.nDestCol = (SCCOL)aAddress.Column;
487*b1cdbd2cSJim Jagielski 				rParam.nDestRow = (SCROW)aAddress.Row;
488*b1cdbd2cSJim Jagielski 			}
489*b1cdbd2cSJim Jagielski 		}
490*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_ISULIST ))
491*b1cdbd2cSJim Jagielski 			rParam.bUserDef = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
492*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_UINDEX ))
493*b1cdbd2cSJim Jagielski 		{
494*b1cdbd2cSJim Jagielski 			sal_Int32 nVal = 0;
495*b1cdbd2cSJim Jagielski 			if ( rProp.Value >>= nVal )
496*b1cdbd2cSJim Jagielski 				rParam.nUserIndex = (sal_uInt16)nVal;
497*b1cdbd2cSJim Jagielski 		}
498*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_COLLLOC ))
499*b1cdbd2cSJim Jagielski 		{
500*b1cdbd2cSJim Jagielski             bOldSortDescriptor = sal_True;
501*b1cdbd2cSJim Jagielski 			rProp.Value >>= rParam.aCollatorLocale;
502*b1cdbd2cSJim Jagielski 		}
503*b1cdbd2cSJim Jagielski 		else if (aPropName.EqualsAscii( SC_UNONAME_COLLALG ))
504*b1cdbd2cSJim Jagielski 		{
505*b1cdbd2cSJim Jagielski             bOldSortDescriptor = sal_True;
506*b1cdbd2cSJim Jagielski 			rtl::OUString sStr;
507*b1cdbd2cSJim Jagielski 			if ( rProp.Value >>= sStr )
508*b1cdbd2cSJim Jagielski 				rParam.aCollatorAlgorithm = sStr;
509*b1cdbd2cSJim Jagielski 		}
510*b1cdbd2cSJim Jagielski 	}
511*b1cdbd2cSJim Jagielski }
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
514*b1cdbd2cSJim Jagielski 
ScSubTotalFieldObj(ScSubTotalDescriptorBase * pDesc,sal_uInt16 nP)515*b1cdbd2cSJim Jagielski ScSubTotalFieldObj::ScSubTotalFieldObj( ScSubTotalDescriptorBase* pDesc, sal_uInt16 nP ) :
516*b1cdbd2cSJim Jagielski 	xRef( pDesc ),			// Objekt festhalten
517*b1cdbd2cSJim Jagielski 	rParent( *pDesc ),
518*b1cdbd2cSJim Jagielski 	nPos( nP )
519*b1cdbd2cSJim Jagielski {
520*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pDesc, "ScSubTotalFieldObj: Parent ist 0");
521*b1cdbd2cSJim Jagielski }
522*b1cdbd2cSJim Jagielski 
~ScSubTotalFieldObj()523*b1cdbd2cSJim Jagielski ScSubTotalFieldObj::~ScSubTotalFieldObj()
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski }
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski // XSubTotalField
528*b1cdbd2cSJim Jagielski 
getGroupColumn()529*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScSubTotalFieldObj::getGroupColumn() throw(uno::RuntimeException)
530*b1cdbd2cSJim Jagielski {
531*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
532*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
533*b1cdbd2cSJim Jagielski 	rParent.GetData(aParam);
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 	return aParam.nField[nPos];
536*b1cdbd2cSJim Jagielski }
537*b1cdbd2cSJim Jagielski 
setGroupColumn(sal_Int32 nGroupColumn)538*b1cdbd2cSJim Jagielski void SAL_CALL ScSubTotalFieldObj::setGroupColumn( sal_Int32 nGroupColumn ) throw(uno::RuntimeException)
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
541*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
542*b1cdbd2cSJim Jagielski 	rParent.GetData(aParam);
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 	aParam.nField[nPos] = (SCCOL)nGroupColumn;
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski 	rParent.PutData(aParam);
547*b1cdbd2cSJim Jagielski }
548*b1cdbd2cSJim Jagielski 
getSubTotalColumns()549*b1cdbd2cSJim Jagielski uno::Sequence<sheet::SubTotalColumn> SAL_CALL ScSubTotalFieldObj::getSubTotalColumns()
550*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
551*b1cdbd2cSJim Jagielski {
552*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
553*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
554*b1cdbd2cSJim Jagielski 	rParent.GetData(aParam);
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski 	SCCOL nCount = aParam.nSubTotals[nPos];
557*b1cdbd2cSJim Jagielski 	uno::Sequence<sheet::SubTotalColumn> aSeq(nCount);
558*b1cdbd2cSJim Jagielski 	sheet::SubTotalColumn* pAry = aSeq.getArray();
559*b1cdbd2cSJim Jagielski 	for (SCCOL i=0; i<nCount; i++)
560*b1cdbd2cSJim Jagielski 	{
561*b1cdbd2cSJim Jagielski 		pAry[i].Column = aParam.pSubTotals[nPos][i];
562*b1cdbd2cSJim Jagielski 		pAry[i].Function = ScDataUnoConversion::SubTotalToGeneral(
563*b1cdbd2cSJim Jagielski 										aParam.pFunctions[nPos][i] );
564*b1cdbd2cSJim Jagielski 	}
565*b1cdbd2cSJim Jagielski 	return aSeq;
566*b1cdbd2cSJim Jagielski }
567*b1cdbd2cSJim Jagielski 
setSubTotalColumns(const uno::Sequence<sheet::SubTotalColumn> & aSubTotalColumns)568*b1cdbd2cSJim Jagielski void SAL_CALL ScSubTotalFieldObj::setSubTotalColumns(
569*b1cdbd2cSJim Jagielski 							const uno::Sequence<sheet::SubTotalColumn>& aSubTotalColumns )
570*b1cdbd2cSJim Jagielski 									throw(uno::RuntimeException)
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
573*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
574*b1cdbd2cSJim Jagielski 	rParent.GetData(aParam);
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 	sal_uInt32 nColCount = aSubTotalColumns.getLength();
577*b1cdbd2cSJim Jagielski     if ( nColCount <= sal::static_int_cast<sal_uInt32>(SCCOL_MAX) )
578*b1cdbd2cSJim Jagielski 	{
579*b1cdbd2cSJim Jagielski 		SCCOL nCount = static_cast<SCCOL>(nColCount);
580*b1cdbd2cSJim Jagielski 		aParam.nSubTotals[nPos] = nCount;
581*b1cdbd2cSJim Jagielski 		if (nCount != 0)
582*b1cdbd2cSJim Jagielski 		{
583*b1cdbd2cSJim Jagielski 			aParam.pSubTotals[nPos] = new SCCOL[nCount];
584*b1cdbd2cSJim Jagielski 			aParam.pFunctions[nPos] = new ScSubTotalFunc[nCount];
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski 			const sheet::SubTotalColumn* pAry = aSubTotalColumns.getConstArray();
587*b1cdbd2cSJim Jagielski 			for (SCCOL i=0; i<nCount; i++)
588*b1cdbd2cSJim Jagielski 			{
589*b1cdbd2cSJim Jagielski 				aParam.pSubTotals[nPos][i] = static_cast<SCCOL>(pAry[i].Column);
590*b1cdbd2cSJim Jagielski 				aParam.pFunctions[nPos][i] =
591*b1cdbd2cSJim Jagielski 							ScDataUnoConversion::GeneralToSubTotal( pAry[i].Function );
592*b1cdbd2cSJim Jagielski 			}
593*b1cdbd2cSJim Jagielski 		}
594*b1cdbd2cSJim Jagielski 		else
595*b1cdbd2cSJim Jagielski 		{
596*b1cdbd2cSJim Jagielski 			aParam.pSubTotals[nPos] = NULL;
597*b1cdbd2cSJim Jagielski 			aParam.pFunctions[nPos] = NULL;
598*b1cdbd2cSJim Jagielski 		}
599*b1cdbd2cSJim Jagielski 	}
600*b1cdbd2cSJim Jagielski 	//!	sonst Exception oder so? (zuviele Spalten)
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 	rParent.PutData(aParam);
603*b1cdbd2cSJim Jagielski }
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
606*b1cdbd2cSJim Jagielski 
ScSubTotalDescriptorBase()607*b1cdbd2cSJim Jagielski ScSubTotalDescriptorBase::ScSubTotalDescriptorBase() :
608*b1cdbd2cSJim Jagielski 	aPropSet( lcl_GetSubTotalPropertyMap() )
609*b1cdbd2cSJim Jagielski {
610*b1cdbd2cSJim Jagielski }
611*b1cdbd2cSJim Jagielski 
~ScSubTotalDescriptorBase()612*b1cdbd2cSJim Jagielski ScSubTotalDescriptorBase::~ScSubTotalDescriptorBase()
613*b1cdbd2cSJim Jagielski {
614*b1cdbd2cSJim Jagielski }
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski // GetData/PutData hier nur wegen NewInstance-Krempel implementiert...
617*b1cdbd2cSJim Jagielski 
GetData(ScSubTotalParam &) const618*b1cdbd2cSJim Jagielski void ScSubTotalDescriptorBase::GetData( ScSubTotalParam& /* rParam */ ) const
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski 	DBG_ERROR("ScSubTotalDescriptorBase::GetData soll nicht gerufen werden");
621*b1cdbd2cSJim Jagielski }
622*b1cdbd2cSJim Jagielski 
PutData(const ScSubTotalParam &)623*b1cdbd2cSJim Jagielski void ScSubTotalDescriptorBase::PutData( const ScSubTotalParam& /* rParam */ )
624*b1cdbd2cSJim Jagielski {
625*b1cdbd2cSJim Jagielski 	DBG_ERROR("ScSubTotalDescriptorBase::PutData soll nicht gerufen werden");
626*b1cdbd2cSJim Jagielski }
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski // XSubTotalDesctiptor
629*b1cdbd2cSJim Jagielski 
GetObjectByIndex_Impl(sal_uInt16 nIndex)630*b1cdbd2cSJim Jagielski ScSubTotalFieldObj* ScSubTotalDescriptorBase::GetObjectByIndex_Impl(sal_uInt16 nIndex)
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski 	if ( nIndex < getCount() )
633*b1cdbd2cSJim Jagielski 		return new ScSubTotalFieldObj( this, nIndex );
634*b1cdbd2cSJim Jagielski 	return NULL;
635*b1cdbd2cSJim Jagielski }
636*b1cdbd2cSJim Jagielski 
clear()637*b1cdbd2cSJim Jagielski void SAL_CALL ScSubTotalDescriptorBase::clear() throw(uno::RuntimeException)
638*b1cdbd2cSJim Jagielski {
639*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
640*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
641*b1cdbd2cSJim Jagielski 	GetData(aParam);
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 	for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
644*b1cdbd2cSJim Jagielski 		aParam.bGroupActive[i] = sal_False;
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski 	//!	Notify oder so fuer die Field-Objekte???
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski 	PutData(aParam);
649*b1cdbd2cSJim Jagielski }
650*b1cdbd2cSJim Jagielski 
addNew(const uno::Sequence<sheet::SubTotalColumn> & aSubTotalColumns,sal_Int32 nGroupColumn)651*b1cdbd2cSJim Jagielski void SAL_CALL ScSubTotalDescriptorBase::addNew(
652*b1cdbd2cSJim Jagielski 						const uno::Sequence<sheet::SubTotalColumn>& aSubTotalColumns,
653*b1cdbd2cSJim Jagielski 						sal_Int32 nGroupColumn ) throw(uno::RuntimeException)
654*b1cdbd2cSJim Jagielski {
655*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
656*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
657*b1cdbd2cSJim Jagielski 	GetData(aParam);
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = 0;
660*b1cdbd2cSJim Jagielski 	while ( nPos < MAXSUBTOTAL && aParam.bGroupActive[nPos] )
661*b1cdbd2cSJim Jagielski 		++nPos;
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 	sal_uInt32 nColCount = aSubTotalColumns.getLength();
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski     if ( nPos < MAXSUBTOTAL && nColCount <= sal::static_int_cast<sal_uInt32>(SCCOL_MAX) )
666*b1cdbd2cSJim Jagielski 	{
667*b1cdbd2cSJim Jagielski 		aParam.bGroupActive[nPos] = sal_True;
668*b1cdbd2cSJim Jagielski 		aParam.nField[nPos] = static_cast<SCCOL>(nGroupColumn);
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 		delete aParam.pSubTotals[nPos];
671*b1cdbd2cSJim Jagielski 		delete aParam.pFunctions[nPos];
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski 		SCCOL nCount = static_cast<SCCOL>(nColCount);
674*b1cdbd2cSJim Jagielski 		aParam.nSubTotals[nPos] = nCount;
675*b1cdbd2cSJim Jagielski 		if (nCount != 0)
676*b1cdbd2cSJim Jagielski 		{
677*b1cdbd2cSJim Jagielski 			aParam.pSubTotals[nPos] = new SCCOL[nCount];
678*b1cdbd2cSJim Jagielski 			aParam.pFunctions[nPos] = new ScSubTotalFunc[nCount];
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski 			const sheet::SubTotalColumn* pAry = aSubTotalColumns.getConstArray();
681*b1cdbd2cSJim Jagielski 			for (SCCOL i=0; i<nCount; i++)
682*b1cdbd2cSJim Jagielski 			{
683*b1cdbd2cSJim Jagielski 				aParam.pSubTotals[nPos][i] = static_cast<SCCOL>(pAry[i].Column);
684*b1cdbd2cSJim Jagielski 				aParam.pFunctions[nPos][i] =
685*b1cdbd2cSJim Jagielski 							ScDataUnoConversion::GeneralToSubTotal( pAry[i].Function );
686*b1cdbd2cSJim Jagielski 			}
687*b1cdbd2cSJim Jagielski 		}
688*b1cdbd2cSJim Jagielski 		else
689*b1cdbd2cSJim Jagielski 		{
690*b1cdbd2cSJim Jagielski 			aParam.pSubTotals[nPos] = NULL;
691*b1cdbd2cSJim Jagielski 			aParam.pFunctions[nPos] = NULL;
692*b1cdbd2cSJim Jagielski 		}
693*b1cdbd2cSJim Jagielski 	}
694*b1cdbd2cSJim Jagielski 	else									// too many fields / columns
695*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();		// no other exceptions specified
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 	PutData(aParam);
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski //	Flags/Einstellungen als Properties
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski // XEnumerationAccess
703*b1cdbd2cSJim Jagielski 
createEnumeration()704*b1cdbd2cSJim Jagielski uno::Reference<container::XEnumeration> SAL_CALL ScSubTotalDescriptorBase::createEnumeration()
705*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
706*b1cdbd2cSJim Jagielski {
707*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
708*b1cdbd2cSJim Jagielski     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SubTotalFieldsEnumeration")));
709*b1cdbd2cSJim Jagielski }
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski // XIndexAccess
712*b1cdbd2cSJim Jagielski 
getCount()713*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScSubTotalDescriptorBase::getCount() throw(uno::RuntimeException)
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
716*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
717*b1cdbd2cSJim Jagielski 	GetData(aParam);
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = 0;
720*b1cdbd2cSJim Jagielski 	while ( nCount < MAXSUBTOTAL && aParam.bGroupActive[nCount] )
721*b1cdbd2cSJim Jagielski 		++nCount;
722*b1cdbd2cSJim Jagielski 	return nCount;
723*b1cdbd2cSJim Jagielski }
724*b1cdbd2cSJim Jagielski 
getByIndex(sal_Int32 nIndex)725*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScSubTotalDescriptorBase::getByIndex( sal_Int32 nIndex )
726*b1cdbd2cSJim Jagielski 							throw(lang::IndexOutOfBoundsException,
727*b1cdbd2cSJim Jagielski 									lang::WrappedTargetException, uno::RuntimeException)
728*b1cdbd2cSJim Jagielski {
729*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
730*b1cdbd2cSJim Jagielski 	uno::Reference<sheet::XSubTotalField> xField(GetObjectByIndex_Impl((sal_uInt16)nIndex));
731*b1cdbd2cSJim Jagielski 	if (xField.is())
732*b1cdbd2cSJim Jagielski         return uno::makeAny(xField);
733*b1cdbd2cSJim Jagielski 	else
734*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
735*b1cdbd2cSJim Jagielski //    return uno::Any();
736*b1cdbd2cSJim Jagielski }
737*b1cdbd2cSJim Jagielski 
getElementType()738*b1cdbd2cSJim Jagielski uno::Type SAL_CALL ScSubTotalDescriptorBase::getElementType() throw(uno::RuntimeException)
739*b1cdbd2cSJim Jagielski {
740*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
741*b1cdbd2cSJim Jagielski 	return getCppuType((uno::Reference<sheet::XSubTotalField>*)0);
742*b1cdbd2cSJim Jagielski }
743*b1cdbd2cSJim Jagielski 
hasElements()744*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScSubTotalDescriptorBase::hasElements() throw(uno::RuntimeException)
745*b1cdbd2cSJim Jagielski {
746*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
747*b1cdbd2cSJim Jagielski 	return ( getCount() != 0 );
748*b1cdbd2cSJim Jagielski }
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski // XPropertySet
751*b1cdbd2cSJim Jagielski 
getPropertySetInfo()752*b1cdbd2cSJim Jagielski uno::Reference<beans::XPropertySetInfo> SAL_CALL ScSubTotalDescriptorBase::getPropertySetInfo()
753*b1cdbd2cSJim Jagielski 														throw(uno::RuntimeException)
754*b1cdbd2cSJim Jagielski {
755*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
756*b1cdbd2cSJim Jagielski 	static uno::Reference<beans::XPropertySetInfo> aRef(
757*b1cdbd2cSJim Jagielski 		new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
758*b1cdbd2cSJim Jagielski 	return aRef;
759*b1cdbd2cSJim Jagielski }
760*b1cdbd2cSJim Jagielski 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any & aValue)761*b1cdbd2cSJim Jagielski void SAL_CALL ScSubTotalDescriptorBase::setPropertyValue(
762*b1cdbd2cSJim Jagielski 						const rtl::OUString& aPropertyName, const uno::Any& aValue )
763*b1cdbd2cSJim Jagielski 				throw(beans::UnknownPropertyException, beans::PropertyVetoException,
764*b1cdbd2cSJim Jagielski 						lang::IllegalArgumentException, lang::WrappedTargetException,
765*b1cdbd2cSJim Jagielski 						uno::RuntimeException)
766*b1cdbd2cSJim Jagielski {
767*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
768*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
769*b1cdbd2cSJim Jagielski 	GetData(aParam);
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski 	String aString(aPropertyName);
772*b1cdbd2cSJim Jagielski 
773*b1cdbd2cSJim Jagielski 	// some old property names are for 5.2 compatibility
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 	if (aString.EqualsAscii( SC_UNONAME_CASE ) || aString.EqualsAscii( SC_UNONAME_ISCASE ))
776*b1cdbd2cSJim Jagielski 		aParam.bCaseSens = ScUnoHelpFunctions::GetBoolFromAny( aValue );
777*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_FORMATS ) || aString.EqualsAscii( SC_UNONAME_BINDFMT ))
778*b1cdbd2cSJim Jagielski 		aParam.bIncludePattern = ScUnoHelpFunctions::GetBoolFromAny( aValue );
779*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ENABSORT ))
780*b1cdbd2cSJim Jagielski 		aParam.bDoSort = ScUnoHelpFunctions::GetBoolFromAny( aValue );
781*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_SORTASC ))
782*b1cdbd2cSJim Jagielski 		aParam.bAscending = ScUnoHelpFunctions::GetBoolFromAny( aValue );
783*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_INSBRK ))
784*b1cdbd2cSJim Jagielski 		aParam.bPagebreak = ScUnoHelpFunctions::GetBoolFromAny( aValue );
785*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ULIST ) || aString.EqualsAscii( SC_UNONAME_ENUSLIST ))
786*b1cdbd2cSJim Jagielski 		aParam.bUserDef = ScUnoHelpFunctions::GetBoolFromAny( aValue );
787*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_UINDEX ) || aString.EqualsAscii( SC_UNONAME_USINDEX ))
788*b1cdbd2cSJim Jagielski 	{
789*b1cdbd2cSJim Jagielski 		sal_Int32 nVal = 0;
790*b1cdbd2cSJim Jagielski 		if ( aValue >>= nVal )
791*b1cdbd2cSJim Jagielski 			aParam.nUserIndex = (sal_uInt16)nVal;
792*b1cdbd2cSJim Jagielski 	}
793*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_MAXFLD ))
794*b1cdbd2cSJim Jagielski 	{
795*b1cdbd2cSJim Jagielski 		sal_Int32 nVal = 0;
796*b1cdbd2cSJim Jagielski         if ( (aValue >>= nVal) && nVal > sal::static_int_cast<sal_Int32>(MAXSUBTOTAL) )
797*b1cdbd2cSJim Jagielski 		{
798*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException();
799*b1cdbd2cSJim Jagielski 		}
800*b1cdbd2cSJim Jagielski 	}
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski 	PutData(aParam);
803*b1cdbd2cSJim Jagielski }
804*b1cdbd2cSJim Jagielski 
getPropertyValue(const rtl::OUString & aPropertyName)805*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScSubTotalDescriptorBase::getPropertyValue( const rtl::OUString& aPropertyName )
806*b1cdbd2cSJim Jagielski 				throw(beans::UnknownPropertyException, lang::WrappedTargetException,
807*b1cdbd2cSJim Jagielski 						uno::RuntimeException)
808*b1cdbd2cSJim Jagielski {
809*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
810*b1cdbd2cSJim Jagielski 	ScSubTotalParam aParam;
811*b1cdbd2cSJim Jagielski 	GetData(aParam);
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski 	String aString(aPropertyName);
814*b1cdbd2cSJim Jagielski 	uno::Any aRet;
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 	// some old property names are for 5.2 compatibility
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 	if (aString.EqualsAscii( SC_UNONAME_CASE ) || aString.EqualsAscii( SC_UNONAME_ISCASE ))
819*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bCaseSens );
820*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_FORMATS ) || aString.EqualsAscii( SC_UNONAME_BINDFMT ))
821*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bIncludePattern );
822*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ENABSORT ))
823*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bDoSort );
824*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_SORTASC ))
825*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bAscending );
826*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_INSBRK ))
827*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bPagebreak );
828*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ULIST ) || aString.EqualsAscii( SC_UNONAME_ENUSLIST ))
829*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bUserDef );
830*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_UINDEX ) || aString.EqualsAscii( SC_UNONAME_USINDEX ))
831*b1cdbd2cSJim Jagielski 		aRet <<= (sal_Int32) aParam.nUserIndex;
832*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_MAXFLD ))
833*b1cdbd2cSJim Jagielski 		aRet <<= (sal_Int32) MAXSUBTOTAL;
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski 	return aRet;
836*b1cdbd2cSJim Jagielski }
837*b1cdbd2cSJim Jagielski 
SC_IMPL_DUMMY_PROPERTY_LISTENER(ScSubTotalDescriptorBase)838*b1cdbd2cSJim Jagielski SC_IMPL_DUMMY_PROPERTY_LISTENER( ScSubTotalDescriptorBase )
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski // XUnoTunnel
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL ScSubTotalDescriptorBase::getSomething(
843*b1cdbd2cSJim Jagielski 				const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
844*b1cdbd2cSJim Jagielski {
845*b1cdbd2cSJim Jagielski 	if ( rId.getLength() == 16 &&
846*b1cdbd2cSJim Jagielski           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
847*b1cdbd2cSJim Jagielski 									rId.getConstArray(), 16 ) )
848*b1cdbd2cSJim Jagielski 	{
849*b1cdbd2cSJim Jagielski         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
850*b1cdbd2cSJim Jagielski 	}
851*b1cdbd2cSJim Jagielski 	return 0;
852*b1cdbd2cSJim Jagielski }
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski // static
getUnoTunnelId()855*b1cdbd2cSJim Jagielski const uno::Sequence<sal_Int8>& ScSubTotalDescriptorBase::getUnoTunnelId()
856*b1cdbd2cSJim Jagielski {
857*b1cdbd2cSJim Jagielski 	static uno::Sequence<sal_Int8> * pSeq = 0;
858*b1cdbd2cSJim Jagielski 	if( !pSeq )
859*b1cdbd2cSJim Jagielski 	{
860*b1cdbd2cSJim Jagielski 		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
861*b1cdbd2cSJim Jagielski 		if( !pSeq )
862*b1cdbd2cSJim Jagielski 		{
863*b1cdbd2cSJim Jagielski 			static uno::Sequence< sal_Int8 > aSeq( 16 );
864*b1cdbd2cSJim Jagielski 			rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
865*b1cdbd2cSJim Jagielski 			pSeq = &aSeq;
866*b1cdbd2cSJim Jagielski 		}
867*b1cdbd2cSJim Jagielski 	}
868*b1cdbd2cSJim Jagielski 	return *pSeq;
869*b1cdbd2cSJim Jagielski }
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski // static
getImplementation(const uno::Reference<sheet::XSubTotalDescriptor> xObj)872*b1cdbd2cSJim Jagielski ScSubTotalDescriptorBase* ScSubTotalDescriptorBase::getImplementation(
873*b1cdbd2cSJim Jagielski 								const uno::Reference<sheet::XSubTotalDescriptor> xObj )
874*b1cdbd2cSJim Jagielski {
875*b1cdbd2cSJim Jagielski 	ScSubTotalDescriptorBase* pRet = NULL;
876*b1cdbd2cSJim Jagielski 	uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
877*b1cdbd2cSJim Jagielski 	if (xUT.is())
878*b1cdbd2cSJim Jagielski         pRet = reinterpret_cast<ScSubTotalDescriptorBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
879*b1cdbd2cSJim Jagielski 	return pRet;
880*b1cdbd2cSJim Jagielski }
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
883*b1cdbd2cSJim Jagielski 
ScSubTotalDescriptor()884*b1cdbd2cSJim Jagielski ScSubTotalDescriptor::ScSubTotalDescriptor()
885*b1cdbd2cSJim Jagielski {
886*b1cdbd2cSJim Jagielski }
887*b1cdbd2cSJim Jagielski 
~ScSubTotalDescriptor()888*b1cdbd2cSJim Jagielski ScSubTotalDescriptor::~ScSubTotalDescriptor()
889*b1cdbd2cSJim Jagielski {
890*b1cdbd2cSJim Jagielski }
891*b1cdbd2cSJim Jagielski 
GetData(ScSubTotalParam & rParam) const892*b1cdbd2cSJim Jagielski void ScSubTotalDescriptor::GetData( ScSubTotalParam& rParam ) const
893*b1cdbd2cSJim Jagielski {
894*b1cdbd2cSJim Jagielski 	rParam = aStoredParam;			// Abfrage fuer Interface
895*b1cdbd2cSJim Jagielski }
896*b1cdbd2cSJim Jagielski 
PutData(const ScSubTotalParam & rParam)897*b1cdbd2cSJim Jagielski void ScSubTotalDescriptor::PutData( const ScSubTotalParam& rParam )
898*b1cdbd2cSJim Jagielski {
899*b1cdbd2cSJim Jagielski 	aStoredParam = rParam;			// vom Interface gesetzt
900*b1cdbd2cSJim Jagielski }
901*b1cdbd2cSJim Jagielski 
SetParam(const ScSubTotalParam & rNew)902*b1cdbd2cSJim Jagielski void ScSubTotalDescriptor::SetParam( const ScSubTotalParam& rNew )
903*b1cdbd2cSJim Jagielski {
904*b1cdbd2cSJim Jagielski 	aStoredParam = rNew;			// von aussen gesetzt
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
908*b1cdbd2cSJim Jagielski 
ScRangeSubTotalDescriptor(ScDatabaseRangeObj * pPar)909*b1cdbd2cSJim Jagielski ScRangeSubTotalDescriptor::ScRangeSubTotalDescriptor(ScDatabaseRangeObj* pPar) :
910*b1cdbd2cSJim Jagielski 	pParent(pPar)
911*b1cdbd2cSJim Jagielski {
912*b1cdbd2cSJim Jagielski 	if (pParent)
913*b1cdbd2cSJim Jagielski 		pParent->acquire();
914*b1cdbd2cSJim Jagielski }
915*b1cdbd2cSJim Jagielski 
~ScRangeSubTotalDescriptor()916*b1cdbd2cSJim Jagielski ScRangeSubTotalDescriptor::~ScRangeSubTotalDescriptor()
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski 	if (pParent)
919*b1cdbd2cSJim Jagielski 		pParent->release();
920*b1cdbd2cSJim Jagielski }
921*b1cdbd2cSJim Jagielski 
GetData(ScSubTotalParam & rParam) const922*b1cdbd2cSJim Jagielski void ScRangeSubTotalDescriptor::GetData( ScSubTotalParam& rParam ) const
923*b1cdbd2cSJim Jagielski {
924*b1cdbd2cSJim Jagielski 	if (pParent)
925*b1cdbd2cSJim Jagielski 		pParent->GetSubTotalParam( rParam );
926*b1cdbd2cSJim Jagielski }
927*b1cdbd2cSJim Jagielski 
PutData(const ScSubTotalParam & rParam)928*b1cdbd2cSJim Jagielski void ScRangeSubTotalDescriptor::PutData( const ScSubTotalParam& rParam )
929*b1cdbd2cSJim Jagielski {
930*b1cdbd2cSJim Jagielski 	if (pParent)
931*b1cdbd2cSJim Jagielski 		pParent->SetSubTotalParam( rParam );
932*b1cdbd2cSJim Jagielski }
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
935*b1cdbd2cSJim Jagielski 
ScConsolidationDescriptor()936*b1cdbd2cSJim Jagielski ScConsolidationDescriptor::ScConsolidationDescriptor()
937*b1cdbd2cSJim Jagielski {
938*b1cdbd2cSJim Jagielski }
939*b1cdbd2cSJim Jagielski 
~ScConsolidationDescriptor()940*b1cdbd2cSJim Jagielski ScConsolidationDescriptor::~ScConsolidationDescriptor()
941*b1cdbd2cSJim Jagielski {
942*b1cdbd2cSJim Jagielski }
943*b1cdbd2cSJim Jagielski 
SetParam(const ScConsolidateParam & rNew)944*b1cdbd2cSJim Jagielski void ScConsolidationDescriptor::SetParam( const ScConsolidateParam& rNew )
945*b1cdbd2cSJim Jagielski {
946*b1cdbd2cSJim Jagielski 	aParam = rNew;
947*b1cdbd2cSJim Jagielski }
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski // XConsolidationDescriptor
950*b1cdbd2cSJim Jagielski 
getFunction()951*b1cdbd2cSJim Jagielski sheet::GeneralFunction SAL_CALL ScConsolidationDescriptor::getFunction() throw(uno::RuntimeException)
952*b1cdbd2cSJim Jagielski {
953*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
954*b1cdbd2cSJim Jagielski 	return ScDataUnoConversion::SubTotalToGeneral(aParam.eFunction);
955*b1cdbd2cSJim Jagielski }
956*b1cdbd2cSJim Jagielski 
setFunction(sheet::GeneralFunction nFunction)957*b1cdbd2cSJim Jagielski void SAL_CALL ScConsolidationDescriptor::setFunction( sheet::GeneralFunction nFunction )
958*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
959*b1cdbd2cSJim Jagielski {
960*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
961*b1cdbd2cSJim Jagielski 	aParam.eFunction = ScDataUnoConversion::GeneralToSubTotal(nFunction);
962*b1cdbd2cSJim Jagielski }
963*b1cdbd2cSJim Jagielski 
getSources()964*b1cdbd2cSJim Jagielski uno::Sequence<table::CellRangeAddress> SAL_CALL ScConsolidationDescriptor::getSources()
965*b1cdbd2cSJim Jagielski 														throw(uno::RuntimeException)
966*b1cdbd2cSJim Jagielski {
967*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
968*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aParam.nDataAreaCount;
969*b1cdbd2cSJim Jagielski 	if (!aParam.ppDataAreas)
970*b1cdbd2cSJim Jagielski 		nCount = 0;
971*b1cdbd2cSJim Jagielski 	table::CellRangeAddress aRange;
972*b1cdbd2cSJim Jagielski 	uno::Sequence<table::CellRangeAddress> aSeq(nCount);
973*b1cdbd2cSJim Jagielski 	table::CellRangeAddress* pAry = aSeq.getArray();
974*b1cdbd2cSJim Jagielski 	for (sal_uInt16 i=0; i<nCount; i++)
975*b1cdbd2cSJim Jagielski 	{
976*b1cdbd2cSJim Jagielski 		ScArea* pArea = aParam.ppDataAreas[i];
977*b1cdbd2cSJim Jagielski 		if (pArea)
978*b1cdbd2cSJim Jagielski 		{
979*b1cdbd2cSJim Jagielski 			aRange.Sheet		= pArea->nTab;
980*b1cdbd2cSJim Jagielski 			aRange.StartColumn	= pArea->nColStart;
981*b1cdbd2cSJim Jagielski 			aRange.StartRow		= pArea->nRowStart;
982*b1cdbd2cSJim Jagielski 			aRange.EndColumn	= pArea->nColEnd;
983*b1cdbd2cSJim Jagielski 			aRange.EndRow		= pArea->nRowEnd;
984*b1cdbd2cSJim Jagielski 		}
985*b1cdbd2cSJim Jagielski 		pAry[i] = aRange;
986*b1cdbd2cSJim Jagielski 	}
987*b1cdbd2cSJim Jagielski 	return aSeq;
988*b1cdbd2cSJim Jagielski }
989*b1cdbd2cSJim Jagielski 
setSources(const uno::Sequence<table::CellRangeAddress> & aSources)990*b1cdbd2cSJim Jagielski void SAL_CALL ScConsolidationDescriptor::setSources(
991*b1cdbd2cSJim Jagielski 					const uno::Sequence<table::CellRangeAddress>& aSources )
992*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
993*b1cdbd2cSJim Jagielski {
994*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
995*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = (sal_uInt16)aSources.getLength();
996*b1cdbd2cSJim Jagielski 	if (nCount)
997*b1cdbd2cSJim Jagielski 	{
998*b1cdbd2cSJim Jagielski 		const table::CellRangeAddress* pAry = aSources.getConstArray();
999*b1cdbd2cSJim Jagielski 		ScArea** pNew = new ScArea*[nCount];
1000*b1cdbd2cSJim Jagielski 		sal_uInt16 i;
1001*b1cdbd2cSJim Jagielski 		for (i=0; i<nCount; i++)
1002*b1cdbd2cSJim Jagielski 			pNew[i] = new ScArea( pAry[i].Sheet,
1003*b1cdbd2cSJim Jagielski                     static_cast<SCCOL>(pAry[i].StartColumn), pAry[i].StartRow,
1004*b1cdbd2cSJim Jagielski                     static_cast<SCCOL>(pAry[i].EndColumn),   pAry[i].EndRow );
1005*b1cdbd2cSJim Jagielski 
1006*b1cdbd2cSJim Jagielski 		aParam.SetAreas( pNew, nCount );	// kopiert alles
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski 		for (i=0; i<nCount; i++)
1009*b1cdbd2cSJim Jagielski 			delete pNew[i];
1010*b1cdbd2cSJim Jagielski 		delete[] pNew;
1011*b1cdbd2cSJim Jagielski 	}
1012*b1cdbd2cSJim Jagielski 	else
1013*b1cdbd2cSJim Jagielski 		aParam.ClearDataAreas();
1014*b1cdbd2cSJim Jagielski }
1015*b1cdbd2cSJim Jagielski 
getStartOutputPosition()1016*b1cdbd2cSJim Jagielski table::CellAddress SAL_CALL ScConsolidationDescriptor::getStartOutputPosition()
1017*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
1018*b1cdbd2cSJim Jagielski {
1019*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1020*b1cdbd2cSJim Jagielski 	table::CellAddress aPos;
1021*b1cdbd2cSJim Jagielski 	aPos.Column	= aParam.nCol;
1022*b1cdbd2cSJim Jagielski 	aPos.Row	= aParam.nRow;
1023*b1cdbd2cSJim Jagielski 	aPos.Sheet	= aParam.nTab;
1024*b1cdbd2cSJim Jagielski 	return aPos;
1025*b1cdbd2cSJim Jagielski }
1026*b1cdbd2cSJim Jagielski 
setStartOutputPosition(const table::CellAddress & aStartOutputPosition)1027*b1cdbd2cSJim Jagielski void SAL_CALL ScConsolidationDescriptor::setStartOutputPosition(
1028*b1cdbd2cSJim Jagielski 								const table::CellAddress& aStartOutputPosition )
1029*b1cdbd2cSJim Jagielski 									throw(uno::RuntimeException)
1030*b1cdbd2cSJim Jagielski {
1031*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1032*b1cdbd2cSJim Jagielski 	aParam.nCol = (SCCOL)aStartOutputPosition.Column;
1033*b1cdbd2cSJim Jagielski 	aParam.nRow = (SCROW)aStartOutputPosition.Row;
1034*b1cdbd2cSJim Jagielski 	aParam.nTab = aStartOutputPosition.Sheet;
1035*b1cdbd2cSJim Jagielski }
1036*b1cdbd2cSJim Jagielski 
getUseColumnHeaders()1037*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScConsolidationDescriptor::getUseColumnHeaders() throw(uno::RuntimeException)
1038*b1cdbd2cSJim Jagielski {
1039*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1040*b1cdbd2cSJim Jagielski 	return aParam.bByCol;
1041*b1cdbd2cSJim Jagielski }
1042*b1cdbd2cSJim Jagielski 
setUseColumnHeaders(sal_Bool bUseColumnHeaders)1043*b1cdbd2cSJim Jagielski void SAL_CALL ScConsolidationDescriptor::setUseColumnHeaders( sal_Bool bUseColumnHeaders )
1044*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
1045*b1cdbd2cSJim Jagielski {
1046*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1047*b1cdbd2cSJim Jagielski 	aParam.bByCol = bUseColumnHeaders;
1048*b1cdbd2cSJim Jagielski }
1049*b1cdbd2cSJim Jagielski 
getUseRowHeaders()1050*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScConsolidationDescriptor::getUseRowHeaders() throw(uno::RuntimeException)
1051*b1cdbd2cSJim Jagielski {
1052*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1053*b1cdbd2cSJim Jagielski 	return aParam.bByRow;
1054*b1cdbd2cSJim Jagielski }
1055*b1cdbd2cSJim Jagielski 
setUseRowHeaders(sal_Bool bUseRowHeaders)1056*b1cdbd2cSJim Jagielski void SAL_CALL ScConsolidationDescriptor::setUseRowHeaders( sal_Bool bUseRowHeaders )
1057*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
1058*b1cdbd2cSJim Jagielski {
1059*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1060*b1cdbd2cSJim Jagielski 	aParam.bByRow = bUseRowHeaders;
1061*b1cdbd2cSJim Jagielski }
1062*b1cdbd2cSJim Jagielski 
getInsertLinks()1063*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScConsolidationDescriptor::getInsertLinks() throw(uno::RuntimeException)
1064*b1cdbd2cSJim Jagielski {
1065*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1066*b1cdbd2cSJim Jagielski 	return aParam.bReferenceData;
1067*b1cdbd2cSJim Jagielski }
1068*b1cdbd2cSJim Jagielski 
setInsertLinks(sal_Bool bInsertLinks)1069*b1cdbd2cSJim Jagielski void SAL_CALL ScConsolidationDescriptor::setInsertLinks( sal_Bool bInsertLinks )
1070*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
1071*b1cdbd2cSJim Jagielski {
1072*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1073*b1cdbd2cSJim Jagielski 	aParam.bReferenceData = bInsertLinks;
1074*b1cdbd2cSJim Jagielski }
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1077*b1cdbd2cSJim Jagielski 
ScFilterDescriptorBase(ScDocShell * pDocShell)1078*b1cdbd2cSJim Jagielski ScFilterDescriptorBase::ScFilterDescriptorBase(ScDocShell* pDocShell) :
1079*b1cdbd2cSJim Jagielski 	aPropSet( lcl_GetFilterPropertyMap() ),
1080*b1cdbd2cSJim Jagielski     pDocSh(pDocShell)
1081*b1cdbd2cSJim Jagielski {
1082*b1cdbd2cSJim Jagielski 	if (pDocSh)
1083*b1cdbd2cSJim Jagielski 		pDocSh->GetDocument()->AddUnoObject(*this);
1084*b1cdbd2cSJim Jagielski }
1085*b1cdbd2cSJim Jagielski 
~ScFilterDescriptorBase()1086*b1cdbd2cSJim Jagielski ScFilterDescriptorBase::~ScFilterDescriptorBase()
1087*b1cdbd2cSJim Jagielski {
1088*b1cdbd2cSJim Jagielski 	if (pDocSh)
1089*b1cdbd2cSJim Jagielski 		pDocSh->GetDocument()->RemoveUnoObject(*this);
1090*b1cdbd2cSJim Jagielski }
1091*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster &,const SfxHint & rHint)1092*b1cdbd2cSJim Jagielski void ScFilterDescriptorBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
1093*b1cdbd2cSJim Jagielski {
1094*b1cdbd2cSJim Jagielski 	if ( rHint.ISA( SfxSimpleHint ) )
1095*b1cdbd2cSJim Jagielski 	{
1096*b1cdbd2cSJim Jagielski 		sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
1097*b1cdbd2cSJim Jagielski 		if ( nId == SFX_HINT_DYING )
1098*b1cdbd2cSJim Jagielski 		{
1099*b1cdbd2cSJim Jagielski 			pDocSh = NULL;			// invalid
1100*b1cdbd2cSJim Jagielski 		}
1101*b1cdbd2cSJim Jagielski 	}
1102*b1cdbd2cSJim Jagielski }
1103*b1cdbd2cSJim Jagielski 
1104*b1cdbd2cSJim Jagielski // XSheetFilterDescriptor and XSheetFilterDescriptor2
1105*b1cdbd2cSJim Jagielski 
getFilterFields()1106*b1cdbd2cSJim Jagielski uno::Sequence<sheet::TableFilterField> SAL_CALL ScFilterDescriptorBase::getFilterFields()
1107*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1108*b1cdbd2cSJim Jagielski {
1109*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1110*b1cdbd2cSJim Jagielski 	ScQueryParam aParam;
1111*b1cdbd2cSJim Jagielski 	GetData(aParam);
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski 	SCSIZE nEntries = aParam.GetEntryCount();	// allozierte Eintraege im Param
1114*b1cdbd2cSJim Jagielski 	SCSIZE nCount = 0;							// aktive
1115*b1cdbd2cSJim Jagielski 	while ( nCount < nEntries &&
1116*b1cdbd2cSJim Jagielski 			aParam.GetEntry(nCount).bDoQuery )
1117*b1cdbd2cSJim Jagielski 		++nCount;
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski 	sheet::TableFilterField aField;
1120*b1cdbd2cSJim Jagielski 	uno::Sequence<sheet::TableFilterField> aSeq(static_cast<sal_Int32>(nCount));
1121*b1cdbd2cSJim Jagielski 	sheet::TableFilterField* pAry = aSeq.getArray();
1122*b1cdbd2cSJim Jagielski 	for (SCSIZE i=0; i<nCount; i++)
1123*b1cdbd2cSJim Jagielski 	{
1124*b1cdbd2cSJim Jagielski 		const ScQueryEntry& rEntry = aParam.GetEntry(i);
1125*b1cdbd2cSJim Jagielski 
1126*b1cdbd2cSJim Jagielski         rtl::OUString aStringValue;
1127*b1cdbd2cSJim Jagielski 		if (rEntry.pStr)
1128*b1cdbd2cSJim Jagielski 			aStringValue = *rEntry.pStr;
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski 		aField.Connection	 = (rEntry.eConnect == SC_AND) ? sheet::FilterConnection_AND :
1131*b1cdbd2cSJim Jagielski 															 sheet::FilterConnection_OR;
1132*b1cdbd2cSJim Jagielski 		aField.Field		 = rEntry.nField;
1133*b1cdbd2cSJim Jagielski 		aField.IsNumeric	 = !rEntry.bQueryByString;
1134*b1cdbd2cSJim Jagielski 		aField.StringValue	 = aStringValue;
1135*b1cdbd2cSJim Jagielski 		aField.NumericValue	 = rEntry.nVal;
1136*b1cdbd2cSJim Jagielski 
1137*b1cdbd2cSJim Jagielski 		switch (rEntry.eOp)				// ScQueryOp
1138*b1cdbd2cSJim Jagielski 		{
1139*b1cdbd2cSJim Jagielski 			case SC_EQUAL:
1140*b1cdbd2cSJim Jagielski                 {
1141*b1cdbd2cSJim Jagielski                     aField.Operator = sheet::FilterOperator_EQUAL;
1142*b1cdbd2cSJim Jagielski                     if (!rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING)
1143*b1cdbd2cSJim Jagielski                     {
1144*b1cdbd2cSJim Jagielski                         if (rEntry.nVal == SC_EMPTYFIELDS)
1145*b1cdbd2cSJim Jagielski                         {
1146*b1cdbd2cSJim Jagielski                             aField.Operator = sheet::FilterOperator_EMPTY;
1147*b1cdbd2cSJim Jagielski                             aField.NumericValue = 0;
1148*b1cdbd2cSJim Jagielski                         }
1149*b1cdbd2cSJim Jagielski                         else if (rEntry.nVal == SC_NONEMPTYFIELDS)
1150*b1cdbd2cSJim Jagielski                         {
1151*b1cdbd2cSJim Jagielski                             aField.Operator = sheet::FilterOperator_NOT_EMPTY;
1152*b1cdbd2cSJim Jagielski                             aField.NumericValue = 0;
1153*b1cdbd2cSJim Jagielski                         }
1154*b1cdbd2cSJim Jagielski                     }
1155*b1cdbd2cSJim Jagielski                 }
1156*b1cdbd2cSJim Jagielski                 break;
1157*b1cdbd2cSJim Jagielski 			case SC_LESS:			aField.Operator = sheet::FilterOperator_LESS;			  break;
1158*b1cdbd2cSJim Jagielski 			case SC_GREATER:		aField.Operator = sheet::FilterOperator_GREATER;		  break;
1159*b1cdbd2cSJim Jagielski 			case SC_LESS_EQUAL:		aField.Operator = sheet::FilterOperator_LESS_EQUAL;	  break;
1160*b1cdbd2cSJim Jagielski 			case SC_GREATER_EQUAL:	aField.Operator = sheet::FilterOperator_GREATER_EQUAL;  break;
1161*b1cdbd2cSJim Jagielski 			case SC_NOT_EQUAL:		aField.Operator = sheet::FilterOperator_NOT_EQUAL;	  break;
1162*b1cdbd2cSJim Jagielski 			case SC_TOPVAL:			aField.Operator = sheet::FilterOperator_TOP_VALUES;	  break;
1163*b1cdbd2cSJim Jagielski 			case SC_BOTVAL:			aField.Operator = sheet::FilterOperator_BOTTOM_VALUES;  break;
1164*b1cdbd2cSJim Jagielski 			case SC_TOPPERC:		aField.Operator = sheet::FilterOperator_TOP_PERCENT;	  break;
1165*b1cdbd2cSJim Jagielski 			case SC_BOTPERC:		aField.Operator = sheet::FilterOperator_BOTTOM_PERCENT; break;
1166*b1cdbd2cSJim Jagielski 			default:
1167*b1cdbd2cSJim Jagielski 				DBG_ERROR("Falscher Filter-enum");
1168*b1cdbd2cSJim Jagielski 				aField.Operator = sheet::FilterOperator_EMPTY;
1169*b1cdbd2cSJim Jagielski 		}
1170*b1cdbd2cSJim Jagielski 		pAry[i] = aField;
1171*b1cdbd2cSJim Jagielski 	}
1172*b1cdbd2cSJim Jagielski 	return aSeq;
1173*b1cdbd2cSJim Jagielski }
1174*b1cdbd2cSJim Jagielski 
getFilterFields2()1175*b1cdbd2cSJim Jagielski uno::Sequence<sheet::TableFilterField2> SAL_CALL ScFilterDescriptorBase::getFilterFields2()
1176*b1cdbd2cSJim Jagielski throw(uno::RuntimeException)
1177*b1cdbd2cSJim Jagielski {
1178*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
1179*b1cdbd2cSJim Jagielski     ScQueryParam aParam;
1180*b1cdbd2cSJim Jagielski     GetData(aParam);
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski     SCSIZE nEntries = aParam.GetEntryCount();	// allozierte Eintraege im Param
1183*b1cdbd2cSJim Jagielski     SCSIZE nCount = 0;							// aktive
1184*b1cdbd2cSJim Jagielski     while ( nCount < nEntries &&
1185*b1cdbd2cSJim Jagielski         aParam.GetEntry(nCount).bDoQuery )
1186*b1cdbd2cSJim Jagielski         ++nCount;
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski     sheet::TableFilterField2 aField;
1189*b1cdbd2cSJim Jagielski     uno::Sequence<sheet::TableFilterField2> aSeq(static_cast<sal_Int32>(nCount));
1190*b1cdbd2cSJim Jagielski     sheet::TableFilterField2* pAry = aSeq.getArray();
1191*b1cdbd2cSJim Jagielski     for (SCSIZE i=0; i<nCount; i++)
1192*b1cdbd2cSJim Jagielski     {
1193*b1cdbd2cSJim Jagielski         const ScQueryEntry& rEntry = aParam.GetEntry(i);
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski         rtl::OUString aStringValue;
1196*b1cdbd2cSJim Jagielski         if (rEntry.pStr)
1197*b1cdbd2cSJim Jagielski             aStringValue = *rEntry.pStr;
1198*b1cdbd2cSJim Jagielski 
1199*b1cdbd2cSJim Jagielski         aField.Connection	 = (rEntry.eConnect == SC_AND) ? sheet::FilterConnection_AND : sheet::FilterConnection_OR;
1200*b1cdbd2cSJim Jagielski         aField.Field		 = rEntry.nField;
1201*b1cdbd2cSJim Jagielski         aField.IsNumeric	 = !rEntry.bQueryByString;
1202*b1cdbd2cSJim Jagielski         aField.StringValue	 = aStringValue;
1203*b1cdbd2cSJim Jagielski         aField.NumericValue	 = rEntry.nVal;
1204*b1cdbd2cSJim Jagielski 
1205*b1cdbd2cSJim Jagielski         switch (rEntry.eOp)				// ScQueryOp
1206*b1cdbd2cSJim Jagielski         {
1207*b1cdbd2cSJim Jagielski         case SC_EQUAL:
1208*b1cdbd2cSJim Jagielski             {
1209*b1cdbd2cSJim Jagielski                 aField.Operator = sheet::FilterOperator2::EQUAL;
1210*b1cdbd2cSJim Jagielski                 if (!rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING)
1211*b1cdbd2cSJim Jagielski                 {
1212*b1cdbd2cSJim Jagielski                     if (rEntry.nVal == SC_EMPTYFIELDS)
1213*b1cdbd2cSJim Jagielski                     {
1214*b1cdbd2cSJim Jagielski                         aField.Operator = sheet::FilterOperator2::EMPTY;
1215*b1cdbd2cSJim Jagielski                         aField.NumericValue = 0;
1216*b1cdbd2cSJim Jagielski                     }
1217*b1cdbd2cSJim Jagielski                     else if (rEntry.nVal == SC_NONEMPTYFIELDS)
1218*b1cdbd2cSJim Jagielski                     {
1219*b1cdbd2cSJim Jagielski                         aField.Operator = sheet::FilterOperator2::NOT_EMPTY;
1220*b1cdbd2cSJim Jagielski                         aField.NumericValue = 0;
1221*b1cdbd2cSJim Jagielski                     }
1222*b1cdbd2cSJim Jagielski                 }
1223*b1cdbd2cSJim Jagielski             }
1224*b1cdbd2cSJim Jagielski             break;
1225*b1cdbd2cSJim Jagielski         case SC_LESS:			        aField.Operator = sheet::FilterOperator2::LESS;			        break;
1226*b1cdbd2cSJim Jagielski         case SC_GREATER:		        aField.Operator = sheet::FilterOperator2::GREATER;		        break;
1227*b1cdbd2cSJim Jagielski         case SC_LESS_EQUAL:		        aField.Operator = sheet::FilterOperator2::LESS_EQUAL;	        break;
1228*b1cdbd2cSJim Jagielski         case SC_GREATER_EQUAL:	        aField.Operator = sheet::FilterOperator2::GREATER_EQUAL;        break;
1229*b1cdbd2cSJim Jagielski         case SC_NOT_EQUAL:		        aField.Operator = sheet::FilterOperator2::NOT_EQUAL;	        break;
1230*b1cdbd2cSJim Jagielski         case SC_TOPVAL:			        aField.Operator = sheet::FilterOperator2::TOP_VALUES;	        break;
1231*b1cdbd2cSJim Jagielski         case SC_BOTVAL:			        aField.Operator = sheet::FilterOperator2::BOTTOM_VALUES;        break;
1232*b1cdbd2cSJim Jagielski         case SC_TOPPERC:		        aField.Operator = sheet::FilterOperator2::TOP_PERCENT;	        break;
1233*b1cdbd2cSJim Jagielski         case SC_BOTPERC:		        aField.Operator = sheet::FilterOperator2::BOTTOM_PERCENT;       break;
1234*b1cdbd2cSJim Jagielski         case SC_CONTAINS:               aField.Operator = sheet::FilterOperator2::CONTAINS;             break;
1235*b1cdbd2cSJim Jagielski         case SC_DOES_NOT_CONTAIN:       aField.Operator = sheet::FilterOperator2::DOES_NOT_CONTAIN;     break;
1236*b1cdbd2cSJim Jagielski         case SC_BEGINS_WITH:            aField.Operator = sheet::FilterOperator2::BEGINS_WITH;          break;
1237*b1cdbd2cSJim Jagielski         case SC_DOES_NOT_BEGIN_WITH:    aField.Operator = sheet::FilterOperator2::DOES_NOT_BEGIN_WITH;  break;
1238*b1cdbd2cSJim Jagielski         case SC_ENDS_WITH:              aField.Operator = sheet::FilterOperator2::ENDS_WITH;            break;
1239*b1cdbd2cSJim Jagielski         case SC_DOES_NOT_END_WITH:      aField.Operator = sheet::FilterOperator2::DOES_NOT_END_WITH;    break;
1240*b1cdbd2cSJim Jagielski         default:
1241*b1cdbd2cSJim Jagielski             DBG_ERROR("Falscher Filter-enum");
1242*b1cdbd2cSJim Jagielski             aField.Operator = sheet::FilterOperator2::EMPTY;
1243*b1cdbd2cSJim Jagielski         }
1244*b1cdbd2cSJim Jagielski         pAry[i] = aField;
1245*b1cdbd2cSJim Jagielski     }
1246*b1cdbd2cSJim Jagielski     return aSeq;
1247*b1cdbd2cSJim Jagielski }
1248*b1cdbd2cSJim Jagielski 
setFilterFields(const uno::Sequence<sheet::TableFilterField> & aFilterFields)1249*b1cdbd2cSJim Jagielski void SAL_CALL ScFilterDescriptorBase::setFilterFields(
1250*b1cdbd2cSJim Jagielski 				const uno::Sequence<sheet::TableFilterField>& aFilterFields )
1251*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1252*b1cdbd2cSJim Jagielski {
1253*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1254*b1cdbd2cSJim Jagielski 	ScQueryParam aParam;
1255*b1cdbd2cSJim Jagielski 	GetData(aParam);
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski 	SCSIZE nCount = static_cast<SCSIZE>(aFilterFields.getLength());
1258*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nCount <= MAXQUERY, "setFilterFields: zu viele" );
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski 	aParam.Resize( nCount );
1261*b1cdbd2cSJim Jagielski 
1262*b1cdbd2cSJim Jagielski 	const sheet::TableFilterField* pAry = aFilterFields.getConstArray();
1263*b1cdbd2cSJim Jagielski 	SCSIZE i;
1264*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount; i++)
1265*b1cdbd2cSJim Jagielski 	{
1266*b1cdbd2cSJim Jagielski 		ScQueryEntry& rEntry = aParam.GetEntry(i);
1267*b1cdbd2cSJim Jagielski 		if (!rEntry.pStr)
1268*b1cdbd2cSJim Jagielski 			rEntry.pStr = new String;		// sollte nicht sein (soll immer initialisiert sein)
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski 		rEntry.bDoQuery			= sal_True;
1271*b1cdbd2cSJim Jagielski 		rEntry.eConnect			= (pAry[i].Connection == sheet::FilterConnection_AND) ? SC_AND : SC_OR;
1272*b1cdbd2cSJim Jagielski 		rEntry.nField			= pAry[i].Field;
1273*b1cdbd2cSJim Jagielski 		rEntry.bQueryByString	= !pAry[i].IsNumeric;
1274*b1cdbd2cSJim Jagielski 		*rEntry.pStr			= String( pAry[i].StringValue );
1275*b1cdbd2cSJim Jagielski 		rEntry.nVal				= pAry[i].NumericValue;
1276*b1cdbd2cSJim Jagielski 
1277*b1cdbd2cSJim Jagielski         if (!rEntry.bQueryByString && pDocSh)
1278*b1cdbd2cSJim Jagielski         {
1279*b1cdbd2cSJim Jagielski             pDocSh->GetDocument()->GetFormatTable()->GetInputLineString(rEntry.nVal, 0, *rEntry.pStr);
1280*b1cdbd2cSJim Jagielski         }
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski 		switch (pAry[i].Operator)			// FilterOperator
1283*b1cdbd2cSJim Jagielski 		{
1284*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_EQUAL:			rEntry.eOp = SC_EQUAL;		 break;
1285*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_LESS:			rEntry.eOp = SC_LESS;			 break;
1286*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_GREATER:			rEntry.eOp = SC_GREATER;		 break;
1287*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_LESS_EQUAL:		rEntry.eOp = SC_LESS_EQUAL;	 break;
1288*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_GREATER_EQUAL:	rEntry.eOp = SC_GREATER_EQUAL; break;
1289*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_NOT_EQUAL:		rEntry.eOp = SC_NOT_EQUAL;	 break;
1290*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_TOP_VALUES:		rEntry.eOp = SC_TOPVAL;		 break;
1291*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_BOTTOM_VALUES:	rEntry.eOp = SC_BOTVAL;		 break;
1292*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_TOP_PERCENT:		rEntry.eOp = SC_TOPPERC;		 break;
1293*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_BOTTOM_PERCENT:	rEntry.eOp = SC_BOTPERC;		 break;
1294*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_EMPTY:
1295*b1cdbd2cSJim Jagielski                 {
1296*b1cdbd2cSJim Jagielski                     rEntry.eOp = SC_EQUAL;
1297*b1cdbd2cSJim Jagielski                     rEntry.nVal = SC_EMPTYFIELDS;
1298*b1cdbd2cSJim Jagielski                     rEntry.bQueryByString = sal_False;
1299*b1cdbd2cSJim Jagielski                     *rEntry.pStr = EMPTY_STRING;
1300*b1cdbd2cSJim Jagielski                 }
1301*b1cdbd2cSJim Jagielski                 break;
1302*b1cdbd2cSJim Jagielski 			case sheet::FilterOperator_NOT_EMPTY:
1303*b1cdbd2cSJim Jagielski                 {
1304*b1cdbd2cSJim Jagielski                     rEntry.eOp = SC_EQUAL;
1305*b1cdbd2cSJim Jagielski                     rEntry.nVal = SC_NONEMPTYFIELDS;
1306*b1cdbd2cSJim Jagielski                     rEntry.bQueryByString = sal_False;
1307*b1cdbd2cSJim Jagielski                     *rEntry.pStr = EMPTY_STRING;
1308*b1cdbd2cSJim Jagielski                 }
1309*b1cdbd2cSJim Jagielski                 break;
1310*b1cdbd2cSJim Jagielski 			default:
1311*b1cdbd2cSJim Jagielski 				DBG_ERROR("Falscher Query-enum");
1312*b1cdbd2cSJim Jagielski 				rEntry.eOp = SC_EQUAL;
1313*b1cdbd2cSJim Jagielski 		}
1314*b1cdbd2cSJim Jagielski     }
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski 	SCSIZE nParamCount = aParam.GetEntryCount();	// Param wird nicht unter 8 resized
1317*b1cdbd2cSJim Jagielski 	for (i=nCount; i<nParamCount; i++)
1318*b1cdbd2cSJim Jagielski 		aParam.GetEntry(i).bDoQuery = sal_False;		// ueberzaehlige Felder zuruecksetzen
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski 	PutData(aParam);
1321*b1cdbd2cSJim Jagielski }
1322*b1cdbd2cSJim Jagielski 
setFilterFields2(const uno::Sequence<sheet::TableFilterField2> & aFilterFields)1323*b1cdbd2cSJim Jagielski void SAL_CALL ScFilterDescriptorBase::setFilterFields2(
1324*b1cdbd2cSJim Jagielski     const uno::Sequence<sheet::TableFilterField2>& aFilterFields )
1325*b1cdbd2cSJim Jagielski     throw(uno::RuntimeException)
1326*b1cdbd2cSJim Jagielski {
1327*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
1328*b1cdbd2cSJim Jagielski     ScQueryParam aParam;
1329*b1cdbd2cSJim Jagielski     GetData(aParam);
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski     SCSIZE nCount = static_cast<SCSIZE>(aFilterFields.getLength());
1332*b1cdbd2cSJim Jagielski     DBG_ASSERT( nCount <= MAXQUERY, "setFilterFields: zu viele" );
1333*b1cdbd2cSJim Jagielski 
1334*b1cdbd2cSJim Jagielski     aParam.Resize( nCount );
1335*b1cdbd2cSJim Jagielski 
1336*b1cdbd2cSJim Jagielski     const sheet::TableFilterField2* pAry = aFilterFields.getConstArray();
1337*b1cdbd2cSJim Jagielski     SCSIZE i;
1338*b1cdbd2cSJim Jagielski     for (i=0; i<nCount; i++)
1339*b1cdbd2cSJim Jagielski     {
1340*b1cdbd2cSJim Jagielski         ScQueryEntry& rEntry = aParam.GetEntry(i);
1341*b1cdbd2cSJim Jagielski         if (!rEntry.pStr)
1342*b1cdbd2cSJim Jagielski             rEntry.pStr = new String;		// sollte nicht sein (soll immer initialisiert sein)
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski         rEntry.bDoQuery			= sal_True;
1345*b1cdbd2cSJim Jagielski         rEntry.eConnect			= (pAry[i].Connection == sheet::FilterConnection_AND) ? SC_AND : SC_OR;
1346*b1cdbd2cSJim Jagielski         rEntry.nField			= pAry[i].Field;
1347*b1cdbd2cSJim Jagielski         rEntry.bQueryByString	= !pAry[i].IsNumeric;
1348*b1cdbd2cSJim Jagielski         *rEntry.pStr			= String( pAry[i].StringValue );
1349*b1cdbd2cSJim Jagielski         rEntry.nVal				= pAry[i].NumericValue;
1350*b1cdbd2cSJim Jagielski 
1351*b1cdbd2cSJim Jagielski         if (!rEntry.bQueryByString && pDocSh)
1352*b1cdbd2cSJim Jagielski         {
1353*b1cdbd2cSJim Jagielski             pDocSh->GetDocument()->GetFormatTable()->GetInputLineString(rEntry.nVal, 0, *rEntry.pStr);
1354*b1cdbd2cSJim Jagielski         }
1355*b1cdbd2cSJim Jagielski 
1356*b1cdbd2cSJim Jagielski         switch (pAry[i].Operator)			// FilterOperator
1357*b1cdbd2cSJim Jagielski         {
1358*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::EQUAL:			        rEntry.eOp = SC_EQUAL;		        break;
1359*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::LESS:			        rEntry.eOp = SC_LESS;			    break;
1360*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::GREATER:			    rEntry.eOp = SC_GREATER;		    break;
1361*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::LESS_EQUAL:		    rEntry.eOp = SC_LESS_EQUAL;	        break;
1362*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::GREATER_EQUAL:	        rEntry.eOp = SC_GREATER_EQUAL;      break;
1363*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::NOT_EQUAL:		        rEntry.eOp = SC_NOT_EQUAL;	        break;
1364*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::TOP_VALUES:	    	rEntry.eOp = SC_TOPVAL;		        break;
1365*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::BOTTOM_VALUES:	        rEntry.eOp = SC_BOTVAL;		        break;
1366*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::TOP_PERCENT:		    rEntry.eOp = SC_TOPPERC;		    break;
1367*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::BOTTOM_PERCENT:	    rEntry.eOp = SC_BOTPERC;		    break;
1368*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::CONTAINS:		        rEntry.eOp = SC_CONTAINS;		    break;
1369*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::DOES_NOT_CONTAIN:		rEntry.eOp = SC_DOES_NOT_CONTAIN;   break;
1370*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::BEGINS_WITH:			rEntry.eOp = SC_BEGINS_WITH;		break;
1371*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::DOES_NOT_BEGIN_WITH:	rEntry.eOp = SC_DOES_NOT_BEGIN_WITH;break;
1372*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::ENDS_WITH:			    rEntry.eOp = SC_ENDS_WITH;		    break;
1373*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::DOES_NOT_END_WITH:		rEntry.eOp = SC_DOES_NOT_END_WITH;	break;
1374*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::EMPTY:
1375*b1cdbd2cSJim Jagielski             {
1376*b1cdbd2cSJim Jagielski                 rEntry.eOp = SC_EQUAL;
1377*b1cdbd2cSJim Jagielski                 rEntry.nVal = SC_EMPTYFIELDS;
1378*b1cdbd2cSJim Jagielski                 rEntry.bQueryByString = sal_False;
1379*b1cdbd2cSJim Jagielski                 *rEntry.pStr = EMPTY_STRING;
1380*b1cdbd2cSJim Jagielski             }
1381*b1cdbd2cSJim Jagielski             break;
1382*b1cdbd2cSJim Jagielski         case sheet::FilterOperator2::NOT_EMPTY:
1383*b1cdbd2cSJim Jagielski             {
1384*b1cdbd2cSJim Jagielski                 rEntry.eOp = SC_EQUAL;
1385*b1cdbd2cSJim Jagielski                 rEntry.nVal = SC_NONEMPTYFIELDS;
1386*b1cdbd2cSJim Jagielski                 rEntry.bQueryByString = sal_False;
1387*b1cdbd2cSJim Jagielski                 *rEntry.pStr = EMPTY_STRING;
1388*b1cdbd2cSJim Jagielski             }
1389*b1cdbd2cSJim Jagielski             break;
1390*b1cdbd2cSJim Jagielski         default:
1391*b1cdbd2cSJim Jagielski             DBG_ERROR("Falscher Query-enum");
1392*b1cdbd2cSJim Jagielski             rEntry.eOp = SC_EQUAL;
1393*b1cdbd2cSJim Jagielski         }
1394*b1cdbd2cSJim Jagielski     }
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski     SCSIZE nParamCount = aParam.GetEntryCount();	// Param wird nicht unter 8 resized
1397*b1cdbd2cSJim Jagielski     for (i=nCount; i<nParamCount; i++)
1398*b1cdbd2cSJim Jagielski         aParam.GetEntry(i).bDoQuery = sal_False;		// ueberzaehlige Felder zuruecksetzen
1399*b1cdbd2cSJim Jagielski 
1400*b1cdbd2cSJim Jagielski     PutData(aParam);
1401*b1cdbd2cSJim Jagielski }
1402*b1cdbd2cSJim Jagielski 
1403*b1cdbd2cSJim Jagielski // Rest sind Properties
1404*b1cdbd2cSJim Jagielski 
1405*b1cdbd2cSJim Jagielski // XPropertySet
1406*b1cdbd2cSJim Jagielski 
getPropertySetInfo()1407*b1cdbd2cSJim Jagielski uno::Reference<beans::XPropertySetInfo> SAL_CALL ScFilterDescriptorBase::getPropertySetInfo()
1408*b1cdbd2cSJim Jagielski 														throw(uno::RuntimeException)
1409*b1cdbd2cSJim Jagielski {
1410*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1411*b1cdbd2cSJim Jagielski 	static uno::Reference<beans::XPropertySetInfo> aRef(
1412*b1cdbd2cSJim Jagielski 		new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
1413*b1cdbd2cSJim Jagielski 	return aRef;
1414*b1cdbd2cSJim Jagielski }
1415*b1cdbd2cSJim Jagielski 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any & aValue)1416*b1cdbd2cSJim Jagielski void SAL_CALL ScFilterDescriptorBase::setPropertyValue(
1417*b1cdbd2cSJim Jagielski 						const rtl::OUString& aPropertyName, const uno::Any& aValue )
1418*b1cdbd2cSJim Jagielski 				throw(beans::UnknownPropertyException, beans::PropertyVetoException,
1419*b1cdbd2cSJim Jagielski 						lang::IllegalArgumentException, lang::WrappedTargetException,
1420*b1cdbd2cSJim Jagielski 						uno::RuntimeException)
1421*b1cdbd2cSJim Jagielski {
1422*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1423*b1cdbd2cSJim Jagielski 	ScQueryParam aParam;
1424*b1cdbd2cSJim Jagielski 	GetData(aParam);
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski 	String aString(aPropertyName);
1427*b1cdbd2cSJim Jagielski 	if (aString.EqualsAscii( SC_UNONAME_CONTHDR ))
1428*b1cdbd2cSJim Jagielski 		aParam.bHasHeader = ScUnoHelpFunctions::GetBoolFromAny( aValue );
1429*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_COPYOUT ))
1430*b1cdbd2cSJim Jagielski 		aParam.bInplace = !(ScUnoHelpFunctions::GetBoolFromAny( aValue ));
1431*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ISCASE ))
1432*b1cdbd2cSJim Jagielski 		aParam.bCaseSens = ScUnoHelpFunctions::GetBoolFromAny( aValue );
1433*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_MAXFLD ))
1434*b1cdbd2cSJim Jagielski 	{
1435*b1cdbd2cSJim Jagielski 		sal_Int32 nVal = 0;
1436*b1cdbd2cSJim Jagielski         if ( (aValue >>= nVal) && nVal > sal::static_int_cast<sal_Int32>(MAXQUERY) )
1437*b1cdbd2cSJim Jagielski 		{
1438*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException();
1439*b1cdbd2cSJim Jagielski 		}
1440*b1cdbd2cSJim Jagielski 	}
1441*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ORIENT ))
1442*b1cdbd2cSJim Jagielski 	{
1443*b1cdbd2cSJim Jagielski 		//!	test for correct enum type?
1444*b1cdbd2cSJim Jagielski 		table::TableOrientation eOrient = (table::TableOrientation)
1445*b1cdbd2cSJim Jagielski 								ScUnoHelpFunctions::GetEnumFromAny( aValue );
1446*b1cdbd2cSJim Jagielski 		aParam.bByRow = ( eOrient != table::TableOrientation_COLUMNS );
1447*b1cdbd2cSJim Jagielski 	}
1448*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_OUTPOS ))
1449*b1cdbd2cSJim Jagielski 	{
1450*b1cdbd2cSJim Jagielski 		table::CellAddress aAddress;
1451*b1cdbd2cSJim Jagielski 		if ( aValue >>= aAddress )
1452*b1cdbd2cSJim Jagielski 		{
1453*b1cdbd2cSJim Jagielski 			aParam.nDestTab = aAddress.Sheet;
1454*b1cdbd2cSJim Jagielski 			aParam.nDestCol = (SCCOL)aAddress.Column;
1455*b1cdbd2cSJim Jagielski 			aParam.nDestRow = (SCROW)aAddress.Row;
1456*b1cdbd2cSJim Jagielski 		}
1457*b1cdbd2cSJim Jagielski 	}
1458*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_SAVEOUT ))
1459*b1cdbd2cSJim Jagielski 		aParam.bDestPers = ScUnoHelpFunctions::GetBoolFromAny( aValue );
1460*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_SKIPDUP ))
1461*b1cdbd2cSJim Jagielski 		aParam.bDuplicate = !(ScUnoHelpFunctions::GetBoolFromAny( aValue ));
1462*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_USEREGEX ))
1463*b1cdbd2cSJim Jagielski 		aParam.bRegExp = ScUnoHelpFunctions::GetBoolFromAny( aValue );
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski 	PutData(aParam);
1466*b1cdbd2cSJim Jagielski }
1467*b1cdbd2cSJim Jagielski 
getPropertyValue(const rtl::OUString & aPropertyName)1468*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScFilterDescriptorBase::getPropertyValue( const rtl::OUString& aPropertyName )
1469*b1cdbd2cSJim Jagielski 				throw(beans::UnknownPropertyException, lang::WrappedTargetException,
1470*b1cdbd2cSJim Jagielski 						uno::RuntimeException)
1471*b1cdbd2cSJim Jagielski {
1472*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1473*b1cdbd2cSJim Jagielski 	ScQueryParam aParam;
1474*b1cdbd2cSJim Jagielski 	GetData(aParam);
1475*b1cdbd2cSJim Jagielski 
1476*b1cdbd2cSJim Jagielski 	String aString(aPropertyName);
1477*b1cdbd2cSJim Jagielski 	uno::Any aRet;
1478*b1cdbd2cSJim Jagielski 
1479*b1cdbd2cSJim Jagielski 	if (aString.EqualsAscii( SC_UNONAME_CONTHDR ))
1480*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bHasHeader );
1481*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_COPYOUT ))
1482*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, !(aParam.bInplace) );
1483*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ISCASE ))
1484*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bCaseSens );
1485*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_MAXFLD ))
1486*b1cdbd2cSJim Jagielski 		aRet <<= (sal_Int32) MAXQUERY;
1487*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_ORIENT ))
1488*b1cdbd2cSJim Jagielski 	{
1489*b1cdbd2cSJim Jagielski 		table::TableOrientation eOrient = aParam.bByRow ? table::TableOrientation_ROWS :
1490*b1cdbd2cSJim Jagielski 														  table::TableOrientation_COLUMNS;
1491*b1cdbd2cSJim Jagielski 		aRet <<= eOrient;
1492*b1cdbd2cSJim Jagielski 	}
1493*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_OUTPOS ))
1494*b1cdbd2cSJim Jagielski 	{
1495*b1cdbd2cSJim Jagielski 		table::CellAddress aOutPos;
1496*b1cdbd2cSJim Jagielski 		aOutPos.Sheet  = aParam.nDestTab;
1497*b1cdbd2cSJim Jagielski 		aOutPos.Column = aParam.nDestCol;
1498*b1cdbd2cSJim Jagielski 		aOutPos.Row    = aParam.nDestRow;
1499*b1cdbd2cSJim Jagielski 		aRet <<= aOutPos;
1500*b1cdbd2cSJim Jagielski 	}
1501*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_SAVEOUT ))
1502*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bDestPers );
1503*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_SKIPDUP ))
1504*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, !(aParam.bDuplicate) );
1505*b1cdbd2cSJim Jagielski 	else if (aString.EqualsAscii( SC_UNONAME_USEREGEX ))
1506*b1cdbd2cSJim Jagielski 		ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bRegExp );
1507*b1cdbd2cSJim Jagielski 
1508*b1cdbd2cSJim Jagielski 	return aRet;
1509*b1cdbd2cSJim Jagielski }
1510*b1cdbd2cSJim Jagielski 
SC_IMPL_DUMMY_PROPERTY_LISTENER(ScFilterDescriptorBase)1511*b1cdbd2cSJim Jagielski SC_IMPL_DUMMY_PROPERTY_LISTENER( ScFilterDescriptorBase )
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1514*b1cdbd2cSJim Jagielski 
1515*b1cdbd2cSJim Jagielski ScFilterDescriptor::ScFilterDescriptor(ScDocShell* pDocShell)
1516*b1cdbd2cSJim Jagielski     :
1517*b1cdbd2cSJim Jagielski     ScFilterDescriptorBase(pDocShell)
1518*b1cdbd2cSJim Jagielski {
1519*b1cdbd2cSJim Jagielski }
1520*b1cdbd2cSJim Jagielski 
~ScFilterDescriptor()1521*b1cdbd2cSJim Jagielski ScFilterDescriptor::~ScFilterDescriptor()
1522*b1cdbd2cSJim Jagielski {
1523*b1cdbd2cSJim Jagielski }
1524*b1cdbd2cSJim Jagielski 
GetData(ScQueryParam & rParam) const1525*b1cdbd2cSJim Jagielski void ScFilterDescriptor::GetData( ScQueryParam& rParam ) const
1526*b1cdbd2cSJim Jagielski {
1527*b1cdbd2cSJim Jagielski 	rParam = aStoredParam;			// Abfrage fuer Interface
1528*b1cdbd2cSJim Jagielski }
1529*b1cdbd2cSJim Jagielski 
PutData(const ScQueryParam & rParam)1530*b1cdbd2cSJim Jagielski void ScFilterDescriptor::PutData( const ScQueryParam& rParam )
1531*b1cdbd2cSJim Jagielski {
1532*b1cdbd2cSJim Jagielski 	aStoredParam = rParam;			// vom Interface gesetzt
1533*b1cdbd2cSJim Jagielski }
1534*b1cdbd2cSJim Jagielski 
SetParam(const ScQueryParam & rNew)1535*b1cdbd2cSJim Jagielski void ScFilterDescriptor::SetParam( const ScQueryParam& rNew )
1536*b1cdbd2cSJim Jagielski {
1537*b1cdbd2cSJim Jagielski 	aStoredParam = rNew;			// von aussen gesetzt
1538*b1cdbd2cSJim Jagielski }
1539*b1cdbd2cSJim Jagielski 
1540*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1541*b1cdbd2cSJim Jagielski 
ScRangeFilterDescriptor(ScDocShell * pDocShell,ScDatabaseRangeObj * pPar)1542*b1cdbd2cSJim Jagielski ScRangeFilterDescriptor::ScRangeFilterDescriptor(ScDocShell* pDocShell, ScDatabaseRangeObj* pPar) :
1543*b1cdbd2cSJim Jagielski     ScFilterDescriptorBase(pDocShell),
1544*b1cdbd2cSJim Jagielski 	pParent(pPar)
1545*b1cdbd2cSJim Jagielski {
1546*b1cdbd2cSJim Jagielski 	if (pParent)
1547*b1cdbd2cSJim Jagielski 		pParent->acquire();
1548*b1cdbd2cSJim Jagielski }
1549*b1cdbd2cSJim Jagielski 
~ScRangeFilterDescriptor()1550*b1cdbd2cSJim Jagielski ScRangeFilterDescriptor::~ScRangeFilterDescriptor()
1551*b1cdbd2cSJim Jagielski {
1552*b1cdbd2cSJim Jagielski 	if (pParent)
1553*b1cdbd2cSJim Jagielski 		pParent->release();
1554*b1cdbd2cSJim Jagielski }
1555*b1cdbd2cSJim Jagielski 
GetData(ScQueryParam & rParam) const1556*b1cdbd2cSJim Jagielski void ScRangeFilterDescriptor::GetData( ScQueryParam& rParam ) const
1557*b1cdbd2cSJim Jagielski {
1558*b1cdbd2cSJim Jagielski 	if (pParent)
1559*b1cdbd2cSJim Jagielski 		pParent->GetQueryParam( rParam );
1560*b1cdbd2cSJim Jagielski }
1561*b1cdbd2cSJim Jagielski 
PutData(const ScQueryParam & rParam)1562*b1cdbd2cSJim Jagielski void ScRangeFilterDescriptor::PutData( const ScQueryParam& rParam )
1563*b1cdbd2cSJim Jagielski {
1564*b1cdbd2cSJim Jagielski 	if (pParent)
1565*b1cdbd2cSJim Jagielski 		pParent->SetQueryParam( rParam );
1566*b1cdbd2cSJim Jagielski }
1567*b1cdbd2cSJim Jagielski 
1568*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1569*b1cdbd2cSJim Jagielski 
ScDataPilotFilterDescriptor(ScDocShell * pDocShell,ScDataPilotDescriptorBase * pPar)1570*b1cdbd2cSJim Jagielski ScDataPilotFilterDescriptor::ScDataPilotFilterDescriptor(ScDocShell* pDocShell, ScDataPilotDescriptorBase* pPar) :
1571*b1cdbd2cSJim Jagielski     ScFilterDescriptorBase(pDocShell),
1572*b1cdbd2cSJim Jagielski 	pParent(pPar)
1573*b1cdbd2cSJim Jagielski {
1574*b1cdbd2cSJim Jagielski 	if (pParent)
1575*b1cdbd2cSJim Jagielski 		pParent->acquire();
1576*b1cdbd2cSJim Jagielski }
1577*b1cdbd2cSJim Jagielski 
~ScDataPilotFilterDescriptor()1578*b1cdbd2cSJim Jagielski ScDataPilotFilterDescriptor::~ScDataPilotFilterDescriptor()
1579*b1cdbd2cSJim Jagielski {
1580*b1cdbd2cSJim Jagielski 	if (pParent)
1581*b1cdbd2cSJim Jagielski 		pParent->release();
1582*b1cdbd2cSJim Jagielski }
1583*b1cdbd2cSJim Jagielski 
GetData(ScQueryParam & rParam) const1584*b1cdbd2cSJim Jagielski void ScDataPilotFilterDescriptor::GetData( ScQueryParam& rParam ) const
1585*b1cdbd2cSJim Jagielski {
1586*b1cdbd2cSJim Jagielski 	if (pParent)
1587*b1cdbd2cSJim Jagielski 	{
1588*b1cdbd2cSJim Jagielski 		ScDPObject* pDPObj = pParent->GetDPObject();
1589*b1cdbd2cSJim Jagielski 		if (pDPObj && pDPObj->IsSheetData())
1590*b1cdbd2cSJim Jagielski             rParam = pDPObj->GetSheetDesc()->aQueryParam;
1591*b1cdbd2cSJim Jagielski 	}
1592*b1cdbd2cSJim Jagielski }
1593*b1cdbd2cSJim Jagielski 
PutData(const ScQueryParam & rParam)1594*b1cdbd2cSJim Jagielski void ScDataPilotFilterDescriptor::PutData( const ScQueryParam& rParam )
1595*b1cdbd2cSJim Jagielski {
1596*b1cdbd2cSJim Jagielski 	if (pParent)
1597*b1cdbd2cSJim Jagielski 	{
1598*b1cdbd2cSJim Jagielski 		ScDPObject* pDPObj = pParent->GetDPObject();
1599*b1cdbd2cSJim Jagielski         if (pDPObj)
1600*b1cdbd2cSJim Jagielski         {
1601*b1cdbd2cSJim Jagielski             ScSheetSourceDesc aSheetDesc;
1602*b1cdbd2cSJim Jagielski 	        if (pDPObj->IsSheetData())
1603*b1cdbd2cSJim Jagielski                 aSheetDesc = *pDPObj->GetSheetDesc();
1604*b1cdbd2cSJim Jagielski             aSheetDesc.aQueryParam = rParam;
1605*b1cdbd2cSJim Jagielski             pDPObj->SetSheetDesc(aSheetDesc);
1606*b1cdbd2cSJim Jagielski             pParent->SetDPObject(pDPObj);
1607*b1cdbd2cSJim Jagielski         }
1608*b1cdbd2cSJim Jagielski 	}
1609*b1cdbd2cSJim Jagielski }
1610*b1cdbd2cSJim Jagielski 
1611*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1612*b1cdbd2cSJim Jagielski 
ScDatabaseRangeObj(ScDocShell * pDocSh,const String & rNm)1613*b1cdbd2cSJim Jagielski ScDatabaseRangeObj::ScDatabaseRangeObj(ScDocShell* pDocSh, const String& rNm) :
1614*b1cdbd2cSJim Jagielski 	pDocShell( pDocSh ),
1615*b1cdbd2cSJim Jagielski 	aName( rNm ),
1616*b1cdbd2cSJim Jagielski 	aPropSet( lcl_GetDBRangePropertyMap() )
1617*b1cdbd2cSJim Jagielski {
1618*b1cdbd2cSJim Jagielski 	pDocShell->GetDocument()->AddUnoObject(*this);
1619*b1cdbd2cSJim Jagielski }
1620*b1cdbd2cSJim Jagielski 
~ScDatabaseRangeObj()1621*b1cdbd2cSJim Jagielski ScDatabaseRangeObj::~ScDatabaseRangeObj()
1622*b1cdbd2cSJim Jagielski {
1623*b1cdbd2cSJim Jagielski 	if (pDocShell)
1624*b1cdbd2cSJim Jagielski 		pDocShell->GetDocument()->RemoveUnoObject(*this);
1625*b1cdbd2cSJim Jagielski }
1626*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster &,const SfxHint & rHint)1627*b1cdbd2cSJim Jagielski void ScDatabaseRangeObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
1628*b1cdbd2cSJim Jagielski {
1629*b1cdbd2cSJim Jagielski 
1630*b1cdbd2cSJim Jagielski 	if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
1631*b1cdbd2cSJim Jagielski 		pDocShell = NULL;		// ungueltig geworden
1632*b1cdbd2cSJim Jagielski     else if ( rHint.ISA (ScDBRangeRefreshedHint) )
1633*b1cdbd2cSJim Jagielski     {
1634*b1cdbd2cSJim Jagielski         ScDBData* pDBData = GetDBData_Impl();
1635*b1cdbd2cSJim Jagielski 		const ScDBRangeRefreshedHint& rRef = (const ScDBRangeRefreshedHint&)rHint;
1636*b1cdbd2cSJim Jagielski         ScImportParam aParam;
1637*b1cdbd2cSJim Jagielski         pDBData->GetImportParam(aParam);
1638*b1cdbd2cSJim Jagielski         if (aParam == rRef.GetImportParam())
1639*b1cdbd2cSJim Jagielski             Refreshed_Impl();
1640*b1cdbd2cSJim Jagielski     }
1641*b1cdbd2cSJim Jagielski }
1642*b1cdbd2cSJim Jagielski 
1643*b1cdbd2cSJim Jagielski // Hilfsfuntionen
1644*b1cdbd2cSJim Jagielski 
GetDBData_Impl() const1645*b1cdbd2cSJim Jagielski ScDBData* ScDatabaseRangeObj::GetDBData_Impl() const
1646*b1cdbd2cSJim Jagielski {
1647*b1cdbd2cSJim Jagielski 	ScDBData* pRet = NULL;
1648*b1cdbd2cSJim Jagielski 	if (pDocShell)
1649*b1cdbd2cSJim Jagielski 	{
1650*b1cdbd2cSJim Jagielski 		ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
1651*b1cdbd2cSJim Jagielski 		if (pNames)
1652*b1cdbd2cSJim Jagielski 		{
1653*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = 0;
1654*b1cdbd2cSJim Jagielski 			if (pNames->SearchName( aName, nPos ))
1655*b1cdbd2cSJim Jagielski 				pRet = (*pNames)[nPos];
1656*b1cdbd2cSJim Jagielski 		}
1657*b1cdbd2cSJim Jagielski 	}
1658*b1cdbd2cSJim Jagielski 	return pRet;
1659*b1cdbd2cSJim Jagielski }
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski // XNamed
1662*b1cdbd2cSJim Jagielski 
getName()1663*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL ScDatabaseRangeObj::getName() throw(uno::RuntimeException)
1664*b1cdbd2cSJim Jagielski {
1665*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1666*b1cdbd2cSJim Jagielski 	return aName;
1667*b1cdbd2cSJim Jagielski }
1668*b1cdbd2cSJim Jagielski 
setName(const rtl::OUString & aNewName)1669*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangeObj::setName( const rtl::OUString& aNewName )
1670*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1671*b1cdbd2cSJim Jagielski {
1672*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1673*b1cdbd2cSJim Jagielski 	if (pDocShell)
1674*b1cdbd2cSJim Jagielski 	{
1675*b1cdbd2cSJim Jagielski 		ScDBDocFunc aFunc(*pDocShell);
1676*b1cdbd2cSJim Jagielski 		String aNewStr(aNewName);
1677*b1cdbd2cSJim Jagielski 		sal_Bool bOk = aFunc.RenameDBRange( aName, aNewStr, sal_True );
1678*b1cdbd2cSJim Jagielski 		if (bOk)
1679*b1cdbd2cSJim Jagielski 			aName = aNewStr;
1680*b1cdbd2cSJim Jagielski 	}
1681*b1cdbd2cSJim Jagielski }
1682*b1cdbd2cSJim Jagielski 
1683*b1cdbd2cSJim Jagielski // XDatabaseRange
1684*b1cdbd2cSJim Jagielski 
getDataArea()1685*b1cdbd2cSJim Jagielski table::CellRangeAddress SAL_CALL ScDatabaseRangeObj::getDataArea() throw(uno::RuntimeException)
1686*b1cdbd2cSJim Jagielski {
1687*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1688*b1cdbd2cSJim Jagielski 	table::CellRangeAddress aAddress;
1689*b1cdbd2cSJim Jagielski 	ScDBData* pData = GetDBData_Impl();
1690*b1cdbd2cSJim Jagielski 	if (pData)
1691*b1cdbd2cSJim Jagielski 	{
1692*b1cdbd2cSJim Jagielski 		ScRange aRange;
1693*b1cdbd2cSJim Jagielski 		pData->GetArea(aRange);
1694*b1cdbd2cSJim Jagielski 		aAddress.Sheet		 = aRange.aStart.Tab();
1695*b1cdbd2cSJim Jagielski 		aAddress.StartColumn = aRange.aStart.Col();
1696*b1cdbd2cSJim Jagielski 		aAddress.StartRow	 = aRange.aStart.Row();
1697*b1cdbd2cSJim Jagielski 		aAddress.EndColumn	 = aRange.aEnd.Col();
1698*b1cdbd2cSJim Jagielski 		aAddress.EndRow		 = aRange.aEnd.Row();
1699*b1cdbd2cSJim Jagielski 	}
1700*b1cdbd2cSJim Jagielski 	return aAddress;
1701*b1cdbd2cSJim Jagielski }
1702*b1cdbd2cSJim Jagielski 
setDataArea(const table::CellRangeAddress & aDataArea)1703*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangeObj::setDataArea( const table::CellRangeAddress& aDataArea )
1704*b1cdbd2cSJim Jagielski 					    							throw(uno::RuntimeException)
1705*b1cdbd2cSJim Jagielski {
1706*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1707*b1cdbd2cSJim Jagielski 	ScDBData* pData = GetDBData_Impl();
1708*b1cdbd2cSJim Jagielski 	if ( pDocShell && pData )
1709*b1cdbd2cSJim Jagielski 	{
1710*b1cdbd2cSJim Jagielski 		ScDBData aNewData( *pData );
1711*b1cdbd2cSJim Jagielski 		//!	MoveTo ???
1712*b1cdbd2cSJim Jagielski 		aNewData.SetArea( aDataArea.Sheet, (SCCOL)aDataArea.StartColumn, (SCROW)aDataArea.StartRow,
1713*b1cdbd2cSJim Jagielski 										   (SCCOL)aDataArea.EndColumn, (SCROW)aDataArea.EndRow );
1714*b1cdbd2cSJim Jagielski 		ScDBDocFunc aFunc(*pDocShell);
1715*b1cdbd2cSJim Jagielski 		aFunc.ModifyDBData(aNewData, sal_True);
1716*b1cdbd2cSJim Jagielski 	}
1717*b1cdbd2cSJim Jagielski }
1718*b1cdbd2cSJim Jagielski 
getSortDescriptor()1719*b1cdbd2cSJim Jagielski uno::Sequence<beans::PropertyValue> SAL_CALL ScDatabaseRangeObj::getSortDescriptor()
1720*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
1721*b1cdbd2cSJim Jagielski {
1722*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1723*b1cdbd2cSJim Jagielski 	ScSortParam aParam;
1724*b1cdbd2cSJim Jagielski 	const ScDBData* pData = GetDBData_Impl();
1725*b1cdbd2cSJim Jagielski 	if (pData)
1726*b1cdbd2cSJim Jagielski 	{
1727*b1cdbd2cSJim Jagielski 		pData->GetSortParam(aParam);
1728*b1cdbd2cSJim Jagielski 
1729*b1cdbd2cSJim Jagielski 		//	im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt
1730*b1cdbd2cSJim Jagielski 		ScRange aDBRange;
1731*b1cdbd2cSJim Jagielski 		pData->GetArea(aDBRange);
1732*b1cdbd2cSJim Jagielski 		SCCOLROW nFieldStart = aParam.bByRow ? static_cast<SCCOLROW>(aDBRange.aStart.Col()) : static_cast<SCCOLROW>(aDBRange.aStart.Row());
1733*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i=0; i<MAXSORT; i++)
1734*b1cdbd2cSJim Jagielski 			if ( aParam.bDoSort[i] && aParam.nField[i] >= nFieldStart )
1735*b1cdbd2cSJim Jagielski 				aParam.nField[i] -= nFieldStart;
1736*b1cdbd2cSJim Jagielski 	}
1737*b1cdbd2cSJim Jagielski 
1738*b1cdbd2cSJim Jagielski 	uno::Sequence<beans::PropertyValue> aSeq( ScSortDescriptor::GetPropertyCount() );
1739*b1cdbd2cSJim Jagielski 	ScSortDescriptor::FillProperties( aSeq, aParam );
1740*b1cdbd2cSJim Jagielski 	return aSeq;
1741*b1cdbd2cSJim Jagielski }
1742*b1cdbd2cSJim Jagielski 
GetQueryParam(ScQueryParam & rQueryParam) const1743*b1cdbd2cSJim Jagielski void ScDatabaseRangeObj::GetQueryParam(ScQueryParam& rQueryParam) const
1744*b1cdbd2cSJim Jagielski {
1745*b1cdbd2cSJim Jagielski 	const ScDBData* pData = GetDBData_Impl();
1746*b1cdbd2cSJim Jagielski 	if (pData)
1747*b1cdbd2cSJim Jagielski 	{
1748*b1cdbd2cSJim Jagielski 		pData->GetQueryParam(rQueryParam);
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski 		//	im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
1751*b1cdbd2cSJim Jagielski 		ScRange aDBRange;
1752*b1cdbd2cSJim Jagielski 		pData->GetArea(aDBRange);
1753*b1cdbd2cSJim Jagielski 		SCCOLROW nFieldStart = rQueryParam.bByRow ? static_cast<SCCOLROW>(aDBRange.aStart.Col()) : static_cast<SCCOLROW>(aDBRange.aStart.Row());
1754*b1cdbd2cSJim Jagielski 		SCSIZE nCount = rQueryParam.GetEntryCount();
1755*b1cdbd2cSJim Jagielski 		for (SCSIZE i=0; i<nCount; i++)
1756*b1cdbd2cSJim Jagielski 		{
1757*b1cdbd2cSJim Jagielski 			ScQueryEntry& rEntry = rQueryParam.GetEntry(i);
1758*b1cdbd2cSJim Jagielski 			if (rEntry.bDoQuery && rEntry.nField >= nFieldStart)
1759*b1cdbd2cSJim Jagielski 				rEntry.nField -= nFieldStart;
1760*b1cdbd2cSJim Jagielski 		}
1761*b1cdbd2cSJim Jagielski 	}
1762*b1cdbd2cSJim Jagielski }
1763*b1cdbd2cSJim Jagielski 
SetQueryParam(const ScQueryParam & rQueryParam)1764*b1cdbd2cSJim Jagielski void ScDatabaseRangeObj::SetQueryParam(const ScQueryParam& rQueryParam)
1765*b1cdbd2cSJim Jagielski {
1766*b1cdbd2cSJim Jagielski 	const ScDBData* pData = GetDBData_Impl();
1767*b1cdbd2cSJim Jagielski 	if (pData)
1768*b1cdbd2cSJim Jagielski 	{
1769*b1cdbd2cSJim Jagielski 		//	im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
1770*b1cdbd2cSJim Jagielski 		ScQueryParam aParam(rQueryParam);
1771*b1cdbd2cSJim Jagielski 		ScRange aDBRange;
1772*b1cdbd2cSJim Jagielski 		pData->GetArea(aDBRange);
1773*b1cdbd2cSJim Jagielski 		SCCOLROW nFieldStart = aParam.bByRow ? static_cast<SCCOLROW>(aDBRange.aStart.Col()) : static_cast<SCCOLROW>(aDBRange.aStart.Row());
1774*b1cdbd2cSJim Jagielski 
1775*b1cdbd2cSJim Jagielski         SCSIZE nCount = aParam.GetEntryCount();
1776*b1cdbd2cSJim Jagielski         for (SCSIZE i=0; i<nCount; i++)
1777*b1cdbd2cSJim Jagielski         {
1778*b1cdbd2cSJim Jagielski                ScQueryEntry& rEntry = aParam.GetEntry(i);
1779*b1cdbd2cSJim Jagielski                if (rEntry.bDoQuery)
1780*b1cdbd2cSJim Jagielski                        rEntry.nField += nFieldStart;
1781*b1cdbd2cSJim Jagielski         }
1782*b1cdbd2cSJim Jagielski 
1783*b1cdbd2cSJim Jagielski         ScDBData aNewData( *pData );
1784*b1cdbd2cSJim Jagielski 		aNewData.SetQueryParam(aParam);
1785*b1cdbd2cSJim Jagielski 		aNewData.SetHeader(aParam.bHasHeader);		// not in ScDBData::SetQueryParam
1786*b1cdbd2cSJim Jagielski 		ScDBDocFunc aFunc(*pDocShell);
1787*b1cdbd2cSJim Jagielski 		aFunc.ModifyDBData(aNewData, sal_True);
1788*b1cdbd2cSJim Jagielski 	}
1789*b1cdbd2cSJim Jagielski }
1790*b1cdbd2cSJim Jagielski 
getFilterDescriptor()1791*b1cdbd2cSJim Jagielski uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScDatabaseRangeObj::getFilterDescriptor()
1792*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1793*b1cdbd2cSJim Jagielski {
1794*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1795*b1cdbd2cSJim Jagielski 	return new ScRangeFilterDescriptor(pDocShell, this);
1796*b1cdbd2cSJim Jagielski }
1797*b1cdbd2cSJim Jagielski 
GetSubTotalParam(ScSubTotalParam & rSubTotalParam) const1798*b1cdbd2cSJim Jagielski void ScDatabaseRangeObj::GetSubTotalParam(ScSubTotalParam& rSubTotalParam) const
1799*b1cdbd2cSJim Jagielski {
1800*b1cdbd2cSJim Jagielski 	const ScDBData* pData = GetDBData_Impl();
1801*b1cdbd2cSJim Jagielski 	if (pData)
1802*b1cdbd2cSJim Jagielski 	{
1803*b1cdbd2cSJim Jagielski 		pData->GetSubTotalParam(rSubTotalParam);
1804*b1cdbd2cSJim Jagielski 
1805*b1cdbd2cSJim Jagielski 		//	im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
1806*b1cdbd2cSJim Jagielski 		ScRange aDBRange;
1807*b1cdbd2cSJim Jagielski 		pData->GetArea(aDBRange);
1808*b1cdbd2cSJim Jagielski 		SCCOL nFieldStart = aDBRange.aStart.Col();
1809*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
1810*b1cdbd2cSJim Jagielski 		{
1811*b1cdbd2cSJim Jagielski 			if ( rSubTotalParam.bGroupActive[i] )
1812*b1cdbd2cSJim Jagielski 			{
1813*b1cdbd2cSJim Jagielski 				if ( rSubTotalParam.nField[i] >= nFieldStart )
1814*b1cdbd2cSJim Jagielski                     rSubTotalParam.nField[i] = sal::static_int_cast<SCCOL>( rSubTotalParam.nField[i] - nFieldStart );
1815*b1cdbd2cSJim Jagielski 				for (SCCOL j=0; j<rSubTotalParam.nSubTotals[i]; j++)
1816*b1cdbd2cSJim Jagielski 					if ( rSubTotalParam.pSubTotals[i][j] >= nFieldStart )
1817*b1cdbd2cSJim Jagielski                         rSubTotalParam.pSubTotals[i][j] =
1818*b1cdbd2cSJim Jagielski                             sal::static_int_cast<SCCOL>( rSubTotalParam.pSubTotals[i][j] - nFieldStart );
1819*b1cdbd2cSJim Jagielski 			}
1820*b1cdbd2cSJim Jagielski 		}
1821*b1cdbd2cSJim Jagielski 	}
1822*b1cdbd2cSJim Jagielski }
1823*b1cdbd2cSJim Jagielski 
SetSubTotalParam(const ScSubTotalParam & rSubTotalParam)1824*b1cdbd2cSJim Jagielski void ScDatabaseRangeObj::SetSubTotalParam(const ScSubTotalParam& rSubTotalParam)
1825*b1cdbd2cSJim Jagielski {
1826*b1cdbd2cSJim Jagielski 	const ScDBData* pData = GetDBData_Impl();
1827*b1cdbd2cSJim Jagielski 	if (pData)
1828*b1cdbd2cSJim Jagielski 	{
1829*b1cdbd2cSJim Jagielski 		//	im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
1830*b1cdbd2cSJim Jagielski 		ScSubTotalParam aParam(rSubTotalParam);
1831*b1cdbd2cSJim Jagielski 		ScRange aDBRange;
1832*b1cdbd2cSJim Jagielski 		pData->GetArea(aDBRange);
1833*b1cdbd2cSJim Jagielski 		SCCOL nFieldStart = aDBRange.aStart.Col();
1834*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
1835*b1cdbd2cSJim Jagielski 		{
1836*b1cdbd2cSJim Jagielski 			if ( aParam.bGroupActive[i] )
1837*b1cdbd2cSJim Jagielski 			{
1838*b1cdbd2cSJim Jagielski                 aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] + nFieldStart );
1839*b1cdbd2cSJim Jagielski 				for (SCCOL j=0; j<aParam.nSubTotals[i]; j++)
1840*b1cdbd2cSJim Jagielski                     aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] + nFieldStart );
1841*b1cdbd2cSJim Jagielski 			}
1842*b1cdbd2cSJim Jagielski 		}
1843*b1cdbd2cSJim Jagielski 
1844*b1cdbd2cSJim Jagielski 		ScDBData aNewData( *pData );
1845*b1cdbd2cSJim Jagielski 		aNewData.SetSubTotalParam(aParam);
1846*b1cdbd2cSJim Jagielski 		ScDBDocFunc aFunc(*pDocShell);
1847*b1cdbd2cSJim Jagielski 		aFunc.ModifyDBData(aNewData, sal_True);
1848*b1cdbd2cSJim Jagielski 	}
1849*b1cdbd2cSJim Jagielski }
1850*b1cdbd2cSJim Jagielski 
getSubTotalDescriptor()1851*b1cdbd2cSJim Jagielski uno::Reference<sheet::XSubTotalDescriptor> SAL_CALL ScDatabaseRangeObj::getSubTotalDescriptor()
1852*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1853*b1cdbd2cSJim Jagielski {
1854*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1855*b1cdbd2cSJim Jagielski 	return new ScRangeSubTotalDescriptor(this);
1856*b1cdbd2cSJim Jagielski }
1857*b1cdbd2cSJim Jagielski 
getImportDescriptor()1858*b1cdbd2cSJim Jagielski uno::Sequence<beans::PropertyValue> SAL_CALL ScDatabaseRangeObj::getImportDescriptor()
1859*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1860*b1cdbd2cSJim Jagielski {
1861*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1862*b1cdbd2cSJim Jagielski 	ScImportParam aParam;
1863*b1cdbd2cSJim Jagielski 	const ScDBData* pData = GetDBData_Impl();
1864*b1cdbd2cSJim Jagielski 	if (pData)
1865*b1cdbd2cSJim Jagielski 		pData->GetImportParam(aParam);
1866*b1cdbd2cSJim Jagielski 
1867*b1cdbd2cSJim Jagielski 	uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() );
1868*b1cdbd2cSJim Jagielski 	ScImportDescriptor::FillProperties( aSeq, aParam );
1869*b1cdbd2cSJim Jagielski 	return aSeq;
1870*b1cdbd2cSJim Jagielski }
1871*b1cdbd2cSJim Jagielski 
1872*b1cdbd2cSJim Jagielski // XRefreshable
1873*b1cdbd2cSJim Jagielski 
refresh()1874*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangeObj::refresh() throw(uno::RuntimeException)
1875*b1cdbd2cSJim Jagielski {
1876*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1877*b1cdbd2cSJim Jagielski 	ScDBData* pData = GetDBData_Impl();
1878*b1cdbd2cSJim Jagielski 	if ( pDocShell && pData )
1879*b1cdbd2cSJim Jagielski 	{
1880*b1cdbd2cSJim Jagielski 		ScDBDocFunc aFunc(*pDocShell);
1881*b1cdbd2cSJim Jagielski 
1882*b1cdbd2cSJim Jagielski 		// Import zu wiederholen?
1883*b1cdbd2cSJim Jagielski 		sal_Bool bContinue = sal_True;
1884*b1cdbd2cSJim Jagielski 		ScImportParam aImportParam;
1885*b1cdbd2cSJim Jagielski 		pData->GetImportParam( aImportParam );
1886*b1cdbd2cSJim Jagielski 		if (aImportParam.bImport && !pData->HasImportSelection())
1887*b1cdbd2cSJim Jagielski 		{
1888*b1cdbd2cSJim Jagielski             SCTAB nTab;
1889*b1cdbd2cSJim Jagielski             SCCOL nDummyCol;
1890*b1cdbd2cSJim Jagielski             SCROW nDummyRow;
1891*b1cdbd2cSJim Jagielski             pData->GetArea( nTab, nDummyCol,nDummyRow,nDummyCol,nDummyRow );
1892*b1cdbd2cSJim Jagielski             bContinue = aFunc.DoImport( nTab, aImportParam, NULL, sal_True );   //! Api-Flag as parameter
1893*b1cdbd2cSJim Jagielski 		}
1894*b1cdbd2cSJim Jagielski 
1895*b1cdbd2cSJim Jagielski 		// interne Operationen (sort, query, subtotal) nur, wenn kein Fehler
1896*b1cdbd2cSJim Jagielski 		if (bContinue)
1897*b1cdbd2cSJim Jagielski 			aFunc.RepeatDB( pData->GetName(), sal_True, sal_True );
1898*b1cdbd2cSJim Jagielski 	}
1899*b1cdbd2cSJim Jagielski }
1900*b1cdbd2cSJim Jagielski 
addRefreshListener(const uno::Reference<util::XRefreshListener> & xListener)1901*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangeObj::addRefreshListener(
1902*b1cdbd2cSJim Jagielski 								const uno::Reference<util::XRefreshListener >& xListener )
1903*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1904*b1cdbd2cSJim Jagielski {
1905*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1906*b1cdbd2cSJim Jagielski 	uno::Reference<util::XRefreshListener>* pObj =
1907*b1cdbd2cSJim Jagielski 			new uno::Reference<util::XRefreshListener>( xListener );
1908*b1cdbd2cSJim Jagielski 	aRefreshListeners.Insert( pObj, aRefreshListeners.Count() );
1909*b1cdbd2cSJim Jagielski 
1910*b1cdbd2cSJim Jagielski 	//	hold one additional ref to keep this object alive as long as there are listeners
1911*b1cdbd2cSJim Jagielski 	if ( aRefreshListeners.Count() == 1 )
1912*b1cdbd2cSJim Jagielski 		acquire();
1913*b1cdbd2cSJim Jagielski }
1914*b1cdbd2cSJim Jagielski 
removeRefreshListener(const uno::Reference<util::XRefreshListener> & xListener)1915*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangeObj::removeRefreshListener(
1916*b1cdbd2cSJim Jagielski 								const uno::Reference<util::XRefreshListener >& xListener )
1917*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1918*b1cdbd2cSJim Jagielski {
1919*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1920*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aRefreshListeners.Count();
1921*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n=nCount; n--; )
1922*b1cdbd2cSJim Jagielski 	{
1923*b1cdbd2cSJim Jagielski 		uno::Reference<util::XRefreshListener>* pObj = aRefreshListeners[n];
1924*b1cdbd2cSJim Jagielski 		if ( *pObj == xListener )
1925*b1cdbd2cSJim Jagielski 		{
1926*b1cdbd2cSJim Jagielski 			aRefreshListeners.DeleteAndDestroy( n );
1927*b1cdbd2cSJim Jagielski 			if ( aRefreshListeners.Count() == 0 )
1928*b1cdbd2cSJim Jagielski 				release();							// release ref for listeners
1929*b1cdbd2cSJim Jagielski 			break;
1930*b1cdbd2cSJim Jagielski 		}
1931*b1cdbd2cSJim Jagielski 	}
1932*b1cdbd2cSJim Jagielski }
1933*b1cdbd2cSJim Jagielski 
Refreshed_Impl()1934*b1cdbd2cSJim Jagielski void ScDatabaseRangeObj::Refreshed_Impl()
1935*b1cdbd2cSJim Jagielski {
1936*b1cdbd2cSJim Jagielski 	lang::EventObject aEvent;
1937*b1cdbd2cSJim Jagielski 	aEvent.Source = (cppu::OWeakObject*)this;
1938*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n=0; n<aRefreshListeners.Count(); n++ )
1939*b1cdbd2cSJim Jagielski 		(*aRefreshListeners[n])->refreshed( aEvent );
1940*b1cdbd2cSJim Jagielski }
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski // XCellRangeSource
1943*b1cdbd2cSJim Jagielski 
getReferredCells()1944*b1cdbd2cSJim Jagielski uno::Reference<table::XCellRange> SAL_CALL ScDatabaseRangeObj::getReferredCells()
1945*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
1946*b1cdbd2cSJim Jagielski {
1947*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1948*b1cdbd2cSJim Jagielski 	ScRange aRange;
1949*b1cdbd2cSJim Jagielski 	ScDBData* pData = GetDBData_Impl();
1950*b1cdbd2cSJim Jagielski 	if ( pData )
1951*b1cdbd2cSJim Jagielski 	{
1952*b1cdbd2cSJim Jagielski 		//!	static Funktion um ScCellObj/ScCellRangeObj zu erzeugen am ScCellRangeObj ???
1953*b1cdbd2cSJim Jagielski 
1954*b1cdbd2cSJim Jagielski 		pData->GetArea(aRange);
1955*b1cdbd2cSJim Jagielski 		if ( aRange.aStart == aRange.aEnd )
1956*b1cdbd2cSJim Jagielski 			return new ScCellObj( pDocShell, aRange.aStart );
1957*b1cdbd2cSJim Jagielski 		else
1958*b1cdbd2cSJim Jagielski 			return new ScCellRangeObj( pDocShell, aRange );
1959*b1cdbd2cSJim Jagielski 	}
1960*b1cdbd2cSJim Jagielski 	return NULL;
1961*b1cdbd2cSJim Jagielski }
1962*b1cdbd2cSJim Jagielski 
1963*b1cdbd2cSJim Jagielski // XPropertySet
1964*b1cdbd2cSJim Jagielski 
getPropertySetInfo()1965*b1cdbd2cSJim Jagielski uno::Reference<beans::XPropertySetInfo> SAL_CALL ScDatabaseRangeObj::getPropertySetInfo()
1966*b1cdbd2cSJim Jagielski 														throw(uno::RuntimeException)
1967*b1cdbd2cSJim Jagielski {
1968*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1969*b1cdbd2cSJim Jagielski 	static uno::Reference<beans::XPropertySetInfo> aRef(
1970*b1cdbd2cSJim Jagielski 		new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
1971*b1cdbd2cSJim Jagielski 	return aRef;
1972*b1cdbd2cSJim Jagielski }
1973*b1cdbd2cSJim Jagielski 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any & aValue)1974*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangeObj::setPropertyValue(
1975*b1cdbd2cSJim Jagielski 						const rtl::OUString& aPropertyName, const uno::Any& aValue )
1976*b1cdbd2cSJim Jagielski 				throw(beans::UnknownPropertyException, beans::PropertyVetoException,
1977*b1cdbd2cSJim Jagielski 						lang::IllegalArgumentException, lang::WrappedTargetException,
1978*b1cdbd2cSJim Jagielski 						uno::RuntimeException)
1979*b1cdbd2cSJim Jagielski {
1980*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
1981*b1cdbd2cSJim Jagielski 	ScDBData* pData = GetDBData_Impl();
1982*b1cdbd2cSJim Jagielski 	if ( pDocShell && pData )
1983*b1cdbd2cSJim Jagielski 	{
1984*b1cdbd2cSJim Jagielski 		ScDBData aNewData( *pData );
1985*b1cdbd2cSJim Jagielski 		sal_Bool bDo = sal_True;
1986*b1cdbd2cSJim Jagielski 
1987*b1cdbd2cSJim Jagielski 		String aString(aPropertyName);
1988*b1cdbd2cSJim Jagielski 		if ( aString.EqualsAscii( SC_UNONAME_KEEPFORM ) )
1989*b1cdbd2cSJim Jagielski 			aNewData.SetKeepFmt( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1990*b1cdbd2cSJim Jagielski 		else if ( aString.EqualsAscii( SC_UNONAME_MOVCELLS ) )
1991*b1cdbd2cSJim Jagielski 			aNewData.SetDoSize( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1992*b1cdbd2cSJim Jagielski 		else if ( aString.EqualsAscii( SC_UNONAME_STRIPDAT ) )
1993*b1cdbd2cSJim Jagielski 			aNewData.SetStripData( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1994*b1cdbd2cSJim Jagielski 	    else if (aString.EqualsAscii( SC_UNONAME_AUTOFLT ))
1995*b1cdbd2cSJim Jagielski         {
1996*b1cdbd2cSJim Jagielski 		    sal_Bool bAutoFilter(ScUnoHelpFunctions::GetBoolFromAny( aValue ));
1997*b1cdbd2cSJim Jagielski 	        aNewData.SetAutoFilter(bAutoFilter);
1998*b1cdbd2cSJim Jagielski             ScRange aRange;
1999*b1cdbd2cSJim Jagielski             aNewData.GetArea(aRange);
2000*b1cdbd2cSJim Jagielski             ScDocument* pDoc = pDocShell->GetDocument();
2001*b1cdbd2cSJim Jagielski 	        if (bAutoFilter && pDoc)
2002*b1cdbd2cSJim Jagielski 		        pDoc->ApplyFlagsTab( aRange.aStart.Col(), aRange.aStart.Row(),
2003*b1cdbd2cSJim Jagielski 								     aRange.aEnd.Col(), aRange.aStart.Row(),
2004*b1cdbd2cSJim Jagielski 								     aRange.aStart.Tab(), SC_MF_AUTO );
2005*b1cdbd2cSJim Jagielski             else  if (!bAutoFilter && pDoc)
2006*b1cdbd2cSJim Jagielski                 pDoc->RemoveFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(),
2007*b1cdbd2cSJim Jagielski 								     aRange.aEnd.Col(), aRange.aStart.Row(),
2008*b1cdbd2cSJim Jagielski 								     aRange.aStart.Tab(), SC_MF_AUTO );
2009*b1cdbd2cSJim Jagielski             ScRange aPaintRange(aRange.aStart, aRange.aEnd);
2010*b1cdbd2cSJim Jagielski             aPaintRange.aEnd.SetRow(aPaintRange.aStart.Row());
2011*b1cdbd2cSJim Jagielski             pDocShell->PostPaint(aPaintRange, PAINT_GRID);
2012*b1cdbd2cSJim Jagielski         }
2013*b1cdbd2cSJim Jagielski 	    else if (aString.EqualsAscii( SC_UNONAME_USEFLTCRT ))
2014*b1cdbd2cSJim Jagielski         {
2015*b1cdbd2cSJim Jagielski 		    if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
2016*b1cdbd2cSJim Jagielski             {
2017*b1cdbd2cSJim Jagielski                 ScRange aRange;
2018*b1cdbd2cSJim Jagielski                 aNewData.GetAdvancedQuerySource(aRange);
2019*b1cdbd2cSJim Jagielski                 aNewData.SetAdvancedQuerySource(&aRange);
2020*b1cdbd2cSJim Jagielski             }
2021*b1cdbd2cSJim Jagielski             else
2022*b1cdbd2cSJim Jagielski                 aNewData.SetAdvancedQuerySource(NULL);
2023*b1cdbd2cSJim Jagielski         }
2024*b1cdbd2cSJim Jagielski 	    else if (aString.EqualsAscii( SC_UNONAME_FLTCRT ))
2025*b1cdbd2cSJim Jagielski         {
2026*b1cdbd2cSJim Jagielski             table::CellRangeAddress aRange;
2027*b1cdbd2cSJim Jagielski             if (aValue >>= aRange)
2028*b1cdbd2cSJim Jagielski             {
2029*b1cdbd2cSJim Jagielski                 ScRange aCoreRange;
2030*b1cdbd2cSJim Jagielski                 ScUnoConversion::FillScRange(aCoreRange, aRange);
2031*b1cdbd2cSJim Jagielski 
2032*b1cdbd2cSJim Jagielski                 aNewData.SetAdvancedQuerySource(&aCoreRange);
2033*b1cdbd2cSJim Jagielski             }
2034*b1cdbd2cSJim Jagielski         }
2035*b1cdbd2cSJim Jagielski         else if (aString.EqualsAscii( SC_UNONAME_FROMSELECT ))
2036*b1cdbd2cSJim Jagielski         {
2037*b1cdbd2cSJim Jagielski             aNewData.SetImportSelection(::cppu::any2bool(aValue));
2038*b1cdbd2cSJim Jagielski         }
2039*b1cdbd2cSJim Jagielski 		else if (aString.EqualsAscii( SC_UNONAME_REFPERIOD ))
2040*b1cdbd2cSJim Jagielski 		{
2041*b1cdbd2cSJim Jagielski 		    sal_Int32 nRefresh = 0;
2042*b1cdbd2cSJim Jagielski 		    if (aValue >>= nRefresh)
2043*b1cdbd2cSJim Jagielski 		    {
2044*b1cdbd2cSJim Jagielski                 ScDocument* pDoc = pDocShell->GetDocument();
2045*b1cdbd2cSJim Jagielski 		        aNewData.SetRefreshDelay(nRefresh);
2046*b1cdbd2cSJim Jagielski                 if (pDoc && pDoc->GetDBCollection())
2047*b1cdbd2cSJim Jagielski                 {
2048*b1cdbd2cSJim Jagielski 				    aNewData.SetRefreshHandler( pDoc->GetDBCollection()->GetRefreshHandler() );
2049*b1cdbd2cSJim Jagielski 			        aNewData.SetRefreshControl( pDoc->GetRefreshTimerControlAddress() );
2050*b1cdbd2cSJim Jagielski                 }
2051*b1cdbd2cSJim Jagielski             }
2052*b1cdbd2cSJim Jagielski 		}
2053*b1cdbd2cSJim Jagielski         else if (aString.EqualsAscii( SC_UNONAME_CONRES ))
2054*b1cdbd2cSJim Jagielski         {
2055*b1cdbd2cSJim Jagielski         }
2056*b1cdbd2cSJim Jagielski 		else
2057*b1cdbd2cSJim Jagielski 			bDo = sal_False;
2058*b1cdbd2cSJim Jagielski 
2059*b1cdbd2cSJim Jagielski 		if (bDo)
2060*b1cdbd2cSJim Jagielski 		{
2061*b1cdbd2cSJim Jagielski 			ScDBDocFunc aFunc(*pDocShell);
2062*b1cdbd2cSJim Jagielski 			aFunc.ModifyDBData(aNewData, sal_True);
2063*b1cdbd2cSJim Jagielski 		}
2064*b1cdbd2cSJim Jagielski 	}
2065*b1cdbd2cSJim Jagielski }
2066*b1cdbd2cSJim Jagielski 
getPropertyValue(const rtl::OUString & aPropertyName)2067*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScDatabaseRangeObj::getPropertyValue( const rtl::OUString& aPropertyName )
2068*b1cdbd2cSJim Jagielski 				throw(beans::UnknownPropertyException, lang::WrappedTargetException,
2069*b1cdbd2cSJim Jagielski 						uno::RuntimeException)
2070*b1cdbd2cSJim Jagielski {
2071*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2072*b1cdbd2cSJim Jagielski 	uno::Any aRet;
2073*b1cdbd2cSJim Jagielski 	ScDBData* pData = GetDBData_Impl();
2074*b1cdbd2cSJim Jagielski 	if ( pData )
2075*b1cdbd2cSJim Jagielski 	{
2076*b1cdbd2cSJim Jagielski 		String aString(aPropertyName);
2077*b1cdbd2cSJim Jagielski 		if ( aString.EqualsAscii( SC_UNONAME_KEEPFORM ) )
2078*b1cdbd2cSJim Jagielski 			ScUnoHelpFunctions::SetBoolInAny( aRet, pData->IsKeepFmt() );
2079*b1cdbd2cSJim Jagielski 		else if ( aString.EqualsAscii( SC_UNONAME_MOVCELLS ) )
2080*b1cdbd2cSJim Jagielski 			ScUnoHelpFunctions::SetBoolInAny( aRet, pData->IsDoSize() );
2081*b1cdbd2cSJim Jagielski 		else if ( aString.EqualsAscii( SC_UNONAME_STRIPDAT ) )
2082*b1cdbd2cSJim Jagielski 			ScUnoHelpFunctions::SetBoolInAny( aRet, pData->IsStripData() );
2083*b1cdbd2cSJim Jagielski 		else if ( aString.EqualsAscii( SC_UNONAME_ISUSER ) )
2084*b1cdbd2cSJim Jagielski 		{
2085*b1cdbd2cSJim Jagielski 			//	all database ranges except "unnamed" are user defined
2086*b1cdbd2cSJim Jagielski 			ScUnoHelpFunctions::SetBoolInAny( aRet,
2087*b1cdbd2cSJim Jagielski 						( pData->GetName() != ScGlobal::GetRscString(STR_DB_NONAME) ) );
2088*b1cdbd2cSJim Jagielski 		}
2089*b1cdbd2cSJim Jagielski 		else if ( aString.EqualsAscii( SC_UNO_LINKDISPBIT ) )
2090*b1cdbd2cSJim Jagielski 		{
2091*b1cdbd2cSJim Jagielski 			//	no target bitmaps for individual entries (would be all equal)
2092*b1cdbd2cSJim Jagielski 			// ScLinkTargetTypeObj::SetLinkTargetBitmap( aRet, SC_LINKTARGETTYPE_DBAREA );
2093*b1cdbd2cSJim Jagielski 		}
2094*b1cdbd2cSJim Jagielski 		else if ( aString.EqualsAscii( SC_UNO_LINKDISPNAME ) )
2095*b1cdbd2cSJim Jagielski 			aRet <<= rtl::OUString( aName );
2096*b1cdbd2cSJim Jagielski 	    else if (aString.EqualsAscii( SC_UNONAME_AUTOFLT ))
2097*b1cdbd2cSJim Jagielski         {
2098*b1cdbd2cSJim Jagielski             sal_Bool bAutoFilter(GetDBData_Impl()->HasAutoFilter());
2099*b1cdbd2cSJim Jagielski 
2100*b1cdbd2cSJim Jagielski 		    ScUnoHelpFunctions::SetBoolInAny( aRet, bAutoFilter );
2101*b1cdbd2cSJim Jagielski         }
2102*b1cdbd2cSJim Jagielski 	    else if (aString.EqualsAscii( SC_UNONAME_USEFLTCRT ))
2103*b1cdbd2cSJim Jagielski         {
2104*b1cdbd2cSJim Jagielski             ScRange aRange;
2105*b1cdbd2cSJim Jagielski             sal_Bool bIsAdvancedSource(GetDBData_Impl()->GetAdvancedQuerySource(aRange));
2106*b1cdbd2cSJim Jagielski 
2107*b1cdbd2cSJim Jagielski 		    ScUnoHelpFunctions::SetBoolInAny( aRet, bIsAdvancedSource );
2108*b1cdbd2cSJim Jagielski         }
2109*b1cdbd2cSJim Jagielski 	    else if (aString.EqualsAscii( SC_UNONAME_FLTCRT ))
2110*b1cdbd2cSJim Jagielski         {
2111*b1cdbd2cSJim Jagielski             table::CellRangeAddress aRange;
2112*b1cdbd2cSJim Jagielski             ScRange aCoreRange;
2113*b1cdbd2cSJim Jagielski             if (GetDBData_Impl()->GetAdvancedQuerySource(aCoreRange))
2114*b1cdbd2cSJim Jagielski                 ScUnoConversion::FillApiRange(aRange, aCoreRange);
2115*b1cdbd2cSJim Jagielski 
2116*b1cdbd2cSJim Jagielski             aRet <<= aRange;
2117*b1cdbd2cSJim Jagielski         }
2118*b1cdbd2cSJim Jagielski         else if (aString.EqualsAscii( SC_UNONAME_FROMSELECT ))
2119*b1cdbd2cSJim Jagielski         {
2120*b1cdbd2cSJim Jagielski 		    ScUnoHelpFunctions::SetBoolInAny( aRet, GetDBData_Impl()->HasImportSelection() );
2121*b1cdbd2cSJim Jagielski         }
2122*b1cdbd2cSJim Jagielski 		else if (aString.EqualsAscii( SC_UNONAME_REFPERIOD ))
2123*b1cdbd2cSJim Jagielski 		{
2124*b1cdbd2cSJim Jagielski 		    sal_Int32 nRefresh(GetDBData_Impl()->GetRefreshDelay());
2125*b1cdbd2cSJim Jagielski 		    aRet <<= nRefresh;
2126*b1cdbd2cSJim Jagielski 		}
2127*b1cdbd2cSJim Jagielski         else if (aString.EqualsAscii( SC_UNONAME_CONRES ))
2128*b1cdbd2cSJim Jagielski         {
2129*b1cdbd2cSJim Jagielski         }
2130*b1cdbd2cSJim Jagielski         else if (aString.EqualsAscii( SC_UNONAME_TOKENINDEX ))
2131*b1cdbd2cSJim Jagielski         {
2132*b1cdbd2cSJim Jagielski             // get index for use in formula tokens (read-only)
2133*b1cdbd2cSJim Jagielski             aRet <<= static_cast<sal_Int32>(GetDBData_Impl()->GetIndex());
2134*b1cdbd2cSJim Jagielski         }
2135*b1cdbd2cSJim Jagielski 	}
2136*b1cdbd2cSJim Jagielski 	return aRet;
2137*b1cdbd2cSJim Jagielski }
2138*b1cdbd2cSJim Jagielski 
SC_IMPL_DUMMY_PROPERTY_LISTENER(ScDatabaseRangeObj)2139*b1cdbd2cSJim Jagielski SC_IMPL_DUMMY_PROPERTY_LISTENER( ScDatabaseRangeObj )
2140*b1cdbd2cSJim Jagielski 
2141*b1cdbd2cSJim Jagielski // XServiceInfo
2142*b1cdbd2cSJim Jagielski 
2143*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL ScDatabaseRangeObj::getImplementationName() throw(uno::RuntimeException)
2144*b1cdbd2cSJim Jagielski {
2145*b1cdbd2cSJim Jagielski 	return rtl::OUString::createFromAscii( "ScDatabaseRangeObj" );
2146*b1cdbd2cSJim Jagielski }
2147*b1cdbd2cSJim Jagielski 
supportsService(const rtl::OUString & rServiceName)2148*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScDatabaseRangeObj::supportsService( const rtl::OUString& rServiceName )
2149*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
2150*b1cdbd2cSJim Jagielski {
2151*b1cdbd2cSJim Jagielski 	String aServiceStr( rServiceName );
2152*b1cdbd2cSJim Jagielski 	return aServiceStr.EqualsAscii( SCDATABASERANGEOBJ_SERVICE ) ||
2153*b1cdbd2cSJim Jagielski 		   aServiceStr.EqualsAscii( SCLINKTARGET_SERVICE );
2154*b1cdbd2cSJim Jagielski }
2155*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()2156*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString> SAL_CALL ScDatabaseRangeObj::getSupportedServiceNames()
2157*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
2158*b1cdbd2cSJim Jagielski {
2159*b1cdbd2cSJim Jagielski 	uno::Sequence<rtl::OUString> aRet(2);
2160*b1cdbd2cSJim Jagielski 	rtl::OUString* pArray = aRet.getArray();
2161*b1cdbd2cSJim Jagielski 	pArray[0] = rtl::OUString::createFromAscii( SCDATABASERANGEOBJ_SERVICE );
2162*b1cdbd2cSJim Jagielski 	pArray[1] = rtl::OUString::createFromAscii( SCLINKTARGET_SERVICE );
2163*b1cdbd2cSJim Jagielski 	return aRet;
2164*b1cdbd2cSJim Jagielski }
2165*b1cdbd2cSJim Jagielski 
2166*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
2167*b1cdbd2cSJim Jagielski 
ScDatabaseRangesObj(ScDocShell * pDocSh)2168*b1cdbd2cSJim Jagielski ScDatabaseRangesObj::ScDatabaseRangesObj(ScDocShell* pDocSh) :
2169*b1cdbd2cSJim Jagielski 	pDocShell( pDocSh )
2170*b1cdbd2cSJim Jagielski {
2171*b1cdbd2cSJim Jagielski 	pDocShell->GetDocument()->AddUnoObject(*this);
2172*b1cdbd2cSJim Jagielski }
2173*b1cdbd2cSJim Jagielski 
~ScDatabaseRangesObj()2174*b1cdbd2cSJim Jagielski ScDatabaseRangesObj::~ScDatabaseRangesObj()
2175*b1cdbd2cSJim Jagielski {
2176*b1cdbd2cSJim Jagielski 	if (pDocShell)
2177*b1cdbd2cSJim Jagielski 		pDocShell->GetDocument()->RemoveUnoObject(*this);
2178*b1cdbd2cSJim Jagielski }
2179*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster &,const SfxHint & rHint)2180*b1cdbd2cSJim Jagielski void ScDatabaseRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
2181*b1cdbd2cSJim Jagielski {
2182*b1cdbd2cSJim Jagielski 	//	Referenz-Update interessiert hier nicht
2183*b1cdbd2cSJim Jagielski 
2184*b1cdbd2cSJim Jagielski 	if ( rHint.ISA( SfxSimpleHint ) &&
2185*b1cdbd2cSJim Jagielski 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
2186*b1cdbd2cSJim Jagielski 	{
2187*b1cdbd2cSJim Jagielski 		pDocShell = NULL;		// ungueltig geworden
2188*b1cdbd2cSJim Jagielski 	}
2189*b1cdbd2cSJim Jagielski }
2190*b1cdbd2cSJim Jagielski 
2191*b1cdbd2cSJim Jagielski // XDatabaseRanges
2192*b1cdbd2cSJim Jagielski 
GetObjectByIndex_Impl(sal_uInt16 nIndex)2193*b1cdbd2cSJim Jagielski ScDatabaseRangeObj* ScDatabaseRangesObj::GetObjectByIndex_Impl(sal_uInt16 nIndex)
2194*b1cdbd2cSJim Jagielski {
2195*b1cdbd2cSJim Jagielski 	if (pDocShell)
2196*b1cdbd2cSJim Jagielski 	{
2197*b1cdbd2cSJim Jagielski 		ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
2198*b1cdbd2cSJim Jagielski 		if (pNames && nIndex < pNames->GetCount())
2199*b1cdbd2cSJim Jagielski 			return new ScDatabaseRangeObj( pDocShell, (*pNames)[nIndex]->GetName() );
2200*b1cdbd2cSJim Jagielski 	}
2201*b1cdbd2cSJim Jagielski 	return NULL;
2202*b1cdbd2cSJim Jagielski }
2203*b1cdbd2cSJim Jagielski 
GetObjectByName_Impl(const rtl::OUString & aName)2204*b1cdbd2cSJim Jagielski ScDatabaseRangeObj* ScDatabaseRangesObj::GetObjectByName_Impl(const rtl::OUString& aName)
2205*b1cdbd2cSJim Jagielski {
2206*b1cdbd2cSJim Jagielski 	if ( pDocShell && hasByName(aName) )
2207*b1cdbd2cSJim Jagielski 	{
2208*b1cdbd2cSJim Jagielski 		String aString(aName);
2209*b1cdbd2cSJim Jagielski 		return new ScDatabaseRangeObj( pDocShell, aString );
2210*b1cdbd2cSJim Jagielski 	}
2211*b1cdbd2cSJim Jagielski 	return NULL;
2212*b1cdbd2cSJim Jagielski }
2213*b1cdbd2cSJim Jagielski 
2214*b1cdbd2cSJim Jagielski 
addNewByName(const rtl::OUString & aName,const table::CellRangeAddress & aRange)2215*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangesObj::addNewByName( const rtl::OUString& aName,
2216*b1cdbd2cSJim Jagielski 										const table::CellRangeAddress& aRange )
2217*b1cdbd2cSJim Jagielski 										throw(uno::RuntimeException)
2218*b1cdbd2cSJim Jagielski {
2219*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2220*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
2221*b1cdbd2cSJim Jagielski 	if (pDocShell)
2222*b1cdbd2cSJim Jagielski 	{
2223*b1cdbd2cSJim Jagielski 		ScDBDocFunc aFunc(*pDocShell);
2224*b1cdbd2cSJim Jagielski 
2225*b1cdbd2cSJim Jagielski 		String aString(aName);
2226*b1cdbd2cSJim Jagielski 		ScRange aNameRange( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet,
2227*b1cdbd2cSJim Jagielski 							(SCCOL)aRange.EndColumn,   (SCROW)aRange.EndRow,   aRange.Sheet );
2228*b1cdbd2cSJim Jagielski 		bDone = aFunc.AddDBRange( aString, aNameRange, sal_True );
2229*b1cdbd2cSJim Jagielski 	}
2230*b1cdbd2cSJim Jagielski 	if (!bDone)
2231*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();		// no other exceptions specified
2232*b1cdbd2cSJim Jagielski }
2233*b1cdbd2cSJim Jagielski 
removeByName(const rtl::OUString & aName)2234*b1cdbd2cSJim Jagielski void SAL_CALL ScDatabaseRangesObj::removeByName( const rtl::OUString& aName )
2235*b1cdbd2cSJim Jagielski 										throw(uno::RuntimeException)
2236*b1cdbd2cSJim Jagielski {
2237*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2238*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
2239*b1cdbd2cSJim Jagielski 	if (pDocShell)
2240*b1cdbd2cSJim Jagielski 	{
2241*b1cdbd2cSJim Jagielski 		ScDBDocFunc aFunc(*pDocShell);
2242*b1cdbd2cSJim Jagielski 		String aString(aName);
2243*b1cdbd2cSJim Jagielski 		bDone = aFunc.DeleteDBRange( aString, sal_True );
2244*b1cdbd2cSJim Jagielski 	}
2245*b1cdbd2cSJim Jagielski 	if (!bDone)
2246*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();		// no other exceptions specified
2247*b1cdbd2cSJim Jagielski }
2248*b1cdbd2cSJim Jagielski 
2249*b1cdbd2cSJim Jagielski // XEnumerationAccess
2250*b1cdbd2cSJim Jagielski 
createEnumeration()2251*b1cdbd2cSJim Jagielski uno::Reference<container::XEnumeration> SAL_CALL ScDatabaseRangesObj::createEnumeration()
2252*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
2253*b1cdbd2cSJim Jagielski {
2254*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2255*b1cdbd2cSJim Jagielski     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DatabaseRangesEnumeration")));
2256*b1cdbd2cSJim Jagielski }
2257*b1cdbd2cSJim Jagielski 
2258*b1cdbd2cSJim Jagielski // XIndexAccess
2259*b1cdbd2cSJim Jagielski 
getCount()2260*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScDatabaseRangesObj::getCount() throw(uno::RuntimeException)
2261*b1cdbd2cSJim Jagielski {
2262*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2263*b1cdbd2cSJim Jagielski 
2264*b1cdbd2cSJim Jagielski 	//!	"unbenannt" weglassen ?
2265*b1cdbd2cSJim Jagielski 
2266*b1cdbd2cSJim Jagielski 	if (pDocShell)
2267*b1cdbd2cSJim Jagielski 	{
2268*b1cdbd2cSJim Jagielski 		ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
2269*b1cdbd2cSJim Jagielski 		if (pNames)
2270*b1cdbd2cSJim Jagielski 			return pNames->GetCount();
2271*b1cdbd2cSJim Jagielski 	}
2272*b1cdbd2cSJim Jagielski 	return 0;
2273*b1cdbd2cSJim Jagielski }
2274*b1cdbd2cSJim Jagielski 
getByIndex(sal_Int32 nIndex)2275*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScDatabaseRangesObj::getByIndex( sal_Int32 nIndex )
2276*b1cdbd2cSJim Jagielski 							throw(lang::IndexOutOfBoundsException,
2277*b1cdbd2cSJim Jagielski 									lang::WrappedTargetException, uno::RuntimeException)
2278*b1cdbd2cSJim Jagielski {
2279*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2280*b1cdbd2cSJim Jagielski 	uno::Reference<sheet::XDatabaseRange> xRange(GetObjectByIndex_Impl((sal_uInt16)nIndex));
2281*b1cdbd2cSJim Jagielski 	if (xRange.is())
2282*b1cdbd2cSJim Jagielski         return uno::makeAny(xRange);
2283*b1cdbd2cSJim Jagielski 	else
2284*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
2285*b1cdbd2cSJim Jagielski //    return uno::Any();
2286*b1cdbd2cSJim Jagielski }
2287*b1cdbd2cSJim Jagielski 
getElementType()2288*b1cdbd2cSJim Jagielski uno::Type SAL_CALL ScDatabaseRangesObj::getElementType() throw(uno::RuntimeException)
2289*b1cdbd2cSJim Jagielski {
2290*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2291*b1cdbd2cSJim Jagielski 	return getCppuType((uno::Reference<sheet::XDatabaseRange>*)0);
2292*b1cdbd2cSJim Jagielski }
2293*b1cdbd2cSJim Jagielski 
hasElements()2294*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScDatabaseRangesObj::hasElements() throw(uno::RuntimeException)
2295*b1cdbd2cSJim Jagielski {
2296*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2297*b1cdbd2cSJim Jagielski 	return ( getCount() != 0 );
2298*b1cdbd2cSJim Jagielski }
2299*b1cdbd2cSJim Jagielski 
2300*b1cdbd2cSJim Jagielski // XNameAccess
2301*b1cdbd2cSJim Jagielski 
getByName(const rtl::OUString & aName)2302*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScDatabaseRangesObj::getByName( const rtl::OUString& aName )
2303*b1cdbd2cSJim Jagielski 			throw(container::NoSuchElementException,
2304*b1cdbd2cSJim Jagielski 					lang::WrappedTargetException, uno::RuntimeException)
2305*b1cdbd2cSJim Jagielski {
2306*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2307*b1cdbd2cSJim Jagielski 	uno::Reference<sheet::XDatabaseRange> xRange(GetObjectByName_Impl(aName));
2308*b1cdbd2cSJim Jagielski 	if (xRange.is())
2309*b1cdbd2cSJim Jagielski         return uno::makeAny(xRange);
2310*b1cdbd2cSJim Jagielski 	else
2311*b1cdbd2cSJim Jagielski 		throw container::NoSuchElementException();
2312*b1cdbd2cSJim Jagielski //    return uno::Any();
2313*b1cdbd2cSJim Jagielski }
2314*b1cdbd2cSJim Jagielski 
getElementNames()2315*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString> SAL_CALL ScDatabaseRangesObj::getElementNames()
2316*b1cdbd2cSJim Jagielski 												throw(uno::RuntimeException)
2317*b1cdbd2cSJim Jagielski {
2318*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2319*b1cdbd2cSJim Jagielski 
2320*b1cdbd2cSJim Jagielski 	//!	"unbenannt" weglassen ?
2321*b1cdbd2cSJim Jagielski 
2322*b1cdbd2cSJim Jagielski 	if (pDocShell)
2323*b1cdbd2cSJim Jagielski 	{
2324*b1cdbd2cSJim Jagielski 		ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
2325*b1cdbd2cSJim Jagielski 		if (pNames)
2326*b1cdbd2cSJim Jagielski 		{
2327*b1cdbd2cSJim Jagielski 			sal_uInt16 nCount = pNames->GetCount();
2328*b1cdbd2cSJim Jagielski 			String aName;
2329*b1cdbd2cSJim Jagielski 			uno::Sequence<rtl::OUString> aSeq(nCount);
2330*b1cdbd2cSJim Jagielski 			rtl::OUString* pAry = aSeq.getArray();
2331*b1cdbd2cSJim Jagielski 			for (sal_uInt16 i=0; i<nCount; i++)
2332*b1cdbd2cSJim Jagielski 				pAry[i] = (*pNames)[i]->GetName();
2333*b1cdbd2cSJim Jagielski 
2334*b1cdbd2cSJim Jagielski 			return aSeq;
2335*b1cdbd2cSJim Jagielski 		}
2336*b1cdbd2cSJim Jagielski 	}
2337*b1cdbd2cSJim Jagielski 	return uno::Sequence<rtl::OUString>(0);
2338*b1cdbd2cSJim Jagielski }
2339*b1cdbd2cSJim Jagielski 
hasByName(const rtl::OUString & aName)2340*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScDatabaseRangesObj::hasByName( const rtl::OUString& aName )
2341*b1cdbd2cSJim Jagielski 										throw(uno::RuntimeException)
2342*b1cdbd2cSJim Jagielski {
2343*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
2344*b1cdbd2cSJim Jagielski 
2345*b1cdbd2cSJim Jagielski 	//!	"unbenannt" weglassen ?
2346*b1cdbd2cSJim Jagielski 
2347*b1cdbd2cSJim Jagielski 	if (pDocShell)
2348*b1cdbd2cSJim Jagielski 	{
2349*b1cdbd2cSJim Jagielski 		ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
2350*b1cdbd2cSJim Jagielski 		if (pNames)
2351*b1cdbd2cSJim Jagielski 		{
2352*b1cdbd2cSJim Jagielski 			String aString(aName);
2353*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = 0;
2354*b1cdbd2cSJim Jagielski 			if (pNames->SearchName( aString, nPos ))
2355*b1cdbd2cSJim Jagielski 				return sal_True;
2356*b1cdbd2cSJim Jagielski 		}
2357*b1cdbd2cSJim Jagielski 	}
2358*b1cdbd2cSJim Jagielski 	return sal_False;
2359*b1cdbd2cSJim Jagielski }
2360*b1cdbd2cSJim Jagielski 
2361*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
2362*b1cdbd2cSJim Jagielski 
2363*b1cdbd2cSJim Jagielski 
2364*b1cdbd2cSJim Jagielski 
2365*b1cdbd2cSJim Jagielski 
2366*b1cdbd2cSJim Jagielski 
2367