1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski #include "layerexport.hxx"
29*b1cdbd2cSJim Jagielski #include "strings.hxx"
30*b1cdbd2cSJim Jagielski #include <xmloff/xmlexp.hxx>
31*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
32*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
33*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
34*b1cdbd2cSJim Jagielski #include <xmloff/xmlprmap.hxx>
35*b1cdbd2cSJim Jagielski #include <xmloff/prhdlfac.hxx>
36*b1cdbd2cSJim Jagielski #include "elementexport.hxx"
37*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx>
38*b1cdbd2cSJim Jagielski #include <xmloff/contextid.hxx>
39*b1cdbd2cSJim Jagielski #include <xmloff/controlpropertyhdl.hxx>
40*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
41*b1cdbd2cSJim Jagielski #include "controlpropertymap.hxx"
42*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XFormsSupplier2.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/xforms/XFormsSupplier.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/script/XEventAttacherManager.hpp>
49*b1cdbd2cSJim Jagielski #include "eventexport.hxx"
50*b1cdbd2cSJim Jagielski #include <xmloff/XMLEventExport.hxx>
51*b1cdbd2cSJim Jagielski #include "formevents.hxx"
52*b1cdbd2cSJim Jagielski #include <xmloff/xmlnumfe.hxx>
53*b1cdbd2cSJim Jagielski #include "xmloff/xformsexport.hxx"
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
56*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
57*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski #include <numeric>
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski //.........................................................................
62*b1cdbd2cSJim Jagielski namespace xmloff
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski //.........................................................................
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::uno;
67*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::awt;
68*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::lang;
69*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::beans;
70*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::container;
71*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::drawing;
72*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::form;
73*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::script;
74*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::util;
75*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::text;
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski     typedef ::com::sun::star::xforms::XFormsSupplier XXFormsSupplier;
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 	//=====================================================================
80*b1cdbd2cSJim Jagielski 	//= OFormLayerXMLExport_Impl
81*b1cdbd2cSJim Jagielski 	//=====================================================================
82*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getControlNumberStyleNamePrefix()83*b1cdbd2cSJim Jagielski 	const ::rtl::OUString& OFormLayerXMLExport_Impl::getControlNumberStyleNamePrefix()
84*b1cdbd2cSJim Jagielski 	{
85*b1cdbd2cSJim Jagielski 		static const ::rtl::OUString s_sControlNumberStyleNamePrefix = ::rtl::OUString::createFromAscii("C");
86*b1cdbd2cSJim Jagielski 		return s_sControlNumberStyleNamePrefix;
87*b1cdbd2cSJim Jagielski 	}
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
OFormLayerXMLExport_Impl(SvXMLExport & _rContext)90*b1cdbd2cSJim Jagielski 	OFormLayerXMLExport_Impl::OFormLayerXMLExport_Impl(SvXMLExport& _rContext)
91*b1cdbd2cSJim Jagielski 		:m_rContext(_rContext)
92*b1cdbd2cSJim Jagielski 		,m_pControlNumberStyles(NULL)
93*b1cdbd2cSJim Jagielski 	{
94*b1cdbd2cSJim Jagielski 		initializePropertyMaps();
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 		// add our style family to the export context's style pool
97*b1cdbd2cSJim Jagielski 		m_xPropertyHandlerFactory = new OControlPropertyHandlerFactory();
98*b1cdbd2cSJim Jagielski 		::vos::ORef< XMLPropertySetMapper > xStylePropertiesMapper = new XMLPropertySetMapper( getControlStylePropertyMap(), m_xPropertyHandlerFactory.getBodyPtr() );
99*b1cdbd2cSJim Jagielski 		m_xStyleExportMapper = new OFormComponentStyleExportMapper( xStylePropertiesMapper.getBodyPtr() );
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 		// our style family
102*b1cdbd2cSJim Jagielski 		m_rContext.GetAutoStylePool()->AddFamily(
103*b1cdbd2cSJim Jagielski 			XML_STYLE_FAMILY_CONTROL_ID, token::GetXMLToken(token::XML_PARAGRAPH),
104*b1cdbd2cSJim Jagielski 			m_xStyleExportMapper.getBodyPtr(),
105*b1cdbd2cSJim Jagielski 			::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XML_STYLE_FAMILY_CONTROL_PREFIX) )
106*b1cdbd2cSJim Jagielski 		);
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 		// add our event translation table
109*b1cdbd2cSJim Jagielski 		m_rContext.GetEventExport().AddTranslationTable(g_pFormsEventTranslation);
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 		clear();
112*b1cdbd2cSJim Jagielski 	}
113*b1cdbd2cSJim Jagielski 
~OFormLayerXMLExport_Impl()114*b1cdbd2cSJim Jagielski 	OFormLayerXMLExport_Impl::~OFormLayerXMLExport_Impl()
115*b1cdbd2cSJim Jagielski 	{
116*b1cdbd2cSJim Jagielski 	}
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
impl_isFormPageContainingForms(const Reference<XDrawPage> & _rxDrawPage,Reference<XIndexAccess> & _rxForms)119*b1cdbd2cSJim Jagielski 	sal_Bool OFormLayerXMLExport_Impl::impl_isFormPageContainingForms(const Reference< XDrawPage >& _rxDrawPage, Reference< XIndexAccess >& _rxForms)
120*b1cdbd2cSJim Jagielski 	{
121*b1cdbd2cSJim Jagielski 		Reference< XFormsSupplier2 > xFormsSupp(_rxDrawPage, UNO_QUERY);
122*b1cdbd2cSJim Jagielski 		OSL_ENSURE(xFormsSupp.is(), "OFormLayerXMLExport_Impl::impl_isFormPageContainingForms: invalid draw page (no XFormsSupplier)! Doin' nothing!");
123*b1cdbd2cSJim Jagielski 		if (!xFormsSupp.is())
124*b1cdbd2cSJim Jagielski 			return sal_False;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski         if ( !xFormsSupp->hasForms() )
127*b1cdbd2cSJim Jagielski             // nothing to do at all
128*b1cdbd2cSJim Jagielski             return sal_False;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 		_rxForms = Reference< XIndexAccess >(xFormsSupp->getForms(), UNO_QUERY);
131*b1cdbd2cSJim Jagielski 		Reference< XServiceInfo > xSI(_rxForms, UNO_QUERY);	// order is important!
132*b1cdbd2cSJim Jagielski 		OSL_ENSURE(xSI.is(), "OFormLayerXMLExport_Impl::impl_isFormPageContainingForms: invalid collection (must not be NULL and must have a ServiceInfo)!");
133*b1cdbd2cSJim Jagielski 		if (!xSI.is())
134*b1cdbd2cSJim Jagielski 			return sal_False;
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 		if (!xSI->supportsService(SERVICE_FORMSCOLLECTION))
137*b1cdbd2cSJim Jagielski 		{
138*b1cdbd2cSJim Jagielski 			OSL_ENSURE(sal_False, "OFormLayerXMLExport_Impl::impl_isFormPageContainingForms: invalid collection (is no com.sun.star.form.Forms)!");
139*b1cdbd2cSJim Jagielski 			// nothing to do
140*b1cdbd2cSJim Jagielski 			return sal_False;
141*b1cdbd2cSJim Jagielski 		}
142*b1cdbd2cSJim Jagielski 		return sal_True;
143*b1cdbd2cSJim Jagielski 	}
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportGridColumn(const Reference<XPropertySet> & _rxColumn,const Sequence<ScriptEventDescriptor> & _rEvents)146*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportGridColumn(const Reference< XPropertySet >& _rxColumn,
147*b1cdbd2cSJim Jagielski 		const Sequence< ScriptEventDescriptor >& _rEvents)
148*b1cdbd2cSJim Jagielski 	{
149*b1cdbd2cSJim Jagielski         // do the exporting
150*b1cdbd2cSJim Jagielski 		OColumnExport aExportImpl(*this, _rxColumn, getControlId( _rxColumn ), _rEvents);
151*b1cdbd2cSJim Jagielski 		aExportImpl.doExport();
152*b1cdbd2cSJim Jagielski 	}
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportControl(const Reference<XPropertySet> & _rxControl,const Sequence<ScriptEventDescriptor> & _rEvents)155*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportControl(const Reference< XPropertySet >& _rxControl,
156*b1cdbd2cSJim Jagielski 		const Sequence< ScriptEventDescriptor >& _rEvents)
157*b1cdbd2cSJim Jagielski 	{
158*b1cdbd2cSJim Jagielski 		// the list of the referring controls
159*b1cdbd2cSJim Jagielski 		::rtl::OUString sReferringControls;
160*b1cdbd2cSJim Jagielski         MapPropertySet2String::const_iterator aReferring = m_aCurrentPageReferring->second.find(_rxControl);
161*b1cdbd2cSJim Jagielski 		if (aReferring != m_aCurrentPageReferring->second.end())
162*b1cdbd2cSJim Jagielski 			sReferringControls = aReferring->second;
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 		// the control id (should already have been created in examineForms)
165*b1cdbd2cSJim Jagielski 		::rtl::OUString sControlId( getControlId( _rxControl ) );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 		// do the exporting
168*b1cdbd2cSJim Jagielski 		OControlExport aExportImpl(*this, _rxControl, sControlId, sReferringControls, _rEvents);
169*b1cdbd2cSJim Jagielski 		aExportImpl.doExport();
170*b1cdbd2cSJim Jagielski 	}
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportForm(const Reference<XPropertySet> & _rxProps,const Sequence<ScriptEventDescriptor> & _rEvents)173*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportForm(const Reference< XPropertySet >& _rxProps,
174*b1cdbd2cSJim Jagielski 		const Sequence< ScriptEventDescriptor >& _rEvents)
175*b1cdbd2cSJim Jagielski 	{
176*b1cdbd2cSJim Jagielski 		OSL_ENSURE(_rxProps.is(), "OFormLayerXMLExport_Impl::exportForm: invalid property set!");
177*b1cdbd2cSJim Jagielski 		OFormExport aAttributeHandler(*this, _rxProps, _rEvents);
178*b1cdbd2cSJim Jagielski 		aAttributeHandler.doExport();
179*b1cdbd2cSJim Jagielski 	}
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getStylePropertyMapper()182*b1cdbd2cSJim Jagielski 	::vos::ORef< SvXMLExportPropertyMapper > OFormLayerXMLExport_Impl::getStylePropertyMapper()
183*b1cdbd2cSJim Jagielski 	{
184*b1cdbd2cSJim Jagielski 		return m_xStyleExportMapper;
185*b1cdbd2cSJim Jagielski 	}
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getGlobalContext()188*b1cdbd2cSJim Jagielski 	SvXMLExport& OFormLayerXMLExport_Impl::getGlobalContext()
189*b1cdbd2cSJim Jagielski 	{
190*b1cdbd2cSJim Jagielski 		return m_rContext;
191*b1cdbd2cSJim Jagielski 	}
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportCollectionElements(const Reference<XIndexAccess> & _rxCollection)194*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportCollectionElements(const Reference< XIndexAccess >& _rxCollection)
195*b1cdbd2cSJim Jagielski 	{
196*b1cdbd2cSJim Jagielski 		// step through all the elements of the collection
197*b1cdbd2cSJim Jagielski 		sal_Int32 nElements = _rxCollection->getCount();
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 		Reference< XEventAttacherManager > xElementEventManager(_rxCollection, UNO_QUERY);
200*b1cdbd2cSJim Jagielski 		Sequence< ScriptEventDescriptor > aElementEvents;
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski 		Reference< XPropertySetInfo > xPropsInfo;
203*b1cdbd2cSJim Jagielski 		Reference< XIndexAccess > xCurrentContainer;
204*b1cdbd2cSJim Jagielski 		for (sal_Int32 i=0; i<nElements; ++i)
205*b1cdbd2cSJim Jagielski 		{
206*b1cdbd2cSJim Jagielski 			try
207*b1cdbd2cSJim Jagielski 			{
208*b1cdbd2cSJim Jagielski 				// extract the current element
209*b1cdbd2cSJim Jagielski 		        Reference< XPropertySet > xCurrentProps( _rxCollection->getByIndex(i), UNO_QUERY );
210*b1cdbd2cSJim Jagielski 				OSL_ENSURE(xCurrentProps.is(), "OFormLayerXMLExport_Impl::exportCollectionElements: invalid child element, skipping!");
211*b1cdbd2cSJim Jagielski 				if (!xCurrentProps.is())
212*b1cdbd2cSJim Jagielski 					continue;
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 				// check if there is a ClassId property on the current element. If so, we assume it to be a control
215*b1cdbd2cSJim Jagielski 				xPropsInfo = xCurrentProps->getPropertySetInfo();
216*b1cdbd2cSJim Jagielski 				OSL_ENSURE(xPropsInfo.is(), "OFormLayerXMLExport_Impl::exportCollectionElements: no property set info!");
217*b1cdbd2cSJim Jagielski 				if (!xPropsInfo.is())
218*b1cdbd2cSJim Jagielski 					// without this, a lot of stuff in the export routines may fail
219*b1cdbd2cSJim Jagielski 					continue;
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 				// if the element is part of a ignore list, we are not allowed to export it
222*b1cdbd2cSJim Jagielski 				if ( m_aIgnoreList.end() != m_aIgnoreList.find( xCurrentProps ) )
223*b1cdbd2cSJim Jagielski 					continue;
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 				if (xElementEventManager.is())
226*b1cdbd2cSJim Jagielski 					aElementEvents = xElementEventManager->getScriptEvents(i);
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 				if (xPropsInfo->hasPropertyByName(PROPERTY_COLUMNSERVICENAME))
229*b1cdbd2cSJim Jagielski 				{
230*b1cdbd2cSJim Jagielski 					exportGridColumn(xCurrentProps, aElementEvents);
231*b1cdbd2cSJim Jagielski 				}
232*b1cdbd2cSJim Jagielski 				else if (xPropsInfo->hasPropertyByName(PROPERTY_CLASSID))
233*b1cdbd2cSJim Jagielski 				{
234*b1cdbd2cSJim Jagielski 					exportControl(xCurrentProps, aElementEvents);
235*b1cdbd2cSJim Jagielski 				}
236*b1cdbd2cSJim Jagielski 				else
237*b1cdbd2cSJim Jagielski 				{
238*b1cdbd2cSJim Jagielski 					exportForm(xCurrentProps, aElementEvents);
239*b1cdbd2cSJim Jagielski 				}
240*b1cdbd2cSJim Jagielski 			}
241*b1cdbd2cSJim Jagielski 			catch(Exception&)
242*b1cdbd2cSJim Jagielski 			{
243*b1cdbd2cSJim Jagielski 				OSL_ENSURE(sal_False, "OFormLayerXMLExport_Impl::exportCollectionElements: caught an exception ... skipping the current element!");
244*b1cdbd2cSJim Jagielski 				continue;
245*b1cdbd2cSJim Jagielski 			}
246*b1cdbd2cSJim Jagielski 		}
247*b1cdbd2cSJim Jagielski 	}
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getObjectStyleName(const Reference<XPropertySet> & _rxObject)250*b1cdbd2cSJim Jagielski 	::rtl::OUString OFormLayerXMLExport_Impl::getObjectStyleName( const Reference< XPropertySet >& _rxObject )
251*b1cdbd2cSJim Jagielski 	{
252*b1cdbd2cSJim Jagielski 		::rtl::OUString aObjectStyle;
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 		MapPropertySet2String::const_iterator aObjectStylePos = m_aGridColumnStyles.find( _rxObject );
255*b1cdbd2cSJim Jagielski 		if ( m_aGridColumnStyles.end() != aObjectStylePos )
256*b1cdbd2cSJim Jagielski 			aObjectStyle = aObjectStylePos->second;
257*b1cdbd2cSJim Jagielski 		return aObjectStyle;
258*b1cdbd2cSJim Jagielski 	}
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
clear()261*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::clear()
262*b1cdbd2cSJim Jagielski 	{
263*b1cdbd2cSJim Jagielski 		m_aControlIds.clear();
264*b1cdbd2cSJim Jagielski 		m_aReferringControls.clear();
265*b1cdbd2cSJim Jagielski 		m_aCurrentPageIds = m_aControlIds.end();
266*b1cdbd2cSJim Jagielski 		m_aCurrentPageReferring = m_aReferringControls.end();
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski 		m_aControlNumberFormats.clear();
269*b1cdbd2cSJim Jagielski 		m_aGridColumnStyles.clear();
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 		m_aIgnoreList.clear();
272*b1cdbd2cSJim Jagielski 	}
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportControlNumberStyles()275*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportControlNumberStyles()
276*b1cdbd2cSJim Jagielski 	{
277*b1cdbd2cSJim Jagielski 		if (m_pControlNumberStyles)
278*b1cdbd2cSJim Jagielski 			m_pControlNumberStyles->Export(sal_False);
279*b1cdbd2cSJim Jagielski 	}
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportAutoControlNumberStyles()282*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportAutoControlNumberStyles()
283*b1cdbd2cSJim Jagielski 	{
284*b1cdbd2cSJim Jagielski 		if ( m_pControlNumberStyles )
285*b1cdbd2cSJim Jagielski 			m_pControlNumberStyles->Export( sal_True );
286*b1cdbd2cSJim Jagielski 	}
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportAutoStyles()289*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportAutoStyles()
290*b1cdbd2cSJim Jagielski 	{
291*b1cdbd2cSJim Jagielski 		m_rContext.GetAutoStylePool()->exportXML(
292*b1cdbd2cSJim Jagielski 			XML_STYLE_FAMILY_CONTROL_ID,
293*b1cdbd2cSJim Jagielski 			m_rContext.GetDocHandler(),
294*b1cdbd2cSJim Jagielski 			m_rContext.GetMM100UnitConverter(),
295*b1cdbd2cSJim Jagielski 			m_rContext.GetNamespaceMap()
296*b1cdbd2cSJim Jagielski 		);
297*b1cdbd2cSJim Jagielski 	}
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportForms(const Reference<XDrawPage> & _rxDrawPage)300*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportForms(const Reference< XDrawPage >& _rxDrawPage)
301*b1cdbd2cSJim Jagielski 	{
302*b1cdbd2cSJim Jagielski 		// get the forms collection of the page
303*b1cdbd2cSJim Jagielski 		Reference< XIndexAccess > xCollectionIndex;
304*b1cdbd2cSJim Jagielski 		if (!impl_isFormPageContainingForms(_rxDrawPage, xCollectionIndex))
305*b1cdbd2cSJim Jagielski 			return;
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
308*b1cdbd2cSJim Jagielski 		sal_Bool bPageIsKnown =
309*b1cdbd2cSJim Jagielski #endif
310*b1cdbd2cSJim Jagielski 			implMoveIterators(_rxDrawPage, sal_False);
311*b1cdbd2cSJim Jagielski 		OSL_ENSURE(bPageIsKnown, "OFormLayerXMLExport_Impl::exportForms: exporting a page which has not been examined!");
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski         // export forms collection
314*b1cdbd2cSJim Jagielski 		exportCollectionElements(xCollectionIndex);
315*b1cdbd2cSJim Jagielski 	}
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportXForms() const318*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::exportXForms() const
319*b1cdbd2cSJim Jagielski     {
320*b1cdbd2cSJim Jagielski         // export XForms models
321*b1cdbd2cSJim Jagielski         ::exportXForms( m_rContext );
322*b1cdbd2cSJim Jagielski     }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
pageContainsForms(const Reference<XDrawPage> & _rxDrawPage) const325*b1cdbd2cSJim Jagielski 	bool OFormLayerXMLExport_Impl::pageContainsForms( const Reference< XDrawPage >& _rxDrawPage ) const
326*b1cdbd2cSJim Jagielski     {
327*b1cdbd2cSJim Jagielski 		Reference< XFormsSupplier2 > xFormsSupp( _rxDrawPage, UNO_QUERY );
328*b1cdbd2cSJim Jagielski         DBG_ASSERT( xFormsSupp.is(), "OFormLayerXMLExport_Impl::pageContainsForms: no XFormsSupplier2!" );
329*b1cdbd2cSJim Jagielski         return xFormsSupp.is() && xFormsSupp->hasForms();
330*b1cdbd2cSJim Jagielski     }
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
documentContainsXForms() const333*b1cdbd2cSJim Jagielski 	bool OFormLayerXMLExport_Impl::documentContainsXForms() const
334*b1cdbd2cSJim Jagielski     {
335*b1cdbd2cSJim Jagielski         Reference< XXFormsSupplier > xXFormSupp( m_rContext.GetModel(), UNO_QUERY );
336*b1cdbd2cSJim Jagielski         Reference< XNameContainer > xForms;
337*b1cdbd2cSJim Jagielski         if ( xXFormSupp.is() )
338*b1cdbd2cSJim Jagielski             xForms = xXFormSupp->getXForms();
339*b1cdbd2cSJim Jagielski         return xForms.is() && xForms->hasElements();
340*b1cdbd2cSJim Jagielski     }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
implMoveIterators(const Reference<XDrawPage> & _rxDrawPage,sal_Bool _bClear)343*b1cdbd2cSJim Jagielski 	sal_Bool OFormLayerXMLExport_Impl::implMoveIterators(const Reference< XDrawPage >& _rxDrawPage, sal_Bool _bClear)
344*b1cdbd2cSJim Jagielski 	{
345*b1cdbd2cSJim Jagielski 		sal_Bool bKnownPage = sal_False;
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 		// the one for the ids
348*b1cdbd2cSJim Jagielski 		m_aCurrentPageIds = m_aControlIds.find(_rxDrawPage);
349*b1cdbd2cSJim Jagielski 		if (m_aControlIds.end() == m_aCurrentPageIds)
350*b1cdbd2cSJim Jagielski 		{
351*b1cdbd2cSJim Jagielski 			m_aControlIds[_rxDrawPage] = MapPropertySet2String();
352*b1cdbd2cSJim Jagielski 			m_aCurrentPageIds = m_aControlIds.find(_rxDrawPage);
353*b1cdbd2cSJim Jagielski 		}
354*b1cdbd2cSJim Jagielski 		else
355*b1cdbd2cSJim Jagielski 		{
356*b1cdbd2cSJim Jagielski 			bKnownPage = sal_True;
357*b1cdbd2cSJim Jagielski 			if (_bClear && !m_aCurrentPageIds->second.empty() )
358*b1cdbd2cSJim Jagielski 				m_aCurrentPageIds->second.clear();
359*b1cdbd2cSJim Jagielski 		}
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 		// the one for the ids of the referring controls
362*b1cdbd2cSJim Jagielski 		m_aCurrentPageReferring = m_aReferringControls.find(_rxDrawPage);
363*b1cdbd2cSJim Jagielski 		if (m_aReferringControls.end() == m_aCurrentPageReferring)
364*b1cdbd2cSJim Jagielski 		{
365*b1cdbd2cSJim Jagielski 			m_aReferringControls[_rxDrawPage] = MapPropertySet2String();
366*b1cdbd2cSJim Jagielski 			m_aCurrentPageReferring = m_aReferringControls.find(_rxDrawPage);
367*b1cdbd2cSJim Jagielski 		}
368*b1cdbd2cSJim Jagielski 		else
369*b1cdbd2cSJim Jagielski 		{
370*b1cdbd2cSJim Jagielski 			bKnownPage = sal_True;
371*b1cdbd2cSJim Jagielski 			if (_bClear && !m_aCurrentPageReferring->second.empty() )
372*b1cdbd2cSJim Jagielski 				m_aCurrentPageReferring->second.clear();
373*b1cdbd2cSJim Jagielski 		}
374*b1cdbd2cSJim Jagielski 		return bKnownPage;
375*b1cdbd2cSJim Jagielski 	}
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
seekPage(const Reference<XDrawPage> & _rxDrawPage)378*b1cdbd2cSJim Jagielski 	sal_Bool OFormLayerXMLExport_Impl::seekPage(const Reference< XDrawPage >& _rxDrawPage)
379*b1cdbd2cSJim Jagielski 	{
380*b1cdbd2cSJim Jagielski         sal_Bool bKnownPage = implMoveIterators( _rxDrawPage, sal_False );
381*b1cdbd2cSJim Jagielski         if ( bKnownPage )
382*b1cdbd2cSJim Jagielski             return sal_True;
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski         // if the page is not yet known, this does not automatically mean that it has
385*b1cdbd2cSJim Jagielski         // not been examined. Instead, examineForms returns silently and successfully
386*b1cdbd2cSJim Jagielski         // if a page is a XFormsPageSupplier2, but does not have a forms collection
387*b1cdbd2cSJim Jagielski         // (This behaviour of examineForms is a performance optimization, to not force
388*b1cdbd2cSJim Jagielski         // the page to create a forms container just to see that it's empty.)
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski         // So, in such a case, seekPage is considered to be successfull, too, though the
391*b1cdbd2cSJim Jagielski         // page was not yet known
392*b1cdbd2cSJim Jagielski 		Reference< XFormsSupplier2 > xFormsSupp( _rxDrawPage, UNO_QUERY );
393*b1cdbd2cSJim Jagielski         if ( xFormsSupp.is() && !xFormsSupp->hasForms() )
394*b1cdbd2cSJim Jagielski             return sal_True;
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski         // anything else means that the page has not been examined before, or it's no
397*b1cdbd2cSJim Jagielski         // valid form page. Both cases are Bad (TM).
398*b1cdbd2cSJim Jagielski         return sal_False;
399*b1cdbd2cSJim Jagielski 	}
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getControlId(const Reference<XPropertySet> & _rxControl)402*b1cdbd2cSJim Jagielski 	::rtl::OUString OFormLayerXMLExport_Impl::getControlId(const Reference< XPropertySet >& _rxControl)
403*b1cdbd2cSJim Jagielski 	{
404*b1cdbd2cSJim Jagielski 		OSL_ENSURE(m_aCurrentPageIds != m_aControlIds.end(), "OFormLayerXMLExport_Impl::getControlId: invalid current page!");
405*b1cdbd2cSJim Jagielski 		OSL_ENSURE(m_aCurrentPageIds->second.end() != m_aCurrentPageIds->second.find(_rxControl),
406*b1cdbd2cSJim Jagielski 			"OFormLayerXMLExport_Impl::getControlId: can not find the control!");
407*b1cdbd2cSJim Jagielski 		return m_aCurrentPageIds->second[_rxControl];
408*b1cdbd2cSJim Jagielski 	}
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getImmediateNumberStyle(const Reference<XPropertySet> & _rxObject)411*b1cdbd2cSJim Jagielski 	::rtl::OUString OFormLayerXMLExport_Impl::getImmediateNumberStyle( const Reference< XPropertySet >& _rxObject )
412*b1cdbd2cSJim Jagielski 	{
413*b1cdbd2cSJim Jagielski 		::rtl::OUString sNumberStyle;
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 		sal_Int32 nOwnFormatKey = implExamineControlNumberFormat( _rxObject );
416*b1cdbd2cSJim Jagielski 		if ( -1 != nOwnFormatKey )
417*b1cdbd2cSJim Jagielski 			sNumberStyle = getControlNumberStyleExport()->GetStyleName( nOwnFormatKey );
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 		return sNumberStyle;
420*b1cdbd2cSJim Jagielski 	}
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getControlNumberStyle(const Reference<XPropertySet> & _rxControl)423*b1cdbd2cSJim Jagielski 	::rtl::OUString OFormLayerXMLExport_Impl::getControlNumberStyle( const Reference< XPropertySet >& _rxControl )
424*b1cdbd2cSJim Jagielski 	{
425*b1cdbd2cSJim Jagielski 		::rtl::OUString sNumberStyle;
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 		ConstMapPropertySet2IntIterator aControlFormatPos = m_aControlNumberFormats.find(_rxControl);
428*b1cdbd2cSJim Jagielski 		if (m_aControlNumberFormats.end() != aControlFormatPos)
429*b1cdbd2cSJim Jagielski 		{
430*b1cdbd2cSJim Jagielski 			OSL_ENSURE(m_pControlNumberStyles, "OFormLayerXMLExport_Impl::getControlNumberStyle: have a control which has a format style, but no style exporter!");
431*b1cdbd2cSJim Jagielski 			sNumberStyle = getControlNumberStyleExport()->GetStyleName(aControlFormatPos->second);
432*b1cdbd2cSJim Jagielski 		}
433*b1cdbd2cSJim Jagielski 		// it's allowed to ask for a control which does not have format information.
434*b1cdbd2cSJim Jagielski 		// (This is for performance reasons)
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 		return sNumberStyle;
437*b1cdbd2cSJim Jagielski 	}
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
examineForms(const Reference<XDrawPage> & _rxDrawPage)440*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::examineForms(const Reference< XDrawPage >& _rxDrawPage)
441*b1cdbd2cSJim Jagielski 	{
442*b1cdbd2cSJim Jagielski 		// get the forms collection of the page
443*b1cdbd2cSJim Jagielski 		Reference< XIndexAccess > xCollectionIndex;
444*b1cdbd2cSJim Jagielski 		if (!impl_isFormPageContainingForms(_rxDrawPage, xCollectionIndex))
445*b1cdbd2cSJim Jagielski 			return;
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski 		// move the iterator which specify the currently handled page
448*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
449*b1cdbd2cSJim Jagielski 		sal_Bool bPageIsKnown =
450*b1cdbd2cSJim Jagielski #endif
451*b1cdbd2cSJim Jagielski 			implMoveIterators(_rxDrawPage, sal_True);
452*b1cdbd2cSJim Jagielski 		OSL_ENSURE(!bPageIsKnown, "OFormLayerXMLExport_Impl::examineForms: examining a page twice!");
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski 		::std::stack< Reference< XIndexAccess > >	aContainerHistory;
455*b1cdbd2cSJim Jagielski 		::std::stack< sal_Int32 >					aIndexHistory;
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 		Reference< XIndexAccess > xLoop = xCollectionIndex;
458*b1cdbd2cSJim Jagielski 		sal_Int32 nChildPos = 0;
459*b1cdbd2cSJim Jagielski 		do
460*b1cdbd2cSJim Jagielski 		{
461*b1cdbd2cSJim Jagielski 			if (nChildPos < xLoop->getCount())
462*b1cdbd2cSJim Jagielski 			{
463*b1cdbd2cSJim Jagielski 		        Reference< XPropertySet	> xCurrent( xLoop->getByIndex( nChildPos ), UNO_QUERY );
464*b1cdbd2cSJim Jagielski 				OSL_ENSURE(xCurrent.is(), "OFormLayerXMLExport_Impl::examineForms: invalid child object");
465*b1cdbd2cSJim Jagielski 				if (!xCurrent.is())
466*b1cdbd2cSJim Jagielski 					continue;
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 				if (!checkExamineControl(xCurrent))
469*b1cdbd2cSJim Jagielski 				{
470*b1cdbd2cSJim Jagielski 					// step down
471*b1cdbd2cSJim Jagielski 					Reference< XIndexAccess > xNextContainer(xCurrent, UNO_QUERY);
472*b1cdbd2cSJim Jagielski 					OSL_ENSURE(xNextContainer.is(), "OFormLayerXMLExport_Impl::examineForms: what the heck is this ... no control, no container?");
473*b1cdbd2cSJim Jagielski 					aContainerHistory.push(xLoop);
474*b1cdbd2cSJim Jagielski 					aIndexHistory.push(nChildPos);
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski 					xLoop = xNextContainer;
477*b1cdbd2cSJim Jagielski 					nChildPos = -1;	// will be incremented below
478*b1cdbd2cSJim Jagielski 				}
479*b1cdbd2cSJim Jagielski 				++nChildPos;
480*b1cdbd2cSJim Jagielski 			}
481*b1cdbd2cSJim Jagielski 			else
482*b1cdbd2cSJim Jagielski 			{
483*b1cdbd2cSJim Jagielski 				// step up
484*b1cdbd2cSJim Jagielski 				while ((nChildPos >= xLoop->getCount()) && !aContainerHistory.empty() )
485*b1cdbd2cSJim Jagielski 				{
486*b1cdbd2cSJim Jagielski 					xLoop = aContainerHistory.top();
487*b1cdbd2cSJim Jagielski 					aContainerHistory.pop();
488*b1cdbd2cSJim Jagielski 					nChildPos = aIndexHistory.top();
489*b1cdbd2cSJim Jagielski 					aIndexHistory.pop();
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski 					++nChildPos;
492*b1cdbd2cSJim Jagielski 				}
493*b1cdbd2cSJim Jagielski 				if (nChildPos >= xLoop->getCount())
494*b1cdbd2cSJim Jagielski 					// exited the loop above because we have no history anymore (0 == aContainerHistory.size()),
495*b1cdbd2cSJim Jagielski 					// and on the current level there are no more children
496*b1cdbd2cSJim Jagielski 					// -> leave
497*b1cdbd2cSJim Jagielski 					break;
498*b1cdbd2cSJim Jagielski 			}
499*b1cdbd2cSJim Jagielski 		}
500*b1cdbd2cSJim Jagielski 		while (xLoop.is());
501*b1cdbd2cSJim Jagielski 	}
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
504*b1cdbd2cSJim Jagielski     namespace
505*b1cdbd2cSJim Jagielski     {
506*b1cdbd2cSJim Jagielski         struct AccumulateSize : public ::std::binary_function< size_t, MapPropertySet2Map::value_type, size_t >
507*b1cdbd2cSJim Jagielski         {
operator ()xmloff::__anon2accfe500111::AccumulateSize508*b1cdbd2cSJim Jagielski             size_t operator()( size_t _size, const MapPropertySet2Map::value_type& _map ) const
509*b1cdbd2cSJim Jagielski             {
510*b1cdbd2cSJim Jagielski                 return _size + _map.second.size();
511*b1cdbd2cSJim Jagielski             }
512*b1cdbd2cSJim Jagielski         };
513*b1cdbd2cSJim Jagielski 
lcl_findFreeControlId(const MapPropertySet2Map & _rAllPagesControlIds)514*b1cdbd2cSJim Jagielski         ::rtl::OUString lcl_findFreeControlId( const MapPropertySet2Map& _rAllPagesControlIds )
515*b1cdbd2cSJim Jagielski         {
516*b1cdbd2cSJim Jagielski 		    static const ::rtl::OUString sControlIdBase( RTL_CONSTASCII_USTRINGPARAM( "control" ) );
517*b1cdbd2cSJim Jagielski 			::rtl::OUString sControlId = sControlIdBase;
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski             size_t nKnownControlCount = ::std::accumulate( _rAllPagesControlIds.begin(), _rAllPagesControlIds.end(), (size_t)0, AccumulateSize() );
520*b1cdbd2cSJim Jagielski             sControlId += ::rtl::OUString::valueOf( (sal_Int32)nKnownControlCount + 1 );
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski         #ifdef DBG_UTIL
523*b1cdbd2cSJim Jagielski 			// Check if the id is already used. It shouldn't, as we currently have no mechanism for removing entries
524*b1cdbd2cSJim Jagielski 			// from the map, so the approach used above (take the accumulated map size) should be sufficient. But if
525*b1cdbd2cSJim Jagielski             // somebody changes this (e.g. allows removing entries from the map), the assertion below probably will fail.
526*b1cdbd2cSJim Jagielski             for (   MapPropertySet2Map::const_iterator outer = _rAllPagesControlIds.begin();
527*b1cdbd2cSJim Jagielski                     outer != _rAllPagesControlIds.end();
528*b1cdbd2cSJim Jagielski                     ++outer
529*b1cdbd2cSJim Jagielski                 )
530*b1cdbd2cSJim Jagielski                 for (   MapPropertySet2String::const_iterator inner = outer->second.begin();
531*b1cdbd2cSJim Jagielski                         inner != outer->second.end();
532*b1cdbd2cSJim Jagielski                         ++inner
533*b1cdbd2cSJim Jagielski                     )
534*b1cdbd2cSJim Jagielski                 {
535*b1cdbd2cSJim Jagielski 				    OSL_ENSURE( inner->second != sControlId,
536*b1cdbd2cSJim Jagielski 					    "lcl_findFreeControlId: auto-generated control ID is already used!" );
537*b1cdbd2cSJim Jagielski                 }
538*b1cdbd2cSJim Jagielski 		#endif
539*b1cdbd2cSJim Jagielski             return sControlId;
540*b1cdbd2cSJim Jagielski         }
541*b1cdbd2cSJim Jagielski     }
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
checkExamineControl(const Reference<XPropertySet> & _rxObject)544*b1cdbd2cSJim Jagielski 	sal_Bool OFormLayerXMLExport_Impl::checkExamineControl(const Reference< XPropertySet >& _rxObject)
545*b1cdbd2cSJim Jagielski 	{
546*b1cdbd2cSJim Jagielski 		Reference< XPropertySetInfo > xCurrentInfo = _rxObject->getPropertySetInfo();
547*b1cdbd2cSJim Jagielski 		OSL_ENSURE(xCurrentInfo.is(), "OFormLayerXMLExport_Impl::checkExamineControl: no property set info");
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski 		sal_Bool bIsControl = xCurrentInfo->hasPropertyByName( PROPERTY_CLASSID );
550*b1cdbd2cSJim Jagielski 		if (bIsControl)
551*b1cdbd2cSJim Jagielski 		{
552*b1cdbd2cSJim Jagielski 			// ----------------------------------
553*b1cdbd2cSJim Jagielski 			// generate a new control id
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 			// find a free id
556*b1cdbd2cSJim Jagielski 			::rtl::OUString sCurrentId = lcl_findFreeControlId( m_aControlIds );
557*b1cdbd2cSJim Jagielski 			// add it to the map
558*b1cdbd2cSJim Jagielski 			m_aCurrentPageIds->second[_rxObject] = sCurrentId;
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 			// ----------------------------------
561*b1cdbd2cSJim Jagielski 			// check if this control has a "LabelControl" property referring another control
562*b1cdbd2cSJim Jagielski 			if ( xCurrentInfo->hasPropertyByName( PROPERTY_CONTROLLABEL ) )
563*b1cdbd2cSJim Jagielski 			{
564*b1cdbd2cSJim Jagielski 				Reference< XPropertySet > xCurrentReference( _rxObject->getPropertyValue( PROPERTY_CONTROLLABEL ), UNO_QUERY );
565*b1cdbd2cSJim Jagielski 				if (xCurrentReference.is())
566*b1cdbd2cSJim Jagielski 				{
567*b1cdbd2cSJim Jagielski 					::rtl::OUString& sReferencedBy = m_aCurrentPageReferring->second[xCurrentReference];
568*b1cdbd2cSJim Jagielski 					if (sReferencedBy.getLength())
569*b1cdbd2cSJim Jagielski 						// it's not the first _rxObject referring to the xCurrentReference
570*b1cdbd2cSJim Jagielski 						// -> separate the id
571*b1cdbd2cSJim Jagielski 						sReferencedBy += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(","));
572*b1cdbd2cSJim Jagielski 					sReferencedBy += sCurrentId;
573*b1cdbd2cSJim Jagielski 				}
574*b1cdbd2cSJim Jagielski 			}
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 			// ----------------------------------
577*b1cdbd2cSJim Jagielski 			// check if the control needs a number format style
578*b1cdbd2cSJim Jagielski 			if ( xCurrentInfo->hasPropertyByName( PROPERTY_FORMATKEY ) )
579*b1cdbd2cSJim Jagielski 			{
580*b1cdbd2cSJim Jagielski 				examineControlNumberFormat(_rxObject);
581*b1cdbd2cSJim Jagielski 			}
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 			// ----------------------------------
584*b1cdbd2cSJim Jagielski             // check if it's a control providing text
585*b1cdbd2cSJim Jagielski             Reference< XText > xControlText( _rxObject, UNO_QUERY );
586*b1cdbd2cSJim Jagielski             if ( xControlText.is() )
587*b1cdbd2cSJim Jagielski             {
588*b1cdbd2cSJim Jagielski 				m_rContext.GetTextParagraphExport()->collectTextAutoStyles( xControlText );
589*b1cdbd2cSJim Jagielski             }
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski 			// ----------------------------------
592*b1cdbd2cSJim Jagielski 			// check if it is a grid control - in this case, we need special handling for the columns
593*b1cdbd2cSJim Jagielski 			sal_Int16 nControlType = FormComponentType::CONTROL;
594*b1cdbd2cSJim Jagielski 			_rxObject->getPropertyValue( PROPERTY_CLASSID ) >>= nControlType;
595*b1cdbd2cSJim Jagielski 			if ( FormComponentType::GRIDCONTROL == nControlType )
596*b1cdbd2cSJim Jagielski 			{
597*b1cdbd2cSJim Jagielski 				collectGridColumnStylesAndIds( _rxObject );
598*b1cdbd2cSJim Jagielski 			}
599*b1cdbd2cSJim Jagielski 		}
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski 		return bIsControl;
602*b1cdbd2cSJim Jagielski 	}
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
collectGridColumnStylesAndIds(const Reference<XPropertySet> & _rxControl)605*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds( const Reference< XPropertySet >& _rxControl )
606*b1cdbd2cSJim Jagielski 	{
607*b1cdbd2cSJim Jagielski 		// loop through all columns of the grid
608*b1cdbd2cSJim Jagielski 		try
609*b1cdbd2cSJim Jagielski 		{
610*b1cdbd2cSJim Jagielski 			Reference< XIndexAccess > xContainer( _rxControl, UNO_QUERY );
611*b1cdbd2cSJim Jagielski 			OSL_ENSURE( xContainer.is(), "OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds: grid control not being a container?!" );
612*b1cdbd2cSJim Jagielski             if ( !xContainer.is() )
613*b1cdbd2cSJim Jagielski                 return;
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski 			Reference< XPropertySetInfo > xColumnPropertiesMeta;
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski 			sal_Int32 nCount = xContainer->getCount();
618*b1cdbd2cSJim Jagielski 			for ( sal_Int32 i=0; i<nCount; ++i )
619*b1cdbd2cSJim Jagielski 			{
620*b1cdbd2cSJim Jagielski                 Reference< XPropertySet > xColumnProperties( xContainer->getByIndex( i ), UNO_QUERY );
621*b1cdbd2cSJim Jagielski                 OSL_ENSURE( xColumnProperties.is(), "OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds: invalid grid column encountered!" );
622*b1cdbd2cSJim Jagielski                 if ( !xColumnProperties.is() )
623*b1cdbd2cSJim Jagielski                     continue;
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 			    // ----------------------------------
626*b1cdbd2cSJim Jagielski 			    // generate a new control id
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski 			    // find a free id
629*b1cdbd2cSJim Jagielski 			    ::rtl::OUString sCurrentId = lcl_findFreeControlId( m_aControlIds );
630*b1cdbd2cSJim Jagielski 			    // add it to the map
631*b1cdbd2cSJim Jagielski 			    m_aCurrentPageIds->second[ xColumnProperties ] = sCurrentId;
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski 			    // ----------------------------------
634*b1cdbd2cSJim Jagielski                 // determine a number style, if needed
635*b1cdbd2cSJim Jagielski 				xColumnPropertiesMeta = xColumnProperties->getPropertySetInfo();
636*b1cdbd2cSJim Jagielski 				// get the styles of the column
637*b1cdbd2cSJim Jagielski 				::std::vector< XMLPropertyState > aPropertyStates = m_xStyleExportMapper->Filter( xColumnProperties );
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski 				// care for the number format, additionally
640*b1cdbd2cSJim Jagielski 				::rtl::OUString sColumnNumberStyle;
641*b1cdbd2cSJim Jagielski 				if ( xColumnPropertiesMeta.is() && xColumnPropertiesMeta->hasPropertyByName( PROPERTY_FORMATKEY ) )
642*b1cdbd2cSJim Jagielski 					sColumnNumberStyle = getImmediateNumberStyle( xColumnProperties );
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski 				if ( sColumnNumberStyle.getLength() )
645*b1cdbd2cSJim Jagielski 				{	// the column indeed has a formatting
646*b1cdbd2cSJim Jagielski 					sal_Int32 nStyleMapIndex = m_xStyleExportMapper->getPropertySetMapper()->FindEntryIndex( CTF_FORMS_DATA_STYLE );
647*b1cdbd2cSJim Jagielski 						// TODO: move this to the ctor
648*b1cdbd2cSJim Jagielski 					OSL_ENSURE ( -1 != nStyleMapIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for our context id!");
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski 					XMLPropertyState aNumberStyleState( nStyleMapIndex, makeAny( sColumnNumberStyle ) );
651*b1cdbd2cSJim Jagielski 					aPropertyStates.push_back( aNumberStyleState );
652*b1cdbd2cSJim Jagielski 				}
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
655*b1cdbd2cSJim Jagielski 				::std::vector< XMLPropertyState >::const_iterator aHaveALook = aPropertyStates.begin();
656*b1cdbd2cSJim Jagielski 				for ( ; aHaveALook != aPropertyStates.end(); ++aHaveALook )
657*b1cdbd2cSJim Jagielski 				{
658*b1cdbd2cSJim Jagielski                     (void)aHaveALook;
659*b1cdbd2cSJim Jagielski 				}
660*b1cdbd2cSJim Jagielski #endif
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 			    // ----------------------------------
663*b1cdbd2cSJim Jagielski                 // determine the column style
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski 				if ( !aPropertyStates.empty() )
666*b1cdbd2cSJim Jagielski 				{	// add to the style pool
667*b1cdbd2cSJim Jagielski 					::rtl::OUString sColumnStyleName = m_rContext.GetAutoStylePool()->Add( XML_STYLE_FAMILY_CONTROL_ID, aPropertyStates );
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski 					OSL_ENSURE( m_aGridColumnStyles.end() == m_aGridColumnStyles.find( xColumnProperties ),
670*b1cdbd2cSJim Jagielski 						"OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds: already have a style for this column!" );
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski 					m_aGridColumnStyles.insert( MapPropertySet2String::value_type( xColumnProperties, sColumnStyleName ) );
673*b1cdbd2cSJim Jagielski 				}
674*b1cdbd2cSJim Jagielski 			}
675*b1cdbd2cSJim Jagielski 		}
676*b1cdbd2cSJim Jagielski 		catch( const Exception&	)
677*b1cdbd2cSJim Jagielski 		{
678*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
679*b1cdbd2cSJim Jagielski 		}
680*b1cdbd2cSJim Jagielski 	}
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
implExamineControlNumberFormat(const Reference<XPropertySet> & _rxObject)683*b1cdbd2cSJim Jagielski 	sal_Int32 OFormLayerXMLExport_Impl::implExamineControlNumberFormat( const Reference< XPropertySet >& _rxObject )
684*b1cdbd2cSJim Jagielski 	{
685*b1cdbd2cSJim Jagielski 		// get the format key relative to our own formats supplier
686*b1cdbd2cSJim Jagielski 		sal_Int32 nOwnFormatKey = ensureTranslateFormat( _rxObject );
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski 		if ( -1 != nOwnFormatKey )
689*b1cdbd2cSJim Jagielski 			// tell the exporter that we used this format
690*b1cdbd2cSJim Jagielski 			getControlNumberStyleExport()->SetUsed( nOwnFormatKey );
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski 		return nOwnFormatKey;
693*b1cdbd2cSJim Jagielski 	}
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
examineControlNumberFormat(const Reference<XPropertySet> & _rxControl)696*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::examineControlNumberFormat( const Reference< XPropertySet >& _rxControl )
697*b1cdbd2cSJim Jagielski 	{
698*b1cdbd2cSJim Jagielski 		sal_Int32 nOwnFormatKey = implExamineControlNumberFormat( _rxControl );
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski 		if ( -1 == nOwnFormatKey )
701*b1cdbd2cSJim Jagielski 			// nothing to do, the number format of this control is void
702*b1cdbd2cSJim Jagielski 			return;
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski 		// remember the format key for this control (we'll be asked in getControlNumberStyle for this)
705*b1cdbd2cSJim Jagielski 		OSL_ENSURE(m_aControlNumberFormats.end() == m_aControlNumberFormats.find(_rxControl),
706*b1cdbd2cSJim Jagielski 			"OFormLayerXMLExport_Impl::examineControlNumberFormat: already handled this control!");
707*b1cdbd2cSJim Jagielski 		m_aControlNumberFormats[_rxControl] = nOwnFormatKey;
708*b1cdbd2cSJim Jagielski 	}
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
ensureTranslateFormat(const Reference<XPropertySet> & _rxFormattedControl)711*b1cdbd2cSJim Jagielski 	sal_Int32 OFormLayerXMLExport_Impl::ensureTranslateFormat(const Reference< XPropertySet >& _rxFormattedControl)
712*b1cdbd2cSJim Jagielski 	{
713*b1cdbd2cSJim Jagielski 		ensureControlNumberStyleExport();
714*b1cdbd2cSJim Jagielski 		OSL_ENSURE(m_xControlNumberFormats.is(), "OFormLayerXMLExport_Impl::ensureTranslateFormat: no own formats supplier!");
715*b1cdbd2cSJim Jagielski 			// (should have been created in ensureControlNumberStyleExport)
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 		sal_Int32 nOwnFormatKey = -1;
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski 		// the format key (relative to the control's supplier)
720*b1cdbd2cSJim Jagielski 		sal_Int32 nControlFormatKey = -1;
721*b1cdbd2cSJim Jagielski 		Any aControlFormatKey = _rxFormattedControl->getPropertyValue(PROPERTY_FORMATKEY);
722*b1cdbd2cSJim Jagielski 		if (aControlFormatKey >>= nControlFormatKey)
723*b1cdbd2cSJim Jagielski 		{
724*b1cdbd2cSJim Jagielski 			// the control's number format
725*b1cdbd2cSJim Jagielski 			Reference< XNumberFormatsSupplier > xControlFormatsSupplier;
726*b1cdbd2cSJim Jagielski 			_rxFormattedControl->getPropertyValue(PROPERTY_FORMATSSUPPLIER) >>= xControlFormatsSupplier;
727*b1cdbd2cSJim Jagielski 			Reference< XNumberFormats > xControlFormats;
728*b1cdbd2cSJim Jagielski 			if (xControlFormatsSupplier.is())
729*b1cdbd2cSJim Jagielski 				xControlFormats = xControlFormatsSupplier->getNumberFormats();
730*b1cdbd2cSJim Jagielski 			OSL_ENSURE(xControlFormats.is(), "OFormLayerXMLExport_Impl::ensureTranslateFormat: formatted control without supplier!");
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski 			// obtain the persistent (does not depend on the formats supplier) representation of the control's format
733*b1cdbd2cSJim Jagielski 			Locale aFormatLocale;
734*b1cdbd2cSJim Jagielski 			::rtl::OUString sFormatDescription;
735*b1cdbd2cSJim Jagielski 			if (xControlFormats.is())
736*b1cdbd2cSJim Jagielski 			{
737*b1cdbd2cSJim Jagielski 				Reference< XPropertySet > xControlFormat = xControlFormats->getByKey(nControlFormatKey);
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski 				xControlFormat->getPropertyValue(PROPERTY_LOCALE)		>>= aFormatLocale;
740*b1cdbd2cSJim Jagielski 				xControlFormat->getPropertyValue(PROPERTY_FORMATSTRING)	>>= sFormatDescription;
741*b1cdbd2cSJim Jagielski 			}
742*b1cdbd2cSJim Jagielski 
743*b1cdbd2cSJim Jagielski 			// check if our own formats collection already knows the format
744*b1cdbd2cSJim Jagielski 			nOwnFormatKey = m_xControlNumberFormats->queryKey(sFormatDescription, aFormatLocale, sal_False);
745*b1cdbd2cSJim Jagielski 			if (-1 == nOwnFormatKey)
746*b1cdbd2cSJim Jagielski 			{	// no, we don't
747*b1cdbd2cSJim Jagielski 				// -> create a new format
748*b1cdbd2cSJim Jagielski 				nOwnFormatKey = m_xControlNumberFormats->addNew(sFormatDescription, aFormatLocale);
749*b1cdbd2cSJim Jagielski 			}
750*b1cdbd2cSJim Jagielski 			OSL_ENSURE(-1 != nOwnFormatKey, "OFormLayerXMLExport_Impl::ensureTranslateFormat: could not translate the controls format key!");
751*b1cdbd2cSJim Jagielski 		}
752*b1cdbd2cSJim Jagielski 		else
753*b1cdbd2cSJim Jagielski 			OSL_ENSURE(!aControlFormatKey.hasValue(), "OFormLayerXMLExport_Impl::ensureTranslateFormat: invalid number format property value!");
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski 		return nOwnFormatKey;
756*b1cdbd2cSJim Jagielski 	}
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
ensureControlNumberStyleExport()759*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::ensureControlNumberStyleExport()
760*b1cdbd2cSJim Jagielski 	{
761*b1cdbd2cSJim Jagielski 		if (!m_pControlNumberStyles)
762*b1cdbd2cSJim Jagielski 		{
763*b1cdbd2cSJim Jagielski 			// create our number formats supplier (if necessary)
764*b1cdbd2cSJim Jagielski 			Reference< XNumberFormatsSupplier > xFormatsSupplier;
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski 			OSL_ENSURE(!m_xControlNumberFormats.is(), "OFormLayerXMLExport_Impl::getControlNumberStyleExport: inconsistence!");
767*b1cdbd2cSJim Jagielski 				// the m_xControlNumberFormats and m_pControlNumberStyles should be maintained together
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski 			try
770*b1cdbd2cSJim Jagielski 			{
771*b1cdbd2cSJim Jagielski 				// create it for en-US (does not really matter, as we will specify a locale for every
772*b1cdbd2cSJim Jagielski 				// concrete language to use)
773*b1cdbd2cSJim Jagielski 				Sequence< Any > aSupplierArgs(1);
774*b1cdbd2cSJim Jagielski 				aSupplierArgs[0] <<= Locale	(	::rtl::OUString::createFromAscii("en"),
775*b1cdbd2cSJim Jagielski 												::rtl::OUString::createFromAscii("US"),
776*b1cdbd2cSJim Jagielski 												::rtl::OUString()
777*b1cdbd2cSJim Jagielski 											);
778*b1cdbd2cSJim Jagielski 				// #110680#
779*b1cdbd2cSJim Jagielski 				//Reference< XInterface > xFormatsSupplierUntyped =
780*b1cdbd2cSJim Jagielski 				//	::comphelper::getProcessServiceFactory()->createInstanceWithArguments(
781*b1cdbd2cSJim Jagielski 				//		SERVICE_NUMBERFORMATSSUPPLIER,
782*b1cdbd2cSJim Jagielski 				//		aSupplierArgs
783*b1cdbd2cSJim Jagielski 				//	);
784*b1cdbd2cSJim Jagielski 				Reference< XInterface > xFormatsSupplierUntyped =
785*b1cdbd2cSJim Jagielski 					m_rContext.getServiceFactory()->createInstanceWithArguments(
786*b1cdbd2cSJim Jagielski 						SERVICE_NUMBERFORMATSSUPPLIER,
787*b1cdbd2cSJim Jagielski 						aSupplierArgs
788*b1cdbd2cSJim Jagielski 					);
789*b1cdbd2cSJim Jagielski 				OSL_ENSURE(xFormatsSupplierUntyped.is(), "OFormLayerXMLExport_Impl::getControlNumberStyleExport: could not instantiate a number formats supplier!");
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 				xFormatsSupplier = Reference< XNumberFormatsSupplier >(xFormatsSupplierUntyped, UNO_QUERY);
792*b1cdbd2cSJim Jagielski 				if (xFormatsSupplier.is())
793*b1cdbd2cSJim Jagielski 					m_xControlNumberFormats = xFormatsSupplier->getNumberFormats();
794*b1cdbd2cSJim Jagielski 			}
795*b1cdbd2cSJim Jagielski 			catch(const Exception&)
796*b1cdbd2cSJim Jagielski 			{
797*b1cdbd2cSJim Jagielski 			}
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski 			OSL_ENSURE(m_xControlNumberFormats.is(), "OFormLayerXMLExport_Impl::getControlNumberStyleExport: could not obtain my default number formats!");
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski 			// create the exporter
802*b1cdbd2cSJim Jagielski 			m_pControlNumberStyles = new SvXMLNumFmtExport(m_rContext, xFormatsSupplier, getControlNumberStyleNamePrefix());
803*b1cdbd2cSJim Jagielski 		}
804*b1cdbd2cSJim Jagielski 	}
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getControlNumberStyleExport()807*b1cdbd2cSJim Jagielski 	SvXMLNumFmtExport* OFormLayerXMLExport_Impl::getControlNumberStyleExport()
808*b1cdbd2cSJim Jagielski 	{
809*b1cdbd2cSJim Jagielski 		ensureControlNumberStyleExport();
810*b1cdbd2cSJim Jagielski 		return m_pControlNumberStyles;
811*b1cdbd2cSJim Jagielski 	}
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
excludeFromExport(const Reference<XControlModel> _rxControl)814*b1cdbd2cSJim Jagielski 	void OFormLayerXMLExport_Impl::excludeFromExport( const Reference< XControlModel > _rxControl )
815*b1cdbd2cSJim Jagielski 	{
816*b1cdbd2cSJim Jagielski 		Reference< XPropertySet > xProps( _rxControl, UNO_QUERY );
817*b1cdbd2cSJim Jagielski 		OSL_ENSURE( xProps.is(), "OFormLayerXMLExport_Impl::excludeFromExport: invalid control model!" );
818*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
819*b1cdbd2cSJim Jagielski 		::std::pair< PropertySetBag::iterator, bool > aPos =
820*b1cdbd2cSJim Jagielski #endif
821*b1cdbd2cSJim Jagielski 		m_aIgnoreList.insert( xProps );
822*b1cdbd2cSJim Jagielski 		OSL_ENSURE( aPos.second, "OFormLayerXMLExport_Impl::excludeFromExport: element already exists in the ignore list!" );
823*b1cdbd2cSJim Jagielski 	}
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski //.........................................................................
826*b1cdbd2cSJim Jagielski }	// namespace xmloff
827*b1cdbd2cSJim Jagielski //.........................................................................
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski 
830