Files
libreoffice/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx
Release Engineers 44569a657c CWS-TOOLING: integrate CWS bubblechart
2009-06-17 08:41:14 +0200 hde  r273051 : i101635: added new charttype bubble
2009-06-17 08:39:37 +0200 hde  r273050 : i101635: created new testcase tCreateNewBubbleChart
2009-06-17 08:38:07 +0200 hde  r273049 : i101635: created new testcase tCreateNewBubbleChart
2009-06-15 15:22:32 +0200 hde  r272991 : 101635
2009-06-11 12:44:01 +0200 iha  r272864 : rebase to dev300m50
2009-06-10 23:27:54 +0200 iha  r272841 : CWS-TOOLING: rebase CWS bubblechart to trunk@272827 (milestone: DEV300:m50)
2009-06-04 18:07:35 +0200 iha  r272649 : #i64689# Bubble Chart
2009-06-04 17:26:44 +0200 iha  r272647 : #i64689# Bubble Chart
2009-06-04 11:24:25 +0200 iha  r272618 : #i64689# add more spacing between bubbles and data labels
2009-05-26 18:05:23 +0200 ufi  r272314 : i101637
2009-04-22 14:37:50 +0200 iha  r271115 : #i64689# bubble chart
2009-04-21 17:52:23 +0200 iha  r271052 : #i64689# bubble chart
2009-04-21 17:50:48 +0200 iha  r271051 : #i76728# type icon for xy chart
2009-04-21 17:25:52 +0200 iha  r271049 : #i76728# type icon for xy chart
2009-04-09 11:18:09 +0200 iha  r270685 : #i100977# autoscaling works not correct if missing values should be treated as zero
2009-04-08 16:39:43 +0200 iha  r270656 : #i64689# bubble chart - missing value treatment
2009-04-08 15:13:25 +0200 iha  r270655 : #i64689# bubble chart - remove unused code
2009-04-08 15:12:19 +0200 iha  r270653 : #i64689# bubble chart - determine sereis length correctly on export
2009-04-08 14:22:43 +0200 iha  r270650 : #i64689# bubble chart - remove unused code
2009-04-08 14:12:09 +0200 iha  r270646 : #i64689# bubble chart - export domains even if no main sequence was found
2009-04-08 14:11:07 +0200 iha  r270645 : #i64689# bubble chart - don't replace missing size values with 1.0
2009-04-07 16:20:22 +0200 iha  r270602 : #i64689# bubble chart - do not offer percent values for data label display for xy and bubble chart
2009-04-07 16:17:42 +0200 iha  r270601 : remove superfluous code
2009-04-06 16:39:32 +0200 iha  r270569 : #i64689# bubble chart -correct automatic numberformat detection for axis, data table and data label + transport data label numberformat during copy paste in addition to axis numberformat
2009-04-02 17:33:33 +0200 iha  r270427 : use input string for formatting in data table during edit
2009-04-02 16:00:29 +0200 iha  r270413 : #i64689# bubble chart - when creating a new series within the data table give it the same number format as the former series, thus the new bubble size values can be edited with the same format immidiately
2009-04-02 11:25:33 +0200 iha  r270385 : #i64689# bubble chart -correct automatic numberformat detection for axis, data table and data label + transport data label numberformat during copy paste in addition to axis numberformat
2009-04-01 11:32:03 +0200 iha  r270312 : #i64689# bubble chart - add further parameter for view creation
2009-03-31 17:52:08 +0200 iha  r270291 : #i64689# bubble chart - scale bubble size with diagram size
2009-03-31 13:38:13 +0200 iha  r270278 : #i64689# bubble chart - wrong size for small values < 1
2009-03-27 19:11:07 +0100 iha  r270169 : #i64689# bubble chart
2009-03-27 19:07:11 +0100 iha  r270168 : #i64689# bubble chart - remove unused code
2009-03-27 18:33:57 +0100 iha  r270167 : #i64689# bubble chart - create no shape for invalid sizes
2009-03-27 15:18:21 +0100 iha  r270157 : #i76728# type icon for xy chart
2009-03-27 14:34:38 +0100 iha  r270156 : #i64689# bubble chart - correct scaling
2009-03-27 14:27:27 +0100 iha  r270155 : #i64689# bubble chart - images
2009-03-27 14:25:45 +0100 iha  r270154 : #i64689# bubble chart - images
2009-03-27 11:38:57 +0100 iha  r270142 : #i64689# bubble chart - values-size is the main series
2009-03-27 11:30:20 +0100 iha  r270140 : #i64689# correct order of sequences after load thus switching charttypes afterwards produces expected results now
2009-03-26 10:22:55 +0100 iha  r270056 : #i64689# bubble chart
2009-03-24 17:45:15 +0100 iha  r269984 : #i64689# bubble chart - user properties from points (not only from the series)
2009-03-24 15:10:57 +0100 dr  r269954 : #i64989# export bubble charts to xls
2009-03-24 14:55:29 +0100 dr  r269952 : #i64989# import bubble charts from xls
2009-03-24 14:54:46 +0100 dr  r269950 : #i64989# import bubble charts from ooxml
2009-03-23 18:59:08 +0100 iha  r269895 : further cleanups possible with new member m_aGlobalSeriesImportInfo
2009-03-23 16:54:04 +0100 iha  r269886 : #i64689# bubble chart - a single sequence must be interpreted as sizes because of ODF specification
2009-03-23 16:50:43 +0100 iha  r269885 : #i64689# save&load bubble chart
2009-03-20 19:30:29 +0100 iha  r269826 : CWS-TOOLING: rebase CWS bubblechart to trunk@269781 (milestone: DEV300:m44)
2009-03-19 11:30:33 +0100 iha  r269732 : #i64689# rename SchXMLCategoriesDomainContext to SchXMLCategoriesContext avoid confusion with domains
2009-03-18 17:11:13 +0100 iha  r269693 : #i64689# add charttype bubble
2009-03-18 17:09:22 +0100 iha  r269692 : #i64689# remove unused code
2009-03-13 12:18:26 +0100 iha  r269467 : #i64689# corrected lineends
2009-03-12 11:25:14 +0100 iha  r269376 : #i64689# bubble chart (part 1)
2009-07-02 19:17:43 +00:00

1677 lines
65 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: ChartDocumentWrapper.cxx,v $
* $Revision: 1.10 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_chart2.hxx"
#include "ChartDocumentWrapper.hxx"
#include "macros.hxx"
#include "servicenames.hxx"
#include "PropertyHelper.hxx"
#include "TitleHelper.hxx"
#include "LegendHelper.hxx"
#include "ControllerLockGuard.hxx"
#include "ModifyListenerHelper.hxx"
#include "DisposeHelper.hxx"
#include "DataSeriesPointWrapper.hxx"
#include "chartview/ExplicitValueProvider.hxx"
#include "chartview/DrawModelWrapper.hxx"
#include "Chart2ModelContact.hxx"
#include "DiagramHelper.hxx"
#include "DataSourceHelper.hxx"
#include "ChartModelHelper.hxx"
#include "ContainerHelper.hxx"
#include "TitleWrapper.hxx"
#include "ChartDataWrapper.hxx"
#include "DiagramWrapper.hxx"
#include "LegendWrapper.hxx"
#include "AreaWrapper.hxx"
#include "WrappedAddInProperty.hxx"
#include "WrappedIgnoreProperty.hxx"
#include "ChartRenderer.hxx"
#include <com/sun/star/chart2/XTitled.hpp>
#include <com/sun/star/chart2/data/XDataReceiver.hpp>
#include <com/sun/star/chart/ChartDataRowSource.hpp>
#include <com/sun/star/chart/XChartDataArray.hpp>
#include <comphelper/InlineContainer.hxx>
// header for function SvxShapeCollection_NewInstance
#include <svx/unoshcol.hxx>
// header for define DBG_ASSERT
#include <tools/debug.hxx>
#include <com/sun/star/drawing/XDrawPagesSupplier.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/DateTime.hpp>
#include <vector>
#include <algorithm>
#include <functional>
using namespace ::com::sun::star;
using namespace ::com::sun::star::chart;
using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::beans::Property;
using ::osl::MutexGuard;
using ::rtl::OUString;
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_PIE_DIAGRAM,
SERVICE_NAME_STOCK_DIAGRAM,
SERVICE_NAME_XY_DIAGRAM,
SERVICE_NAME_BUBBLE_DIAGRAM,
SERVICE_NAME_DASH_TABLE,
SERVICE_NAME_GARDIENT_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_RESOLVER,
SERVICE_NAME_IMPORT_GRAPHIC_RESOLVER
};
typedef ::std::map< ::rtl::OUString, enum eServiceType > tServiceNameMap;
typedef ::comphelper::MakeMap< ::rtl::OUString, enum eServiceType > tMakeServiceNameMap;
tServiceNameMap & lcl_getStaticServiceNameMap()
{
static tServiceNameMap aServiceNameMap(
tMakeServiceNameMap
( C2U( "com.sun.star.chart.AreaDiagram" ), SERVICE_NAME_AREA_DIAGRAM )
( C2U( "com.sun.star.chart.BarDiagram" ), SERVICE_NAME_BAR_DIAGRAM )
( C2U( "com.sun.star.chart.DonutDiagram" ), SERVICE_NAME_DONUT_DIAGRAM )
( C2U( "com.sun.star.chart.LineDiagram" ), SERVICE_NAME_LINE_DIAGRAM )
( C2U( "com.sun.star.chart.NetDiagram" ), SERVICE_NAME_NET_DIAGRAM )
( C2U( "com.sun.star.chart.PieDiagram" ), SERVICE_NAME_PIE_DIAGRAM )
( C2U( "com.sun.star.chart.StockDiagram" ), SERVICE_NAME_STOCK_DIAGRAM )
( C2U( "com.sun.star.chart.XYDiagram" ), SERVICE_NAME_XY_DIAGRAM )
( C2U( "com.sun.star.chart.BubbleDiagram" ), SERVICE_NAME_BUBBLE_DIAGRAM )
( C2U( "com.sun.star.drawing.DashTable" ), SERVICE_NAME_DASH_TABLE )
( C2U( "com.sun.star.drawing.GradientTable" ), SERVICE_NAME_GARDIENT_TABLE )
( C2U( "com.sun.star.drawing.HatchTable" ), SERVICE_NAME_HATCH_TABLE )
( C2U( "com.sun.star.drawing.BitmapTable" ), SERVICE_NAME_BITMAP_TABLE )
( C2U( "com.sun.star.drawing.TransparencyGradientTable" ), SERVICE_NAME_TRANSP_GRADIENT_TABLE )
( C2U( "com.sun.star.drawing.MarkerTable" ), SERVICE_NAME_MARKER_TABLE )
( C2U( "com.sun.star.xml.NamespaceMap" ), SERVICE_NAME_NAMESPACE_MAP )
( C2U( "com.sun.star.document.ExportGraphicObjectResolver" ), SERVICE_NAME_EXPORT_GRAPHIC_RESOLVER )
( C2U( "com.sun.star.document.ImportGraphicObjectResolver" ), SERVICE_NAME_IMPORT_GRAPHIC_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
};
void lcl_AddPropertiesToVector(
::std::vector< Property > & rOutProperties )
{
rOutProperties.push_back(
Property( C2U( "HasMainTitle" ),
PROP_DOCUMENT_HAS_MAIN_TITLE,
::getBooleanCppuType(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEDEFAULT ));
rOutProperties.push_back(
Property( C2U( "HasSubTitle" ),
PROP_DOCUMENT_HAS_SUB_TITLE,
::getBooleanCppuType(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEDEFAULT ));
rOutProperties.push_back(
Property( C2U( "HasLegend" ),
PROP_DOCUMENT_HAS_LEGEND,
::getBooleanCppuType(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEDEFAULT ));
// really needed?
rOutProperties.push_back(
Property( C2U( "DataSourceLabelsInFirstRow" ),
PROP_DOCUMENT_LABELS_IN_FIRST_ROW,
::getBooleanCppuType(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEDEFAULT ));
rOutProperties.push_back(
Property( C2U( "DataSourceLabelsInFirstColumn" ),
PROP_DOCUMENT_LABELS_IN_FIRST_COLUMN,
::getBooleanCppuType(),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEDEFAULT ));
//add-in
rOutProperties.push_back(
Property( C2U( "AddIn" ),
PROP_DOCUMENT_ADDIN,
::getCppuType( reinterpret_cast< Reference< util::XRefreshable > * >(0)),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEVOID ));
rOutProperties.push_back(
Property( C2U( "BaseDiagram" ),
PROP_DOCUMENT_BASEDIAGRAM,
::getCppuType( reinterpret_cast< const ::rtl::OUString * >(0)),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEVOID ));
rOutProperties.push_back(
Property( C2U( "AdditionalShapes" ),
PROP_DOCUMENT_ADDITIONAL_SHAPES,
::getCppuType( reinterpret_cast< Reference< drawing::XShapes > * >(0)),
beans::PropertyAttribute::BOUND
| beans::PropertyAttribute::MAYBEVOID
| beans::PropertyAttribute::READONLY ));
rOutProperties.push_back(
Property( C2U( "RefreshAddInAllowed" ),
PROP_DOCUMENT_UPDATE_ADDIN,
::getBooleanCppuType(),
beans::PropertyAttribute::BOUND ));
// table:null-date // i99104
rOutProperties.push_back(
Property( C2U( "NullDate" ),
PROP_DOCUMENT_NULL_DATE,
::getCppuType( static_cast< const ::com::sun::star::util::DateTime * >(0)),
beans::PropertyAttribute::MAYBEVOID ));
}
const uno::Sequence< Property > & lcl_GetPropertySequence()
{
static uno::Sequence< Property > aPropSeq;
// /--
MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
if( 0 == aPropSeq.getLength() )
{
// get properties
::std::vector< ::com::sun::star::beans::Property > aProperties;
lcl_AddPropertiesToVector( aProperties );
// and sort them for access via bsearch
::std::sort( aProperties.begin(), aProperties.end(),
::chart::PropertyNameLess() );
// transfer result to static Sequence
aPropSeq = ::chart::ContainerHelper::ContainerToSequence( aProperties );
}
return aPropSeq;
}
} // anonymous namespace
namespace chart
{
namespace wrapper
{
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//PROP_DOCUMENT_LABELS_IN_FIRST_ROW
class WrappedDataSourceLabelsInFirstRowProperty : public WrappedProperty
{
public:
WrappedDataSourceLabelsInFirstRowProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact );
virtual ~WrappedDataSourceLabelsInFirstRowProperty();
virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& xInnerPropertyState ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
private: //member
::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
mutable Any m_aOuterValue;
};
WrappedDataSourceLabelsInFirstRowProperty::WrappedDataSourceLabelsInFirstRowProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact )
: WrappedProperty(C2U("DataSourceLabelsInFirstRow"),OUString())
, m_spChart2ModelContact( spChart2ModelContact )
, m_aOuterValue()
{
m_aOuterValue = WrappedDataSourceLabelsInFirstRowProperty::getPropertyDefault( 0 );
}
WrappedDataSourceLabelsInFirstRowProperty::~WrappedDataSourceLabelsInFirstRowProperty()
{
}
void WrappedDataSourceLabelsInFirstRowProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
{
sal_Bool bLabelsInFirstRow = sal_True;
if( ! (rOuterValue >>= bLabelsInFirstRow) )
throw lang::IllegalArgumentException( C2U("Property DataSourceLabelsInFirstRow requires value of type boolean"), 0, 0 );
m_aOuterValue = rOuterValue;
bool bNewValue = bLabelsInFirstRow;
::rtl::OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
{
if( bUseColumns && bNewValue != bFirstCellAsLabel )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aSequenceMapping, bUseColumns ,bNewValue, bHasCategories );
}
else if( !bUseColumns && bNewValue != bHasCategories )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aSequenceMapping, bUseColumns , bFirstCellAsLabel, bNewValue );
}
}
}
Any WrappedDataSourceLabelsInFirstRowProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
::rtl::OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
{
sal_Bool bLabelsInFirstRow = sal_True;
if( bUseColumns )
bLabelsInFirstRow = bFirstCellAsLabel;
else
bLabelsInFirstRow = bHasCategories;
m_aOuterValue <<= bLabelsInFirstRow;
}
return m_aOuterValue;
}
Any WrappedDataSourceLabelsInFirstRowProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
aRet <<= sal_True;
return aRet;
}
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//PROP_DOCUMENT_LABELS_IN_FIRST_COLUMN
class WrappedDataSourceLabelsInFirstColumnProperty : public WrappedProperty
{
public:
WrappedDataSourceLabelsInFirstColumnProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact );
virtual ~WrappedDataSourceLabelsInFirstColumnProperty();
virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& xInnerPropertyState ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
private: //member
::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
mutable Any m_aOuterValue;
};
WrappedDataSourceLabelsInFirstColumnProperty::WrappedDataSourceLabelsInFirstColumnProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact )
: WrappedProperty(C2U("DataSourceLabelsInFirstColumn"),OUString())
, m_spChart2ModelContact( spChart2ModelContact )
, m_aOuterValue()
{
m_aOuterValue = WrappedDataSourceLabelsInFirstColumnProperty::getPropertyDefault( 0 );
}
WrappedDataSourceLabelsInFirstColumnProperty::~WrappedDataSourceLabelsInFirstColumnProperty()
{
}
void WrappedDataSourceLabelsInFirstColumnProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
{
sal_Bool bLabelsInFirstRow = sal_True;
if( ! (rOuterValue >>= bLabelsInFirstRow) )
throw lang::IllegalArgumentException( C2U("Property DataSourceLabelsInFirstRow requires value of type boolean"), 0, 0 );
m_aOuterValue = rOuterValue;
bool bNewValue = bLabelsInFirstRow;
::rtl::OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
{
if( bUseColumns && bNewValue != bHasCategories )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aSequenceMapping, bUseColumns, bFirstCellAsLabel, bNewValue );
}
else if( !bUseColumns && bNewValue != bFirstCellAsLabel )
{
DataSourceHelper::setRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aSequenceMapping, bUseColumns , bNewValue, bHasCategories );
}
}
}
Any WrappedDataSourceLabelsInFirstColumnProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
::rtl::OUString aRangeString;
bool bUseColumns = true;
bool bFirstCellAsLabel = true;
bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping;
if( DataSourceHelper::detectRangeSegmentation(
m_spChart2ModelContact->getChartModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
{
sal_Bool bLabelsInFirstColumn = sal_True;
if( bUseColumns )
bLabelsInFirstColumn = bHasCategories;
else
bLabelsInFirstColumn = bFirstCellAsLabel;
m_aOuterValue <<= bLabelsInFirstColumn;
}
return m_aOuterValue;
}
Any WrappedDataSourceLabelsInFirstColumnProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
aRet <<= sal_True;
return aRet;
}
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//PROP_DOCUMENT_HAS_LEGEND
class WrappedHasLegendProperty : public WrappedProperty
{
public:
WrappedHasLegendProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact );
virtual ~WrappedHasLegendProperty();
virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& xInnerPropertyState ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
private: //member
::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
};
WrappedHasLegendProperty::WrappedHasLegendProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact )
: WrappedProperty(C2U("HasLegend"),OUString())
, m_spChart2ModelContact( spChart2ModelContact )
{
}
WrappedHasLegendProperty::~WrappedHasLegendProperty()
{
}
void WrappedHasLegendProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
{
sal_Bool bNewValue = sal_True;
if( ! (rOuterValue >>= bNewValue) )
throw lang::IllegalArgumentException( C2U("Property HasLegend requires value of type boolean"), 0, 0 );
try
{
Reference< chart2::XLegend > xLegend( LegendHelper::getLegend( m_spChart2ModelContact->getChartModel(), m_spChart2ModelContact->m_xContext,bNewValue ));
if(xLegend.is())
{
Reference< beans::XPropertySet > xLegendProp( xLegend, uno::UNO_QUERY_THROW );
sal_Bool bOldValue = sal_True;
Any aAOld = xLegendProp->getPropertyValue( C2U("Show") );
aAOld >>= bOldValue;
if( bOldValue != bNewValue )
xLegendProp->setPropertyValue( C2U("Show"), uno::makeAny( bNewValue ));
}
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
Any WrappedHasLegendProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
try
{
Reference< beans::XPropertySet > xLegendProp(
LegendHelper::getLegend( m_spChart2ModelContact->getChartModel() ), uno::UNO_QUERY );
if( xLegendProp.is())
aRet = xLegendProp->getPropertyValue( C2U("Show"));
else
aRet <<= sal_False;
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
return aRet;
}
Any WrappedHasLegendProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
aRet <<= sal_False;
return aRet;
}
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//PROP_DOCUMENT_HAS_MAIN_TITLE
class WrappedHasMainTitleProperty : public WrappedProperty
{
public:
WrappedHasMainTitleProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact );
virtual ~WrappedHasMainTitleProperty();
virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& xInnerPropertyState ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
private: //member
::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
};
WrappedHasMainTitleProperty::WrappedHasMainTitleProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact )
: WrappedProperty(C2U("HasMainTitle"),OUString())
, m_spChart2ModelContact( spChart2ModelContact )
{
}
WrappedHasMainTitleProperty::~WrappedHasMainTitleProperty()
{
}
void WrappedHasMainTitleProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
{
sal_Bool bNewValue = sal_True;
if( ! (rOuterValue >>= bNewValue) )
throw lang::IllegalArgumentException( C2U("Property HasMainTitle requires value of type boolean"), 0, 0 );
try
{
if( bNewValue )
TitleHelper::createTitle( TitleHelper::MAIN_TITLE, C2U("main-title"), m_spChart2ModelContact->getChartModel(), m_spChart2ModelContact->m_xContext );
else
TitleHelper::removeTitle( TitleHelper::MAIN_TITLE, m_spChart2ModelContact->getChartModel() );
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
Any WrappedHasMainTitleProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
try
{
aRet <<= sal_Bool( TitleHelper::getTitle( TitleHelper::MAIN_TITLE, m_spChart2ModelContact->getChartModel() ).is() );
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
return aRet;
}
Any WrappedHasMainTitleProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
aRet <<= sal_False;
return aRet;
}
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//PROP_DOCUMENT_HAS_SUB_TITLE
class WrappedHasSubTitleProperty : public WrappedProperty
{
public:
WrappedHasSubTitleProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact );
virtual ~WrappedHasSubTitleProperty();
virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& xInnerPropertyState ) const
throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
private: //member
::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
};
WrappedHasSubTitleProperty::WrappedHasSubTitleProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact )
: WrappedProperty(C2U("HasSubTitle"),OUString())
, m_spChart2ModelContact( spChart2ModelContact )
{
}
WrappedHasSubTitleProperty::~WrappedHasSubTitleProperty()
{
}
void WrappedHasSubTitleProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
{
sal_Bool bNewValue = sal_True;
if( ! (rOuterValue >>= bNewValue) )
throw lang::IllegalArgumentException( C2U("Property HasSubTitle requires value of type boolean"), 0, 0 );
try
{
if( bNewValue )
TitleHelper::createTitle( TitleHelper::SUB_TITLE, C2U("sub-title"), m_spChart2ModelContact->getChartModel(), m_spChart2ModelContact->m_xContext );
else
TitleHelper::removeTitle( TitleHelper::SUB_TITLE, m_spChart2ModelContact->getChartModel() );
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
Any WrappedHasSubTitleProperty::getPropertyValue( const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
try
{
aRet <<= sal_Bool( TitleHelper::getTitle( TitleHelper::SUB_TITLE, m_spChart2ModelContact->getChartModel() ).is() );
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
return aRet;
}
Any WrappedHasSubTitleProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
Any aRet;
aRet <<= sal_False;
return aRet;
}
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
ChartDocumentWrapper::ChartDocumentWrapper(
const Reference< uno::XComponentContext > & xContext ) :
m_spChart2ModelContact( new Chart2ModelContact( xContext ) ),
m_bUpdateAddIn( sal_True ),
m_bIsDisposed( false )
{
}
ChartDocumentWrapper::~ChartDocumentWrapper()
{
stopAllComponentListening();
}
// ____ XInterface (for new interfaces) ____
uno::Any SAL_CALL ChartDocumentWrapper::queryInterface( const uno::Type& aType )
throw (uno::RuntimeException)
{
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()
throw (uno::RuntimeException)
{
if( !m_xTitle.is() )
{
m_xTitle = new TitleWrapper( TitleHelper::MAIN_TITLE, m_spChart2ModelContact );
}
return m_xTitle;
}
Reference< drawing::XShape > SAL_CALL ChartDocumentWrapper::getSubTitle()
throw (uno::RuntimeException)
{
if( !m_xSubTitle.is() )
{
m_xSubTitle = new TitleWrapper( TitleHelper::SUB_TITLE, m_spChart2ModelContact );
}
return m_xSubTitle;
}
Reference< drawing::XShape > SAL_CALL ChartDocumentWrapper::getLegend()
throw (uno::RuntimeException)
{
if( ! m_xLegend.is())
{
m_xLegend = new LegendWrapper( m_spChart2ModelContact );
Reference< lang::XComponent > xComp( m_xLegend, uno::UNO_QUERY );
}
return m_xLegend;
}
Reference< beans::XPropertySet > SAL_CALL ChartDocumentWrapper::getArea()
throw (uno::RuntimeException)
{
if( ! m_xArea.is())
{
m_xArea.set( new AreaWrapper( m_spChart2ModelContact ) );
Reference< lang::XComponent > xComp( m_xArea, uno::UNO_QUERY );
}
return m_xArea;
}
Reference< XDiagram > SAL_CALL ChartDocumentWrapper::getDiagram()
throw (uno::RuntimeException)
{
if( !m_xDiagram.is() )
{
try
{
m_xDiagram = new DiagramWrapper( m_spChart2ModelContact );
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
return m_xDiagram;
}
void SAL_CALL ChartDocumentWrapper::setDiagram( const Reference< XDiagram >& xDiagram )
throw (uno::RuntimeException)
{
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
{
Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() );
if( xChartDoc.is() )
{
// set the new diagram
xChartDoc->setFirstDiagram( xNewDia );
m_xDiagram = xDiagram;
}
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
}
Reference< XChartData > SAL_CALL ChartDocumentWrapper::getData()
throw (uno::RuntimeException)
{
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 >& xData )
throw (uno::RuntimeException)
{
if( !xData.is())
return;
Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() );
if( !xChartDoc.is() )
return;
uno::Reference< chart2::data::XDataProvider > xDataProvider( xChartDoc->getDataProvider());
uno::Reference< XChartDataArray > xDocDataArray( xDataProvider, uno::UNO_QUERY );
uno::Reference< XChartDataArray > xDataArray( xData, uno::UNO_QUERY );
OSL_ASSERT( xDataArray.is());
if( ! xDataArray.is() ||
xDocDataArray == xDataArray )
return;
// remember some diagram properties to reset later
ChartDataRowSource eSeriesSource = ChartDataRowSource_ROWS;
sal_Bool bStacked = sal_False;
sal_Bool bPercent = sal_False;
sal_Bool bDeep = sal_False;
Reference< beans::XPropertySet > xDiaProp( getDiagram(), uno::UNO_QUERY );
if( xDiaProp.is())
{
xDiaProp->getPropertyValue( C2U("DataRowSource")) >>= eSeriesSource;
xDiaProp->getPropertyValue( C2U("Stacked")) >>= bStacked;
xDiaProp->getPropertyValue( C2U("Percent")) >>= bPercent;
xDiaProp->getPropertyValue( C2U("Deep")) >>= bDeep;
}
// create and attach new data source
uno::Reference< chart2::data::XDataSource > xSource;
Sequence< beans::PropertyValue > aArguments( 4 );
aArguments[0] = beans::PropertyValue(
C2U("CellRangeRepresentation"), -1, uno::makeAny( C2U("all") ),
beans::PropertyState_DIRECT_VALUE );
aArguments[1] = beans::PropertyValue(
C2U("DataRowSource"), -1, uno::makeAny( eSeriesSource ),
beans::PropertyState_DIRECT_VALUE );
aArguments[2] = beans::PropertyValue(
C2U("FirstCellAsLabel"), -1, uno::makeAny( true ), beans::PropertyState_DIRECT_VALUE );
aArguments[3] = beans::PropertyValue(
C2U("HasCategories"), -1, uno::makeAny( true ), beans::PropertyState_DIRECT_VALUE );
// /-- locked controllers
ControllerLockGuard aCtrlLockGuard( Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ));
if( xDocDataArray.is())
{
// we have an internal data provider that supports the XChartDataArray
// interface
xDocDataArray->setData( xDataArray->getData());
xDocDataArray->setRowDescriptions( xDataArray->getRowDescriptions());
xDocDataArray->setColumnDescriptions( xDataArray->getColumnDescriptions());
xSource.set( xDataProvider->createDataSource( aArguments ));
}
else
{
uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
OSL_ASSERT( xChartDoc.is());
OSL_ASSERT( xReceiver.is());
OSL_ASSERT( xDataArray.is());
if( ! (xChartDoc.is() &&
xReceiver.is()))
return;
// create a data provider containing the new data
Reference< chart2::data::XDataProvider > xTempDataProvider(
ChartModelHelper::createInternalDataProvider( xDataArray ));
if( ! xTempDataProvider.is())
throw uno::RuntimeException( C2U("Couldn't create temporary data provider"),
static_cast< ::cppu::OWeakObject * >( this ));
// removes existing data provider and attaches the new one
xReceiver->attachDataProvider( xTempDataProvider );
xSource.set( xTempDataProvider->createDataSource( aArguments));
}
// determine a template
Reference< lang::XMultiServiceFactory > xFact( xChartDoc->getChartTypeManager(), uno::UNO_QUERY );
Reference< chart2::XDiagram > xDia( xChartDoc->getFirstDiagram());
DiagramHelper::tTemplateWithServiceName aTemplateAndService =
DiagramHelper::getTemplateForDiagram( xDia, xFact );
OUString aServiceName( aTemplateAndService.second );
Reference< chart2::XChartTypeTemplate > xTemplate = aTemplateAndService.first;
// (fall-back)
if( ! xTemplate.is())
{
if( aServiceName.getLength() == 0 )
aServiceName = C2U("com.sun.star.chart2.template.Column");
xTemplate.set( xFact->createInstance( aServiceName ), uno::UNO_QUERY );
}
OSL_ASSERT( xTemplate.is());
if( xTemplate.is() && xSource.is())
{
// argument detection works with internal knowledge of the
// ArrayDataProvider
OSL_ASSERT( xDia.is());
xTemplate->changeDiagramData(
xDia, xSource, aArguments );
}
// should do nothing if we already have an internal data provider
xChartDoc->createInternalDataProvider( sal_True /* bCloneExistingData */ );
//correct stacking mode
if( bStacked || bPercent || bDeep )
{
StackMode eStackMode = StackMode_Y_STACKED;
if( bDeep )
eStackMode = StackMode_Z_STACKED;
else if( bPercent )
eStackMode = StackMode_Y_STACKED_PERCENT;
DiagramHelper::setStackMode( xDia, eStackMode );
}
m_xChartData = xData;
// \-- locked controllers
}
// ____ XModel ____
sal_Bool SAL_CALL ChartDocumentWrapper::attachResource(
const ::rtl::OUString& URL,
const Sequence< beans::PropertyValue >& Arguments )
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
return xModel->attachResource( URL, Arguments );
return sal_False;
}
::rtl::OUString SAL_CALL ChartDocumentWrapper::getURL()
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
return xModel->getURL();
return ::rtl::OUString();
}
Sequence< beans::PropertyValue > SAL_CALL ChartDocumentWrapper::getArgs()
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
return xModel->getArgs();
return Sequence< beans::PropertyValue >();
}
void SAL_CALL ChartDocumentWrapper::connectController( const Reference< frame::XController >& Controller )
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
xModel->connectController( Controller );
}
void SAL_CALL ChartDocumentWrapper::disconnectController(
const Reference< frame::XController >& Controller )
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
xModel->disconnectController( Controller );
}
void SAL_CALL ChartDocumentWrapper::lockControllers()
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
xModel->lockControllers();
}
void SAL_CALL ChartDocumentWrapper::unlockControllers()
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
xModel->unlockControllers();
}
sal_Bool SAL_CALL ChartDocumentWrapper::hasControllersLocked()
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
return xModel->hasControllersLocked();
return sal_False;
}
Reference< frame::XController > SAL_CALL ChartDocumentWrapper::getCurrentController()
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
return xModel->getCurrentController();
return 0;
}
void SAL_CALL ChartDocumentWrapper::setCurrentController(
const Reference< frame::XController >& Controller )
throw (container::NoSuchElementException,
uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
xModel->setCurrentController( Controller );
}
Reference< uno::XInterface > SAL_CALL ChartDocumentWrapper::getCurrentSelection()
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
return xModel->getCurrentSelection();
return 0;
}
// ____ XComponent ____
void SAL_CALL ChartDocumentWrapper::dispose()
throw (uno::RuntimeException)
{
if( m_bIsDisposed )
throw lang::DisposedException(
C2U("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( 0 );
m_xShapeFactory.set( 0 );
m_xDelegator.set( 0 );
clearWrappedPropertySet();
m_spChart2ModelContact->clear();
impl_resetAddIn();
stopAllComponentListening();
try
{
if( xFormerDelegator.is())
xFormerDelegator->dispose();
}
catch( lang::DisposedException )
{
// this is ok, don't panic
}
}
catch( uno::Exception &ex )
{
ASSERT_EXCEPTION( ex );
}
}
void ChartDocumentWrapper::impl_resetAddIn()
{
Reference< util::XRefreshable > xAddIn( m_xAddIn );
m_xAddIn.set( 0 );
if( xAddIn.is() )
{
try
{
//make sure that the add-in does not hold a refernce 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< com::sun::star::chart::XChartDocument > xDoc( 0 );
aParam <<= xDoc;
uno::Sequence< uno::Any > aSeq( &aParam, 1 );
xInit->initialize( aSeq );
}
}
}
catch( const uno::RuntimeException& ex )
{
ASSERT_EXCEPTION( ex );
}
catch( const uno::Exception& ex )
{
ASSERT_EXCEPTION( ex );
}
}
}
void ChartDocumentWrapper::setBaseDiagram( const rtl::OUString& rBaseDiagram )
{
ControllerLockGuard aCtrlLockGuard( m_spChart2ModelContact->getChartModel() );
m_aBaseDiagram = rBaseDiagram;
uno::Reference< XDiagram > xDiagram( ChartDocumentWrapper::createInstance( rBaseDiagram ), uno::UNO_QUERY );
if( xDiagram.is() )
this->setDiagram( xDiagram );
}
rtl::OUString ChartDocumentWrapper::getBaseDiagram() const
{
return m_aBaseDiagram;
}
Reference< util::XRefreshable > ChartDocumentWrapper::getAddIn() const
{
return m_xAddIn;
}
void ChartDocumentWrapper::setAddIn( const Reference< util::XRefreshable >& xAddIn )
{
if( m_xAddIn == xAddIn )
return;
ControllerLockGuard aCtrlLockGuard( m_spChart2ModelContact->getChartModel() );
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( (XChartDocument*)this, uno::UNO_QUERY );
aParam <<= xDoc;
uno::Sequence< uno::Any > aSeq( &aParam, 1 );
xInit->initialize( aSeq );
}
}
void ChartDocumentWrapper::setUpdateAddIn( sal_Bool bUpdateAddIn )
{
m_bUpdateAddIn = bUpdateAddIn;
}
sal_Bool ChartDocumentWrapper::getUpdateAddIn() const
{
return m_bUpdateAddIn;
}
Reference< drawing::XShapes > ChartDocumentWrapper::getAdditionalShapes() const
{
// get additional non-chart shapes for XML export
uno::Reference< drawing::XShapes > xFoundShapes;
uno::Reference< drawing::XDrawPage > xDrawPage( this->impl_getDrawPage() );
uno::Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY );
if( !xDrawPageShapes.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 = xDrawPageShapes->getCount();
uno::Reference< drawing::XShape > xShape;
for( sal_Int32 nS = 0; nS < nSubCount; nS++ )
{
if( xDrawPageShapes->getByIndex( nS ) >>= xShape )
{
if( xShape.is() && xChartRoot!=xShape )
aShapeVector.push_back( xShape );
}
}
if( !aShapeVector.empty() )
{
// create a shape collection
xFoundShapes = uno::Reference< drawing::XShapes >( SvxShapeCollection_NewInstance(), uno::UNO_QUERY );
DBG_ASSERT( xFoundShapes.is(), "Couldn't create a shape collection!" );
if( xFoundShapes.is())
{
::std::vector< uno::Reference< drawing::XShape > >::iterator aIter;
for( aIter = aShapeVector.begin(); aIter != aShapeVector.end(); ++aIter )
xFoundShapes->add( *aIter );
}
}
return xFoundShapes;
}
void SAL_CALL ChartDocumentWrapper::addEventListener( const Reference< lang::XEventListener >& xListener )
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
xModel->addEventListener( xListener );
}
void SAL_CALL ChartDocumentWrapper::removeEventListener( const Reference< lang::XEventListener >& aListener )
throw (uno::RuntimeException)
{
Reference< frame::XModel > xModel( m_spChart2ModelContact->getChartModel() );
if( xModel.is() )
xModel->removeEventListener( aListener );
}
// ____ XDrawPageSupplier ____
uno::Reference< drawing::XDrawPage > SAL_CALL ChartDocumentWrapper::getDrawPage()
throw (uno::RuntimeException)
{
return this->impl_getDrawPage();
}
uno::Reference< drawing::XDrawPage > ChartDocumentWrapper::impl_getDrawPage() const
throw (uno::RuntimeException)
{
return m_spChart2ModelContact->getDrawPage();
}
// ____ XMultiServiceFactory ____
uno::Reference< uno::XInterface > SAL_CALL ChartDocumentWrapper::createInstance(
const ::rtl::OUString& aServiceSpecifier )
throw (uno::Exception,
uno::RuntimeException)
{
uno::Reference< uno::XInterface > xResult;
Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() );
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;
uno::Reference< lang::XMultiServiceFactory > xManagerFact(
xChartDoc->getChartTypeManager(), uno::UNO_QUERY );
uno::Reference< chart2::XChartTypeTemplate > xTemplate;
switch( (*aIt).second )
{
case SERVICE_NAME_AREA_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.Area" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_BAR_DIAGRAM:
if( xManagerFact.is())
{
// this is for bar and column (the latter is the default if
// no "Vertical=false" property was set)
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.Column" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_DONUT_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.Donut" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_LINE_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.Line" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_NET_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.Net" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_PIE_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.Pie" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_STOCK_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.StockLowHighClose" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_XY_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.ScatterLineSymbol" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_BUBBLE_DIAGRAM:
if( xManagerFact.is())
{
xTemplate.set(
xManagerFact->createInstance(
C2U( "com.sun.star.chart2.template.Bubble" )), uno::UNO_QUERY );
bCreateDiagram = true;
}
break;
case SERVICE_NAME_DASH_TABLE:
case SERVICE_NAME_GARDIENT_TABLE:
case SERVICE_NAME_HATCH_TABLE:
case SERVICE_NAME_BITMAP_TABLE:
case SERVICE_NAME_TRANSP_GRADIENT_TABLE:
case SERVICE_NAME_MARKER_TABLE:
{
uno::Reference< lang::XMultiServiceFactory > xTableFactory( xChartDoc, uno::UNO_QUERY );
DBG_ASSERT( xTableFactory.get() != this, "new model is expected to implement service factory for gradient table etc" );
if( xTableFactory.is() && xTableFactory.get() != this )
xResult.set( xTableFactory->createInstance( aIt->first ), uno::UNO_QUERY );
}
break;
case SERVICE_NAME_NAMESPACE_MAP:
// xResult = svx::NamespaceMap_createInstance( aWhichIds, &m_pModel->GetPool() );
break;
case SERVICE_NAME_EXPORT_GRAPHIC_RESOLVER:
// xResult = static_cast< ::cppu::OWeakObject * >( new SvXMLGraphicHelper( GRAPHICHELPER_MODE_WRITE ));
break;
case SERVICE_NAME_IMPORT_GRAPHIC_RESOLVER:
// xResult = static_cast< ::cppu::OWeakObject * >( new SvXMLGraphicHelper( GRAPHICHELPER_MODE_READ ));
break;
}
if( bCreateDiagram && xTemplate.is() )
{
try
{
uno::Reference< chart2::XDiagram > xDia( xChartDoc->getFirstDiagram());
if( xDia.is())
{
// /-- locked controllers
ControllerLockGuard aCtrlLockGuard( Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ));
xTemplate->changeDiagram( xDia );
// \-- locked controllers
}
else
{
// /-- locked controllers
ControllerLockGuard aCtrlLockGuard( Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ));
xDia.set( xTemplate->createDiagramByDataSource(
uno::Reference< chart2::data::XDataSource >(),
uno::Sequence< beans::PropertyValue >()));
xChartDoc->setFirstDiagram( xDia );
// \-- locked controllers
}
xResult = static_cast< ::cppu::OWeakObject* >( new DiagramWrapper( m_spChart2ModelContact ));
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
bServiceFound = true;
}
else if( aServiceSpecifier.equals( CHART_RENDERER_SERVICE_IMPLEMENTATION_NAME ) )
{
Reference< lang::XUnoTunnel > xChartRenderer( new ChartRenderer( m_spChart2ModelContact->getChartModel() ) );
xResult.set( xChartRenderer );
bServiceFound = true;
}
else if( aServiceSpecifier.equals( C2U("com.sun.star.comp.chart2.DataSeriesWrapper") ) )
{
Reference< beans::XPropertySet > xDataSeries( new DataSeriesPointWrapper( m_spChart2ModelContact ) );
xResult.set( xDataSeries );
bServiceFound = true;
}
else if( aServiceSpecifier.equals( CHART_VIEW_SERVICE_NAME ) )
{
if( !m_xChartView.is() )
{
Reference< lang::XMultiServiceFactory > xFact(
m_spChart2ModelContact->m_xContext->getServiceManager(), uno::UNO_QUERY_THROW );
if( xFact.is() )
{
Reference< lang::XInitialization > xViewInit( xFact->createInstance(
CHART_VIEW_SERVICE_NAME ), uno::UNO_QUERY );
if(xViewInit.is())
{
try
{
m_xChartView = xViewInit;
Sequence< Any > aArguments(2);
Reference<frame::XModel> xModel(this);
aArguments[0]=uno::makeAny(xModel);
sal_Bool bRefreshAddIn = sal_True;
aArguments[1]=uno::makeAny(bRefreshAddIn);
xViewInit->initialize(aArguments);
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
}
}
}
xResult.set( m_xChartView );
bServiceFound = true;
}
else
{
// try to create a shape
try
{
if( !m_xShapeFactory.is() && m_xChartView.is() )
{
Reference< lang::XUnoTunnel> xUnoTunnel(m_xChartView,uno::UNO_QUERY);
if(xUnoTunnel.is())
{
ExplicitValueProvider* pProvider = reinterpret_cast<ExplicitValueProvider*>(xUnoTunnel->getSomething(
ExplicitValueProvider::getUnoTunnelId() ));
if( pProvider )
m_xShapeFactory.set( pProvider->getDrawModelWrapper()->getShapeFactory() );
}
}
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 );
if( xFact.is() )
{
uno::Reference< util::XRefreshable > xAddIn(
xFact->createInstance( aServiceSpecifier ), uno::UNO_QUERY );
if( xAddIn.is() )
{
xResult = xAddIn;
bServiceFound = true;
}
}
}
catch( const uno::Exception& ex )
{
(void)ex;
// couldn't create service
}
}
return xResult;
}
uno::Reference< uno::XInterface > SAL_CALL ChartDocumentWrapper::createInstanceWithArguments(
const ::rtl::OUString& ServiceSpecifier,
const uno::Sequence< uno::Any >& Arguments )
throw (uno::Exception,
uno::RuntimeException)
{
OSL_ENSURE( Arguments.getLength(), "createInstanceWithArguments: Warning: Arguments are ignored" );
(void)(Arguments);
return createInstance( ServiceSpecifier );
}
uno::Sequence< ::rtl::OUString > SAL_CALL ChartDocumentWrapper::getAvailableServiceNames()
throw (uno::RuntimeException)
{
tServiceNameMap & rMap = lcl_getStaticServiceNameMap();
uno::Sequence< ::rtl::OUString > aResult( rMap.size());
::std::transform( rMap.begin(), rMap.end(),
aResult.getArray(),
::std::select1st< tServiceNameMap::value_type >() );
return aResult;
// // shapes
// // uno::Sequence< OUString > aDrawServices( SvxUnoDrawMSFactory::getAvailableServiceNames() );
// // const OUString * pArr = aDrawServices.getConstArray();
// // aServices.insert( aServices.end(), pArr, pArr + aDrawServices.getLength() );
// }
// add-ins
// uno::Sequence< OUString > aAddIns( GetAddInCollection().GetAddInNames() );
// pArr = aAddIns.getConstArray();
// aServices.insert( aServices.end(), pArr, pArr + aAddIns.getLength() );
// return ContainerToSequence( aServices );
}
// ____ XAggregation ____
void SAL_CALL ChartDocumentWrapper::setDelegator(
const uno::Reference< uno::XInterface >& rDelegator )
throw (uno::RuntimeException)
{
if( rDelegator.is())
{
m_xDelegator = rDelegator;
m_spChart2ModelContact->setModel( uno::Reference< frame::XModel >(m_xDelegator, uno::UNO_QUERY) );
}
else
{
// this is a sort of dispose() from the new model,so release ressources here
try
{
this->dispose();
}
catch( uno::Exception &ex )
{
ASSERT_EXCEPTION( ex );
}
}
}
uno::Any SAL_CALL ChartDocumentWrapper::queryAggregation( const uno::Type& rType )
throw (uno::RuntimeException)
{
return ChartDocumentWrapper_Base::queryInterface( rType );
}
// ____ ::utl::OEventListenerAdapter ____
void ChartDocumentWrapper::_disposing( const lang::EventObject& rSource )
{
if( rSource.Source == m_xTitle )
m_xTitle.set( 0 );
else if( rSource.Source == m_xSubTitle )
m_xSubTitle.set( 0 );
else if( rSource.Source == m_xLegend )
m_xLegend.set( 0 );
else if( rSource.Source == m_xChartData )
m_xChartData.set( 0 );
else if( rSource.Source == m_xDiagram )
m_xDiagram.set( 0 );
else if( rSource.Source == m_xArea )
m_xArea.set( 0 );
else if( rSource.Source == m_xAddIn )
m_xAddIn.set( 0 );
else if( rSource.Source == m_xChartView )
m_xChartView.set( 0 );
}
// ================================================================================
// WrappedPropertySet
Reference< beans::XPropertySet > ChartDocumentWrapper::getInnerPropertySet()
{
return 0;
}
const Sequence< beans::Property >& ChartDocumentWrapper::getPropertySequence()
{
return lcl_GetPropertySequence();
}
const std::vector< WrappedProperty* > ChartDocumentWrapper::createWrappedProperties()
{
::std::vector< ::chart::WrappedProperty* > aWrappedProperties;
aWrappedProperties.push_back( new WrappedDataSourceLabelsInFirstRowProperty( m_spChart2ModelContact ) );
aWrappedProperties.push_back( new WrappedDataSourceLabelsInFirstColumnProperty( m_spChart2ModelContact ) );
aWrappedProperties.push_back( new WrappedHasLegendProperty( m_spChart2ModelContact ) );
aWrappedProperties.push_back( new WrappedHasMainTitleProperty( m_spChart2ModelContact ) );
aWrappedProperties.push_back( new WrappedHasSubTitleProperty( m_spChart2ModelContact ) );
aWrappedProperties.push_back( new WrappedAddInProperty( *this ) );
aWrappedProperties.push_back( new WrappedBaseDiagramProperty( *this ) );
aWrappedProperties.push_back( new WrappedAdditionalShapesProperty( *this ) );
aWrappedProperties.push_back( new WrappedRefreshAddInAllowedProperty( *this ) );
aWrappedProperties.push_back( new WrappedIgnoreProperty( C2U("NullDate"),Any() ) ); // i99104
return aWrappedProperties;
}
// ================================================================================
uno::Sequence< ::rtl::OUString > ChartDocumentWrapper::getSupportedServiceNames_Static()
{
uno::Sequence< ::rtl::OUString > aServices( 4 );
aServices[ 0 ] = C2U( "com.sun.star.chart.ChartDocument" );
aServices[ 1 ] = CHART_CHARTAPIWRAPPER_SERVICE_NAME;
aServices[ 2 ] = C2U( "com.sun.star.xml.UserDefinedAttributeSupplier" );
aServices[ 3 ] = C2U( "com.sun.star.beans.PropertySet" );
return aServices;
}
// implement XServiceInfo methods basing upon getSupportedServiceNames_Static
APPHELPER_XSERVICEINFO_IMPL( ChartDocumentWrapper, CHART_CHARTAPIWRAPPER_IMPLEMENTATION_NAME );
} // namespace wrapper
} // namespace chart