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