Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "xlchart.hxx"
21 :
22 : #include <com/sun/star/container/XNameContainer.hpp>
23 : #include <com/sun/star/awt/Size.hpp>
24 : #include <com/sun/star/awt/Gradient.hpp>
25 : #include <com/sun/star/drawing/Hatch.hpp>
26 : #include <com/sun/star/drawing/LineDash.hpp>
27 : #include <com/sun/star/drawing/LineStyle.hpp>
28 : #include <com/sun/star/drawing/FillStyle.hpp>
29 : #include <com/sun/star/drawing/BitmapMode.hpp>
30 : #include <com/sun/star/chart/DataLabelPlacement.hpp>
31 : #include <com/sun/star/chart/XAxisXSupplier.hpp>
32 : #include <com/sun/star/chart/XAxisYSupplier.hpp>
33 : #include <com/sun/star/chart/XAxisZSupplier.hpp>
34 : #include <com/sun/star/chart/XChartDocument.hpp>
35 : #include <com/sun/star/chart/XSecondAxisTitleSupplier.hpp>
36 : #include <com/sun/star/chart2/Symbol.hpp>
37 :
38 : #include <sal/macros.h>
39 : #include <rtl/math.hxx>
40 : #include <svl/itemset.hxx>
41 : #include <svx/xfillit0.hxx>
42 : #include <svx/xflclit.hxx>
43 : #include <svx/xfltrit.hxx>
44 : #include <svx/xflgrit.hxx>
45 : #include <svx/xbtmpit.hxx>
46 : #include <svx/unomid.hxx>
47 : #include <filter/msfilter/escherex.hxx>
48 : #include <editeng/memberids.hrc>
49 : #include "global.hxx"
50 : #include "xlroot.hxx"
51 : #include "xlstyle.hxx"
52 :
53 : using namespace com::sun::star;
54 : using ::com::sun::star::uno::Any;
55 : using ::com::sun::star::uno::Reference;
56 : using ::com::sun::star::uno::UNO_QUERY;
57 : using ::com::sun::star::uno::Exception;
58 : using ::com::sun::star::lang::XMultiServiceFactory;
59 : using ::com::sun::star::chart2::XChartDocument;
60 : using ::com::sun::star::drawing::XShape;
61 :
62 : namespace cssc = ::com::sun::star::chart;
63 :
64 : // Common =====================================================================
65 :
66 1093 : XclChRectangle::XclChRectangle() :
67 : mnX( 0 ),
68 : mnY( 0 ),
69 : mnWidth( 0 ),
70 1093 : mnHeight( 0 )
71 : {
72 1093 : }
73 :
74 597 : XclChDataPointPos::XclChDataPointPos( sal_uInt16 nSeriesIdx, sal_uInt16 nPointIdx ) :
75 : mnSeriesIdx( nSeriesIdx ),
76 597 : mnPointIdx( nPointIdx )
77 : {
78 597 : }
79 :
80 252 : bool operator<( const XclChDataPointPos& rL, const XclChDataPointPos& rR )
81 : {
82 656 : return (rL.mnSeriesIdx < rR.mnSeriesIdx) ||
83 715 : ((rL.mnSeriesIdx == rR.mnSeriesIdx) && (rL.mnPointIdx < rR.mnPointIdx));
84 : }
85 :
86 550 : XclChFrBlock::XclChFrBlock( sal_uInt16 nType ) :
87 : mnType( nType ),
88 : mnContext( 0 ),
89 : mnValue1( 0 ),
90 550 : mnValue2( 0 )
91 : {
92 550 : }
93 :
94 : // Frame formatting ===========================================================
95 :
96 331 : XclChFramePos::XclChFramePos() :
97 : mnTLMode( EXC_CHFRAMEPOS_PARENT ),
98 331 : mnBRMode( EXC_CHFRAMEPOS_PARENT )
99 : {
100 331 : }
101 :
102 931 : XclChLineFormat::XclChLineFormat() :
103 : maColor( COL_BLACK ),
104 : mnPattern( EXC_CHLINEFORMAT_SOLID ),
105 : mnWeight( EXC_CHLINEFORMAT_SINGLE ),
106 931 : mnFlags( EXC_CHLINEFORMAT_AUTO )
107 : {
108 931 : }
109 :
110 619 : XclChAreaFormat::XclChAreaFormat() :
111 : maPattColor( COL_WHITE ),
112 : maBackColor( COL_BLACK ),
113 : mnPattern( EXC_PATT_SOLID ),
114 619 : mnFlags( EXC_CHAREAFORMAT_AUTO )
115 : {
116 619 : }
117 :
118 98 : XclChEscherFormat::XclChEscherFormat()
119 : {
120 98 : }
121 :
122 98 : XclChEscherFormat::~XclChEscherFormat()
123 : {
124 98 : }
125 :
126 98 : XclChPicFormat::XclChPicFormat() :
127 : mnBmpMode( EXC_CHPICFORMAT_NONE ),
128 : mnFlags( EXC_CHPICFORMAT_TOPBOTTOM | EXC_CHPICFORMAT_FRONTBACK | EXC_CHPICFORMAT_LEFTRIGHT ),
129 98 : mfScale( 0.5 )
130 : {
131 98 : }
132 :
133 383 : XclChFrame::XclChFrame() :
134 : mnFormat( EXC_CHFRAME_STANDARD ),
135 383 : mnFlags( EXC_CHFRAME_AUTOSIZE | EXC_CHFRAME_AUTOPOS )
136 : {
137 383 : }
138 :
139 : // Source links ===============================================================
140 :
141 631 : XclChSourceLink::XclChSourceLink() :
142 : mnDestType( EXC_CHSRCLINK_TITLE ),
143 : mnLinkType( EXC_CHSRCLINK_DEFAULT ),
144 : mnFlags( 0 ),
145 631 : mnNumFmtIdx( 0 )
146 : {
147 631 : }
148 :
149 : // Text =======================================================================
150 :
151 286 : XclChObjectLink::XclChObjectLink() :
152 286 : mnTarget( EXC_CHOBJLINK_NONE )
153 : {
154 286 : }
155 :
156 1 : XclChFrLabelProps::XclChFrLabelProps() :
157 1 : mnFlags( 0 )
158 : {
159 1 : }
160 :
161 349 : XclChText::XclChText() :
162 : maTextColor( COL_BLACK ),
163 : mnHAlign( EXC_CHTEXT_ALIGN_CENTER ),
164 : mnVAlign( EXC_CHTEXT_ALIGN_CENTER ),
165 : mnBackMode( EXC_CHTEXT_TRANSPARENT ),
166 : mnFlags( EXC_CHTEXT_AUTOCOLOR | EXC_CHTEXT_AUTOFILL ),
167 : mnFlags2( EXC_CHTEXT_POS_DEFAULT ),
168 349 : mnRotation( EXC_ROT_NONE )
169 : {
170 349 : }
171 :
172 : // Data series ================================================================
173 :
174 149 : XclChMarkerFormat::XclChMarkerFormat() :
175 : maLineColor( COL_BLACK ),
176 : maFillColor( COL_WHITE ),
177 : mnMarkerSize( EXC_CHMARKERFORMAT_SINGLESIZE ),
178 : mnMarkerType( EXC_CHMARKERFORMAT_NOSYMBOL ),
179 149 : mnFlags( EXC_CHMARKERFORMAT_AUTO )
180 : {
181 149 : };
182 :
183 117 : XclCh3dDataFormat::XclCh3dDataFormat() :
184 : mnBase( EXC_CH3DDATAFORMAT_RECT ),
185 117 : mnTop( EXC_CH3DDATAFORMAT_STRAIGHT )
186 : {
187 117 : }
188 :
189 180 : XclChDataFormat::XclChDataFormat() :
190 : mnFormatIdx( EXC_CHDATAFORMAT_DEFAULT ),
191 180 : mnFlags( 0 )
192 : {
193 180 : }
194 :
195 9 : XclChSerTrendLine::XclChSerTrendLine() :
196 : mfForecastFor( 0.0 ),
197 : mfForecastBack( 0.0 ),
198 : mnLineType( EXC_CHSERTREND_POLYNOMIAL ),
199 : mnOrder( 1 ),
200 : mnShowEquation( 0 ),
201 9 : mnShowRSquared( 0 )
202 : {
203 : /* Set all bits in mfIntercept to 1 (that is -1.#NAN) to indicate that
204 : there is no interception point. Cannot use ::rtl::math::setNan() here
205 : cause it misses the sign bit. */
206 9 : sal_math_Double* pDouble = reinterpret_cast< sal_math_Double* >( &mfIntercept );
207 9 : pDouble->w32_parts.msw = pDouble->w32_parts.lsw = 0xFFFFFFFF;
208 9 : }
209 :
210 2 : XclChSerErrorBar::XclChSerErrorBar() :
211 : mfValue( 0.0 ),
212 : mnValueCount( 1 ),
213 : mnBarType( EXC_CHSERERR_NONE ),
214 : mnSourceType( EXC_CHSERERR_FIXED ),
215 2 : mnLineEnd( EXC_CHSERERR_END_TSHAPE )
216 : {
217 2 : }
218 :
219 104 : XclChSeries::XclChSeries() :
220 : mnCategType( EXC_CHSERIES_NUMERIC ),
221 : mnValueType( EXC_CHSERIES_NUMERIC ),
222 : mnBubbleType( EXC_CHSERIES_NUMERIC ),
223 : mnCategCount( 0 ),
224 : mnValueCount( 0 ),
225 104 : mnBubbleCount( 0 )
226 : {
227 104 : }
228 :
229 : // Chart type groups ==========================================================
230 :
231 100 : XclChType::XclChType() :
232 : mnOverlap( 0 ),
233 : mnGap( 150 ),
234 : mnRotation( 0 ),
235 : mnPieHole( 0 ),
236 : mnBubbleSize( 100 ),
237 : mnBubbleType( EXC_CHSCATTER_AREA ),
238 100 : mnFlags( 0 )
239 : {
240 100 : }
241 :
242 0 : XclChChart3d::XclChChart3d() :
243 : mnRotation( 20 ),
244 : mnElevation( 15 ),
245 : mnEyeDist( 30 ),
246 : mnRelHeight( 100 ),
247 : mnRelDepth( 100 ),
248 : mnDepthGap( 150 ),
249 0 : mnFlags( EXC_CHCHART3D_AUTOHEIGHT )
250 : {
251 0 : }
252 :
253 44 : XclChLegend::XclChLegend() :
254 : mnDockMode( EXC_CHLEGEND_RIGHT ),
255 : mnSpacing( EXC_CHLEGEND_MEDIUM ),
256 : mnFlags( EXC_CHLEGEND_DOCKED | EXC_CHLEGEND_AUTOSERIES |
257 44 : EXC_CHLEGEND_AUTOPOSX | EXC_CHLEGEND_AUTOPOSY | EXC_CHLEGEND_STACKED )
258 : {
259 44 : }
260 :
261 100 : XclChTypeGroup::XclChTypeGroup() :
262 : mnFlags( 0 ),
263 100 : mnGroupIdx( EXC_CHSERGROUP_NONE )
264 : {
265 100 : }
266 :
267 72 : XclChProperties::XclChProperties() :
268 : mnFlags( 0 ),
269 72 : mnEmptyMode( EXC_CHPROPS_EMPTY_SKIP )
270 : {
271 72 : }
272 :
273 : // Axes =======================================================================
274 :
275 113 : XclChLabelRange::XclChLabelRange() :
276 : mnCross( 1 ),
277 : mnLabelFreq( 1 ),
278 : mnTickFreq( 1 ),
279 113 : mnFlags( 0 )
280 : {
281 113 : }
282 :
283 113 : XclChDateRange::XclChDateRange() :
284 : mnMinDate( 0 ),
285 : mnMaxDate( 0 ),
286 : mnMajorStep( 0 ),
287 : mnMajorUnit( EXC_CHDATERANGE_DAYS ),
288 : mnMinorStep( 0 ),
289 : mnMinorUnit( EXC_CHDATERANGE_DAYS ),
290 : mnBaseUnit( EXC_CHDATERANGE_DAYS ),
291 : mnCross( 0 ),
292 : mnFlags( EXC_CHDATERANGE_AUTOMIN | EXC_CHDATERANGE_AUTOMAX |
293 : EXC_CHDATERANGE_AUTOMAJOR | EXC_CHDATERANGE_AUTOMINOR |
294 : EXC_CHDATERANGE_AUTOBASE | EXC_CHDATERANGE_AUTOCROSS |
295 113 : EXC_CHDATERANGE_AUTODATE )
296 : {
297 113 : }
298 :
299 133 : XclChValueRange::XclChValueRange() :
300 : mfMin( 0.0 ),
301 : mfMax( 0.0 ),
302 : mfMajorStep( 0.0 ),
303 : mfMinorStep( 0.0 ),
304 : mfCross( 0.0 ),
305 : mnFlags( EXC_CHVALUERANGE_AUTOMIN | EXC_CHVALUERANGE_AUTOMAX |
306 : EXC_CHVALUERANGE_AUTOMAJOR | EXC_CHVALUERANGE_AUTOMINOR |
307 133 : EXC_CHVALUERANGE_AUTOCROSS | EXC_CHVALUERANGE_BIT8 )
308 : {
309 133 : }
310 :
311 150 : XclChTick::XclChTick() :
312 : maTextColor( COL_BLACK ),
313 : mnMajor( EXC_CHTICK_INSIDE | EXC_CHTICK_OUTSIDE ),
314 : mnMinor( 0 ),
315 : mnLabelPos( EXC_CHTICK_NEXT ),
316 : mnBackMode( EXC_CHTICK_TRANSPARENT ),
317 : mnFlags( EXC_CHTICK_AUTOCOLOR | EXC_CHTICK_AUTOROT ),
318 150 : mnRotation( EXC_ROT_NONE )
319 : {
320 150 : }
321 :
322 150 : XclChAxis::XclChAxis() :
323 150 : mnType( EXC_CHAXIS_NONE )
324 : {
325 150 : }
326 :
327 150 : sal_Int32 XclChAxis::GetApiAxisDimension() const
328 : {
329 150 : sal_Int32 nApiAxisDim = EXC_CHART_AXIS_NONE;
330 150 : switch( mnType )
331 : {
332 75 : case EXC_CHAXIS_X: nApiAxisDim = EXC_CHART_AXIS_X; break;
333 75 : case EXC_CHAXIS_Y: nApiAxisDim = EXC_CHART_AXIS_Y; break;
334 0 : case EXC_CHAXIS_Z: nApiAxisDim = EXC_CHART_AXIS_Z; break;
335 : }
336 150 : return nApiAxisDim;
337 : }
338 :
339 192 : XclChAxesSet::XclChAxesSet() :
340 192 : mnAxesSetId( EXC_CHAXESSET_PRIMARY )
341 : {
342 192 : }
343 :
344 250 : sal_Int32 XclChAxesSet::GetApiAxesSetIndex() const
345 : {
346 250 : sal_Int32 nApiAxesSetIdx = EXC_CHART_AXESSET_NONE;
347 250 : switch( mnAxesSetId )
348 : {
349 216 : case EXC_CHAXESSET_PRIMARY: nApiAxesSetIdx = EXC_CHART_AXESSET_PRIMARY; break;
350 34 : case EXC_CHAXESSET_SECONDARY: nApiAxesSetIdx = EXC_CHART_AXESSET_SECONDARY; break;
351 : }
352 250 : return nApiAxesSetIdx;
353 : }
354 :
355 : // Static helper functions ====================================================
356 :
357 2 : sal_uInt16 XclChartHelper::GetSeriesLineAutoColorIdx( sal_uInt16 nFormatIdx )
358 : {
359 : static const sal_uInt16 spnLineColors[] =
360 : {
361 : 32, 33, 34, 35, 36, 37, 38, 39,
362 : 40, 41, 42, 43, 44, 45, 46, 47,
363 : 48, 49, 50, 51, 52, 53, 54, 55,
364 : 56, 57, 58, 59, 60, 61, 62, 8,
365 : 9, 10, 11, 12, 13, 14, 15, 16,
366 : 17, 18, 19, 20, 21, 22, 23, 24,
367 : 25, 26, 27, 28, 29, 30, 31, 63
368 : };
369 2 : return spnLineColors[ nFormatIdx % SAL_N_ELEMENTS( spnLineColors ) ];
370 : }
371 :
372 2 : sal_uInt16 XclChartHelper::GetSeriesFillAutoColorIdx( sal_uInt16 nFormatIdx )
373 : {
374 : static const sal_uInt16 spnFillColors[] =
375 : {
376 : 24, 25, 26, 27, 28, 29, 30, 31,
377 : 32, 33, 34, 35, 36, 37, 38, 39,
378 : 40, 41, 42, 43, 44, 45, 46, 47,
379 : 48, 49, 50, 51, 52, 53, 54, 55,
380 : 56, 57, 58, 59, 60, 61, 62, 63,
381 : 8, 9, 10, 11, 12, 13, 14, 15,
382 : 16, 17, 18, 19, 20, 21, 22, 23
383 : };
384 2 : return spnFillColors[ nFormatIdx % SAL_N_ELEMENTS( spnFillColors ) ];
385 : }
386 :
387 2 : sal_uInt8 XclChartHelper::GetSeriesFillAutoTransp( sal_uInt16 nFormatIdx )
388 : {
389 : static const sal_uInt8 spnTrans[] = { 0x00, 0x40, 0x20, 0x60, 0x70 };
390 2 : return spnTrans[ (nFormatIdx / 56) % SAL_N_ELEMENTS( spnTrans ) ];
391 : }
392 :
393 3 : sal_uInt16 XclChartHelper::GetAutoMarkerType( sal_uInt16 nFormatIdx )
394 : {
395 : static const sal_uInt16 spnSymbols[] = {
396 : EXC_CHMARKERFORMAT_DIAMOND, EXC_CHMARKERFORMAT_SQUARE, EXC_CHMARKERFORMAT_TRIANGLE,
397 : EXC_CHMARKERFORMAT_CROSS, EXC_CHMARKERFORMAT_STAR, EXC_CHMARKERFORMAT_CIRCLE,
398 : EXC_CHMARKERFORMAT_PLUS, EXC_CHMARKERFORMAT_DOWJ, EXC_CHMARKERFORMAT_STDDEV };
399 3 : return spnSymbols[ nFormatIdx % SAL_N_ELEMENTS( spnSymbols ) ];
400 : }
401 :
402 22 : bool XclChartHelper::HasMarkerFillColor( sal_uInt16 nMarkerType )
403 : {
404 : static const bool spbFilled[] = {
405 : false, true, true, true, false, false, false, false, true, false };
406 22 : return (nMarkerType < SAL_N_ELEMENTS( spbFilled )) && spbFilled[ nMarkerType ];
407 : }
408 :
409 0 : OUString XclChartHelper::GetErrorBarValuesRole( sal_uInt8 nBarType )
410 : {
411 0 : switch( nBarType )
412 : {
413 0 : case EXC_CHSERERR_XPLUS: return OUString( EXC_CHPROP_ROLE_ERRORBARS_POSX );
414 0 : case EXC_CHSERERR_XMINUS: return OUString( EXC_CHPROP_ROLE_ERRORBARS_NEGX );
415 0 : case EXC_CHSERERR_YPLUS: return OUString( EXC_CHPROP_ROLE_ERRORBARS_POSY );
416 0 : case EXC_CHSERERR_YMINUS: return OUString( EXC_CHPROP_ROLE_ERRORBARS_NEGY );
417 : default: OSL_FAIL( "XclChartHelper::GetErrorBarValuesRole - unknown bar type" );
418 : }
419 0 : return OUString();
420 : }
421 :
422 : // Chart formatting info provider =============================================
423 :
424 : namespace {
425 :
426 : static const XclChFormatInfo spFmtInfos[] =
427 : {
428 : // object type property mode auto line color auto line weight auto pattern color missing frame type create delete isframe
429 : { EXC_CHOBJTYPE_BACKGROUND, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, true, true, true },
430 : { EXC_CHOBJTYPE_PLOTFRAME, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, true, true, true },
431 : { EXC_CHOBJTYPE_WALL3D, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, true, false, true },
432 : { EXC_CHOBJTYPE_FLOOR3D, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, 23, EXC_CHFRAMETYPE_AUTO, true, false, true },
433 : { EXC_CHOBJTYPE_TEXT, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, true, true },
434 : { EXC_CHOBJTYPE_LEGEND, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, true, true, true },
435 : { EXC_CHOBJTYPE_LINEARSERIES, EXC_CHPROPMODE_LINEARSERIES, 0xFFFF, EXC_CHLINEFORMAT_SINGLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, false, false, false },
436 : { EXC_CHOBJTYPE_FILLEDSERIES, EXC_CHPROPMODE_FILLEDSERIES, EXC_COLOR_CHBORDERAUTO, EXC_CHLINEFORMAT_SINGLE, 0xFFFF, EXC_CHFRAMETYPE_AUTO, false, false, true },
437 : { EXC_CHOBJTYPE_AXISLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_AUTO, false, false, false },
438 : { EXC_CHOBJTYPE_GRIDLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, true, false },
439 : { EXC_CHOBJTYPE_TRENDLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_DOUBLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
440 : { EXC_CHOBJTYPE_ERRORBAR, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_SINGLE, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
441 : { EXC_CHOBJTYPE_CONNECTLINE, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
442 : { EXC_CHOBJTYPE_HILOLINE, EXC_CHPROPMODE_LINEARSERIES, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, false },
443 : { EXC_CHOBJTYPE_WHITEDROPBAR, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWBACK, EXC_CHFRAMETYPE_INVISIBLE, false, false, true },
444 : { EXC_CHOBJTYPE_BLACKDROPBAR, EXC_CHPROPMODE_COMMON, EXC_COLOR_CHWINDOWTEXT, EXC_CHLINEFORMAT_HAIR, EXC_COLOR_CHWINDOWTEXT, EXC_CHFRAMETYPE_INVISIBLE, false, false, true }
445 : };
446 :
447 : }
448 :
449 72 : XclChFormatInfoProvider::XclChFormatInfoProvider()
450 : {
451 72 : const XclChFormatInfo* pEnd = STATIC_ARRAY_END( spFmtInfos );
452 1224 : for( const XclChFormatInfo* pIt = spFmtInfos; pIt != pEnd; ++pIt )
453 1152 : maInfoMap[ pIt->meObjType ] = pIt;
454 72 : }
455 :
456 1863 : const XclChFormatInfo& XclChFormatInfoProvider::GetFormatInfo( XclChObjectType eObjType ) const
457 : {
458 1863 : XclFmtInfoMap::const_iterator aIt = maInfoMap.find( eObjType );
459 : OSL_ENSURE( aIt != maInfoMap.end(), "XclChFormatInfoProvider::GetFormatInfo - unknown object type" );
460 1863 : return (aIt == maInfoMap.end()) ? *spFmtInfos : *aIt->second;
461 : }
462 :
463 : // Chart type info provider ===================================================
464 :
465 : namespace {
466 :
467 : // chart type service names
468 : const sal_Char SERVICE_CHART2_AREA[] = "com.sun.star.chart2.AreaChartType";
469 : const sal_Char SERVICE_CHART2_CANDLE[] = "com.sun.star.chart2.CandleStickChartType";
470 : const sal_Char SERVICE_CHART2_COLUMN[] = "com.sun.star.chart2.ColumnChartType";
471 : const sal_Char SERVICE_CHART2_LINE[] = "com.sun.star.chart2.LineChartType";
472 : const sal_Char SERVICE_CHART2_NET[] = "com.sun.star.chart2.NetChartType";
473 : const sal_Char SERVICE_CHART2_FILLEDNET[] = "com.sun.star.chart2.FilledNetChartType";
474 : const sal_Char SERVICE_CHART2_PIE[] = "com.sun.star.chart2.PieChartType";
475 : const sal_Char SERVICE_CHART2_SCATTER[] = "com.sun.star.chart2.ScatterChartType";
476 : const sal_Char SERVICE_CHART2_BUBBLE[] = "com.sun.star.chart2.BubbleChartType";
477 : const sal_Char SERVICE_CHART2_SURFACE[] = "com.sun.star.chart2.ColumnChartType"; // Todo
478 :
479 : namespace csscd = cssc::DataLabelPlacement;
480 :
481 : static const XclChTypeInfo spTypeInfos[] =
482 : {
483 : // chart type chart type category record id service varied point color def label pos comb2d 3d polar area2d area3d 1stvis xcateg swap stack revers betw
484 : { EXC_CHTYPEID_BAR, EXC_CHTYPECATEG_BAR, EXC_ID_CHBAR, SERVICE_CHART2_COLUMN, EXC_CHVARPOINT_SINGLE, csscd::OUTSIDE, true, true, false, true, true, false, true, false, true, false, true },
485 : { EXC_CHTYPEID_HORBAR, EXC_CHTYPECATEG_BAR, EXC_ID_CHBAR, SERVICE_CHART2_COLUMN, EXC_CHVARPOINT_SINGLE, csscd::OUTSIDE, false, true, false, true, true, false, true, true, true, false, true },
486 : { EXC_CHTYPEID_LINE, EXC_CHTYPECATEG_LINE, EXC_ID_CHLINE, SERVICE_CHART2_LINE, EXC_CHVARPOINT_SINGLE, csscd::RIGHT, true, true, false, false, true, false, true, false, true, false, false },
487 : { EXC_CHTYPEID_AREA, EXC_CHTYPECATEG_LINE, EXC_ID_CHAREA, SERVICE_CHART2_AREA, EXC_CHVARPOINT_NONE, csscd::CENTER, true, true, false, true, true, false, true, false, true, true, false },
488 : { EXC_CHTYPEID_STOCK, EXC_CHTYPECATEG_LINE, EXC_ID_CHLINE, SERVICE_CHART2_CANDLE, EXC_CHVARPOINT_NONE, csscd::RIGHT, true, false, false, false, false, false, true, false, true, false, false },
489 : { EXC_CHTYPEID_RADARLINE, EXC_CHTYPECATEG_RADAR, EXC_ID_CHRADARLINE, SERVICE_CHART2_NET, EXC_CHVARPOINT_SINGLE, csscd::TOP, false, false, true, false, true, false, true, false, false, false, false },
490 : { EXC_CHTYPEID_RADARAREA, EXC_CHTYPECATEG_RADAR, EXC_ID_CHRADARAREA, SERVICE_CHART2_FILLEDNET, EXC_CHVARPOINT_NONE, csscd::TOP, false, false, true, true, true, false, true, false, false, true, false },
491 : { EXC_CHTYPEID_PIE, EXC_CHTYPECATEG_PIE, EXC_ID_CHPIE, SERVICE_CHART2_PIE, EXC_CHVARPOINT_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, true, true, false, false, false, false },
492 : { EXC_CHTYPEID_DONUT, EXC_CHTYPECATEG_PIE, EXC_ID_CHPIE, SERVICE_CHART2_PIE, EXC_CHVARPOINT_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, false, true, false, false, false, false },
493 : { EXC_CHTYPEID_PIEEXT, EXC_CHTYPECATEG_PIE, EXC_ID_CHPIEEXT, SERVICE_CHART2_PIE, EXC_CHVARPOINT_MULTI, csscd::AVOID_OVERLAP, false, false, true, true, true, true, true, false, false, false, false },
494 : { EXC_CHTYPEID_SCATTER, EXC_CHTYPECATEG_SCATTER, EXC_ID_CHSCATTER, SERVICE_CHART2_SCATTER, EXC_CHVARPOINT_SINGLE, csscd::RIGHT, true, false, false, false, true, false, false, false, false, false, false },
495 : { EXC_CHTYPEID_BUBBLES, EXC_CHTYPECATEG_SCATTER, EXC_ID_CHSCATTER, SERVICE_CHART2_BUBBLE, EXC_CHVARPOINT_SINGLE, csscd::RIGHT, false, false, false, true, true, false, false, false, false, false, false },
496 : { EXC_CHTYPEID_SURFACE, EXC_CHTYPECATEG_SURFACE, EXC_ID_CHSURFACE, SERVICE_CHART2_SURFACE, EXC_CHVARPOINT_NONE, csscd::RIGHT, false, true, false, true, true, false, true, false, false, false, false },
497 : { EXC_CHTYPEID_UNKNOWN, EXC_CHTYPECATEG_BAR, EXC_ID_CHBAR, SERVICE_CHART2_COLUMN, EXC_CHVARPOINT_SINGLE, csscd::OUTSIDE, true, true, false, true, true, false, true, false, true, false, true }
498 : };
499 :
500 : } // namespace
501 :
502 100 : XclChExtTypeInfo::XclChExtTypeInfo( const XclChTypeInfo& rTypeInfo ) :
503 : XclChTypeInfo( rTypeInfo ),
504 : mb3dChart( false ),
505 100 : mbSpline( false )
506 : {
507 100 : }
508 :
509 100 : void XclChExtTypeInfo::Set( const XclChTypeInfo& rTypeInfo, bool b3dChart, bool bSpline )
510 : {
511 100 : static_cast< XclChTypeInfo& >( *this ) = rTypeInfo;
512 100 : mb3dChart = mbSupports3d && b3dChart;
513 100 : mbSpline = bSpline;
514 100 : }
515 :
516 72 : XclChTypeInfoProvider::XclChTypeInfoProvider()
517 : {
518 72 : const XclChTypeInfo* pEnd = STATIC_ARRAY_END( spTypeInfos );
519 1080 : for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt )
520 1008 : maInfoMap[ pIt->meTypeId ] = pIt;
521 72 : }
522 :
523 170 : const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfo( XclChTypeId eTypeId ) const
524 : {
525 170 : XclChTypeInfoMap::const_iterator aIt = maInfoMap.find( eTypeId );
526 : OSL_ENSURE( aIt != maInfoMap.end(), "XclChTypeInfoProvider::GetTypeInfo - unknown chart type" );
527 170 : return (aIt == maInfoMap.end()) ? *maInfoMap.rbegin()->second : *aIt->second;
528 : }
529 :
530 1 : const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfoFromRecId( sal_uInt16 nRecId ) const
531 : {
532 1 : const XclChTypeInfo* pEnd = STATIC_ARRAY_END( spTypeInfos );
533 15 : for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt )
534 14 : if( pIt->mnRecId == nRecId )
535 0 : return *pIt;
536 : OSL_FAIL( "XclChTypeInfoProvider::GetTypeInfoFromRecId - unknown record id" );
537 1 : return GetTypeInfo( EXC_CHTYPEID_UNKNOWN );
538 : }
539 :
540 52 : const XclChTypeInfo& XclChTypeInfoProvider::GetTypeInfoFromService( const OUString& rServiceName ) const
541 : {
542 52 : const XclChTypeInfo* pEnd = STATIC_ARRAY_END( spTypeInfos );
543 258 : for( const XclChTypeInfo* pIt = spTypeInfos; pIt != pEnd; ++pIt )
544 258 : if( rServiceName.equalsAscii( pIt->mpcServiceName ) )
545 52 : return *pIt;
546 : OSL_FAIL( "XclChTypeInfoProvider::GetTypeInfoFromService - unknown service name" );
547 0 : return GetTypeInfo( EXC_CHTYPEID_UNKNOWN );
548 : }
549 :
550 : // Property helpers ===========================================================
551 :
552 288 : XclChObjectTable::XclChObjectTable( Reference< XMultiServiceFactory > xFactory,
553 : const OUString& rServiceName, const OUString& rObjNameBase ) :
554 : mxFactory( xFactory ),
555 : maServiceName( rServiceName ),
556 : maObjNameBase( rObjNameBase ),
557 288 : mnIndex( 0 )
558 : {
559 288 : }
560 :
561 0 : Any XclChObjectTable::GetObject( const OUString& rObjName )
562 : {
563 : // get object table
564 0 : if( !mxContainer.is() )
565 0 : mxContainer.set( ScfApiHelper::CreateInstance( mxFactory, maServiceName ), UNO_QUERY );
566 : OSL_ENSURE( mxContainer.is(), "XclChObjectTable::GetObject - container not found" );
567 :
568 0 : Any aObj;
569 0 : if( mxContainer.is() )
570 : {
571 : // get object from container
572 : try
573 : {
574 0 : aObj = mxContainer->getByName( rObjName );
575 : }
576 0 : catch( Exception& )
577 : {
578 : OSL_FAIL( "XclChObjectTable::GetObject - object not found" );
579 : }
580 : }
581 0 : return aObj;
582 : }
583 :
584 0 : OUString XclChObjectTable::InsertObject( const Any& rObj )
585 : {
586 :
587 : // create object table
588 0 : if( !mxContainer.is() )
589 0 : mxContainer.set( ScfApiHelper::CreateInstance( mxFactory, maServiceName ), UNO_QUERY );
590 : OSL_ENSURE( mxContainer.is(), "XclChObjectTable::InsertObject - container not found" );
591 :
592 0 : OUString aObjName;
593 0 : if( mxContainer.is() )
594 : {
595 : // create new unused identifier
596 0 : do
597 : {
598 0 : aObjName = maObjNameBase + OUString::number( ++mnIndex );
599 : }
600 0 : while( mxContainer->hasByName( aObjName ) );
601 :
602 : // insert object
603 : try
604 : {
605 0 : mxContainer->insertByName( aObjName, rObj );
606 : }
607 0 : catch( Exception& )
608 : {
609 : OSL_FAIL( "XclChObjectTable::InsertObject - cannot insert object" );
610 0 : aObjName.clear();
611 : }
612 : }
613 0 : return aObjName;
614 : }
615 :
616 : // Property names -------------------------------------------------------------
617 :
618 : namespace {
619 :
620 : /** Property names for line style in common objects. */
621 : const sal_Char* const sppcLineNamesCommon[] =
622 : { "LineStyle", "LineWidth", "LineColor", "LineTransparence", "LineDashName", 0 };
623 : /** Property names for line style in linear series objects. */
624 : const sal_Char* const sppcLineNamesLinear[] =
625 : { "LineStyle", "LineWidth", "Color", "Transparency", "LineDashName", 0 };
626 : /** Property names for line style in filled series objects. */
627 : const sal_Char* const sppcLineNamesFilled[] =
628 : { "BorderStyle", "BorderWidth", "BorderColor", "BorderTransparency", "BorderDashName", 0 };
629 :
630 : /** Property names for solid area style in common objects. */
631 : const sal_Char* const sppcAreaNamesCommon[] = { "FillStyle", "FillColor", "FillTransparence", 0 };
632 : /** Property names for solid area style in filled series objects. */
633 : const sal_Char* const sppcAreaNamesFilled[] = { "FillStyle", "Color", "Transparency", 0 };
634 : /** Property names for gradient area style in common objects. */
635 : const sal_Char* const sppcGradNamesCommon[] = { "FillStyle", "FillGradientName", 0 };
636 : /** Property names for gradient area style in filled series objects. */
637 : const sal_Char* const sppcGradNamesFilled[] = { "FillStyle", "GradientName", 0 };
638 : /** Property names for hatch area style in common objects. */
639 : const sal_Char* const sppcHatchNamesCommon[] = { "FillStyle", "FillHatchName", "FillColor", "FillBackground", 0 };
640 : /** Property names for hatch area style in filled series objects. */
641 : const sal_Char* const sppcHatchNamesFilled[] = { "FillStyle", "HatchName", "Color", "FillBackground", 0 };
642 : /** Property names for bitmap area style. */
643 : const sal_Char* const sppcBitmapNames[] = { "FillStyle", "FillBitmapName", "FillBitmapMode", 0 };
644 :
645 : } // namespace
646 :
647 156 : XclChPropSetHelper::XclChPropSetHelper() :
648 : maLineHlpCommon( sppcLineNamesCommon ),
649 : maLineHlpLinear( sppcLineNamesLinear ),
650 : maLineHlpFilled( sppcLineNamesFilled ),
651 : maAreaHlpCommon( sppcAreaNamesCommon ),
652 : maAreaHlpFilled( sppcAreaNamesFilled ),
653 : maGradHlpCommon( sppcGradNamesCommon ),
654 : maGradHlpFilled( sppcGradNamesFilled ),
655 : maHatchHlpCommon( sppcHatchNamesCommon ),
656 : maHatchHlpFilled( sppcHatchNamesFilled ),
657 156 : maBitmapHlp( sppcBitmapNames )
658 : {
659 156 : }
660 :
661 : // read properties ------------------------------------------------------------
662 :
663 226 : void XclChPropSetHelper::ReadLineProperties(
664 : XclChLineFormat& rLineFmt, XclChObjectTable& rDashTable,
665 : const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode )
666 : {
667 : namespace cssd = ::com::sun::star::drawing;
668 :
669 : // read properties from property set
670 226 : cssd::LineStyle eApiStyle = cssd::LineStyle_NONE;
671 226 : sal_Int32 nApiWidth = 0;
672 226 : sal_Int16 nApiTrans = 0;
673 226 : Any aDashNameAny;
674 :
675 226 : ScfPropSetHelper& rLineHlp = GetLineHelper( ePropMode );
676 226 : rLineHlp.ReadFromPropertySet( rPropSet );
677 226 : rLineHlp >> eApiStyle >> nApiWidth >> rLineFmt.maColor >> nApiTrans >> aDashNameAny;
678 :
679 : // clear automatic flag
680 226 : ::set_flag( rLineFmt.mnFlags, EXC_CHLINEFORMAT_AUTO, false );
681 :
682 : // line width
683 226 : if( nApiWidth <= 0 ) rLineFmt.mnWeight = EXC_CHLINEFORMAT_HAIR;
684 106 : else if( nApiWidth <= 35 ) rLineFmt.mnWeight = EXC_CHLINEFORMAT_SINGLE;
685 30 : else if( nApiWidth <= 70 ) rLineFmt.mnWeight = EXC_CHLINEFORMAT_DOUBLE;
686 22 : else rLineFmt.mnWeight = EXC_CHLINEFORMAT_TRIPLE;
687 :
688 : // line style
689 226 : switch( eApiStyle )
690 : {
691 : case cssd::LineStyle_NONE:
692 107 : rLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE;
693 107 : break;
694 : case cssd::LineStyle_SOLID:
695 : {
696 119 : if( nApiTrans < 13 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
697 0 : else if( nApiTrans < 38 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_DARKTRANS;
698 0 : else if( nApiTrans < 63 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_MEDTRANS;
699 0 : else if( nApiTrans < 100 ) rLineFmt.mnPattern = EXC_CHLINEFORMAT_LIGHTTRANS;
700 0 : else rLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE;
701 : }
702 119 : break;
703 : case cssd::LineStyle_DASH:
704 : {
705 0 : rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
706 0 : OUString aDashName;
707 0 : cssd::LineDash aApiDash;
708 0 : if( (aDashNameAny >>= aDashName) && (rDashTable.GetObject( aDashName ) >>= aApiDash) )
709 : {
710 : // reorder dashes that are shorter than dots
711 0 : if( (aApiDash.Dashes == 0) || (aApiDash.DashLen < aApiDash.DotLen) )
712 : {
713 0 : ::std::swap( aApiDash.Dashes, aApiDash.Dots );
714 0 : ::std::swap( aApiDash.DashLen, aApiDash.DotLen );
715 : }
716 : // ignore dots that are nearly equal to dashes
717 0 : if( aApiDash.DotLen * 3 > aApiDash.DashLen * 2 )
718 0 : aApiDash.Dots = 0;
719 :
720 : // convert line dash to predefined Excel dash types
721 0 : if( (aApiDash.Dashes == 1) && (aApiDash.Dots >= 1) )
722 : // one dash and one or more dots
723 0 : rLineFmt.mnPattern = (aApiDash.Dots == 1) ?
724 0 : EXC_CHLINEFORMAT_DASHDOT : EXC_CHLINEFORMAT_DASHDOTDOT;
725 0 : else if( aApiDash.Dashes >= 1 )
726 : // one or more dashes and no dots (also: dash-dash-dot)
727 0 : rLineFmt.mnPattern = (aApiDash.DashLen < 250) ?
728 0 : EXC_CHLINEFORMAT_DOT : EXC_CHLINEFORMAT_DASH;
729 0 : }
730 : }
731 0 : break;
732 : default:
733 : OSL_FAIL( "XclChPropSetHelper::ReadLineProperties - unknown line style" );
734 0 : rLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
735 226 : }
736 226 : }
737 :
738 113 : bool XclChPropSetHelper::ReadAreaProperties( XclChAreaFormat& rAreaFmt,
739 : const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode )
740 : {
741 : namespace cssd = ::com::sun::star::drawing;
742 :
743 : // read properties from property set
744 113 : cssd::FillStyle eApiStyle = cssd::FillStyle_NONE;
745 113 : sal_Int16 nTransparency = 0;
746 :
747 113 : ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
748 113 : rAreaHlp.ReadFromPropertySet( rPropSet );
749 113 : rAreaHlp >> eApiStyle >> rAreaFmt.maPattColor >> nTransparency;
750 :
751 : // clear automatic flag
752 113 : ::set_flag( rAreaFmt.mnFlags, EXC_CHAREAFORMAT_AUTO, false );
753 :
754 : // set fill style transparent or solid (set solid for anything but transparent)
755 113 : rAreaFmt.mnPattern = (eApiStyle == cssd::FillStyle_NONE) ? EXC_PATT_NONE : EXC_PATT_SOLID;
756 :
757 : // return true to indicate complex fill (gradient, bitmap, solid transparency)
758 113 : return (eApiStyle != cssd::FillStyle_NONE) && ((eApiStyle != cssd::FillStyle_SOLID) || (nTransparency > 0));
759 : }
760 :
761 3 : void XclChPropSetHelper::ReadEscherProperties(
762 : XclChEscherFormat& rEscherFmt, XclChPicFormat& rPicFmt,
763 : XclChObjectTable& rGradientTable, XclChObjectTable& rHatchTable, XclChObjectTable& rBitmapTable,
764 : const ScfPropertySet& rPropSet, XclChPropertyMode ePropMode )
765 : {
766 : namespace cssd = ::com::sun::star::drawing;
767 : namespace cssa = ::com::sun::star::awt;
768 :
769 : // read style and transparency properties from property set
770 3 : cssd::FillStyle eApiStyle = cssd::FillStyle_NONE;
771 3 : Color aColor;
772 3 : sal_Int16 nTransparency = 0;
773 :
774 3 : ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
775 3 : rAreaHlp.ReadFromPropertySet( rPropSet );
776 3 : rAreaHlp >> eApiStyle >> aColor >> nTransparency;
777 :
778 3 : switch( eApiStyle )
779 : {
780 : case cssd::FillStyle_SOLID:
781 : {
782 : OSL_ENSURE( nTransparency > 0, "XclChPropSetHelper::ReadEscherProperties - unexpected solid area without transparency" );
783 3 : if( (0 < nTransparency) && (nTransparency <= 100) )
784 : {
785 : // convert to Escher properties
786 3 : sal_uInt32 nEscherColor = 0x02000000;
787 3 : ::insert_value( nEscherColor, aColor.GetBlue(), 16, 8 );
788 3 : ::insert_value( nEscherColor, aColor.GetGreen(), 8, 8 );
789 3 : ::insert_value( nEscherColor, aColor.GetRed(), 0, 8 );
790 3 : sal_uInt32 nEscherOpacity = static_cast< sal_uInt32 >( (100 - nTransparency) * 655.36 );
791 3 : rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
792 3 : rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillType, ESCHER_FillSolid );
793 3 : rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillColor, nEscherColor );
794 3 : rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillOpacity, nEscherOpacity );
795 3 : rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillBackColor, 0x02FFFFFF );
796 3 : rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fillBackOpacity, 0x00010000 );
797 3 : rEscherFmt.mxEscherSet->AddOpt( ESCHER_Prop_fNoFillHitTest, 0x001F001C );
798 : }
799 : }
800 3 : break;
801 : case cssd::FillStyle_GRADIENT:
802 : {
803 : // extract gradient from global gradient table
804 0 : OUString aGradientName;
805 0 : ScfPropSetHelper& rGradHlp = GetGradientHelper( ePropMode );
806 0 : rGradHlp.ReadFromPropertySet( rPropSet );
807 0 : rGradHlp >> eApiStyle >> aGradientName;
808 0 : cssa::Gradient aGradient;
809 0 : if( rGradientTable.GetObject( aGradientName ) >>= aGradient )
810 : {
811 : // convert to Escher properties
812 0 : rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
813 0 : rEscherFmt.mxEscherSet->CreateGradientProperties( aGradient );
814 0 : }
815 : }
816 0 : break;
817 : case cssd::FillStyle_HATCH:
818 : {
819 : // extract hatch from global hatch table
820 0 : OUString aHatchName;
821 : bool bFillBackground;
822 0 : ScfPropSetHelper& rHatchHlp = GetHatchHelper( ePropMode );
823 0 : rHatchHlp.ReadFromPropertySet( rPropSet );
824 0 : rHatchHlp >> eApiStyle >> aHatchName >> aColor >> bFillBackground;
825 0 : cssd::Hatch aHatch;
826 0 : if( rHatchTable.GetObject( aHatchName ) >>= aHatch )
827 : {
828 : // convert to Escher properties
829 0 : rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
830 0 : rEscherFmt.mxEscherSet->CreateEmbeddedHatchProperties( aHatch, aColor, bFillBackground );
831 0 : rPicFmt.mnBmpMode = EXC_CHPICFORMAT_STACK;
832 0 : }
833 : }
834 0 : break;
835 : case cssd::FillStyle_BITMAP:
836 : {
837 : // extract bitmap URL from global bitmap table
838 0 : OUString aBitmapName;
839 : cssd::BitmapMode eApiBmpMode;
840 0 : maBitmapHlp.ReadFromPropertySet( rPropSet );
841 0 : maBitmapHlp >> eApiStyle >> aBitmapName >> eApiBmpMode;
842 0 : OUString aBitmapUrl;
843 0 : if( rBitmapTable.GetObject( aBitmapName ) >>= aBitmapUrl )
844 : {
845 : // convert to Escher properties
846 0 : rEscherFmt.mxEscherSet.reset( new EscherPropertyContainer );
847 0 : rEscherFmt.mxEscherSet->CreateEmbeddedBitmapProperties( aBitmapUrl, eApiBmpMode );
848 0 : rPicFmt.mnBmpMode = (eApiBmpMode == cssd::BitmapMode_REPEAT) ?
849 0 : EXC_CHPICFORMAT_STACK : EXC_CHPICFORMAT_STRETCH;
850 0 : }
851 : }
852 0 : break;
853 : default:
854 : OSL_FAIL( "XclChPropSetHelper::ReadEscherProperties - unknown fill style" );
855 : }
856 3 : }
857 :
858 22 : void XclChPropSetHelper::ReadMarkerProperties(
859 : XclChMarkerFormat& rMarkerFmt, const ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx )
860 : {
861 : namespace cssc = ::com::sun::star::chart2;
862 : namespace cssa = ::com::sun::star::awt;
863 22 : cssc::Symbol aApiSymbol;
864 22 : if( rPropSet.GetProperty( aApiSymbol, EXC_CHPROP_SYMBOL ) )
865 : {
866 : // clear automatic flag
867 22 : ::set_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_AUTO, false );
868 :
869 : // symbol style
870 22 : switch( aApiSymbol.Style )
871 : {
872 : case cssc::SymbolStyle_NONE:
873 10 : rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_NOSYMBOL;
874 10 : break;
875 : case cssc::SymbolStyle_STANDARD:
876 10 : switch( aApiSymbol.StandardSymbol )
877 : {
878 4 : case 0: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_SQUARE; break; // square
879 2 : case 1: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DIAMOND; break; // diamond
880 0 : case 2: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STDDEV; break; // arrow down
881 0 : case 3: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_TRIANGLE; break; // arrow up
882 0 : case 4: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DOWJ; break; // arrow right, same as import
883 0 : case 5: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_PLUS; break; // arrow left
884 0 : case 6: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CROSS; break; // bow tie
885 0 : case 7: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR; break; // sand glass
886 2 : case 8: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CIRCLE; break; // circle new in LibO3.5
887 0 : case 9: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_DIAMOND; break; // star new in LibO3.5
888 0 : case 10: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_CROSS; break; // X new in LibO3.5
889 0 : case 11: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_PLUS; break; // plus new in LibO3.5
890 2 : case 12: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR; break; // asterisk new in LibO3.5
891 0 : case 13: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STDDEV; break; // horizontal bar new in LibO3.5
892 0 : case 14: rMarkerFmt.mnMarkerType = EXC_CHMARKERFORMAT_STAR; break; // vertical bar new in LibO3.5
893 0 : default: rMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx );
894 : }
895 10 : break;
896 : default:
897 2 : rMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx );
898 : }
899 22 : bool bHasFillColor = XclChartHelper::HasMarkerFillColor( rMarkerFmt.mnMarkerType );
900 22 : ::set_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_NOFILL, !bHasFillColor );
901 :
902 : // symbol size
903 22 : sal_Int32 nApiSize = (aApiSymbol.Size.Width + aApiSymbol.Size.Height + 1) / 2;
904 22 : rMarkerFmt.mnMarkerSize = XclTools::GetTwipsFromHmm( nApiSize );
905 :
906 : // symbol colors
907 22 : rMarkerFmt.maLineColor = ScfApiHelper::ConvertFromApiColor( aApiSymbol.BorderColor );
908 22 : rMarkerFmt.maFillColor = ScfApiHelper::ConvertFromApiColor( aApiSymbol.FillColor );
909 22 : }
910 22 : }
911 :
912 70 : sal_uInt16 XclChPropSetHelper::ReadRotationProperties( const ScfPropertySet& rPropSet, bool bSupportsStacked )
913 : {
914 : // chart2 handles rotation as double in the range [0,360)
915 70 : double fAngle = 0.0;
916 70 : rPropSet.GetProperty( fAngle, EXC_CHPROP_TEXTROTATION );
917 70 : bool bStacked = bSupportsStacked && rPropSet.GetBoolProperty( EXC_CHPROP_STACKCHARACTERS );
918 : return bStacked ? EXC_ROT_STACKED :
919 70 : XclTools::GetXclRotation( static_cast< sal_Int32 >( fAngle * 100.0 + 0.5 ) );
920 : }
921 :
922 : // write properties -----------------------------------------------------------
923 :
924 346 : void XclChPropSetHelper::WriteLineProperties(
925 : ScfPropertySet& rPropSet, XclChObjectTable& rDashTable,
926 : const XclChLineFormat& rLineFmt, XclChPropertyMode ePropMode )
927 : {
928 : namespace cssd = ::com::sun::star::drawing;
929 :
930 : // line width
931 346 : sal_Int32 nApiWidth = 0; // 0 is the width of a hair line
932 346 : switch( rLineFmt.mnWeight )
933 : {
934 50 : case EXC_CHLINEFORMAT_SINGLE: nApiWidth = 35; break;
935 3 : case EXC_CHLINEFORMAT_DOUBLE: nApiWidth = 70; break;
936 1 : case EXC_CHLINEFORMAT_TRIPLE: nApiWidth = 105; break;
937 : }
938 :
939 : // line style
940 346 : cssd::LineStyle eApiStyle = cssd::LineStyle_NONE;
941 346 : sal_Int16 nApiTrans = 0;
942 346 : sal_Int32 nDotLen = ::std::min< sal_Int32 >( rLineFmt.mnWeight + 105, 210 );
943 346 : cssd::LineDash aApiDash( cssd::DashStyle_RECT, 0, nDotLen, 0, 4 * nDotLen, nDotLen );
944 :
945 346 : switch( rLineFmt.mnPattern )
946 : {
947 : case EXC_CHLINEFORMAT_SOLID:
948 161 : eApiStyle = cssd::LineStyle_SOLID;
949 161 : break;
950 : case EXC_CHLINEFORMAT_DARKTRANS:
951 0 : eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 25;
952 0 : break;
953 : case EXC_CHLINEFORMAT_MEDTRANS:
954 0 : eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 50;
955 0 : break;
956 : case EXC_CHLINEFORMAT_LIGHTTRANS:
957 0 : eApiStyle = cssd::LineStyle_SOLID; nApiTrans = 75;
958 0 : break;
959 : case EXC_CHLINEFORMAT_DASH:
960 0 : eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = 1;
961 0 : break;
962 : case EXC_CHLINEFORMAT_DOT:
963 0 : eApiStyle = cssd::LineStyle_DASH; aApiDash.Dots = 1;
964 0 : break;
965 : case EXC_CHLINEFORMAT_DASHDOT:
966 0 : eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = aApiDash.Dots = 1;
967 0 : break;
968 : case EXC_CHLINEFORMAT_DASHDOTDOT:
969 0 : eApiStyle = cssd::LineStyle_DASH; aApiDash.Dashes = 1; aApiDash.Dots = 2;
970 0 : break;
971 : }
972 :
973 : // line color
974 346 : sal_Int32 nApiColor = ScfApiHelper::ConvertToApiColor( rLineFmt.maColor );
975 :
976 : // try to insert the dash style and receive its name
977 346 : Any aDashNameAny;
978 346 : if( eApiStyle == cssd::LineStyle_DASH )
979 : {
980 0 : OUString aDashName = rDashTable.InsertObject( ::com::sun::star::uno::makeAny( aApiDash ) );
981 0 : if( !aDashName.isEmpty() )
982 0 : aDashNameAny <<= aDashName;
983 : }
984 :
985 : // write the properties
986 346 : ScfPropSetHelper& rLineHlp = GetLineHelper( ePropMode );
987 346 : rLineHlp.InitializeWrite();
988 346 : rLineHlp << eApiStyle << nApiWidth << nApiColor << nApiTrans << aDashNameAny;
989 346 : rLineHlp.WriteToPropertySet( rPropSet );
990 346 : }
991 :
992 142 : void XclChPropSetHelper::WriteAreaProperties( ScfPropertySet& rPropSet,
993 : const XclChAreaFormat& rAreaFmt, XclChPropertyMode ePropMode )
994 : {
995 : namespace cssd = ::com::sun::star::drawing;
996 142 : cssd::FillStyle eFillStyle = cssd::FillStyle_NONE;
997 142 : Color aColor;
998 142 : sal_Int16 nTransparency = 0;
999 :
1000 : // fill color
1001 142 : if( rAreaFmt.mnPattern != EXC_PATT_NONE )
1002 : {
1003 62 : eFillStyle = cssd::FillStyle_SOLID;
1004 62 : aColor = XclTools::GetPatternColor( rAreaFmt.maPattColor, rAreaFmt.maBackColor, rAreaFmt.mnPattern );
1005 : }
1006 :
1007 : // write the properties
1008 142 : ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
1009 142 : rAreaHlp.InitializeWrite();
1010 142 : rAreaHlp << eFillStyle << aColor << nTransparency;
1011 142 : rAreaHlp.WriteToPropertySet( rPropSet );
1012 142 : }
1013 :
1014 150 : void XclChPropSetHelper::WriteEscherProperties( ScfPropertySet& rPropSet,
1015 : XclChObjectTable& rGradientTable, XclChObjectTable& /*rHatchTable*/, XclChObjectTable& rBitmapTable,
1016 : const XclChEscherFormat& rEscherFmt, const XclChPicFormat* pPicFmt,
1017 : sal_uInt32 nDffFillType, XclChPropertyMode ePropMode )
1018 : {
1019 150 : if( rEscherFmt.mxItemSet )
1020 : {
1021 150 : if( const XFillStyleItem* pStyleItem = static_cast< const XFillStyleItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLSTYLE, false ) ) )
1022 : {
1023 150 : switch( pStyleItem->GetValue() )
1024 : {
1025 : case drawing::FillStyle_SOLID:
1026 : // #i84812# Excel 2007 writes Escher properties for solid fill
1027 150 : if( const XFillColorItem* pColorItem = static_cast< const XFillColorItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLCOLOR, false ) ) )
1028 : {
1029 : namespace cssd = ::com::sun::star::drawing;
1030 : // get solid transparence too
1031 150 : const XFillTransparenceItem* pTranspItem = static_cast< const XFillTransparenceItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLTRANSPARENCE, false ) );
1032 150 : sal_uInt16 nTransp = pTranspItem ? pTranspItem->GetValue() : 0;
1033 150 : ScfPropSetHelper& rAreaHlp = GetAreaHelper( ePropMode );
1034 150 : rAreaHlp.InitializeWrite();
1035 150 : rAreaHlp << cssd::FillStyle_SOLID << pColorItem->GetColorValue() << static_cast< sal_Int16 >( nTransp );
1036 150 : rAreaHlp.WriteToPropertySet( rPropSet );
1037 : }
1038 150 : break;
1039 : case drawing::FillStyle_GRADIENT:
1040 0 : if( const XFillGradientItem* pGradItem = static_cast< const XFillGradientItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLGRADIENT, false ) ) )
1041 : {
1042 0 : Any aGradientAny;
1043 0 : if( pGradItem->QueryValue( aGradientAny, MID_FILLGRADIENT ) )
1044 : {
1045 0 : OUString aGradName = rGradientTable.InsertObject( aGradientAny );
1046 0 : if( !aGradName.isEmpty() )
1047 : {
1048 : namespace cssd = ::com::sun::star::drawing;
1049 0 : ScfPropSetHelper& rGradHlp = GetGradientHelper( ePropMode );
1050 0 : rGradHlp.InitializeWrite();
1051 0 : rGradHlp << cssd::FillStyle_GRADIENT << aGradName;
1052 0 : rGradHlp.WriteToPropertySet( rPropSet );
1053 0 : }
1054 0 : }
1055 : }
1056 0 : break;
1057 : case drawing::FillStyle_BITMAP:
1058 0 : if( const XFillBitmapItem* pBmpItem = static_cast< const XFillBitmapItem* >( rEscherFmt.mxItemSet->GetItem( XATTR_FILLBITMAP, false ) ) )
1059 : {
1060 0 : Any aBitmapAny;
1061 0 : if( pBmpItem->QueryValue( aBitmapAny, MID_GRAFURL ) )
1062 : {
1063 0 : OUString aBmpName = rBitmapTable.InsertObject( aBitmapAny );
1064 0 : if( !aBmpName.isEmpty() )
1065 : {
1066 : namespace cssd = ::com::sun::star::drawing;
1067 : /* #i71810# Caller decides whether to use a CHPICFORMAT record for bitmap mode.
1068 : If not passed, detect fill mode from the DFF property 'fill-type'. */
1069 0 : bool bStretch = pPicFmt ? (pPicFmt->mnBmpMode == EXC_CHPICFORMAT_STRETCH) : (nDffFillType == mso_fillPicture);
1070 0 : cssd::BitmapMode eApiBmpMode = bStretch ? cssd::BitmapMode_STRETCH : cssd::BitmapMode_REPEAT;
1071 0 : maBitmapHlp.InitializeWrite();
1072 0 : maBitmapHlp << cssd::FillStyle_BITMAP << aBmpName << eApiBmpMode;
1073 0 : maBitmapHlp.WriteToPropertySet( rPropSet );
1074 0 : }
1075 0 : }
1076 : }
1077 0 : break;
1078 : default:
1079 : OSL_FAIL( "XclChPropSetHelper::WriteEscherProperties - unknown fill mode" );
1080 : }
1081 : }
1082 : }
1083 150 : }
1084 :
1085 4 : void XclChPropSetHelper::WriteMarkerProperties(
1086 : ScfPropertySet& rPropSet, const XclChMarkerFormat& rMarkerFmt )
1087 : {
1088 : namespace cssc = ::com::sun::star::chart2;
1089 : namespace cssa = ::com::sun::star::awt;
1090 :
1091 : // symbol style
1092 4 : cssc::Symbol aApiSymbol;
1093 4 : aApiSymbol.Style = cssc::SymbolStyle_STANDARD;
1094 4 : switch( rMarkerFmt.mnMarkerType )
1095 : {
1096 0 : case EXC_CHMARKERFORMAT_NOSYMBOL: aApiSymbol.Style = cssc::SymbolStyle_NONE; break;
1097 0 : case EXC_CHMARKERFORMAT_SQUARE: aApiSymbol.StandardSymbol = 0; break; // square
1098 3 : case EXC_CHMARKERFORMAT_DIAMOND: aApiSymbol.StandardSymbol = 1; break; // diamond
1099 0 : case EXC_CHMARKERFORMAT_TRIANGLE: aApiSymbol.StandardSymbol = 3; break; // arrow up
1100 0 : case EXC_CHMARKERFORMAT_CROSS: aApiSymbol.StandardSymbol = 10; break; // X, legacy bow tie
1101 1 : case EXC_CHMARKERFORMAT_STAR: aApiSymbol.StandardSymbol = 12; break; // asterisk, legacy sand glass
1102 0 : case EXC_CHMARKERFORMAT_DOWJ: aApiSymbol.StandardSymbol = 4; break; // arrow right, same as export
1103 0 : case EXC_CHMARKERFORMAT_STDDEV: aApiSymbol.StandardSymbol = 13; break; // horizontal bar, legacy arrow down
1104 0 : case EXC_CHMARKERFORMAT_CIRCLE: aApiSymbol.StandardSymbol = 8; break; // circle, legacy arrow right
1105 0 : case EXC_CHMARKERFORMAT_PLUS: aApiSymbol.StandardSymbol = 11; break; // plus, legacy arrow left
1106 0 : default: break;
1107 : }
1108 :
1109 : // symbol size
1110 4 : sal_Int32 nApiSize = XclTools::GetHmmFromTwips( rMarkerFmt.mnMarkerSize );
1111 4 : aApiSymbol.Size = cssa::Size( nApiSize, nApiSize );
1112 :
1113 : // symbol colors
1114 4 : aApiSymbol.FillColor = ScfApiHelper::ConvertToApiColor( rMarkerFmt.maFillColor );
1115 4 : aApiSymbol.BorderColor = ::get_flag( rMarkerFmt.mnFlags, EXC_CHMARKERFORMAT_NOLINE ) ?
1116 4 : aApiSymbol.FillColor : ScfApiHelper::ConvertToApiColor( rMarkerFmt.maLineColor );
1117 :
1118 : // set the property
1119 4 : rPropSet.SetProperty( EXC_CHPROP_SYMBOL, aApiSymbol );
1120 4 : }
1121 :
1122 176 : void XclChPropSetHelper::WriteRotationProperties(
1123 : ScfPropertySet& rPropSet, sal_uInt16 nRotation, bool bSupportsStacked )
1124 : {
1125 176 : if( nRotation != EXC_CHART_AUTOROTATION )
1126 : {
1127 : // chart2 handles rotation as double in the range [0,360)
1128 88 : double fAngle = XclTools::GetScRotation( nRotation, 0 ) / 100.0;
1129 88 : rPropSet.SetProperty( EXC_CHPROP_TEXTROTATION, fAngle );
1130 88 : if( bSupportsStacked )
1131 29 : rPropSet.SetProperty( EXC_CHPROP_STACKCHARACTERS, nRotation == EXC_ROT_STACKED );
1132 : }
1133 176 : }
1134 :
1135 : // private --------------------------------------------------------------------
1136 :
1137 572 : ScfPropSetHelper& XclChPropSetHelper::GetLineHelper( XclChPropertyMode ePropMode )
1138 : {
1139 572 : switch( ePropMode )
1140 : {
1141 422 : case EXC_CHPROPMODE_COMMON: return maLineHlpCommon;
1142 26 : case EXC_CHPROPMODE_LINEARSERIES: return maLineHlpLinear;
1143 124 : case EXC_CHPROPMODE_FILLEDSERIES: return maLineHlpFilled;
1144 : default: OSL_FAIL( "XclChPropSetHelper::GetLineHelper - unknown property mode" );
1145 : }
1146 0 : return maLineHlpCommon;
1147 : }
1148 :
1149 408 : ScfPropSetHelper& XclChPropSetHelper::GetAreaHelper( XclChPropertyMode ePropMode )
1150 : {
1151 408 : switch( ePropMode )
1152 : {
1153 226 : case EXC_CHPROPMODE_COMMON: return maAreaHlpCommon;
1154 182 : case EXC_CHPROPMODE_FILLEDSERIES: return maAreaHlpFilled;
1155 : default: OSL_FAIL( "XclChPropSetHelper::GetAreaHelper - unknown property mode" );
1156 : }
1157 0 : return maAreaHlpCommon;
1158 : }
1159 :
1160 0 : ScfPropSetHelper& XclChPropSetHelper::GetGradientHelper( XclChPropertyMode ePropMode )
1161 : {
1162 0 : switch( ePropMode )
1163 : {
1164 0 : case EXC_CHPROPMODE_COMMON: return maGradHlpCommon;
1165 0 : case EXC_CHPROPMODE_FILLEDSERIES: return maGradHlpFilled;
1166 : default: OSL_FAIL( "XclChPropSetHelper::GetGradientHelper - unknown property mode" );
1167 : }
1168 0 : return maGradHlpCommon;
1169 : }
1170 :
1171 0 : ScfPropSetHelper& XclChPropSetHelper::GetHatchHelper( XclChPropertyMode ePropMode )
1172 : {
1173 0 : switch( ePropMode )
1174 : {
1175 0 : case EXC_CHPROPMODE_COMMON: return maHatchHlpCommon;
1176 0 : case EXC_CHPROPMODE_FILLEDSERIES: return maHatchHlpFilled;
1177 : default: OSL_FAIL( "XclChPropSetHelper::GetHatchHelper - unknown property mode" );
1178 : }
1179 0 : return maHatchHlpCommon;
1180 : }
1181 :
1182 : namespace {
1183 :
1184 : /* The following local functions implement getting the XShape interface of all
1185 : supported title objects (chart and axes). This needs some effort due to the
1186 : design of the old Chart1 API used to access these objects. */
1187 :
1188 : /** A code fragment that returns a shape object from the passed shape supplier
1189 : using the specified interface function. Checks a boolean property first. */
1190 : #define EXC_FRAGMENT_GETTITLESHAPE( shape_supplier, supplier_func, property_name ) \
1191 : ScfPropertySet aPropSet( shape_supplier ); \
1192 : if( shape_supplier.is() && aPropSet.GetBoolProperty( #property_name ) ) \
1193 : return shape_supplier->supplier_func(); \
1194 : return Reference< XShape >(); \
1195 :
1196 : /** Implements a function returning the drawing shape of an axis title, if
1197 : existing, using the specified API interface and its function. */
1198 : #define EXC_DEFINEFUNC_GETAXISTITLESHAPE( func_name, interface_type, supplier_func, property_name ) \
1199 : Reference< XShape > func_name( const Reference< cssc::XChartDocument >& rxChart1Doc ) \
1200 : { \
1201 : Reference< cssc::interface_type > xAxisSupp( rxChart1Doc->getDiagram(), UNO_QUERY ); \
1202 : EXC_FRAGMENT_GETTITLESHAPE( xAxisSupp, supplier_func, property_name ) \
1203 : }
1204 :
1205 : /** Returns the drawing shape of the main title, if existing. */
1206 20 : Reference< XShape > lclGetMainTitleShape( const Reference< cssc::XChartDocument >& rxChart1Doc )
1207 : {
1208 20 : EXC_FRAGMENT_GETTITLESHAPE( rxChart1Doc, getTitle, HasMainTitle )
1209 : }
1210 :
1211 0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetXAxisTitleShape, XAxisXSupplier, getXAxisTitle, HasXAxisTitle )
1212 0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetYAxisTitleShape, XAxisYSupplier, getYAxisTitle, HasYAxisTitle )
1213 0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetZAxisTitleShape, XAxisZSupplier, getZAxisTitle, HasZAxisTitle )
1214 0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetSecXAxisTitleShape, XSecondAxisTitleSupplier, getSecondXAxisTitle, HasSecondaryXAxisTitle )
1215 0 : EXC_DEFINEFUNC_GETAXISTITLESHAPE( lclGetSecYAxisTitleShape, XSecondAxisTitleSupplier, getSecondYAxisTitle, HasSecondaryYAxisTitle )
1216 :
1217 : #undef EXC_DEFINEFUNC_GETAXISTITLESHAPE
1218 : #undef EXC_IMPLEMENT_GETTITLESHAPE
1219 :
1220 : } // namespace
1221 :
1222 72 : XclChRootData::XclChRootData()
1223 72 : : mxTypeInfoProv(new XclChTypeInfoProvider)
1224 72 : , mxFmtInfoProv(new XclChFormatInfoProvider)
1225 : , mnBorderGapX(0)
1226 : , mnBorderGapY(0)
1227 : , mfUnitSizeX(0.0)
1228 216 : , mfUnitSizeY(0.0)
1229 : {
1230 : // remember some title shape getter functions
1231 72 : maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_TITLE ) ] = lclGetMainTitleShape;
1232 72 : maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_X ) ] = lclGetXAxisTitleShape;
1233 72 : maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_Y ) ] = lclGetYAxisTitleShape;
1234 72 : maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_PRIMARY, EXC_CHAXIS_Z ) ] = lclGetZAxisTitleShape;
1235 72 : maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_SECONDARY, EXC_CHAXIS_X ) ] = lclGetSecXAxisTitleShape;
1236 72 : maGetShapeFuncs[ XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, EXC_CHAXESSET_SECONDARY, EXC_CHAXIS_Y ) ] = lclGetSecYAxisTitleShape;
1237 72 : }
1238 :
1239 72 : XclChRootData::~XclChRootData()
1240 : {
1241 72 : }
1242 :
1243 72 : void XclChRootData::InitConversion( const XclRoot& rRoot, const Reference< XChartDocument >& rxChartDoc, const Rectangle& rChartRect )
1244 : {
1245 : // remember chart document reference and chart shape position/size
1246 : OSL_ENSURE( rxChartDoc.is(), "XclChRootData::InitConversion - missing chart document" );
1247 72 : mxChartDoc = rxChartDoc;
1248 72 : maChartRect = rChartRect;
1249 :
1250 : // Excel excludes a border of 5 pixels in each direction from chart area
1251 72 : mnBorderGapX = rRoot.GetHmmFromPixelX( 5.0 );
1252 72 : mnBorderGapY = rRoot.GetHmmFromPixelY( 5.0 );
1253 :
1254 : // size of a chart unit in 1/100 mm
1255 72 : mfUnitSizeX = ::std::max< double >( maChartRect.GetWidth() - 2 * mnBorderGapX, mnBorderGapX ) / EXC_CHART_TOTALUNITS;
1256 72 : mfUnitSizeY = ::std::max< double >( maChartRect.GetHeight() - 2 * mnBorderGapY, mnBorderGapY ) / EXC_CHART_TOTALUNITS;
1257 :
1258 : // create object tables
1259 72 : Reference< XMultiServiceFactory > xFactory( mxChartDoc, UNO_QUERY );
1260 : mxLineDashTable.reset( new XclChObjectTable(
1261 72 : xFactory, SERVICE_DRAWING_DASHTABLE, "Excel line dash " ) );
1262 : mxGradientTable.reset( new XclChObjectTable(
1263 72 : xFactory, SERVICE_DRAWING_GRADIENTTABLE, "Excel gradient " ) );
1264 : mxHatchTable.reset( new XclChObjectTable(
1265 72 : xFactory, SERVICE_DRAWING_HATCHTABLE, "Excel hatch " ) );
1266 : mxBitmapTable.reset( new XclChObjectTable(
1267 72 : xFactory, SERVICE_DRAWING_BITMAPTABLE, "Excel bitmap " ) );
1268 72 : }
1269 :
1270 72 : void XclChRootData::FinishConversion()
1271 : {
1272 : // forget formatting object tables
1273 72 : mxBitmapTable.reset();
1274 72 : mxHatchTable.reset();
1275 72 : mxGradientTable.reset();
1276 72 : mxLineDashTable.reset();
1277 : // forget chart document reference
1278 72 : mxChartDoc.clear();
1279 72 : }
1280 :
1281 20 : Reference< XShape > XclChRootData::GetTitleShape( const XclChTextKey& rTitleKey ) const
1282 : {
1283 20 : XclChGetShapeFuncMap::const_iterator aIt = maGetShapeFuncs.find( rTitleKey );
1284 : OSL_ENSURE( aIt != maGetShapeFuncs.end(), "XclChRootData::GetTitleShape - invalid title key" );
1285 20 : Reference< cssc::XChartDocument > xChart1Doc( mxChartDoc, UNO_QUERY );
1286 20 : Reference< XShape > xTitleShape;
1287 20 : if( xChart1Doc.is() && (aIt != maGetShapeFuncs.end()) )
1288 20 : xTitleShape = (aIt->second)( xChart1Doc );
1289 20 : return xTitleShape;
1290 30 : }
1291 :
1292 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|