xref: /trunk/main/sc/source/filter/inc/xichart.hxx (revision 38d50f7b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SC_XICHART_HXX
25 #define SC_XICHART_HXX
26 
27 #include <vector>
28 #include <map>
29 #include <set>
30 #include <list>
31 
32 #include <svl/itemset.hxx>
33 
34 #include "rangelst.hxx"
35 #include "token.hxx"
36 #include "xlchart.hxx"
37 #include "xlstyle.hxx"
38 #include "xiescher.hxx"
39 #include "xistring.hxx"
40 
41 namespace com { namespace sun { namespace star {
42     namespace awt
43     {
44         struct Rectangle;
45     }
46     namespace frame
47     {
48         class XModel;
49     }
50     namespace drawing
51     {
52         class XShape;
53     }
54     namespace chart2
55     {
56         struct ScaleData;
57         class XChartDocument;
58         class XDiagram;
59         class XCoordinateSystem;
60         class XChartType;
61         class XDataSeries;
62         class XRegressionCurve;
63         class XAxis;
64         class XLegend;
65         class XTitle;
66         class XFormattedString;
67         namespace data
68         {
69             class XDataProvider;
70             class XDataSequence;
71             class XLabeledDataSequence;
72         }
73     }
74 } } }
75 
76 struct XclObjLineData;
77 struct XclObjFillData;
78 
79 // Common =====================================================================
80 
81 class ScfProgressBar;
82 struct XclImpChRootData;
83 class XclImpChChart;
84 class ScTokenArray;
85 
86 /** Base class for complex chart classes, provides access to other components of the chart. */
87 class XclImpChRoot : public XclImpRoot
88 {
89 public:
90     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > XChartDocRef;
91 
92 public:
93     explicit            XclImpChRoot( const XclImpRoot& rRoot, XclImpChChart& rChartData );
94     virtual             ~XclImpChRoot();
95 
96     /** Returns this root instance - for code readability in derived classes. */
GetChRoot() const97     inline const XclImpChRoot& GetChRoot() const { return *this; }
98     /** Returns a reference to the parent chart data object. */
99     XclImpChChart&      GetChartData() const;
100     /** Returns chart type info for a unique chart type identifier. */
101     const XclChTypeInfo& GetChartTypeInfo( XclChTypeId eType ) const;
102     /** Returns the first fitting chart type info for an Excel chart type record identifier. */
103     const XclChTypeInfo& GetChartTypeInfo( sal_uInt16 nRecId ) const;
104     /** Returns an info struct about auto formatting for the passed object type. */
105     const XclChFormatInfo& GetFormatInfo( XclChObjectType eObjType ) const;
106 
107     /** Returns the default text color for charts. */
108     Color               GetFontAutoColor() const;
109     /** Returns the automatic line color of linear series. */
110     Color               GetSeriesLineAutoColor( sal_uInt16 nFormatIdx ) const;
111     /** Returns the automatic fill color of filled series. */
112     Color               GetSeriesFillAutoColor( sal_uInt16 nFormatIdx ) const;
113 
114     /** Starts the API chart document conversion. Must be called once before all API conversion. */
115     void                InitConversion( XChartDocRef xChartDoc, const Rectangle& rChartRect ) const;
116     /** Finishes the API chart document conversion. Must be called once after all API conversion. */
117     void                FinishConversion( XclImpDffConverter& rDffConv ) const;
118 
119     /** Returns the data provider for the chart document. */
120     ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataProvider >
121                         GetDataProvider() const;
122     /** Returns the drawing shape interface of the specified title object. */
123     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >
124                         GetTitleShape( const XclChTextKey& rTitleKey ) const;
125 
126     /** Converts the passed horizontal coordinate from Excel chart units into 1/100 mm. */
127     sal_Int32           CalcHmmFromChartX( sal_Int32 nPosX ) const;
128     /** Converts the passed vertical coordinate from Excel chart units into 1/100 mm. */
129     sal_Int32           CalcHmmFromChartY( sal_Int32 nPosY ) const;
130     /** Converts the passed rectangle from Excel chart units into 1/100 mm. */
131     ::com::sun::star::awt::Rectangle CalcHmmFromChartRect( const XclChRectangle& rRect ) const;
132 
133     /** Converts the passed horizontal coordinate from 1/100 mm into a relative position. */
134     double              CalcRelativeFromHmmX( sal_Int32 nPosX ) const;
135     /** Converts the passed vertical coordinate from 1/100 mm into a relative position. */
136     double              CalcRelativeFromHmmY( sal_Int32 nPosY ) const;
137 
138     /** Converts the passed horizontal coordinate from Excel chart units into a relative position. */
139     double              CalcRelativeFromChartX( sal_Int32 nPosX ) const;
140     /** Converts the passed vertical coordinate from Excel chart units into a relative position. */
141     double              CalcRelativeFromChartY( sal_Int32 nPosY ) const;
142 
143     /** Writes all line properties to the passed property set. */
144     void                ConvertLineFormat(
145                             ScfPropertySet& rPropSet,
146                             const XclChLineFormat& rLineFmt,
147                             XclChPropertyMode ePropMode ) const;
148     /** Writes solid area properties to the passed property set. */
149     void                ConvertAreaFormat(
150                             ScfPropertySet& rPropSet,
151                             const XclChAreaFormat& rAreaFmt,
152                             XclChPropertyMode ePropMode ) const;
153     /** Writes gradient or bitmap area properties to the passed property set. */
154     void                ConvertEscherFormat(
155                             ScfPropertySet& rPropSet,
156                             const XclChEscherFormat& rEscherFmt,
157                             const XclChPicFormat* pPicFmt,
158                             sal_uInt32 nDffFillType,
159                             XclChPropertyMode ePropMode ) const;
160     /** Writes font properties to the passed property set. */
161     void                ConvertFont(
162                             ScfPropertySet& rPropSet,
163                             sal_uInt16 nFontIdx,
164                             const Color* pFontColor = 0 ) const;
165 
166     /** Writes the pie rotation property for the passed angle. */
167     static void         ConvertPieRotation(
168                             ScfPropertySet& rPropSet,
169                             sal_uInt16 nAngle );
170 
171 private:
172     typedef ScfRef< XclImpChRootData > XclImpChRootDataRef;
173     XclImpChRootDataRef mxChData;           /// Reference to the root data object.
174 };
175 
176 // ----------------------------------------------------------------------------
177 
178 /** Base class for chart record groups. Provides helper functions to read sub records.
179 
180     A chart record group consists of a header record, followed by a CHBEGIN
181     record, followed by group sub records, and finished with a CHEND record.
182  */
183 class XclImpChGroupBase
184 {
185 public:
186     virtual             ~XclImpChGroupBase();
187 
188     /** Reads the entire record group.
189         @descr  First calls ReadHeaderRecord() to read the contents of the
190             header record. Then tries to read the sub records. If next record
191             is a CHBEGIN record, ReadSubRecord() is called for each following
192             record until a CHEND record is found. */
193     void                ReadRecordGroup( XclImpStream& rStrm );
194 
195     /** Helper to skip a CHBEGIN/CHEND block, includes nested blocks. */
196     static void         SkipBlock( XclImpStream& rStrm );
197 
198     /** Derived classes implement to read the group header record. */
199     virtual void        ReadHeaderRecord( XclImpStream& rStrm ) = 0;
200     /** Derived classes implement to read a record from the group. */
201     virtual void        ReadSubRecord( XclImpStream& rStrm ) = 0;
202 };
203 
204 // Frame formatting ===========================================================
205 
206 class XclImpChFramePos
207 {
208 public:
209     /** Reads the CHFRAMEPOS record (frame position and size). */
210     void                ReadChFramePos( XclImpStream& rStrm );
211 
212     /** Returns read-only access to the imported frame position data. */
GetFramePosData() const213     inline const XclChFramePos& GetFramePosData() const { return maData; }
214 
215 private:
216     XclChFramePos       maData;             /// Position of the frame.
217 };
218 
219 typedef ScfRef< XclImpChFramePos > XclImpChFramePosRef;
220 
221 // ----------------------------------------------------------------------------
222 
223 /** The CHLINEFORMAT record containing line formatting data. */
224 class XclImpChLineFormat
225 {
226 public:
227     /** Creates a new line format object with automatic formatting. */
XclImpChLineFormat()228     inline explicit     XclImpChLineFormat() {}
229     /** Creates a new line format object with the passed formatting. */
XclImpChLineFormat(const XclChLineFormat & rLineFmt)230     inline explicit     XclImpChLineFormat( const XclChLineFormat& rLineFmt ) : maData( rLineFmt ) {}
231 
232     /** Reads the CHLINEFORMAT record (basic line properties). */
233     void                ReadChLineFormat( XclImpStream& rStrm );
234 
235     /** Returns true, if the line format is set to automatic. */
IsAuto() const236     inline bool         IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHLINEFORMAT_AUTO ); }
237     /** Returns true, if the line style is set to something visible. */
HasLine() const238     inline bool         HasLine() const { return IsAuto() || (maData.mnPattern != EXC_CHLINEFORMAT_NONE); }
239     /** Returns the line width of this line format (returns 'single', if the line is invisible). */
GetWeight() const240     inline sal_Int16    GetWeight() const { return (IsAuto() || !HasLine()) ? EXC_CHLINEFORMAT_SINGLE : maData.mnWeight; }
241     /** Returns true, if the "show axis" flag is set. */
IsShowAxis() const242     inline bool         IsShowAxis() const { return ::get_flag( maData.mnFlags, EXC_CHLINEFORMAT_SHOWAXIS ); }
243 
244     /** Converts and writes the contained data to the passed property set. */
245     void                Convert( const XclImpChRoot& rRoot,
246                             ScfPropertySet& rPropSet, XclChObjectType eObjType,
247                             sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const;
248 
249 private:
250     XclChLineFormat     maData;             /// Contents of the CHLINEFORMAT record.
251 };
252 
253 typedef ScfRef< XclImpChLineFormat > XclImpChLineFormatRef;
254 
255 // ----------------------------------------------------------------------------
256 
257 /** The CHAREAFORMAT record containing simple area formatting data (solid or patterns). */
258 class XclImpChAreaFormat
259 {
260 public:
261     /** Creates a new area format object with automatic formatting. */
XclImpChAreaFormat()262     inline explicit     XclImpChAreaFormat() {}
263     /** Creates a new area format object with the passed formatting. */
XclImpChAreaFormat(const XclChAreaFormat & rAreaFmt)264     inline explicit     XclImpChAreaFormat( const XclChAreaFormat& rAreaFmt ) : maData( rAreaFmt ) {}
265 
266     /** Reads the CHAREAFORMAT record (basic fill properties, e.g. transparent or colored). */
267     void                ReadChAreaFormat( XclImpStream& rStrm );
268 
269     /** Returns true, if the area format is set to automatic. */
IsAuto() const270     inline bool         IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHAREAFORMAT_AUTO ); }
271     /** Returns true, if the area style is set to something visible. */
HasArea() const272     inline bool         HasArea() const { return IsAuto() || (maData.mnPattern != EXC_PATT_NONE); }
273 
274     /** Converts and writes the contained data to the passed property set. */
275     void                Convert( const XclImpChRoot& rRoot,
276                             ScfPropertySet& rPropSet, XclChObjectType eObjType,
277                             sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const;
278 
279 private:
280     XclChAreaFormat     maData;             /// Contents of the CHAREAFORMAT record.
281 };
282 
283 typedef ScfRef< XclImpChAreaFormat > XclImpChAreaFormatRef;
284 
285 // ----------------------------------------------------------------------------
286 
287 /** The CHESCHERFORMAT record containing complex area formatting data (bitmaps, hatches). */
288 class XclImpChEscherFormat : public XclImpChGroupBase
289 {
290 public:
291     explicit            XclImpChEscherFormat( const XclImpRoot& rRoot );
292 
293     /** Reads the CHESCHERFORMAT record (complex fill data) (called by base class). */
294     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
295     /** Reads a record from the CHESCHERFORMAT group (called by base class). */
296     virtual void        ReadSubRecord( XclImpStream& rStrm );
297 
298     /** Converts and writes the contained data to the passed property set. */
299     void                Convert( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet,
300                             XclChObjectType eObjType, bool bUsePicFmt ) const;
301 
302 private:
303     XclChEscherFormat   maData;             /// Fill properties for complex areas (CHESCHERFORMAT record).
304     XclChPicFormat      maPicFmt;           /// Image options, e.g. stretched, stacked (CHPICFORMAT record).
305     sal_uInt32          mnDffFillType;      /// Fill type imported from the DFF property set.
306 };
307 
308 typedef ScfRef< XclImpChEscherFormat > XclImpChEscherFormatRef;
309 
310 // ----------------------------------------------------------------------------
311 
312 /** Base class for record groups containing frame formatting.
313 
314     Frame formatting can be part of several record groups, e.g. CHFRAME,
315     CHDATAFORMAT, CHDROPBAR. It consists of CHLINEFORMAT, CHAREAFORMAT, and
316     CHESCHERFORMAT group.
317  */
318 class XclImpChFrameBase : public XclImpChGroupBase
319 {
320 public:
321     /** Creates a new frame object without internal formatting objects. */
XclImpChFrameBase()322     inline explicit     XclImpChFrameBase() {}
323     /** Creates a new frame object with specific default formatting. */
324     explicit            XclImpChFrameBase( const XclChFormatInfo& rFmtInfo );
325 
326     /** Reads a frame formatting record (called by base class). */
327     virtual void        ReadSubRecord( XclImpStream& rStrm );
328 
329     /** Returns true, if the line format is set to automatic. */
IsAutoLine() const330     inline bool         IsAutoLine() const { return !mxLineFmt || mxLineFmt->IsAuto(); }
331     /** Returns true, if the line style is set to something visible. */
HasLine() const332     inline bool         HasLine() const { return IsAutoLine() || mxLineFmt->HasLine(); }
333     /** Returns the line weight used for this frame. */
GetLineWeight() const334     inline sal_Int16    GetLineWeight() const { return mxLineFmt.is() ? mxLineFmt->GetWeight() : EXC_CHLINEFORMAT_SINGLE; }
335 
336     /** Returns true, if the area format is set to automatic. */
IsAutoArea() const337     inline bool         IsAutoArea() const { return !mxEscherFmt && (!mxAreaFmt || mxAreaFmt->IsAuto()); }
338     /** Returns true, if the area style is set to something visible. */
HasArea() const339     inline bool         HasArea() const { return mxEscherFmt.is() || IsAutoArea() || mxAreaFmt->HasArea(); }
340 
341 protected:
342     /** Converts and writes the contained line formatting to the passed property set. */
343     void                ConvertLineBase( const XclImpChRoot& rRoot,
344                             ScfPropertySet& rPropSet, XclChObjectType eObjType,
345                             sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN ) const;
346     /** Converts and writes the contained area formatting to the passed property set. */
347     void                ConvertAreaBase( const XclImpChRoot& rRoot,
348                             ScfPropertySet& rPropSet, XclChObjectType eObjType,
349                             sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN, bool bUsePicFmt = false ) const;
350     /** Converts and writes the contained data to the passed property set. */
351     void                ConvertFrameBase( const XclImpChRoot& rRoot,
352                             ScfPropertySet& rPropSet, XclChObjectType eObjType,
353                             sal_uInt16 nFormatIdx = EXC_CHDATAFORMAT_UNKNOWN, bool bUsePicFmt = false ) const;
354 
355 protected:
356     XclImpChLineFormatRef mxLineFmt;        /// Line format (CHLINEFORMAT record).
357     XclImpChAreaFormatRef mxAreaFmt;        /// Area format (CHAREAFORMAT record).
358     XclImpChEscherFormatRef mxEscherFmt;    /// Complex area format (CHESCHERFORMAT record).
359 };
360 
361 // ----------------------------------------------------------------------------
362 
363 /** Represents the CHFRAME record group containing object frame properties.
364 
365     The CHFRAME group consists of: CHFRAME, CHBEGIN, CHLINEFORMAT,
366     CHAREAFORMAT, CHESCHERFORMAT group, CHEND.
367  */
368 class XclImpChFrame : public XclImpChFrameBase, protected XclImpChRoot
369 {
370 public:
371     /** Creates a new frame object with specific default formatting. */
372     explicit            XclImpChFrame(
373                             const XclImpChRoot& rRoot,
374                             XclChObjectType eObjType );
375 
376     /** Reads the CHFRAME record (called by base class). */
377     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
378 
379     /** Sets formatting from BIFF3-BIFF5 OBJ record, if own formatting is invisible. */
380     void                UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData );
381 
382     /** Converts and writes the contained data to the passed property set. */
383     void                Convert( ScfPropertySet& rPropSet, bool bUsePicFmt = false ) const;
384 
385 private:
386     XclChFrame          maData;             /// Contents of the CHFRAME record.
387     XclChObjectType     meObjType;          /// Type of the represented object.
388 };
389 
390 typedef ScfRef< XclImpChFrame > XclImpChFrameRef;
391 
392 // Source links ===============================================================
393 
394 class XclImpChSourceLink : protected XclImpChRoot
395 {
396 public:
397     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence >   XDataSequenceRef;
398     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XFormattedString >      XFormattedStringRef;
399     typedef ::com::sun::star::uno::Sequence< XFormattedStringRef >                              XFormattedStringSeq;
400 
401 public:
402     explicit            XclImpChSourceLink( const XclImpChRoot& rRoot );
403     virtual             ~XclImpChSourceLink();
404 
405     /** Reads the CHSOURCELINK record (link to source data). */
406     void                ReadChSourceLink( XclImpStream& rStrm );
407     /** Sets explicit string data for this text object. */
408     void                SetString( const String& rString );
409     /** Sets formatting runs read from a CHFORMATRUNS record. */
410     void                SetTextFormats( const XclFormatRunVec& rFormats );
411 
412     /** Returns the destination object (title, values, category, ...). */
GetDestType() const413     inline sal_uInt8    GetDestType() const { return maData.mnDestType; }
414     /** Returns the link type (to worksheet, directly, default, ...). */
GetLinkType() const415     inline sal_uInt8    GetLinkType() const { return maData.mnLinkType; }
416 
417     /** Returns true, if the source link contains explicit string data. */
HasString() const418     inline bool         HasString() const { return mxString.is() && !mxString->IsEmpty(); }
419     /** Returns explicit string data or an empty string. */
GetString() const420     inline const String& GetString() const { return mxString.is() ? mxString->GetText() : String::EmptyString(); }
421     /** Returns the number of data points of this source link. */
422     sal_uInt16          GetCellCount() const;
423 
424     /** Converts and writes the contained number format to the passed property set. */
425     void                ConvertNumFmt( ScfPropertySet& rPropSet, bool bPercent ) const;
426 
427     /** Creates a data sequence containing the link into the Calc document. */
428     XDataSequenceRef    CreateDataSequence( const ::rtl::OUString& rRole ) const;
429     /** Creates a sequence of formatted string objects. */
430     XFormattedStringSeq CreateStringSequence( const XclImpChRoot& rRoot,
431                             sal_uInt16 nLeadFontIdx, const Color& rLeadFontColor ) const;
432 
433     void                FillSourceLink(::std::vector<ScSharedTokenRef>& rTokens) const;
434 
435 private:
436     XclChSourceLink     maData;             /// Contents of the CHSOURCELINK record.
437     XclImpStringRef     mxString;           /// Text data (CHSTRING record).
438     ScfRef< ScTokenArray> mxTokenArray;     /// Token array representing the data ranges.
439 };
440 
441 typedef ScfRef< XclImpChSourceLink > XclImpChSourceLinkRef;
442 
443 // Text =======================================================================
444 
445 /** Base class for objects with font settings. Provides font conversion helper functions. */
446 class XclImpChFontBase
447 {
448 public:
449     virtual             ~XclImpChFontBase();
450 
451     /** Derived classes return the leading font index for the text object. */
452     virtual sal_uInt16  GetFontIndex() const = 0;
453     /** Derived classes return the leading font color for the text object. */
454     virtual Color       GetFontColor() const = 0;
455     /** Derived classes return the rotation value for the text object. */
456     virtual sal_uInt16  GetRotation() const = 0;
457 
458     /** Converts and writes the contained font settings to the passed property set. */
459     void                ConvertFontBase( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet ) const;
460     /** Converts and writes the contained rotation settings to the passed property set. */
461     void                ConvertRotationBase( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet, bool bSupportsStacked ) const;
462 };
463 
464 // ----------------------------------------------------------------------------
465 
466 /** The CHFONT record containing a font index for text objects. */
467 class XclImpChFont
468 {
469 public:
470     explicit            XclImpChFont();
471     /** Reads the CHFONT record (font index). */
472     void                ReadChFont( XclImpStream& rStrm );
473 
474     /** Returns the contained font index. */
GetFontIndex() const475     inline sal_uInt16   GetFontIndex() const { return mnFontIdx; }
476 
477 private:
478     sal_uInt16          mnFontIdx;          /// Index into font buffer.
479 };
480 
481 typedef ScfRef< XclImpChFont > XclImpChFontRef;
482 
483 // ----------------------------------------------------------------------------
484 
485 /** Represents the CHTEXT record group containing text object properties.
486 
487     The CHTEXT group consists of: CHTEXT, CHBEGIN, CHFRAMEPOS, CHFONT,
488     CHFORMATRUNS, CHSOURCELINK, CHSTRING, CHFRAME group, CHOBJECTLINK, and CHEND.
489  */
490 class XclImpChText : public XclImpChGroupBase, public XclImpChFontBase, protected XclImpChRoot
491 {
492 public:
493     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XTitle > XTitleRef;
494 
495 public:
496     explicit            XclImpChText( const XclImpChRoot& rRoot );
497 
498     /** Reads the CHTEXT record (called by base class). */
499     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
500     /** Reads a record from the CHTEXT group (called by base class). */
501     virtual void        ReadSubRecord( XclImpStream& rStrm );
502 
503     /** Returns the leading font index for the text object. */
504     virtual sal_uInt16  GetFontIndex() const;
505     /** Returns the leading font color for the text object. */
506     virtual Color       GetFontColor() const;
507     /** Returns the rotation value for the text object. */
508     virtual sal_uInt16  GetRotation() const;
509 
510     /** Sets explicit string data for this text object. */
511     void                SetString( const String& rString );
512     /** Updates missing parts of this text object from the passed object. */
513     void                UpdateText( const XclImpChText* pParentText );
514     /** Updates display type of this data point label text object. */
515     void                UpdateDataLabel( bool bCateg, bool bValue, bool bPercent );
516 
517     /** Returns the target object this text is linked to. */
GetLinkTarget() const518     inline sal_uInt16   GetLinkTarget() const { return maObjLink.mnTarget; }
519     /** Returns the position of the data point label this text is linked to. */
GetPointPos() const520     inline const XclChDataPointPos& GetPointPos() const { return maObjLink.maPointPos; }
521     /** Returns true, if this text group contains string data. */
HasString() const522     inline bool         HasString() const { return mxSrcLink.is() && mxSrcLink->HasString(); }
523     /** Returns true, if the text object is marked as deleted. */
IsDeleted() const524     inline bool         IsDeleted() const { return ::get_flag( maData.mnFlags, EXC_CHTEXT_DELETED ); }
525 
526     /** Converts and writes the contained font settings to the passed property set. */
527     void                ConvertFont( ScfPropertySet& rPropSet ) const;
528     /** Converts and writes the contained rotation settings to the passed property set. */
529     void                ConvertRotation( ScfPropertySet& rPropSet, bool bSupportsStacked ) const;
530     /** Converts and writes the contained frame data to the passed property set. */
531     void                ConvertFrame( ScfPropertySet& rPropSet ) const;
532     /** Converts and writes the contained number format to the passed property set. */
533     void                ConvertNumFmt( ScfPropertySet& rPropSet, bool bPercent ) const;
534     /** Converts and writes all contained data to the passed data point label property set. */
535     void                ConvertDataLabel( ScfPropertySet& rPropSet, const XclChTypeInfo& rTypeInfo ) const;
536     /** Creates a title text object. */
537     XTitleRef           CreateTitle() const;
538     /** Converts the manual position of the specified title */
539     void                ConvertTitlePosition( const XclChTextKey& rTitleKey ) const;
540 
541 private:
542     using               XclImpChRoot::ConvertFont;
543 
544     /** Reads a CHFRLABELPROPS record. */
545     void                ReadChFrLabelProps( XclImpStream& rStrm );
546 
547 private:
548     typedef ScfRef< XclChFrLabelProps > XclChFrLabelPropsRef;
549 
550     XclChText           maData;             /// Contents of the CHTEXT record.
551     XclChObjectLink     maObjLink;          /// Link target for this text object.
552     XclFormatRunVec     maFormats;          /// Formatting runs (CHFORMATRUNS record).
553     XclImpChFramePosRef mxFramePos;         /// Relative text frame position (CHFRAMEPOS record).
554     XclImpChSourceLinkRef mxSrcLink;        /// Linked data (CHSOURCELINK with CHSTRING record).
555     XclImpChFrameRef    mxFrame;            /// Text object frame properties (CHFRAME group).
556     XclImpChFontRef     mxFont;             /// Index into font buffer (CHFONT record).
557     XclChFrLabelPropsRef mxLabelProps;      /// Extended data label properties (CHFRLABELPROPS record).
558 };
559 
560 typedef ScfRef< XclImpChText > XclImpChTextRef;
561 
562 // Data series ================================================================
563 
564 /** The CHMARKERFORMAT record containing data point marker formatting data. */
565 class XclImpChMarkerFormat
566 {
567 public:
568     /** Reads the CHMARKERFORMAT record (data point marker properties). */
569     void                ReadChMarkerFormat( XclImpStream& rStrm );
570 
571     /** Returns true, if the marker format is set to automatic. */
IsAuto() const572     inline bool         IsAuto() const { return ::get_flag( maData.mnFlags, EXC_CHMARKERFORMAT_AUTO ); }
573 
574     /** Converts and writes the contained data to the passed property set. */
575     void                Convert( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet,
576                             sal_uInt16 nFormatIdx, sal_Int16 nLineWeight ) const;
577     /** Sets the marker fill color as main color to the passed property set. */
578     void                ConvertColor( const XclImpChRoot& rRoot,
579                             ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx ) const;
580 
581 private:
582     XclChMarkerFormat   maData;             /// Contents of the CHMARKERFORMAT record.
583 };
584 
585 typedef ScfRef< XclImpChMarkerFormat > XclImpChMarkerFormatRef;
586 
587 // ----------------------------------------------------------------------------
588 
589 /** The CHPIEFORMAT record containing data point formatting data for pie segments. */
590 class XclImpChPieFormat
591 {
592 public:
593     explicit            XclImpChPieFormat();
594     /** Reads the CHPIEFORMAT record (pie segment properties). */
595     void                ReadChPieFormat( XclImpStream& rStrm );
596     /** Converts and writes the contained data to the passed property set. */
597     void                Convert( ScfPropertySet& rPropSet ) const;
598 
599 private:
600     sal_uInt16          mnPieDist;          /// Pie distance to diagram center.
601 };
602 
603 typedef ScfRef< XclImpChPieFormat > XclImpChPieFormatRef;
604 
605 // ----------------------------------------------------------------------------
606 
607 /** The CHSERIESFORMAT record containing additional settings for a data series. */
608 class XclImpChSeriesFormat
609 {
610 public:
611     explicit            XclImpChSeriesFormat();
612     /** Reads the CHSERIESFORMAT record (additional settings for a series). */
613     void                ReadChSeriesFormat( XclImpStream& rStrm );
614     /** Returns true, if the series line is smoothed. */
HasSpline() const615     inline bool         HasSpline() const { return ::get_flag( mnFlags, EXC_CHSERIESFORMAT_SMOOTHED ); }
616 
617 private:
618     sal_uInt16          mnFlags;            /// Additional flags.
619 };
620 
621 typedef ScfRef< XclImpChSeriesFormat > XclImpChSeriesFormatRef;
622 
623 // ----------------------------------------------------------------------------
624 
625 /** The CH3DDATAFORMAT record containing the bar type in 3D bar charts. */
626 class XclImpCh3dDataFormat
627 {
628 public:
629     /** Reads the CH3DDATAFORMAT record (3D bar properties). */
630     void                ReadCh3dDataFormat( XclImpStream& rStrm );
631     /** Converts and writes the contained data to the passed property set. */
632     void                Convert( ScfPropertySet& rPropSet ) const;
633 
634 private:
635     XclCh3dDataFormat   maData;             /// Contents of the CH3DDATAFORMAT record.
636 };
637 
638 typedef ScfRef< XclImpCh3dDataFormat > XclImpCh3dDataFormatRef;
639 
640 // ----------------------------------------------------------------------------
641 
642 /** The CHATTACHEDLABEL record that contains the type of a data point label. */
643 class XclImpChAttachedLabel : protected XclImpChRoot
644 {
645 public:
646     explicit            XclImpChAttachedLabel( const XclImpChRoot& rRoot );
647     /** Reads the CHATTACHEDLABEL record (data series/point labels). */
648     void                ReadChAttachedLabel( XclImpStream& rStrm );
649     /** Creates a CHTEXT group for the label. Clones xParentText and sets additional label settings */
650     XclImpChTextRef     CreateDataLabel( XclImpChTextRef xParent ) const;
651 
652 private:
653     sal_uInt16          mnFlags;            /// Additional flags.
654 };
655 
656 typedef ScfRef< XclImpChAttachedLabel > XclImpChAttLabelRef;
657 
658 // ----------------------------------------------------------------------------
659 
660 /** Represents the CHDATAFORMAT record group containing data point properties.
661 
662     The CHDATAFORMAT group consists of: CHDATAFORMAT, CHBEGIN, CHFRAME group,
663     CHMARKERFORMAT, CHPIEFORMAT, CH3DDATAFORMAT, CHSERIESFORMAT,
664     CHATTACHEDLABEL, CHEND.
665  */
666 class XclImpChDataFormat : public XclImpChFrameBase, protected XclImpChRoot
667 {
668 public:
669     explicit            XclImpChDataFormat( const XclImpChRoot& rRoot );
670 
671     /** Reads the CHDATAFORMAT record (called by base class). */
672     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
673     /** Reads a record from the CHDATAFORMAT group (called by base class). */
674     virtual void        ReadSubRecord( XclImpStream& rStrm );
675 
676     /** Sets this object to the specified data point position. */
677     void                SetPointPos( const XclChDataPointPos& rPointPos, sal_uInt16 nFormatIdx );
678     /** Sets type and text formatting for a data point label (CHTEXT group). */
SetDataLabel(XclImpChTextRef xLabel)679     inline void         SetDataLabel( XclImpChTextRef xLabel ) { mxLabel = xLabel; }
680 
681     /** Updates default data format for series group. */
682     void                UpdateGroupFormat( const XclChExtTypeInfo& rTypeInfo );
683     /** Updates missing series settings from the passed chart type group data format. */
684     void                UpdateSeriesFormat( const XclChExtTypeInfo& rTypeInfo, const XclImpChDataFormat* pGroupFmt );
685     /** Updates missing data point settings from the passed series format. */
686     void                UpdatePointFormat( const XclChExtTypeInfo& rTypeInfo, const XclImpChDataFormat* pSeriesFmt );
687     /** Updates default data format for trend lines. */
688     void                UpdateTrendLineFormat();
689 
690     /** Returns the position of the data point described by this group. */
GetPointPos() const691     inline const XclChDataPointPos& GetPointPos() const { return maData.maPointPos; }
692     /** Returns the format index of the data point described by this group. */
GetFormatIdx() const693     inline sal_uInt16   GetFormatIdx() const { return maData.mnFormatIdx; }
694     /** Returns true, if markers are set to automatic format. */
IsAutoMarker() const695     inline bool         IsAutoMarker() const { return !mxMarkerFmt || mxMarkerFmt->IsAuto(); }
696     /** Returns true, if the series line is smoothed. */
HasSpline() const697     inline bool         HasSpline() const { return mxSeriesFmt.is() && mxSeriesFmt->HasSpline(); }
698     /** Returns the data label text object. */
GetDataLabel() const699     inline XclImpChTextRef GetDataLabel() const { return mxLabel; }
700 
701     /** Converts and writes the contained data to the passed property set. */
702     void                Convert( ScfPropertySet& rPropSet, const XclChExtTypeInfo& rTypeInfo ) const;
703     /** Writes the line format only, e.g. for trend lines or error bars. */
704     void                ConvertLine( ScfPropertySet& rPropSet, XclChObjectType eObjType ) const;
705     /** Writes the area format only for the series or a data point. */
706     void                ConvertArea( ScfPropertySet& rPropSet, sal_uInt16 nFormatIdx, bool bUsePicFmt ) const;
707 
708 private:
709     /** Removes unused formatting (e.g. pie distance in a bar chart). */
710     void                RemoveUnusedFormats( const XclChExtTypeInfo& rTypeInfo );
711     /** Updates or creates the data point label. */
712     void                UpdateDataLabel( const XclImpChDataFormat* pParentFmt );
713 
714 private:
715     XclChDataFormat     maData;             /// Contents of the CHDATAFORMAT record.
716     XclImpChMarkerFormatRef mxMarkerFmt;    /// Data point marker (CHMARKERFORMAT record).
717     XclImpChPieFormatRef mxPieFmt;          /// Pie segment format (CHPIEFORMAT record).
718     XclImpChSeriesFormatRef mxSeriesFmt;    /// Series properties (CHSERIESFORMAT record).
719     XclImpCh3dDataFormatRef mx3dDataFmt;    /// 3D bar format (CH3DDATAFORMAT record).
720     XclImpChAttLabelRef mxAttLabel;         /// Data point label type (CHATTACHEDLABEL record).
721     XclImpChTextRef     mxLabel;            /// Data point label formatting (CHTEXT group).
722 };
723 
724 typedef ScfRef< XclImpChDataFormat > XclImpChDataFormatRef;
725 
726 // ----------------------------------------------------------------------------
727 
728 /** Represents the CHSERTRENDLINE record containing settings for a trend line. */
729 class XclImpChSerTrendLine : protected XclImpChRoot
730 {
731 public:
732     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XRegressionCurve > XRegressionCurveRef;
733 
734 public:
735     explicit            XclImpChSerTrendLine( const XclImpChRoot& rRoot );
736 
737     /** Reads the CHSERTRENDLINE record. */
738     void                ReadChSerTrendLine( XclImpStream& rStrm );
739     /** Sets formatting information for the trend line. */
SetDataFormat(XclImpChDataFormatRef xDataFmt)740     inline void         SetDataFormat( XclImpChDataFormatRef xDataFmt ) { mxDataFmt = xDataFmt; }
741 
742     /** Creates an API object representing this trend line. */
743     XRegressionCurveRef CreateRegressionCurve() const;
744 
745 private:
746     XclChSerTrendLine   maData;             /// Contents of the CHSERTRENDLINE record.
747     XclImpChDataFormatRef mxDataFmt;        /// Formatting settings of the trend line.
748 };
749 
750 typedef ScfRef< XclImpChSerTrendLine > XclImpChSerTrendLineRef;
751 
752 // ----------------------------------------------------------------------------
753 
754 /** Represents the CHSERERRORBAR record containing settings for error bars. */
755 class XclImpChSerErrorBar : protected XclImpChRoot
756 {
757 public:
758     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence >    XLabeledDataSeqRef;
759     typedef ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >                   XPropertySetRef;
760 
761 public:
762     explicit            XclImpChSerErrorBar( const XclImpChRoot& rRoot );
763 
764     /** Reads the CHSERERRORBAR record. */
765     void                ReadChSerErrorBar( XclImpStream& rStrm );
766     /** Sets link and formatting information for the error bars. */
767     void                SetSeriesData(
768                             XclImpChSourceLinkRef xValueLink,
769                             XclImpChDataFormatRef xDataFmt );
770 
771     /** Returns the type of this error bar (X/Y, plus/minus). */
GetBarType() const772     inline sal_uInt8    GetBarType() const { return maData.mnBarType; }
773     /** Creates a labeled data sequence object from value data link. */
774     XLabeledDataSeqRef  CreateValueSequence() const;
775 
776     /** Tries to create an error bar API object from the specified Excel error bars. */
777     static XPropertySetRef CreateErrorBar(
778                             const XclImpChSerErrorBar* pPosBar,
779                             const XclImpChSerErrorBar* pNegBar );
780 
781 private:
782     XclChSerErrorBar    maData;             /// Contents of the CHSERERRORBAR record.
783     XclImpChSourceLinkRef mxValueLink;      /// Link data for manual error bar values.
784     XclImpChDataFormatRef mxDataFmt;        /// Formatting settings of the error bars.
785 };
786 
787 typedef ScfRef< XclImpChSerErrorBar > XclImpChSerErrorBarRef;
788 
789 // ----------------------------------------------------------------------------
790 
791 /** Represents the CHSERIES record group describing a data series in a chart.
792 
793     The CHSERIES group consists of: CHSERIES, CHBEGIN, CHSOURCELINK groups,
794     CHDATAFORMAT groups, CHSERGROUP, CHSERPARENT, CHSERERRORBAR,
795     CHSERTRENDLINE, CHEND.
796  */
797 class XclImpChSeries : public XclImpChGroupBase, protected XclImpChRoot
798 {
799 public:
800     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >                   XDataSeriesRef;
801     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence >    XLabeledDataSeqRef;
802     typedef ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >                   XPropertySetRef;
803 
804 public:
805     explicit            XclImpChSeries( const XclImpChRoot& rRoot, sal_uInt16 nSeriesIdx );
806 
807     /** Reads the CHSERIES record (called by base class). */
808     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
809     /** Reads a record from the CHSERIES group (called by base class). */
810     virtual void        ReadSubRecord( XclImpStream& rStrm );
811 
812     /** Sets a data point or series format (CHDATAFORMAT group) for this series. */
813     void                SetDataFormat( XclImpChDataFormatRef xDataFmt );
814     /** Sets a label text (CHTEXT group) attached  to a series or data point. */
815     void                SetDataLabel( XclImpChTextRef xLabel );
816     /** Adds error bar settings from the passed series to the own series. */
817     void                AddChildSeries( const XclImpChSeries& rSeries );
818     /** Updates missing series formatting by using default formatting from axes sets. */
819     void                FinalizeDataFormats();
820 
821     /** Returns the axes set identifier this series is assigned to (primary/secondary). */
GetGroupIdx() const822     inline sal_uInt16   GetGroupIdx() const { return mnGroupIdx; }
823     /** Returns the 0-based series index described by this series. */
GetSeriesIdx() const824     inline sal_uInt16   GetSeriesIdx() const { return mnSeriesIdx; }
825     /** Returns the 0-based index of the parent series (e.g. of a trend line). */
GetParentIdx() const826     inline sal_uInt16   GetParentIdx() const { return mnParentIdx; }
827     /** Returns the format index of the series used for automatic line and area colors. */
GetFormatIdx() const828     inline sal_uInt16   GetFormatIdx() const { return mxSeriesFmt.is() ? mxSeriesFmt->GetFormatIdx() : EXC_CHDATAFORMAT_DEFAULT; }
829     /** Returns true, if the series is child of another series (e.g. trend line). */
HasParentSeries() const830     inline bool         HasParentSeries() const { return mnParentIdx != EXC_CHSERIES_INVALID; }
831     /** Returns true, if the series contains child series (e.g. trend lines). */
HasChildSeries() const832     inline bool         HasChildSeries() const { return !maTrendLines.empty() || !maErrorBars.empty(); }
833     /** Returns series title or an empty string, if the series does not contain a title. */
GetTitle() const834     inline const String& GetTitle() const { return mxTitleLink.is() ? mxTitleLink->GetString() : String::EmptyString(); }
835 
836     /** Returns true, if the series line is smoothed. */
HasSpline() const837     inline bool         HasSpline() const { return mxSeriesFmt.is() && mxSeriesFmt->HasSpline(); }
838 
839     /** Creates a labeled data sequence object from value data link. */
840     XLabeledDataSeqRef  CreateValueSequence( const ::rtl::OUString& rValueRole ) const;
841     /** Creates a labeled data sequence object from category data link. */
842     XLabeledDataSeqRef  CreateCategSequence( const ::rtl::OUString& rCategRole ) const;
843     /** Creates a data series object with initialized source links. */
844     XDataSeriesRef      CreateDataSeries() const;
845 
846     void                FillAllSourceLinks(::std::vector<ScSharedTokenRef>& rTokens) const;
847 
848 private:
849     /** Reads a CHSOURCELINK record. */
850     void                ReadChSourceLink( XclImpStream& rStrm );
851     /** Reads a CHDATAFORMAT group containing series and point formatting. */
852     void                ReadChDataFormat( XclImpStream& rStrm );
853     /** Reads a CHSERPARENT record specifying the parent series of this series. */
854     void                ReadChSerParent( XclImpStream& rStrm );
855     /** Reads a CHSERTRENDLINE record containing trend line settings. */
856     void                ReadChSerTrendLine( XclImpStream& rStrm );
857     /** Reads a CHSERERRORBAR record containing error bar settings. */
858     void                ReadChSerErrorBar( XclImpStream& rStrm );
859 
860     /** Creates a new CHDATAFORMAT group with the specified point index. */
861     XclImpChDataFormatRef CreateDataFormat( sal_uInt16 nPointIdx, sal_uInt16 nFormatIdx );
862     /** Returns the pointer to a CHDATAFORMAT group reference or 0 for invalid pointer index. */
863     XclImpChDataFormatRef* GetDataFormatRef( sal_uInt16 nPointIdx );
864     /** Returns the pointer to a CHTEXT group reference or 0 for invalid pointer index. */
865     XclImpChTextRef*    GetDataLabelRef( sal_uInt16 nPointIdx );
866 
867     /** Converts all trend lines and inserts them into the passed API data series object. */
868     void                ConvertTrendLines( XDataSeriesRef xDataSeries ) const;
869     /** Tries to create an error bar API object from the specified Excel error bars. */
870     XPropertySetRef     CreateErrorBar( sal_uInt8 nPosBarId, sal_uInt8 nNegBarId ) const;
871 
872 private:
873     typedef ScfRefMap< sal_uInt16, XclImpChDataFormat > XclImpChDataFormatMap;
874     typedef ScfRefMap< sal_uInt16, XclImpChText >       XclImpChTextMap;
875     typedef ::std::list< XclImpChSerTrendLineRef >      XclImpChSerTrendLineList;
876     typedef ScfRefMap< sal_uInt8, XclImpChSerErrorBar > XclImpChSerErrorBarMap;
877 
878     XclChSeries         maData;             /// Contents of the CHSERIES record.
879     XclImpChSourceLinkRef mxValueLink;      /// Link data for series values.
880     XclImpChSourceLinkRef mxCategLink;      /// Link data for series category names.
881     XclImpChSourceLinkRef mxTitleLink;      /// Link data for series title.
882     XclImpChSourceLinkRef mxBubbleLink;     /// Link data for series bubble sizes.
883     XclImpChDataFormatRef mxSeriesFmt;      /// CHDATAFORMAT group for series format.
884     XclImpChDataFormatMap maPointFmts;      /// CHDATAFORMAT groups for data point formats.
885     XclImpChTextMap     maLabels;           /// Data point labels (CHTEXT groups).
886     XclImpChSerTrendLineList maTrendLines;  /// Trend line settings (CHSERTRENDLINE records).
887     XclImpChSerErrorBarMap maErrorBars;     /// Error bar settings (CHSERERRORBAR records).
888     sal_uInt16          mnGroupIdx;         /// Chart type group (CHTYPEGROUP group) this series is assigned to.
889     sal_uInt16          mnSeriesIdx;        /// 0-based series index.
890     sal_uInt16          mnParentIdx;        /// 0-based index of parent series (trend lines and error bars).
891 };
892 
893 typedef ScfRef< XclImpChSeries > XclImpChSeriesRef;
894 
895 // Chart type groups ==========================================================
896 
897 class XclImpChType : protected XclImpChRoot
898 {
899 public:
900     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >          XDiagramRef;
901     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem > XCoordSystemRef;
902     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType >        XChartTypeRef;
903 
904 public:
905     explicit            XclImpChType( const XclImpChRoot& rRoot );
906 
907     /** Reads a chart type record (e.g. CHBAR, CHLINE, CHPIE, ...). */
908     void                ReadChType( XclImpStream& rStrm );
909     /** Final processing after reading the entire chart. */
910     void                Finalize( bool bStockChart );
911 
912     /** Returns the record identifier of the chart type record. */
GetRecId() const913     inline sal_uInt16   GetRecId() const { return mnRecId; }
914     /** Returns the chart type info struct for the contained chart type. */
GetTypeInfo() const915     inline const XclChTypeInfo& GetTypeInfo() const { return maTypeInfo; }
916     /** Returns true, if the series in this chart type group are stacked on each other (no percentage). */
917     bool                IsStacked() const;
918     /** Returns true, if the series in this chart type group are stacked on each other as percentage. */
919     bool                IsPercent() const;
920     /** Returns true, if chart type has category labels enabled (may be disabled in radar charts). */
921     bool                HasCategoryLabels() const;
922 
923     /** Creates a coordinate system according to the contained chart type. */
924     XCoordSystemRef     CreateCoordSystem( bool b3dChart ) const;
925     /** Creates and returns an object that represents the contained chart type. */
926     XChartTypeRef       CreateChartType( XDiagramRef xDiagram, bool b3dChart ) const;
927 
928 private:
929     XclChType           maData;             /// Contents of the chart type record.
930     sal_uInt16          mnRecId;            /// Record identifier for chart type.
931     XclChTypeInfo       maTypeInfo;         /// Chart type info for the contained type.
932 };
933 
934 // ----------------------------------------------------------------------------
935 
936 /** Represents the CHCHART3D record that contains 3D view settings. */
937 class XclImpChChart3d
938 {
939 public:
940     /** Reads the CHCHART3D record (properties for 3D charts). */
941     void                ReadChChart3d( XclImpStream& rStrm );
942     /** Returns true, if the data points are clustered on the X axis. */
IsClustered() const943     inline bool         IsClustered() const { return ::get_flag( maData.mnFlags, EXC_CHCHART3D_CLUSTER ); }
944     /** Converts and writes the contained data to the passed property set. */
945     void                Convert( ScfPropertySet& rPropSet, bool b3dWallChart ) const;
946 
947 private:
948     XclChChart3d        maData;             /// Contents of the CHCHART3D record.
949 };
950 
951 typedef ScfRef< XclImpChChart3d > XclImpChChart3dRef;
952 
953 // ----------------------------------------------------------------------------
954 
955 /** Represents the CHLEGEND record group describing the chart legend.
956 
957     The CHLEGEND group consists of: CHLEGEND, CHBEGIN, CHFRAMEPOS, CHFRAME
958     group, CHTEXT group, CHEND.
959  */
960 class XclImpChLegend : public XclImpChGroupBase, protected XclImpChRoot
961 {
962 public:
963     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XLegend > XLegendRef;
964 
965 public:
966     explicit            XclImpChLegend( const XclImpChRoot& rRoot );
967 
968     /** Reads the CHLEGEND record (called by base class). */
969     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
970     /** Reads a record from the CHLEGEND group (called by base class). */
971     virtual void        ReadSubRecord( XclImpStream& rStrm );
972     /** Final processing after reading the entire chart. */
973     void                Finalize();
974 
975     /** Creates a new legend object. */
976     XLegendRef          CreateLegend() const;
977 
978 private:
979     XclChLegend         maData;             /// Contents of the CHLEGEND record.
980     XclImpChFramePosRef mxFramePos;         /// Legend frame position (CHFRAMEPOS record).
981     XclImpChTextRef     mxText;             /// Legend text format (CHTEXT group).
982     XclImpChFrameRef    mxFrame;            /// Legend frame format (CHFRAME group).
983 };
984 
985 typedef ScfRef< XclImpChLegend > XclImpChLegendRef;
986 
987 // ----------------------------------------------------------------------------
988 
989 /** Represents the CHDROPBAR record group describing pos/neg bars in line charts.
990 
991     The CHDROPBAR group consists of: CHDROPBAR, CHBEGIN, CHLINEFORMAT,
992     CHAREAFORMAT, CHESCHERFORMAT group, CHEND.
993  */
994 class XclImpChDropBar : public XclImpChFrameBase
995 {
996 public:
997     explicit            XclImpChDropBar( sal_uInt16 nDropBar );
998 
999     /** Reads the CHDROPBAR record (called by base class). */
1000     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
1001 
1002     /** Converts and writes the contained frame data to the passed property set. */
1003     void                Convert( const XclImpChRoot& rRoot, ScfPropertySet& rPropSet ) const;
1004 
1005 private:
1006     sal_uInt16          mnDropBar;          /// Drop bar identifier, needed for auto format.
1007     sal_uInt16          mnBarDist;          /// Distance between bars (CHDROPBAR record).
1008 };
1009 
1010 typedef ScfRef< XclImpChDropBar > XclImpChDropBarRef;
1011 
1012 // ----------------------------------------------------------------------------
1013 
1014 /** Represents the CHTYPEGROUP record group describing a group of series.
1015 
1016     The CHTYPEGROUP group consists of: CHTYPEGROUP, CHBEGIN, a chart type
1017     record (e.g. CHBAR, CHLINE, CHAREA, CHPIE, ...), CHCHART3D, CHLEGEND group,
1018     CHDEFAULTTEXT groups (CHDEFAULTTEXT with CHTEXT groups), CHDROPBAR groups,
1019     CHCHARTLINE groups (CHCHARTLINE with CHLINEFORMAT), CHDATAFORMAT group,
1020     CHEND.
1021  */
1022 class XclImpChTypeGroup : public XclImpChGroupBase, protected XclImpChRoot
1023 {
1024 public:
1025     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >                      XDiagramRef;
1026     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem >             XCoordSystemRef;
1027     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType >                    XChartTypeRef;
1028     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >                   XDataSeriesRef;
1029     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence >    XLabeledDataSeqRef;
1030 
1031 public:
1032     explicit            XclImpChTypeGroup( const XclImpChRoot& rRoot );
1033 
1034     /** Reads the CHTYPEGROUP record (called by base class). */
1035     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
1036     /** Reads a record from the CHTYPEGROUP group (called by base class). */
1037     virtual void        ReadSubRecord( XclImpStream& rStrm );
1038     /** Final processing after reading the entire chart. */
1039     void                Finalize();
1040 
1041     /** Inserts a series attached to this chart type group.*/
1042     void                AddSeries( XclImpChSeriesRef xSeries );
1043     /** Marks the passed format index as used. PopUnusedFormatIndex() will not return this index. */
1044     void                SetUsedFormatIndex( sal_uInt16 nFormatIdx );
1045     /** Returns the next unused format index and marks it as used. */
1046     sal_uInt16          PopUnusedFormatIndex();
1047 
1048     /** Returns the index of this chart type group. */
GetGroupIdx() const1049     inline sal_uInt16   GetGroupIdx() const { return maData.mnGroupIdx; }
1050     /** Returns the chart type info struct for the contained chart type. */
GetTypeInfo() const1051     inline const XclChExtTypeInfo& GetTypeInfo() const { return maTypeInfo; }
1052     /** Returns true, if this chart type group contains at least one valid series. */
IsValidGroup() const1053     inline bool         IsValidGroup() const { return !maSeries.empty(); }
1054     /** Returns true, if the series in this chart type group are stacked on each other (no percentage). */
IsStacked() const1055     inline bool         IsStacked() const { return maType.IsStacked(); }
1056     /** Returns true, if the series in this chart type group are stacked on each other as percentage. */
IsPercent() const1057     inline bool         IsPercent() const { return maType.IsPercent(); }
1058     /** Returns true, if the chart is three-dimensional. */
Is3dChart() const1059     inline bool         Is3dChart() const { return mxChart3d.is() && maTypeInfo.mbSupports3d; }
1060     /** Returns true, if chart type supports wall and floor format in 3d mode. */
Is3dWallChart() const1061     inline bool         Is3dWallChart() const { return Is3dChart() && (maTypeInfo.meTypeCateg != EXC_CHTYPECATEG_PIE); }
1062     /** Returns true, if the series in this chart type group are ordered on the Z axis. */
Is3dDeepChart() const1063     inline bool         Is3dDeepChart() const { return Is3dWallChart() && mxChart3d.is() && !mxChart3d->IsClustered(); }
1064     /** Returns true, if category (X axis) labels are enabled (may be disabled in radar charts). */
HasCategoryLabels() const1065     inline bool         HasCategoryLabels() const { return maType.HasCategoryLabels(); }
1066     /** Returns true, if points of a series show varying automatic area format. */
1067     bool                HasVarPointFormat() const;
1068     /** Returns true, if bars are connected with lines (stacked bar charts only). */
1069     bool                HasConnectorLines() const;
1070 
1071     /** Returns the legend object. */
GetLegend() const1072     inline XclImpChLegendRef GetLegend() const { return mxLegend; }
1073     /** Returns the default series data format. */
GetGroupFormat() const1074     inline XclImpChDataFormatRef GetGroupFormat() const { return mxGroupFmt; }
1075     /** Returns series title, if the chart type group contains only one single series. */
1076     const String&       GetSingleSeriesTitle() const;
1077 
1078     /** Converts and writes all 3D settings to the passed diagram. */
1079     void                ConvertChart3d( ScfPropertySet& rPropSet ) const;
1080     /** Creates a coordinate system according to the contained chart type. */
1081     XCoordSystemRef     CreateCoordSystem() const;
1082     /** Creates and returns an object that represents the contained chart type. */
1083     XChartTypeRef       CreateChartType( XDiagramRef xDiagram, sal_Int32 nApiAxesSetIdx ) const;
1084     /** Creates a labeled data sequence object for axis categories. */
1085     XLabeledDataSeqRef  CreateCategSequence() const;
1086 
1087 private:
1088     /** Reads a CHDROPBAR record group. */
1089     void                ReadChDropBar( XclImpStream& rStrm );
1090     /** Reads a CHCHARTLINE record group. */
1091     void                ReadChChartLine( XclImpStream& rStrm );
1092     /** Reads a CHDATAFORMAT record group (default series format). */
1093     void                ReadChDataFormat( XclImpStream& rStrm );
1094 
1095     /** Returns true, if the chart type group contains a hi-lo line format. */
HasHiLoLine() const1096     inline bool         HasHiLoLine() const { return maChartLines.has( EXC_CHCHARTLINE_HILO ); }
1097     /** Returns true, if the chart type group contains drop bar formats. */
HasDropBars() const1098     inline bool         HasDropBars() const { return !maDropBars.empty(); }
1099 
1100     /** Inserts the passed series into the chart type. Adds additional properties to the series. */
1101     void                InsertDataSeries( XChartTypeRef xChartType,
1102                             XDataSeriesRef xSeries, sal_Int32 nApiAxesSetIdx ) const;
1103     /** Creates all data series of any chart type except stock charts. */
1104     void                CreateDataSeries( XChartTypeRef xChartType, sal_Int32 nApiAxesSetIdx ) const;
1105     /** Creates all data series of of a stock chart. */
1106     void                CreateStockSeries( XChartTypeRef xChartType, sal_Int32 nApiAxesSetIdx ) const;
1107 
1108 private:
1109     typedef ::std::vector< XclImpChSeriesRef >          XclImpChSeriesVec;
1110     typedef ScfRefMap< sal_uInt16, XclImpChDropBar >    XclImpChDropBarMap;
1111     typedef ScfRefMap< sal_uInt16, XclImpChLineFormat > XclImpChLineFormatMap;
1112     typedef ::std::set< sal_uInt16 >                    UInt16Set;
1113 
1114     XclChTypeGroup      maData;             /// Contents of the CHTYPEGROUP record.
1115     XclImpChType        maType;             /// Chart type (e.g. CHBAR, CHLINE, ...).
1116     XclChExtTypeInfo    maTypeInfo;         /// Extended chart type info.
1117     XclImpChSeriesVec   maSeries;           /// Series attached to this chart type group (CHSERIES groups).
1118     XclImpChSeriesRef   mxFirstSeries;      /// First series in this chart type group (CHSERIES groups).
1119     XclImpChChart3dRef  mxChart3d;          /// 3D settings (CHCHART3D record).
1120     XclImpChLegendRef   mxLegend;           /// Chart legend (CHLEGEND group).
1121     XclImpChDropBarMap  maDropBars;         /// Dropbars (CHDROPBAR group).
1122     XclImpChLineFormatMap maChartLines;     /// Global line formats (CHCHARTLINE group).
1123     XclImpChDataFormatRef mxGroupFmt;       /// Default format for all series (CHDATAFORMAT group).
1124     UInt16Set           maUnusedFormats;    /// Contains unused format indexes for automatic colors.
1125 };
1126 
1127 typedef ScfRef< XclImpChTypeGroup > XclImpChTypeGroupRef;
1128 
1129 // Axes =======================================================================
1130 
1131 class XclImpChLabelRange : protected XclImpChRoot
1132 {
1133 public:
1134     typedef ::com::sun::star::chart2::ScaleData ScaleData;
1135 
1136 public:
1137     explicit            XclImpChLabelRange( const XclImpChRoot& rRoot );
1138     /** Reads the CHLABELRANGE record (category axis scaling properties). */
1139     void                ReadChLabelRange( XclImpStream& rStrm );
1140     /** Reads the CHDATERANGE record (date axis scaling properties). */
1141     void                ReadChDateRange( XclImpStream& rStrm );
1142     /** Converts category axis scaling settings. */
1143     void                Convert( ScfPropertySet& rPropSet, ScaleData& rScaleData, bool bMirrorOrient ) const;
1144     /** Converts position settings of this axis at a crossing axis. */
1145     void                ConvertAxisPosition( ScfPropertySet& rPropSet, bool b3dChart ) const;
1146 
1147 private:
1148     XclChLabelRange     maLabelData;        /// Contents of the CHLABELRANGE record.
1149     XclChDateRange      maDateData;         /// Contents of the CHDATERANGE record.
1150 };
1151 
1152 typedef ScfRef< XclImpChLabelRange > XclImpChLabelRangeRef;
1153 
1154 // ----------------------------------------------------------------------------
1155 
1156 class XclImpChValueRange : protected XclImpChRoot
1157 {
1158 public:
1159     typedef ::com::sun::star::chart2::ScaleData ScaleData;
1160 
1161 public:
1162     explicit            XclImpChValueRange( const XclImpChRoot& rRoot );
1163     /** Reads the CHVALUERANGE record (numeric axis scaling properties). */
1164     void                ReadChValueRange( XclImpStream& rStrm );
1165     /** Converts value axis scaling settings. */
1166     void                Convert( ScaleData& rScaleData, bool bMirrorOrient ) const;
1167     /** Converts position settings of this axis at a crossing axis. */
1168     void                ConvertAxisPosition( ScfPropertySet& rPropSet ) const;
1169 
1170 private:
1171     XclChValueRange     maData;             /// Contents of the CHVALUERANGE record.
1172 };
1173 
1174 typedef ScfRef< XclImpChValueRange > XclImpChValueRangeRef;
1175 
1176 // ----------------------------------------------------------------------------
1177 
1178 class XclImpChTick : protected XclImpChRoot
1179 {
1180 public:
1181     explicit            XclImpChTick( const XclImpChRoot& rRoot );
1182     /** Reads the CHTICK record (axis ticks properties). */
1183     void                ReadChTick( XclImpStream& rStrm );
1184 
1185     /** Returns true, if the axis shows attached labels. */
HasLabels() const1186     inline bool         HasLabels() const { return maData.mnLabelPos != EXC_CHTICK_NOLABEL; }
1187     /** Returns the leading font color for the axis labels. */
1188     Color               GetFontColor() const;
1189     /** Returns the rotation value for the axis labels. */
1190     sal_uInt16          GetRotation() const;
1191 
1192     /** Converts and writes the contained data to the passed property set. */
1193     void                Convert( ScfPropertySet& rPropSet ) const;
1194 
1195 private:
1196     XclChTick           maData;             /// Contents of the CHTICK record.
1197 };
1198 
1199 typedef ScfRef< XclImpChTick > XclImpChTickRef;
1200 
1201 // ----------------------------------------------------------------------------
1202 
1203 /** Represents the CHAXIS record group describing an entire chart axis.
1204 
1205     The CHAXIS group consists of: CHAXIS, CHBEGIN, CHLABELRANGE, CHEXTRANGE,
1206     CHVALUERANGE, CHFORMAT, CHTICK, CHFONT, CHAXISLINE groups (CHAXISLINE with
1207     CHLINEFORMAT, CHAREAFORMAT, and CHESCHERFORMAT group), CHEND.
1208  */
1209 class XclImpChAxis : public XclImpChGroupBase, public XclImpChFontBase, protected XclImpChRoot
1210 {
1211 public:
1212     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis > XAxisRef;
1213 
1214 public:
1215     explicit            XclImpChAxis( const XclImpChRoot& rRoot, sal_uInt16 nAxisType = EXC_CHAXIS_NONE );
1216 
1217     /** Reads the CHAXIS record (called by base class). */
1218     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
1219     /** Reads a record from the CHAXIS group (called by base class). */
1220     virtual void        ReadSubRecord( XclImpStream& rStrm );
1221     /** Final processing after reading the entire chart. */
1222     void                Finalize();
1223 
1224     /** Returns the font index for the axis labels. */
1225     virtual sal_uInt16  GetFontIndex() const;
1226     /** Returns the font color for the axis labels. */
1227     virtual Color       GetFontColor() const;
1228     /** Returns the rotation value for axis labels. */
1229     virtual sal_uInt16  GetRotation() const;
1230 
1231     /** Returns the type of this axis. */
GetAxisType() const1232     inline sal_uInt16   GetAxisType() const { return maData.mnType; }
1233     /** Returns the axis dimension index used by the chart API. */
GetApiAxisDimension() const1234     inline sal_Int32    GetApiAxisDimension() const { return maData.GetApiAxisDimension(); }
1235     /** Returns true, if the axis is active. */
IsActivated() const1236     inline bool         IsActivated() const { return !mxAxisLine || mxAxisLine->IsShowAxis(); }
1237     /** Returns true, if the axis contains caption labels. */
HasLabels() const1238     inline bool         HasLabels() const { return !mxTick || mxTick->HasLabels(); }
1239     /** Returns true, if the axis shows its major grid lines. */
HasMajorGrid() const1240     inline bool         HasMajorGrid() const { return mxMajorGrid.is(); }
1241     /** Returns true, if the axis shows its minor grid lines. */
HasMinorGrid() const1242     inline bool         HasMinorGrid() const { return mxMinorGrid.is(); }
1243 
1244     /** Creates an API axis object. */
1245     XAxisRef            CreateAxis( const XclImpChTypeGroup& rTypeGroup, const XclImpChAxis* pCrossingAxis ) const;
1246     /** Converts and writes 3D wall/floor properties to the passed property set. */
1247     void                ConvertWall( ScfPropertySet& rPropSet ) const;
1248     /** Converts position settings of this axis at a crossing axis. */
1249     void                ConvertAxisPosition( ScfPropertySet& rPropSet, const XclImpChTypeGroup& rTypeGroup ) const;
1250 
1251 private:
1252     /** Reads a CHAXISLINE record specifying the target for following line properties. */
1253     void                ReadChAxisLine( XclImpStream& rStrm );
1254     /** Creates a CHFRAME object and stores it into the mxWallFrame member. */
1255     void                CreateWallFrame();
1256 
1257 private:
1258     XclChAxis           maData;             /// Contents of the CHAXIS record.
1259     XclImpChLabelRangeRef mxLabelRange;     /// Category scaling (CHLABELRANGE record).
1260     XclImpChValueRangeRef mxValueRange;     /// Value scaling (CHVALUERANGE record).
1261     XclImpChTickRef     mxTick;             /// Axis ticks (CHTICK record).
1262     XclImpChFontRef     mxFont;             /// Index into font buffer (CHFONT record).
1263     XclImpChLineFormatRef mxAxisLine;       /// Axis line format (CHLINEFORMAT record).
1264     XclImpChLineFormatRef mxMajorGrid;      /// Major grid line format (CHLINEFORMAT record).
1265     XclImpChLineFormatRef mxMinorGrid;      /// Minor grid line format (CHLINEFORMAT record).
1266     XclImpChFrameRef    mxWallFrame;        /// Wall/floor format (sub records of CHFRAME group).
1267     sal_uInt16          mnNumFmtIdx;        /// Index into number format buffer (CHFORMAT record).
1268 };
1269 
1270 typedef ScfRef< XclImpChAxis > XclImpChAxisRef;
1271 
1272 // ----------------------------------------------------------------------------
1273 
1274 /** Represents the CHAXESSET record group describing an axes set (X/Y/Z axes).
1275 
1276     The CHAXESSET group consists of: CHAXESSET, CHBEGIN, CHFRAMEPOS, CHAXIS
1277     groups, CHTEXT groups, CHPLOTFRAME group (CHPLOTFRAME with CHFRAME group),
1278     CHTYPEGROUP group, CHEND.
1279  */
1280 class XclImpChAxesSet : public XclImpChGroupBase, protected XclImpChRoot
1281 {
1282 public:
1283     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >          XDiagramRef;
1284     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem > XCoordSystemRef;
1285     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis >             XAxisRef;
1286 
1287 public:
1288     explicit            XclImpChAxesSet( const XclImpChRoot& rRoot, sal_uInt16 nAxesSetId );
1289 
1290     /** Reads the CHAXESSET record (called by base class). */
1291     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
1292     /** Reads a record from the CHAXESSET group (called by base class). */
1293     virtual void        ReadSubRecord( XclImpStream& rStrm );
1294     /** Final processing after reading the entire chart. */
1295     void                Finalize();
1296 
1297     /** Returns true, if this axes set exists (returns false if this is a dummy object). */
IsValidAxesSet() const1298     inline bool         IsValidAxesSet() const { return !maTypeGroups.empty(); }
1299     /** Returns the index of the axes set (primary/secondary). */
GetAxesSetId() const1300     inline sal_uInt16   GetAxesSetId() const { return maData.mnAxesSetId; }
1301     /** Returns the axes set index used by the chart API. */
GetApiAxesSetIndex() const1302     inline sal_Int32    GetApiAxesSetIndex() const { return maData.GetApiAxesSetIndex(); }
1303 
1304     /** Returns the outer plot area position, if existing. */
GetPlotAreaFramePos() const1305     inline XclImpChFramePosRef GetPlotAreaFramePos() const { return mxFramePos; }
1306     /** Returns the specified chart type group. */
GetTypeGroup(sal_uInt16 nGroupIdx) const1307     inline XclImpChTypeGroupRef GetTypeGroup( sal_uInt16 nGroupIdx ) const { return maTypeGroups.get( nGroupIdx ); }
1308     /** Returns the first chart type group. */
1309     XclImpChTypeGroupRef GetFirstTypeGroup() const;
1310     /** Looks for a legend in all chart type groups and returns it. */
1311     XclImpChLegendRef   GetLegend() const;
1312     /** Returns series title, if the axes set contains only one single series. */
1313     const String&       GetSingleSeriesTitle() const;
1314 
1315     /** Creates a coordinate system and converts all series and axis settings. */
1316     void                Convert( XDiagramRef xDiagram ) const;
1317     /** Converts the manual positions of all axis titles. */
1318     void                ConvertTitlePositions() const;
1319 
1320 private:
1321     /** Reads a CHAXIS record group containing a single axis. */
1322     void                ReadChAxis( XclImpStream& rStrm );
1323     /** Reads a CHTEXT record group containing an axis title. */
1324     void                ReadChText( XclImpStream& rStrm );
1325     /** Reads the CHPLOTFRAME record group containing diagram area formatting. */
1326     void                ReadChPlotFrame( XclImpStream& rStrm );
1327     /** Reads a CHTYPEGROUP record group containing chart type and chart settings. */
1328     void                ReadChTypeGroup( XclImpStream& rStrm );
1329 
1330     /** Updates text formatting of the passed axis title with global text formatting. */
1331     void                UpdateAxisTitle( XclImpChTextRef xTitle );
1332 
1333     /** Creates a coordinate system that contains all chart types for this axes set. */
1334     XCoordSystemRef     CreateCoordSystem( XDiagramRef xDiagram ) const;
1335     /** Creates and inserts an axis into the container and registers the coordinate system. */
1336     void                ConvertAxis( XclImpChAxisRef xChAxis, XclImpChTextRef xChAxisTitle,
1337                             XCoordSystemRef xCoordSystem, const XclImpChAxis* pCrossingAxis ) const;
1338     /** Creates and returns an API axis object. */
1339     XAxisRef            CreateAxis( const XclImpChAxis& rChAxis, const XclImpChAxis* pCrossingAxis ) const;
1340     /** Writes all properties of the background area to the passed diagram. */
1341     void                ConvertBackground( XDiagramRef xDiagram ) const;
1342 
1343 private:
1344     typedef ScfRefMap< sal_uInt16, XclImpChTypeGroup > XclImpChTypeGroupMap;
1345 
1346     XclChAxesSet        maData;             /// Contents of the CHAXESSET record.
1347     XclImpChFramePosRef mxFramePos;         /// Outer plot area position (CHFRAMEPOS record).
1348     XclImpChAxisRef     mxXAxis;            /// The X axis (CHAXIS group).
1349     XclImpChAxisRef     mxYAxis;            /// The Y axis (CHAXIS group).
1350     XclImpChAxisRef     mxZAxis;            /// The Z axis (CHAXIS group).
1351     XclImpChTextRef     mxXAxisTitle;       /// The X axis title (CHTEXT group).
1352     XclImpChTextRef     mxYAxisTitle;       /// The Y axis title (CHTEXT group).
1353     XclImpChTextRef     mxZAxisTitle;       /// The Z axis title (CHTEXT group).
1354     XclImpChFrameRef    mxPlotFrame;        /// Plot area (CHPLOTFRAME group).
1355     XclImpChTypeGroupMap maTypeGroups;      /// Chart type groups (CHTYPEGROUP group).
1356 };
1357 
1358 typedef ScfRef< XclImpChAxesSet > XclImpChAxesSetRef;
1359 
1360 // The chart object ===========================================================
1361 
1362 /** Represents the CHCHART record group describing the chart contents.
1363 
1364     The CHCHART group consists of: CHCHART, CHBEGIN, SCL, CHPLOTGROWTH, CHFRAME
1365     group, CHSERIES groups, CHPROPERTIES, CHDEFAULTTEXT groups (CHDEFAULTTEXT
1366     with CHTEXT groups), CHUSEDAXESSETS, CHAXESSET groups, CHTEXT groups, CHEND.
1367  */
1368 class XclImpChChart : public XclImpChGroupBase, protected XclImpChRoot
1369 {
1370 public:
1371     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >    XChartDocRef;
1372     typedef ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >          XDiagramRef;
1373 
1374 public:
1375     explicit            XclImpChChart( const XclImpRoot& rRoot );
1376     virtual             ~XclImpChChart();
1377 
1378     /** Reads the CHCHART record (called by base class). */
1379     virtual void        ReadHeaderRecord( XclImpStream& rStrm );
1380     /** Reads a record from the CHCHART group (called by base class). */
1381     virtual void        ReadSubRecord( XclImpStream& rStrm );
1382     /** Reads a CHDEFAULTTEXT group (default text formats). */
1383     void                ReadChDefaultText( XclImpStream& rStrm );
1384     /** Reads a CHDATAFORMAT group describing a series format or a data point format. */
1385     void                ReadChDataFormat( XclImpStream& rStrm );
1386 
1387     /** Sets formatting from BIFF3-BIFF5 OBJ record, if own formatting is invisible. */
1388     void                UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData );
1389 
1390     /** Returns the specified chart type group. */
1391     XclImpChTypeGroupRef GetTypeGroup( sal_uInt16 nGroupIdx ) const;
1392     /** Returns the specified default text. */
1393     XclImpChTextRef     GetDefaultText( XclChTextType eTextType ) const;
1394     /** Returns true, if the plot area has benn moved and/or resized manually. */
1395     bool                IsManualPlotArea() const;
1396     /** Returns the number of units on the progress bar needed for the chart. */
GetProgressSize() const1397     inline sal_Size     GetProgressSize() const { return 2 * EXC_CHART_PROGRESS_SIZE; }
1398 
1399     /** Converts and writes all properties to the passed chart. */
1400     void                Convert( XChartDocRef xChartDoc,
1401                             XclImpDffConverter& rDffConv,
1402                             const ::rtl::OUString& rObjName,
1403                             const Rectangle& rChartRect ) const;
1404 
1405 private:
1406     /** Reads a CHSERIES group (data series source and formatting). */
1407     void                ReadChSeries( XclImpStream& rStrm );
1408     /** Reads a CHPROPERTIES record (global chart properties). */
1409     void                ReadChProperties( XclImpStream& rStrm );
1410     /** Reads a CHAXESSET group (primary/secondary axes set). */
1411     void                ReadChAxesSet( XclImpStream& rStrm );
1412     /** Reads a CHTEXT group (chart title and series/point captions). */
1413     void                ReadChText( XclImpStream& rStrm );
1414 
1415     /** Final processing after reading the entire chart data. */
1416     void                Finalize();
1417     /** Finalizes series list, assigns child series to parent series. */
1418     void                FinalizeSeries();
1419     /** Assigns all imported CHDATAFORMAT groups to the respective series. */
1420     void                FinalizeDataFormats();
1421     /** Finalizes chart title, tries to detect title auto-generated from series name. */
1422     void                FinalizeTitle();
1423 
1424     /** Creates and returns a new diagram object and converts global chart settings. */
1425     XDiagramRef         CreateDiagram() const;
1426 
1427 private:
1428     typedef ::std::vector< XclImpChSeriesRef >                  XclImpChSeriesVec;
1429     typedef ScfRefMap< XclChDataPointPos, XclImpChDataFormat >  XclImpChDataFormatMap;
1430     typedef ScfRefMap< sal_uInt16, XclImpChText >               XclImpChTextMap;
1431 
1432     XclChRectangle      maRect;             /// Position of the chart on the sheet (CHCHART record).
1433     XclImpChSeriesVec   maSeries;           /// List of series data (CHSERIES groups).
1434     XclImpChDataFormatMap maDataFmts;       /// All series and point formats (CHDATAFORMAT groups).
1435     XclImpChFrameRef    mxFrame;            /// Chart frame format (CHFRAME group).
1436     XclChProperties     maProps;            /// Chart properties (CHPROPERTIES record).
1437     XclImpChTextMap     maDefTexts;         /// Default text objects (CHDEFAULTTEXT groups).
1438     XclImpChAxesSetRef  mxPrimAxesSet;      /// Primary axes set (CHAXESSET group).
1439     XclImpChAxesSetRef  mxSecnAxesSet;      /// Secondary axes set (CHAXESSET group).
1440     XclImpChTextRef     mxTitle;            /// Chart title (CHTEXT group).
1441     XclImpChLegendRef   mxLegend;           /// Chart legend (CHLEGEND group).
1442 };
1443 
1444 typedef ScfRef< XclImpChChart > XclImpChChartRef;
1445 
1446 // ----------------------------------------------------------------------------
1447 
1448 /** Drawing container of a chart. */
1449 class XclImpChartDrawing : public XclImpDrawing
1450 {
1451 public:
1452     explicit            XclImpChartDrawing( const XclImpRoot& rRoot, bool bOwnTab );
1453 
1454     /** Converts all objects and inserts them into the chart drawing page. */
1455     void                ConvertObjects(
1456                             XclImpDffConverter& rDffConv,
1457                             const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rxModel,
1458                             const Rectangle& rChartRect );
1459 
1460     /** Calculate the resulting rectangle of the passed anchor. */
1461     virtual Rectangle   CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const;
1462     /** Called whenever an object has been inserted into the draw page. */
1463     virtual void        OnObjectInserted( const XclImpDrawObjBase& rDrawObj );
1464 
1465 private:
1466     Rectangle           maChartRect;        /// Position and size of the chart shape in 1/100 mm.
1467     SCTAB               mnScTab;            /// Index of the sheet that contains the chart.
1468     bool                mbOwnTab;           /// True = own sheet, false = embedded object.
1469 };
1470 
1471 // ----------------------------------------------------------------------------
1472 
1473 /** Represents the entire chart substream (all records in BOF/EOF block). */
1474 class XclImpChart : protected XclImpRoot
1475 {
1476 public:
1477     typedef ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > XModelRef;
1478 
1479 public:
1480     /** Constructs a new chart object.
1481         @param bOwnTab  True = chart is on an own sheet; false = chart is an embedded object. */
1482     explicit            XclImpChart( const XclImpRoot& rRoot, bool bOwnTab );
1483     virtual             ~XclImpChart();
1484 
1485     /** Reads the complete chart substream (BOF/EOF block).
1486         @descr  The passed stream must be located in the BOF record of the chart substream. */
1487     void                ReadChartSubStream( XclImpStream& rStrm );
1488     /** Sets formatting from BIFF3-BIFF5 OBJ record, if own formatting is invisible. */
1489     void                UpdateObjFrame( const XclObjLineData& rLineData, const XclObjFillData& rFillData );
1490 
1491     /** Returns the number of units on the progress bar needed for the chart. */
1492     sal_Size            GetProgressSize() const;
1493     /** Returns true, if the chart is based on a pivot table. */
IsPivotChart() const1494     inline bool         IsPivotChart() const { return mbIsPivotChart; }
1495 
1496     /** Creates the chart object in the passed component. */
1497     void                Convert( XModelRef xModel,
1498                             XclImpDffConverter& rDffConv,
1499                             const ::rtl::OUString& rObjName,
1500                             const Rectangle& rChartRect ) const;
1501 
1502 private:
1503     /** Returns (initially creates) the drawing container for embedded shapes. **/
1504     XclImpChartDrawing& GetChartDrawing();
1505     /** Reads the CHCHART group (entire chart data). */
1506     void                ReadChChart( XclImpStream& rStrm );
1507 
1508 private:
1509     typedef ScfRef< XclImpChartDrawing > XclImpChartDrawingRef;
1510 
1511     XclImpChChartRef    mxChartData;        /// The chart data (CHCHART group).
1512     XclImpChartDrawingRef mxChartDrawing;   /// Drawing container for embedded shapes.
1513     bool                mbOwnTab;           /// true = own sheet; false = embedded object.
1514     bool                mbIsPivotChart;     /// true = chart is based on a pivot table.
1515 };
1516 
1517 // ============================================================================
1518 
1519 #endif
1520 
1521