xref: /AOO41X/main/xmloff/source/chart/SchXMLImport.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 
27 #include "SchXMLImport.hxx"
28 #include "SchXMLChartContext.hxx"
29 #include "contexts.hxx"
30 #include "XMLChartPropertySetMapper.hxx"
31 #include "SchXMLTools.hxx"
32 
33 #include <tools/debug.hxx>
34 #include <rtl/ustrbuf.hxx>
35 // header for class ByteString
36 #include <tools/string.hxx>
37 #include <comphelper/processfactory.hxx>
38 #include "xmloff/xmlnmspe.hxx"
39 #include <xmloff/xmltoken.hxx>
40 #include <xmloff/xmluconv.hxx>
41 #include <xmloff/nmspmap.hxx>
42 #include <xmloff/xmlictxt.hxx>
43 #include <xmloff/xmlstyle.hxx>
44 #include <com/sun/star/task/XStatusIndicatorSupplier.hpp>
45 #include <com/sun/star/chart/XChartDocument.hpp>
46 #include <com/sun/star/chart/ChartDataRowSource.hpp>
47 #include <com/sun/star/container/XChild.hpp>
48 #include <com/sun/star/uno/XComponentContext.hpp>
49 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
50 #include <com/sun/star/chart2/data/XDataProvider.hpp>
51 #include <com/sun/star/chart2/XChartDocument.hpp>
52 #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
53 #include <com/sun/star/chart2/XChartTypeContainer.hpp>
54 #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
55 
56 #include <com/sun/star/document/XDocumentProperties.hpp>
57 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
58 
59 #include <typeinfo>
60 
61 using namespace com::sun::star;
62 using namespace ::xmloff::token;
63 
64 using ::rtl::OUString;
65 using ::rtl::OUStringBuffer;
66 using ::rtl::OUStringToOString;
67 using ::com::sun::star::uno::Reference;
68 using ::com::sun::star::uno::Sequence;
69 
70 namespace
71 {
lcl_getComponentContext()72 Reference< uno::XComponentContext > lcl_getComponentContext()
73 {
74     Reference< uno::XComponentContext > xContext;
75     try
76     {
77         Reference< beans::XPropertySet > xFactProp( comphelper::getProcessServiceFactory(), uno::UNO_QUERY );
78         if( xFactProp.is())
79             xFactProp->getPropertyValue(OUString::createFromAscii("DefaultContext")) >>= xContext;
80     }
81     catch( uno::Exception& )
82     {}
83 
84     return xContext;
85 }
86 
87 class lcl_MatchesChartType : public ::std::unary_function< Reference< chart2::XChartType >, bool >
88 {
89 public:
lcl_MatchesChartType(const OUString & aChartTypeName)90     explicit lcl_MatchesChartType( const OUString & aChartTypeName ) :
91             m_aChartTypeName( aChartTypeName )
92     {}
93 
operator ()(const Reference<chart2::XChartType> & xChartType) const94     bool operator () ( const Reference< chart2::XChartType > & xChartType ) const
95     {
96         return (xChartType.is() &&
97                 xChartType->getChartType().equals( m_aChartTypeName ));
98     }
99 
100 private:
101     OUString m_aChartTypeName;
102 };
103 } // anonymous namespace
104 
105 /* ----------------------------------------
106    TokenMaps for distinguishing different
107    tokens in different contexts
108    ----------------------------------------*/
109 
110 // ----------------------------------------
111 // element maps
112 // ----------------------------------------
113 
114 
115 
116 
117 
118 
119 
120 // ----------------------------------------
121 // attribute maps
122 // ----------------------------------------
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 // ========================================
133 
SchXMLImportHelper()134 SchXMLImportHelper::SchXMLImportHelper() :
135         mpAutoStyles( 0 ),
136 
137         mpChartDocElemTokenMap( 0 ),
138         mpTableElemTokenMap( 0 ),
139         mpChartElemTokenMap( 0 ),
140         mpPlotAreaElemTokenMap( 0 ),
141         mpSeriesElemTokenMap( 0 ),
142 
143         mpChartAttrTokenMap( 0 ),
144         mpPlotAreaAttrTokenMap( 0 ),
145         mpAutoStyleAttrTokenMap( 0 ),
146         mpCellAttrTokenMap( 0 ),
147         mpSeriesAttrTokenMap( 0 ),
148         mpRegEquationAttrTokenMap( 0 )
149 {
150 }
151 
~SchXMLImportHelper()152 SchXMLImportHelper::~SchXMLImportHelper()
153 {
154         // delete token maps
155     if( mpChartDocElemTokenMap )
156         delete mpChartDocElemTokenMap;
157     if( mpTableElemTokenMap )
158         delete mpTableElemTokenMap;
159     if( mpChartElemTokenMap )
160         delete mpChartElemTokenMap;
161     if( mpPlotAreaElemTokenMap )
162         delete mpPlotAreaElemTokenMap;
163     if( mpSeriesElemTokenMap )
164         delete mpSeriesElemTokenMap;
165 
166     if( mpChartAttrTokenMap )
167         delete mpChartAttrTokenMap;
168     if( mpPlotAreaAttrTokenMap )
169         delete mpPlotAreaAttrTokenMap;
170     if( mpAutoStyleAttrTokenMap )
171         delete mpAutoStyleAttrTokenMap;
172     if( mpCellAttrTokenMap )
173         delete mpCellAttrTokenMap;
174     if( mpSeriesAttrTokenMap )
175         delete mpSeriesAttrTokenMap;
176 }
177 
CreateChartContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<frame::XModel> xChartModel,const Reference<xml::sax::XAttributeList> &)178 SvXMLImportContext* SchXMLImportHelper::CreateChartContext(
179     SvXMLImport& rImport,
180     sal_uInt16 nPrefix, const OUString& rLocalName,
181     const Reference< frame::XModel > xChartModel,
182     const Reference< xml::sax::XAttributeList >& )
183 {
184     SvXMLImportContext* pContext = 0;
185 
186     Reference< chart::XChartDocument > xDoc( xChartModel, uno::UNO_QUERY );
187     if( xDoc.is())
188     {
189         mxChartDoc = xDoc;
190         pContext = new SchXMLChartContext( *this, rImport, rLocalName );
191     }
192     else
193     {
194         DBG_ERROR( "No valid XChartDocument given as XModel" );
195         pContext = new SvXMLImportContext( rImport, nPrefix, rLocalName );
196     }
197 
198     return pContext;
199 }
200 
201 /* ----------------------------------------
202    get various token maps
203    ----------------------------------------*/
204 
GetDocElemTokenMap()205 const SvXMLTokenMap& SchXMLImportHelper::GetDocElemTokenMap()
206 {
207     if( ! mpChartDocElemTokenMap )
208     {
209         static __FAR_DATA SvXMLTokenMapEntry aDocElemTokenMap[] =
210         {
211             { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES,   XML_TOK_DOC_AUTOSTYLES  },
212             { XML_NAMESPACE_OFFICE, XML_STYLES,             XML_TOK_DOC_STYLES  },
213             { XML_NAMESPACE_OFFICE, XML_META,               XML_TOK_DOC_META    },
214             { XML_NAMESPACE_OFFICE, XML_BODY,               XML_TOK_DOC_BODY    },
215             XML_TOKEN_MAP_END
216         };
217 
218         mpChartDocElemTokenMap = new SvXMLTokenMap( aDocElemTokenMap );
219     } // if( ! mpChartDocElemTokenMap )
220 
221     return *mpChartDocElemTokenMap;
222 }
223 
GetTableElemTokenMap()224 const SvXMLTokenMap& SchXMLImportHelper::GetTableElemTokenMap()
225 {
226     if( ! mpTableElemTokenMap )
227     {
228         static __FAR_DATA SvXMLTokenMapEntry aTableElemTokenMap[] =
229     {
230         { XML_NAMESPACE_TABLE,  XML_TABLE_HEADER_COLUMNS,   XML_TOK_TABLE_HEADER_COLS   },
231         { XML_NAMESPACE_TABLE,  XML_TABLE_COLUMNS,          XML_TOK_TABLE_COLUMNS       },
232         { XML_NAMESPACE_TABLE,  XML_TABLE_COLUMN,           XML_TOK_TABLE_COLUMN        },
233         { XML_NAMESPACE_TABLE,  XML_TABLE_HEADER_ROWS,      XML_TOK_TABLE_HEADER_ROWS   },
234         { XML_NAMESPACE_TABLE,  XML_TABLE_ROWS,             XML_TOK_TABLE_ROWS          },
235         { XML_NAMESPACE_TABLE,  XML_TABLE_ROW,              XML_TOK_TABLE_ROW           },
236         XML_TOKEN_MAP_END
237     };
238 
239         mpTableElemTokenMap = new SvXMLTokenMap( aTableElemTokenMap );
240     } // if( ! mpTableElemTokenMap )
241 
242     return *mpTableElemTokenMap;
243 }
244 
GetChartElemTokenMap()245 const SvXMLTokenMap& SchXMLImportHelper::GetChartElemTokenMap()
246 {
247     if( ! mpChartElemTokenMap )
248     {
249         static __FAR_DATA SvXMLTokenMapEntry aChartElemTokenMap[] =
250         {
251             { XML_NAMESPACE_CHART,  XML_PLOT_AREA,              XML_TOK_CHART_PLOT_AREA     },
252             { XML_NAMESPACE_CHART,  XML_TITLE,                  XML_TOK_CHART_TITLE         },
253             { XML_NAMESPACE_CHART,  XML_SUBTITLE,               XML_TOK_CHART_SUBTITLE      },
254             { XML_NAMESPACE_CHART,  XML_LEGEND,             XML_TOK_CHART_LEGEND        },
255             { XML_NAMESPACE_TABLE,  XML_TABLE,                  XML_TOK_CHART_TABLE         },
256             XML_TOKEN_MAP_END
257         };
258 
259         mpChartElemTokenMap = new SvXMLTokenMap( aChartElemTokenMap );
260     } // if( ! mpChartElemTokenMap )
261 
262     return *mpChartElemTokenMap;
263 }
264 
GetPlotAreaElemTokenMap()265 const SvXMLTokenMap& SchXMLImportHelper::GetPlotAreaElemTokenMap()
266 {
267     if( ! mpPlotAreaElemTokenMap )
268     {
269         static __FAR_DATA SvXMLTokenMapEntry aPlotAreaElemTokenMap[] =
270 {
271     { XML_NAMESPACE_CHART_EXT,  XML_COORDINATE_REGION,      XML_TOK_PA_COORDINATE_REGION_EXT },
272     { XML_NAMESPACE_CHART,  XML_COORDINATE_REGION,      XML_TOK_PA_COORDINATE_REGION },
273     { XML_NAMESPACE_CHART,  XML_AXIS,                   XML_TOK_PA_AXIS             },
274     { XML_NAMESPACE_CHART,  XML_SERIES,                 XML_TOK_PA_SERIES           },
275     { XML_NAMESPACE_CHART,  XML_WALL,                   XML_TOK_PA_WALL             },
276     { XML_NAMESPACE_CHART,  XML_FLOOR,                  XML_TOK_PA_FLOOR            },
277     { XML_NAMESPACE_DR3D,   XML_LIGHT,                  XML_TOK_PA_LIGHT_SOURCE     },
278     { XML_NAMESPACE_CHART,  XML_STOCK_GAIN_MARKER,      XML_TOK_PA_STOCK_GAIN       },
279     { XML_NAMESPACE_CHART,  XML_STOCK_LOSS_MARKER,      XML_TOK_PA_STOCK_LOSS       },
280     { XML_NAMESPACE_CHART,  XML_STOCK_RANGE_LINE,       XML_TOK_PA_STOCK_RANGE      },
281     XML_TOKEN_MAP_END
282 };
283 
284         mpPlotAreaElemTokenMap = new SvXMLTokenMap( aPlotAreaElemTokenMap );
285     } // if( ! mpPlotAreaElemTokenMap )
286 
287     return *mpPlotAreaElemTokenMap;
288 }
289 
GetSeriesElemTokenMap()290 const SvXMLTokenMap& SchXMLImportHelper::GetSeriesElemTokenMap()
291 {
292     if( ! mpSeriesElemTokenMap )
293     {
294         static __FAR_DATA SvXMLTokenMapEntry aSeriesElemTokenMap[] =
295 {
296     { XML_NAMESPACE_CHART,  XML_DATA_POINT,       XML_TOK_SERIES_DATA_POINT       },
297     { XML_NAMESPACE_CHART,  XML_DOMAIN,           XML_TOK_SERIES_DOMAIN           },
298     { XML_NAMESPACE_CHART,  XML_MEAN_VALUE,       XML_TOK_SERIES_MEAN_VALUE_LINE  },
299     { XML_NAMESPACE_CHART,  XML_REGRESSION_CURVE, XML_TOK_SERIES_REGRESSION_CURVE },
300     { XML_NAMESPACE_CHART,  XML_ERROR_INDICATOR,  XML_TOK_SERIES_ERROR_INDICATOR  },
301     XML_TOKEN_MAP_END
302 };
303 
304         mpSeriesElemTokenMap = new SvXMLTokenMap( aSeriesElemTokenMap );
305     } // if( ! mpSeriesElemTokenMap )
306 
307     return *mpSeriesElemTokenMap;
308 }
309 
310 // ----------------------------------------
311 
GetChartAttrTokenMap()312 const SvXMLTokenMap& SchXMLImportHelper::GetChartAttrTokenMap()
313 {
314     if( ! mpChartAttrTokenMap )
315     {
316         static __FAR_DATA SvXMLTokenMapEntry aChartAttrTokenMap[] =
317 {
318     { XML_NAMESPACE_XLINK,  XML_HREF,                   XML_TOK_CHART_HREF          },
319     { XML_NAMESPACE_CHART,  XML_CLASS,                  XML_TOK_CHART_CLASS         },
320     { XML_NAMESPACE_SVG,    XML_WIDTH,                  XML_TOK_CHART_WIDTH         },
321     { XML_NAMESPACE_SVG,    XML_HEIGHT,                 XML_TOK_CHART_HEIGHT        },
322     { XML_NAMESPACE_CHART,  XML_STYLE_NAME,             XML_TOK_CHART_STYLE_NAME    },
323     { XML_NAMESPACE_CHART,  XML_COLUMN_MAPPING,         XML_TOK_CHART_COL_MAPPING   },
324     { XML_NAMESPACE_CHART,  XML_ROW_MAPPING,            XML_TOK_CHART_ROW_MAPPING   },
325     XML_TOKEN_MAP_END
326 };
327 
328         mpChartAttrTokenMap = new SvXMLTokenMap( aChartAttrTokenMap );
329     } // if( ! mpChartAttrTokenMap )
330 
331     return *mpChartAttrTokenMap;
332 }
333 
GetPlotAreaAttrTokenMap()334 const SvXMLTokenMap& SchXMLImportHelper::GetPlotAreaAttrTokenMap()
335 {
336     if( ! mpPlotAreaAttrTokenMap )
337     {
338         static __FAR_DATA SvXMLTokenMapEntry aPlotAreaAttrTokenMap[] =
339 {
340     { XML_NAMESPACE_SVG,    XML_X,                      XML_TOK_PA_X                 },
341     { XML_NAMESPACE_SVG,    XML_Y,                      XML_TOK_PA_Y                 },
342     { XML_NAMESPACE_SVG,    XML_WIDTH,                  XML_TOK_PA_WIDTH             },
343     { XML_NAMESPACE_SVG,    XML_HEIGHT,                 XML_TOK_PA_HEIGHT            },
344     { XML_NAMESPACE_CHART,  XML_STYLE_NAME,             XML_TOK_PA_STYLE_NAME        },
345     { XML_NAMESPACE_TABLE,  XML_CELL_RANGE_ADDRESS,     XML_TOK_PA_CHART_ADDRESS     },
346     { XML_NAMESPACE_CHART,  XML_DATA_SOURCE_HAS_LABELS, XML_TOK_PA_DS_HAS_LABELS     },
347     { XML_NAMESPACE_DR3D,   XML_TRANSFORM,              XML_TOK_PA_TRANSFORM         },
348     { XML_NAMESPACE_DR3D,   XML_VRP,                    XML_TOK_PA_VRP               },
349     { XML_NAMESPACE_DR3D,   XML_VPN,                    XML_TOK_PA_VPN               },
350     { XML_NAMESPACE_DR3D,   XML_VUP,                    XML_TOK_PA_VUP               },
351     { XML_NAMESPACE_DR3D,   XML_PROJECTION,             XML_TOK_PA_PROJECTION        },
352     { XML_NAMESPACE_DR3D,   XML_DISTANCE,               XML_TOK_PA_DISTANCE          },
353     { XML_NAMESPACE_DR3D,   XML_FOCAL_LENGTH,           XML_TOK_PA_FOCAL_LENGTH      },
354     { XML_NAMESPACE_DR3D,   XML_SHADOW_SLANT,           XML_TOK_PA_SHADOW_SLANT      },
355     { XML_NAMESPACE_DR3D,   XML_SHADE_MODE,             XML_TOK_PA_SHADE_MODE        },
356     { XML_NAMESPACE_DR3D,   XML_AMBIENT_COLOR,          XML_TOK_PA_AMBIENT_COLOR     },
357     { XML_NAMESPACE_DR3D,   XML_LIGHTING_MODE,          XML_TOK_PA_LIGHTING_MODE     },
358     XML_TOKEN_MAP_END
359 };
360 
361         mpPlotAreaAttrTokenMap = new SvXMLTokenMap( aPlotAreaAttrTokenMap );
362     } // if( ! mpPlotAreaAttrTokenMap )
363 
364     return *mpPlotAreaAttrTokenMap;
365 }
366 
GetAutoStyleAttrTokenMap()367 const SvXMLTokenMap& SchXMLImportHelper::GetAutoStyleAttrTokenMap()
368 {
369     if( ! mpAutoStyleAttrTokenMap )
370     {
371         static __FAR_DATA SvXMLTokenMapEntry aAutoStyleAttrTokenMap[] =
372 {
373     { XML_NAMESPACE_STYLE,  XML_FAMILY,                 XML_TOK_AS_FAMILY           },
374     { XML_NAMESPACE_STYLE,  XML_NAME,                   XML_TOK_AS_NAME             },
375     XML_TOKEN_MAP_END
376 };
377 
378         mpAutoStyleAttrTokenMap = new SvXMLTokenMap( aAutoStyleAttrTokenMap );
379     } // if( ! mpAutoStyleAttrTokenMap )
380 
381     return *mpAutoStyleAttrTokenMap;
382 }
383 
GetCellAttrTokenMap()384 const SvXMLTokenMap& SchXMLImportHelper::GetCellAttrTokenMap()
385 {
386     if( ! mpCellAttrTokenMap )
387     {
388         static __FAR_DATA SvXMLTokenMapEntry aCellAttrTokenMap[] =
389 {
390     { XML_NAMESPACE_OFFICE, XML_VALUE_TYPE,             XML_TOK_CELL_VAL_TYPE       },
391     { XML_NAMESPACE_OFFICE, XML_VALUE,                  XML_TOK_CELL_VALUE          },
392     XML_TOKEN_MAP_END
393 };
394 
395         mpCellAttrTokenMap = new SvXMLTokenMap( aCellAttrTokenMap );
396     } // if( ! mpCellAttrTokenMap )
397 
398     return *mpCellAttrTokenMap;
399 }
400 
GetSeriesAttrTokenMap()401 const SvXMLTokenMap& SchXMLImportHelper::GetSeriesAttrTokenMap()
402 {
403     if( ! mpSeriesAttrTokenMap )
404     {
405         static __FAR_DATA SvXMLTokenMapEntry aSeriesAttrTokenMap[] =
406 {
407     { XML_NAMESPACE_CHART,  XML_VALUES_CELL_RANGE_ADDRESS,  XML_TOK_SERIES_CELL_RANGE    },
408     { XML_NAMESPACE_CHART,  XML_LABEL_CELL_ADDRESS,         XML_TOK_SERIES_LABEL_ADDRESS },
409     { XML_NAMESPACE_CHART,  XML_ATTACHED_AXIS,              XML_TOK_SERIES_ATTACHED_AXIS },
410     { XML_NAMESPACE_CHART,  XML_STYLE_NAME,                 XML_TOK_SERIES_STYLE_NAME    },
411     { XML_NAMESPACE_CHART,  XML_CLASS,                      XML_TOK_SERIES_CHART_CLASS   },
412     XML_TOKEN_MAP_END
413 };
414 
415         mpSeriesAttrTokenMap = new SvXMLTokenMap( aSeriesAttrTokenMap );
416     } // if( ! mpSeriesAttrTokenMap )
417 
418     return *mpSeriesAttrTokenMap;
419 }
420 
GetRegEquationAttrTokenMap()421 const SvXMLTokenMap& SchXMLImportHelper::GetRegEquationAttrTokenMap()
422 {
423     if( ! mpRegEquationAttrTokenMap )
424     {
425         static __FAR_DATA SvXMLTokenMapEntry aRegressionEquationAttrTokenMap[] =
426 {
427     { XML_NAMESPACE_CHART,  XML_STYLE_NAME,             XML_TOK_REGEQ_STYLE_NAME         },
428     { XML_NAMESPACE_CHART,  XML_DISPLAY_EQUATION,       XML_TOK_REGEQ_DISPLAY_EQUATION   },
429     { XML_NAMESPACE_CHART,  XML_DISPLAY_R_SQUARE,       XML_TOK_REGEQ_DISPLAY_R_SQUARE   },
430     { XML_NAMESPACE_SVG,    XML_X,                      XML_TOK_REGEQ_POS_X              },
431     { XML_NAMESPACE_SVG,    XML_Y,                      XML_TOK_REGEQ_POS_Y              },
432     XML_TOKEN_MAP_END
433 };
434 
435         mpRegEquationAttrTokenMap = new SvXMLTokenMap( aRegressionEquationAttrTokenMap );
436     } // if( ! mpRegEquationAttrTokenMap )
437 
438     return *mpRegEquationAttrTokenMap;
439 }
440 
441 // ----------------------------------------
442 
443 //static
DeleteDataSeries(const Reference<chart2::XDataSeries> & xSeries,const Reference<chart2::XChartDocument> & xDoc)444 void SchXMLImportHelper::DeleteDataSeries(
445                     const Reference< chart2::XDataSeries > & xSeries,
446                     const Reference< chart2::XChartDocument > & xDoc )
447 {
448     if( xDoc.is() )
449     try
450     {
451         Reference< chart2::XCoordinateSystemContainer > xCooSysCnt(
452             xDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
453         Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq(
454             xCooSysCnt->getCoordinateSystems());
455 
456         sal_Int32 nCooSysIndex = 0;
457         for( nCooSysIndex=0; nCooSysIndex<aCooSysSeq.getLength(); nCooSysIndex++ )
458         {
459             Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[ nCooSysIndex ], uno::UNO_QUERY_THROW );
460             Sequence< Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
461 
462             sal_Int32 nChartTypeIndex = 0;
463             for( nChartTypeIndex=0; nChartTypeIndex<aChartTypes.getLength(); nChartTypeIndex++ )
464             {
465                 Reference< chart2::XDataSeriesContainer > xSeriesCnt( aChartTypes[nChartTypeIndex], uno::UNO_QUERY_THROW );
466                 Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xSeriesCnt->getDataSeries());
467 
468                 sal_Int32 nSeriesIndex = 0;
469                 for( nSeriesIndex=0; nSeriesIndex<aSeriesSeq.getLength(); nSeriesIndex++ )
470                 {
471                     if( xSeries==aSeriesSeq[nSeriesIndex] )
472                     {
473                         xSeriesCnt->removeDataSeries(xSeries);
474                         return;
475                     }
476                 }
477             }
478         }
479     }
480     catch( uno::Exception & ex )
481     {
482         (void)ex; // avoid warning for pro build
483         OSL_ENSURE( false, OUStringToOString(
484                         OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught. Type: " )) +
485                         OUString::createFromAscii( typeid( ex ).name()) +
486                         OUString( RTL_CONSTASCII_USTRINGPARAM( ", Message: " )) +
487                         ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
488     }
489 }
490 
491 // static
GetNewDataSeries(const Reference<chart2::XChartDocument> & xDoc,sal_Int32 nCoordinateSystemIndex,const OUString & rChartTypeName,bool bPushLastChartType)492 Reference< chart2::XDataSeries > SchXMLImportHelper::GetNewDataSeries(
493     const Reference< chart2::XChartDocument > & xDoc,
494     sal_Int32 nCoordinateSystemIndex,
495     const OUString & rChartTypeName,
496     bool bPushLastChartType /* = false */ )
497 {
498     Reference< chart2::XDataSeries > xResult;
499     if(!xDoc.is())
500         return xResult;
501 
502     try
503     {
504         Reference< chart2::XCoordinateSystemContainer > xCooSysCnt(
505             xDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
506         Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq(
507             xCooSysCnt->getCoordinateSystems());
508         Reference< uno::XComponentContext > xContext( lcl_getComponentContext());
509 
510         if( nCoordinateSystemIndex < aCooSysSeq.getLength())
511         {
512             Reference< chart2::XChartType > xCurrentType;
513             {
514                 Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[ nCoordinateSystemIndex ], uno::UNO_QUERY_THROW );
515                 Sequence< Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
516                 // find matching chart type group
517                 const Reference< chart2::XChartType > * pBegin = aChartTypes.getConstArray();
518                 const Reference< chart2::XChartType > * pEnd = pBegin + aChartTypes.getLength();
519                 const Reference< chart2::XChartType > * pIt =
520                     ::std::find_if( pBegin, pEnd, lcl_MatchesChartType( rChartTypeName ));
521                 if( pIt != pEnd )
522                     xCurrentType.set( *pIt );
523                 // if chart type is set at series and differs from current one,
524                 // create a new chart type
525                 if( !xCurrentType.is())
526                 {
527                     xCurrentType.set(
528                         xContext->getServiceManager()->createInstanceWithContext( rChartTypeName, xContext ),
529                         uno::UNO_QUERY );
530                     if( xCurrentType.is())
531                     {
532                         if( bPushLastChartType && aChartTypes.getLength())
533                         {
534                             sal_Int32 nIndex( aChartTypes.getLength() - 1 );
535                             aChartTypes.realloc( aChartTypes.getLength() + 1 );
536                             aChartTypes[ nIndex + 1 ] = aChartTypes[ nIndex ];
537                             aChartTypes[ nIndex ] = xCurrentType;
538                             xCTCnt->setChartTypes( aChartTypes );
539                         }
540                         else
541                             xCTCnt->addChartType( xCurrentType );
542                     }
543                 }
544             }
545 
546             if( xCurrentType.is())
547             {
548                 Reference< chart2::XDataSeriesContainer > xSeriesCnt( xCurrentType, uno::UNO_QUERY_THROW );
549                 Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xSeriesCnt->getDataSeries());
550 
551                 if( xContext.is() )
552                 {
553                     xResult.set(
554                         xContext->getServiceManager()->createInstanceWithContext(
555                             OUString::createFromAscii("com.sun.star.chart2.DataSeries"),
556                             xContext ), uno::UNO_QUERY_THROW );
557                 }
558                 if( xResult.is() )
559                     xSeriesCnt->addDataSeries( xResult );
560             }
561         }
562     }
563     catch( uno::Exception & ex )
564     {
565         (void)ex; // avoid warning for pro build
566         OSL_ENSURE( false, OUStringToOString(
567                         OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught. Type: " )) +
568                         OUString::createFromAscii( typeid( ex ).name()) +
569                         OUString( RTL_CONSTASCII_USTRINGPARAM( ", Message: " )) +
570                         ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
571     }
572     return xResult;
573 }
574 
575 // static
GetNewLabeledDataSequence()576 Reference< chart2::data::XLabeledDataSequence > SchXMLImportHelper::GetNewLabeledDataSequence()
577 {
578     // @todo: remove this asap
579     OSL_ENSURE( false, "Do not call this method" );
580     Reference< chart2::data::XLabeledDataSequence >  xResult;
581     // DO NOT USED -- DEPRECATED. Use SchXMLTools::GetNewLabeledDataSequence() instead
582     return xResult;
583 }
584 
585 // ========================================
586 
587 // #110680#
SchXMLImport(const Reference<lang::XMultiServiceFactory> & xServiceFactory,sal_uInt16 nImportFlags)588 SchXMLImport::SchXMLImport(
589     const Reference< lang::XMultiServiceFactory >& xServiceFactory,
590     sal_uInt16 nImportFlags ) :
591         SvXMLImport( xServiceFactory, nImportFlags )
592 {
593     GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
594     GetNamespaceMap().Add( GetXMLToken(XML_NP_CHART_EXT), GetXMLToken(XML_N_CHART_EXT), XML_NAMESPACE_CHART_EXT);
595 
596     mbIsGraphicLoadOnDemandSupported = false;
597 }
598 
599 // #110680#
SchXMLImport(const Reference<lang::XMultiServiceFactory> & xServiceFactory,Reference<frame::XModel> xModel,Reference<document::XGraphicObjectResolver> & rGrfContainer,sal_Bool,sal_Bool bShowProgress)600 SchXMLImport::SchXMLImport(
601     const Reference< lang::XMultiServiceFactory >& xServiceFactory,
602     Reference< frame::XModel > xModel,
603     Reference< document::XGraphicObjectResolver >& rGrfContainer,
604     sal_Bool /*bLoadDoc*/, sal_Bool bShowProgress )
605 :   SvXMLImport( xServiceFactory, xModel, rGrfContainer )
606 {
607     GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
608     GetNamespaceMap().Add( GetXMLToken(XML_NP_CHART_EXT), GetXMLToken(XML_N_CHART_EXT), XML_NAMESPACE_CHART_EXT);
609 
610     // get status indicator (if requested)
611     if( bShowProgress )
612     {
613         Reference< frame::XController > xController( xModel->getCurrentController());
614         if( xController.is())
615         {
616             Reference< frame::XFrame > xFrame( xController->getFrame());
617             if( xFrame.is())
618             {
619                 Reference< task::XStatusIndicatorSupplier > xFactory( xFrame, uno::UNO_QUERY );
620                 if( xFactory.is())
621                 {
622                     mxStatusIndicator = xFactory->getStatusIndicator();
623                 }
624             }
625         }
626     }
627 
628     // add progress view
629     if( mxStatusIndicator.is())
630     {
631         const OUString aText( RTL_CONSTASCII_USTRINGPARAM( "XML Import" ));
632         mxStatusIndicator->start( aText, 100 );     // use percentage as values
633     }
634 }
635 
~SchXMLImport()636 SchXMLImport::~SchXMLImport() throw ()
637 {
638     // stop progress view
639     if( mxStatusIndicator.is())
640     {
641         mxStatusIndicator->end();
642         mxStatusIndicator->reset();
643     }
644 
645     uno::Reference< chart2::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
646     if( xChartDoc.is() && xChartDoc->hasControllersLocked() )
647         xChartDoc->unlockControllers();
648 }
649 
650 // create the main context (subcontexts are created
651 // by the one created here)
CreateContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList)652 SvXMLImportContext *SchXMLImport::CreateContext( sal_uInt16 nPrefix, const OUString& rLocalName,
653     const Reference< xml::sax::XAttributeList >& xAttrList )
654 {
655     SvXMLImportContext* pContext = 0;
656 
657     // accept <office:document>
658     if( XML_NAMESPACE_OFFICE == nPrefix &&
659         ( IsXMLToken( rLocalName, XML_DOCUMENT_STYLES) ||
660           IsXMLToken( rLocalName, XML_DOCUMENT_CONTENT) ))
661     {
662         pContext = new SchXMLDocContext( maImportHelper, *this, nPrefix, rLocalName );
663     } else if ( (XML_NAMESPACE_OFFICE == nPrefix) &&
664                 ( IsXMLToken(rLocalName, XML_DOCUMENT) ||
665                   (IsXMLToken(rLocalName, XML_DOCUMENT_META)
666                    && (getImportFlags() & IMPORT_META) )) )
667     {
668         uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
669             GetModel(), uno::UNO_QUERY);
670         // mst@: right now, this seems to be not supported, so it is untested
671         if (xDPS.is()) {
672             uno::Reference<xml::sax::XDocumentHandler> xDocBuilder(
673                 mxServiceFactory->createInstance(
674                     ::rtl::OUString::createFromAscii(
675                         "com.sun.star.xml.dom.SAXDocumentBuilder")),
676                     uno::UNO_QUERY_THROW);
677             pContext = (IsXMLToken(rLocalName, XML_DOCUMENT_META))
678                 ? new SvXMLMetaDocumentContext(*this,
679                             XML_NAMESPACE_OFFICE, rLocalName,
680                             xDPS->getDocumentProperties(), xDocBuilder)
681                 // flat OpenDocument file format
682                 : new SchXMLFlatDocContext_Impl(
683                             maImportHelper, *this, nPrefix, rLocalName,
684                             xDPS->getDocumentProperties(), xDocBuilder);
685         } else {
686             pContext = (IsXMLToken(rLocalName, XML_DOCUMENT_META))
687                 ? SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList )
688                 : new SchXMLDocContext( maImportHelper, *this,
689                                         nPrefix, rLocalName );
690         }
691     } else {
692         pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList );
693     }
694 
695     return pContext;
696 }
697 
CreateStylesContext(const OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList)698 SvXMLImportContext* SchXMLImport::CreateStylesContext(
699     const OUString& rLocalName,
700     const Reference<xml::sax::XAttributeList>& xAttrList )
701 {
702     //#i103287# make sure that the version information is set before importing all the properties (especially stroke-opacity!)
703     SchXMLTools::setBuildIDAtImportInfo( GetModel(), getImportInfo() );
704 
705     SvXMLStylesContext* pStylesCtxt =
706         new SvXMLStylesContext( *(this), XML_NAMESPACE_OFFICE, rLocalName, xAttrList );
707 
708     // set context at base class, so that all auto-style classes are imported
709     SetAutoStyles( pStylesCtxt );
710     maImportHelper.SetAutoStylesContext( pStylesCtxt );
711 
712     return pStylesCtxt;
713 }
714 
setTargetDocument(const uno::Reference<lang::XComponent> & xDoc)715 void SAL_CALL SchXMLImport::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc )
716     throw(lang::IllegalArgumentException, uno::RuntimeException)
717 {
718     uno::Reference< chart2::XChartDocument > xOldDoc( GetModel(), uno::UNO_QUERY );
719     if( xOldDoc.is() && xOldDoc->hasControllersLocked() )
720         xOldDoc->unlockControllers();
721 
722     SvXMLImport::setTargetDocument( xDoc );
723 
724     //set data provider and number formatter
725     // try to get an XDataProvider and set it
726     // @todo: if we have our own data, we must not use the parent as data provider
727     uno::Reference< chart2::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
728 
729     if( xChartDoc.is() )
730     try
731     {
732         //prevent rebuild of view during load ( necesarry especially if loaded not via load api, which is the case for example if binary files are loaded )
733         xChartDoc->lockControllers();
734 
735         uno::Reference< container::XChild > xChild( xChartDoc, uno::UNO_QUERY );
736         uno::Reference< chart2::data::XDataReceiver > xDataReceiver( xChartDoc, uno::UNO_QUERY );
737         bool bHasOwnData = true;
738         if( xChild.is() && xDataReceiver.is())
739         {
740             Reference< lang::XMultiServiceFactory > xFact( xChild->getParent(), uno::UNO_QUERY );
741             if( xFact.is() )
742             {
743                 //if the parent has a number formatter we will use the numberformatter of the parent
744                 Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( xFact, uno::UNO_QUERY );
745                 xDataReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
746 
747                 if ( !xChartDoc->getDataProvider().is() )
748                 {
749                     const OUString aDataProviderServiceName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2.data.DataProvider"));
750                     const uno::Sequence< OUString > aServiceNames( xFact->getAvailableServiceNames());
751                     const OUString * pBegin = aServiceNames.getConstArray();
752                     const OUString * pEnd = pBegin + aServiceNames.getLength();
753                     if( ::std::find( pBegin, pEnd, aDataProviderServiceName ) != pEnd )
754                     {
755                         Reference< chart2::data::XDataProvider > xProvider(
756                             xFact->createInstance( aDataProviderServiceName ), uno::UNO_QUERY );
757                         if( xProvider.is())
758                         {
759                             xDataReceiver->attachDataProvider( xProvider );
760                             bHasOwnData = false;
761                         }
762                     }
763                 }
764                 else
765                     bHasOwnData = false;
766             }
767 //             else we have no parent => we have our own data
768 
769             if( bHasOwnData && ! xChartDoc->hasInternalDataProvider() )
770                 xChartDoc->createInternalDataProvider( sal_False );
771         }
772     }
773     catch( uno::Exception & rEx )
774     {
775 #ifdef DBG_UTIL
776         String aStr( rEx.Message );
777         ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
778         DBG_ERROR1( "SchXMLChartContext::StartElement(): Exception caught: %s", aBStr.GetBuffer());
779 #else
780         (void)rEx; // avoid warning for pro build
781 #endif
782     }
783 }
784 
785 // export components ========================================
786 
787 // first version: everything comes from one storage
788 
SchXMLImport_getSupportedServiceNames()789 Sequence< OUString > SAL_CALL SchXMLImport_getSupportedServiceNames() throw()
790 {
791     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisImporter" ) );
792     const Sequence< OUString > aSeq( &aServiceName, 1 );
793     return aSeq;
794 }
795 
SchXMLImport_getImplementationName()796 OUString SAL_CALL SchXMLImport_getImplementationName() throw()
797 {
798     return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLImport" ) );
799 }
800 
SchXMLImport_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)801 Reference< uno::XInterface > SAL_CALL SchXMLImport_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
802 {
803     // #110680#
804     // return (cppu::OWeakObject*)new SchXMLImport();
805     return (cppu::OWeakObject*)new SchXMLImport(rSMgr);
806 }
807 
808 // ============================================================
809 
810 // multiple storage version: one for content / styles / meta
811 
SchXMLImport_Styles_getSupportedServiceNames()812 Sequence< OUString > SAL_CALL SchXMLImport_Styles_getSupportedServiceNames() throw()
813 {
814     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisStylesImporter" ) );
815     const Sequence< OUString > aSeq( &aServiceName, 1 );
816     return aSeq;
817 }
818 
SchXMLImport_Styles_getImplementationName()819 OUString SAL_CALL SchXMLImport_Styles_getImplementationName() throw()
820 {
821     return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLImport.Styles" ) );
822 }
823 
SchXMLImport_Styles_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)824 Reference< uno::XInterface > SAL_CALL SchXMLImport_Styles_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
825 {
826     // #110680#
827     // return (cppu::OWeakObject*)new SchXMLImport( IMPORT_STYLES );
828     return (cppu::OWeakObject*)new SchXMLImport( rSMgr, IMPORT_STYLES );
829 }
830 
831 // ------------------------------------------------------------
832 
SchXMLImport_Content_getSupportedServiceNames()833 Sequence< OUString > SAL_CALL SchXMLImport_Content_getSupportedServiceNames() throw()
834 {
835     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisContentImporter" ) );
836     const Sequence< OUString > aSeq( &aServiceName, 1 );
837     return aSeq;
838 }
839 
SchXMLImport_Content_getImplementationName()840 OUString SAL_CALL SchXMLImport_Content_getImplementationName() throw()
841 {
842     return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLImport.Content" ) );
843 }
844 
SchXMLImport_Content_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)845 Reference< uno::XInterface > SAL_CALL SchXMLImport_Content_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
846 {
847     // #110680#
848     // return (cppu::OWeakObject*)new SchXMLImport( IMPORT_CONTENT | IMPORT_AUTOSTYLES | IMPORT_FONTDECLS );
849     return (cppu::OWeakObject*)new SchXMLImport( rSMgr, IMPORT_CONTENT | IMPORT_AUTOSTYLES | IMPORT_FONTDECLS );
850 }
851 
852 // ------------------------------------------------------------
853 
SchXMLImport_Meta_getSupportedServiceNames()854 Sequence< OUString > SAL_CALL SchXMLImport_Meta_getSupportedServiceNames() throw()
855 {
856     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisMetaImporter" ) );
857     const Sequence< OUString > aSeq( &aServiceName, 1 );
858     return aSeq;
859 }
860 
SchXMLImport_Meta_getImplementationName()861 OUString SAL_CALL SchXMLImport_Meta_getImplementationName() throw()
862 {
863     return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLImport.Meta" ) );
864 }
865 
SchXMLImport_Meta_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)866 Reference< uno::XInterface > SAL_CALL SchXMLImport_Meta_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
867 {
868     // #110680#
869     // return (cppu::OWeakObject*)new SchXMLImport( IMPORT_META );
870     return (cppu::OWeakObject*)new SchXMLImport( rSMgr, IMPORT_META );
871 }
872 
873 // XServiceInfo
getImplementationName()874 OUString SAL_CALL SchXMLImport::getImplementationName() throw( uno::RuntimeException )
875 {
876     switch( getImportFlags())
877     {
878         case IMPORT_ALL:
879             return SchXMLImport_getImplementationName();
880         case IMPORT_STYLES:
881             return SchXMLImport_Styles_getImplementationName();
882         case ( IMPORT_CONTENT | IMPORT_AUTOSTYLES | IMPORT_FONTDECLS ):
883             return SchXMLImport_Content_getImplementationName();
884         case IMPORT_META:
885             return SchXMLImport_Meta_getImplementationName();
886 
887         case IMPORT_SETTINGS:
888         // there is no settings component in chart
889         default:
890             return OUString::createFromAscii( "SchXMLImport" );
891     }
892 }
893