1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chartview.hxx" 26 #include "VCartesianCoordinateSystem.hxx" 27 #include "VCartesianGrid.hxx" 28 #include "VCartesianAxis.hxx" 29 #include "macros.hxx" 30 #include "AxisIndexDefines.hxx" 31 #include "AxisHelper.hxx" 32 #include "ChartTypeHelper.hxx" 33 34 //for auto_ptr 35 #include <memory> 36 37 //............................................................................. 38 namespace chart 39 { 40 //............................................................................. 41 using namespace ::com::sun::star; 42 using namespace ::com::sun::star::chart2; 43 using ::com::sun::star::uno::Reference; 44 45 //............................................................................. 46 47 class TextualDataProvider : public ::cppu::WeakImplHelper1< 48 ::com::sun::star::chart2::data::XTextualDataSequence 49 > 50 { 51 public: 52 TextualDataProvider( const uno::Sequence< ::rtl::OUString >& rTextSequence ) 53 : m_aTextSequence( rTextSequence ) 54 { 55 } 56 virtual ~TextualDataProvider() 57 { 58 } 59 60 //XTextualDataSequence 61 virtual uno::Sequence< ::rtl::OUString > SAL_CALL getTextualData() 62 { 63 return m_aTextSequence; 64 } 65 66 private: //member 67 uno::Sequence< ::rtl::OUString > m_aTextSequence; 68 }; 69 70 //............................................................................. 71 72 VCartesianCoordinateSystem::VCartesianCoordinateSystem( const Reference< XCoordinateSystem >& xCooSys ) 73 : VCoordinateSystem(xCooSys) 74 { 75 } 76 77 VCartesianCoordinateSystem::~VCartesianCoordinateSystem() 78 { 79 } 80 81 void VCartesianCoordinateSystem::createGridShapes() 82 { 83 if(!m_xLogicTargetForGrids.is() || !m_xFinalTarget.is() ) 84 return; 85 86 sal_Int32 nDimensionCount = m_xCooSysModel->getDimension(); 87 bool bSwapXAndY = this->getPropertySwapXAndYAxis(); 88 89 for( sal_Int32 nDimensionIndex=0; nDimensionIndex<3; nDimensionIndex++) 90 { 91 sal_Int32 nAxisIndex = MAIN_AXIS_INDEX; 92 Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, nAxisIndex, m_xCooSysModel ) ); 93 if(!xAxis.is() || !AxisHelper::shouldAxisBeDisplayed( xAxis, m_xCooSysModel )) 94 continue; 95 96 VCartesianGrid aGrid(nDimensionIndex,nDimensionCount,this->getGridListFromAxis( xAxis )); 97 aGrid.setExplicitScaleAndIncrement( this->getExplicitScale(nDimensionIndex,nAxisIndex) 98 , this->getExplicitIncrement(nDimensionIndex,nAxisIndex) ); 99 aGrid.set3DWallPositions( m_eLeftWallPos, m_eBackWallPos, m_eBottomPos ); 100 101 aGrid.initPlotter(m_xLogicTargetForGrids,m_xFinalTarget,m_xShapeFactory 102 , this->createCIDForGrid( xAxis,nDimensionIndex,nAxisIndex ) ); 103 if(2==nDimensionCount) 104 aGrid.setTransformationSceneToScreen( m_aMatrixSceneToScreen ); 105 aGrid.setScales( this->getExplicitScales(nDimensionIndex,nAxisIndex), bSwapXAndY ); 106 aGrid.createShapes(); 107 } 108 } 109 110 void VCartesianCoordinateSystem::createVAxisList( 111 const uno::Reference< util::XNumberFormatsSupplier > & xNumberFormatsSupplier 112 , const awt::Size& rFontReferenceSize 113 , const awt::Rectangle& rMaximumSpaceForLabels 114 ) 115 { 116 m_aAxisMap.clear(); 117 118 //if(!m_xLogicTargetForAxes.is() || !m_xFinalTarget.is() || !m_xCooSysModel.is() ) 119 // return; 120 121 sal_Int32 nDimensionCount = m_xCooSysModel->getDimension(); 122 bool bSwapXAndY = this->getPropertySwapXAndYAxis(); 123 124 if(nDimensionCount<=0) 125 return; 126 127 sal_Int32 nDimensionIndex = 0; 128 129 for( nDimensionIndex = 0; nDimensionIndex < nDimensionCount; nDimensionIndex++ ) 130 { 131 sal_Int32 nMaxAxisIndex = m_xCooSysModel->getMaximumAxisIndexByDimension(nDimensionIndex); 132 for( sal_Int32 nAxisIndex = 0; nAxisIndex <= nMaxAxisIndex; nAxisIndex++ ) 133 { 134 Reference< XAxis > xAxis = this->getAxisByDimension(nDimensionIndex,nAxisIndex); 135 if(!xAxis.is() || !AxisHelper::shouldAxisBeDisplayed( xAxis, m_xCooSysModel )) 136 continue; 137 138 AxisProperties aAxisProperties(xAxis,this->getExplicitCategoriesProvider()); 139 aAxisProperties.m_nDimensionIndex = nDimensionIndex; 140 aAxisProperties.m_bSwapXAndY = bSwapXAndY; 141 aAxisProperties.m_bIsMainAxis = (nAxisIndex==0); 142 Reference< XAxis > xCrossingMainAxis( AxisHelper::getCrossingMainAxis( xAxis, m_xCooSysModel ) ); 143 if( xCrossingMainAxis.is() ) 144 { 145 ScaleData aCrossingScale( xCrossingMainAxis->getScaleData() ); 146 aAxisProperties.m_bCrossingAxisHasReverseDirection = (AxisOrientation_REVERSE==aCrossingScale.Orientation); 147 148 if( aCrossingScale.AxisType == AxisType::CATEGORY ) 149 aAxisProperties.m_bCrossingAxisIsCategoryAxes = true; 150 } 151 152 if( nDimensionIndex == 2 ) 153 { 154 aAxisProperties.m_xAxisTextProvider = new TextualDataProvider( m_aSeriesNamesForZAxis ); 155 156 //for the z axis copy the positioning properties from the x axis (or from the y axis for swapped coordinate systems) 157 Reference< XAxis > xSisterAxis( AxisHelper::getCrossingMainAxis( xCrossingMainAxis, m_xCooSysModel ) ); 158 aAxisProperties.initAxisPositioning( Reference< beans::XPropertySet >( xSisterAxis, uno::UNO_QUERY) ); 159 } 160 aAxisProperties.init(true); 161 if(aAxisProperties.m_bDisplayLabels) 162 aAxisProperties.m_nNumberFormatKey = this->getNumberFormatKeyForAxis( xAxis, xNumberFormatsSupplier ); 163 //------------------- 164 ::boost::shared_ptr< VAxisBase > apVAxis( new VCartesianAxis(aAxisProperties,xNumberFormatsSupplier,nDimensionIndex,nDimensionCount) ); 165 tFullAxisIndex aFullAxisIndex( nDimensionIndex, nAxisIndex ); 166 m_aAxisMap[aFullAxisIndex] = apVAxis; 167 apVAxis->set3DWallPositions( m_eLeftWallPos, m_eBackWallPos, m_eBottomPos ); 168 169 apVAxis->initAxisLabelProperties(rFontReferenceSize,rMaximumSpaceForLabels); 170 } 171 } 172 } 173 174 void VCartesianCoordinateSystem::initVAxisInList() 175 { 176 if(!m_xLogicTargetForAxes.is() || !m_xFinalTarget.is() || !m_xCooSysModel.is() ) 177 return; 178 179 sal_Int32 nDimensionCount = m_xCooSysModel->getDimension(); 180 bool bSwapXAndY = this->getPropertySwapXAndYAxis(); 181 182 tVAxisMap::iterator aIt( m_aAxisMap.begin() ); 183 tVAxisMap::const_iterator aEnd( m_aAxisMap.end() ); 184 for( ; aIt != aEnd; ++aIt ) 185 { 186 VAxisBase* pVAxis = aIt->second.get(); 187 if( pVAxis ) 188 { 189 sal_Int32 nDimensionIndex = aIt->first.first; 190 sal_Int32 nAxisIndex = aIt->first.second; 191 pVAxis->setExplicitScaleAndIncrement( this->getExplicitScale( nDimensionIndex, nAxisIndex ), this->getExplicitIncrement( nDimensionIndex, nAxisIndex ) ); 192 pVAxis->initPlotter(m_xLogicTargetForAxes,m_xFinalTarget,m_xShapeFactory 193 , this->createCIDForAxis( getAxisByDimension( nDimensionIndex, nAxisIndex ), nDimensionIndex, nAxisIndex ) ); 194 if(2==nDimensionCount) 195 pVAxis->setTransformationSceneToScreen( m_aMatrixSceneToScreen ); 196 pVAxis->setScales( this->getExplicitScales(nDimensionIndex,nAxisIndex), bSwapXAndY ); 197 } 198 } 199 } 200 201 void VCartesianCoordinateSystem::updateScalesAndIncrementsOnAxes() 202 { 203 if(!m_xLogicTargetForAxes.is() || !m_xFinalTarget.is() || !m_xCooSysModel.is() ) 204 return; 205 206 sal_Int32 nDimensionCount = m_xCooSysModel->getDimension(); 207 bool bSwapXAndY = this->getPropertySwapXAndYAxis(); 208 209 tVAxisMap::iterator aIt( m_aAxisMap.begin() ); 210 tVAxisMap::const_iterator aEnd( m_aAxisMap.end() ); 211 for( ; aIt != aEnd; ++aIt ) 212 { 213 VAxisBase* pVAxis = aIt->second.get(); 214 if( pVAxis ) 215 { 216 sal_Int32 nDimensionIndex = aIt->first.first; 217 sal_Int32 nAxisIndex = aIt->first.second; 218 pVAxis->setExplicitScaleAndIncrement( this->getExplicitScale( nDimensionIndex, nAxisIndex ), this->getExplicitIncrement( nDimensionIndex, nAxisIndex ) ); 219 if(2==nDimensionCount) 220 pVAxis->setTransformationSceneToScreen( m_aMatrixSceneToScreen ); 221 pVAxis->setScales( this->getExplicitScales(nDimensionIndex,nAxisIndex), bSwapXAndY ); 222 } 223 } 224 } 225 226 //............................................................................. 227 } //namespace chart 228 //............................................................................. 229