1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
32*cdf0e10cSrcweir #include <com/sun/star/table/XTableRows.hpp>
33*cdf0e10cSrcweir #include <com/sun/star/table/XMergeableCell.hpp>
34*cdf0e10cSrcweir #include <com/sun/star/table/XMergeableCellRange.hpp>
35*cdf0e10cSrcweir #include <com/sun/star/table/XTable.hpp>
36*cdf0e10cSrcweir #include <com/sun/star/text/XText.hpp>
37*cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
38*cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp>
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #include "xmloff/table/XMLTableImport.hxx"
41*cdf0e10cSrcweir #include "xmloff/xmltkmap.hxx"
42*cdf0e10cSrcweir #include "xmloff/maptype.hxx"
43*cdf0e10cSrcweir #include "xmloff/xmlprmap.hxx"
44*cdf0e10cSrcweir #include "xmloff/txtimp.hxx"
45*cdf0e10cSrcweir #include "xmloff/xmlimp.hxx"
46*cdf0e10cSrcweir #include "xmloff/nmspmap.hxx"
47*cdf0e10cSrcweir #include "xmloff/xmlstyle.hxx"
48*cdf0e10cSrcweir #include "xmloff/prstylei.hxx"
49*cdf0e10cSrcweir #include "xmloff/xmlimp.hxx"
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
52*cdf0e10cSrcweir #include "table.hxx"
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir #include <boost/shared_ptr.hpp>
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir // --------------------------------------------------------------------
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir using ::rtl::OUString;
59*cdf0e10cSrcweir using namespace ::xmloff::token;
60*cdf0e10cSrcweir using namespace ::com::sun::star::beans;
61*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
62*cdf0e10cSrcweir using namespace ::com::sun::star::table;
63*cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
64*cdf0e10cSrcweir using namespace ::com::sun::star::text;
65*cdf0e10cSrcweir using namespace ::com::sun::star::style;
66*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
67*cdf0e10cSrcweir using namespace ::com::sun::star::container;
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir // --------------------------------------------------------------------
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir struct ColumnInfo
72*cdf0e10cSrcweir {
73*cdf0e10cSrcweir 	OUString msStyleName;
74*cdf0e10cSrcweir 	sal_Bool mbVisibility;
75*cdf0e10cSrcweir 	OUString msDefaultCellStyleName;
76*cdf0e10cSrcweir };
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir // --------------------------------------------------------------------
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir class XMLProxyContext : public SvXMLImportContext
81*cdf0e10cSrcweir {
82*cdf0e10cSrcweir public:
83*cdf0e10cSrcweir 	XMLProxyContext( SvXMLImport& rImport, const SvXMLImportContextRef& xParent, sal_uInt16 nPrfx, const OUString& rLName );
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir private:
88*cdf0e10cSrcweir 	SvXMLImportContextRef mxParent;
89*cdf0e10cSrcweir };
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir // --------------------------------------------------------------------
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir struct MergeInfo
94*cdf0e10cSrcweir {
95*cdf0e10cSrcweir 	sal_Int32 mnStartColumn;
96*cdf0e10cSrcweir 	sal_Int32 mnStartRow;
97*cdf0e10cSrcweir 	sal_Int32 mnEndColumn;
98*cdf0e10cSrcweir 	sal_Int32 mnEndRow;
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir 	MergeInfo( sal_Int32 nStartColumn, sal_Int32 nStartRow, sal_Int32 nColumnSpan, sal_Int32 nRowSpan )
101*cdf0e10cSrcweir 		: mnStartColumn( nStartColumn ), mnStartRow( nStartRow ), mnEndColumn( nStartColumn + nColumnSpan - 1 ), mnEndRow( nStartRow + nRowSpan - 1 ) {};
102*cdf0e10cSrcweir };
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir typedef std::vector< boost::shared_ptr< MergeInfo > > MergeInfoVector;
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir // --------------------------------------------------------------------
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir class XMLTableImportContext : public SvXMLImportContext
109*cdf0e10cSrcweir {
110*cdf0e10cSrcweir public:
111*cdf0e10cSrcweir 	XMLTableImportContext( const rtl::Reference< XMLTableImport >& xThis, sal_uInt16 nPrfx, const OUString& rLName, Reference< XColumnRowRange >& xColumnRowRange );
112*cdf0e10cSrcweir 	virtual ~XMLTableImportContext();
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 	virtual void StartElement( const Reference< XAttributeList >& xAttrList );
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir 	virtual void EndElement();
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 	void InitColumns();
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir 	SvXMLImportContext * ImportColumn( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
123*cdf0e10cSrcweir 	SvXMLImportContext * ImportRow( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
124*cdf0e10cSrcweir 	SvXMLImportContext * ImportCell( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir 	OUString GetDefaultCellStyleName() const;
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir 	rtl::Reference< XMLTableImport > mxTableImporter;
129*cdf0e10cSrcweir 	::com::sun::star::uno::Reference< ::com::sun::star::table::XTable > mxTable;
130*cdf0e10cSrcweir 	Reference< XTableColumns > mxColumns;
131*cdf0e10cSrcweir 	Reference< XTableRows > mxRows;
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 	std::vector< boost::shared_ptr< ColumnInfo > > maColumnInfos;
134*cdf0e10cSrcweir 	sal_Int32 mnCurrentRow;
135*cdf0e10cSrcweir 	sal_Int32 mnCurrentColumn;
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir 	// default cell style name for the current row
138*cdf0e10cSrcweir 	OUString msDefaultCellStyleName;
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 	MergeInfoVector maMergeInfos;
141*cdf0e10cSrcweir };
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir // --------------------------------------------------------------------
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir class XMLCellImportContext : public SvXMLImportContext
146*cdf0e10cSrcweir {
147*cdf0e10cSrcweir public:
148*cdf0e10cSrcweir 	XMLCellImportContext( SvXMLImport& rImport,
149*cdf0e10cSrcweir 						  const Reference< XMergeableCell >& xCell,
150*cdf0e10cSrcweir 						  const OUString& sDefaultCellStyleName,
151*cdf0e10cSrcweir 						  sal_uInt16 nPrfx, const OUString& rLName,
152*cdf0e10cSrcweir 						  const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir 	virtual ~XMLCellImportContext();
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 	virtual void EndElement();
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir 	sal_Int32 getColumnSpan() const { return mnColSpan; }
161*cdf0e10cSrcweir 	sal_Int32 getRowSpan() const { return mnRowSpan; }
162*cdf0e10cSrcweir 	sal_Int32 getRepeated() const { return mnRepeated; }
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir 	Reference< XMergeableCell >	mxCell;
165*cdf0e10cSrcweir 	Reference< XTextCursor >	mxCursor;
166*cdf0e10cSrcweir 	Reference< XTextCursor >	mxOldCursor;
167*cdf0e10cSrcweir     bool                        mbListContextPushed;
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 	sal_Int32 mnColSpan, mnRowSpan, mnRepeated;
170*cdf0e10cSrcweir };
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir // --------------------------------------------------------------------
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir class XMLTableTemplateContext : public SvXMLStyleContext
175*cdf0e10cSrcweir {
176*cdf0e10cSrcweir public:
177*cdf0e10cSrcweir 	XMLTableTemplateContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const Reference< XAttributeList >& xAttrList );
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList );
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir 	virtual void StartElement( const Reference< XAttributeList >& xAttrList );
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 	virtual void EndElement();
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir private:
186*cdf0e10cSrcweir 	XMLTableTemplate maTableTemplate;
187*cdf0e10cSrcweir 	OUString msTemplateStyleName;
188*cdf0e10cSrcweir };
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir // --------------------------------------------------------------------
191*cdf0e10cSrcweir // class XMLProxyContext
192*cdf0e10cSrcweir // --------------------------------------------------------------------
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir XMLProxyContext::XMLProxyContext( SvXMLImport& rImport, const SvXMLImportContextRef& xParent, sal_uInt16 nPrfx, const OUString& rLName )
195*cdf0e10cSrcweir : SvXMLImportContext( rImport, nPrfx, rLName )
196*cdf0e10cSrcweir , mxParent( xParent )
197*cdf0e10cSrcweir {
198*cdf0e10cSrcweir }
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir // --------------------------------------------------------------------
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir SvXMLImportContext * XMLProxyContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList )
203*cdf0e10cSrcweir {
204*cdf0e10cSrcweir 	if( mxParent.Is() )
205*cdf0e10cSrcweir 		return mxParent->CreateChildContext( nPrefix, rLocalName, xAttrList );
206*cdf0e10cSrcweir 	else
207*cdf0e10cSrcweir 		return SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
208*cdf0e10cSrcweir }
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir // --------------------------------------------------------------------
211*cdf0e10cSrcweir // class XMLTableImport
212*cdf0e10cSrcweir // --------------------------------------------------------------------
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir XMLTableImport::XMLTableImport( SvXMLImport& rImport, const rtl::Reference< XMLPropertySetMapper >& xCellPropertySetMapper, const rtl::Reference< XMLPropertyHandlerFactory >& xFactoryRef )
215*cdf0e10cSrcweir : mrImport( rImport )
216*cdf0e10cSrcweir {
217*cdf0e10cSrcweir 	mxCellImportPropertySetMapper = new SvXMLImportPropertyMapper( xCellPropertySetMapper.get(), rImport );
218*cdf0e10cSrcweir 	mxCellImportPropertySetMapper->ChainImportMapper(XMLTextImportHelper::CreateParaExtPropMapper(rImport));
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir 	UniReference < XMLPropertySetMapper > xRowMapper( new XMLPropertySetMapper( getRowPropertiesMap(), xFactoryRef.get() ) );
222*cdf0e10cSrcweir 	mxRowImportPropertySetMapper = new SvXMLImportPropertyMapper( xRowMapper, rImport );
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir 	UniReference < XMLPropertySetMapper > xColMapper( new XMLPropertySetMapper( getColumnPropertiesMap(), xFactoryRef.get() ) );
225*cdf0e10cSrcweir 	mxColumnImportPropertySetMapper = new SvXMLImportPropertyMapper( xColMapper, rImport );
226*cdf0e10cSrcweir }
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir // --------------------------------------------------------------------
229*cdf0e10cSrcweir 
230*cdf0e10cSrcweir XMLTableImport::~XMLTableImport()
231*cdf0e10cSrcweir {
232*cdf0e10cSrcweir }
233*cdf0e10cSrcweir 
234*cdf0e10cSrcweir // --------------------------------------------------------------------
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir SvXMLImportContext* XMLTableImport::CreateTableContext( sal_uInt16 nPrfx, const OUString& rLName, Reference< XColumnRowRange >& xColumnRowRange )
237*cdf0e10cSrcweir {
238*cdf0e10cSrcweir 	rtl::Reference< XMLTableImport > xThis( this );
239*cdf0e10cSrcweir 	return new XMLTableImportContext( xThis, nPrfx, rLName, xColumnRowRange );
240*cdf0e10cSrcweir }
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir // --------------------------------------------------------------------
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir SvXMLStyleContext* XMLTableImport::CreateTableTemplateContext( sal_uInt16 nPrfx, const OUString& rLName, const Reference< XAttributeList >& xAttrList )
245*cdf0e10cSrcweir {
246*cdf0e10cSrcweir 	return new XMLTableTemplateContext( mrImport, nPrfx, rLName, xAttrList );
247*cdf0e10cSrcweir }
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir // --------------------------------------------------------------------
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir void XMLTableImport::addTableTemplate( const rtl::OUString& rsStyleName, XMLTableTemplate& xTableTemplate )
252*cdf0e10cSrcweir {
253*cdf0e10cSrcweir 	boost::shared_ptr< XMLTableTemplate > xPtr( new XMLTableTemplate );
254*cdf0e10cSrcweir 	xPtr->swap( xTableTemplate );
255*cdf0e10cSrcweir 	maTableTemplates[rsStyleName] = xPtr;
256*cdf0e10cSrcweir }
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir // --------------------------------------------------------------------
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir void XMLTableImport::finishStyles()
261*cdf0e10cSrcweir {
262*cdf0e10cSrcweir 	if( !maTableTemplates.empty() ) try
263*cdf0e10cSrcweir 	{
264*cdf0e10cSrcweir 		Reference< XStyleFamiliesSupplier > xFamiliesSupp( mrImport.GetModel(), UNO_QUERY_THROW );
265*cdf0e10cSrcweir 		Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
266*cdf0e10cSrcweir 		const OUString sFamilyName( RTL_CONSTASCII_USTRINGPARAM("table" ) );
267*cdf0e10cSrcweir 		const OUString sCellFamilyName( RTL_CONSTASCII_USTRINGPARAM("cell") );
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir 		Reference< XNameContainer > xTableFamily( xFamilies->getByName( sFamilyName ), UNO_QUERY_THROW );
270*cdf0e10cSrcweir 		Reference< XNameAccess > xCellFamily( xFamilies->getByName( sCellFamilyName ), UNO_QUERY_THROW );
271*cdf0e10cSrcweir 
272*cdf0e10cSrcweir 		Reference< XSingleServiceFactory > xFactory( xTableFamily, UNO_QUERY_THROW );
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir 		for( XMLTableTemplateMap::iterator aTemplateIter( maTableTemplates.begin() ); aTemplateIter != maTableTemplates.end(); aTemplateIter++ ) try
275*cdf0e10cSrcweir 		{
276*cdf0e10cSrcweir 			const OUString sTemplateName( (*aTemplateIter).first );
277*cdf0e10cSrcweir 			Reference< XNameReplace > xTemplate( xFactory->createInstance(), UNO_QUERY_THROW );
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir 			boost::shared_ptr< XMLTableTemplate > xT( (*aTemplateIter).second );
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir 			for( XMLTableTemplate::iterator aStyleIter( xT->begin() ); aStyleIter != xT->end(); aStyleIter++ ) try
282*cdf0e10cSrcweir 			{
283*cdf0e10cSrcweir 				const OUString sPropName( (*aStyleIter).first );
284*cdf0e10cSrcweir 				const OUString sStyleName( (*aStyleIter).second );
285*cdf0e10cSrcweir 				xTemplate->replaceByName( sPropName, xCellFamily->getByName( sStyleName ) );
286*cdf0e10cSrcweir 			}
287*cdf0e10cSrcweir 			catch( Exception& )
288*cdf0e10cSrcweir 			{
289*cdf0e10cSrcweir 				DBG_ERROR("xmloff::XMLTableImport::finishStyles(), exception caught!");
290*cdf0e10cSrcweir 			}
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir 			if( xTemplate.is() )
293*cdf0e10cSrcweir 			{
294*cdf0e10cSrcweir 				if( xTableFamily->hasByName( sTemplateName ) )
295*cdf0e10cSrcweir 					xTableFamily->replaceByName( sTemplateName, Any( xTemplate ) );
296*cdf0e10cSrcweir 				else
297*cdf0e10cSrcweir 					xTableFamily->insertByName( sTemplateName, Any( xTemplate ) );
298*cdf0e10cSrcweir 			}
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir 		}
301*cdf0e10cSrcweir 		catch( Exception& )
302*cdf0e10cSrcweir 		{
303*cdf0e10cSrcweir 			DBG_ERROR("xmloff::XMLTableImport::finishStyles(), exception caught!");
304*cdf0e10cSrcweir 		}
305*cdf0e10cSrcweir 	}
306*cdf0e10cSrcweir 	catch( Exception& )
307*cdf0e10cSrcweir 	{
308*cdf0e10cSrcweir 		DBG_ERROR("xmloff::XMLTableImport::finishStyles(), exception caught!");
309*cdf0e10cSrcweir 	}
310*cdf0e10cSrcweir }
311*cdf0e10cSrcweir 
312*cdf0e10cSrcweir // --------------------------------------------------------------------
313*cdf0e10cSrcweir // class XMLTableImport
314*cdf0e10cSrcweir // --------------------------------------------------------------------
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir XMLTableImportContext::XMLTableImportContext( const rtl::Reference< XMLTableImport >& xImporter, sal_uInt16 nPrfx, const OUString& rLName,	Reference< XColumnRowRange >& xColumnRowRange )
318*cdf0e10cSrcweir : SvXMLImportContext( xImporter->mrImport, nPrfx, rLName )
319*cdf0e10cSrcweir , mxTableImporter( xImporter )
320*cdf0e10cSrcweir , mxTable( xColumnRowRange, UNO_QUERY )
321*cdf0e10cSrcweir , mxColumns( xColumnRowRange->getColumns() )
322*cdf0e10cSrcweir , mxRows( xColumnRowRange->getRows() )
323*cdf0e10cSrcweir , mnCurrentRow( -1 )
324*cdf0e10cSrcweir , mnCurrentColumn( -1 )
325*cdf0e10cSrcweir {
326*cdf0e10cSrcweir }
327*cdf0e10cSrcweir 
328*cdf0e10cSrcweir // --------------------------------------------------------------------
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir XMLTableImportContext::~XMLTableImportContext()
331*cdf0e10cSrcweir {
332*cdf0e10cSrcweir }
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir // --------------------------------------------------------------------
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir SvXMLImportContext * XMLTableImportContext::ImportColumn( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList )
337*cdf0e10cSrcweir {
338*cdf0e10cSrcweir 	if( mxColumns.is() && (mnCurrentRow == -1) ) try
339*cdf0e10cSrcweir 	{
340*cdf0e10cSrcweir 		boost::shared_ptr< ColumnInfo > xInfo ( new ColumnInfo );
341*cdf0e10cSrcweir 
342*cdf0e10cSrcweir 		sal_Int32 nRepeated = 1;
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir 		// read attributes for the table-column
345*cdf0e10cSrcweir 		sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
346*cdf0e10cSrcweir 		for(sal_Int16 i=0; i < nAttrCount; i++)
347*cdf0e10cSrcweir 		{
348*cdf0e10cSrcweir 			const OUString sAttrName( xAttrList->getNameByIndex( i ) );
349*cdf0e10cSrcweir             const OUString sValue( xAttrList->getValueByIndex( i ) );
350*cdf0e10cSrcweir 			OUString aLocalName;
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir 			sal_uInt16 nPrefix2 = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
353*cdf0e10cSrcweir 			if( XML_NAMESPACE_TABLE == nPrefix2 )
354*cdf0e10cSrcweir 			{
355*cdf0e10cSrcweir 				if( IsXMLToken( aLocalName, XML_NUMBER_COLUMNS_REPEATED ) )
356*cdf0e10cSrcweir 				{
357*cdf0e10cSrcweir 					nRepeated = sValue.toInt32();
358*cdf0e10cSrcweir 				}
359*cdf0e10cSrcweir 				else if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
360*cdf0e10cSrcweir 				{
361*cdf0e10cSrcweir 					xInfo->msStyleName = sValue;
362*cdf0e10cSrcweir 				}
363*cdf0e10cSrcweir 				else if( IsXMLToken( aLocalName, XML_DEFAULT_CELL_STYLE_NAME ) )
364*cdf0e10cSrcweir 				{
365*cdf0e10cSrcweir 					xInfo->msDefaultCellStyleName = sValue;
366*cdf0e10cSrcweir 				}
367*cdf0e10cSrcweir 				else if( IsXMLToken( aLocalName, XML_VISIBILITY ) )
368*cdf0e10cSrcweir 				{
369*cdf0e10cSrcweir 					xInfo->mbVisibility = IsXMLToken( sValue, XML_VISIBLE );
370*cdf0e10cSrcweir 				}
371*cdf0e10cSrcweir 			}
372*cdf0e10cSrcweir             else if ( (XML_NAMESPACE_XML == nPrefix2) &&
373*cdf0e10cSrcweir                  IsXMLToken(aLocalName, XML_ID)   )
374*cdf0e10cSrcweir             {
375*cdf0e10cSrcweir                 (void) sValue;
376*cdf0e10cSrcweir //FIXME: TODO
377*cdf0e10cSrcweir             }
378*cdf0e10cSrcweir         }
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir 		if( nRepeated <= 1 )
381*cdf0e10cSrcweir 		{
382*cdf0e10cSrcweir 			maColumnInfos.push_back( xInfo );
383*cdf0e10cSrcweir 		}
384*cdf0e10cSrcweir 		else
385*cdf0e10cSrcweir 		{
386*cdf0e10cSrcweir 			maColumnInfos.insert( maColumnInfos.end(), nRepeated, xInfo );
387*cdf0e10cSrcweir 		}
388*cdf0e10cSrcweir 	}
389*cdf0e10cSrcweir 	catch( Exception& )
390*cdf0e10cSrcweir 	{
391*cdf0e10cSrcweir 		DBG_ERROR("xmloff::XMLTableImportContext::ImportTableColumn(), exception caught!");
392*cdf0e10cSrcweir 	}
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir 	return SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList);
395*cdf0e10cSrcweir }
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir // --------------------------------------------------------------------
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir void XMLTableImportContext::InitColumns()
400*cdf0e10cSrcweir {
401*cdf0e10cSrcweir 	if( mxColumns.is() ) try
402*cdf0e10cSrcweir 	{
403*cdf0e10cSrcweir 		const sal_Int32 nCount1 = mxColumns->getCount();
404*cdf0e10cSrcweir 		const sal_Int32 nCount2 = sal::static_int_cast< sal_Int32 >( maColumnInfos.size() );
405*cdf0e10cSrcweir 		if( nCount1 < nCount2 )
406*cdf0e10cSrcweir 			mxColumns->insertByIndex( nCount1, nCount2 - nCount1 );
407*cdf0e10cSrcweir 
408*cdf0e10cSrcweir 		SvXMLStylesContext * pAutoStyles = GetImport().GetShapeImport()->GetAutoStylesContext();
409*cdf0e10cSrcweir 
410*cdf0e10cSrcweir 		for( sal_Int32 nCol = 0; nCol < nCount2; nCol++ )
411*cdf0e10cSrcweir 		{
412*cdf0e10cSrcweir 			boost::shared_ptr< ColumnInfo > xInfo( maColumnInfos[nCol] );
413*cdf0e10cSrcweir 
414*cdf0e10cSrcweir 			if( pAutoStyles && xInfo->msStyleName.getLength() )
415*cdf0e10cSrcweir 			{
416*cdf0e10cSrcweir 				const XMLPropStyleContext* pStyle =
417*cdf0e10cSrcweir 					dynamic_cast< const XMLPropStyleContext* >(
418*cdf0e10cSrcweir 						pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_TABLE_COLUMN, xInfo->msStyleName) );
419*cdf0e10cSrcweir 
420*cdf0e10cSrcweir 				if( pStyle )
421*cdf0e10cSrcweir 				{
422*cdf0e10cSrcweir 					Reference< XPropertySet > xColProps( mxColumns->getByIndex(nCol), UNO_QUERY_THROW );
423*cdf0e10cSrcweir 					const_cast< XMLPropStyleContext* >( pStyle )->FillPropertySet( xColProps );
424*cdf0e10cSrcweir 				}
425*cdf0e10cSrcweir 			}
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir 		}
428*cdf0e10cSrcweir 	}
429*cdf0e10cSrcweir 	catch( Exception& )
430*cdf0e10cSrcweir 	{
431*cdf0e10cSrcweir 		DBG_ERROR("xmloff::XMLTableImportContext::ImportTableColumn(), exception caught!");
432*cdf0e10cSrcweir 	}
433*cdf0e10cSrcweir }
434*cdf0e10cSrcweir 
435*cdf0e10cSrcweir // --------------------------------------------------------------------
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir SvXMLImportContext * XMLTableImportContext::ImportRow( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList )
438*cdf0e10cSrcweir {
439*cdf0e10cSrcweir 	if( mxRows.is() )
440*cdf0e10cSrcweir 	{
441*cdf0e10cSrcweir 		mnCurrentRow++;
442*cdf0e10cSrcweir 		if( mnCurrentRow == 0 )
443*cdf0e10cSrcweir 			InitColumns();		// first init columns
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir 		mnCurrentColumn = -1;
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir 		const sal_Int32 nRowCount = mxRows->getCount();
448*cdf0e10cSrcweir 		if( ( nRowCount - 1) < mnCurrentRow )
449*cdf0e10cSrcweir 		{
450*cdf0e10cSrcweir 			const sal_Int32 nCount = mnCurrentRow - nRowCount + 1;
451*cdf0e10cSrcweir 			mxRows->insertByIndex( nRowCount, nCount );
452*cdf0e10cSrcweir 		}
453*cdf0e10cSrcweir 
454*cdf0e10cSrcweir 		Reference< XPropertySet > xRowSet( mxRows->getByIndex(mnCurrentRow), UNO_QUERY );
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir 		sal_Int32 nRepeated = 1;
457*cdf0e10cSrcweir 		OUString sStyleName;
458*cdf0e10cSrcweir 		sal_Bool bVisibility = sal_True;
459*cdf0e10cSrcweir 
460*cdf0e10cSrcweir 		// read attributes for the table-row
461*cdf0e10cSrcweir 		sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
462*cdf0e10cSrcweir 		for(sal_Int16 i=0; i < nAttrCount; i++)
463*cdf0e10cSrcweir 		{
464*cdf0e10cSrcweir 			const OUString sAttrName( xAttrList->getNameByIndex( i ) );
465*cdf0e10cSrcweir             const OUString sValue( xAttrList->getValueByIndex( i ) );
466*cdf0e10cSrcweir 			OUString aLocalName;
467*cdf0e10cSrcweir 
468*cdf0e10cSrcweir 			sal_uInt16 nPrefix2 = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
469*cdf0e10cSrcweir 			if( nPrefix2 == XML_NAMESPACE_TABLE )
470*cdf0e10cSrcweir 			{
471*cdf0e10cSrcweir 				if( IsXMLToken( aLocalName, XML_NUMBER_ROWS_REPEATED ) )
472*cdf0e10cSrcweir 				{
473*cdf0e10cSrcweir 					nRepeated = sValue.toInt32();
474*cdf0e10cSrcweir 				}
475*cdf0e10cSrcweir 				else if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
476*cdf0e10cSrcweir 				{
477*cdf0e10cSrcweir 					sStyleName = sValue;
478*cdf0e10cSrcweir 				}
479*cdf0e10cSrcweir 				else if( IsXMLToken( aLocalName, XML_DEFAULT_CELL_STYLE_NAME ) )
480*cdf0e10cSrcweir 				{
481*cdf0e10cSrcweir 					msDefaultCellStyleName = sValue;
482*cdf0e10cSrcweir 				}
483*cdf0e10cSrcweir 				else if( IsXMLToken( aLocalName, XML_VISIBILITY ) )
484*cdf0e10cSrcweir 				{
485*cdf0e10cSrcweir 					bVisibility = IsXMLToken( sValue, XML_VISIBLE );
486*cdf0e10cSrcweir 				}
487*cdf0e10cSrcweir 			}
488*cdf0e10cSrcweir             else if ( (XML_NAMESPACE_XML == nPrefix2) &&
489*cdf0e10cSrcweir                  IsXMLToken(aLocalName, XML_ID)   )
490*cdf0e10cSrcweir             {
491*cdf0e10cSrcweir                 (void) sValue;
492*cdf0e10cSrcweir //FIXME: TODO
493*cdf0e10cSrcweir             }
494*cdf0e10cSrcweir 		}
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir 		if( sStyleName.getLength() )
497*cdf0e10cSrcweir 		{
498*cdf0e10cSrcweir 			SvXMLStylesContext * pAutoStyles = GetImport().GetShapeImport()->GetAutoStylesContext();
499*cdf0e10cSrcweir 			if( pAutoStyles )
500*cdf0e10cSrcweir 			{
501*cdf0e10cSrcweir 				const XMLPropStyleContext* pStyle =
502*cdf0e10cSrcweir 					dynamic_cast< const XMLPropStyleContext* >(
503*cdf0e10cSrcweir 						pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_TABLE_ROW, sStyleName) );
504*cdf0e10cSrcweir 
505*cdf0e10cSrcweir 				if( pStyle )
506*cdf0e10cSrcweir 				{
507*cdf0e10cSrcweir 					const_cast< XMLPropStyleContext* >( pStyle )->FillPropertySet( xRowSet );
508*cdf0e10cSrcweir 				}
509*cdf0e10cSrcweir 			}
510*cdf0e10cSrcweir 		}
511*cdf0e10cSrcweir 	}
512*cdf0e10cSrcweir 
513*cdf0e10cSrcweir 	SvXMLImportContextRef xThis( this );
514*cdf0e10cSrcweir 	return new XMLProxyContext( GetImport(), xThis, nPrefix, rLocalName );
515*cdf0e10cSrcweir }
516*cdf0e10cSrcweir 
517*cdf0e10cSrcweir // --------------------------------------------------------------------
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir SvXMLImportContext * XMLTableImportContext::ImportCell( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList )
520*cdf0e10cSrcweir {
521*cdf0e10cSrcweir 	mnCurrentColumn++;
522*cdf0e10cSrcweir 	if( mxColumns.is() ) try
523*cdf0e10cSrcweir 	{
524*cdf0e10cSrcweir 		if( mxColumns->getCount() <= mnCurrentColumn )
525*cdf0e10cSrcweir 			mxColumns->insertByIndex( mxColumns->getCount(), mnCurrentColumn - mxColumns->getCount() + 1 );
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir 		Reference< XMergeableCell > xCell( mxTable->getCellByPosition( mnCurrentColumn, mnCurrentRow ), UNO_QUERY_THROW );
528*cdf0e10cSrcweir 		XMLCellImportContext* pCellContext = new XMLCellImportContext( GetImport(), xCell, GetDefaultCellStyleName(), nPrefix, rLocalName, xAttrList );
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir 		const sal_Int32 nColumnSpan = pCellContext->getColumnSpan();
531*cdf0e10cSrcweir 		const sal_Int32 nRowSpan = pCellContext->getRowSpan();
532*cdf0e10cSrcweir 		if( (nColumnSpan > 1) || (nRowSpan > 1) )
533*cdf0e10cSrcweir 			maMergeInfos.push_back( boost::shared_ptr< MergeInfo >( new MergeInfo( mnCurrentColumn, mnCurrentRow, nColumnSpan, nRowSpan ) ) );
534*cdf0e10cSrcweir 
535*cdf0e10cSrcweir 		const sal_Int32 nRepeated = pCellContext->getRepeated();
536*cdf0e10cSrcweir 		if( nRepeated > 1 )
537*cdf0e10cSrcweir 		{
538*cdf0e10cSrcweir 			DBG_ERROR("xmloff::XMLTableImportContext::ImportCell(), import of repeated Cells not implemented (TODO)");
539*cdf0e10cSrcweir 			mnCurrentColumn  += nRepeated - 1;
540*cdf0e10cSrcweir 		}
541*cdf0e10cSrcweir 
542*cdf0e10cSrcweir 		return pCellContext;
543*cdf0e10cSrcweir 	}
544*cdf0e10cSrcweir 	catch( Exception& )
545*cdf0e10cSrcweir 	{
546*cdf0e10cSrcweir 		DBG_ERROR("xmloff::XMLTableImportContext::ImportCell(), exception caught!");
547*cdf0e10cSrcweir 	}
548*cdf0e10cSrcweir 
549*cdf0e10cSrcweir 	return SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList);
550*cdf0e10cSrcweir }
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir // --------------------------------------------------------------------
553*cdf0e10cSrcweir 
554*cdf0e10cSrcweir SvXMLImportContext *XMLTableImportContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList )
555*cdf0e10cSrcweir {
556*cdf0e10cSrcweir 	if( nPrefix == XML_NAMESPACE_TABLE )
557*cdf0e10cSrcweir 	{
558*cdf0e10cSrcweir 		if( IsXMLToken( rLocalName, XML_TABLE_COLUMN ) )
559*cdf0e10cSrcweir 			return ImportColumn( nPrefix, rLocalName, xAttrList );
560*cdf0e10cSrcweir 		else if( IsXMLToken( rLocalName, XML_TABLE_ROW ) )
561*cdf0e10cSrcweir 			return ImportRow( nPrefix, rLocalName, xAttrList );
562*cdf0e10cSrcweir 		else if( IsXMLToken( rLocalName, XML_TABLE_CELL ) || IsXMLToken( rLocalName, XML_COVERED_TABLE_CELL ) )
563*cdf0e10cSrcweir 			return ImportCell( nPrefix, rLocalName, xAttrList );
564*cdf0e10cSrcweir 		else if( IsXMLToken( rLocalName, XML_TABLE_COLUMNS ) || IsXMLToken( rLocalName, XML_TABLE_ROWS ) )
565*cdf0e10cSrcweir 		{
566*cdf0e10cSrcweir 			SvXMLImportContextRef xThis( this );
567*cdf0e10cSrcweir 			return new XMLProxyContext( GetImport(), xThis, nPrefix, rLocalName );
568*cdf0e10cSrcweir 		}
569*cdf0e10cSrcweir 	}
570*cdf0e10cSrcweir 
571*cdf0e10cSrcweir 	return SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList);
572*cdf0e10cSrcweir }
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir // --------------------------------------------------------------------
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir void XMLTableImportContext::StartElement( const Reference< XAttributeList >& /*xAttrList*/ )
577*cdf0e10cSrcweir {
578*cdf0e10cSrcweir }
579*cdf0e10cSrcweir 
580*cdf0e10cSrcweir // --------------------------------------------------------------------
581*cdf0e10cSrcweir 
582*cdf0e10cSrcweir void XMLTableImportContext::EndElement()
583*cdf0e10cSrcweir {
584*cdf0e10cSrcweir 	if( !maMergeInfos.empty() )
585*cdf0e10cSrcweir 	{
586*cdf0e10cSrcweir 		MergeInfoVector::iterator aIter( maMergeInfos.begin() );
587*cdf0e10cSrcweir 		while( aIter != maMergeInfos.end() )
588*cdf0e10cSrcweir 		{
589*cdf0e10cSrcweir 			boost::shared_ptr< MergeInfo > xInfo( (*aIter++) );
590*cdf0e10cSrcweir 
591*cdf0e10cSrcweir 			if( xInfo.get() ) try
592*cdf0e10cSrcweir 			{
593*cdf0e10cSrcweir 				Reference< XCellRange > xRange( mxTable->getCellRangeByPosition( xInfo->mnStartColumn, xInfo->mnStartRow, xInfo->mnEndColumn, xInfo->mnEndRow ) );
594*cdf0e10cSrcweir 				Reference< XMergeableCellRange > xCursor( mxTable->createCursorByRange( xRange ), UNO_QUERY_THROW );
595*cdf0e10cSrcweir 				xCursor->merge();
596*cdf0e10cSrcweir 			}
597*cdf0e10cSrcweir 			catch( Exception& )
598*cdf0e10cSrcweir 			{
599*cdf0e10cSrcweir 				DBG_ERROR("XMLTableImportContext::EndElement(), exception caught while merging cells!");
600*cdf0e10cSrcweir 			}
601*cdf0e10cSrcweir 		}
602*cdf0e10cSrcweir 	}
603*cdf0e10cSrcweir }
604*cdf0e10cSrcweir 
605*cdf0e10cSrcweir // --------------------------------------------------------------------
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir OUString XMLTableImportContext::GetDefaultCellStyleName() const
608*cdf0e10cSrcweir {
609*cdf0e10cSrcweir 	OUString sStyleName( msDefaultCellStyleName );
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir 	// if there is still no style name, try default style name from column
612*cdf0e10cSrcweir 	if( (sStyleName.getLength() == 0) && (mnCurrentColumn < sal::static_int_cast<sal_Int32>(maColumnInfos.size())) )
613*cdf0e10cSrcweir 		sStyleName = maColumnInfos[mnCurrentColumn]->msDefaultCellStyleName;
614*cdf0e10cSrcweir 
615*cdf0e10cSrcweir 	return sStyleName;
616*cdf0e10cSrcweir }
617*cdf0e10cSrcweir 
618*cdf0e10cSrcweir // --------------------------------------------------------------------
619*cdf0e10cSrcweir // XMLCellImportContext
620*cdf0e10cSrcweir // --------------------------------------------------------------------
621*cdf0e10cSrcweir 
622*cdf0e10cSrcweir XMLCellImportContext::XMLCellImportContext( SvXMLImport& rImport, const Reference< XMergeableCell >& xCell, const OUString& sDefaultCellStyleName, sal_uInt16 nPrfx, const OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
623*cdf0e10cSrcweir : SvXMLImportContext( rImport, nPrfx, rLName )
624*cdf0e10cSrcweir , mxCell( xCell )
625*cdf0e10cSrcweir , mbListContextPushed( false )
626*cdf0e10cSrcweir , mnColSpan( 1 )
627*cdf0e10cSrcweir , mnRowSpan( 1 )
628*cdf0e10cSrcweir , mnRepeated( 1 )
629*cdf0e10cSrcweir {
630*cdf0e10cSrcweir 	OUString sStyleName;
631*cdf0e10cSrcweir 
632*cdf0e10cSrcweir 	// read attributes for the table-cell
633*cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
634*cdf0e10cSrcweir 	for(sal_Int16 i=0; i < nAttrCount; i++)
635*cdf0e10cSrcweir 	{
636*cdf0e10cSrcweir         const OUString sAttrName( xAttrList->getNameByIndex( i ) );
637*cdf0e10cSrcweir         const OUString sValue( xAttrList->getValueByIndex( i ) );
638*cdf0e10cSrcweir         OUString aLocalName;
639*cdf0e10cSrcweir 
640*cdf0e10cSrcweir         sal_uInt16 nPrefix2 = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
641*cdf0e10cSrcweir         if( XML_NAMESPACE_TABLE == nPrefix2 )
642*cdf0e10cSrcweir 		{
643*cdf0e10cSrcweir 			if( IsXMLToken( aLocalName, XML_NUMBER_COLUMNS_REPEATED ) )
644*cdf0e10cSrcweir 			{
645*cdf0e10cSrcweir 				mnRepeated = sValue.toInt32();
646*cdf0e10cSrcweir 			}
647*cdf0e10cSrcweir 			else if( IsXMLToken( aLocalName, XML_NUMBER_COLUMNS_SPANNED ) )
648*cdf0e10cSrcweir 			{
649*cdf0e10cSrcweir 				mnColSpan = sValue.toInt32();
650*cdf0e10cSrcweir 			}
651*cdf0e10cSrcweir 			else if( IsXMLToken( aLocalName, XML_NUMBER_ROWS_SPANNED ) )
652*cdf0e10cSrcweir 			{
653*cdf0e10cSrcweir 				mnRowSpan = sValue.toInt32();
654*cdf0e10cSrcweir 			}
655*cdf0e10cSrcweir 			else if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
656*cdf0e10cSrcweir 			{
657*cdf0e10cSrcweir 				sStyleName = sValue;
658*cdf0e10cSrcweir 			}
659*cdf0e10cSrcweir 		}
660*cdf0e10cSrcweir         else if ( (XML_NAMESPACE_XML == nPrefix2) &&
661*cdf0e10cSrcweir              IsXMLToken(aLocalName, XML_ID)   )
662*cdf0e10cSrcweir         {
663*cdf0e10cSrcweir             (void) sValue;
664*cdf0e10cSrcweir //FIXME: TODO
665*cdf0e10cSrcweir         }
666*cdf0e10cSrcweir //FIXME: RDFa (table:table-cell)
667*cdf0e10cSrcweir 	}
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir 	// if there is no style name at the cell, try default style name from row
670*cdf0e10cSrcweir 	if( sStyleName.getLength() == 0 )
671*cdf0e10cSrcweir 		sStyleName = sDefaultCellStyleName;
672*cdf0e10cSrcweir 
673*cdf0e10cSrcweir 	if( sStyleName.getLength() )
674*cdf0e10cSrcweir 	{
675*cdf0e10cSrcweir 		SvXMLStylesContext * pAutoStyles = GetImport().GetShapeImport()->GetAutoStylesContext();
676*cdf0e10cSrcweir 		if( pAutoStyles )
677*cdf0e10cSrcweir 		{
678*cdf0e10cSrcweir 			const XMLPropStyleContext* pStyle =
679*cdf0e10cSrcweir 				dynamic_cast< const XMLPropStyleContext* >(
680*cdf0e10cSrcweir 					pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_TABLE_CELL, sStyleName) );
681*cdf0e10cSrcweir 
682*cdf0e10cSrcweir 			if( pStyle )
683*cdf0e10cSrcweir 			{
684*cdf0e10cSrcweir 				Reference< XPropertySet > xCellSet( mxCell, UNO_QUERY );
685*cdf0e10cSrcweir 				if( xCellSet.is() )
686*cdf0e10cSrcweir 					const_cast< XMLPropStyleContext* >( pStyle )->FillPropertySet( xCellSet );
687*cdf0e10cSrcweir 			}
688*cdf0e10cSrcweir 		}
689*cdf0e10cSrcweir 	}
690*cdf0e10cSrcweir }
691*cdf0e10cSrcweir 
692*cdf0e10cSrcweir // --------------------------------------------------------------------
693*cdf0e10cSrcweir 
694*cdf0e10cSrcweir XMLCellImportContext::~XMLCellImportContext()
695*cdf0e10cSrcweir {
696*cdf0e10cSrcweir }
697*cdf0e10cSrcweir 
698*cdf0e10cSrcweir // --------------------------------------------------------------------
699*cdf0e10cSrcweir 
700*cdf0e10cSrcweir SvXMLImportContext * XMLCellImportContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList )
701*cdf0e10cSrcweir {
702*cdf0e10cSrcweir 	// create text cursor on demand
703*cdf0e10cSrcweir 	if( !mxCursor.is() )
704*cdf0e10cSrcweir 	{
705*cdf0e10cSrcweir 		Reference< XText > xText( mxCell, UNO_QUERY );
706*cdf0e10cSrcweir 		if( xText.is() )
707*cdf0e10cSrcweir 		{
708*cdf0e10cSrcweir 			UniReference < XMLTextImportHelper > xTxtImport( GetImport().GetTextImport() );
709*cdf0e10cSrcweir 			mxOldCursor = xTxtImport->GetCursor();
710*cdf0e10cSrcweir 			mxCursor = xText->createTextCursor();
711*cdf0e10cSrcweir 			if( mxCursor.is() )
712*cdf0e10cSrcweir 				xTxtImport->SetCursor( mxCursor );
713*cdf0e10cSrcweir 
714*cdf0e10cSrcweir 			// remember old list item and block (#91964#) and reset them
715*cdf0e10cSrcweir 			// for the text frame
716*cdf0e10cSrcweir             xTxtImport->PushListContext();
717*cdf0e10cSrcweir             mbListContextPushed = true;
718*cdf0e10cSrcweir 		}
719*cdf0e10cSrcweir 	}
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir 	SvXMLImportContext * pContext = 0;
722*cdf0e10cSrcweir 
723*cdf0e10cSrcweir 	// if we have a text cursor, lets  try to import some text
724*cdf0e10cSrcweir 	if( mxCursor.is() )
725*cdf0e10cSrcweir 	{
726*cdf0e10cSrcweir 		pContext = GetImport().GetTextImport()->CreateTextChildContext( GetImport(), nPrefix, rLocalName, xAttrList );
727*cdf0e10cSrcweir 	}
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir 	if( pContext )
730*cdf0e10cSrcweir 		return pContext;
731*cdf0e10cSrcweir 	else
732*cdf0e10cSrcweir 		return SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList);
733*cdf0e10cSrcweir }
734*cdf0e10cSrcweir 
735*cdf0e10cSrcweir // --------------------------------------------------------------------
736*cdf0e10cSrcweir 
737*cdf0e10cSrcweir // --------------------------------------------------------------------
738*cdf0e10cSrcweir 
739*cdf0e10cSrcweir void XMLCellImportContext::EndElement()
740*cdf0e10cSrcweir {
741*cdf0e10cSrcweir 	if(mxCursor.is())
742*cdf0e10cSrcweir 	{
743*cdf0e10cSrcweir 		// delete addition newline
744*cdf0e10cSrcweir 		const OUString aEmpty;
745*cdf0e10cSrcweir 		mxCursor->gotoEnd( sal_False );
746*cdf0e10cSrcweir 		mxCursor->goLeft( 1, sal_True );
747*cdf0e10cSrcweir 		mxCursor->setString( aEmpty );
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir 		// reset cursor
750*cdf0e10cSrcweir 		GetImport().GetTextImport()->ResetCursor();
751*cdf0e10cSrcweir 	}
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir 	if(mxOldCursor.is())
754*cdf0e10cSrcweir 		GetImport().GetTextImport()->SetCursor( mxOldCursor );
755*cdf0e10cSrcweir 
756*cdf0e10cSrcweir     // reinstall old list item (if necessary) #91964#
757*cdf0e10cSrcweir     if (mbListContextPushed) {
758*cdf0e10cSrcweir         GetImport().GetTextImport()->PopListContext();
759*cdf0e10cSrcweir     }
760*cdf0e10cSrcweir }
761*cdf0e10cSrcweir 
762*cdf0e10cSrcweir // --------------------------------------------------------------------
763*cdf0e10cSrcweir // class XMLTableTemplateContext
764*cdf0e10cSrcweir // --------------------------------------------------------------------
765*cdf0e10cSrcweir 
766*cdf0e10cSrcweir XMLTableTemplateContext::XMLTableTemplateContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const Reference< XAttributeList >& xAttrList )
767*cdf0e10cSrcweir : SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_TABLE_TEMPLATE_ID, sal_False )
768*cdf0e10cSrcweir {
769*cdf0e10cSrcweir }
770*cdf0e10cSrcweir 
771*cdf0e10cSrcweir // --------------------------------------------------------------------
772*cdf0e10cSrcweir 
773*cdf0e10cSrcweir void XMLTableTemplateContext::StartElement( const Reference< XAttributeList >& xAttrList )
774*cdf0e10cSrcweir {
775*cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
776*cdf0e10cSrcweir 	for(sal_Int16 i=0; i < nAttrCount; i++)
777*cdf0e10cSrcweir 	{
778*cdf0e10cSrcweir 		OUString sAttrName;
779*cdf0e10cSrcweir 		sal_uInt16 nAttrPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( i ), &sAttrName );
780*cdf0e10cSrcweir 		if( (nAttrPrefix == XML_NAMESPACE_TEXT ) && IsXMLToken( sAttrName, XML_STYLE_NAME ) )
781*cdf0e10cSrcweir 		{
782*cdf0e10cSrcweir 			msTemplateStyleName = xAttrList->getValueByIndex( i );
783*cdf0e10cSrcweir 			break;
784*cdf0e10cSrcweir 		}
785*cdf0e10cSrcweir 	}
786*cdf0e10cSrcweir }
787*cdf0e10cSrcweir 
788*cdf0e10cSrcweir // --------------------------------------------------------------------
789*cdf0e10cSrcweir 
790*cdf0e10cSrcweir void XMLTableTemplateContext::EndElement()
791*cdf0e10cSrcweir {
792*cdf0e10cSrcweir 	rtl::Reference< XMLTableImport > xTableImport( GetImport().GetShapeImport()->GetShapeTableImport() );
793*cdf0e10cSrcweir 	if( xTableImport.is() )
794*cdf0e10cSrcweir 		xTableImport->addTableTemplate( msTemplateStyleName, maTableTemplate );
795*cdf0e10cSrcweir }
796*cdf0e10cSrcweir 
797*cdf0e10cSrcweir // --------------------------------------------------------------------
798*cdf0e10cSrcweir 
799*cdf0e10cSrcweir SvXMLImportContext * XMLTableTemplateContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList )
800*cdf0e10cSrcweir {
801*cdf0e10cSrcweir 	if( nPrefix == XML_NAMESPACE_TABLE )
802*cdf0e10cSrcweir 	{
803*cdf0e10cSrcweir 		const TableStyleElement* pElements = getTableStyleMap();
804*cdf0e10cSrcweir 		while( (pElements->meElement != XML_TOKEN_END) && !IsXMLToken( rLocalName, pElements->meElement ) )
805*cdf0e10cSrcweir 			pElements++;
806*cdf0e10cSrcweir 
807*cdf0e10cSrcweir 		if( pElements->meElement != XML_TOKEN_END )
808*cdf0e10cSrcweir 		{
809*cdf0e10cSrcweir 			sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
810*cdf0e10cSrcweir 			for(sal_Int16 i=0; i < nAttrCount; i++)
811*cdf0e10cSrcweir 			{
812*cdf0e10cSrcweir 				OUString sAttrName;
813*cdf0e10cSrcweir 				sal_uInt16 nAttrPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( i ), &sAttrName );
814*cdf0e10cSrcweir 				if( (nAttrPrefix == XML_NAMESPACE_TEXT) && IsXMLToken( sAttrName, XML_STYLE_NAME ) )
815*cdf0e10cSrcweir 				{
816*cdf0e10cSrcweir 					maTableTemplate[pElements->msStyleName] = xAttrList->getValueByIndex( i );
817*cdf0e10cSrcweir 					break;
818*cdf0e10cSrcweir 				}
819*cdf0e10cSrcweir 			}
820*cdf0e10cSrcweir 		}
821*cdf0e10cSrcweir 	}
822*cdf0e10cSrcweir 
823*cdf0e10cSrcweir 	return SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
824*cdf0e10cSrcweir }
825*cdf0e10cSrcweir 
826*cdf0e10cSrcweir // --------------------------------------------------------------------
827