xref: /aoo4110/main/sc/source/filter/excel/xichart.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "xichart.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <algorithm>
30*b1cdbd2cSJim Jagielski #include <memory>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/Direction3D.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/ProjectionMode.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/ShadeMode.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XShape.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartAxisArrangeOrderType.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartAxisLabelPosition.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartAxisMarkPosition.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartAxisPosition.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartLegendExpansion.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/TimeInterval.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/TimeUnit.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XChartDocument.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XDiagramPositioning.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartDocument.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDiagram.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartTypeContainer.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XTitled.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataProvider.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataReceiver.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataSink.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/AxisType.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/CurveStyle.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/DataPointGeometry3D.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/DataPointLabel.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/LegendPosition.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/StackingDirection.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/TickmarkStyle.hpp>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/RelativePosition.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/RelativeSize.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/DataLabelPlacement.hpp>
67*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ErrorBarStyle.hpp>
68*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/MissingValueTreatment.hpp>
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
71*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
72*b1cdbd2cSJim Jagielski #include <svx/unoapi.hxx>
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski #include "document.hxx"
75*b1cdbd2cSJim Jagielski #include "drwlayer.hxx"
76*b1cdbd2cSJim Jagielski #include "rangeutl.hxx"
77*b1cdbd2cSJim Jagielski #include "tokenarray.hxx"
78*b1cdbd2cSJim Jagielski #include "token.hxx"
79*b1cdbd2cSJim Jagielski #include "compiler.hxx"
80*b1cdbd2cSJim Jagielski #include "reftokenhelper.hxx"
81*b1cdbd2cSJim Jagielski #include "chartlis.hxx"
82*b1cdbd2cSJim Jagielski #include "fprogressbar.hxx"
83*b1cdbd2cSJim Jagielski #include "xltracer.hxx"
84*b1cdbd2cSJim Jagielski #include "xistream.hxx"
85*b1cdbd2cSJim Jagielski #include "xiformula.hxx"
86*b1cdbd2cSJim Jagielski #include "xistyle.hxx"
87*b1cdbd2cSJim Jagielski #include "xipage.hxx"
88*b1cdbd2cSJim Jagielski #include "xiview.hxx"
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski using ::rtl::OUString;
91*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
92*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any;
93*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
94*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
95*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY;
96*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY_THROW;
97*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_SET_THROW;
98*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception;
99*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::XPropertySet;
100*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XMultiServiceFactory;
101*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XModel;
102*b1cdbd2cSJim Jagielski using ::com::sun::star::util::XNumberFormatsSupplier;
103*b1cdbd2cSJim Jagielski using ::com::sun::star::drawing::XDrawPage;
104*b1cdbd2cSJim Jagielski using ::com::sun::star::drawing::XDrawPageSupplier;
105*b1cdbd2cSJim Jagielski using ::com::sun::star::drawing::XShape;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::IncrementData;
108*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::RelativePosition;
109*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::RelativeSize;
110*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::ScaleData;
111*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::SubIncrement;
112*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XAxis;
113*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XChartDocument;
114*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XChartType;
115*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XChartTypeContainer;
116*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XCoordinateSystem;
117*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XCoordinateSystemContainer;
118*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XDataSeries;
119*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XDataSeriesContainer;
120*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XDiagram;
121*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XFormattedString;
122*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XLegend;
123*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XRegressionCurve;
124*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XRegressionCurveContainer;
125*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XScaling;
126*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XTitle;
127*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XTitled;
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::data::XDataProvider;
130*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::data::XDataReceiver;
131*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::data::XDataSequence;
132*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::data::XDataSink;
133*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::data::XLabeledDataSequence;
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski using ::formula::FormulaToken;
136*b1cdbd2cSJim Jagielski using ::formula::StackVar;
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski namespace cssc = ::com::sun::star::chart;
139*b1cdbd2cSJim Jagielski namespace cssc2 = ::com::sun::star::chart2;
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski // Helpers ====================================================================
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski namespace {
144*b1cdbd2cSJim Jagielski 
operator >>(XclImpStream & rStrm,XclChRectangle & rRect)145*b1cdbd2cSJim Jagielski XclImpStream& operator>>( XclImpStream& rStrm, XclChRectangle& rRect )
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski     return rStrm >> rRect.mnX >> rRect.mnY >> rRect.mnWidth >> rRect.mnHeight;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
lclSetValueOrClearAny(Any & rAny,double fValue,bool bClear)150*b1cdbd2cSJim Jagielski inline void lclSetValueOrClearAny( Any& rAny, double fValue, bool bClear )
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski     if( bClear )
153*b1cdbd2cSJim Jagielski         rAny.clear();
154*b1cdbd2cSJim Jagielski     else
155*b1cdbd2cSJim Jagielski         rAny <<= fValue;
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
lclSetExpValueOrClearAny(Any & rAny,double fValue,bool bLogScale,bool bClear)158*b1cdbd2cSJim Jagielski void lclSetExpValueOrClearAny( Any& rAny, double fValue, bool bLogScale, bool bClear )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     if( !bClear && bLogScale )
161*b1cdbd2cSJim Jagielski         fValue = pow( 10.0, fValue );
162*b1cdbd2cSJim Jagielski     lclSetValueOrClearAny( rAny, fValue, bClear );
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski 
lclGetSerialDay(const XclImpRoot & rRoot,sal_uInt16 nValue,sal_uInt16 nTimeUnit)165*b1cdbd2cSJim Jagielski double lclGetSerialDay( const XclImpRoot& rRoot, sal_uInt16 nValue, sal_uInt16 nTimeUnit )
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski     switch( nTimeUnit )
168*b1cdbd2cSJim Jagielski     {
169*b1cdbd2cSJim Jagielski         case EXC_CHDATERANGE_DAYS:
170*b1cdbd2cSJim Jagielski             return nValue;
171*b1cdbd2cSJim Jagielski         case EXC_CHDATERANGE_MONTHS:
172*b1cdbd2cSJim Jagielski             return rRoot.GetDoubleFromDateTime( Date( 1, static_cast< sal_uInt16 >( 1 + nValue % 12 ), static_cast< sal_uInt16 >( rRoot.GetBaseYear() + nValue / 12 ) ) );
173*b1cdbd2cSJim Jagielski         case EXC_CHDATERANGE_YEARS:
174*b1cdbd2cSJim Jagielski             return rRoot.GetDoubleFromDateTime( Date( 1, 1, static_cast< sal_uInt16 >( rRoot.GetBaseYear() + nValue ) ) );
175*b1cdbd2cSJim Jagielski         default:
176*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, "lclGetSerialDay - unexpected time unit" );
177*b1cdbd2cSJim Jagielski     }
178*b1cdbd2cSJim Jagielski     return nValue;
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski 
lclConvertTimeValue(const XclImpRoot & rRoot,Any & rAny,sal_uInt16 nValue,bool bAuto,sal_uInt16 nTimeUnit)181*b1cdbd2cSJim Jagielski void lclConvertTimeValue( const XclImpRoot& rRoot, Any& rAny, sal_uInt16 nValue, bool bAuto, sal_uInt16 nTimeUnit )
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski     if( bAuto )
184*b1cdbd2cSJim Jagielski         rAny.clear();
185*b1cdbd2cSJim Jagielski     else
186*b1cdbd2cSJim Jagielski         rAny <<= lclGetSerialDay( rRoot, nValue, nTimeUnit );
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
lclGetApiTimeUnit(sal_uInt16 nTimeUnit)189*b1cdbd2cSJim Jagielski sal_Int32 lclGetApiTimeUnit( sal_uInt16 nTimeUnit )
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski     switch( nTimeUnit )
192*b1cdbd2cSJim Jagielski     {
193*b1cdbd2cSJim Jagielski         case EXC_CHDATERANGE_DAYS:      return cssc::TimeUnit::DAY;
194*b1cdbd2cSJim Jagielski         case EXC_CHDATERANGE_MONTHS:    return cssc::TimeUnit::MONTH;
195*b1cdbd2cSJim Jagielski         case EXC_CHDATERANGE_YEARS:     return cssc::TimeUnit::YEAR;
196*b1cdbd2cSJim Jagielski         default:                        OSL_ENSURE( false, "lclGetApiTimeUnit - unexpected time unit" );
197*b1cdbd2cSJim Jagielski     }
198*b1cdbd2cSJim Jagielski     return cssc::TimeUnit::DAY;
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
lclConvertTimeInterval(Any & rInterval,sal_uInt16 nValue,bool bAuto,sal_uInt16 nTimeUnit)201*b1cdbd2cSJim Jagielski void lclConvertTimeInterval( Any& rInterval, sal_uInt16 nValue, bool bAuto, sal_uInt16 nTimeUnit )
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski     if( bAuto || (nValue == 0) )
204*b1cdbd2cSJim Jagielski         rInterval.clear();
205*b1cdbd2cSJim Jagielski     else
206*b1cdbd2cSJim Jagielski         rInterval <<= cssc::TimeInterval( nValue, lclGetApiTimeUnit( nTimeUnit ) );
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski } // namespace
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski // Common =====================================================================
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski /** Stores global data needed in various classes of the Chart import filter. */
214*b1cdbd2cSJim Jagielski struct XclImpChRootData : public XclChRootData
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski     XclImpChChart&      mrChartData;            /// The chart data object.
217*b1cdbd2cSJim Jagielski 
XclImpChRootDataXclImpChRootData218*b1cdbd2cSJim Jagielski     inline explicit     XclImpChRootData( XclImpChChart& rChartData ) : mrChartData( rChartData ) {}
219*b1cdbd2cSJim Jagielski };
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
222*b1cdbd2cSJim Jagielski 
XclImpChRoot(const XclImpRoot & rRoot,XclImpChChart & rChartData)223*b1cdbd2cSJim Jagielski XclImpChRoot::XclImpChRoot( const XclImpRoot& rRoot, XclImpChChart& rChartData ) :
224*b1cdbd2cSJim Jagielski     XclImpRoot( rRoot ),
225*b1cdbd2cSJim Jagielski     mxChData( new XclImpChRootData( rChartData ) )
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
~XclImpChRoot()229*b1cdbd2cSJim Jagielski XclImpChRoot::~XclImpChRoot()
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
GetChartData() const233*b1cdbd2cSJim Jagielski XclImpChChart& XclImpChRoot::GetChartData() const
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski     return mxChData->mrChartData;
236*b1cdbd2cSJim Jagielski }
237*b1cdbd2cSJim Jagielski 
GetChartTypeInfo(XclChTypeId eType) const238*b1cdbd2cSJim Jagielski const XclChTypeInfo& XclImpChRoot::GetChartTypeInfo( XclChTypeId eType ) const
239*b1cdbd2cSJim Jagielski {
240*b1cdbd2cSJim Jagielski     return mxChData->mxTypeInfoProv->GetTypeInfo( eType );
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski 
GetChartTypeInfo(sal_uInt16 nRecId) const243*b1cdbd2cSJim Jagielski const XclChTypeInfo& XclImpChRoot::GetChartTypeInfo( sal_uInt16 nRecId ) const
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski     return mxChData->mxTypeInfoProv->GetTypeInfoFromRecId( nRecId );
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski 
GetFormatInfo(XclChObjectType eObjType) const248*b1cdbd2cSJim Jagielski const XclChFormatInfo& XclImpChRoot::GetFormatInfo( XclChObjectType eObjType ) const
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski     return mxChData->mxFmtInfoProv->GetFormatInfo( eObjType );
251*b1cdbd2cSJim Jagielski }
252*b1cdbd2cSJim Jagielski 
GetFontAutoColor() const253*b1cdbd2cSJim Jagielski Color XclImpChRoot::GetFontAutoColor() const
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski     return GetPalette().GetColor( EXC_COLOR_CHWINDOWTEXT );
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
GetSeriesLineAutoColor(sal_uInt16 nFormatIdx) const258*b1cdbd2cSJim Jagielski Color XclImpChRoot::GetSeriesLineAutoColor( sal_uInt16 nFormatIdx ) const
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski     return GetPalette().GetColor( XclChartHelper::GetSeriesLineAutoColorIdx( nFormatIdx ) );
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
GetSeriesFillAutoColor(sal_uInt16 nFormatIdx) const263*b1cdbd2cSJim Jagielski Color XclImpChRoot::GetSeriesFillAutoColor( sal_uInt16 nFormatIdx ) const
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski     const XclImpPalette& rPal = GetPalette();
266*b1cdbd2cSJim Jagielski     Color aColor = rPal.GetColor( XclChartHelper::GetSeriesFillAutoColorIdx( nFormatIdx ) );
267*b1cdbd2cSJim Jagielski     sal_uInt8 nTrans = XclChartHelper::GetSeriesFillAutoTransp( nFormatIdx );
268*b1cdbd2cSJim Jagielski     return ScfTools::GetMixedColor( aColor, rPal.GetColor( EXC_COLOR_CHWINDOWBACK ), nTrans );
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski 
InitConversion(Reference<XChartDocument> xChartDoc,const Rectangle & rChartRect) const271*b1cdbd2cSJim Jagielski void XclImpChRoot::InitConversion( Reference< XChartDocument > xChartDoc, const Rectangle& rChartRect ) const
272*b1cdbd2cSJim Jagielski {
273*b1cdbd2cSJim Jagielski     // create formatting object tables
274*b1cdbd2cSJim Jagielski     mxChData->InitConversion( GetRoot(), xChartDoc, rChartRect );
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski     // lock the model to suppress any internal updates
277*b1cdbd2cSJim Jagielski     Reference< XModel > xModel( xChartDoc, UNO_QUERY );
278*b1cdbd2cSJim Jagielski     if( xModel.is() )
279*b1cdbd2cSJim Jagielski         xModel->lockControllers();
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski     SfxObjectShell* pDocShell = GetDocShell();
282*b1cdbd2cSJim Jagielski     Reference< XDataReceiver > xDataRec( xChartDoc, UNO_QUERY );
283*b1cdbd2cSJim Jagielski     if( pDocShell && xDataRec.is() )
284*b1cdbd2cSJim Jagielski     {
285*b1cdbd2cSJim Jagielski         // create and register a data provider
286*b1cdbd2cSJim Jagielski         Reference< XDataProvider > xDataProv(
287*b1cdbd2cSJim Jagielski             ScfApiHelper::CreateInstance( pDocShell, SERVICE_CHART2_DATAPROVIDER ), UNO_QUERY );
288*b1cdbd2cSJim Jagielski         if( xDataProv.is() )
289*b1cdbd2cSJim Jagielski             xDataRec->attachDataProvider( xDataProv );
290*b1cdbd2cSJim Jagielski         // attach the number formatter
291*b1cdbd2cSJim Jagielski         Reference< XNumberFormatsSupplier > xNumFmtSupp( pDocShell->GetModel(), UNO_QUERY );
292*b1cdbd2cSJim Jagielski         if( xNumFmtSupp.is() )
293*b1cdbd2cSJim Jagielski             xDataRec->attachNumberFormatsSupplier( xNumFmtSupp );
294*b1cdbd2cSJim Jagielski     }
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski 
FinishConversion(XclImpDffConverter & rDffConv) const297*b1cdbd2cSJim Jagielski void XclImpChRoot::FinishConversion( XclImpDffConverter& rDffConv ) const
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski     rDffConv.Progress( EXC_CHART_PROGRESS_SIZE );
300*b1cdbd2cSJim Jagielski     // unlock the model
301*b1cdbd2cSJim Jagielski     Reference< XModel > xModel( mxChData->mxChartDoc, UNO_QUERY );
302*b1cdbd2cSJim Jagielski     if( xModel.is() )
303*b1cdbd2cSJim Jagielski         xModel->unlockControllers();
304*b1cdbd2cSJim Jagielski     rDffConv.Progress( EXC_CHART_PROGRESS_SIZE );
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     mxChData->FinishConversion();
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
GetDataProvider() const309*b1cdbd2cSJim Jagielski Reference< XDataProvider > XclImpChRoot::GetDataProvider() const
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski     return mxChData->mxChartDoc->getDataProvider();
312*b1cdbd2cSJim Jagielski }
313*b1cdbd2cSJim Jagielski 
GetTitleShape(const XclChTextKey & rTitleKey) const314*b1cdbd2cSJim Jagielski Reference< XShape > XclImpChRoot::GetTitleShape( const XclChTextKey& rTitleKey ) const
315*b1cdbd2cSJim Jagielski {
316*b1cdbd2cSJim Jagielski     return mxChData->GetTitleShape( rTitleKey );
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski 
CalcHmmFromChartX(sal_Int32 nPosX) const319*b1cdbd2cSJim Jagielski sal_Int32 XclImpChRoot::CalcHmmFromChartX( sal_Int32 nPosX ) const
320*b1cdbd2cSJim Jagielski {
321*b1cdbd2cSJim Jagielski     return static_cast< sal_Int32 >( mxChData->mfUnitSizeX * nPosX + mxChData->mnBorderGapX + 0.5 );
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
CalcHmmFromChartY(sal_Int32 nPosY) const324*b1cdbd2cSJim Jagielski sal_Int32 XclImpChRoot::CalcHmmFromChartY( sal_Int32 nPosY ) const
325*b1cdbd2cSJim Jagielski {
326*b1cdbd2cSJim Jagielski     return static_cast< sal_Int32 >( mxChData->mfUnitSizeY * nPosY + mxChData->mnBorderGapY + 0.5 );
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski 
CalcHmmFromChartRect(const XclChRectangle & rRect) const329*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Rectangle XclImpChRoot::CalcHmmFromChartRect( const XclChRectangle& rRect ) const
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski     return ::com::sun::star::awt::Rectangle(
332*b1cdbd2cSJim Jagielski         CalcHmmFromChartX( rRect.mnX ),
333*b1cdbd2cSJim Jagielski         CalcHmmFromChartY( rRect.mnY ),
334*b1cdbd2cSJim Jagielski         CalcHmmFromChartX( rRect.mnWidth ),
335*b1cdbd2cSJim Jagielski         CalcHmmFromChartY( rRect.mnHeight ) );
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski 
CalcRelativeFromHmmX(sal_Int32 nPosX) const338*b1cdbd2cSJim Jagielski double XclImpChRoot::CalcRelativeFromHmmX( sal_Int32 nPosX ) const
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski     return static_cast< double >( nPosX ) / mxChData->maChartRect.GetWidth();
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski 
CalcRelativeFromHmmY(sal_Int32 nPosY) const343*b1cdbd2cSJim Jagielski double XclImpChRoot::CalcRelativeFromHmmY( sal_Int32 nPosY ) const
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski     return static_cast< double >( nPosY ) / mxChData->maChartRect.GetHeight();
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski 
CalcRelativeFromChartX(sal_Int32 nPosX) const348*b1cdbd2cSJim Jagielski double XclImpChRoot::CalcRelativeFromChartX( sal_Int32 nPosX ) const
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski     return CalcRelativeFromHmmX( CalcHmmFromChartX( nPosX ) );
351*b1cdbd2cSJim Jagielski }
352*b1cdbd2cSJim Jagielski 
CalcRelativeFromChartY(sal_Int32 nPosY) const353*b1cdbd2cSJim Jagielski double XclImpChRoot::CalcRelativeFromChartY( sal_Int32 nPosY ) const
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski     return CalcRelativeFromHmmY( CalcHmmFromChartY( nPosY ) );
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
ConvertLineFormat(ScfPropertySet & rPropSet,const XclChLineFormat & rLineFmt,XclChPropertyMode ePropMode) const358*b1cdbd2cSJim Jagielski void XclImpChRoot::ConvertLineFormat( ScfPropertySet& rPropSet,
359*b1cdbd2cSJim Jagielski         const XclChLineFormat& rLineFmt, XclChPropertyMode ePropMode ) const
360*b1cdbd2cSJim Jagielski {
361*b1cdbd2cSJim Jagielski     GetChartPropSetHelper().WriteLineProperties(
362*b1cdbd2cSJim Jagielski         rPropSet, *mxChData->mxLineDashTable, rLineFmt, ePropMode );
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski 
ConvertAreaFormat(ScfPropertySet & rPropSet,const XclChAreaFormat & rAreaFmt,XclChPropertyMode ePropMode) const365*b1cdbd2cSJim Jagielski void XclImpChRoot::ConvertAreaFormat( ScfPropertySet& rPropSet,
366*b1cdbd2cSJim Jagielski         const XclChAreaFormat& rAreaFmt, XclChPropertyMode ePropMode ) const
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     GetChartPropSetHelper().WriteAreaProperties( rPropSet, rAreaFmt, ePropMode );
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
ConvertEscherFormat(ScfPropertySet & rPropSet,const XclChEscherFormat & rEscherFmt,const XclChPicFormat * pPicFmt,sal_uInt32 nDffFillType,XclChPropertyMode ePropMode) const371*b1cdbd2cSJim Jagielski void XclImpChRoot::ConvertEscherFormat( ScfPropertySet& rPropSet,
372*b1cdbd2cSJim Jagielski         const XclChEscherFormat& rEscherFmt, const XclChPicFormat* pPicFmt,
373*b1cdbd2cSJim Jagielski         sal_uInt32 nDffFillType, XclChPropertyMode ePropMode ) const
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski     GetChartPropSetHelper().WriteEscherProperties( rPropSet,
376*b1cdbd2cSJim Jagielski         *mxChData->mxGradientTable, *mxChData->mxHatchTable, *mxChData->mxBitmapTable,
377*b1cdbd2cSJim Jagielski         rEscherFmt, pPicFmt, nDffFillType, ePropMode );
378*b1cdbd2cSJim Jagielski }
379*b1cdbd2cSJim Jagielski 
ConvertFont(ScfPropertySet & rPropSet,sal_uInt16 nFontIdx,const Color * pFontColor) const380*b1cdbd2cSJim Jagielski void XclImpChRoot::ConvertFont( ScfPropertySet& rPropSet,
381*b1cdbd2cSJim Jagielski         sal_uInt16 nFontIdx, const Color* pFontColor ) const
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski     GetFontBuffer().WriteFontProperties( rPropSet, EXC_FONTPROPSET_CHART, nFontIdx, pFontColor );
384*b1cdbd2cSJim Jagielski }
385*b1cdbd2cSJim Jagielski 
ConvertPieRotation(ScfPropertySet & rPropSet,sal_uInt16 nAngle)386*b1cdbd2cSJim Jagielski void XclImpChRoot::ConvertPieRotation( ScfPropertySet& rPropSet, sal_uInt16 nAngle )
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski     sal_Int32 nApiRot = (450 - (nAngle % 360)) % 360;
389*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_STARTINGANGLE, nApiRot );
390*b1cdbd2cSJim Jagielski }
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
393*b1cdbd2cSJim Jagielski 
~XclImpChGroupBase()394*b1cdbd2cSJim Jagielski XclImpChGroupBase::~XclImpChGroupBase()
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski 
ReadRecordGroup(XclImpStream & rStrm)398*b1cdbd2cSJim Jagielski void XclImpChGroupBase::ReadRecordGroup( XclImpStream& rStrm )
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski     // read contents of the header record
401*b1cdbd2cSJim Jagielski     ReadHeaderRecord( rStrm );
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski     // only read sub records, if the next record is a CHBEGIN
404*b1cdbd2cSJim Jagielski     if( rStrm.GetNextRecId() == EXC_ID_CHBEGIN )
405*b1cdbd2cSJim Jagielski     {
406*b1cdbd2cSJim Jagielski         // read the CHBEGIN record, may be used for special initial processing
407*b1cdbd2cSJim Jagielski         rStrm.StartNextRecord();
408*b1cdbd2cSJim Jagielski         ReadSubRecord( rStrm );
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski         // read the nested records
411*b1cdbd2cSJim Jagielski         bool bLoop = true;
412*b1cdbd2cSJim Jagielski         while( bLoop && rStrm.StartNextRecord() )
413*b1cdbd2cSJim Jagielski         {
414*b1cdbd2cSJim Jagielski             sal_uInt16 nRecId = rStrm.GetRecId();
415*b1cdbd2cSJim Jagielski             bLoop = nRecId != EXC_ID_CHEND;
416*b1cdbd2cSJim Jagielski             // skip unsupported nested blocks
417*b1cdbd2cSJim Jagielski             if( nRecId == EXC_ID_CHBEGIN )
418*b1cdbd2cSJim Jagielski                 SkipBlock( rStrm );
419*b1cdbd2cSJim Jagielski             else
420*b1cdbd2cSJim Jagielski                 ReadSubRecord( rStrm );
421*b1cdbd2cSJim Jagielski         }
422*b1cdbd2cSJim Jagielski     }
423*b1cdbd2cSJim Jagielski     /*  Returns with current CHEND record or unchanged stream, if no record
424*b1cdbd2cSJim Jagielski         group present. In every case another call to StartNextRecord() will go
425*b1cdbd2cSJim Jagielski         to next record of interest. */
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
SkipBlock(XclImpStream & rStrm)428*b1cdbd2cSJim Jagielski void XclImpChGroupBase::SkipBlock( XclImpStream& rStrm )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski     DBG_ASSERT( rStrm.GetRecId() == EXC_ID_CHBEGIN, "XclImpChGroupBase::SkipBlock - no CHBEGIN record" );
431*b1cdbd2cSJim Jagielski     // do nothing if current record is not CHBEGIN
432*b1cdbd2cSJim Jagielski     bool bLoop = rStrm.GetRecId() == EXC_ID_CHBEGIN;
433*b1cdbd2cSJim Jagielski     while( bLoop && rStrm.StartNextRecord() )
434*b1cdbd2cSJim Jagielski     {
435*b1cdbd2cSJim Jagielski         sal_uInt16 nRecId = rStrm.GetRecId();
436*b1cdbd2cSJim Jagielski         bLoop = nRecId != EXC_ID_CHEND;
437*b1cdbd2cSJim Jagielski         // skip nested record groups
438*b1cdbd2cSJim Jagielski         if( nRecId == EXC_ID_CHBEGIN )
439*b1cdbd2cSJim Jagielski             SkipBlock( rStrm );
440*b1cdbd2cSJim Jagielski     }
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski // Frame formatting ===========================================================
444*b1cdbd2cSJim Jagielski 
ReadChFramePos(XclImpStream & rStrm)445*b1cdbd2cSJim Jagielski void XclImpChFramePos::ReadChFramePos( XclImpStream& rStrm )
446*b1cdbd2cSJim Jagielski {
447*b1cdbd2cSJim Jagielski     rStrm >> maData.mnTLMode >> maData.mnBRMode;
448*b1cdbd2cSJim Jagielski     /*  According to the spec, the upper 16 bits of all members in the
449*b1cdbd2cSJim Jagielski         rectangle are unused and may contain garbage. */
450*b1cdbd2cSJim Jagielski     maData.maRect.mnX = rStrm.ReadInt16(); rStrm.Ignore( 2 );
451*b1cdbd2cSJim Jagielski     maData.maRect.mnY = rStrm.ReadInt16(); rStrm.Ignore( 2 );
452*b1cdbd2cSJim Jagielski     maData.maRect.mnWidth = rStrm.ReadInt16(); rStrm.Ignore( 2 );
453*b1cdbd2cSJim Jagielski     maData.maRect.mnHeight = rStrm.ReadInt16(); rStrm.Ignore( 2 );
454*b1cdbd2cSJim Jagielski }
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
457*b1cdbd2cSJim Jagielski 
ReadChLineFormat(XclImpStream & rStrm)458*b1cdbd2cSJim Jagielski void XclImpChLineFormat::ReadChLineFormat( XclImpStream& rStrm )
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski     rStrm >> maData.maColor >> maData.mnPattern >> maData.mnWeight >> maData.mnFlags;
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski     const XclImpRoot& rRoot = rStrm.GetRoot();
463*b1cdbd2cSJim Jagielski     if( rRoot.GetBiff() == EXC_BIFF8 )
464*b1cdbd2cSJim Jagielski         // #116397# BIFF8: index into palette used instead of RGB data
465*b1cdbd2cSJim Jagielski         maData.maColor = rRoot.GetPalette().GetColor( rStrm.ReaduInt16() );
466*b1cdbd2cSJim Jagielski }
467*b1cdbd2cSJim Jagielski 
Convert(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,XclChObjectType eObjType,sal_uInt16 nFormatIdx) const468*b1cdbd2cSJim Jagielski void XclImpChLineFormat::Convert( const XclImpChRoot& rRoot,
469*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, XclChObjectType eObjType, sal_uInt16 nFormatIdx ) const
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski     const XclChFormatInfo& rFmtInfo = rRoot.GetFormatInfo( eObjType );
472*b1cdbd2cSJim Jagielski     if( IsAuto() )
473*b1cdbd2cSJim Jagielski     {
474*b1cdbd2cSJim Jagielski         XclChLineFormat aLineFmt;
475*b1cdbd2cSJim Jagielski         aLineFmt.maColor = (eObjType == EXC_CHOBJTYPE_LINEARSERIES) ?
476*b1cdbd2cSJim Jagielski             rRoot.GetSeriesLineAutoColor( nFormatIdx ) :
477*b1cdbd2cSJim Jagielski             rRoot.GetPalette().GetColor( rFmtInfo.mnAutoLineColorIdx );
478*b1cdbd2cSJim Jagielski         aLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
479*b1cdbd2cSJim Jagielski         aLineFmt.mnWeight = rFmtInfo.mnAutoLineWeight;
480*b1cdbd2cSJim Jagielski         rRoot.ConvertLineFormat( rPropSet, aLineFmt, rFmtInfo.mePropMode );
481*b1cdbd2cSJim Jagielski     }
482*b1cdbd2cSJim Jagielski     else
483*b1cdbd2cSJim Jagielski     {
484*b1cdbd2cSJim Jagielski         rRoot.ConvertLineFormat( rPropSet, maData, rFmtInfo.mePropMode );
485*b1cdbd2cSJim Jagielski     }
486*b1cdbd2cSJim Jagielski }
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
489*b1cdbd2cSJim Jagielski 
ReadChAreaFormat(XclImpStream & rStrm)490*b1cdbd2cSJim Jagielski void XclImpChAreaFormat::ReadChAreaFormat( XclImpStream& rStrm )
491*b1cdbd2cSJim Jagielski {
492*b1cdbd2cSJim Jagielski     rStrm >> maData.maPattColor >> maData.maBackColor >> maData.mnPattern >> maData.mnFlags;
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski     const XclImpRoot& rRoot = rStrm.GetRoot();
495*b1cdbd2cSJim Jagielski     if( rRoot.GetBiff() == EXC_BIFF8 )
496*b1cdbd2cSJim Jagielski     {
497*b1cdbd2cSJim Jagielski         // #116397# BIFF8: index into palette used instead of RGB data
498*b1cdbd2cSJim Jagielski         const XclImpPalette& rPal = rRoot.GetPalette();
499*b1cdbd2cSJim Jagielski         maData.maPattColor = rPal.GetColor( rStrm.ReaduInt16() );
500*b1cdbd2cSJim Jagielski         maData.maBackColor = rPal.GetColor( rStrm.ReaduInt16());
501*b1cdbd2cSJim Jagielski     }
502*b1cdbd2cSJim Jagielski }
503*b1cdbd2cSJim Jagielski 
Convert(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,XclChObjectType eObjType,sal_uInt16 nFormatIdx) const504*b1cdbd2cSJim Jagielski void XclImpChAreaFormat::Convert( const XclImpChRoot& rRoot,
505*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, XclChObjectType eObjType, sal_uInt16 nFormatIdx ) const
506*b1cdbd2cSJim Jagielski {
507*b1cdbd2cSJim Jagielski     const XclChFormatInfo& rFmtInfo = rRoot.GetFormatInfo( eObjType );
508*b1cdbd2cSJim Jagielski     if( IsAuto() )
509*b1cdbd2cSJim Jagielski     {
510*b1cdbd2cSJim Jagielski         XclChAreaFormat aAreaFmt;
511*b1cdbd2cSJim Jagielski         aAreaFmt.maPattColor = (eObjType == EXC_CHOBJTYPE_FILLEDSERIES) ?
512*b1cdbd2cSJim Jagielski             rRoot.GetSeriesFillAutoColor( nFormatIdx ) :
513*b1cdbd2cSJim Jagielski             rRoot.GetPalette().GetColor( rFmtInfo.mnAutoPattColorIdx );
514*b1cdbd2cSJim Jagielski         aAreaFmt.mnPattern = EXC_PATT_SOLID;
515*b1cdbd2cSJim Jagielski         rRoot.ConvertAreaFormat( rPropSet, aAreaFmt, rFmtInfo.mePropMode );
516*b1cdbd2cSJim Jagielski     }
517*b1cdbd2cSJim Jagielski     else
518*b1cdbd2cSJim Jagielski     {
519*b1cdbd2cSJim Jagielski         rRoot.ConvertAreaFormat( rPropSet, maData, rFmtInfo.mePropMode );
520*b1cdbd2cSJim Jagielski     }
521*b1cdbd2cSJim Jagielski }
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
524*b1cdbd2cSJim Jagielski 
XclImpChEscherFormat(const XclImpRoot & rRoot)525*b1cdbd2cSJim Jagielski XclImpChEscherFormat::XclImpChEscherFormat( const XclImpRoot& rRoot ) :
526*b1cdbd2cSJim Jagielski     mnDffFillType( mso_fillSolid )
527*b1cdbd2cSJim Jagielski {
528*b1cdbd2cSJim Jagielski     maData.mxItemSet.reset(
529*b1cdbd2cSJim Jagielski         new SfxItemSet( rRoot.GetDoc().GetDrawLayer()->GetItemPool() ) );
530*b1cdbd2cSJim Jagielski }
531*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)532*b1cdbd2cSJim Jagielski void XclImpChEscherFormat::ReadHeaderRecord( XclImpStream& rStrm )
533*b1cdbd2cSJim Jagielski {
534*b1cdbd2cSJim Jagielski     // read from stream - CHESCHERFORMAT uses own ID for record continuation
535*b1cdbd2cSJim Jagielski     XclImpDffPropSet aPropSet( rStrm.GetRoot() );
536*b1cdbd2cSJim Jagielski     rStrm.ResetRecord( true, rStrm.GetRecId() );
537*b1cdbd2cSJim Jagielski     rStrm >> aPropSet;
538*b1cdbd2cSJim Jagielski     // get the data
539*b1cdbd2cSJim Jagielski     aPropSet.FillToItemSet( *maData.mxItemSet );
540*b1cdbd2cSJim Jagielski     // get fill type from DFF property set
541*b1cdbd2cSJim Jagielski     mnDffFillType = aPropSet.GetPropertyValue( DFF_Prop_fillType, mso_fillSolid );
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)544*b1cdbd2cSJim Jagielski void XclImpChEscherFormat::ReadSubRecord( XclImpStream& rStrm )
545*b1cdbd2cSJim Jagielski {
546*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
547*b1cdbd2cSJim Jagielski     {
548*b1cdbd2cSJim Jagielski         case EXC_ID_CHPICFORMAT:
549*b1cdbd2cSJim Jagielski             rStrm >> maPicFmt.mnBmpMode;
550*b1cdbd2cSJim Jagielski             rStrm.Ignore( 2 );
551*b1cdbd2cSJim Jagielski             rStrm >> maPicFmt.mnFlags >> maPicFmt.mfScale;
552*b1cdbd2cSJim Jagielski         break;
553*b1cdbd2cSJim Jagielski     }
554*b1cdbd2cSJim Jagielski }
555*b1cdbd2cSJim Jagielski 
Convert(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,XclChObjectType eObjType,bool bUsePicFmt) const556*b1cdbd2cSJim Jagielski void XclImpChEscherFormat::Convert( const XclImpChRoot& rRoot,
557*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, XclChObjectType eObjType, bool bUsePicFmt ) const
558*b1cdbd2cSJim Jagielski {
559*b1cdbd2cSJim Jagielski     const XclChFormatInfo& rFmtInfo = rRoot.GetFormatInfo( eObjType );
560*b1cdbd2cSJim Jagielski     rRoot.ConvertEscherFormat( rPropSet, maData, bUsePicFmt ? &maPicFmt : 0, mnDffFillType, rFmtInfo.mePropMode );
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
564*b1cdbd2cSJim Jagielski 
XclImpChFrameBase(const XclChFormatInfo & rFmtInfo)565*b1cdbd2cSJim Jagielski XclImpChFrameBase::XclImpChFrameBase( const XclChFormatInfo& rFmtInfo )
566*b1cdbd2cSJim Jagielski {
567*b1cdbd2cSJim Jagielski     if( rFmtInfo.mbCreateDefFrame ) switch( rFmtInfo.meDefFrameType )
568*b1cdbd2cSJim Jagielski     {
569*b1cdbd2cSJim Jagielski         case EXC_CHFRAMETYPE_AUTO:
570*b1cdbd2cSJim Jagielski             mxLineFmt.reset( new XclImpChLineFormat );
571*b1cdbd2cSJim Jagielski             if( rFmtInfo.mbIsFrame )
572*b1cdbd2cSJim Jagielski                 mxAreaFmt.reset( new XclImpChAreaFormat );
573*b1cdbd2cSJim Jagielski         break;
574*b1cdbd2cSJim Jagielski         case EXC_CHFRAMETYPE_INVISIBLE:
575*b1cdbd2cSJim Jagielski         {
576*b1cdbd2cSJim Jagielski             XclChLineFormat aLineFmt;
577*b1cdbd2cSJim Jagielski             ::set_flag( aLineFmt.mnFlags, EXC_CHLINEFORMAT_AUTO, false );
578*b1cdbd2cSJim Jagielski             aLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE;
579*b1cdbd2cSJim Jagielski             mxLineFmt.reset( new XclImpChLineFormat( aLineFmt ) );
580*b1cdbd2cSJim Jagielski             if( rFmtInfo.mbIsFrame )
581*b1cdbd2cSJim Jagielski             {
582*b1cdbd2cSJim Jagielski                 XclChAreaFormat aAreaFmt;
583*b1cdbd2cSJim Jagielski                 ::set_flag( aAreaFmt.mnFlags, EXC_CHAREAFORMAT_AUTO, false );
584*b1cdbd2cSJim Jagielski                 aAreaFmt.mnPattern = EXC_PATT_NONE;
585*b1cdbd2cSJim Jagielski                 mxAreaFmt.reset( new XclImpChAreaFormat( aAreaFmt ) );
586*b1cdbd2cSJim Jagielski             }
587*b1cdbd2cSJim Jagielski         }
588*b1cdbd2cSJim Jagielski         break;
589*b1cdbd2cSJim Jagielski         default:
590*b1cdbd2cSJim Jagielski             DBG_ERRORFILE( "XclImpChFrameBase::XclImpChFrameBase - unknown frame type" );
591*b1cdbd2cSJim Jagielski     }
592*b1cdbd2cSJim Jagielski }
593*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)594*b1cdbd2cSJim Jagielski void XclImpChFrameBase::ReadSubRecord( XclImpStream& rStrm )
595*b1cdbd2cSJim Jagielski {
596*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
597*b1cdbd2cSJim Jagielski     {
598*b1cdbd2cSJim Jagielski         case EXC_ID_CHLINEFORMAT:
599*b1cdbd2cSJim Jagielski             mxLineFmt.reset( new XclImpChLineFormat );
600*b1cdbd2cSJim Jagielski             mxLineFmt->ReadChLineFormat( rStrm );
601*b1cdbd2cSJim Jagielski         break;
602*b1cdbd2cSJim Jagielski         case EXC_ID_CHAREAFORMAT:
603*b1cdbd2cSJim Jagielski             mxAreaFmt.reset( new XclImpChAreaFormat );
604*b1cdbd2cSJim Jagielski             mxAreaFmt->ReadChAreaFormat( rStrm );
605*b1cdbd2cSJim Jagielski         break;
606*b1cdbd2cSJim Jagielski         case EXC_ID_CHESCHERFORMAT:
607*b1cdbd2cSJim Jagielski             mxEscherFmt.reset( new XclImpChEscherFormat( rStrm.GetRoot() ) );
608*b1cdbd2cSJim Jagielski             mxEscherFmt->ReadRecordGroup( rStrm );
609*b1cdbd2cSJim Jagielski         break;
610*b1cdbd2cSJim Jagielski     }
611*b1cdbd2cSJim Jagielski }
612*b1cdbd2cSJim Jagielski 
ConvertLineBase(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,XclChObjectType eObjType,sal_uInt16 nFormatIdx) const613*b1cdbd2cSJim Jagielski void XclImpChFrameBase::ConvertLineBase( const XclImpChRoot& rRoot,
614*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, XclChObjectType eObjType, sal_uInt16 nFormatIdx ) const
615*b1cdbd2cSJim Jagielski {
616*b1cdbd2cSJim Jagielski     if( mxLineFmt.is() )
617*b1cdbd2cSJim Jagielski         mxLineFmt->Convert( rRoot, rPropSet, eObjType, nFormatIdx );
618*b1cdbd2cSJim Jagielski }
619*b1cdbd2cSJim Jagielski 
ConvertAreaBase(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,XclChObjectType eObjType,sal_uInt16 nFormatIdx,bool bUsePicFmt) const620*b1cdbd2cSJim Jagielski void XclImpChFrameBase::ConvertAreaBase( const XclImpChRoot& rRoot,
621*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, XclChObjectType eObjType, sal_uInt16 nFormatIdx, bool bUsePicFmt ) const
622*b1cdbd2cSJim Jagielski {
623*b1cdbd2cSJim Jagielski     if( rRoot.GetFormatInfo( eObjType ).mbIsFrame )
624*b1cdbd2cSJim Jagielski     {
625*b1cdbd2cSJim Jagielski         // CHESCHERFORMAT overrides CHAREAFORMAT (even if it is auto)
626*b1cdbd2cSJim Jagielski         if( mxEscherFmt.is() )
627*b1cdbd2cSJim Jagielski             mxEscherFmt->Convert( rRoot, rPropSet, eObjType, bUsePicFmt );
628*b1cdbd2cSJim Jagielski         else if( mxAreaFmt.is() )
629*b1cdbd2cSJim Jagielski             mxAreaFmt->Convert( rRoot, rPropSet, eObjType, nFormatIdx );
630*b1cdbd2cSJim Jagielski     }
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski 
ConvertFrameBase(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,XclChObjectType eObjType,sal_uInt16 nFormatIdx,bool bUsePicFmt) const633*b1cdbd2cSJim Jagielski void XclImpChFrameBase::ConvertFrameBase( const XclImpChRoot& rRoot,
634*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, XclChObjectType eObjType, sal_uInt16 nFormatIdx, bool bUsePicFmt ) const
635*b1cdbd2cSJim Jagielski {
636*b1cdbd2cSJim Jagielski     ConvertLineBase( rRoot, rPropSet, eObjType, nFormatIdx );
637*b1cdbd2cSJim Jagielski     ConvertAreaBase( rRoot, rPropSet, eObjType, nFormatIdx, bUsePicFmt );
638*b1cdbd2cSJim Jagielski }
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
641*b1cdbd2cSJim Jagielski 
XclImpChFrame(const XclImpChRoot & rRoot,XclChObjectType eObjType)642*b1cdbd2cSJim Jagielski XclImpChFrame::XclImpChFrame( const XclImpChRoot& rRoot, XclChObjectType eObjType ) :
643*b1cdbd2cSJim Jagielski     XclImpChFrameBase( rRoot.GetFormatInfo( eObjType ) ),
644*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot ),
645*b1cdbd2cSJim Jagielski     meObjType( eObjType )
646*b1cdbd2cSJim Jagielski {
647*b1cdbd2cSJim Jagielski }
648*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)649*b1cdbd2cSJim Jagielski void XclImpChFrame::ReadHeaderRecord( XclImpStream& rStrm )
650*b1cdbd2cSJim Jagielski {
651*b1cdbd2cSJim Jagielski     rStrm >> maData.mnFormat >> maData.mnFlags;
652*b1cdbd2cSJim Jagielski }
653*b1cdbd2cSJim Jagielski 
UpdateObjFrame(const XclObjLineData & rLineData,const XclObjFillData & rFillData)654*b1cdbd2cSJim Jagielski void XclImpChFrame::UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData )
655*b1cdbd2cSJim Jagielski {
656*b1cdbd2cSJim Jagielski     const XclImpPalette& rPal = GetPalette();
657*b1cdbd2cSJim Jagielski 
658*b1cdbd2cSJim Jagielski     if( rLineData.IsVisible() && (!mxLineFmt || !mxLineFmt->HasLine()) )
659*b1cdbd2cSJim Jagielski     {
660*b1cdbd2cSJim Jagielski         // line formatting
661*b1cdbd2cSJim Jagielski         XclChLineFormat aLineFmt;
662*b1cdbd2cSJim Jagielski         aLineFmt.maColor = rPal.GetColor( rLineData.mnColorIdx );
663*b1cdbd2cSJim Jagielski         switch( rLineData.mnStyle )
664*b1cdbd2cSJim Jagielski         {
665*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_SOLID:        aLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;        break;
666*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_DASH:         aLineFmt.mnPattern = EXC_CHLINEFORMAT_DASH;         break;
667*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_DOT:          aLineFmt.mnPattern = EXC_CHLINEFORMAT_DOT;          break;
668*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_DASHDOT:      aLineFmt.mnPattern = EXC_CHLINEFORMAT_DASHDOT;      break;
669*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_DASHDOTDOT:   aLineFmt.mnPattern = EXC_CHLINEFORMAT_DASHDOTDOT;   break;
670*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_MEDTRANS:     aLineFmt.mnPattern = EXC_CHLINEFORMAT_MEDTRANS;     break;
671*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_DARKTRANS:    aLineFmt.mnPattern = EXC_CHLINEFORMAT_DARKTRANS;    break;
672*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_LIGHTTRANS:   aLineFmt.mnPattern = EXC_CHLINEFORMAT_LIGHTTRANS;   break;
673*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_NONE:         aLineFmt.mnPattern = EXC_CHLINEFORMAT_NONE;         break;
674*b1cdbd2cSJim Jagielski             default:                        aLineFmt.mnPattern = EXC_CHLINEFORMAT_SOLID;
675*b1cdbd2cSJim Jagielski         }
676*b1cdbd2cSJim Jagielski         switch( rLineData.mnWidth )
677*b1cdbd2cSJim Jagielski         {
678*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_HAIR:     aLineFmt.mnWeight = EXC_CHLINEFORMAT_HAIR;      break;
679*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_THIN:     aLineFmt.mnWeight = EXC_CHLINEFORMAT_SINGLE;    break;
680*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_MEDIUM:   aLineFmt.mnWeight = EXC_CHLINEFORMAT_DOUBLE;    break;
681*b1cdbd2cSJim Jagielski             case EXC_OBJ_LINE_THICK:    aLineFmt.mnWeight = EXC_CHLINEFORMAT_TRIPLE;    break;
682*b1cdbd2cSJim Jagielski             default:                    aLineFmt.mnWeight = EXC_CHLINEFORMAT_HAIR;
683*b1cdbd2cSJim Jagielski         }
684*b1cdbd2cSJim Jagielski         ::set_flag( aLineFmt.mnFlags, EXC_CHLINEFORMAT_AUTO, rLineData.IsAuto() );
685*b1cdbd2cSJim Jagielski         mxLineFmt.reset( new XclImpChLineFormat( aLineFmt ) );
686*b1cdbd2cSJim Jagielski     }
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski     if( rFillData.IsFilled() && (!mxAreaFmt || !mxAreaFmt->HasArea()) && !mxEscherFmt )
689*b1cdbd2cSJim Jagielski     {
690*b1cdbd2cSJim Jagielski         // area formatting
691*b1cdbd2cSJim Jagielski         XclChAreaFormat aAreaFmt;
692*b1cdbd2cSJim Jagielski         aAreaFmt.maPattColor = rPal.GetColor( rFillData.mnPattColorIdx );
693*b1cdbd2cSJim Jagielski         aAreaFmt.maBackColor = rPal.GetColor( rFillData.mnBackColorIdx );
694*b1cdbd2cSJim Jagielski         aAreaFmt.mnPattern = rFillData.mnPattern;
695*b1cdbd2cSJim Jagielski         ::set_flag( aAreaFmt.mnFlags, EXC_CHAREAFORMAT_AUTO, rFillData.IsAuto() );
696*b1cdbd2cSJim Jagielski         mxAreaFmt.reset( new XclImpChAreaFormat( aAreaFmt ) );
697*b1cdbd2cSJim Jagielski     }
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski 
Convert(ScfPropertySet & rPropSet,bool bUsePicFmt) const700*b1cdbd2cSJim Jagielski void XclImpChFrame::Convert( ScfPropertySet& rPropSet, bool bUsePicFmt ) const
701*b1cdbd2cSJim Jagielski {
702*b1cdbd2cSJim Jagielski     ConvertFrameBase( GetChRoot(), rPropSet, meObjType, EXC_CHDATAFORMAT_UNKNOWN, bUsePicFmt );
703*b1cdbd2cSJim Jagielski }
704*b1cdbd2cSJim Jagielski 
705*b1cdbd2cSJim Jagielski // Source links ===============================================================
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski namespace {
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski /** Creates a labeled data sequence object, adds link for series title if present. */
lclCreateLabeledDataSequence(XclImpChSourceLinkRef xValueLink,const OUString & rValueRole,const XclImpChSourceLink * pTitleLink=0)710*b1cdbd2cSJim Jagielski Reference< XLabeledDataSequence > lclCreateLabeledDataSequence(
711*b1cdbd2cSJim Jagielski         XclImpChSourceLinkRef xValueLink, const OUString& rValueRole,
712*b1cdbd2cSJim Jagielski         const XclImpChSourceLink* pTitleLink = 0 )
713*b1cdbd2cSJim Jagielski {
714*b1cdbd2cSJim Jagielski     // create data sequence for values and title
715*b1cdbd2cSJim Jagielski     Reference< XDataSequence > xValueSeq;
716*b1cdbd2cSJim Jagielski     if( xValueLink.is() )
717*b1cdbd2cSJim Jagielski         xValueSeq = xValueLink->CreateDataSequence( rValueRole );
718*b1cdbd2cSJim Jagielski     Reference< XDataSequence > xTitleSeq;
719*b1cdbd2cSJim Jagielski     if( pTitleLink )
720*b1cdbd2cSJim Jagielski         xTitleSeq = pTitleLink->CreateDataSequence( EXC_CHPROP_ROLE_LABEL );
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski     // create the labeled data sequence, if values or title are present
723*b1cdbd2cSJim Jagielski     Reference< XLabeledDataSequence > xLabeledSeq;
724*b1cdbd2cSJim Jagielski     if( xValueSeq.is() || xTitleSeq.is() )
725*b1cdbd2cSJim Jagielski         xLabeledSeq.set( ScfApiHelper::CreateInstance( SERVICE_CHART2_LABELEDDATASEQ ), UNO_QUERY );
726*b1cdbd2cSJim Jagielski     if( xLabeledSeq.is() )
727*b1cdbd2cSJim Jagielski     {
728*b1cdbd2cSJim Jagielski         if( xValueSeq.is() )
729*b1cdbd2cSJim Jagielski             xLabeledSeq->setValues( xValueSeq );
730*b1cdbd2cSJim Jagielski         if( xTitleSeq.is() )
731*b1cdbd2cSJim Jagielski             xLabeledSeq->setLabel( xTitleSeq );
732*b1cdbd2cSJim Jagielski     }
733*b1cdbd2cSJim Jagielski     return xLabeledSeq;
734*b1cdbd2cSJim Jagielski }
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski } // namespace
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
739*b1cdbd2cSJim Jagielski 
XclImpChSourceLink(const XclImpChRoot & rRoot)740*b1cdbd2cSJim Jagielski XclImpChSourceLink::XclImpChSourceLink( const XclImpChRoot& rRoot ) :
741*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
742*b1cdbd2cSJim Jagielski {
743*b1cdbd2cSJim Jagielski }
744*b1cdbd2cSJim Jagielski 
~XclImpChSourceLink()745*b1cdbd2cSJim Jagielski XclImpChSourceLink::~XclImpChSourceLink()
746*b1cdbd2cSJim Jagielski {
747*b1cdbd2cSJim Jagielski }
748*b1cdbd2cSJim Jagielski 
ReadChSourceLink(XclImpStream & rStrm)749*b1cdbd2cSJim Jagielski void XclImpChSourceLink::ReadChSourceLink( XclImpStream& rStrm )
750*b1cdbd2cSJim Jagielski {
751*b1cdbd2cSJim Jagielski     rStrm   >> maData.mnDestType
752*b1cdbd2cSJim Jagielski             >> maData.mnLinkType
753*b1cdbd2cSJim Jagielski             >> maData.mnFlags
754*b1cdbd2cSJim Jagielski             >> maData.mnNumFmtIdx;
755*b1cdbd2cSJim Jagielski 
756*b1cdbd2cSJim Jagielski     mxTokenArray.reset();
757*b1cdbd2cSJim Jagielski     if( GetLinkType() == EXC_CHSRCLINK_WORKSHEET )
758*b1cdbd2cSJim Jagielski     {
759*b1cdbd2cSJim Jagielski         // read token array
760*b1cdbd2cSJim Jagielski         XclTokenArray aXclTokArr;
761*b1cdbd2cSJim Jagielski         rStrm >> aXclTokArr;
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski         // convert BIFF formula tokens to Calc token array
764*b1cdbd2cSJim Jagielski         if( const ScTokenArray* pTokens = GetFormulaCompiler().CreateFormula( EXC_FMLATYPE_CHART, aXclTokArr ) )
765*b1cdbd2cSJim Jagielski             mxTokenArray.reset( pTokens->Clone() );
766*b1cdbd2cSJim Jagielski     }
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski     // try to read a following CHSTRING record
769*b1cdbd2cSJim Jagielski     if( (rStrm.GetNextRecId() == EXC_ID_CHSTRING) && rStrm.StartNextRecord() )
770*b1cdbd2cSJim Jagielski     {
771*b1cdbd2cSJim Jagielski         mxString.reset( new XclImpString );
772*b1cdbd2cSJim Jagielski         rStrm.Ignore( 2 );
773*b1cdbd2cSJim Jagielski         mxString->Read( rStrm, EXC_STR_8BITLENGTH | EXC_STR_SEPARATEFORMATS );
774*b1cdbd2cSJim Jagielski     }
775*b1cdbd2cSJim Jagielski }
776*b1cdbd2cSJim Jagielski 
SetString(const String & rString)777*b1cdbd2cSJim Jagielski void XclImpChSourceLink::SetString( const String& rString )
778*b1cdbd2cSJim Jagielski {
779*b1cdbd2cSJim Jagielski     if( !mxString )
780*b1cdbd2cSJim Jagielski         mxString.reset( new XclImpString );
781*b1cdbd2cSJim Jagielski     mxString->SetText( rString );
782*b1cdbd2cSJim Jagielski }
783*b1cdbd2cSJim Jagielski 
SetTextFormats(const XclFormatRunVec & rFormats)784*b1cdbd2cSJim Jagielski void XclImpChSourceLink::SetTextFormats( const XclFormatRunVec& rFormats )
785*b1cdbd2cSJim Jagielski {
786*b1cdbd2cSJim Jagielski     if( mxString.is() )
787*b1cdbd2cSJim Jagielski         mxString->SetFormats( rFormats );
788*b1cdbd2cSJim Jagielski }
789*b1cdbd2cSJim Jagielski 
GetCellCount() const790*b1cdbd2cSJim Jagielski sal_uInt16 XclImpChSourceLink::GetCellCount() const
791*b1cdbd2cSJim Jagielski {
792*b1cdbd2cSJim Jagielski     sal_uInt32 nCellCount = 0;
793*b1cdbd2cSJim Jagielski     if( mxTokenArray.is() )
794*b1cdbd2cSJim Jagielski     {
795*b1cdbd2cSJim Jagielski         mxTokenArray->Reset();
796*b1cdbd2cSJim Jagielski         for( const FormulaToken* pToken = mxTokenArray->First(); pToken; pToken = mxTokenArray->Next() )
797*b1cdbd2cSJim Jagielski         {
798*b1cdbd2cSJim Jagielski             switch( pToken->GetType() )
799*b1cdbd2cSJim Jagielski             {
800*b1cdbd2cSJim Jagielski                 case ::formula::svSingleRef:
801*b1cdbd2cSJim Jagielski                 case ::formula::svExternalSingleRef:
802*b1cdbd2cSJim Jagielski                     // single cell
803*b1cdbd2cSJim Jagielski                     ++nCellCount;
804*b1cdbd2cSJim Jagielski                 break;
805*b1cdbd2cSJim Jagielski                 case ::formula::svDoubleRef:
806*b1cdbd2cSJim Jagielski                 case ::formula::svExternalDoubleRef:
807*b1cdbd2cSJim Jagielski                 {
808*b1cdbd2cSJim Jagielski                     // cell range
809*b1cdbd2cSJim Jagielski                     const ScComplexRefData& rComplexRef = static_cast< const ScToken* >( pToken )->GetDoubleRef();
810*b1cdbd2cSJim Jagielski                     const ScSingleRefData& rRef1 = rComplexRef.Ref1;
811*b1cdbd2cSJim Jagielski                     const ScSingleRefData& rRef2 = rComplexRef.Ref2;
812*b1cdbd2cSJim Jagielski                     sal_uInt32 nTabs = static_cast< sal_uInt32 >( rRef2.nTab - rRef1.nTab + 1 );
813*b1cdbd2cSJim Jagielski                     sal_uInt32 nCols = static_cast< sal_uInt32 >( rRef2.nCol - rRef1.nCol + 1 );
814*b1cdbd2cSJim Jagielski                     sal_uInt32 nRows = static_cast< sal_uInt32 >( rRef2.nRow - rRef1.nRow + 1 );
815*b1cdbd2cSJim Jagielski                     nCellCount += nCols * nRows * nTabs;
816*b1cdbd2cSJim Jagielski                 }
817*b1cdbd2cSJim Jagielski                 break;
818*b1cdbd2cSJim Jagielski                 default: ;
819*b1cdbd2cSJim Jagielski             }
820*b1cdbd2cSJim Jagielski         }
821*b1cdbd2cSJim Jagielski     }
822*b1cdbd2cSJim Jagielski     return limit_cast< sal_uInt16 >( nCellCount );
823*b1cdbd2cSJim Jagielski }
824*b1cdbd2cSJim Jagielski 
ConvertNumFmt(ScfPropertySet & rPropSet,bool bPercent) const825*b1cdbd2cSJim Jagielski void XclImpChSourceLink::ConvertNumFmt( ScfPropertySet& rPropSet, bool bPercent ) const
826*b1cdbd2cSJim Jagielski {
827*b1cdbd2cSJim Jagielski     bool bLinkToSource = ::get_flag( maData.mnFlags, EXC_CHSRCLINK_NUMFMT );
828*b1cdbd2cSJim Jagielski     sal_uInt32 nScNumFmt = bLinkToSource ? GetNumFmtBuffer().GetScFormat( maData.mnNumFmtIdx ) : NUMBERFORMAT_ENTRY_NOT_FOUND;
829*b1cdbd2cSJim Jagielski     OUString aPropName = bPercent ? EXC_CHPROP_PERCENTAGENUMFMT : EXC_CHPROP_NUMBERFORMAT;
830*b1cdbd2cSJim Jagielski     if( nScNumFmt != NUMBERFORMAT_ENTRY_NOT_FOUND )
831*b1cdbd2cSJim Jagielski         rPropSet.SetProperty( aPropName, static_cast< sal_Int32 >( nScNumFmt ) );
832*b1cdbd2cSJim Jagielski     else
833*b1cdbd2cSJim Jagielski         // restore 'link to source' at data point (series may contain manual number format)
834*b1cdbd2cSJim Jagielski         rPropSet.SetAnyProperty( aPropName, Any() );
835*b1cdbd2cSJim Jagielski }
836*b1cdbd2cSJim Jagielski 
CreateDataSequence(const OUString & rRole) const837*b1cdbd2cSJim Jagielski Reference< XDataSequence > XclImpChSourceLink::CreateDataSequence( const OUString& rRole ) const
838*b1cdbd2cSJim Jagielski {
839*b1cdbd2cSJim Jagielski     Reference< XDataSequence > xDataSeq;
840*b1cdbd2cSJim Jagielski     Reference< XDataProvider > xDataProv = GetDataProvider();
841*b1cdbd2cSJim Jagielski     if( xDataProv.is() && mxTokenArray.is() )
842*b1cdbd2cSJim Jagielski     {
843*b1cdbd2cSJim Jagielski         ScCompiler aComp( GetDocPtr(), ScAddress(), *mxTokenArray );
844*b1cdbd2cSJim Jagielski         aComp.SetGrammar( ::formula::FormulaGrammar::GRAM_ENGLISH );
845*b1cdbd2cSJim Jagielski         OUStringBuffer aRangeRep;
846*b1cdbd2cSJim Jagielski         aComp.CreateStringFromTokenArray( aRangeRep );
847*b1cdbd2cSJim Jagielski         try
848*b1cdbd2cSJim Jagielski         {
849*b1cdbd2cSJim Jagielski             xDataSeq = xDataProv->createDataSequenceByRangeRepresentation( aRangeRep.makeStringAndClear() );
850*b1cdbd2cSJim Jagielski             // set sequence role
851*b1cdbd2cSJim Jagielski             ScfPropertySet aSeqProp( xDataSeq );
852*b1cdbd2cSJim Jagielski             aSeqProp.SetProperty( EXC_CHPROP_ROLE, rRole );
853*b1cdbd2cSJim Jagielski         }
854*b1cdbd2cSJim Jagielski         catch( Exception& )
855*b1cdbd2cSJim Jagielski         {
856*b1cdbd2cSJim Jagielski //            DBG_ERRORFILE( "XclImpChSourceLink::CreateDataSequence - cannot create data sequence" );
857*b1cdbd2cSJim Jagielski         }
858*b1cdbd2cSJim Jagielski     }
859*b1cdbd2cSJim Jagielski     return xDataSeq;
860*b1cdbd2cSJim Jagielski }
861*b1cdbd2cSJim Jagielski 
CreateStringSequence(const XclImpChRoot & rRoot,sal_uInt16 nLeadFontIdx,const Color & rLeadFontColor) const862*b1cdbd2cSJim Jagielski Sequence< Reference< XFormattedString > > XclImpChSourceLink::CreateStringSequence(
863*b1cdbd2cSJim Jagielski         const XclImpChRoot& rRoot, sal_uInt16 nLeadFontIdx, const Color& rLeadFontColor ) const
864*b1cdbd2cSJim Jagielski {
865*b1cdbd2cSJim Jagielski     ::std::vector< Reference< XFormattedString > > aStringVec;
866*b1cdbd2cSJim Jagielski     if( mxString.is() )
867*b1cdbd2cSJim Jagielski     {
868*b1cdbd2cSJim Jagielski         for( XclImpStringIterator aIt( *mxString ); aIt.Is(); ++aIt )
869*b1cdbd2cSJim Jagielski         {
870*b1cdbd2cSJim Jagielski             Reference< XFormattedString > xFmtStr(
871*b1cdbd2cSJim Jagielski                 ScfApiHelper::CreateInstance( SERVICE_CHART2_FORMATTEDSTRING ), UNO_QUERY );
872*b1cdbd2cSJim Jagielski             if( xFmtStr.is() )
873*b1cdbd2cSJim Jagielski             {
874*b1cdbd2cSJim Jagielski                 // set text data
875*b1cdbd2cSJim Jagielski                 xFmtStr->setString( aIt.GetPortionText() );
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski                 // set font formatting and font color
878*b1cdbd2cSJim Jagielski                 ScfPropertySet aStringProp( xFmtStr );
879*b1cdbd2cSJim Jagielski                 sal_uInt16 nFontIdx = aIt.GetPortionFont();
880*b1cdbd2cSJim Jagielski                 if( (nFontIdx == EXC_FONT_NOTFOUND) && (aIt.GetPortionIndex() == 0) )
881*b1cdbd2cSJim Jagielski                     // leading unformatted portion - use passed font settings
882*b1cdbd2cSJim Jagielski                     rRoot.ConvertFont( aStringProp, nLeadFontIdx, &rLeadFontColor );
883*b1cdbd2cSJim Jagielski                 else
884*b1cdbd2cSJim Jagielski                     rRoot.ConvertFont( aStringProp, nFontIdx );
885*b1cdbd2cSJim Jagielski 
886*b1cdbd2cSJim Jagielski                 // add string to vector of strings
887*b1cdbd2cSJim Jagielski                 aStringVec.push_back( xFmtStr );
888*b1cdbd2cSJim Jagielski             }
889*b1cdbd2cSJim Jagielski         }
890*b1cdbd2cSJim Jagielski     }
891*b1cdbd2cSJim Jagielski     return ScfApiHelper::VectorToSequence( aStringVec );
892*b1cdbd2cSJim Jagielski }
893*b1cdbd2cSJim Jagielski 
FillSourceLink(::std::vector<ScSharedTokenRef> & rTokens) const894*b1cdbd2cSJim Jagielski void XclImpChSourceLink::FillSourceLink( ::std::vector< ScSharedTokenRef >& rTokens ) const
895*b1cdbd2cSJim Jagielski {
896*b1cdbd2cSJim Jagielski     if( !mxTokenArray.is() )
897*b1cdbd2cSJim Jagielski         // no links to fill.
898*b1cdbd2cSJim Jagielski         return;
899*b1cdbd2cSJim Jagielski 
900*b1cdbd2cSJim Jagielski     mxTokenArray->Reset();
901*b1cdbd2cSJim Jagielski     for (FormulaToken* p = mxTokenArray->First(); p; p = mxTokenArray->Next())
902*b1cdbd2cSJim Jagielski     {
903*b1cdbd2cSJim Jagielski         ScSharedTokenRef pToken(static_cast<ScToken*>(p->Clone()));
904*b1cdbd2cSJim Jagielski         if (ScRefTokenHelper::isRef(pToken))
905*b1cdbd2cSJim Jagielski             // This is a reference token.  Store it.
906*b1cdbd2cSJim Jagielski             ScRefTokenHelper::join(rTokens, pToken);
907*b1cdbd2cSJim Jagielski     }
908*b1cdbd2cSJim Jagielski }
909*b1cdbd2cSJim Jagielski 
910*b1cdbd2cSJim Jagielski // Text =======================================================================
911*b1cdbd2cSJim Jagielski 
~XclImpChFontBase()912*b1cdbd2cSJim Jagielski XclImpChFontBase::~XclImpChFontBase()
913*b1cdbd2cSJim Jagielski {
914*b1cdbd2cSJim Jagielski }
915*b1cdbd2cSJim Jagielski 
ConvertFontBase(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet) const916*b1cdbd2cSJim Jagielski void XclImpChFontBase::ConvertFontBase( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet ) const
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski     Color aFontColor = GetFontColor();
919*b1cdbd2cSJim Jagielski     rRoot.ConvertFont( rPropSet, GetFontIndex(), &aFontColor );
920*b1cdbd2cSJim Jagielski }
921*b1cdbd2cSJim Jagielski 
ConvertRotationBase(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,bool bSupportsStacked) const922*b1cdbd2cSJim Jagielski void XclImpChFontBase::ConvertRotationBase( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet, bool bSupportsStacked ) const
923*b1cdbd2cSJim Jagielski {
924*b1cdbd2cSJim Jagielski     rRoot.GetChartPropSetHelper().WriteRotationProperties( rPropSet, GetRotation(), bSupportsStacked );
925*b1cdbd2cSJim Jagielski }
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
928*b1cdbd2cSJim Jagielski 
XclImpChFont()929*b1cdbd2cSJim Jagielski XclImpChFont::XclImpChFont() :
930*b1cdbd2cSJim Jagielski     mnFontIdx( EXC_FONT_NOTFOUND )
931*b1cdbd2cSJim Jagielski {
932*b1cdbd2cSJim Jagielski }
933*b1cdbd2cSJim Jagielski 
ReadChFont(XclImpStream & rStrm)934*b1cdbd2cSJim Jagielski void XclImpChFont::ReadChFont( XclImpStream& rStrm )
935*b1cdbd2cSJim Jagielski {
936*b1cdbd2cSJim Jagielski     rStrm >> mnFontIdx;
937*b1cdbd2cSJim Jagielski }
938*b1cdbd2cSJim Jagielski 
939*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
940*b1cdbd2cSJim Jagielski 
XclImpChText(const XclImpChRoot & rRoot)941*b1cdbd2cSJim Jagielski XclImpChText::XclImpChText( const XclImpChRoot& rRoot ) :
942*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
943*b1cdbd2cSJim Jagielski {
944*b1cdbd2cSJim Jagielski }
945*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)946*b1cdbd2cSJim Jagielski void XclImpChText::ReadHeaderRecord( XclImpStream& rStrm )
947*b1cdbd2cSJim Jagielski {
948*b1cdbd2cSJim Jagielski     rStrm   >> maData.mnHAlign
949*b1cdbd2cSJim Jagielski             >> maData.mnVAlign
950*b1cdbd2cSJim Jagielski             >> maData.mnBackMode
951*b1cdbd2cSJim Jagielski             >> maData.maTextColor
952*b1cdbd2cSJim Jagielski             >> maData.maRect
953*b1cdbd2cSJim Jagielski             >> maData.mnFlags;
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski     if( GetBiff() == EXC_BIFF8 )
956*b1cdbd2cSJim Jagielski     {
957*b1cdbd2cSJim Jagielski         // #116397# BIFF8: index into palette used instead of RGB data
958*b1cdbd2cSJim Jagielski         maData.maTextColor = GetPalette().GetColor( rStrm.ReaduInt16() );
959*b1cdbd2cSJim Jagielski         // placement and rotation
960*b1cdbd2cSJim Jagielski         rStrm >> maData.mnFlags2 >> maData.mnRotation;
961*b1cdbd2cSJim Jagielski     }
962*b1cdbd2cSJim Jagielski     else
963*b1cdbd2cSJim Jagielski     {
964*b1cdbd2cSJim Jagielski         // BIFF2-BIFF7: get rotation from text orientation
965*b1cdbd2cSJim Jagielski         sal_uInt8 nOrient = ::extract_value< sal_uInt8 >( maData.mnFlags, 8, 3 );
966*b1cdbd2cSJim Jagielski         maData.mnRotation = XclTools::GetXclRotFromOrient( nOrient );
967*b1cdbd2cSJim Jagielski     }
968*b1cdbd2cSJim Jagielski }
969*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)970*b1cdbd2cSJim Jagielski void XclImpChText::ReadSubRecord( XclImpStream& rStrm )
971*b1cdbd2cSJim Jagielski {
972*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
973*b1cdbd2cSJim Jagielski     {
974*b1cdbd2cSJim Jagielski         case EXC_ID_CHFRAMEPOS:
975*b1cdbd2cSJim Jagielski             mxFramePos.reset( new XclImpChFramePos );
976*b1cdbd2cSJim Jagielski             mxFramePos->ReadChFramePos( rStrm );
977*b1cdbd2cSJim Jagielski         break;
978*b1cdbd2cSJim Jagielski         case EXC_ID_CHFONT:
979*b1cdbd2cSJim Jagielski             mxFont.reset( new XclImpChFont );
980*b1cdbd2cSJim Jagielski             mxFont->ReadChFont( rStrm );
981*b1cdbd2cSJim Jagielski         break;
982*b1cdbd2cSJim Jagielski         case EXC_ID_CHFORMATRUNS:
983*b1cdbd2cSJim Jagielski             if( GetBiff() == EXC_BIFF8 )
984*b1cdbd2cSJim Jagielski                 XclImpString::ReadFormats( rStrm, maFormats );
985*b1cdbd2cSJim Jagielski         break;
986*b1cdbd2cSJim Jagielski         case EXC_ID_CHSOURCELINK:
987*b1cdbd2cSJim Jagielski             mxSrcLink.reset( new XclImpChSourceLink( GetChRoot() ) );
988*b1cdbd2cSJim Jagielski             mxSrcLink->ReadChSourceLink( rStrm );
989*b1cdbd2cSJim Jagielski         break;
990*b1cdbd2cSJim Jagielski         case EXC_ID_CHFRAME:
991*b1cdbd2cSJim Jagielski             mxFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_TEXT ) );
992*b1cdbd2cSJim Jagielski             mxFrame->ReadRecordGroup( rStrm );
993*b1cdbd2cSJim Jagielski         break;
994*b1cdbd2cSJim Jagielski         case EXC_ID_CHOBJECTLINK:
995*b1cdbd2cSJim Jagielski             rStrm >> maObjLink.mnTarget >> maObjLink.maPointPos.mnSeriesIdx >> maObjLink.maPointPos.mnPointIdx;
996*b1cdbd2cSJim Jagielski         break;
997*b1cdbd2cSJim Jagielski         case EXC_ID_CHFRLABELPROPS:
998*b1cdbd2cSJim Jagielski             ReadChFrLabelProps( rStrm );
999*b1cdbd2cSJim Jagielski         break;
1000*b1cdbd2cSJim Jagielski         case EXC_ID_CHEND:
1001*b1cdbd2cSJim Jagielski             if( mxSrcLink.is() && !maFormats.empty() )
1002*b1cdbd2cSJim Jagielski                 mxSrcLink->SetTextFormats( maFormats );
1003*b1cdbd2cSJim Jagielski         break;
1004*b1cdbd2cSJim Jagielski     }
1005*b1cdbd2cSJim Jagielski }
1006*b1cdbd2cSJim Jagielski 
GetFontIndex() const1007*b1cdbd2cSJim Jagielski sal_uInt16 XclImpChText::GetFontIndex() const
1008*b1cdbd2cSJim Jagielski {
1009*b1cdbd2cSJim Jagielski     return mxFont.is() ? mxFont->GetFontIndex() : EXC_FONT_NOTFOUND;
1010*b1cdbd2cSJim Jagielski }
1011*b1cdbd2cSJim Jagielski 
GetFontColor() const1012*b1cdbd2cSJim Jagielski Color XclImpChText::GetFontColor() const
1013*b1cdbd2cSJim Jagielski {
1014*b1cdbd2cSJim Jagielski     return ::get_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR ) ? GetFontAutoColor() : maData.maTextColor;
1015*b1cdbd2cSJim Jagielski }
1016*b1cdbd2cSJim Jagielski 
GetRotation() const1017*b1cdbd2cSJim Jagielski sal_uInt16 XclImpChText::GetRotation() const
1018*b1cdbd2cSJim Jagielski {
1019*b1cdbd2cSJim Jagielski     return maData.mnRotation;
1020*b1cdbd2cSJim Jagielski }
1021*b1cdbd2cSJim Jagielski 
SetString(const String & rString)1022*b1cdbd2cSJim Jagielski void XclImpChText::SetString( const String& rString )
1023*b1cdbd2cSJim Jagielski {
1024*b1cdbd2cSJim Jagielski     if( !mxSrcLink )
1025*b1cdbd2cSJim Jagielski         mxSrcLink.reset( new XclImpChSourceLink( GetChRoot() ) );
1026*b1cdbd2cSJim Jagielski     mxSrcLink->SetString( rString );
1027*b1cdbd2cSJim Jagielski }
1028*b1cdbd2cSJim Jagielski 
UpdateText(const XclImpChText * pParentText)1029*b1cdbd2cSJim Jagielski void XclImpChText::UpdateText( const XclImpChText* pParentText )
1030*b1cdbd2cSJim Jagielski {
1031*b1cdbd2cSJim Jagielski     if( pParentText )
1032*b1cdbd2cSJim Jagielski     {
1033*b1cdbd2cSJim Jagielski         // update missing members
1034*b1cdbd2cSJim Jagielski         if( !mxFrame )
1035*b1cdbd2cSJim Jagielski             mxFrame = pParentText->mxFrame;
1036*b1cdbd2cSJim Jagielski         if( !mxFont )
1037*b1cdbd2cSJim Jagielski         {
1038*b1cdbd2cSJim Jagielski             mxFont = pParentText->mxFont;
1039*b1cdbd2cSJim Jagielski             // text color is taken from CHTEXT record, not from font in CHFONT
1040*b1cdbd2cSJim Jagielski             ::set_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, ::get_flag( pParentText->maData.mnFlags, EXC_CHTEXT_AUTOCOLOR ) );
1041*b1cdbd2cSJim Jagielski             maData.maTextColor = pParentText->maData.maTextColor;
1042*b1cdbd2cSJim Jagielski         }
1043*b1cdbd2cSJim Jagielski     }
1044*b1cdbd2cSJim Jagielski }
1045*b1cdbd2cSJim Jagielski 
UpdateDataLabel(bool bCateg,bool bValue,bool bPercent)1046*b1cdbd2cSJim Jagielski void XclImpChText::UpdateDataLabel( bool bCateg, bool bValue, bool bPercent )
1047*b1cdbd2cSJim Jagielski {
1048*b1cdbd2cSJim Jagielski     ::set_flag( maData.mnFlags, EXC_CHTEXT_SHOWCATEG,     bCateg );
1049*b1cdbd2cSJim Jagielski     ::set_flag( maData.mnFlags, EXC_CHTEXT_SHOWVALUE,     bValue );
1050*b1cdbd2cSJim Jagielski     ::set_flag( maData.mnFlags, EXC_CHTEXT_SHOWPERCENT,   bPercent );
1051*b1cdbd2cSJim Jagielski     ::set_flag( maData.mnFlags, EXC_CHTEXT_SHOWCATEGPERC, bCateg && bPercent );
1052*b1cdbd2cSJim Jagielski     ::set_flag( maData.mnFlags, EXC_CHTEXT_DELETED,       !bCateg && !bValue && !bPercent );
1053*b1cdbd2cSJim Jagielski }
1054*b1cdbd2cSJim Jagielski 
ConvertFont(ScfPropertySet & rPropSet) const1055*b1cdbd2cSJim Jagielski void XclImpChText::ConvertFont( ScfPropertySet& rPropSet ) const
1056*b1cdbd2cSJim Jagielski {
1057*b1cdbd2cSJim Jagielski     ConvertFontBase( GetChRoot(), rPropSet );
1058*b1cdbd2cSJim Jagielski }
1059*b1cdbd2cSJim Jagielski 
ConvertRotation(ScfPropertySet & rPropSet,bool bSupportsStacked) const1060*b1cdbd2cSJim Jagielski void XclImpChText::ConvertRotation( ScfPropertySet& rPropSet, bool bSupportsStacked ) const
1061*b1cdbd2cSJim Jagielski {
1062*b1cdbd2cSJim Jagielski     ConvertRotationBase( GetChRoot(), rPropSet, bSupportsStacked );
1063*b1cdbd2cSJim Jagielski }
1064*b1cdbd2cSJim Jagielski 
ConvertFrame(ScfPropertySet & rPropSet) const1065*b1cdbd2cSJim Jagielski void XclImpChText::ConvertFrame( ScfPropertySet& rPropSet ) const
1066*b1cdbd2cSJim Jagielski {
1067*b1cdbd2cSJim Jagielski     if( mxFrame.is() )
1068*b1cdbd2cSJim Jagielski         mxFrame->Convert( rPropSet );
1069*b1cdbd2cSJim Jagielski }
1070*b1cdbd2cSJim Jagielski 
ConvertNumFmt(ScfPropertySet & rPropSet,bool bPercent) const1071*b1cdbd2cSJim Jagielski void XclImpChText::ConvertNumFmt( ScfPropertySet& rPropSet, bool bPercent ) const
1072*b1cdbd2cSJim Jagielski {
1073*b1cdbd2cSJim Jagielski     if( mxSrcLink.is() )
1074*b1cdbd2cSJim Jagielski         mxSrcLink->ConvertNumFmt( rPropSet, bPercent );
1075*b1cdbd2cSJim Jagielski }
1076*b1cdbd2cSJim Jagielski 
ConvertDataLabel(ScfPropertySet & rPropSet,const XclChTypeInfo & rTypeInfo) const1077*b1cdbd2cSJim Jagielski void XclImpChText::ConvertDataLabel( ScfPropertySet& rPropSet, const XclChTypeInfo& rTypeInfo ) const
1078*b1cdbd2cSJim Jagielski {
1079*b1cdbd2cSJim Jagielski     // existing CHFRLABELPROPS record wins over flags from CHTEXT
1080*b1cdbd2cSJim Jagielski     sal_uInt16 nShowFlags = mxLabelProps.is() ? mxLabelProps->mnFlags : maData.mnFlags;
1081*b1cdbd2cSJim Jagielski     sal_uInt16 SHOWANYCATEG   = mxLabelProps.is() ? EXC_CHFRLABELPROPS_SHOWCATEG : (EXC_CHTEXT_SHOWCATEGPERC | EXC_CHTEXT_SHOWCATEG);
1082*b1cdbd2cSJim Jagielski     sal_uInt16 SHOWANYVALUE   = mxLabelProps.is() ? EXC_CHFRLABELPROPS_SHOWVALUE : EXC_CHTEXT_SHOWVALUE;
1083*b1cdbd2cSJim Jagielski     sal_uInt16 SHOWANYPERCENT = mxLabelProps.is() ? EXC_CHFRLABELPROPS_SHOWPERCENT : (EXC_CHTEXT_SHOWPERCENT | EXC_CHTEXT_SHOWCATEGPERC);
1084*b1cdbd2cSJim Jagielski     sal_uInt16 SHOWANYBUBBLE  = mxLabelProps.is() ? EXC_CHFRLABELPROPS_SHOWBUBBLE : EXC_CHTEXT_SHOWBUBBLE;
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski     // get raw flags for label values
1087*b1cdbd2cSJim Jagielski     bool bShowNone    = IsDeleted();
1088*b1cdbd2cSJim Jagielski     bool bShowCateg   = !bShowNone && ::get_flag( nShowFlags, SHOWANYCATEG );
1089*b1cdbd2cSJim Jagielski     bool bShowPercent = !bShowNone && ::get_flag( nShowFlags, SHOWANYPERCENT );
1090*b1cdbd2cSJim Jagielski     bool bShowValue   = !bShowNone && ::get_flag( nShowFlags, SHOWANYVALUE );
1091*b1cdbd2cSJim Jagielski     bool bShowBubble  = !bShowNone && ::get_flag( nShowFlags, SHOWANYBUBBLE );
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski     // adjust to Chart2 behaviour
1094*b1cdbd2cSJim Jagielski     if( rTypeInfo.meTypeId == EXC_CHTYPEID_BUBBLES )
1095*b1cdbd2cSJim Jagielski          bShowValue = bShowBubble;  // Chart2 bubble charts show bubble size if 'ShowValue' is set
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski     // other flags
1098*b1cdbd2cSJim Jagielski     bool bShowAny = bShowValue || bShowPercent || bShowCateg;
1099*b1cdbd2cSJim Jagielski     bool bShowSymbol = bShowAny && ::get_flag( maData.mnFlags, EXC_CHTEXT_SHOWSYMBOL );
1100*b1cdbd2cSJim Jagielski 
1101*b1cdbd2cSJim Jagielski     // create API struct for label values, set API label separator
1102*b1cdbd2cSJim Jagielski     cssc2::DataPointLabel aPointLabel( bShowValue, bShowPercent, bShowCateg, bShowSymbol );
1103*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_LABEL, aPointLabel );
1104*b1cdbd2cSJim Jagielski     String aSep = mxLabelProps.is() ? mxLabelProps->maSeparator : String( sal_Unicode( '\n' ) );
1105*b1cdbd2cSJim Jagielski     if( aSep.Len() == 0 )
1106*b1cdbd2cSJim Jagielski         aSep = CREATE_STRING( "; " );
1107*b1cdbd2cSJim Jagielski     rPropSet.SetStringProperty( EXC_CHPROP_LABELSEPARATOR, aSep );
1108*b1cdbd2cSJim Jagielski 
1109*b1cdbd2cSJim Jagielski     // text properties of attached label
1110*b1cdbd2cSJim Jagielski     if( bShowAny )
1111*b1cdbd2cSJim Jagielski     {
1112*b1cdbd2cSJim Jagielski         ConvertFont( rPropSet );
1113*b1cdbd2cSJim Jagielski         ConvertRotation( rPropSet, false );
1114*b1cdbd2cSJim Jagielski         // label placement
1115*b1cdbd2cSJim Jagielski         using namespace cssc::DataLabelPlacement;
1116*b1cdbd2cSJim Jagielski         sal_Int32 nPlacement = rTypeInfo.mnDefaultLabelPos;
1117*b1cdbd2cSJim Jagielski         switch( ::extract_value< sal_uInt16 >( maData.mnFlags2, 0, 4 ) )
1118*b1cdbd2cSJim Jagielski         {
1119*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_DEFAULT:    nPlacement = rTypeInfo.mnDefaultLabelPos;   break;
1120*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_OUTSIDE:    nPlacement = OUTSIDE;                       break;
1121*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_INSIDE:     nPlacement = INSIDE;                        break;
1122*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_CENTER:     nPlacement = CENTER;                        break;
1123*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_AXIS:       nPlacement = NEAR_ORIGIN;                   break;
1124*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_ABOVE:      nPlacement = TOP;                           break;
1125*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_BELOW:      nPlacement = BOTTOM;                        break;
1126*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_LEFT:       nPlacement = LEFT;                          break;
1127*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_RIGHT:      nPlacement = RIGHT;                         break;
1128*b1cdbd2cSJim Jagielski             case EXC_CHTEXT_POS_AUTO:       nPlacement = AVOID_OVERLAP;                 break;
1129*b1cdbd2cSJim Jagielski         }
1130*b1cdbd2cSJim Jagielski         rPropSet.SetProperty( EXC_CHPROP_LABELPLACEMENT, nPlacement );
1131*b1cdbd2cSJim Jagielski         // label number format (percentage format wins over value format)
1132*b1cdbd2cSJim Jagielski         if( bShowPercent || bShowValue )
1133*b1cdbd2cSJim Jagielski             ConvertNumFmt( rPropSet, bShowPercent );
1134*b1cdbd2cSJim Jagielski     }
1135*b1cdbd2cSJim Jagielski }
1136*b1cdbd2cSJim Jagielski 
CreateTitle() const1137*b1cdbd2cSJim Jagielski Reference< XTitle > XclImpChText::CreateTitle() const
1138*b1cdbd2cSJim Jagielski {
1139*b1cdbd2cSJim Jagielski     Reference< XTitle > xTitle;
1140*b1cdbd2cSJim Jagielski     if( mxSrcLink.is() && mxSrcLink->HasString() )
1141*b1cdbd2cSJim Jagielski     {
1142*b1cdbd2cSJim Jagielski         // create the formatted strings
1143*b1cdbd2cSJim Jagielski         Sequence< Reference< XFormattedString > > aStringSeq(
1144*b1cdbd2cSJim Jagielski             mxSrcLink->CreateStringSequence( GetChRoot(), GetFontIndex(), GetFontColor() ) );
1145*b1cdbd2cSJim Jagielski         if( aStringSeq.hasElements() )
1146*b1cdbd2cSJim Jagielski         {
1147*b1cdbd2cSJim Jagielski             // create the title object
1148*b1cdbd2cSJim Jagielski             xTitle.set( ScfApiHelper::CreateInstance( SERVICE_CHART2_TITLE ), UNO_QUERY );
1149*b1cdbd2cSJim Jagielski             if( xTitle.is() )
1150*b1cdbd2cSJim Jagielski             {
1151*b1cdbd2cSJim Jagielski                 // set the formatted strings
1152*b1cdbd2cSJim Jagielski                 xTitle->setText( aStringSeq );
1153*b1cdbd2cSJim Jagielski                 // more title formatting properties
1154*b1cdbd2cSJim Jagielski                 ScfPropertySet aTitleProp( xTitle );
1155*b1cdbd2cSJim Jagielski                 ConvertFrame( aTitleProp );
1156*b1cdbd2cSJim Jagielski                 ConvertRotation( aTitleProp, true );
1157*b1cdbd2cSJim Jagielski             }
1158*b1cdbd2cSJim Jagielski         }
1159*b1cdbd2cSJim Jagielski     }
1160*b1cdbd2cSJim Jagielski     return xTitle;
1161*b1cdbd2cSJim Jagielski }
1162*b1cdbd2cSJim Jagielski 
ConvertTitlePosition(const XclChTextKey & rTitleKey) const1163*b1cdbd2cSJim Jagielski void XclImpChText::ConvertTitlePosition( const XclChTextKey& rTitleKey ) const
1164*b1cdbd2cSJim Jagielski {
1165*b1cdbd2cSJim Jagielski     if( !mxFramePos ) return;
1166*b1cdbd2cSJim Jagielski 
1167*b1cdbd2cSJim Jagielski     const XclChFramePos& rPosData = mxFramePos->GetFramePosData();
1168*b1cdbd2cSJim Jagielski     OSL_ENSURE( (rPosData.mnTLMode == EXC_CHFRAMEPOS_PARENT) && (rPosData.mnBRMode == EXC_CHFRAMEPOS_PARENT),
1169*b1cdbd2cSJim Jagielski         "XclImpChText::ConvertTitlePosition - unexpected frame position mode" );
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski     /*  Check if title is moved manually. To get the actual position of the
1172*b1cdbd2cSJim Jagielski         title, we do some kind of hack and use the values from the CHTEXT
1173*b1cdbd2cSJim Jagielski         record, effectively ignoring the contents of the CHFRAMEPOS record
1174*b1cdbd2cSJim Jagielski         which contains the position relative to the default title position
1175*b1cdbd2cSJim Jagielski         (according to the spec, the CHFRAMEPOS supersedes the CHTEXT record).
1176*b1cdbd2cSJim Jagielski         Especially when it comes to axis titles, things would become very
1177*b1cdbd2cSJim Jagielski         complicated here, because the relative title position is stored in a
1178*b1cdbd2cSJim Jagielski         measurement unit that is dependent on the size of the inner plot area,
1179*b1cdbd2cSJim Jagielski         the interpretation of the X and Y coordinate is dependent on the
1180*b1cdbd2cSJim Jagielski         direction of the axis, and in 3D charts, and the title default
1181*b1cdbd2cSJim Jagielski         positions are dependent on the 3D view settings (rotation, elevation,
1182*b1cdbd2cSJim Jagielski         and perspective). Thus, it is easier to assume that the creator has
1183*b1cdbd2cSJim Jagielski         written out the correct absolute position and size of the title in the
1184*b1cdbd2cSJim Jagielski         CHTEXT record. This is assured by checking that the shape size stored
1185*b1cdbd2cSJim Jagielski         in the CHTEXT record is non-zero. */
1186*b1cdbd2cSJim Jagielski     if( (rPosData.mnTLMode == EXC_CHFRAMEPOS_PARENT) &&
1187*b1cdbd2cSJim Jagielski         ((rPosData.maRect.mnX != 0) || (rPosData.maRect.mnY != 0)) &&
1188*b1cdbd2cSJim Jagielski         (maData.maRect.mnWidth > 0) && (maData.maRect.mnHeight > 0) ) try
1189*b1cdbd2cSJim Jagielski     {
1190*b1cdbd2cSJim Jagielski         Reference< XShape > xTitleShape( GetTitleShape( rTitleKey ), UNO_SET_THROW );
1191*b1cdbd2cSJim Jagielski         // the call to XShape.getSize() may recalc the chart view
1192*b1cdbd2cSJim Jagielski         ::com::sun::star::awt::Size aTitleSize = xTitleShape->getSize();
1193*b1cdbd2cSJim Jagielski         // rotated titles need special handling...
1194*b1cdbd2cSJim Jagielski         sal_Int32 nScRot = XclTools::GetScRotation( GetRotation(), 0 );
1195*b1cdbd2cSJim Jagielski         double fRad = nScRot * F_PI18000;
1196*b1cdbd2cSJim Jagielski         double fSin = fabs( sin( fRad ) );
1197*b1cdbd2cSJim Jagielski         double fCos = fabs( cos( fRad ) );
1198*b1cdbd2cSJim Jagielski         ::com::sun::star::awt::Size aBoundSize(
1199*b1cdbd2cSJim Jagielski             static_cast< sal_Int32 >( fCos * aTitleSize.Width + fSin * aTitleSize.Height + 0.5 ),
1200*b1cdbd2cSJim Jagielski             static_cast< sal_Int32 >( fSin * aTitleSize.Width + fCos * aTitleSize.Height + 0.5 ) );
1201*b1cdbd2cSJim Jagielski         // calculate the title position from the values in the CHTEXT record
1202*b1cdbd2cSJim Jagielski         ::com::sun::star::awt::Point aTitlePos(
1203*b1cdbd2cSJim Jagielski             CalcHmmFromChartX( maData.maRect.mnX ),
1204*b1cdbd2cSJim Jagielski             CalcHmmFromChartY( maData.maRect.mnY ) );
1205*b1cdbd2cSJim Jagielski         // add part of height to X direction, if title is rotated down (clockwise)
1206*b1cdbd2cSJim Jagielski         if( nScRot > 18000 )
1207*b1cdbd2cSJim Jagielski             aTitlePos.X += static_cast< sal_Int32 >( fSin * aTitleSize.Height + 0.5 );
1208*b1cdbd2cSJim Jagielski         // add part of width to Y direction, if title is rotated up (counterclockwise)
1209*b1cdbd2cSJim Jagielski         else if( nScRot > 0 )
1210*b1cdbd2cSJim Jagielski             aTitlePos.Y += static_cast< sal_Int32 >( fSin * aTitleSize.Width + 0.5 );
1211*b1cdbd2cSJim Jagielski         // set the resulting position at the title shape
1212*b1cdbd2cSJim Jagielski         xTitleShape->setPosition( aTitlePos );
1213*b1cdbd2cSJim Jagielski     }
1214*b1cdbd2cSJim Jagielski     catch( Exception& )
1215*b1cdbd2cSJim Jagielski     {
1216*b1cdbd2cSJim Jagielski     }
1217*b1cdbd2cSJim Jagielski }
1218*b1cdbd2cSJim Jagielski 
ReadChFrLabelProps(XclImpStream & rStrm)1219*b1cdbd2cSJim Jagielski void XclImpChText::ReadChFrLabelProps( XclImpStream& rStrm )
1220*b1cdbd2cSJim Jagielski {
1221*b1cdbd2cSJim Jagielski     if( GetBiff() == EXC_BIFF8 )
1222*b1cdbd2cSJim Jagielski     {
1223*b1cdbd2cSJim Jagielski         mxLabelProps.reset( new XclChFrLabelProps );
1224*b1cdbd2cSJim Jagielski         sal_uInt16 nSepLen;
1225*b1cdbd2cSJim Jagielski         rStrm.Ignore( 12 );
1226*b1cdbd2cSJim Jagielski         rStrm >> mxLabelProps->mnFlags >> nSepLen;
1227*b1cdbd2cSJim Jagielski         if( nSepLen > 0 )
1228*b1cdbd2cSJim Jagielski             mxLabelProps->maSeparator = rStrm.ReadUniString( nSepLen );
1229*b1cdbd2cSJim Jagielski     }
1230*b1cdbd2cSJim Jagielski }
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski namespace {
1233*b1cdbd2cSJim Jagielski 
lclUpdateText(XclImpChTextRef & rxText,XclImpChTextRef xDefText)1234*b1cdbd2cSJim Jagielski void lclUpdateText( XclImpChTextRef& rxText, XclImpChTextRef xDefText )
1235*b1cdbd2cSJim Jagielski {
1236*b1cdbd2cSJim Jagielski     if( rxText.is() )
1237*b1cdbd2cSJim Jagielski         rxText->UpdateText( xDefText.get() );
1238*b1cdbd2cSJim Jagielski     else
1239*b1cdbd2cSJim Jagielski         rxText = xDefText;
1240*b1cdbd2cSJim Jagielski }
1241*b1cdbd2cSJim Jagielski 
lclFinalizeTitle(XclImpChTextRef & rxTitle,XclImpChTextRef xDefText,const String & rAutoTitle)1242*b1cdbd2cSJim Jagielski void lclFinalizeTitle( XclImpChTextRef& rxTitle, XclImpChTextRef xDefText, const String& rAutoTitle )
1243*b1cdbd2cSJim Jagielski {
1244*b1cdbd2cSJim Jagielski     /*  Do not update a title, if it is not visible (if rxTitle is null).
1245*b1cdbd2cSJim Jagielski         Existing reference indicates enabled title. */
1246*b1cdbd2cSJim Jagielski     if( rxTitle.is() )
1247*b1cdbd2cSJim Jagielski     {
1248*b1cdbd2cSJim Jagielski         if( !rxTitle->HasString() )
1249*b1cdbd2cSJim Jagielski             rxTitle->SetString( rAutoTitle );
1250*b1cdbd2cSJim Jagielski         if( rxTitle->HasString() )
1251*b1cdbd2cSJim Jagielski             rxTitle->UpdateText( xDefText.get() );
1252*b1cdbd2cSJim Jagielski         else
1253*b1cdbd2cSJim Jagielski             rxTitle.reset();
1254*b1cdbd2cSJim Jagielski     }
1255*b1cdbd2cSJim Jagielski }
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski } // namespace
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski // Data series ================================================================
1260*b1cdbd2cSJim Jagielski 
ReadChMarkerFormat(XclImpStream & rStrm)1261*b1cdbd2cSJim Jagielski void XclImpChMarkerFormat::ReadChMarkerFormat( XclImpStream& rStrm )
1262*b1cdbd2cSJim Jagielski {
1263*b1cdbd2cSJim Jagielski     rStrm >> maData.maLineColor >> maData.maFillColor >> maData.mnMarkerType >> maData.mnFlags;
1264*b1cdbd2cSJim Jagielski 
1265*b1cdbd2cSJim Jagielski     const XclImpRoot& rRoot = rStrm.GetRoot();
1266*b1cdbd2cSJim Jagielski     if( rRoot.GetBiff() == EXC_BIFF8 )
1267*b1cdbd2cSJim Jagielski     {
1268*b1cdbd2cSJim Jagielski         // #116397# BIFF8: index into palette used instead of RGB data
1269*b1cdbd2cSJim Jagielski         const XclImpPalette& rPal = rRoot.GetPalette();
1270*b1cdbd2cSJim Jagielski         maData.maLineColor = rPal.GetColor( rStrm.ReaduInt16() );
1271*b1cdbd2cSJim Jagielski         maData.maFillColor = rPal.GetColor( rStrm.ReaduInt16() );
1272*b1cdbd2cSJim Jagielski         // marker size
1273*b1cdbd2cSJim Jagielski         rStrm >> maData.mnMarkerSize;
1274*b1cdbd2cSJim Jagielski     }
1275*b1cdbd2cSJim Jagielski }
1276*b1cdbd2cSJim Jagielski 
Convert(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,sal_uInt16 nFormatIdx,sal_Int16 nLineWeight) const1277*b1cdbd2cSJim Jagielski void XclImpChMarkerFormat::Convert( const XclImpChRoot& rRoot,
1278*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx, sal_Int16 nLineWeight ) const
1279*b1cdbd2cSJim Jagielski {
1280*b1cdbd2cSJim Jagielski     if( IsAuto() )
1281*b1cdbd2cSJim Jagielski     {
1282*b1cdbd2cSJim Jagielski         XclChMarkerFormat aMarkerFmt;
1283*b1cdbd2cSJim Jagielski         // line and fill color of the symbol are equal to series line color
1284*b1cdbd2cSJim Jagielski         //! TODO: Excel sets no fill color for specific symbols (e.g. cross)
1285*b1cdbd2cSJim Jagielski         aMarkerFmt.maLineColor = aMarkerFmt.maFillColor = rRoot.GetSeriesLineAutoColor( nFormatIdx );
1286*b1cdbd2cSJim Jagielski         switch( nLineWeight )
1287*b1cdbd2cSJim Jagielski         {
1288*b1cdbd2cSJim Jagielski             case EXC_CHLINEFORMAT_HAIR:     aMarkerFmt.mnMarkerSize = EXC_CHMARKERFORMAT_HAIRSIZE;      break;
1289*b1cdbd2cSJim Jagielski             case EXC_CHLINEFORMAT_SINGLE:   aMarkerFmt.mnMarkerSize = EXC_CHMARKERFORMAT_SINGLESIZE;    break;
1290*b1cdbd2cSJim Jagielski             case EXC_CHLINEFORMAT_DOUBLE:   aMarkerFmt.mnMarkerSize = EXC_CHMARKERFORMAT_DOUBLESIZE;    break;
1291*b1cdbd2cSJim Jagielski             case EXC_CHLINEFORMAT_TRIPLE:   aMarkerFmt.mnMarkerSize = EXC_CHMARKERFORMAT_TRIPLESIZE;    break;
1292*b1cdbd2cSJim Jagielski             default:                        aMarkerFmt.mnMarkerSize = EXC_CHMARKERFORMAT_SINGLESIZE;
1293*b1cdbd2cSJim Jagielski         }
1294*b1cdbd2cSJim Jagielski         aMarkerFmt.mnMarkerType = XclChartHelper::GetAutoMarkerType( nFormatIdx );
1295*b1cdbd2cSJim Jagielski         rRoot.GetChartPropSetHelper().WriteMarkerProperties( rPropSet, aMarkerFmt );
1296*b1cdbd2cSJim Jagielski     }
1297*b1cdbd2cSJim Jagielski     else
1298*b1cdbd2cSJim Jagielski     {
1299*b1cdbd2cSJim Jagielski         rRoot.GetChartPropSetHelper().WriteMarkerProperties( rPropSet, maData );
1300*b1cdbd2cSJim Jagielski     }
1301*b1cdbd2cSJim Jagielski }
1302*b1cdbd2cSJim Jagielski 
ConvertColor(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet,sal_uInt16 nFormatIdx) const1303*b1cdbd2cSJim Jagielski void XclImpChMarkerFormat::ConvertColor( const XclImpChRoot& rRoot,
1304*b1cdbd2cSJim Jagielski         ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx ) const
1305*b1cdbd2cSJim Jagielski {
1306*b1cdbd2cSJim Jagielski     Color aLineColor = IsAuto() ? rRoot.GetSeriesLineAutoColor( nFormatIdx ) : maData.maFillColor;
1307*b1cdbd2cSJim Jagielski     rPropSet.SetColorProperty( EXC_CHPROP_COLOR, aLineColor );
1308*b1cdbd2cSJim Jagielski }
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1311*b1cdbd2cSJim Jagielski 
XclImpChPieFormat()1312*b1cdbd2cSJim Jagielski XclImpChPieFormat::XclImpChPieFormat() :
1313*b1cdbd2cSJim Jagielski     mnPieDist( 0 )
1314*b1cdbd2cSJim Jagielski {
1315*b1cdbd2cSJim Jagielski }
1316*b1cdbd2cSJim Jagielski 
ReadChPieFormat(XclImpStream & rStrm)1317*b1cdbd2cSJim Jagielski void XclImpChPieFormat::ReadChPieFormat( XclImpStream& rStrm )
1318*b1cdbd2cSJim Jagielski {
1319*b1cdbd2cSJim Jagielski     rStrm >> mnPieDist;
1320*b1cdbd2cSJim Jagielski }
1321*b1cdbd2cSJim Jagielski 
Convert(ScfPropertySet & rPropSet) const1322*b1cdbd2cSJim Jagielski void XclImpChPieFormat::Convert( ScfPropertySet& rPropSet ) const
1323*b1cdbd2cSJim Jagielski {
1324*b1cdbd2cSJim Jagielski     double fApiDist = ::std::min< double >( mnPieDist / 100.0, 1.0 );
1325*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_OFFSET, fApiDist );
1326*b1cdbd2cSJim Jagielski }
1327*b1cdbd2cSJim Jagielski 
1328*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1329*b1cdbd2cSJim Jagielski 
XclImpChSeriesFormat()1330*b1cdbd2cSJim Jagielski XclImpChSeriesFormat::XclImpChSeriesFormat() :
1331*b1cdbd2cSJim Jagielski     mnFlags( 0 )
1332*b1cdbd2cSJim Jagielski {
1333*b1cdbd2cSJim Jagielski }
1334*b1cdbd2cSJim Jagielski 
ReadChSeriesFormat(XclImpStream & rStrm)1335*b1cdbd2cSJim Jagielski void XclImpChSeriesFormat::ReadChSeriesFormat( XclImpStream& rStrm )
1336*b1cdbd2cSJim Jagielski {
1337*b1cdbd2cSJim Jagielski     rStrm >> mnFlags;
1338*b1cdbd2cSJim Jagielski }
1339*b1cdbd2cSJim Jagielski 
1340*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1341*b1cdbd2cSJim Jagielski 
ReadCh3dDataFormat(XclImpStream & rStrm)1342*b1cdbd2cSJim Jagielski void XclImpCh3dDataFormat::ReadCh3dDataFormat( XclImpStream& rStrm )
1343*b1cdbd2cSJim Jagielski {
1344*b1cdbd2cSJim Jagielski     rStrm >> maData.mnBase >> maData.mnTop;
1345*b1cdbd2cSJim Jagielski }
1346*b1cdbd2cSJim Jagielski 
Convert(ScfPropertySet & rPropSet) const1347*b1cdbd2cSJim Jagielski void XclImpCh3dDataFormat::Convert( ScfPropertySet& rPropSet ) const
1348*b1cdbd2cSJim Jagielski {
1349*b1cdbd2cSJim Jagielski     using namespace ::com::sun::star::chart2::DataPointGeometry3D;
1350*b1cdbd2cSJim Jagielski     sal_Int32 nApiType = (maData.mnBase == EXC_CH3DDATAFORMAT_RECT) ?
1351*b1cdbd2cSJim Jagielski         ((maData.mnTop == EXC_CH3DDATAFORMAT_STRAIGHT) ? CUBOID : PYRAMID) :
1352*b1cdbd2cSJim Jagielski         ((maData.mnTop == EXC_CH3DDATAFORMAT_STRAIGHT) ? CYLINDER : CONE);
1353*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_GEOMETRY3D, nApiType );
1354*b1cdbd2cSJim Jagielski }
1355*b1cdbd2cSJim Jagielski 
1356*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1357*b1cdbd2cSJim Jagielski 
XclImpChAttachedLabel(const XclImpChRoot & rRoot)1358*b1cdbd2cSJim Jagielski XclImpChAttachedLabel::XclImpChAttachedLabel( const XclImpChRoot& rRoot ) :
1359*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot ),
1360*b1cdbd2cSJim Jagielski     mnFlags( 0 )
1361*b1cdbd2cSJim Jagielski {
1362*b1cdbd2cSJim Jagielski }
1363*b1cdbd2cSJim Jagielski 
ReadChAttachedLabel(XclImpStream & rStrm)1364*b1cdbd2cSJim Jagielski void XclImpChAttachedLabel::ReadChAttachedLabel( XclImpStream& rStrm )
1365*b1cdbd2cSJim Jagielski {
1366*b1cdbd2cSJim Jagielski     rStrm >> mnFlags;
1367*b1cdbd2cSJim Jagielski }
1368*b1cdbd2cSJim Jagielski 
CreateDataLabel(XclImpChTextRef xParent) const1369*b1cdbd2cSJim Jagielski XclImpChTextRef XclImpChAttachedLabel::CreateDataLabel( XclImpChTextRef xParent ) const
1370*b1cdbd2cSJim Jagielski {
1371*b1cdbd2cSJim Jagielski     const sal_uInt16 EXC_CHATTLABEL_SHOWANYVALUE = EXC_CHATTLABEL_SHOWVALUE;
1372*b1cdbd2cSJim Jagielski     const sal_uInt16 EXC_CHATTLABEL_SHOWANYPERCENT = EXC_CHATTLABEL_SHOWPERCENT | EXC_CHATTLABEL_SHOWCATEGPERC;
1373*b1cdbd2cSJim Jagielski     const sal_uInt16 EXC_CHATTLABEL_SHOWANYCATEG = EXC_CHATTLABEL_SHOWCATEG | EXC_CHATTLABEL_SHOWCATEGPERC;
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski     XclImpChTextRef xLabel( xParent.is() ? new XclImpChText( *xParent ) : new XclImpChText( GetChRoot() ) );
1376*b1cdbd2cSJim Jagielski     xLabel->UpdateDataLabel(
1377*b1cdbd2cSJim Jagielski         ::get_flag( mnFlags, EXC_CHATTLABEL_SHOWANYCATEG ),
1378*b1cdbd2cSJim Jagielski         ::get_flag( mnFlags, EXC_CHATTLABEL_SHOWANYVALUE ),
1379*b1cdbd2cSJim Jagielski         ::get_flag( mnFlags, EXC_CHATTLABEL_SHOWANYPERCENT ) );
1380*b1cdbd2cSJim Jagielski     return xLabel;
1381*b1cdbd2cSJim Jagielski }
1382*b1cdbd2cSJim Jagielski 
1383*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1384*b1cdbd2cSJim Jagielski 
XclImpChDataFormat(const XclImpChRoot & rRoot)1385*b1cdbd2cSJim Jagielski XclImpChDataFormat::XclImpChDataFormat( const XclImpChRoot& rRoot ) :
1386*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
1387*b1cdbd2cSJim Jagielski {
1388*b1cdbd2cSJim Jagielski }
1389*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)1390*b1cdbd2cSJim Jagielski void XclImpChDataFormat::ReadHeaderRecord( XclImpStream& rStrm )
1391*b1cdbd2cSJim Jagielski {
1392*b1cdbd2cSJim Jagielski     rStrm   >> maData.maPointPos.mnPointIdx
1393*b1cdbd2cSJim Jagielski             >> maData.maPointPos.mnSeriesIdx
1394*b1cdbd2cSJim Jagielski             >> maData.mnFormatIdx
1395*b1cdbd2cSJim Jagielski             >> maData.mnFlags;
1396*b1cdbd2cSJim Jagielski }
1397*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)1398*b1cdbd2cSJim Jagielski void XclImpChDataFormat::ReadSubRecord( XclImpStream& rStrm )
1399*b1cdbd2cSJim Jagielski {
1400*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
1401*b1cdbd2cSJim Jagielski     {
1402*b1cdbd2cSJim Jagielski         case EXC_ID_CHMARKERFORMAT:
1403*b1cdbd2cSJim Jagielski             mxMarkerFmt.reset( new XclImpChMarkerFormat );
1404*b1cdbd2cSJim Jagielski             mxMarkerFmt->ReadChMarkerFormat( rStrm );
1405*b1cdbd2cSJim Jagielski         break;
1406*b1cdbd2cSJim Jagielski         case EXC_ID_CHPIEFORMAT:
1407*b1cdbd2cSJim Jagielski             mxPieFmt.reset( new XclImpChPieFormat );
1408*b1cdbd2cSJim Jagielski             mxPieFmt->ReadChPieFormat( rStrm );
1409*b1cdbd2cSJim Jagielski         break;
1410*b1cdbd2cSJim Jagielski         case EXC_ID_CHSERIESFORMAT:
1411*b1cdbd2cSJim Jagielski             mxSeriesFmt.reset( new XclImpChSeriesFormat );
1412*b1cdbd2cSJim Jagielski             mxSeriesFmt->ReadChSeriesFormat( rStrm );
1413*b1cdbd2cSJim Jagielski         break;
1414*b1cdbd2cSJim Jagielski         case EXC_ID_CH3DDATAFORMAT:
1415*b1cdbd2cSJim Jagielski             mx3dDataFmt.reset( new XclImpCh3dDataFormat );
1416*b1cdbd2cSJim Jagielski             mx3dDataFmt->ReadCh3dDataFormat( rStrm );
1417*b1cdbd2cSJim Jagielski         break;
1418*b1cdbd2cSJim Jagielski         case EXC_ID_CHATTACHEDLABEL:
1419*b1cdbd2cSJim Jagielski             mxAttLabel.reset( new XclImpChAttachedLabel( GetChRoot() ) );
1420*b1cdbd2cSJim Jagielski             mxAttLabel->ReadChAttachedLabel( rStrm );
1421*b1cdbd2cSJim Jagielski         break;
1422*b1cdbd2cSJim Jagielski         default:
1423*b1cdbd2cSJim Jagielski             XclImpChFrameBase::ReadSubRecord( rStrm );
1424*b1cdbd2cSJim Jagielski     }
1425*b1cdbd2cSJim Jagielski }
1426*b1cdbd2cSJim Jagielski 
SetPointPos(const XclChDataPointPos & rPointPos,sal_uInt16 nFormatIdx)1427*b1cdbd2cSJim Jagielski void XclImpChDataFormat::SetPointPos( const XclChDataPointPos& rPointPos, sal_uInt16 nFormatIdx )
1428*b1cdbd2cSJim Jagielski {
1429*b1cdbd2cSJim Jagielski     maData.maPointPos = rPointPos;
1430*b1cdbd2cSJim Jagielski     maData.mnFormatIdx = nFormatIdx;
1431*b1cdbd2cSJim Jagielski }
1432*b1cdbd2cSJim Jagielski 
UpdateGroupFormat(const XclChExtTypeInfo & rTypeInfo)1433*b1cdbd2cSJim Jagielski void XclImpChDataFormat::UpdateGroupFormat( const XclChExtTypeInfo& rTypeInfo )
1434*b1cdbd2cSJim Jagielski {
1435*b1cdbd2cSJim Jagielski     // remove formats not used for the current chart type
1436*b1cdbd2cSJim Jagielski     RemoveUnusedFormats( rTypeInfo );
1437*b1cdbd2cSJim Jagielski }
1438*b1cdbd2cSJim Jagielski 
UpdateSeriesFormat(const XclChExtTypeInfo & rTypeInfo,const XclImpChDataFormat * pGroupFmt)1439*b1cdbd2cSJim Jagielski void XclImpChDataFormat::UpdateSeriesFormat( const XclChExtTypeInfo& rTypeInfo, const XclImpChDataFormat* pGroupFmt )
1440*b1cdbd2cSJim Jagielski {
1441*b1cdbd2cSJim Jagielski     // update missing formats from passed chart type group format
1442*b1cdbd2cSJim Jagielski     if( pGroupFmt )
1443*b1cdbd2cSJim Jagielski     {
1444*b1cdbd2cSJim Jagielski         if( !mxLineFmt )
1445*b1cdbd2cSJim Jagielski             mxLineFmt = pGroupFmt->mxLineFmt;
1446*b1cdbd2cSJim Jagielski         if( !mxAreaFmt && !mxEscherFmt )
1447*b1cdbd2cSJim Jagielski         {
1448*b1cdbd2cSJim Jagielski             mxAreaFmt = pGroupFmt->mxAreaFmt;
1449*b1cdbd2cSJim Jagielski             mxEscherFmt = pGroupFmt->mxEscherFmt;
1450*b1cdbd2cSJim Jagielski         }
1451*b1cdbd2cSJim Jagielski         if( !mxMarkerFmt )
1452*b1cdbd2cSJim Jagielski             mxMarkerFmt = pGroupFmt->mxMarkerFmt;
1453*b1cdbd2cSJim Jagielski         if( !mxPieFmt )
1454*b1cdbd2cSJim Jagielski             mxPieFmt = pGroupFmt->mxPieFmt;
1455*b1cdbd2cSJim Jagielski         if( !mxSeriesFmt )
1456*b1cdbd2cSJim Jagielski             mxSeriesFmt = pGroupFmt->mxSeriesFmt;
1457*b1cdbd2cSJim Jagielski         if( !mx3dDataFmt )
1458*b1cdbd2cSJim Jagielski             mx3dDataFmt = pGroupFmt->mx3dDataFmt;
1459*b1cdbd2cSJim Jagielski         if( !mxAttLabel )
1460*b1cdbd2cSJim Jagielski             mxAttLabel = pGroupFmt->mxAttLabel;
1461*b1cdbd2cSJim Jagielski     }
1462*b1cdbd2cSJim Jagielski 
1463*b1cdbd2cSJim Jagielski     /*  Create missing but required formats. Existing line, area, and marker
1464*b1cdbd2cSJim Jagielski         format objects are needed to create automatic series formatting. */
1465*b1cdbd2cSJim Jagielski     if( !mxLineFmt )
1466*b1cdbd2cSJim Jagielski         mxLineFmt.reset( new XclImpChLineFormat );
1467*b1cdbd2cSJim Jagielski     if( !mxAreaFmt && !mxEscherFmt )
1468*b1cdbd2cSJim Jagielski         mxAreaFmt.reset( new XclImpChAreaFormat );
1469*b1cdbd2cSJim Jagielski     if( !mxMarkerFmt )
1470*b1cdbd2cSJim Jagielski         mxMarkerFmt.reset( new XclImpChMarkerFormat );
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski     // remove formats not used for the current chart type
1473*b1cdbd2cSJim Jagielski     RemoveUnusedFormats( rTypeInfo );
1474*b1cdbd2cSJim Jagielski     // update data label
1475*b1cdbd2cSJim Jagielski     UpdateDataLabel( pGroupFmt );
1476*b1cdbd2cSJim Jagielski }
1477*b1cdbd2cSJim Jagielski 
UpdatePointFormat(const XclChExtTypeInfo & rTypeInfo,const XclImpChDataFormat * pSeriesFmt)1478*b1cdbd2cSJim Jagielski void XclImpChDataFormat::UpdatePointFormat( const XclChExtTypeInfo& rTypeInfo, const XclImpChDataFormat* pSeriesFmt )
1479*b1cdbd2cSJim Jagielski {
1480*b1cdbd2cSJim Jagielski     // remove formats if they are automatic in this and in the passed series format
1481*b1cdbd2cSJim Jagielski     if( pSeriesFmt )
1482*b1cdbd2cSJim Jagielski     {
1483*b1cdbd2cSJim Jagielski         if( IsAutoLine() && pSeriesFmt->IsAutoLine() )
1484*b1cdbd2cSJim Jagielski             mxLineFmt.reset();
1485*b1cdbd2cSJim Jagielski         if( IsAutoArea() && pSeriesFmt->IsAutoArea() )
1486*b1cdbd2cSJim Jagielski             mxAreaFmt.reset();
1487*b1cdbd2cSJim Jagielski         if( IsAutoMarker() && pSeriesFmt->IsAutoMarker() )
1488*b1cdbd2cSJim Jagielski             mxMarkerFmt.reset();
1489*b1cdbd2cSJim Jagielski         mxSeriesFmt.reset();
1490*b1cdbd2cSJim Jagielski     }
1491*b1cdbd2cSJim Jagielski 
1492*b1cdbd2cSJim Jagielski     // Excel ignores 3D bar format for single data points
1493*b1cdbd2cSJim Jagielski     mx3dDataFmt.reset();
1494*b1cdbd2cSJim Jagielski     // remove point line formats for linear chart types, TODO: implement in OOChart
1495*b1cdbd2cSJim Jagielski     if( !rTypeInfo.IsSeriesFrameFormat() )
1496*b1cdbd2cSJim Jagielski         mxLineFmt.reset();
1497*b1cdbd2cSJim Jagielski 
1498*b1cdbd2cSJim Jagielski     // remove formats not used for the current chart type
1499*b1cdbd2cSJim Jagielski     RemoveUnusedFormats( rTypeInfo );
1500*b1cdbd2cSJim Jagielski     // update data label
1501*b1cdbd2cSJim Jagielski     UpdateDataLabel( pSeriesFmt );
1502*b1cdbd2cSJim Jagielski }
1503*b1cdbd2cSJim Jagielski 
UpdateTrendLineFormat()1504*b1cdbd2cSJim Jagielski void XclImpChDataFormat::UpdateTrendLineFormat()
1505*b1cdbd2cSJim Jagielski {
1506*b1cdbd2cSJim Jagielski     if( !mxLineFmt )
1507*b1cdbd2cSJim Jagielski         mxLineFmt.reset( new XclImpChLineFormat );
1508*b1cdbd2cSJim Jagielski     mxAreaFmt.reset();
1509*b1cdbd2cSJim Jagielski     mxEscherFmt.reset();
1510*b1cdbd2cSJim Jagielski     mxMarkerFmt.reset();
1511*b1cdbd2cSJim Jagielski     mxPieFmt.reset();
1512*b1cdbd2cSJim Jagielski     mxSeriesFmt.reset();
1513*b1cdbd2cSJim Jagielski     mx3dDataFmt.reset();
1514*b1cdbd2cSJim Jagielski     mxAttLabel.reset();
1515*b1cdbd2cSJim Jagielski     // update data label
1516*b1cdbd2cSJim Jagielski     UpdateDataLabel( 0 );
1517*b1cdbd2cSJim Jagielski }
1518*b1cdbd2cSJim Jagielski 
Convert(ScfPropertySet & rPropSet,const XclChExtTypeInfo & rTypeInfo) const1519*b1cdbd2cSJim Jagielski void XclImpChDataFormat::Convert( ScfPropertySet& rPropSet, const XclChExtTypeInfo& rTypeInfo ) const
1520*b1cdbd2cSJim Jagielski {
1521*b1cdbd2cSJim Jagielski     /*  Line and area format.
1522*b1cdbd2cSJim Jagielski         #i71810# If the data points are filled with bitmaps, textures, or
1523*b1cdbd2cSJim Jagielski         patterns, then only bar charts will use the CHPICFORMAT record to
1524*b1cdbd2cSJim Jagielski         determine stacking/streching mode. All other chart types ignore this
1525*b1cdbd2cSJim Jagielski         record and always use the property 'fill-type' from the DFF property
1526*b1cdbd2cSJim Jagielski         set (streched for bitmaps, and stacked for textures and patterns). */
1527*b1cdbd2cSJim Jagielski     bool bUsePicFmt = rTypeInfo.meTypeCateg == EXC_CHTYPECATEG_BAR;
1528*b1cdbd2cSJim Jagielski     ConvertFrameBase( GetChRoot(), rPropSet, rTypeInfo.GetSeriesObjectType(), maData.mnFormatIdx, bUsePicFmt );
1529*b1cdbd2cSJim Jagielski 
1530*b1cdbd2cSJim Jagielski #if EXC_CHART2_3DBAR_HAIRLINES_ONLY
1531*b1cdbd2cSJim Jagielski     // #i83151# only hair lines in 3D charts with filled data points
1532*b1cdbd2cSJim Jagielski     if( rTypeInfo.mb3dChart && rTypeInfo.IsSeriesFrameFormat() && mxLineFmt.is() && mxLineFmt->HasLine() )
1533*b1cdbd2cSJim Jagielski         rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "BorderWidth" ), 0 );
1534*b1cdbd2cSJim Jagielski #endif
1535*b1cdbd2cSJim Jagielski 
1536*b1cdbd2cSJim Jagielski     // other formatting
1537*b1cdbd2cSJim Jagielski     if( mxMarkerFmt.is() )
1538*b1cdbd2cSJim Jagielski         mxMarkerFmt->Convert( GetChRoot(), rPropSet, maData.mnFormatIdx, GetLineWeight() );
1539*b1cdbd2cSJim Jagielski     if( mxPieFmt.is() )
1540*b1cdbd2cSJim Jagielski         mxPieFmt->Convert( rPropSet );
1541*b1cdbd2cSJim Jagielski     if( mx3dDataFmt.is() )
1542*b1cdbd2cSJim Jagielski         mx3dDataFmt->Convert( rPropSet );
1543*b1cdbd2cSJim Jagielski     if( mxLabel.is() )
1544*b1cdbd2cSJim Jagielski         mxLabel->ConvertDataLabel( rPropSet, rTypeInfo );
1545*b1cdbd2cSJim Jagielski 
1546*b1cdbd2cSJim Jagielski     // 3D settings
1547*b1cdbd2cSJim Jagielski     rPropSet.SetProperty< sal_Int16 >( EXC_CHPROP_PERCENTDIAGONAL, 0 );
1548*b1cdbd2cSJim Jagielski 
1549*b1cdbd2cSJim Jagielski     /*  Special case: set marker color as line color, if series line is not
1550*b1cdbd2cSJim Jagielski         visible. This makes the color visible in the marker area.
1551*b1cdbd2cSJim Jagielski         TODO: remove this if OOChart supports own colors in markers. */
1552*b1cdbd2cSJim Jagielski     if( !rTypeInfo.IsSeriesFrameFormat() && !HasLine() && mxMarkerFmt.is() )
1553*b1cdbd2cSJim Jagielski         mxMarkerFmt->ConvertColor( GetChRoot(), rPropSet, maData.mnFormatIdx );
1554*b1cdbd2cSJim Jagielski }
1555*b1cdbd2cSJim Jagielski 
ConvertLine(ScfPropertySet & rPropSet,XclChObjectType eObjType) const1556*b1cdbd2cSJim Jagielski void XclImpChDataFormat::ConvertLine( ScfPropertySet& rPropSet, XclChObjectType eObjType ) const
1557*b1cdbd2cSJim Jagielski {
1558*b1cdbd2cSJim Jagielski     ConvertLineBase( GetChRoot(), rPropSet, eObjType );
1559*b1cdbd2cSJim Jagielski }
1560*b1cdbd2cSJim Jagielski 
ConvertArea(ScfPropertySet & rPropSet,sal_uInt16 nFormatIdx,bool bUsePicFmt) const1561*b1cdbd2cSJim Jagielski void XclImpChDataFormat::ConvertArea( ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx, bool bUsePicFmt ) const
1562*b1cdbd2cSJim Jagielski {
1563*b1cdbd2cSJim Jagielski     ConvertAreaBase( GetChRoot(), rPropSet, EXC_CHOBJTYPE_FILLEDSERIES, nFormatIdx, bUsePicFmt );
1564*b1cdbd2cSJim Jagielski }
1565*b1cdbd2cSJim Jagielski 
RemoveUnusedFormats(const XclChExtTypeInfo & rTypeInfo)1566*b1cdbd2cSJim Jagielski void XclImpChDataFormat::RemoveUnusedFormats( const XclChExtTypeInfo& rTypeInfo )
1567*b1cdbd2cSJim Jagielski {
1568*b1cdbd2cSJim Jagielski     // data point marker only in linear 2D charts
1569*b1cdbd2cSJim Jagielski     if( rTypeInfo.IsSeriesFrameFormat() )
1570*b1cdbd2cSJim Jagielski         mxMarkerFmt.reset();
1571*b1cdbd2cSJim Jagielski     // pie format only in pie/donut charts
1572*b1cdbd2cSJim Jagielski     if( rTypeInfo.meTypeCateg != EXC_CHTYPECATEG_PIE )
1573*b1cdbd2cSJim Jagielski         mxPieFmt.reset();
1574*b1cdbd2cSJim Jagielski     // 3D format only in 3D bar charts
1575*b1cdbd2cSJim Jagielski     if( !rTypeInfo.mb3dChart || (rTypeInfo.meTypeCateg != EXC_CHTYPECATEG_BAR) )
1576*b1cdbd2cSJim Jagielski         mx3dDataFmt.reset();
1577*b1cdbd2cSJim Jagielski }
1578*b1cdbd2cSJim Jagielski 
UpdateDataLabel(const XclImpChDataFormat * pParentFmt)1579*b1cdbd2cSJim Jagielski void XclImpChDataFormat::UpdateDataLabel( const XclImpChDataFormat* pParentFmt )
1580*b1cdbd2cSJim Jagielski {
1581*b1cdbd2cSJim Jagielski     /*  CHTEXT groups linked to data labels override existing CHATTACHEDLABEL
1582*b1cdbd2cSJim Jagielski         records. Only if there is a CHATTACHEDLABEL record without a CHTEXT
1583*b1cdbd2cSJim Jagielski         group, the contents of the CHATTACHEDLABEL record are used. In this
1584*b1cdbd2cSJim Jagielski         case a new CHTEXT group is created and filled with the settings from
1585*b1cdbd2cSJim Jagielski         the CHATTACHEDLABEL record. */
1586*b1cdbd2cSJim Jagielski     XclImpChTextRef xDefText;
1587*b1cdbd2cSJim Jagielski     if( pParentFmt )
1588*b1cdbd2cSJim Jagielski         xDefText = pParentFmt->GetDataLabel();
1589*b1cdbd2cSJim Jagielski     if( !xDefText )
1590*b1cdbd2cSJim Jagielski         xDefText = GetChartData().GetDefaultText( EXC_CHTEXTTYPE_DATALABEL );
1591*b1cdbd2cSJim Jagielski     if( mxLabel.is() )
1592*b1cdbd2cSJim Jagielski         mxLabel->UpdateText( xDefText.get() );
1593*b1cdbd2cSJim Jagielski     else if( mxAttLabel.is() )
1594*b1cdbd2cSJim Jagielski         mxLabel = mxAttLabel->CreateDataLabel( xDefText );
1595*b1cdbd2cSJim Jagielski }
1596*b1cdbd2cSJim Jagielski 
1597*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1598*b1cdbd2cSJim Jagielski 
XclImpChSerTrendLine(const XclImpChRoot & rRoot)1599*b1cdbd2cSJim Jagielski XclImpChSerTrendLine::XclImpChSerTrendLine( const XclImpChRoot& rRoot ) :
1600*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
1601*b1cdbd2cSJim Jagielski {
1602*b1cdbd2cSJim Jagielski }
1603*b1cdbd2cSJim Jagielski 
ReadChSerTrendLine(XclImpStream & rStrm)1604*b1cdbd2cSJim Jagielski void XclImpChSerTrendLine::ReadChSerTrendLine( XclImpStream& rStrm )
1605*b1cdbd2cSJim Jagielski {
1606*b1cdbd2cSJim Jagielski     rStrm   >> maData.mnLineType
1607*b1cdbd2cSJim Jagielski             >> maData.mnOrder
1608*b1cdbd2cSJim Jagielski             >> maData.mfIntercept
1609*b1cdbd2cSJim Jagielski             >> maData.mnShowEquation
1610*b1cdbd2cSJim Jagielski             >> maData.mnShowRSquared
1611*b1cdbd2cSJim Jagielski             >> maData.mfForecastFor
1612*b1cdbd2cSJim Jagielski             >> maData.mfForecastBack;
1613*b1cdbd2cSJim Jagielski }
1614*b1cdbd2cSJim Jagielski 
CreateRegressionCurve() const1615*b1cdbd2cSJim Jagielski Reference< XRegressionCurve > XclImpChSerTrendLine::CreateRegressionCurve() const
1616*b1cdbd2cSJim Jagielski {
1617*b1cdbd2cSJim Jagielski     // trend line type
1618*b1cdbd2cSJim Jagielski     OUString aService;
1619*b1cdbd2cSJim Jagielski     switch( maData.mnLineType )
1620*b1cdbd2cSJim Jagielski     {
1621*b1cdbd2cSJim Jagielski         case EXC_CHSERTREND_POLYNOMIAL:
1622*b1cdbd2cSJim Jagielski             // TODO: only linear trend lines are supported by OOChart (#i20819#)
1623*b1cdbd2cSJim Jagielski             if( maData.mnOrder == 1 )
1624*b1cdbd2cSJim Jagielski                 aService = SERVICE_CHART2_LINEARREGCURVE;
1625*b1cdbd2cSJim Jagielski         break;
1626*b1cdbd2cSJim Jagielski         case EXC_CHSERTREND_EXPONENTIAL:
1627*b1cdbd2cSJim Jagielski             aService = SERVICE_CHART2_EXPREGCURVE;
1628*b1cdbd2cSJim Jagielski         break;
1629*b1cdbd2cSJim Jagielski         case EXC_CHSERTREND_LOGARITHMIC:
1630*b1cdbd2cSJim Jagielski             aService = SERVICE_CHART2_LOGREGCURVE;
1631*b1cdbd2cSJim Jagielski         break;
1632*b1cdbd2cSJim Jagielski         case EXC_CHSERTREND_POWER:
1633*b1cdbd2cSJim Jagielski             aService = SERVICE_CHART2_POTREGCURVE;
1634*b1cdbd2cSJim Jagielski         break;
1635*b1cdbd2cSJim Jagielski     }
1636*b1cdbd2cSJim Jagielski     Reference< XRegressionCurve > xRegCurve;
1637*b1cdbd2cSJim Jagielski     if( aService.getLength() > 0 )
1638*b1cdbd2cSJim Jagielski         xRegCurve.set( ScfApiHelper::CreateInstance( aService ), UNO_QUERY );
1639*b1cdbd2cSJim Jagielski 
1640*b1cdbd2cSJim Jagielski     // trend line formatting
1641*b1cdbd2cSJim Jagielski     if( xRegCurve.is() && mxDataFmt.is() )
1642*b1cdbd2cSJim Jagielski     {
1643*b1cdbd2cSJim Jagielski         ScfPropertySet aPropSet( xRegCurve );
1644*b1cdbd2cSJim Jagielski         mxDataFmt->ConvertLine( aPropSet, EXC_CHOBJTYPE_TRENDLINE );
1645*b1cdbd2cSJim Jagielski 
1646*b1cdbd2cSJim Jagielski         // #i83100# show equation and correlation coefficient
1647*b1cdbd2cSJim Jagielski         ScfPropertySet aLabelProp( xRegCurve->getEquationProperties() );
1648*b1cdbd2cSJim Jagielski         aLabelProp.SetBoolProperty( EXC_CHPROP_SHOWEQUATION, maData.mnShowEquation != 0 );
1649*b1cdbd2cSJim Jagielski         aLabelProp.SetBoolProperty( EXC_CHPROP_SHOWCORRELATION, maData.mnShowRSquared != 0 );
1650*b1cdbd2cSJim Jagielski 
1651*b1cdbd2cSJim Jagielski         // #i83100# formatting of the equation text box
1652*b1cdbd2cSJim Jagielski         if( const XclImpChText* pLabel = mxDataFmt->GetDataLabel().get() )
1653*b1cdbd2cSJim Jagielski         {
1654*b1cdbd2cSJim Jagielski             pLabel->ConvertFont( aLabelProp );
1655*b1cdbd2cSJim Jagielski             pLabel->ConvertFrame( aLabelProp );
1656*b1cdbd2cSJim Jagielski             pLabel->ConvertNumFmt( aLabelProp, false );
1657*b1cdbd2cSJim Jagielski         }
1658*b1cdbd2cSJim Jagielski     }
1659*b1cdbd2cSJim Jagielski 
1660*b1cdbd2cSJim Jagielski     // missing features
1661*b1cdbd2cSJim Jagielski     // #i20819# polynomial trend lines
1662*b1cdbd2cSJim Jagielski     // #i66819# moving average trend lines
1663*b1cdbd2cSJim Jagielski     // #i5085# manual trend line size
1664*b1cdbd2cSJim Jagielski     // #i34093# manual crossing point
1665*b1cdbd2cSJim Jagielski 
1666*b1cdbd2cSJim Jagielski     return xRegCurve;
1667*b1cdbd2cSJim Jagielski }
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1670*b1cdbd2cSJim Jagielski 
XclImpChSerErrorBar(const XclImpChRoot & rRoot)1671*b1cdbd2cSJim Jagielski XclImpChSerErrorBar::XclImpChSerErrorBar( const XclImpChRoot& rRoot ) :
1672*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
1673*b1cdbd2cSJim Jagielski {
1674*b1cdbd2cSJim Jagielski }
1675*b1cdbd2cSJim Jagielski 
ReadChSerErrorBar(XclImpStream & rStrm)1676*b1cdbd2cSJim Jagielski void XclImpChSerErrorBar::ReadChSerErrorBar( XclImpStream& rStrm )
1677*b1cdbd2cSJim Jagielski {
1678*b1cdbd2cSJim Jagielski     rStrm >> maData.mnBarType >> maData.mnSourceType >> maData.mnLineEnd;
1679*b1cdbd2cSJim Jagielski     rStrm.Ignore( 1 );
1680*b1cdbd2cSJim Jagielski     rStrm >> maData.mfValue >> maData.mnValueCount;
1681*b1cdbd2cSJim Jagielski }
1682*b1cdbd2cSJim Jagielski 
SetSeriesData(XclImpChSourceLinkRef xValueLink,XclImpChDataFormatRef xDataFmt)1683*b1cdbd2cSJim Jagielski void XclImpChSerErrorBar::SetSeriesData( XclImpChSourceLinkRef xValueLink, XclImpChDataFormatRef xDataFmt )
1684*b1cdbd2cSJim Jagielski {
1685*b1cdbd2cSJim Jagielski     mxValueLink = xValueLink;
1686*b1cdbd2cSJim Jagielski     mxDataFmt = xDataFmt;
1687*b1cdbd2cSJim Jagielski }
1688*b1cdbd2cSJim Jagielski 
CreateValueSequence() const1689*b1cdbd2cSJim Jagielski Reference< XLabeledDataSequence > XclImpChSerErrorBar::CreateValueSequence() const
1690*b1cdbd2cSJim Jagielski {
1691*b1cdbd2cSJim Jagielski     return lclCreateLabeledDataSequence( mxValueLink, XclChartHelper::GetErrorBarValuesRole( maData.mnBarType ) );
1692*b1cdbd2cSJim Jagielski }
1693*b1cdbd2cSJim Jagielski 
CreateErrorBar(const XclImpChSerErrorBar * pPosBar,const XclImpChSerErrorBar * pNegBar)1694*b1cdbd2cSJim Jagielski Reference< XPropertySet > XclImpChSerErrorBar::CreateErrorBar( const XclImpChSerErrorBar* pPosBar, const XclImpChSerErrorBar* pNegBar )
1695*b1cdbd2cSJim Jagielski {
1696*b1cdbd2cSJim Jagielski     Reference< XPropertySet > xErrorBar;
1697*b1cdbd2cSJim Jagielski 
1698*b1cdbd2cSJim Jagielski     if( const XclImpChSerErrorBar* pPrimaryBar = pPosBar ? pPosBar : pNegBar )
1699*b1cdbd2cSJim Jagielski     {
1700*b1cdbd2cSJim Jagielski         xErrorBar.set( ScfApiHelper::CreateInstance( SERVICE_CHART2_ERRORBAR ), UNO_QUERY );
1701*b1cdbd2cSJim Jagielski         ScfPropertySet aBarProp( xErrorBar );
1702*b1cdbd2cSJim Jagielski 
1703*b1cdbd2cSJim Jagielski         // plus/minus bars visible?
1704*b1cdbd2cSJim Jagielski         aBarProp.SetBoolProperty( EXC_CHPROP_SHOWPOSITIVEERROR, pPosBar != 0 );
1705*b1cdbd2cSJim Jagielski         aBarProp.SetBoolProperty( EXC_CHPROP_SHOWNEGATIVEERROR, pNegBar != 0 );
1706*b1cdbd2cSJim Jagielski 
1707*b1cdbd2cSJim Jagielski         // type of displayed error
1708*b1cdbd2cSJim Jagielski         switch( pPrimaryBar->maData.mnSourceType )
1709*b1cdbd2cSJim Jagielski         {
1710*b1cdbd2cSJim Jagielski             case EXC_CHSERERR_PERCENT:
1711*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_ERRORBARSTYLE, cssc::ErrorBarStyle::RELATIVE );
1712*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_POSITIVEERROR, pPrimaryBar->maData.mfValue );
1713*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_NEGATIVEERROR, pPrimaryBar->maData.mfValue );
1714*b1cdbd2cSJim Jagielski             break;
1715*b1cdbd2cSJim Jagielski             case EXC_CHSERERR_FIXED:
1716*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_ERRORBARSTYLE, cssc::ErrorBarStyle::ABSOLUTE );
1717*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_POSITIVEERROR, pPrimaryBar->maData.mfValue );
1718*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_NEGATIVEERROR, pPrimaryBar->maData.mfValue );
1719*b1cdbd2cSJim Jagielski             break;
1720*b1cdbd2cSJim Jagielski             case EXC_CHSERERR_STDDEV:
1721*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_ERRORBARSTYLE, cssc::ErrorBarStyle::STANDARD_DEVIATION );
1722*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_WEIGHT, pPrimaryBar->maData.mfValue );
1723*b1cdbd2cSJim Jagielski             break;
1724*b1cdbd2cSJim Jagielski             case EXC_CHSERERR_STDERR:
1725*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_ERRORBARSTYLE, cssc::ErrorBarStyle::STANDARD_ERROR );
1726*b1cdbd2cSJim Jagielski             break;
1727*b1cdbd2cSJim Jagielski             case EXC_CHSERERR_CUSTOM:
1728*b1cdbd2cSJim Jagielski             {
1729*b1cdbd2cSJim Jagielski                 aBarProp.SetProperty( EXC_CHPROP_ERRORBARSTYLE, cssc::ErrorBarStyle::FROM_DATA );
1730*b1cdbd2cSJim Jagielski                 // attach data sequences to erorr bar
1731*b1cdbd2cSJim Jagielski                 Reference< XDataSink > xDataSink( xErrorBar, UNO_QUERY );
1732*b1cdbd2cSJim Jagielski                 if( xDataSink.is() )
1733*b1cdbd2cSJim Jagielski                 {
1734*b1cdbd2cSJim Jagielski                     // create vector of all value sequences
1735*b1cdbd2cSJim Jagielski                     ::std::vector< Reference< XLabeledDataSequence > > aLabeledSeqVec;
1736*b1cdbd2cSJim Jagielski                     // add positive values
1737*b1cdbd2cSJim Jagielski                     if( pPosBar )
1738*b1cdbd2cSJim Jagielski                     {
1739*b1cdbd2cSJim Jagielski                         Reference< XLabeledDataSequence > xValueSeq = pPosBar->CreateValueSequence();
1740*b1cdbd2cSJim Jagielski                         if( xValueSeq.is() )
1741*b1cdbd2cSJim Jagielski                             aLabeledSeqVec.push_back( xValueSeq );
1742*b1cdbd2cSJim Jagielski                     }
1743*b1cdbd2cSJim Jagielski                     // add negative values
1744*b1cdbd2cSJim Jagielski                     if( pNegBar )
1745*b1cdbd2cSJim Jagielski                     {
1746*b1cdbd2cSJim Jagielski                         Reference< XLabeledDataSequence > xValueSeq = pNegBar->CreateValueSequence();
1747*b1cdbd2cSJim Jagielski                         if( xValueSeq.is() )
1748*b1cdbd2cSJim Jagielski                             aLabeledSeqVec.push_back( xValueSeq );
1749*b1cdbd2cSJim Jagielski                     }
1750*b1cdbd2cSJim Jagielski                     // attach labeled data sequences to series
1751*b1cdbd2cSJim Jagielski                     if( aLabeledSeqVec.empty() )
1752*b1cdbd2cSJim Jagielski                         xErrorBar.clear();
1753*b1cdbd2cSJim Jagielski                     else
1754*b1cdbd2cSJim Jagielski                         xDataSink->setData( ScfApiHelper::VectorToSequence( aLabeledSeqVec ) );
1755*b1cdbd2cSJim Jagielski                 }
1756*b1cdbd2cSJim Jagielski             }
1757*b1cdbd2cSJim Jagielski             break;
1758*b1cdbd2cSJim Jagielski             default:
1759*b1cdbd2cSJim Jagielski                 xErrorBar.clear();
1760*b1cdbd2cSJim Jagielski         }
1761*b1cdbd2cSJim Jagielski 
1762*b1cdbd2cSJim Jagielski         // error bar formatting
1763*b1cdbd2cSJim Jagielski         if( pPrimaryBar->mxDataFmt.is() && xErrorBar.is() )
1764*b1cdbd2cSJim Jagielski             pPrimaryBar->mxDataFmt->ConvertLine( aBarProp, EXC_CHOBJTYPE_ERRORBAR );
1765*b1cdbd2cSJim Jagielski     }
1766*b1cdbd2cSJim Jagielski 
1767*b1cdbd2cSJim Jagielski     return xErrorBar;
1768*b1cdbd2cSJim Jagielski }
1769*b1cdbd2cSJim Jagielski 
1770*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1771*b1cdbd2cSJim Jagielski 
XclImpChSeries(const XclImpChRoot & rRoot,sal_uInt16 nSeriesIdx)1772*b1cdbd2cSJim Jagielski XclImpChSeries::XclImpChSeries( const XclImpChRoot& rRoot, sal_uInt16 nSeriesIdx ) :
1773*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot ),
1774*b1cdbd2cSJim Jagielski     mnGroupIdx( EXC_CHSERGROUP_NONE ),
1775*b1cdbd2cSJim Jagielski     mnSeriesIdx( nSeriesIdx ),
1776*b1cdbd2cSJim Jagielski     mnParentIdx( EXC_CHSERIES_INVALID )
1777*b1cdbd2cSJim Jagielski {
1778*b1cdbd2cSJim Jagielski }
1779*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)1780*b1cdbd2cSJim Jagielski void XclImpChSeries::ReadHeaderRecord( XclImpStream& rStrm )
1781*b1cdbd2cSJim Jagielski {
1782*b1cdbd2cSJim Jagielski     rStrm >> maData.mnCategType >> maData.mnValueType >> maData.mnCategCount >> maData.mnValueCount;
1783*b1cdbd2cSJim Jagielski     if( GetBiff() == EXC_BIFF8 )
1784*b1cdbd2cSJim Jagielski         rStrm >> maData.mnBubbleType >> maData.mnBubbleCount;
1785*b1cdbd2cSJim Jagielski }
1786*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)1787*b1cdbd2cSJim Jagielski void XclImpChSeries::ReadSubRecord( XclImpStream& rStrm )
1788*b1cdbd2cSJim Jagielski {
1789*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
1790*b1cdbd2cSJim Jagielski     {
1791*b1cdbd2cSJim Jagielski         case EXC_ID_CHSOURCELINK:
1792*b1cdbd2cSJim Jagielski             ReadChSourceLink( rStrm );
1793*b1cdbd2cSJim Jagielski         break;
1794*b1cdbd2cSJim Jagielski         case EXC_ID_CHDATAFORMAT:
1795*b1cdbd2cSJim Jagielski             ReadChDataFormat( rStrm );
1796*b1cdbd2cSJim Jagielski         break;
1797*b1cdbd2cSJim Jagielski         case EXC_ID_CHSERGROUP:
1798*b1cdbd2cSJim Jagielski             rStrm >> mnGroupIdx;
1799*b1cdbd2cSJim Jagielski         break;
1800*b1cdbd2cSJim Jagielski         case EXC_ID_CHSERPARENT:
1801*b1cdbd2cSJim Jagielski             ReadChSerParent( rStrm );
1802*b1cdbd2cSJim Jagielski         break;
1803*b1cdbd2cSJim Jagielski         case EXC_ID_CHSERTRENDLINE:
1804*b1cdbd2cSJim Jagielski             ReadChSerTrendLine( rStrm );
1805*b1cdbd2cSJim Jagielski         break;
1806*b1cdbd2cSJim Jagielski         case EXC_ID_CHSERERRORBAR:
1807*b1cdbd2cSJim Jagielski             ReadChSerErrorBar( rStrm );
1808*b1cdbd2cSJim Jagielski         break;
1809*b1cdbd2cSJim Jagielski     }
1810*b1cdbd2cSJim Jagielski }
1811*b1cdbd2cSJim Jagielski 
SetDataFormat(XclImpChDataFormatRef xDataFmt)1812*b1cdbd2cSJim Jagielski void XclImpChSeries::SetDataFormat( XclImpChDataFormatRef xDataFmt )
1813*b1cdbd2cSJim Jagielski {
1814*b1cdbd2cSJim Jagielski     if( xDataFmt.is() )
1815*b1cdbd2cSJim Jagielski     {
1816*b1cdbd2cSJim Jagielski         XclImpChDataFormatRef* pxDataFmt = GetDataFormatRef( xDataFmt->GetPointPos().mnPointIdx );
1817*b1cdbd2cSJim Jagielski         // do not overwrite existing data format
1818*b1cdbd2cSJim Jagielski         if( pxDataFmt && !*pxDataFmt )
1819*b1cdbd2cSJim Jagielski         {
1820*b1cdbd2cSJim Jagielski             *pxDataFmt = xDataFmt;
1821*b1cdbd2cSJim Jagielski             // #i51639# register series format index at chart type group
1822*b1cdbd2cSJim Jagielski             if( (pxDataFmt == &mxSeriesFmt) && !HasParentSeries() )
1823*b1cdbd2cSJim Jagielski                 if( XclImpChTypeGroup* pTypeGroup = GetChartData().GetTypeGroup( mnGroupIdx ).get() )
1824*b1cdbd2cSJim Jagielski                     pTypeGroup->SetUsedFormatIndex( xDataFmt->GetFormatIdx() );
1825*b1cdbd2cSJim Jagielski         }
1826*b1cdbd2cSJim Jagielski     }
1827*b1cdbd2cSJim Jagielski }
1828*b1cdbd2cSJim Jagielski 
SetDataLabel(XclImpChTextRef xLabel)1829*b1cdbd2cSJim Jagielski void XclImpChSeries::SetDataLabel( XclImpChTextRef xLabel )
1830*b1cdbd2cSJim Jagielski {
1831*b1cdbd2cSJim Jagielski     if( xLabel.is() )
1832*b1cdbd2cSJim Jagielski     {
1833*b1cdbd2cSJim Jagielski         XclImpChTextRef* pxLabel = GetDataLabelRef( xLabel->GetPointPos().mnPointIdx );
1834*b1cdbd2cSJim Jagielski         if( pxLabel && !*pxLabel )
1835*b1cdbd2cSJim Jagielski             *pxLabel = xLabel;
1836*b1cdbd2cSJim Jagielski     }
1837*b1cdbd2cSJim Jagielski }
1838*b1cdbd2cSJim Jagielski 
AddChildSeries(const XclImpChSeries & rSeries)1839*b1cdbd2cSJim Jagielski void XclImpChSeries::AddChildSeries( const XclImpChSeries& rSeries )
1840*b1cdbd2cSJim Jagielski {
1841*b1cdbd2cSJim Jagielski     DBG_ASSERT( !HasParentSeries(), "XclImpChSeries::AddChildSeries - not allowed for child series" );
1842*b1cdbd2cSJim Jagielski 
1843*b1cdbd2cSJim Jagielski     /*  In Excel, trend lines and error bars are stored as own series. In Calc,
1844*b1cdbd2cSJim Jagielski         these are properties of the parent series. This function adds the
1845*b1cdbd2cSJim Jagielski         settings of the passed series to this series. */
1846*b1cdbd2cSJim Jagielski     maTrendLines.insert( maTrendLines.end(), rSeries.maTrendLines.begin(), rSeries.maTrendLines.end() );
1847*b1cdbd2cSJim Jagielski     maErrorBars.insert( rSeries.maErrorBars.begin(), rSeries.maErrorBars.end() );
1848*b1cdbd2cSJim Jagielski }
1849*b1cdbd2cSJim Jagielski 
FinalizeDataFormats()1850*b1cdbd2cSJim Jagielski void XclImpChSeries::FinalizeDataFormats()
1851*b1cdbd2cSJim Jagielski {
1852*b1cdbd2cSJim Jagielski     if( HasParentSeries() )
1853*b1cdbd2cSJim Jagielski     {
1854*b1cdbd2cSJim Jagielski         // *** series is a child series, e.g. trend line or error bar ***
1855*b1cdbd2cSJim Jagielski 
1856*b1cdbd2cSJim Jagielski         // create missing series format
1857*b1cdbd2cSJim Jagielski         if( !mxSeriesFmt )
1858*b1cdbd2cSJim Jagielski             mxSeriesFmt = CreateDataFormat( EXC_CHDATAFORMAT_ALLPOINTS, 0 );
1859*b1cdbd2cSJim Jagielski 
1860*b1cdbd2cSJim Jagielski         if( mxSeriesFmt.is() )
1861*b1cdbd2cSJim Jagielski         {
1862*b1cdbd2cSJim Jagielski             // #i83100# set text label format, e.g. for trend line equations
1863*b1cdbd2cSJim Jagielski             mxSeriesFmt->SetDataLabel( maLabels.get( EXC_CHDATAFORMAT_ALLPOINTS ) );
1864*b1cdbd2cSJim Jagielski             // create missing automatic formats
1865*b1cdbd2cSJim Jagielski             mxSeriesFmt->UpdateTrendLineFormat();
1866*b1cdbd2cSJim Jagielski         }
1867*b1cdbd2cSJim Jagielski 
1868*b1cdbd2cSJim Jagielski         // copy series formatting to child objects
1869*b1cdbd2cSJim Jagielski         for( XclImpChSerTrendLineList::iterator aLIt = maTrendLines.begin(), aLEnd = maTrendLines.end(); aLIt != aLEnd; ++aLIt )
1870*b1cdbd2cSJim Jagielski             (*aLIt)->SetDataFormat( mxSeriesFmt );
1871*b1cdbd2cSJim Jagielski         for( XclImpChSerErrorBarMap::iterator aMIt = maErrorBars.begin(), aMEnd = maErrorBars.end(); aMIt != aMEnd; ++aMIt )
1872*b1cdbd2cSJim Jagielski             aMIt->second->SetSeriesData( mxValueLink, mxSeriesFmt );
1873*b1cdbd2cSJim Jagielski     }
1874*b1cdbd2cSJim Jagielski     else if( XclImpChTypeGroup* pTypeGroup = GetChartData().GetTypeGroup( mnGroupIdx ).get() )
1875*b1cdbd2cSJim Jagielski     {
1876*b1cdbd2cSJim Jagielski         // *** series is a regular data series ***
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski         // create missing series format
1879*b1cdbd2cSJim Jagielski         if( !mxSeriesFmt )
1880*b1cdbd2cSJim Jagielski         {
1881*b1cdbd2cSJim Jagielski             // #i51639# use a new unused format index to create series default format
1882*b1cdbd2cSJim Jagielski             sal_uInt16 nFormatIdx = pTypeGroup->PopUnusedFormatIndex();
1883*b1cdbd2cSJim Jagielski             mxSeriesFmt = CreateDataFormat( EXC_CHDATAFORMAT_ALLPOINTS, nFormatIdx );
1884*b1cdbd2cSJim Jagielski         }
1885*b1cdbd2cSJim Jagielski 
1886*b1cdbd2cSJim Jagielski         // set text labels to data formats
1887*b1cdbd2cSJim Jagielski         for( XclImpChTextMap::iterator aTIt = maLabels.begin(), aTEnd = maLabels.end(); aTIt != aTEnd; ++aTIt )
1888*b1cdbd2cSJim Jagielski         {
1889*b1cdbd2cSJim Jagielski             if( XclImpChDataFormatRef* pxDataFmt = GetDataFormatRef( aTIt->first ) )
1890*b1cdbd2cSJim Jagielski             {
1891*b1cdbd2cSJim Jagielski                 if( !*pxDataFmt )
1892*b1cdbd2cSJim Jagielski                     *pxDataFmt = CreateDataFormat( aTIt->first, EXC_CHDATAFORMAT_DEFAULT );
1893*b1cdbd2cSJim Jagielski                 (*pxDataFmt)->SetDataLabel( aTIt->second );
1894*b1cdbd2cSJim Jagielski             }
1895*b1cdbd2cSJim Jagielski         }
1896*b1cdbd2cSJim Jagielski 
1897*b1cdbd2cSJim Jagielski         // update series format (copy missing formatting from group default format)
1898*b1cdbd2cSJim Jagielski         if( mxSeriesFmt.is() )
1899*b1cdbd2cSJim Jagielski             mxSeriesFmt->UpdateSeriesFormat( pTypeGroup->GetTypeInfo(), pTypeGroup->GetGroupFormat().get() );
1900*b1cdbd2cSJim Jagielski 
1901*b1cdbd2cSJim Jagielski         // update data point formats (removes unchanged automatic formatting)
1902*b1cdbd2cSJim Jagielski         for( XclImpChDataFormatMap::iterator aFIt = maPointFmts.begin(), aFEnd = maPointFmts.end(); aFIt != aFEnd; ++aFIt )
1903*b1cdbd2cSJim Jagielski             aFIt->second->UpdatePointFormat( pTypeGroup->GetTypeInfo(), mxSeriesFmt.get() );
1904*b1cdbd2cSJim Jagielski     }
1905*b1cdbd2cSJim Jagielski }
1906*b1cdbd2cSJim Jagielski 
1907*b1cdbd2cSJim Jagielski namespace {
1908*b1cdbd2cSJim Jagielski 
1909*b1cdbd2cSJim Jagielski /** Returns the property set of the specified data point. */
lclGetPointPropSet(Reference<XDataSeries> xDataSeries,sal_uInt16 nPointIdx)1910*b1cdbd2cSJim Jagielski ScfPropertySet lclGetPointPropSet( Reference< XDataSeries > xDataSeries, sal_uInt16 nPointIdx )
1911*b1cdbd2cSJim Jagielski {
1912*b1cdbd2cSJim Jagielski     ScfPropertySet aPropSet;
1913*b1cdbd2cSJim Jagielski     try
1914*b1cdbd2cSJim Jagielski     {
1915*b1cdbd2cSJim Jagielski         aPropSet.Set( xDataSeries->getDataPointByIndex( static_cast< sal_Int32 >( nPointIdx ) ) );
1916*b1cdbd2cSJim Jagielski     }
1917*b1cdbd2cSJim Jagielski     catch( Exception& )
1918*b1cdbd2cSJim Jagielski     {
1919*b1cdbd2cSJim Jagielski         DBG_ERRORFILE( "lclGetPointPropSet - no data point property set" );
1920*b1cdbd2cSJim Jagielski     }
1921*b1cdbd2cSJim Jagielski     return aPropSet;
1922*b1cdbd2cSJim Jagielski }
1923*b1cdbd2cSJim Jagielski 
1924*b1cdbd2cSJim Jagielski } // namespace
1925*b1cdbd2cSJim Jagielski 
CreateValueSequence(const OUString & rValueRole) const1926*b1cdbd2cSJim Jagielski Reference< XLabeledDataSequence > XclImpChSeries::CreateValueSequence( const OUString& rValueRole ) const
1927*b1cdbd2cSJim Jagielski {
1928*b1cdbd2cSJim Jagielski     return lclCreateLabeledDataSequence( mxValueLink, rValueRole, mxTitleLink.get() );
1929*b1cdbd2cSJim Jagielski }
1930*b1cdbd2cSJim Jagielski 
CreateCategSequence(const OUString & rCategRole) const1931*b1cdbd2cSJim Jagielski Reference< XLabeledDataSequence > XclImpChSeries::CreateCategSequence( const OUString& rCategRole ) const
1932*b1cdbd2cSJim Jagielski {
1933*b1cdbd2cSJim Jagielski     return lclCreateLabeledDataSequence( mxCategLink, rCategRole );
1934*b1cdbd2cSJim Jagielski }
1935*b1cdbd2cSJim Jagielski 
CreateDataSeries() const1936*b1cdbd2cSJim Jagielski Reference< XDataSeries > XclImpChSeries::CreateDataSeries() const
1937*b1cdbd2cSJim Jagielski {
1938*b1cdbd2cSJim Jagielski     Reference< XDataSeries > xDataSeries;
1939*b1cdbd2cSJim Jagielski     if( const XclImpChTypeGroup* pTypeGroup = GetChartData().GetTypeGroup( mnGroupIdx ).get() )
1940*b1cdbd2cSJim Jagielski     {
1941*b1cdbd2cSJim Jagielski         const XclChExtTypeInfo& rTypeInfo = pTypeGroup->GetTypeInfo();
1942*b1cdbd2cSJim Jagielski 
1943*b1cdbd2cSJim Jagielski         // create the data series object
1944*b1cdbd2cSJim Jagielski         xDataSeries.set( ScfApiHelper::CreateInstance( SERVICE_CHART2_DATASERIES ), UNO_QUERY );
1945*b1cdbd2cSJim Jagielski 
1946*b1cdbd2cSJim Jagielski         // attach data and title sequences to series
1947*b1cdbd2cSJim Jagielski         Reference< XDataSink > xDataSink( xDataSeries, UNO_QUERY );
1948*b1cdbd2cSJim Jagielski         if( xDataSink.is() )
1949*b1cdbd2cSJim Jagielski         {
1950*b1cdbd2cSJim Jagielski             // create vector of all value sequences
1951*b1cdbd2cSJim Jagielski             ::std::vector< Reference< XLabeledDataSequence > > aLabeledSeqVec;
1952*b1cdbd2cSJim Jagielski             // add Y values
1953*b1cdbd2cSJim Jagielski             Reference< XLabeledDataSequence > xYValueSeq =
1954*b1cdbd2cSJim Jagielski                 CreateValueSequence( EXC_CHPROP_ROLE_YVALUES );
1955*b1cdbd2cSJim Jagielski             if( xYValueSeq.is() )
1956*b1cdbd2cSJim Jagielski                 aLabeledSeqVec.push_back( xYValueSeq );
1957*b1cdbd2cSJim Jagielski             // add X values
1958*b1cdbd2cSJim Jagielski             if( !rTypeInfo.mbCategoryAxis )
1959*b1cdbd2cSJim Jagielski             {
1960*b1cdbd2cSJim Jagielski                 Reference< XLabeledDataSequence > xXValueSeq =
1961*b1cdbd2cSJim Jagielski                     CreateCategSequence( EXC_CHPROP_ROLE_XVALUES );
1962*b1cdbd2cSJim Jagielski                 if( xXValueSeq.is() )
1963*b1cdbd2cSJim Jagielski                     aLabeledSeqVec.push_back( xXValueSeq );
1964*b1cdbd2cSJim Jagielski                 // add size values of bubble charts
1965*b1cdbd2cSJim Jagielski                 if( rTypeInfo.meTypeId == EXC_CHTYPEID_BUBBLES )
1966*b1cdbd2cSJim Jagielski                 {
1967*b1cdbd2cSJim Jagielski                     Reference< XLabeledDataSequence > xSizeValueSeq =
1968*b1cdbd2cSJim Jagielski                         lclCreateLabeledDataSequence( mxBubbleLink, EXC_CHPROP_ROLE_SIZEVALUES, mxTitleLink.get() );
1969*b1cdbd2cSJim Jagielski                     if( xSizeValueSeq.is() )
1970*b1cdbd2cSJim Jagielski                         aLabeledSeqVec.push_back( xSizeValueSeq );
1971*b1cdbd2cSJim Jagielski                 }
1972*b1cdbd2cSJim Jagielski             }
1973*b1cdbd2cSJim Jagielski             // attach labeled data sequences to series
1974*b1cdbd2cSJim Jagielski             if( !aLabeledSeqVec.empty() )
1975*b1cdbd2cSJim Jagielski                 xDataSink->setData( ScfApiHelper::VectorToSequence( aLabeledSeqVec ) );
1976*b1cdbd2cSJim Jagielski         }
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski         // series formatting
1979*b1cdbd2cSJim Jagielski         ScfPropertySet aSeriesProp( xDataSeries );
1980*b1cdbd2cSJim Jagielski         if( mxSeriesFmt.is() )
1981*b1cdbd2cSJim Jagielski             mxSeriesFmt->Convert( aSeriesProp, rTypeInfo );
1982*b1cdbd2cSJim Jagielski 
1983*b1cdbd2cSJim Jagielski         // trend lines
1984*b1cdbd2cSJim Jagielski         ConvertTrendLines( xDataSeries );
1985*b1cdbd2cSJim Jagielski 
1986*b1cdbd2cSJim Jagielski         // error bars
1987*b1cdbd2cSJim Jagielski         Reference< XPropertySet > xErrorBarX = CreateErrorBar( EXC_CHSERERR_XPLUS, EXC_CHSERERR_XMINUS );
1988*b1cdbd2cSJim Jagielski         if( xErrorBarX.is() )
1989*b1cdbd2cSJim Jagielski             aSeriesProp.SetProperty( EXC_CHPROP_ERRORBARX, xErrorBarX );
1990*b1cdbd2cSJim Jagielski         Reference< XPropertySet > xErrorBarY = CreateErrorBar( EXC_CHSERERR_YPLUS, EXC_CHSERERR_YMINUS );
1991*b1cdbd2cSJim Jagielski         if( xErrorBarY.is() )
1992*b1cdbd2cSJim Jagielski             aSeriesProp.SetProperty( EXC_CHPROP_ERRORBARY, xErrorBarY );
1993*b1cdbd2cSJim Jagielski 
1994*b1cdbd2cSJim Jagielski         // own area formatting for every data point (TODO: varying line color not supported)
1995*b1cdbd2cSJim Jagielski         bool bVarPointFmt = pTypeGroup->HasVarPointFormat() && rTypeInfo.IsSeriesFrameFormat();
1996*b1cdbd2cSJim Jagielski #if EXC_CHART2_VARYCOLORSBY_PROP
1997*b1cdbd2cSJim Jagielski         aSeriesProp.SetBoolProperty( EXC_CHPROP_VARYCOLORSBY, bVarPointFmt );
1998*b1cdbd2cSJim Jagielski #else
1999*b1cdbd2cSJim Jagielski         aSeriesProp.SetBoolProperty( EXC_CHPROP_VARYCOLORSBY, rTypeInfo.meTypeCateg == EXC_CHTYPECATEG_PIE );
2000*b1cdbd2cSJim Jagielski #endif
2001*b1cdbd2cSJim Jagielski         // #i91271# always set area formatting for every point in pie/doughnut charts
2002*b1cdbd2cSJim Jagielski         if( mxSeriesFmt.is() && ((bVarPointFmt && mxSeriesFmt->IsAutoArea()) || (rTypeInfo.meTypeCateg == EXC_CHTYPECATEG_PIE)) )
2003*b1cdbd2cSJim Jagielski         {
2004*b1cdbd2cSJim Jagielski             for( sal_uInt16 nPointIdx = 0, nPointCount = mxValueLink->GetCellCount(); nPointIdx < nPointCount; ++nPointIdx )
2005*b1cdbd2cSJim Jagielski             {
2006*b1cdbd2cSJim Jagielski                 ScfPropertySet aPointProp = lclGetPointPropSet( xDataSeries, nPointIdx );
2007*b1cdbd2cSJim Jagielski                 mxSeriesFmt->ConvertArea( aPointProp, bVarPointFmt ? nPointIdx : mnSeriesIdx, false );
2008*b1cdbd2cSJim Jagielski             }
2009*b1cdbd2cSJim Jagielski         }
2010*b1cdbd2cSJim Jagielski 
2011*b1cdbd2cSJim Jagielski         // data point formatting
2012*b1cdbd2cSJim Jagielski         for( XclImpChDataFormatMap::const_iterator aIt = maPointFmts.begin(), aEnd = maPointFmts.end(); aIt != aEnd; ++aIt )
2013*b1cdbd2cSJim Jagielski         {
2014*b1cdbd2cSJim Jagielski             ScfPropertySet aPointProp = lclGetPointPropSet( xDataSeries, aIt->first );
2015*b1cdbd2cSJim Jagielski             aIt->second->Convert( aPointProp, rTypeInfo );
2016*b1cdbd2cSJim Jagielski         }
2017*b1cdbd2cSJim Jagielski     }
2018*b1cdbd2cSJim Jagielski     return xDataSeries;
2019*b1cdbd2cSJim Jagielski }
2020*b1cdbd2cSJim Jagielski 
FillAllSourceLinks(::std::vector<ScSharedTokenRef> & rTokens) const2021*b1cdbd2cSJim Jagielski void XclImpChSeries::FillAllSourceLinks( ::std::vector< ScSharedTokenRef >& rTokens ) const
2022*b1cdbd2cSJim Jagielski {
2023*b1cdbd2cSJim Jagielski     if( mxValueLink.is() )
2024*b1cdbd2cSJim Jagielski         mxValueLink->FillSourceLink( rTokens );
2025*b1cdbd2cSJim Jagielski     if( mxCategLink.is() )
2026*b1cdbd2cSJim Jagielski         mxCategLink->FillSourceLink( rTokens );
2027*b1cdbd2cSJim Jagielski     if( mxTitleLink.is() )
2028*b1cdbd2cSJim Jagielski         mxTitleLink->FillSourceLink( rTokens );
2029*b1cdbd2cSJim Jagielski     if( mxBubbleLink.is() )
2030*b1cdbd2cSJim Jagielski         mxBubbleLink->FillSourceLink( rTokens );
2031*b1cdbd2cSJim Jagielski }
2032*b1cdbd2cSJim Jagielski 
ReadChSourceLink(XclImpStream & rStrm)2033*b1cdbd2cSJim Jagielski void XclImpChSeries::ReadChSourceLink( XclImpStream& rStrm )
2034*b1cdbd2cSJim Jagielski {
2035*b1cdbd2cSJim Jagielski     XclImpChSourceLinkRef xSrcLink( new XclImpChSourceLink( GetChRoot() ) );
2036*b1cdbd2cSJim Jagielski     xSrcLink->ReadChSourceLink( rStrm );
2037*b1cdbd2cSJim Jagielski     switch( xSrcLink->GetDestType() )
2038*b1cdbd2cSJim Jagielski     {
2039*b1cdbd2cSJim Jagielski         case EXC_CHSRCLINK_TITLE:       mxTitleLink = xSrcLink;     break;
2040*b1cdbd2cSJim Jagielski         case EXC_CHSRCLINK_VALUES:      mxValueLink = xSrcLink;     break;
2041*b1cdbd2cSJim Jagielski         case EXC_CHSRCLINK_CATEGORY:    mxCategLink = xSrcLink;     break;
2042*b1cdbd2cSJim Jagielski         case EXC_CHSRCLINK_BUBBLES:     mxBubbleLink = xSrcLink;    break;
2043*b1cdbd2cSJim Jagielski     }
2044*b1cdbd2cSJim Jagielski }
2045*b1cdbd2cSJim Jagielski 
ReadChDataFormat(XclImpStream & rStrm)2046*b1cdbd2cSJim Jagielski void XclImpChSeries::ReadChDataFormat( XclImpStream& rStrm )
2047*b1cdbd2cSJim Jagielski {
2048*b1cdbd2cSJim Jagielski     // #i51639# chart stores all data formats and assigns them later to the series
2049*b1cdbd2cSJim Jagielski     GetChartData().ReadChDataFormat( rStrm );
2050*b1cdbd2cSJim Jagielski }
2051*b1cdbd2cSJim Jagielski 
ReadChSerParent(XclImpStream & rStrm)2052*b1cdbd2cSJim Jagielski void XclImpChSeries::ReadChSerParent( XclImpStream& rStrm )
2053*b1cdbd2cSJim Jagielski {
2054*b1cdbd2cSJim Jagielski     rStrm >> mnParentIdx;
2055*b1cdbd2cSJim Jagielski     // index to parent series is 1-based, convert it to 0-based
2056*b1cdbd2cSJim Jagielski     if( mnParentIdx > 0 )
2057*b1cdbd2cSJim Jagielski         --mnParentIdx;
2058*b1cdbd2cSJim Jagielski     else
2059*b1cdbd2cSJim Jagielski         mnParentIdx = EXC_CHSERIES_INVALID;
2060*b1cdbd2cSJim Jagielski }
2061*b1cdbd2cSJim Jagielski 
ReadChSerTrendLine(XclImpStream & rStrm)2062*b1cdbd2cSJim Jagielski void XclImpChSeries::ReadChSerTrendLine( XclImpStream& rStrm )
2063*b1cdbd2cSJim Jagielski {
2064*b1cdbd2cSJim Jagielski     XclImpChSerTrendLineRef xTrendLine( new XclImpChSerTrendLine( GetChRoot() ) );
2065*b1cdbd2cSJim Jagielski     xTrendLine->ReadChSerTrendLine( rStrm );
2066*b1cdbd2cSJim Jagielski     maTrendLines.push_back( xTrendLine );
2067*b1cdbd2cSJim Jagielski }
2068*b1cdbd2cSJim Jagielski 
ReadChSerErrorBar(XclImpStream & rStrm)2069*b1cdbd2cSJim Jagielski void XclImpChSeries::ReadChSerErrorBar( XclImpStream& rStrm )
2070*b1cdbd2cSJim Jagielski {
2071*b1cdbd2cSJim Jagielski     XclImpChSerErrorBarRef xErrorBar( new XclImpChSerErrorBar( GetChRoot() ) );
2072*b1cdbd2cSJim Jagielski     xErrorBar->ReadChSerErrorBar( rStrm );
2073*b1cdbd2cSJim Jagielski     maErrorBars[ xErrorBar->GetBarType() ] = xErrorBar;
2074*b1cdbd2cSJim Jagielski }
2075*b1cdbd2cSJim Jagielski 
CreateDataFormat(sal_uInt16 nPointIdx,sal_uInt16 nFormatIdx)2076*b1cdbd2cSJim Jagielski XclImpChDataFormatRef XclImpChSeries::CreateDataFormat( sal_uInt16 nPointIdx, sal_uInt16 nFormatIdx )
2077*b1cdbd2cSJim Jagielski {
2078*b1cdbd2cSJim Jagielski     XclImpChDataFormatRef xDataFmt( new XclImpChDataFormat( GetChRoot() ) );
2079*b1cdbd2cSJim Jagielski     xDataFmt->SetPointPos( XclChDataPointPos( mnSeriesIdx, nPointIdx ), nFormatIdx );
2080*b1cdbd2cSJim Jagielski     return xDataFmt;
2081*b1cdbd2cSJim Jagielski }
2082*b1cdbd2cSJim Jagielski 
GetDataFormatRef(sal_uInt16 nPointIdx)2083*b1cdbd2cSJim Jagielski XclImpChDataFormatRef* XclImpChSeries::GetDataFormatRef( sal_uInt16 nPointIdx )
2084*b1cdbd2cSJim Jagielski {
2085*b1cdbd2cSJim Jagielski     if( nPointIdx == EXC_CHDATAFORMAT_ALLPOINTS )
2086*b1cdbd2cSJim Jagielski         return &mxSeriesFmt;
2087*b1cdbd2cSJim Jagielski     if( nPointIdx < EXC_CHDATAFORMAT_MAXPOINTCOUNT )
2088*b1cdbd2cSJim Jagielski         return &maPointFmts[ nPointIdx ];
2089*b1cdbd2cSJim Jagielski     return 0;
2090*b1cdbd2cSJim Jagielski }
2091*b1cdbd2cSJim Jagielski 
GetDataLabelRef(sal_uInt16 nPointIdx)2092*b1cdbd2cSJim Jagielski XclImpChTextRef* XclImpChSeries::GetDataLabelRef( sal_uInt16 nPointIdx )
2093*b1cdbd2cSJim Jagielski {
2094*b1cdbd2cSJim Jagielski     if( (nPointIdx == EXC_CHDATAFORMAT_ALLPOINTS) || (nPointIdx < EXC_CHDATAFORMAT_MAXPOINTCOUNT) )
2095*b1cdbd2cSJim Jagielski         return &maLabels[ nPointIdx ];
2096*b1cdbd2cSJim Jagielski     return 0;
2097*b1cdbd2cSJim Jagielski }
2098*b1cdbd2cSJim Jagielski 
ConvertTrendLines(Reference<XDataSeries> xDataSeries) const2099*b1cdbd2cSJim Jagielski void XclImpChSeries::ConvertTrendLines( Reference< XDataSeries > xDataSeries ) const
2100*b1cdbd2cSJim Jagielski {
2101*b1cdbd2cSJim Jagielski     Reference< XRegressionCurveContainer > xRegCurveCont( xDataSeries, UNO_QUERY );
2102*b1cdbd2cSJim Jagielski     if( xRegCurveCont.is() )
2103*b1cdbd2cSJim Jagielski     {
2104*b1cdbd2cSJim Jagielski         for( XclImpChSerTrendLineList::const_iterator aIt = maTrendLines.begin(), aEnd = maTrendLines.end(); aIt != aEnd; ++aIt )
2105*b1cdbd2cSJim Jagielski         {
2106*b1cdbd2cSJim Jagielski             try
2107*b1cdbd2cSJim Jagielski             {
2108*b1cdbd2cSJim Jagielski                 Reference< XRegressionCurve > xRegCurve = (*aIt)->CreateRegressionCurve();
2109*b1cdbd2cSJim Jagielski                 if( xRegCurve.is() )
2110*b1cdbd2cSJim Jagielski                     xRegCurveCont->addRegressionCurve( xRegCurve );
2111*b1cdbd2cSJim Jagielski             }
2112*b1cdbd2cSJim Jagielski             catch( Exception& )
2113*b1cdbd2cSJim Jagielski             {
2114*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "XclImpChSeries::ConvertTrendLines - cannot add regression curve" );
2115*b1cdbd2cSJim Jagielski             }
2116*b1cdbd2cSJim Jagielski         }
2117*b1cdbd2cSJim Jagielski     }
2118*b1cdbd2cSJim Jagielski }
2119*b1cdbd2cSJim Jagielski 
CreateErrorBar(sal_uInt8 nPosBarId,sal_uInt8 nNegBarId) const2120*b1cdbd2cSJim Jagielski Reference< XPropertySet > XclImpChSeries::CreateErrorBar( sal_uInt8 nPosBarId, sal_uInt8 nNegBarId ) const
2121*b1cdbd2cSJim Jagielski {
2122*b1cdbd2cSJim Jagielski     return XclImpChSerErrorBar::CreateErrorBar( maErrorBars.get( nPosBarId ).get(), maErrorBars.get( nNegBarId ).get() );
2123*b1cdbd2cSJim Jagielski }
2124*b1cdbd2cSJim Jagielski 
2125*b1cdbd2cSJim Jagielski // Chart type groups ==========================================================
2126*b1cdbd2cSJim Jagielski 
XclImpChType(const XclImpChRoot & rRoot)2127*b1cdbd2cSJim Jagielski XclImpChType::XclImpChType( const XclImpChRoot& rRoot ) :
2128*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot ),
2129*b1cdbd2cSJim Jagielski     mnRecId( EXC_ID_CHUNKNOWN ),
2130*b1cdbd2cSJim Jagielski     maTypeInfo( rRoot.GetChartTypeInfo( EXC_CHTYPEID_UNKNOWN ) )
2131*b1cdbd2cSJim Jagielski {
2132*b1cdbd2cSJim Jagielski }
2133*b1cdbd2cSJim Jagielski 
ReadChType(XclImpStream & rStrm)2134*b1cdbd2cSJim Jagielski void XclImpChType::ReadChType( XclImpStream& rStrm )
2135*b1cdbd2cSJim Jagielski {
2136*b1cdbd2cSJim Jagielski     sal_uInt16 nRecId = rStrm.GetRecId();
2137*b1cdbd2cSJim Jagielski     bool bKnownType = true;
2138*b1cdbd2cSJim Jagielski 
2139*b1cdbd2cSJim Jagielski     switch( nRecId )
2140*b1cdbd2cSJim Jagielski     {
2141*b1cdbd2cSJim Jagielski         case EXC_ID_CHBAR:
2142*b1cdbd2cSJim Jagielski             rStrm >> maData.mnOverlap >> maData.mnGap >> maData.mnFlags;
2143*b1cdbd2cSJim Jagielski         break;
2144*b1cdbd2cSJim Jagielski 
2145*b1cdbd2cSJim Jagielski         case EXC_ID_CHLINE:
2146*b1cdbd2cSJim Jagielski         case EXC_ID_CHAREA:
2147*b1cdbd2cSJim Jagielski         case EXC_ID_CHRADARLINE:
2148*b1cdbd2cSJim Jagielski         case EXC_ID_CHRADARAREA:
2149*b1cdbd2cSJim Jagielski             rStrm >> maData.mnFlags;
2150*b1cdbd2cSJim Jagielski         break;
2151*b1cdbd2cSJim Jagielski 
2152*b1cdbd2cSJim Jagielski         case EXC_ID_CHPIE:
2153*b1cdbd2cSJim Jagielski             rStrm >> maData.mnRotation >> maData.mnPieHole;
2154*b1cdbd2cSJim Jagielski             if( GetBiff() == EXC_BIFF8 )
2155*b1cdbd2cSJim Jagielski                 rStrm >> maData.mnFlags;
2156*b1cdbd2cSJim Jagielski             else
2157*b1cdbd2cSJim Jagielski                 maData.mnFlags = 0;
2158*b1cdbd2cSJim Jagielski         break;
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski         case EXC_ID_CHPIEEXT:
2161*b1cdbd2cSJim Jagielski             maData.mnRotation = 0;
2162*b1cdbd2cSJim Jagielski             maData.mnPieHole = 0;
2163*b1cdbd2cSJim Jagielski             maData.mnFlags = 0;
2164*b1cdbd2cSJim Jagielski         break;
2165*b1cdbd2cSJim Jagielski 
2166*b1cdbd2cSJim Jagielski         case EXC_ID_CHSCATTER:
2167*b1cdbd2cSJim Jagielski             if( GetBiff() == EXC_BIFF8 )
2168*b1cdbd2cSJim Jagielski                 rStrm >> maData.mnBubbleSize >> maData.mnBubbleType >> maData.mnFlags;
2169*b1cdbd2cSJim Jagielski             else
2170*b1cdbd2cSJim Jagielski                 maData.mnFlags = 0;
2171*b1cdbd2cSJim Jagielski         break;
2172*b1cdbd2cSJim Jagielski 
2173*b1cdbd2cSJim Jagielski         case EXC_ID_CHSURFACE:
2174*b1cdbd2cSJim Jagielski             rStrm >> maData.mnFlags;
2175*b1cdbd2cSJim Jagielski         break;
2176*b1cdbd2cSJim Jagielski 
2177*b1cdbd2cSJim Jagielski         default:
2178*b1cdbd2cSJim Jagielski             bKnownType = false;
2179*b1cdbd2cSJim Jagielski     }
2180*b1cdbd2cSJim Jagielski 
2181*b1cdbd2cSJim Jagielski     if( bKnownType )
2182*b1cdbd2cSJim Jagielski         mnRecId = nRecId;
2183*b1cdbd2cSJim Jagielski }
2184*b1cdbd2cSJim Jagielski 
Finalize(bool bStockChart)2185*b1cdbd2cSJim Jagielski void XclImpChType::Finalize( bool bStockChart )
2186*b1cdbd2cSJim Jagielski {
2187*b1cdbd2cSJim Jagielski     switch( mnRecId )
2188*b1cdbd2cSJim Jagielski     {
2189*b1cdbd2cSJim Jagielski         case EXC_ID_CHLINE:
2190*b1cdbd2cSJim Jagielski             maTypeInfo = GetChartTypeInfo( bStockChart ?
2191*b1cdbd2cSJim Jagielski                 EXC_CHTYPEID_STOCK : EXC_CHTYPEID_LINE );
2192*b1cdbd2cSJim Jagielski         break;
2193*b1cdbd2cSJim Jagielski         case EXC_ID_CHBAR:
2194*b1cdbd2cSJim Jagielski             maTypeInfo = GetChartTypeInfo( ::get_flagvalue(
2195*b1cdbd2cSJim Jagielski                 maData.mnFlags, EXC_CHBAR_HORIZONTAL,
2196*b1cdbd2cSJim Jagielski                 EXC_CHTYPEID_HORBAR, EXC_CHTYPEID_BAR ) );
2197*b1cdbd2cSJim Jagielski         break;
2198*b1cdbd2cSJim Jagielski         case EXC_ID_CHPIE:
2199*b1cdbd2cSJim Jagielski             maTypeInfo = GetChartTypeInfo( (maData.mnPieHole > 0) ?
2200*b1cdbd2cSJim Jagielski                 EXC_CHTYPEID_DONUT : EXC_CHTYPEID_PIE );
2201*b1cdbd2cSJim Jagielski         break;
2202*b1cdbd2cSJim Jagielski         case EXC_ID_CHSCATTER:
2203*b1cdbd2cSJim Jagielski             maTypeInfo = GetChartTypeInfo( ::get_flagvalue(
2204*b1cdbd2cSJim Jagielski                 maData.mnFlags, EXC_CHSCATTER_BUBBLES,
2205*b1cdbd2cSJim Jagielski                 EXC_CHTYPEID_BUBBLES, EXC_CHTYPEID_SCATTER ) );
2206*b1cdbd2cSJim Jagielski         break;
2207*b1cdbd2cSJim Jagielski         default:
2208*b1cdbd2cSJim Jagielski             maTypeInfo = GetChartTypeInfo( mnRecId );
2209*b1cdbd2cSJim Jagielski     }
2210*b1cdbd2cSJim Jagielski 
2211*b1cdbd2cSJim Jagielski     switch( maTypeInfo.meTypeId )
2212*b1cdbd2cSJim Jagielski     {
2213*b1cdbd2cSJim Jagielski         case EXC_CHTYPEID_PIEEXT:
2214*b1cdbd2cSJim Jagielski         case EXC_CHTYPEID_BUBBLES:
2215*b1cdbd2cSJim Jagielski         case EXC_CHTYPEID_SURFACE:
2216*b1cdbd2cSJim Jagielski         case EXC_CHTYPEID_UNKNOWN:
2217*b1cdbd2cSJim Jagielski             GetTracer().TraceChartUnKnownType();
2218*b1cdbd2cSJim Jagielski         break;
2219*b1cdbd2cSJim Jagielski         default:;
2220*b1cdbd2cSJim Jagielski     }
2221*b1cdbd2cSJim Jagielski }
2222*b1cdbd2cSJim Jagielski 
IsStacked() const2223*b1cdbd2cSJim Jagielski bool XclImpChType::IsStacked() const
2224*b1cdbd2cSJim Jagielski {
2225*b1cdbd2cSJim Jagielski     bool bStacked = false;
2226*b1cdbd2cSJim Jagielski     if( maTypeInfo.mbSupportsStacking ) switch( maTypeInfo.meTypeCateg )
2227*b1cdbd2cSJim Jagielski     {
2228*b1cdbd2cSJim Jagielski         case EXC_CHTYPECATEG_LINE:
2229*b1cdbd2cSJim Jagielski             bStacked =
2230*b1cdbd2cSJim Jagielski                 ::get_flag( maData.mnFlags, EXC_CHLINE_STACKED ) &&
2231*b1cdbd2cSJim Jagielski                 !::get_flag( maData.mnFlags, EXC_CHLINE_PERCENT );
2232*b1cdbd2cSJim Jagielski         break;
2233*b1cdbd2cSJim Jagielski         case EXC_CHTYPECATEG_BAR:
2234*b1cdbd2cSJim Jagielski             bStacked =
2235*b1cdbd2cSJim Jagielski                 ::get_flag( maData.mnFlags, EXC_CHBAR_STACKED ) &&
2236*b1cdbd2cSJim Jagielski                 !::get_flag( maData.mnFlags, EXC_CHBAR_PERCENT );
2237*b1cdbd2cSJim Jagielski         break;
2238*b1cdbd2cSJim Jagielski         default:;
2239*b1cdbd2cSJim Jagielski     }
2240*b1cdbd2cSJim Jagielski     return bStacked;
2241*b1cdbd2cSJim Jagielski }
2242*b1cdbd2cSJim Jagielski 
IsPercent() const2243*b1cdbd2cSJim Jagielski bool XclImpChType::IsPercent() const
2244*b1cdbd2cSJim Jagielski {
2245*b1cdbd2cSJim Jagielski     bool bPercent = false;
2246*b1cdbd2cSJim Jagielski     if( maTypeInfo.mbSupportsStacking ) switch( maTypeInfo.meTypeCateg )
2247*b1cdbd2cSJim Jagielski     {
2248*b1cdbd2cSJim Jagielski         case EXC_CHTYPECATEG_LINE:
2249*b1cdbd2cSJim Jagielski             bPercent =
2250*b1cdbd2cSJim Jagielski                 ::get_flag( maData.mnFlags, EXC_CHLINE_STACKED ) &&
2251*b1cdbd2cSJim Jagielski                 ::get_flag( maData.mnFlags, EXC_CHLINE_PERCENT );
2252*b1cdbd2cSJim Jagielski         break;
2253*b1cdbd2cSJim Jagielski         case EXC_CHTYPECATEG_BAR:
2254*b1cdbd2cSJim Jagielski             bPercent =
2255*b1cdbd2cSJim Jagielski                 ::get_flag( maData.mnFlags, EXC_CHBAR_STACKED ) &&
2256*b1cdbd2cSJim Jagielski                 ::get_flag( maData.mnFlags, EXC_CHBAR_PERCENT );
2257*b1cdbd2cSJim Jagielski         break;
2258*b1cdbd2cSJim Jagielski         default:;
2259*b1cdbd2cSJim Jagielski     }
2260*b1cdbd2cSJim Jagielski     return bPercent;
2261*b1cdbd2cSJim Jagielski }
2262*b1cdbd2cSJim Jagielski 
HasCategoryLabels() const2263*b1cdbd2cSJim Jagielski bool XclImpChType::HasCategoryLabels() const
2264*b1cdbd2cSJim Jagielski {
2265*b1cdbd2cSJim Jagielski     // radar charts disable category labels in chart type, not in CHTICK of X axis
2266*b1cdbd2cSJim Jagielski     return (maTypeInfo.meTypeCateg != EXC_CHTYPECATEG_RADAR) || ::get_flag( maData.mnFlags, EXC_CHRADAR_AXISLABELS );
2267*b1cdbd2cSJim Jagielski }
2268*b1cdbd2cSJim Jagielski 
CreateCoordSystem(bool b3dChart) const2269*b1cdbd2cSJim Jagielski Reference< XCoordinateSystem > XclImpChType::CreateCoordSystem( bool b3dChart ) const
2270*b1cdbd2cSJim Jagielski {
2271*b1cdbd2cSJim Jagielski     // service name
2272*b1cdbd2cSJim Jagielski     OUString aCoordSysService;
2273*b1cdbd2cSJim Jagielski     if( maTypeInfo.mbPolarCoordSystem )
2274*b1cdbd2cSJim Jagielski     {
2275*b1cdbd2cSJim Jagielski         if( b3dChart )
2276*b1cdbd2cSJim Jagielski             aCoordSysService = SERVICE_CHART2_POLARCOORDSYS3D;
2277*b1cdbd2cSJim Jagielski         else
2278*b1cdbd2cSJim Jagielski             aCoordSysService = SERVICE_CHART2_POLARCOORDSYS2D;
2279*b1cdbd2cSJim Jagielski     }
2280*b1cdbd2cSJim Jagielski     else
2281*b1cdbd2cSJim Jagielski     {
2282*b1cdbd2cSJim Jagielski         if( b3dChart )
2283*b1cdbd2cSJim Jagielski             aCoordSysService = SERVICE_CHART2_CARTESIANCOORDSYS3D;
2284*b1cdbd2cSJim Jagielski         else
2285*b1cdbd2cSJim Jagielski             aCoordSysService = SERVICE_CHART2_CARTESIANCOORDSYS2D;
2286*b1cdbd2cSJim Jagielski     }
2287*b1cdbd2cSJim Jagielski 
2288*b1cdbd2cSJim Jagielski     // create the coordinate system object
2289*b1cdbd2cSJim Jagielski     Reference< XCoordinateSystem > xCoordSystem( ScfApiHelper::CreateInstance( aCoordSysService ), UNO_QUERY );
2290*b1cdbd2cSJim Jagielski 
2291*b1cdbd2cSJim Jagielski     // swap X and Y axis
2292*b1cdbd2cSJim Jagielski     if( maTypeInfo.mbSwappedAxesSet )
2293*b1cdbd2cSJim Jagielski     {
2294*b1cdbd2cSJim Jagielski         ScfPropertySet aCoordSysProp( xCoordSystem );
2295*b1cdbd2cSJim Jagielski         aCoordSysProp.SetBoolProperty( EXC_CHPROP_SWAPXANDYAXIS, true );
2296*b1cdbd2cSJim Jagielski     }
2297*b1cdbd2cSJim Jagielski 
2298*b1cdbd2cSJim Jagielski     return xCoordSystem;
2299*b1cdbd2cSJim Jagielski }
2300*b1cdbd2cSJim Jagielski 
CreateChartType(Reference<XDiagram> xDiagram,bool b3dChart) const2301*b1cdbd2cSJim Jagielski Reference< XChartType > XclImpChType::CreateChartType( Reference< XDiagram > xDiagram, bool b3dChart ) const
2302*b1cdbd2cSJim Jagielski {
2303*b1cdbd2cSJim Jagielski     OUString aService = OUString::createFromAscii( maTypeInfo.mpcServiceName );
2304*b1cdbd2cSJim Jagielski     Reference< XChartType > xChartType( ScfApiHelper::CreateInstance( aService ), UNO_QUERY );
2305*b1cdbd2cSJim Jagielski 
2306*b1cdbd2cSJim Jagielski     // additional properties
2307*b1cdbd2cSJim Jagielski     switch( maTypeInfo.meTypeCateg )
2308*b1cdbd2cSJim Jagielski     {
2309*b1cdbd2cSJim Jagielski         case EXC_CHTYPECATEG_BAR:
2310*b1cdbd2cSJim Jagielski         {
2311*b1cdbd2cSJim Jagielski             ScfPropertySet aTypeProp( xChartType );
2312*b1cdbd2cSJim Jagielski             Sequence< sal_Int32 > aInt32Seq( 2 );
2313*b1cdbd2cSJim Jagielski             aInt32Seq[ 0 ] = aInt32Seq[ 1 ] = -maData.mnOverlap;
2314*b1cdbd2cSJim Jagielski             aTypeProp.SetProperty( EXC_CHPROP_OVERLAPSEQ, aInt32Seq );
2315*b1cdbd2cSJim Jagielski             aInt32Seq[ 0 ] = aInt32Seq[ 1 ] = maData.mnGap;
2316*b1cdbd2cSJim Jagielski             aTypeProp.SetProperty( EXC_CHPROP_GAPWIDTHSEQ, aInt32Seq );
2317*b1cdbd2cSJim Jagielski         }
2318*b1cdbd2cSJim Jagielski         break;
2319*b1cdbd2cSJim Jagielski         case EXC_CHTYPECATEG_PIE:
2320*b1cdbd2cSJim Jagielski         {
2321*b1cdbd2cSJim Jagielski             ScfPropertySet aTypeProp( xChartType );
2322*b1cdbd2cSJim Jagielski             aTypeProp.SetBoolProperty( EXC_CHPROP_USERINGS, maTypeInfo.meTypeId == EXC_CHTYPEID_DONUT );
2323*b1cdbd2cSJim Jagielski             /*  #i85166# starting angle of first pie slice. 3D pie charts use Y
2324*b1cdbd2cSJim Jagielski                 rotation setting in view3D element. Of-pie charts do not
2325*b1cdbd2cSJim Jagielski                 support pie rotation. */
2326*b1cdbd2cSJim Jagielski             if( !b3dChart && (maTypeInfo.meTypeId != EXC_CHTYPEID_PIEEXT) )
2327*b1cdbd2cSJim Jagielski             {
2328*b1cdbd2cSJim Jagielski                 ScfPropertySet aDiaProp( xDiagram );
2329*b1cdbd2cSJim Jagielski                 XclImpChRoot::ConvertPieRotation( aDiaProp, maData.mnRotation );
2330*b1cdbd2cSJim Jagielski             }
2331*b1cdbd2cSJim Jagielski         }
2332*b1cdbd2cSJim Jagielski         break;
2333*b1cdbd2cSJim Jagielski         default:;
2334*b1cdbd2cSJim Jagielski     }
2335*b1cdbd2cSJim Jagielski 
2336*b1cdbd2cSJim Jagielski     return xChartType;
2337*b1cdbd2cSJim Jagielski }
2338*b1cdbd2cSJim Jagielski 
2339*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
2340*b1cdbd2cSJim Jagielski 
ReadChChart3d(XclImpStream & rStrm)2341*b1cdbd2cSJim Jagielski void XclImpChChart3d::ReadChChart3d( XclImpStream& rStrm )
2342*b1cdbd2cSJim Jagielski {
2343*b1cdbd2cSJim Jagielski     rStrm   >> maData.mnRotation
2344*b1cdbd2cSJim Jagielski             >> maData.mnElevation
2345*b1cdbd2cSJim Jagielski             >> maData.mnEyeDist
2346*b1cdbd2cSJim Jagielski             >> maData.mnRelHeight
2347*b1cdbd2cSJim Jagielski             >> maData.mnRelDepth
2348*b1cdbd2cSJim Jagielski             >> maData.mnDepthGap
2349*b1cdbd2cSJim Jagielski             >> maData.mnFlags;
2350*b1cdbd2cSJim Jagielski }
2351*b1cdbd2cSJim Jagielski 
Convert(ScfPropertySet & rPropSet,bool b3dWallChart) const2352*b1cdbd2cSJim Jagielski void XclImpChChart3d::Convert( ScfPropertySet& rPropSet, bool b3dWallChart ) const
2353*b1cdbd2cSJim Jagielski {
2354*b1cdbd2cSJim Jagielski     namespace cssd = ::com::sun::star::drawing;
2355*b1cdbd2cSJim Jagielski 
2356*b1cdbd2cSJim Jagielski //    #i104057# do not assert this, written by broken external generators
2357*b1cdbd2cSJim Jagielski //    DBG_ASSERT( ::get_flag( maData.mnFlags, EXC_CHCHART3D_HASWALLS ) == b3dWallChart, "XclImpChChart3d::Convert - wrong wall flag" );
2358*b1cdbd2cSJim Jagielski 
2359*b1cdbd2cSJim Jagielski     sal_Int32 nRotationY = 0;
2360*b1cdbd2cSJim Jagielski     sal_Int32 nRotationX = 0;
2361*b1cdbd2cSJim Jagielski     sal_Int32 nPerspective = 15;
2362*b1cdbd2cSJim Jagielski     bool bRightAngled = false;
2363*b1cdbd2cSJim Jagielski     cssd::ProjectionMode eProjMode = cssd::ProjectionMode_PERSPECTIVE;
2364*b1cdbd2cSJim Jagielski     Color aAmbientColor, aLightColor;
2365*b1cdbd2cSJim Jagielski 
2366*b1cdbd2cSJim Jagielski     if( b3dWallChart )
2367*b1cdbd2cSJim Jagielski     {
2368*b1cdbd2cSJim Jagielski         // Y rotation (Excel [0..359], Chart2 [-179,180])
2369*b1cdbd2cSJim Jagielski         nRotationY = maData.mnRotation % 360;
2370*b1cdbd2cSJim Jagielski         if( nRotationY > 180 ) nRotationY -= 360;
2371*b1cdbd2cSJim Jagielski         // X rotation a.k.a. elevation (Excel [-90..90], Chart2 [-179,180])
2372*b1cdbd2cSJim Jagielski         nRotationX = limit_cast< sal_Int32, sal_Int32 >( maData.mnElevation, -90, 90 );
2373*b1cdbd2cSJim Jagielski         // perspective (Excel and Chart2 [0,100])
2374*b1cdbd2cSJim Jagielski         nPerspective = limit_cast< sal_Int32, sal_Int32 >( maData.mnEyeDist, 0, 100 );
2375*b1cdbd2cSJim Jagielski         // right-angled axes
2376*b1cdbd2cSJim Jagielski         bRightAngled = !::get_flag( maData.mnFlags, EXC_CHCHART3D_REAL3D );
2377*b1cdbd2cSJim Jagielski         // projection mode (parallel axes, if right-angled, #i90360# or if perspective is at 0%)
2378*b1cdbd2cSJim Jagielski         bool bParallel = bRightAngled || (nPerspective == 0);
2379*b1cdbd2cSJim Jagielski         eProjMode = bParallel ? cssd::ProjectionMode_PARALLEL : cssd::ProjectionMode_PERSPECTIVE;
2380*b1cdbd2cSJim Jagielski         // ambient color (Gray 20%)
2381*b1cdbd2cSJim Jagielski         aAmbientColor.SetColor( RGB_COLORDATA( 204, 204, 204 ) );
2382*b1cdbd2cSJim Jagielski         // light color (Gray 60%)
2383*b1cdbd2cSJim Jagielski         aLightColor.SetColor( RGB_COLORDATA( 102, 102, 102 ) );
2384*b1cdbd2cSJim Jagielski     }
2385*b1cdbd2cSJim Jagielski     else
2386*b1cdbd2cSJim Jagielski     {
2387*b1cdbd2cSJim Jagielski         // Y rotation not used in pie charts, but 'first pie slice angle'
2388*b1cdbd2cSJim Jagielski         nRotationY = 0;
2389*b1cdbd2cSJim Jagielski         XclImpChRoot::ConvertPieRotation( rPropSet, maData.mnRotation );
2390*b1cdbd2cSJim Jagielski         // X rotation a.k.a. elevation (map Excel [10..80] to Chart2 [-80,-10])
2391*b1cdbd2cSJim Jagielski         nRotationX = limit_cast< sal_Int32, sal_Int32 >( maData.mnElevation, 10, 80 ) - 90;
2392*b1cdbd2cSJim Jagielski         // perspective (Excel and Chart2 [0,100])
2393*b1cdbd2cSJim Jagielski         nPerspective = limit_cast< sal_Int32, sal_Int32 >( maData.mnEyeDist, 0, 100 );
2394*b1cdbd2cSJim Jagielski         // no right-angled axes in pie charts, but parallel projection
2395*b1cdbd2cSJim Jagielski         bRightAngled = false;
2396*b1cdbd2cSJim Jagielski         eProjMode = cssd::ProjectionMode_PARALLEL;
2397*b1cdbd2cSJim Jagielski         // ambient color (Gray 30%)
2398*b1cdbd2cSJim Jagielski         aAmbientColor.SetColor( RGB_COLORDATA( 179, 179, 179 ) );
2399*b1cdbd2cSJim Jagielski         // light color (Gray 70%)
2400*b1cdbd2cSJim Jagielski         aLightColor.SetColor( RGB_COLORDATA( 76, 76, 76 ) );
2401*b1cdbd2cSJim Jagielski     }
2402*b1cdbd2cSJim Jagielski 
2403*b1cdbd2cSJim Jagielski     // properties
2404*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_3DRELATIVEHEIGHT, (sal_Int32)(maData.mnRelHeight / 2)); // seems to be 200%, cange to 100%
2405*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_ROTATIONVERTICAL, nRotationY );
2406*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_ROTATIONHORIZONTAL, nRotationX );
2407*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_PERSPECTIVE, nPerspective );
2408*b1cdbd2cSJim Jagielski     rPropSet.SetBoolProperty( EXC_CHPROP_RIGHTANGLEDAXES, bRightAngled );
2409*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_D3DSCENEPERSPECTIVE, eProjMode );
2410*b1cdbd2cSJim Jagielski 
2411*b1cdbd2cSJim Jagielski     // light settings
2412*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_D3DSCENESHADEMODE, cssd::ShadeMode_FLAT );
2413*b1cdbd2cSJim Jagielski     rPropSet.SetColorProperty( EXC_CHPROP_D3DSCENEAMBIENTCOLOR, aAmbientColor );
2414*b1cdbd2cSJim Jagielski     rPropSet.SetBoolProperty( EXC_CHPROP_D3DSCENELIGHTON1, false );
2415*b1cdbd2cSJim Jagielski     rPropSet.SetBoolProperty( EXC_CHPROP_D3DSCENELIGHTON2, true );
2416*b1cdbd2cSJim Jagielski     rPropSet.SetColorProperty( EXC_CHPROP_D3DSCENELIGHTCOLOR2, aLightColor );
2417*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_D3DSCENELIGHTDIR2, cssd::Direction3D( 0.2, 0.4, 1.0 ) );
2418*b1cdbd2cSJim Jagielski }
2419*b1cdbd2cSJim Jagielski 
2420*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
2421*b1cdbd2cSJim Jagielski 
XclImpChLegend(const XclImpChRoot & rRoot)2422*b1cdbd2cSJim Jagielski XclImpChLegend::XclImpChLegend( const XclImpChRoot& rRoot ) :
2423*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
2424*b1cdbd2cSJim Jagielski {
2425*b1cdbd2cSJim Jagielski }
2426*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)2427*b1cdbd2cSJim Jagielski void XclImpChLegend::ReadHeaderRecord( XclImpStream& rStrm )
2428*b1cdbd2cSJim Jagielski {
2429*b1cdbd2cSJim Jagielski     rStrm >> maData.maRect >> maData.mnDockMode >> maData.mnSpacing >> maData.mnFlags;
2430*b1cdbd2cSJim Jagielski 
2431*b1cdbd2cSJim Jagielski     // trace unsupported features
2432*b1cdbd2cSJim Jagielski     if( GetTracer().IsEnabled() )
2433*b1cdbd2cSJim Jagielski     {
2434*b1cdbd2cSJim Jagielski         if( maData.mnDockMode == EXC_CHLEGEND_NOTDOCKED )
2435*b1cdbd2cSJim Jagielski             GetTracer().TraceChartLegendPosition();
2436*b1cdbd2cSJim Jagielski         if( ::get_flag( maData.mnFlags, EXC_CHLEGEND_DATATABLE ) )
2437*b1cdbd2cSJim Jagielski             GetTracer().TraceChartDataTable();
2438*b1cdbd2cSJim Jagielski     }
2439*b1cdbd2cSJim Jagielski }
2440*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)2441*b1cdbd2cSJim Jagielski void XclImpChLegend::ReadSubRecord( XclImpStream& rStrm )
2442*b1cdbd2cSJim Jagielski {
2443*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
2444*b1cdbd2cSJim Jagielski     {
2445*b1cdbd2cSJim Jagielski         case EXC_ID_CHFRAMEPOS:
2446*b1cdbd2cSJim Jagielski             mxFramePos.reset( new XclImpChFramePos );
2447*b1cdbd2cSJim Jagielski             mxFramePos->ReadChFramePos( rStrm );
2448*b1cdbd2cSJim Jagielski         break;
2449*b1cdbd2cSJim Jagielski         case EXC_ID_CHTEXT:
2450*b1cdbd2cSJim Jagielski             mxText.reset( new XclImpChText( GetChRoot() ) );
2451*b1cdbd2cSJim Jagielski             mxText->ReadRecordGroup( rStrm );
2452*b1cdbd2cSJim Jagielski         break;
2453*b1cdbd2cSJim Jagielski         case EXC_ID_CHFRAME:
2454*b1cdbd2cSJim Jagielski             mxFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_LEGEND ) );
2455*b1cdbd2cSJim Jagielski             mxFrame->ReadRecordGroup( rStrm );
2456*b1cdbd2cSJim Jagielski         break;
2457*b1cdbd2cSJim Jagielski     }
2458*b1cdbd2cSJim Jagielski }
2459*b1cdbd2cSJim Jagielski 
Finalize()2460*b1cdbd2cSJim Jagielski void XclImpChLegend::Finalize()
2461*b1cdbd2cSJim Jagielski {
2462*b1cdbd2cSJim Jagielski     // legend default formatting differs in OOChart and Excel, missing frame means automatic
2463*b1cdbd2cSJim Jagielski     if( !mxFrame )
2464*b1cdbd2cSJim Jagielski         mxFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_LEGEND ) );
2465*b1cdbd2cSJim Jagielski     // Update text formatting. If mxText is empty, the passed default text is used.
2466*b1cdbd2cSJim Jagielski     lclUpdateText( mxText, GetChartData().GetDefaultText( EXC_CHTEXTTYPE_LEGEND ) );
2467*b1cdbd2cSJim Jagielski }
2468*b1cdbd2cSJim Jagielski 
CreateLegend() const2469*b1cdbd2cSJim Jagielski Reference< XLegend > XclImpChLegend::CreateLegend() const
2470*b1cdbd2cSJim Jagielski {
2471*b1cdbd2cSJim Jagielski     Reference< XLegend > xLegend( ScfApiHelper::CreateInstance( SERVICE_CHART2_LEGEND ), UNO_QUERY );
2472*b1cdbd2cSJim Jagielski     if( xLegend.is() )
2473*b1cdbd2cSJim Jagielski     {
2474*b1cdbd2cSJim Jagielski         ScfPropertySet aLegendProp( xLegend );
2475*b1cdbd2cSJim Jagielski         aLegendProp.SetBoolProperty( EXC_CHPROP_SHOW, true );
2476*b1cdbd2cSJim Jagielski 
2477*b1cdbd2cSJim Jagielski         // frame properties
2478*b1cdbd2cSJim Jagielski         if( mxFrame.is() )
2479*b1cdbd2cSJim Jagielski             mxFrame->Convert( aLegendProp );
2480*b1cdbd2cSJim Jagielski         // text properties
2481*b1cdbd2cSJim Jagielski         if( mxText.is() )
2482*b1cdbd2cSJim Jagielski             mxText->ConvertFont( aLegendProp );
2483*b1cdbd2cSJim Jagielski 
2484*b1cdbd2cSJim Jagielski         /*  Legend position and size. Default positions are used only if the
2485*b1cdbd2cSJim Jagielski             plot area is positioned automatically (Excel sets the plot area to
2486*b1cdbd2cSJim Jagielski             manual mode, if the legend is moved or resized). With manual plot
2487*b1cdbd2cSJim Jagielski             areas, Excel ignores the value in maData.mnDockMode completely. */
2488*b1cdbd2cSJim Jagielski         cssc2::LegendPosition eApiPos = cssc2::LegendPosition_CUSTOM;
2489*b1cdbd2cSJim Jagielski         cssc::ChartLegendExpansion eApiExpand = cssc::ChartLegendExpansion_CUSTOM;
2490*b1cdbd2cSJim Jagielski         if( !GetChartData().IsManualPlotArea() ) switch( maData.mnDockMode )
2491*b1cdbd2cSJim Jagielski         {
2492*b1cdbd2cSJim Jagielski             case EXC_CHLEGEND_LEFT:
2493*b1cdbd2cSJim Jagielski                 eApiPos = cssc2::LegendPosition_LINE_START;
2494*b1cdbd2cSJim Jagielski                 eApiExpand = cssc::ChartLegendExpansion_HIGH;
2495*b1cdbd2cSJim Jagielski             break;
2496*b1cdbd2cSJim Jagielski             case EXC_CHLEGEND_RIGHT:
2497*b1cdbd2cSJim Jagielski             // top-right not supported
2498*b1cdbd2cSJim Jagielski             case EXC_CHLEGEND_CORNER:
2499*b1cdbd2cSJim Jagielski                 eApiPos = cssc2::LegendPosition_LINE_END;
2500*b1cdbd2cSJim Jagielski                 eApiExpand = cssc::ChartLegendExpansion_HIGH;
2501*b1cdbd2cSJim Jagielski             break;
2502*b1cdbd2cSJim Jagielski             case EXC_CHLEGEND_TOP:
2503*b1cdbd2cSJim Jagielski                 eApiPos = cssc2::LegendPosition_PAGE_START;
2504*b1cdbd2cSJim Jagielski                 eApiExpand = cssc::ChartLegendExpansion_WIDE;
2505*b1cdbd2cSJim Jagielski             break;
2506*b1cdbd2cSJim Jagielski             case EXC_CHLEGEND_BOTTOM:
2507*b1cdbd2cSJim Jagielski                 eApiPos = cssc2::LegendPosition_PAGE_END;
2508*b1cdbd2cSJim Jagielski                 eApiExpand = cssc::ChartLegendExpansion_WIDE;
2509*b1cdbd2cSJim Jagielski             break;
2510*b1cdbd2cSJim Jagielski         }
2511*b1cdbd2cSJim Jagielski 
2512*b1cdbd2cSJim Jagielski         // no automatic position/size: try to find the correct position and size
2513*b1cdbd2cSJim Jagielski         if( eApiPos == cssc2::LegendPosition_CUSTOM )
2514*b1cdbd2cSJim Jagielski         {
2515*b1cdbd2cSJim Jagielski             const XclChFramePos* pFramePos = mxFramePos.is() ? &mxFramePos->GetFramePosData() : 0;
2516*b1cdbd2cSJim Jagielski 
2517*b1cdbd2cSJim Jagielski             /*  Legend position. Only the settings from the CHFRAMEPOS record
2518*b1cdbd2cSJim Jagielski                 are used by Excel, the position in the CHLEGEND record will be
2519*b1cdbd2cSJim Jagielski                 ignored. */
2520*b1cdbd2cSJim Jagielski             if( pFramePos )
2521*b1cdbd2cSJim Jagielski             {
2522*b1cdbd2cSJim Jagielski                 RelativePosition aRelPos(
2523*b1cdbd2cSJim Jagielski                     CalcRelativeFromChartX( pFramePos->maRect.mnX ),
2524*b1cdbd2cSJim Jagielski                     CalcRelativeFromChartY( pFramePos->maRect.mnY ),
2525*b1cdbd2cSJim Jagielski                     ::com::sun::star::drawing::Alignment_TOP_LEFT );
2526*b1cdbd2cSJim Jagielski                 aLegendProp.SetProperty( EXC_CHPROP_RELATIVEPOSITION, aRelPos );
2527*b1cdbd2cSJim Jagielski             }
2528*b1cdbd2cSJim Jagielski             else
2529*b1cdbd2cSJim Jagielski             {
2530*b1cdbd2cSJim Jagielski                 // no manual position/size found, just go for the default
2531*b1cdbd2cSJim Jagielski                 eApiPos = cssc2::LegendPosition_LINE_END;
2532*b1cdbd2cSJim Jagielski             }
2533*b1cdbd2cSJim Jagielski 
2534*b1cdbd2cSJim Jagielski             /*  Legend size. The member mnBRMode specifies whether size is
2535*b1cdbd2cSJim Jagielski                 automatic or changes manually. Manual size is given in points,
2536*b1cdbd2cSJim Jagielski                 not in chart units. */
2537*b1cdbd2cSJim Jagielski             if( pFramePos && (pFramePos->mnBRMode == EXC_CHFRAMEPOS_ABSSIZE_POINTS) &&
2538*b1cdbd2cSJim Jagielski                 (pFramePos->maRect.mnWidth > 0) && (pFramePos->maRect.mnHeight > 0) )
2539*b1cdbd2cSJim Jagielski             {
2540*b1cdbd2cSJim Jagielski                 eApiExpand = cssc::ChartLegendExpansion_CUSTOM;
2541*b1cdbd2cSJim Jagielski                 sal_Int32 nWidthHmm = static_cast< sal_Int32 >( pFramePos->maRect.mnWidth / EXC_POINTS_PER_HMM );
2542*b1cdbd2cSJim Jagielski                 sal_Int32 nHeightHmm = static_cast< sal_Int32 >( pFramePos->maRect.mnHeight / EXC_POINTS_PER_HMM );
2543*b1cdbd2cSJim Jagielski                 RelativeSize aRelSize( CalcRelativeFromHmmX( nWidthHmm ), CalcRelativeFromHmmY( nHeightHmm ) );
2544*b1cdbd2cSJim Jagielski                 aLegendProp.SetProperty( EXC_CHPROP_RELATIVESIZE, aRelSize );
2545*b1cdbd2cSJim Jagielski             }
2546*b1cdbd2cSJim Jagielski             else
2547*b1cdbd2cSJim Jagielski             {
2548*b1cdbd2cSJim Jagielski                 // automatic size: determine entry direction from flags
2549*b1cdbd2cSJim Jagielski                 eApiExpand = ::get_flagvalue( maData.mnFlags, EXC_CHLEGEND_STACKED,
2550*b1cdbd2cSJim Jagielski                     cssc::ChartLegendExpansion_HIGH, cssc::ChartLegendExpansion_WIDE );
2551*b1cdbd2cSJim Jagielski             }
2552*b1cdbd2cSJim Jagielski         }
2553*b1cdbd2cSJim Jagielski         aLegendProp.SetProperty( EXC_CHPROP_ANCHORPOSITION, eApiPos );
2554*b1cdbd2cSJim Jagielski         aLegendProp.SetProperty( EXC_CHPROP_EXPANSION, eApiExpand );
2555*b1cdbd2cSJim Jagielski     }
2556*b1cdbd2cSJim Jagielski     return xLegend;
2557*b1cdbd2cSJim Jagielski }
2558*b1cdbd2cSJim Jagielski 
2559*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
2560*b1cdbd2cSJim Jagielski 
XclImpChDropBar(sal_uInt16 nDropBar)2561*b1cdbd2cSJim Jagielski XclImpChDropBar::XclImpChDropBar( sal_uInt16 nDropBar ) :
2562*b1cdbd2cSJim Jagielski     mnDropBar( nDropBar ),
2563*b1cdbd2cSJim Jagielski     mnBarDist( 0 )
2564*b1cdbd2cSJim Jagielski {
2565*b1cdbd2cSJim Jagielski }
2566*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)2567*b1cdbd2cSJim Jagielski void XclImpChDropBar::ReadHeaderRecord( XclImpStream& rStrm )
2568*b1cdbd2cSJim Jagielski {
2569*b1cdbd2cSJim Jagielski     rStrm >> mnBarDist;
2570*b1cdbd2cSJim Jagielski }
2571*b1cdbd2cSJim Jagielski 
Convert(const XclImpChRoot & rRoot,ScfPropertySet & rPropSet) const2572*b1cdbd2cSJim Jagielski void XclImpChDropBar::Convert( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet ) const
2573*b1cdbd2cSJim Jagielski {
2574*b1cdbd2cSJim Jagielski     XclChObjectType eObjType = EXC_CHOBJTYPE_BACKGROUND;
2575*b1cdbd2cSJim Jagielski     switch( mnDropBar )
2576*b1cdbd2cSJim Jagielski     {
2577*b1cdbd2cSJim Jagielski         case EXC_CHDROPBAR_UP:      eObjType = EXC_CHOBJTYPE_WHITEDROPBAR;  break;
2578*b1cdbd2cSJim Jagielski         case EXC_CHDROPBAR_DOWN:    eObjType = EXC_CHOBJTYPE_BLACKDROPBAR;  break;
2579*b1cdbd2cSJim Jagielski     }
2580*b1cdbd2cSJim Jagielski     ConvertFrameBase( rRoot, rPropSet, eObjType );
2581*b1cdbd2cSJim Jagielski }
2582*b1cdbd2cSJim Jagielski 
2583*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
2584*b1cdbd2cSJim Jagielski 
XclImpChTypeGroup(const XclImpChRoot & rRoot)2585*b1cdbd2cSJim Jagielski XclImpChTypeGroup::XclImpChTypeGroup( const XclImpChRoot& rRoot ) :
2586*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot ),
2587*b1cdbd2cSJim Jagielski     maType( rRoot ),
2588*b1cdbd2cSJim Jagielski     maTypeInfo( maType.GetTypeInfo() )
2589*b1cdbd2cSJim Jagielski {
2590*b1cdbd2cSJim Jagielski     // Initialize unused format indexes set. At this time, all formats are unused.
2591*b1cdbd2cSJim Jagielski     for( sal_uInt16 nFormatIdx = 0; nFormatIdx <= EXC_CHSERIES_MAXSERIES; ++nFormatIdx )
2592*b1cdbd2cSJim Jagielski         maUnusedFormats.insert( maUnusedFormats.end(), nFormatIdx );
2593*b1cdbd2cSJim Jagielski }
2594*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)2595*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::ReadHeaderRecord( XclImpStream& rStrm )
2596*b1cdbd2cSJim Jagielski {
2597*b1cdbd2cSJim Jagielski     rStrm.Ignore( 16 );
2598*b1cdbd2cSJim Jagielski     rStrm >> maData.mnFlags >> maData.mnGroupIdx;
2599*b1cdbd2cSJim Jagielski }
2600*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)2601*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::ReadSubRecord( XclImpStream& rStrm )
2602*b1cdbd2cSJim Jagielski {
2603*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
2604*b1cdbd2cSJim Jagielski     {
2605*b1cdbd2cSJim Jagielski         case EXC_ID_CHCHART3D:
2606*b1cdbd2cSJim Jagielski             mxChart3d.reset( new XclImpChChart3d );
2607*b1cdbd2cSJim Jagielski             mxChart3d->ReadChChart3d( rStrm );
2608*b1cdbd2cSJim Jagielski         break;
2609*b1cdbd2cSJim Jagielski         case EXC_ID_CHLEGEND:
2610*b1cdbd2cSJim Jagielski             mxLegend.reset( new XclImpChLegend( GetChRoot() ) );
2611*b1cdbd2cSJim Jagielski             mxLegend->ReadRecordGroup( rStrm );
2612*b1cdbd2cSJim Jagielski         break;
2613*b1cdbd2cSJim Jagielski         case EXC_ID_CHDEFAULTTEXT:
2614*b1cdbd2cSJim Jagielski             GetChartData().ReadChDefaultText( rStrm );
2615*b1cdbd2cSJim Jagielski         break;
2616*b1cdbd2cSJim Jagielski         case EXC_ID_CHDROPBAR:
2617*b1cdbd2cSJim Jagielski             ReadChDropBar( rStrm );
2618*b1cdbd2cSJim Jagielski         break;
2619*b1cdbd2cSJim Jagielski         case EXC_ID_CHCHARTLINE:
2620*b1cdbd2cSJim Jagielski             ReadChChartLine( rStrm );
2621*b1cdbd2cSJim Jagielski         break;
2622*b1cdbd2cSJim Jagielski         case EXC_ID_CHDATAFORMAT:
2623*b1cdbd2cSJim Jagielski             ReadChDataFormat( rStrm );
2624*b1cdbd2cSJim Jagielski         break;
2625*b1cdbd2cSJim Jagielski         default:
2626*b1cdbd2cSJim Jagielski             maType.ReadChType( rStrm );
2627*b1cdbd2cSJim Jagielski     }
2628*b1cdbd2cSJim Jagielski }
2629*b1cdbd2cSJim Jagielski 
Finalize()2630*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::Finalize()
2631*b1cdbd2cSJim Jagielski {
2632*b1cdbd2cSJim Jagielski     // check and set valid chart type
2633*b1cdbd2cSJim Jagielski     bool bStockChart =
2634*b1cdbd2cSJim Jagielski         (maType.GetRecId() == EXC_ID_CHLINE) &&         // must be a line chart
2635*b1cdbd2cSJim Jagielski         !mxChart3d &&                                   // must be a 2d chart
2636*b1cdbd2cSJim Jagielski         HasHiLoLine() &&                                // must contain hi-lo lines
2637*b1cdbd2cSJim Jagielski         (maSeries.size() == static_cast<XclImpChSeriesVec::size_type>(HasDropBars() ? 4 : 3));   // correct series count
2638*b1cdbd2cSJim Jagielski     maType.Finalize( bStockChart );
2639*b1cdbd2cSJim Jagielski 
2640*b1cdbd2cSJim Jagielski     // extended type info
2641*b1cdbd2cSJim Jagielski     maTypeInfo.Set( maType.GetTypeInfo(), mxChart3d.is(), false );
2642*b1cdbd2cSJim Jagielski 
2643*b1cdbd2cSJim Jagielski     // reverse series order for some unstacked 2D chart types
2644*b1cdbd2cSJim Jagielski     if( maTypeInfo.mbReverseSeries && !Is3dChart() && !maType.IsStacked() && !maType.IsPercent() )
2645*b1cdbd2cSJim Jagielski         ::std::reverse( maSeries.begin(), maSeries.end() );
2646*b1cdbd2cSJim Jagielski 
2647*b1cdbd2cSJim Jagielski     // update chart type group format, may depend on chart type finalized above
2648*b1cdbd2cSJim Jagielski     if( mxGroupFmt.is() )
2649*b1cdbd2cSJim Jagielski         mxGroupFmt->UpdateGroupFormat( maTypeInfo );
2650*b1cdbd2cSJim Jagielski }
2651*b1cdbd2cSJim Jagielski 
AddSeries(XclImpChSeriesRef xSeries)2652*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::AddSeries( XclImpChSeriesRef xSeries )
2653*b1cdbd2cSJim Jagielski {
2654*b1cdbd2cSJim Jagielski     if( xSeries.is() )
2655*b1cdbd2cSJim Jagielski         maSeries.push_back( xSeries );
2656*b1cdbd2cSJim Jagielski     // store first inserted series separately, series order may be reversed later
2657*b1cdbd2cSJim Jagielski     if( !mxFirstSeries )
2658*b1cdbd2cSJim Jagielski         mxFirstSeries = xSeries;
2659*b1cdbd2cSJim Jagielski }
2660*b1cdbd2cSJim Jagielski 
SetUsedFormatIndex(sal_uInt16 nFormatIdx)2661*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::SetUsedFormatIndex( sal_uInt16 nFormatIdx )
2662*b1cdbd2cSJim Jagielski {
2663*b1cdbd2cSJim Jagielski     maUnusedFormats.erase( nFormatIdx );
2664*b1cdbd2cSJim Jagielski }
2665*b1cdbd2cSJim Jagielski 
PopUnusedFormatIndex()2666*b1cdbd2cSJim Jagielski sal_uInt16 XclImpChTypeGroup::PopUnusedFormatIndex()
2667*b1cdbd2cSJim Jagielski {
2668*b1cdbd2cSJim Jagielski     DBG_ASSERT( !maUnusedFormats.empty(), "XclImpChTypeGroup::PopUnusedFormatIndex - no more format indexes available" );
2669*b1cdbd2cSJim Jagielski     sal_uInt16 nFormatIdx = maUnusedFormats.empty() ? 0 : *maUnusedFormats.begin();
2670*b1cdbd2cSJim Jagielski     SetUsedFormatIndex( nFormatIdx );
2671*b1cdbd2cSJim Jagielski     return nFormatIdx;
2672*b1cdbd2cSJim Jagielski }
2673*b1cdbd2cSJim Jagielski 
HasVarPointFormat() const2674*b1cdbd2cSJim Jagielski bool XclImpChTypeGroup::HasVarPointFormat() const
2675*b1cdbd2cSJim Jagielski {
2676*b1cdbd2cSJim Jagielski     return ::get_flag( maData.mnFlags, EXC_CHTYPEGROUP_VARIEDCOLORS ) &&
2677*b1cdbd2cSJim Jagielski         ((maTypeInfo.meVarPointMode == EXC_CHVARPOINT_MULTI) ||         // multiple series allowed
2678*b1cdbd2cSJim Jagielski             ((maTypeInfo.meVarPointMode == EXC_CHVARPOINT_SINGLE) &&    // or exactly 1 series?
2679*b1cdbd2cSJim Jagielski                 (maSeries.size() == 1)));
2680*b1cdbd2cSJim Jagielski }
2681*b1cdbd2cSJim Jagielski 
HasConnectorLines() const2682*b1cdbd2cSJim Jagielski bool XclImpChTypeGroup::HasConnectorLines() const
2683*b1cdbd2cSJim Jagielski {
2684*b1cdbd2cSJim Jagielski     // existence of connector lines (only in stacked bar charts)
2685*b1cdbd2cSJim Jagielski     bool bAnyStacked = maType.IsStacked() || maType.IsPercent();
2686*b1cdbd2cSJim Jagielski     XclImpChLineFormatRef xConnLine = maChartLines.get( EXC_CHCHARTLINE_CONNECT );
2687*b1cdbd2cSJim Jagielski     return bAnyStacked && (maTypeInfo.meTypeCateg == EXC_CHTYPECATEG_BAR) && xConnLine.is() && xConnLine->HasLine();
2688*b1cdbd2cSJim Jagielski }
2689*b1cdbd2cSJim Jagielski 
GetSingleSeriesTitle() const2690*b1cdbd2cSJim Jagielski const String& XclImpChTypeGroup::GetSingleSeriesTitle() const
2691*b1cdbd2cSJim Jagielski {
2692*b1cdbd2cSJim Jagielski     // no automatic title for series with trendlines or error bars
2693*b1cdbd2cSJim Jagielski     // pie charts always show an automatic title, even if more series exist
2694*b1cdbd2cSJim Jagielski     return (mxFirstSeries.is() && !mxFirstSeries->HasChildSeries() && (maTypeInfo.mbSingleSeriesVis || (maSeries.size() == 1))) ?
2695*b1cdbd2cSJim Jagielski         mxFirstSeries->GetTitle() : String::EmptyString();
2696*b1cdbd2cSJim Jagielski }
2697*b1cdbd2cSJim Jagielski 
ConvertChart3d(ScfPropertySet & rPropSet) const2698*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::ConvertChart3d( ScfPropertySet& rPropSet ) const
2699*b1cdbd2cSJim Jagielski {
2700*b1cdbd2cSJim Jagielski     if( mxChart3d.is() )
2701*b1cdbd2cSJim Jagielski         mxChart3d->Convert( rPropSet, Is3dWallChart() );
2702*b1cdbd2cSJim Jagielski }
2703*b1cdbd2cSJim Jagielski 
CreateCoordSystem() const2704*b1cdbd2cSJim Jagielski Reference< XCoordinateSystem > XclImpChTypeGroup::CreateCoordSystem() const
2705*b1cdbd2cSJim Jagielski {
2706*b1cdbd2cSJim Jagielski     return maType.CreateCoordSystem( Is3dChart() );
2707*b1cdbd2cSJim Jagielski }
2708*b1cdbd2cSJim Jagielski 
CreateChartType(Reference<XDiagram> xDiagram,sal_Int32 nApiAxesSetIdx) const2709*b1cdbd2cSJim Jagielski Reference< XChartType > XclImpChTypeGroup::CreateChartType( Reference< XDiagram > xDiagram, sal_Int32 nApiAxesSetIdx ) const
2710*b1cdbd2cSJim Jagielski {
2711*b1cdbd2cSJim Jagielski     DBG_ASSERT( IsValidGroup(), "XclImpChTypeGroup::CreateChartType - type group without series" );
2712*b1cdbd2cSJim Jagielski 
2713*b1cdbd2cSJim Jagielski     // create the chart type object
2714*b1cdbd2cSJim Jagielski     Reference< XChartType > xChartType = maType.CreateChartType( xDiagram, Is3dChart() );
2715*b1cdbd2cSJim Jagielski 
2716*b1cdbd2cSJim Jagielski     // bar chart connector lines
2717*b1cdbd2cSJim Jagielski     if( HasConnectorLines() )
2718*b1cdbd2cSJim Jagielski     {
2719*b1cdbd2cSJim Jagielski         ScfPropertySet aDiaProp( xDiagram );
2720*b1cdbd2cSJim Jagielski         aDiaProp.SetBoolProperty( EXC_CHPROP_CONNECTBARS, true );
2721*b1cdbd2cSJim Jagielski     }
2722*b1cdbd2cSJim Jagielski 
2723*b1cdbd2cSJim Jagielski     /*  Stock chart needs special processing. Create one 'big' series with
2724*b1cdbd2cSJim Jagielski         data sequences of different roles. */
2725*b1cdbd2cSJim Jagielski     if( maTypeInfo.meTypeId == EXC_CHTYPEID_STOCK )
2726*b1cdbd2cSJim Jagielski         CreateStockSeries( xChartType, nApiAxesSetIdx );
2727*b1cdbd2cSJim Jagielski     else
2728*b1cdbd2cSJim Jagielski         CreateDataSeries( xChartType, nApiAxesSetIdx );
2729*b1cdbd2cSJim Jagielski 
2730*b1cdbd2cSJim Jagielski     return xChartType;
2731*b1cdbd2cSJim Jagielski }
2732*b1cdbd2cSJim Jagielski 
CreateCategSequence() const2733*b1cdbd2cSJim Jagielski Reference< XLabeledDataSequence > XclImpChTypeGroup::CreateCategSequence() const
2734*b1cdbd2cSJim Jagielski {
2735*b1cdbd2cSJim Jagielski     Reference< XLabeledDataSequence > xLabeledSeq;
2736*b1cdbd2cSJim Jagielski     // create category sequence from first visible series
2737*b1cdbd2cSJim Jagielski     if( mxFirstSeries.is() )
2738*b1cdbd2cSJim Jagielski         xLabeledSeq = mxFirstSeries->CreateCategSequence( EXC_CHPROP_ROLE_CATEG );
2739*b1cdbd2cSJim Jagielski     return xLabeledSeq;
2740*b1cdbd2cSJim Jagielski }
2741*b1cdbd2cSJim Jagielski 
ReadChDropBar(XclImpStream & rStrm)2742*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::ReadChDropBar( XclImpStream& rStrm )
2743*b1cdbd2cSJim Jagielski {
2744*b1cdbd2cSJim Jagielski     sal_uInt16 nDropBar = EXC_CHDROPBAR_NONE;
2745*b1cdbd2cSJim Jagielski     if( !maDropBars.has( EXC_CHDROPBAR_UP ) )
2746*b1cdbd2cSJim Jagielski         nDropBar = EXC_CHDROPBAR_UP;
2747*b1cdbd2cSJim Jagielski     else if( !maDropBars.has( EXC_CHDROPBAR_DOWN ) )
2748*b1cdbd2cSJim Jagielski         nDropBar = EXC_CHDROPBAR_DOWN;
2749*b1cdbd2cSJim Jagielski 
2750*b1cdbd2cSJim Jagielski     if( nDropBar != EXC_CHDROPBAR_NONE )
2751*b1cdbd2cSJim Jagielski     {
2752*b1cdbd2cSJim Jagielski         XclImpChDropBarRef xDropBar( new XclImpChDropBar( nDropBar ) );
2753*b1cdbd2cSJim Jagielski         xDropBar->ReadRecordGroup( rStrm );
2754*b1cdbd2cSJim Jagielski         maDropBars[ nDropBar ] = xDropBar;
2755*b1cdbd2cSJim Jagielski     }
2756*b1cdbd2cSJim Jagielski }
2757*b1cdbd2cSJim Jagielski 
ReadChChartLine(XclImpStream & rStrm)2758*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::ReadChChartLine( XclImpStream& rStrm )
2759*b1cdbd2cSJim Jagielski {
2760*b1cdbd2cSJim Jagielski     sal_uInt16 nLineId = rStrm.ReaduInt16();
2761*b1cdbd2cSJim Jagielski     if( (rStrm.GetNextRecId() == EXC_ID_CHLINEFORMAT) && rStrm.StartNextRecord() )
2762*b1cdbd2cSJim Jagielski     {
2763*b1cdbd2cSJim Jagielski         XclImpChLineFormatRef xLineFmt( new XclImpChLineFormat );
2764*b1cdbd2cSJim Jagielski         xLineFmt->ReadChLineFormat( rStrm );
2765*b1cdbd2cSJim Jagielski         maChartLines[ nLineId ] = xLineFmt;
2766*b1cdbd2cSJim Jagielski     }
2767*b1cdbd2cSJim Jagielski }
2768*b1cdbd2cSJim Jagielski 
ReadChDataFormat(XclImpStream & rStrm)2769*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::ReadChDataFormat( XclImpStream& rStrm )
2770*b1cdbd2cSJim Jagielski {
2771*b1cdbd2cSJim Jagielski     // global series and data point format
2772*b1cdbd2cSJim Jagielski     XclImpChDataFormatRef xDataFmt( new XclImpChDataFormat( GetChRoot() ) );
2773*b1cdbd2cSJim Jagielski     xDataFmt->ReadRecordGroup( rStrm );
2774*b1cdbd2cSJim Jagielski     const XclChDataPointPos& rPos = xDataFmt->GetPointPos();
2775*b1cdbd2cSJim Jagielski     if( (rPos.mnSeriesIdx == 0) && (rPos.mnPointIdx == 0) &&
2776*b1cdbd2cSJim Jagielski             (xDataFmt->GetFormatIdx() == EXC_CHDATAFORMAT_DEFAULT) )
2777*b1cdbd2cSJim Jagielski         mxGroupFmt = xDataFmt;
2778*b1cdbd2cSJim Jagielski }
2779*b1cdbd2cSJim Jagielski 
2780*b1cdbd2cSJim Jagielski 
InsertDataSeries(Reference<XChartType> xChartType,Reference<XDataSeries> xSeries,sal_Int32 nApiAxesSetIdx) const2781*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::InsertDataSeries( Reference< XChartType > xChartType,
2782*b1cdbd2cSJim Jagielski         Reference< XDataSeries > xSeries, sal_Int32 nApiAxesSetIdx ) const
2783*b1cdbd2cSJim Jagielski {
2784*b1cdbd2cSJim Jagielski     Reference< XDataSeriesContainer > xSeriesCont( xChartType, UNO_QUERY );
2785*b1cdbd2cSJim Jagielski     if( xSeriesCont.is() && xSeries.is() )
2786*b1cdbd2cSJim Jagielski     {
2787*b1cdbd2cSJim Jagielski         // series stacking mode
2788*b1cdbd2cSJim Jagielski         cssc2::StackingDirection eStacking = cssc2::StackingDirection_NO_STACKING;
2789*b1cdbd2cSJim Jagielski         // stacked overrides deep-3d
2790*b1cdbd2cSJim Jagielski         if( maType.IsStacked() || maType.IsPercent() )
2791*b1cdbd2cSJim Jagielski             eStacking = cssc2::StackingDirection_Y_STACKING;
2792*b1cdbd2cSJim Jagielski         else if( Is3dDeepChart() )
2793*b1cdbd2cSJim Jagielski             eStacking = cssc2::StackingDirection_Z_STACKING;
2794*b1cdbd2cSJim Jagielski 
2795*b1cdbd2cSJim Jagielski         // additional series properties
2796*b1cdbd2cSJim Jagielski         ScfPropertySet aSeriesProp( xSeries );
2797*b1cdbd2cSJim Jagielski         aSeriesProp.SetProperty( EXC_CHPROP_STACKINGDIR, eStacking );
2798*b1cdbd2cSJim Jagielski         aSeriesProp.SetProperty( EXC_CHPROP_ATTAXISINDEX, nApiAxesSetIdx );
2799*b1cdbd2cSJim Jagielski 
2800*b1cdbd2cSJim Jagielski         // insert series into container
2801*b1cdbd2cSJim Jagielski         try
2802*b1cdbd2cSJim Jagielski         {
2803*b1cdbd2cSJim Jagielski             xSeriesCont->addDataSeries( xSeries );
2804*b1cdbd2cSJim Jagielski         }
2805*b1cdbd2cSJim Jagielski         catch( Exception& )
2806*b1cdbd2cSJim Jagielski         {
2807*b1cdbd2cSJim Jagielski             DBG_ERRORFILE( "XclImpChTypeGroup::InsertDataSeries - cannot add data series" );
2808*b1cdbd2cSJim Jagielski         }
2809*b1cdbd2cSJim Jagielski     }
2810*b1cdbd2cSJim Jagielski }
2811*b1cdbd2cSJim Jagielski 
CreateDataSeries(Reference<XChartType> xChartType,sal_Int32 nApiAxesSetIdx) const2812*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::CreateDataSeries( Reference< XChartType > xChartType, sal_Int32 nApiAxesSetIdx ) const
2813*b1cdbd2cSJim Jagielski {
2814*b1cdbd2cSJim Jagielski     bool bSpline = false;
2815*b1cdbd2cSJim Jagielski     for( XclImpChSeriesVec::const_iterator aIt = maSeries.begin(), aEnd = maSeries.end(); aIt != aEnd; ++aIt )
2816*b1cdbd2cSJim Jagielski     {
2817*b1cdbd2cSJim Jagielski         Reference< XDataSeries > xDataSeries = (*aIt)->CreateDataSeries();
2818*b1cdbd2cSJim Jagielski         InsertDataSeries( xChartType, xDataSeries, nApiAxesSetIdx );
2819*b1cdbd2cSJim Jagielski         bSpline |= (*aIt)->HasSpline();
2820*b1cdbd2cSJim Jagielski     }
2821*b1cdbd2cSJim Jagielski     // spline - TODO: set at single series (#i66858#)
2822*b1cdbd2cSJim Jagielski     if( bSpline && !maTypeInfo.IsSeriesFrameFormat() && (maTypeInfo.meTypeCateg != EXC_CHTYPECATEG_RADAR) )
2823*b1cdbd2cSJim Jagielski     {
2824*b1cdbd2cSJim Jagielski         ScfPropertySet aTypeProp( xChartType );
2825*b1cdbd2cSJim Jagielski         aTypeProp.SetProperty( EXC_CHPROP_CURVESTYLE, ::com::sun::star::chart2::CurveStyle_CUBIC_SPLINES );
2826*b1cdbd2cSJim Jagielski     }
2827*b1cdbd2cSJim Jagielski }
2828*b1cdbd2cSJim Jagielski 
CreateStockSeries(Reference<XChartType> xChartType,sal_Int32 nApiAxesSetIdx) const2829*b1cdbd2cSJim Jagielski void XclImpChTypeGroup::CreateStockSeries( Reference< XChartType > xChartType, sal_Int32 nApiAxesSetIdx ) const
2830*b1cdbd2cSJim Jagielski {
2831*b1cdbd2cSJim Jagielski     // create the data series object
2832*b1cdbd2cSJim Jagielski     Reference< XDataSeries > xDataSeries( ScfApiHelper::CreateInstance( SERVICE_CHART2_DATASERIES ), UNO_QUERY );
2833*b1cdbd2cSJim Jagielski     Reference< XDataSink > xDataSink( xDataSeries, UNO_QUERY );
2834*b1cdbd2cSJim Jagielski     if( xDataSink.is() )
2835*b1cdbd2cSJim Jagielski     {
2836*b1cdbd2cSJim Jagielski         // create a list of data sequences from all series
2837*b1cdbd2cSJim Jagielski         ::std::vector< Reference< XLabeledDataSequence > > aLabeledSeqVec;
2838*b1cdbd2cSJim Jagielski         DBG_ASSERT( maSeries.size() >= 3, "XclImpChTypeGroup::CreateChartType - missing stock series" );
2839*b1cdbd2cSJim Jagielski         int nRoleIdx = (maSeries.size() == 3) ? 1 : 0;
2840*b1cdbd2cSJim Jagielski         for( XclImpChSeriesVec::const_iterator aIt = maSeries.begin(), aEnd = maSeries.end();
2841*b1cdbd2cSJim Jagielski                 (nRoleIdx < 4) && (aIt != aEnd); ++nRoleIdx, ++aIt )
2842*b1cdbd2cSJim Jagielski         {
2843*b1cdbd2cSJim Jagielski             // create a data sequence with a specific role
2844*b1cdbd2cSJim Jagielski             OUString aRole;
2845*b1cdbd2cSJim Jagielski             switch( nRoleIdx )
2846*b1cdbd2cSJim Jagielski             {
2847*b1cdbd2cSJim Jagielski                 case 0: aRole = EXC_CHPROP_ROLE_OPENVALUES;     break;
2848*b1cdbd2cSJim Jagielski                 case 1: aRole = EXC_CHPROP_ROLE_HIGHVALUES;     break;
2849*b1cdbd2cSJim Jagielski                 case 2: aRole = EXC_CHPROP_ROLE_LOWVALUES;      break;
2850*b1cdbd2cSJim Jagielski                 case 3: aRole = EXC_CHPROP_ROLE_CLOSEVALUES;    break;
2851*b1cdbd2cSJim Jagielski             }
2852*b1cdbd2cSJim Jagielski             Reference< XLabeledDataSequence > xDataSeq = (*aIt)->CreateValueSequence( aRole );
2853*b1cdbd2cSJim Jagielski             if( xDataSeq.is() )
2854*b1cdbd2cSJim Jagielski                 aLabeledSeqVec.push_back( xDataSeq );
2855*b1cdbd2cSJim Jagielski         }
2856*b1cdbd2cSJim Jagielski 
2857*b1cdbd2cSJim Jagielski         // attach labeled data sequences to series and insert series into chart type
2858*b1cdbd2cSJim Jagielski         xDataSink->setData( ScfApiHelper::VectorToSequence( aLabeledSeqVec ) );
2859*b1cdbd2cSJim Jagielski 
2860*b1cdbd2cSJim Jagielski         // formatting of special stock chart elements
2861*b1cdbd2cSJim Jagielski         ScfPropertySet aTypeProp( xChartType );
2862*b1cdbd2cSJim Jagielski         aTypeProp.SetBoolProperty( EXC_CHPROP_JAPANESE, HasDropBars() );
2863*b1cdbd2cSJim Jagielski         aTypeProp.SetBoolProperty( EXC_CHPROP_SHOWFIRST, HasDropBars() );
2864*b1cdbd2cSJim Jagielski         aTypeProp.SetBoolProperty( EXC_CHPROP_SHOWHIGHLOW, true );
2865*b1cdbd2cSJim Jagielski         // hi-lo line format
2866*b1cdbd2cSJim Jagielski         XclImpChLineFormatRef xHiLoLine = maChartLines.get( EXC_CHCHARTLINE_HILO );
2867*b1cdbd2cSJim Jagielski         if( xHiLoLine.is() )
2868*b1cdbd2cSJim Jagielski         {
2869*b1cdbd2cSJim Jagielski             ScfPropertySet aSeriesProp( xDataSeries );
2870*b1cdbd2cSJim Jagielski             xHiLoLine->Convert( GetChRoot(), aSeriesProp, EXC_CHOBJTYPE_HILOLINE );
2871*b1cdbd2cSJim Jagielski         }
2872*b1cdbd2cSJim Jagielski         // white dropbar format
2873*b1cdbd2cSJim Jagielski         XclImpChDropBarRef xUpBar = maDropBars.get( EXC_CHDROPBAR_UP );
2874*b1cdbd2cSJim Jagielski         Reference< XPropertySet > xWhitePropSet;
2875*b1cdbd2cSJim Jagielski         if( xUpBar.is() && aTypeProp.GetProperty( xWhitePropSet, EXC_CHPROP_WHITEDAY ) )
2876*b1cdbd2cSJim Jagielski         {
2877*b1cdbd2cSJim Jagielski             ScfPropertySet aBarProp( xWhitePropSet );
2878*b1cdbd2cSJim Jagielski             xUpBar->Convert( GetChRoot(), aBarProp );
2879*b1cdbd2cSJim Jagielski         }
2880*b1cdbd2cSJim Jagielski         // black dropbar format
2881*b1cdbd2cSJim Jagielski         XclImpChDropBarRef xDownBar = maDropBars.get( EXC_CHDROPBAR_DOWN );
2882*b1cdbd2cSJim Jagielski         Reference< XPropertySet > xBlackPropSet;
2883*b1cdbd2cSJim Jagielski         if( xDownBar.is() && aTypeProp.GetProperty( xBlackPropSet, EXC_CHPROP_BLACKDAY ) )
2884*b1cdbd2cSJim Jagielski         {
2885*b1cdbd2cSJim Jagielski             ScfPropertySet aBarProp( xBlackPropSet );
2886*b1cdbd2cSJim Jagielski             xDownBar->Convert( GetChRoot(), aBarProp );
2887*b1cdbd2cSJim Jagielski         }
2888*b1cdbd2cSJim Jagielski 
2889*b1cdbd2cSJim Jagielski         // insert the series into the chart type object
2890*b1cdbd2cSJim Jagielski         InsertDataSeries( xChartType, xDataSeries, nApiAxesSetIdx );
2891*b1cdbd2cSJim Jagielski     }
2892*b1cdbd2cSJim Jagielski }
2893*b1cdbd2cSJim Jagielski 
2894*b1cdbd2cSJim Jagielski // Axes =======================================================================
2895*b1cdbd2cSJim Jagielski 
XclImpChLabelRange(const XclImpChRoot & rRoot)2896*b1cdbd2cSJim Jagielski XclImpChLabelRange::XclImpChLabelRange( const XclImpChRoot& rRoot ) :
2897*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
2898*b1cdbd2cSJim Jagielski {
2899*b1cdbd2cSJim Jagielski }
2900*b1cdbd2cSJim Jagielski 
ReadChLabelRange(XclImpStream & rStrm)2901*b1cdbd2cSJim Jagielski void XclImpChLabelRange::ReadChLabelRange( XclImpStream& rStrm )
2902*b1cdbd2cSJim Jagielski {
2903*b1cdbd2cSJim Jagielski     rStrm >> maLabelData.mnCross >> maLabelData.mnLabelFreq >> maLabelData.mnTickFreq >> maLabelData.mnFlags;
2904*b1cdbd2cSJim Jagielski }
2905*b1cdbd2cSJim Jagielski 
ReadChDateRange(XclImpStream & rStrm)2906*b1cdbd2cSJim Jagielski void XclImpChLabelRange::ReadChDateRange( XclImpStream& rStrm )
2907*b1cdbd2cSJim Jagielski {
2908*b1cdbd2cSJim Jagielski     rStrm   >> maDateData.mnMinDate
2909*b1cdbd2cSJim Jagielski             >> maDateData.mnMaxDate
2910*b1cdbd2cSJim Jagielski             >> maDateData.mnMajorStep
2911*b1cdbd2cSJim Jagielski             >> maDateData.mnMajorUnit
2912*b1cdbd2cSJim Jagielski             >> maDateData.mnMinorStep
2913*b1cdbd2cSJim Jagielski             >> maDateData.mnMinorUnit
2914*b1cdbd2cSJim Jagielski             >> maDateData.mnBaseUnit
2915*b1cdbd2cSJim Jagielski             >> maDateData.mnCross
2916*b1cdbd2cSJim Jagielski             >> maDateData.mnFlags;
2917*b1cdbd2cSJim Jagielski }
2918*b1cdbd2cSJim Jagielski 
Convert(ScfPropertySet & rPropSet,ScaleData & rScaleData,bool bMirrorOrient) const2919*b1cdbd2cSJim Jagielski void XclImpChLabelRange::Convert( ScfPropertySet& rPropSet, ScaleData& rScaleData, bool bMirrorOrient ) const
2920*b1cdbd2cSJim Jagielski {
2921*b1cdbd2cSJim Jagielski     // automatic axis type detection
2922*b1cdbd2cSJim Jagielski     rScaleData.AutoDateAxis = ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_AUTODATE );
2923*b1cdbd2cSJim Jagielski 
2924*b1cdbd2cSJim Jagielski     // the flag EXC_CHDATERANGE_DATEAXIS specifies whether this is a date axis
2925*b1cdbd2cSJim Jagielski     if( ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_DATEAXIS ) )
2926*b1cdbd2cSJim Jagielski     {
2927*b1cdbd2cSJim Jagielski         /*  Chart2 requires axis type CATEGORY for automatic category/date axis
2928*b1cdbd2cSJim Jagielski             (even if it is a date axis currently). */
2929*b1cdbd2cSJim Jagielski         rScaleData.AxisType = rScaleData.AutoDateAxis ? cssc2::AxisType::CATEGORY : cssc2::AxisType::DATE;
2930*b1cdbd2cSJim Jagielski         rScaleData.Scaling.set( ScfApiHelper::CreateInstance( SERVICE_CHART2_LINEARSCALING ), UNO_QUERY );
2931*b1cdbd2cSJim Jagielski         /*  Min/max values depend on base time unit, they specify the number of
2932*b1cdbd2cSJim Jagielski             days, months, or years starting from null date. */
2933*b1cdbd2cSJim Jagielski         lclConvertTimeValue( GetRoot(), rScaleData.Minimum, maDateData.mnMinDate, ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_AUTOMIN ), maDateData.mnBaseUnit );
2934*b1cdbd2cSJim Jagielski         lclConvertTimeValue( GetRoot(), rScaleData.Maximum, maDateData.mnMaxDate, ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_AUTOMAX ), maDateData.mnBaseUnit );
2935*b1cdbd2cSJim Jagielski         // increment
2936*b1cdbd2cSJim Jagielski         cssc::TimeIncrement& rTimeIncrement = rScaleData.TimeIncrement;
2937*b1cdbd2cSJim Jagielski         lclConvertTimeInterval( rTimeIncrement.MajorTimeInterval, maDateData.mnMajorStep, ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_AUTOMAJOR ), maDateData.mnMajorUnit );
2938*b1cdbd2cSJim Jagielski         lclConvertTimeInterval( rTimeIncrement.MinorTimeInterval, maDateData.mnMinorStep, ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_AUTOMINOR ), maDateData.mnMinorUnit );
2939*b1cdbd2cSJim Jagielski         // base unit
2940*b1cdbd2cSJim Jagielski         if( ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_AUTOBASE ) )
2941*b1cdbd2cSJim Jagielski             rTimeIncrement.TimeResolution.clear();
2942*b1cdbd2cSJim Jagielski         else
2943*b1cdbd2cSJim Jagielski             rTimeIncrement.TimeResolution <<= lclGetApiTimeUnit( maDateData.mnBaseUnit );
2944*b1cdbd2cSJim Jagielski     }
2945*b1cdbd2cSJim Jagielski     else
2946*b1cdbd2cSJim Jagielski     {
2947*b1cdbd2cSJim Jagielski         // do not overlap text unless all labels are visible
2948*b1cdbd2cSJim Jagielski         rPropSet.SetBoolProperty( EXC_CHPROP_TEXTOVERLAP, maLabelData.mnLabelFreq == 1 );
2949*b1cdbd2cSJim Jagielski         // do not break text into several lines unless all labels are visible
2950*b1cdbd2cSJim Jagielski         rPropSet.SetBoolProperty( EXC_CHPROP_TEXTBREAK, maLabelData.mnLabelFreq == 1 );
2951*b1cdbd2cSJim Jagielski         // do not stagger labels in two lines
2952*b1cdbd2cSJim Jagielski         rPropSet.SetProperty( EXC_CHPROP_ARRANGEORDER, cssc::ChartAxisArrangeOrderType_SIDE_BY_SIDE );
2953*b1cdbd2cSJim Jagielski     }
2954*b1cdbd2cSJim Jagielski 
2955*b1cdbd2cSJim Jagielski     // reverse order
2956*b1cdbd2cSJim Jagielski     bool bReverse = ::get_flag( maLabelData.mnFlags, EXC_CHLABELRANGE_REVERSE ) != bMirrorOrient;
2957*b1cdbd2cSJim Jagielski     rScaleData.Orientation = bReverse ? cssc2::AxisOrientation_REVERSE : cssc2::AxisOrientation_MATHEMATICAL;
2958*b1cdbd2cSJim Jagielski 
2959*b1cdbd2cSJim Jagielski     //! TODO #i58731# show n-th category
2960*b1cdbd2cSJim Jagielski }
2961*b1cdbd2cSJim Jagielski 
ConvertAxisPosition(ScfPropertySet & rPropSet,bool b3dChart) const2962*b1cdbd2cSJim Jagielski void XclImpChLabelRange::ConvertAxisPosition( ScfPropertySet& rPropSet, bool b3dChart ) const
2963*b1cdbd2cSJim Jagielski {
2964*b1cdbd2cSJim Jagielski     /*  Crossing mode (max-cross flag overrides other crossing settings). Excel
2965*b1cdbd2cSJim Jagielski         does not move the Y axis in 3D charts, regardless of actual settings.
2966*b1cdbd2cSJim Jagielski         But: the Y axis has to be moved to "end", if the X axis is mirrored,
2967*b1cdbd2cSJim Jagielski         to keep it at the left end of the chart. */
2968*b1cdbd2cSJim Jagielski     bool bMaxCross = ::get_flag( maLabelData.mnFlags, b3dChart ? EXC_CHLABELRANGE_REVERSE : EXC_CHLABELRANGE_MAXCROSS );
2969*b1cdbd2cSJim Jagielski     cssc::ChartAxisPosition eAxisPos = bMaxCross ? cssc::ChartAxisPosition_END : cssc::ChartAxisPosition_VALUE;
2970*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_CROSSOVERPOSITION, eAxisPos );
2971*b1cdbd2cSJim Jagielski 
2972*b1cdbd2cSJim Jagielski     // crossing position (depending on axis type text/date)
2973*b1cdbd2cSJim Jagielski     if( ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_DATEAXIS ) )
2974*b1cdbd2cSJim Jagielski     {
2975*b1cdbd2cSJim Jagielski         bool bAutoCross = ::get_flag( maDateData.mnFlags, EXC_CHDATERANGE_AUTOCROSS );
2976*b1cdbd2cSJim Jagielski         /*  Crossing position value depends on base time unit, it specifies the
2977*b1cdbd2cSJim Jagielski             number of days, months, or years from null date. Note that Excel
2978*b1cdbd2cSJim Jagielski             2007/2010 write broken BIFF8 files, they always stores the number
2979*b1cdbd2cSJim Jagielski             of days cregardless of the base time unit (and they are reading it
2980*b1cdbd2cSJim Jagielski             the same way, thus wrongly displaying files written by Excel
2981*b1cdbd2cSJim Jagielski             97-2003). This filter sticks to the correct behaviour of Excel
2982*b1cdbd2cSJim Jagielski             97-2003. */
2983*b1cdbd2cSJim Jagielski         double fCrossingPos = bAutoCross ? 1.0 : lclGetSerialDay( GetRoot(), maDateData.mnCross, maDateData.mnBaseUnit );
2984*b1cdbd2cSJim Jagielski         rPropSet.SetProperty( EXC_CHPROP_CROSSOVERVALUE, fCrossingPos );
2985*b1cdbd2cSJim Jagielski     }
2986*b1cdbd2cSJim Jagielski     else
2987*b1cdbd2cSJim Jagielski     {
2988*b1cdbd2cSJim Jagielski         double fCrossingPos = b3dChart ? 1.0 : maLabelData.mnCross;
2989*b1cdbd2cSJim Jagielski         rPropSet.SetProperty( EXC_CHPROP_CROSSOVERVALUE, fCrossingPos );
2990*b1cdbd2cSJim Jagielski     }
2991*b1cdbd2cSJim Jagielski }
2992*b1cdbd2cSJim Jagielski 
2993*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
2994*b1cdbd2cSJim Jagielski 
XclImpChValueRange(const XclImpChRoot & rRoot)2995*b1cdbd2cSJim Jagielski XclImpChValueRange::XclImpChValueRange( const XclImpChRoot& rRoot ) :
2996*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
2997*b1cdbd2cSJim Jagielski {
2998*b1cdbd2cSJim Jagielski }
2999*b1cdbd2cSJim Jagielski 
ReadChValueRange(XclImpStream & rStrm)3000*b1cdbd2cSJim Jagielski void XclImpChValueRange::ReadChValueRange( XclImpStream& rStrm )
3001*b1cdbd2cSJim Jagielski {
3002*b1cdbd2cSJim Jagielski     rStrm   >> maData.mfMin
3003*b1cdbd2cSJim Jagielski             >> maData.mfMax
3004*b1cdbd2cSJim Jagielski             >> maData.mfMajorStep
3005*b1cdbd2cSJim Jagielski             >> maData.mfMinorStep
3006*b1cdbd2cSJim Jagielski             >> maData.mfCross
3007*b1cdbd2cSJim Jagielski             >> maData.mnFlags;
3008*b1cdbd2cSJim Jagielski }
3009*b1cdbd2cSJim Jagielski 
Convert(ScaleData & rScaleData,bool bMirrorOrient) const3010*b1cdbd2cSJim Jagielski void XclImpChValueRange::Convert( ScaleData& rScaleData, bool bMirrorOrient ) const
3011*b1cdbd2cSJim Jagielski {
3012*b1cdbd2cSJim Jagielski     // scaling algorithm
3013*b1cdbd2cSJim Jagielski     bool bLogScale = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_LOGSCALE );
3014*b1cdbd2cSJim Jagielski     OUString aScalingService = bLogScale ? SERVICE_CHART2_LOGSCALING : SERVICE_CHART2_LINEARSCALING;
3015*b1cdbd2cSJim Jagielski     rScaleData.Scaling.set( ScfApiHelper::CreateInstance( aScalingService ), UNO_QUERY );
3016*b1cdbd2cSJim Jagielski 
3017*b1cdbd2cSJim Jagielski     // min/max
3018*b1cdbd2cSJim Jagielski     lclSetExpValueOrClearAny( rScaleData.Minimum, maData.mfMin, bLogScale, ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_AUTOMIN ) );
3019*b1cdbd2cSJim Jagielski     lclSetExpValueOrClearAny( rScaleData.Maximum, maData.mfMax, bLogScale, ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_AUTOMAX ) );
3020*b1cdbd2cSJim Jagielski 
3021*b1cdbd2cSJim Jagielski     // increment
3022*b1cdbd2cSJim Jagielski     bool bAutoMajor = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_AUTOMAJOR );
3023*b1cdbd2cSJim Jagielski     bool bAutoMinor = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_AUTOMINOR );
3024*b1cdbd2cSJim Jagielski     // major increment
3025*b1cdbd2cSJim Jagielski     IncrementData& rIncrementData = rScaleData.IncrementData;
3026*b1cdbd2cSJim Jagielski     lclSetValueOrClearAny( rIncrementData.Distance, maData.mfMajorStep, bAutoMajor );
3027*b1cdbd2cSJim Jagielski     // minor increment
3028*b1cdbd2cSJim Jagielski     Sequence< SubIncrement >& rSubIncrementSeq = rIncrementData.SubIncrements;
3029*b1cdbd2cSJim Jagielski     rSubIncrementSeq.realloc( 1 );
3030*b1cdbd2cSJim Jagielski     Any& rIntervalCount = rSubIncrementSeq[ 0 ].IntervalCount;
3031*b1cdbd2cSJim Jagielski     rIntervalCount.clear();
3032*b1cdbd2cSJim Jagielski     if( bLogScale )
3033*b1cdbd2cSJim Jagielski     {
3034*b1cdbd2cSJim Jagielski         if( !bAutoMinor )
3035*b1cdbd2cSJim Jagielski             rIntervalCount <<= sal_Int32( 9 );
3036*b1cdbd2cSJim Jagielski     }
3037*b1cdbd2cSJim Jagielski     else
3038*b1cdbd2cSJim Jagielski     {
3039*b1cdbd2cSJim Jagielski         if( !bAutoMajor && !bAutoMinor && (0.0 < maData.mfMinorStep) && (maData.mfMinorStep <= maData.mfMajorStep) )
3040*b1cdbd2cSJim Jagielski         {
3041*b1cdbd2cSJim Jagielski             double fCount = maData.mfMajorStep / maData.mfMinorStep + 0.5;
3042*b1cdbd2cSJim Jagielski             if( (1.0 <= fCount) && (fCount < 1001.0) )
3043*b1cdbd2cSJim Jagielski                 rIntervalCount <<= static_cast< sal_Int32 >( fCount );
3044*b1cdbd2cSJim Jagielski         }
3045*b1cdbd2cSJim Jagielski     }
3046*b1cdbd2cSJim Jagielski 
3047*b1cdbd2cSJim Jagielski     // reverse order
3048*b1cdbd2cSJim Jagielski     bool bReverse = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_REVERSE ) != bMirrorOrient;
3049*b1cdbd2cSJim Jagielski     rScaleData.Orientation = bReverse ? cssc2::AxisOrientation_REVERSE : cssc2::AxisOrientation_MATHEMATICAL;
3050*b1cdbd2cSJim Jagielski }
3051*b1cdbd2cSJim Jagielski 
ConvertAxisPosition(ScfPropertySet & rPropSet) const3052*b1cdbd2cSJim Jagielski void XclImpChValueRange::ConvertAxisPosition( ScfPropertySet& rPropSet ) const
3053*b1cdbd2cSJim Jagielski {
3054*b1cdbd2cSJim Jagielski     bool bMaxCross = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_MAXCROSS );
3055*b1cdbd2cSJim Jagielski     bool bAutoCross = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_AUTOCROSS );
3056*b1cdbd2cSJim Jagielski     bool bLogScale = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_LOGSCALE );
3057*b1cdbd2cSJim Jagielski 
3058*b1cdbd2cSJim Jagielski     // crossing mode (max-cross flag overrides other crossing settings)
3059*b1cdbd2cSJim Jagielski     cssc::ChartAxisPosition eAxisPos = bMaxCross ? cssc::ChartAxisPosition_END : cssc::ChartAxisPosition_VALUE;
3060*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_CROSSOVERPOSITION, eAxisPos );
3061*b1cdbd2cSJim Jagielski 
3062*b1cdbd2cSJim Jagielski     // crossing position
3063*b1cdbd2cSJim Jagielski     double fCrossingPos = bAutoCross ? 0.0 : maData.mfCross;
3064*b1cdbd2cSJim Jagielski     if( bLogScale ) fCrossingPos = pow( 10.0, fCrossingPos );
3065*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_CROSSOVERVALUE, fCrossingPos );
3066*b1cdbd2cSJim Jagielski }
3067*b1cdbd2cSJim Jagielski 
3068*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
3069*b1cdbd2cSJim Jagielski 
3070*b1cdbd2cSJim Jagielski namespace {
3071*b1cdbd2cSJim Jagielski 
lclGetApiTickmarks(sal_uInt8 nXclTickPos)3072*b1cdbd2cSJim Jagielski sal_Int32 lclGetApiTickmarks( sal_uInt8 nXclTickPos )
3073*b1cdbd2cSJim Jagielski {
3074*b1cdbd2cSJim Jagielski     using namespace ::com::sun::star::chart2::TickmarkStyle;
3075*b1cdbd2cSJim Jagielski     sal_Int32 nApiTickmarks = NONE;
3076*b1cdbd2cSJim Jagielski     ::set_flag( nApiTickmarks, INNER, ::get_flag( nXclTickPos, EXC_CHTICK_INSIDE ) );
3077*b1cdbd2cSJim Jagielski     ::set_flag( nApiTickmarks, OUTER, ::get_flag( nXclTickPos, EXC_CHTICK_OUTSIDE ) );
3078*b1cdbd2cSJim Jagielski     return nApiTickmarks;
3079*b1cdbd2cSJim Jagielski }
3080*b1cdbd2cSJim Jagielski 
lclGetApiLabelPosition(sal_Int8 nXclLabelPos)3081*b1cdbd2cSJim Jagielski cssc::ChartAxisLabelPosition lclGetApiLabelPosition( sal_Int8 nXclLabelPos )
3082*b1cdbd2cSJim Jagielski {
3083*b1cdbd2cSJim Jagielski     using namespace ::com::sun::star::chart;
3084*b1cdbd2cSJim Jagielski     switch( nXclLabelPos )
3085*b1cdbd2cSJim Jagielski     {
3086*b1cdbd2cSJim Jagielski         case EXC_CHTICK_LOW:    return ChartAxisLabelPosition_OUTSIDE_START;
3087*b1cdbd2cSJim Jagielski         case EXC_CHTICK_HIGH:   return ChartAxisLabelPosition_OUTSIDE_END;
3088*b1cdbd2cSJim Jagielski         case EXC_CHTICK_NEXT:   return ChartAxisLabelPosition_NEAR_AXIS;
3089*b1cdbd2cSJim Jagielski     }
3090*b1cdbd2cSJim Jagielski     return ChartAxisLabelPosition_NEAR_AXIS;
3091*b1cdbd2cSJim Jagielski }
3092*b1cdbd2cSJim Jagielski 
3093*b1cdbd2cSJim Jagielski } // namespace
3094*b1cdbd2cSJim Jagielski 
XclImpChTick(const XclImpChRoot & rRoot)3095*b1cdbd2cSJim Jagielski XclImpChTick::XclImpChTick( const XclImpChRoot& rRoot ) :
3096*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
3097*b1cdbd2cSJim Jagielski {
3098*b1cdbd2cSJim Jagielski }
3099*b1cdbd2cSJim Jagielski 
ReadChTick(XclImpStream & rStrm)3100*b1cdbd2cSJim Jagielski void XclImpChTick::ReadChTick( XclImpStream& rStrm )
3101*b1cdbd2cSJim Jagielski {
3102*b1cdbd2cSJim Jagielski     rStrm   >> maData.mnMajor
3103*b1cdbd2cSJim Jagielski             >> maData.mnMinor
3104*b1cdbd2cSJim Jagielski             >> maData.mnLabelPos
3105*b1cdbd2cSJim Jagielski             >> maData.mnBackMode;
3106*b1cdbd2cSJim Jagielski     rStrm.Ignore( 16 );
3107*b1cdbd2cSJim Jagielski     rStrm   >> maData.maTextColor
3108*b1cdbd2cSJim Jagielski             >> maData.mnFlags;
3109*b1cdbd2cSJim Jagielski 
3110*b1cdbd2cSJim Jagielski     if( GetBiff() == EXC_BIFF8 )
3111*b1cdbd2cSJim Jagielski     {
3112*b1cdbd2cSJim Jagielski         // #116397# BIFF8: index into palette used instead of RGB data
3113*b1cdbd2cSJim Jagielski         maData.maTextColor = GetPalette().GetColor( rStrm.ReaduInt16() );
3114*b1cdbd2cSJim Jagielski         // rotation
3115*b1cdbd2cSJim Jagielski         rStrm >> maData.mnRotation;
3116*b1cdbd2cSJim Jagielski     }
3117*b1cdbd2cSJim Jagielski     else
3118*b1cdbd2cSJim Jagielski     {
3119*b1cdbd2cSJim Jagielski         // BIFF2-BIFF7: get rotation from text orientation
3120*b1cdbd2cSJim Jagielski         sal_uInt8 nOrient = ::extract_value< sal_uInt8 >( maData.mnFlags, 2, 3 );
3121*b1cdbd2cSJim Jagielski         maData.mnRotation = XclTools::GetXclRotFromOrient( nOrient );
3122*b1cdbd2cSJim Jagielski     }
3123*b1cdbd2cSJim Jagielski }
3124*b1cdbd2cSJim Jagielski 
GetFontColor() const3125*b1cdbd2cSJim Jagielski Color XclImpChTick::GetFontColor() const
3126*b1cdbd2cSJim Jagielski {
3127*b1cdbd2cSJim Jagielski     return ::get_flag( maData.mnFlags, EXC_CHTICK_AUTOCOLOR ) ? GetFontAutoColor() : maData.maTextColor;
3128*b1cdbd2cSJim Jagielski }
3129*b1cdbd2cSJim Jagielski 
GetRotation() const3130*b1cdbd2cSJim Jagielski sal_uInt16 XclImpChTick::GetRotation() const
3131*b1cdbd2cSJim Jagielski {
3132*b1cdbd2cSJim Jagielski     return ::get_flag( maData.mnFlags, EXC_CHTICK_AUTOROT ) ? EXC_CHART_AUTOROTATION : maData.mnRotation;
3133*b1cdbd2cSJim Jagielski }
3134*b1cdbd2cSJim Jagielski 
Convert(ScfPropertySet & rPropSet) const3135*b1cdbd2cSJim Jagielski void XclImpChTick::Convert( ScfPropertySet& rPropSet ) const
3136*b1cdbd2cSJim Jagielski {
3137*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_MAJORTICKS, lclGetApiTickmarks( maData.mnMajor ) );
3138*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_MINORTICKS, lclGetApiTickmarks( maData.mnMinor ) );
3139*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_LABELPOSITION, lclGetApiLabelPosition( maData.mnLabelPos ) );
3140*b1cdbd2cSJim Jagielski     rPropSet.SetProperty( EXC_CHPROP_MARKPOSITION, cssc::ChartAxisMarkPosition_AT_AXIS );
3141*b1cdbd2cSJim Jagielski }
3142*b1cdbd2cSJim Jagielski 
3143*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
3144*b1cdbd2cSJim Jagielski 
XclImpChAxis(const XclImpChRoot & rRoot,sal_uInt16 nAxisType)3145*b1cdbd2cSJim Jagielski XclImpChAxis::XclImpChAxis( const XclImpChRoot& rRoot, sal_uInt16 nAxisType ) :
3146*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot ),
3147*b1cdbd2cSJim Jagielski     mnNumFmtIdx( EXC_FORMAT_NOTFOUND )
3148*b1cdbd2cSJim Jagielski {
3149*b1cdbd2cSJim Jagielski     maData.mnType = nAxisType;
3150*b1cdbd2cSJim Jagielski }
3151*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)3152*b1cdbd2cSJim Jagielski void XclImpChAxis::ReadHeaderRecord( XclImpStream& rStrm )
3153*b1cdbd2cSJim Jagielski {
3154*b1cdbd2cSJim Jagielski     rStrm >> maData.mnType;
3155*b1cdbd2cSJim Jagielski }
3156*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)3157*b1cdbd2cSJim Jagielski void XclImpChAxis::ReadSubRecord( XclImpStream& rStrm )
3158*b1cdbd2cSJim Jagielski {
3159*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
3160*b1cdbd2cSJim Jagielski     {
3161*b1cdbd2cSJim Jagielski         case EXC_ID_CHLABELRANGE:
3162*b1cdbd2cSJim Jagielski             mxLabelRange.reset( new XclImpChLabelRange( GetChRoot() ) );
3163*b1cdbd2cSJim Jagielski             mxLabelRange->ReadChLabelRange( rStrm );
3164*b1cdbd2cSJim Jagielski         break;
3165*b1cdbd2cSJim Jagielski         case EXC_ID_CHDATERANGE:
3166*b1cdbd2cSJim Jagielski             if( !mxLabelRange )
3167*b1cdbd2cSJim Jagielski                 mxLabelRange.reset( new XclImpChLabelRange( GetChRoot() ) );
3168*b1cdbd2cSJim Jagielski             mxLabelRange->ReadChDateRange( rStrm );
3169*b1cdbd2cSJim Jagielski         break;
3170*b1cdbd2cSJim Jagielski         case EXC_ID_CHVALUERANGE:
3171*b1cdbd2cSJim Jagielski             mxValueRange.reset( new XclImpChValueRange( GetChRoot() ) );
3172*b1cdbd2cSJim Jagielski             mxValueRange->ReadChValueRange( rStrm );
3173*b1cdbd2cSJim Jagielski         break;
3174*b1cdbd2cSJim Jagielski         case EXC_ID_CHFORMAT:
3175*b1cdbd2cSJim Jagielski             rStrm >> mnNumFmtIdx;
3176*b1cdbd2cSJim Jagielski         break;
3177*b1cdbd2cSJim Jagielski         case EXC_ID_CHTICK:
3178*b1cdbd2cSJim Jagielski             mxTick.reset( new XclImpChTick( GetChRoot() ) );
3179*b1cdbd2cSJim Jagielski             mxTick->ReadChTick( rStrm );
3180*b1cdbd2cSJim Jagielski         break;
3181*b1cdbd2cSJim Jagielski         case EXC_ID_CHFONT:
3182*b1cdbd2cSJim Jagielski             mxFont.reset( new XclImpChFont );
3183*b1cdbd2cSJim Jagielski             mxFont->ReadChFont( rStrm );
3184*b1cdbd2cSJim Jagielski         break;
3185*b1cdbd2cSJim Jagielski         case EXC_ID_CHAXISLINE:
3186*b1cdbd2cSJim Jagielski             ReadChAxisLine( rStrm );
3187*b1cdbd2cSJim Jagielski         break;
3188*b1cdbd2cSJim Jagielski     }
3189*b1cdbd2cSJim Jagielski }
3190*b1cdbd2cSJim Jagielski 
Finalize()3191*b1cdbd2cSJim Jagielski void XclImpChAxis::Finalize()
3192*b1cdbd2cSJim Jagielski {
3193*b1cdbd2cSJim Jagielski     // add default scaling, needed e.g. to adjust rotation direction of pie and radar charts
3194*b1cdbd2cSJim Jagielski     if( !mxLabelRange )
3195*b1cdbd2cSJim Jagielski         mxLabelRange.reset( new XclImpChLabelRange( GetChRoot() ) );
3196*b1cdbd2cSJim Jagielski     if( !mxValueRange )
3197*b1cdbd2cSJim Jagielski         mxValueRange.reset( new XclImpChValueRange( GetChRoot() ) );
3198*b1cdbd2cSJim Jagielski     // remove invisible grid lines completely
3199*b1cdbd2cSJim Jagielski     if( mxMajorGrid.is() && !mxMajorGrid->HasLine() )
3200*b1cdbd2cSJim Jagielski         mxMajorGrid.reset();
3201*b1cdbd2cSJim Jagielski     if( mxMinorGrid.is() && !mxMinorGrid->HasLine() )
3202*b1cdbd2cSJim Jagielski         mxMinorGrid.reset();
3203*b1cdbd2cSJim Jagielski     // default tick settings different in OOChart and Excel
3204*b1cdbd2cSJim Jagielski     if( !mxTick )
3205*b1cdbd2cSJim Jagielski         mxTick.reset( new XclImpChTick( GetChRoot() ) );
3206*b1cdbd2cSJim Jagielski     // #i4140# different default axis line color
3207*b1cdbd2cSJim Jagielski     if( !mxAxisLine )
3208*b1cdbd2cSJim Jagielski     {
3209*b1cdbd2cSJim Jagielski         XclChLineFormat aLineFmt;
3210*b1cdbd2cSJim Jagielski         // set "show axis" flag, default if line format record is missing
3211*b1cdbd2cSJim Jagielski         ::set_flag( aLineFmt.mnFlags, EXC_CHLINEFORMAT_SHOWAXIS );
3212*b1cdbd2cSJim Jagielski         mxAxisLine.reset( new XclImpChLineFormat( aLineFmt ) );
3213*b1cdbd2cSJim Jagielski     }
3214*b1cdbd2cSJim Jagielski     // add wall/floor frame for 3d charts
3215*b1cdbd2cSJim Jagielski     if( !mxWallFrame )
3216*b1cdbd2cSJim Jagielski         CreateWallFrame();
3217*b1cdbd2cSJim Jagielski }
3218*b1cdbd2cSJim Jagielski 
GetFontIndex() const3219*b1cdbd2cSJim Jagielski sal_uInt16 XclImpChAxis::GetFontIndex() const
3220*b1cdbd2cSJim Jagielski {
3221*b1cdbd2cSJim Jagielski     return mxFont.is() ? mxFont->GetFontIndex() : EXC_FONT_NOTFOUND;
3222*b1cdbd2cSJim Jagielski }
3223*b1cdbd2cSJim Jagielski 
GetFontColor() const3224*b1cdbd2cSJim Jagielski Color XclImpChAxis::GetFontColor() const
3225*b1cdbd2cSJim Jagielski {
3226*b1cdbd2cSJim Jagielski     return mxTick.is() ? mxTick->GetFontColor() : GetFontAutoColor();
3227*b1cdbd2cSJim Jagielski }
3228*b1cdbd2cSJim Jagielski 
GetRotation() const3229*b1cdbd2cSJim Jagielski sal_uInt16 XclImpChAxis::GetRotation() const
3230*b1cdbd2cSJim Jagielski {
3231*b1cdbd2cSJim Jagielski     return mxTick.is() ? mxTick->GetRotation() : EXC_CHART_AUTOROTATION;
3232*b1cdbd2cSJim Jagielski }
3233*b1cdbd2cSJim Jagielski 
CreateAxis(const XclImpChTypeGroup & rTypeGroup,const XclImpChAxis * pCrossingAxis) const3234*b1cdbd2cSJim Jagielski Reference< XAxis > XclImpChAxis::CreateAxis( const XclImpChTypeGroup& rTypeGroup, const XclImpChAxis* pCrossingAxis ) const
3235*b1cdbd2cSJim Jagielski {
3236*b1cdbd2cSJim Jagielski     // create the axis object (always)
3237*b1cdbd2cSJim Jagielski     Reference< XAxis > xAxis( ScfApiHelper::CreateInstance( SERVICE_CHART2_AXIS ), UNO_QUERY );
3238*b1cdbd2cSJim Jagielski     if( xAxis.is() )
3239*b1cdbd2cSJim Jagielski     {
3240*b1cdbd2cSJim Jagielski         ScfPropertySet aAxisProp( xAxis );
3241*b1cdbd2cSJim Jagielski         // #i58688# axis enabled
3242*b1cdbd2cSJim Jagielski         aAxisProp.SetBoolProperty( EXC_CHPROP_SHOW, IsActivated() );
3243*b1cdbd2cSJim Jagielski 
3244*b1cdbd2cSJim Jagielski         // axis line properties
3245*b1cdbd2cSJim Jagielski         if( mxAxisLine.is() )
3246*b1cdbd2cSJim Jagielski             mxAxisLine->Convert( GetChRoot(), aAxisProp, EXC_CHOBJTYPE_AXISLINE );
3247*b1cdbd2cSJim Jagielski         // axis ticks properties
3248*b1cdbd2cSJim Jagielski         if( mxTick.is() )
3249*b1cdbd2cSJim Jagielski             mxTick->Convert( aAxisProp );
3250*b1cdbd2cSJim Jagielski 
3251*b1cdbd2cSJim Jagielski         // axis caption text --------------------------------------------------
3252*b1cdbd2cSJim Jagielski 
3253*b1cdbd2cSJim Jagielski         // radar charts disable their category labels via chart type, not via axis
3254*b1cdbd2cSJim Jagielski         bool bHasLabels = HasLabels() &&
3255*b1cdbd2cSJim Jagielski             ((GetAxisType() != EXC_CHAXIS_X) || rTypeGroup.HasCategoryLabels());
3256*b1cdbd2cSJim Jagielski         aAxisProp.SetBoolProperty( EXC_CHPROP_DISPLAYLABELS, bHasLabels );
3257*b1cdbd2cSJim Jagielski         if( bHasLabels )
3258*b1cdbd2cSJim Jagielski         {
3259*b1cdbd2cSJim Jagielski             // font settings from CHFONT record or from default text
3260*b1cdbd2cSJim Jagielski             if( mxFont.is() )
3261*b1cdbd2cSJim Jagielski                 ConvertFontBase( GetChRoot(), aAxisProp );
3262*b1cdbd2cSJim Jagielski             else if( const XclImpChText* pDefText = GetChartData().GetDefaultText( EXC_CHTEXTTYPE_AXISLABEL ).get() )
3263*b1cdbd2cSJim Jagielski                 pDefText->ConvertFont( aAxisProp );
3264*b1cdbd2cSJim Jagielski             // label text rotation
3265*b1cdbd2cSJim Jagielski             ConvertRotationBase( GetChRoot(), aAxisProp, true );
3266*b1cdbd2cSJim Jagielski             // number format
3267*b1cdbd2cSJim Jagielski             sal_uInt32 nScNumFmt = GetNumFmtBuffer().GetScFormat( mnNumFmtIdx );
3268*b1cdbd2cSJim Jagielski             if( nScNumFmt != NUMBERFORMAT_ENTRY_NOT_FOUND )
3269*b1cdbd2cSJim Jagielski                 aAxisProp.SetProperty( EXC_CHPROP_NUMBERFORMAT, static_cast< sal_Int32 >( nScNumFmt ) );
3270*b1cdbd2cSJim Jagielski         }
3271*b1cdbd2cSJim Jagielski 
3272*b1cdbd2cSJim Jagielski         // axis scaling and increment -----------------------------------------
3273*b1cdbd2cSJim Jagielski 
3274*b1cdbd2cSJim Jagielski         const XclChExtTypeInfo& rTypeInfo = rTypeGroup.GetTypeInfo();
3275*b1cdbd2cSJim Jagielski         ScaleData aScaleData = xAxis->getScaleData();
3276*b1cdbd2cSJim Jagielski         // set axis type
3277*b1cdbd2cSJim Jagielski         switch( GetAxisType() )
3278*b1cdbd2cSJim Jagielski         {
3279*b1cdbd2cSJim Jagielski             case EXC_CHAXIS_X:
3280*b1cdbd2cSJim Jagielski                 if( rTypeInfo.mbCategoryAxis )
3281*b1cdbd2cSJim Jagielski                 {
3282*b1cdbd2cSJim Jagielski                     aScaleData.AxisType = cssc2::AxisType::CATEGORY;
3283*b1cdbd2cSJim Jagielski                     aScaleData.Categories = rTypeGroup.CreateCategSequence();
3284*b1cdbd2cSJim Jagielski                 }
3285*b1cdbd2cSJim Jagielski                 else
3286*b1cdbd2cSJim Jagielski                     aScaleData.AxisType = cssc2::AxisType::REALNUMBER;
3287*b1cdbd2cSJim Jagielski             break;
3288*b1cdbd2cSJim Jagielski             case EXC_CHAXIS_Y:
3289*b1cdbd2cSJim Jagielski                 aScaleData.AxisType = rTypeGroup.IsPercent() ?
3290*b1cdbd2cSJim Jagielski                     cssc2::AxisType::PERCENT : cssc2::AxisType::REALNUMBER;
3291*b1cdbd2cSJim Jagielski             break;
3292*b1cdbd2cSJim Jagielski             case EXC_CHAXIS_Z:
3293*b1cdbd2cSJim Jagielski                 aScaleData.AxisType = cssc2::AxisType::SERIES;
3294*b1cdbd2cSJim Jagielski             break;
3295*b1cdbd2cSJim Jagielski         }
3296*b1cdbd2cSJim Jagielski         // axis scaling settings, dependent on axis type
3297*b1cdbd2cSJim Jagielski         switch( aScaleData.AxisType )
3298*b1cdbd2cSJim Jagielski         {
3299*b1cdbd2cSJim Jagielski             case cssc2::AxisType::CATEGORY:
3300*b1cdbd2cSJim Jagielski             case cssc2::AxisType::SERIES:
3301*b1cdbd2cSJim Jagielski                 // #i71684# radar charts have reversed rotation direction
3302*b1cdbd2cSJim Jagielski                 mxLabelRange->Convert( aAxisProp, aScaleData, rTypeInfo.meTypeCateg == EXC_CHTYPECATEG_RADAR );
3303*b1cdbd2cSJim Jagielski             break;
3304*b1cdbd2cSJim Jagielski             case cssc2::AxisType::REALNUMBER:
3305*b1cdbd2cSJim Jagielski             case cssc2::AxisType::PERCENT:
3306*b1cdbd2cSJim Jagielski                 // #i85167# pie/donut charts have reversed rotation direction (at Y axis!)
3307*b1cdbd2cSJim Jagielski                 mxValueRange->Convert( aScaleData, rTypeInfo.meTypeCateg == EXC_CHTYPECATEG_PIE );
3308*b1cdbd2cSJim Jagielski             break;
3309*b1cdbd2cSJim Jagielski             default:
3310*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "XclImpChAxis::CreateAxis - unknown axis type" );
3311*b1cdbd2cSJim Jagielski         }
3312*b1cdbd2cSJim Jagielski 
3313*b1cdbd2cSJim Jagielski         /*  Do not set a value to the Origin member anymore (will be done via
3314*b1cdbd2cSJim Jagielski             new axis properties 'CrossoverPosition' and 'CrossoverValue'). */
3315*b1cdbd2cSJim Jagielski         aScaleData.Origin.clear();
3316*b1cdbd2cSJim Jagielski 
3317*b1cdbd2cSJim Jagielski         // write back
3318*b1cdbd2cSJim Jagielski         xAxis->setScaleData( aScaleData );
3319*b1cdbd2cSJim Jagielski 
3320*b1cdbd2cSJim Jagielski         // grid ---------------------------------------------------------------
3321*b1cdbd2cSJim Jagielski 
3322*b1cdbd2cSJim Jagielski         // main grid
3323*b1cdbd2cSJim Jagielski         ScfPropertySet aGridProp( xAxis->getGridProperties() );
3324*b1cdbd2cSJim Jagielski         aGridProp.SetBoolProperty( EXC_CHPROP_SHOW, HasMajorGrid() );
3325*b1cdbd2cSJim Jagielski         if( mxMajorGrid.is() )
3326*b1cdbd2cSJim Jagielski             mxMajorGrid->Convert( GetChRoot(), aGridProp, EXC_CHOBJTYPE_GRIDLINE );
3327*b1cdbd2cSJim Jagielski         // sub grid
3328*b1cdbd2cSJim Jagielski         Sequence< Reference< XPropertySet > > aSubGridPropSeq = xAxis->getSubGridProperties();
3329*b1cdbd2cSJim Jagielski         if( aSubGridPropSeq.hasElements() )
3330*b1cdbd2cSJim Jagielski         {
3331*b1cdbd2cSJim Jagielski             ScfPropertySet aSubGridProp( aSubGridPropSeq[ 0 ] );
3332*b1cdbd2cSJim Jagielski             aSubGridProp.SetBoolProperty( EXC_CHPROP_SHOW, HasMinorGrid() );
3333*b1cdbd2cSJim Jagielski             if( mxMinorGrid.is() )
3334*b1cdbd2cSJim Jagielski                 mxMinorGrid->Convert( GetChRoot(), aSubGridProp, EXC_CHOBJTYPE_GRIDLINE );
3335*b1cdbd2cSJim Jagielski         }
3336*b1cdbd2cSJim Jagielski 
3337*b1cdbd2cSJim Jagielski         // position of crossing axis ------------------------------------------
3338*b1cdbd2cSJim Jagielski 
3339*b1cdbd2cSJim Jagielski         if( pCrossingAxis )
3340*b1cdbd2cSJim Jagielski             pCrossingAxis->ConvertAxisPosition( aAxisProp, rTypeGroup );
3341*b1cdbd2cSJim Jagielski     }
3342*b1cdbd2cSJim Jagielski     return xAxis;
3343*b1cdbd2cSJim Jagielski }
3344*b1cdbd2cSJim Jagielski 
ConvertWall(ScfPropertySet & rPropSet) const3345*b1cdbd2cSJim Jagielski void XclImpChAxis::ConvertWall( ScfPropertySet& rPropSet ) const
3346*b1cdbd2cSJim Jagielski {
3347*b1cdbd2cSJim Jagielski     // #i71810# walls and floor in 3D charts use the CHPICFORMAT record for bitmap mode
3348*b1cdbd2cSJim Jagielski     if( mxWallFrame.is() )
3349*b1cdbd2cSJim Jagielski         mxWallFrame->Convert( rPropSet, true );
3350*b1cdbd2cSJim Jagielski }
3351*b1cdbd2cSJim Jagielski 
ConvertAxisPosition(ScfPropertySet & rPropSet,const XclImpChTypeGroup & rTypeGroup) const3352*b1cdbd2cSJim Jagielski void XclImpChAxis::ConvertAxisPosition( ScfPropertySet& rPropSet, const XclImpChTypeGroup& rTypeGroup ) const
3353*b1cdbd2cSJim Jagielski {
3354*b1cdbd2cSJim Jagielski     if( ((GetAxisType() == EXC_CHAXIS_X) && rTypeGroup.GetTypeInfo().mbCategoryAxis) || (GetAxisType() == EXC_CHAXIS_Z) )
3355*b1cdbd2cSJim Jagielski         mxLabelRange->ConvertAxisPosition( rPropSet, rTypeGroup.Is3dChart() );
3356*b1cdbd2cSJim Jagielski     else
3357*b1cdbd2cSJim Jagielski         mxValueRange->ConvertAxisPosition( rPropSet );
3358*b1cdbd2cSJim Jagielski }
3359*b1cdbd2cSJim Jagielski 
ReadChAxisLine(XclImpStream & rStrm)3360*b1cdbd2cSJim Jagielski void XclImpChAxis::ReadChAxisLine( XclImpStream& rStrm )
3361*b1cdbd2cSJim Jagielski {
3362*b1cdbd2cSJim Jagielski     XclImpChLineFormatRef* pxLineFmt = 0;
3363*b1cdbd2cSJim Jagielski     bool bWallFrame = false;
3364*b1cdbd2cSJim Jagielski     switch( rStrm.ReaduInt16() )
3365*b1cdbd2cSJim Jagielski     {
3366*b1cdbd2cSJim Jagielski         case EXC_CHAXISLINE_AXISLINE:   pxLineFmt = &mxAxisLine;    break;
3367*b1cdbd2cSJim Jagielski         case EXC_CHAXISLINE_MAJORGRID:  pxLineFmt = &mxMajorGrid;   break;
3368*b1cdbd2cSJim Jagielski         case EXC_CHAXISLINE_MINORGRID:  pxLineFmt = &mxMinorGrid;   break;
3369*b1cdbd2cSJim Jagielski         case EXC_CHAXISLINE_WALLS:      bWallFrame = true;          break;
3370*b1cdbd2cSJim Jagielski     }
3371*b1cdbd2cSJim Jagielski     if( bWallFrame )
3372*b1cdbd2cSJim Jagielski         CreateWallFrame();
3373*b1cdbd2cSJim Jagielski 
3374*b1cdbd2cSJim Jagielski     bool bLoop = pxLineFmt || bWallFrame;
3375*b1cdbd2cSJim Jagielski     while( bLoop )
3376*b1cdbd2cSJim Jagielski     {
3377*b1cdbd2cSJim Jagielski         sal_uInt16 nRecId = rStrm.GetNextRecId();
3378*b1cdbd2cSJim Jagielski         bLoop = ((nRecId == EXC_ID_CHLINEFORMAT) ||
3379*b1cdbd2cSJim Jagielski                  (nRecId == EXC_ID_CHAREAFORMAT) ||
3380*b1cdbd2cSJim Jagielski                  (nRecId == EXC_ID_CHESCHERFORMAT))
3381*b1cdbd2cSJim Jagielski                  && rStrm.StartNextRecord();
3382*b1cdbd2cSJim Jagielski         if( bLoop )
3383*b1cdbd2cSJim Jagielski         {
3384*b1cdbd2cSJim Jagielski             if( pxLineFmt && (nRecId == EXC_ID_CHLINEFORMAT) )
3385*b1cdbd2cSJim Jagielski             {
3386*b1cdbd2cSJim Jagielski                 pxLineFmt->reset( new XclImpChLineFormat );
3387*b1cdbd2cSJim Jagielski                 (*pxLineFmt)->ReadChLineFormat( rStrm );
3388*b1cdbd2cSJim Jagielski             }
3389*b1cdbd2cSJim Jagielski             else if( bWallFrame && mxWallFrame.is() )
3390*b1cdbd2cSJim Jagielski             {
3391*b1cdbd2cSJim Jagielski                 mxWallFrame->ReadSubRecord( rStrm );
3392*b1cdbd2cSJim Jagielski             }
3393*b1cdbd2cSJim Jagielski         }
3394*b1cdbd2cSJim Jagielski     }
3395*b1cdbd2cSJim Jagielski }
3396*b1cdbd2cSJim Jagielski 
CreateWallFrame()3397*b1cdbd2cSJim Jagielski void XclImpChAxis::CreateWallFrame()
3398*b1cdbd2cSJim Jagielski {
3399*b1cdbd2cSJim Jagielski     switch( GetAxisType() )
3400*b1cdbd2cSJim Jagielski     {
3401*b1cdbd2cSJim Jagielski         case EXC_CHAXIS_X:
3402*b1cdbd2cSJim Jagielski             mxWallFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_WALL3D ) );
3403*b1cdbd2cSJim Jagielski         break;
3404*b1cdbd2cSJim Jagielski         case EXC_CHAXIS_Y:
3405*b1cdbd2cSJim Jagielski             mxWallFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_FLOOR3D ) );
3406*b1cdbd2cSJim Jagielski         break;
3407*b1cdbd2cSJim Jagielski         default:
3408*b1cdbd2cSJim Jagielski             mxWallFrame.reset();
3409*b1cdbd2cSJim Jagielski     }
3410*b1cdbd2cSJim Jagielski }
3411*b1cdbd2cSJim Jagielski 
3412*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
3413*b1cdbd2cSJim Jagielski 
XclImpChAxesSet(const XclImpChRoot & rRoot,sal_uInt16 nAxesSetId)3414*b1cdbd2cSJim Jagielski XclImpChAxesSet::XclImpChAxesSet( const XclImpChRoot& rRoot, sal_uInt16 nAxesSetId ) :
3415*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot )
3416*b1cdbd2cSJim Jagielski {
3417*b1cdbd2cSJim Jagielski     maData.mnAxesSetId = nAxesSetId;
3418*b1cdbd2cSJim Jagielski }
3419*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)3420*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ReadHeaderRecord( XclImpStream& rStrm )
3421*b1cdbd2cSJim Jagielski {
3422*b1cdbd2cSJim Jagielski     rStrm >> maData.mnAxesSetId >> maData.maRect;
3423*b1cdbd2cSJim Jagielski }
3424*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)3425*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ReadSubRecord( XclImpStream& rStrm )
3426*b1cdbd2cSJim Jagielski {
3427*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
3428*b1cdbd2cSJim Jagielski     {
3429*b1cdbd2cSJim Jagielski         case EXC_ID_CHFRAMEPOS:
3430*b1cdbd2cSJim Jagielski             mxFramePos.reset( new XclImpChFramePos );
3431*b1cdbd2cSJim Jagielski             mxFramePos->ReadChFramePos( rStrm );
3432*b1cdbd2cSJim Jagielski         break;
3433*b1cdbd2cSJim Jagielski         case EXC_ID_CHAXIS:
3434*b1cdbd2cSJim Jagielski             ReadChAxis( rStrm );
3435*b1cdbd2cSJim Jagielski         break;
3436*b1cdbd2cSJim Jagielski         case EXC_ID_CHTEXT:
3437*b1cdbd2cSJim Jagielski             ReadChText( rStrm );
3438*b1cdbd2cSJim Jagielski         break;
3439*b1cdbd2cSJim Jagielski         case EXC_ID_CHPLOTFRAME:
3440*b1cdbd2cSJim Jagielski             ReadChPlotFrame( rStrm );
3441*b1cdbd2cSJim Jagielski         break;
3442*b1cdbd2cSJim Jagielski         case EXC_ID_CHTYPEGROUP:
3443*b1cdbd2cSJim Jagielski             ReadChTypeGroup( rStrm );
3444*b1cdbd2cSJim Jagielski         break;
3445*b1cdbd2cSJim Jagielski     }
3446*b1cdbd2cSJim Jagielski }
3447*b1cdbd2cSJim Jagielski 
Finalize()3448*b1cdbd2cSJim Jagielski void XclImpChAxesSet::Finalize()
3449*b1cdbd2cSJim Jagielski {
3450*b1cdbd2cSJim Jagielski     if( IsValidAxesSet() )
3451*b1cdbd2cSJim Jagielski     {
3452*b1cdbd2cSJim Jagielski         // finalize chart type groups, erase empty groups without series
3453*b1cdbd2cSJim Jagielski         XclImpChTypeGroupMap aValidGroups;
3454*b1cdbd2cSJim Jagielski         for( XclImpChTypeGroupMap::const_iterator aIt = maTypeGroups.begin(), aEnd = maTypeGroups.end(); aIt != aEnd; ++aIt )
3455*b1cdbd2cSJim Jagielski         {
3456*b1cdbd2cSJim Jagielski             XclImpChTypeGroupRef xTypeGroup = aIt->second;
3457*b1cdbd2cSJim Jagielski             xTypeGroup->Finalize();
3458*b1cdbd2cSJim Jagielski             if( xTypeGroup->IsValidGroup() )
3459*b1cdbd2cSJim Jagielski                 aValidGroups[ aIt->first ] = xTypeGroup;
3460*b1cdbd2cSJim Jagielski         }
3461*b1cdbd2cSJim Jagielski         maTypeGroups.swap( aValidGroups );
3462*b1cdbd2cSJim Jagielski     }
3463*b1cdbd2cSJim Jagielski 
3464*b1cdbd2cSJim Jagielski     // invalid chart type groups are deleted now, check again with IsValidAxesSet()
3465*b1cdbd2cSJim Jagielski     if( IsValidAxesSet() )
3466*b1cdbd2cSJim Jagielski     {
3467*b1cdbd2cSJim Jagielski         // always create missing axis objects
3468*b1cdbd2cSJim Jagielski         if( !mxXAxis )
3469*b1cdbd2cSJim Jagielski             mxXAxis.reset( new XclImpChAxis( GetChRoot(), EXC_CHAXIS_X ) );
3470*b1cdbd2cSJim Jagielski         if( !mxYAxis )
3471*b1cdbd2cSJim Jagielski             mxYAxis.reset( new XclImpChAxis( GetChRoot(), EXC_CHAXIS_Y ) );
3472*b1cdbd2cSJim Jagielski         if( !mxZAxis && GetFirstTypeGroup()->Is3dDeepChart() )
3473*b1cdbd2cSJim Jagielski             mxZAxis.reset( new XclImpChAxis( GetChRoot(), EXC_CHAXIS_Z ) );
3474*b1cdbd2cSJim Jagielski 
3475*b1cdbd2cSJim Jagielski         // finalize axes
3476*b1cdbd2cSJim Jagielski         if( mxXAxis.is() ) mxXAxis->Finalize();
3477*b1cdbd2cSJim Jagielski         if( mxYAxis.is() ) mxYAxis->Finalize();
3478*b1cdbd2cSJim Jagielski         if( mxZAxis.is() ) mxZAxis->Finalize();
3479*b1cdbd2cSJim Jagielski 
3480*b1cdbd2cSJim Jagielski         // finalize axis titles
3481*b1cdbd2cSJim Jagielski         XclImpChTextRef xDefText = GetChartData().GetDefaultText( EXC_CHTEXTTYPE_AXISTITLE );
3482*b1cdbd2cSJim Jagielski         String aAutoTitle = CREATE_STRING( "Axis Title" );
3483*b1cdbd2cSJim Jagielski         lclFinalizeTitle( mxXAxisTitle, xDefText, aAutoTitle );
3484*b1cdbd2cSJim Jagielski         lclFinalizeTitle( mxYAxisTitle, xDefText, aAutoTitle );
3485*b1cdbd2cSJim Jagielski         lclFinalizeTitle( mxZAxisTitle, xDefText, aAutoTitle );
3486*b1cdbd2cSJim Jagielski 
3487*b1cdbd2cSJim Jagielski         // #i47745# missing plot frame -> invisible border and area
3488*b1cdbd2cSJim Jagielski         if( !mxPlotFrame )
3489*b1cdbd2cSJim Jagielski             mxPlotFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_PLOTFRAME ) );
3490*b1cdbd2cSJim Jagielski     }
3491*b1cdbd2cSJim Jagielski }
3492*b1cdbd2cSJim Jagielski 
GetFirstTypeGroup() const3493*b1cdbd2cSJim Jagielski XclImpChTypeGroupRef XclImpChAxesSet::GetFirstTypeGroup() const
3494*b1cdbd2cSJim Jagielski {
3495*b1cdbd2cSJim Jagielski     XclImpChTypeGroupRef xTypeGroup;
3496*b1cdbd2cSJim Jagielski     if( !maTypeGroups.empty() )
3497*b1cdbd2cSJim Jagielski         xTypeGroup = maTypeGroups.begin()->second;
3498*b1cdbd2cSJim Jagielski     return xTypeGroup;
3499*b1cdbd2cSJim Jagielski }
3500*b1cdbd2cSJim Jagielski 
GetLegend() const3501*b1cdbd2cSJim Jagielski XclImpChLegendRef XclImpChAxesSet::GetLegend() const
3502*b1cdbd2cSJim Jagielski {
3503*b1cdbd2cSJim Jagielski     XclImpChLegendRef xLegend;
3504*b1cdbd2cSJim Jagielski     for( XclImpChTypeGroupMap::const_iterator aIt = maTypeGroups.begin(), aEnd = maTypeGroups.end(); !xLegend && (aIt != aEnd); ++aIt )
3505*b1cdbd2cSJim Jagielski         xLegend = aIt->second->GetLegend();
3506*b1cdbd2cSJim Jagielski     return xLegend;
3507*b1cdbd2cSJim Jagielski }
3508*b1cdbd2cSJim Jagielski 
GetSingleSeriesTitle() const3509*b1cdbd2cSJim Jagielski const String& XclImpChAxesSet::GetSingleSeriesTitle() const
3510*b1cdbd2cSJim Jagielski {
3511*b1cdbd2cSJim Jagielski     return (maTypeGroups.size() == 1) ? maTypeGroups.begin()->second->GetSingleSeriesTitle() : String::EmptyString();
3512*b1cdbd2cSJim Jagielski }
3513*b1cdbd2cSJim Jagielski 
Convert(Reference<XDiagram> xDiagram) const3514*b1cdbd2cSJim Jagielski void XclImpChAxesSet::Convert( Reference< XDiagram > xDiagram ) const
3515*b1cdbd2cSJim Jagielski {
3516*b1cdbd2cSJim Jagielski     if( IsValidAxesSet() && xDiagram.is() )
3517*b1cdbd2cSJim Jagielski     {
3518*b1cdbd2cSJim Jagielski         // diagram background formatting
3519*b1cdbd2cSJim Jagielski         if( GetAxesSetId() == EXC_CHAXESSET_PRIMARY )
3520*b1cdbd2cSJim Jagielski             ConvertBackground( xDiagram );
3521*b1cdbd2cSJim Jagielski 
3522*b1cdbd2cSJim Jagielski         // create the coordinate system, this inserts all chart types and series
3523*b1cdbd2cSJim Jagielski         Reference< XCoordinateSystem > xCoordSystem = CreateCoordSystem( xDiagram );
3524*b1cdbd2cSJim Jagielski         if( xCoordSystem.is() )
3525*b1cdbd2cSJim Jagielski         {
3526*b1cdbd2cSJim Jagielski             // insert coordinate system, if not already done
3527*b1cdbd2cSJim Jagielski             try
3528*b1cdbd2cSJim Jagielski             {
3529*b1cdbd2cSJim Jagielski                 Reference< XCoordinateSystemContainer > xCoordSystemCont( xDiagram, UNO_QUERY_THROW );
3530*b1cdbd2cSJim Jagielski                 Sequence< Reference< XCoordinateSystem > > aCoordSystems = xCoordSystemCont->getCoordinateSystems();
3531*b1cdbd2cSJim Jagielski                 if( aCoordSystems.getLength() == 0 )
3532*b1cdbd2cSJim Jagielski                     xCoordSystemCont->addCoordinateSystem( xCoordSystem );
3533*b1cdbd2cSJim Jagielski             }
3534*b1cdbd2cSJim Jagielski             catch( Exception& )
3535*b1cdbd2cSJim Jagielski             {
3536*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "XclImpChAxesSet::Convert - cannot insert coordinate system" );
3537*b1cdbd2cSJim Jagielski             }
3538*b1cdbd2cSJim Jagielski 
3539*b1cdbd2cSJim Jagielski             // create the axes with grids and axis titles and insert them into the diagram
3540*b1cdbd2cSJim Jagielski             ConvertAxis( mxXAxis, mxXAxisTitle, xCoordSystem, mxYAxis.get() );
3541*b1cdbd2cSJim Jagielski             ConvertAxis( mxYAxis, mxYAxisTitle, xCoordSystem, mxXAxis.get() );
3542*b1cdbd2cSJim Jagielski             ConvertAxis( mxZAxis, mxZAxisTitle, xCoordSystem, 0 );
3543*b1cdbd2cSJim Jagielski         }
3544*b1cdbd2cSJim Jagielski     }
3545*b1cdbd2cSJim Jagielski }
3546*b1cdbd2cSJim Jagielski 
ConvertTitlePositions() const3547*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ConvertTitlePositions() const
3548*b1cdbd2cSJim Jagielski {
3549*b1cdbd2cSJim Jagielski     if( mxXAxisTitle.is() )
3550*b1cdbd2cSJim Jagielski         mxXAxisTitle->ConvertTitlePosition( XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, maData.mnAxesSetId, EXC_CHAXIS_X ) );
3551*b1cdbd2cSJim Jagielski     if( mxYAxisTitle.is() )
3552*b1cdbd2cSJim Jagielski         mxYAxisTitle->ConvertTitlePosition( XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, maData.mnAxesSetId, EXC_CHAXIS_Y ) );
3553*b1cdbd2cSJim Jagielski     if( mxZAxisTitle.is() )
3554*b1cdbd2cSJim Jagielski         mxZAxisTitle->ConvertTitlePosition( XclChTextKey( EXC_CHTEXTTYPE_AXISTITLE, maData.mnAxesSetId, EXC_CHAXIS_Z ) );
3555*b1cdbd2cSJim Jagielski }
3556*b1cdbd2cSJim Jagielski 
ReadChAxis(XclImpStream & rStrm)3557*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ReadChAxis( XclImpStream& rStrm )
3558*b1cdbd2cSJim Jagielski {
3559*b1cdbd2cSJim Jagielski     XclImpChAxisRef xAxis( new XclImpChAxis( GetChRoot() ) );
3560*b1cdbd2cSJim Jagielski     xAxis->ReadRecordGroup( rStrm );
3561*b1cdbd2cSJim Jagielski 
3562*b1cdbd2cSJim Jagielski     switch( xAxis->GetAxisType() )
3563*b1cdbd2cSJim Jagielski     {
3564*b1cdbd2cSJim Jagielski         case EXC_CHAXIS_X:  mxXAxis = xAxis;    break;
3565*b1cdbd2cSJim Jagielski         case EXC_CHAXIS_Y:  mxYAxis = xAxis;    break;
3566*b1cdbd2cSJim Jagielski         case EXC_CHAXIS_Z:  mxZAxis = xAxis;    break;
3567*b1cdbd2cSJim Jagielski     }
3568*b1cdbd2cSJim Jagielski }
3569*b1cdbd2cSJim Jagielski 
ReadChText(XclImpStream & rStrm)3570*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ReadChText( XclImpStream& rStrm )
3571*b1cdbd2cSJim Jagielski {
3572*b1cdbd2cSJim Jagielski     XclImpChTextRef xText( new XclImpChText( GetChRoot() ) );
3573*b1cdbd2cSJim Jagielski     xText->ReadRecordGroup( rStrm );
3574*b1cdbd2cSJim Jagielski 
3575*b1cdbd2cSJim Jagielski     switch( xText->GetLinkTarget() )
3576*b1cdbd2cSJim Jagielski     {
3577*b1cdbd2cSJim Jagielski         case EXC_CHOBJLINK_XAXIS:   mxXAxisTitle = xText;   break;
3578*b1cdbd2cSJim Jagielski         case EXC_CHOBJLINK_YAXIS:   mxYAxisTitle = xText;   break;
3579*b1cdbd2cSJim Jagielski         case EXC_CHOBJLINK_ZAXIS:   mxZAxisTitle = xText;   break;
3580*b1cdbd2cSJim Jagielski     }
3581*b1cdbd2cSJim Jagielski }
3582*b1cdbd2cSJim Jagielski 
ReadChPlotFrame(XclImpStream & rStrm)3583*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ReadChPlotFrame( XclImpStream& rStrm )
3584*b1cdbd2cSJim Jagielski {
3585*b1cdbd2cSJim Jagielski     if( (rStrm.GetNextRecId() == EXC_ID_CHFRAME) && rStrm.StartNextRecord() )
3586*b1cdbd2cSJim Jagielski     {
3587*b1cdbd2cSJim Jagielski         mxPlotFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_PLOTFRAME ) );
3588*b1cdbd2cSJim Jagielski         mxPlotFrame->ReadRecordGroup( rStrm );
3589*b1cdbd2cSJim Jagielski     }
3590*b1cdbd2cSJim Jagielski }
3591*b1cdbd2cSJim Jagielski 
ReadChTypeGroup(XclImpStream & rStrm)3592*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ReadChTypeGroup( XclImpStream& rStrm )
3593*b1cdbd2cSJim Jagielski {
3594*b1cdbd2cSJim Jagielski     XclImpChTypeGroupRef xTypeGroup( new XclImpChTypeGroup( GetChRoot() ) );
3595*b1cdbd2cSJim Jagielski     xTypeGroup->ReadRecordGroup( rStrm );
3596*b1cdbd2cSJim Jagielski     maTypeGroups[ xTypeGroup->GetGroupIdx() ] = xTypeGroup;
3597*b1cdbd2cSJim Jagielski }
3598*b1cdbd2cSJim Jagielski 
CreateCoordSystem(Reference<XDiagram> xDiagram) const3599*b1cdbd2cSJim Jagielski Reference< XCoordinateSystem > XclImpChAxesSet::CreateCoordSystem( Reference< XDiagram > xDiagram ) const
3600*b1cdbd2cSJim Jagielski {
3601*b1cdbd2cSJim Jagielski     Reference< XCoordinateSystem > xCoordSystem;
3602*b1cdbd2cSJim Jagielski 
3603*b1cdbd2cSJim Jagielski     /*  Try to get existing ccordinate system. For now, all series from primary
3604*b1cdbd2cSJim Jagielski         and secondary axes sets are inserted into one coordinate system. Later,
3605*b1cdbd2cSJim Jagielski         this should be changed to use one coordinate system for each axes set. */
3606*b1cdbd2cSJim Jagielski     Reference< XCoordinateSystemContainer > xCoordSystemCont( xDiagram, UNO_QUERY );
3607*b1cdbd2cSJim Jagielski     if( xCoordSystemCont.is() )
3608*b1cdbd2cSJim Jagielski     {
3609*b1cdbd2cSJim Jagielski         Sequence< Reference< XCoordinateSystem > > aCoordSystems = xCoordSystemCont->getCoordinateSystems();
3610*b1cdbd2cSJim Jagielski         DBG_ASSERT( aCoordSystems.getLength() <= 1, "XclImpChAxesSet::CreateCoordSystem - too many existing coordinate systems" );
3611*b1cdbd2cSJim Jagielski         if( aCoordSystems.getLength() > 0 )
3612*b1cdbd2cSJim Jagielski             xCoordSystem = aCoordSystems[ 0 ];
3613*b1cdbd2cSJim Jagielski     }
3614*b1cdbd2cSJim Jagielski 
3615*b1cdbd2cSJim Jagielski     // create the coordinate system according to the first chart type
3616*b1cdbd2cSJim Jagielski     if( !xCoordSystem.is() )
3617*b1cdbd2cSJim Jagielski     {
3618*b1cdbd2cSJim Jagielski         XclImpChTypeGroupRef xTypeGroup = GetFirstTypeGroup();
3619*b1cdbd2cSJim Jagielski         if( xTypeGroup.is() )
3620*b1cdbd2cSJim Jagielski         {
3621*b1cdbd2cSJim Jagielski             xCoordSystem = xTypeGroup->CreateCoordSystem();
3622*b1cdbd2cSJim Jagielski             // convert 3d chart settings
3623*b1cdbd2cSJim Jagielski             ScfPropertySet aDiaProp( xDiagram );
3624*b1cdbd2cSJim Jagielski             xTypeGroup->ConvertChart3d( aDiaProp );
3625*b1cdbd2cSJim Jagielski         }
3626*b1cdbd2cSJim Jagielski     }
3627*b1cdbd2cSJim Jagielski 
3628*b1cdbd2cSJim Jagielski     /*  Create XChartType objects for all chart type groups. Each group will
3629*b1cdbd2cSJim Jagielski         add its series to the data provider attached to the chart document. */
3630*b1cdbd2cSJim Jagielski     Reference< XChartTypeContainer > xChartTypeCont( xCoordSystem, UNO_QUERY );
3631*b1cdbd2cSJim Jagielski     if( xChartTypeCont.is() )
3632*b1cdbd2cSJim Jagielski     {
3633*b1cdbd2cSJim Jagielski         sal_Int32 nApiAxesSetIdx = GetApiAxesSetIndex();
3634*b1cdbd2cSJim Jagielski         for( XclImpChTypeGroupMap::const_iterator aIt = maTypeGroups.begin(), aEnd = maTypeGroups.end(); aIt != aEnd; ++aIt )
3635*b1cdbd2cSJim Jagielski         {
3636*b1cdbd2cSJim Jagielski             try
3637*b1cdbd2cSJim Jagielski             {
3638*b1cdbd2cSJim Jagielski                 Reference< XChartType > xChartType = aIt->second->CreateChartType( xDiagram, nApiAxesSetIdx );
3639*b1cdbd2cSJim Jagielski                 if( xChartType.is() )
3640*b1cdbd2cSJim Jagielski                     xChartTypeCont->addChartType( xChartType );
3641*b1cdbd2cSJim Jagielski             }
3642*b1cdbd2cSJim Jagielski             catch( Exception& )
3643*b1cdbd2cSJim Jagielski             {
3644*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "XclImpChAxesSet::CreateCoordSystem - cannot add chart type" );
3645*b1cdbd2cSJim Jagielski             }
3646*b1cdbd2cSJim Jagielski         }
3647*b1cdbd2cSJim Jagielski     }
3648*b1cdbd2cSJim Jagielski 
3649*b1cdbd2cSJim Jagielski     return xCoordSystem;
3650*b1cdbd2cSJim Jagielski }
3651*b1cdbd2cSJim Jagielski 
ConvertAxis(XclImpChAxisRef xChAxis,XclImpChTextRef xChAxisTitle,Reference<XCoordinateSystem> xCoordSystem,const XclImpChAxis * pCrossingAxis) const3652*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ConvertAxis(
3653*b1cdbd2cSJim Jagielski         XclImpChAxisRef xChAxis, XclImpChTextRef xChAxisTitle,
3654*b1cdbd2cSJim Jagielski         Reference< XCoordinateSystem > xCoordSystem, const XclImpChAxis* pCrossingAxis ) const
3655*b1cdbd2cSJim Jagielski {
3656*b1cdbd2cSJim Jagielski     if( xChAxis.is() )
3657*b1cdbd2cSJim Jagielski     {
3658*b1cdbd2cSJim Jagielski         // create and attach the axis object
3659*b1cdbd2cSJim Jagielski         Reference< XAxis > xAxis = CreateAxis( *xChAxis, pCrossingAxis );
3660*b1cdbd2cSJim Jagielski         if( xAxis.is() )
3661*b1cdbd2cSJim Jagielski         {
3662*b1cdbd2cSJim Jagielski             // create and attach the axis title
3663*b1cdbd2cSJim Jagielski             if( xChAxisTitle.is() ) try
3664*b1cdbd2cSJim Jagielski             {
3665*b1cdbd2cSJim Jagielski                 Reference< XTitled > xTitled( xAxis, UNO_QUERY_THROW );
3666*b1cdbd2cSJim Jagielski                 Reference< XTitle > xTitle( xChAxisTitle->CreateTitle(), UNO_SET_THROW );
3667*b1cdbd2cSJim Jagielski                 xTitled->setTitleObject( xTitle );
3668*b1cdbd2cSJim Jagielski             }
3669*b1cdbd2cSJim Jagielski             catch( Exception& )
3670*b1cdbd2cSJim Jagielski             {
3671*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "XclImpChAxesSet::ConvertAxis - cannot set axis title" );
3672*b1cdbd2cSJim Jagielski             }
3673*b1cdbd2cSJim Jagielski 
3674*b1cdbd2cSJim Jagielski             // insert axis into coordinate system
3675*b1cdbd2cSJim Jagielski             try
3676*b1cdbd2cSJim Jagielski             {
3677*b1cdbd2cSJim Jagielski                 sal_Int32 nApiAxisDim = xChAxis->GetApiAxisDimension();
3678*b1cdbd2cSJim Jagielski                 sal_Int32 nApiAxesSetIdx = GetApiAxesSetIndex();
3679*b1cdbd2cSJim Jagielski                 xCoordSystem->setAxisByDimension( nApiAxisDim, xAxis, nApiAxesSetIdx );
3680*b1cdbd2cSJim Jagielski             }
3681*b1cdbd2cSJim Jagielski             catch( Exception& )
3682*b1cdbd2cSJim Jagielski             {
3683*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "XclImpChAxesSet::ConvertAxis - cannot set axis" );
3684*b1cdbd2cSJim Jagielski             }
3685*b1cdbd2cSJim Jagielski         }
3686*b1cdbd2cSJim Jagielski     }
3687*b1cdbd2cSJim Jagielski }
3688*b1cdbd2cSJim Jagielski 
CreateAxis(const XclImpChAxis & rChAxis,const XclImpChAxis * pCrossingAxis) const3689*b1cdbd2cSJim Jagielski Reference< XAxis > XclImpChAxesSet::CreateAxis( const XclImpChAxis& rChAxis, const XclImpChAxis* pCrossingAxis ) const
3690*b1cdbd2cSJim Jagielski {
3691*b1cdbd2cSJim Jagielski     Reference< XAxis > xAxis;
3692*b1cdbd2cSJim Jagielski     if( const XclImpChTypeGroup* pTypeGroup = GetFirstTypeGroup().get() )
3693*b1cdbd2cSJim Jagielski         xAxis = rChAxis.CreateAxis( *pTypeGroup, pCrossingAxis );
3694*b1cdbd2cSJim Jagielski     return xAxis;
3695*b1cdbd2cSJim Jagielski }
3696*b1cdbd2cSJim Jagielski 
ConvertBackground(Reference<XDiagram> xDiagram) const3697*b1cdbd2cSJim Jagielski void XclImpChAxesSet::ConvertBackground( Reference< XDiagram > xDiagram ) const
3698*b1cdbd2cSJim Jagielski {
3699*b1cdbd2cSJim Jagielski     XclImpChTypeGroupRef xTypeGroup = GetFirstTypeGroup();
3700*b1cdbd2cSJim Jagielski     if( xTypeGroup.is() && xTypeGroup->Is3dWallChart() )
3701*b1cdbd2cSJim Jagielski     {
3702*b1cdbd2cSJim Jagielski         // wall/floor formatting (3D charts)
3703*b1cdbd2cSJim Jagielski         if( mxXAxis.is() )
3704*b1cdbd2cSJim Jagielski         {
3705*b1cdbd2cSJim Jagielski             ScfPropertySet aWallProp( xDiagram->getWall() );
3706*b1cdbd2cSJim Jagielski             mxXAxis->ConvertWall( aWallProp );
3707*b1cdbd2cSJim Jagielski         }
3708*b1cdbd2cSJim Jagielski         if( mxYAxis.is() )
3709*b1cdbd2cSJim Jagielski         {
3710*b1cdbd2cSJim Jagielski             ScfPropertySet aFloorProp( xDiagram->getFloor() );
3711*b1cdbd2cSJim Jagielski             mxYAxis->ConvertWall( aFloorProp );
3712*b1cdbd2cSJim Jagielski         }
3713*b1cdbd2cSJim Jagielski     }
3714*b1cdbd2cSJim Jagielski     else if( mxPlotFrame.is() )
3715*b1cdbd2cSJim Jagielski     {
3716*b1cdbd2cSJim Jagielski         // diagram background formatting
3717*b1cdbd2cSJim Jagielski         ScfPropertySet aWallProp( xDiagram->getWall() );
3718*b1cdbd2cSJim Jagielski         mxPlotFrame->Convert( aWallProp );
3719*b1cdbd2cSJim Jagielski     }
3720*b1cdbd2cSJim Jagielski }
3721*b1cdbd2cSJim Jagielski 
3722*b1cdbd2cSJim Jagielski // The chart object ===========================================================
3723*b1cdbd2cSJim Jagielski 
XclImpChChart(const XclImpRoot & rRoot)3724*b1cdbd2cSJim Jagielski XclImpChChart::XclImpChChart( const XclImpRoot& rRoot ) :
3725*b1cdbd2cSJim Jagielski     XclImpChRoot( rRoot, *this )
3726*b1cdbd2cSJim Jagielski {
3727*b1cdbd2cSJim Jagielski     mxPrimAxesSet.reset( new XclImpChAxesSet( GetChRoot(), EXC_CHAXESSET_PRIMARY ) );
3728*b1cdbd2cSJim Jagielski     mxSecnAxesSet.reset( new XclImpChAxesSet( GetChRoot(), EXC_CHAXESSET_SECONDARY ) );
3729*b1cdbd2cSJim Jagielski }
3730*b1cdbd2cSJim Jagielski 
~XclImpChChart()3731*b1cdbd2cSJim Jagielski XclImpChChart::~XclImpChChart()
3732*b1cdbd2cSJim Jagielski {
3733*b1cdbd2cSJim Jagielski }
3734*b1cdbd2cSJim Jagielski 
ReadHeaderRecord(XclImpStream & rStrm)3735*b1cdbd2cSJim Jagielski void XclImpChChart::ReadHeaderRecord( XclImpStream& rStrm )
3736*b1cdbd2cSJim Jagielski {
3737*b1cdbd2cSJim Jagielski     // coordinates are stored as 16.16 fixed point
3738*b1cdbd2cSJim Jagielski     rStrm >> maRect;
3739*b1cdbd2cSJim Jagielski }
3740*b1cdbd2cSJim Jagielski 
ReadSubRecord(XclImpStream & rStrm)3741*b1cdbd2cSJim Jagielski void XclImpChChart::ReadSubRecord( XclImpStream& rStrm )
3742*b1cdbd2cSJim Jagielski {
3743*b1cdbd2cSJim Jagielski     switch( rStrm.GetRecId() )
3744*b1cdbd2cSJim Jagielski     {
3745*b1cdbd2cSJim Jagielski         case EXC_ID_CHFRAME:
3746*b1cdbd2cSJim Jagielski             mxFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_BACKGROUND ) );
3747*b1cdbd2cSJim Jagielski             mxFrame->ReadRecordGroup( rStrm );
3748*b1cdbd2cSJim Jagielski         break;
3749*b1cdbd2cSJim Jagielski         case EXC_ID_CHSERIES:
3750*b1cdbd2cSJim Jagielski             ReadChSeries( rStrm );
3751*b1cdbd2cSJim Jagielski         break;
3752*b1cdbd2cSJim Jagielski         case EXC_ID_CHPROPERTIES:
3753*b1cdbd2cSJim Jagielski             ReadChProperties( rStrm );
3754*b1cdbd2cSJim Jagielski         break;
3755*b1cdbd2cSJim Jagielski         case EXC_ID_CHDEFAULTTEXT:
3756*b1cdbd2cSJim Jagielski             ReadChDefaultText( rStrm );
3757*b1cdbd2cSJim Jagielski         break;
3758*b1cdbd2cSJim Jagielski         case EXC_ID_CHAXESSET:
3759*b1cdbd2cSJim Jagielski             ReadChAxesSet( rStrm );
3760*b1cdbd2cSJim Jagielski         break;
3761*b1cdbd2cSJim Jagielski         case EXC_ID_CHTEXT:
3762*b1cdbd2cSJim Jagielski             ReadChText( rStrm );
3763*b1cdbd2cSJim Jagielski         break;
3764*b1cdbd2cSJim Jagielski         case EXC_ID_CHEND:
3765*b1cdbd2cSJim Jagielski             Finalize();     // finalize the entire chart object
3766*b1cdbd2cSJim Jagielski         break;
3767*b1cdbd2cSJim Jagielski     }
3768*b1cdbd2cSJim Jagielski }
3769*b1cdbd2cSJim Jagielski 
ReadChDefaultText(XclImpStream & rStrm)3770*b1cdbd2cSJim Jagielski void XclImpChChart::ReadChDefaultText( XclImpStream& rStrm )
3771*b1cdbd2cSJim Jagielski {
3772*b1cdbd2cSJim Jagielski     sal_uInt16 nTextId = rStrm.ReaduInt16();
3773*b1cdbd2cSJim Jagielski     if( (rStrm.GetNextRecId() == EXC_ID_CHTEXT) && rStrm.StartNextRecord() )
3774*b1cdbd2cSJim Jagielski     {
3775*b1cdbd2cSJim Jagielski         XclImpChTextRef xText( new XclImpChText( GetChRoot() ) );
3776*b1cdbd2cSJim Jagielski         xText->ReadRecordGroup( rStrm );
3777*b1cdbd2cSJim Jagielski         maDefTexts[ nTextId ] = xText;
3778*b1cdbd2cSJim Jagielski     }
3779*b1cdbd2cSJim Jagielski }
3780*b1cdbd2cSJim Jagielski 
ReadChDataFormat(XclImpStream & rStrm)3781*b1cdbd2cSJim Jagielski void XclImpChChart::ReadChDataFormat( XclImpStream& rStrm )
3782*b1cdbd2cSJim Jagielski {
3783*b1cdbd2cSJim Jagielski     XclImpChDataFormatRef xDataFmt( new XclImpChDataFormat( GetChRoot() ) );
3784*b1cdbd2cSJim Jagielski     xDataFmt->ReadRecordGroup( rStrm );
3785*b1cdbd2cSJim Jagielski     if( xDataFmt->GetPointPos().mnSeriesIdx <= EXC_CHSERIES_MAXSERIES )
3786*b1cdbd2cSJim Jagielski     {
3787*b1cdbd2cSJim Jagielski         XclImpChDataFormatRef& rxMapFmt = maDataFmts[ xDataFmt->GetPointPos() ];
3788*b1cdbd2cSJim Jagielski         /*  Do not overwrite existing data format group, Excel always uses the
3789*b1cdbd2cSJim Jagielski             first data format group occuring in any CHSERIES group. */
3790*b1cdbd2cSJim Jagielski         if( !rxMapFmt )
3791*b1cdbd2cSJim Jagielski             rxMapFmt = xDataFmt;
3792*b1cdbd2cSJim Jagielski     }
3793*b1cdbd2cSJim Jagielski }
3794*b1cdbd2cSJim Jagielski 
UpdateObjFrame(const XclObjLineData & rLineData,const XclObjFillData & rFillData)3795*b1cdbd2cSJim Jagielski void XclImpChChart::UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData )
3796*b1cdbd2cSJim Jagielski {
3797*b1cdbd2cSJim Jagielski     if( !mxFrame )
3798*b1cdbd2cSJim Jagielski         mxFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_BACKGROUND ) );
3799*b1cdbd2cSJim Jagielski     mxFrame->UpdateObjFrame( rLineData, rFillData );
3800*b1cdbd2cSJim Jagielski }
3801*b1cdbd2cSJim Jagielski 
GetTypeGroup(sal_uInt16 nGroupIdx) const3802*b1cdbd2cSJim Jagielski XclImpChTypeGroupRef XclImpChChart::GetTypeGroup( sal_uInt16 nGroupIdx ) const
3803*b1cdbd2cSJim Jagielski {
3804*b1cdbd2cSJim Jagielski     XclImpChTypeGroupRef xTypeGroup = mxPrimAxesSet->GetTypeGroup( nGroupIdx );
3805*b1cdbd2cSJim Jagielski     if( !xTypeGroup ) xTypeGroup = mxSecnAxesSet->GetTypeGroup( nGroupIdx );
3806*b1cdbd2cSJim Jagielski     if( !xTypeGroup ) xTypeGroup = mxPrimAxesSet->GetFirstTypeGroup();
3807*b1cdbd2cSJim Jagielski     return xTypeGroup;
3808*b1cdbd2cSJim Jagielski }
3809*b1cdbd2cSJim Jagielski 
GetDefaultText(XclChTextType eTextType) const3810*b1cdbd2cSJim Jagielski XclImpChTextRef XclImpChChart::GetDefaultText( XclChTextType eTextType ) const
3811*b1cdbd2cSJim Jagielski {
3812*b1cdbd2cSJim Jagielski     sal_uInt16 nDefTextId = EXC_CHDEFTEXT_GLOBAL;
3813*b1cdbd2cSJim Jagielski     bool bBiff8 = GetBiff() == EXC_BIFF8;
3814*b1cdbd2cSJim Jagielski     switch( eTextType )
3815*b1cdbd2cSJim Jagielski     {
3816*b1cdbd2cSJim Jagielski         case EXC_CHTEXTTYPE_TITLE:      nDefTextId = EXC_CHDEFTEXT_GLOBAL;                                  break;
3817*b1cdbd2cSJim Jagielski         case EXC_CHTEXTTYPE_LEGEND:     nDefTextId = EXC_CHDEFTEXT_GLOBAL;                                  break;
3818*b1cdbd2cSJim Jagielski         case EXC_CHTEXTTYPE_AXISTITLE:  nDefTextId = bBiff8 ? EXC_CHDEFTEXT_AXESSET : EXC_CHDEFTEXT_GLOBAL; break;
3819*b1cdbd2cSJim Jagielski         case EXC_CHTEXTTYPE_AXISLABEL:  nDefTextId = bBiff8 ? EXC_CHDEFTEXT_AXESSET : EXC_CHDEFTEXT_GLOBAL; break;
3820*b1cdbd2cSJim Jagielski         case EXC_CHTEXTTYPE_DATALABEL:  nDefTextId = bBiff8 ? EXC_CHDEFTEXT_AXESSET : EXC_CHDEFTEXT_GLOBAL; break;
3821*b1cdbd2cSJim Jagielski     }
3822*b1cdbd2cSJim Jagielski     return maDefTexts.get( nDefTextId );
3823*b1cdbd2cSJim Jagielski }
3824*b1cdbd2cSJim Jagielski 
IsManualPlotArea() const3825*b1cdbd2cSJim Jagielski bool XclImpChChart::IsManualPlotArea() const
3826*b1cdbd2cSJim Jagielski {
3827*b1cdbd2cSJim Jagielski     // there is no real automatic mode in BIFF5 charts
3828*b1cdbd2cSJim Jagielski     return (GetBiff() <= EXC_BIFF5) || ::get_flag( maProps.mnFlags, EXC_CHPROPS_USEMANPLOTAREA );
3829*b1cdbd2cSJim Jagielski }
3830*b1cdbd2cSJim Jagielski 
Convert(Reference<XChartDocument> xChartDoc,XclImpDffConverter & rDffConv,const OUString & rObjName,const Rectangle & rChartRect) const3831*b1cdbd2cSJim Jagielski void XclImpChChart::Convert( Reference< XChartDocument > xChartDoc,
3832*b1cdbd2cSJim Jagielski         XclImpDffConverter& rDffConv, const OUString& rObjName, const Rectangle& rChartRect ) const
3833*b1cdbd2cSJim Jagielski {
3834*b1cdbd2cSJim Jagielski     // initialize conversion (locks the model to suppress any internal updates)
3835*b1cdbd2cSJim Jagielski     InitConversion( xChartDoc, rChartRect );
3836*b1cdbd2cSJim Jagielski 
3837*b1cdbd2cSJim Jagielski     // chart frame formatting
3838*b1cdbd2cSJim Jagielski     if( mxFrame.is() )
3839*b1cdbd2cSJim Jagielski     {
3840*b1cdbd2cSJim Jagielski         ScfPropertySet aFrameProp( xChartDoc->getPageBackground() );
3841*b1cdbd2cSJim Jagielski         mxFrame->Convert( aFrameProp );
3842*b1cdbd2cSJim Jagielski     }
3843*b1cdbd2cSJim Jagielski 
3844*b1cdbd2cSJim Jagielski     // chart title
3845*b1cdbd2cSJim Jagielski     if( mxTitle.is() ) try
3846*b1cdbd2cSJim Jagielski     {
3847*b1cdbd2cSJim Jagielski         Reference< XTitled > xTitled( xChartDoc, UNO_QUERY_THROW );
3848*b1cdbd2cSJim Jagielski         Reference< XTitle > xTitle( mxTitle->CreateTitle(), UNO_SET_THROW );
3849*b1cdbd2cSJim Jagielski         xTitled->setTitleObject( xTitle );
3850*b1cdbd2cSJim Jagielski     }
3851*b1cdbd2cSJim Jagielski     catch( Exception& )
3852*b1cdbd2cSJim Jagielski     {
3853*b1cdbd2cSJim Jagielski     }
3854*b1cdbd2cSJim Jagielski 
3855*b1cdbd2cSJim Jagielski     /*  Create the diagram object and attach it to the chart document. Currently,
3856*b1cdbd2cSJim Jagielski         one diagram is used to carry all coordinate systems and data series. */
3857*b1cdbd2cSJim Jagielski     Reference< XDiagram > xDiagram = CreateDiagram();
3858*b1cdbd2cSJim Jagielski     xChartDoc->setFirstDiagram( xDiagram );
3859*b1cdbd2cSJim Jagielski 
3860*b1cdbd2cSJim Jagielski     // coordinate systems and chart types, convert axis settings
3861*b1cdbd2cSJim Jagielski     mxPrimAxesSet->Convert( xDiagram );
3862*b1cdbd2cSJim Jagielski     mxSecnAxesSet->Convert( xDiagram );
3863*b1cdbd2cSJim Jagielski 
3864*b1cdbd2cSJim Jagielski     // legend
3865*b1cdbd2cSJim Jagielski     if( xDiagram.is() && mxLegend.is() )
3866*b1cdbd2cSJim Jagielski         xDiagram->setLegend( mxLegend->CreateLegend() );
3867*b1cdbd2cSJim Jagielski 
3868*b1cdbd2cSJim Jagielski     /*  Following all conversions needing the old Chart1 API that involves full
3869*b1cdbd2cSJim Jagielski         initialization of the chart view. */
3870*b1cdbd2cSJim Jagielski     Reference< cssc::XChartDocument > xChart1Doc( xChartDoc, UNO_QUERY );
3871*b1cdbd2cSJim Jagielski     if( xChart1Doc.is() )
3872*b1cdbd2cSJim Jagielski     {
3873*b1cdbd2cSJim Jagielski         Reference< cssc::XDiagram > xDiagram1 = xChart1Doc->getDiagram();
3874*b1cdbd2cSJim Jagielski 
3875*b1cdbd2cSJim Jagielski         /*  Set the 'IncludeHiddenCells' property via the old API as only this
3876*b1cdbd2cSJim Jagielski             ensures that the data provider and all created sequences get this
3877*b1cdbd2cSJim Jagielski             flag correctly. */
3878*b1cdbd2cSJim Jagielski         ScfPropertySet aDiaProp( xDiagram1 );
3879*b1cdbd2cSJim Jagielski         bool bShowVisCells = ::get_flag( maProps.mnFlags, EXC_CHPROPS_SHOWVISIBLEONLY );
3880*b1cdbd2cSJim Jagielski         aDiaProp.SetBoolProperty( EXC_CHPROP_INCLUDEHIDDENCELLS, !bShowVisCells );
3881*b1cdbd2cSJim Jagielski 
3882*b1cdbd2cSJim Jagielski         // plot area position and size (there is no real automatic mode in BIFF5 charts)
3883*b1cdbd2cSJim Jagielski         XclImpChFramePosRef xPlotAreaPos = mxPrimAxesSet->GetPlotAreaFramePos();
3884*b1cdbd2cSJim Jagielski         if( IsManualPlotArea() && xPlotAreaPos.is() ) try
3885*b1cdbd2cSJim Jagielski         {
3886*b1cdbd2cSJim Jagielski             const XclChFramePos& rFramePos = xPlotAreaPos->GetFramePosData();
3887*b1cdbd2cSJim Jagielski             if( (rFramePos.mnTLMode == EXC_CHFRAMEPOS_PARENT) && (rFramePos.mnBRMode == EXC_CHFRAMEPOS_PARENT) )
3888*b1cdbd2cSJim Jagielski             {
3889*b1cdbd2cSJim Jagielski                 Reference< cssc::XDiagramPositioning > xPositioning( xDiagram1, UNO_QUERY_THROW );
3890*b1cdbd2cSJim Jagielski                 ::com::sun::star::awt::Rectangle aDiagramRect = CalcHmmFromChartRect( rFramePos.maRect );
3891*b1cdbd2cSJim Jagielski                 // for pie charts, always set inner plot area size to exclude the data labels as Excel does
3892*b1cdbd2cSJim Jagielski                 const XclImpChTypeGroup* pFirstTypeGroup = mxPrimAxesSet->GetFirstTypeGroup().get();
3893*b1cdbd2cSJim Jagielski                 if( pFirstTypeGroup && (pFirstTypeGroup->GetTypeInfo().meTypeCateg == EXC_CHTYPECATEG_PIE) )
3894*b1cdbd2cSJim Jagielski                     xPositioning->setDiagramPositionExcludingAxes( aDiagramRect );
3895*b1cdbd2cSJim Jagielski                 else if( pFirstTypeGroup && pFirstTypeGroup->Is3dChart() )
3896*b1cdbd2cSJim Jagielski                     xPositioning->setDiagramPositionIncludingAxesAndAxisTitles( aDiagramRect );
3897*b1cdbd2cSJim Jagielski                 else
3898*b1cdbd2cSJim Jagielski                     xPositioning->setDiagramPositionIncludingAxes( aDiagramRect );
3899*b1cdbd2cSJim Jagielski             }
3900*b1cdbd2cSJim Jagielski         }
3901*b1cdbd2cSJim Jagielski         catch( Exception& )
3902*b1cdbd2cSJim Jagielski         {
3903*b1cdbd2cSJim Jagielski         }
3904*b1cdbd2cSJim Jagielski 
3905*b1cdbd2cSJim Jagielski         // positions of all title objects
3906*b1cdbd2cSJim Jagielski         if( mxTitle.is() )
3907*b1cdbd2cSJim Jagielski             mxTitle->ConvertTitlePosition( XclChTextKey( EXC_CHTEXTTYPE_TITLE ) );
3908*b1cdbd2cSJim Jagielski         mxPrimAxesSet->ConvertTitlePositions();
3909*b1cdbd2cSJim Jagielski         mxSecnAxesSet->ConvertTitlePositions();
3910*b1cdbd2cSJim Jagielski     }
3911*b1cdbd2cSJim Jagielski 
3912*b1cdbd2cSJim Jagielski     // unlock the model
3913*b1cdbd2cSJim Jagielski     FinishConversion( rDffConv );
3914*b1cdbd2cSJim Jagielski 
3915*b1cdbd2cSJim Jagielski     // start listening to this chart
3916*b1cdbd2cSJim Jagielski     ScDocument& rDoc = GetRoot().GetDoc();
3917*b1cdbd2cSJim Jagielski     if( ScChartListenerCollection* pChartCollection = rDoc.GetChartListenerCollection() )
3918*b1cdbd2cSJim Jagielski     {
3919*b1cdbd2cSJim Jagielski         ::std::auto_ptr< ::std::vector< ScSharedTokenRef > > xRefTokens( new ::std::vector< ScSharedTokenRef > );
3920*b1cdbd2cSJim Jagielski         for( XclImpChSeriesVec::const_iterator aIt = maSeries.begin(), aEnd = maSeries.end(); aIt != aEnd; ++aIt )
3921*b1cdbd2cSJim Jagielski             (*aIt)->FillAllSourceLinks( *xRefTokens );
3922*b1cdbd2cSJim Jagielski         if( !xRefTokens->empty() )
3923*b1cdbd2cSJim Jagielski         {
3924*b1cdbd2cSJim Jagielski             ::std::auto_ptr< ScChartListener > xListener( new ScChartListener( rObjName, &rDoc, xRefTokens.release() ) );
3925*b1cdbd2cSJim Jagielski             xListener->SetUsed( true );
3926*b1cdbd2cSJim Jagielski             xListener->StartListeningTo();
3927*b1cdbd2cSJim Jagielski             pChartCollection->Insert( xListener.release() );
3928*b1cdbd2cSJim Jagielski         }
3929*b1cdbd2cSJim Jagielski     }
3930*b1cdbd2cSJim Jagielski }
3931*b1cdbd2cSJim Jagielski 
ReadChSeries(XclImpStream & rStrm)3932*b1cdbd2cSJim Jagielski void XclImpChChart::ReadChSeries( XclImpStream& rStrm )
3933*b1cdbd2cSJim Jagielski {
3934*b1cdbd2cSJim Jagielski     sal_uInt16 nNewSeriesIdx = static_cast< sal_uInt16 >( maSeries.size() );
3935*b1cdbd2cSJim Jagielski     XclImpChSeriesRef xSeries( new XclImpChSeries( GetChRoot(), nNewSeriesIdx ) );
3936*b1cdbd2cSJim Jagielski     xSeries->ReadRecordGroup( rStrm );
3937*b1cdbd2cSJim Jagielski     maSeries.push_back( xSeries );
3938*b1cdbd2cSJim Jagielski }
3939*b1cdbd2cSJim Jagielski 
ReadChProperties(XclImpStream & rStrm)3940*b1cdbd2cSJim Jagielski void XclImpChChart::ReadChProperties( XclImpStream& rStrm )
3941*b1cdbd2cSJim Jagielski {
3942*b1cdbd2cSJim Jagielski     rStrm >> maProps.mnFlags >> maProps.mnEmptyMode;
3943*b1cdbd2cSJim Jagielski }
3944*b1cdbd2cSJim Jagielski 
ReadChAxesSet(XclImpStream & rStrm)3945*b1cdbd2cSJim Jagielski void XclImpChChart::ReadChAxesSet( XclImpStream& rStrm )
3946*b1cdbd2cSJim Jagielski {
3947*b1cdbd2cSJim Jagielski     XclImpChAxesSetRef xAxesSet( new XclImpChAxesSet( GetChRoot(), EXC_CHAXESSET_NONE ) );
3948*b1cdbd2cSJim Jagielski     xAxesSet->ReadRecordGroup( rStrm );
3949*b1cdbd2cSJim Jagielski     switch( xAxesSet->GetAxesSetId() )
3950*b1cdbd2cSJim Jagielski     {
3951*b1cdbd2cSJim Jagielski         case EXC_CHAXESSET_PRIMARY:     mxPrimAxesSet = xAxesSet;   break;
3952*b1cdbd2cSJim Jagielski         case EXC_CHAXESSET_SECONDARY:   mxSecnAxesSet = xAxesSet;   break;
3953*b1cdbd2cSJim Jagielski     }
3954*b1cdbd2cSJim Jagielski }
3955*b1cdbd2cSJim Jagielski 
ReadChText(XclImpStream & rStrm)3956*b1cdbd2cSJim Jagielski void XclImpChChart::ReadChText( XclImpStream& rStrm )
3957*b1cdbd2cSJim Jagielski {
3958*b1cdbd2cSJim Jagielski     XclImpChTextRef xText( new XclImpChText( GetChRoot() ) );
3959*b1cdbd2cSJim Jagielski     xText->ReadRecordGroup( rStrm );
3960*b1cdbd2cSJim Jagielski     switch( xText->GetLinkTarget() )
3961*b1cdbd2cSJim Jagielski     {
3962*b1cdbd2cSJim Jagielski         case EXC_CHOBJLINK_TITLE:
3963*b1cdbd2cSJim Jagielski             mxTitle = xText;
3964*b1cdbd2cSJim Jagielski         break;
3965*b1cdbd2cSJim Jagielski         case EXC_CHOBJLINK_DATA:
3966*b1cdbd2cSJim Jagielski         {
3967*b1cdbd2cSJim Jagielski             sal_uInt16 nSeriesIdx = xText->GetPointPos().mnSeriesIdx;
3968*b1cdbd2cSJim Jagielski             if( nSeriesIdx < maSeries.size() )
3969*b1cdbd2cSJim Jagielski                 maSeries[ nSeriesIdx ]->SetDataLabel( xText );
3970*b1cdbd2cSJim Jagielski         }
3971*b1cdbd2cSJim Jagielski         break;
3972*b1cdbd2cSJim Jagielski     }
3973*b1cdbd2cSJim Jagielski }
3974*b1cdbd2cSJim Jagielski 
Finalize()3975*b1cdbd2cSJim Jagielski void XclImpChChart::Finalize()
3976*b1cdbd2cSJim Jagielski {
3977*b1cdbd2cSJim Jagielski     // finalize series (must be done first)
3978*b1cdbd2cSJim Jagielski     FinalizeSeries();
3979*b1cdbd2cSJim Jagielski     // #i49218# legend may be attached to primary or secondary axes set
3980*b1cdbd2cSJim Jagielski     mxLegend = mxPrimAxesSet->GetLegend();
3981*b1cdbd2cSJim Jagielski     if( !mxLegend )
3982*b1cdbd2cSJim Jagielski         mxLegend = mxSecnAxesSet->GetLegend();
3983*b1cdbd2cSJim Jagielski     if( mxLegend.is() )
3984*b1cdbd2cSJim Jagielski         mxLegend->Finalize();
3985*b1cdbd2cSJim Jagielski     // axes sets, updates chart type group default formats -> must be called before FinalizeDataFormats()
3986*b1cdbd2cSJim Jagielski     mxPrimAxesSet->Finalize();
3987*b1cdbd2cSJim Jagielski     mxSecnAxesSet->Finalize();
3988*b1cdbd2cSJim Jagielski     // formatting of all series
3989*b1cdbd2cSJim Jagielski     FinalizeDataFormats();
3990*b1cdbd2cSJim Jagielski     // #i47745# missing frame -> invisible border and area
3991*b1cdbd2cSJim Jagielski     if( !mxFrame )
3992*b1cdbd2cSJim Jagielski         mxFrame.reset( new XclImpChFrame( GetChRoot(), EXC_CHOBJTYPE_BACKGROUND ) );
3993*b1cdbd2cSJim Jagielski     // chart title
3994*b1cdbd2cSJim Jagielski     FinalizeTitle();
3995*b1cdbd2cSJim Jagielski }
3996*b1cdbd2cSJim Jagielski 
FinalizeSeries()3997*b1cdbd2cSJim Jagielski void XclImpChChart::FinalizeSeries()
3998*b1cdbd2cSJim Jagielski {
3999*b1cdbd2cSJim Jagielski     for( XclImpChSeriesVec::iterator aSIt = maSeries.begin(), aSEnd = maSeries.end(); aSIt != aSEnd; ++aSIt )
4000*b1cdbd2cSJim Jagielski     {
4001*b1cdbd2cSJim Jagielski         XclImpChSeriesRef xSeries = *aSIt;
4002*b1cdbd2cSJim Jagielski         if( xSeries->HasParentSeries() )
4003*b1cdbd2cSJim Jagielski         {
4004*b1cdbd2cSJim Jagielski             /*  Process child series (trend lines and error bars). Data of
4005*b1cdbd2cSJim Jagielski                 child series will be set at the connected parent series. */
4006*b1cdbd2cSJim Jagielski             if( xSeries->GetParentIdx() < maSeries.size() )
4007*b1cdbd2cSJim Jagielski                 maSeries[ xSeries->GetParentIdx() ]->AddChildSeries( *xSeries );
4008*b1cdbd2cSJim Jagielski         }
4009*b1cdbd2cSJim Jagielski         else
4010*b1cdbd2cSJim Jagielski         {
4011*b1cdbd2cSJim Jagielski             // insert the series into the related chart type group
4012*b1cdbd2cSJim Jagielski             if( XclImpChTypeGroup* pTypeGroup = GetTypeGroup( xSeries->GetGroupIdx() ).get() )
4013*b1cdbd2cSJim Jagielski                 pTypeGroup->AddSeries( xSeries );
4014*b1cdbd2cSJim Jagielski         }
4015*b1cdbd2cSJim Jagielski     }
4016*b1cdbd2cSJim Jagielski }
4017*b1cdbd2cSJim Jagielski 
FinalizeDataFormats()4018*b1cdbd2cSJim Jagielski void XclImpChChart::FinalizeDataFormats()
4019*b1cdbd2cSJim Jagielski {
4020*b1cdbd2cSJim Jagielski     /*  #i51639# (part 1): CHDATAFORMAT groups are part of CHSERIES groups.
4021*b1cdbd2cSJim Jagielski         Each CHDATAFORMAT group specifies the series and data point it is
4022*b1cdbd2cSJim Jagielski         assigned to. This makes it possible to have a data format that is
4023*b1cdbd2cSJim Jagielski         related to another series, e.g. a CHDATAFORMAT group for series 2 is
4024*b1cdbd2cSJim Jagielski         part of a CHSERIES group that describes series 1. Therefore the chart
4025*b1cdbd2cSJim Jagielski         itself has collected all CHDATAFORMAT groups to be able to store data
4026*b1cdbd2cSJim Jagielski         format groups for series that have not been imported at that time. This
4027*b1cdbd2cSJim Jagielski         loop finally assigns these groups to the related series. */
4028*b1cdbd2cSJim Jagielski     for( XclImpChDataFormatMap::const_iterator aMIt = maDataFmts.begin(), aMEnd = maDataFmts.end(); aMIt != aMEnd; ++aMIt )
4029*b1cdbd2cSJim Jagielski     {
4030*b1cdbd2cSJim Jagielski         sal_uInt16 nSeriesIdx = aMIt->first.mnSeriesIdx;
4031*b1cdbd2cSJim Jagielski         if( nSeriesIdx < maSeries.size() )
4032*b1cdbd2cSJim Jagielski             maSeries[ nSeriesIdx ]->SetDataFormat( aMIt->second );
4033*b1cdbd2cSJim Jagielski     }
4034*b1cdbd2cSJim Jagielski 
4035*b1cdbd2cSJim Jagielski     /*  #i51639# (part 2): Finalize data formats of all series. This adds for
4036*b1cdbd2cSJim Jagielski         example missing CHDATAFORMAT groups for entire series that are needed
4037*b1cdbd2cSJim Jagielski         for automatic colors of lines and areas. */
4038*b1cdbd2cSJim Jagielski     for( XclImpChSeriesVec::iterator aVIt = maSeries.begin(), aVEnd = maSeries.end(); aVIt != aVEnd; ++aVIt )
4039*b1cdbd2cSJim Jagielski         (*aVIt)->FinalizeDataFormats();
4040*b1cdbd2cSJim Jagielski }
4041*b1cdbd2cSJim Jagielski 
FinalizeTitle()4042*b1cdbd2cSJim Jagielski void XclImpChChart::FinalizeTitle()
4043*b1cdbd2cSJim Jagielski {
4044*b1cdbd2cSJim Jagielski     // special handling for auto-generated title
4045*b1cdbd2cSJim Jagielski     String aAutoTitle;
4046*b1cdbd2cSJim Jagielski     if( !mxTitle || (!mxTitle->IsDeleted() && !mxTitle->HasString()) )
4047*b1cdbd2cSJim Jagielski     {
4048*b1cdbd2cSJim Jagielski         // automatic title from first series name (if there are no series on secondary axes set)
4049*b1cdbd2cSJim Jagielski         if( !mxSecnAxesSet->IsValidAxesSet() )
4050*b1cdbd2cSJim Jagielski             aAutoTitle = mxPrimAxesSet->GetSingleSeriesTitle();
4051*b1cdbd2cSJim Jagielski         if( mxTitle.is() || (aAutoTitle.Len() > 0) )
4052*b1cdbd2cSJim Jagielski         {
4053*b1cdbd2cSJim Jagielski             if( !mxTitle )
4054*b1cdbd2cSJim Jagielski                 mxTitle.reset( new XclImpChText( GetChRoot() ) );
4055*b1cdbd2cSJim Jagielski             if( aAutoTitle.Len() == 0 )
4056*b1cdbd2cSJim Jagielski                 aAutoTitle = CREATE_STRING( "Chart Title" );
4057*b1cdbd2cSJim Jagielski         }
4058*b1cdbd2cSJim Jagielski     }
4059*b1cdbd2cSJim Jagielski 
4060*b1cdbd2cSJim Jagielski     // will reset mxTitle, if it does not contain a string and no auto title exists
4061*b1cdbd2cSJim Jagielski     lclFinalizeTitle( mxTitle, GetDefaultText( EXC_CHTEXTTYPE_TITLE ), aAutoTitle );
4062*b1cdbd2cSJim Jagielski }
4063*b1cdbd2cSJim Jagielski 
CreateDiagram() const4064*b1cdbd2cSJim Jagielski Reference< XDiagram > XclImpChChart::CreateDiagram() const
4065*b1cdbd2cSJim Jagielski {
4066*b1cdbd2cSJim Jagielski     // create a diagram object
4067*b1cdbd2cSJim Jagielski     Reference< XDiagram > xDiagram( ScfApiHelper::CreateInstance( SERVICE_CHART2_DIAGRAM ), UNO_QUERY );
4068*b1cdbd2cSJim Jagielski 
4069*b1cdbd2cSJim Jagielski     // convert global chart settings
4070*b1cdbd2cSJim Jagielski     ScfPropertySet aDiaProp( xDiagram );
4071*b1cdbd2cSJim Jagielski 
4072*b1cdbd2cSJim Jagielski     // treatment of missing values
4073*b1cdbd2cSJim Jagielski     using namespace cssc::MissingValueTreatment;
4074*b1cdbd2cSJim Jagielski     sal_Int32 nMissingValues = LEAVE_GAP;
4075*b1cdbd2cSJim Jagielski     switch( maProps.mnEmptyMode )
4076*b1cdbd2cSJim Jagielski     {
4077*b1cdbd2cSJim Jagielski         case EXC_CHPROPS_EMPTY_SKIP:        nMissingValues = LEAVE_GAP; break;
4078*b1cdbd2cSJim Jagielski         case EXC_CHPROPS_EMPTY_ZERO:        nMissingValues = USE_ZERO;  break;
4079*b1cdbd2cSJim Jagielski         case EXC_CHPROPS_EMPTY_INTERPOLATE: nMissingValues = CONTINUE;  break;
4080*b1cdbd2cSJim Jagielski     }
4081*b1cdbd2cSJim Jagielski     aDiaProp.SetProperty( EXC_CHPROP_MISSINGVALUETREATMENT, nMissingValues );
4082*b1cdbd2cSJim Jagielski 
4083*b1cdbd2cSJim Jagielski     return xDiagram;
4084*b1cdbd2cSJim Jagielski }
4085*b1cdbd2cSJim Jagielski 
4086*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
4087*b1cdbd2cSJim Jagielski 
XclImpChartDrawing(const XclImpRoot & rRoot,bool bOwnTab)4088*b1cdbd2cSJim Jagielski XclImpChartDrawing::XclImpChartDrawing( const XclImpRoot& rRoot, bool bOwnTab ) :
4089*b1cdbd2cSJim Jagielski     XclImpDrawing( rRoot, bOwnTab ), // sheet charts may contain OLE objects
4090*b1cdbd2cSJim Jagielski     mnScTab( rRoot.GetCurrScTab() ),
4091*b1cdbd2cSJim Jagielski     mbOwnTab( bOwnTab )
4092*b1cdbd2cSJim Jagielski {
4093*b1cdbd2cSJim Jagielski }
4094*b1cdbd2cSJim Jagielski 
ConvertObjects(XclImpDffConverter & rDffConv,const Reference<XModel> & rxModel,const Rectangle & rChartRect)4095*b1cdbd2cSJim Jagielski void XclImpChartDrawing::ConvertObjects( XclImpDffConverter& rDffConv,
4096*b1cdbd2cSJim Jagielski         const Reference< XModel >& rxModel, const Rectangle& rChartRect )
4097*b1cdbd2cSJim Jagielski {
4098*b1cdbd2cSJim Jagielski     maChartRect = rChartRect;   // needed in CalcAnchorRect() callback
4099*b1cdbd2cSJim Jagielski 
4100*b1cdbd2cSJim Jagielski     SdrModel* pSdrModel = 0;
4101*b1cdbd2cSJim Jagielski     SdrPage* pSdrPage = 0;
4102*b1cdbd2cSJim Jagielski     if( mbOwnTab )
4103*b1cdbd2cSJim Jagielski     {
4104*b1cdbd2cSJim Jagielski         // chart sheet: insert all shapes into the sheet, not into the chart object
4105*b1cdbd2cSJim Jagielski         pSdrModel = GetDoc().GetDrawLayer();
4106*b1cdbd2cSJim Jagielski         pSdrPage = GetSdrPage( mnScTab );
4107*b1cdbd2cSJim Jagielski     }
4108*b1cdbd2cSJim Jagielski     else
4109*b1cdbd2cSJim Jagielski     {
4110*b1cdbd2cSJim Jagielski         // embedded chart object: insert all shapes into the chart
4111*b1cdbd2cSJim Jagielski         try
4112*b1cdbd2cSJim Jagielski         {
4113*b1cdbd2cSJim Jagielski             Reference< XDrawPageSupplier > xDrawPageSupp( rxModel, UNO_QUERY_THROW );
4114*b1cdbd2cSJim Jagielski             Reference< XDrawPage > xDrawPage( xDrawPageSupp->getDrawPage(), UNO_SET_THROW );
4115*b1cdbd2cSJim Jagielski             pSdrPage = ::GetSdrPageFromXDrawPage( xDrawPage );
4116*b1cdbd2cSJim Jagielski             pSdrModel = pSdrPage ? pSdrPage->GetModel() : 0;
4117*b1cdbd2cSJim Jagielski         }
4118*b1cdbd2cSJim Jagielski         catch( Exception& )
4119*b1cdbd2cSJim Jagielski         {
4120*b1cdbd2cSJim Jagielski         }
4121*b1cdbd2cSJim Jagielski     }
4122*b1cdbd2cSJim Jagielski 
4123*b1cdbd2cSJim Jagielski     if( pSdrModel && pSdrPage )
4124*b1cdbd2cSJim Jagielski         ImplConvertObjects( rDffConv, *pSdrModel, *pSdrPage );
4125*b1cdbd2cSJim Jagielski }
4126*b1cdbd2cSJim Jagielski 
CalcAnchorRect(const XclObjAnchor & rAnchor,bool bDffAnchor) const4127*b1cdbd2cSJim Jagielski Rectangle XclImpChartDrawing::CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const
4128*b1cdbd2cSJim Jagielski {
4129*b1cdbd2cSJim Jagielski     /*  In objects with DFF client anchor, the position of the shape is stored
4130*b1cdbd2cSJim Jagielski         in the cell address components of the client anchor. In old BIFF3-BIFF5
4131*b1cdbd2cSJim Jagielski         objects, the position is stored in the offset components of the anchor. */
4132*b1cdbd2cSJim Jagielski     Rectangle aRect(
4133*b1cdbd2cSJim Jagielski         static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maFirst.mnCol : rAnchor.mnLX ) / EXC_CHART_TOTALUNITS * maChartRect.GetWidth()  + 0.5 ),
4134*b1cdbd2cSJim Jagielski         static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maFirst.mnRow : rAnchor.mnTY ) / EXC_CHART_TOTALUNITS * maChartRect.GetHeight() + 0.5 ),
4135*b1cdbd2cSJim Jagielski         static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maLast.mnCol  : rAnchor.mnRX ) / EXC_CHART_TOTALUNITS * maChartRect.GetWidth()  + 0.5 ),
4136*b1cdbd2cSJim Jagielski         static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maLast.mnRow  : rAnchor.mnBY ) / EXC_CHART_TOTALUNITS * maChartRect.GetHeight() + 0.5 ) );
4137*b1cdbd2cSJim Jagielski     aRect.Justify();
4138*b1cdbd2cSJim Jagielski     // move shapes into chart area for sheet charts
4139*b1cdbd2cSJim Jagielski     if( mbOwnTab )
4140*b1cdbd2cSJim Jagielski         aRect.Move( maChartRect.Left(), maChartRect.Top() );
4141*b1cdbd2cSJim Jagielski     return aRect;
4142*b1cdbd2cSJim Jagielski }
4143*b1cdbd2cSJim Jagielski 
OnObjectInserted(const XclImpDrawObjBase &)4144*b1cdbd2cSJim Jagielski void XclImpChartDrawing::OnObjectInserted( const XclImpDrawObjBase& )
4145*b1cdbd2cSJim Jagielski {
4146*b1cdbd2cSJim Jagielski }
4147*b1cdbd2cSJim Jagielski 
4148*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
4149*b1cdbd2cSJim Jagielski 
XclImpChart(const XclImpRoot & rRoot,bool bOwnTab)4150*b1cdbd2cSJim Jagielski XclImpChart::XclImpChart( const XclImpRoot& rRoot, bool bOwnTab ) :
4151*b1cdbd2cSJim Jagielski     XclImpRoot( rRoot ),
4152*b1cdbd2cSJim Jagielski     mbOwnTab( bOwnTab ),
4153*b1cdbd2cSJim Jagielski     mbIsPivotChart( false )
4154*b1cdbd2cSJim Jagielski {
4155*b1cdbd2cSJim Jagielski }
4156*b1cdbd2cSJim Jagielski 
~XclImpChart()4157*b1cdbd2cSJim Jagielski XclImpChart::~XclImpChart()
4158*b1cdbd2cSJim Jagielski {
4159*b1cdbd2cSJim Jagielski }
4160*b1cdbd2cSJim Jagielski 
ReadChartSubStream(XclImpStream & rStrm)4161*b1cdbd2cSJim Jagielski void XclImpChart::ReadChartSubStream( XclImpStream& rStrm )
4162*b1cdbd2cSJim Jagielski {
4163*b1cdbd2cSJim Jagielski     XclImpPageSettings& rPageSett = GetPageSettings();
4164*b1cdbd2cSJim Jagielski     XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
4165*b1cdbd2cSJim Jagielski 
4166*b1cdbd2cSJim Jagielski     bool bLoop = true;
4167*b1cdbd2cSJim Jagielski     while( bLoop && rStrm.StartNextRecord() )
4168*b1cdbd2cSJim Jagielski     {
4169*b1cdbd2cSJim Jagielski         // page settings - only for charts in entire sheet
4170*b1cdbd2cSJim Jagielski         if( mbOwnTab ) switch( rStrm.GetRecId() )
4171*b1cdbd2cSJim Jagielski         {
4172*b1cdbd2cSJim Jagielski             case EXC_ID_HORPAGEBREAKS:
4173*b1cdbd2cSJim Jagielski             case EXC_ID_VERPAGEBREAKS:  rPageSett.ReadPageBreaks( rStrm );      break;
4174*b1cdbd2cSJim Jagielski             case EXC_ID_HEADER:
4175*b1cdbd2cSJim Jagielski             case EXC_ID_FOOTER:         rPageSett.ReadHeaderFooter( rStrm );    break;
4176*b1cdbd2cSJim Jagielski             case EXC_ID_LEFTMARGIN:
4177*b1cdbd2cSJim Jagielski             case EXC_ID_RIGHTMARGIN:
4178*b1cdbd2cSJim Jagielski             case EXC_ID_TOPMARGIN:
4179*b1cdbd2cSJim Jagielski             case EXC_ID_BOTTOMMARGIN:   rPageSett.ReadMargin( rStrm );          break;
4180*b1cdbd2cSJim Jagielski             case EXC_ID_PRINTHEADERS:   rPageSett.ReadPrintHeaders( rStrm );    break;
4181*b1cdbd2cSJim Jagielski             case EXC_ID_PRINTGRIDLINES: rPageSett.ReadPrintGridLines( rStrm );  break;
4182*b1cdbd2cSJim Jagielski             case EXC_ID_HCENTER:
4183*b1cdbd2cSJim Jagielski             case EXC_ID_VCENTER:        rPageSett.ReadCenter( rStrm );          break;
4184*b1cdbd2cSJim Jagielski             case EXC_ID_SETUP:          rPageSett.ReadSetup( rStrm );           break;
4185*b1cdbd2cSJim Jagielski             case EXC_ID8_IMGDATA:       rPageSett.ReadImgData( rStrm );         break;
4186*b1cdbd2cSJim Jagielski 
4187*b1cdbd2cSJim Jagielski             case EXC_ID_WINDOW2:        rTabViewSett.ReadWindow2( rStrm, true );break;
4188*b1cdbd2cSJim Jagielski             case EXC_ID_SCL:            rTabViewSett.ReadScl( rStrm );          break;
4189*b1cdbd2cSJim Jagielski 
4190*b1cdbd2cSJim Jagielski             case EXC_ID_SHEETEXT: //0x0862
4191*b1cdbd2cSJim Jagielski             {
4192*b1cdbd2cSJim Jagielski                 // FIXME: do not need to pass palette, XclImpTabVieSettings is derived from root
4193*b1cdbd2cSJim Jagielski                 XclImpPalette& rPal = GetPalette();
4194*b1cdbd2cSJim Jagielski                 rTabViewSett.ReadTabBgColor( rStrm,  rPal);
4195*b1cdbd2cSJim Jagielski             }
4196*b1cdbd2cSJim Jagielski             break;
4197*b1cdbd2cSJim Jagielski 
4198*b1cdbd2cSJim Jagielski             case EXC_ID_CODENAME:       ReadCodeName( rStrm, false );           break;
4199*b1cdbd2cSJim Jagielski         }
4200*b1cdbd2cSJim Jagielski 
4201*b1cdbd2cSJim Jagielski         // common records
4202*b1cdbd2cSJim Jagielski         switch( rStrm.GetRecId() )
4203*b1cdbd2cSJim Jagielski         {
4204*b1cdbd2cSJim Jagielski             case EXC_ID_EOF:            bLoop = false;                          break;
4205*b1cdbd2cSJim Jagielski 
4206*b1cdbd2cSJim Jagielski             // #i31882# ignore embedded chart objects
4207*b1cdbd2cSJim Jagielski             case EXC_ID2_BOF:
4208*b1cdbd2cSJim Jagielski             case EXC_ID3_BOF:
4209*b1cdbd2cSJim Jagielski             case EXC_ID4_BOF:
4210*b1cdbd2cSJim Jagielski             case EXC_ID5_BOF:           XclTools::SkipSubStream( rStrm );       break;
4211*b1cdbd2cSJim Jagielski 
4212*b1cdbd2cSJim Jagielski             case EXC_ID_CHCHART:        ReadChChart( rStrm );                   break;
4213*b1cdbd2cSJim Jagielski 
4214*b1cdbd2cSJim Jagielski             case EXC_ID8_CHPIVOTREF:
4215*b1cdbd2cSJim Jagielski                 GetTracer().TracePivotChartExists();
4216*b1cdbd2cSJim Jagielski                 mbIsPivotChart = true;
4217*b1cdbd2cSJim Jagielski             break;
4218*b1cdbd2cSJim Jagielski 
4219*b1cdbd2cSJim Jagielski             // BIFF specific records
4220*b1cdbd2cSJim Jagielski             default: switch( GetBiff() )
4221*b1cdbd2cSJim Jagielski             {
4222*b1cdbd2cSJim Jagielski                 case EXC_BIFF5: switch( rStrm.GetRecId() )
4223*b1cdbd2cSJim Jagielski                 {
4224*b1cdbd2cSJim Jagielski                     case EXC_ID_OBJ:        GetChartDrawing().ReadObj( rStrm );         break;
4225*b1cdbd2cSJim Jagielski                 }
4226*b1cdbd2cSJim Jagielski                 break;
4227*b1cdbd2cSJim Jagielski                 case EXC_BIFF8: switch( rStrm.GetRecId() )
4228*b1cdbd2cSJim Jagielski                 {
4229*b1cdbd2cSJim Jagielski                     case EXC_ID_MSODRAWING: GetChartDrawing().ReadMsoDrawing( rStrm );  break;
4230*b1cdbd2cSJim Jagielski                     // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format
4231*b1cdbd2cSJim Jagielski                     case EXC_ID_OBJ:        GetChartDrawing().ReadObj( rStrm );         break;
4232*b1cdbd2cSJim Jagielski                 }
4233*b1cdbd2cSJim Jagielski                 break;
4234*b1cdbd2cSJim Jagielski                 default:;
4235*b1cdbd2cSJim Jagielski             }
4236*b1cdbd2cSJim Jagielski         }
4237*b1cdbd2cSJim Jagielski     }
4238*b1cdbd2cSJim Jagielski }
4239*b1cdbd2cSJim Jagielski 
UpdateObjFrame(const XclObjLineData & rLineData,const XclObjFillData & rFillData)4240*b1cdbd2cSJim Jagielski void XclImpChart::UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData )
4241*b1cdbd2cSJim Jagielski {
4242*b1cdbd2cSJim Jagielski     if( !mxChartData )
4243*b1cdbd2cSJim Jagielski         mxChartData.reset( new XclImpChChart( GetRoot() ) );
4244*b1cdbd2cSJim Jagielski     mxChartData->UpdateObjFrame( rLineData, rFillData );
4245*b1cdbd2cSJim Jagielski }
4246*b1cdbd2cSJim Jagielski 
GetProgressSize() const4247*b1cdbd2cSJim Jagielski sal_Size XclImpChart::GetProgressSize() const
4248*b1cdbd2cSJim Jagielski {
4249*b1cdbd2cSJim Jagielski     return
4250*b1cdbd2cSJim Jagielski         (mxChartData.is() ? mxChartData->GetProgressSize() : 0) +
4251*b1cdbd2cSJim Jagielski         (mxChartDrawing.is() ? mxChartDrawing->GetProgressSize() : 0);
4252*b1cdbd2cSJim Jagielski }
4253*b1cdbd2cSJim Jagielski 
Convert(Reference<XModel> xModel,XclImpDffConverter & rDffConv,const OUString & rObjName,const Rectangle & rChartRect) const4254*b1cdbd2cSJim Jagielski void XclImpChart::Convert( Reference< XModel > xModel, XclImpDffConverter& rDffConv, const OUString& rObjName, const Rectangle& rChartRect ) const
4255*b1cdbd2cSJim Jagielski {
4256*b1cdbd2cSJim Jagielski     Reference< XChartDocument > xChartDoc( xModel, UNO_QUERY );
4257*b1cdbd2cSJim Jagielski     if( xChartDoc.is() )
4258*b1cdbd2cSJim Jagielski     {
4259*b1cdbd2cSJim Jagielski         if( mxChartData.is() )
4260*b1cdbd2cSJim Jagielski             mxChartData->Convert( xChartDoc, rDffConv, rObjName, rChartRect );
4261*b1cdbd2cSJim Jagielski         if( mxChartDrawing.is() )
4262*b1cdbd2cSJim Jagielski             mxChartDrawing->ConvertObjects( rDffConv, xModel, rChartRect );
4263*b1cdbd2cSJim Jagielski     }
4264*b1cdbd2cSJim Jagielski }
4265*b1cdbd2cSJim Jagielski 
GetChartDrawing()4266*b1cdbd2cSJim Jagielski XclImpChartDrawing& XclImpChart::GetChartDrawing()
4267*b1cdbd2cSJim Jagielski {
4268*b1cdbd2cSJim Jagielski     if( !mxChartDrawing )
4269*b1cdbd2cSJim Jagielski         mxChartDrawing.reset( new XclImpChartDrawing( GetRoot(), mbOwnTab ) );
4270*b1cdbd2cSJim Jagielski     return *mxChartDrawing;
4271*b1cdbd2cSJim Jagielski }
4272*b1cdbd2cSJim Jagielski 
ReadChChart(XclImpStream & rStrm)4273*b1cdbd2cSJim Jagielski void XclImpChart::ReadChChart( XclImpStream& rStrm )
4274*b1cdbd2cSJim Jagielski {
4275*b1cdbd2cSJim Jagielski     mxChartData.reset( new XclImpChChart( GetRoot() ) );
4276*b1cdbd2cSJim Jagielski     mxChartData->ReadRecordGroup( rStrm );
4277*b1cdbd2cSJim Jagielski }
4278*b1cdbd2cSJim Jagielski 
4279*b1cdbd2cSJim Jagielski // ============================================================================
4280*b1cdbd2cSJim Jagielski 
4281