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