blob: 841671b542e97730031c08b7a84541a77c20f1e9 [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.
*
*************************************************************/
#include "vbachart.hxx"
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/sheet/XCellRangeAddressable.hpp>
#include <com/sun/star/chart/XAxisXSupplier.hpp>
#include <com/sun/star/chart/XAxisYSupplier.hpp>
#include <com/sun/star/chart/XAxisZSupplier.hpp>
#include <com/sun/star/chart/XTwoAxisXSupplier.hpp>
#include <com/sun/star/chart/XTwoAxisYSupplier.hpp>
#include <com/sun/star/chart/XChartDataArray.hpp>
#include <com/sun/star/chart/ChartSymbolType.hpp>
#include <com/sun/star/chart/ChartSolidType.hpp>
#include <com/sun/star/chart/ChartDataRowSource.hpp>
#include <com/sun/star/chart/ChartDataCaption.hpp>
#include <ooo/vba/excel/XlChartType.hpp>
#include <ooo/vba/excel/XlRowCol.hpp>
#include <ooo/vba/excel/XlAxisType.hpp>
#include <ooo/vba/excel/XlAxisGroup.hpp>
#include <basic/sberrors.hxx>
#include "vbachartobject.hxx"
#include "vbarange.hxx"
#include "vbacharttitle.hxx"
#include "vbaaxes.hxx"
using namespace ::com::sun::star;
using namespace ::ooo::vba;
using namespace ::ooo::vba::excel::XlChartType;
using namespace ::ooo::vba::excel::XlRowCol;
using namespace ::ooo::vba::excel::XlAxisType;
using namespace ::ooo::vba::excel::XlAxisGroup;
const rtl::OUString CHART_NAME( RTL_CONSTASCII_USTRINGPARAM("Name") );
// #TODO move this constant to vbaseries.[ch]xx ( when it exists )
const rtl::OUString DEFAULTSERIESPREFIX( RTL_CONSTASCII_USTRINGPARAM("Series") );
const rtl::OUString DATAROWSOURCE( RTL_CONSTASCII_USTRINGPARAM("DataRowSource") );
const rtl::OUString UPDOWN( RTL_CONSTASCII_USTRINGPARAM("UpDown") );
const rtl::OUString VOLUME( RTL_CONSTASCII_USTRINGPARAM("Volume") );
const rtl::OUString LINES( RTL_CONSTASCII_USTRINGPARAM("Lines") );
const rtl::OUString SPLINETYPE( RTL_CONSTASCII_USTRINGPARAM("SplineType") );
const rtl::OUString SYMBOLTYPE( RTL_CONSTASCII_USTRINGPARAM("SymbolType") );
const rtl::OUString DEEP( RTL_CONSTASCII_USTRINGPARAM("Deep") );
const rtl::OUString SOLIDTYPE( RTL_CONSTASCII_USTRINGPARAM("SolidType") );
const rtl::OUString VERTICAL( RTL_CONSTASCII_USTRINGPARAM("Vertical") );
const rtl::OUString PERCENT( RTL_CONSTASCII_USTRINGPARAM("Percent") );
const rtl::OUString STACKED( RTL_CONSTASCII_USTRINGPARAM("Stacked") );
const rtl::OUString DIM3D( RTL_CONSTASCII_USTRINGPARAM("Dim3D") );
const rtl::OUString HASMAINTITLE( RTL_CONSTASCII_USTRINGPARAM("HasMainTitle") );
const rtl::OUString HASLEGEND( RTL_CONSTASCII_USTRINGPARAM("HasLegend") );
const rtl::OUString DATACAPTION( RTL_CONSTASCII_USTRINGPARAM("DataCaption") );
ScVbaChart::ScVbaChart( const css::uno::Reference< ov::XHelperInterface >& _xParent, const css::uno::Reference< css::uno::XComponentContext >& _xContext, const css::uno::Reference< css::lang::XComponent >& _xChartComponent, const css::uno::Reference< css::table::XTableChart >& _xTableChart ) : ChartImpl_BASE( _xParent, _xContext ), mxTableChart( _xTableChart )
{
mxChartDocument.set( _xChartComponent, uno::UNO_QUERY_THROW ) ;
// #TODO is is possible that the XPropertySet interface is not set
// code in setPlotBy seems to indicate that this is possible? but
// additionally there is no check in most of the places where it is used
// ( and therefore could possibly be NULL )
// I'm going to let it throw for the moment ( npower )
mxDiagramPropertySet.set( mxChartDocument->getDiagram(), uno::UNO_QUERY_THROW );
mxChartPropertySet.set( _xChartComponent, uno::UNO_QUERY_THROW ) ;
}
::rtl::OUString SAL_CALL
ScVbaChart::getName() throw (css::uno::RuntimeException)
{
rtl::OUString sName;
uno::Reference< beans::XPropertySet > xProps( mxChartDocument, uno::UNO_QUERY_THROW );
try
{
xProps->getPropertyValue( CHART_NAME ) >>= sName;
}
catch( uno::Exception e ) // swallow exceptions
{
}
return sName;
}
uno::Any SAL_CALL
ScVbaChart::SeriesCollection(const uno::Any&) throw (uno::RuntimeException)
{
return uno::Any();
}
::sal_Int32 SAL_CALL
ScVbaChart::getChartType() throw ( uno::RuntimeException, script::BasicErrorException)
{
sal_Int32 nChartType = -1;
try
{
rtl::OUString sDiagramType = mxChartDocument->getDiagram()->getDiagramType();
if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.AreaDiagram" ))))
{
if (is3D())
{
nChartType = getStackedType(xl3DAreaStacked, xl3DAreaStacked100, xl3DArea);
}
else
{
nChartType = getStackedType(xlAreaStacked, xlAreaStacked100, xlArea);
}
}
else if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.PieDiagram"))))
{
if (is3D())
nChartType = xl3DPie;
else
nChartType = xlPie; /*TODO XlChartType xlPieExploded, XlChartType xlPieOfPie */
}
else if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.BarDiagram"))))
{
sal_Int32 nSolidType = chart::ChartSolidType::RECTANGULAR_SOLID;
if (mxDiagramPropertySet->getPropertySetInfo()->hasPropertyByName(SOLIDTYPE))
{ //in 2D diagrams 'SolidType' may not be set
if (is3D())
mxDiagramPropertySet->getPropertyValue(SOLIDTYPE) >>= nSolidType;
}
switch (nSolidType)
{
case chart::ChartSolidType::CONE:
nChartType = getSolidType(xlConeCol, xlConeColStacked, xlConeColStacked100, xlConeColClustered, xlConeBarStacked, xlConeBarStacked100, xlConeBarClustered);
break;
case chart::ChartSolidType::CYLINDER:
nChartType = getSolidType(xlCylinderCol, xlCylinderColStacked, xlCylinderColStacked100, xlCylinderColClustered, xlCylinderBarStacked, xlCylinderBarStacked100, xlCylinderBarClustered);
break;
case chart::ChartSolidType::PYRAMID:
nChartType = getSolidType(xlPyramidCol, xlPyramidColStacked, xlPyramidColStacked100, xlPyramidColClustered, xlPyramidBarStacked, xlPyramidBarStacked100, xlPyramidBarClustered);
break;
default: // RECTANGULAR_SOLID
if (is3D())
{
nChartType = getSolidType(xl3DColumn, xl3DColumnStacked, xl3DColumnStacked100, xl3DColumnClustered, xl3DBarStacked, xl3DBarStacked100, xl3DBarClustered);
}
else
{
nChartType = getSolidType(xlColumnClustered, xlColumnStacked, xlColumnStacked100, xlColumnClustered, xlBarStacked, xlBarStacked100, xlBarClustered);
}
break;
}
}
else if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.StockDiagram"))))
{
sal_Bool bVolume = sal_False;
mxDiagramPropertySet->getPropertyValue(VOLUME) >>= bVolume;
if (bVolume)
{
nChartType = getStockUpDownValue(xlStockVOHLC, xlStockVHLC);
}
else
{
nChartType = getStockUpDownValue(xlStockOHLC, xlStockHLC);
}
}
else if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.XYDiagram"))))
{
sal_Bool bHasLines = sal_False;
mxDiagramPropertySet->getPropertyValue(LINES) >>= bHasLines;
sal_Int32 nSplineType = 0;
mxDiagramPropertySet->getPropertyValue(SPLINETYPE) >>= nSplineType;
if (nSplineType == 1)
{
nChartType = getMarkerType(xlXYScatterSmooth, xlXYScatterSmoothNoMarkers);
}
else if (bHasLines)
{
nChartType = getMarkerType(xlXYScatterLines, xlXYScatterLinesNoMarkers);
}
else
{
nChartType = xlXYScatter;
}
}
else if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.LineDiagram"))))
{
if (is3D())
{
nChartType = xl3DLine;
}
else if (hasMarkers())
{
nChartType = getStackedType(xlLineMarkersStacked, xlLineMarkersStacked100, xlLineMarkers);
}
else
{
nChartType = getStackedType(xlLineStacked, xlLineStacked100, xlLine);
}
}
else if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.DonutDiagram"))))
{
nChartType = xlDoughnut; // TODO DoughnutExploded ??
}
else if (sDiagramType.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.NetDiagram"))))
{
nChartType = getMarkerType(xlRadarMarkers, xlRadar);
}
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
return nChartType;
}
void SAL_CALL
ScVbaChart::setChartType( ::sal_Int32 _nChartType ) throw ( uno::RuntimeException, script::BasicErrorException)
{
try
{
switch (_nChartType)
{
case xlColumnClustered:
case xlColumnStacked:
case xlColumnStacked100:
case xl3DColumnClustered:
case xl3DColumnStacked:
case xl3DColumnStacked100:
case xl3DColumn:
case xlBarClustered:
case xlBarStacked:
case xlBarStacked100:
case xl3DBarClustered:
case xl3DBarStacked:
case xl3DBarStacked100:
case xlConeColClustered:
case xlConeColStacked:
case xlConeColStacked100:
case xlConeBarClustered:
case xlConeBarStacked:
case xlConeBarStacked100:
case xlConeCol:
case xlPyramidColClustered:
case xlPyramidColStacked:
case xlPyramidColStacked100:
case xlPyramidBarClustered:
case xlPyramidBarStacked:
case xlPyramidBarStacked100:
case xlPyramidCol:
case xlCylinderColClustered:
case xlCylinderColStacked:
case xlCylinderColStacked100:
case xlCylinderBarClustered:
case xlCylinderBarStacked:
case xlCylinderBarStacked100:
case xlCylinderCol:
case xlSurface: // not possible
case xlSurfaceWireframe:
case xlSurfaceTopView:
case xlSurfaceTopViewWireframe:
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.BarDiagram")));
break;
case xlLine:
case xl3DLine:
case xlLineStacked:
case xlLineStacked100:
case xlLineMarkers:
case xlLineMarkersStacked:
case xlLineMarkersStacked100:
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.LineDiagram")));
break;
case xl3DArea:
case xlArea:
case xlAreaStacked:
case xlAreaStacked100:
case xl3DAreaStacked:
case xl3DAreaStacked100:
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.AreaDiagram")) );
break;
case xlDoughnut:
case xlDoughnutExploded:
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.DonutDiagram") ) );
break;
case xlStockHLC:
case xlStockOHLC:
case xlStockVHLC:
case xlStockVOHLC:
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.StockDiagram")));
mxDiagramPropertySet->setPropertyValue( UPDOWN, uno::makeAny(sal_Bool((_nChartType == xlStockOHLC) || (_nChartType == xlStockVOHLC))));
mxDiagramPropertySet->setPropertyValue(VOLUME, uno::makeAny(sal_Bool((_nChartType == xlStockVHLC) || (_nChartType == xlStockVOHLC))));
break;
case xlPieOfPie: // not possible
case xlPieExploded: // SegmentOffset an ChartDataPointProperties ->am XDiagram abholen //wie macht Excel das?
case xl3DPieExploded:
case xl3DPie:
case xlPie:
case xlBarOfPie: // not possible (Zoom pie)
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.PieDiagram")));
break;
case xlRadar:
case xlRadarMarkers:
case xlRadarFilled:
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.NetDiagram")));
break;
case xlXYScatter:
case xlBubble: // not possible
case xlBubble3DEffect: // not possible
case xlXYScatterLines:
case xlXYScatterLinesNoMarkers:
case xlXYScatterSmooth:
case xlXYScatterSmoothNoMarkers:
setDiagram( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart.XYDiagram")));
switch(_nChartType)
{
case xlXYScatter:
case xlBubble: // not possible
case xlBubble3DEffect: // not possible
mxDiagramPropertySet->setPropertyValue(LINES, uno::makeAny( sal_False ));
break;
case xlXYScatterLines:
case xlXYScatterLinesNoMarkers:
mxDiagramPropertySet->setPropertyValue(LINES, uno::makeAny( sal_True ));
break;
case xlXYScatterSmooth:
case xlXYScatterSmoothNoMarkers:
mxDiagramPropertySet->setPropertyValue(SPLINETYPE, uno::makeAny( sal_Int32(1)));
break;
default:
break;
}
break;
default:
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_CONVERSION, rtl::OUString() );
}
switch (_nChartType)
{
case xlLineMarkers:
case xlLineMarkersStacked:
case xlLineMarkersStacked100:
case xlRadarMarkers:
case xlXYScatterLines:
case xlXYScatterSmooth:
case xlXYScatter:
case xlBubble: // not possible
case xlBubble3DEffect: // not possible
mxDiagramPropertySet->setPropertyValue(SYMBOLTYPE, uno::makeAny( chart::ChartSymbolType::AUTO));
break;
default:
if (mxDiagramPropertySet->getPropertySetInfo()->hasPropertyByName(SYMBOLTYPE))
{
mxDiagramPropertySet->setPropertyValue(SYMBOLTYPE, uno::makeAny(chart::ChartSymbolType::NONE));
}
break;
}
switch (_nChartType)
{
case xlConeCol:
case xlPyramidCol:
case xlCylinderCol:
case xl3DColumn:
case xlSurface: // not possible
case xlSurfaceWireframe:
case xlSurfaceTopView:
case xlSurfaceTopViewWireframe:
mxDiagramPropertySet->setPropertyValue(DEEP,uno::makeAny( sal_True ));
break;
default:
if (mxDiagramPropertySet->getPropertySetInfo()->hasPropertyByName(DEEP))
{
mxDiagramPropertySet->setPropertyValue(DEEP, uno::makeAny( sal_False));
}
break;
}
switch (_nChartType)
{
case xlConeColClustered:
case xlConeColStacked:
case xlConeColStacked100:
case xlConeBarClustered:
case xlConeBarStacked:
case xlConeBarStacked100:
case xlConeCol:
mxDiagramPropertySet->setPropertyValue(SOLIDTYPE, uno::makeAny(chart::ChartSolidType::CONE));
break;
case xlPyramidColClustered:
case xlPyramidColStacked:
case xlPyramidColStacked100:
case xlPyramidBarClustered:
case xlPyramidBarStacked:
case xlPyramidBarStacked100:
case xlPyramidCol:
mxDiagramPropertySet->setPropertyValue(SOLIDTYPE, uno::makeAny(chart::ChartSolidType::PYRAMID));
break;
case xlCylinderColClustered:
case xlCylinderColStacked:
case xlCylinderColStacked100:
case xlCylinderBarClustered:
case xlCylinderBarStacked:
case xlCylinderBarStacked100:
case xlCylinderCol:
mxDiagramPropertySet->setPropertyValue(SOLIDTYPE, uno::makeAny(chart::ChartSolidType::CYLINDER));
break;
default:
if (mxDiagramPropertySet->getPropertySetInfo()->hasPropertyByName(SOLIDTYPE))
{
mxDiagramPropertySet->setPropertyValue(SOLIDTYPE, uno::makeAny(chart::ChartSolidType::RECTANGULAR_SOLID));
}
break;
}
switch ( _nChartType)
{
case xlConeCol:
case xlConeColClustered:
case xlConeColStacked:
case xlConeColStacked100:
case xlPyramidColClustered:
case xlPyramidColStacked:
case xlPyramidColStacked100:
case xlCylinderColClustered:
case xlCylinderColStacked:
case xlCylinderColStacked100:
case xlColumnClustered:
case xlColumnStacked:
case xlColumnStacked100:
case xl3DColumnClustered:
case xl3DColumnStacked:
case xl3DColumnStacked100:
case xlSurface: // not possible
case xlSurfaceWireframe:
case xlSurfaceTopView:
case xlSurfaceTopViewWireframe:
mxDiagramPropertySet->setPropertyValue(VERTICAL, uno::makeAny( sal_True));
break;
default:
if (mxDiagramPropertySet->getPropertySetInfo()->hasPropertyByName(VERTICAL))
{
mxDiagramPropertySet->setPropertyValue(VERTICAL, uno::makeAny(sal_False));
}
break;
}
switch (_nChartType)
{
case xlColumnStacked:
case xl3DColumnStacked:
case xlBarStacked:
case xl3DBarStacked:
case xlLineStacked:
case xlLineMarkersStacked:
case xlAreaStacked:
case xl3DAreaStacked:
case xlCylinderColStacked:
case xlCylinderBarStacked:
case xlConeColStacked:
case xlConeBarStacked:
case xlPyramidColStacked:
case xlPyramidBarStacked:
mxDiagramPropertySet->setPropertyValue(PERCENT, uno::makeAny( sal_False ));
mxDiagramPropertySet->setPropertyValue(STACKED, uno::makeAny( sal_True ));
break;
case xlPyramidColStacked100:
case xlPyramidBarStacked100:
case xlConeColStacked100:
case xlConeBarStacked100:
case xlCylinderBarStacked100:
case xlCylinderColStacked100:
case xl3DAreaStacked100:
case xlLineMarkersStacked100:
case xlAreaStacked100:
case xlLineStacked100:
case xl3DBarStacked100:
case xlBarStacked100:
case xl3DColumnStacked100:
case xlColumnStacked100:
mxDiagramPropertySet->setPropertyValue(STACKED, uno::makeAny( sal_True));
mxDiagramPropertySet->setPropertyValue(PERCENT, uno::makeAny( sal_True ));
break;
default:
mxDiagramPropertySet->setPropertyValue(PERCENT, uno::makeAny( sal_False));
mxDiagramPropertySet->setPropertyValue(STACKED, uno::makeAny( sal_False));
break;
}
switch (_nChartType)
{
case xl3DArea:
case xl3DAreaStacked:
case xl3DAreaStacked100:
case xl3DBarClustered:
case xl3DBarStacked:
case xl3DBarStacked100:
case xl3DColumn:
case xl3DColumnClustered:
case xl3DColumnStacked:
case xl3DColumnStacked100:
case xl3DLine:
case xl3DPie:
case xl3DPieExploded:
case xlConeColClustered:
case xlConeColStacked:
case xlConeColStacked100:
case xlConeBarClustered:
case xlConeBarStacked:
case xlConeBarStacked100:
case xlConeCol:
case xlPyramidColClustered:
case xlPyramidColStacked:
case xlPyramidColStacked100:
case xlPyramidBarClustered:
case xlPyramidBarStacked:
case xlPyramidBarStacked100:
case xlPyramidCol:
case xlCylinderColClustered:
case xlCylinderColStacked:
case xlCylinderColStacked100:
case xlCylinderBarClustered:
case xlCylinderBarStacked:
case xlCylinderBarStacked100:
case xlCylinderCol:
mxDiagramPropertySet->setPropertyValue(DIM3D, uno::makeAny( sal_True));
break;
default:
if (mxDiagramPropertySet->getPropertySetInfo()->hasPropertyByName(DIM3D))
{
mxDiagramPropertySet->setPropertyValue(DIM3D, uno::makeAny( sal_False));
}
break;
}
}
catch ( uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
void SAL_CALL
ScVbaChart::Activate() throw (script::BasicErrorException, uno::RuntimeException)
{
// #TODO how are Chart sheets handled ( I know we don't even consider
// them in the worksheets/sheets collections ), but.....???
// note: in vba for excel the parent of a Chart sheet is a workbook,
// e.g. 'ThisWorkbook'
uno::Reference< XHelperInterface > xParent( getParent() );
ScVbaChartObject* pChartObj = static_cast< ScVbaChartObject* >( xParent.get() );
if ( pChartObj )
pChartObj->Activate();
else
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no ChartObject as parent" ) ) );
}
void SAL_CALL
ScVbaChart::setSourceData( const css::uno::Reference< ::ooo::vba::excel::XRange >& _xCalcRange, const css::uno::Any& _aPlotBy ) throw (css::script::BasicErrorException, css::uno::RuntimeException)
{
try
{
uno::Sequence< table::CellRangeAddress > mRangeAddresses(1);
table::CellRangeAddress mSingleRangeAddress;
uno::Reference< sheet::XCellRangeAddressable > xAddressable( _xCalcRange->getCellRange(), uno::UNO_QUERY_THROW );
mSingleRangeAddress = xAddressable->getRangeAddress();
mRangeAddresses[0] = mSingleRangeAddress;
mxTableChart->setRanges(mRangeAddresses);
sal_Bool bsetRowHeaders = sal_False;
sal_Bool bsetColumnHeaders = sal_False;
ScVbaRange* pRange = static_cast< ScVbaRange* >( _xCalcRange.get() );
if ( pRange )
{
ScDocument* pDoc = pRange->getScDocument();
if ( pDoc )
{
bsetRowHeaders = pDoc->HasRowHeader( static_cast< SCCOL >( mSingleRangeAddress.StartColumn ), static_cast< SCROW >( mSingleRangeAddress.StartRow ), static_cast< SCCOL >( mSingleRangeAddress.EndColumn ), static_cast< SCROW >( mSingleRangeAddress.EndRow ), static_cast< SCTAB >( mSingleRangeAddress.Sheet ) );;
bsetColumnHeaders = pDoc->HasColHeader( static_cast< SCCOL >( mSingleRangeAddress.StartColumn ), static_cast< SCROW >( mSingleRangeAddress.StartRow ), static_cast< SCCOL >( mSingleRangeAddress.EndColumn ), static_cast< SCROW >( mSingleRangeAddress.EndRow ), static_cast< SCTAB >( mSingleRangeAddress.Sheet ));
;
}
}
mxTableChart->setHasRowHeaders(bsetRowHeaders);
mxTableChart->setHasColumnHeaders(bsetColumnHeaders);
if ((!bsetColumnHeaders) || (!bsetRowHeaders))
{
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
if (!bsetColumnHeaders)
{
xChartDataArray->setColumnDescriptions( getDefaultSeriesDescriptions(xChartDataArray->getColumnDescriptions().getLength() ));
}
if (!bsetRowHeaders)
{
xChartDataArray->setRowDescriptions(getDefaultSeriesDescriptions(xChartDataArray->getRowDescriptions().getLength() ));
}
}
if ( _aPlotBy.hasValue() )
{
sal_Int32 nVal = 0;
_aPlotBy >>= nVal;
setPlotBy( nVal );
}
else
{
sal_Int32 nRows = mSingleRangeAddress.EndRow - mSingleRangeAddress.StartRow;
sal_Int32 nCols = mSingleRangeAddress.EndColumn - mSingleRangeAddress.StartColumn;
// AutoDetect emulation
if ( nRows > nCols )
setPlotBy( xlColumns );
else if ( nRows <= nCols )
setPlotBy( xlRows );
}
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
uno::Sequence< rtl::OUString >
ScVbaChart::getDefaultSeriesDescriptions( sal_Int32 _nCount )
{
uno::Sequence< rtl::OUString > sDescriptions ( _nCount );
sal_Int32 nLen = sDescriptions.getLength();
for (sal_Int32 i = 0; i < nLen; i++)
{
sDescriptions[i] = DEFAULTSERIESPREFIX + rtl::OUString::valueOf(i+1);
}
return sDescriptions;
}
void
ScVbaChart::setDefaultChartType() throw ( script::BasicErrorException )
{
setChartType( xlColumnClustered );
}
void
ScVbaChart::setPlotBy( ::sal_Int32 _nPlotBy ) throw (css::script::BasicErrorException, css::uno::RuntimeException)
{
try
{
if ( !mxDiagramPropertySet.is() )
setDefaultChartType();
switch (_nPlotBy)
{
case xlRows:
mxDiagramPropertySet->setPropertyValue( DATAROWSOURCE, uno::makeAny( chart::ChartDataRowSource_ROWS ) );
break;
case xlColumns:
mxDiagramPropertySet->setPropertyValue( DATAROWSOURCE, uno::makeAny( chart::ChartDataRowSource_COLUMNS) );
break;
default:
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
::sal_Int32 SAL_CALL
ScVbaChart::getPlotBy( ) throw (script::BasicErrorException, uno::RuntimeException)
{
try
{
chart::ChartDataRowSource aChartDataRowSource;
mxDiagramPropertySet->getPropertyValue(DATAROWSOURCE) >>= aChartDataRowSource;
if (aChartDataRowSource == chart::ChartDataRowSource_COLUMNS)
{
return xlColumns;
}
else
{
return xlRows;
}
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
void
ScVbaChart::setDiagram( const rtl::OUString& _sDiagramType ) throw( script::BasicErrorException )
{
try
{
uno::Reference< lang::XMultiServiceFactory > xMSF( mxChartDocument, uno::UNO_QUERY_THROW );
uno::Reference< chart::XDiagram > xDiagram( xMSF->createInstance( _sDiagramType ), uno::UNO_QUERY_THROW );
mxChartDocument->setDiagram( xDiagram );
mxDiagramPropertySet.set( xDiagram, uno::UNO_QUERY_THROW );
}
catch ( uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
// #TODO find out why we have Location/getLocation ? there is afaiks no
// Location property, just a Location function for the Chart object
sal_Int32 SAL_CALL
ScVbaChart::Location() throw (css::script::BasicErrorException, css::uno::RuntimeException)
{
return getLocation();
}
sal_Int32 SAL_CALL
ScVbaChart::getLocation() throw (css::script::BasicErrorException, css::uno::RuntimeException)
{
return -1;
}
void SAL_CALL
ScVbaChart::setLocation( ::sal_Int32 /*where*/, const css::uno::Any& /*Name*/ ) throw (script::BasicErrorException, uno::RuntimeException)
{
// Helper api just stubs out the code <shrug>
// #TODO come back and make sense out of this
// String sheetName = null;
//
// if ((name != null) && name instanceof String) {
// sheetName = (String) name;
// }
// XSpreadsheetDocument xShDoc = (XSpreadsheetDocument) UnoRuntime.queryInterface( XSpreadsheetDocument.class,getXModel() );
// com.sun.star.sheet.XSpreadsheets xSheets = xShDoc.Sheets();
//
// switch (where) {
// case ClLocationType.clLocationAsObject_value: //{
//
// if (sheetName == null) {
// DebugHelper.writeInfo("Can't embed in Chart without knowing SheetName");
// return;
// }
//
// try {
// Any any = (Any) xSheets.getByName(sheetName);
// chartSheet = (XSpreadsheet) any.getObject();
//
// // chartSheet = (XSpreadsheet) xSheets.getByName( sheetName );
// } catch (NoSuchElementException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
//
// return;
// } catch (WrappedTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
//
// return;
// } catch (java.lang.Exception e) {
// e.printStackTrace();
// }
//
// XTableChartsSupplier xTCS = (XTableChartsSupplier) UnoRuntime.queryInterface( XTableChartsSupplier.class, chartSheet);
// XTableCharts xTableCharts = xTCS.getCharts();
// XIndexAccess xIA = (XIndexAccess) UnoRuntime.queryInterface( XIndexAccess.class, xTableCharts);
// int numCharts = xIA.getCount();
// chartName = "Chart " + (numCharts + 1);
//
// //}
// break;
//
// case ClLocationType.clLocationAsNewSheet_value:
// case ClLocationType.clLocationAutomatic_value:default: //{
// chartName = "Chart 1"; // Since it's a new sheet, it's the first on it...
//
// XIndexAccess xSheetIA = (XIndexAccess) UnoRuntime.queryInterface( XIndexAccess.class, xSheets);
//
// short newSheetNum = (short) (xSheetIA.getCount() + 1);
//
// if (sheetName == null){
// sheetName = "ChartSheet " + newSheetNum; // Why not?
// }
// // DPK TODO : Probably should use Sheets to create this!
// xSheets.insertNewByName(sheetName, newSheetNum);
//
// try {
// chartSheet =
// (XSpreadsheet) xSheets.getByName(sheetName);
// } catch (NoSuchElementException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
//
// return;
// } catch (WrappedTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
//
// return;
// }
//
// //}
// break;
// }
//
// // Last thing should be a call to createChartForReal(), one of them
// // should succeed.
// createChartForReal();
}
sal_Bool SAL_CALL
ScVbaChart::getHasTitle( ) throw (script::BasicErrorException, uno::RuntimeException)
{
sal_Bool bHasTitle = sal_False;
try
{
mxChartPropertySet->getPropertyValue(HASMAINTITLE) >>= bHasTitle;
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
return bHasTitle;
}
void SAL_CALL
ScVbaChart::setHasTitle( ::sal_Bool bTitle ) throw (script::BasicErrorException, uno::RuntimeException)
{
try
{
mxChartPropertySet->setPropertyValue(HASMAINTITLE, uno::makeAny( bTitle ));
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
::sal_Bool SAL_CALL
ScVbaChart::getHasLegend( ) throw (script::BasicErrorException, uno::RuntimeException)
{
sal_Bool bHasLegend = sal_False;
try
{
mxChartPropertySet->getPropertyValue(HASLEGEND) >>= bHasLegend;
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
return bHasLegend;
}
void SAL_CALL
ScVbaChart::setHasLegend( ::sal_Bool bLegend ) throw (script::BasicErrorException, uno::RuntimeException)
{
try
{
mxChartPropertySet->setPropertyValue(HASLEGEND, uno::makeAny(bLegend));
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
uno::Reference< excel::XChartTitle > SAL_CALL
ScVbaChart::getChartTitle( ) throw (script::BasicErrorException, uno::RuntimeException)
{
uno::Reference< drawing::XShape > xTitleShape = mxChartDocument->getTitle();
// #TODO check parent
return new ScVbaChartTitle(this, mxContext, xTitleShape);
}
uno::Any SAL_CALL
ScVbaChart::Axes( const uno::Any& Type, const uno::Any& AxisGroup ) throw (script::BasicErrorException, uno::RuntimeException)
{
// mmm chart probably is the parent, #TODO check parent
uno::Reference< excel::XAxes > xAxes = new ScVbaAxes( this, mxContext, this );
if ( !Type.hasValue() )
return uno::makeAny( xAxes );
return xAxes->Item( Type, AxisGroup );
}
bool
ScVbaChart::is3D() throw ( uno::RuntimeException )
{
// #TODO perhaps provide limited Debughelper functionality
sal_Bool is3d = sal_False;
mxDiagramPropertySet->getPropertyValue(DIM3D) >>= is3d;
return is3d;
}
sal_Int32
ScVbaChart::getStackedType( sal_Int32 _nStacked, sal_Int32 _n100PercentStacked, sal_Int32 _nUnStacked ) throw ( uno::RuntimeException )
{
// #TODO perhaps provide limited Debughelper functionality
if (isStacked())
{
if (is100PercentStacked())
return _n100PercentStacked;
else
return _nStacked;
}
else
return _nUnStacked;
}
bool
ScVbaChart::isStacked() throw ( uno::RuntimeException )
{
// #TODO perhaps provide limited Debughelper functionality
sal_Bool bStacked = sal_False;
mxDiagramPropertySet->getPropertyValue(STACKED) >>= bStacked;
return bStacked;
}
bool
ScVbaChart::is100PercentStacked() throw ( uno::RuntimeException )
{
// #TODO perhaps provide limited Debughelper functionality
sal_Bool b100Percent = sal_False;
mxDiagramPropertySet->getPropertyValue(PERCENT) >>= b100Percent;
return b100Percent;
}
sal_Int32
ScVbaChart::getSolidType(sal_Int32 _nDeep, sal_Int32 _nVertiStacked, sal_Int32 _nVerti100PercentStacked, sal_Int32 _nVertiUnStacked, sal_Int32 _nHoriStacked, sal_Int32 _nHori100PercentStacked, sal_Int32 _nHoriUnStacked) throw ( script::BasicErrorException )
{
sal_Bool bIsVertical = true;
try
{
mxDiagramPropertySet->getPropertyValue(VERTICAL) >>= bIsVertical;
sal_Bool bIsDeep = false;
mxDiagramPropertySet->getPropertyValue(DEEP) >>= bIsDeep;
if (bIsDeep)
{
return _nDeep;
}
else
{
if (bIsVertical)
{
return getStackedType(_nVertiStacked, _nVerti100PercentStacked, _nVertiUnStacked);
}
else
{
return getStackedType(_nHoriStacked, _nHori100PercentStacked, _nHoriUnStacked);
}
}
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
sal_Int32
ScVbaChart::getStockUpDownValue(sal_Int32 _nUpDown, sal_Int32 _nNotUpDown) throw (script::BasicErrorException)
{
sal_Bool bUpDown = sal_False;
try
{
mxDiagramPropertySet->getPropertyValue(UPDOWN) >>= bUpDown;
if (bUpDown)
{
return _nUpDown;
}
else
{
return _nNotUpDown;
}
}
catch (uno::Exception& )
{
rtl::OUString aTemp; // temporary needed for g++ 3.3.5
script::BasicErrorException( aTemp, uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
return _nNotUpDown;
}
bool
ScVbaChart::hasMarkers() throw ( script::BasicErrorException )
{
bool bHasMarkers = false;
try
{
sal_Int32 nSymbol=0;
mxDiagramPropertySet->getPropertyValue(SYMBOLTYPE) >>= nSymbol;
bHasMarkers = nSymbol != chart::ChartSymbolType::NONE;
}
catch ( uno::Exception& )
{
rtl::OUString aTemp; // temporary needed for g++ 3.3.5
script::BasicErrorException( aTemp, uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
return bHasMarkers;
}
sal_Int32
ScVbaChart::getMarkerType(sal_Int32 _nWithMarkers, sal_Int32 _nWithoutMarkers) throw ( script::BasicErrorException )
{
if (hasMarkers())
return _nWithMarkers;
return _nWithoutMarkers;
}
void
ScVbaChart::assignDiagramAttributes()
{
xAxisXSupplier.set( mxDiagramPropertySet, uno::UNO_QUERY_THROW );
xAxisYSupplier.set( mxDiagramPropertySet, uno::UNO_QUERY_THROW );
xAxisZSupplier.set( mxDiagramPropertySet, uno::UNO_QUERY_THROW );
xTwoAxisXSupplier.set( mxDiagramPropertySet, uno::UNO_QUERY_THROW );
xTwoAxisYSupplier.set( mxDiagramPropertySet, uno::UNO_QUERY_THROW );
}
bool
ScVbaChart::isSeriesIndexValid(sal_Int32 _seriesindex) throw( script::BasicErrorException )
{
bool bret = false;
try
{
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
// dblValues = xChartDataArray.getData();
//TODO I guess we have to differentiate between XlRowCol
if ( !xChartDataArray.is() )
{
if (getPlotBy() == xlRows)
{
if ((_seriesindex < xChartDataArray->getRowDescriptions().getLength() ) && (_seriesindex >= 0))
bret = true;
}
else
{
if ((_seriesindex < xChartDataArray->getColumnDescriptions().getLength() ) && (_seriesindex >= 0))
bret = true;
}
}
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
if (!bret)
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_OUT_OF_RANGE, rtl::OUString() );
}
return bret;
}
bool
ScVbaChart::areIndicesValid( sal_Int32 _seriesindex, sal_Int32 _valindex) throw ( css::script::BasicErrorException )
{
if (isSeriesIndexValid(_seriesindex))
{
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
dblValues = xChartDataArray->getData();
return (_valindex < dblValues[_seriesindex].getLength() );
}
return false;
}
sal_Int32
ScVbaChart::getSeriesIndex(rtl::OUString _sseriesname) throw ( script::BasicErrorException )
{
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
if (getPlotBy() == xlRows)
return ContainerUtilities::FieldInList(xChartDataArray->getRowDescriptions(), _sseriesname);
return ContainerUtilities::FieldInList(xChartDataArray->getColumnDescriptions(), _sseriesname);
}
void
ScVbaChart::setSeriesName(sal_Int32 _index, rtl::OUString _sname) throw ( script::BasicErrorException )
{
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
if (isSeriesIndexValid(_index))
{
uno::Sequence< rtl::OUString > sDescriptions = xChartDataArray->getColumnDescriptions();
sDescriptions[_index] = _sname;
xChartDataArray->setColumnDescriptions(sDescriptions);
}
}
sal_Int32
ScVbaChart::getSeriesCount() throw ( script::BasicErrorException )
{
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
if (getPlotBy() == xlRows)
return xChartDataArray->getRowDescriptions().getLength();
return xChartDataArray->getColumnDescriptions().getLength();
}
rtl::OUString
ScVbaChart::getSeriesName(sal_Int32 _index) throw ( script::BasicErrorException )
{
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
uno::Sequence< rtl::OUString > sDescriptions;
rtl::OUString sName;
if (isSeriesIndexValid(_index))
{
if (getPlotBy() == xlRows)
sDescriptions = xChartDataArray->getRowDescriptions();
else
sDescriptions = xChartDataArray->getColumnDescriptions();
sName = sDescriptions[_index];
}
return sName;
}
double
ScVbaChart::getValue(sal_Int32 _seriesindex, sal_Int32 _valindex) throw ( script::BasicErrorException )
{
double result = -1.0;
if (areIndicesValid(_seriesindex, _valindex))
{
if (getPlotBy() == xlRows)
result = dblValues[_seriesindex][_valindex];
else
result = dblValues[_valindex][_seriesindex];
}
return result;
}
sal_Int32
ScVbaChart::getValuesCount(sal_Int32 _seriesIndex) throw ( script::BasicErrorException )
{
sal_Int32 nCount = 0;
uno::Reference< chart::XChartDataArray > xChartDataArray( mxChartDocument->getData(), uno::UNO_QUERY_THROW );
if (isSeriesIndexValid(_seriesIndex))
{
dblValues = xChartDataArray->getData();
if (getPlotBy() == xlRows)
nCount = dblValues[_seriesIndex].getLength();
else
nCount = dblValues.getLength();
}
return nCount;
}
uno::Reference< excel::XDataLabels >
ScVbaChart::DataLabels( const uno::Reference< ov::excel::XSeries > /*_oSeries*/ ) throw ( css::script::BasicErrorException )
{
if ( true )
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
// #TODO #FIXE provide implementation
return uno::Reference< excel::XDataLabels > ();
}
bool
ScVbaChart::getHasDataCaption( const uno::Reference< css::beans::XPropertySet >& _xPropertySet )throw ( script::BasicErrorException )
{
bool bResult = false;
try
{
sal_Int32 nChartDataCaption = 0;
_xPropertySet->getPropertyValue(DATACAPTION) >>= nChartDataCaption;
bResult = (nChartDataCaption != chart::ChartDataCaption::NONE);
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
return bResult;
}
void
ScVbaChart::setHasDataCaption( const uno::Reference< beans::XPropertySet >& _xPropertySet, bool _bHasDataLabels )throw ( script::BasicErrorException )
{
try
{
if ( _bHasDataLabels )
_xPropertySet->setPropertyValue(DATACAPTION, uno::makeAny ( chart::ChartDataCaption::VALUE) );
else
_xPropertySet->setPropertyValue(DATACAPTION, uno::makeAny ( chart::ChartDataCaption::NONE) );
}
catch (uno::Exception& )
{
throw script::BasicErrorException( rtl::OUString(), uno::Reference< uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
uno::Reference< beans::XPropertySet >
ScVbaChart::getAxisPropertySet(sal_Int32 _nAxisType, sal_Int32 _nAxisGroup) throw ( script::BasicErrorException )
{
assignDiagramAttributes();
uno::Reference< beans::XPropertySet > xAxisProps;
switch(_nAxisType)
{
case xlCategory:
if (_nAxisGroup == xlPrimary)
{
xAxisProps = xAxisXSupplier->getXAxis();
}
else if (_nAxisGroup == xlSecondary)
{
xAxisProps = xTwoAxisXSupplier->getSecondaryXAxis();
}
break;
case xlSeriesAxis:
// if (_nAxisGroup == xlPrimary){
xAxisProps = xAxisZSupplier->getZAxis();
break;
// }
// else if (_nAxisGroup == xlSecondary){
// return xTwoAxisXSupplier.getSecondaryZAxis();
// }
case xlValue:
if (_nAxisGroup == xlPrimary)
xAxisProps = xAxisYSupplier->getYAxis();
else if (_nAxisGroup == xlSecondary)
xAxisProps = xTwoAxisYSupplier->getSecondaryYAxis();
break;
default:
return xAxisProps;
}
return xAxisProps;
}
rtl::OUString&
ScVbaChart::getServiceImplName()
{
static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaChart") );
return sImplName;
}
uno::Sequence< rtl::OUString >
ScVbaChart::getServiceNames()
{
static uno::Sequence< rtl::OUString > aServiceNames;
if ( aServiceNames.getLength() == 0 )
{
aServiceNames.realloc( 1 );
aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.Chart" ) );
}
return aServiceNames;
}