blob: 9c004529ab7456d1650c77ac366dd728fe14999c [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_chart2.hxx"
#include "ChartController.hxx"
#include "ChartWindow.hxx"
#include "chartview/DrawModelWrapper.hxx"
#include "ObjectIdentifier.hxx"
#include "chartview/ExplicitValueProvider.hxx"
#include "macros.hxx"
#include "dlg_ObjectProperties.hxx"
#include "dlg_View3D.hxx"
#include "dlg_InsertErrorBars.hxx"
#include "ViewElementListProvider.hxx"
#include "DataPointItemConverter.hxx"
#include "AxisItemConverter.hxx"
#include "MultipleChartConverters.hxx"
#include "TitleItemConverter.hxx"
#include "LegendItemConverter.hxx"
#include "RegressionCurveItemConverter.hxx"
#include "RegressionEquationItemConverter.hxx"
#include "ErrorBarItemConverter.hxx"
#include "ChartModelHelper.hxx"
#include "AxisHelper.hxx"
#include "TitleHelper.hxx"
#include "LegendHelper.hxx"
#include "ChartTypeHelper.hxx"
#include "ColorPerPointHelper.hxx"
#include "DiagramHelper.hxx"
#include "servicenames_charttypes.hxx"
#include "ControllerLockGuard.hxx"
#include "UndoGuard.hxx"
#include "ObjectNameProvider.hxx"
#include "ResId.hxx"
#include "Strings.hrc"
#include "ReferenceSizeProvider.hxx"
#include "RegressionCurveHelper.hxx"
#include <com/sun/star/chart2/XChartDocument.hpp>
//for auto_ptr
#include <memory>
// header for define RET_OK
#include <vcl/msgbox.hxx>
// for SolarMutex
#include <vcl/svapp.hxx>
#include <vos/mutex.hxx>
#include <svx/ActionDescriptionProvider.hxx>
//.............................................................................
namespace chart
{
//.............................................................................
using namespace ::com::sun::star;
using namespace ::com::sun::star::chart2;
using ::com::sun::star::uno::Reference;
using ::rtl::OUString;
namespace
{
::comphelper::ItemConverter* createItemConverter(
const ::rtl::OUString & aObjectCID
, const uno::Reference< frame::XModel > & xChartModel
, const uno::Reference< uno::XComponentContext > & xContext
, SdrModel & rDrawModel
, NumberFormatterWrapper * pNumberFormatterWrapper = NULL
, ExplicitValueProvider * pExplicitValueProvider = NULL
, ::std::auto_ptr< ReferenceSizeProvider > pRefSizeProvider =
::std::auto_ptr< ReferenceSizeProvider >()
)
{
::comphelper::ItemConverter* pItemConverter=NULL;
//-------------------------------------------------------------
//get type of selected object
ObjectType eObjectType = ObjectIdentifier::getObjectType( aObjectCID );
if( OBJECTTYPE_UNKNOWN==eObjectType )
{
DBG_ERROR("unknown ObjectType");
return NULL;
}
//--
rtl::OUString aParticleID = ObjectIdentifier::getParticleID( aObjectCID );
bool bAffectsMultipleObjects = aParticleID.equals(C2U("ALLELEMENTS"));
//-------------------------------------------------------------
if( !bAffectsMultipleObjects )
{
uno::Reference< beans::XPropertySet > xObjectProperties =
ObjectIdentifier::getObjectPropertySet( aObjectCID, xChartModel );
if(!xObjectProperties.is())
return NULL;
//create itemconverter for a single object
switch(eObjectType)
{
case OBJECTTYPE_PAGE:
pItemConverter = new wrapper::GraphicPropertyItemConverter(
xObjectProperties, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
wrapper::GraphicPropertyItemConverter::LINE_AND_FILL_PROPERTIES );
break;
case OBJECTTYPE_TITLE:
{
::std::auto_ptr< awt::Size > pRefSize;
if( pRefSizeProvider.get() )
pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
pItemConverter = new wrapper::TitleItemConverter( xObjectProperties,
rDrawModel.GetItemPool(), rDrawModel,
uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
pRefSize );
}
break;
case OBJECTTYPE_LEGEND:
{
::std::auto_ptr< awt::Size > pRefSize;
if( pRefSizeProvider.get() )
pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
pItemConverter = new wrapper::LegendItemConverter( xObjectProperties,
rDrawModel.GetItemPool(), rDrawModel,
uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
pRefSize );
}
break;
case OBJECTTYPE_LEGEND_ENTRY:
break;
case OBJECTTYPE_DIAGRAM:
break;
case OBJECTTYPE_DIAGRAM_WALL:
case OBJECTTYPE_DIAGRAM_FLOOR:
pItemConverter = new wrapper::GraphicPropertyItemConverter(
xObjectProperties, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
wrapper::GraphicPropertyItemConverter::LINE_AND_FILL_PROPERTIES );
break;
case OBJECTTYPE_AXIS:
{
::std::auto_ptr< awt::Size > pRefSize;
if( pRefSizeProvider.get() )
pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
uno::Reference< beans::XPropertySet > xDiaProp;
xDiaProp.set( ChartModelHelper::findDiagram( xChartModel ), uno::UNO_QUERY );
// the second property set contains the property CoordinateOrigin
// nOriginIndex is the index of the corresponding index of the
// origin (x=0, y=1, z=2)
ExplicitScaleData aExplicitScale;
ExplicitIncrementData aExplicitIncrement;
if( pExplicitValueProvider )
pExplicitValueProvider->getExplicitValuesForAxis(
uno::Reference< XAxis >( xObjectProperties, uno::UNO_QUERY ),
aExplicitScale, aExplicitIncrement );
pItemConverter = new wrapper::AxisItemConverter(
xObjectProperties, rDrawModel.GetItemPool(),
rDrawModel,
uno::Reference< chart2::XChartDocument >( xChartModel, uno::UNO_QUERY ),
&aExplicitScale, &aExplicitIncrement,
pRefSize );
}
break;
case OBJECTTYPE_AXIS_UNITLABEL:
break;
case OBJECTTYPE_DATA_LABELS:
case OBJECTTYPE_DATA_SERIES:
case OBJECTTYPE_DATA_LABEL:
case OBJECTTYPE_DATA_POINT:
{
::std::auto_ptr< awt::Size > pRefSize;
if( pRefSizeProvider.get() )
pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
wrapper::GraphicPropertyItemConverter::eGraphicObjectType eMapTo =
wrapper::GraphicPropertyItemConverter::FILLED_DATA_POINT;
uno::Reference< XDataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID( aObjectCID, xChartModel );
uno::Reference< XChartType > xChartType = ChartModelHelper::getChartTypeOfSeries( xChartModel, xSeries );
uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
sal_Int32 nDimensionCount = DiagramHelper::getDimension( xDiagram );
if( !ChartTypeHelper::isSupportingAreaProperties( xChartType, nDimensionCount ) )
eMapTo = wrapper::GraphicPropertyItemConverter::LINE_DATA_POINT;
/*
FILLED_DATA_POINT,
LINE_DATA_POINT,
LINE_PROPERTIES,
FILL_PROPERTIES,
LINE_AND_FILL_PROPERTIES
*/
bool bDataSeries = ( eObjectType == OBJECTTYPE_DATA_SERIES || eObjectType == OBJECTTYPE_DATA_LABELS );
//special color for pie chart:
bool bUseSpecialFillColor = false;
sal_Int32 nSpecialFillColor =0;
sal_Int32 nPointIndex = -1; /*-1 for whole series*/
if(!bDataSeries)
{
nPointIndex = aParticleID.toInt32();
uno::Reference< beans::XPropertySet > xSeriesProp( xSeries, uno::UNO_QUERY );
bool bVaryColorsByPoint = false;
if( xSeriesProp.is() &&
(xSeriesProp->getPropertyValue(C2U("VaryColorsByPoint")) >>= bVaryColorsByPoint) &&
bVaryColorsByPoint )
{
if( !ColorPerPointHelper::hasPointOwnColor( xSeriesProp, nPointIndex, xObjectProperties ) )
{
bUseSpecialFillColor = true;
OSL_ASSERT( xDiagram.is());
uno::Reference< XColorScheme > xColorScheme( xDiagram->getDefaultColorScheme() );
if( xColorScheme.is())
nSpecialFillColor = xColorScheme->getColorByIndex( nPointIndex );
}
}
}
sal_Int32 nNumberFormat=ExplicitValueProvider::getExplicitNumberFormatKeyForDataLabel( xObjectProperties, xSeries, nPointIndex, xDiagram );
sal_Int32 nPercentNumberFormat=ExplicitValueProvider::getExplicitPercentageNumberFormatKeyForDataLabel(
xObjectProperties,uno::Reference< util::XNumberFormatsSupplier >(xChartModel, uno::UNO_QUERY));
pItemConverter = new wrapper::DataPointItemConverter( xChartModel, xContext,
xObjectProperties, xSeries, rDrawModel.GetItemPool(), rDrawModel,
pNumberFormatterWrapper,
uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
eMapTo, pRefSize, bDataSeries, bUseSpecialFillColor, nSpecialFillColor, false,
nNumberFormat, nPercentNumberFormat );
break;
}
case OBJECTTYPE_GRID:
case OBJECTTYPE_SUBGRID:
case OBJECTTYPE_DATA_AVERAGE_LINE:
pItemConverter = new wrapper::GraphicPropertyItemConverter(
xObjectProperties, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
wrapper::GraphicPropertyItemConverter::LINE_PROPERTIES );
break;
case OBJECTTYPE_DATA_ERRORS:
pItemConverter = new wrapper::ErrorBarItemConverter(
xChartModel, xObjectProperties, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
break;
case OBJECTTYPE_DATA_CURVE:
pItemConverter = new wrapper::RegressionCurveItemConverter(
xObjectProperties, uno::Reference< chart2::XRegressionCurveContainer >(
ObjectIdentifier::getDataSeriesForCID( aObjectCID, xChartModel ), uno::UNO_QUERY ),
rDrawModel.GetItemPool(), rDrawModel,
uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
break;
case OBJECTTYPE_DATA_CURVE_EQUATION:
{
::std::auto_ptr< awt::Size > pRefSize;
if( pRefSizeProvider.get() )
pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
pItemConverter = new wrapper::RegressionEquationItemConverter(
xObjectProperties, rDrawModel.GetItemPool(), rDrawModel,
uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
pRefSize );
break;
}
case OBJECTTYPE_DATA_ERRORS_X:
break;
case OBJECTTYPE_DATA_ERRORS_Y:
break;
case OBJECTTYPE_DATA_ERRORS_Z:
break;
case OBJECTTYPE_DATA_STOCK_RANGE:
break;
case OBJECTTYPE_DATA_STOCK_LOSS:
case OBJECTTYPE_DATA_STOCK_GAIN:
pItemConverter = new wrapper::GraphicPropertyItemConverter(
xObjectProperties, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ),
wrapper::GraphicPropertyItemConverter::LINE_AND_FILL_PROPERTIES );
break;
default: //OBJECTTYPE_UNKNOWN
break;
}
}
else
{
//create itemconverter for a all objects of given type
switch(eObjectType)
{
case OBJECTTYPE_TITLE:
pItemConverter = new wrapper::AllTitleItemConverter( xChartModel, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
break;
case OBJECTTYPE_AXIS:
{
::std::auto_ptr< awt::Size > pRefSize;
if( pRefSizeProvider.get() )
pRefSize.reset( new awt::Size( pRefSizeProvider->getPageSize()));
pItemConverter = new wrapper::AllAxisItemConverter( xChartModel, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ), pRefSize );
}
break;
case OBJECTTYPE_GRID:
case OBJECTTYPE_SUBGRID:
pItemConverter = new wrapper::AllGridItemConverter( xChartModel, rDrawModel.GetItemPool(),
rDrawModel, uno::Reference< lang::XMultiServiceFactory >( xChartModel, uno::UNO_QUERY ));
break;
default: //for this type it is not supported to change all elements at once
break;
}
}
return pItemConverter;
}
rtl::OUString lcl_getTitleCIDForCommand( const ::rtl::OString& rDispatchCommand, const uno::Reference< frame::XModel > & xChartModel )
{
if( rDispatchCommand.equals("AllTitles"))
return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_TITLE, C2U("ALLELEMENTS") );
TitleHelper::eTitleType nTitleType( TitleHelper::MAIN_TITLE );
if( rDispatchCommand.equals("SubTitle") )
nTitleType = TitleHelper::SUB_TITLE;
else if( rDispatchCommand.equals("XTitle") )
nTitleType = TitleHelper::X_AXIS_TITLE;
else if( rDispatchCommand.equals("YTitle") )
nTitleType = TitleHelper::Y_AXIS_TITLE;
else if( rDispatchCommand.equals("ZTitle") )
nTitleType = TitleHelper::Z_AXIS_TITLE;
else if( rDispatchCommand.equals("SecondaryXTitle") )
nTitleType = TitleHelper::SECONDARY_X_AXIS_TITLE;
else if( rDispatchCommand.equals("SecondaryYTitle") )
nTitleType = TitleHelper::SECONDARY_Y_AXIS_TITLE;
uno::Reference< XTitle > xTitle( TitleHelper::getTitle( nTitleType, xChartModel ) );
return ObjectIdentifier::createClassifiedIdentifierForObject( xTitle, xChartModel );
}
rtl::OUString lcl_getAxisCIDForCommand( const ::rtl::OString& rDispatchCommand, const uno::Reference< frame::XModel >& xChartModel )
{
if( rDispatchCommand.equals("DiagramAxisAll"))
return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_AXIS, C2U("ALLELEMENTS") );
sal_Int32 nDimensionIndex=0;
bool bMainAxis=true;
if( rDispatchCommand.equals("DiagramAxisX"))
{
nDimensionIndex=0; bMainAxis=true;
}
else if( rDispatchCommand.equals("DiagramAxisY"))
{
nDimensionIndex=1; bMainAxis=true;
}
else if( rDispatchCommand.equals("DiagramAxisZ"))
{
nDimensionIndex=2; bMainAxis=true;
}
else if( rDispatchCommand.equals("DiagramAxisA"))
{
nDimensionIndex=0; bMainAxis=false;
}
else if( rDispatchCommand.equals("DiagramAxisB"))
{
nDimensionIndex=1; bMainAxis=false;
}
uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
uno::Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) );
return ObjectIdentifier::createClassifiedIdentifierForObject( xAxis, xChartModel );
}
rtl::OUString lcl_getGridCIDForCommand( const ::rtl::OString& rDispatchCommand, const uno::Reference< frame::XModel >& xChartModel )
{
uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
if( rDispatchCommand.equals("DiagramGridAll"))
return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_GRID, C2U("ALLELEMENTS") );
sal_Int32 nDimensionIndex=0;
bool bMainGrid=true;
//x and y is swapped in the commands
if( rDispatchCommand.equals("DiagramGridYMain"))
{
nDimensionIndex=0; bMainGrid=true;
}
else if( rDispatchCommand.equals("DiagramGridXMain"))
{
nDimensionIndex=1; bMainGrid=true;
}
else if( rDispatchCommand.equals("DiagramGridZMain"))
{
nDimensionIndex=2; bMainGrid=true;
}
else if( rDispatchCommand.equals("DiagramGridYHelp"))
{
nDimensionIndex=0; bMainGrid=false;
}
else if( rDispatchCommand.equals("DiagramGridXHelp"))
{
nDimensionIndex=1; bMainGrid=false;
}
else if( rDispatchCommand.equals("DiagramGridZHelp"))
{
nDimensionIndex=2; bMainGrid=false;
}
bool bMainAxis = true;
uno::Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) );
sal_Int32 nSubGridIndex= bMainGrid ? (-1) : 0;
rtl::OUString aCID( ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, nSubGridIndex ) );
return aCID;
}
rtl::OUString lcl_getObjectCIDForCommand( const ::rtl::OString& rDispatchCommand, const uno::Reference< XChartDocument > & xChartDocument, const rtl::OUString& rSelectedCID )
{
ObjectType eObjectType = OBJECTTYPE_UNKNOWN;
rtl::OUString aParticleID;
uno::Reference< frame::XModel > xChartModel( xChartDocument, uno::UNO_QUERY );
const ObjectType eSelectedType = ObjectIdentifier::getObjectType( rSelectedCID );
uno::Reference< XDataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID( rSelectedCID, xChartModel );
uno::Reference< chart2::XRegressionCurveContainer > xRegCurveCnt( xSeries, uno::UNO_QUERY );
//-------------------------------------------------------------------------
//legend
if( rDispatchCommand.equals("Legend") || rDispatchCommand.equals("FormatLegend") )
{
eObjectType = OBJECTTYPE_LEGEND;
//@todo set particular aParticleID if we have more than one legend
}
//-------------------------------------------------------------------------
//wall floor area
else if( rDispatchCommand.equals("DiagramWall") || rDispatchCommand.equals("FormatWall") )
{
//OBJECTTYPE_DIAGRAM;
eObjectType = OBJECTTYPE_DIAGRAM_WALL;
//@todo set particular aParticleID if we have more than one diagram
}
else if( rDispatchCommand.equals("DiagramFloor") || rDispatchCommand.equals("FormatFloor") )
{
eObjectType = OBJECTTYPE_DIAGRAM_FLOOR;
//@todo set particular aParticleID if we have more than one diagram
}
else if( rDispatchCommand.equals("DiagramArea") || rDispatchCommand.equals("FormatChartArea") )
{
eObjectType = OBJECTTYPE_PAGE;
}
//-------------------------------------------------------------------------
//title
else if( rDispatchCommand.equals("MainTitle")
|| rDispatchCommand.equals("SubTitle")
|| rDispatchCommand.equals("XTitle")
|| rDispatchCommand.equals("YTitle")
|| rDispatchCommand.equals("ZTitle")
|| rDispatchCommand.equals("SecondaryXTitle")
|| rDispatchCommand.equals("SecondaryYTitle")
|| rDispatchCommand.equals("AllTitles")
)
{
return lcl_getTitleCIDForCommand( rDispatchCommand, xChartModel );
}
//-------------------------------------------------------------------------
//axis
else if( rDispatchCommand.equals("DiagramAxisX")
|| rDispatchCommand.equals("DiagramAxisY")
|| rDispatchCommand.equals("DiagramAxisZ")
|| rDispatchCommand.equals("DiagramAxisA")
|| rDispatchCommand.equals("DiagramAxisB")
|| rDispatchCommand.equals("DiagramAxisAll")
)
{
return lcl_getAxisCIDForCommand( rDispatchCommand, xChartModel );
}
//-------------------------------------------------------------------------
//grid
else if( rDispatchCommand.equals("DiagramGridYMain")
|| rDispatchCommand.equals("DiagramGridXMain")
|| rDispatchCommand.equals("DiagramGridZMain")
|| rDispatchCommand.equals("DiagramGridYHelp")
|| rDispatchCommand.equals("DiagramGridXHelp")
|| rDispatchCommand.equals("DiagramGridZHelp")
|| rDispatchCommand.equals("DiagramGridAll")
)
{
return lcl_getGridCIDForCommand( rDispatchCommand, xChartModel );
}
//-------------------------------------------------------------------------
//data series
else if( rDispatchCommand.equals("FormatDataSeries") )
{
if( eSelectedType == OBJECTTYPE_DATA_SERIES )
return rSelectedCID;
else
return ObjectIdentifier::createClassifiedIdentifier(
OBJECTTYPE_DATA_SERIES, ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ) );
}
//-------------------------------------------------------------------------
//data point
else if( rDispatchCommand.equals("FormatDataPoint") )
{
return rSelectedCID;
}
//-------------------------------------------------------------------------
//data labels
else if( rDispatchCommand.equals("FormatDataLabels") )
{
if( eSelectedType == OBJECTTYPE_DATA_LABELS )
return rSelectedCID;
else
return ObjectIdentifier::createClassifiedIdentifierWithParent(
OBJECTTYPE_DATA_LABELS, ::rtl::OUString(), rSelectedCID );
}
//-------------------------------------------------------------------------
//data labels
else if( rDispatchCommand.equals("FormatDataLabel") )
{
if( eSelectedType == OBJECTTYPE_DATA_LABEL )
return rSelectedCID;
else
{
sal_Int32 nPointIndex = ObjectIdentifier::getParticleID( rSelectedCID ).toInt32();
if( nPointIndex>=0 )
{
OUString aSeriesParticle = ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID );
OUString aChildParticle( ObjectIdentifier::getStringForType( OBJECTTYPE_DATA_LABELS ) );
aChildParticle+=(C2U("="));
OUString aLabelsCID = ObjectIdentifier::createClassifiedIdentifierForParticles( aSeriesParticle, aChildParticle );
OUString aLabelCID_Stub = ObjectIdentifier::createClassifiedIdentifierWithParent(
OBJECTTYPE_DATA_LABEL, ::rtl::OUString(), aLabelsCID );
return ObjectIdentifier::createPointCID( aLabelCID_Stub, nPointIndex );
}
}
}
//-------------------------------------------------------------------------
//mean value line
else if( rDispatchCommand.equals("FormatMeanValue") )
{
if( eSelectedType == OBJECTTYPE_DATA_AVERAGE_LINE )
return rSelectedCID;
else
return ObjectIdentifier::createDataCurveCID(
ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ),
RegressionCurveHelper::getRegressionCurveIndex( xRegCurveCnt,
RegressionCurveHelper::getMeanValueLine( xRegCurveCnt ) ), true );
}
//-------------------------------------------------------------------------
//trend line
else if( rDispatchCommand.equals("FormatTrendline") )
{
if( eSelectedType == OBJECTTYPE_DATA_CURVE )
return rSelectedCID;
else
return ObjectIdentifier::createDataCurveCID(
ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ),
RegressionCurveHelper::getRegressionCurveIndex( xRegCurveCnt,
RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCurveCnt ) ), false );
}
//-------------------------------------------------------------------------
//trend line equation
else if( rDispatchCommand.equals("FormatTrendlineEquation") )
{
if( eSelectedType == OBJECTTYPE_DATA_CURVE_EQUATION )
return rSelectedCID;
else
return ObjectIdentifier::createDataCurveEquationCID(
ObjectIdentifier::getSeriesParticleFromCID( rSelectedCID ),
RegressionCurveHelper::getRegressionCurveIndex( xRegCurveCnt,
RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCurveCnt ) ) );
}
//-------------------------------------------------------------------------
// y error bars
else if( rDispatchCommand.equals("FormatYErrorBars") )
{
if( eSelectedType == OBJECTTYPE_DATA_ERRORS )
return rSelectedCID;
else
return ObjectIdentifier::createClassifiedIdentifierWithParent(
OBJECTTYPE_DATA_ERRORS, ::rtl::OUString(), rSelectedCID );
}
//-------------------------------------------------------------------------
// axis
else if( rDispatchCommand.equals("FormatAxis") )
{
if( eSelectedType == OBJECTTYPE_AXIS )
return rSelectedCID;
else
{
Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( rSelectedCID, xChartModel );
return ObjectIdentifier::createClassifiedIdentifierForObject( xAxis , xChartModel );
}
}
//-------------------------------------------------------------------------
// major grid
else if( rDispatchCommand.equals("FormatMajorGrid") )
{
if( eSelectedType == OBJECTTYPE_GRID )
return rSelectedCID;
else
{
Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( rSelectedCID, xChartModel );
return ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel );
}
}
//-------------------------------------------------------------------------
// minor grid
else if( rDispatchCommand.equals("FormatMinorGrid") )
{
if( eSelectedType == OBJECTTYPE_SUBGRID )
return rSelectedCID;
else
{
Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( rSelectedCID, xChartModel );
return ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, 0 /*sub grid index*/ );
}
}
//-------------------------------------------------------------------------
// title
else if( rDispatchCommand.equals("FormatTitle") )
{
if( eSelectedType == OBJECTTYPE_TITLE )
return rSelectedCID;
}
//-------------------------------------------------------------------------
// stock loss
else if( rDispatchCommand.equals("FormatStockLoss") )
{
if( eSelectedType == OBJECTTYPE_DATA_STOCK_LOSS )
return rSelectedCID;
else
return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DATA_STOCK_LOSS, rtl::OUString());
}
//-------------------------------------------------------------------------
// stock gain
else if( rDispatchCommand.equals("FormatStockGain") )
{
if( eSelectedType == OBJECTTYPE_DATA_STOCK_GAIN )
return rSelectedCID;
else
return ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DATA_STOCK_GAIN, rtl::OUString() );
}
return ObjectIdentifier::createClassifiedIdentifier(
eObjectType, aParticleID );
}
}
// anonymous namespace
void SAL_CALL ChartController::executeDispatch_FormatObject(const ::rtl::OUString& rDispatchCommand)
{
uno::Reference< XChartDocument > xChartDocument( getModel(), uno::UNO_QUERY );
rtl::OString aCommand( rtl::OUStringToOString( rDispatchCommand, RTL_TEXTENCODING_ASCII_US ) );
rtl::OUString rObjectCID = lcl_getObjectCIDForCommand( aCommand, xChartDocument, m_aSelection.getSelectedCID() );
executeDlg_ObjectProperties( rObjectCID );
}
void SAL_CALL ChartController::executeDispatch_ObjectProperties()
{
executeDlg_ObjectProperties( m_aSelection.getSelectedCID() );
}
namespace
{
rtl::OUString lcl_getFormatCIDforSelectedCID( const ::rtl::OUString& rSelectedCID )
{
::rtl::OUString aFormatCID(rSelectedCID);
//get type of selected object
ObjectType eObjectType = ObjectIdentifier::getObjectType( aFormatCID );
// some legend entries are handled as if they were data series
if( OBJECTTYPE_LEGEND_ENTRY==eObjectType )
{
rtl::OUString aParentParticle( ObjectIdentifier::getFullParentParticle( rSelectedCID ) );
aFormatCID = ObjectIdentifier::createClassifiedIdentifierForParticle( aParentParticle );
}
// treat diagram as wall
if( OBJECTTYPE_DIAGRAM==eObjectType )
aFormatCID = ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString() );
return aFormatCID;
}
}//end anonymous namespace
void SAL_CALL ChartController::executeDlg_ObjectProperties( const ::rtl::OUString& rSelectedObjectCID )
{
rtl::OUString aObjectCID = lcl_getFormatCIDforSelectedCID( rSelectedObjectCID );
UndoGuard aUndoGuard( ActionDescriptionProvider::createDescription(
ActionDescriptionProvider::FORMAT,
ObjectNameProvider::getName( ObjectIdentifier::getObjectType( aObjectCID ))),
m_xUndoManager );
bool bSuccess = ChartController::executeDlg_ObjectProperties_withoutUndoGuard( aObjectCID, false );
if( bSuccess )
aUndoGuard.commit();
}
bool ChartController::executeDlg_ObjectProperties_withoutUndoGuard( const ::rtl::OUString& rObjectCID, bool bOkClickOnUnchangedDialogSouldBeRatedAsSuccessAlso )
{
//return true if the properties were changed successfully
bool bRet = false;
if( rObjectCID.isEmpty() )
{
//DBG_ERROR("empty ObjectID");
return bRet;
}
try
{
NumberFormatterWrapper aNumberFormatterWrapper( uno::Reference< util::XNumberFormatsSupplier >(getModel(), uno::UNO_QUERY) );
//-------------------------------------------------------------
//get type of object
ObjectType eObjectType = ObjectIdentifier::getObjectType( rObjectCID );
if( OBJECTTYPE_UNKNOWN==eObjectType )
{
//DBG_ERROR("unknown ObjectType");
return bRet;
}
if( OBJECTTYPE_DIAGRAM_WALL==eObjectType || OBJECTTYPE_DIAGRAM_FLOOR==eObjectType )
{
if( !DiagramHelper::isSupportingFloorAndWall( ChartModelHelper::findDiagram( getModel() ) ) )
return bRet;
}
//-------------------------------------------------------------
//convert properties to ItemSet
awt::Size aPageSize( ChartModelHelper::getPageSize(getModel()) );
::std::auto_ptr< ReferenceSizeProvider > pRefSizeProv(
impl_createReferenceSizeProvider());
::std::auto_ptr< ::comphelper::ItemConverter > apItemConverter(
createItemConverter( rObjectCID, getModel(), m_xCC,
m_pDrawModelWrapper->getSdrModel(),
&aNumberFormatterWrapper,
ExplicitValueProvider::getExplicitValueProvider(m_xChartView),
pRefSizeProv ));
if(!apItemConverter.get())
return bRet;
SfxItemSet aItemSet = apItemConverter->CreateEmptyItemSet();
apItemConverter->FillItemSet( aItemSet );
//-------------------------------------------------------------
//prepare dialog
ObjectPropertiesDialogParameter aDialogParameter = ObjectPropertiesDialogParameter( rObjectCID );
aDialogParameter.init( getModel() );
ViewElementListProvider aViewElementListProvider( m_pDrawModelWrapper.get() );
::vos::OGuard aGuard( Application::GetSolarMutex());
SchAttribTabDlg aDlg( m_pChartWindow, &aItemSet, &aDialogParameter, &aViewElementListProvider
, uno::Reference< util::XNumberFormatsSupplier >( getModel(), uno::UNO_QUERY ) );
if(aDialogParameter.HasSymbolProperties())
{
SfxItemSet* pSymbolShapeProperties=NULL;
uno::Reference< beans::XPropertySet > xObjectProperties =
ObjectIdentifier::getObjectPropertySet( rObjectCID, getModel() );
wrapper::DataPointItemConverter aSymbolItemConverter( getModel(), m_xCC
, xObjectProperties, ObjectIdentifier::getDataSeriesForCID( rObjectCID, getModel() )
, m_pDrawModelWrapper->getSdrModel().GetItemPool()
, m_pDrawModelWrapper->getSdrModel()
, &aNumberFormatterWrapper
, uno::Reference< lang::XMultiServiceFactory >( getModel(), uno::UNO_QUERY )
, wrapper::GraphicPropertyItemConverter::FILLED_DATA_POINT );
pSymbolShapeProperties = new SfxItemSet( aSymbolItemConverter.CreateEmptyItemSet() );
aSymbolItemConverter.FillItemSet( *pSymbolShapeProperties );
sal_Int32 nStandardSymbol=0;//@todo get from somewhere
Graphic* pAutoSymbolGraphic = new Graphic( aViewElementListProvider.GetSymbolGraphic( nStandardSymbol, pSymbolShapeProperties ) );
// note: the dialog takes the ownership of pSymbolShapeProperties and pAutoSymbolGraphic
aDlg.setSymbolInformation( pSymbolShapeProperties, pAutoSymbolGraphic );
}
if( aDialogParameter.HasStatisticProperties() )
{
aDlg.SetAxisMinorStepWidthForErrorBarDecimals(
InsertErrorBarsDialog::getAxisMinorStepWidthForErrorBarDecimals( getModel(), m_xChartView, rObjectCID ) );
}
//-------------------------------------------------------------
//open the dialog
if( aDlg.Execute() == RET_OK || (bOkClickOnUnchangedDialogSouldBeRatedAsSuccessAlso && aDlg.DialogWasClosedWithOK()) )
{
const SfxItemSet* pOutItemSet = aDlg.GetOutputItemSet();
if(pOutItemSet)
{
ControllerLockGuard aCLGuard( getModel());
apItemConverter->ApplyItemSet( *pOutItemSet );//model should be changed now
bRet = true;
}
}
}
catch( util::CloseVetoException& )
{
}
catch( uno::RuntimeException& )
{
}
return bRet;
}
void SAL_CALL ChartController::executeDispatch_View3D()
{
try
{
// using assignment for broken gcc 3.3
UndoLiveUpdateGuard aUndoGuard = UndoLiveUpdateGuard(
String( SchResId( STR_ACTION_EDIT_3D_VIEW )),
m_xUndoManager );
// /--
//open dialog
::vos::OGuard aSolarGuard( Application::GetSolarMutex());
View3DDialog aDlg( m_pChartWindow, getModel(), m_pDrawModelWrapper->GetColorTableFromSdrModel() );
if( aDlg.Execute() == RET_OK )
aUndoGuard.commit();
// \--
}
catch( uno::RuntimeException& e)
{
ASSERT_EXCEPTION( e );
}
}
//.............................................................................
} //namespace chart
//.............................................................................