summaryrefslogtreecommitdiff
path: root/sc/source/core/data/documen5.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core/data/documen5.cxx')
-rw-r--r--sc/source/core/data/documen5.cxx789
1 files changed, 0 insertions, 789 deletions
diff --git a/sc/source/core/data/documen5.cxx b/sc/source/core/data/documen5.cxx
deleted file mode 100644
index 486779f16..000000000
--- a/sc/source/core/data/documen5.cxx
+++ /dev/null
@@ -1,789 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * 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 <com/sun/star/util/XModifiable.hpp>
-#include <com/sun/star/chart/ChartDataRowSource.hpp>
-#include <com/sun/star/chart2/XChartDocument.hpp>
-#include <com/sun/star/chart2/data/XDataProvider.hpp>
-#include <com/sun/star/chart2/data/XDataReceiver.hpp>
-#include <com/sun/star/embed/EmbedStates.hpp>
-#include <com/sun/star/embed/XEmbeddedObject.hpp>
-
-
-#ifdef _MSC_VER
-#pragma optimize("",off)
-#endif
-
-// INCLUDE ---------------------------------------------------------------
-
-#include <sfx2/objsh.hxx>
-#include <svx/svditer.hxx>
-#include <svx/svdoole2.hxx>
-#include <svx/svdpage.hxx>
-
-#include "document.hxx"
-#include "drwlayer.hxx"
-#include "chartarr.hxx"
-#include "chartlis.hxx"
-#include "chartlock.hxx"
-#include "refupdat.hxx"
-#include <tools/globname.hxx>
-#include <sot/exchange.hxx>
-
-#include "miscuno.hxx"
-#include "chart2uno.hxx"
-#include "charthelper.hxx"
-
-using namespace ::com::sun::star;
-
-// -----------------------------------------------------------------------
-
-void lcl_GetChartParameters( const uno::Reference< chart2::XChartDocument >& xChartDoc,
- rtl::OUString& rRanges, chart::ChartDataRowSource& rDataRowSource,
- bool& rHasCategories, bool& rFirstCellAsLabel )
-{
- rHasCategories = rFirstCellAsLabel = false; // default if not in sequence
-
- uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
-
- uno::Reference< chart2::data::XDataSource > xDataSource = xReceiver->getUsedData();
- uno::Reference< chart2::data::XDataProvider > xProvider = xChartDoc->getDataProvider();
-
- if ( xProvider.is() )
- {
- uno::Sequence< beans::PropertyValue > aArgs( xProvider->detectArguments( xDataSource ) );
-
- const beans::PropertyValue* pPropArray = aArgs.getConstArray();
- long nPropCount = aArgs.getLength();
- for (long i = 0; i < nPropCount; i++)
- {
- const beans::PropertyValue& rProp = pPropArray[i];
- String aPropName(rProp.Name);
-
- if (aPropName.EqualsAscii( "CellRangeRepresentation" ))
- rProp.Value >>= rRanges;
- else if (aPropName.EqualsAscii( "DataRowSource" ))
- rDataRowSource = (chart::ChartDataRowSource)ScUnoHelpFunctions::GetEnumFromAny( rProp.Value );
- else if (aPropName.EqualsAscii( "HasCategories" ))
- rHasCategories = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
- else if (aPropName.EqualsAscii( "FirstCellAsLabel" ))
- rFirstCellAsLabel = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
- }
- }
-}
-
-void lcl_SetChartParameters( const uno::Reference< chart2::data::XDataReceiver >& xReceiver,
- const rtl::OUString& rRanges, chart::ChartDataRowSource eDataRowSource,
- bool bHasCategories, bool bFirstCellAsLabel )
-{
- if ( xReceiver.is() )
- {
- uno::Sequence< beans::PropertyValue > aArgs( 4 );
- aArgs[0] = beans::PropertyValue(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellRangeRepresentation")), -1,
- uno::makeAny( rRanges ), beans::PropertyState_DIRECT_VALUE );
- aArgs[1] = beans::PropertyValue(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasCategories")), -1,
- uno::makeAny( bHasCategories ), beans::PropertyState_DIRECT_VALUE );
- aArgs[2] = beans::PropertyValue(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FirstCellAsLabel")), -1,
- uno::makeAny( bFirstCellAsLabel ), beans::PropertyState_DIRECT_VALUE );
- aArgs[3] = beans::PropertyValue(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataRowSource")), -1,
- uno::makeAny( eDataRowSource ), beans::PropertyState_DIRECT_VALUE );
- xReceiver->setArguments( aArgs );
- }
-}
-
-// update charts after loading old document
-
-void ScDocument::UpdateAllCharts()
-{
- if ( !pDrawLayer || !pShell )
- return;
-
- if (pChartCollection->empty())
- return ; // nothing to do
-
- size_t nDataCount = pChartCollection->size();
-
- for (SCTAB nTab=0; nTab< static_cast<SCTAB>(maTabs.size()); nTab++)
- {
- if (maTabs[nTab])
- {
- SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
- OSL_ENSURE(pPage,"Page ?");
-
- ScRange aRange;
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 )
- {
- uno::Reference< embed::XEmbeddedObject > xIPObj = ((SdrOle2Obj*)pObject)->GetObjRef();
- if ( xIPObj.is() )
- {
- ::rtl::OUString aIPName = ((SdrOle2Obj*)pObject)->GetPersistName();
-
- for (size_t nPos = 0; nPos < nDataCount; ++nPos)
- {
- ScChartArray* pChartObj = (*pChartCollection)[nPos];
- if (pChartObj->GetName() == aIPName)
- {
- ScRangeListRef aRanges = pChartObj->GetRangeList();
- String sRangeStr;
- aRanges->Format( sRangeStr, SCR_ABS_3D, this, GetAddressConvention() );
-
- chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
- bool bHasCategories = pChartObj->HasRowHeaders();
- bool bFirstCellAsLabel = pChartObj->HasColHeaders();
-
- // Calc -> DataProvider
- uno::Reference< chart2::data::XDataProvider > xDataProvider =
- new ScChart2DataProvider( this );
- // Chart -> DataReceiver
- uno::Reference< chart2::data::XDataReceiver > xReceiver;
- uno::Reference< embed::XComponentSupplier > xCompSupp( xIPObj, uno::UNO_QUERY );
- if( xCompSupp.is())
- xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY );
- if( xReceiver.is())
- {
- // connect
- xReceiver->attachDataProvider( xDataProvider );
- uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier(
- pShell->GetModel(), uno::UNO_QUERY );
- xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
-
- lcl_SetChartParameters( xReceiver, sRangeStr, eDataRowSource,
- bHasCategories, bFirstCellAsLabel );
- }
-
- ScChartListener* pCL = new ScChartListener(
- aIPName, this, pChartObj->GetRangeList() );
- pChartListenerCollection->Insert( pCL );
- pCL->StartListeningTo();
- }
- }
- }
- }
- pObject = aIter.Next();
- }
- }
- }
-
- pChartCollection->clear();
-}
-
-sal_Bool ScDocument::HasChartAtPoint( SCTAB nTab, const Point& rPos, String* pName )
-{
- if (pDrawLayer && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
- {
- SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
- OSL_ENSURE(pPage,"Page ?");
-
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
- pObject->GetCurrentBoundRect().IsInside(rPos) )
- {
- // auch Chart-Objekte die nicht in der Collection sind
-
- if (IsChart(pObject))
- {
- if (pName)
- *pName = ((SdrOle2Obj*)pObject)->GetPersistName();
- return sal_True;
- }
- }
- pObject = aIter.Next();
- }
- }
-
- if (pName)
- pName->Erase();
- return false; // nothing found
-}
-
-void ScDocument::UpdateChartArea( const String& rChartName,
- const ScRange& rNewArea, sal_Bool bColHeaders, sal_Bool bRowHeaders,
- sal_Bool bAdd )
-{
- ScRangeListRef aRLR( new ScRangeList );
- aRLR->Append( rNewArea );
- UpdateChartArea( rChartName, aRLR, bColHeaders, bRowHeaders, bAdd );
-}
-
-uno::Reference< chart2::XChartDocument > ScDocument::GetChartByName( const String& rChartName )
-{
- uno::Reference< chart2::XChartDocument > xReturn;
-
- if (pDrawLayer)
- {
- sal_uInt16 nCount = pDrawLayer->GetPageCount();
- for (sal_uInt16 nTab=0; nTab<nCount&& nTab < static_cast<SCTAB>(maTabs.size()); nTab++)
- {
- SdrPage* pPage = pDrawLayer->GetPage(nTab);
- OSL_ENSURE(pPage,"Page ?");
-
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
- ((SdrOle2Obj*)pObject)->GetPersistName() == rChartName )
- {
- xReturn.set( ScChartHelper::GetChartFromSdrObject( pObject ) );
- return xReturn;
- }
- pObject = aIter.Next();
- }
- }
- }
- return xReturn;
-}
-void ScDocument::GetChartRanges( const String& rChartName, ::std::vector< ScRangeList >& rRangesVector, ScDocument* pSheetNameDoc )
-{
- rRangesVector.clear();
- uno::Reference< chart2::XChartDocument > xChartDoc( GetChartByName( rChartName ) );
- if ( xChartDoc.is() )
- {
- uno::Sequence< rtl::OUString > aRangeStrings;
- ScChartHelper::GetChartRanges( xChartDoc, aRangeStrings );
- for( sal_Int32 nN=0; nN<aRangeStrings.getLength(); nN++ )
- {
- ScRangeList aRanges;
- aRanges.Parse( aRangeStrings[nN], pSheetNameDoc, SCA_VALID, pSheetNameDoc->GetAddressConvention() );
- rRangesVector.push_back(aRanges);
- }
- }
-}
-
-void ScDocument::SetChartRanges( const String& rChartName, const ::std::vector< ScRangeList >& rRangesVector )
-{
- uno::Reference< chart2::XChartDocument > xChartDoc( GetChartByName( rChartName ) );
- if ( xChartDoc.is() )
- {
- sal_Int32 nCount = static_cast<sal_Int32>( rRangesVector.size() );
- uno::Sequence< rtl::OUString > aRangeStrings(nCount);
- for( sal_Int32 nN=0; nN<nCount; nN++ )
- {
- ScRangeList aScRangeList( rRangesVector[nN] );
- String sRangeStr; // This range must be in Calc A1 format.
- aScRangeList.Format( sRangeStr, SCR_ABS_3D, this );
- aRangeStrings[nN]=sRangeStr;
- }
- ScChartHelper::SetChartRanges( xChartDoc, aRangeStrings );
- }
-}
-
-void ScDocument::GetOldChartParameters( const String& rName,
- ScRangeList& rRanges, sal_Bool& rColHeaders, sal_Bool& rRowHeaders )
-{
- // used for undo of changing chart source area
-
- if (!pDrawLayer)
- return;
-
- sal_uInt16 nCount = pDrawLayer->GetPageCount();
- for (sal_uInt16 nTab=0; nTab<nCount && nTab < static_cast<SCTAB>(maTabs.size()); nTab++)
- {
- SdrPage* pPage = pDrawLayer->GetPage(nTab);
- OSL_ENSURE(pPage,"Page ?");
-
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
- ((SdrOle2Obj*)pObject)->GetPersistName() == rName )
- {
- uno::Reference< chart2::XChartDocument > xChartDoc( ScChartHelper::GetChartFromSdrObject( pObject ) );
- if ( xChartDoc.is() )
- {
- chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
- bool bHasCategories = false;
- bool bFirstCellAsLabel = false;
- rtl::OUString aRangesStr;
- lcl_GetChartParameters( xChartDoc, aRangesStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
-
- rRanges.Parse( aRangesStr, this );
- if ( eDataRowSource == chart::ChartDataRowSource_COLUMNS )
- {
- rRowHeaders = bHasCategories;
- rColHeaders = bFirstCellAsLabel;
- }
- else
- {
- rColHeaders = bHasCategories;
- rRowHeaders = bFirstCellAsLabel;
- }
- }
- return;
- }
- pObject = aIter.Next();
- }
- }
-}
-
-void ScDocument::UpdateChartArea( const String& rChartName,
- const ScRangeListRef& rNewList, sal_Bool bColHeaders, sal_Bool bRowHeaders,
- sal_Bool bAdd )
-{
- if (!pDrawLayer)
- return;
-
- for (SCTAB nTab=0; nTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]; nTab++)
- {
- SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
- OSL_ENSURE(pPage,"Page ?");
-
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
- ((SdrOle2Obj*)pObject)->GetPersistName() == rChartName )
- {
- uno::Reference< chart2::XChartDocument > xChartDoc( ScChartHelper::GetChartFromSdrObject( pObject ) );
- uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
- if ( xChartDoc.is() && xReceiver.is() )
- {
- ScRangeListRef aNewRanges;
- chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
- bool bHasCategories = false;
- bool bFirstCellAsLabel = false;
- rtl::OUString aRangesStr;
- lcl_GetChartParameters( xChartDoc, aRangesStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
-
- sal_Bool bInternalData = xChartDoc->hasInternalDataProvider();
-
- if ( bAdd && !bInternalData )
- {
- // append to old ranges, keep other settings
-
- aNewRanges = new ScRangeList;
- aNewRanges->Parse( aRangesStr, this );
-
- for ( size_t nAdd = 0, nAddCount = rNewList->size(); nAdd < nAddCount; ++nAdd )
- aNewRanges->Append( *(*rNewList)[nAdd] );
- }
- else
- {
- // directly use new ranges (only eDataRowSource is used from old settings)
-
- if ( eDataRowSource == chart::ChartDataRowSource_COLUMNS )
- {
- bHasCategories = bRowHeaders;
- bFirstCellAsLabel = bColHeaders;
- }
- else
- {
- bHasCategories = bColHeaders;
- bFirstCellAsLabel = bRowHeaders;
- }
- aNewRanges = rNewList;
- }
-
- if ( bInternalData && pShell )
- {
- // Calc -> DataProvider
- uno::Reference< chart2::data::XDataProvider > xDataProvider = new ScChart2DataProvider( this );
- xReceiver->attachDataProvider( xDataProvider );
- uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier(
- pShell->GetModel(), uno::UNO_QUERY );
- xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
- }
-
- String sRangeStr;
- aNewRanges->Format( sRangeStr, SCR_ABS_3D, this, GetAddressConvention() );
-
- lcl_SetChartParameters( xReceiver, sRangeStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
-
- pChartListenerCollection->ChangeListening( rChartName, aNewRanges );
-
- return; // do not search anymore
- }
- }
- pObject = aIter.Next();
- }
- }
-}
-
-void ScDocument::UpdateChart( const String& rChartName )
-{
- if (!pDrawLayer || bInDtorClear)
- return;
- uno::Reference< chart2::XChartDocument > xChartDoc( GetChartByName( rChartName ) );
- if( xChartDoc.is() )
- {
- try
- {
- uno::Reference< util::XModifiable > xModif( xChartDoc, uno::UNO_QUERY_THROW );
- if( apTemporaryChartLock.get() )
- apTemporaryChartLock->AlsoLockThisChart( uno::Reference< frame::XModel >( xModif, uno::UNO_QUERY ) );
- xModif->setModified( sal_True );
- }
- catch ( uno::Exception& )
- {
- }
- }
-
- // After the update, chart keeps track of its own data source ranges,
- // the listener doesn't need to listen anymore, except the chart has
- // an internal data provider.
- if ( !( xChartDoc.is() && xChartDoc->hasInternalDataProvider() ) && pChartListenerCollection )
- {
- pChartListenerCollection->ChangeListening( rChartName, new ScRangeList );
- }
-}
-
-void ScDocument::RestoreChartListener( const String& rName )
-{
- // Read the data ranges from the chart object, and start listening to those ranges again
- // (called when a chart is saved, because then it might be swapped out and stop listening itself).
-
- uno::Reference< embed::XEmbeddedObject > xObject = FindOleObjectByName( rName );
- if ( xObject.is() )
- {
- uno::Reference< util::XCloseable > xComponent = xObject->getComponent();
- uno::Reference< chart2::XChartDocument > xChartDoc( xComponent, uno::UNO_QUERY );
- uno::Reference< chart2::data::XDataReceiver > xReceiver( xComponent, uno::UNO_QUERY );
- if ( xChartDoc.is() && xReceiver.is() && !xChartDoc->hasInternalDataProvider())
- {
- uno::Sequence<rtl::OUString> aRepresentations( xReceiver->getUsedRangeRepresentations() );
- ScRangeListRef aRanges = new ScRangeList;
- sal_Int32 nRangeCount = aRepresentations.getLength();
- for ( sal_Int32 i=0; i<nRangeCount; i++ )
- {
- ScRange aRange;
- ScAddress::Details aDetails(GetAddressConvention(), 0, 0);
- if ( aRange.ParseAny( aRepresentations[i], this, aDetails ) & SCA_VALID )
- aRanges->Append( aRange );
- }
-
- pChartListenerCollection->ChangeListening( rName, aRanges );
- }
- }
-}
-
-void ScDocument::UpdateChartRef( UpdateRefMode eUpdateRefMode,
- SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
- SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
- SCsCOL nDx, SCsROW nDy, SCsTAB nDz )
-{
- if (!pDrawLayer)
- return;
-
- sal_uInt16 nChartCount = pChartListenerCollection->GetCount();
- for ( sal_uInt16 nIndex = 0; nIndex < nChartCount; nIndex++ )
- {
- ScChartListener* pChartListener =
- (ScChartListener*) (pChartListenerCollection->At(nIndex));
- ScRangeListRef aRLR( pChartListener->GetRangeList() );
- ScRangeListRef aNewRLR( new ScRangeList );
- sal_Bool bChanged = false;
- sal_Bool bDataChanged = false;
- for ( size_t i = 0, nListSize = aRLR->size(); i < nListSize; ++i )
- {
- ScRange* pR = (*aRLR)[i];
- SCCOL theCol1 = pR->aStart.Col();
- SCROW theRow1 = pR->aStart.Row();
- SCTAB theTab1 = pR->aStart.Tab();
- SCCOL theCol2 = pR->aEnd.Col();
- SCROW theRow2 = pR->aEnd.Row();
- SCTAB theTab2 = pR->aEnd.Tab();
- ScRefUpdateRes eRes = ScRefUpdate::Update(
- this, eUpdateRefMode,
- nCol1,nRow1,nTab1, nCol2,nRow2,nTab2,
- nDx,nDy,nDz,
- theCol1,theRow1,theTab1,
- theCol2,theRow2,theTab2 );
- if ( eRes != UR_NOTHING )
- {
- bChanged = sal_True;
- aNewRLR->Append( ScRange(
- theCol1, theRow1, theTab1,
- theCol2, theRow2, theTab2 ));
- if ( eUpdateRefMode == URM_INSDEL
- && !bDataChanged
- && (eRes == UR_INVALID ||
- ((pR->aEnd.Col() - pR->aStart.Col()
- != theCol2 - theCol1)
- || (pR->aEnd.Row() - pR->aStart.Row()
- != theRow2 - theRow1)
- || (pR->aEnd.Tab() - pR->aStart.Tab()
- != theTab2 - theTab1))) )
- {
- bDataChanged = sal_True;
- }
- }
- else
- aNewRLR->Append( *pR );
- }
- if ( bChanged )
- {
- {
- // Force the chart to be loaded now, so it registers itself for UNO events.
- // UNO broadcasts are done after UpdateChartRef, so the chart will get this
- // reference change.
-
- uno::Reference< embed::XEmbeddedObject > xIPObj = FindOleObjectByName( pChartListener->GetString() );
- svt::EmbeddedObjectRef::TryRunningState( xIPObj );
-
- // After the change, chart keeps track of its own data source ranges,
- // the listener doesn't need to listen anymore, except the chart has
- // an internal data provider.
- bool bInternalDataProvider = false;
- if ( xIPObj.is() )
- {
- try
- {
- uno::Reference< chart2::XChartDocument > xChartDoc( xIPObj->getComponent(), uno::UNO_QUERY_THROW );
- bInternalDataProvider = xChartDoc->hasInternalDataProvider();
- }
- catch ( uno::Exception& )
- {
- }
- }
- if ( bInternalDataProvider )
- {
- pChartListener->ChangeListening( aNewRLR, bDataChanged );
- }
- else
- {
- pChartListener->ChangeListening( new ScRangeList, bDataChanged );
- }
- }
- }
- }
-}
-
-
-void ScDocument::SetChartRangeList( const String& rChartName,
- const ScRangeListRef& rNewRangeListRef )
-{
- // called from ChartListener
-
- if (!pDrawLayer)
- return;
-
- for (SCTAB nTab=0; nTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]; nTab++)
- {
- SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
- OSL_ENSURE(pPage,"Page ?");
-
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
- ((SdrOle2Obj*)pObject)->GetPersistName() == rChartName )
- {
- uno::Reference< chart2::XChartDocument > xChartDoc( ScChartHelper::GetChartFromSdrObject( pObject ) );
- uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
- if ( xChartDoc.is() && xReceiver.is() )
- {
- ScRangeListRef aNewRanges;
- chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
- bool bHasCategories = false;
- bool bFirstCellAsLabel = false;
- rtl::OUString aRangesStr;
- lcl_GetChartParameters( xChartDoc, aRangesStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
-
- String sRangeStr;
- rNewRangeListRef->Format( sRangeStr, SCR_ABS_3D, this, GetAddressConvention() );
-
- lcl_SetChartParameters( xReceiver, sRangeStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
-
- // don't modify pChartListenerCollection here, called from there
- return;
- }
- }
- pObject = aIter.Next();
- }
- }
-}
-
-
-sal_Bool ScDocument::HasData( SCCOL nCol, SCROW nRow, SCTAB nTab )
-{
- if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
- return maTabs[nTab]->HasData( nCol, nRow );
- else
- return false;
-}
-
-uno::Reference< embed::XEmbeddedObject >
- ScDocument::FindOleObjectByName( const String& rName )
-{
- if (!pDrawLayer)
- return uno::Reference< embed::XEmbeddedObject >();
-
- // die Seiten hier vom Draw-Layer nehmen,
- // weil sie evtl. nicht mit den Tabellen uebereinstimmen
- // (z.B. Redo von Tabelle loeschen, Draw-Redo passiert vor DeleteTab).
-
- sal_uInt16 nCount = pDrawLayer->GetPageCount();
- for (sal_uInt16 nTab=0; nTab<nCount; nTab++)
- {
- SdrPage* pPage = pDrawLayer->GetPage(nTab);
- OSL_ENSURE(pPage,"Page ?");
-
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 )
- {
- SdrOle2Obj * pOleObject ( dynamic_cast< SdrOle2Obj * >( pObject ));
- if( pOleObject &&
- pOleObject->GetPersistName() == rName )
- {
- return pOleObject->GetObjRef();
- }
- }
- pObject = aIter.Next();
- }
- }
-
- return uno::Reference< embed::XEmbeddedObject >();
-}
-
-sal_Bool lcl_StringInCollection( const ScStrCollection* pColl, const String& rStr )
-{
- if ( !pColl )
- return false;
-
- StrData aData( rStr );
- sal_uInt16 nDummy;
- return pColl->Search( &aData, nDummy );
-}
-
-void ScDocument::UpdateChartListenerCollection()
-{
- bChartListenerCollectionNeedsUpdate = false;
- if (!pDrawLayer)
- return;
- else
- {
- ScRange aRange;
- // Range for searching is not important
- ScChartListener aCLSearcher( EMPTY_STRING, this, aRange );
- for (SCTAB nTab=0; nTab< static_cast<SCTAB>(maTabs.size()); nTab++)
- {
- if (maTabs[nTab])
- {
- SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
- OSL_ENSURE(pPage,"Page ?");
-
- if (!pPage)
- continue;
-
- SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if ( pObject->GetObjIdentifier() == OBJ_OLE2 )
- {
- String aObjName = ((SdrOle2Obj*)pObject)->GetPersistName();
- aCLSearcher.SetString( aObjName );
- sal_uInt16 nIndex;
- if ( pChartListenerCollection->Search( &aCLSearcher, nIndex ) )
- {
- ((ScChartListener*) (pChartListenerCollection->
- At( nIndex )))->SetUsed( sal_True );
- }
- else if ( lcl_StringInCollection( pOtherObjects, aObjName ) )
- {
- // non-chart OLE object -> don't touch
- }
- else
- {
- bool bIsChart = false;
-
- uno::Reference< embed::XEmbeddedObject > xIPObj = ((SdrOle2Obj*)pObject)->GetObjRef();
- OSL_ENSURE( xIPObj.is(), "No embedded object is given!");
- uno::Reference< ::com::sun::star::chart2::data::XDataReceiver > xReceiver;
- uno::Reference< embed::XComponentSupplier > xCompSupp( xIPObj, uno::UNO_QUERY );
- if( xCompSupp.is())
- xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY );
-
- // if the object is a chart2::XDataReceiver, we must attach as XDataProvider
- if( xReceiver.is() &&
- !PastingDrawFromOtherDoc())
- {
- // NOTE: this currently does not work as we are
- // unable to set the data. So a chart from the
- // same document is treated like a chart with
- // own data for the time being.
-
- // data provider
- // number formats supplier
-
- // data ?
- // how to set?? Defined in XML-file, which is already loaded!!!
- // => we have to do this stuff here, BEFORE the chart is actually loaded
- }
-
- if (!bIsChart)
- {
- // put into list of other ole objects, so the object doesn't have to
- // be swapped in the next time UpdateChartListenerCollection is called
- //! remove names when objects are no longer there?
- // (object names aren't used again before reloading the document)
-
- if (!pOtherObjects)
- pOtherObjects = new ScStrCollection;
- pOtherObjects->Insert( new StrData( aObjName ) );
- }
- }
- }
- pObject = aIter.Next();
- }
- }
- }
- // alle nicht auf SetUsed gesetzten loeschen
- pChartListenerCollection->FreeUnused();
- }
-}
-
-void ScDocument::AddOLEObjectToCollection(const String& rName)
-{
- if (!pOtherObjects)
- pOtherObjects = new ScStrCollection;
- pOtherObjects->Insert( new StrData( rName ) );
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */