1cde9e8dcSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3cde9e8dcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4cde9e8dcSAndrew Rist * or more contributor license agreements. See the NOTICE file 5cde9e8dcSAndrew Rist * distributed with this work for additional information 6cde9e8dcSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7cde9e8dcSAndrew Rist * to you under the Apache License, Version 2.0 (the 8cde9e8dcSAndrew Rist * "License"); you may not use this file except in compliance 9cde9e8dcSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11cde9e8dcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13cde9e8dcSAndrew Rist * Unless required by applicable law or agreed to in writing, 14cde9e8dcSAndrew Rist * software distributed under the License is distributed on an 15cde9e8dcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16cde9e8dcSAndrew Rist * KIND, either express or implied. See the License for the 17cde9e8dcSAndrew Rist * specific language governing permissions and limitations 18cde9e8dcSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20cde9e8dcSAndrew Rist *************************************************************/ 21cde9e8dcSAndrew Rist 22cde9e8dcSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_chart2.hxx" 26cdf0e10cSrcweir #include "ChartModelHelper.hxx" 27cdf0e10cSrcweir #include "macros.hxx" 28cdf0e10cSrcweir #include "DiagramHelper.hxx" 29cdf0e10cSrcweir #include "DataSourceHelper.hxx" 30cdf0e10cSrcweir #include "ControllerLockGuard.hxx" 31cdf0e10cSrcweir #include "RangeHighlighter.hxx" 32cdf0e10cSrcweir #include "InternalDataProvider.hxx" 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <com/sun/star/chart2/data/XDataReceiver.hpp> 35cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp> 36cdf0e10cSrcweir #include <com/sun/star/chart2/XChartTypeContainer.hpp> 37cdf0e10cSrcweir #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp> 38cdf0e10cSrcweir #include <com/sun/star/chart2/XDataSeriesContainer.hpp> 39cdf0e10cSrcweir #include <com/sun/star/embed/Aspects.hpp> 40cdf0e10cSrcweir #include <com/sun/star/embed/XVisualObject.hpp> 41cdf0e10cSrcweir #include <com/sun/star/view/XSelectionChangeListener.hpp> 42cdf0e10cSrcweir 43cdf0e10cSrcweir // header for define DBG_ASSERT 44cdf0e10cSrcweir #include <tools/debug.hxx> 45cdf0e10cSrcweir 46*8b276638SArmin Le Grand #include <com/sun/star/chart/XChartDocument.hpp> 47*8b276638SArmin Le Grand #include <com/sun/star/chart/ChartDataRowSource.hpp> 48*8b276638SArmin Le Grand 49cdf0e10cSrcweir //............................................................................. 50cdf0e10cSrcweir namespace chart 51cdf0e10cSrcweir { 52cdf0e10cSrcweir //............................................................................. 53cdf0e10cSrcweir using namespace ::com::sun::star; 54cdf0e10cSrcweir using namespace ::com::sun::star::chart2; 55cdf0e10cSrcweir 56cdf0e10cSrcweir uno::Reference< chart2::data::XRangeHighlighter > ChartModelHelper::createRangeHighlighter( 57cdf0e10cSrcweir const uno::Reference< view::XSelectionSupplier > & xSelectionSupplier ) 58cdf0e10cSrcweir { 59cdf0e10cSrcweir return new RangeHighlighter( xSelectionSupplier ); 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir uno::Reference< chart2::data::XDataProvider > ChartModelHelper::createInternalDataProvider( 63cdf0e10cSrcweir const uno::Reference< ::com::sun::star::chart2::XChartDocument >& xChartDoc, bool bConnectToModel ) 64cdf0e10cSrcweir { 65*8b276638SArmin Le Grand bool bDefaultDataInColumns(true); 66*8b276638SArmin Le Grand 67*8b276638SArmin Le Grand // #120559# Try to access the current state of "DataRowSource" fo rthe chart data and 68*8b276638SArmin Le Grand // use it as default for creating a new InternalDataProvider 69*8b276638SArmin Le Grand if(xChartDoc.is()) 70*8b276638SArmin Le Grand { 71*8b276638SArmin Le Grand ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDocument > xDoc(xChartDoc, uno::UNO_QUERY); 72*8b276638SArmin Le Grand 73*8b276638SArmin Le Grand if(xDoc.is()) 74*8b276638SArmin Le Grand { 75*8b276638SArmin Le Grand ::com::sun::star::uno::Reference< ::com::sun::star::chart::XDiagram > aDiagram = xDoc->getDiagram(); 76*8b276638SArmin Le Grand 77*8b276638SArmin Le Grand if(aDiagram.is()) 78*8b276638SArmin Le Grand { 79*8b276638SArmin Le Grand ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xProp(aDiagram, uno::UNO_QUERY); 80*8b276638SArmin Le Grand 81*8b276638SArmin Le Grand if(xProp.is()) 82*8b276638SArmin Le Grand { 83*8b276638SArmin Le Grand ::com::sun::star::chart::ChartDataRowSource aDataRowSource(::com::sun::star::chart::ChartDataRowSource_COLUMNS); 84*8b276638SArmin Le Grand 85*8b276638SArmin Le Grand xProp->getPropertyValue( ::rtl::OUString::createFromAscii("DataRowSource")) >>= aDataRowSource; 86*8b276638SArmin Le Grand 87*8b276638SArmin Le Grand bDefaultDataInColumns = (::com::sun::star::chart::ChartDataRowSource_COLUMNS == aDataRowSource); 88*8b276638SArmin Le Grand } 89*8b276638SArmin Le Grand } 90*8b276638SArmin Le Grand } 91*8b276638SArmin Le Grand } 92*8b276638SArmin Le Grand 93*8b276638SArmin Le Grand return new InternalDataProvider( xChartDoc, bConnectToModel, bDefaultDataInColumns ); 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir uno::Reference< XDiagram > ChartModelHelper::findDiagram( const uno::Reference< frame::XModel >& xModel ) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir uno::Reference< XChartDocument > xChartDoc( xModel, uno::UNO_QUERY ); 99cdf0e10cSrcweir if( xChartDoc.is()) 100cdf0e10cSrcweir return ChartModelHelper::findDiagram( xChartDoc ); 101cdf0e10cSrcweir return NULL; 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir uno::Reference< XDiagram > ChartModelHelper::findDiagram( const uno::Reference< chart2::XChartDocument >& xChartDoc ) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir try 107cdf0e10cSrcweir { 108cdf0e10cSrcweir if( xChartDoc.is()) 109cdf0e10cSrcweir return xChartDoc->getFirstDiagram(); 110cdf0e10cSrcweir } 111cdf0e10cSrcweir catch( uno::Exception & ex ) 112cdf0e10cSrcweir { 113cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 114cdf0e10cSrcweir } 115cdf0e10cSrcweir return NULL; 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir uno::Reference< XCoordinateSystem > ChartModelHelper::getFirstCoordinateSystem( const uno::Reference< frame::XModel >& xModel ) 119cdf0e10cSrcweir { 120cdf0e10cSrcweir uno::Reference< XCoordinateSystem > XCooSys; 121cdf0e10cSrcweir uno::Reference< XCoordinateSystemContainer > xCooSysCnt( ChartModelHelper::findDiagram( xModel ), uno::UNO_QUERY ); 122cdf0e10cSrcweir if( xCooSysCnt.is() ) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir uno::Sequence< uno::Reference< XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems() ); 125cdf0e10cSrcweir if( aCooSysSeq.getLength() ) 126cdf0e10cSrcweir XCooSys = aCooSysSeq[0]; 127cdf0e10cSrcweir } 128cdf0e10cSrcweir return XCooSys; 129cdf0e10cSrcweir } 130cdf0e10cSrcweir 131cdf0e10cSrcweir ::std::vector< uno::Reference< XDataSeries > > ChartModelHelper::getDataSeries( 132cdf0e10cSrcweir const uno::Reference< XChartDocument > & xChartDoc ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir ::std::vector< uno::Reference< XDataSeries > > aResult; 135cdf0e10cSrcweir 136cdf0e10cSrcweir uno::Reference< XDiagram > xDiagram = ChartModelHelper::findDiagram( xChartDoc ); 137cdf0e10cSrcweir if( xDiagram.is()) 138cdf0e10cSrcweir aResult = DiagramHelper::getDataSeriesFromDiagram( xDiagram ); 139cdf0e10cSrcweir 140cdf0e10cSrcweir return aResult; 141cdf0e10cSrcweir } 142cdf0e10cSrcweir 143cdf0e10cSrcweir ::std::vector< uno::Reference< XDataSeries > > ChartModelHelper::getDataSeries( 144cdf0e10cSrcweir const uno::Reference< frame::XModel > & xModel ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir return getDataSeries( uno::Reference< chart2::XChartDocument >( xModel, uno::UNO_QUERY )); 147cdf0e10cSrcweir } 148cdf0e10cSrcweir 149cdf0e10cSrcweir 150cdf0e10cSrcweir uno::Reference< XChartType > ChartModelHelper::getChartTypeOfSeries( 151cdf0e10cSrcweir const uno::Reference< frame::XModel >& xModel 152cdf0e10cSrcweir , const uno::Reference< XDataSeries >& xGivenDataSeries ) 153cdf0e10cSrcweir { 154cdf0e10cSrcweir return DiagramHelper::getChartTypeOfSeries( ChartModelHelper::findDiagram( xModel ), xGivenDataSeries ); 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir awt::Size ChartModelHelper::getDefaultPageSize() 158cdf0e10cSrcweir { 159cdf0e10cSrcweir return awt::Size( 16000, 9000 ); 160cdf0e10cSrcweir } 161cdf0e10cSrcweir 162cdf0e10cSrcweir awt::Size ChartModelHelper::getPageSize( const uno::Reference< frame::XModel >& xModel ) 163cdf0e10cSrcweir { 164cdf0e10cSrcweir awt::Size aPageSize( ChartModelHelper::getDefaultPageSize() ); 165cdf0e10cSrcweir uno::Reference< embed::XVisualObject > xVisualObject(xModel,uno::UNO_QUERY); 166cdf0e10cSrcweir DBG_ASSERT(xVisualObject.is(),"need xVisualObject for page size"); 167cdf0e10cSrcweir if( xVisualObject.is() ) 168cdf0e10cSrcweir aPageSize = xVisualObject->getVisualAreaSize( embed::Aspects::MSOLE_CONTENT ); 169cdf0e10cSrcweir return aPageSize; 170cdf0e10cSrcweir } 171cdf0e10cSrcweir 172cdf0e10cSrcweir void ChartModelHelper::setPageSize( const awt::Size& rSize, const uno::Reference< frame::XModel >& xModel ) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir uno::Reference< embed::XVisualObject > xVisualObject(xModel,uno::UNO_QUERY); 175cdf0e10cSrcweir DBG_ASSERT(xVisualObject.is(),"need xVisualObject for page size"); 176cdf0e10cSrcweir if( xVisualObject.is() ) 177cdf0e10cSrcweir xVisualObject->setVisualAreaSize( embed::Aspects::MSOLE_CONTENT, rSize ); 178cdf0e10cSrcweir } 179cdf0e10cSrcweir 180cdf0e10cSrcweir void ChartModelHelper::triggerRangeHighlighting( const uno::Reference< frame::XModel >& xModel ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir uno::Reference< chart2::data::XDataReceiver > xDataReceiver( xModel, uno::UNO_QUERY ); 183cdf0e10cSrcweir if( xDataReceiver.is() ) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir uno::Reference< view::XSelectionChangeListener > xSelectionChangeListener( xDataReceiver->getRangeHighlighter(), uno::UNO_QUERY ); 186cdf0e10cSrcweir //trigger selection of cell range 187cdf0e10cSrcweir if( xSelectionChangeListener.is() ) 188cdf0e10cSrcweir { 189cdf0e10cSrcweir lang::EventObject aEvent( xSelectionChangeListener ); 190cdf0e10cSrcweir xSelectionChangeListener->selectionChanged( aEvent ); 191cdf0e10cSrcweir } 192cdf0e10cSrcweir } 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir bool ChartModelHelper::isIncludeHiddenCells( const uno::Reference< frame::XModel >& xChartModel ) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir bool bIncluded = true; // hidden cells are included by default. 198cdf0e10cSrcweir 199cdf0e10cSrcweir uno::Reference< chart2::XDiagram > xDiagram( ChartModelHelper::findDiagram(xChartModel) ); 200cdf0e10cSrcweir if (!xDiagram.is()) 201cdf0e10cSrcweir return bIncluded; 202cdf0e10cSrcweir 203cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProp( xDiagram, uno::UNO_QUERY ); 204cdf0e10cSrcweir if (!xProp.is()) 205cdf0e10cSrcweir return bIncluded; 206cdf0e10cSrcweir 207cdf0e10cSrcweir try 208cdf0e10cSrcweir { 209cdf0e10cSrcweir xProp->getPropertyValue(C2U("IncludeHiddenCells")) >>= bIncluded; 210cdf0e10cSrcweir } 211cdf0e10cSrcweir catch( const beans::UnknownPropertyException& ) 212cdf0e10cSrcweir { 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir return bIncluded; 216cdf0e10cSrcweir } 217cdf0e10cSrcweir 218cdf0e10cSrcweir bool ChartModelHelper::setIncludeHiddenCells( bool bIncludeHiddenCells, const uno::Reference< frame::XModel >& xChartModel ) 219cdf0e10cSrcweir { 220cdf0e10cSrcweir bool bChanged = false; 221cdf0e10cSrcweir try 222cdf0e10cSrcweir { 223cdf0e10cSrcweir ControllerLockGuard aLockedControllers( xChartModel ); 224cdf0e10cSrcweir 225cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xDiagramProperties( ChartModelHelper::findDiagram(xChartModel), uno::UNO_QUERY ); 226cdf0e10cSrcweir if (xDiagramProperties.is()) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir bool bOldValue = bIncludeHiddenCells; 229cdf0e10cSrcweir xDiagramProperties->getPropertyValue( C2U("IncludeHiddenCells") ) >>= bOldValue; 230cdf0e10cSrcweir if( bOldValue == bIncludeHiddenCells ) 231cdf0e10cSrcweir bChanged = true; 232cdf0e10cSrcweir 233cdf0e10cSrcweir //set the property on all instances in all cases to get the different objects in sync! 234cdf0e10cSrcweir 235cdf0e10cSrcweir uno::Any aNewValue = uno::makeAny(bIncludeHiddenCells); 236cdf0e10cSrcweir 237cdf0e10cSrcweir try 238cdf0e10cSrcweir { 239cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( xChartModel, uno::UNO_QUERY ); 240cdf0e10cSrcweir if( xChartDoc.is() ) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xDataProviderProperties( xChartDoc->getDataProvider(), uno::UNO_QUERY ); 243cdf0e10cSrcweir if( xDataProviderProperties.is() ) 244cdf0e10cSrcweir xDataProviderProperties->setPropertyValue(C2U("IncludeHiddenCells"), aNewValue ); 245cdf0e10cSrcweir } 246cdf0e10cSrcweir } 247cdf0e10cSrcweir catch( const beans::UnknownPropertyException& ) 248cdf0e10cSrcweir { 249cdf0e10cSrcweir //the property is optional! 250cdf0e10cSrcweir } 251cdf0e10cSrcweir 252cdf0e10cSrcweir try 253cdf0e10cSrcweir { 254cdf0e10cSrcweir uno::Reference< chart2::data::XDataSource > xUsedData( DataSourceHelper::getUsedData( xChartModel ) ); 255cdf0e10cSrcweir if( xUsedData.is() ) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProp; 258cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aData( xUsedData->getDataSequences()); 259cdf0e10cSrcweir for( sal_Int32 i=0; i<aData.getLength(); ++i ) 260cdf0e10cSrcweir { 261cdf0e10cSrcweir xProp.set( uno::Reference< beans::XPropertySet >( aData[i]->getValues(), uno::UNO_QUERY ) ); 262cdf0e10cSrcweir if(xProp.is()) 263cdf0e10cSrcweir xProp->setPropertyValue(C2U("IncludeHiddenCells"), aNewValue ); 264cdf0e10cSrcweir xProp.set( uno::Reference< beans::XPropertySet >( aData[i]->getLabel(), uno::UNO_QUERY ) ); 265cdf0e10cSrcweir if(xProp.is()) 266cdf0e10cSrcweir xProp->setPropertyValue(C2U("IncludeHiddenCells"), aNewValue ); 267cdf0e10cSrcweir } 268cdf0e10cSrcweir } 269cdf0e10cSrcweir } 270cdf0e10cSrcweir catch( const beans::UnknownPropertyException& ) 271cdf0e10cSrcweir { 272cdf0e10cSrcweir //the property is optional! 273cdf0e10cSrcweir } 274cdf0e10cSrcweir 275cdf0e10cSrcweir xDiagramProperties->setPropertyValue( C2U("IncludeHiddenCells"), aNewValue); 276cdf0e10cSrcweir } 277cdf0e10cSrcweir } 278cdf0e10cSrcweir catch (uno::Exception& e) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir ASSERT_EXCEPTION(e); 281cdf0e10cSrcweir } 282cdf0e10cSrcweir return bChanged; 283cdf0e10cSrcweir } 284cdf0e10cSrcweir 285cdf0e10cSrcweir //............................................................................. 286cdf0e10cSrcweir } //namespace chart 287cdf0e10cSrcweir //............................................................................. 288