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