diff options
Diffstat (limited to 'chart2/source/model/main/ChartModel.cxx')
-rw-r--r-- | chart2/source/model/main/ChartModel.cxx | 144 |
1 files changed, 88 insertions, 56 deletions
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx index b05db28661dd..c0627abf7bbd 100644 --- a/chart2/source/model/main/ChartModel.cxx +++ b/chart2/source/model/main/ChartModel.cxx @@ -19,7 +19,9 @@ #include <ChartModel.hxx> #include <ChartTypeManager.hxx> +#include <ChartTypeTemplate.hxx> #include <servicenames.hxx> +#include <DataSource.hxx> #include <DataSourceHelper.hxx> #include <ChartModelHelper.hxx> #include <DisposeHelper.hxx> @@ -33,7 +35,9 @@ #include <ChartView.hxx> #include <PopupRequest.hxx> #include <ModifyListenerHelper.hxx> +#include <RangeHighlighter.hxx> #include <Diagram.hxx> +#include <comphelper/dumpxmltostring.hxx> #include <com/sun/star/chart/ChartDataRowSource.hpp> #include <com/sun/star/chart2/data/XPivotTableDataProvider.hpp> @@ -45,7 +49,6 @@ #include <svl/numformat.hxx> #include <svl/numuno.hxx> #include <com/sun/star/lang/DisposedException.hpp> -#include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/view/XSelectionSupplier.hpp> #include <com/sun/star/embed/EmbedMapUnits.hpp> #include <com/sun/star/embed/Aspects.hpp> @@ -55,10 +58,10 @@ #include <com/sun/star/document/DocumentProperties.hpp> #include <com/sun/star/util/CloseVetoException.hpp> #include <com/sun/star/util/XModifyBroadcaster.hpp> -#include <com/sun/star/chart2/XChartTypeTemplate.hpp> #include <sal/log.hxx> -#include <tools/diagnose_ex.h> +#include <utility> +#include <comphelper/diagnose_ex.hxx> #include <libxml/xmlwriter.h> using ::com::sun::star::uno::Sequence; @@ -68,14 +71,13 @@ using ::osl::MutexGuard; using namespace ::com::sun::star; using namespace ::apphelper; -using namespace ::chart::CloneHelper; namespace { -constexpr OUStringLiteral lcl_aGDIMetaFileMIMEType( - u"application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\""); -constexpr OUStringLiteral lcl_aGDIMetaFileMIMETypeHighContrast( - u"application/x-openoffice-highcontrast-gdimetafile;windows_formatname=\"GDIMetaFile\""); +constexpr OUString lcl_aGDIMetaFileMIMEType( + u"application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\""_ustr); +constexpr OUString lcl_aGDIMetaFileMIMETypeHighContrast( + u"application/x-openoffice-highcontrast-gdimetafile;windows_formatname=\"GDIMetaFile\""_ustr); } // anonymous namespace @@ -84,7 +86,7 @@ constexpr OUStringLiteral lcl_aGDIMetaFileMIMETypeHighContrast( namespace chart { -ChartModel::ChartModel(uno::Reference<uno::XComponentContext > const & xContext) +ChartModel::ChartModel(uno::Reference<uno::XComponentContext > xContext) : m_aLifeTimeManager( this, this ) , m_bReadOnly( false ) , m_bModified( false ) @@ -93,7 +95,7 @@ ChartModel::ChartModel(uno::Reference<uno::XComponentContext > const & xContext) , mbTimeBased(false) , m_aControllers( m_aModelMutex ) , m_nControllerLockCount(0) - , m_xContext( xContext ) + , m_xContext(std::move( xContext )) , m_aVisualAreaSize( ChartModelHelper::getDefaultPageSize() ) , m_xPageBackground( new PageBackground ) , m_xXMLNamespaceMap( new NameContainer() ) @@ -149,20 +151,27 @@ ChartModel::ChartModel( const ChartModel & rOther ) m_xOldModelAgg->setDelegator( *this ); Reference< util::XModifyListener > xListener; - Reference< chart2::XTitle > xNewTitle = CreateRefClone< chart2::XTitle >()( rOther.m_xTitle ); - rtl::Reference< ::chart::Diagram > xNewDiagram = new ::chart::Diagram( *rOther.m_xDiagram ); + rtl::Reference< Title > xNewTitle; + if ( rOther.m_xTitle ) + xNewTitle = new Title(*rOther.m_xTitle); + rtl::Reference< ::chart::Diagram > xNewDiagram; + if (rOther.m_xDiagram.is()) + xNewDiagram = new ::chart::Diagram( *rOther.m_xDiagram ); rtl::Reference< ::chart::PageBackground > xNewPageBackground = new PageBackground( *rOther.m_xPageBackground ); - rtl::Reference< ::chart::ChartTypeManager > xChartTypeManager; // does not implement XCloneable - rtl::Reference< ::chart::NameContainer > xXMLNamespaceMap = new NameContainer( *rOther.m_xXMLNamespaceMap ); { - MutexGuard aGuard( m_aModelMutex ); - xListener = this; - m_xTitle = xNewTitle; - m_xDiagram = xNewDiagram; - m_xPageBackground = xNewPageBackground; - m_xChartTypeManager = xChartTypeManager; - m_xXMLNamespaceMap = xXMLNamespaceMap; + rtl::Reference< ::chart::ChartTypeManager > xChartTypeManager; // does not implement XCloneable + rtl::Reference< ::chart::NameContainer > xXMLNamespaceMap = new NameContainer( *rOther.m_xXMLNamespaceMap ); + + { + MutexGuard aGuard( m_aModelMutex ); + xListener = this; + m_xTitle = xNewTitle; + m_xDiagram = xNewDiagram; + m_xPageBackground = xNewPageBackground; + m_xChartTypeManager = std::move(xChartTypeManager); + m_xXMLNamespaceMap = std::move(xXMLNamespaceMap); + } } ModifyListenerHelper::addListener( xNewTitle, xListener ); @@ -246,16 +255,11 @@ uno::Reference< frame::XController > ChartModel::impl_getCurrentController() void ChartModel::impl_notifyCloseListeners() { - ::comphelper::OInterfaceContainerHelper2* pIC = m_aLifeTimeManager.m_aListenerContainer - .getContainer( cppu::UnoType<util::XCloseListener>::get()); - if( pIC ) + std::unique_lock aGuard(m_aLifeTimeManager.m_aAccessMutex); + if( m_aLifeTimeManager.m_aCloseListeners.getLength(aGuard) ) { lang::EventObject aEvent( static_cast< lang::XComponent*>(this) ); - ::comphelper::OInterfaceIteratorHelper2 aIt( *pIC ); - while( aIt.hasMoreElements() ) - { - static_cast< util::XCloseListener* >( aIt.next() )->notifyClosing( aEvent ); - } + m_aLifeTimeManager.m_aCloseListeners.notifyEach(aGuard, &util::XCloseListener::notifyClosing, aEvent); } } @@ -393,7 +397,11 @@ void SAL_CALL ChartModel::disconnectController( const uno::Reference< frame::XCo if( m_xCurrentController == xController ) m_xCurrentController.clear(); - DisposeHelper::DisposeAndClear( m_xRangeHighlighter ); + if (m_xRangeHighlighter) + { + m_xRangeHighlighter->dispose(); + m_xRangeHighlighter.clear(); + } DisposeHelper::DisposeAndClear(m_xPopupRequest); } @@ -478,7 +486,11 @@ void SAL_CALL ChartModel::setCurrentController( const uno::Reference< frame::XCo m_xCurrentController = xController; - DisposeHelper::DisposeAndClear( m_xRangeHighlighter ); + if (m_xRangeHighlighter) + { + m_xRangeHighlighter->dispose(); + m_xRangeHighlighter.clear(); + } DisposeHelper::DisposeAndClear(m_xPopupRequest); } @@ -502,7 +514,7 @@ uno::Reference< uno::XInterface > SAL_CALL ChartModel::getCurrentSelection() uno::Any aSel = xSelectionSupl->getSelection(); OUString aObjectCID; if( aSel >>= aObjectCID ) - xReturn.set( ObjectIdentifier::getObjectPropertySet( aObjectCID, Reference< XChartDocument >(this))); + xReturn.set( ObjectIdentifier::getObjectPropertySet( aObjectCID, this)); } } return xReturn; @@ -541,7 +553,7 @@ void SAL_CALL ChartModel::dispose() m_xOwnNumberFormatsSupplier.clear(); m_xChartTypeManager.clear(); m_xDiagram.clear(); - DisposeHelper::DisposeAndClear( m_xTitle ); + m_xTitle.clear(); m_xPageBackground.clear(); m_xXMLNamespaceMap.clear(); @@ -559,7 +571,11 @@ void SAL_CALL ChartModel::dispose() m_aControllers.disposeAndClear( lang::EventObject( static_cast< cppu::OWeakObject * >( this ))); m_xCurrentController.clear(); - DisposeHelper::DisposeAndClear( m_xRangeHighlighter ); + if (m_xRangeHighlighter) + { + m_xRangeHighlighter->dispose(); + m_xRangeHighlighter.clear(); + } DisposeHelper::DisposeAndClear(m_xPopupRequest); if( m_xOldModelAgg.is()) @@ -571,7 +587,8 @@ void SAL_CALL ChartModel::addEventListener( const uno::Reference< lang::XEventLi if( m_aLifeTimeManager.impl_isDisposedOrClosed() ) return; //behave passive if already disposed or closed - m_aLifeTimeManager.m_aListenerContainer.addInterface( cppu::UnoType<lang::XEventListener>::get(), xListener ); + std::unique_lock aGuard(m_aLifeTimeManager.m_aAccessMutex); + m_aLifeTimeManager.m_aEventListeners.addInterface( aGuard, xListener ); } void SAL_CALL ChartModel::removeEventListener( const uno::Reference< lang::XEventListener > & xListener ) @@ -579,7 +596,8 @@ void SAL_CALL ChartModel::removeEventListener( const uno::Reference< lang::XEven if( m_aLifeTimeManager.impl_isDisposedOrClosed(false) ) return; //behave passive if already disposed or closed - m_aLifeTimeManager.m_aListenerContainer.removeInterface( cppu::UnoType<lang::XEventListener>::get(), xListener ); + std::unique_lock aGuard(m_aLifeTimeManager.m_aAccessMutex); + m_aLifeTimeManager.m_aEventListeners.removeInterface( aGuard, xListener ); } // util::XCloseBroadcaster (base of XCloseable) @@ -593,7 +611,8 @@ void SAL_CALL ChartModel::removeCloseListener( const uno::Reference< util::XClos if( m_aLifeTimeManager.impl_isDisposedOrClosed(false) ) return; //behave passive if already disposed or closed - m_aLifeTimeManager.m_aListenerContainer.removeInterface( cppu::UnoType<util::XCloseListener>::get(), xListener ); + std::unique_lock aGuard(m_aLifeTimeManager.m_aAccessMutex); + m_aLifeTimeManager.m_aCloseListeners.removeInterface( aGuard, xListener ); } // util::XCloseable @@ -723,7 +742,7 @@ void SAL_CALL ChartModel::createInternalDataProvider( sal_Bool bCloneExistingDat if( bCloneExistingData ) m_xInternalDataProvider = ChartModelHelper::createInternalDataProvider( this, true ); else - m_xInternalDataProvider = ChartModelHelper::createInternalDataProvider( Reference<XChartDocument>(), true ); + m_xInternalDataProvider = ChartModelHelper::createInternalDataProvider( nullptr, true ); m_xDataProvider.set( m_xInternalDataProvider ); } setModified( true ); @@ -772,7 +791,7 @@ void SAL_CALL ChartModel::attachDataProvider( const uno::Reference< chart2::data { try { - bool bIncludeHiddenCells = ChartModelHelper::isIncludeHiddenCells( Reference< frame::XModel >(this) ); + bool bIncludeHiddenCells = ChartModelHelper::isIncludeHiddenCells( this ); xProp->setPropertyValue("IncludeHiddenCells", uno::Any(bIncludeHiddenCells)); } catch (const beans::UnknownPropertyException&) @@ -836,10 +855,10 @@ void SAL_CALL ChartModel::setArguments( const Sequence< beans::PropertyValue >& Reference< chart2::data::XDataSource > xDataSource( m_xDataProvider->createDataSource( aArguments ) ); if( xDataSource.is() ) { - Reference< chart2::XDiagram > xDia( getFirstDiagram() ); + rtl::Reference< Diagram > xDia = getFirstChartDiagram(); if( !xDia.is() ) { - Reference< chart2::XChartTypeTemplate > xTemplate( impl_createDefaultChartTypeTemplate() ); + rtl::Reference< ::chart::ChartTypeTemplate > xTemplate( impl_createDefaultChartTypeTemplate() ); if( xTemplate.is()) setFirstDiagram( xTemplate->createDiagramByDataSource( xDataSource, aArguments ) ); } @@ -862,22 +881,18 @@ void SAL_CALL ChartModel::setArguments( const Sequence< beans::PropertyValue >& Sequence< OUString > SAL_CALL ChartModel::getUsedRangeRepresentations() { - return DataSourceHelper::getUsedDataRanges( Reference< frame::XModel >(this)); + return DataSourceHelper::getUsedDataRanges( this ); } Reference< chart2::data::XDataSource > SAL_CALL ChartModel::getUsedData() { - return DataSourceHelper::getUsedData( Reference< chart2::XChartDocument >(this)); + return DataSourceHelper::getUsedData( *this ); } Reference< chart2::data::XRangeHighlighter > SAL_CALL ChartModel::getRangeHighlighter() { if( ! m_xRangeHighlighter.is()) - { - uno::Reference< view::XSelectionSupplier > xSelSupp( getCurrentController(), uno::UNO_QUERY ); - if( xSelSupp.is() ) - m_xRangeHighlighter.set( ChartModelHelper::createRangeHighlighter( xSelSupp )); - } + m_xRangeHighlighter = new RangeHighlighter( this ); return m_xRangeHighlighter; } @@ -888,11 +903,11 @@ Reference<awt::XRequestCallback> SAL_CALL ChartModel::getPopupRequest() return m_xPopupRequest; } -Reference< chart2::XChartTypeTemplate > ChartModel::impl_createDefaultChartTypeTemplate() +rtl::Reference< ::chart::ChartTypeTemplate > ChartModel::impl_createDefaultChartTypeTemplate() { - Reference< chart2::XChartTypeTemplate > xTemplate; + rtl::Reference< ::chart::ChartTypeTemplate > xTemplate; if( m_xChartTypeManager.is() ) - xTemplate.set( m_xChartTypeManager->createInstance( "com.sun.star.chart2.template.Column" ), uno::UNO_QUERY ); + xTemplate = m_xChartTypeManager->createTemplate( "com.sun.star.chart2.template.Column" ); return xTemplate; } @@ -930,7 +945,20 @@ uno::Reference< chart2::XTitle > SAL_CALL ChartModel::getTitleObject() return m_xTitle; } -void SAL_CALL ChartModel::setTitleObject( const uno::Reference< chart2::XTitle >& xTitle ) +rtl::Reference< Title > ChartModel::getTitleObject2() const +{ + MutexGuard aGuard( m_aModelMutex ); + return m_xTitle; +} + +void SAL_CALL ChartModel::setTitleObject( const uno::Reference< chart2::XTitle >& xNewTitle ) +{ + rtl::Reference<Title> xTitle = dynamic_cast<Title*>(xNewTitle.get()); + assert(!xNewTitle || xTitle); + setTitleObject(xTitle); +} + +void ChartModel::setTitleObject( const rtl::Reference< Title >& xTitle ) { { MutexGuard aGuard( m_aModelMutex ); @@ -1250,8 +1278,7 @@ void SAL_CALL ChartModel::setParent( const Reference< uno::XInterface >& Parent // ____ XDataSource ____ uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > SAL_CALL ChartModel::getDataSequences() { - Reference< chart2::data::XDataSource > xSource( - DataSourceHelper::getUsedData( uno::Reference< frame::XModel >(this) ) ); + rtl::Reference< DataSource > xSource = DataSourceHelper::getUsedData( *this ); if( xSource.is()) return xSource->getDataSequences(); @@ -1259,12 +1286,17 @@ uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > SAL_CALL ChartM } //XDumper -OUString SAL_CALL ChartModel::dump() +OUString SAL_CALL ChartModel::dump(OUString const & kind) { + if (kind.isEmpty()) { + return comphelper::dumpXmlToString([this](auto writer) { return dumpAsXml(writer); }); + } + + // kind == "shapes": uno::Reference< qa::XDumper > xDumper( createInstance( CHART_VIEW_SERVICE_NAME ), uno::UNO_QUERY ); if (xDumper.is()) - return xDumper->dump(); + return xDumper->dump(kind); return OUString(); } |