Files
loongoffice/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx
Stephan Bergmann 022085ece4 New loplugin:unoaggregation
"Find classes that derive from css::uno::XAggregation, but which implement
queryInterface in violation of the protocol laid out in the documentation at
udkapi/com/sun/star/uno/XAggregation.idl (which implies that such a class either
doesn't actually make use of the deprecated XAggregation mechanism, which should
thus be removed from that class hierarchy, or that its implementation of
queryInterface needs to be fixed)." (compilerplugins/clang/unoaggregation.cxx)

The basesHaveOnlyPureQueryInterface check in
compilerplugins/clang/unoaggregation.cxx is "a crude approximation (but which
appears to work OK)" to filter out any queryInterface base implementations of
class hierarchies supporting XAggregation (i.e.,
cppu::OWeakAggObject::queryInterface).  It only fails for the odd
ChartDocumentWrapper::queryInterface, which manually implements the XAggregation
functionality rather than (indirectly) deriving from OWeakAggObject.  But
changing that manual implementation looks tricky, so leave that alone for now
and add a loplugin warning suppression there, and leave proper clean up for
later.

Change-Id: Ib16e26237bd703e60b0d9cb7134cb39840842d54
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145912
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2023-01-20 20:26:36 +00:00

1439 lines
50 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <ChartDocumentWrapper.hxx>
#include <ChartView.hxx>
#include <ChartTypeManager.hxx>
#include <ChartTypeTemplate.hxx>
#include <servicenames.hxx>
#include <PropertyHelper.hxx>
#include <TitleHelper.hxx>
#include <Legend.hxx>
#include <LegendHelper.hxx>
#include <ControllerLockGuard.hxx>
#include <DisposeHelper.hxx>
#include "DataSeriesPointWrapper.hxx"
#include <chartview/ExplicitValueProvider.hxx>
#include <chartview/DrawModelWrapper.hxx>
#include "Chart2ModelContact.hxx"
#include <BaseCoordinateSystem.hxx>
#include <ChartModel.hxx>
#include <DiagramHelper.hxx>
#include <DataSourceHelper.hxx>
#include <ChartModelHelper.hxx>
#include <AxisHelper.hxx>
#include <ThreeDHelper.hxx>
#include "TitleWrapper.hxx"
#include "ChartDataWrapper.hxx"
#include "DiagramWrapper.hxx"
#include "LegendWrapper.hxx"
#include "AreaWrapper.hxx"
#include "WrappedAddInProperty.hxx"
#include <WrappedIgnoreProperty.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/sequence.hxx>
#include <comphelper/servicehelper.hxx>
#include <utility>
#include <vcl/settings.hxx>
#include <com/sun/star/drawing/ShapeCollection.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/lang/DisposedException.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/util/XRefreshable.hpp>
#include <comphelper/diagnose_ex.hxx>
#include <algorithm>
#include <map>
using namespace ::com::sun::star;
using namespace ::com::sun::star::chart;
using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::beans::Property;
namespace
{
enum eServiceType
{
SERVICE_NAME_AREA_DIAGRAM = 0,
SERVICE_NAME_BAR_DIAGRAM,
SERVICE_NAME_DONUT_DIAGRAM,
SERVICE_NAME_LINE_DIAGRAM,
SERVICE_NAME_NET_DIAGRAM,
SERVICE_NAME_FILLED_NET_DIAGRAM,
SERVICE_NAME_PIE_DIAGRAM,
SERVICE_NAME_STOCK_DIAGRAM,
SERVICE_NAME_XY_DIAGRAM,
SERVICE_NAME_BUBBLE_DIAGRAM,
SERVICE_NAME_DASH_TABLE,
SERVICE_NAME_GRADIENT_TABLE,
SERVICE_NAME_HATCH_TABLE,
SERVICE_NAME_BITMAP_TABLE,
SERVICE_NAME_TRANSP_GRADIENT_TABLE,
SERVICE_NAME_MARKER_TABLE,
SERVICE_NAME_NAMESPACE_MAP,
SERVICE_NAME_EXPORT_GRAPHIC_STORAGE_RESOLVER,
SERVICE_NAME_IMPORT_GRAPHIC_STORAGE_RESOLVER
};
typedef std::map< OUString, enum eServiceType > tServiceNameMap;
tServiceNameMap & lcl_getStaticServiceNameMap()
{
static tServiceNameMap aServiceNameMap {
{"com.sun.star.chart.AreaDiagram", SERVICE_NAME_AREA_DIAGRAM},
{"com.sun.star.chart.BarDiagram", SERVICE_NAME_BAR_DIAGRAM},
{"com.sun.star.chart.DonutDiagram", SERVICE_NAME_DONUT_DIAGRAM},
{"com.sun.star.chart.LineDiagram", SERVICE_NAME_LINE_DIAGRAM},
{"com.sun.star.chart.NetDiagram", SERVICE_NAME_NET_DIAGRAM},
{"com.sun.star.chart.FilledNetDiagram", SERVICE_NAME_FILLED_NET_DIAGRAM},
{"com.sun.star.chart.PieDiagram", SERVICE_NAME_PIE_DIAGRAM},
{"com.sun.star.chart.StockDiagram", SERVICE_NAME_STOCK_DIAGRAM},
{"com.sun.star.chart.XYDiagram", SERVICE_NAME_XY_DIAGRAM},
{"com.sun.star.chart.BubbleDiagram", SERVICE_NAME_BUBBLE_DIAGRAM},
{"com.sun.star.drawing.DashTable", SERVICE_NAME_DASH_TABLE},
{"com.sun.star.drawing.GradientTable", SERVICE_NAME_GRADIENT_TABLE},
{"com.sun.star.drawing.HatchTable", SERVICE_NAME_HATCH_TABLE},
{"com.sun.star.drawing.BitmapTable", SERVICE_NAME_BITMAP_TABLE},
{"com.sun.star.drawing.TransparencyGradientTable", SERVICE_NAME_TRANSP_GRADIENT_TABLE},
{"com.sun.star.drawing.MarkerTable", SERVICE_NAME_MARKER_TABLE},
{"com.sun.star.xml.NamespaceMap", SERVICE_NAME_NAMESPACE_MAP},
{"com.sun.star.document.ExportGraphicStorageHandler", SERVICE_NAME_EXPORT_GRAPHIC_STORAGE_RESOLVER},
{"com.sun.star.document.ImportGraphicStorageHandler", SERVICE_NAME_IMPORT_GRAPHIC_STORAGE_RESOLVER}
};
return aServiceNameMap;
}
enum
{
PROP_DOCUMENT_HAS_MAIN_TITLE,
PROP_DOCUMENT_HAS_SUB_TITLE,
PROP_DOCUMENT_HAS_LEGEND,
PROP_DOCUMENT_LABELS_IN_FIRST_ROW,
PROP_DOCUMENT_LABELS_IN_FIRST_COLUMN,
PROP_DOCUMENT_ADDIN,
PROP_DOCUMENT_BASEDIAGRAM,
PROP_DOCUMENT_ADDITIONAL_SHAPES,
PROP_DOCUMENT_UPDATE_ADDIN,
PROP_DOCUMENT_NULL_DATE,
PROP_DOCUMENT_ENABLE_COMPLEX_CHARTTYPES,
PROP_DOCUMENT_ENABLE_DATATABLE_DIALOG
};
void lcl_AddPropertiesToVector(
std::vector< Property > & rOutProperties )
{
rOutProperties.emplace_back( "HasMainTitle",
PROP_DOCUMENT_HAS_MAIN_TITLE,
cppu::UnoType<bool>::get(),
//#i111967# no PropertyChangeEvent is fired on change so far
beans::PropertyAttribute::MAYBEDEFAULT );
rOutProperties.emplace_back( "HasSubTitle",
PROP_DOCUMENT_HAS_SUB_TITLE,
cppu::UnoType<bool>::get(),
//#i111967# no PropertyChangeEvent is fired on change so far
beans::PropertyAttribute::MAYBEDEFAULT );
rOutProperties.emplace_back( "HasLegend",
PROP_DOCUMENT_HAS_LEGEND,
cppu::UnoType<bool>::get(),
//#i111967# no PropertyChangeEvent is fired on change so far
beans::PropertyAttribute::MAYBEDEFAULT );
// really needed?
rOutProperties.emplace_back( "DataSourceLabelsInFirstRow",
PROP_DOCUMENT_LABELS_IN_FIRST_ROW,
cppu::UnoType<bool>::get(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEDEFAULT );
rOutProperties.emplace_back( "DataSourceLabelsInFirstColumn",
PROP_DOCUMENT_LABELS_IN_FIRST_COLUMN,
cppu::UnoType<bool>::get(),
//#i111967# no PropertyChangeEvent is fired on change so far
beans::PropertyAttribute::MAYBEDEFAULT );
//add-in
rOutProperties.emplace_back( "AddIn",
PROP_DOCUMENT_ADDIN,
cppu::UnoType<util::XRefreshable>::get(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEVOID );
rOutProperties.emplace_back( "BaseDiagram",
PROP_DOCUMENT_BASEDIAGRAM,
cppu::UnoType<OUString>::get(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEVOID );
rOutProperties.emplace_back( "AdditionalShapes",
PROP_DOCUMENT_ADDITIONAL_SHAPES,
cppu::UnoType<drawing::XShapes>::get(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEVOID
| beans::PropertyAttribute::READONLY );
rOutProperties.emplace_back( "RefreshAddInAllowed",
PROP_DOCUMENT_UPDATE_ADDIN,
cppu::UnoType<bool>::get(),
//#i111967# no PropertyChangeEvent is fired on change so far
beans::PropertyAttribute::TRANSIENT );
// table:null-date // i99104
rOutProperties.emplace_back( "NullDate",
PROP_DOCUMENT_NULL_DATE,
::cppu::UnoType<css::util::DateTime>::get(),
beans::PropertyAttribute::MAYBEVOID );
rOutProperties.emplace_back( "EnableComplexChartTypes",
PROP_DOCUMENT_ENABLE_COMPLEX_CHARTTYPES,
cppu::UnoType<bool>::get(),
//#i112666# no PropertyChangeEvent is fired on change so far
beans::PropertyAttribute::MAYBEDEFAULT );
rOutProperties.emplace_back( "EnableDataTableDialog",
PROP_DOCUMENT_ENABLE_DATATABLE_DIALOG,
cppu::UnoType<bool>::get(),
//#i112666# no PropertyChangeEvent is fired on change so far
beans::PropertyAttribute::MAYBEDEFAULT );
}
struct StaticChartDocumentWrapperPropertyArray_Initializer
{
Sequence< Property >* operator()()
{
static Sequence< Property > aPropSeq( lcl_GetPropertySequence() );
return &aPropSeq;
}
private:
static uno::Sequence< Property > lcl_GetPropertySequence()
{
std::vector< css::beans::Property > aProperties;
lcl_AddPropertiesToVector( aProperties );
std::sort( aProperties.begin(), aProperties.end(),
::chart::PropertyNameLess() );
return comphelper::containerToSequence( aProperties );
}
};
struct StaticChartDocumentWrapperPropertyArray : public rtl::StaticAggregate< Sequence< Property >, StaticChartDocumentWrapperPropertyArray_Initializer >
{
};
} // anonymous namespace
namespace chart::wrapper
{
namespace {
//PROP_DOCUMENT_LABELS_IN_FIRST_ROW
class WrappedDataSourceLabelsInFirstRowProperty : public WrappedProperty
{
public:
explicit WrappedDataSourceLabelsInFirstRowProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact);
virtual void setPropertyValue( const css::uno::Any& rOuterValue, const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyValue( const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyDefault( const css::uno::Reference< css::beans::XPropertyState >& xInnerPropertyState ) const override;
private: //member
std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
mutable Any m_aOuterValue;
};
}
WrappedDataSourceLabelsInFirstRowProperty::WrappedDataSourceLabelsInFirstRowProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact)
: WrappedProperty("DataSourceLabelsInFirstRow",OUString())
, m_spChart2ModelContact(std::move( spChart2ModelContact ))
{
m_aOuterValue = WrappedDataSourceLabelsInFirstRowProperty::getPropertyDefault( nullptr );
}
void WrappedDataSourceLabelsInFirstRowProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
bool bLabelsInFirstRow = true;
if( ! (rOuterValue >>= bLabelsInFirstRow) )
throw lang::IllegalArgumentException("Property DataSourceLabelsInFirstRow requires value of type boolean", nullptr, 0 );
m_aOuterValue = rOuterValue;
bool bNewValue = bLabelsInFirstRow;
OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( !DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
return;
if( bUseColumns && bNewValue != bFirstCellAsLabel )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aSequenceMapping, bUseColumns ,bNewValue, bHasCategories );
}
else if( !bUseColumns && bNewValue != bHasCategories )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aSequenceMapping, bUseColumns , bFirstCellAsLabel, bNewValue );
}
}
Any WrappedDataSourceLabelsInFirstRowProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
{
bool bLabelsInFirstRow = true;
if( bUseColumns )
bLabelsInFirstRow = bFirstCellAsLabel;
else
bLabelsInFirstRow = bHasCategories;
m_aOuterValue <<= bLabelsInFirstRow;
}
return m_aOuterValue;
}
Any WrappedDataSourceLabelsInFirstRowProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
{
Any aRet;
aRet <<= true;
return aRet;
}
namespace {
//PROP_DOCUMENT_LABELS_IN_FIRST_COLUMN
class WrappedDataSourceLabelsInFirstColumnProperty : public WrappedProperty
{
public:
explicit WrappedDataSourceLabelsInFirstColumnProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact);
virtual void setPropertyValue( const css::uno::Any& rOuterValue, const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyValue( const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyDefault( const css::uno::Reference< css::beans::XPropertyState >& xInnerPropertyState ) const override;
private: //member
std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
mutable Any m_aOuterValue;
};
}
WrappedDataSourceLabelsInFirstColumnProperty::WrappedDataSourceLabelsInFirstColumnProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact)
: WrappedProperty("DataSourceLabelsInFirstColumn",OUString())
, m_spChart2ModelContact(std::move( spChart2ModelContact ))
{
m_aOuterValue = WrappedDataSourceLabelsInFirstColumnProperty::getPropertyDefault( nullptr );
}
void WrappedDataSourceLabelsInFirstColumnProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
bool bLabelsInFirstRow = true;
if( ! (rOuterValue >>= bLabelsInFirstRow) )
throw lang::IllegalArgumentException("Property DataSourceLabelsInFirstRow requires value of type boolean", nullptr, 0 );
m_aOuterValue = rOuterValue;
bool bNewValue = bLabelsInFirstRow;
OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( !DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
return;
if( bUseColumns && bNewValue != bHasCategories )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aSequenceMapping, bUseColumns, bFirstCellAsLabel, bNewValue );
}
else if( !bUseColumns && bNewValue != bFirstCellAsLabel )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aSequenceMapping, bUseColumns , bNewValue, bHasCategories );
}
}
Any WrappedDataSourceLabelsInFirstColumnProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
{
bool bLabelsInFirstColumn = true;
if( bUseColumns )
bLabelsInFirstColumn = bHasCategories;
else
bLabelsInFirstColumn = bFirstCellAsLabel;
m_aOuterValue <<= bLabelsInFirstColumn;
}
return m_aOuterValue;
}
Any WrappedDataSourceLabelsInFirstColumnProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
{
Any aRet;
aRet <<= true;
return aRet;
}
namespace {
//PROP_DOCUMENT_HAS_LEGEND
class WrappedHasLegendProperty : public WrappedProperty
{
public:
explicit WrappedHasLegendProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact);
virtual void setPropertyValue( const css::uno::Any& rOuterValue, const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyValue( const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyDefault( const css::uno::Reference< css::beans::XPropertyState >& xInnerPropertyState ) const override;
private: //member
std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
};
}
WrappedHasLegendProperty::WrappedHasLegendProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact)
: WrappedProperty("HasLegend",OUString())
, m_spChart2ModelContact(std::move( spChart2ModelContact ))
{
}
void WrappedHasLegendProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
bool bNewValue = true;
if( ! (rOuterValue >>= bNewValue) )
throw lang::IllegalArgumentException("Property HasLegend requires value of type boolean", nullptr, 0 );
try
{
rtl::Reference< Legend > xLegend = LegendHelper::getLegend( *m_spChart2ModelContact->getDocumentModel(), m_spChart2ModelContact->m_xContext,bNewValue );
if(xLegend.is())
{
bool bOldValue = true;
Any aAOld = xLegend->getPropertyValue("Show");
aAOld >>= bOldValue;
if( bOldValue != bNewValue )
xLegend->setPropertyValue("Show", uno::Any( bNewValue ));
}
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
Any WrappedHasLegendProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
Any aRet;
try
{
rtl::Reference< Legend > xLegend =
LegendHelper::getLegend( *m_spChart2ModelContact->getDocumentModel() );
if( xLegend.is())
aRet = xLegend->getPropertyValue("Show");
else
aRet <<= false;
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
return aRet;
}
Any WrappedHasLegendProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
{
Any aRet;
aRet <<= false;
return aRet;
}
namespace {
//PROP_DOCUMENT_HAS_MAIN_TITLE
class WrappedHasMainTitleProperty : public WrappedProperty
{
public:
explicit WrappedHasMainTitleProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact);
virtual void setPropertyValue( const css::uno::Any& rOuterValue, const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyValue( const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyDefault( const css::uno::Reference< css::beans::XPropertyState >& xInnerPropertyState ) const override;
private: //member
std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
};
}
WrappedHasMainTitleProperty::WrappedHasMainTitleProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact)
: WrappedProperty("HasMainTitle",OUString())
, m_spChart2ModelContact(std::move( spChart2ModelContact ))
{
}
void WrappedHasMainTitleProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
bool bNewValue = true;
if( ! (rOuterValue >>= bNewValue) )
throw lang::IllegalArgumentException("Property HasMainTitle requires value of type boolean", nullptr, 0 );
try
{
if( bNewValue )
TitleHelper::createTitle( TitleHelper::MAIN_TITLE, "main-title", m_spChart2ModelContact->getDocumentModel(), m_spChart2ModelContact->m_xContext );
else
TitleHelper::removeTitle( TitleHelper::MAIN_TITLE, m_spChart2ModelContact->getDocumentModel() );
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
Any WrappedHasMainTitleProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
Any aRet;
try
{
aRet <<= TitleHelper::getTitle( TitleHelper::MAIN_TITLE, m_spChart2ModelContact->getDocumentModel() ).is();
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
return aRet;
}
Any WrappedHasMainTitleProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
{
Any aRet;
aRet <<= false;
return aRet;
}
namespace {
//PROP_DOCUMENT_HAS_SUB_TITLE
class WrappedHasSubTitleProperty : public WrappedProperty
{
public:
explicit WrappedHasSubTitleProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact);
virtual void setPropertyValue( const css::uno::Any& rOuterValue, const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyValue( const css::uno::Reference< css::beans::XPropertySet >& xInnerPropertySet ) const override;
virtual css::uno::Any getPropertyDefault( const css::uno::Reference< css::beans::XPropertyState >& xInnerPropertyState ) const override;
private: //member
std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
};
}
WrappedHasSubTitleProperty::WrappedHasSubTitleProperty(std::shared_ptr<Chart2ModelContact> spChart2ModelContact)
: WrappedProperty("HasSubTitle",OUString())
, m_spChart2ModelContact(std::move( spChart2ModelContact ))
{
}
void WrappedHasSubTitleProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
bool bNewValue = true;
if( ! (rOuterValue >>= bNewValue) )
throw lang::IllegalArgumentException("Property HasSubTitle requires value of type boolean", nullptr, 0 );
try
{
if( bNewValue )
TitleHelper::createTitle( TitleHelper::SUB_TITLE, "", m_spChart2ModelContact->getDocumentModel(), m_spChart2ModelContact->m_xContext );
else
TitleHelper::removeTitle( TitleHelper::SUB_TITLE, m_spChart2ModelContact->getDocumentModel() );
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
Any WrappedHasSubTitleProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
{
Any aRet;
try
{
aRet <<= TitleHelper::getTitle( TitleHelper::SUB_TITLE, m_spChart2ModelContact->getDocumentModel() ).is();
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
return aRet;
}
Any WrappedHasSubTitleProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
{
Any aRet;
aRet <<= false;
return aRet;
}
ChartDocumentWrapper::ChartDocumentWrapper(
const Reference< uno::XComponentContext > & xContext ) :
m_spChart2ModelContact( std::make_shared<Chart2ModelContact>( xContext ) ),
m_bUpdateAddIn( true ),
m_bIsDisposed( false )
{
}
ChartDocumentWrapper::~ChartDocumentWrapper()
{
stopAllComponentListening();
}
// ____ XInterface (for new interfaces) ____
// [-loplugin:unoaggregation]
uno::Any SAL_CALL ChartDocumentWrapper::queryInterface( const uno::Type& aType )
{
if( m_xDelegator.is())
// calls queryAggregation if the delegator doesn't know aType
return m_xDelegator->queryInterface( aType );
else
return queryAggregation( aType );
}
// ____ chart::XChartDocument (old API wrapper) ____
Reference< drawing::XShape > SAL_CALL ChartDocumentWrapper::getTitle()
{
if( !m_xTitle.is() )
{
ControllerLockGuardUNO aCtrlLockGuard( m_spChart2ModelContact->getDocumentModel() );
m_xTitle = new TitleWrapper( TitleHelper::MAIN_TITLE, m_spChart2ModelContact );
}
return m_xTitle;
}
Reference< drawing::XShape > SAL_CALL ChartDocumentWrapper::getSubTitle()
{
if( !m_xSubTitle.is() )
{
ControllerLockGuardUNO aCtrlLockGuard( m_spChart2ModelContact->getDocumentModel() );
m_xSubTitle = new TitleWrapper( TitleHelper::SUB_TITLE, m_spChart2ModelContact );
}
return m_xSubTitle;
}
Reference< drawing::XShape > SAL_CALL ChartDocumentWrapper::getLegend()
{
if( ! m_xLegend.is())
{
m_xLegend = new LegendWrapper( m_spChart2ModelContact );
}
return m_xLegend;
}
Reference< beans::XPropertySet > SAL_CALL ChartDocumentWrapper::getArea()
{
if( ! m_xArea.is())
{
m_xArea.set( new AreaWrapper( m_spChart2ModelContact ) );
}
return m_xArea;
}
Reference< XDiagram > SAL_CALL ChartDocumentWrapper::getDiagram()
{
if( !m_xDiagram.is() )
{
try
{
m_xDiagram = new DiagramWrapper( m_spChart2ModelContact );
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
return m_xDiagram;
}
void SAL_CALL ChartDocumentWrapper::setDiagram( const Reference< XDiagram >& xDiagram )
{
uno::Reference< util::XRefreshable > xAddIn( xDiagram, uno::UNO_QUERY );
if( xAddIn.is() )
{
setAddIn( xAddIn );
}
else if( xDiagram.is() && xDiagram != m_xDiagram )
{
// set new wrapped diagram at new chart. This requires the old
// diagram given as parameter to implement the new interface. If
// this is not possible throw an exception
Reference< chart2::XDiagramProvider > xNewDiaProvider( xDiagram, uno::UNO_QUERY_THROW );
Reference< chart2::XDiagram > xNewDia( xNewDiaProvider->getDiagram());
try
{
rtl::Reference< ChartModel > xChartDoc( m_spChart2ModelContact->getDocumentModel() );
if( xChartDoc.is() )
{
// set the new diagram
xChartDoc->setFirstDiagram( xNewDia );
m_xDiagram = xDiagram;
}
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
}
Reference< XChartData > SAL_CALL ChartDocumentWrapper::getData()
{
if( !m_xChartData.is() )
{
m_xChartData.set( new ChartDataWrapper( m_spChart2ModelContact ) );
}
//@todo: check hasInternalDataProvider also in else?
return m_xChartData;
}
void SAL_CALL ChartDocumentWrapper::attachData( const Reference< XChartData >& xNewData )
{
if( !xNewData.is() )
return;
ControllerLockGuardUNO aCtrlLockGuard( m_spChart2ModelContact->getDocumentModel() );
m_xChartData.set( new ChartDataWrapper( m_spChart2ModelContact, xNewData ) );
}
// ____ XModel ____
sal_Bool SAL_CALL ChartDocumentWrapper::attachResource(
const OUString& URL,
const Sequence< beans::PropertyValue >& Arguments )
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
return xModel->attachResource( URL, Arguments );
return false;
}
OUString SAL_CALL ChartDocumentWrapper::getURL()
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
return xModel->getURL();
return OUString();
}
Sequence< beans::PropertyValue > SAL_CALL ChartDocumentWrapper::getArgs()
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
return xModel->getArgs();
return Sequence< beans::PropertyValue >();
}
void SAL_CALL ChartDocumentWrapper::connectController( const Reference< frame::XController >& Controller )
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
xModel->connectController( Controller );
}
void SAL_CALL ChartDocumentWrapper::disconnectController(
const Reference< frame::XController >& Controller )
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
xModel->disconnectController( Controller );
}
void SAL_CALL ChartDocumentWrapper::lockControllers()
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
xModel->lockControllers();
}
void SAL_CALL ChartDocumentWrapper::unlockControllers()
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
xModel->unlockControllers();
}
sal_Bool SAL_CALL ChartDocumentWrapper::hasControllersLocked()
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
return xModel->hasControllersLocked();
return false;
}
Reference< frame::XController > SAL_CALL ChartDocumentWrapper::getCurrentController()
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
return xModel->getCurrentController();
return nullptr;
}
void SAL_CALL ChartDocumentWrapper::setCurrentController(
const Reference< frame::XController >& Controller )
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
xModel->setCurrentController( Controller );
}
Reference< uno::XInterface > SAL_CALL ChartDocumentWrapper::getCurrentSelection()
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
return xModel->getCurrentSelection();
return nullptr;
}
// ____ XComponent ____
void SAL_CALL ChartDocumentWrapper::dispose()
{
if( m_bIsDisposed )
throw lang::DisposedException("ChartDocumentWrapper is disposed",
static_cast< ::cppu::OWeakObject* >( this ));
m_bIsDisposed = true;
try
{
Reference< lang::XComponent > xFormerDelegator( m_xDelegator, uno::UNO_QUERY );
DisposeHelper::DisposeAndClear( m_xTitle );
DisposeHelper::DisposeAndClear( m_xSubTitle );
DisposeHelper::DisposeAndClear( m_xLegend );
DisposeHelper::DisposeAndClear( m_xChartData );
DisposeHelper::DisposeAndClear( m_xDiagram );
DisposeHelper::DisposeAndClear( m_xArea );
m_xChartView.set( nullptr );
m_xShapeFactory.set( nullptr );
m_xDelegator.set( nullptr );
clearWrappedPropertySet();
m_spChart2ModelContact->clear();
impl_resetAddIn();
stopAllComponentListening();
try
{
if( xFormerDelegator.is())
xFormerDelegator->dispose();
}
catch (const lang::DisposedException&)
{
// this is ok, don't panic
}
}
catch (const uno::Exception &)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
void ChartDocumentWrapper::impl_resetAddIn()
{
Reference< util::XRefreshable > xAddIn( m_xAddIn );
m_xAddIn.set( nullptr );
if( !xAddIn.is() )
return;
try
{
//make sure that the add-in does not hold a references to us anymore:
Reference< lang::XComponent > xComp( xAddIn, uno::UNO_QUERY );
if( xComp.is())
xComp->dispose();
else
{
uno::Reference< lang::XInitialization > xInit( xAddIn, uno::UNO_QUERY );
if( xInit.is() )
{
uno::Any aParam;
uno::Reference< css::chart::XChartDocument > xDoc;
aParam <<= xDoc;
uno::Sequence< uno::Any > aSeq( &aParam, 1 );
xInit->initialize( aSeq );
}
}
}
catch (const uno::RuntimeException&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
void ChartDocumentWrapper::setBaseDiagram( const OUString& rBaseDiagram )
{
ControllerLockGuardUNO aCtrlLockGuard( m_spChart2ModelContact->getDocumentModel() );
m_aBaseDiagram = rBaseDiagram;
uno::Reference< XDiagram > xDiagram( ChartDocumentWrapper::createInstance( rBaseDiagram ), uno::UNO_QUERY );
if( xDiagram.is() )
setDiagram( xDiagram );
}
void ChartDocumentWrapper::setAddIn( const Reference< util::XRefreshable >& xAddIn )
{
if( m_xAddIn == xAddIn )
return;
ControllerLockGuardUNO aCtrlLockGuard( m_spChart2ModelContact->getDocumentModel() );
impl_resetAddIn();
m_xAddIn = xAddIn;
// initialize AddIn with this as chart document
uno::Reference< lang::XInitialization > xInit( m_xAddIn, uno::UNO_QUERY );
if( xInit.is() )
{
uno::Any aParam;
uno::Reference< XChartDocument > xDoc(this);
aParam <<= xDoc;
uno::Sequence< uno::Any > aSeq( &aParam, 1 );
xInit->initialize( aSeq );
}
}
void ChartDocumentWrapper::setUpdateAddIn( bool bUpdateAddIn )
{
m_bUpdateAddIn = bUpdateAddIn;
}
Reference< drawing::XShapes > ChartDocumentWrapper::getAdditionalShapes() const
{
// get additional non-chart shapes for XML export
uno::Reference< drawing::XShapes > xFoundShapes;
rtl::Reference<SvxDrawPage> xDrawPage( impl_getDrawPage() );
if( !xDrawPage.is() )
return xFoundShapes;
uno::Reference<drawing::XShapes> xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) );
// iterate 'flat' over all top-level objects
// and determine all that are no chart objects
std::vector< uno::Reference< drawing::XShape > > aShapeVector;
sal_Int32 nSubCount = xDrawPage->getCount();
uno::Reference< drawing::XShape > xShape;
for( sal_Int32 nS = 0; nS < nSubCount; nS++ )
{
if( xDrawPage->getByIndex( nS ) >>= xShape )
{
if( xShape.is() && xChartRoot!=xShape )
aShapeVector.push_back( xShape );
}
}
if( !aShapeVector.empty() )
{
// create a shape collection
xFoundShapes = drawing::ShapeCollection::create(
comphelper::getProcessComponentContext());
OSL_ENSURE( xFoundShapes.is(), "Couldn't create a shape collection!" );
if( xFoundShapes.is())
{
for (auto const& shape : aShapeVector)
xFoundShapes->add(shape);
}
}
return xFoundShapes;
}
void SAL_CALL ChartDocumentWrapper::addEventListener( const Reference< lang::XEventListener >& xListener )
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
xModel->addEventListener( xListener );
}
void SAL_CALL ChartDocumentWrapper::removeEventListener( const Reference< lang::XEventListener >& aListener )
{
rtl::Reference< ChartModel > xModel( m_spChart2ModelContact->getDocumentModel() );
if( xModel.is() )
xModel->removeEventListener( aListener );
}
// ____ XDrawPageSupplier ____
uno::Reference< drawing::XDrawPage > SAL_CALL ChartDocumentWrapper::getDrawPage()
{
return impl_getDrawPage();
}
rtl::Reference<SvxDrawPage> ChartDocumentWrapper::impl_getDrawPage() const
{
return m_spChart2ModelContact->getDrawPage();
}
namespace {
uno::Reference< lang::XMultiServiceFactory > getShapeFactory(const rtl::Reference<ChartView>& xChartView)
{
if( xChartView )
return xChartView->getDrawModelWrapper()->getShapeFactory();
return uno::Reference< lang::XMultiServiceFactory >();
}
}
// ____ XMultiServiceFactory ____
uno::Reference< uno::XInterface > SAL_CALL ChartDocumentWrapper::createInstance(
const OUString& aServiceSpecifier )
{
uno::Reference< uno::XInterface > xResult;
rtl::Reference< ChartModel > xChartDoc( m_spChart2ModelContact->getDocumentModel() );
if( !xChartDoc.is() )
return xResult;
bool bServiceFound = false;
tServiceNameMap & rMap = lcl_getStaticServiceNameMap();
tServiceNameMap::const_iterator aIt( rMap.find( aServiceSpecifier ));
if( aIt != rMap.end())
{
bool bCreateDiagram = false;
rtl::Reference< ::chart::ChartTypeManager > xChartTypeManager =
xChartDoc->getTypeManager();
rtl::Reference< ::chart::ChartTypeTemplate > xTemplate;
switch( (*aIt).second )
{
case SERVICE_NAME_AREA_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.Area");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_BAR_DIAGRAM:
if( xChartTypeManager.is())
{
// this is for bar and column (the latter is the default if
// no "Vertical=false" property was set)
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.Column");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_DONUT_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.Donut");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_LINE_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.Line");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_NET_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.Net");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_FILLED_NET_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.FilledNet");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_PIE_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.Pie");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_STOCK_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.StockLowHighClose");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_XY_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.ScatterLineSymbol");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_BUBBLE_DIAGRAM:
if( xChartTypeManager.is())
{
xTemplate =
xChartTypeManager->createTemplate("com.sun.star.chart2.template.Bubble");
bCreateDiagram = true;
}
break;
case SERVICE_NAME_DASH_TABLE:
case SERVICE_NAME_GRADIENT_TABLE:
case SERVICE_NAME_HATCH_TABLE:
case SERVICE_NAME_BITMAP_TABLE:
case SERVICE_NAME_TRANSP_GRADIENT_TABLE:
case SERVICE_NAME_MARKER_TABLE:
xResult.set( xChartDoc->createInstance( aIt->first ), uno::UNO_QUERY );
break;
case SERVICE_NAME_NAMESPACE_MAP:
break;
case SERVICE_NAME_EXPORT_GRAPHIC_STORAGE_RESOLVER:
break;
case SERVICE_NAME_IMPORT_GRAPHIC_STORAGE_RESOLVER:
break;
}
if( bCreateDiagram && xTemplate.is() )
{
try
{
uno::Reference< chart2::XDiagram > xDia( xChartDoc->getFirstDiagram());
if( xDia.is())
{
// locked controllers
ControllerLockGuardUNO aCtrlLockGuard( xChartDoc );
rtl::Reference< Diagram > xDiagram = ChartModelHelper::findDiagram( xChartDoc );
ThreeDLookScheme e3DScheme = ThreeDHelper::detectScheme( xDiagram );
rtl::Reference< ::chart::ChartTypeManager > xTemplateManager = xChartDoc->getTypeManager();
DiagramHelper::tTemplateWithServiceName aTemplateWithService(
DiagramHelper::getTemplateForDiagram( xDiagram, xTemplateManager ));
if( aTemplateWithService.xChartTypeTemplate.is())
aTemplateWithService.xChartTypeTemplate->resetStyles2( xDiagram );//#i109371#
xTemplate->changeDiagram( xDiagram );
if( AllSettings::GetMathLayoutRTL() )
AxisHelper::setRTLAxisLayout( AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 ) );
ThreeDHelper::setScheme( xDiagram, e3DScheme );
}
else
{
// locked controllers
ControllerLockGuardUNO aCtrlLockGuard( xChartDoc );
xDia.set( xTemplate->createDiagramByDataSource(
uno::Reference< chart2::data::XDataSource >(),
uno::Sequence< beans::PropertyValue >()));
xChartDoc->setFirstDiagram( xDia );
}
xResult = static_cast< ::cppu::OWeakObject* >( new DiagramWrapper( m_spChart2ModelContact ));
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
bServiceFound = true;
}
else if( aServiceSpecifier == "com.sun.star.comp.chart2.DataSeriesWrapper" )
{
Reference< beans::XPropertySet > xDataSeries( new DataSeriesPointWrapper( m_spChart2ModelContact ) );
xResult.set( xDataSeries );
bServiceFound = true;
}
else if( aServiceSpecifier == CHART_VIEW_SERVICE_NAME )
{
if( !m_xChartView.is() )
{
rtl::Reference<::chart::ChartModel> pChartModel = new ::chart::ChartModel(m_spChart2ModelContact->m_xContext);
rtl::Reference<ChartView> xChartView = new ::chart::ChartView(m_spChart2ModelContact->m_xContext, *pChartModel);
try
{
m_xChartView = xChartView;
Sequence< Any > aArguments{ Any(Reference<frame::XModel>(this)),
Any(true) }; // bRefreshAddIn
xChartView->initialize(aArguments);
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
xResult.set( static_cast<cppu::OWeakObject*>(m_xChartView.get()) );
bServiceFound = true;
}
else
{
// try to create a shape
try
{
if( !m_xShapeFactory.is() && m_xChartView.is() )
{
m_xShapeFactory = getShapeFactory( m_xChartView );
}
else
{
rtl::Reference<ChartModel> pModel = m_spChart2ModelContact->getDocumentModel();
if(pModel)
{
m_xChartView = pModel->getChartView();
m_xShapeFactory = getShapeFactory( m_xChartView );
}
}
if( m_xShapeFactory.is() )
{
xResult = m_xShapeFactory->createInstance( aServiceSpecifier );
bServiceFound = true;
}
}
catch (const uno::Exception&)
{
// couldn't create shape
}
}
// finally, try to create an addin
if( !bServiceFound )
{
try
{
Reference< lang::XMultiServiceFactory > xFact(
m_spChart2ModelContact->m_xContext->getServiceManager(), uno::UNO_QUERY_THROW );
uno::Reference< util::XRefreshable > xAddIn(
xFact->createInstance( aServiceSpecifier ), uno::UNO_QUERY );
if( xAddIn.is() )
{
xResult = xAddIn;
}
}
catch (const uno::Exception&)
{
// couldn't create service
}
}
return xResult;
}
uno::Reference< uno::XInterface > SAL_CALL ChartDocumentWrapper::createInstanceWithArguments(
const OUString& ServiceSpecifier,
const uno::Sequence< uno::Any >& Arguments )
{
OSL_ENSURE( Arguments.hasElements(), "createInstanceWithArguments: Warning: Arguments are ignored" );
return createInstance( ServiceSpecifier );
}
uno::Sequence< OUString > SAL_CALL ChartDocumentWrapper::getAvailableServiceNames()
{
return comphelper::mapKeysToSequence( lcl_getStaticServiceNameMap() );
}
// ____ XAggregation ____
void SAL_CALL ChartDocumentWrapper::setDelegator(
const uno::Reference< uno::XInterface >& rDelegator )
{
if( m_bIsDisposed )
{
if( rDelegator.is() )
throw lang::DisposedException("ChartDocumentWrapper is disposed",
static_cast< ::cppu::OWeakObject* >( this ));
return;
}
if( rDelegator.is())
{
m_xDelegator = rDelegator;
ChartModel* pChartModel = dynamic_cast<ChartModel*>(rDelegator.get());
assert(pChartModel);
m_spChart2ModelContact->setDocumentModel( pChartModel );
}
else
{
// this is a sort of dispose() from the new model,so release resources here
try
{
dispose();
}
catch (const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("chart2");
}
}
}
uno::Any SAL_CALL ChartDocumentWrapper::queryAggregation( const uno::Type& rType )
{
return ChartDocumentWrapper_Base::queryInterface( rType );
}
// ____ ::utl::OEventListenerAdapter ____
void ChartDocumentWrapper::_disposing( const lang::EventObject& rSource )
{
if( rSource.Source == m_xTitle )
m_xTitle.set( nullptr );
else if( rSource.Source == m_xSubTitle )
m_xSubTitle.set( nullptr );
else if( rSource.Source == m_xLegend )
m_xLegend.set( nullptr );
else if( rSource.Source == m_xChartData )
m_xChartData.set( nullptr );
else if( rSource.Source == m_xDiagram )
m_xDiagram.set( nullptr );
else if( rSource.Source == m_xArea )
m_xArea.set( nullptr );
else if( rSource.Source == m_xAddIn )
m_xAddIn.set( nullptr );
else if( rSource.Source == static_cast<cppu::OWeakObject*>(m_xChartView.get()) )
m_xChartView.set( nullptr );
}
// WrappedPropertySet
Reference< beans::XPropertySet > ChartDocumentWrapper::getInnerPropertySet()
{
return nullptr;
}
const Sequence< beans::Property >& ChartDocumentWrapper::getPropertySequence()
{
return *StaticChartDocumentWrapperPropertyArray::get();
}
std::vector< std::unique_ptr<WrappedProperty> > ChartDocumentWrapper::createWrappedProperties()
{
std::vector< std::unique_ptr<WrappedProperty> > aWrappedProperties;
aWrappedProperties.emplace_back( new WrappedDataSourceLabelsInFirstRowProperty( m_spChart2ModelContact ) );
aWrappedProperties.emplace_back( new WrappedDataSourceLabelsInFirstColumnProperty( m_spChart2ModelContact ) );
aWrappedProperties.emplace_back( new WrappedHasLegendProperty( m_spChart2ModelContact ) );
aWrappedProperties.emplace_back( new WrappedHasMainTitleProperty( m_spChart2ModelContact ) );
aWrappedProperties.emplace_back( new WrappedHasSubTitleProperty( m_spChart2ModelContact ) );
aWrappedProperties.emplace_back( new WrappedAddInProperty( *this ) );
aWrappedProperties.emplace_back( new WrappedBaseDiagramProperty( *this ) );
aWrappedProperties.emplace_back( new WrappedAdditionalShapesProperty( *this ) );
aWrappedProperties.emplace_back( new WrappedRefreshAddInAllowedProperty( *this ) );
aWrappedProperties.emplace_back( new WrappedIgnoreProperty("NullDate",Any() ) ); // i99104
aWrappedProperties.emplace_back( new WrappedIgnoreProperty("EnableComplexChartTypes", uno::Any(true) ) );
aWrappedProperties.emplace_back( new WrappedIgnoreProperty("EnableDataTableDialog", uno::Any(true) ) );
return aWrappedProperties;
}
OUString SAL_CALL ChartDocumentWrapper::getImplementationName()
{
return CHART_CHARTAPIWRAPPER_IMPLEMENTATION_NAME;
}
sal_Bool SAL_CALL ChartDocumentWrapper::supportsService( const OUString& rServiceName )
{
return cppu::supportsService(this, rServiceName);
}
css::uno::Sequence< OUString > SAL_CALL ChartDocumentWrapper::getSupportedServiceNames()
{
return {
"com.sun.star.chart.ChartDocument",
CHART_CHARTAPIWRAPPER_SERVICE_NAME,
"com.sun.star.xml.UserDefinedAttributesSupplier",
"com.sun.star.beans.PropertySet"
};
}
} // namespace chart::wrapper
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_comp_chart2_ChartDocumentWrapper_get_implementation(css::uno::XComponentContext *context,
css::uno::Sequence<css::uno::Any> const &)
{
return cppu::acquire(new ::chart::wrapper::ChartDocumentWrapper(context));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */