summaryrefslogtreecommitdiff
path: root/sc/source/core/data/dpsave.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core/data/dpsave.cxx')
-rw-r--r--sc/source/core/data/dpsave.cxx1473
1 files changed, 1473 insertions, 0 deletions
diff --git a/sc/source/core/data/dpsave.cxx b/sc/source/core/data/dpsave.cxx
new file mode 100644
index 000000000000..72cf15285310
--- /dev/null
+++ b/sc/source/core/data/dpsave.cxx
@@ -0,0 +1,1473 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+
+
+// INCLUDE ---------------------------------------------------------------
+
+#include "dpsave.hxx"
+#include "dpdimsave.hxx"
+#include "miscuno.hxx"
+#include "scerrors.hxx"
+#include "unonames.hxx"
+#include "global.hxx"
+
+#include <tools/debug.hxx>
+
+#include <com/sun/star/sheet/GeneralFunction.hpp>
+#include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
+#include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
+#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
+#include <com/sun/star/sheet/DataPilotFieldReference.hpp>
+#include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
+#include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
+#include <com/sun/star/sheet/TableFilterField.hpp>
+#include <com/sun/star/sheet/XHierarchiesSupplier.hpp>
+#include <com/sun/star/sheet/XLevelsSupplier.hpp>
+#include <com/sun/star/sheet/XMembersSupplier.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+// Wang Xu Ming -- 2009-8-17
+// DataPilot Migration - Cache&&Performance
+#include "dptabsrc.hxx"
+#include "dpglobal.hxx"
+using namespace ScDPGlobal;
+#ifndef _COM_SUN_STAR_SHEET_DATAPILOTFIELDREFERENCETYPE_HPP_
+#include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SHEET_DATAPILOTFIELDREFERENCEITEMTYPE_HPP_
+#include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp>
+#endif
+using namespace com::sun::star::sheet;
+// End Comments
+
+#include <hash_map>
+
+using namespace com::sun::star;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Any;
+using ::rtl::OUString;
+using ::rtl::OUStringHash;
+using ::std::hash_map;
+using ::std::auto_ptr;
+
+// -----------------------------------------------------------------------
+
+#define SC_DPSAVEMODE_NO 0
+#define SC_DPSAVEMODE_YES 1
+#define SC_DPSAVEMODE_DONTKNOW 2
+
+// -----------------------------------------------------------------------
+
+void lcl_SetBoolProperty( const uno::Reference<beans::XPropertySet>& xProp,
+ const rtl::OUString& rName, sal_Bool bValue )
+{
+ //! move to ScUnoHelpFunctions?
+
+ xProp->setPropertyValue( rName, uno::Any( &bValue, getBooleanCppuType() ) );
+}
+
+// -----------------------------------------------------------------------
+
+ScDPSaveMember::ScDPSaveMember(const String& rName) :
+ aName( rName ),
+ mpLayoutName(NULL),
+ nVisibleMode( SC_DPSAVEMODE_DONTKNOW ),
+ nShowDetailsMode( SC_DPSAVEMODE_DONTKNOW )
+{
+}
+
+ScDPSaveMember::ScDPSaveMember(const ScDPSaveMember& r) :
+ aName( r.aName ),
+ mpLayoutName(NULL),
+ nVisibleMode( r.nVisibleMode ),
+ nShowDetailsMode( r.nShowDetailsMode )
+{
+ if (r.mpLayoutName.get())
+ mpLayoutName.reset(new OUString(*r.mpLayoutName));
+}
+
+ScDPSaveMember::~ScDPSaveMember()
+{
+}
+
+BOOL ScDPSaveMember::operator== ( const ScDPSaveMember& r ) const
+{
+ if ( aName != r.aName ||
+ nVisibleMode != r.nVisibleMode ||
+ nShowDetailsMode != r.nShowDetailsMode )
+ return FALSE;
+
+ return TRUE;
+}
+
+BOOL ScDPSaveMember::HasIsVisible() const
+{
+ return nVisibleMode != SC_DPSAVEMODE_DONTKNOW;
+}
+
+void ScDPSaveMember::SetIsVisible(BOOL bSet)
+{
+ nVisibleMode = bSet;
+}
+
+BOOL ScDPSaveMember::HasShowDetails() const
+{
+ return nShowDetailsMode != SC_DPSAVEMODE_DONTKNOW;
+}
+
+void ScDPSaveMember::SetShowDetails(BOOL bSet)
+{
+ nShowDetailsMode = bSet;
+}
+
+void ScDPSaveMember::SetName( const String& rNew )
+{
+ // Used only if the source member was renamed (groups).
+ // For UI renaming of members, a layout name must be used.
+
+ aName = rNew;
+}
+
+void ScDPSaveMember::SetLayoutName( const OUString& rName )
+{
+ mpLayoutName.reset(new OUString(rName));
+}
+
+const OUString* ScDPSaveMember::GetLayoutName() const
+{
+ return mpLayoutName.get();
+}
+
+void ScDPSaveMember::RemoveLayoutName()
+{
+ mpLayoutName.reset(NULL);
+}
+
+void ScDPSaveMember::WriteToSource( const uno::Reference<uno::XInterface>& xMember, sal_Int32 nPosition )
+{
+ uno::Reference<beans::XPropertySet> xMembProp( xMember, uno::UNO_QUERY );
+ DBG_ASSERT( xMembProp.is(), "no properties at member" );
+ if ( xMembProp.is() )
+ {
+ // exceptions are caught at ScDPSaveData::WriteToSource
+
+ if ( nVisibleMode != SC_DPSAVEMODE_DONTKNOW )
+ lcl_SetBoolProperty( xMembProp,
+ rtl::OUString::createFromAscii(DP_PROP_ISVISIBLE), (BOOL)nVisibleMode );
+
+ if ( nShowDetailsMode != SC_DPSAVEMODE_DONTKNOW )
+ lcl_SetBoolProperty( xMembProp,
+ rtl::OUString::createFromAscii(DP_PROP_SHOWDETAILS), (BOOL)nShowDetailsMode );
+
+ if (mpLayoutName.get())
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xMembProp, SC_UNO_LAYOUTNAME, *mpLayoutName);
+
+ if ( nPosition >= 0 )
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xMembProp, DP_PROP_POSITION, nPosition);
+ }
+}
+
+// -----------------------------------------------------------------------
+
+ScDPSaveDimension::ScDPSaveDimension(const String& rName, BOOL bDataLayout) :
+ aName( rName ),
+ pSelectedPage( NULL ),
+ mpLayoutName(NULL),
+ mpSubtotalName(NULL),
+ bIsDataLayout( bDataLayout ),
+ bDupFlag( FALSE ),
+ nOrientation( sheet::DataPilotFieldOrientation_HIDDEN ),
+ nFunction( sheet::GeneralFunction_AUTO ),
+ nUsedHierarchy( -1 ),
+ nShowEmptyMode( SC_DPSAVEMODE_DONTKNOW ),
+ bSubTotalDefault( TRUE ),
+ nSubTotalCount( 0 ),
+ pSubTotalFuncs( NULL ),
+ pReferenceValue( NULL ),
+ pSortInfo( NULL ),
+ pAutoShowInfo( NULL ),
+ pLayoutInfo( NULL )
+{
+}
+
+ScDPSaveDimension::ScDPSaveDimension(const ScDPSaveDimension& r) :
+ aName( r.aName ),
+ mpLayoutName(NULL),
+ mpSubtotalName(NULL),
+ bIsDataLayout( r.bIsDataLayout ),
+ bDupFlag( r.bDupFlag ),
+ nOrientation( r.nOrientation ),
+ nFunction( r.nFunction ),
+ nUsedHierarchy( r.nUsedHierarchy ),
+ nShowEmptyMode( r.nShowEmptyMode ),
+ bSubTotalDefault( r.bSubTotalDefault ),
+ nSubTotalCount( r.nSubTotalCount ),
+ pSubTotalFuncs( NULL )
+{
+ if ( nSubTotalCount && r.pSubTotalFuncs )
+ {
+ pSubTotalFuncs = new USHORT[nSubTotalCount];
+ for (long nSub=0; nSub<nSubTotalCount; nSub++)
+ pSubTotalFuncs[nSub] = r.pSubTotalFuncs[nSub];
+ }
+
+ for (MemberList::const_iterator i=r.maMemberList.begin(); i != r.maMemberList.end() ; i++)
+ {
+ const String& rName = (*i)->GetName();
+ ScDPSaveMember* pNew = new ScDPSaveMember( **i );
+ maMemberHash[rName] = pNew;
+ maMemberList.push_back( pNew );
+ }
+ if (r.pReferenceValue)
+ pReferenceValue = new sheet::DataPilotFieldReference( *(r.pReferenceValue) );
+ else
+ pReferenceValue = NULL;
+ if (r.pSortInfo)
+ pSortInfo = new sheet::DataPilotFieldSortInfo( *(r.pSortInfo) );
+ else
+ pSortInfo = NULL;
+ if (r.pAutoShowInfo)
+ pAutoShowInfo = new sheet::DataPilotFieldAutoShowInfo( *(r.pAutoShowInfo) );
+ else
+ pAutoShowInfo = NULL;
+ if (r.pLayoutInfo)
+ pLayoutInfo = new sheet::DataPilotFieldLayoutInfo( *(r.pLayoutInfo) );
+ else
+ pLayoutInfo = NULL;
+ if (r.pSelectedPage)
+ pSelectedPage = new String( *(r.pSelectedPage) );
+ else
+ pSelectedPage = NULL;
+ if (r.mpLayoutName.get())
+ mpLayoutName.reset(new OUString(*r.mpLayoutName));
+ if (r.mpSubtotalName.get())
+ mpSubtotalName.reset(new OUString(*r.mpSubtotalName));
+}
+
+ScDPSaveDimension::~ScDPSaveDimension()
+{
+ for (MemberHash::const_iterator i=maMemberHash.begin(); i != maMemberHash.end() ; i++)
+ delete i->second;
+ delete pReferenceValue;
+ delete pSortInfo;
+ delete pAutoShowInfo;
+ delete pLayoutInfo;
+ delete pSelectedPage;
+ delete [] pSubTotalFuncs;
+}
+
+BOOL ScDPSaveDimension::operator== ( const ScDPSaveDimension& r ) const
+{
+ if ( aName != r.aName ||
+ bIsDataLayout != r.bIsDataLayout ||
+ bDupFlag != r.bDupFlag ||
+ nOrientation != r.nOrientation ||
+ nFunction != r.nFunction ||
+ nUsedHierarchy != r.nUsedHierarchy ||
+ nShowEmptyMode != r.nShowEmptyMode ||
+ bSubTotalDefault != r.bSubTotalDefault ||
+ nSubTotalCount != r.nSubTotalCount )
+ return FALSE;
+
+ if ( nSubTotalCount && ( !pSubTotalFuncs || !r.pSubTotalFuncs ) ) // should not happen
+ return FALSE;
+
+ long i;
+ for (i=0; i<nSubTotalCount; i++)
+ if ( pSubTotalFuncs[i] != r.pSubTotalFuncs[i] )
+ return FALSE;
+
+ if (maMemberHash.size() != r.maMemberHash.size() )
+ return FALSE;
+
+ MemberList::const_iterator a=maMemberList.begin();
+ MemberList::const_iterator b=r.maMemberList.begin();
+ for (; a != maMemberList.end() ; ++a, ++b)
+ if (!(**a == **b))
+ return FALSE;
+
+ if ( this->HasCurrentPage() && r.HasCurrentPage() )
+ {
+ if ( this->GetCurrentPage() != r.GetCurrentPage() )
+ {
+ return FALSE;
+ }
+ }
+ else if ( this->HasCurrentPage() || r.HasCurrentPage() )
+ {
+ return FALSE;
+ }
+ if( pReferenceValue && r.pReferenceValue )
+ {
+ if ( !(*pReferenceValue == *r.pReferenceValue) )
+ {
+ return FALSE;
+ }
+ }
+ else if ( pReferenceValue || r.pReferenceValue )
+ {
+ return FALSE;
+ }
+ if( this->pSortInfo && r.pSortInfo )
+ {
+ if ( !(*this->pSortInfo == *r.pSortInfo) )
+ {
+ return FALSE;
+ }
+ }
+ else if ( this->pSortInfo || r.pSortInfo )
+ {
+ return FALSE;
+ }
+ if( this->pAutoShowInfo && r.pAutoShowInfo )
+ {
+ if ( !(*this->pAutoShowInfo == *r.pAutoShowInfo) )
+ {
+ return FALSE;
+ }
+ }
+ else if ( this->pAutoShowInfo || r.pAutoShowInfo )
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void ScDPSaveDimension::AddMember(ScDPSaveMember* pMember)
+{
+ const String & rName = pMember->GetName();
+ MemberHash::iterator aExisting = maMemberHash.find( rName );
+ if ( aExisting == maMemberHash.end() )
+ {
+ std::pair< const String, ScDPSaveMember *> key( rName, pMember );
+ maMemberHash.insert ( key );
+ }
+ else
+ {
+ maMemberList.remove( aExisting->second );
+ delete aExisting->second;
+ aExisting->second = pMember;
+ }
+ maMemberList.push_back( pMember );
+}
+
+void ScDPSaveDimension::SetName( const String& rNew )
+{
+ // Used only if the source dim was renamed (groups).
+ // For UI renaming of dimensions, the layout name must be used.
+
+ aName = rNew;
+}
+
+void ScDPSaveDimension::SetOrientation(USHORT nNew)
+{
+ nOrientation = nNew;
+}
+
+void ScDPSaveDimension::SetSubTotals(long nCount, const USHORT* pFuncs)
+{
+ if (pSubTotalFuncs)
+ delete [] pSubTotalFuncs;
+ nSubTotalCount = nCount;
+ if ( nCount && pFuncs )
+ {
+ pSubTotalFuncs = new USHORT[nCount];
+ for (long i=0; i<nCount; i++)
+ pSubTotalFuncs[i] = pFuncs[i];
+ }
+ else
+ pSubTotalFuncs = NULL;
+
+ bSubTotalDefault = FALSE;
+}
+
+void ScDPSaveDimension::SetShowEmpty(BOOL bSet)
+{
+ nShowEmptyMode = bSet;
+}
+
+void ScDPSaveDimension::SetFunction(USHORT nNew)
+{
+ nFunction = nNew;
+}
+
+void ScDPSaveDimension::SetUsedHierarchy(long nNew)
+{
+ nUsedHierarchy = nNew;
+}
+
+void ScDPSaveDimension::SetSubtotalName(const OUString& rName)
+{
+ mpSubtotalName.reset(new OUString(rName));
+}
+
+const OUString* ScDPSaveDimension::GetSubtotalName() const
+{
+ return mpSubtotalName.get();
+}
+
+bool ScDPSaveDimension::IsMemberNameInUse(const OUString& rName) const
+{
+ MemberList::const_iterator itr = maMemberList.begin(), itrEnd = maMemberList.end();
+ for (; itr != itrEnd; ++itr)
+ {
+ const ScDPSaveMember* pMem = *itr;
+ if (rName.equalsIgnoreAsciiCase(pMem->GetName()))
+ return true;
+
+ const OUString* pLayoutName = pMem->GetLayoutName();
+ if (pLayoutName && rName.equalsIgnoreAsciiCase(*pLayoutName))
+ return true;
+ }
+ return false;
+}
+
+void ScDPSaveDimension::SetLayoutName(const OUString& rName)
+{
+ mpLayoutName.reset(new OUString(rName));
+}
+
+const OUString* ScDPSaveDimension::GetLayoutName() const
+{
+ return mpLayoutName.get();
+}
+
+void ScDPSaveDimension::RemoveLayoutName()
+{
+ mpLayoutName.reset(NULL);
+}
+
+void ScDPSaveDimension::SetReferenceValue(const sheet::DataPilotFieldReference* pNew)
+{
+ delete pReferenceValue;
+ if (pNew)
+ pReferenceValue = new sheet::DataPilotFieldReference(*pNew);
+ else
+ pReferenceValue = NULL;
+}
+
+void ScDPSaveDimension::SetSortInfo(const sheet::DataPilotFieldSortInfo* pNew)
+{
+ delete pSortInfo;
+ if (pNew)
+ pSortInfo = new sheet::DataPilotFieldSortInfo(*pNew);
+ else
+ pSortInfo = NULL;
+}
+
+void ScDPSaveDimension::SetAutoShowInfo(const sheet::DataPilotFieldAutoShowInfo* pNew)
+{
+ delete pAutoShowInfo;
+ if (pNew)
+ pAutoShowInfo = new sheet::DataPilotFieldAutoShowInfo(*pNew);
+ else
+ pAutoShowInfo = NULL;
+}
+
+void ScDPSaveDimension::SetLayoutInfo(const sheet::DataPilotFieldLayoutInfo* pNew)
+{
+ delete pLayoutInfo;
+ if (pNew)
+ pLayoutInfo = new sheet::DataPilotFieldLayoutInfo(*pNew);
+ else
+ pLayoutInfo = NULL;
+}
+
+void ScDPSaveDimension::SetCurrentPage( const String* pPage )
+{
+ delete pSelectedPage;
+ if (pPage)
+ pSelectedPage = new String( *pPage );
+ else
+ pSelectedPage = NULL;
+}
+
+BOOL ScDPSaveDimension::HasCurrentPage() const
+{
+ return ( pSelectedPage != NULL );
+}
+
+const String& ScDPSaveDimension::GetCurrentPage() const
+{
+ if (pSelectedPage)
+ return *pSelectedPage;
+ return EMPTY_STRING;
+}
+
+ScDPSaveMember* ScDPSaveDimension::GetExistingMemberByName(const String& rName)
+{
+ MemberHash::const_iterator res = maMemberHash.find (rName);
+ if (res != maMemberHash.end())
+ return res->second;
+ return NULL;
+}
+
+
+ScDPSaveMember* ScDPSaveDimension::GetMemberByName(const String& rName)
+{
+ MemberHash::const_iterator res = maMemberHash.find (rName);
+ if (res != maMemberHash.end())
+ return res->second;
+
+ ScDPSaveMember* pNew = new ScDPSaveMember( rName );
+ maMemberHash[rName] = pNew;
+ maMemberList.push_back( pNew );
+ return pNew;
+}
+
+void ScDPSaveDimension::SetMemberPosition( const String& rName, sal_Int32 nNewPos )
+{
+ ScDPSaveMember* pMember = GetMemberByName( rName ); // make sure it exists and is in the hash
+
+ maMemberList.remove( pMember );
+
+ MemberList::iterator aIter = maMemberList.begin();
+ for (sal_Int32 i=0; i<nNewPos && aIter != maMemberList.end(); i++)
+ ++aIter;
+ maMemberList.insert( aIter, pMember );
+}
+
+void ScDPSaveDimension::WriteToSource( const uno::Reference<uno::XInterface>& xDim )
+{
+ uno::Reference<beans::XPropertySet> xDimProp( xDim, uno::UNO_QUERY );
+ DBG_ASSERT( xDimProp.is(), "no properties at dimension" );
+ if ( xDimProp.is() )
+ {
+ // exceptions are caught at ScDPSaveData::WriteToSource
+ uno::Any aAny;
+
+ sheet::DataPilotFieldOrientation eOrient = (sheet::DataPilotFieldOrientation)nOrientation;
+ aAny <<= eOrient;
+ xDimProp->setPropertyValue( rtl::OUString::createFromAscii(DP_PROP_ORIENTATION), aAny );
+
+ sheet::GeneralFunction eFunc = (sheet::GeneralFunction)nFunction;
+ aAny <<= eFunc;
+ xDimProp->setPropertyValue( rtl::OUString::createFromAscii(DP_PROP_FUNCTION), aAny );
+
+ if ( nUsedHierarchy >= 0 )
+ {
+ aAny <<= (INT32)nUsedHierarchy;
+ xDimProp->setPropertyValue( rtl::OUString::createFromAscii(DP_PROP_USEDHIERARCHY), aAny );
+ }
+
+ if ( pReferenceValue )
+ {
+ aAny <<= *pReferenceValue;
+ xDimProp->setPropertyValue( rtl::OUString::createFromAscii(SC_UNO_REFVALUE), aAny );
+ }
+
+ uno::Sequence<sheet::TableFilterField> aFilter;
+ // set the selected page field only if the dimension is used as page dimension
+ if ( pSelectedPage && nOrientation == sheet::DataPilotFieldOrientation_PAGE )
+ {
+ // single filter field: first field equal to selected string
+ sheet::TableFilterField aField( sheet::FilterConnection_AND, 0,
+ sheet::FilterOperator_EQUAL, sal_False, 0.0, *pSelectedPage );
+ aFilter = uno::Sequence<sheet::TableFilterField>( &aField, 1 );
+ }
+ // else keep empty sequence
+
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xDimProp, DP_PROP_FILTER, aFilter);
+ if (mpLayoutName.get())
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xDimProp, SC_UNO_LAYOUTNAME, *mpLayoutName);
+
+ const OUString* pSubTotalName = GetSubtotalName();
+ if (pSubTotalName)
+ // Custom subtotal name, with '?' being replaced by the visible field name later.
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xDimProp, SC_UNO_FIELD_SUBTOTALNAME, *pSubTotalName);
+ }
+
+ // Level loop outside of maMemberList loop
+ // because SubTotals have to be set independently of known members
+
+ long nCount = maMemberHash.size();
+
+ long nHierCount = 0;
+ uno::Reference<container::XIndexAccess> xHiers;
+ uno::Reference<sheet::XHierarchiesSupplier> xHierSupp( xDim, uno::UNO_QUERY );
+ if ( xHierSupp.is() )
+ {
+ uno::Reference<container::XNameAccess> xHiersName = xHierSupp->getHierarchies();
+ xHiers = new ScNameToIndexAccess( xHiersName );
+ nHierCount = xHiers->getCount();
+ }
+
+ sal_Bool bHasHiddenMember = false;
+
+ for (long nHier=0; nHier<nHierCount; nHier++)
+ {
+ uno::Reference<uno::XInterface> xHierarchy = ScUnoHelpFunctions::AnyToInterface( xHiers->getByIndex(nHier) );
+
+ long nLevCount = 0;
+ uno::Reference<container::XIndexAccess> xLevels;
+ uno::Reference<sheet::XLevelsSupplier> xLevSupp( xHierarchy, uno::UNO_QUERY );
+ if ( xLevSupp.is() )
+ {
+ uno::Reference<container::XNameAccess> xLevelsName = xLevSupp->getLevels();
+ xLevels = new ScNameToIndexAccess( xLevelsName );
+ nLevCount = xLevels->getCount();
+ }
+
+ for (long nLev=0; nLev<nLevCount; nLev++)
+ {
+ uno::Reference<uno::XInterface> xLevel = ScUnoHelpFunctions::AnyToInterface( xLevels->getByIndex(nLev) );
+ uno::Reference<beans::XPropertySet> xLevProp( xLevel, uno::UNO_QUERY );
+ DBG_ASSERT( xLevProp.is(), "no properties at level" );
+ if ( xLevProp.is() )
+ {
+ uno::Any aAny;
+ if ( !bSubTotalDefault )
+ {
+ if ( !pSubTotalFuncs )
+ nSubTotalCount = 0;
+
+ uno::Sequence<sheet::GeneralFunction> aSeq(nSubTotalCount);
+ sheet::GeneralFunction* pArray = aSeq.getArray();
+ for (long i=0; i<nSubTotalCount; i++)
+ pArray[i] = (sheet::GeneralFunction)pSubTotalFuncs[i];
+ aAny <<= aSeq;
+ xLevProp->setPropertyValue( rtl::OUString::createFromAscii(DP_PROP_SUBTOTALS), aAny );
+ }
+ if ( nShowEmptyMode != SC_DPSAVEMODE_DONTKNOW )
+ lcl_SetBoolProperty( xLevProp,
+ rtl::OUString::createFromAscii(DP_PROP_SHOWEMPTY), (BOOL)nShowEmptyMode );
+
+ if ( pSortInfo )
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xLevProp, SC_UNO_SORTING, *pSortInfo);
+
+ if ( pAutoShowInfo )
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xLevProp, SC_UNO_AUTOSHOW, *pAutoShowInfo);
+
+ if ( pLayoutInfo )
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xLevProp, SC_UNO_LAYOUT, *pLayoutInfo);
+
+ // exceptions are caught at ScDPSaveData::WriteToSource
+ }
+
+ if ( nCount > 0 )
+ {
+ uno::Reference<sheet::XMembersSupplier> xMembSupp( xLevel, uno::UNO_QUERY );
+ if ( xMembSupp.is() )
+ {
+ uno::Reference<container::XNameAccess> xMembers = xMembSupp->getMembers();
+ if ( xMembers.is() )
+ {
+ sal_Int32 nPosition = -1; // set position only in manual mode
+ if ( !pSortInfo || pSortInfo->Mode == sheet::DataPilotFieldSortMode::MANUAL )
+ nPosition = 0;
+
+ for (MemberList::const_iterator i=maMemberList.begin(); i != maMemberList.end() ; i++)
+ {
+ ScDPSaveMember* pMember = *i;
+ if (!pMember->GetIsVisible())
+ bHasHiddenMember = true;
+ rtl::OUString aMemberName = pMember->GetName();
+ if ( xMembers->hasByName( aMemberName ) )
+ {
+ uno::Reference<uno::XInterface> xMemberInt = ScUnoHelpFunctions::AnyToInterface(
+ xMembers->getByName( aMemberName ) );
+ pMember->WriteToSource( xMemberInt, nPosition );
+
+ if ( nPosition >= 0 )
+ ++nPosition; // increase if initialized
+ }
+ // missing member is no error
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (xDimProp.is())
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xDimProp, SC_UNO_HAS_HIDDEN_MEMBER, bHasHiddenMember);
+}
+
+void ScDPSaveDimension::UpdateMemberVisibility(const hash_map<OUString, bool, OUStringHash>& rData)
+{
+ typedef hash_map<OUString, bool, OUStringHash> DataMap;
+ MemberList::iterator itrMem = maMemberList.begin(), itrMemEnd = maMemberList.end();
+ for (; itrMem != itrMemEnd; ++itrMem)
+ {
+ ScDPSaveMember* pMem = *itrMem;
+ const String& rMemName = pMem->GetName();
+ DataMap::const_iterator itr = rData.find(rMemName);
+ if (itr != rData.end())
+ pMem->SetIsVisible(itr->second);
+ }
+}
+
+bool ScDPSaveDimension::HasInvisibleMember() const
+{
+ MemberList::const_iterator itrMem = maMemberList.begin(), itrMemEnd = maMemberList.end();
+ for (; itrMem != itrMemEnd; ++itrMem)
+ {
+ const ScDPSaveMember* pMem = *itrMem;
+ if (!pMem->GetIsVisible())
+ return true;
+ }
+ return false;
+}
+
+// -----------------------------------------------------------------------
+
+ScDPSaveData::ScDPSaveData() :
+ pDimensionData( NULL ),
+ nColumnGrandMode( SC_DPSAVEMODE_DONTKNOW ),
+ nRowGrandMode( SC_DPSAVEMODE_DONTKNOW ),
+ nIgnoreEmptyMode( SC_DPSAVEMODE_DONTKNOW ),
+ nRepeatEmptyMode( SC_DPSAVEMODE_DONTKNOW ),
+ bFilterButton( TRUE ),
+ bDrillDown( TRUE ),
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ mnCacheId( -1),
+ // End Comments
+ mbDimensionMembersBuilt(false),
+ mpGrandTotalName(NULL)
+{
+}
+
+ScDPSaveData::ScDPSaveData(const ScDPSaveData& r) :
+ nColumnGrandMode( r.nColumnGrandMode ),
+ nRowGrandMode( r.nRowGrandMode ),
+ nIgnoreEmptyMode( r.nIgnoreEmptyMode ),
+ nRepeatEmptyMode( r.nRepeatEmptyMode ),
+ bFilterButton( r.bFilterButton ),
+ bDrillDown( r.bDrillDown ),
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ mnCacheId( r.mnCacheId ),
+ // End Comments
+ mbDimensionMembersBuilt(r.mbDimensionMembersBuilt),
+ mpGrandTotalName(NULL)
+{
+ if ( r.pDimensionData )
+ pDimensionData = new ScDPDimensionSaveData( *r.pDimensionData );
+ else
+ pDimensionData = NULL;
+
+ long nCount = r.aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pNew = new ScDPSaveDimension( *(ScDPSaveDimension*)r.aDimList.GetObject(i) );
+ aDimList.Insert( pNew, LIST_APPEND );
+ }
+
+ if (r.mpGrandTotalName.get())
+ mpGrandTotalName.reset(new OUString(*r.mpGrandTotalName));
+}
+
+ScDPSaveData& ScDPSaveData::operator= ( const ScDPSaveData& r )
+{
+ if ( &r != this )
+ {
+ // Wang Xu Ming -- 2009-8-17
+ // DataPilot Migration - Cache&&Performance
+ this->~ScDPSaveData();
+ new( this ) ScDPSaveData ( r );
+ // End Comments
+ }
+ return *this;
+}
+
+BOOL ScDPSaveData::operator== ( const ScDPSaveData& r ) const
+{
+ if ( nColumnGrandMode != r.nColumnGrandMode ||
+ nRowGrandMode != r.nRowGrandMode ||
+ nIgnoreEmptyMode != r.nIgnoreEmptyMode ||
+ nRepeatEmptyMode != r.nRepeatEmptyMode ||
+ bFilterButton != r.bFilterButton ||
+ mnCacheId != r.mnCacheId ||/// Wang Xu Ming -- 2009-6-18 DataPilot Migration
+ bDrillDown != r.bDrillDown ||
+ mbDimensionMembersBuilt != r.mbDimensionMembersBuilt)
+ return FALSE;
+
+ if ( pDimensionData || r.pDimensionData )
+ if ( !pDimensionData || !r.pDimensionData || !( *pDimensionData == *r.pDimensionData ) )
+ return FALSE;
+
+ ULONG nCount = aDimList.Count();
+ if ( nCount != r.aDimList.Count() )
+ return FALSE;
+
+ for (ULONG i=0; i<nCount; i++)
+ if ( !( *(ScDPSaveDimension*)aDimList.GetObject(i) ==
+ *(ScDPSaveDimension*)r.aDimList.GetObject(i) ) )
+ return FALSE;
+
+ if (mpGrandTotalName.get())
+ {
+ if (!r.mpGrandTotalName.get())
+ return false;
+ if (!mpGrandTotalName->equals(*r.mpGrandTotalName))
+ return false;
+ }
+ else if (r.mpGrandTotalName.get())
+ return false;
+
+ return TRUE;
+}
+
+ScDPSaveData::~ScDPSaveData()
+{
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ delete (ScDPSaveDimension*)aDimList.GetObject(i);
+ aDimList.Clear();
+
+ delete pDimensionData;
+}
+
+void ScDPSaveData::SetGrandTotalName(const OUString& rName)
+{
+ mpGrandTotalName.reset(new OUString(rName));
+}
+
+const OUString* ScDPSaveData::GetGrandTotalName() const
+{
+ return mpGrandTotalName.get();
+}
+
+ScDPSaveDimension* ScDPSaveData::GetDimensionByName(const String& rName)
+{
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+ if ( pDim->GetName() == rName && !pDim->IsDataLayout() )
+ return pDim;
+ }
+ ScDPSaveDimension* pNew = new ScDPSaveDimension( rName, FALSE );
+ aDimList.Insert( pNew, LIST_APPEND );
+ return pNew;
+}
+
+ScDPSaveDimension* ScDPSaveData::GetExistingDimensionByName(const String& rName) const
+{
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+ if ( pDim->GetName() == rName && !pDim->IsDataLayout() )
+ return pDim;
+ }
+ return NULL; // don't create new
+}
+
+ScDPSaveDimension* ScDPSaveData::GetNewDimensionByName(const String& rName)
+{
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+ if ( pDim->GetName() == rName && !pDim->IsDataLayout() )
+ return DuplicateDimension(rName);
+ }
+ ScDPSaveDimension* pNew = new ScDPSaveDimension( rName, FALSE );
+ aDimList.Insert( pNew, LIST_APPEND );
+ return pNew;
+}
+
+ScDPSaveDimension* ScDPSaveData::GetDataLayoutDimension()
+{
+ ScDPSaveDimension* pDim = GetExistingDataLayoutDimension();
+ if (pDim)
+ return pDim;
+
+ ScDPSaveDimension* pNew = new ScDPSaveDimension( String(), TRUE );
+ aDimList.Insert( pNew, LIST_APPEND );
+ return pNew;
+}
+
+ScDPSaveDimension* ScDPSaveData::GetExistingDataLayoutDimension() const
+{
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+ if ( pDim->IsDataLayout() )
+ return pDim;
+ }
+ return NULL;
+}
+
+ScDPSaveDimension* ScDPSaveData::DuplicateDimension(const String& rName)
+{
+ // always insert new
+ //! check if dimension is there?
+
+ ScDPSaveDimension* pOld = GetDimensionByName( rName );
+ ScDPSaveDimension* pNew = new ScDPSaveDimension( *pOld );
+ pNew->SetDupFlag( TRUE );
+ aDimList.Insert( pNew, LIST_APPEND );
+ return pNew;
+}
+
+void ScDPSaveData::RemoveDimensionByName(const String& rName)
+{
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+ if ( pDim->GetName() == rName && !pDim->IsDataLayout() )
+ {
+ delete pDim;
+ aDimList.Remove(i);
+ break;
+ }
+ }
+}
+
+ScDPSaveDimension& ScDPSaveData::DuplicateDimension( const ScDPSaveDimension& rDim )
+{
+ ScDPSaveDimension* pNew = new ScDPSaveDimension( rDim );
+ pNew->SetDupFlag( TRUE );
+ aDimList.Insert( pNew, LIST_APPEND );
+ return *pNew;
+}
+
+ScDPSaveDimension* ScDPSaveData::GetInnermostDimension(USHORT nOrientation)
+{
+ // return the innermost dimension for the given orientation,
+ // excluding data layout dimension
+
+ ScDPSaveDimension* pInner = NULL;
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = static_cast<ScDPSaveDimension*>(aDimList.GetObject(i));
+ if ( pDim->GetOrientation() == nOrientation && !pDim->IsDataLayout() )
+ pInner = pDim;
+ }
+ return pInner; // the last matching one
+}
+
+ScDPSaveDimension* ScDPSaveData::GetFirstDimension(sheet::DataPilotFieldOrientation eOrientation)
+{
+ long nCount = aDimList.Count();
+ for (long i = 0; i < nCount; ++i)
+ {
+ ScDPSaveDimension* pDim = static_cast<ScDPSaveDimension*>(aDimList.GetObject(i));
+ if (pDim->GetOrientation() == eOrientation && !pDim->IsDataLayout())
+ return pDim;
+ }
+ return NULL;
+}
+
+long ScDPSaveData::GetDataDimensionCount() const
+{
+ long nDataCount = 0;
+
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ const ScDPSaveDimension* pDim = static_cast<const ScDPSaveDimension*>(aDimList.GetObject(i));
+ if ( pDim->GetOrientation() == sheet::DataPilotFieldOrientation_DATA )
+ ++nDataCount;
+ }
+
+ return nDataCount;
+}
+
+void ScDPSaveData::SetPosition( ScDPSaveDimension* pDim, long nNew )
+{
+ // position (nNew) is counted within dimensions of the same orientation
+
+ USHORT nOrient = pDim->GetOrientation();
+
+ aDimList.Remove( pDim );
+ ULONG nCount = aDimList.Count(); // after remove
+
+ ULONG nInsPos = 0;
+ while ( nNew > 0 && nInsPos < nCount )
+ {
+ if ( ((ScDPSaveDimension*)aDimList.GetObject(nInsPos))->GetOrientation() == nOrient )
+ --nNew;
+ ++nInsPos;
+ }
+
+ aDimList.Insert( pDim, nInsPos );
+}
+
+void ScDPSaveData::SetColumnGrand(BOOL bSet)
+{
+ nColumnGrandMode = bSet;
+}
+
+void ScDPSaveData::SetRowGrand(BOOL bSet)
+{
+ nRowGrandMode = bSet;
+}
+
+void ScDPSaveData::SetIgnoreEmptyRows(BOOL bSet)
+{
+ nIgnoreEmptyMode = bSet;
+}
+
+void ScDPSaveData::SetRepeatIfEmpty(BOOL bSet)
+{
+ nRepeatEmptyMode = bSet;
+}
+
+void ScDPSaveData::SetFilterButton(BOOL bSet)
+{
+ bFilterButton = bSet;
+}
+
+void ScDPSaveData::SetDrillDown(BOOL bSet)
+{
+ bDrillDown = bSet;
+}
+
+void lcl_ResetOrient( const uno::Reference<sheet::XDimensionsSupplier>& xSource )
+{
+ sheet::DataPilotFieldOrientation eOrient = sheet::DataPilotFieldOrientation_HIDDEN;
+
+ uno::Reference<container::XNameAccess> xDimsName = xSource->getDimensions();
+ uno::Reference<container::XIndexAccess> xIntDims = new ScNameToIndexAccess( xDimsName );
+ long nIntCount = xIntDims->getCount();
+ for (long nIntDim=0; nIntDim<nIntCount; nIntDim++)
+ {
+ uno::Reference<uno::XInterface> xIntDim = ScUnoHelpFunctions::AnyToInterface( xIntDims->getByIndex(nIntDim) );
+ uno::Reference<beans::XPropertySet> xDimProp( xIntDim, uno::UNO_QUERY );
+ if (xDimProp.is())
+ {
+ uno::Any aAny;
+ aAny <<= eOrient;
+ xDimProp->setPropertyValue( rtl::OUString::createFromAscii(DP_PROP_ORIENTATION), aAny );
+ }
+ }
+}
+
+void ScDPSaveData::WriteToSource( const uno::Reference<sheet::XDimensionsSupplier>& xSource )
+{
+ if (!xSource.is())
+ return;
+
+ // source options must be first!
+
+ uno::Reference<beans::XPropertySet> xSourceProp( xSource, uno::UNO_QUERY );
+ DBG_ASSERT( xSourceProp.is(), "no properties at source" );
+ if ( xSourceProp.is() )
+ {
+ // source options are not available for external sources
+ //! use XPropertySetInfo to test for availability?
+
+ try
+ {
+ if ( nIgnoreEmptyMode != SC_DPSAVEMODE_DONTKNOW )
+ lcl_SetBoolProperty( xSourceProp,
+ rtl::OUString::createFromAscii(DP_PROP_IGNOREEMPTY), (BOOL)nIgnoreEmptyMode );
+ if ( nRepeatEmptyMode != SC_DPSAVEMODE_DONTKNOW )
+ lcl_SetBoolProperty( xSourceProp,
+ rtl::OUString::createFromAscii(DP_PROP_REPEATIFEMPTY), (BOOL)nRepeatEmptyMode );
+ }
+ catch(uno::Exception&)
+ {
+ // no error
+ }
+
+ const OUString* pGrandTotalName = GetGrandTotalName();
+ if (pGrandTotalName)
+ ScUnoHelpFunctions::SetOptionalPropertyValue(xSourceProp, SC_UNO_GRANDTOTAL_NAME, *pGrandTotalName);
+ }
+
+ // exceptions in the other calls are errors
+ try
+ {
+ // reset all orientations
+ //! "forgetSettings" or similar at source ?????
+ //! reset all duplicated dimensions, or reuse them below !!!
+ DBG_TRACE( "ScDPSaveData::WriteToSource" );
+
+ lcl_ResetOrient( xSource );
+
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+ rtl::OUString aName = pDim->GetName();
+
+ DBG_TRACESTR(pDim->GetName());
+
+ BOOL bData = pDim->IsDataLayout();
+
+ //! getByName for ScDPSource, including DataLayoutDimension !!!!!!!!
+
+ uno::Reference<container::XNameAccess> xDimsName = xSource->getDimensions();
+ uno::Reference<container::XIndexAccess> xIntDims = new ScNameToIndexAccess( xDimsName );
+ long nIntCount = xIntDims->getCount();
+ BOOL bFound = FALSE;
+ for (long nIntDim=0; nIntDim<nIntCount && !bFound; nIntDim++)
+ {
+ uno::Reference<uno::XInterface> xIntDim = ScUnoHelpFunctions::AnyToInterface( xIntDims->getByIndex(nIntDim) );
+ if ( bData )
+ {
+ uno::Reference<beans::XPropertySet> xDimProp( xIntDim, uno::UNO_QUERY );
+ if ( xDimProp.is() )
+ {
+ bFound = ScUnoHelpFunctions::GetBoolProperty( xDimProp,
+ rtl::OUString::createFromAscii(DP_PROP_ISDATALAYOUT) );
+ //! error checking -- is "IsDataLayoutDimension" property required??
+ }
+ }
+ else
+ {
+ uno::Reference<container::XNamed> xDimName( xIntDim, uno::UNO_QUERY );
+ if ( xDimName.is() && xDimName->getName() == aName )
+ bFound = TRUE;
+ }
+
+ if ( bFound )
+ {
+ if ( pDim->GetDupFlag() )
+ {
+ String aNewName = pDim->GetName();
+
+ // different name for each duplication of a (real) dimension...
+ for (long j=0; j<=i; j++) //! Test !!!!!!
+ aNewName += '*'; //! modify name at creation of SaveDimension
+
+ uno::Reference<util::XCloneable> xCloneable( xIntDim, uno::UNO_QUERY );
+ DBG_ASSERT( xCloneable.is(), "cannot clone dimension" );
+ if (xCloneable.is())
+ {
+ uno::Reference<util::XCloneable> xNew = xCloneable->createClone();
+ uno::Reference<container::XNamed> xNewName( xNew, uno::UNO_QUERY );
+ if (xNewName.is())
+ {
+ xNewName->setName( aNewName );
+ pDim->WriteToSource( xNew );
+ }
+ }
+ }
+ else
+ pDim->WriteToSource( xIntDim );
+ }
+ }
+ DBG_ASSERT(bFound, "WriteToSource: Dimension not found");
+ }
+
+ if ( xSourceProp.is() )
+ {
+ if ( nColumnGrandMode != SC_DPSAVEMODE_DONTKNOW )
+ lcl_SetBoolProperty( xSourceProp,
+ rtl::OUString::createFromAscii(DP_PROP_COLUMNGRAND), (BOOL)nColumnGrandMode );
+ if ( nRowGrandMode != SC_DPSAVEMODE_DONTKNOW )
+ lcl_SetBoolProperty( xSourceProp,
+ rtl::OUString::createFromAscii(DP_PROP_ROWGRAND), (BOOL)nRowGrandMode );
+ }
+ }
+ catch(uno::Exception&)
+ {
+ DBG_ERROR("exception in WriteToSource");
+ }
+}
+
+BOOL ScDPSaveData::IsEmpty() const
+{
+ long nCount = aDimList.Count();
+ for (long i=0; i<nCount; i++)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+ if ( pDim->GetOrientation() != sheet::DataPilotFieldOrientation_HIDDEN && !pDim->IsDataLayout() )
+ return FALSE;
+ }
+ return TRUE; // no entries that are not hidden
+}
+
+ScDPDimensionSaveData* ScDPSaveData::GetDimensionData()
+{
+ if (!pDimensionData)
+ pDimensionData = new ScDPDimensionSaveData;
+ return pDimensionData;
+}
+
+void ScDPSaveData::SetDimensionData( const ScDPDimensionSaveData* pNew )
+{
+ delete pDimensionData;
+ if ( pNew )
+ pDimensionData = new ScDPDimensionSaveData( *pNew );
+ else
+ pDimensionData = NULL;
+}
+
+void ScDPSaveData::BuildAllDimensionMembers(ScDPTableData* pData)
+{
+ if (mbDimensionMembersBuilt)
+ return;
+
+ // First, build a dimension name-to-index map.
+ typedef hash_map<OUString, long, ::rtl::OUStringHash> NameIndexMap;
+ NameIndexMap aMap;
+ long nColCount = pData->GetColumnCount();
+ for (long i = 0; i < nColCount; ++i)
+ aMap.insert( NameIndexMap::value_type(pData->getDimensionName(i), i));
+
+ NameIndexMap::const_iterator itrEnd = aMap.end();
+
+ sal_uInt32 n = aDimList.Count();
+ for (sal_uInt32 i = 0; i < n; ++i)
+ {
+ ScDPSaveDimension* pDim = static_cast<ScDPSaveDimension*>(aDimList.GetObject(i));
+ const String& rDimName = pDim->GetName();
+ if (!rDimName.Len())
+ // empty dimension name. It must be data layout.
+ continue;
+
+ NameIndexMap::const_iterator itr = aMap.find(rDimName);
+ if (itr == itrEnd)
+ // dimension name not in the data. This should never happen!
+ continue;
+
+ long nDimIndex = itr->second;
+ const std::vector<SCROW>& rMembers = pData->GetColumnEntries(nDimIndex);
+ size_t mMemberCount = rMembers.size();
+ for (size_t j = 0; j < mMemberCount; ++j)
+ {
+ const ScDPItemData* pMemberData = pData->GetMemberById( nDimIndex, rMembers[j] );
+ String aMemName = pMemberData->GetString();
+ if (pDim->GetExistingMemberByName(aMemName))
+ // this member instance already exists. nothing to do.
+ continue;
+
+ auto_ptr<ScDPSaveMember> pNewMember(new ScDPSaveMember(aMemName));
+ pNewMember->SetIsVisible(true);
+ pDim->AddMember(pNewMember.release());
+ }
+ }
+
+ mbDimensionMembersBuilt = true;
+}
+
+bool ScDPSaveData::HasInvisibleMember(const OUString& rDimName) const
+{
+ ScDPSaveDimension* pDim = GetExistingDimensionByName(rDimName);
+ if (!pDim)
+ return false;
+
+ return pDim->HasInvisibleMember();
+}
+
+void ScDPSaveData::Refresh( const uno::Reference<sheet::XDimensionsSupplier>& xSource )
+{
+ try
+ {
+ long nCount = aDimList.Count();
+ std::list<String> deletedDims;
+ for (long i=nCount-1; i >=0 ; i--)
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+
+ rtl::OUString aName = pDim->GetName();
+ if ( pDim->IsDataLayout() )
+ continue;
+
+ uno::Reference<container::XNameAccess> xDimsName = xSource->getDimensions();
+ uno::Reference<container::XIndexAccess> xIntDims = new ScNameToIndexAccess( xDimsName );
+ long nIntCount = xIntDims->getCount();
+ BOOL bFound = FALSE;
+ for (long nIntDim=0; nIntDim<nIntCount && !bFound; nIntDim++)
+ {
+ uno::Reference<uno::XInterface> xIntDim = ScUnoHelpFunctions::AnyToInterface( xIntDims->getByIndex(nIntDim) );
+ uno::Reference<container::XNamed> xDimName( xIntDim, uno::UNO_QUERY );
+ if ( xDimName.is() && xDimName->getName() == aName )
+ bFound = TRUE;
+ }
+ if ( !bFound )
+ {
+ deletedDims.push_back( aName );
+ aDimList.Remove(i);
+ DBG_TRACE( "\n Remove dim: \t" );
+ DBG_TRACESTR( String( aName ) );
+ }
+
+ }
+
+ nCount = aDimList.Count();
+ for (long i=nCount-1; i >=0 ; i--) //check every dimension ??
+ {
+ ScDPSaveDimension* pDim = (ScDPSaveDimension*)aDimList.GetObject(i);
+
+ rtl::OUString aName = pDim->GetName();
+ if ( pDim->IsDataLayout() )
+ continue;
+ pDim->Refresh( xSource, deletedDims );
+
+ }
+ }
+ catch(uno::Exception&)
+ {
+ DBG_ERROR("error in ScDPSaveData::Refresh");
+ }
+
+}
+void ScDPSaveDimension::Refresh( const com::sun::star::uno::Reference<
+ com::sun::star::sheet::XDimensionsSupplier>& xSource ,
+ const std::list<String>& deletedDims)
+{
+ if ( xSource.is() )
+ {
+ ScDPSource* pTabSource = static_cast<ScDPSource*>( xSource.get() );
+ ScDPTableDataCache* pCache = pTabSource->GetCache();
+ if ( pCache->GetId() == -1 )
+ return;
+
+ SCCOL nSrcDim = pCache->GetDimensionIndex( GetName() );
+
+ if ( nSrcDim == -1 )
+ return;
+ if ( pSelectedPage )
+ {//check pSelected page
+ DBG_TRACESTR( (*pSelectedPage) );
+ if ( pCache->GetIdByItemData( nSrcDim, *pSelectedPage ) == -1 )
+ {
+ delete pSelectedPage;
+ pSelectedPage = NULL;
+ }
+
+ };
+
+ if ( pReferenceValue && pReferenceValue->ReferenceItemType == DataPilotFieldReferenceItemType::NAMED )
+ {//check pReferenceValue
+#ifdef DEBUG
+ switch( pReferenceValue->ReferenceType)
+ {
+ case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE: //both
+ DBG_TRACE( "\n sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE \n" );
+ break;
+ case sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE: //both
+ DBG_TRACE( "\n sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE \n" );
+ break;
+ case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE: //both
+ DBG_TRACE( "\n sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE \n" );
+ break;
+ case sheet::DataPilotFieldReferenceType::RUNNING_TOTAL:
+ DBG_TRACE( "\n sheet::DataPilotFieldReferenceType::RUNNING_TOTAL \n" ); //enable name
+ break;
+ }
+#endif
+ switch( pReferenceValue->ReferenceType)
+ {
+ case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE:
+ case sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE:
+ case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE:
+ case sheet::DataPilotFieldReferenceType::RUNNING_TOTAL:
+ {
+ if( pReferenceValue->ReferenceItemType == DataPilotFieldReferenceItemType::NAMED )
+ {
+ const String& sReferenceFieldName = pReferenceValue->ReferenceField;
+ DBG_TRACESTR( sReferenceFieldName );
+ SCCOL nRefDim = pCache->GetDimensionIndex( sReferenceFieldName );
+ bool bValid = true;
+ if ( nRefDim == -1 )
+ bValid = false;
+ else if ( pReferenceValue->ReferenceType != sheet::DataPilotFieldReferenceType::RUNNING_TOTAL )
+ { //running total has not reference item
+ const String& sReferenceItemName = pReferenceValue->ReferenceItemName;
+ DBG_TRACESTR( sReferenceItemName );
+ if ( pCache->GetIdByItemData( nRefDim, sReferenceItemName ) == -1 )
+ bValid = false;
+ }
+ if ( !bValid )
+ {
+ delete pReferenceValue;
+ pReferenceValue = NULL;
+ }
+ }
+ }
+ break;
+ }
+
+ };
+
+ if ( pSortInfo )
+ { //check sortinfo
+ if ( pSortInfo->Mode == DataPilotFieldSortMode::DATA )
+ {
+ DBG_TRACE( "\n DataPilotFieldSortMode::DATA \n" );
+ const String& sFieldDimName = pSortInfo->Field;
+ std::list<String>::const_iterator iter = std::find( deletedDims.begin(), deletedDims.end(), sFieldDimName );
+ if ( iter != deletedDims.end() && pCache->GetDimensionIndex( sFieldDimName ) == -1 )
+ {
+ pSortInfo->Mode = DataPilotFieldSortMode::MANUAL;
+ pSortInfo->Field = GetName();
+ }
+ }
+
+ };
+
+ if ( pAutoShowInfo )
+ { //check autoshow
+ const String& sFieldDimName = pAutoShowInfo->DataField;
+ std::list<String>::const_iterator iter = std::find( deletedDims.begin(), deletedDims.end(), sFieldDimName );
+ if ( iter != deletedDims.end() && pCache->GetDimensionIndex( sFieldDimName ) == -1 )
+ {
+ delete pAutoShowInfo;
+ pAutoShowInfo = NULL;
+ }
+
+ };
+
+ //remove unused members
+ //SODC_19124
+ for (MemberList::iterator i=maMemberList.begin(); i != maMemberList.end() ; )
+ {
+ rtl::OUString aMemberName = (*i)->GetName();
+ if ( pCache->GetIdByItemData( nSrcDim, aMemberName ) == -1 )
+ i = maMemberList.erase( i );
+ else
+ i++;
+ }
+ }
+}
+// End Comments
+bool operator == (const ::com::sun::star::sheet::DataPilotFieldSortInfo &l, const ::com::sun::star::sheet::DataPilotFieldSortInfo &r )
+{
+ return l.Field == r.Field && l.IsAscending == r.IsAscending && l.Mode == r.Mode;
+}
+bool operator == (const ::com::sun::star::sheet::DataPilotFieldAutoShowInfo &l, const ::com::sun::star::sheet::DataPilotFieldAutoShowInfo &r )
+{
+ return l.IsEnabled == r.IsEnabled &&
+ l.ShowItemsMode == r.ShowItemsMode &&
+ l.ItemCount == r.ItemCount &&
+ l.DataField == r.DataField;
+}
+bool operator == (const ::com::sun::star::sheet::DataPilotFieldReference &l, const ::com::sun::star::sheet::DataPilotFieldReference &r )
+{
+ return l.ReferenceType == r.ReferenceType &&
+ l.ReferenceField == r.ReferenceField &&
+ l.ReferenceItemType == r.ReferenceItemType &&
+ l.ReferenceItemName == r.ReferenceItemName;
+}
+