summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorobo <obo@openoffice.org>2010-06-23 13:54:50 +0200
committerobo <obo@openoffice.org>2010-06-23 13:54:50 +0200
commitabaedc357b56a2214762bc1fdceded65645149c2 (patch)
tree20bb3c6a470ef160fcdf08a06de687ad44c20658
parent1085111559bb616cdcce09f6b98d82ab1447e695 (diff)
parent6f02878909a45c178b48d6eadfd9c04c86ceda51 (diff)
CWS-TOOLING: integrate CWS calc55
-rw-r--r--chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx19
-rw-r--r--chart2/source/controller/dialogs/res_ErrorBar.cxx19
-rw-r--r--chart2/source/controller/dialogs/tp_ChartType.cxx26
-rw-r--r--chart2/source/controller/inc/res_ErrorBar.hxx1
-rw-r--r--chart2/source/controller/main/ControllerCommandDispatch.cxx23
-rw-r--r--chart2/source/tools/WrappedPropertySet.cxx14
-rw-r--r--sc/inc/chartuno.hxx49
-rw-r--r--sc/inc/dpobject.hxx1
-rwxr-xr-x[-rw-r--r--]sc/source/core/data/dpobject.cxx8
-rwxr-xr-xsc/source/core/data/dpoutput.cxx12
-rw-r--r--sc/source/core/data/dptabresmember.cxx831
-rw-r--r--sc/source/core/data/dptabresmember.hxx161
-rw-r--r--sc/source/core/tool/addincol.cxx5
-rw-r--r--sc/source/core/tool/compiler.cxx46
-rw-r--r--sc/source/filter/xml/xmldpimp.cxx5
-rw-r--r--sc/source/filter/xml/xmlexprt.cxx81
-rw-r--r--sc/source/ui/dbgui/asciiopt.cxx33
-rw-r--r--sc/source/ui/docshell/dbdocfun.cxx7
-rwxr-xr-xsc/source/ui/docshell/docsh.cxx59
-rw-r--r--sc/source/ui/docshell/docsh2.cxx2
-rw-r--r--sc/source/ui/docshell/docsh3.cxx10
-rwxr-xr-xsc/source/ui/inc/docsh.hxx2
-rw-r--r--sc/source/ui/unoobj/chartuno.cxx138
-rwxr-xr-xsc/source/ui/view/dbfunc3.cxx3
-rw-r--r--sc/source/ui/view/output2.cxx24
-rw-r--r--scaddins/source/analysis/analysis.cxx8
-rw-r--r--scaddins/source/analysis/analysis.hxx9
-rw-r--r--scaddins/source/analysis/analysisadd.idl15
-rw-r--r--scaddins/source/analysis/analysisdefs.hxx2
-rw-r--r--scaddins/source/analysis/analysishelper.cxx4
-rw-r--r--scaddins/source/analysis/bessel.cxx379
-rw-r--r--scaddins/source/analysis/bessel.hxx9
-rw-r--r--scaddins/source/analysis/makefile.mk3
33 files changed, 777 insertions, 1231 deletions
diff --git a/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx b/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx
index 09c3ed550..7b4f72039 100644
--- a/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx
+++ b/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx
@@ -160,7 +160,9 @@ enum
PROP_DOCUMENT_BASEDIAGRAM,
PROP_DOCUMENT_ADDITIONAL_SHAPES,
PROP_DOCUMENT_UPDATE_ADDIN,
- PROP_DOCUMENT_NULL_DATE
+ PROP_DOCUMENT_NULL_DATE,
+ PROP_DOCUMENT_DISABLE_COMPLEX_CHARTTYPES,
+ PROP_DOCUMENT_DISABLE_DATATABLE_DIALOG
};
void lcl_AddPropertiesToVector(
@@ -232,6 +234,19 @@ void lcl_AddPropertiesToVector(
PROP_DOCUMENT_NULL_DATE,
::getCppuType( static_cast< const ::com::sun::star::util::DateTime * >(0)),
beans::PropertyAttribute::MAYBEVOID ));
+
+ rOutProperties.push_back(
+ Property( C2U( "DisableComplexChartTypes" ),
+ PROP_DOCUMENT_DISABLE_COMPLEX_CHARTTYPES,
+ ::getBooleanCppuType(),
+ beans::PropertyAttribute::BOUND
+ | beans::PropertyAttribute::MAYBEDEFAULT ) );
+ rOutProperties.push_back(
+ Property( C2U( "DisableDataTableDialog" ),
+ PROP_DOCUMENT_DISABLE_DATATABLE_DIALOG,
+ ::getBooleanCppuType(),
+ beans::PropertyAttribute::BOUND
+ | beans::PropertyAttribute::MAYBEDEFAULT ) );
}
const uno::Sequence< Property > & lcl_GetPropertySequence()
@@ -1583,6 +1598,8 @@ const std::vector< WrappedProperty* > ChartDocumentWrapper::createWrappedPropert
aWrappedProperties.push_back( new WrappedAdditionalShapesProperty( *this ) );
aWrappedProperties.push_back( new WrappedRefreshAddInAllowedProperty( *this ) );
aWrappedProperties.push_back( new WrappedIgnoreProperty( C2U("NullDate"),Any() ) ); // i99104
+ aWrappedProperties.push_back( new WrappedIgnoreProperty( C2U( "DisableComplexChartTypes" ), uno::makeAny( sal_False ) ) );
+ aWrappedProperties.push_back( new WrappedIgnoreProperty( C2U( "DisableDataTableDialog" ), uno::makeAny( sal_False ) ) );
return aWrappedProperties;
}
diff --git a/chart2/source/controller/dialogs/res_ErrorBar.cxx b/chart2/source/controller/dialogs/res_ErrorBar.cxx
index 482286ec8..7a1c337d2 100644
--- a/chart2/source/controller/dialogs/res_ErrorBar.cxx
+++ b/chart2/source/controller/dialogs/res_ErrorBar.cxx
@@ -37,6 +37,7 @@
#include "RangeSelectionHelper.hxx"
// for RANGE_SELECTION_INVALID_RANGE_BACKGROUND_COLOR
#include "TabPageNotifiable.hxx"
+#include "macros.hxx"
#include <rtl/math.hxx>
#include <vcl/dialog.hxx>
@@ -147,7 +148,8 @@ ErrorBarResources::ErrorBarResources( Window* pParent, Dialog * pParentDialog,
m_pParentWindow( pParent ),
m_pParentDialog( pParentDialog ),
m_pCurrentRangeChoosingField( 0 ),
- m_bHasInternalDataProvider( true )
+ m_bHasInternalDataProvider( true ),
+ m_bDisableDataTableDialog( false )
{
if( m_bNoneAvailable )
m_aRbNone.SetClickHdl( LINK( this, ErrorBarResources, CategoryChosen ));
@@ -197,7 +199,21 @@ void ErrorBarResources::SetChartDocumentForRangeChoosing(
const uno::Reference< chart2::XChartDocument > & xChartDocument )
{
if( xChartDocument.is())
+ {
m_bHasInternalDataProvider = xChartDocument->hasInternalDataProvider();
+ uno::Reference< beans::XPropertySet > xProps( xChartDocument, uno::UNO_QUERY );
+ if ( xProps.is() )
+ {
+ try
+ {
+ xProps->getPropertyValue( C2U( "DisableDataTableDialog" ) ) >>= m_bDisableDataTableDialog;
+ }
+ catch( uno::Exception& e )
+ {
+ ASSERT_EXCEPTION( e );
+ }
+ }
+ }
m_apRangeSelectionHelper.reset( new RangeSelectionHelper( xChartDocument ));
// has internal data provider => rename "cell range" to "from data"
@@ -240,6 +256,7 @@ void ErrorBarResources::UpdateControlStates()
m_aLbFunction.Enable( bIsFunction );
// range buttons
+ m_aRbRange.Enable( !m_bHasInternalDataProvider || !m_bDisableDataTableDialog );
bool bShowRange = ( m_aRbRange.IsChecked());
bool bCanChooseRange =
( bShowRange &&
diff --git a/chart2/source/controller/dialogs/tp_ChartType.cxx b/chart2/source/controller/dialogs/tp_ChartType.cxx
index c66580eb3..11a6d7ae8 100644
--- a/chart2/source/controller/dialogs/tp_ChartType.cxx
+++ b/chart2/source/controller/dialogs/tp_ChartType.cxx
@@ -853,15 +853,35 @@ ChartTypeTabPage::ChartTypeTabPage( Window* pParent
bool bIsHighContrast = ( true && GetSettings().GetStyleSettings().GetHighContrastMode() );
+ bool bDisableComplexChartTypes = false;
+ uno::Reference< beans::XPropertySet > xProps( m_xChartModel, uno::UNO_QUERY );
+ if ( xProps.is() )
+ {
+ try
+ {
+ xProps->getPropertyValue( C2U( "DisableComplexChartTypes" ) ) >>= bDisableComplexChartTypes;
+ }
+ catch( uno::Exception& e )
+ {
+ ASSERT_EXCEPTION( e );
+ }
+ }
+
m_aChartTypeDialogControllerList.push_back(new ColumnChartDialogController() );
m_aChartTypeDialogControllerList.push_back(new BarChartDialogController() );
m_aChartTypeDialogControllerList.push_back(new PieChartDialogController() );
m_aChartTypeDialogControllerList.push_back(new AreaChartDialogController() );
m_aChartTypeDialogControllerList.push_back(new LineChartDialogController() );
- m_aChartTypeDialogControllerList.push_back(new XYChartDialogController() );
- m_aChartTypeDialogControllerList.push_back(new BubbleChartDialogController() );
+ if ( !bDisableComplexChartTypes )
+ {
+ m_aChartTypeDialogControllerList.push_back(new XYChartDialogController() );
+ m_aChartTypeDialogControllerList.push_back(new BubbleChartDialogController() );
+ }
m_aChartTypeDialogControllerList.push_back(new NetChartDialogController() );
- m_aChartTypeDialogControllerList.push_back(new StockChartDialogController() );
+ if ( !bDisableComplexChartTypes )
+ {
+ m_aChartTypeDialogControllerList.push_back(new StockChartDialogController() );
+ }
m_aChartTypeDialogControllerList.push_back(new CombiColumnLineChartDialogController() );
::std::vector< ChartTypeDialogController* >::const_iterator aIter = m_aChartTypeDialogControllerList.begin();
diff --git a/chart2/source/controller/inc/res_ErrorBar.hxx b/chart2/source/controller/inc/res_ErrorBar.hxx
index 94ed46178..f0007199c 100644
--- a/chart2/source/controller/inc/res_ErrorBar.hxx
+++ b/chart2/source/controller/inc/res_ErrorBar.hxx
@@ -135,6 +135,7 @@ private:
m_apRangeSelectionHelper;
Edit * m_pCurrentRangeChoosingField;
bool m_bHasInternalDataProvider;
+ bool m_bDisableDataTableDialog;
DECL_LINK( CategoryChosen, void * );
DECL_LINK( SynchronizePosAndNeg, void * );
diff --git a/chart2/source/controller/main/ControllerCommandDispatch.cxx b/chart2/source/controller/main/ControllerCommandDispatch.cxx
index 3eef0396f..c62de3dfe 100644
--- a/chart2/source/controller/main/ControllerCommandDispatch.cxx
+++ b/chart2/source/controller/main/ControllerCommandDispatch.cxx
@@ -528,6 +528,23 @@ void ControllerCommandDispatch::updateCommandAvailability()
bool bShapeContext = ( m_pChartController ? m_pChartController->isShapeContext() : false );
+ bool bDisableDataTableDialog = false;
+ if ( m_xController.is() )
+ {
+ Reference< beans::XPropertySet > xProps( m_xController->getModel(), uno::UNO_QUERY );
+ if ( xProps.is() )
+ {
+ try
+ {
+ xProps->getPropertyValue( C2U( "DisableDataTableDialog" ) ) >>= bDisableDataTableDialog;
+ }
+ catch( uno::Exception& e )
+ {
+ ASSERT_EXCEPTION( e );
+ }
+ }
+ }
+
// edit commands
m_aCommandAvailability[ C2U(".uno:Cut")] = bIsWritable && bControllerStateIsValid && m_apControllerState->bIsDeleteableObjectSelected;
m_aCommandAvailability[ C2U(".uno:Copy")] = bControllerStateIsValid && m_apControllerState->bHasSelectedObject;
@@ -595,7 +612,7 @@ void ControllerCommandDispatch::updateCommandAvailability()
// depending on own data
m_aCommandAvailability[ C2U(".uno:DataRanges")] = bIsWritable && bModelStateIsValid && (! m_apModelState->bHasOwnData);
- m_aCommandAvailability[ C2U(".uno:DiagramData")] = bIsWritable && bModelStateIsValid && m_apModelState->bHasOwnData;
+ m_aCommandAvailability[ C2U(".uno:DiagramData")] = bIsWritable && bModelStateIsValid && m_apModelState->bHasOwnData && !bDisableDataTableDialog;
// titles
m_aCommandAvailability[ C2U(".uno:MainTitle")] = bIsWritable && bModelStateIsValid && m_apModelState->bHasMainTitle;
@@ -631,9 +648,9 @@ void ControllerCommandDispatch::updateCommandAvailability()
// series arrangement
m_aCommandAvailability[ C2U(".uno:Forward")] = ( bShapeContext ? isShapeControllerCommandAvailable( C2U( ".uno:Forward" ) ) :
- ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesForward ) );
+ ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesForward && !bDisableDataTableDialog ) );
m_aCommandAvailability[ C2U(".uno:Backward")] = ( bShapeContext ? isShapeControllerCommandAvailable( C2U( ".uno:Backward" ) ) :
- ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesBackward ) );
+ ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesBackward && !bDisableDataTableDialog ) );
m_aCommandAvailability[ C2U(".uno:InsertDataLabels")] = bIsWritable;
m_aCommandAvailability[ C2U(".uno:InsertDataLabel")] = bIsWritable;
diff --git a/chart2/source/tools/WrappedPropertySet.cxx b/chart2/source/tools/WrappedPropertySet.cxx
index 29db225d4..f66d16d0c 100644
--- a/chart2/source/tools/WrappedPropertySet.cxx
+++ b/chart2/source/tools/WrappedPropertySet.cxx
@@ -34,6 +34,8 @@
// header for define DELETEZ
#include <tools/solar.h>
+#include <tools/debug.hxx>
+
//.............................................................................
namespace chart
{
@@ -115,7 +117,11 @@ void SAL_CALL WrappedPropertySet::setPropertyValue( const OUString& rPropertyNam
else if( xInnerPropertySet.is() )
xInnerPropertySet->setPropertyValue( rPropertyName, rValue );
else
- throw beans::UnknownPropertyException();
+ {
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ERROR("found no inner property set to map to");
+#endif
+ }
}
catch( beans::UnknownPropertyException& ex )
{
@@ -160,7 +166,11 @@ Any SAL_CALL WrappedPropertySet::getPropertyValue( const OUString& rPropertyName
else if( xInnerPropertySet.is() )
aRet = xInnerPropertySet->getPropertyValue( rPropertyName );
else
- throw beans::UnknownPropertyException();
+ {
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ERROR("found no inner property set to map to");
+#endif
+ }
}
catch( beans::UnknownPropertyException& ex )
{
diff --git a/sc/inc/chartuno.hxx b/sc/inc/chartuno.hxx
index f5c2b758f..4545ad03f 100644
--- a/sc/inc/chartuno.hxx
+++ b/sc/inc/chartuno.hxx
@@ -31,7 +31,9 @@
#include "address.hxx"
#include <svl/lstner.hxx>
#include <tools/string.hxx>
-
+#include <comphelper/proparrhlp.hxx>
+#include <comphelper/propertycontainer.hxx>
+
#include <com/sun/star/table/XTableChart.hpp>
#include <com/sun/star/table/XTableCharts.hpp>
#include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
@@ -39,6 +41,7 @@
#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <com/sun/star/container/XIndexAccess.hpp>
#include <com/sun/star/container/XNamed.hpp>
+#include <cppuhelper/compbase4.hxx>
#include <cppuhelper/implbase4.hxx>
@@ -113,12 +116,20 @@ public:
};
-class ScChartObj : public cppu::WeakImplHelper4<
- com::sun::star::table::XTableChart,
- com::sun::star::document::XEmbeddedObjectSupplier,
- com::sun::star::container::XNamed,
- com::sun::star::lang::XServiceInfo >,
- public SfxListener
+typedef ::cppu::WeakComponentImplHelper4<
+ ::com::sun::star::table::XTableChart,
+ ::com::sun::star::document::XEmbeddedObjectSupplier,
+ ::com::sun::star::container::XNamed,
+ ::com::sun::star::lang::XServiceInfo > ScChartObj_Base;
+
+typedef ::comphelper::OPropertyContainer ScChartObj_PBase;
+typedef ::comphelper::OPropertyArrayUsageHelper< ScChartObj > ScChartObj_PABase;
+
+class ScChartObj : public ::comphelper::OBaseMutex
+ ,public ScChartObj_Base
+ ,public ScChartObj_PBase
+ ,public ScChartObj_PABase
+ ,public SfxListener
{
private:
ScDocShell* pDocShell;
@@ -128,12 +139,32 @@ private:
void Update_Impl( const ScRangeListRef& rRanges, bool bColHeaders, bool bRowHeaders );
void GetData_Impl( ScRangeListRef& rRanges, bool& rColHeaders, bool& rRowHeaders ) const;
+protected:
+ // ::comphelper::OPropertySetHelper
+ virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
+ virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue )
+ throw (::com::sun::star::uno::Exception);
+ using ::cppu::OPropertySetHelper::getFastPropertyValue;
+ virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const;
+
+ // ::comphelper::OPropertyArrayUsageHelper
+ virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const;
+
public:
ScChartObj(ScDocShell* pDocSh, SCTAB nT, const String& rN);
virtual ~ScChartObj();
virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
+ // XInterface
+ DECLARE_XINTERFACE()
+
+ // XTypeProvider
+ DECLARE_XTYPEPROVIDER()
+
+ // XComponent
+ virtual void SAL_CALL disposing();
+
// XTableChart
virtual sal_Bool SAL_CALL getHasColumnHeaders() throw(::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL setHasColumnHeaders( sal_Bool bHasColumnHeaders )
@@ -163,6 +194,10 @@ public:
throw(::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
throw(::com::sun::star::uno::RuntimeException);
+
+ // XPropertySet
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo()
+ throw (::com::sun::star::uno::RuntimeException);
};
#endif
diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx
index 8f84aadaf..e2145a45e 100644
--- a/sc/inc/dpobject.hxx
+++ b/sc/inc/dpobject.hxx
@@ -276,6 +276,7 @@ public:
virtual ScDataObject* Clone() const;
ScDPObject* operator[](USHORT nIndex) const {return (ScDPObject*)At(nIndex);}
+ ScDPObject* GetByName(const String& rName) const;
void DeleteOnTab( SCTAB nTab );
void UpdateReference( UpdateRefMode eUpdateRefMode,
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
index 92ce8fa8b..270f93ff8 100644..100755
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -2434,6 +2434,14 @@ void ScDPCollection::WriteRefsTo( ScDPCollection& r ) const
}
}
+ScDPObject* ScDPCollection::GetByName(const String& rName) const
+{
+ for (USHORT i=0; i<nCount; i++)
+ if (static_cast<const ScDPObject*>(pItems[i])->GetName() == rName)
+ return static_cast<ScDPObject*>(pItems[i]);
+ return NULL;
+}
+
String ScDPCollection::CreateNewName( USHORT nMin ) const
{
String aBase = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("DataPilot"));
diff --git a/sc/source/core/data/dpoutput.cxx b/sc/source/core/data/dpoutput.cxx
index efb5b166c..16f1be0ca 100755
--- a/sc/source/core/data/dpoutput.cxx
+++ b/sc/source/core/data/dpoutput.cxx
@@ -1185,9 +1185,9 @@ void ScDPOutput::GetPositionData(const ScAddress& rPos, DataPilotTablePositionDa
Reference<beans::XPropertySet> xPropSet(xSource, UNO_QUERY);
if (xPropSet.is())
{
- sal_Int32 nDataFieldCount = 0;
- Any any = xPropSet->getPropertyValue(rtl::OUString::createFromAscii("DataFieldCount"));
- if ((any >>= nDataFieldCount) && nDataFieldCount > 0)
+ sal_Int32 nDataFieldCount = ScUnoHelpFunctions::GetLongProperty( xPropSet,
+ rtl::OUString::createFromAscii(SC_UNO_DATAFIELDCOUNT) );
+ if (nDataFieldCount > 0)
aResData.DataFieldIndex = (nRow - nDataStartRow) % nDataFieldCount;
}
@@ -1267,9 +1267,9 @@ bool ScDPOutput::GetDataResultPositionData(vector<sheet::DataPilotFieldFilter>&
if (!xPropSet.is())
return false;
- sal_Int32 nDataFieldCount = 0;
- Any any = xPropSet->getPropertyValue(rtl::OUString::createFromAscii("DataFieldCount"));
- if (!(any >>= nDataFieldCount) || nDataFieldCount == 0)
+ sal_Int32 nDataFieldCount = ScUnoHelpFunctions::GetLongProperty( xPropSet,
+ rtl::OUString::createFromAscii(SC_UNO_DATAFIELDCOUNT) );
+ if (nDataFieldCount == 0)
// No data field is present in this datapilot table.
return false;
diff --git a/sc/source/core/data/dptabresmember.cxx b/sc/source/core/data/dptabresmember.cxx
deleted file mode 100644
index f820fdf99..000000000
--- a/sc/source/core/data/dptabresmember.cxx
+++ /dev/null
@@ -1,831 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright IBM Corporation 2009.
- * Copyright 2009 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: dptabresmember.cxx,v $
- * $Revision: 1.0 $
- *
- * 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.
- *
- ************************************************************************/
-#include "dptabresmember.hxx"
-// -----------------------------------------------------------------------
-ScDPResultMember( const ScDPResultData* pData, const ScDPParentDimData& rParentDimData ,
- BOOL bForceSub ) :
- pResultData( pData ),
- aParentDimData( rParentDimData ),
- /* pParentDim( pDim ),
- pParentLevel( pLev ),
- pMemberDesc( pDesc ),*/
- pChildDimension( NULL ),
- pDataRoot( NULL ),
- bHasElements( FALSE ),
- bForceSubTotal( bForceSub ),
- bHasHiddenDetails( FALSE ),
- bInitialized( FALSE ),
- nMemberStep( 1 ),
- bAutoHidden( FALSE )
-{
- // pParentLevel/pMemberDesc is 0 for root members
-}
-
-ScDPNormalResultMember::ScDPNormalResultMember( const ScDPResultData* pData,
- BOOL bForceSub ) :
- pResultData( pData ),
- pChildDimension( NULL ),
- pDataRoot( NULL ),
- bHasElements( FALSE ),
- bForceSubTotal( bForceSub ),
- bHasHiddenDetails( FALSE ),
- bInitialized( FALSE ),
- nMemberStep( 1 ),
- bAutoHidden( FALSE )
-{
-}
-
-ScDPNormalResultMember::~ScDPNormalResultMember()
-{
- delete pChildDimension;
- delete pDataRoot;
-}
-
-String ScDPNormalResultMember::GetName() const
-{
-// Wang Xu Ming -- 2009-6-10
-// DataPilot Migration
- const ScDPMember* pMemberDesc = GetDPMember();
- // End Comments
- if (pMemberDesc)
- return pMemberDesc->GetNameStr();
- else
- return ScGlobal::GetRscString(STR_PIVOT_TOTAL); // root member
-}
-
-void ScDPNormalResultMember::FillItemData( ScDPItemData& rData ) const
-{
-// Wang Xu Ming -- 2009-6-10
-// DataPilot Migration
- const ScDPMember* pMemberDesc = GetDPMember();
-// End Comments
- if (pMemberDesc)
- pMemberDesc->FillItemData( rData );
- else
- rData.SetString( ScGlobal::GetRscString(STR_PIVOT_TOTAL) ); // root member
-}
-
-BOOL ScDPNormalResultMember::IsNamedItem( /*const ScDPItemData& r */SCROW nIndex ) const
-{
- //! store ScDPMember pointer instead of ScDPMember ???
- const ScDPMember* pMemberDesc = GetDPMember();
- if (pMemberDesc)
- return ((ScDPMember*)pMemberDesc)->IsNamedItem(/* r*/ nIndex );
- return FALSE;
-}
-
-// Wang Xu Ming -- 2009-5-27
-// DataPilot Migration
-bool ScDPNormalResultMember::IsValidEntry( const vector< SCROW >& aMembers ) const
-{
- return GetEntryStatus( aMembers ) != ENTRY_INVALID;
-}
-// End Comments
-
-ENTRYSTATUS ScDPNormalResultMember::GetEntryStatus( const vector< SCROW >& aMembers ) const
-{
- if ( !IsValid() )
- return ENTRY_INVALID;
-
- const ScDPResultDimension* pChildDim = GetChildDimension();
- if (pChildDim)
- {
- if (aMembers.size() < 2)
- return ENTRY_INVALID;
-
- vector</*ScDPItemData*/SCROW>::const_iterator itr = aMembers.begin();
- vector</*ScDPItemData*/SCROW> aChildMembers(++itr, aMembers.end());
- return pChildDim->GetEntryStatus(aChildMembers);
- }
- else if( bHasHiddenDetails )
- return ENTRY_HASHIDDENDETAIL;
- else
- return ENTRY_VALID;
-}
-
-void ScDPNormalResultMember::InitFrom( const vector<ScDPDimension*>& ppDim, const vector<ScDPLevel*>& ppLev,
- size_t nPos, ScDPInitState& rInitState ,
- BOOL bInitChild /*= TRUE */)
- {
- // with LateInit, initialize only those members that have data
- if ( pResultData->IsLateInit() )
- return;
-
- bInitialized = TRUE;
-
- if (nPos >= ppDim.size() )
- return;
-
- // skip child dimension if details are not shown
- if ( GetDPMember() && !GetDPMember()->getShowDetails() )
- {
- // Wang Xu Ming -- 2009-6-16
- // Show DataLayout dimention
- nMemberStep = 1;
- while ( nPos < ppDim.size() )
- {
- if ( ppDim[nPos] ->getIsDataLayoutDimension() )
- {
- if ( !pChildDimension )
- pChildDimension = new ScDPResultDimension( pResultData );
- pChildDimension->InitFrom( ppDim, ppLev, nPos, rInitState , FALSE );
- return;
- }
- else
- { //find next dim
- nPos ++;
- nMemberStep ++;
- }
- }
- // End Comments
- bHasHiddenDetails = TRUE; // only if there is a next dimension
- return;
- }
-
- if ( bInitChild )
- {
- pChildDimension = new ScDPResultDimension( pResultData );
- pChildDimension->InitFrom( ppDim, ppLev, nPos, rInitState, TRUE );
- }
-}
-
-// Wang Xu Ming -- 2009-6-10
-// DataPilot Migration
-void ScDPNormalResultMember::LateInitFrom( LateInitParams& rParams/*const vector<ScDPDimension*>& ppDim, const vector<ScDPLevel*>& ppLev*/,
- const vector< SCROW >& pItemData, size_t nPos,
- ScDPInitState& rInitState )
-// End Comments
-{
- // without LateInit, everything has already been initialized
- if ( !pResultData->IsLateInit() )
- return;
-
- bInitialized = TRUE;
-
- if ( rParams.IsEnd( nPos ) /*nPos >= ppDim.size()*/)
- // No next dimension. Bail out.
- return;
-
- // skip child dimension if details are not shown
- if ( GetDPMember() && !GetDPMember()->getShowDetails() )
- {
- // Wang Xu Ming -- 2009-6-16
- // DataPilot Migration
- // Show DataLayout dimention
- nMemberStep = 1;
- while ( !rParams.IsEnd( nPos ) )
- {
- if ( rParams.GetDim( nPos ) ->getIsDataLayoutDimension() )
- {
- if ( !pChildDimension )
- pChildDimension = new ScDPResultDimension( pResultData );
- rParams.SetInitChild( FALSE );
- pChildDimension->LateInitFrom( rParams, pItemData, nPos, rInitState );
- return;
- }
- else
- { //find next dim
- nPos ++;
- nMemberStep ++;
- }
- }
- // End Comments
- bHasHiddenDetails = TRUE; // only if there is a next dimension
- return;
- }
-
- // LateInitFrom is called several times...
- if ( rParams.GetInitChild() )
- {
- if ( !pChildDimension )
- pChildDimension = new ScDPResultDimension( pResultData );
- pChildDimension->LateInitFrom( rParams, pItemData, nPos, rInitState );
- }
-}
-
-BOOL ScDPNormalResultMember::IsSubTotalInTitle(long nMeasure) const
-{
- BOOL bRet = FALSE;
- if ( pChildDimension && /*pParentLevel*/GetParentLevel() &&
- /*pParentLevel*/GetParentLevel()->IsOutlineLayout() && /*pParentLevel*/GetParentLevel()->IsSubtotalsAtTop() )
- {
- long nUserSubStart;
- long nSubTotals = GetSubTotalCount( &nUserSubStart );
- nSubTotals -= nUserSubStart; // visible count
- if ( nSubTotals )
- {
- if ( nMeasure == SC_DPMEASURE_ALL )
- nSubTotals *= pResultData->GetMeasureCount(); // number of subtotals that will be inserted
-
- // only a single subtotal row will be shown in the outline title row
- if ( nSubTotals == 1 )
- bRet = TRUE;
- }
- }
- return bRet;
-}
-
-long ScDPNormalResultMember::GetSize(long nMeasure) const
-{
- if ( !IsVisible() )
- return 0;
- const ScDPLevel* pParentLevel = GetParentLevel();
- long nExtraSpace = 0;
- if ( pParentLevel && pParentLevel->IsAddEmpty() )
- ++nExtraSpace;
-
- if ( pChildDimension )
- {
- // outline layout takes up an extra row for the title only if subtotals aren't shown in that row
- if ( pParentLevel && pParentLevel->IsOutlineLayout() && !IsSubTotalInTitle( nMeasure ) )
- ++nExtraSpace;
-
- long nSize = pChildDimension->GetSize(nMeasure);
- long nUserSubStart;
- long nUserSubCount = GetSubTotalCount( &nUserSubStart );
- nUserSubCount -= nUserSubStart; // for output size, use visible count
- if ( nUserSubCount )
- {
- if ( nMeasure == SC_DPMEASURE_ALL )
- nSize += pResultData->GetMeasureCount() * nUserSubCount;
- else
- nSize += nUserSubCount;
- }
- return nSize + nExtraSpace;
- }
- else
- {
- if ( nMeasure == SC_DPMEASURE_ALL )
- return pResultData->GetMeasureCount() + nExtraSpace;
- else
- return 1 + nExtraSpace;
- }
-}
-
-
-BOOL ScDPNormalResultMember::IsVisible() const
-{
- // not initialized -> shouldn't be there at all
- // (allocated only to preserve ordering)
- const ScDPLevel* pParentLevel = GetParentLevel();
- return ( bHasElements || ( pParentLevel && pParentLevel->getShowEmpty() ) ) && IsValid() && bInitialized;
-}
-
-BOOL ScDPNormalResultMember::IsValid() const
-{
- // non-Valid members are left out of calculation
-
- // was member set no invisible at the DataPilotSource?
- const ScDPMember* pMemberDesc =GetDPMember();
- if ( pMemberDesc && !pMemberDesc->getIsVisible() )
- return FALSE;
-
- if ( bAutoHidden )
- return FALSE;
-
- return TRUE;
-}
-
-BOOL ScDPNormalResultMember::HasHiddenDetails() const
-{
- // bHasHiddenDetails is set only if the "show details" flag is off,
- // and there was a child dimension to skip
-
- return bHasHiddenDetails;
-}
-
-long ScDPNormalResultMember::GetSubTotalCount( long* pUserSubStart ) const
-{
- if ( pUserSubStart )
- *pUserSubStart = 0; // default
-
- const ScDPLevel* pParentLevel = GetParentLevel();
-
- if ( bForceSubTotal ) // set if needed for root members
- return 1; // grand total is always "automatic"
- else if ( pParentLevel )
- {
- //! direct access via ScDPLevel
-
- uno::Sequence<sheet::GeneralFunction> aSeq = pParentLevel->getSubTotals();
- long nSequence = aSeq.getLength();
- if ( nSequence && aSeq[0] != sheet::GeneralFunction_AUTO )
- {
- // For manual subtotals, always add "automatic" as first function
- // (used for calculation, but not for display, needed for sorting, see lcl_GetForceFunc)
-
- ++nSequence;
- if ( pUserSubStart )
- *pUserSubStart = 1; // visible subtotals start at 1
- }
- return nSequence;
- }
- else
- return 0;
-}
-
-void ScDPNormalResultMember::ProcessData( const vector< SCROW >& aChildMembers, const ScDPResultDimension* pDataDim,
- const vector< SCROW >& aDataMembers, const vector<ScDPValueData>& aValues )
-{
- SetHasElements();
-
- if (pChildDimension)
- pChildDimension->ProcessData( aChildMembers, pDataDim, aDataMembers, aValues );
-
- if ( !pDataRoot )
- {
- pDataRoot = new ScDPDataMember( pResultData, NULL );
- if ( pDataDim )
- pDataRoot->InitFrom( pDataDim ); // recursive
- }
-
- ScDPSubTotalState aSubState; // initial state
-
- long nUserSubCount = GetSubTotalCount();
-
- // Calculate at least automatic if no subtotals are selected,
- // show only own values if there's no child dimension (innermost).
- if ( !nUserSubCount || !pChildDimension )
- nUserSubCount = 1;
-
- const ScDPLevel* pParentLevel = GetParentLevel();
-
- for (long nUserPos=0; nUserPos<nUserSubCount; nUserPos++) // including hidden "automatic"
- {
- // #i68338# if nUserSubCount is 1 (automatic only), don't set nRowSubTotalFunc
- if ( pChildDimension && nUserSubCount > 1 )
- {
- aSubState.nRowSubTotalFunc = nUserPos;
- aSubState.eRowForce = lcl_GetForceFunc( pParentLevel, nUserPos );
- }
-
- pDataRoot->ProcessData( aDataMembers, aValues, aSubState );
- }
-}
-
-void ScDPNormalResultMember::FillMemberResults( uno::Sequence<sheet::MemberResult>* pSequences,
- long& rPos, long nMeasure, BOOL bRoot,
- const String* pMemberName,
- const String* pMemberCaption )
-{
- // IsVisible() test is in ScDPResultDimension::FillMemberResults
- // (not on data layout dimension)
-
- long nSize = GetSize(nMeasure);
- sheet::MemberResult* pArray = pSequences->getArray();
- DBG_ASSERT( rPos+nSize <= pSequences->getLength(), "bumm" );
-
- BOOL bIsNumeric = FALSE;
- String aName;
- if ( pMemberName ) // if pMemberName != NULL, use instead of real member name
- aName = *pMemberName;
- else
- {
- ScDPItemData aItemData;
- FillItemData( aItemData );
- aName = aItemData.GetString();
- bIsNumeric = aItemData.IsValue();
- }
- const ScDPDimension* pParentDim = GetParentDim();
- if ( bIsNumeric && pParentDim && pResultData->IsNumOrDateGroup( pParentDim->GetDimension() ) )
- {
- // Numeric group dimensions use numeric entries for proper sorting,
- // but the group titles must be output as text.
- bIsNumeric = FALSE;
- }
-
- String aCaption = aName;
- if ( pMemberCaption ) // use pMemberCaption if != NULL
- aCaption = *pMemberCaption;
- if (!aCaption.Len())
- aCaption = ScGlobal::GetRscString(STR_EMPTYDATA);
-
- if ( !bIsNumeric )
- {
- // add a "'" character so a string isn't parsed as value in the output cell
- //! have a separate bit in Flags (MemberResultFlags) instead?
- aCaption.Insert( (sal_Unicode) '\'', 0 );
- }
-
- if ( nSize && !bRoot ) // root is overwritten by first dimension
- {
- pArray[rPos].Name = rtl::OUString(aName);
- pArray[rPos].Caption = rtl::OUString(aCaption);
- pArray[rPos].Flags |= sheet::MemberResultFlags::HASMEMBER;
-
- // set "continue" flag (removed for subtotals later)
- for (long i=1; i<nSize; i++)
- pArray[rPos+i].Flags |= sheet::MemberResultFlags::CONTINUE;
- }
-
- const ScDPLevel* pParentLevel = GetParentLevel();
- long nExtraSpace = 0;
- if ( pParentLevel && pParentLevel->IsAddEmpty() )
- ++nExtraSpace;
-
- BOOL bTitleLine = FALSE;
- if ( pParentLevel && pParentLevel->IsOutlineLayout() )
- bTitleLine = TRUE;
-
- // if the subtotals are shown at the top (title row) in outline layout,
- // no extra row for the subtotals is needed
- BOOL bSubTotalInTitle = IsSubTotalInTitle( nMeasure );
-
- BOOL bHasChild = ( pChildDimension != NULL );
- if (bHasChild)
- {
- if ( bTitleLine ) // in tabular layout the title is on a separate row
- ++rPos; // -> fill child dimension one row below
-
- if (bRoot) // same sequence for root member
- pChildDimension->FillMemberResults( pSequences, rPos, nMeasure );
- else
- // Wang Xu Ming -- 2009-6-16
- // DataPilot Migration
- // for show details
- pChildDimension->FillMemberResults( pSequences + nMemberStep/*1*/, rPos, nMeasure );
- // End Comments
-
- if ( bTitleLine ) // title row is included in GetSize, so the following
- --rPos; // positions are calculated with the normal values
- }
-
- rPos += nSize;
-
- long nUserSubStart;
- long nUserSubCount = GetSubTotalCount(&nUserSubStart);
- if ( nUserSubCount && pChildDimension && !bSubTotalInTitle )
- {
- long nMemberMeasure = nMeasure;
- long nSubSize = pResultData->GetCountForMeasure(nMeasure);
-
- rPos -= nSubSize * (nUserSubCount - nUserSubStart); // GetSize includes space for SubTotal
- rPos -= nExtraSpace; // GetSize includes the empty line
-
- for (long nUserPos=nUserSubStart; nUserPos<nUserSubCount; nUserPos++)
- {
- for ( long nSubCount=0; nSubCount<nSubSize; nSubCount++ )
- {
- if ( nMeasure == SC_DPMEASURE_ALL )
- nMemberMeasure = nSubCount;
-
- ScSubTotalFunc eForce = SUBTOTAL_FUNC_NONE;
- if (bHasChild)
- eForce = lcl_GetForceFunc( pParentLevel, nUserPos );
-
- String aSubStr = aName; //! caption?
- aSubStr += ' ';
- aSubStr += pResultData->GetMeasureString(nMemberMeasure, FALSE, eForce);
-
- pArray[rPos].Name = rtl::OUString(aName);
- pArray[rPos].Caption = rtl::OUString(aSubStr);
- pArray[rPos].Flags = ( pArray[rPos].Flags |
- ( sheet::MemberResultFlags::HASMEMBER | sheet::MemberResultFlags::SUBTOTAL) ) &
- ~sheet::MemberResultFlags::CONTINUE;
-
- if ( nMeasure == SC_DPMEASURE_ALL )
- {
- // data layout dimension is (direct/indirect) child of this.
- // data layout dimension must have name for all entries.
-
- uno::Sequence<sheet::MemberResult>* pLayoutSeq = pSequences;
- if (!bRoot)
- ++pLayoutSeq;
- ScDPResultDimension* pLayoutDim = pChildDimension;
- while ( pLayoutDim && !pLayoutDim->IsDataLayout() )
- {
- pLayoutDim = pLayoutDim->GetFirstChildDimension();
- ++pLayoutSeq;
- }
- if ( pLayoutDim )
- {
- sheet::MemberResult* pLayoutArray = pLayoutSeq->getArray();
- String aDataName = pResultData->GetMeasureDimensionName(nMemberMeasure);
- pLayoutArray[rPos].Name = rtl::OUString(aDataName);
- }
- }
-
- rPos += 1;
- }
- }
-
- rPos += nExtraSpace; // add again (subtracted above)
- }
-}
-
-void ScDPNormalResultMember::FillDataResults( const ScDPResultMember* pRefMember,
- uno::Sequence< uno::Sequence<sheet::DataResult> >& rSequence,
- long& rRow, long nMeasure ) const
-{
- // IsVisible() test is in ScDPResultDimension::FillDataResults
- // (not on data layout dimension)
- const ScDPLevel* pParentLevel = GetParentLevel();
- long nStartRow = rRow;
-
- long nExtraSpace = 0;
- if ( pParentLevel && pParentLevel->IsAddEmpty() )
- ++nExtraSpace;
-
- BOOL bTitleLine = FALSE;
- if ( pParentLevel && pParentLevel->IsOutlineLayout() )
- bTitleLine = TRUE;
-
- BOOL bSubTotalInTitle = IsSubTotalInTitle( nMeasure );
-
- BOOL bHasChild = ( pChildDimension != NULL );
- if (bHasChild)
- {
- if ( bTitleLine ) // in tabular layout the title is on a separate row
- ++rRow; // -> fill child dimension one row below
-
- pChildDimension->FillDataResults( pRefMember, rSequence, rRow, nMeasure ); // doesn't modify rRow
- rRow += (USHORT) GetSize( nMeasure );
-
- if ( bTitleLine ) // title row is included in GetSize, so the following
- --rRow; // positions are calculated with the normal values
- }
-
- long nUserSubStart;
- long nUserSubCount = GetSubTotalCount(&nUserSubStart);
- if ( nUserSubCount || !bHasChild )
- {
- // Calculate at least automatic if no subtotals are selected,
- // show only own values if there's no child dimension (innermost).
- if ( !nUserSubCount || !bHasChild )
- {
- nUserSubCount = 1;
- nUserSubStart = 0;
- }
-
- long nMemberMeasure = nMeasure;
- long nSubSize = pResultData->GetCountForMeasure(nMeasure);
- if (bHasChild)
- {
- rRow -= nSubSize * ( nUserSubCount - nUserSubStart ); // GetSize includes space for SubTotal
- rRow -= nExtraSpace; // GetSize includes the empty line
- }
-
- long nMoveSubTotal = 0;
- if ( bSubTotalInTitle )
- {
- nMoveSubTotal = rRow - nStartRow; // force to first (title) row
- rRow = nStartRow;
- }
-
- if ( pDataRoot )
- {
- ScDPSubTotalState aSubState; // initial state
-
- for (long nUserPos=nUserSubStart; nUserPos<nUserSubCount; nUserPos++)
- {
- if ( bHasChild && nUserSubCount > 1 )
- {
- aSubState.nRowSubTotalFunc = nUserPos;
- aSubState.eRowForce = lcl_GetForceFunc( /*pParentLevel*/GetParentLevel() , nUserPos );
- }
-
- for ( long nSubCount=0; nSubCount<nSubSize; nSubCount++ )
- {
- if ( nMeasure == SC_DPMEASURE_ALL )
- nMemberMeasure = nSubCount;
- else if ( pResultData->GetColStartMeasure() == SC_DPMEASURE_ALL )
- nMemberMeasure = SC_DPMEASURE_ALL;
-
- DBG_ASSERT( rRow < rSequence.getLength(), "bumm" );
- uno::Sequence<sheet::DataResult>& rSubSeq = rSequence.getArray()[rRow];
- long nSeqCol = 0;
- pDataRoot->FillDataRow( pRefMember, rSubSeq, nSeqCol, nMemberMeasure, bHasChild, aSubState );
-
- rRow += 1;
- }
- }
- }
- else
- rRow += nSubSize * ( nUserSubCount - nUserSubStart ); // empty rows occur when ShowEmpty is true
-
- // add extra space again if subtracted from GetSize above,
- // add to own size if no children
- rRow += nExtraSpace;
-
- rRow += nMoveSubTotal;
- }
-}
-
-void ScDPNormalResultMember::UpdateDataResults( const ScDPResultMember* pRefMember, long nMeasure ) const
-{
- // IsVisible() test is in ScDPResultDimension::FillDataResults
- // (not on data layout dimension)
-
- BOOL bHasChild = ( pChildDimension != NULL );
-
- long nUserSubCount = GetSubTotalCount();
- // process subtotals even if not shown
-// if ( nUserSubCount || !bHasChild )
- {
- // Calculate at least automatic if no subtotals are selected,
- // show only own values if there's no child dimension (innermost).
- if ( !nUserSubCount || !bHasChild )
- nUserSubCount = 1;
-
- long nMemberMeasure = nMeasure;
- long nSubSize = pResultData->GetCountForMeasure(nMeasure);
-
- if ( pDataRoot )
- {
- ScDPSubTotalState aSubState; // initial state
-
- for (long nUserPos=0; nUserPos<nUserSubCount; nUserPos++) // including hidden "automatic"
- {
- if ( bHasChild && nUserSubCount > 1 )
- {
- aSubState.nRowSubTotalFunc = nUserPos;
- aSubState.eRowForce = lcl_GetForceFunc( /*pParentLevel*/GetParentLevel() , nUserPos );
- }
-
- for ( long nSubCount=0; nSubCount<nSubSize; nSubCount++ )
- {
- if ( nMeasure == SC_DPMEASURE_ALL )
- nMemberMeasure = nSubCount;
- else if ( pResultData->GetColStartMeasure() == SC_DPMEASURE_ALL )
- nMemberMeasure = SC_DPMEASURE_ALL;
-
- pDataRoot->UpdateDataRow( pRefMember, nMemberMeasure, bHasChild, aSubState );
- }
- }
- }
- }
-
- if (bHasChild) // child dimension must be processed last, so the column total is known
- {
- pChildDimension->UpdateDataResults( pRefMember, nMeasure );
- }
-}
-
-void ScDPNormalResultMember::SortMembers( ScDPResultMember* pRefMember )
-{
- BOOL bHasChild = ( pChildDimension != NULL );
- if (bHasChild)
- pChildDimension->SortMembers( pRefMember ); // sorting is done at the dimension
-
- if ( IsRoot() && pDataRoot )
- {
- // use the row root member to sort columns
- // sub total count is always 1
-
- pDataRoot->SortMembers( pRefMember );
- }
-}
-
-void ScDPNormalResultMember::DoAutoShow( ScDPResultMember* pRefMember )
-{
- BOOL bHasChild = ( pChildDimension != NULL );
- if (bHasChild)
- pChildDimension->DoAutoShow( pRefMember ); // sorting is done at the dimension
-
- if ( IsRoot()&& pDataRoot )
- {
- // use the row root member to sort columns
- // sub total count is always 1
-
- pDataRoot->DoAutoShow( pRefMember );
- }
-}
-
-void ScDPNormalResultMember::ResetResults( BOOL bRoot )
-{
- if (pDataRoot)
- pDataRoot->ResetResults();
-
- if (pChildDimension)
- pChildDimension->ResetResults();
-
-// Wang Xu Ming -- 3/4/2009
-// Dim refresh and filter. SODC_19023
- // if (!bRoot)
- // bHasElements = FALSE;
-// End Comments
-}
-
-void ScDPNormalResultMember::UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure,
- ScDPRunningTotalState& rRunning, ScDPRowTotals& rTotals ) const
-{
- // IsVisible() test is in ScDPResultDimension::FillDataResults
- // (not on data layout dimension)
-
- rTotals.SetInColRoot( IsRoot() );
-
- BOOL bHasChild = ( pChildDimension != NULL );
-
- long nUserSubCount = GetSubTotalCount();
- if ( nUserSubCount || !bHasChild )
- {
- // Calculate at least automatic if no subtotals are selected,
- // show only own values if there's no child dimension (innermost).
- if ( !nUserSubCount || !bHasChild )
- nUserSubCount = 1;
-
- long nMemberMeasure = nMeasure;
- long nSubSize = pResultData->GetCountForMeasure(nMeasure);
-
- if ( pDataRoot )
- {
- ScDPSubTotalState aSubState; // initial state
-
- for (long nUserPos=0; nUserPos<nUserSubCount; nUserPos++) // including hidden "automatic"
- {
- if ( bHasChild && nUserSubCount > 1 )
- {
- aSubState.nRowSubTotalFunc = nUserPos;
- aSubState.eRowForce = lcl_GetForceFunc( /*pParentLevel*/GetParentLevel(), nUserPos );
- }
-
- for ( long nSubCount=0; nSubCount<nSubSize; nSubCount++ )
- {
- if ( nMeasure == SC_DPMEASURE_ALL )
- nMemberMeasure = nSubCount;
- else if ( pResultData->GetColStartMeasure() == SC_DPMEASURE_ALL )
- nMemberMeasure = SC_DPMEASURE_ALL;
-
- pDataRoot->UpdateRunningTotals( pRefMember, nMemberMeasure,
- bHasChild, aSubState, rRunning, rTotals, *this );
- }
- }
- }
- }
-
- if (bHasChild) // child dimension must be processed last, so the column total is known
- {
- pChildDimension->UpdateRunningTotals( pRefMember, nMeasure, rRunning, rTotals );
- }
-}
-
-void ScDPNormalResultMember::DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const
-{
- lcl_DumpRow( String::CreateFromAscii("ScDPResultMember"), GetName(), NULL, pDoc, rPos );
- SCROW nStartRow = rPos.Row();
-
- if (pDataRoot)
- pDataRoot->DumpState( pRefMember, pDoc, rPos );
-
- if (pChildDimension)
- pChildDimension->DumpState( pRefMember, pDoc, rPos );
-
- lcl_Indent( pDoc, nStartRow, rPos );
-}
-
-ScDPAggData* ScDPNormalResultMember::GetColTotal( long nMeasure ) const
-{
- return lcl_GetChildTotal( const_cast<ScDPAggData*>(&aColTotal), nMeasure );
-}
-
-void ScDPNormalResultMember::FillVisibilityData(ScDPResultVisibilityData& rData) const
-{
- if (pChildDimension)
- pChildDimension->FillVisibilityData(rData);
-}
-// Wang Xu Ming -- 2009-6-10
-// DataPilot Migration
-SCROW ScDPNormalResultMember::GetDataId( ) const
-{
-// TODO:
- const ScDPMember* pMemberDesc = GetDPMember();
- if (pMemberDesc)
- return pMemberDesc->GetItemDataId();
- return -1;
-}
-
-// -----------------------------------------------------------------------
-ScDPHideDetailsMember:: ScDPHideDetailsMember( const ScDPResultData* pData, const ScDPParentDimData& rParentDimData,
- BOOL bForceSub ):ScDPResultMember(pData,rParentDimData, bForceSub)
-{
- pOrigMember = new ScDPNormalResultMember(pData,rParentDimData, bForceSub);
-
-} \ No newline at end of file
diff --git a/sc/source/core/data/dptabresmember.hxx b/sc/source/core/data/dptabresmember.hxx
deleted file mode 100644
index 5b9f1b39d..000000000
--- a/sc/source/core/data/dptabresmember.hxx
+++ /dev/null
@@ -1,161 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright IBM Corporation 2009.
- * Copyright 2009 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: dptabresmember.hxx,v $
- * $Revision: 1.0 $
- *
- * 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.
- *
- ************************************************************************/
-
-#ifndef DPTABRESMEMBER_HXX
-#define DPTABRESMEMBER_HXX
-
-class ScDPNormalResultMember: public ScDPResultMember
-{
-private:
- // Wang Xu Ming -- 2009-6-9
- // DataPilot Migration
- ScDPParentDimData aParentDimData;
- // End Comments
- BOOL bHasElements:1;
- BOOL bForceSubTotal:1;
- BOOL bHasHiddenDetails:1;
- BOOL bInitialized:1;
- BOOL bAutoHidden:1;
- ScDPAggData aColTotal; // to store column totals
-
-// Wang Xu Ming -- 2009-6-9
-// DataPilot Migration
- USHORT nMemberStep; // step to show details
-// End Comments
-public:
- // Wang Xu Ming -- 2009-6-9
- // DataPilot Migration
- ScDPNormalResultMember( const ScDPResultData* pData, const ScDPParentDimData& rParentDimData,
- BOOL bForceSub ); //! Ref
- ScDPNormalResultMember( const ScDPResultData* pData, BOOL bForceSub );
- // End Comments
- ~ScDPNormalResultMember();
-
- // Wang Xu Ming -- 2009-6-9
- // DataPilot Migration
- // Add parameter: BOOL bInitChild
- void InitFrom( const ::std::vector<ScDPDimension*>& ppDim,
- const ::std::vector<ScDPLevel*>& ppLev,
- size_t nPos,
- ScDPInitState& rInitState,
- BOOL bInitChild = TRUE );
- // End Comments
- // Wang Xu Ming -- 2009-6-9
- // DataPilot Migration
- void LateInitFrom(
- LateInitParams& rParams,
- const ::std::vector< SCROW >& pItemData,
- size_t nPos,
- ScDPInitState& rInitState);
- // End Comments
-
- String GetName() const;
- void FillItemData( ScDPItemData& rData ) const;
- BOOL IsValid() const;
- BOOL IsVisible() const;
- long GetSize(long nMeasure) const;
- BOOL HasHiddenDetails() const;
- BOOL IsSubTotalInTitle(long nMeasure) const;
-
-// BOOL SubTotalEnabled() const;
- long GetSubTotalCount( long* pUserSubStart = NULL ) const;
-
-// Wang Xu Ming -- 2009-6-9
-// DataPilot Migration
-// Use item index
-// BOOL IsNamedItem( const ScDPItemData& r ) const;
- BOOL IsNamedItem( SCROW nIndex ) const;
-// End Comments
- bool IsValidEntry( const ::std::vector< SCROW >& aMembers ) const;
- ENTRYSTATUS GetEntryStatus( const ::std::vector<SCROW>& aMembers ) const;
-
- void SetHasElements() { bHasElements = TRUE; }
- void SetAutoHidden() { bAutoHidden = TRUE; }
-
- void ProcessData( const ::std::vector<SCROW>& aChildMembers,
- const ScDPResultDimension* pDataDim,
- const ::std::vector<SCROW>& aDataMembers,
- const ::std::vector<ScDPValueData>& aValues );
-
- void FillMemberResults( com::sun::star::uno::Sequence<
- com::sun::star::sheet::MemberResult>* pSequences,
- long& rPos, long nMeasure, BOOL bRoot,
- const String* pMemberName,
- const String* pMemberCaption );
-
- void FillDataResults( const ScDPResultMember* pRefMember,
- com::sun::star::uno::Sequence<
- com::sun::star::uno::Sequence<
- com::sun::star::sheet::DataResult> >& rSequence,
- long& rRow, long nMeasure ) const;
-
- void UpdateDataResults( const ScDPResultMember* pRefMember, long nMeasure ) const;
- void UpdateRunningTotals( const ScDPResultMember* pRefMember, long nMeasure,
- ScDPRunningTotalState& rRunning, ScDPRowTotals& rTotals ) const;
-
- void SortMembers( ScDPResultMember* pRefMember );
- void DoAutoShow( ScDPResultMember* pRefMember );
-
- void ResetResults( BOOL bRoot );
-
- void DumpState( const ScDPResultMember* pRefMember, ScDocument* pDoc, ScAddress& rPos ) const;
-
- // Wang Xu Ming -- 2009-6-9
- // DataPilot Migration
- const ScDPDimension* GetParentDim() const { return aParentDimData.mpParentDim; } //! Ref
- const ScDPLevel* GetParentLevel() const { return aParentDimData.mpParentLevel; } //! Ref
- const ScDPMember* GetDPMember()const { return aParentDimData.mpMemberDesc; } //! Ref
- inline SCROW GetOrder() const { return aParentDimData.mnOrder; } //! Ref
- inline BOOL IsRoot() const { return GetParentLevel() == NULL; }
- // End Comments
-
- ScDPAggData* GetColTotal( long nMeasure ) const;
-
- void FillVisibilityData(ScDPResultVisibilityData& rData) const;
-// Wang Xu Ming -- 2009-6-10
-// DataPilot Migration
- SCROW GetDataId( ) const ;
-// End Comments
-};
-
-class ScDPHideDetailsMember: public ScDPResultMember
-{
-private:
- ScDPNormalResultMember * pOrigMember;
-public:
- ScDPHideDetailsMember( const ScDPResultData* pData, const ScDPParentDimData& rParentDimData,
- BOOL bForceSub );
-
-
-};
-
-
-#endif //DPTABRESMEMBER_HXX
diff --git a/sc/source/core/tool/addincol.cxx b/sc/source/core/tool/addincol.cxx
index 0912cf764..5f5fc02a1 100644
--- a/sc/source/core/tool/addincol.cxx
+++ b/sc/source/core/tool/addincol.cxx
@@ -51,6 +51,7 @@
#include <com/sun/star/table/XCellRange.hpp>
#include <com/sun/star/lang/Locale.hpp>
#include <com/sun/star/sheet/XCompatibilityNames.hpp>
+#include <com/sun/star/sheet/NoConvergenceException.hpp>
#include "addincol.hxx"
#include "addinhelpid.hxx"
@@ -1582,9 +1583,13 @@ void ScUnoAddInCall::ExecuteCallWithArgs(uno::Sequence<uno::Any>& rCallArgs)
if ( rWrapped.TargetException.getValueType().equals(
getCppuType( (lang::IllegalArgumentException*)0 ) ) )
nErrCode = errIllegalArgument;
+ else if ( rWrapped.TargetException.getValueType().equals(
+ getCppuType( (sheet::NoConvergenceException*)0 ) ) )
+ nErrCode = errNoConvergence;
else
nErrCode = errNoValue;
}
+
catch(uno::Exception&)
{
nErrCode = errNoValue;
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 7e40f59ac..d96f4fbbd 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -121,6 +121,24 @@ enum ScanState
ssStop
};
+// ODFF names that are not written in the current mapping but to be recognized.
+// New names will be written in a future relase, then exchange (!) with the
+// names in formula/source/core/resource/core_resource.src to be able to still
+// read the old names as well.
+struct FunctionName
+{
+ const sal_Char* pName;
+ OpCode eOp;
+};
+static const FunctionName aOdffAliases[] = {
+ // Renamed old names:
+ // XXX none yet.
+ // Renamed new names:
+ { "BINOM.DIST.RANGE", ocB }, // B -> BINOM.DIST.RANGE
+ { "LEGACY.TDIST", ocTDist } // TDIST -> LEGACY.TDIST
+};
+static const size_t nOdffAliases = sizeof(aOdffAliases) / sizeof(aOdffAliases[0]);
+
static const sal_Char* pInternal[ 1 ] = { "TTT" };
using namespace ::com::sun::star::i18n;
@@ -2504,7 +2522,21 @@ BOOL ScCompiler::IsOpCode( const String& rName, bool bInArray )
aToken.SetOpCode(eOp);
pRawToken = aToken.Clone();
}
- else
+ else if (mxSymbols->isODFF())
+ {
+ for (size_t i=0; i<nOdffAliases; ++i)
+ {
+ if (rName.EqualsIgnoreCaseAscii( aOdffAliases[i].pName))
+ {
+ ScRawToken aToken;
+ aToken.SetOpCode( aOdffAliases[i].eOp);
+ pRawToken = aToken.Clone();
+ bFound = TRUE;
+ break; // for
+ }
+ }
+ }
+ if (!bFound)
{
String aIntName;
if (mxSymbols->hasExternals())
@@ -2887,6 +2919,7 @@ BOOL ScCompiler::IsReference( const String& rName )
BOOL ScCompiler::IsMacro( const String& rName )
{
+ String aName( rName);
StarBASIC* pObj = 0;
SfxObjectShell* pDocSh = pDoc->GetDocumentShell();
@@ -2898,7 +2931,14 @@ BOOL ScCompiler::IsMacro( const String& rName )
else
pObj = pSfxApp->GetBasic();
- SbxMethod* pMeth = (SbxMethod*) pObj->Find( rName, SbxCLASS_METHOD );
+ // ODFF recommends to store user-defined functions prefixed with "USER.",
+ // use only unprefixed name if encountered. BASIC doesn't allow '.' in a
+ // function name so a function "USER.FOO" could not exist, and macro check
+ // is assigned the lowest priority in function name check.
+ if (FormulaGrammar::isODFF( GetGrammar()) && aName.EqualsIgnoreCaseAscii( "USER.", 0, 5))
+ aName.Erase( 0, 5);
+
+ SbxMethod* pMeth = (SbxMethod*) pObj->Find( aName, SbxCLASS_METHOD );
if( !pMeth )
{
pSfxApp->LeaveBasicCall();
@@ -2913,7 +2953,7 @@ BOOL ScCompiler::IsMacro( const String& rName )
return FALSE;
}
ScRawToken aToken;
- aToken.SetExternal( rName.GetBuffer() );
+ aToken.SetExternal( aName.GetBuffer() );
aToken.eOp = ocMacro;
pRawToken = aToken.Clone();
pSfxApp->LeaveBasicCall();
diff --git a/sc/source/filter/xml/xmldpimp.cxx b/sc/source/filter/xml/xmldpimp.cxx
index f54d78b83..d9b1f6b4e 100644
--- a/sc/source/filter/xml/xmldpimp.cxx
+++ b/sc/source/filter/xml/xmldpimp.cxx
@@ -464,6 +464,11 @@ void ScXMLDataPilotTableContext::EndElement()
if (pDoc)
{
ScDPCollection* pDPCollection = pDoc->GetDPCollection();
+
+ // #i94570# Names have to be unique, or the tables can't be accessed by API.
+ if ( pDPCollection->GetByName(pDPObject->GetName()) )
+ pDPObject->SetName( String() ); // ignore the invalid name, create a new name in AfterXMLLoading
+
pDPObject->SetAlive(sal_True);
pDPCollection->InsertNewTable(pDPObject);
}
diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx
index ffdc51ebd..8bf9bc977 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -3080,32 +3080,69 @@ void ScXMLExport::ExportShape(const uno::Reference < drawing::XShape >& xShape,
if ( sCLSID.equalsIgnoreAsciiCase(GetChartExport()->getChartCLSID()) )
{
// we have a chart
- uno::Reference< frame::XModel > xChartModel;
- if( ( xShapeProps->getPropertyValue( sPropModel ) >>= xChartModel ) &&
- xChartModel.is())
+ ::rtl::OUString sRanges;
+ if ( pDoc )
{
- uno::Reference< chart2::XChartDocument > xChartDoc( xChartModel, uno::UNO_QUERY );
- uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartModel, uno::UNO_QUERY );
- if( xChartDoc.is() && xReceiver.is() &&
- ! xChartDoc->hasInternalDataProvider())
+ ::rtl::OUString aChartName;
+ xShapeProps->getPropertyValue( sPersistName ) >>= aChartName;
+ ScRange aEmptyRange;
+ ScChartListener aSearcher( aChartName, pDoc, aEmptyRange );
+ USHORT nIndex = 0;
+ ScChartListenerCollection* pCollection = pDoc->GetChartListenerCollection();
+ if ( pCollection && pCollection->Search( &aSearcher, nIndex ) )
{
- // we have a chart that gets its data from Calc
- bIsChart = true;
- uno::Sequence< ::rtl::OUString > aRepresentations(
- xReceiver->getUsedRangeRepresentations());
- SvXMLAttributeList* pAttrList = 0;
- if(aRepresentations.getLength())
+ ScChartListener* pListener = static_cast< ScChartListener* >( pCollection->At( nIndex ) );
+ if ( pListener )
{
- // add the ranges used by the chart to the shape
- // element to be able to start listening after
- // load (when the chart is not yet loaded)
- uno::Reference< chart2::data::XRangeXMLConversion > xRangeConverter( xChartDoc->getDataProvider(), uno::UNO_QUERY );
- ::rtl::OUString sRanges( lcl_RangeSequenceToString( aRepresentations, xRangeConverter ));
- pAttrList = new SvXMLAttributeList();
- pAttrList->AddAttribute(
- GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DRAW, GetXMLToken(XML_NOTIFY_ON_UPDATE_OF_RANGES) ), sRanges );
+ const ScRangeListRef& rRangeList = pListener->GetRangeList();
+ if ( rRangeList.Is() )
+ {
+ ScRangeStringConverter::GetStringFromRangeList( sRanges, rRangeList, pDoc, FormulaGrammar::CONV_OOO );
+ if ( sRanges.getLength() > 0 )
+ {
+ bIsChart = true;
+ SvXMLAttributeList* pAttrList = new SvXMLAttributeList();
+ if ( pAttrList )
+ {
+ pAttrList->AddAttribute(
+ GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DRAW, GetXMLToken( XML_NOTIFY_ON_UPDATE_OF_RANGES ) ), sRanges );
+ }
+ GetShapeExport()->exportShape( xShape, SEF_EXPORT_NO_CHART_DATA | SEF_DEFAULT, pPoint, pAttrList );
+ }
+ }
+ }
+ }
+ }
+
+ if ( sRanges.getLength() == 0 )
+ {
+ uno::Reference< frame::XModel > xChartModel;
+ if( ( xShapeProps->getPropertyValue( sPropModel ) >>= xChartModel ) &&
+ xChartModel.is())
+ {
+ uno::Reference< chart2::XChartDocument > xChartDoc( xChartModel, uno::UNO_QUERY );
+ uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartModel, uno::UNO_QUERY );
+ if( xChartDoc.is() && xReceiver.is() &&
+ ! xChartDoc->hasInternalDataProvider())
+ {
+ // we have a chart that gets its data from Calc
+ bIsChart = true;
+ uno::Sequence< ::rtl::OUString > aRepresentations(
+ xReceiver->getUsedRangeRepresentations());
+ SvXMLAttributeList* pAttrList = 0;
+ if(aRepresentations.getLength())
+ {
+ // add the ranges used by the chart to the shape
+ // element to be able to start listening after
+ // load (when the chart is not yet loaded)
+ uno::Reference< chart2::data::XRangeXMLConversion > xRangeConverter( xChartDoc->getDataProvider(), uno::UNO_QUERY );
+ sRanges = lcl_RangeSequenceToString( aRepresentations, xRangeConverter );
+ pAttrList = new SvXMLAttributeList();
+ pAttrList->AddAttribute(
+ GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DRAW, GetXMLToken(XML_NOTIFY_ON_UPDATE_OF_RANGES) ), sRanges );
+ }
+ GetShapeExport()->exportShape(xShape, SEF_EXPORT_NO_CHART_DATA | SEF_DEFAULT, pPoint, pAttrList);
}
- GetShapeExport()->exportShape(xShape, SEF_EXPORT_NO_CHART_DATA | SEF_DEFAULT, pPoint, pAttrList);
}
}
diff --git a/sc/source/ui/dbgui/asciiopt.cxx b/sc/source/ui/dbgui/asciiopt.cxx
index 9f48f794d..54bc80746 100644
--- a/sc/source/ui/dbgui/asciiopt.cxx
+++ b/sc/source/ui/dbgui/asciiopt.cxx
@@ -253,20 +253,13 @@ void ScAsciiOptions::ReadFromString( const String& rString )
eCharSet = ScGlobal::GetCharsetValue( aToken );
}
- // Language
- if (nCount >= 4)
- {
- aToken = rString.GetToken(3, ',');
- eLang = static_cast<LanguageType>(aToken.ToInt32());
- }
-
//
// Startzeile
//
- if ( nCount >= 5 )
+ if ( nCount >= 4 )
{
- aToken = rString.GetToken(4,',');
+ aToken = rString.GetToken(3,',');
nStartRow = aToken.ToInt32();
}
@@ -274,12 +267,12 @@ void ScAsciiOptions::ReadFromString( const String& rString )
// Spalten-Infos
//
- if ( nCount >= 6 )
+ if ( nCount >= 5 )
{
delete[] pColStart;
delete[] pColFormat;
- aToken = rString.GetToken(5,',');
+ aToken = rString.GetToken(4,',');
nSub = aToken.GetTokenCount('/');
nInfoCount = nSub / 2;
if (nInfoCount)
@@ -299,6 +292,13 @@ void ScAsciiOptions::ReadFromString( const String& rString )
}
}
+ // Language
+ if (nCount >= 6)
+ {
+ aToken = rString.GetToken(5, ',');
+ eLang = static_cast<LanguageType>(aToken.ToInt32());
+ }
+
// Import quoted field as text.
if (nCount >= 7)
{
@@ -362,10 +362,6 @@ String ScAsciiOptions::WriteToString() const
aOutStr += ScGlobal::GetCharsetString( eCharSet );
aOutStr += ','; // Token-Ende
- // Language
- aOutStr += String::CreateFromInt32(eLang);
- aOutStr += ',';
-
//
// Startzeile
//
@@ -387,6 +383,13 @@ String ScAsciiOptions::WriteToString() const
aOutStr += String::CreateFromInt32(pColFormat[nInfo]);
}
+ // #i112025# the options string is used in macros and linked sheets,
+ // so new options must be added at the end, to remain compatible
+
+ aOutStr += ',';
+
+ // Language
+ aOutStr += String::CreateFromInt32(eLang);
aOutStr += ',';
// Import quoted field as text.
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 26db03cf8..ca09bc8ec 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -1278,6 +1278,13 @@ BOOL ScDBDocFunc::DataPilotUpdate( ScDPObject* pOldObj, const ScDPObject* pNewOb
// output range must be set at pNewObj
pDestObj = new ScDPObject( *pNewObj );
+
+ // #i94570# When changing the output position in the dialog, a new table is created
+ // with the settings from the old table, including the name.
+ // So we have to check for duplicate names here (before inserting).
+ if ( pDoc->GetDPCollection()->GetByName(pDestObj->GetName()) )
+ pDestObj->SetName( String() ); // ignore the invalid name, create a new name below
+
pDestObj->SetAlive(TRUE);
if ( !pDoc->GetDPCollection()->InsertNewTable(pDestObj) )
{
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 6acda987d..f61d40b43 100755
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -69,6 +69,9 @@
#include "chgviset.hxx"
#include <sfx2/request.hxx>
#include <com/sun/star/document/UpdateDocMode.hpp>
+#include <com/sun/star/container/XContentEnumerationAccess.hpp>
+#include <com/sun/star/sheet/XSpreadsheetView.hpp>
+#include <com/sun/star/task/XJob.hpp>
#include "scabstdlg.hxx" //CHINA001
@@ -352,6 +355,20 @@ void ScDocShell::AfterXMLLoading(sal_Bool bRet)
// else; nothing has to happen, because it is a user given name
}
}
+
+ // #i94570# DataPilot table names have to be unique, or the tables can't be accessed by API.
+ // If no name (or an invalid name, skipped in ScXMLDataPilotTableContext::EndElement) was set, create a new name.
+ ScDPCollection* pDPCollection = aDocument.GetDPCollection();
+ if ( pDPCollection )
+ {
+ USHORT nDPCount = pDPCollection->GetCount();
+ for (USHORT nDP=0; nDP<nDPCount; nDP++)
+ {
+ ScDPObject* pDPObj = (*pDPCollection)[nDP];
+ if ( !pDPObj->GetName().Len() )
+ pDPObj->SetName( pDPCollection->CreateNewName() );
+ }
+ }
}
ScColumn::bDoubleAlloc = sal_False;
}
@@ -458,7 +475,7 @@ BOOL __EXPORT ScDocShell::Load( SfxMedium& rMedium )
// only the latin script language is loaded
// -> initialize the others from options (before loading)
- InitOptions();
+ InitOptions(true);
GetUndoManager()->Clear();
@@ -582,6 +599,46 @@ void __EXPORT ScDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint )
}
}
}
+
+ try
+ {
+ uno::Reference< uno::XComponentContext > xContext;
+ uno::Reference< lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
+ uno::Reference< beans::XPropertySet > xProp( xServiceManager, uno::UNO_QUERY_THROW );
+ xProp->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ) >>= xContext;
+ if ( xContext.is() )
+ {
+ uno::Reference< container::XContentEnumerationAccess > xEnumAccess( xServiceManager, uno::UNO_QUERY_THROW );
+ uno::Reference< container::XEnumeration> xEnum = xEnumAccess->createContentEnumeration(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.SpreadsheetDocumentJob" ) ) );
+ if ( xEnum.is() )
+ {
+ while ( xEnum->hasMoreElements() )
+ {
+ uno::Any aAny = xEnum->nextElement();
+ uno::Reference< lang::XSingleComponentFactory > xFactory;
+ aAny >>= xFactory;
+ if ( xFactory.is() )
+ {
+ uno::Reference< task::XJob > xJob( xFactory->createInstanceWithContext( xContext ), uno::UNO_QUERY_THROW );
+ uno::Sequence< beans::NamedValue > aArgsForJob(1);
+ ScViewData* pViewData = GetViewData();
+ SfxViewShell* pViewShell = ( pViewData ? pViewData->GetViewShell() : NULL );
+ SfxViewFrame* pViewFrame = ( pViewShell ? pViewShell->GetViewFrame() : NULL );
+ SfxFrame* pFrame = ( pViewFrame ? &pViewFrame->GetFrame() : NULL );
+ uno::Reference< frame::XController > xController = ( pFrame ? pFrame->GetController() : 0 );
+ uno::Reference< sheet::XSpreadsheetView > xSpreadsheetView( xController, uno::UNO_QUERY_THROW );
+ aArgsForJob[0] = beans::NamedValue( ::rtl::OUString::createFromAscii( "SpreadsheetView" ),
+ uno::makeAny( xSpreadsheetView ) );
+ xJob->execute( aArgsForJob );
+ }
+ }
+ }
+ }
+ }
+ catch ( uno::Exception & )
+ {
+ }
}
break;
case SFX_EVENT_SAVEDOC:
diff --git a/sc/source/ui/docshell/docsh2.cxx b/sc/source/ui/docshell/docsh2.cxx
index a15935128..33bd6fbb1 100644
--- a/sc/source/ui/docshell/docsh2.cxx
+++ b/sc/source/ui/docshell/docsh2.cxx
@@ -93,7 +93,7 @@ BOOL __EXPORT ScDocShell::InitNew( const uno::Reference < embed::XStorage >& xSt
aDocument.SetDrawDefaults(); // drawing layer defaults that are set only in InitNew
// InitOptions sets the document languages, must be called before CreateStandardStyles
- InitOptions();
+ InitOptions(false);
aDocument.GetStyleSheetPool()->CreateStandardStyles();
aDocument.UpdStlShtPtrsFrmNms();
diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx
index 5b2a323cd..2567408bb 100644
--- a/sc/source/ui/docshell/docsh3.cxx
+++ b/sc/source/ui/docshell/docsh3.cxx
@@ -424,7 +424,7 @@ double ScDocShell::GetOutputFactor() const
//---------------------------------------------------------------------
-void ScDocShell::InitOptions() // Fortsetzung von InitNew (CLOOKs)
+void ScDocShell::InitOptions(bool bForLoading) // called from InitNew and Load
{
// Einstellungen aus dem SpellCheckCfg kommen in Doc- und ViewOptions
@@ -440,6 +440,14 @@ void ScDocShell::InitOptions() // Fortsetzung von InitNew (CLOOKs)
// zweistellige Jahreszahleneingabe aus Extras->Optionen->Allgemein->Sonstiges
aDocOpt.SetYear2000( sal::static_int_cast<USHORT>( ::utl::MiscCfg().GetYear2000() ) );
+ if (bForLoading)
+ {
+ // #i112123# No style:decimal-places attribute means automatic decimals, not the configured default,
+ // so it must not be taken from the global options.
+ // Calculation settings are handled separately in ScXMLBodyContext::EndElement.
+ aDocOpt.SetStdPrecision( SvNumberFormatter::UNLIMITED_PRECISION );
+ }
+
aDocument.SetDocOptions( aDocOpt );
aDocument.SetViewOptions( aViewOpt );
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index fe8cf6fba..9a6c09c79 100755
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -125,7 +125,7 @@ class SC_DLLPUBLIC ScDocShell: public SfxObjectShell, public SfxListener
SC_DLLPRIVATE void InitItems();
SC_DLLPRIVATE void DoEnterHandler();
- SC_DLLPRIVATE void InitOptions();
+ SC_DLLPRIVATE void InitOptions(bool bForLoading);
SC_DLLPRIVATE void ResetDrawObjectShell();
// SUNWS needs a forward declared friend, otherwise types and members
diff --git a/sc/source/ui/unoobj/chartuno.cxx b/sc/source/ui/unoobj/chartuno.cxx
index 05bdead0e..b64834b6b 100644
--- a/sc/source/ui/unoobj/chartuno.cxx
+++ b/sc/source/ui/unoobj/chartuno.cxx
@@ -31,10 +31,12 @@
#include <com/sun/star/embed/Aspects.hpp>
#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/chart2/data/XDataReceiver.hpp>
#include <com/sun/star/chart/ChartDataRowSource.hpp>
#include <com/sun/star/chart2/XChartDocument.hpp>
#include <com/sun/star/embed/Aspects.hpp>
+#include <com/sun/star/table/CellRangeAddress.hpp>
#include <svx/svditer.hxx>
#include <svx/svdoole2.hxx>
@@ -54,9 +56,12 @@
#include "chartlis.hxx"
#include "unoguard.hxx"
#include "chart2uno.hxx"
+#include "convuno.hxx"
using namespace com::sun::star;
+#define PROP_HANDLE_RELATED_CELLRANGES 1
+
//------------------------------------------------------------------------
SC_SIMPLE_SERVICE_INFO( ScChartObj, "ScChartObj", "com.sun.star.table.TableChart" )
@@ -451,12 +456,19 @@ sal_Bool SAL_CALL ScChartsObj::hasByName( const rtl::OUString& aName )
//------------------------------------------------------------------------
-ScChartObj::ScChartObj(ScDocShell* pDocSh, SCTAB nT, const String& rN) :
- pDocShell( pDocSh ),
- nTab( nT ),
- aChartName( rN )
+ScChartObj::ScChartObj(ScDocShell* pDocSh, SCTAB nT, const String& rN)
+ :ScChartObj_Base( m_aMutex )
+ ,ScChartObj_PBase( ScChartObj_Base::rBHelper )
+ ,pDocShell( pDocSh )
+ ,nTab( nT )
+ ,aChartName( rN )
{
pDocShell->GetDocument()->AddUnoObject(*this);
+
+ uno::Sequence< table::CellRangeAddress > aInitialPropValue;
+ registerPropertyNoMember( ::rtl::OUString::createFromAscii( "RelatedCellRanges" ),
+ PROP_HANDLE_RELATED_CELLRANGES, beans::PropertyAttribute::MAYBEVOID,
+ ::getCppuType( &aInitialPropValue ), &aInitialPropValue );
}
ScChartObj::~ScChartObj()
@@ -552,6 +564,117 @@ void ScChartObj::Update_Impl( const ScRangeListRef& rRanges, bool bColHeaders, b
}
}
+// ::comphelper::OPropertySetHelper
+
+::cppu::IPropertyArrayHelper& ScChartObj::getInfoHelper()
+{
+ return *ScChartObj_PABase::getArrayHelper();
+}
+
+void ScChartObj::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const uno::Any& rValue ) throw (uno::Exception)
+{
+ switch ( nHandle )
+ {
+ case PROP_HANDLE_RELATED_CELLRANGES:
+ {
+ uno::Sequence< table::CellRangeAddress > aCellRanges;
+ if ( rValue >>= aCellRanges )
+ {
+ ScRangeListRef rRangeList = new ScRangeList();
+ const table::CellRangeAddress* pCellRanges = aCellRanges.getArray();
+ sal_Int32 nCount = aCellRanges.getLength();
+ for ( sal_Int32 i = 0; i < nCount; ++i )
+ {
+ table::CellRangeAddress aCellRange = pCellRanges[ i ];
+ ScRange aRange;
+ ScUnoConversion::FillScRange( aRange, aCellRange );
+ rRangeList->Append( aRange );
+ }
+ ScDocument* pDoc = ( pDocShell ? pDocShell->GetDocument() : NULL );
+ ScChartListenerCollection* pCollection = ( pDoc ? pDoc->GetChartListenerCollection() : NULL );
+ if ( pCollection )
+ {
+ pCollection->ChangeListening( aChartName, rRangeList );
+ }
+ }
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+}
+
+void ScChartObj::getFastPropertyValue( uno::Any& rValue, sal_Int32 nHandle ) const
+{
+ switch ( nHandle )
+ {
+ case PROP_HANDLE_RELATED_CELLRANGES:
+ {
+ ScDocument* pDoc = ( pDocShell ? pDocShell->GetDocument() : NULL );
+ if ( pDoc )
+ {
+ ScRange aEmptyRange;
+ USHORT nIndex = 0;
+ ScChartListener aSearcher( aChartName, pDoc, aEmptyRange );
+ ScChartListenerCollection* pCollection = pDoc->GetChartListenerCollection();
+ if ( pCollection && pCollection->Search( &aSearcher, nIndex ) )
+ {
+ ScChartListener* pListener = static_cast< ScChartListener* >( pCollection->At( nIndex ) );
+ if ( pListener )
+ {
+ const ScRangeListRef& rRangeList = pListener->GetRangeList();
+ if ( rRangeList.Is() )
+ {
+ ULONG nCount = rRangeList->Count();
+ uno::Sequence< table::CellRangeAddress > aCellRanges( nCount );
+ table::CellRangeAddress* pCellRanges = aCellRanges.getArray();
+ for ( USHORT i = 0; i < nCount; ++i )
+ {
+ ScRange aRange( *rRangeList->GetObject( i ) );
+ table::CellRangeAddress aCellRange;
+ ScUnoConversion::FillApiRange( aCellRange, aRange );
+ pCellRanges[ i ] = aCellRange;
+ }
+ rValue <<= aCellRanges;
+ }
+ }
+ }
+ }
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+}
+
+// ::comphelper::OPropertyArrayUsageHelper
+
+::cppu::IPropertyArrayHelper* ScChartObj::createArrayHelper() const
+{
+ uno::Sequence< beans::Property > aProps;
+ describeProperties( aProps );
+ return new ::cppu::OPropertyArrayHelper( aProps );
+}
+
+// XInterface
+
+IMPLEMENT_FORWARD_XINTERFACE2( ScChartObj, ScChartObj_Base, ScChartObj_PBase )
+
+// XTypeProvider
+
+IMPLEMENT_FORWARD_XTYPEPROVIDER2( ScChartObj, ScChartObj_Base, ScChartObj_PBase )
+
+// XComponent
+
+void ScChartObj::disposing()
+{
+ ScChartObj_Base::disposing();
+}
+
// XTableChart
sal_Bool SAL_CALL ScChartObj::getHasColumnHeaders() throw(uno::RuntimeException)
@@ -681,6 +804,13 @@ void SAL_CALL ScChartObj::setName( const rtl::OUString& /* aName */ ) throw(uno:
throw uno::RuntimeException(); // name cannot be changed
}
+// XPropertySet
+
+uno::Reference< beans::XPropertySetInfo > ScChartObj::getPropertySetInfo() throw (uno::RuntimeException)
+{
+ return createPropertySetInfo( getInfoHelper() ) ;
+}
+
//------------------------------------------------------------------------
diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx
index 6f4b1cd79..7e9518f97 100755
--- a/sc/source/ui/view/dbfunc3.cxx
+++ b/sc/source/ui/view/dbfunc3.cxx
@@ -694,6 +694,9 @@ ULONG RefreshDPObject( ScDPObject *pDPObj, ScDocument *pDoc, ScDocShell *pDocSh,
if( !pDPObj )
return STR_PIVOT_NOTFOUND;
+ if ( pDocSh && !pDoc )
+ pDoc = pDocSh->GetDocument();
+
if( !pDoc )
return static_cast<ULONG>(-1);
diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx
index 13c404fba..5009443b8 100644
--- a/sc/source/ui/view/output2.cxx
+++ b/sc/source/ui/view/output2.cxx
@@ -114,6 +114,7 @@ class ScDrawStringsVars
long nMaxDigitWidth;
long nSignWidth;
long nDotWidth;
+ long nExpWidth;
ScBaseCell* pLastCell;
ULONG nValueFormat;
@@ -173,6 +174,7 @@ private:
long GetMaxDigitWidth();
long GetSignWidth();
long GetDotWidth();
+ long GetExpWidth();
void TextChanged();
long ConvertWidthLogicToPixel( long nWidth ) const;
};
@@ -193,6 +195,7 @@ ScDrawStringsVars::ScDrawStringsVars(ScOutputData* pData, BOOL bPTL) :
nMaxDigitWidth( 0 ),
nSignWidth( 0 ),
nDotWidth( 0 ),
+ nExpWidth( 0 ),
pLastCell ( NULL ),
nValueFormat( 0 ),
bLineBreak ( FALSE ),
@@ -262,6 +265,7 @@ void ScDrawStringsVars::SetPattern( const ScPatternAttr* pNew, const SfxItemSet*
nMaxDigitWidth = 0;
nSignWidth = 0;
nDotWidth = 0;
+ nExpWidth = 0;
pPattern = pNew;
pCondSet = pSet;
@@ -417,6 +421,7 @@ void ScDrawStringsVars::SetPatternSimple( const ScPatternAttr* pNew, const SfxIt
nMaxDigitWidth = 0;
nSignWidth = 0;
nDotWidth = 0;
+ nExpWidth = 0;
// wird gerufen, wenn sich die Font-Variablen nicht aendern (!StringDiffer)
pPattern = pNew;
@@ -547,7 +552,7 @@ void ScDrawStringsVars::SetTextToWidthOrHash( ScBaseCell* pCell, long nWidth )
// Failed to get output string. Bail out.
return;
- sal_uInt8 nSignCount = 0, nDecimalCount = 0;
+ sal_uInt8 nSignCount = 0, nDecimalCount = 0, nExpCount = 0;
xub_StrLen nLen = aString.Len();
sal_Unicode cDecSep = ScGlobal::GetpLocaleData()->getLocaleItem().decimalSeparator.getStr()[0];
for (xub_StrLen i = 0; i < nLen; ++i)
@@ -557,13 +562,17 @@ void ScDrawStringsVars::SetTextToWidthOrHash( ScBaseCell* pCell, long nWidth )
++nSignCount;
else if (c == cDecSep)
++nDecimalCount;
+ else if (c == sal_Unicode('E'))
+ ++nExpCount;
}
if (nDecimalCount)
nWidth += (nMaxDigit - GetDotWidth()) * nDecimalCount;
if (nSignCount)
nWidth += (nMaxDigit - GetSignWidth()) * nSignCount;
+ if (nExpCount)
+ nWidth += (nMaxDigit - GetExpWidth()) * nExpCount;
- if (nDecimalCount || nSignCount)
+ if (nDecimalCount || nSignCount || nExpCount)
{
// Re-calculate.
nNumDigits = static_cast<sal_uInt16>(nWidth / nMaxDigit);
@@ -658,6 +667,17 @@ long ScDrawStringsVars::GetDotWidth()
return nDotWidth;
}
+long ScDrawStringsVars::GetExpWidth()
+{
+ if (nExpWidth > 0)
+ return nExpWidth;
+
+ nExpWidth = pOutput->pFmtDevice->GetTextWidth(String('E'));
+ if (bPixelToLogic)
+ nExpWidth = ConvertWidthLogicToPixel(nExpWidth);
+ return nExpWidth;
+}
+
void ScDrawStringsVars::TextChanged()
{
OutputDevice* pRefDevice = pOutput->pRefDevice;
diff --git a/scaddins/source/analysis/analysis.cxx b/scaddins/source/analysis/analysis.cxx
index 4d64df831..78de6abe0 100644
--- a/scaddins/source/analysis/analysis.cxx
+++ b/scaddins/source/analysis/analysis.cxx
@@ -915,21 +915,21 @@ double SAL_CALL AnalysisAddIn::getLcm( constREFXPS& xOpt, const SEQSEQ( double )
}
-double SAL_CALL AnalysisAddIn::getBesseli( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE
+double SAL_CALL AnalysisAddIn::getBesseli( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE
{
double fRet = sca::analysis::BesselI( fNum, nOrder );
RETURN_FINITE( fRet );
}
-double SAL_CALL AnalysisAddIn::getBesselj( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE
+double SAL_CALL AnalysisAddIn::getBesselj( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE
{
double fRet = sca::analysis::BesselJ( fNum, nOrder );
RETURN_FINITE( fRet );
}
-double SAL_CALL AnalysisAddIn::getBesselk( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE
+double SAL_CALL AnalysisAddIn::getBesselk( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE
{
if( nOrder < 0 || fNum <= 0.0 )
THROW_IAE;
@@ -939,7 +939,7 @@ double SAL_CALL AnalysisAddIn::getBesselk( double fNum, sal_Int32 nOrder ) THROW
}
-double SAL_CALL AnalysisAddIn::getBessely( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE
+double SAL_CALL AnalysisAddIn::getBessely( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE
{
if( nOrder < 0 || fNum <= 0.0 )
THROW_IAE;
diff --git a/scaddins/source/analysis/analysis.hxx b/scaddins/source/analysis/analysis.hxx
index 90ca693f1..17a56f81b 100644
--- a/scaddins/source/analysis/analysis.hxx
+++ b/scaddins/source/analysis/analysis.hxx
@@ -36,6 +36,7 @@
#include <com/sun/star/sheet/addin/XAnalysis.hpp>
#include <com/sun/star/sheet/LocalizedName.hpp>
#include <com/sun/star/sheet/XCompatibilityNames.hpp>
+#include <com/sun/star/sheet/NoConvergenceException.hpp>
#include <cppuhelper/implbase5.hxx> // helper for implementations
@@ -143,10 +144,10 @@ public:
virtual double SAL_CALL getGcd( constREFXPS& xOpt, const SEQSEQ( double )& aVLst, const SEQ( ANY )& aOptVLst ) THROWDEF_RTE_IAE;
virtual double SAL_CALL getLcm( constREFXPS& xOpt, const SEQSEQ( double )& aVLst, const SEQ( ANY )& aOptVLst ) THROWDEF_RTE_IAE;
- virtual double SAL_CALL getBesseli( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE;
- virtual double SAL_CALL getBesselj( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE;
- virtual double SAL_CALL getBesselk( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE;
- virtual double SAL_CALL getBessely( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE;
+ virtual double SAL_CALL getBesseli( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE;
+ virtual double SAL_CALL getBesselj( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE;
+ virtual double SAL_CALL getBesselk( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE;
+ virtual double SAL_CALL getBessely( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE;
virtual STRING SAL_CALL getBin2Oct( constREFXPS& xOpt, const STRING& aNum, const ANY& rPlaces ) THROWDEF_RTE_IAE;
virtual double SAL_CALL getBin2Dec( const STRING& aNum ) THROWDEF_RTE_IAE;
diff --git a/scaddins/source/analysis/analysisadd.idl b/scaddins/source/analysis/analysisadd.idl
index b9a40ac22..32a94f75d 100644
--- a/scaddins/source/analysis/analysisadd.idl
+++ b/scaddins/source/analysis/analysisadd.idl
@@ -25,6 +25,9 @@
*
************************************************************************/
+#ifndef __com_sun_star_sheet_NoConvergenceException_idl__
+#include <com/sun/star/sheet/NoConvergenceException.idl>
+#endif
#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/beans/XPropertySet.idl>
@@ -145,19 +148,23 @@ module addin
/// besseli.
double getBesseli( [in] double Num, [in] long Order )
- raises( com::sun::star::lang::IllegalArgumentException );
+ raises( com::sun::star::lang::IllegalArgumentException,
+ com::sun::star::sheet::NoConvergenceException );
/// besselj.
double getBesselj( [in] double Num, [in] long Order )
- raises( com::sun::star::lang::IllegalArgumentException );
+ raises( com::sun::star::lang::IllegalArgumentException,
+ com::sun::star::sheet::NoConvergenceException );
/// besselk.
double getBesselk( [in] double Num, [in] long Order )
- raises( com::sun::star::lang::IllegalArgumentException );
+ raises( com::sun::star::lang::IllegalArgumentException,
+ com::sun::star::sheet::NoConvergenceException );
/// bessely.
double getBessely( [in] double Num, [in] long Order )
- raises( com::sun::star::lang::IllegalArgumentException );
+ raises( com::sun::star::lang::IllegalArgumentException,
+ com::sun::star::sheet::NoConvergenceException );
/// bin2oct.
string getBin2Oct(
diff --git a/scaddins/source/analysis/analysisdefs.hxx b/scaddins/source/analysis/analysisdefs.hxx
index 5645ef050..0b9bf2d43 100644
--- a/scaddins/source/analysis/analysisdefs.hxx
+++ b/scaddins/source/analysis/analysisdefs.hxx
@@ -44,6 +44,8 @@
#define THROW_RTE throw CSS::uno::RuntimeException()
#define THROWDEF_RTE_IAE throw(CSS::uno::RuntimeException,CSS::lang::IllegalArgumentException)
#define THROW_IAE throw CSS::lang::IllegalArgumentException()
+#define THROWDEF_RTE_IAE_NCE throw(CSS::uno::RuntimeException,CSS::lang::IllegalArgumentException,CSS::sheet::NoConvergenceException)
+#define THROW_NCE throw CSS::sheet::NoConvergenceException()
#define CHK_Freq ( nFreq != 1 && nFreq != 2 && nFreq != 4 )
#define CHK_FINITE(d) if( !::rtl::math::isFinite( d ) ) THROW_IAE
diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx
index 77e5b57e8..bde1cdb8c 100644
--- a/scaddins/source/analysis/analysishelper.cxx
+++ b/scaddins/source/analysis/analysishelper.cxx
@@ -2530,8 +2530,8 @@ ConvertDataList::ConvertDataList( void )
NEWD( "ly3", 1.1810108125623799E-51, CDC_Volume ); // *** Cubic light-year
NEWD( "MTON", 1.4125866688595436E00, CDC_Volume ); // *** Measurement ton
NEWD( "tspm", 5.0000000000000000E02, CDC_Volume ); // *** Modern teaspoon
- NEWD( "uk_gal", 2.6411458333333333E-01, CDC_Volume ); // U.K. / Imperial gallon ??
- NEWD( "uk_qt", 1.0564583333333333E00, CDC_Volume ); // U.K. / Imperial quart ??
+ NEWD( "uk_gal", 2.199694619402070E-01, CDC_Volume ); // U.K. / Imperial gallon
+ NEWD( "uk_qt", 8.798778477608300E-01, CDC_Volume ); // U.K. / Imperial quart
// 1 Square Meter is...
NEWDP( "m2", 1.0000000000000000E00, CDC_Area ); // *** Square Meter
diff --git a/scaddins/source/analysis/bessel.cxx b/scaddins/source/analysis/bessel.cxx
index edadb9d37..2b5a8ec57 100644
--- a/scaddins/source/analysis/bessel.cxx
+++ b/scaddins/source/analysis/bessel.cxx
@@ -31,6 +31,7 @@
#include <rtl/math.hxx>
using ::com::sun::star::lang::IllegalArgumentException;
+using ::com::sun::star::sheet::NoConvergenceException;
namespace sca {
namespace analysis {
@@ -47,93 +48,129 @@ const double THRESHOLD = 30.0; // Threshold for usage of approximation form
const double MAXEPSILON = 1e-10; // Maximum epsilon for end of iteration.
const sal_Int32 MAXITER = 100; // Maximum number of iterations.
-
// ============================================================================
// BESSEL J
// ============================================================================
/* The BESSEL function, first kind, unmodified:
-
- inf (-1)^k (x/2)^(n+2k)
- J_n(x) = SUM TERM(n,k) with TERM(n,k) := ---------------------
- k=0 k! (n+k)!
-
- Approximation for the BESSEL function, first kind, unmodified, for great x:
-
- J_n(x) ~ sqrt( 2 / (PI x) ) cos( x - n PI/2 - PI/4 ) for x>=0.
- */
+ The algorithm follows
+ http://www.reference-global.com/isbn/978-3-11-020354-7
+ Numerical Mathematics 1 / Numerische Mathematik 1,
+ An algorithm-based introduction / Eine algorithmisch orientierte Einführung
+ Deuflhard, Peter; Hohmann, Andreas
+ Berlin, New York (Walter de Gruyter) 2008
+ 4. überarb. u. erw. Aufl. 2008
+ eBook ISBN: 978-3-11-020355-4
+ Chapter 6.3.2 , algorithm 6.24
+ The source is in German.
+ The BesselJ-function is a special case of the adjoint summation with
+ a_k = 2*(k-1)/x for k=1,...
+ b_k = -1, for all k, directly substituted
+ m_0=1, m_k=2 for k even, and m_k=0 for k odd, calculated on the fly
+ alpha_k=1 for k=N and alpha_k=0 otherwise
+*/
// ----------------------------------------------------------------------------
-double BesselJ( double x, sal_Int32 n ) throw( IllegalArgumentException )
+double BesselJ( double x, sal_Int32 N ) throw (IllegalArgumentException, NoConvergenceException)
+
{
- if( n < 0 )
+ if( N < 0 )
throw IllegalArgumentException();
-
- double fResult = 0.0;
- if( fabs( x ) <= THRESHOLD )
+ if (x==0.0)
+ return (N==0) ? 1.0 : 0.0;
+
+ /* The algorithm works only for x>0, therefore remember sign. BesselJ
+ with integer order N is an even function for even N (means J(-x)=J(x))
+ and an odd function for odd N (means J(-x)=-J(x)).*/
+ double fSign = (N % 2 == 1 && x < 0) ? -1.0 : 1.0;
+ double fX = fabs(x);
+
+ const double fMaxIteration = 9000000.0; //experimental, for to return in < 3 seconds
+ double fEstimateIteration = fX * 1.5 + N;
+ bool bAsymptoticPossible = pow(fX,0.4) > N;
+ if (fEstimateIteration > fMaxIteration)
{
- /* Start the iteration without TERM(n,0), which is set here.
-
- TERM(n,0) = (x/2)^n / n!
- */
- double fTerm = pow( x / 2.0, (double)n ) / Fak( n );
- sal_Int32 nK = 1; // Start the iteration with k=1.
- fResult = fTerm; // Start result with TERM(n,0).
-
- const double fSqrX = x * x / -4.0;
+ if (bAsymptoticPossible)
+ return fSign * sqrt(f_2_DIV_PI/fX)* cos(fX-N*f_PI_DIV_2-f_PI_DIV_4);
+ else
+ throw NoConvergenceException();
+ }
- do
+ double epsilon = 1.0e-15; // relative error
+ bool bHasfound = false;
+ double k= 0.0;
+ // e_{-1} = 0; e_0 = alpha_0 / b_2
+ double u ; // u_0 = e_0/f_0 = alpha_0/m_0 = alpha_0
+
+ // first used with k=1
+ double m_bar; // m_bar_k = m_k * f_bar_{k-1}
+ double g_bar; // g_bar_k = m_bar_k - a_{k+1} + g_{k-1}
+ double g_bar_delta_u; // g_bar_delta_u_k = f_bar_{k-1} * alpha_k
+ // - g_{k-1} * delta_u_{k-1} - m_bar_k * u_{k-1}
+ // f_{-1} = 0.0; f_0 = m_0 / b_2 = 1/(-1) = -1
+ double g = 0.0; // g_0= f_{-1} / f_0 = 0/(-1) = 0
+ double delta_u = 0.0; // dummy initialize, first used with * 0
+ double f_bar = -1.0; // f_bar_k = 1/f_k, but only used for k=0
+
+ if (N==0)
+ {
+ //k=0; alpha_0 = 1.0
+ u = 1.0; // u_0 = alpha_0
+ // k = 1.0; at least one step is necessary
+ // m_bar_k = m_k * f_bar_{k-1} ==> m_bar_1 = 0.0
+ g_bar_delta_u = 0.0; // alpha_k = 0.0, m_bar = 0.0; g= 0.0
+ g_bar = - 2.0/fX; // k = 1.0, g = 0.0
+ delta_u = g_bar_delta_u / g_bar;
+ u = u + delta_u ; // u_k = u_{k-1} + delta_u_k
+ g = -1.0 / g_bar; // g_k=b_{k+2}/g_bar_k
+ f_bar = f_bar * g; // f_bar_k = f_bar_{k-1}* g_k
+ k = 2.0;
+ // From now on all alpha_k = 0.0 and k > N+1
+ }
+ else
+ { // N >= 1 and alpha_k = 0.0 for k<N
+ u=0.0; // u_0 = alpha_0
+ for (k =1.0; k<= N-1; k = k + 1.0)
{
- /* Calculation of TERM(n,k) from TERM(n,k-1):
-
- (-1)^k (x/2)^(n+2k)
- TERM(n,k) = ---------------------
- k! (n+k)!
-
- (-1)(-1)^(k-1) (x/2)^2 (x/2)^(n+2(k-1))
- = -----------------------------------------
- k (k-1)! (n+k) (n+k-1)!
-
- -(x/2)^2 (-1)^(k-1) (x/2)^(n+2(k-1))
- = ---------- * -----------------------------
- k(n+k) (k-1)! (n+k-1)!
-
- -(x^2/4)
- = ---------- TERM(n,k-1)
- k(n+k)
- */
- fTerm *= fSqrX; // defined above as -(x^2/4)
- fTerm /= (nK * (nK + n));
- fResult += fTerm;
+ m_bar=2.0 * fmod(k-1.0, 2.0) * f_bar;
+ g_bar_delta_u = - g * delta_u - m_bar * u; // alpha_k = 0.0
+ g_bar = m_bar - 2.0*k/fX + g;
+ delta_u = g_bar_delta_u / g_bar;
+ u = u + delta_u;
+ g = -1.0/g_bar;
+ f_bar=f_bar * g;
}
- while( (fabs( fTerm ) > MAXEPSILON) && (++nK < MAXITER) );
+ // Step alpha_N = 1.0
+ m_bar=2.0 * fmod(k-1.0, 2.0) * f_bar;
+ g_bar_delta_u = f_bar - g * delta_u - m_bar * u; // alpha_k = 1.0
+ g_bar = m_bar - 2.0*k/fX + g;
+ delta_u = g_bar_delta_u / g_bar;
+ u = u + delta_u;
+ g = -1.0/g_bar;
+ f_bar = f_bar * g;
+ k = k + 1.0;
}
- else
+ // Loop until desired accuracy, always alpha_k = 0.0
+ do
{
- /* Approximation for the BESSEL function, first kind, unmodified:
-
- J_n(x) ~ sqrt( 2 / (PI x) ) cos( x - n PI/2 - PI/4 ) for x>=0.
-
- The BESSEL function J_n with n IN {0,2,4,...} is axially symmetric at
- x=0, means J_n(x) = J_n(-x). Therefore the approximation for x<0 is:
-
- J_n(x) = J_n(|x|) for x<0 and n IN {0,2,4,...}.
-
- The BESSEL function J_n with n IN {1,3,5,...} is point-symmetric at
- x=0, means J_n(x) = -J_n(-x). Therefore the approximation for x<0 is:
-
- J_n(x) = -J_n(|x|) for x<0 and n IN {1,3,5,...}.
- */
- double fXAbs = fabs( x );
- fResult = sqrt( f_2_DIV_PI / fXAbs ) * cos( fXAbs - n * f_PI_DIV_2 - f_PI_DIV_4 );
- if( (n & 1) && (x < 0.0) )
- fResult = -fResult;
+ m_bar = 2.0 * fmod(k-1.0, 2.0) * f_bar;
+ g_bar_delta_u = - g * delta_u - m_bar * u;
+ g_bar = m_bar - 2.0*k/fX + g;
+ delta_u = g_bar_delta_u / g_bar;
+ u = u + delta_u;
+ g = -1.0/g_bar;
+ f_bar = f_bar * g;
+ bHasfound = (fabs(delta_u)<=fabs(u)*epsilon);
+ k = k + 1.0;
}
- return fResult;
+ while (!bHasfound && k <= fMaxIteration);
+ if (bHasfound)
+ return u * fSign;
+ else
+ throw NoConvergenceException(); // unlikely to happen
}
-
// ============================================================================
// BESSEL I
// ============================================================================
@@ -151,7 +188,7 @@ double BesselJ( double x, sal_Int32 n ) throw( IllegalArgumentException )
// ----------------------------------------------------------------------------
-double BesselI( double x, sal_Int32 n ) throw( IllegalArgumentException )
+double BesselI( double x, sal_Int32 n ) throw( IllegalArgumentException, NoConvergenceException )
{
if( n < 0 )
throw IllegalArgumentException();
@@ -222,7 +259,7 @@ double BesselI( double x, sal_Int32 n ) throw( IllegalArgumentException )
// ============================================================================
-double Besselk0( double fNum ) throw( IllegalArgumentException )
+double Besselk0( double fNum ) throw( IllegalArgumentException, NoConvergenceException )
{
double fRet;
@@ -248,7 +285,7 @@ double Besselk0( double fNum ) throw( IllegalArgumentException )
}
-double Besselk1( double fNum ) throw( IllegalArgumentException )
+double Besselk1( double fNum ) throw( IllegalArgumentException, NoConvergenceException )
{
double fRet;
@@ -275,7 +312,7 @@ double Besselk1( double fNum ) throw( IllegalArgumentException )
}
-double BesselK( double fNum, sal_Int32 nOrder ) throw( IllegalArgumentException )
+double BesselK( double fNum, sal_Int32 nOrder ) throw( IllegalArgumentException, NoConvergenceException )
{
switch( nOrder )
{
@@ -301,99 +338,148 @@ double BesselK( double fNum, sal_Int32 nOrder ) throw( IllegalArgumentException
}
}
+// ============================================================================
+// BESSEL Y
+// ============================================================================
-double Bessely0( double fNum ) throw( IllegalArgumentException )
+/* The BESSEL function, second kind, unmodified:
+ The algorithm for order 0 and for order 1 follows
+ http://www.reference-global.com/isbn/978-3-11-020354-7
+ Numerical Mathematics 1 / Numerische Mathematik 1,
+ An algorithm-based introduction / Eine algorithmisch orientierte Einführung
+ Deuflhard, Peter; Hohmann, Andreas
+ Berlin, New York (Walter de Gruyter) 2008
+ 4. überarb. u. erw. Aufl. 2008
+ eBook ISBN: 978-3-11-020355-4
+ Chapter 6.3.2 , algorithm 6.24
+ The source is in German.
+ See #i31656# for a commented version of the implementation, attachment #desc6
+ http://www.openoffice.org/nonav/issues/showattachment.cgi/63609/Comments%20to%20the%20implementation%20of%20the%20Bessel%20functions.odt
+*/
+
+double Bessely0( double fX ) throw( IllegalArgumentException, NoConvergenceException )
{
- double fRet;
-
- if( fNum < 8.0 )
+ if (fX <= 0)
+ throw IllegalArgumentException();
+ const double fMaxIteration = 9000000.0; // should not be reached
+ if (fX > 5.0e+6) // iteration is not considerable better then approximation
+ return sqrt(1/f_PI/fX)
+ *(rtl::math::sin(fX)-rtl::math::cos(fX));
+ const double epsilon = 1.0e-15;
+ const double EulerGamma = 0.57721566490153286060;
+ double alpha = log(fX/2.0)+EulerGamma;
+ double u = alpha;
+
+ double k = 1.0;
+ double m_bar = 0.0;
+ double g_bar_delta_u = 0.0;
+ double g_bar = -2.0 / fX;
+ double delta_u = g_bar_delta_u / g_bar;
+ double g = -1.0/g_bar;
+ double f_bar = -1 * g;
+
+ double sign_alpha = 1.0;
+ double km1mod2;
+ bool bHasFound = false;
+ k = k + 1;
+ do
{
- double y = fNum * fNum;
-
- double f1 = -2957821389.0 + y * ( 7062834065.0 + y * ( -512359803.6 +
- y * ( 10879881.29 + y * ( -86327.92757 + y * 228.4622733 ) ) ) );
-
- double f2 = 40076544269.0 + y * ( 745249964.8 + y * ( 7189466.438 +
- y * ( 47447.26470 + y * ( 226.1030244 + y ) ) ) );
-
- fRet = f1 / f2 + 0.636619772 * BesselJ( fNum, 0 ) * log( fNum );
+ km1mod2 = fmod(k-1.0,2.0);
+ m_bar=(2.0*km1mod2) * f_bar;
+ if (km1mod2 == 0.0)
+ alpha = 0.0;
+ else
+ {
+ alpha = sign_alpha * (4.0/k);
+ sign_alpha = -sign_alpha;
+ }
+ g_bar_delta_u = f_bar * alpha - g * delta_u - m_bar * u;
+ g_bar = m_bar - (2.0*k)/fX + g;
+ delta_u = g_bar_delta_u / g_bar;
+ u = u+delta_u;
+ g = -1.0 / g_bar;
+ f_bar = f_bar*g;
+ bHasFound = (fabs(delta_u)<=fabs(u)*epsilon);
+ k=k+1;
}
+ while (!bHasFound && k<fMaxIteration);
+ if (bHasFound)
+ return u*f_2_DIV_PI;
else
- {
- double z = 8.0 / fNum;
- double y = z * z;
- double xx = fNum - 0.785398164;
-
- double f1 = 1.0 + y * ( -0.1098628627e-2 + y * ( 0.2734510407e-4 +
- y * ( -0.2073370639e-5 + y * 0.2093887211e-6 ) ) );
-
- double f2 = -0.1562499995e-1 + y * ( 0.1430488765e-3 +
- y * ( -0.6911147651e-5 + y * ( 0.7621095161e-6 +
- y * ( -0.934945152e-7 ) ) ) );
-
- fRet = sqrt( 0.636619772 / fNum ) * ( sin( xx ) * f1 + z * cos( xx ) * f2 );
- }
-
- return fRet;
+ throw NoConvergenceException(); // not likely to happen
}
-
-double Bessely1( double fNum ) throw( IllegalArgumentException )
+// See #i31656# for a commented version of this implementation, attachment #desc6
+// http://www.openoffice.org/nonav/issues/showattachment.cgi/63609/Comments%20to%20the%20implementation%20of%20the%20Bessel%20functions.odt
+double Bessely1( double fX ) throw( IllegalArgumentException, NoConvergenceException )
{
- double fRet;
-
- if( fNum < 8.0 )
+ if (fX <= 0)
+ throw IllegalArgumentException();
+ const double fMaxIteration = 9000000.0; // should not be reached
+ if (fX > 5.0e+6) // iteration is not considerable better then approximation
+ return - sqrt(1/f_PI/fX)
+ *(rtl::math::sin(fX)+rtl::math::cos(fX));
+ const double epsilon = 1.0e-15;
+ const double EulerGamma = 0.57721566490153286060;
+ double alpha = 1.0/fX;
+ double f_bar = -1.0;
+ double g = 0.0;
+ double u = alpha;
+ double k = 1.0;
+ double m_bar = 0.0;
+ alpha = 1.0 - EulerGamma - log(fX/2.0);
+ double g_bar_delta_u = -alpha;
+ double g_bar = -2.0 / fX;
+ double delta_u = g_bar_delta_u / g_bar;
+ u = u + delta_u;
+ g = -1.0/g_bar;
+ f_bar = f_bar * g;
+ double sign_alpha = -1.0;
+ double km1mod2; //will be (k-1) mod 2
+ double q; // will be (k-1) div 2
+ bool bHasFound = false;
+ k = k + 1.0;
+ do
{
- double y = fNum * fNum;
-
- double f1 = fNum * ( -0.4900604943e13 + y * ( 0.1275274390e13 +
- y * ( -0.5153438139e11 + y * ( 0.7349264551e9 +
- y * ( -0.4237922726e7 + y * 0.8511937935e4 ) ) ) ) );
-
- double f2 = 0.2499580570e14 + y * ( 0.4244419664e12 +
- y * ( 0.3733650367e10 + y * ( 0.2245904002e8 +
- y * ( 0.1020426050e6 + y * ( 0.3549632885e3 + y ) ) ) ) );
-
- fRet = f1 / f2 + 0.636619772 * ( BesselJ( fNum, 1 ) * log( fNum ) - 1.0 / fNum );
+ km1mod2 = fmod(k-1.0,2.0);
+ m_bar=(2.0*km1mod2) * f_bar;
+ q = (k-1.0)/2.0;
+ if (km1mod2 == 0.0) // k is odd
+ {
+ alpha = sign_alpha * (1.0/q + 1.0/(q+1.0));
+ sign_alpha = -sign_alpha;
+ }
+ else
+ alpha = 0.0;
+ g_bar_delta_u = f_bar * alpha - g * delta_u - m_bar * u;
+ g_bar = m_bar - (2.0*k)/fX + g;
+ delta_u = g_bar_delta_u / g_bar;
+ u = u+delta_u;
+ g = -1.0 / g_bar;
+ f_bar = f_bar*g;
+ bHasFound = (fabs(delta_u)<=fabs(u)*epsilon);
+ k=k+1;
}
+ while (!bHasFound && k<fMaxIteration);
+ if (bHasFound)
+ return -u*2.0/f_PI;
else
- {
-#if 0
- // #i12430# don't know the intention of this piece of code...
- double z = 8.0 / fNum;
- double y = z * z;
- double xx = fNum - 2.356194491;
-
- double f1 = 1.0 + y * ( 0.183105e-2 + y * ( -0.3516396496e-4 +
- y * ( 0.2457520174e-5 + y * ( -0.240337019e6 ) ) ) );
-
- double f2 = 0.04687499995 + y * ( -0.2002690873e-3 +
- y * ( 0.8449199096e-5 + y * ( -0.88228987e-6 +
- y * 0.105787412e-6 ) ) );
-
- fRet = sqrt( 0.636619772 / fNum ) * ( sin( xx ) * f1 + z * cos( xx ) * f2 );
-#endif
- // #i12430# ...but this seems to work much better.
- fRet = sqrt( 0.636619772 / fNum ) * sin( fNum - 2.356194491 );
- }
-
- return fRet;
+ throw NoConvergenceException();
}
-
-double BesselY( double fNum, sal_Int32 nOrder ) throw( IllegalArgumentException )
+double BesselY( double fNum, sal_Int32 nOrder ) throw( IllegalArgumentException, NoConvergenceException )
{
switch( nOrder )
{
- case 0: return Bessely0( fNum );
- case 1: return Bessely1( fNum );
+ case 0: return Bessely0( fNum );
+ case 1: return Bessely1( fNum );
default:
{
- double fByp;
+ double fByp;
- double fTox = 2.0 / fNum;
- double fBym = Bessely0( fNum );
- double fBy = Bessely1( fNum );
+ double fTox = 2.0 / fNum;
+ double fBym = Bessely0( fNum );
+ double fBy = Bessely1( fNum );
for( sal_Int32 n = 1 ; n < nOrder ; n++ )
{
@@ -407,7 +493,6 @@ double BesselY( double fNum, sal_Int32 nOrder ) throw( IllegalArgumentException
}
}
-
// ============================================================================
} // namespace analysis
diff --git a/scaddins/source/analysis/bessel.hxx b/scaddins/source/analysis/bessel.hxx
index ac1e12370..62c350ed9 100644
--- a/scaddins/source/analysis/bessel.hxx
+++ b/scaddins/source/analysis/bessel.hxx
@@ -29,6 +29,7 @@
#define SCA_BESSEL_HXX
#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/sheet/NoConvergenceException.hpp>
#include <sal/types.h>
namespace sca {
@@ -39,16 +40,16 @@ namespace analysis {
// ============================================================================
/** Returns the result for the unmodified BESSEL function of first kind (J), n-th order, at point x. */
-double BesselJ( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException );
+double BesselJ( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::sheet::NoConvergenceException );
/** Returns the result for the modified BESSEL function of first kind (I), n-th order, at point x. */
-double BesselI( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException );
+double BesselI( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::sheet::NoConvergenceException );
/** Returns the result for the unmodified BESSEL function of second kind (Y), n-th order, at point x. */
-double BesselY( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException );
+double BesselY( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::sheet::NoConvergenceException );
/** Returns the result for the modified BESSEL function of second kind (K), n-th order, at point x. */
-double BesselK( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException );
+double BesselK( double x, sal_Int32 n ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::sheet::NoConvergenceException );
// ============================================================================
diff --git a/scaddins/source/analysis/makefile.mk b/scaddins/source/analysis/makefile.mk
index d837d644d..a23f9886b 100644
--- a/scaddins/source/analysis/makefile.mk
+++ b/scaddins/source/analysis/makefile.mk
@@ -73,7 +73,8 @@ UNOTYPES=\
com.sun.star.uno.XComponentContext \
com.sun.star.util.Date \
com.sun.star.util.XNumberFormatter \
- com.sun.star.util.XNumberFormatTypes
+ com.sun.star.util.XNumberFormatTypes \
+ com.sun.star.sheet.NoConvergenceException
# --- Files -------------------------------------