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