chartprettypainter.cxx (5900e8ec) chartprettypainter.cxx (78d93489)
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_svtools.hxx"
26
27#include <svtools/chartprettypainter.hxx>
28
29#include <tools/globname.hxx>
30#include <sot/clsids.hxx>
31// header for function rtl_createUuid
32#include <rtl/uuid.h>
33#include <vcl/pdfextoutdevdata.hxx>
34
35#include <com/sun/star/lang/XUnoTunnel.hpp>
36#include <com/sun/star/lang/XMultiServiceFactory.hpp>
37#include <svtools/embedhlp.hxx>
38
39using namespace ::com::sun::star;
40
41ChartPrettyPainter::ChartPrettyPainter()
42{
43}
44
45ChartPrettyPainter::~ChartPrettyPainter()
46{
47}
48
49bool ChartPrettyPainter::DoPaint(OutputDevice* /*pOutDev*/, const Rectangle& /*rLogicObjectRect*/) const
50{
51 return false;
52}
53
54//static
55const uno::Sequence<sal_Int8>& ChartPrettyPainter::getUnoTunnelId()
56{
57 static uno::Sequence<sal_Int8> * pSeq = 0;
58 if( !pSeq )
59 {
60 osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
61 if( !pSeq )
62 {
63 static uno::Sequence< sal_Int8 > aSeq( 16 );
64 rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
65 pSeq = &aSeq;
66 }
67 }
68 return *pSeq;
69}
70
71bool ChartPrettyPainter::IsChart( const svt::EmbeddedObjectRef& xObjRef )
72{
73 if ( !xObjRef.is() )
74 return false;
75
76 SvGlobalName aObjClsId( xObjRef->getClassID() );
77 if(
78 SvGlobalName(SO3_SCH_CLASSID_30) == aObjClsId
79 || SvGlobalName(SO3_SCH_CLASSID_40) == aObjClsId
80 || SvGlobalName(SO3_SCH_CLASSID_50) == aObjClsId
81 || SvGlobalName(SO3_SCH_CLASSID_60) == aObjClsId)
82 {
83 return true;
84 }
85
86 return false;
87}
88
89bool ChartPrettyPainter::ShouldPrettyPaintChartOnThisDevice( OutputDevice* pOutDev )
90{
91 if( !pOutDev )
92 return false;
93 //at least the print preview in calc has a paint loop due to too much invalidate calls deep in sdr
94 //to avoid the paint loop we use the metafile replacement in this case instead of direct rendering
95 if( OUTDEV_WINDOW == pOutDev->GetOutDevType() )
96 return false;
97 if( OUTDEV_PRINTER == pOutDev->GetOutDevType() )
98 return true;
99 vcl::PDFExtOutDevData* pPDFData = PTR_CAST( vcl::PDFExtOutDevData, pOutDev->GetExtOutDevData() );
100 if( pPDFData )
101 return true;
102 return false;
103}
104
105bool ChartPrettyPainter::DoPrettyPaintChart( uno::Reference< frame::XModel > xChartModel, OutputDevice* pOutDev, const Rectangle& rLogicObjectRect )
106{
107 //charts must be painted resolution dependent!! #i82893#, #i75867#
108 if( !xChartModel.is() || !ShouldPrettyPaintChartOnThisDevice( pOutDev ) )
109 return false;
110
111 try
112 {
113 uno::Reference< lang::XMultiServiceFactory > xFact( xChartModel, uno::UNO_QUERY );
114 OSL_ENSURE( xFact.is(), "Chart cannot be painted pretty!\n" );
115 if( xFact.is() )
116 {
117 uno::Reference< lang::XUnoTunnel > xChartRenderer( xFact->createInstance(
118 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.ChartRenderer" ) ) ), uno::UNO_QUERY );
119 OSL_ENSURE( xChartRenderer.is(), "Chart cannot be painted pretty!\n" );
120 if( xChartRenderer.is() )
121 {
122 ChartPrettyPainter* pPrettyPainter = reinterpret_cast<ChartPrettyPainter*>(
123 xChartRenderer->getSomething( ChartPrettyPainter::getUnoTunnelId() ));
124 if( pPrettyPainter )
125 return pPrettyPainter->DoPaint(pOutDev, rLogicObjectRect);
126 }
127 }
128 }
129 catch( uno::Exception& e )
130 {
131 (void)e;
132 DBG_ERROR( "Chart cannot be painted pretty!" );
133 }
134 return false;
135}
136