diff options
Diffstat (limited to 'chart2/source/view/main/ChartView.cxx')
-rw-r--r-- | chart2/source/view/main/ChartView.cxx | 627 |
1 files changed, 627 insertions, 0 deletions
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx new file mode 100644 index 000000000000..1a13f806dc38 --- /dev/null +++ b/chart2/source/view/main/ChartView.cxx @@ -0,0 +1,627 @@ +/************************************************************************* + * + * $RCSfile: ChartView.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: bm $ $Date: 2003-10-06 09:58:34 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2003 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#include "ChartViewImpl.hxx" +#include "PlottingPositionHelper.hxx" +#include "ViewDefines.hxx" +#include "VDiagram.hxx" +#include "VTitle.hxx" +#include "ShapeFactory.hxx" +#include "VAxis.hxx" +#include "VSeriesPlotter.hxx" +#include "CommonConverters.hxx" +#include "macros.hxx" +#include "TitleHelper.hxx" + +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_AXISORIENTATION_HPP_ +#include <drafts/com/sun/star/chart2/AxisOrientation.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_EXPLICITSUBINCREMENT_HPP_ +#include <drafts/com/sun/star/chart2/ExplicitSubIncrement.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XAXISCONTAINER_HPP_ +#include <drafts/com/sun/star/chart2/XAxisContainer.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XCHARTDOCUMENT_HPP_ +#include <drafts/com/sun/star/chart2/XChartDocument.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XCHARTTYPEGROUP_HPP_ +#include <drafts/com/sun/star/chart2/XChartTypeGroup.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XDATASERIES_HPP_ +#include <drafts/com/sun/star/chart2/XDataSeries.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XDIAGRAM_HPP_ +#include <drafts/com/sun/star/chart2/XDiagram.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XGRIDCONTAINER_HPP_ +#include <drafts/com/sun/star/chart2/XGridContainer.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XSTACKABLESCALEGROUP_HPP_ +#include <drafts/com/sun/star/chart2/XStackableScaleGroup.hpp> +#endif +#ifndef _DRAFTS_COM_SUN_STAR_CHART2_XTITLED_HPP_ +#include <drafts/com/sun/star/chart2/XTitled.hpp> +#endif + +//............................................................................. +namespace chart +{ +//............................................................................. + +using namespace ::com::sun::star; +using namespace ::drafts::com::sun::star::chart2; + +//static +ChartView* ChartView::createView( + const uno::Reference< uno::XComponentContext >& xCC + , const uno::Reference< frame::XModel >& xChartModel + , const uno::Reference<drawing::XDrawPagesSupplier>& xDrawPagesSuplier + , NumberFormatterWrapper* pNumberFormatterWrapper ) +{ + return new ChartViewImpl(xCC,xChartModel,xDrawPagesSuplier,pNumberFormatterWrapper); +} + +ChartViewImpl::ChartViewImpl( + const uno::Reference< uno::XComponentContext >& xCC + , const uno::Reference< frame::XModel >& xChartModel + , const uno::Reference<drawing::XDrawPagesSupplier>& xDrawPagesSuplier + , NumberFormatterWrapper* pNumberFormatterWrapper ) + : m_xCC(xCC) + , m_xChartModel(xChartModel) + , m_xShapeFactory(NULL) + , m_xDrawPage(NULL) + , m_pNumberFormatterWrapper( pNumberFormatterWrapper ) + , m_pVDiagram(NULL) + , m_pVLegend(NULL) + , m_pVTitle(NULL) + , m_pVSubtitle(NULL) +{ + //get factory from draw model + m_xShapeFactory = uno::Reference<lang::XMultiServiceFactory>( xDrawPagesSuplier, uno::UNO_QUERY ); + + //create draw page: + uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSuplier->getDrawPages (); + m_xDrawPage = xDrawPages->insertNewByIndex ( 0 ); +} + +ChartViewImpl::~ChartViewImpl() +{ + m_xDrawPage = NULL; +} + +Matrix4D createTransformationSceneToScreen( + const awt::Point& rPos, const awt::Size& rSize ) +{ + Matrix4D aM4; + aM4.Scale(double(rSize.Width)/FIXED_SIZE_FOR_3D_CHART_VOLUME + , -double(rSize.Height)/FIXED_SIZE_FOR_3D_CHART_VOLUME, 1.0 ); + aM4.Translate(double(rPos.X), double(rPos.Y+rSize.Height-1), 0); + return aM4; +} + +drawing::HomogenMatrix createTransformationMatrix() +{ + Matrix4D aM4; + aM4.RotateY( -ZDIRECTION*F_PI/9.0 ); + aM4.RotateX( ZDIRECTION*F_PI/10.0 ); + + //aM4.RotateY( ZDIRECTION*F_PI/2.0 ); + //aM4.RotateX( -ZDIRECTION*F_PI/2.0 ); + + //aM4.RotateX( -ZDIRECTION*F_PI/2.0 ); + + aM4.Translate(0, -FIXED_SIZE_FOR_3D_CHART_VOLUME/2.0, 0); +// aM4.Scale(1, 1, ZDIRECTION); //invert direction of z coordinate to get a left handed system + aM4.Scale(1.0, 1.0, ZDIRECTION); + drawing::HomogenMatrix aHM = Matrix4DToHomogenMatrix(aM4); + return aHM; +} + +ShapeAppearance getDefaultStyle( sal_Int32 nStyle ) +{ + switch(nStyle%8) + { + case 1: + return ShapeAppearance( 0, 0, GEOMETRY_CYLINDER, SYMBOL_DIAMOND ); + case 2: + return ShapeAppearance( 0, 0, GEOMETRY_PYRAMID, SYMBOL_ARROW_DOWN ); + case 3: + return ShapeAppearance( 0, 0, GEOMETRY_CONE, SYMBOL_ARROW_UP ); + case 4: + return ShapeAppearance( 0, 0, GEOMETRY_CUBOID, SYMBOL_ARROW_RIGHT ); + case 5: + return ShapeAppearance( 0, 0, GEOMETRY_CYLINDER, SYMBOL_ARROW_LEFT ); + case 6: + return ShapeAppearance( 0, 0, GEOMETRY_PYRAMID, SYMBOL_BOWTIE ); + case 7: + return ShapeAppearance( 0, 0, GEOMETRY_CONE, SYMBOL_SANDGLASS ); + default: + return ShapeAppearance( 0, 0, GEOMETRY_CUBOID, SYMBOL_SQUARE ); + } +} + +uno::Reference< drawing::XShapes > createDiagram( + const uno::Reference< drawing::XShapes>& xPageShapes + , const uno::Reference< lang::XMultiServiceFactory>& xShapeFactory + , const awt::Point& rPos, const awt::Size& rSize + , sal_Int32 nDimension + , const uno::Reference< XDiagram > & xDia + ) +{ + VDiagram aVDiagram(xDia, nDimension); + aVDiagram.init(xPageShapes,xPageShapes,xShapeFactory); + if(3==nDimension) + aVDiagram.setSceneMatrix( createTransformationMatrix() ); + aVDiagram.createShapes(rPos,rSize); + uno::Reference< drawing::XShapes > xTarget = aVDiagram.getCoordinateRegion(); + return xTarget; +} + +void getCoordinateOrigin( double* fCoordinateOrigin, const uno::Reference< XBoundedCoordinateSystem >& xCoordSys ) +{ + if(xCoordSys.is()) + try + { + uno::Sequence< uno::Any > aCoord( xCoordSys->getOrigin()); + if( aCoord.getLength() >= 1 ) + aCoord[0]>>=fCoordinateOrigin[0]; + if( aCoord.getLength() >= 2 ) + aCoord[1]>>=fCoordinateOrigin[1]; + if( aCoord.getLength() >= 3 ) + aCoord[2]>>=fCoordinateOrigin[2]; + } + catch( uno::Exception& ex) + { + ex; + } +} + +sal_Int32 getDimension( const uno::Reference< XDiagram >& xDiagram ) +{ + sal_Int32 nDimension = 2; + + //@todo maybe get the dimension better from diagram properties ... -> need model change + uno::Reference< XDataSeriesTreeParent > xTree = xDiagram->getTree(); + if(!xTree.is()) + return nDimension; + uno::Sequence< uno::Reference< XDataSeriesTreeNode > > aChartTypes( xTree->getChildren() ); + for( sal_Int32 i = 0; i < aChartTypes.getLength(); ++i ) + { + uno::Reference< XChartTypeGroup > xChartTypeGroup( aChartTypes[i], uno::UNO_QUERY ); + DBG_ASSERT(xChartTypeGroup.is(),"First node at the diagram tree needs to be a ChartTypeGroup"); + if( !xChartTypeGroup.is() ) + continue; + uno::Reference< XChartType > xChartType = xChartTypeGroup->getChartType(); + if( !xChartType.is() ) + continue; + uno::Reference< beans::XPropertySet > xChartTypeProp( xChartType, uno::UNO_QUERY ); + if( xChartTypeProp.is()) + { + try + { + if( !(xChartTypeProp->getPropertyValue( C2U( "Dimension" )) >>= nDimension) ) + { + DBG_ERROR( "Couldn't get Dimension from ChartTypeGroup" ); + } + } + catch( beans::UnknownPropertyException ex ) + { + ex; + } + break; + } + } + return nDimension; +} + +// void getCoordinateSystems( std::vector< VCoordinateSystem >& rVCooSysList, const uno::Reference< XDiagram >& xDiagram ) +// { +// uno::Reference< XBoundedCoordinateSystemContainer > xCooSysContainer = +// uno::Reference< XBoundedCoordinateSystemContainer >::query( xDiagram ); +// if(xCooSysContainer.is()) +// { +// uno::Sequence< uno::Reference< XBoundedCoordinateSystem > > aXCooSysList = xCooSysContainer->getCoordinateSystems(); +// for( sal_Int32 nC=0; nC < aXCooSysList.getLength(); nC++) +// { +// VCoordinateSystem aCooSys(aXCooSysList[nC]); + +// double fCoordinateOrigin[3] = { 0.0, 0.0, 0.0 }; +// getCoordinateOrigin( fCoordinateOrigin, aXCooSysList ); +// aCooSys.setOrigin(fCoordinateOrigin); + +// rVCooSysList.push_back( aCooSys ); +// } +// if(!aXCooSysList.getLength()) +// { +// //get coosys from diagram tree +// //... +// } +// } +// } + +const VCoordinateSystem* findInCooSysList( const std::vector< VCoordinateSystem >& rVCooSysList + , const uno::Reference< XBoundedCoordinateSystem >& xCooSys ) +{ + for( sal_Int32 nC=0; nC < rVCooSysList.size(); nC++) + { + const VCoordinateSystem& rVCooSys = rVCooSysList[nC]; + if(rVCooSys.getModel()==xCooSys) + return &rVCooSys; + } + return NULL; +} + +void addCooSysToList( std::vector< VCoordinateSystem >& rVCooSysList + , const uno::Reference< XBoundedCoordinateSystem >& xCooSys + , double fCoordinateOrigin [] ) +{ + if( !findInCooSysList( rVCooSysList, xCooSys ) ) + { + VCoordinateSystem aVCooSys(xCooSys); + aVCooSys.setOrigin(fCoordinateOrigin); + + rVCooSysList.push_back( aVCooSys ); + } +} + +void getAxesAndAddToCooSys( uno::Sequence< uno::Reference< XAxis > >& rAxisList + , const uno::Reference< XDiagram >& xDiagram + , std::vector< VCoordinateSystem >& rVCooSysList ) +{ + uno::Reference< XAxisContainer > xAxisContainer( xDiagram, uno::UNO_QUERY ); + if( xAxisContainer.is()) + { + rAxisList = xAxisContainer->getAxes(); + for( sal_Int32 nA = 0; nA < rAxisList.getLength(); nA++ ) + { + uno::Reference< XAxis > xAxis( rAxisList[nA] ); + for( sal_Int32 nC=0; nC < rVCooSysList.size(); nC++) + { + if(xAxis->getCoordinateSystem() == rVCooSysList[nC].getModel() ) + { + rVCooSysList[nC].addAxis( xAxis ); + } + } + } + } +} + +void addGridsToCooSys( const uno::Reference< XDiagram >& xDiagram + , std::vector< VCoordinateSystem >& rVCooSysList ) +{ + uno::Reference< XGridContainer > xGridContainer( xDiagram, uno::UNO_QUERY ); + if( xGridContainer.is()) + { + uno::Sequence< uno::Reference< XGrid > > aGridList( + xGridContainer->getGrids() ); + for( sal_Int32 nA = 0; nA < aGridList.getLength(); nA++ ) + { + uno::Reference< XGrid > xGrid( aGridList[nA] ); + for( sal_Int32 nC=0; nC < rVCooSysList.size(); nC++) + { + if(xGrid->getCoordinateSystem() == rVCooSysList[nC].getModel() ) + { + rVCooSysList[nC].addGrid( xGrid ); + } + } + } + } +} + +void initializeDiagramAndGetCooSys( std::vector< VCoordinateSystem >& rVCooSysList + , const uno::Reference< uno::XComponentContext>& xCC + , const uno::Reference< drawing::XShapes>& xPageShapes + , const uno::Reference< lang::XMultiServiceFactory>& xShapeFactory + , NumberFormatterWrapper* pNumberFormatterWrapper + , const awt::Point& rPos, const awt::Size& rSize + , const uno::Reference< frame::XModel >& xModel ) +{ + //------------ get model series from model + uno::Reference< XChartDocument > xChartDocument( xModel, uno::UNO_QUERY ); + if( !xChartDocument.is() ) + return; + uno::Reference< XDiagram > xDiagram = xChartDocument->getDiagram(); + if( !xDiagram.is()) + return; + + sal_Int32 nDimension = getDimension( xDiagram ); + + //------------ create Diagram shapes + uno::Reference< drawing::XShapes > xTarget = createDiagram( xPageShapes, xShapeFactory, rPos, rSize, nDimension, xDiagram ); + + //------------ get all coordinatesystems +// getCoordinateSystems( rVCooSysList, xDiagram ); + + //------------ add series to plotter and thus prepare him for providing minimum and maximum values + uno::Reference< XDataSeriesTreeParent > xTree = xDiagram->getTree(); + uno::Sequence< uno::Reference< XDataSeriesTreeNode > > aChartTypes( xTree->getChildren() ); + for( sal_Int32 i = 0; i < aChartTypes.getLength(); ++i ) + { + //iterate through different charttypes: + + uno::Reference< XChartTypeGroup > xChartTypeGroup( aChartTypes[i], uno::UNO_QUERY ); + DBG_ASSERT(xChartTypeGroup.is(),"First node at the diagram tree needs to be a ChartTypeGroup"); + if( !xChartTypeGroup.is() ) + continue; + ::std::auto_ptr< VSeriesPlotter > apPlotter( VSeriesPlotter::createSeriesPlotter( xChartTypeGroup->getChartType()->getChartType(), nDimension ) ); + + //------------ add series to plotter and thus prepare him for providing minimum and maximum values + + sal_Int32 nXSlot = -1; + sal_Int32 nYSlot = -1; + uno::Sequence< uno::Reference< XDataSeriesTreeNode > > aXSlots( xChartTypeGroup->getChildren() ); + for( sal_Int32 nX = 0; nX < aXSlots.getLength(); ++nX ) + { + uno::Reference< XDataSeriesTreeParent > xXSlot = uno::Reference< XDataSeriesTreeParent >::query( aXSlots[nX] ); + DBG_ASSERT( xXSlot.is(), "a node for the first dimension of a chart tree should always be a parent" ); + if(!xXSlot.is()) + return; + uno::Reference< XStackableScaleGroup > xStackGroup = uno::Reference< XStackableScaleGroup >::query( xXSlot ); + if( xStackGroup.is() && + xStackGroup->getStackMode()==StackMode_STACKED) + nXSlot++; + uno::Sequence< uno::Reference< XDataSeriesTreeNode > > aYSlots( + xXSlot->getChildren() ); + for( sal_Int32 nY = 0; nY < aYSlots.getLength(); ++nY ) + { + uno::Reference< XDataSeriesTreeParent > xYSlot = uno::Reference< XDataSeriesTreeParent >::query( aYSlots[nY] ); + DBG_ASSERT( xYSlot.is(), "a node for the second dimension of a chart tree should always be a parent" ); + if(!xYSlot.is()) + return; + + uno::Reference< XScaleGroup > xScaleGroup( xYSlot, uno::UNO_QUERY ); + + { + double fCoordinateOrigin[3] = { 0.0, 0.0, 0.0 }; + getCoordinateOrigin( fCoordinateOrigin, xScaleGroup->getCoordinateSystem() ); + addCooSysToList(rVCooSysList,xScaleGroup->getCoordinateSystem(),fCoordinateOrigin); + } + + uno::Reference< XStackableScaleGroup > xStackGroup = uno::Reference< XStackableScaleGroup >::query( xYSlot ); + StackMode aYStackMode = StackMode_NONE; + if(xStackGroup.is()) + aYStackMode = xStackGroup->getStackMode(); + if(aYStackMode==StackMode_STACKED) + nYSlot++; + uno::Sequence< uno::Reference< XDataSeriesTreeNode > > aSeriesList( xYSlot->getChildren() ); + for( sal_Int32 nS = 0; nS < aSeriesList.getLength(); ++nS ) + { + uno::Reference< XDataSeries > xDataSeries( aSeriesList[nS], uno::UNO_QUERY ); + + VDataSeries* pTestSeries = new VDataSeries( xDataSeries, getDefaultStyle(nS) ); + //virtual void addSeries( VDataSeries* pSeries, sal_Int32 xSlot = -1,sal_Int32 ySlot = -1 ); + sal_Int32 nXSlot = 0; + if(aYStackMode==StackMode_NONE) + nXSlot=-1; + //@todo + apPlotter->addSeries( pTestSeries, nXSlot ); + // apPlotter->addSeries( pTestSeries, nXSlot, nYSlot ); + /* + if(nN==nSeriesCount-1) + apPlotter->addSeries( pTestSeries, -1 ); + else + apPlotter->addSeries( pTestSeries, 0 ); + */ + } + } + } + + //------------ get all axes from model and add to VCoordinateSystems + uno::Sequence< uno::Reference< XAxis > > aAxisList; + getAxesAndAddToCooSys( aAxisList, xDiagram, rVCooSysList ); + + addGridsToCooSys( xDiagram, rVCooSysList ); + + + //------------ iterate through all coordinate systems + for( sal_Int32 nC=0; nC < rVCooSysList.size(); nC++) + { + //------------ create explicit scales and increments + VCoordinateSystem& rVCooSys = rVCooSysList[nC]; + rVCooSys.doAutoScale( apPlotter.get() ); + + const uno::Sequence< ExplicitScaleData >& rExplicitScales = rVCooSys.getExplicitScales(); + const uno::Sequence< ExplicitIncrementData >& rExplicitIncrements = rVCooSys.getExplicitIncrements(); + + double fCoordinateOrigin[3] = { 0.0, 0.0, 0.0 }; + for( sal_Int32 nDim = 0; nDim < 3; nDim++ ) + fCoordinateOrigin[nDim] = rVCooSys.getOriginByDimension( nDim ); + + Matrix4D aM4_SceneToScreen( createTransformationSceneToScreen(rPos,rSize) ); + drawing::HomogenMatrix aHM_SceneToScreen( Matrix4DToHomogenMatrix(aM4_SceneToScreen) ); + + //------------ create axes --- @todo do auto layout / fontscaling + for( nDim = 0; nDim < 3; nDim++ ) + { + uno::Reference< XAxis > xAxis = rVCooSys.getAxisByDimension(nDim); + if(xAxis.is() + &&2==nDimension) //@todo remove this restriction if 3D axes are available + { + AxisProperties aAxisProperties; + aAxisProperties.m_xAxisModel = xAxis; + aAxisProperties.m_pfExrtaLinePositionAtOtherAxis = + new double(nDim==1?fCoordinateOrigin[0]:fCoordinateOrigin[1]); + aAxisProperties.m_bTESTTEST_HorizontalAdjustmentIsLeft = sal_False; + //------------------- + VAxis aAxis(aAxisProperties,pNumberFormatterWrapper); + aAxis.setMeterData( rExplicitScales[nDim], rExplicitIncrements[nDim] ); + + aAxis.init(xTarget,xPageShapes,xShapeFactory); + if(2==nDimension) + aAxis.setTransformationSceneToScreen( aHM_SceneToScreen ); + aAxis.setScales( rExplicitScales ); + aAxis.createShapes(); + } + } + //------------ create grids + rVCooSys.createGridShapes( xShapeFactory, xTarget, aHM_SceneToScreen ); + + //------------ set scale to plotter + apPlotter->init(xTarget,xPageShapes,xShapeFactory); + if(2==nDimension) + apPlotter->setTransformationSceneToScreen( aHM_SceneToScreen ); + apPlotter->setScales( rExplicitScales ); + apPlotter->createShapes(); + } + } +} + +//------------------------------------------------------------- +//------------------------------------------------------------- +//------------------------------------------------------------- + +void ChartViewImpl::getExplicitValuesForMeter( + uno::Reference< XMeter > xMeter + , ExplicitScaleData& rExplicitScale + , ExplicitIncrementData& rExplicitIncrement + , double& rfExplicitOrigin ) +{ + if(!xMeter.is()) + return; + uno::Reference< XBoundedCoordinateSystem > xCooSys = xMeter->getCoordinateSystem(); + const VCoordinateSystem* pVCooSys = findInCooSysList(m_aVCooSysList,xCooSys); + if(!pVCooSys) + return; + const uno::Sequence< ExplicitScaleData >& rScales =pVCooSys->getExplicitScales(); + const uno::Sequence< ExplicitIncrementData >& rIncrements =pVCooSys->getExplicitIncrements(); + sal_Int32 nDim = xMeter->getRepresentedDimension(); + if(nDim<=rScales.getLength()) + rExplicitScale=rScales[nDim]; + if(nDim<=rIncrements.getLength()) + rExplicitIncrement=rIncrements[nDim]; + rfExplicitOrigin = pVCooSys->getOriginByDimension( nDim ); +} + +bool getPosAndSizeForDiagram( awt::Point& rPos, awt::Size& rSize, const awt::Size& rPageSize, sal_Int32 nYOffset ) +{ + if(rPageSize.Width <= 0 || rPageSize.Height <= 0 ) + return false; + + long nHeight = (rPageSize.Height-nYOffset)*5/6; + long nOffsetY = (rPageSize.Height-nYOffset)-nHeight; + nOffsetY /= 2; + nOffsetY += nYOffset; + + long nWidth = rPageSize.Width*5/6; + long nOffsetX = rPageSize.Width-nWidth; + nOffsetX /= 2; + + if( nHeight <= 0 || nWidth <= 0 ) + return false; + + rPos = awt::Point(nOffsetX,nOffsetY); + rSize = awt::Size(nWidth,nHeight); + return true; +} + +void createTitle( const uno::Reference< XTitle >& xTitle + , sal_Int32 nXPosition + , sal_Int32& nrYOffset + , const uno::Reference< drawing::XShapes>& xPageShapes + , const uno::Reference< lang::XMultiServiceFactory>& xShapeFactory + ) +{ + if(xTitle.is()) + { + VTitle aVTitle(xTitle); + aVTitle.init(xPageShapes,xShapeFactory); + aVTitle.createShapes( awt::Point(0,0) ); + awt::Size aTitleSize = aVTitle.getSize(); + sal_Int32 nYSpacing = aTitleSize.Height/2; + aVTitle.changePosition( awt::Point( nXPosition, nrYOffset + aTitleSize.Height/2 + nYSpacing ) ); + nrYOffset += aTitleSize.Height + nYSpacing; + } +} + +bool ChartViewImpl::create( const awt::Size& rPageSize ) +{ + uno::Reference<drawing::XShapes> xPageShapes = + uno::Reference<drawing::XShapes>( m_xDrawPage, uno::UNO_QUERY ); + + sal_Int32 nYOffset = 0; + sal_Int32 nXPosition = rPageSize.Width/2; + + //------------ create main title shape + createTitle( TitleHelper::getTitle( TitleHelper::MAIN_TITLE, m_xChartModel ) + , nXPosition, nYOffset, xPageShapes, m_xShapeFactory ); + if(nYOffset>=rPageSize.Height) + return true; + + //------------ create sub title shape + createTitle( TitleHelper::getTitle( TitleHelper::SUB_TITLE, m_xChartModel ) + , nXPosition, nYOffset, xPageShapes, m_xShapeFactory ); + if(nYOffset>=rPageSize.Height) + return true; + + //------------ create complete diagram shape (inclusive axis and series) + awt::Point aPosDia; + awt::Size aSizeDia; + if( getPosAndSizeForDiagram( aPosDia, aSizeDia, rPageSize, nYOffset ) ) + initializeDiagramAndGetCooSys( m_aVCooSysList + , m_xCC, xPageShapes, m_xShapeFactory, m_pNumberFormatterWrapper + , aPosDia ,aSizeDia + , m_xChartModel ); + return true; +} + +//............................................................................. +} //namespace chart +//............................................................................. |