summaryrefslogtreecommitdiff
path: root/chart2/source/controller/main/ChartRenderer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'chart2/source/controller/main/ChartRenderer.cxx')
-rw-r--r--chart2/source/controller/main/ChartRenderer.cxx178
1 files changed, 178 insertions, 0 deletions
diff --git a/chart2/source/controller/main/ChartRenderer.cxx b/chart2/source/controller/main/ChartRenderer.cxx
new file mode 100644
index 000000000000..3419f7a53bec
--- /dev/null
+++ b/chart2/source/controller/main/ChartRenderer.cxx
@@ -0,0 +1,178 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_chart2.hxx"
+
+#include "ChartRenderer.hxx"
+#include "servicenames.hxx"
+#include "chartview/ExplicitValueProvider.hxx"
+#include "chartview/DrawModelWrapper.hxx"
+#include "DrawViewWrapper.hxx"
+#include "macros.hxx"
+#include "ChartModelHelper.hxx"
+#include <vcl/svapp.hxx>
+#include <vos/mutex.hxx>
+
+#include <com/sun/star/util/XUpdatable.hpp>
+
+//.............................................................................
+namespace chart
+{
+//.............................................................................
+
+using namespace ::com::sun::star;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Sequence;
+using rtl::OUString;
+
+ChartRenderer::ChartRenderer( const Reference< frame::XModel >& xChartModel )
+ : m_xChartModel( uno::WeakReference< frame::XModel >(xChartModel) )
+{
+}
+
+ChartRenderer::~ChartRenderer()
+{
+}
+
+// ____ ChartPrettyPainter ___
+bool ChartRenderer::DoPaint(OutputDevice* pOutDev, const Rectangle& rLogicObjectRect /*in given output dev map units*/ ) const
+{
+ if(!pOutDev)
+ return false;
+
+ Reference<frame::XModel> xModel(m_xChartModel);
+ uno::Reference< lang::XMultiServiceFactory > xFact( xModel, uno::UNO_QUERY );
+ if( !xFact.is() )
+ return false;
+
+ //#i84323# ensure that the size the container has of the chart and size that chart has itself are the same
+ //maybe remove this workaround somewhere in future again
+ {
+ if( MAP_100TH_MM == pOutDev->GetMapMode().GetMapUnit() )//no problem for writer in issue #i84323#; but writer uses twips instead of 100thmm which causes small differences in size always when converting to 100thmm and back
+ {
+ awt::Size aChartSize( ChartModelHelper::getPageSize(xModel) );
+ awt::Size aContainerChartSize( rLogicObjectRect.GetWidth(), rLogicObjectRect.GetHeight() );
+ if( aContainerChartSize.Width != aChartSize.Width
+ || aContainerChartSize.Height != aChartSize.Height )
+ {
+ DBG_ERROR("chart size does not equal size assumed by the container");
+ //correct the state here on the fly -> let the container size win
+ ChartModelHelper::setPageSize( aContainerChartSize, xModel );
+ }
+ }
+ }
+
+ // get the chart view
+ Reference< lang::XUnoTunnel > xChartView( xFact->createInstance( CHART_VIEW_SERVICE_NAME ), uno::UNO_QUERY );
+
+ try
+ {
+ //better performance for big data
+ uno::Reference< beans::XPropertySet > xProp( xChartView, uno::UNO_QUERY );
+ if( xProp.is() )
+ {
+ awt::Size aResolution(1000,1000);
+ {
+ ::vos::OGuard aGuard( Application::GetSolarMutex());
+ Rectangle aPixelRect( pOutDev->LogicToPixel( rLogicObjectRect ) );
+ aResolution.Width = aPixelRect.GetWidth();
+ aResolution.Height = aPixelRect.GetHeight();
+ }
+ xProp->setPropertyValue( C2U("Resolution"), uno::makeAny( aResolution ));
+ }
+ //
+
+ uno::Reference< util::XUpdatable > xUpdatable( xChartView, uno::UNO_QUERY );
+ if( xUpdatable.is() )
+ xUpdatable->update();
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex());
+ ExplicitValueProvider* pProvider = ExplicitValueProvider::getExplicitValueProvider( xChartView );
+ if( !pProvider )
+ return false;
+ ::boost::shared_ptr< DrawModelWrapper > pDrawModelWrapper = pProvider->getDrawModelWrapper();
+ if( !pDrawModelWrapper.get() )
+ return false;
+ ::boost::shared_ptr< DrawViewWrapper > pDrawViewWrapper( new DrawViewWrapper(&pDrawModelWrapper->getSdrModel(),pOutDev,false) );
+ pDrawViewWrapper->attachParentReferenceDevice( xModel );
+
+ MapMode aOldMapMode( pOutDev->GetMapMode() );
+ Point aOldOrigin( aOldMapMode.GetOrigin() );
+ MapMode aMapMode( aOldMapMode );
+ Point aOldOriginMM( OutputDevice::LogicToLogic( aOldOrigin, aOldMapMode.GetMapUnit(), MAP_100TH_MM ) );
+ Point aObjectTopLeftMM( OutputDevice::LogicToLogic( rLogicObjectRect.TopLeft(), aOldMapMode.GetMapUnit(), MAP_100TH_MM ) );
+ aMapMode.SetOrigin( aOldOriginMM + aObjectTopLeftMM );
+ aMapMode.SetMapUnit( MAP_100TH_MM );
+ pOutDev->SetMapMode(aMapMode);
+
+ Rectangle aPaintRect( OutputDevice::LogicToLogic( rLogicObjectRect, aOldMapMode, aMapMode ) );
+ pDrawViewWrapper->CompleteRedraw(pOutDev, Region(aPaintRect) );
+
+ pOutDev->SetMapMode(aOldMapMode);
+ }
+ catch( uno::Exception & ex )
+ {
+ ASSERT_EXCEPTION( ex );
+ }
+ catch( ... )
+ {
+ }
+
+ return true;
+}
+
+//-----------------------------------------------------------------
+// ____ XUnoTunnel ___
+::sal_Int64 SAL_CALL ChartRenderer::getSomething( const Sequence< ::sal_Int8 >& aIdentifier )
+ throw( uno::RuntimeException)
+{
+ if( aIdentifier.getLength() == 16 && 0 == rtl_compareMemory(
+ ChartPrettyPainter::getUnoTunnelId().getConstArray(),
+ aIdentifier.getConstArray(), 16 ) )
+ {
+ ChartPrettyPainter* pPaintableObject = this;
+ return reinterpret_cast<sal_Int64>(pPaintableObject);
+ }
+ return 0;
+}
+
+//-----------------------------------------------------------------
+// lang::XServiceInfo
+
+APPHELPER_XSERVICEINFO_IMPL(ChartRenderer,CHART_RENDERER_SERVICE_IMPLEMENTATION_NAME)
+
+Sequence< OUString > ChartRenderer::getSupportedServiceNames_Static()
+{
+ Sequence< OUString > aSNS;
+ return aSNS;
+}
+
+//.............................................................................
+} //namespace chart
+//.............................................................................