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 "elementexport.hxx"
28*b1cdbd2cSJim Jagielski #include "strings.hxx"
29*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
30*b1cdbd2cSJim Jagielski #include "eventexport.hxx"
31*b1cdbd2cSJim Jagielski #include "formenums.hxx"
32*b1cdbd2cSJim Jagielski #include "formcellbinding.hxx"
33*b1cdbd2cSJim Jagielski #include "formcellbinding.hxx"
34*b1cdbd2cSJim Jagielski #include "xmloff/xformsexport.hxx"
35*b1cdbd2cSJim Jagielski #include "property_meta_data.hxx"
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
38*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XPersistObject.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormSubmitEncoding.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormSubmitMethod.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/CommandType.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/form/NavigationBarMode.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/form/TabulatorCycle.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormButtonType.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/ScrollBarOrientation.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/VisualEffect.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/form/ListSourceType.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/ImagePosition.hpp>
53*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #include <tools/wintypes.hxx>		// for check states
56*b1cdbd2cSJim Jagielski #include <xmloff/txtprmap.hxx>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/form/binding/XBindableValue.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/form/binding/XListEntrySink.hpp>
59*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
60*b1cdbd2cSJim Jagielski #include <xmloff/xmlexp.hxx>
61*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
62*b1cdbd2cSJim Jagielski #include <xmloff/XMLEventExport.hxx>
63*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
64*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
65*b1cdbd2cSJim Jagielski #include <tools/time.hxx>
66*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
67*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski #include <stdio.h>
70*b1cdbd2cSJim Jagielski #include <algorithm>
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski //.........................................................................
73*b1cdbd2cSJim Jagielski namespace xmloff
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski //.........................................................................
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski     #if OSL_DEBUG_LEVEL > 0
78*b1cdbd2cSJim Jagielski         #define RESET_BIT( bitfield, bit ) \
79*b1cdbd2cSJim Jagielski 			bitfield = bitfield & ~bit
80*b1cdbd2cSJim Jagielski     #else
81*b1cdbd2cSJim Jagielski         #define RESET_BIT( bitfield, bit )
82*b1cdbd2cSJim Jagielski     #endif
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     using namespace ::xmloff::token;
85*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::uno;
86*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::sdb;
87*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::awt;
88*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::form;
89*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::lang;
90*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::lang;
91*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::beans;
92*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::container;
93*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::script;
94*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::io;
95*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::table;
96*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::text;
97*b1cdbd2cSJim Jagielski     using namespace ::com::sun::star::form::binding;
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 	//=====================================================================
100*b1cdbd2cSJim Jagielski 	//= OElementExport
101*b1cdbd2cSJim Jagielski 	//=====================================================================
OElementExport(IFormsExportContext & _rContext,const Reference<XPropertySet> & _rxProps,const Sequence<ScriptEventDescriptor> & _rEvents)102*b1cdbd2cSJim Jagielski 	OElementExport::OElementExport(IFormsExportContext& _rContext, const Reference< XPropertySet >& _rxProps,
103*b1cdbd2cSJim Jagielski 		const Sequence< ScriptEventDescriptor >& _rEvents)
104*b1cdbd2cSJim Jagielski 		:OPropertyExport(_rContext, _rxProps)
105*b1cdbd2cSJim Jagielski 		,m_aEvents(_rEvents)
106*b1cdbd2cSJim Jagielski 		,m_pXMLElement(NULL)
107*b1cdbd2cSJim Jagielski 	{
108*b1cdbd2cSJim Jagielski 	}
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
~OElementExport()111*b1cdbd2cSJim Jagielski 	OElementExport::~OElementExport()
112*b1cdbd2cSJim Jagielski 	{
113*b1cdbd2cSJim Jagielski 		implEndElement();
114*b1cdbd2cSJim Jagielski 	}
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
doExport()117*b1cdbd2cSJim Jagielski 	void OElementExport::doExport()
118*b1cdbd2cSJim Jagielski 	{
119*b1cdbd2cSJim Jagielski 		// collect some general information about the element
120*b1cdbd2cSJim Jagielski 		examine();
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 		// first add the attributes necessary for the element
123*b1cdbd2cSJim Jagielski 		m_rContext.getGlobalContext().ClearAttrList();
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 		// add the attributes
126*b1cdbd2cSJim Jagielski 		exportAttributes();
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 		// start the XML element
129*b1cdbd2cSJim Jagielski 		implStartElement(getXMLElementName());
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 		// the sub elements (mostly control type dependent)
132*b1cdbd2cSJim Jagielski 		exportSubTags();
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 		implEndElement();
135*b1cdbd2cSJim Jagielski 	}
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
examine()138*b1cdbd2cSJim Jagielski 	void OElementExport::examine()
139*b1cdbd2cSJim Jagielski 	{
140*b1cdbd2cSJim Jagielski 		// nothing to do here
141*b1cdbd2cSJim Jagielski 	}
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportAttributes()144*b1cdbd2cSJim Jagielski 	void OElementExport::exportAttributes()
145*b1cdbd2cSJim Jagielski 	{
146*b1cdbd2cSJim Jagielski 		// nothing to do here
147*b1cdbd2cSJim Jagielski 	}
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportSubTags()150*b1cdbd2cSJim Jagielski 	void OElementExport::exportSubTags()
151*b1cdbd2cSJim Jagielski 	{
152*b1cdbd2cSJim Jagielski 		// the properties which where not exported 'til now
153*b1cdbd2cSJim Jagielski 		exportRemainingProperties();
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 		// the script:events sub tags
156*b1cdbd2cSJim Jagielski 		exportEvents();
157*b1cdbd2cSJim Jagielski 	}
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
implStartElement(const sal_Char * _pName)160*b1cdbd2cSJim Jagielski 	void OElementExport::implStartElement(const sal_Char* _pName)
161*b1cdbd2cSJim Jagielski 	{
162*b1cdbd2cSJim Jagielski 		m_pXMLElement = new SvXMLElementExport(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, _pName, sal_True, sal_True);
163*b1cdbd2cSJim Jagielski 	}
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
implEndElement()166*b1cdbd2cSJim Jagielski 	void OElementExport::implEndElement()
167*b1cdbd2cSJim Jagielski 	{
168*b1cdbd2cSJim Jagielski 		delete m_pXMLElement;
169*b1cdbd2cSJim Jagielski 		m_pXMLElement = NULL;
170*b1cdbd2cSJim Jagielski 	}
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportServiceNameAttribute()173*b1cdbd2cSJim Jagielski 	void OElementExport::exportServiceNameAttribute()
174*b1cdbd2cSJim Jagielski 	{
175*b1cdbd2cSJim Jagielski 		Reference< XPersistObject > xPersistence(m_xProps, UNO_QUERY);
176*b1cdbd2cSJim Jagielski 		if (!xPersistence.is())
177*b1cdbd2cSJim Jagielski 		{
178*b1cdbd2cSJim Jagielski 			OSL_ENSURE(sal_False, "OElementExport::exportServiceNameAttribute: no XPersistObject!");
179*b1cdbd2cSJim Jagielski 			return;
180*b1cdbd2cSJim Jagielski 		}
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 		::rtl::OUString sServiceName = xPersistence->getServiceName();
183*b1cdbd2cSJim Jagielski 		// we don't want to write the old service name directly: it's a name used for compatibility reasons, but
184*b1cdbd2cSJim Jagielski 		// as we start some kind of new file format here (with this xml export), we don't care about
185*b1cdbd2cSJim Jagielski 		// compatibility ...
186*b1cdbd2cSJim Jagielski 		// So we translate the old persistence service name into new ones, if possible
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 		::rtl::OUString sToWriteServiceName = sServiceName;
189*b1cdbd2cSJim Jagielski #define CHECK_N_TRANSLATE( name )	\
190*b1cdbd2cSJim Jagielski 		else if (0 == sServiceName.compareToAscii(SERVICE_PERSISTENT_COMPONENT_##name))	\
191*b1cdbd2cSJim Jagielski 			sToWriteServiceName = SERVICE_##name
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 		if (sal_False)
194*b1cdbd2cSJim Jagielski 			;
195*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( FORM );
196*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( FORM );
197*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( LISTBOX );
198*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( COMBOBOX );
199*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( RADIOBUTTON );
200*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( GROUPBOX );
201*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( FIXEDTEXT );
202*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( COMMANDBUTTON );
203*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( CHECKBOX );
204*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( GRID );
205*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( IMAGEBUTTON );
206*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( FILECONTROL );
207*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( TIMEFIELD );
208*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( DATEFIELD );
209*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( NUMERICFIELD );
210*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( CURRENCYFIELD );
211*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( PATTERNFIELD );
212*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( HIDDENCONTROL );
213*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( IMAGECONTROL );
214*b1cdbd2cSJim Jagielski 		CHECK_N_TRANSLATE( FORMATTEDFIELD );
215*b1cdbd2cSJim Jagielski 		else if (0 == sServiceName.compareToAscii(SERVICE_PERSISTENT_COMPONENT_EDIT))
216*b1cdbd2cSJim Jagielski 		{	// special handling for the edit field: we have two controls using this as persistence service name
217*b1cdbd2cSJim Jagielski 			sToWriteServiceName = SERVICE_EDIT;
218*b1cdbd2cSJim Jagielski 			Reference< XServiceInfo > xSI(m_xProps, UNO_QUERY);
219*b1cdbd2cSJim Jagielski 			if (xSI.is() && xSI->supportsService(SERVICE_FORMATTEDFIELD))
220*b1cdbd2cSJim Jagielski 				sToWriteServiceName = SERVICE_FORMATTEDFIELD;
221*b1cdbd2cSJim Jagielski 		}
222*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
223*b1cdbd2cSJim Jagielski 		Reference< XServiceInfo > xSI(m_xProps, UNO_QUERY);
224*b1cdbd2cSJim Jagielski 		OSL_ENSURE(xSI.is() && xSI->supportsService(sToWriteServiceName),
225*b1cdbd2cSJim Jagielski 			"OElementExport::exportServiceNameAttribute: wrong service name translation!");
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski #endif
228*b1cdbd2cSJim Jagielski 		sToWriteServiceName =
229*b1cdbd2cSJim Jagielski 			m_rContext.getGlobalContext().GetNamespaceMap().GetQNameByKey(
230*b1cdbd2cSJim Jagielski 				XML_NAMESPACE_OOO, sToWriteServiceName );
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski 		// now write this
233*b1cdbd2cSJim Jagielski 		AddAttribute(
234*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SERVICE_NAME),
235*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getCommonControlAttributeName(CCA_SERVICE_NAME),
236*b1cdbd2cSJim Jagielski 			sToWriteServiceName);
237*b1cdbd2cSJim Jagielski 	}
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportEvents()240*b1cdbd2cSJim Jagielski 	void OElementExport::exportEvents()
241*b1cdbd2cSJim Jagielski 	{
242*b1cdbd2cSJim Jagielski 		if (!m_aEvents.getLength())
243*b1cdbd2cSJim Jagielski 			// nothing to do
244*b1cdbd2cSJim Jagielski 			return;
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 		Reference< XNameReplace > xWrapper = new OEventDescriptorMapper(m_aEvents);
247*b1cdbd2cSJim Jagielski 		m_rContext.getGlobalContext().GetEventExport().Export(xWrapper);
248*b1cdbd2cSJim Jagielski 	}
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 	//=====================================================================
251*b1cdbd2cSJim Jagielski 	//= OControlExport
252*b1cdbd2cSJim Jagielski 	//=====================================================================
253*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
OControlExport(IFormsExportContext & _rContext,const Reference<XPropertySet> & _rxControl,const::rtl::OUString & _rControlId,const::rtl::OUString & _rReferringControls,const Sequence<ScriptEventDescriptor> & _rEvents)254*b1cdbd2cSJim Jagielski 	OControlExport::OControlExport(IFormsExportContext& _rContext,  const Reference< XPropertySet >& _rxControl,
255*b1cdbd2cSJim Jagielski 		const ::rtl::OUString& _rControlId, const ::rtl::OUString& _rReferringControls,
256*b1cdbd2cSJim Jagielski 		const Sequence< ScriptEventDescriptor >& _rEvents)
257*b1cdbd2cSJim Jagielski 		:OElementExport(_rContext, _rxControl, _rEvents)
258*b1cdbd2cSJim Jagielski 		,m_sControlId(_rControlId)
259*b1cdbd2cSJim Jagielski 		,m_sReferringControls(_rReferringControls)
260*b1cdbd2cSJim Jagielski         ,m_nClassId(FormComponentType::CONTROL)
261*b1cdbd2cSJim Jagielski         ,m_eType( UNKNOWN )
262*b1cdbd2cSJim Jagielski 		,m_nIncludeCommon(0)
263*b1cdbd2cSJim Jagielski 		,m_nIncludeDatabase(0)
264*b1cdbd2cSJim Jagielski 		,m_nIncludeSpecial(0)
265*b1cdbd2cSJim Jagielski 		,m_nIncludeEvents(0)
266*b1cdbd2cSJim Jagielski         ,m_nIncludeBindings(0)
267*b1cdbd2cSJim Jagielski 		,m_pOuterElement(NULL)
268*b1cdbd2cSJim Jagielski 	{
269*b1cdbd2cSJim Jagielski 		OSL_ENSURE(m_xProps.is(), "OControlExport::OControlExport: invalid arguments!");
270*b1cdbd2cSJim Jagielski 	}
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
~OControlExport()273*b1cdbd2cSJim Jagielski 	OControlExport::~OControlExport()
274*b1cdbd2cSJim Jagielski 	{
275*b1cdbd2cSJim Jagielski 		implEndElement();
276*b1cdbd2cSJim Jagielski 	}
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportOuterAttributes()279*b1cdbd2cSJim Jagielski 	void OControlExport::exportOuterAttributes()
280*b1cdbd2cSJim Jagielski 	{
281*b1cdbd2cSJim Jagielski 		// the control id
282*b1cdbd2cSJim Jagielski 		if (CCA_NAME & m_nIncludeCommon)
283*b1cdbd2cSJim Jagielski 		{
284*b1cdbd2cSJim Jagielski 			exportStringPropertyAttribute(
285*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getCommonControlAttributeNamespace(CCA_NAME),
286*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getCommonControlAttributeName(CCA_NAME),
287*b1cdbd2cSJim Jagielski 				PROPERTY_NAME
288*b1cdbd2cSJim Jagielski 				);
289*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
290*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
291*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_NAME;
292*b1cdbd2cSJim Jagielski 		#endif
293*b1cdbd2cSJim Jagielski 		}
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski 		// the service name
296*b1cdbd2cSJim Jagielski 		if (m_nIncludeCommon & CCA_SERVICE_NAME)
297*b1cdbd2cSJim Jagielski 		{
298*b1cdbd2cSJim Jagielski 			exportServiceNameAttribute();
299*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
300*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
301*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_SERVICE_NAME;
302*b1cdbd2cSJim Jagielski 		#endif
303*b1cdbd2cSJim Jagielski 		}
304*b1cdbd2cSJim Jagielski 	}
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportInnerAttributes()307*b1cdbd2cSJim Jagielski 	void OControlExport::exportInnerAttributes()
308*b1cdbd2cSJim Jagielski 	{
309*b1cdbd2cSJim Jagielski 		// the control id
310*b1cdbd2cSJim Jagielski 		if (CCA_CONTROL_ID & m_nIncludeCommon)
311*b1cdbd2cSJim Jagielski 		{
312*b1cdbd2cSJim Jagielski 			OSL_ENSURE(m_sControlId.getLength(), "OControlExport::exportInnerAttributes: have no control id for the control!");
313*b1cdbd2cSJim Jagielski             m_rContext.getGlobalContext().AddAttributeIdLegacy(
314*b1cdbd2cSJim Jagielski                 XML_NAMESPACE_FORM, m_sControlId);
315*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
316*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
317*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_CONTROL_ID;
318*b1cdbd2cSJim Jagielski 		#endif
319*b1cdbd2cSJim Jagielski 		}
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski         // "new-style" properties ...
322*b1cdbd2cSJim Jagielski         exportGenericHandlerAttributes();
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski         // common control attributes
325*b1cdbd2cSJim Jagielski 		exportCommonControlAttributes();
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 		// common database attributes
328*b1cdbd2cSJim Jagielski 		exportDatabaseAttributes();
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski         // attributes related to external bindings
331*b1cdbd2cSJim Jagielski         exportBindingAtributes();
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 		// attributes special to the respective control type
334*b1cdbd2cSJim Jagielski 		exportSpecialAttributes();
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 		// add the style references to the attributes
337*b1cdbd2cSJim Jagielski 		flagStyleProperties();
338*b1cdbd2cSJim Jagielski 	}
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportAttributes()341*b1cdbd2cSJim Jagielski 	void OControlExport::exportAttributes()
342*b1cdbd2cSJim Jagielski 	{
343*b1cdbd2cSJim Jagielski 		exportOuterAttributes();
344*b1cdbd2cSJim Jagielski 	}
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportSubTags()347*b1cdbd2cSJim Jagielski 	void OControlExport::exportSubTags() throw (Exception)
348*b1cdbd2cSJim Jagielski 	{
349*b1cdbd2cSJim Jagielski 		// for the upcoming exportRemainingProperties:
350*b1cdbd2cSJim Jagielski 		// if a control has the LabelControl property, this is not stored with the control itself, but instead with
351*b1cdbd2cSJim Jagielski 		// the control which is referenced by this property. As the base class' exportRemainingProperties doesn't
352*b1cdbd2cSJim Jagielski 		// know anything about this, we need to prevent that it tries to export this property
353*b1cdbd2cSJim Jagielski 		exportedProperty(PROPERTY_CONTROLLABEL);
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski         // if it's a control supporting XText, then we need to declare all text-related properties
356*b1cdbd2cSJim Jagielski         // as "already exported". This prevents them from being exported as generic "form:property"-tags.
357*b1cdbd2cSJim Jagielski         // *If* we would export them this way, they would be completely superfluous, and sometimes even
358*b1cdbd2cSJim Jagielski         // disastrous, since they may, at import time, override paragraph properties which already have
359*b1cdbd2cSJim Jagielski         // been set before
360*b1cdbd2cSJim Jagielski         Reference< XText > xControlText( m_xProps, UNO_QUERY );
361*b1cdbd2cSJim Jagielski         if ( xControlText.is() )
362*b1cdbd2cSJim Jagielski         {
363*b1cdbd2cSJim Jagielski             const XMLPropertyMapEntry* pCharAttributeProperties = XMLTextPropertySetMapper::getPropertyMapForType( TEXT_PROP_MAP_TEXT );
364*b1cdbd2cSJim Jagielski             while ( pCharAttributeProperties->msApiName )
365*b1cdbd2cSJim Jagielski             {
366*b1cdbd2cSJim Jagielski                 exportedProperty( ::rtl::OUString::createFromAscii( pCharAttributeProperties->msApiName ) );
367*b1cdbd2cSJim Jagielski                 ++pCharAttributeProperties;
368*b1cdbd2cSJim Jagielski             }
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski             const XMLPropertyMapEntry* pParaAttributeProperties = XMLTextPropertySetMapper::getPropertyMapForType( TEXT_PROP_MAP_SHAPE_PARA );
371*b1cdbd2cSJim Jagielski             while ( pParaAttributeProperties->msApiName )
372*b1cdbd2cSJim Jagielski             {
373*b1cdbd2cSJim Jagielski                 exportedProperty( ::rtl::OUString::createFromAscii( pParaAttributeProperties->msApiName ) );
374*b1cdbd2cSJim Jagielski                 ++pParaAttributeProperties;
375*b1cdbd2cSJim Jagielski             }
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski             // the RichText property is not exported. The presence of the text:p element
378*b1cdbd2cSJim Jagielski             // will be used - upon reading - as indicator for the value of the RichText property
379*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_RICH_TEXT );
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski             // strange thing: paragraphs support both a CharStrikeout and a CharCrossedOut property
382*b1cdbd2cSJim Jagielski             // The former is a short/enum value, the latter a boolean. The former has a real meaning
383*b1cdbd2cSJim Jagielski             // (the strikeout type), the latter hasn't. But, when the CharCrossedOut is exported and
384*b1cdbd2cSJim Jagielski             // later on imported, it overwrites anything which has previously been imported for
385*b1cdbd2cSJim Jagielski             // CharStrikeout.
386*b1cdbd2cSJim Jagielski             // 2004-04-14 - #i27729# - fs@openoffice.org
387*b1cdbd2cSJim Jagielski             exportedProperty( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CharCrossedOut" ) ) );
388*b1cdbd2cSJim Jagielski         }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski         if ( m_eType == LISTBOX )
391*b1cdbd2cSJim Jagielski         {
392*b1cdbd2cSJim Jagielski             // will be exported in exportListSourceAsElements:
393*b1cdbd2cSJim Jagielski             if ( controlHasUserSuppliedListEntries() )
394*b1cdbd2cSJim Jagielski                 exportedProperty( PROPERTY_DEFAULT_SELECT_SEQ );
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski             // will not be exported in a generic way. Either exportListSourceAsElements cares
397*b1cdbd2cSJim Jagielski             // for them, or we don't need them
398*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_STRING_ITEM_LIST );
399*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_VALUE_SEQ );
400*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_SELECT_SEQ );
401*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_LISTSOURCE );
402*b1cdbd2cSJim Jagielski         }
403*b1cdbd2cSJim Jagielski         if ( m_eType == COMBOBOX )
404*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_STRING_ITEM_LIST );
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski 		// let the base class export the remaining properties and the events
407*b1cdbd2cSJim Jagielski 		OElementExport::exportSubTags();
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 		// special sub tags for some controls
410*b1cdbd2cSJim Jagielski 		switch (m_eType)
411*b1cdbd2cSJim Jagielski 		{
412*b1cdbd2cSJim Jagielski 			case LISTBOX:
413*b1cdbd2cSJim Jagielski                 // don't export the list entries if the are not provided by the user, but obtained implicitly
414*b1cdbd2cSJim Jagielski                 // from other sources
415*b1cdbd2cSJim Jagielski                 // #i26944# - 2004-05-17 - fs@openoffice.org
416*b1cdbd2cSJim Jagielski                 if ( controlHasUserSuppliedListEntries() )
417*b1cdbd2cSJim Jagielski 				    exportListSourceAsElements();
418*b1cdbd2cSJim Jagielski 				break;
419*b1cdbd2cSJim Jagielski 			case GRID:
420*b1cdbd2cSJim Jagielski 			{	// a grid control requires us to store all columns as sub elements
421*b1cdbd2cSJim Jagielski 				Reference< XIndexAccess > xColumnContainer(m_xProps, UNO_QUERY);
422*b1cdbd2cSJim Jagielski 				OSL_ENSURE(xColumnContainer.is(), "OControlExport::exportSubTags: a grid control which is no IndexAccess?!!");
423*b1cdbd2cSJim Jagielski 				if (xColumnContainer.is())
424*b1cdbd2cSJim Jagielski 					m_rContext.exportCollectionElements(xColumnContainer);
425*b1cdbd2cSJim Jagielski 			}
426*b1cdbd2cSJim Jagielski 			break;
427*b1cdbd2cSJim Jagielski 			case COMBOBOX:
428*b1cdbd2cSJim Jagielski 			{	// a combox box description has sub elements: the items
429*b1cdbd2cSJim Jagielski 				DBG_CHECK_PROPERTY( PROPERTY_STRING_ITEM_LIST, Sequence< ::rtl::OUString > );
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski                 // don't export the list entries if the are not provided by the user, but obtained implicitly
432*b1cdbd2cSJim Jagielski                 // from other sources
433*b1cdbd2cSJim Jagielski                 // #i26944# - 2004-05-17 - fs@openoffice.org
434*b1cdbd2cSJim Jagielski                 if ( controlHasUserSuppliedListEntries() )
435*b1cdbd2cSJim Jagielski                 {
436*b1cdbd2cSJim Jagielski 				    // get the item list
437*b1cdbd2cSJim Jagielski 				    Sequence< ::rtl::OUString > aListItems;
438*b1cdbd2cSJim Jagielski 				    m_xProps->getPropertyValue(PROPERTY_STRING_ITEM_LIST) >>= aListItems;
439*b1cdbd2cSJim Jagielski 				    // loop through it and write the sub elements
440*b1cdbd2cSJim Jagielski 				    const ::rtl::OUString* pListItems = aListItems.getConstArray();
441*b1cdbd2cSJim Jagielski 				    for (sal_Int32 i=0; i<aListItems.getLength(); ++i, ++pListItems)
442*b1cdbd2cSJim Jagielski 				    {
443*b1cdbd2cSJim Jagielski 					    m_rContext.getGlobalContext().ClearAttrList();
444*b1cdbd2cSJim Jagielski 					    AddAttribute(
445*b1cdbd2cSJim Jagielski 						    OAttributeMetaData::getCommonControlAttributeNamespace(CCA_LABEL),
446*b1cdbd2cSJim Jagielski 						    OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL),
447*b1cdbd2cSJim Jagielski 						    *pListItems);
448*b1cdbd2cSJim Jagielski 					    SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, "item", sal_True, sal_True);
449*b1cdbd2cSJim Jagielski 				    }
450*b1cdbd2cSJim Jagielski                 }
451*b1cdbd2cSJim Jagielski 			}
452*b1cdbd2cSJim Jagielski 			break;
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski             case TEXT_AREA:
455*b1cdbd2cSJim Jagielski             {
456*b1cdbd2cSJim Jagielski                 // if we act as rich text control, we need to export some text:p elements
457*b1cdbd2cSJim Jagielski                 if ( xControlText.is() )
458*b1cdbd2cSJim Jagielski                 {
459*b1cdbd2cSJim Jagielski                     sal_Bool bActingAsRichText = sal_False;
460*b1cdbd2cSJim Jagielski         			if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_RICH_TEXT ) )
461*b1cdbd2cSJim Jagielski                     {
462*b1cdbd2cSJim Jagielski                         OSL_VERIFY(m_xProps->getPropertyValue( PROPERTY_RICH_TEXT ) >>= bActingAsRichText );
463*b1cdbd2cSJim Jagielski                     }
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski                     if ( bActingAsRichText )
466*b1cdbd2cSJim Jagielski                 		m_rContext.getGlobalContext().GetTextParagraphExport()->exportText( xControlText );
467*b1cdbd2cSJim Jagielski                 }
468*b1cdbd2cSJim Jagielski             }
469*b1cdbd2cSJim Jagielski             break;
470*b1cdbd2cSJim Jagielski             default:
471*b1cdbd2cSJim Jagielski                 // nothing do to
472*b1cdbd2cSJim Jagielski                 break;
473*b1cdbd2cSJim Jagielski 		}
474*b1cdbd2cSJim Jagielski 	}
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
exportGenericHandlerAttributes()477*b1cdbd2cSJim Jagielski     void OControlExport::exportGenericHandlerAttributes()
478*b1cdbd2cSJim Jagielski     {
479*b1cdbd2cSJim Jagielski 	    const Sequence< Property > aProperties = m_xPropertyInfo->getProperties();
480*b1cdbd2cSJim Jagielski         for (   const Property* prop = aProperties.getConstArray();
481*b1cdbd2cSJim Jagielski                 prop != aProperties.getConstArray() + aProperties.getLength();
482*b1cdbd2cSJim Jagielski                 ++prop
483*b1cdbd2cSJim Jagielski             )
484*b1cdbd2cSJim Jagielski         {
485*b1cdbd2cSJim Jagielski             try
486*b1cdbd2cSJim Jagielski             {
487*b1cdbd2cSJim Jagielski                 // see if this property can already be handled with an IPropertyHandler (which, on the long
488*b1cdbd2cSJim Jagielski                 // term, should be the case for most, if not all, properties)
489*b1cdbd2cSJim Jagielski                 const PropertyDescription* propDescription = metadata::getPropertyDescription( prop->Name );
490*b1cdbd2cSJim Jagielski                 if ( propDescription == NULL )
491*b1cdbd2cSJim Jagielski                     continue;
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski                 // let the factory provide the concrete handler. Note that caching, if desired, is the task
494*b1cdbd2cSJim Jagielski                 // of the factory
495*b1cdbd2cSJim Jagielski                 PPropertyHandler handler = (*propDescription->factory)( propDescription->propertyId );
496*b1cdbd2cSJim Jagielski                 ENSURE_OR_CONTINUE( handler.get() != NULL,
497*b1cdbd2cSJim Jagielski                     "OControlExport::exportGenericHandlerAttributes: invalid property handler provided by the factory!" );
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski                 ::rtl::OUString attributeValue;
500*b1cdbd2cSJim Jagielski                 if ( propDescription->propertyGroup == NO_GROUP )
501*b1cdbd2cSJim Jagielski                 {
502*b1cdbd2cSJim Jagielski                     // that's a property which has a direct mapping to an attribute
503*b1cdbd2cSJim Jagielski                     if ( !shouldExportProperty( prop->Name ) )
504*b1cdbd2cSJim Jagielski                         // TODO: in the future, we surely need a more sophisticated approach to this, involving the property
505*b1cdbd2cSJim Jagielski                         // handler, or the property description
506*b1cdbd2cSJim Jagielski                     {
507*b1cdbd2cSJim Jagielski                         exportedProperty( prop->Name );
508*b1cdbd2cSJim Jagielski                         continue;
509*b1cdbd2cSJim Jagielski                     }
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski                     const Any propValue = m_xProps->getPropertyValue( prop->Name );
512*b1cdbd2cSJim Jagielski                     attributeValue = handler->getAttributeValue( propValue );
513*b1cdbd2cSJim Jagielski                 }
514*b1cdbd2cSJim Jagielski                 else
515*b1cdbd2cSJim Jagielski                 {
516*b1cdbd2cSJim Jagielski                     // that's a property which is part of a group of properties, whose values, in their entity, comprise
517*b1cdbd2cSJim Jagielski                     // a single attribute value
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski                     // retrieve the descriptions of all other properties which add to the attribute value
520*b1cdbd2cSJim Jagielski                     PropertyDescriptionList descriptions;
521*b1cdbd2cSJim Jagielski                     metadata::getPropertyGroup( propDescription->propertyGroup, descriptions );
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski                     // retrieve the values for all those properties
524*b1cdbd2cSJim Jagielski                     PropertyValues aValues;
525*b1cdbd2cSJim Jagielski                     for (   PropertyDescriptionList::iterator desc = descriptions.begin();
526*b1cdbd2cSJim Jagielski                             desc != descriptions.end();
527*b1cdbd2cSJim Jagielski                             ++desc
528*b1cdbd2cSJim Jagielski                         )
529*b1cdbd2cSJim Jagielski                     {
530*b1cdbd2cSJim Jagielski                         // TODO: XMultiPropertySet?
531*b1cdbd2cSJim Jagielski                         const Any propValue = m_xProps->getPropertyValue( (*desc)->propertyName );
532*b1cdbd2cSJim Jagielski                         aValues[ (*desc)->propertyId ] = propValue;
533*b1cdbd2cSJim Jagielski                     }
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski                     // let the handler translate into an XML attribute value
536*b1cdbd2cSJim Jagielski                     attributeValue = handler->getAttributeValue( aValues );
537*b1cdbd2cSJim Jagielski                 }
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 			    AddAttribute(
540*b1cdbd2cSJim Jagielski 				    propDescription->attribute.namespacePrefix,
541*b1cdbd2cSJim Jagielski                     token::GetXMLToken( propDescription->attribute.attributeToken ),
542*b1cdbd2cSJim Jagielski 				    attributeValue
543*b1cdbd2cSJim Jagielski                 );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski                 exportedProperty( prop->Name );
546*b1cdbd2cSJim Jagielski             }
547*b1cdbd2cSJim Jagielski             catch( const Exception& )
548*b1cdbd2cSJim Jagielski             {
549*b1cdbd2cSJim Jagielski         	    DBG_UNHANDLED_EXCEPTION();
550*b1cdbd2cSJim Jagielski             }
551*b1cdbd2cSJim Jagielski         }
552*b1cdbd2cSJim Jagielski     }
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
exportCommonControlAttributes()555*b1cdbd2cSJim Jagielski 	void OControlExport::exportCommonControlAttributes()
556*b1cdbd2cSJim Jagielski 	{
557*b1cdbd2cSJim Jagielski 		size_t i=0;
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 		// I decided to handle all the properties here with some static arrays describing the property-attribute
560*b1cdbd2cSJim Jagielski 		// relations. This leads to somewhat ugly code :), but the only alternative I can think of right now
561*b1cdbd2cSJim Jagielski 		// would require maps and O(log n) searches, which seems somewhat expensive as this code is used
562*b1cdbd2cSJim Jagielski 		// very frequently.
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 		// the extra indents for the respective blocks are to ensure that there is no copy'n'paste error, using
565*b1cdbd2cSJim Jagielski 		// map identifiers from the wrong block
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 		// --------------------------------------------------------------------
568*b1cdbd2cSJim Jagielski 		// some string properties
569*b1cdbd2cSJim Jagielski 		{
570*b1cdbd2cSJim Jagielski 			// the attribute ids of all properties which are expected to be of type string
571*b1cdbd2cSJim Jagielski 			static sal_Int32 nStringPropertyAttributeIds[] =
572*b1cdbd2cSJim Jagielski 			{
573*b1cdbd2cSJim Jagielski 				CCA_LABEL, CCA_TITLE
574*b1cdbd2cSJim Jagielski 			};
575*b1cdbd2cSJim Jagielski 			// the names of all properties which are expected to be of type string
576*b1cdbd2cSJim Jagielski 			static ::rtl::OUString aStringPropertyNames[] =
577*b1cdbd2cSJim Jagielski 			{
578*b1cdbd2cSJim Jagielski 				PROPERTY_LABEL, PROPERTY_TITLE
579*b1cdbd2cSJim Jagielski 			};
580*b1cdbd2cSJim Jagielski 			OSL_ENSURE(	sizeof(aStringPropertyNames)/sizeof(aStringPropertyNames[0]) ==
581*b1cdbd2cSJim Jagielski 						sizeof(nStringPropertyAttributeIds)/sizeof(nStringPropertyAttributeIds[0]),
582*b1cdbd2cSJim Jagielski 						"OControlExport::exportCommonControlAttributes: somebody tampered with the maps (1)!");
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski 			for (i=0; i<sizeof(nStringPropertyAttributeIds)/sizeof(nStringPropertyAttributeIds[0]); ++i)
585*b1cdbd2cSJim Jagielski 				if (nStringPropertyAttributeIds[i] & m_nIncludeCommon)
586*b1cdbd2cSJim Jagielski 				{
587*b1cdbd2cSJim Jagielski 					exportStringPropertyAttribute(
588*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeNamespace(nStringPropertyAttributeIds[i]),
589*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeName(nStringPropertyAttributeIds[i]),
590*b1cdbd2cSJim Jagielski 						aStringPropertyNames[i]
591*b1cdbd2cSJim Jagielski 						);
592*b1cdbd2cSJim Jagielski 				#if OSL_DEBUG_LEVEL > 0
593*b1cdbd2cSJim Jagielski 					//  reset the bit for later checking
594*b1cdbd2cSJim Jagielski 					m_nIncludeCommon = m_nIncludeCommon & ~nStringPropertyAttributeIds[i];
595*b1cdbd2cSJim Jagielski 				#endif
596*b1cdbd2cSJim Jagielski 				}
597*b1cdbd2cSJim Jagielski 		}
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 		// --------------------------------------------------------------------
600*b1cdbd2cSJim Jagielski 		// some boolean properties
601*b1cdbd2cSJim Jagielski 		{
602*b1cdbd2cSJim Jagielski 			static sal_Int32 nBooleanPropertyAttributeIds[] =
603*b1cdbd2cSJim Jagielski 			{	// attribute flags
604*b1cdbd2cSJim Jagielski 				CCA_CURRENT_SELECTED, CCA_DISABLED, CCA_DROPDOWN, CCA_PRINTABLE, CCA_READONLY, CCA_SELECTED, CCA_TAB_STOP, CCA_ENABLEVISIBLE
605*b1cdbd2cSJim Jagielski 			};
606*b1cdbd2cSJim Jagielski 			static const ::rtl::OUString* pBooleanPropertyNames[] =
607*b1cdbd2cSJim Jagielski 			{	// property names
608*b1cdbd2cSJim Jagielski 				&PROPERTY_STATE, &PROPERTY_ENABLED, &PROPERTY_DROPDOWN, &PROPERTY_PRINTABLE, &PROPERTY_READONLY, &PROPERTY_DEFAULT_STATE, &PROPERTY_TABSTOP, &PROPERTY_ENABLEVISIBLE
609*b1cdbd2cSJim Jagielski 			};
610*b1cdbd2cSJim Jagielski 			static sal_Bool nBooleanPropertyAttrFlags[] =
611*b1cdbd2cSJim Jagielski 			{	// attribute defaults
612*b1cdbd2cSJim Jagielski 				BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_FALSE | BOOLATTR_INVERSE_SEMANTICS, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_VOID, BOOLATTR_DEFAULT_FALSE
613*b1cdbd2cSJim Jagielski 			};
614*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
615*b1cdbd2cSJim Jagielski 			sal_Int32 nIdCount = sizeof(nBooleanPropertyAttributeIds) / sizeof(nBooleanPropertyAttributeIds[0]);
616*b1cdbd2cSJim Jagielski 			sal_Int32 nNameCount = sizeof(pBooleanPropertyNames) / sizeof(pBooleanPropertyNames[0]);
617*b1cdbd2cSJim Jagielski 			sal_Int32 nFlagsCount = sizeof(nBooleanPropertyAttrFlags) / sizeof(nBooleanPropertyAttrFlags[0]);
618*b1cdbd2cSJim Jagielski 			OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nFlagsCount),
619*b1cdbd2cSJim Jagielski 				"OControlExport::exportCommonControlAttributes: somebody tampered with the maps (2)!");
620*b1cdbd2cSJim Jagielski 		#endif
621*b1cdbd2cSJim Jagielski 			for (i=0; i<sizeof(nBooleanPropertyAttributeIds)/sizeof(nBooleanPropertyAttributeIds[0]); ++i)
622*b1cdbd2cSJim Jagielski 				if (nBooleanPropertyAttributeIds[i] & m_nIncludeCommon)
623*b1cdbd2cSJim Jagielski 				{
624*b1cdbd2cSJim Jagielski 					exportBooleanPropertyAttribute(
625*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeNamespace(nBooleanPropertyAttributeIds[i]),
626*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeName(nBooleanPropertyAttributeIds[i]),
627*b1cdbd2cSJim Jagielski 						*(pBooleanPropertyNames[i]),
628*b1cdbd2cSJim Jagielski 						nBooleanPropertyAttrFlags[i]);
629*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
630*b1cdbd2cSJim Jagielski 					//  reset the bit for later checking
631*b1cdbd2cSJim Jagielski 					m_nIncludeCommon = m_nIncludeCommon & ~nBooleanPropertyAttributeIds[i];
632*b1cdbd2cSJim Jagielski 		#endif
633*b1cdbd2cSJim Jagielski 				}
634*b1cdbd2cSJim Jagielski 		}
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 		// --------------------------------------------------------------------
638*b1cdbd2cSJim Jagielski 		// some integer properties
639*b1cdbd2cSJim Jagielski 		{
640*b1cdbd2cSJim Jagielski 			// now the common handling
641*b1cdbd2cSJim Jagielski 			static sal_Int32 nIntegerPropertyAttributeIds[] =
642*b1cdbd2cSJim Jagielski 			{	// attribute flags
643*b1cdbd2cSJim Jagielski 				CCA_SIZE, CCA_TAB_INDEX
644*b1cdbd2cSJim Jagielski 			};
645*b1cdbd2cSJim Jagielski 			static const ::rtl::OUString* pIntegerPropertyNames[] =
646*b1cdbd2cSJim Jagielski 			{	// property names
647*b1cdbd2cSJim Jagielski 				&PROPERTY_LINECOUNT, &PROPERTY_TABINDEX
648*b1cdbd2cSJim Jagielski 			};
649*b1cdbd2cSJim Jagielski 			static const sal_Int16 nIntegerPropertyAttrDefaults[] =
650*b1cdbd2cSJim Jagielski 			{	// attribute defaults
651*b1cdbd2cSJim Jagielski 				5, 0
652*b1cdbd2cSJim Jagielski 			};
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski 			if ( m_nIncludeCommon & CCA_MAX_LENGTH )
655*b1cdbd2cSJim Jagielski 				exportedProperty(PROPERTY_MAXTEXTLENGTH);
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
658*b1cdbd2cSJim Jagielski 			sal_Int32 nIdCount = sizeof(nIntegerPropertyAttributeIds) / sizeof(nIntegerPropertyAttributeIds[0]);
659*b1cdbd2cSJim Jagielski 			sal_Int32 nNameCount = sizeof(pIntegerPropertyNames) / sizeof(pIntegerPropertyNames[0]);
660*b1cdbd2cSJim Jagielski 			sal_Int32 nDefaultCount = sizeof(nIntegerPropertyAttrDefaults) / sizeof(nIntegerPropertyAttrDefaults[0]);
661*b1cdbd2cSJim Jagielski 			OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nDefaultCount),
662*b1cdbd2cSJim Jagielski 				"OControlExport::exportCommonControlAttributes: somebody tampered with the maps (3)!");
663*b1cdbd2cSJim Jagielski 		#endif
664*b1cdbd2cSJim Jagielski 			for (i=0; i<sizeof(nIntegerPropertyAttributeIds)/sizeof(nIntegerPropertyAttributeIds[0]); ++i)
665*b1cdbd2cSJim Jagielski 				if (nIntegerPropertyAttributeIds[i] & m_nIncludeCommon)
666*b1cdbd2cSJim Jagielski 				{
667*b1cdbd2cSJim Jagielski 					exportInt16PropertyAttribute(
668*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeNamespace(nIntegerPropertyAttributeIds[i]),
669*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeName(nIntegerPropertyAttributeIds[i]),
670*b1cdbd2cSJim Jagielski 						*(pIntegerPropertyNames[i]),
671*b1cdbd2cSJim Jagielski 						nIntegerPropertyAttrDefaults[i]);
672*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
673*b1cdbd2cSJim Jagielski 					//  reset the bit for later checking
674*b1cdbd2cSJim Jagielski 					m_nIncludeCommon = m_nIncludeCommon & ~nIntegerPropertyAttributeIds[i];
675*b1cdbd2cSJim Jagielski 		#endif
676*b1cdbd2cSJim Jagielski 				}
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 		}
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski 		// --------------------------------------------------------------------
682*b1cdbd2cSJim Jagielski 		// some enum properties
683*b1cdbd2cSJim Jagielski 		{
684*b1cdbd2cSJim Jagielski 			if (m_nIncludeCommon & CCA_BUTTON_TYPE)
685*b1cdbd2cSJim Jagielski 			{
686*b1cdbd2cSJim Jagielski 				exportEnumPropertyAttribute(
687*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace(CCA_BUTTON_TYPE),
688*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName(CCA_BUTTON_TYPE),
689*b1cdbd2cSJim Jagielski 					PROPERTY_BUTTONTYPE,
690*b1cdbd2cSJim Jagielski 					OEnumMapper::getEnumMap(OEnumMapper::epButtonType),
691*b1cdbd2cSJim Jagielski 					FormButtonType_PUSH);
692*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
693*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
694*b1cdbd2cSJim Jagielski 				m_nIncludeCommon = m_nIncludeCommon & ~CCA_BUTTON_TYPE;
695*b1cdbd2cSJim Jagielski 		#endif
696*b1cdbd2cSJim Jagielski 			}
697*b1cdbd2cSJim Jagielski 			if ( m_nIncludeCommon & CCA_ORIENTATION )
698*b1cdbd2cSJim Jagielski 			{
699*b1cdbd2cSJim Jagielski 				exportEnumPropertyAttribute(
700*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace( CCA_ORIENTATION ),
701*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName( CCA_ORIENTATION ),
702*b1cdbd2cSJim Jagielski 					PROPERTY_ORIENTATION,
703*b1cdbd2cSJim Jagielski 					OEnumMapper::getEnumMap( OEnumMapper::epOrientation ),
704*b1cdbd2cSJim Jagielski                     ScrollBarOrientation::HORIZONTAL
705*b1cdbd2cSJim Jagielski                 );
706*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
707*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
708*b1cdbd2cSJim Jagielski 				m_nIncludeCommon = m_nIncludeCommon & ~CCA_ORIENTATION;
709*b1cdbd2cSJim Jagielski 		#endif
710*b1cdbd2cSJim Jagielski 			}
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski             if ( m_nIncludeCommon & CCA_VISUAL_EFFECT )
713*b1cdbd2cSJim Jagielski             {
714*b1cdbd2cSJim Jagielski 				exportEnumPropertyAttribute(
715*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace( CCA_VISUAL_EFFECT ),
716*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName( CCA_VISUAL_EFFECT ),
717*b1cdbd2cSJim Jagielski 					PROPERTY_VISUAL_EFFECT,
718*b1cdbd2cSJim Jagielski 					OEnumMapper::getEnumMap( OEnumMapper::epVisualEffect ),
719*b1cdbd2cSJim Jagielski                     VisualEffect::LOOK3D
720*b1cdbd2cSJim Jagielski                 );
721*b1cdbd2cSJim Jagielski 			#if OSL_DEBUG_LEVEL > 0
722*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
723*b1cdbd2cSJim Jagielski 				m_nIncludeCommon = m_nIncludeCommon & ~CCA_VISUAL_EFFECT;
724*b1cdbd2cSJim Jagielski 			#endif
725*b1cdbd2cSJim Jagielski             }
726*b1cdbd2cSJim Jagielski 		}
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 		// --------------------------------------------------------------------
729*b1cdbd2cSJim Jagielski 		// some properties which require a special handling
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski 		// the target frame
732*b1cdbd2cSJim Jagielski 		if (m_nIncludeCommon & CCA_TARGET_FRAME)
733*b1cdbd2cSJim Jagielski 		{
734*b1cdbd2cSJim Jagielski 			exportTargetFrameAttribute();
735*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
736*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
737*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_TARGET_FRAME;
738*b1cdbd2cSJim Jagielski 		#endif
739*b1cdbd2cSJim Jagielski 		}
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski 		// max text length
742*b1cdbd2cSJim Jagielski 		if ( m_nIncludeCommon & CCA_MAX_LENGTH )
743*b1cdbd2cSJim Jagielski 		{
744*b1cdbd2cSJim Jagielski 			// normally, the respective property would be "MaxTextLen"
745*b1cdbd2cSJim Jagielski 			// However, if the model has a property "PersistenceMaxTextLength", then we prefer this
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski 			// determine the name of the property to export
748*b1cdbd2cSJim Jagielski 			::rtl::OUString sTextLenPropertyName( PROPERTY_MAXTEXTLENGTH );
749*b1cdbd2cSJim Jagielski 			if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_PERSISTENCE_MAXTEXTLENGTH ) )
750*b1cdbd2cSJim Jagielski 				sTextLenPropertyName = PROPERTY_PERSISTENCE_MAXTEXTLENGTH;
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski 			// export it
753*b1cdbd2cSJim Jagielski 			exportInt16PropertyAttribute(
754*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getCommonControlAttributeNamespace( CCA_MAX_LENGTH ),
755*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getCommonControlAttributeName( CCA_MAX_LENGTH ),
756*b1cdbd2cSJim Jagielski 				sTextLenPropertyName,
757*b1cdbd2cSJim Jagielski 				0
758*b1cdbd2cSJim Jagielski 			);
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski 			// in either way, both properties count as "exported"
761*b1cdbd2cSJim Jagielski 			exportedProperty( PROPERTY_MAXTEXTLENGTH );
762*b1cdbd2cSJim Jagielski 			exportedProperty( PROPERTY_PERSISTENCE_MAXTEXTLENGTH );
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
765*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
766*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_MAX_LENGTH;
767*b1cdbd2cSJim Jagielski 		#endif
768*b1cdbd2cSJim Jagielski 		}
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski 		if (m_nIncludeCommon & CCA_TARGET_LOCATION)
771*b1cdbd2cSJim Jagielski 		{
772*b1cdbd2cSJim Jagielski 			exportTargetLocationAttribute(false);
773*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
774*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
775*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_TARGET_LOCATION;
776*b1cdbd2cSJim Jagielski 		#endif
777*b1cdbd2cSJim Jagielski 		}
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski 		// OJ #99721#
780*b1cdbd2cSJim Jagielski 		if (m_nIncludeCommon & CCA_IMAGE_DATA)
781*b1cdbd2cSJim Jagielski 		{
782*b1cdbd2cSJim Jagielski 			exportImageDataAttribute();
783*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
784*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
785*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_IMAGE_DATA;
786*b1cdbd2cSJim Jagielski 		#endif
787*b1cdbd2cSJim Jagielski 		}
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski 		// the for attribute
790*b1cdbd2cSJim Jagielski 		// the target frame
791*b1cdbd2cSJim Jagielski 		if (m_nIncludeCommon & CCA_FOR)
792*b1cdbd2cSJim Jagielski 		{
793*b1cdbd2cSJim Jagielski 			if (m_sReferringControls.getLength())
794*b1cdbd2cSJim Jagielski 			{	// there is at least one control referring to the one we're handling currently
795*b1cdbd2cSJim Jagielski 				AddAttribute(
796*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace(CCA_FOR),
797*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName(CCA_FOR),
798*b1cdbd2cSJim Jagielski 					m_sReferringControls);
799*b1cdbd2cSJim Jagielski 			}
800*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
801*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
802*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~CCA_FOR;
803*b1cdbd2cSJim Jagielski 		#endif
804*b1cdbd2cSJim Jagielski 		}
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski 		if ((CCA_CURRENT_VALUE | CCA_VALUE) & m_nIncludeCommon)
807*b1cdbd2cSJim Jagielski 		{
808*b1cdbd2cSJim Jagielski 			const sal_Char* pCurrentValuePropertyName = NULL;
809*b1cdbd2cSJim Jagielski 			const sal_Char* pValuePropertyName = NULL;
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski 			// get the property names
812*b1cdbd2cSJim Jagielski 			getValuePropertyNames(m_eType, m_nClassId, pCurrentValuePropertyName, pValuePropertyName);
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski 			static const sal_Char* pCurrentValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_VALUE);
815*b1cdbd2cSJim Jagielski 			static const sal_Char* pValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_VALUE);
816*b1cdbd2cSJim Jagielski 			static const sal_uInt16 nCurrentValueAttributeNamespaceKey = OAttributeMetaData::getCommonControlAttributeNamespace(CCA_CURRENT_VALUE);
817*b1cdbd2cSJim Jagielski 			static const sal_uInt16 nValueAttributeNamespaceKey = OAttributeMetaData::getCommonControlAttributeNamespace(CCA_VALUE);
818*b1cdbd2cSJim Jagielski 
819*b1cdbd2cSJim Jagielski 			// add the atrtributes if necessary and possible
820*b1cdbd2cSJim Jagielski 			if (pCurrentValuePropertyName && (CCA_CURRENT_VALUE & m_nIncludeCommon))
821*b1cdbd2cSJim Jagielski             {
822*b1cdbd2cSJim Jagielski                 // don't export the current-value if this value originates from a data binding
823*b1cdbd2cSJim Jagielski                 // #i26944# - 2004-05-17 - fs@openoffice.org
824*b1cdbd2cSJim Jagielski                 if ( controlHasActiveDataBinding() )
825*b1cdbd2cSJim Jagielski                     exportedProperty( ::rtl::OUString::createFromAscii( pCurrentValuePropertyName ) );
826*b1cdbd2cSJim Jagielski                 else
827*b1cdbd2cSJim Jagielski 				    exportGenericPropertyAttribute(
828*b1cdbd2cSJim Jagielski 					    nCurrentValueAttributeNamespaceKey,
829*b1cdbd2cSJim Jagielski 					    pCurrentValueAttributeName,
830*b1cdbd2cSJim Jagielski 					    pCurrentValuePropertyName
831*b1cdbd2cSJim Jagielski                     );
832*b1cdbd2cSJim Jagielski             }
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski 			if (pValuePropertyName && (CCA_VALUE & m_nIncludeCommon))
835*b1cdbd2cSJim Jagielski 				exportGenericPropertyAttribute(
836*b1cdbd2cSJim Jagielski 					nValueAttributeNamespaceKey,
837*b1cdbd2cSJim Jagielski 					pValueAttributeName,
838*b1cdbd2cSJim Jagielski 					pValuePropertyName);
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 			OSL_ENSURE((NULL == pValuePropertyName) == (0 == (CCA_VALUE & m_nIncludeCommon)),
841*b1cdbd2cSJim Jagielski 				"OControlExport::exportCommonControlAttributes: no property found for the value attribute!");
842*b1cdbd2cSJim Jagielski 			OSL_ENSURE((NULL == pCurrentValuePropertyName ) == (0 == (CCA_CURRENT_VALUE & m_nIncludeCommon)),
843*b1cdbd2cSJim Jagielski 				"OControlExport::exportCommonControlAttributes: no property found for the current-value attribute!");
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
846*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
847*b1cdbd2cSJim Jagielski 			m_nIncludeCommon = m_nIncludeCommon & ~(CCA_CURRENT_VALUE | CCA_VALUE);
848*b1cdbd2cSJim Jagielski 		#endif
849*b1cdbd2cSJim Jagielski 		}
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski 		OSL_ENSURE(0 == m_nIncludeCommon,
852*b1cdbd2cSJim Jagielski 			"OControlExport::exportCommonControlAttributes: forgot some flags!");
853*b1cdbd2cSJim Jagielski 			// in the dbg_util version, we should have removed every bit we handled from the mask, so it should
854*b1cdbd2cSJim Jagielski 			// be 0 now ...
855*b1cdbd2cSJim Jagielski 	}
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportDatabaseAttributes()858*b1cdbd2cSJim Jagielski 	void OControlExport::exportDatabaseAttributes()
859*b1cdbd2cSJim Jagielski 	{
860*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
861*b1cdbd2cSJim Jagielski 		sal_Int32 nIncludeDatabase = m_nIncludeDatabase;
862*b1cdbd2cSJim Jagielski #endif
863*b1cdbd2cSJim Jagielski 		// the only string property: DataField
864*b1cdbd2cSJim Jagielski 		if (DA_DATA_FIELD & m_nIncludeDatabase)
865*b1cdbd2cSJim Jagielski 		{
866*b1cdbd2cSJim Jagielski 			exportStringPropertyAttribute(
867*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeNamespace(DA_DATA_FIELD),
868*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeName(DA_DATA_FIELD),
869*b1cdbd2cSJim Jagielski 				PROPERTY_DATAFIELD);
870*b1cdbd2cSJim Jagielski             RESET_BIT( nIncludeDatabase, DA_DATA_FIELD );
871*b1cdbd2cSJim Jagielski 		}
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski         // InputRequired
874*b1cdbd2cSJim Jagielski         if ( DA_INPUT_REQUIRED & m_nIncludeDatabase )
875*b1cdbd2cSJim Jagielski         {
876*b1cdbd2cSJim Jagielski             exportBooleanPropertyAttribute(
877*b1cdbd2cSJim Jagielski                 OAttributeMetaData::getDatabaseAttributeNamespace( DA_INPUT_REQUIRED ),
878*b1cdbd2cSJim Jagielski                 OAttributeMetaData::getDatabaseAttributeName( DA_INPUT_REQUIRED ),
879*b1cdbd2cSJim Jagielski                 PROPERTY_INPUT_REQUIRED,
880*b1cdbd2cSJim Jagielski                 BOOLATTR_DEFAULT_TRUE
881*b1cdbd2cSJim Jagielski             );
882*b1cdbd2cSJim Jagielski             RESET_BIT( nIncludeDatabase, DA_INPUT_REQUIRED );
883*b1cdbd2cSJim Jagielski         }
884*b1cdbd2cSJim Jagielski 
885*b1cdbd2cSJim Jagielski 		// the only int16 property: BoundColumn
886*b1cdbd2cSJim Jagielski 		if (DA_BOUND_COLUMN & m_nIncludeDatabase)
887*b1cdbd2cSJim Jagielski 		{
888*b1cdbd2cSJim Jagielski 			exportInt16PropertyAttribute(
889*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeNamespace(DA_BOUND_COLUMN),
890*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeName(DA_BOUND_COLUMN),
891*b1cdbd2cSJim Jagielski 				PROPERTY_BOUNDCOLUMN,
892*b1cdbd2cSJim Jagielski 				0);
893*b1cdbd2cSJim Jagielski             RESET_BIT( nIncludeDatabase, DA_BOUND_COLUMN );
894*b1cdbd2cSJim Jagielski 		}
895*b1cdbd2cSJim Jagielski 
896*b1cdbd2cSJim Jagielski 		// ConvertEmptyToNull
897*b1cdbd2cSJim Jagielski 		if (DA_CONVERT_EMPTY & m_nIncludeDatabase)
898*b1cdbd2cSJim Jagielski 		{
899*b1cdbd2cSJim Jagielski 			exportBooleanPropertyAttribute(
900*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeNamespace(DA_CONVERT_EMPTY),
901*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeName(DA_CONVERT_EMPTY),
902*b1cdbd2cSJim Jagielski 				PROPERTY_EMPTY_IS_NULL,
903*b1cdbd2cSJim Jagielski 				BOOLATTR_DEFAULT_FALSE
904*b1cdbd2cSJim Jagielski 				);
905*b1cdbd2cSJim Jagielski             RESET_BIT( nIncludeDatabase, DA_CONVERT_EMPTY );
906*b1cdbd2cSJim Jagielski 		}
907*b1cdbd2cSJim Jagielski 
908*b1cdbd2cSJim Jagielski 		// the only enum property: ListSourceType
909*b1cdbd2cSJim Jagielski 		if (DA_LIST_SOURCE_TYPE & m_nIncludeDatabase)
910*b1cdbd2cSJim Jagielski 		{
911*b1cdbd2cSJim Jagielski 			exportEnumPropertyAttribute(
912*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeNamespace(DA_LIST_SOURCE_TYPE),
913*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeName(DA_LIST_SOURCE_TYPE),
914*b1cdbd2cSJim Jagielski 				PROPERTY_LISTSOURCETYPE,
915*b1cdbd2cSJim Jagielski 				OEnumMapper::getEnumMap(OEnumMapper::epListSourceType),
916*b1cdbd2cSJim Jagielski 				ListSourceType_VALUELIST
917*b1cdbd2cSJim Jagielski 				);
918*b1cdbd2cSJim Jagielski             RESET_BIT( nIncludeDatabase, DA_LIST_SOURCE_TYPE );
919*b1cdbd2cSJim Jagielski 		}
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski 		if (m_nIncludeDatabase & DA_LIST_SOURCE)
922*b1cdbd2cSJim Jagielski 		{
923*b1cdbd2cSJim Jagielski 			exportListSourceAsAttribute();
924*b1cdbd2cSJim Jagielski             RESET_BIT( nIncludeDatabase, DA_LIST_SOURCE );
925*b1cdbd2cSJim Jagielski 		}
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
928*b1cdbd2cSJim Jagielski 		OSL_ENSURE(0 == nIncludeDatabase,
929*b1cdbd2cSJim Jagielski 			"OControlExport::exportDatabaseAttributes: forgot some flags!");
930*b1cdbd2cSJim Jagielski 			// in the dbg_util version, we should have removed every bit we handled from the mask, so it should
931*b1cdbd2cSJim Jagielski 			// be 0 now ...
932*b1cdbd2cSJim Jagielski #endif
933*b1cdbd2cSJim Jagielski 	}
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportBindingAtributes()936*b1cdbd2cSJim Jagielski 	void OControlExport::exportBindingAtributes()
937*b1cdbd2cSJim Jagielski     {
938*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
939*b1cdbd2cSJim Jagielski 		sal_Int32 nIncludeBinding = m_nIncludeBindings;
940*b1cdbd2cSJim Jagielski #endif
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski         // ....................................................
943*b1cdbd2cSJim Jagielski         if ( m_nIncludeBindings & BA_LINKED_CELL )
944*b1cdbd2cSJim Jagielski         {
945*b1cdbd2cSJim Jagielski             exportCellBindingAttributes( ( m_nIncludeBindings & BA_LIST_LINKING_TYPE ) != 0 );
946*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
947*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
948*b1cdbd2cSJim Jagielski 			nIncludeBinding = nIncludeBinding & ~( BA_LINKED_CELL | BA_LIST_LINKING_TYPE );
949*b1cdbd2cSJim Jagielski 		#endif
950*b1cdbd2cSJim Jagielski         }
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski         // ....................................................
953*b1cdbd2cSJim Jagielski         if ( m_nIncludeBindings & BA_LIST_CELL_RANGE )
954*b1cdbd2cSJim Jagielski         {
955*b1cdbd2cSJim Jagielski             exportCellListSourceRange();
956*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
957*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
958*b1cdbd2cSJim Jagielski 			nIncludeBinding = nIncludeBinding & ~BA_LIST_CELL_RANGE;
959*b1cdbd2cSJim Jagielski 		#endif
960*b1cdbd2cSJim Jagielski         }
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski         if ( m_nIncludeBindings & BA_XFORMS_BIND )
963*b1cdbd2cSJim Jagielski         {
964*b1cdbd2cSJim Jagielski             exportXFormsBindAttributes();
965*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
966*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
967*b1cdbd2cSJim Jagielski 			nIncludeBinding = nIncludeBinding & ~BA_XFORMS_BIND;
968*b1cdbd2cSJim Jagielski 		#endif
969*b1cdbd2cSJim Jagielski         }
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski         if ( m_nIncludeBindings & BA_XFORMS_LISTBIND )
972*b1cdbd2cSJim Jagielski         {
973*b1cdbd2cSJim Jagielski             exportXFormsListAttributes();
974*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
975*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
976*b1cdbd2cSJim Jagielski 			nIncludeBinding = nIncludeBinding & ~BA_XFORMS_LISTBIND;
977*b1cdbd2cSJim Jagielski 		#endif
978*b1cdbd2cSJim Jagielski         }
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski         if ( m_nIncludeBindings & BA_XFORMS_SUBMISSION )
981*b1cdbd2cSJim Jagielski         {
982*b1cdbd2cSJim Jagielski             exportXFormsSubmissionAttributes();
983*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
984*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
985*b1cdbd2cSJim Jagielski 			nIncludeBinding = nIncludeBinding & ~BA_XFORMS_SUBMISSION;
986*b1cdbd2cSJim Jagielski 		#endif
987*b1cdbd2cSJim Jagielski         }
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski         OSL_ENSURE( 0 == nIncludeBinding,
990*b1cdbd2cSJim Jagielski 			"OControlExport::exportBindingAtributes: forgot some flags!");
991*b1cdbd2cSJim Jagielski 			// in the debug version, we should have removed every bit we handled from the mask, so it should
992*b1cdbd2cSJim Jagielski 			// be 0 now ...
993*b1cdbd2cSJim Jagielski     }
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportSpecialAttributes()996*b1cdbd2cSJim Jagielski 	void OControlExport::exportSpecialAttributes()
997*b1cdbd2cSJim Jagielski 	{
998*b1cdbd2cSJim Jagielski 		sal_Int32 i=0;
999*b1cdbd2cSJim Jagielski 
1000*b1cdbd2cSJim Jagielski 		// ----------------------
1001*b1cdbd2cSJim Jagielski 		// the boolean properties
1002*b1cdbd2cSJim Jagielski 		{
1003*b1cdbd2cSJim Jagielski 			static const sal_Int32 nBooleanPropertyAttributeIds[] =
1004*b1cdbd2cSJim Jagielski 			{	// attribute flags
1005*b1cdbd2cSJim Jagielski 				SCA_VALIDATION, SCA_MULTI_LINE, SCA_AUTOMATIC_COMPLETION, SCA_MULTIPLE, SCA_DEFAULT_BUTTON, SCA_IS_TRISTATE,
1006*b1cdbd2cSJim Jagielski                 SCA_TOGGLE, SCA_FOCUS_ON_CLICK
1007*b1cdbd2cSJim Jagielski 			};
1008*b1cdbd2cSJim Jagielski 			static const ::rtl::OUString* pBooleanPropertyNames[] =
1009*b1cdbd2cSJim Jagielski 			{	// property names
1010*b1cdbd2cSJim Jagielski 				&PROPERTY_STRICTFORMAT, &PROPERTY_MULTILINE, &PROPERTY_AUTOCOMPLETE, &PROPERTY_MULTISELECTION, &PROPERTY_DEFAULTBUTTON, &PROPERTY_TRISTATE,
1011*b1cdbd2cSJim Jagielski                 &PROPERTY_TOGGLE, &PROPERTY_FOCUS_ON_CLICK
1012*b1cdbd2cSJim Jagielski 			};
1013*b1cdbd2cSJim Jagielski 			sal_Int32 nIdCount = sizeof(nBooleanPropertyAttributeIds) / sizeof(nBooleanPropertyAttributeIds[0]);
1014*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
1015*b1cdbd2cSJim Jagielski 			sal_Int32 nNameCount = sizeof(pBooleanPropertyNames) / sizeof(pBooleanPropertyNames[0]);
1016*b1cdbd2cSJim Jagielski 			OSL_ENSURE((nIdCount == nNameCount),
1017*b1cdbd2cSJim Jagielski 				"OControlExport::exportSpecialAttributes: somebody tampered with the maps (1)!");
1018*b1cdbd2cSJim Jagielski 		#endif
1019*b1cdbd2cSJim Jagielski             const sal_Int32* pAttributeId = nBooleanPropertyAttributeIds;
1020*b1cdbd2cSJim Jagielski             const ::rtl::OUString** pPropertyName = pBooleanPropertyNames;
1021*b1cdbd2cSJim Jagielski 			for ( i = 0; i < nIdCount; ++i, ++pAttributeId, ++pPropertyName )
1022*b1cdbd2cSJim Jagielski             {
1023*b1cdbd2cSJim Jagielski 				if ( *pAttributeId& m_nIncludeSpecial)
1024*b1cdbd2cSJim Jagielski 				{
1025*b1cdbd2cSJim Jagielski 					exportBooleanPropertyAttribute(
1026*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeNamespace( *pAttributeId ),
1027*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeName( *pAttributeId ),
1028*b1cdbd2cSJim Jagielski 						*(*pPropertyName),
1029*b1cdbd2cSJim Jagielski                         ( *pAttributeId == SCA_FOCUS_ON_CLICK ) ? BOOLATTR_DEFAULT_TRUE : BOOLATTR_DEFAULT_FALSE
1030*b1cdbd2cSJim Jagielski 					);
1031*b1cdbd2cSJim Jagielski 			#if OSL_DEBUG_LEVEL > 0
1032*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
1033*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = m_nIncludeSpecial & ~*pAttributeId;
1034*b1cdbd2cSJim Jagielski 			#endif
1035*b1cdbd2cSJim Jagielski 				}
1036*b1cdbd2cSJim Jagielski             }
1037*b1cdbd2cSJim Jagielski 		}
1038*b1cdbd2cSJim Jagielski 
1039*b1cdbd2cSJim Jagielski 		// ----------------------
1040*b1cdbd2cSJim Jagielski 		// the integer properties
1041*b1cdbd2cSJim Jagielski 		{
1042*b1cdbd2cSJim Jagielski 			static sal_Int32 nIntegerPropertyAttributeIds[] =
1043*b1cdbd2cSJim Jagielski 			{	// attribute flags
1044*b1cdbd2cSJim Jagielski 				SCA_PAGE_STEP_SIZE
1045*b1cdbd2cSJim Jagielski 			};
1046*b1cdbd2cSJim Jagielski 			static const ::rtl::OUString* pIntegerPropertyNames[] =
1047*b1cdbd2cSJim Jagielski 			{	// property names
1048*b1cdbd2cSJim Jagielski                 &PROPERTY_BLOCK_INCREMENT
1049*b1cdbd2cSJim Jagielski 			};
1050*b1cdbd2cSJim Jagielski 			static const sal_Int32 nIntegerPropertyAttrDefaults[] =
1051*b1cdbd2cSJim Jagielski 			{	// attribute defaults (XML defaults, not runtime defaults!)
1052*b1cdbd2cSJim Jagielski 				10
1053*b1cdbd2cSJim Jagielski 			};
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski             sal_Int32 nIdCount = sizeof( nIntegerPropertyAttributeIds ) / sizeof( nIntegerPropertyAttributeIds[0] );
1056*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
1057*b1cdbd2cSJim Jagielski 			sal_Int32 nNameCount = sizeof( pIntegerPropertyNames ) / sizeof( pIntegerPropertyNames[0] );
1058*b1cdbd2cSJim Jagielski 			OSL_ENSURE( ( nIdCount == nNameCount ),
1059*b1cdbd2cSJim Jagielski 				"OControlExport::exportSpecialAttributes: somebody tampered with the maps (2)!" );
1060*b1cdbd2cSJim Jagielski             sal_Int32 nDefaultCount = sizeof( nIntegerPropertyAttrDefaults ) / sizeof( nIntegerPropertyAttrDefaults[0] );
1061*b1cdbd2cSJim Jagielski 			OSL_ENSURE( ( nIdCount == nDefaultCount ),
1062*b1cdbd2cSJim Jagielski 				"OControlExport::exportSpecialAttributes: somebody tampered with the maps (3)!" );
1063*b1cdbd2cSJim Jagielski 		#endif
1064*b1cdbd2cSJim Jagielski 			for ( i = 0; i < nIdCount; ++i )
1065*b1cdbd2cSJim Jagielski 				if ( nIntegerPropertyAttributeIds[i] & m_nIncludeSpecial )
1066*b1cdbd2cSJim Jagielski 				{
1067*b1cdbd2cSJim Jagielski 					exportInt32PropertyAttribute(
1068*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeNamespace( nIntegerPropertyAttributeIds[i] ),
1069*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeName( nIntegerPropertyAttributeIds[i] ),
1070*b1cdbd2cSJim Jagielski 						*( pIntegerPropertyNames[i] ),
1071*b1cdbd2cSJim Jagielski 						nIntegerPropertyAttrDefaults[i]
1072*b1cdbd2cSJim Jagielski 					);
1073*b1cdbd2cSJim Jagielski 			#if OSL_DEBUG_LEVEL > 0
1074*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
1075*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = m_nIncludeSpecial & ~nIntegerPropertyAttributeIds[i];
1076*b1cdbd2cSJim Jagielski 			#endif
1077*b1cdbd2cSJim Jagielski 				}
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski             if ( SCA_STEP_SIZE & m_nIncludeSpecial )
1080*b1cdbd2cSJim Jagielski             {
1081*b1cdbd2cSJim Jagielski                 ::rtl::OUString sPropertyName;
1082*b1cdbd2cSJim Jagielski                 if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_LINE_INCREMENT ) )
1083*b1cdbd2cSJim Jagielski                     sPropertyName = PROPERTY_LINE_INCREMENT;
1084*b1cdbd2cSJim Jagielski                 else if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_SPIN_INCREMENT ) )
1085*b1cdbd2cSJim Jagielski                     sPropertyName = PROPERTY_SPIN_INCREMENT;
1086*b1cdbd2cSJim Jagielski                 else
1087*b1cdbd2cSJim Jagielski                     OSL_ENSURE( sal_False, "OControlExport::exportSpecialAttributes: not property which can be mapped to step-size attribute!" );
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski                 if ( sPropertyName.getLength() )
1090*b1cdbd2cSJim Jagielski 					exportInt32PropertyAttribute(
1091*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeNamespace( SCA_STEP_SIZE ),
1092*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeName( SCA_STEP_SIZE ),
1093*b1cdbd2cSJim Jagielski 						sPropertyName,
1094*b1cdbd2cSJim Jagielski 						1
1095*b1cdbd2cSJim Jagielski 					);
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski             #if OSL_DEBUG_LEVEL > 0
1098*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
1099*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_STEP_SIZE;
1100*b1cdbd2cSJim Jagielski 			#endif
1101*b1cdbd2cSJim Jagielski             }
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski         }
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 		// -------------------
1106*b1cdbd2cSJim Jagielski 		// the enum properties
1107*b1cdbd2cSJim Jagielski 		{
1108*b1cdbd2cSJim Jagielski 			if (SCA_STATE & m_nIncludeSpecial)
1109*b1cdbd2cSJim Jagielski 			{
1110*b1cdbd2cSJim Jagielski 				exportEnumPropertyAttribute(
1111*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getSpecialAttributeNamespace(SCA_STATE),
1112*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getSpecialAttributeName(SCA_STATE),
1113*b1cdbd2cSJim Jagielski 					PROPERTY_DEFAULT_STATE,
1114*b1cdbd2cSJim Jagielski 					OEnumMapper::getEnumMap(OEnumMapper::epCheckState),
1115*b1cdbd2cSJim Jagielski 					STATE_NOCHECK);
1116*b1cdbd2cSJim Jagielski 			#if OSL_DEBUG_LEVEL > 0
1117*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
1118*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_STATE;
1119*b1cdbd2cSJim Jagielski 			#endif
1120*b1cdbd2cSJim Jagielski 			}
1121*b1cdbd2cSJim Jagielski 
1122*b1cdbd2cSJim Jagielski 			if (SCA_CURRENT_STATE & m_nIncludeSpecial)
1123*b1cdbd2cSJim Jagielski 			{
1124*b1cdbd2cSJim Jagielski 				exportEnumPropertyAttribute(
1125*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getSpecialAttributeNamespace(SCA_CURRENT_STATE),
1126*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getSpecialAttributeName(SCA_CURRENT_STATE),
1127*b1cdbd2cSJim Jagielski 					PROPERTY_STATE,
1128*b1cdbd2cSJim Jagielski 					OEnumMapper::getEnumMap(OEnumMapper::epCheckState),
1129*b1cdbd2cSJim Jagielski 					STATE_NOCHECK);
1130*b1cdbd2cSJim Jagielski 			#if OSL_DEBUG_LEVEL > 0
1131*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
1132*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_CURRENT_STATE;
1133*b1cdbd2cSJim Jagielski 			#endif
1134*b1cdbd2cSJim Jagielski 			}
1135*b1cdbd2cSJim Jagielski 		}
1136*b1cdbd2cSJim Jagielski 
1137*b1cdbd2cSJim Jagielski 		// --------------------------------------------------------------------
1138*b1cdbd2cSJim Jagielski 		// some properties which require a special handling
1139*b1cdbd2cSJim Jagielski         // the repeat delay
1140*b1cdbd2cSJim Jagielski         {
1141*b1cdbd2cSJim Jagielski 		    if ( m_nIncludeSpecial & SCA_REPEAT_DELAY )
1142*b1cdbd2cSJim Jagielski 		    {
1143*b1cdbd2cSJim Jagielski 		        DBG_CHECK_PROPERTY( PROPERTY_REPEAT_DELAY, sal_Int32 );
1144*b1cdbd2cSJim Jagielski 
1145*b1cdbd2cSJim Jagielski                 sal_Int32 nRepeatDelay = 0;
1146*b1cdbd2cSJim Jagielski                 m_xProps->getPropertyValue( PROPERTY_REPEAT_DELAY ) >>= nRepeatDelay;
1147*b1cdbd2cSJim Jagielski                 Time aTime;
1148*b1cdbd2cSJim Jagielski                 aTime.MakeTimeFromMS( nRepeatDelay );
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski 			    AddAttribute(OAttributeMetaData::getSpecialAttributeNamespace( SCA_REPEAT_DELAY )
1151*b1cdbd2cSJim Jagielski 						    ,OAttributeMetaData::getSpecialAttributeName( SCA_REPEAT_DELAY )
1152*b1cdbd2cSJim Jagielski 						    ,SvXMLUnitConverter::convertTimeDuration( aTime, nRepeatDelay % 1000 ) );
1153*b1cdbd2cSJim Jagielski 
1154*b1cdbd2cSJim Jagielski 		        exportedProperty( PROPERTY_REPEAT_DELAY );
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski             #if OSL_DEBUG_LEVEL > 0
1157*b1cdbd2cSJim Jagielski 			    //  reset the bit for later checking
1158*b1cdbd2cSJim Jagielski 			    m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_REPEAT_DELAY;
1159*b1cdbd2cSJim Jagielski 		    #endif
1160*b1cdbd2cSJim Jagielski 		    }
1161*b1cdbd2cSJim Jagielski         }
1162*b1cdbd2cSJim Jagielski 
1163*b1cdbd2cSJim Jagielski 		// ----------------------------------
1164*b1cdbd2cSJim Jagielski 		// the EchoChar property needs special handling, cause it's a Int16, but must be stored as one-character-string
1165*b1cdbd2cSJim Jagielski 		{
1166*b1cdbd2cSJim Jagielski 			if (SCA_ECHO_CHAR & m_nIncludeSpecial)
1167*b1cdbd2cSJim Jagielski 			{
1168*b1cdbd2cSJim Jagielski 				DBG_CHECK_PROPERTY( PROPERTY_ECHO_CHAR, sal_Int16 );
1169*b1cdbd2cSJim Jagielski 				sal_Int16 nValue(0);
1170*b1cdbd2cSJim Jagielski 				m_xProps->getPropertyValue(PROPERTY_ECHO_CHAR) >>= nValue;
1171*b1cdbd2cSJim Jagielski 				if (nValue)
1172*b1cdbd2cSJim Jagielski 				{
1173*b1cdbd2cSJim Jagielski 					::rtl::OUString sCharacter(reinterpret_cast<const sal_Unicode*>(&nValue), 1);
1174*b1cdbd2cSJim Jagielski 					AddAttribute(
1175*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeNamespace(SCA_ECHO_CHAR),
1176*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getSpecialAttributeName(SCA_ECHO_CHAR),
1177*b1cdbd2cSJim Jagielski 						sCharacter);
1178*b1cdbd2cSJim Jagielski 				}
1179*b1cdbd2cSJim Jagielski 				exportedProperty(PROPERTY_ECHO_CHAR);
1180*b1cdbd2cSJim Jagielski 			#if OSL_DEBUG_LEVEL > 0
1181*b1cdbd2cSJim Jagielski 				//  reset the bit for later checking
1182*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_ECHO_CHAR;
1183*b1cdbd2cSJim Jagielski 			#endif
1184*b1cdbd2cSJim Jagielski 			}
1185*b1cdbd2cSJim Jagielski 		}
1186*b1cdbd2cSJim Jagielski 
1187*b1cdbd2cSJim Jagielski 		// ----------------------------------
1188*b1cdbd2cSJim Jagielski 		if ((SCA_MIN_VALUE | SCA_MAX_VALUE) & m_nIncludeSpecial)
1189*b1cdbd2cSJim Jagielski 		{
1190*b1cdbd2cSJim Jagielski 			// need to export the min value and the max value as attributes
1191*b1cdbd2cSJim Jagielski 			// It depends on the real type (FormComponentType) of the control, which properties hold these
1192*b1cdbd2cSJim Jagielski 			// values
1193*b1cdbd2cSJim Jagielski 			const sal_Char* pMinValuePropertyName = NULL;
1194*b1cdbd2cSJim Jagielski 			const sal_Char* pMaxValuePropertyName = NULL;
1195*b1cdbd2cSJim Jagielski 			getValueLimitPropertyNames(m_nClassId, pMinValuePropertyName, pMaxValuePropertyName);
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 			OSL_ENSURE((NULL == pMinValuePropertyName) == (0 == (SCA_MIN_VALUE & m_nIncludeSpecial)),
1198*b1cdbd2cSJim Jagielski 				"OControlExport::exportCommonControlAttributes: no property found for the min value attribute!");
1199*b1cdbd2cSJim Jagielski 			OSL_ENSURE((NULL == pMaxValuePropertyName) == (0 == (SCA_MAX_VALUE & m_nIncludeSpecial)),
1200*b1cdbd2cSJim Jagielski 				"OControlExport::exportCommonControlAttributes: no property found for the max value attribute!");
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski 			// add the two attributes
1203*b1cdbd2cSJim Jagielski 			static const sal_Char* pMinValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MIN_VALUE);
1204*b1cdbd2cSJim Jagielski 			static const sal_Char* pMaxValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MAX_VALUE);
1205*b1cdbd2cSJim Jagielski 			static const sal_uInt16 nMinValueNamespaceKey = OAttributeMetaData::getSpecialAttributeNamespace(SCA_MIN_VALUE);
1206*b1cdbd2cSJim Jagielski 			static const sal_uInt16 nMaxValueNamespaceKey = OAttributeMetaData::getSpecialAttributeNamespace(SCA_MAX_VALUE);
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski 			if (pMinValuePropertyName && (SCA_MIN_VALUE & m_nIncludeSpecial))
1209*b1cdbd2cSJim Jagielski 				exportGenericPropertyAttribute(
1210*b1cdbd2cSJim Jagielski 					nMinValueNamespaceKey,
1211*b1cdbd2cSJim Jagielski 					pMinValueAttributeName,
1212*b1cdbd2cSJim Jagielski 					pMinValuePropertyName);
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski 			if (pMaxValuePropertyName && (SCA_MAX_VALUE & m_nIncludeSpecial))
1215*b1cdbd2cSJim Jagielski 				exportGenericPropertyAttribute(
1216*b1cdbd2cSJim Jagielski 					nMaxValueNamespaceKey,
1217*b1cdbd2cSJim Jagielski 					pMaxValueAttributeName,
1218*b1cdbd2cSJim Jagielski 					pMaxValuePropertyName);
1219*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
1220*b1cdbd2cSJim Jagielski 			//  reset the bit for later checking
1221*b1cdbd2cSJim Jagielski 			m_nIncludeSpecial = m_nIncludeSpecial & ~(SCA_MIN_VALUE | SCA_MAX_VALUE);
1222*b1cdbd2cSJim Jagielski 		#endif
1223*b1cdbd2cSJim Jagielski 		}
1224*b1cdbd2cSJim Jagielski 
1225*b1cdbd2cSJim Jagielski 		// ----------------------------------
1226*b1cdbd2cSJim Jagielski         if ( SCA_IMAGE_POSITION & m_nIncludeSpecial )
1227*b1cdbd2cSJim Jagielski         {
1228*b1cdbd2cSJim Jagielski             exportImagePositionAttributes();
1229*b1cdbd2cSJim Jagielski             RESET_BIT( m_nIncludeSpecial, SCA_IMAGE_POSITION );
1230*b1cdbd2cSJim Jagielski         }
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski 		OSL_ENSURE(0 == m_nIncludeSpecial,
1233*b1cdbd2cSJim Jagielski 			"OControlExport::exportSpecialAttributes: forgot some flags!");
1234*b1cdbd2cSJim Jagielski 			// in the dbg_util version, we should have removed every bit we handled from the mask, so it should
1235*b1cdbd2cSJim Jagielski 			// be 0 now ...
1236*b1cdbd2cSJim Jagielski 	}
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getScalarListSourceValue() const1239*b1cdbd2cSJim Jagielski     ::rtl::OUString OControlExport::getScalarListSourceValue() const
1240*b1cdbd2cSJim Jagielski     {
1241*b1cdbd2cSJim Jagielski 		::rtl::OUString sListSource;
1242*b1cdbd2cSJim Jagielski 		Any aListSource = m_xProps->getPropertyValue( PROPERTY_LISTSOURCE );
1243*b1cdbd2cSJim Jagielski 		if ( !( aListSource >>= sListSource ) )
1244*b1cdbd2cSJim Jagielski 		{
1245*b1cdbd2cSJim Jagielski 			Sequence< ::rtl::OUString > aListSourceSequence;
1246*b1cdbd2cSJim Jagielski 			aListSource >>= aListSourceSequence;
1247*b1cdbd2cSJim Jagielski 			if ( aListSourceSequence.getLength() )
1248*b1cdbd2cSJim Jagielski 				sListSource = aListSourceSequence[ 0 ];
1249*b1cdbd2cSJim Jagielski 		}
1250*b1cdbd2cSJim Jagielski         return sListSource;
1251*b1cdbd2cSJim Jagielski     }
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportListSourceAsAttribute()1254*b1cdbd2cSJim Jagielski 	void OControlExport::exportListSourceAsAttribute()
1255*b1cdbd2cSJim Jagielski 	{
1256*b1cdbd2cSJim Jagielski 		// DA_LIST_SOURCE needs some special handling
1257*b1cdbd2cSJim Jagielski 		DBG_CHECK_PROPERTY_NO_TYPE( PROPERTY_LISTSOURCE );
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski         ::rtl::OUString sListSource = getScalarListSourceValue();
1260*b1cdbd2cSJim Jagielski 		if ( sListSource.getLength() )
1261*b1cdbd2cSJim Jagielski 		{	// the ListSource property needs to be exported as attribute, and it is not empty
1262*b1cdbd2cSJim Jagielski 			AddAttribute(
1263*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeNamespace(DA_LIST_SOURCE),
1264*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getDatabaseAttributeName(DA_LIST_SOURCE),
1265*b1cdbd2cSJim Jagielski 				sListSource);
1266*b1cdbd2cSJim Jagielski 		}
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski         exportedProperty( PROPERTY_LISTSOURCE );
1269*b1cdbd2cSJim Jagielski 	}
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getSequenceInt16PropertyAsSet(const::rtl::OUString & _rPropertyName,Int16Set & _rOut)1272*b1cdbd2cSJim Jagielski 	void OControlExport::getSequenceInt16PropertyAsSet(const ::rtl::OUString& _rPropertyName, Int16Set& _rOut)
1273*b1cdbd2cSJim Jagielski 	{
1274*b1cdbd2cSJim Jagielski 		Sequence< sal_Int16 > aValueSequence;
1275*b1cdbd2cSJim Jagielski 		DBG_CHECK_PROPERTY(_rPropertyName, Sequence< sal_Int16 >);
1276*b1cdbd2cSJim Jagielski 		m_xProps->getPropertyValue(_rPropertyName) >>= aValueSequence;
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski 		const sal_Int16* pValues = aValueSequence.getConstArray();
1279*b1cdbd2cSJim Jagielski 		for (sal_Int32 i=0; i<aValueSequence.getLength(); ++i, ++pValues)
1280*b1cdbd2cSJim Jagielski 			_rOut.insert(*pValues);
1281*b1cdbd2cSJim Jagielski 	}
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportListSourceAsElements()1284*b1cdbd2cSJim Jagielski 	void OControlExport::exportListSourceAsElements()
1285*b1cdbd2cSJim Jagielski 	{
1286*b1cdbd2cSJim Jagielski 		// the string lists
1287*b1cdbd2cSJim Jagielski 		Sequence< ::rtl::OUString > aItems, aValues;
1288*b1cdbd2cSJim Jagielski 		DBG_CHECK_PROPERTY( PROPERTY_STRING_ITEM_LIST, Sequence< ::rtl::OUString > );
1289*b1cdbd2cSJim Jagielski 		m_xProps->getPropertyValue(PROPERTY_STRING_ITEM_LIST) >>= aItems;
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski 		DBG_CHECK_PROPERTY( PROPERTY_LISTSOURCE, Sequence< ::rtl::OUString > );
1292*b1cdbd2cSJim Jagielski 		if ( 0 == ( m_nIncludeDatabase & DA_LIST_SOURCE ) )
1293*b1cdbd2cSJim Jagielski 			m_xProps->getPropertyValue(PROPERTY_LISTSOURCE) >>= aValues;
1294*b1cdbd2cSJim Jagielski 		// if we exported the list source as attribute, we do not repeat it as sub elements
1295*b1cdbd2cSJim Jagielski 
1296*b1cdbd2cSJim Jagielski 		// the selection lists
1297*b1cdbd2cSJim Jagielski 		Int16Set aSelection, aDefaultSelection;
1298*b1cdbd2cSJim Jagielski 		getSequenceInt16PropertyAsSet(PROPERTY_SELECT_SEQ, aSelection);
1299*b1cdbd2cSJim Jagielski 		getSequenceInt16PropertyAsSet(PROPERTY_DEFAULT_SELECT_SEQ, aDefaultSelection);
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski 		// the string for "true"
1302*b1cdbd2cSJim Jagielski 		::rtl::OUString sTrue;
1303*b1cdbd2cSJim Jagielski 		::rtl::OUStringBuffer sBuffer;
1304*b1cdbd2cSJim Jagielski 		m_rContext.getGlobalContext().GetMM100UnitConverter().convertBool(sBuffer, sal_True);
1305*b1cdbd2cSJim Jagielski 		sTrue = sBuffer.makeStringAndClear();
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski 		// loop through both lists ('til the maximum of both lengths)
1308*b1cdbd2cSJim Jagielski 		const ::rtl::OUString* pItems = aItems.getConstArray();
1309*b1cdbd2cSJim Jagielski 		const ::rtl::OUString* pValues = aValues.getConstArray();
1310*b1cdbd2cSJim Jagielski 
1311*b1cdbd2cSJim Jagielski 		sal_Int32 nItems = aItems.getLength();
1312*b1cdbd2cSJim Jagielski 		sal_Int32 nValues = aValues.getLength();
1313*b1cdbd2cSJim Jagielski 
1314*b1cdbd2cSJim Jagielski 		sal_Int16 nMaxLen = (sal_Int16)std::max(nItems, nValues);
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski 		for	(sal_Int16 i=0; i<nMaxLen; ++i )
1317*b1cdbd2cSJim Jagielski 		{
1318*b1cdbd2cSJim Jagielski 			m_rContext.getGlobalContext().ClearAttrList();
1319*b1cdbd2cSJim Jagielski 			if (i < nItems)
1320*b1cdbd2cSJim Jagielski 			{
1321*b1cdbd2cSJim Jagielski 				// there is an item at this position
1322*b1cdbd2cSJim Jagielski 				AddAttribute(
1323*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace(CCA_LABEL),
1324*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL),
1325*b1cdbd2cSJim Jagielski 					*pItems);
1326*b1cdbd2cSJim Jagielski 				++pItems;
1327*b1cdbd2cSJim Jagielski 			}
1328*b1cdbd2cSJim Jagielski 			if (i < nValues)
1329*b1cdbd2cSJim Jagielski 			{
1330*b1cdbd2cSJim Jagielski 				// there is an value at this position
1331*b1cdbd2cSJim Jagielski 				AddAttribute(
1332*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace(CCA_VALUE),
1333*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName(CCA_VALUE),
1334*b1cdbd2cSJim Jagielski 					*pValues);
1335*b1cdbd2cSJim Jagielski 				++pValues;
1336*b1cdbd2cSJim Jagielski 			}
1337*b1cdbd2cSJim Jagielski 
1338*b1cdbd2cSJim Jagielski 			Int16SetIterator aSelectedPos = aSelection.find(i);
1339*b1cdbd2cSJim Jagielski 			if (aSelection.end() != aSelectedPos)
1340*b1cdbd2cSJim Jagielski 			{	// the item at this position is selected
1341*b1cdbd2cSJim Jagielski 				AddAttribute(
1342*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace(CCA_CURRENT_SELECTED),
1343*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_SELECTED),
1344*b1cdbd2cSJim Jagielski 					sTrue
1345*b1cdbd2cSJim Jagielski 					);
1346*b1cdbd2cSJim Jagielski 				aSelection.erase(aSelectedPos);
1347*b1cdbd2cSJim Jagielski 			}
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski 			Int16SetIterator aDefaultSelectedPos = aDefaultSelection.find(i);
1350*b1cdbd2cSJim Jagielski 			if (aDefaultSelection.end() != aDefaultSelectedPos)
1351*b1cdbd2cSJim Jagielski 			{	// the item at this position is selected as default
1352*b1cdbd2cSJim Jagielski 				AddAttribute(
1353*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SELECTED),
1354*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName(CCA_SELECTED),
1355*b1cdbd2cSJim Jagielski 					sTrue
1356*b1cdbd2cSJim Jagielski 					);
1357*b1cdbd2cSJim Jagielski 				aDefaultSelection.erase(aDefaultSelectedPos);
1358*b1cdbd2cSJim Jagielski 			}
1359*b1cdbd2cSJim Jagielski 			SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, "option", sal_True, sal_True);
1360*b1cdbd2cSJim Jagielski 		}
1361*b1cdbd2cSJim Jagielski 
1362*b1cdbd2cSJim Jagielski 		// There may be more "selected" or "default-selected" items than there are in the lists in real,
1363*b1cdbd2cSJim Jagielski 		// so we need to store some additional "form:option" items which have no name and no label, but
1364*b1cdbd2cSJim Jagielski 		// one or both of the selected flags.
1365*b1cdbd2cSJim Jagielski 		// 21.05.2001 - 85388 - frank.schoenheit@germany.sun.com
1366*b1cdbd2cSJim Jagielski 
1367*b1cdbd2cSJim Jagielski 		if ( !aSelection.empty() || !aDefaultSelection.empty() )
1368*b1cdbd2cSJim Jagielski 		{
1369*b1cdbd2cSJim Jagielski 			sal_Int16 nLastSelected = -1;
1370*b1cdbd2cSJim Jagielski 			if ( !aSelection.empty() )
1371*b1cdbd2cSJim Jagielski 				nLastSelected = *(--aSelection.end());
1372*b1cdbd2cSJim Jagielski 
1373*b1cdbd2cSJim Jagielski 			sal_Int16 nLastDefaultSelected = -1;
1374*b1cdbd2cSJim Jagielski 			if ( !aDefaultSelection.empty() )
1375*b1cdbd2cSJim Jagielski 				nLastDefaultSelected = *(--aDefaultSelection.end());
1376*b1cdbd2cSJim Jagielski 
1377*b1cdbd2cSJim Jagielski 			// the maximum element in both sets
1378*b1cdbd2cSJim Jagielski 			sal_Int16 nLastReferredEntry = std::max(nLastSelected, nLastDefaultSelected);
1379*b1cdbd2cSJim Jagielski 			OSL_ENSURE(nLastReferredEntry >= nMaxLen, "OControlExport::exportListSourceAsElements: inconsistence!");
1380*b1cdbd2cSJim Jagielski 				// if the maximum (selected or default selected) entry number is less than the maximum item count
1381*b1cdbd2cSJim Jagielski 				// in both lists, the entry number should have been removed from the set
1382*b1cdbd2cSJim Jagielski 
1383*b1cdbd2cSJim Jagielski 			for (sal_Int16 i=nMaxLen; i<=nLastReferredEntry; ++i)
1384*b1cdbd2cSJim Jagielski 			{
1385*b1cdbd2cSJim Jagielski 				if (aSelection.end() != aSelection.find(i))
1386*b1cdbd2cSJim Jagielski 				{	// the (not existent) item at this position is selected
1387*b1cdbd2cSJim Jagielski 					AddAttribute(
1388*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeNamespace(CCA_CURRENT_SELECTED),
1389*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_SELECTED),
1390*b1cdbd2cSJim Jagielski 						sTrue
1391*b1cdbd2cSJim Jagielski 						);
1392*b1cdbd2cSJim Jagielski 				}
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski 				if (aDefaultSelection.end() != aDefaultSelection.find(i))
1395*b1cdbd2cSJim Jagielski 				{	// the (not existent) item at this position is selected as default
1396*b1cdbd2cSJim Jagielski 					AddAttribute(
1397*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SELECTED),
1398*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getCommonControlAttributeName(CCA_SELECTED),
1399*b1cdbd2cSJim Jagielski 						sTrue
1400*b1cdbd2cSJim Jagielski 						);
1401*b1cdbd2cSJim Jagielski 				}
1402*b1cdbd2cSJim Jagielski 				SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, "option", sal_True, sal_True);
1403*b1cdbd2cSJim Jagielski 			}
1404*b1cdbd2cSJim Jagielski 		}
1405*b1cdbd2cSJim Jagielski 	}
1406*b1cdbd2cSJim Jagielski 
1407*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
implStartElement(const sal_Char * _pName)1408*b1cdbd2cSJim Jagielski 	void OControlExport::implStartElement(const sal_Char* _pName)
1409*b1cdbd2cSJim Jagielski 	{
1410*b1cdbd2cSJim Jagielski 		// before we let the base class start it's outer element, we add a wrapper element
1411*b1cdbd2cSJim Jagielski 		const sal_Char *pOuterElementName = getOuterXMLElementName();
1412*b1cdbd2cSJim Jagielski 		m_pOuterElement = pOuterElementName
1413*b1cdbd2cSJim Jagielski 		   					? new SvXMLElementExport(
1414*b1cdbd2cSJim Jagielski 										m_rContext.getGlobalContext(),
1415*b1cdbd2cSJim Jagielski 										XML_NAMESPACE_FORM,
1416*b1cdbd2cSJim Jagielski 										pOuterElementName, sal_True,
1417*b1cdbd2cSJim Jagielski 										sal_True)
1418*b1cdbd2cSJim Jagielski 							: 0;
1419*b1cdbd2cSJim Jagielski 
1420*b1cdbd2cSJim Jagielski 		// add the attributes for the inner element
1421*b1cdbd2cSJim Jagielski 		exportInnerAttributes();
1422*b1cdbd2cSJim Jagielski 
1423*b1cdbd2cSJim Jagielski 		// and start the inner element
1424*b1cdbd2cSJim Jagielski 		OElementExport::implStartElement(_pName);
1425*b1cdbd2cSJim Jagielski 	}
1426*b1cdbd2cSJim Jagielski 
1427*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
implEndElement()1428*b1cdbd2cSJim Jagielski 	void OControlExport::implEndElement()
1429*b1cdbd2cSJim Jagielski 	{
1430*b1cdbd2cSJim Jagielski 		// end the inner element
1431*b1cdbd2cSJim Jagielski 		OElementExport::implEndElement();
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski 		// end the outer element if it exists
1434*b1cdbd2cSJim Jagielski 		delete m_pOuterElement;
1435*b1cdbd2cSJim Jagielski 		m_pOuterElement = NULL;
1436*b1cdbd2cSJim Jagielski 	}
1437*b1cdbd2cSJim Jagielski 
1438*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getOuterXMLElementName() const1439*b1cdbd2cSJim Jagielski 	const sal_Char* OControlExport::getOuterXMLElementName() const
1440*b1cdbd2cSJim Jagielski 	{
1441*b1cdbd2cSJim Jagielski 		return 0;
1442*b1cdbd2cSJim Jagielski 	}
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getXMLElementName() const1445*b1cdbd2cSJim Jagielski 	const sal_Char* OControlExport::getXMLElementName() const
1446*b1cdbd2cSJim Jagielski 	{
1447*b1cdbd2cSJim Jagielski 		return getElementName(m_eType);
1448*b1cdbd2cSJim Jagielski 	}
1449*b1cdbd2cSJim Jagielski 
1450*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
examine()1451*b1cdbd2cSJim Jagielski 	void OControlExport::examine()
1452*b1cdbd2cSJim Jagielski 	{
1453*b1cdbd2cSJim Jagielski         OSL_ENSURE( ( m_nIncludeCommon == 0 ) && ( m_nIncludeSpecial == 0 ) && ( m_nIncludeDatabase == 0 )
1454*b1cdbd2cSJim Jagielski                  && ( m_nIncludeEvents == 0 ) && ( m_nIncludeBindings == 0),
1455*b1cdbd2cSJim Jagielski                  "OControlExport::examine: called me twice? Not initialized?" );
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski         // get the class id to decide which kind of element we need in the XML stream
1458*b1cdbd2cSJim Jagielski 		m_nClassId = FormComponentType::CONTROL;
1459*b1cdbd2cSJim Jagielski 		DBG_CHECK_PROPERTY( PROPERTY_CLASSID, sal_Int16 );
1460*b1cdbd2cSJim Jagielski 		m_xProps->getPropertyValue(PROPERTY_CLASSID) >>= m_nClassId;
1461*b1cdbd2cSJim Jagielski         bool knownType = false;
1462*b1cdbd2cSJim Jagielski 		switch (m_nClassId)
1463*b1cdbd2cSJim Jagielski 		{
1464*b1cdbd2cSJim Jagielski 			case FormComponentType::DATEFIELD:
1465*b1cdbd2cSJim Jagielski                 m_eType = DATE;
1466*b1cdbd2cSJim Jagielski                 knownType = true;
1467*b1cdbd2cSJim Jagielski                 // NO BREAK
1468*b1cdbd2cSJim Jagielski 			case FormComponentType::TIMEFIELD:
1469*b1cdbd2cSJim Jagielski                 if ( !knownType )
1470*b1cdbd2cSJim Jagielski                 {
1471*b1cdbd2cSJim Jagielski                     m_eType = TIME;
1472*b1cdbd2cSJim Jagielski                     knownType = true;
1473*b1cdbd2cSJim Jagielski                 }
1474*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial |= SCA_VALIDATION;
1475*b1cdbd2cSJim Jagielski                 // NO BREAK
1476*b1cdbd2cSJim Jagielski 			case FormComponentType::NUMERICFIELD:
1477*b1cdbd2cSJim Jagielski 			case FormComponentType::CURRENCYFIELD:
1478*b1cdbd2cSJim Jagielski 			case FormComponentType::PATTERNFIELD:
1479*b1cdbd2cSJim Jagielski                 if ( !knownType )
1480*b1cdbd2cSJim Jagielski                 {
1481*b1cdbd2cSJim Jagielski 				    m_eType = FORMATTED_TEXT;
1482*b1cdbd2cSJim Jagielski                     knownType = true;
1483*b1cdbd2cSJim Jagielski                 }
1484*b1cdbd2cSJim Jagielski 				// NO BREAK
1485*b1cdbd2cSJim Jagielski 			case FormComponentType::TEXTFIELD:
1486*b1cdbd2cSJim Jagielski 			{	// it's some kind of edit. To know which type we need further investigation
1487*b1cdbd2cSJim Jagielski 
1488*b1cdbd2cSJim Jagielski 				if ( !knownType )
1489*b1cdbd2cSJim Jagielski 				{
1490*b1cdbd2cSJim Jagielski 					// check if it's a formatted field
1491*b1cdbd2cSJim Jagielski 					if (m_xPropertyInfo->hasPropertyByName(PROPERTY_FORMATKEY))
1492*b1cdbd2cSJim Jagielski 					{
1493*b1cdbd2cSJim Jagielski 						m_eType = FORMATTED_TEXT;
1494*b1cdbd2cSJim Jagielski 					}
1495*b1cdbd2cSJim Jagielski 					else
1496*b1cdbd2cSJim Jagielski 					{
1497*b1cdbd2cSJim Jagielski 						// all other controls are represented by an ordinary edit control, but which XML control type
1498*b1cdbd2cSJim Jagielski 						// it is depends on the current values of some properties
1499*b1cdbd2cSJim Jagielski 
1500*b1cdbd2cSJim Jagielski 						// if the EchoChar string is not empty, it is a password field
1501*b1cdbd2cSJim Jagielski 						sal_Int16 nEchoChar = 0;
1502*b1cdbd2cSJim Jagielski 						if (m_xPropertyInfo->hasPropertyByName(PROPERTY_ECHOCHAR))
1503*b1cdbd2cSJim Jagielski 							// grid columns do not have this property ....
1504*b1cdbd2cSJim Jagielski 							m_xProps->getPropertyValue(PROPERTY_ECHOCHAR) >>= nEchoChar;
1505*b1cdbd2cSJim Jagielski 						if (nEchoChar)
1506*b1cdbd2cSJim Jagielski 						{
1507*b1cdbd2cSJim Jagielski 							m_eType = PASSWORD;
1508*b1cdbd2cSJim Jagielski 							m_nIncludeSpecial |= SCA_ECHO_CHAR;
1509*b1cdbd2cSJim Jagielski 						}
1510*b1cdbd2cSJim Jagielski 						else
1511*b1cdbd2cSJim Jagielski 						{
1512*b1cdbd2cSJim Jagielski 							// if the MultiLine property is sal_True, it is a TextArea
1513*b1cdbd2cSJim Jagielski 							sal_Bool bMultiLine = sal_False;
1514*b1cdbd2cSJim Jagielski 							if (m_xPropertyInfo->hasPropertyByName(PROPERTY_MULTILINE))
1515*b1cdbd2cSJim Jagielski 								// grid columns do not have this property ....
1516*b1cdbd2cSJim Jagielski 								bMultiLine = ::cppu::any2bool(m_xProps->getPropertyValue(PROPERTY_MULTILINE));
1517*b1cdbd2cSJim Jagielski 
1518*b1cdbd2cSJim Jagielski                             if ( bMultiLine )
1519*b1cdbd2cSJim Jagielski 								m_eType = TEXT_AREA;
1520*b1cdbd2cSJim Jagielski 							else
1521*b1cdbd2cSJim Jagielski 								// the only case left is represented by a Text element
1522*b1cdbd2cSJim Jagielski 								m_eType = TEXT;
1523*b1cdbd2cSJim Jagielski 						}
1524*b1cdbd2cSJim Jagielski 					}
1525*b1cdbd2cSJim Jagielski                     knownType = true;
1526*b1cdbd2cSJim Jagielski 				}
1527*b1cdbd2cSJim Jagielski 
1528*b1cdbd2cSJim Jagielski 				// attributes which are common to all the types:
1529*b1cdbd2cSJim Jagielski 				// common attributes
1530*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1531*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED |
1532*b1cdbd2cSJim Jagielski 					CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE;
1533*b1cdbd2cSJim Jagielski 
1534*b1cdbd2cSJim Jagielski                 if  (   ( m_nClassId != FormComponentType::DATEFIELD )
1535*b1cdbd2cSJim Jagielski                     &&  ( m_nClassId != FormComponentType::TIMEFIELD )
1536*b1cdbd2cSJim Jagielski                     )
1537*b1cdbd2cSJim Jagielski                     // date and time field values are handled differently nowadays
1538*b1cdbd2cSJim Jagielski                     m_nIncludeCommon |= CCA_VALUE;
1539*b1cdbd2cSJim Jagielski 
1540*b1cdbd2cSJim Jagielski                 // database attributes
1541*b1cdbd2cSJim Jagielski 				m_nIncludeDatabase = DA_DATA_FIELD | DA_INPUT_REQUIRED;
1542*b1cdbd2cSJim Jagielski 
1543*b1cdbd2cSJim Jagielski 				// event attributes
1544*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_SELECT;
1545*b1cdbd2cSJim Jagielski 
1546*b1cdbd2cSJim Jagielski 				// only text and pattern fields have a ConvertEmptyToNull property
1547*b1cdbd2cSJim Jagielski 				if  (   ( m_nClassId == FormComponentType::TEXTFIELD )
1548*b1cdbd2cSJim Jagielski                     ||  ( m_nClassId == FormComponentType::PATTERNFIELD )
1549*b1cdbd2cSJim Jagielski                     )
1550*b1cdbd2cSJim Jagielski 					m_nIncludeDatabase |= DA_CONVERT_EMPTY;
1551*b1cdbd2cSJim Jagielski 
1552*b1cdbd2cSJim Jagielski 				// all controls but the file control fields have a readonly property
1553*b1cdbd2cSJim Jagielski 				if ( m_nClassId != FormComponentType::FILECONTROL )
1554*b1cdbd2cSJim Jagielski 					m_nIncludeCommon |= CCA_READONLY;
1555*b1cdbd2cSJim Jagielski 
1556*b1cdbd2cSJim Jagielski 				// a text field has a max text len
1557*b1cdbd2cSJim Jagielski                 if ( m_nClassId == FormComponentType::TEXTFIELD )
1558*b1cdbd2cSJim Jagielski 					m_nIncludeCommon |= CCA_MAX_LENGTH;
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski 				// max and min values and validation:
1561*b1cdbd2cSJim Jagielski 				if (FORMATTED_TEXT == m_eType)
1562*b1cdbd2cSJim Jagielski 				{	// in general all controls represented as formatted-text have these props
1563*b1cdbd2cSJim Jagielski 					if  ( FormComponentType::PATTERNFIELD != m_nClassId )   // except the PatternField
1564*b1cdbd2cSJim Jagielski 						m_nIncludeSpecial |= SCA_MAX_VALUE | SCA_MIN_VALUE;
1565*b1cdbd2cSJim Jagielski 
1566*b1cdbd2cSJim Jagielski 					if (FormComponentType::TEXTFIELD != m_nClassId)
1567*b1cdbd2cSJim Jagielski 						// and the FormattedField does not have a validation flag
1568*b1cdbd2cSJim Jagielski 						m_nIncludeSpecial |= SCA_VALIDATION;
1569*b1cdbd2cSJim Jagielski 				}
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski 				// if it's not a password field or rich text control, the CurrentValue needs to be stored, too
1572*b1cdbd2cSJim Jagielski 				if  (   ( PASSWORD != m_eType )
1573*b1cdbd2cSJim Jagielski                     &&  ( DATE != m_eType )
1574*b1cdbd2cSJim Jagielski                     &&  ( TIME != m_eType )
1575*b1cdbd2cSJim Jagielski                     )
1576*b1cdbd2cSJim Jagielski                 {
1577*b1cdbd2cSJim Jagielski 				    m_nIncludeCommon |= CCA_CURRENT_VALUE;
1578*b1cdbd2cSJim Jagielski                 }
1579*b1cdbd2cSJim Jagielski 			}
1580*b1cdbd2cSJim Jagielski 			break;
1581*b1cdbd2cSJim Jagielski 
1582*b1cdbd2cSJim Jagielski 			case FormComponentType::FILECONTROL:
1583*b1cdbd2cSJim Jagielski 				m_eType = FILE;
1584*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1585*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_CURRENT_VALUE | CCA_DISABLED |
1586*b1cdbd2cSJim Jagielski 					CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE |
1587*b1cdbd2cSJim Jagielski 					CCA_VALUE;
1588*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_SELECT;
1589*b1cdbd2cSJim Jagielski 				break;
1590*b1cdbd2cSJim Jagielski 
1591*b1cdbd2cSJim Jagielski 			case FormComponentType::FIXEDTEXT:
1592*b1cdbd2cSJim Jagielski 				m_eType = FIXED_TEXT;
1593*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1594*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_LABEL |
1595*b1cdbd2cSJim Jagielski 					CCA_PRINTABLE | CCA_TITLE | CCA_FOR;
1596*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = SCA_MULTI_LINE;
1597*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS;
1598*b1cdbd2cSJim Jagielski 				break;
1599*b1cdbd2cSJim Jagielski 
1600*b1cdbd2cSJim Jagielski 			case FormComponentType::COMBOBOX:
1601*b1cdbd2cSJim Jagielski 				m_eType = COMBOBOX;
1602*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1603*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_CURRENT_VALUE |
1604*b1cdbd2cSJim Jagielski 					CCA_DISABLED | CCA_DROPDOWN | CCA_MAX_LENGTH | CCA_PRINTABLE | CCA_READONLY | CCA_SIZE |
1605*b1cdbd2cSJim Jagielski 					CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE | CCA_VALUE;
1606*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = SCA_AUTOMATIC_COMPLETION;
1607*b1cdbd2cSJim Jagielski 				m_nIncludeDatabase = DA_CONVERT_EMPTY | DA_DATA_FIELD | DA_INPUT_REQUIRED | DA_LIST_SOURCE | DA_LIST_SOURCE_TYPE;
1608*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_SELECT;
1609*b1cdbd2cSJim Jagielski 				break;
1610*b1cdbd2cSJim Jagielski 
1611*b1cdbd2cSJim Jagielski 			case FormComponentType::LISTBOX:
1612*b1cdbd2cSJim Jagielski 				m_eType = LISTBOX;
1613*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1614*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_DROPDOWN |
1615*b1cdbd2cSJim Jagielski 					CCA_PRINTABLE | CCA_SIZE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE;
1616*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = SCA_MULTIPLE;
1617*b1cdbd2cSJim Jagielski 				m_nIncludeDatabase = DA_BOUND_COLUMN | DA_DATA_FIELD | DA_INPUT_REQUIRED | DA_LIST_SOURCE_TYPE;
1618*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_CLICK | EA_ON_DBLCLICK;
1619*b1cdbd2cSJim Jagielski 				// check if we need to export the ListSource as attribute
1620*b1cdbd2cSJim Jagielski 				{
1621*b1cdbd2cSJim Jagielski 					// for a list box, if the ListSourceType is VALUE_LIST, no ListSource is stored, but instead
1622*b1cdbd2cSJim Jagielski 					// a sequence of pairs which is build from the StringItemList and the ValueList
1623*b1cdbd2cSJim Jagielski 					ListSourceType eListSourceType = ListSourceType_VALUELIST;
1624*b1cdbd2cSJim Jagielski                 #if OSL_DEBUG_LEVEL > 0
1625*b1cdbd2cSJim Jagielski 					sal_Bool bSuccess =
1626*b1cdbd2cSJim Jagielski 				#endif
1627*b1cdbd2cSJim Jagielski 					m_xProps->getPropertyValue(PROPERTY_LISTSOURCETYPE) >>= eListSourceType;
1628*b1cdbd2cSJim Jagielski 					OSL_ENSURE(bSuccess, "OControlExport::examineControl: could not retrieve the ListSourceType!");
1629*b1cdbd2cSJim Jagielski 					if (ListSourceType_VALUELIST != eListSourceType)
1630*b1cdbd2cSJim Jagielski 					{
1631*b1cdbd2cSJim Jagielski 						m_nIncludeDatabase |= DA_LIST_SOURCE;
1632*b1cdbd2cSJim Jagielski 					}
1633*b1cdbd2cSJim Jagielski 				}
1634*b1cdbd2cSJim Jagielski 
1635*b1cdbd2cSJim Jagielski 				break;
1636*b1cdbd2cSJim Jagielski 
1637*b1cdbd2cSJim Jagielski 			case FormComponentType::COMMANDBUTTON:
1638*b1cdbd2cSJim Jagielski 				m_eType = BUTTON;
1639*b1cdbd2cSJim Jagielski 				m_nIncludeCommon |= CCA_TAB_STOP | CCA_LABEL;
1640*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = SCA_DEFAULT_BUTTON | SCA_TOGGLE | SCA_FOCUS_ON_CLICK | SCA_IMAGE_POSITION | SCA_REPEAT_DELAY;
1641*b1cdbd2cSJim Jagielski 				// NO BREAK !
1642*b1cdbd2cSJim Jagielski 			case FormComponentType::IMAGEBUTTON:
1643*b1cdbd2cSJim Jagielski 				if (BUTTON != m_eType)
1644*b1cdbd2cSJim Jagielski                 {
1645*b1cdbd2cSJim Jagielski 					// not coming from the previous case
1646*b1cdbd2cSJim Jagielski 					m_eType = IMAGE;
1647*b1cdbd2cSJim Jagielski                 }
1648*b1cdbd2cSJim Jagielski 				m_nIncludeCommon |=
1649*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_BUTTON_TYPE | CCA_DISABLED |
1650*b1cdbd2cSJim Jagielski 					CCA_IMAGE_DATA | CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TARGET_FRAME |
1651*b1cdbd2cSJim Jagielski 					CCA_TARGET_LOCATION | CCA_TITLE;
1652*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CLICK	| EA_ON_DBLCLICK;
1653*b1cdbd2cSJim Jagielski 				break;
1654*b1cdbd2cSJim Jagielski 
1655*b1cdbd2cSJim Jagielski 			case FormComponentType::CHECKBOX:
1656*b1cdbd2cSJim Jagielski 				m_eType = CHECKBOX;
1657*b1cdbd2cSJim Jagielski 				m_nIncludeSpecial = SCA_CURRENT_STATE | SCA_IS_TRISTATE | SCA_STATE;
1658*b1cdbd2cSJim Jagielski 				// NO BREAK !
1659*b1cdbd2cSJim Jagielski 			case FormComponentType::RADIOBUTTON:
1660*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1661*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_LABEL | CCA_PRINTABLE |
1662*b1cdbd2cSJim Jagielski                     CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE | CCA_VALUE | CCA_VISUAL_EFFECT;
1663*b1cdbd2cSJim Jagielski 				if (CHECKBOX != m_eType)
1664*b1cdbd2cSJim Jagielski 				{	// not coming from the previous case
1665*b1cdbd2cSJim Jagielski 					m_eType = RADIO;
1666*b1cdbd2cSJim Jagielski 					m_nIncludeCommon |= CCA_CURRENT_SELECTED | CCA_SELECTED;
1667*b1cdbd2cSJim Jagielski 				}
1668*b1cdbd2cSJim Jagielski                 if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_IMAGE_POSITION ) )
1669*b1cdbd2cSJim Jagielski                     m_nIncludeSpecial |= SCA_IMAGE_POSITION;
1670*b1cdbd2cSJim Jagielski 				m_nIncludeDatabase = DA_DATA_FIELD | DA_INPUT_REQUIRED;
1671*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE;
1672*b1cdbd2cSJim Jagielski 				break;
1673*b1cdbd2cSJim Jagielski 
1674*b1cdbd2cSJim Jagielski 			case FormComponentType::GROUPBOX:
1675*b1cdbd2cSJim Jagielski 				m_eType = FRAME;
1676*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1677*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_LABEL |
1678*b1cdbd2cSJim Jagielski 					CCA_PRINTABLE | CCA_TITLE | CCA_FOR;
1679*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS;
1680*b1cdbd2cSJim Jagielski 				break;
1681*b1cdbd2cSJim Jagielski 
1682*b1cdbd2cSJim Jagielski 			case FormComponentType::IMAGECONTROL:
1683*b1cdbd2cSJim Jagielski 				m_eType = IMAGE_FRAME;
1684*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1685*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_IMAGE_DATA |
1686*b1cdbd2cSJim Jagielski 					CCA_PRINTABLE | CCA_READONLY | CCA_TITLE;
1687*b1cdbd2cSJim Jagielski 				m_nIncludeDatabase = DA_DATA_FIELD | DA_INPUT_REQUIRED;
1688*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS;
1689*b1cdbd2cSJim Jagielski 				break;
1690*b1cdbd2cSJim Jagielski 
1691*b1cdbd2cSJim Jagielski 			case FormComponentType::HIDDENCONTROL:
1692*b1cdbd2cSJim Jagielski 				m_eType = HIDDEN;
1693*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1694*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_VALUE;
1695*b1cdbd2cSJim Jagielski 				break;
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski 			case FormComponentType::GRIDCONTROL:
1698*b1cdbd2cSJim Jagielski 				m_eType = GRID;
1699*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1700*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_PRINTABLE |
1701*b1cdbd2cSJim Jagielski 					CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE;
1702*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS;
1703*b1cdbd2cSJim Jagielski 				break;
1704*b1cdbd2cSJim Jagielski 
1705*b1cdbd2cSJim Jagielski 			case FormComponentType::SCROLLBAR:
1706*b1cdbd2cSJim Jagielski 			case FormComponentType::SPINBUTTON:
1707*b1cdbd2cSJim Jagielski 				m_eType = VALUERANGE;
1708*b1cdbd2cSJim Jagielski 				m_nIncludeCommon =
1709*b1cdbd2cSJim Jagielski 					CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_PRINTABLE |
1710*b1cdbd2cSJim Jagielski                     CCA_TITLE | CCA_CURRENT_VALUE | CCA_VALUE | CCA_ORIENTATION;
1711*b1cdbd2cSJim Jagielski                 m_nIncludeSpecial = SCA_MAX_VALUE | SCA_STEP_SIZE | SCA_MIN_VALUE | SCA_REPEAT_DELAY;
1712*b1cdbd2cSJim Jagielski 
1713*b1cdbd2cSJim Jagielski                 if ( m_nClassId == FormComponentType::SCROLLBAR )
1714*b1cdbd2cSJim Jagielski                     m_nIncludeSpecial |= SCA_PAGE_STEP_SIZE ;
1715*b1cdbd2cSJim Jagielski 
1716*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS;
1717*b1cdbd2cSJim Jagielski                 break;
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski             default:
1720*b1cdbd2cSJim Jagielski 				OSL_ENSURE(sal_False, "OControlExport::examineControl: unknown control type (class id)!");
1721*b1cdbd2cSJim Jagielski                 // NO break!
1722*b1cdbd2cSJim Jagielski 
1723*b1cdbd2cSJim Jagielski             case FormComponentType::NAVIGATIONBAR:
1724*b1cdbd2cSJim Jagielski                 // TODO: should we have an own file format for this?
1725*b1cdbd2cSJim Jagielski                 // NO break
1726*b1cdbd2cSJim Jagielski 
1727*b1cdbd2cSJim Jagielski             case FormComponentType::CONTROL:
1728*b1cdbd2cSJim Jagielski 				m_eType = GENERIC_CONTROL;
1729*b1cdbd2cSJim Jagielski 				// unknown control type
1730*b1cdbd2cSJim Jagielski 				m_nIncludeCommon = CCA_NAME | CCA_SERVICE_NAME;
1731*b1cdbd2cSJim Jagielski 					// at least a name should be there, 'cause without a name the control could never have been
1732*b1cdbd2cSJim Jagielski 					// inserted into it's parent container
1733*b1cdbd2cSJim Jagielski 					// In addition, the service name is absolutely necessary to create the control upon reading.
1734*b1cdbd2cSJim Jagielski 				m_nIncludeEvents = EA_CONTROL_EVENTS;
1735*b1cdbd2cSJim Jagielski 					// we always should be able to export events - this is not control type dependent
1736*b1cdbd2cSJim Jagielski 				break;
1737*b1cdbd2cSJim Jagielski 		}
1738*b1cdbd2cSJim Jagielski 
1739*b1cdbd2cSJim Jagielski 		// in general, all control types need to export the control id
1740*b1cdbd2cSJim Jagielski 		m_nIncludeCommon |= CCA_CONTROL_ID;
1741*b1cdbd2cSJim Jagielski 
1742*b1cdbd2cSJim Jagielski         // is is a control bound to a calc cell?
1743*b1cdbd2cSJim Jagielski         if ( FormCellBindingHelper::livesInSpreadsheetDocument( m_xProps ) )
1744*b1cdbd2cSJim Jagielski         {
1745*b1cdbd2cSJim Jagielski             FormCellBindingHelper aHelper( m_xProps, NULL );
1746*b1cdbd2cSJim Jagielski             {
1747*b1cdbd2cSJim Jagielski                 if ( aHelper.isCellBinding( aHelper.getCurrentBinding( ) ) )
1748*b1cdbd2cSJim Jagielski                 {
1749*b1cdbd2cSJim Jagielski                     m_nIncludeBindings |= BA_LINKED_CELL;
1750*b1cdbd2cSJim Jagielski                     if ( m_nClassId == FormComponentType::LISTBOX )
1751*b1cdbd2cSJim Jagielski                         m_nIncludeBindings |= BA_LIST_LINKING_TYPE;
1752*b1cdbd2cSJim Jagielski                 }
1753*b1cdbd2cSJim Jagielski             }
1754*b1cdbd2cSJim Jagielski 
1755*b1cdbd2cSJim Jagielski             // is it a list-like control which uses a calc cell range as list source?
1756*b1cdbd2cSJim Jagielski             {
1757*b1cdbd2cSJim Jagielski                 if ( aHelper.isCellRangeListSource( aHelper.getCurrentListSource( ) ) )
1758*b1cdbd2cSJim Jagielski                     m_nIncludeBindings |= BA_LIST_CELL_RANGE;
1759*b1cdbd2cSJim Jagielski             }
1760*b1cdbd2cSJim Jagielski         }
1761*b1cdbd2cSJim Jagielski 
1762*b1cdbd2cSJim Jagielski         // is control bound to XForms?
1763*b1cdbd2cSJim Jagielski         if( getXFormsBindName( m_xProps ).getLength() > 0 )
1764*b1cdbd2cSJim Jagielski         {
1765*b1cdbd2cSJim Jagielski             m_nIncludeBindings |= BA_XFORMS_BIND;
1766*b1cdbd2cSJim Jagielski         }
1767*b1cdbd2cSJim Jagielski 
1768*b1cdbd2cSJim Jagielski         // is (list-)control bound to XForms list?
1769*b1cdbd2cSJim Jagielski         if( getXFormsListBindName( m_xProps ).getLength() > 0 )
1770*b1cdbd2cSJim Jagielski         {
1771*b1cdbd2cSJim Jagielski             m_nIncludeBindings |= BA_XFORMS_LISTBIND;
1772*b1cdbd2cSJim Jagielski         }
1773*b1cdbd2cSJim Jagielski 
1774*b1cdbd2cSJim Jagielski         // does the control have an XForms submission?
1775*b1cdbd2cSJim Jagielski         if( getXFormsSubmissionName( m_xProps ).getLength() > 0 )
1776*b1cdbd2cSJim Jagielski         {
1777*b1cdbd2cSJim Jagielski             m_nIncludeBindings |= BA_XFORMS_SUBMISSION;
1778*b1cdbd2cSJim Jagielski         }
1779*b1cdbd2cSJim Jagielski 	}
1780*b1cdbd2cSJim Jagielski 
1781*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportCellBindingAttributes(bool _bIncludeListLinkageType)1782*b1cdbd2cSJim Jagielski     void OControlExport::exportCellBindingAttributes( bool _bIncludeListLinkageType )
1783*b1cdbd2cSJim Jagielski     {
1784*b1cdbd2cSJim Jagielski         try
1785*b1cdbd2cSJim Jagielski         {
1786*b1cdbd2cSJim Jagielski             FormCellBindingHelper aHelper( m_xProps, NULL );
1787*b1cdbd2cSJim Jagielski             Reference< XValueBinding > xBinding( aHelper.getCurrentBinding() );
1788*b1cdbd2cSJim Jagielski             OSL_ENSURE( xBinding.is(), "OControlExport::exportCellBindingAttributes: invalid bindable or invalid binding!" );
1789*b1cdbd2cSJim Jagielski             if ( xBinding.is() )
1790*b1cdbd2cSJim Jagielski             {
1791*b1cdbd2cSJim Jagielski                 // ....................................................
1792*b1cdbd2cSJim Jagielski     			AddAttribute(
1793*b1cdbd2cSJim Jagielski                     OAttributeMetaData::getBindingAttributeNamespace( BA_LINKED_CELL ),
1794*b1cdbd2cSJim Jagielski                     OAttributeMetaData::getBindingAttributeName( BA_LINKED_CELL ),
1795*b1cdbd2cSJim Jagielski                     aHelper.getStringAddressFromCellBinding( xBinding )
1796*b1cdbd2cSJim Jagielski                 );
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski                 // ....................................................
1799*b1cdbd2cSJim Jagielski                 if ( _bIncludeListLinkageType )
1800*b1cdbd2cSJim Jagielski                 {
1801*b1cdbd2cSJim Jagielski                     sal_Int16 nLinkageType = aHelper.isCellIntegerBinding( xBinding ) ? 1 : 0;
1802*b1cdbd2cSJim Jagielski 
1803*b1cdbd2cSJim Jagielski                     ::rtl::OUStringBuffer sBuffer;
1804*b1cdbd2cSJim Jagielski 			        m_rContext.getGlobalContext().GetMM100UnitConverter().convertEnum(
1805*b1cdbd2cSJim Jagielski                         sBuffer,
1806*b1cdbd2cSJim Jagielski                         (sal_uInt16)nLinkageType,
1807*b1cdbd2cSJim Jagielski                         OEnumMapper::getEnumMap( OEnumMapper::epListLinkageType )
1808*b1cdbd2cSJim Jagielski                     );
1809*b1cdbd2cSJim Jagielski 
1810*b1cdbd2cSJim Jagielski                     AddAttribute(
1811*b1cdbd2cSJim Jagielski                         OAttributeMetaData::getBindingAttributeNamespace( BA_LIST_LINKING_TYPE ),
1812*b1cdbd2cSJim Jagielski                         OAttributeMetaData::getBindingAttributeName( BA_LIST_LINKING_TYPE ),
1813*b1cdbd2cSJim Jagielski                         sBuffer.makeStringAndClear()
1814*b1cdbd2cSJim Jagielski                     );
1815*b1cdbd2cSJim Jagielski                 }
1816*b1cdbd2cSJim Jagielski 
1817*b1cdbd2cSJim Jagielski             }
1818*b1cdbd2cSJim Jagielski         }
1819*b1cdbd2cSJim Jagielski         catch( const Exception& )
1820*b1cdbd2cSJim Jagielski         {
1821*b1cdbd2cSJim Jagielski             OSL_ENSURE( sal_False, "OControlExport::exportCellBindingAttributes: caught an exception!" );
1822*b1cdbd2cSJim Jagielski         }
1823*b1cdbd2cSJim Jagielski     }
1824*b1cdbd2cSJim Jagielski 
1825*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportXFormsBindAttributes()1826*b1cdbd2cSJim Jagielski     void OControlExport::exportXFormsBindAttributes()
1827*b1cdbd2cSJim Jagielski     {
1828*b1cdbd2cSJim Jagielski         rtl::OUString sBindName = getXFormsBindName( m_xProps );
1829*b1cdbd2cSJim Jagielski         AddAttribute( XML_NAMESPACE_XFORMS, XML_BIND, sBindName );
1830*b1cdbd2cSJim Jagielski     }
1831*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportXFormsListAttributes()1832*b1cdbd2cSJim Jagielski     void OControlExport::exportXFormsListAttributes()
1833*b1cdbd2cSJim Jagielski     {
1834*b1cdbd2cSJim Jagielski         rtl::OUString sBindName = getXFormsListBindName( m_xProps );
1835*b1cdbd2cSJim Jagielski         AddAttribute( XML_NAMESPACE_FORM, XML_XFORMS_LIST_SOURCE, sBindName );
1836*b1cdbd2cSJim Jagielski     }
1837*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportXFormsSubmissionAttributes()1838*b1cdbd2cSJim Jagielski     void OControlExport::exportXFormsSubmissionAttributes()
1839*b1cdbd2cSJim Jagielski     {
1840*b1cdbd2cSJim Jagielski         rtl::OUString sSubmission = getXFormsSubmissionName( m_xProps );
1841*b1cdbd2cSJim Jagielski         AddAttribute( XML_NAMESPACE_FORM, XML_XFORMS_SUBMISSION, sSubmission );
1842*b1cdbd2cSJim Jagielski     }
1843*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportCellListSourceRange()1844*b1cdbd2cSJim Jagielski     void OControlExport::exportCellListSourceRange( )
1845*b1cdbd2cSJim Jagielski     {
1846*b1cdbd2cSJim Jagielski         try
1847*b1cdbd2cSJim Jagielski         {
1848*b1cdbd2cSJim Jagielski             Reference< XListEntrySink > xSink( m_xProps, UNO_QUERY );
1849*b1cdbd2cSJim Jagielski             Reference< XListEntrySource > xSource;
1850*b1cdbd2cSJim Jagielski             if ( xSink.is() )
1851*b1cdbd2cSJim Jagielski                 xSource = xSource.query( xSink->getListEntrySource() );
1852*b1cdbd2cSJim Jagielski             OSL_ENSURE( xSource.is(), "OControlExport::exportCellListSourceRange: list source or sink!" );
1853*b1cdbd2cSJim Jagielski             if ( xSource.is() )
1854*b1cdbd2cSJim Jagielski             {
1855*b1cdbd2cSJim Jagielski                 FormCellBindingHelper aHelper( m_xProps, NULL );
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski     			AddAttribute(
1858*b1cdbd2cSJim Jagielski                     OAttributeMetaData::getBindingAttributeNamespace( BA_LIST_CELL_RANGE ),
1859*b1cdbd2cSJim Jagielski                     OAttributeMetaData::getBindingAttributeName( BA_LIST_CELL_RANGE ),
1860*b1cdbd2cSJim Jagielski                     aHelper.getStringAddressFromCellListSource( xSource )
1861*b1cdbd2cSJim Jagielski                 );
1862*b1cdbd2cSJim Jagielski             }
1863*b1cdbd2cSJim Jagielski         }
1864*b1cdbd2cSJim Jagielski         catch( const Exception& )
1865*b1cdbd2cSJim Jagielski         {
1866*b1cdbd2cSJim Jagielski             OSL_ENSURE( sal_False, "OControlExport::exportCellListSourceRange: caught an exception!" );
1867*b1cdbd2cSJim Jagielski         }
1868*b1cdbd2cSJim Jagielski     }
1869*b1cdbd2cSJim Jagielski 
1870*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportImagePositionAttributes()1871*b1cdbd2cSJim Jagielski     void OControlExport::exportImagePositionAttributes()
1872*b1cdbd2cSJim Jagielski     {
1873*b1cdbd2cSJim Jagielski         try
1874*b1cdbd2cSJim Jagielski         {
1875*b1cdbd2cSJim Jagielski             sal_Int16 nImagePosition = ImagePosition::Centered;
1876*b1cdbd2cSJim Jagielski             OSL_VERIFY( m_xProps->getPropertyValue( PROPERTY_IMAGE_POSITION ) >>= nImagePosition );
1877*b1cdbd2cSJim Jagielski             OSL_ENSURE( ( nImagePosition >= ImagePosition::LeftTop ) && ( nImagePosition <= ImagePosition::Centered ),
1878*b1cdbd2cSJim Jagielski                 "OControlExport::exportImagePositionAttributes: don't know this image position!" );
1879*b1cdbd2cSJim Jagielski 
1880*b1cdbd2cSJim Jagielski             if ( ( nImagePosition < ImagePosition::LeftTop ) || ( nImagePosition > ImagePosition::Centered ) )
1881*b1cdbd2cSJim Jagielski                 // this is important to prevent potential buffer overflows below, so don't optimize
1882*b1cdbd2cSJim Jagielski                 nImagePosition = ImagePosition::Centered;
1883*b1cdbd2cSJim Jagielski 
1884*b1cdbd2cSJim Jagielski             if ( nImagePosition == ImagePosition::Centered )
1885*b1cdbd2cSJim Jagielski             {
1886*b1cdbd2cSJim Jagielski     		    AddAttribute( XML_NAMESPACE_FORM, GetXMLToken( XML_IMAGE_POSITION ), GetXMLToken( XML_CENTER ) );
1887*b1cdbd2cSJim Jagielski             }
1888*b1cdbd2cSJim Jagielski             else
1889*b1cdbd2cSJim Jagielski             {
1890*b1cdbd2cSJim Jagielski                 XMLTokenEnum eXmlImagePositions[] =
1891*b1cdbd2cSJim Jagielski                 {
1892*b1cdbd2cSJim Jagielski                     XML_START, XML_END, XML_TOP, XML_BOTTOM
1893*b1cdbd2cSJim Jagielski                 };
1894*b1cdbd2cSJim Jagielski                 XMLTokenEnum eXmlImageAligns[] =
1895*b1cdbd2cSJim Jagielski                 {
1896*b1cdbd2cSJim Jagielski                     XML_START, XML_CENTER, XML_END
1897*b1cdbd2cSJim Jagielski                 };
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski                 XMLTokenEnum eXmlImagePosition = eXmlImagePositions[ nImagePosition / 3 ];
1900*b1cdbd2cSJim Jagielski                 XMLTokenEnum eXmlImageAlign    = eXmlImageAligns   [ nImagePosition % 3 ];
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski     		    AddAttribute( XML_NAMESPACE_FORM, GetXMLToken( XML_IMAGE_POSITION ), GetXMLToken( eXmlImagePosition ) );
1903*b1cdbd2cSJim Jagielski     		    AddAttribute( XML_NAMESPACE_FORM, GetXMLToken( XML_IMAGE_ALIGN    ), GetXMLToken( eXmlImageAlign    ) );
1904*b1cdbd2cSJim Jagielski             }
1905*b1cdbd2cSJim Jagielski 
1906*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_IMAGE_POSITION );
1907*b1cdbd2cSJim Jagielski             // some of the controls which have an ImagePosition also have an ImageAlign for compatibility
1908*b1cdbd2cSJim Jagielski             // reasons. Since the ImageAlign values simply represent a sub set of the ImagePosition values,
1909*b1cdbd2cSJim Jagielski             // we don't need to export ImageAlign anymore
1910*b1cdbd2cSJim Jagielski             exportedProperty( PROPERTY_IMAGE_ALIGN );
1911*b1cdbd2cSJim Jagielski         }
1912*b1cdbd2cSJim Jagielski         catch( const Exception& )
1913*b1cdbd2cSJim Jagielski         {
1914*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
1915*b1cdbd2cSJim Jagielski         }
1916*b1cdbd2cSJim Jagielski     }
1917*b1cdbd2cSJim Jagielski 
1918*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
controlHasActiveDataBinding() const1919*b1cdbd2cSJim Jagielski 	bool OControlExport::controlHasActiveDataBinding() const
1920*b1cdbd2cSJim Jagielski     {
1921*b1cdbd2cSJim Jagielski         try
1922*b1cdbd2cSJim Jagielski         {
1923*b1cdbd2cSJim Jagielski             // currently exchanging the data with a database column?
1924*b1cdbd2cSJim Jagielski             ::rtl::OUString sBoundFieldPropertyName( RTL_CONSTASCII_USTRINGPARAM( "BoundField" ) );
1925*b1cdbd2cSJim Jagielski             if ( m_xPropertyInfo.is() && m_xPropertyInfo->hasPropertyByName( sBoundFieldPropertyName ) )
1926*b1cdbd2cSJim Jagielski             {
1927*b1cdbd2cSJim Jagielski                 Reference< XPropertySet > xBoundField;
1928*b1cdbd2cSJim Jagielski                 m_xProps->getPropertyValue( sBoundFieldPropertyName ) >>= xBoundField;
1929*b1cdbd2cSJim Jagielski                 if ( xBoundField.is() )
1930*b1cdbd2cSJim Jagielski                     return true;
1931*b1cdbd2cSJim Jagielski             }
1932*b1cdbd2cSJim Jagielski 
1933*b1cdbd2cSJim Jagielski             // currently exchanging data with an external binding?
1934*b1cdbd2cSJim Jagielski             Reference< XBindableValue > xBindable( m_xProps, UNO_QUERY );
1935*b1cdbd2cSJim Jagielski             if ( xBindable.is() && xBindable->getValueBinding().is() )
1936*b1cdbd2cSJim Jagielski                 return true;
1937*b1cdbd2cSJim Jagielski         }
1938*b1cdbd2cSJim Jagielski         catch( const Exception& )
1939*b1cdbd2cSJim Jagielski         {
1940*b1cdbd2cSJim Jagielski         	OSL_ENSURE( sal_False, "OColumnExport::controlHasActiveDataBinding: caught an exception!" );
1941*b1cdbd2cSJim Jagielski         }
1942*b1cdbd2cSJim Jagielski 
1943*b1cdbd2cSJim Jagielski         return false;
1944*b1cdbd2cSJim Jagielski     }
1945*b1cdbd2cSJim Jagielski 
1946*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
controlHasUserSuppliedListEntries() const1947*b1cdbd2cSJim Jagielski 	bool OControlExport::controlHasUserSuppliedListEntries() const
1948*b1cdbd2cSJim Jagielski     {
1949*b1cdbd2cSJim Jagielski         try
1950*b1cdbd2cSJim Jagielski         {
1951*b1cdbd2cSJim Jagielski             // an external list source?
1952*b1cdbd2cSJim Jagielski             Reference< XListEntrySink > xEntrySink( m_xProps, UNO_QUERY );
1953*b1cdbd2cSJim Jagielski             if ( xEntrySink.is() && xEntrySink->getListEntrySource().is() )
1954*b1cdbd2cSJim Jagielski                 return false;
1955*b1cdbd2cSJim Jagielski 
1956*b1cdbd2cSJim Jagielski             if ( m_xPropertyInfo.is() && m_xPropertyInfo->hasPropertyByName( PROPERTY_LISTSOURCETYPE ) )
1957*b1cdbd2cSJim Jagielski             {
1958*b1cdbd2cSJim Jagielski                 ListSourceType eListSourceType = ListSourceType_VALUELIST;
1959*b1cdbd2cSJim Jagielski                 OSL_VERIFY( m_xProps->getPropertyValue( PROPERTY_LISTSOURCETYPE ) >>= eListSourceType );
1960*b1cdbd2cSJim Jagielski                 if ( eListSourceType == ListSourceType_VALUELIST )
1961*b1cdbd2cSJim Jagielski                     // for value lists, the list entries as entered by the user are used
1962*b1cdbd2cSJim Jagielski                     return true;
1963*b1cdbd2cSJim Jagielski 
1964*b1cdbd2cSJim Jagielski                 // for every other type, the list entries are filled with some data obtained
1965*b1cdbd2cSJim Jagielski                 // from a database - if and only if the ListSource property is not empty
1966*b1cdbd2cSJim Jagielski                 return ( 0 == getScalarListSourceValue().getLength() );
1967*b1cdbd2cSJim Jagielski             }
1968*b1cdbd2cSJim Jagielski         }
1969*b1cdbd2cSJim Jagielski         catch( const Exception& )
1970*b1cdbd2cSJim Jagielski         {
1971*b1cdbd2cSJim Jagielski         	OSL_ENSURE( sal_False, "OControlExport::controlHasUserSuppliedListEntries: caught an exception!" );
1972*b1cdbd2cSJim Jagielski         }
1973*b1cdbd2cSJim Jagielski 
1974*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "OControlExport::controlHasUserSuppliedListEntries: unreachable code!" );
1975*b1cdbd2cSJim Jagielski             // this method should be called for list and combo boxes only
1976*b1cdbd2cSJim Jagielski         return true;
1977*b1cdbd2cSJim Jagielski     }
1978*b1cdbd2cSJim Jagielski 
1979*b1cdbd2cSJim Jagielski 	//=====================================================================
1980*b1cdbd2cSJim Jagielski 	//= OColumnExport
1981*b1cdbd2cSJim Jagielski 	//=====================================================================
1982*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
OColumnExport(IFormsExportContext & _rContext,const Reference<XPropertySet> & _rxControl,const::rtl::OUString & _rControlId,const Sequence<ScriptEventDescriptor> & _rEvents)1983*b1cdbd2cSJim Jagielski 	OColumnExport::OColumnExport(IFormsExportContext& _rContext, const Reference< XPropertySet >& _rxControl, const ::rtl::OUString& _rControlId,
1984*b1cdbd2cSJim Jagielski 		const Sequence< ScriptEventDescriptor >& _rEvents)
1985*b1cdbd2cSJim Jagielski 		:OControlExport(_rContext, _rxControl, _rControlId, ::rtl::OUString(), _rEvents)
1986*b1cdbd2cSJim Jagielski 	{
1987*b1cdbd2cSJim Jagielski 	}
1988*b1cdbd2cSJim Jagielski 
1989*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
~OColumnExport()1990*b1cdbd2cSJim Jagielski 	OColumnExport::~OColumnExport()
1991*b1cdbd2cSJim Jagielski 	{
1992*b1cdbd2cSJim Jagielski 		implEndElement();
1993*b1cdbd2cSJim Jagielski 	}
1994*b1cdbd2cSJim Jagielski 
1995*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportServiceNameAttribute()1996*b1cdbd2cSJim Jagielski 	void OColumnExport::exportServiceNameAttribute()
1997*b1cdbd2cSJim Jagielski 	{
1998*b1cdbd2cSJim Jagielski 		// the attribute "service name" (which has a slightly different meaning for columns
1999*b1cdbd2cSJim Jagielski 		DBG_CHECK_PROPERTY( PROPERTY_COLUMNSERVICENAME, ::rtl::OUString );
2000*b1cdbd2cSJim Jagielski 		::rtl::OUString sColumnServiceName;
2001*b1cdbd2cSJim Jagielski 		m_xProps->getPropertyValue(PROPERTY_COLUMNSERVICENAME) >>= sColumnServiceName;
2002*b1cdbd2cSJim Jagielski 		// the service name is a full qualified one (i.e. com.sun.star.form.TextField), but the
2003*b1cdbd2cSJim Jagielski 		// real service name for the column (for use with the XGridColumnFactory) is only the last
2004*b1cdbd2cSJim Jagielski 		// token of this complete name.
2005*b1cdbd2cSJim Jagielski 		sal_Int32 nLastSep = sColumnServiceName.lastIndexOf('.');
2006*b1cdbd2cSJim Jagielski 		OSL_ENSURE(-1 != nLastSep, "OColumnExport::startExportElement: invalid service name!");
2007*b1cdbd2cSJim Jagielski 		sColumnServiceName = sColumnServiceName.copy(nLastSep + 1);
2008*b1cdbd2cSJim Jagielski 		sColumnServiceName =
2009*b1cdbd2cSJim Jagielski 			m_rContext.getGlobalContext().GetNamespaceMap().GetQNameByKey(
2010*b1cdbd2cSJim Jagielski 				XML_NAMESPACE_OOO, sColumnServiceName );
2011*b1cdbd2cSJim Jagielski 		// add the attribute
2012*b1cdbd2cSJim Jagielski 		AddAttribute( OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SERVICE_NAME)
2013*b1cdbd2cSJim Jagielski 					, OAttributeMetaData::getCommonControlAttributeName(CCA_SERVICE_NAME)
2014*b1cdbd2cSJim Jagielski 					, sColumnServiceName);
2015*b1cdbd2cSJim Jagielski 		// flag the property as "handled"
2016*b1cdbd2cSJim Jagielski 		exportedProperty(PROPERTY_COLUMNSERVICENAME);
2017*b1cdbd2cSJim Jagielski 
2018*b1cdbd2cSJim Jagielski 	}
2019*b1cdbd2cSJim Jagielski 
2020*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getOuterXMLElementName() const2021*b1cdbd2cSJim Jagielski 	const sal_Char* OColumnExport::getOuterXMLElementName() const
2022*b1cdbd2cSJim Jagielski 	{
2023*b1cdbd2cSJim Jagielski 		return "column";
2024*b1cdbd2cSJim Jagielski 	}
2025*b1cdbd2cSJim Jagielski 
2026*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportAttributes()2027*b1cdbd2cSJim Jagielski 	void OColumnExport::exportAttributes()
2028*b1cdbd2cSJim Jagielski 	{
2029*b1cdbd2cSJim Jagielski 		OControlExport::exportAttributes();
2030*b1cdbd2cSJim Jagielski 
2031*b1cdbd2cSJim Jagielski 		// the attribute "label"
2032*b1cdbd2cSJim Jagielski 		exportStringPropertyAttribute(
2033*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getCommonControlAttributeNamespace(CCA_LABEL),
2034*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL),
2035*b1cdbd2cSJim Jagielski 			PROPERTY_LABEL);
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski 		// the style attribute
2038*b1cdbd2cSJim Jagielski 		::rtl::OUString sStyleName = m_rContext.getObjectStyleName( m_xProps );
2039*b1cdbd2cSJim Jagielski 		if ( sStyleName.getLength() )
2040*b1cdbd2cSJim Jagielski 		{
2041*b1cdbd2cSJim Jagielski 			AddAttribute(
2042*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getSpecialAttributeNamespace( SCA_COLUMN_STYLE_NAME ),
2043*b1cdbd2cSJim Jagielski 				OAttributeMetaData::getSpecialAttributeName( SCA_COLUMN_STYLE_NAME ),
2044*b1cdbd2cSJim Jagielski 				sStyleName
2045*b1cdbd2cSJim Jagielski 			);
2046*b1cdbd2cSJim Jagielski 		}
2047*b1cdbd2cSJim Jagielski 	}
2048*b1cdbd2cSJim Jagielski 
2049*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
examine()2050*b1cdbd2cSJim Jagielski 	void OColumnExport::examine()
2051*b1cdbd2cSJim Jagielski 	{
2052*b1cdbd2cSJim Jagielski 		OControlExport::examine();
2053*b1cdbd2cSJim Jagielski 
2054*b1cdbd2cSJim Jagielski 		// grid columns miss some properties of the controls they're representing
2055*b1cdbd2cSJim Jagielski 		m_nIncludeCommon &= ~(CCA_FOR | CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_LABEL);
2056*b1cdbd2cSJim Jagielski 		m_nIncludeSpecial &= ~(SCA_ECHO_CHAR | SCA_AUTOMATIC_COMPLETION | SCA_MULTIPLE | SCA_MULTI_LINE);
2057*b1cdbd2cSJim Jagielski 
2058*b1cdbd2cSJim Jagielski 		if (FormComponentType::DATEFIELD != m_nClassId)
2059*b1cdbd2cSJim Jagielski 			// except date fields, no column has the DropDown property
2060*b1cdbd2cSJim Jagielski 			m_nIncludeCommon &= ~CCA_DROPDOWN;
2061*b1cdbd2cSJim Jagielski 	}
2062*b1cdbd2cSJim Jagielski 
2063*b1cdbd2cSJim Jagielski 	//=====================================================================
2064*b1cdbd2cSJim Jagielski 	//= OFormExport
2065*b1cdbd2cSJim Jagielski 	//=====================================================================
2066*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
OFormExport(IFormsExportContext & _rContext,const Reference<XPropertySet> & _rxForm,const Sequence<ScriptEventDescriptor> & _rEvents)2067*b1cdbd2cSJim Jagielski 	OFormExport::OFormExport(IFormsExportContext& _rContext, const Reference< XPropertySet >& _rxForm,
2068*b1cdbd2cSJim Jagielski 		const Sequence< ScriptEventDescriptor >& _rEvents)
2069*b1cdbd2cSJim Jagielski 		:OElementExport(_rContext, _rxForm, _rEvents)
2070*b1cdbd2cSJim Jagielski 		,m_bCreateConnectionResourceElement(sal_False)
2071*b1cdbd2cSJim Jagielski 	{
2072*b1cdbd2cSJim Jagielski 		OSL_ENSURE(m_xProps.is(), "OFormExport::OFormExport: invalid arguments!");
2073*b1cdbd2cSJim Jagielski 	}
2074*b1cdbd2cSJim Jagielski 
2075*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
getXMLElementName() const2076*b1cdbd2cSJim Jagielski 	const sal_Char* OFormExport::getXMLElementName() const
2077*b1cdbd2cSJim Jagielski 	{
2078*b1cdbd2cSJim Jagielski 		return "form";
2079*b1cdbd2cSJim Jagielski 	}
2080*b1cdbd2cSJim Jagielski 
2081*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportSubTags()2082*b1cdbd2cSJim Jagielski 	void OFormExport::exportSubTags()
2083*b1cdbd2cSJim Jagielski 	{
2084*b1cdbd2cSJim Jagielski 		if ( m_bCreateConnectionResourceElement && m_xProps.is() )
2085*b1cdbd2cSJim Jagielski 		{
2086*b1cdbd2cSJim Jagielski 			m_rContext.getGlobalContext().ClearAttrList();
2087*b1cdbd2cSJim Jagielski 			::rtl::OUString sPropValue;
2088*b1cdbd2cSJim Jagielski 			m_xProps->getPropertyValue( PROPERTY_DATASOURCENAME ) >>= sPropValue; // if set it is a file url
2089*b1cdbd2cSJim Jagielski 			if ( !sPropValue.getLength() )
2090*b1cdbd2cSJim Jagielski 				m_xProps->getPropertyValue( PROPERTY_URL ) >>= sPropValue;
2091*b1cdbd2cSJim Jagielski 			if ( sPropValue.getLength() )
2092*b1cdbd2cSJim Jagielski 				AddAttribute(
2093*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeNamespace(CCA_TARGET_LOCATION),
2094*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getCommonControlAttributeName(CCA_TARGET_LOCATION),
2095*b1cdbd2cSJim Jagielski 					sPropValue);
2096*b1cdbd2cSJim Jagielski 			if ( m_rContext.getGlobalContext().GetAttrList().getLength() )
2097*b1cdbd2cSJim Jagielski 			{
2098*b1cdbd2cSJim Jagielski 				SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, xmloff::token::XML_CONNECTION_RESOURCE, sal_True, sal_True);
2099*b1cdbd2cSJim Jagielski 			}
2100*b1cdbd2cSJim Jagielski 		}
2101*b1cdbd2cSJim Jagielski 
2102*b1cdbd2cSJim Jagielski 		// let the base class export the remaining properties and the events
2103*b1cdbd2cSJim Jagielski 		OElementExport::exportSubTags();
2104*b1cdbd2cSJim Jagielski 		// loop through all children
2105*b1cdbd2cSJim Jagielski 		Reference< XIndexAccess > xCollection(m_xProps, UNO_QUERY);
2106*b1cdbd2cSJim Jagielski 		OSL_ENSURE(xCollection.is(), "OFormLayerXMLExport::implExportForm: a form which is not an index access? Suspic�ous!");
2107*b1cdbd2cSJim Jagielski 
2108*b1cdbd2cSJim Jagielski 		if (xCollection.is())
2109*b1cdbd2cSJim Jagielski 			m_rContext.exportCollectionElements(xCollection);
2110*b1cdbd2cSJim Jagielski 	}
2111*b1cdbd2cSJim Jagielski 
2112*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
exportAttributes()2113*b1cdbd2cSJim Jagielski 	void OFormExport::exportAttributes()
2114*b1cdbd2cSJim Jagielski 	{
2115*b1cdbd2cSJim Jagielski 		sal_Int32 i=0;
2116*b1cdbd2cSJim Jagielski 
2117*b1cdbd2cSJim Jagielski 		// ---------------------
2118*b1cdbd2cSJim Jagielski 		// the string properties
2119*b1cdbd2cSJim Jagielski 		{
2120*b1cdbd2cSJim Jagielski 			static FormAttributes eStringPropertyIds[] =
2121*b1cdbd2cSJim Jagielski 			{
2122*b1cdbd2cSJim Jagielski 				faName, /*faAction,*/ faCommand, faFilter, faOrder
2123*b1cdbd2cSJim Jagielski 			};
2124*b1cdbd2cSJim Jagielski 			static ::rtl::OUString aStringPropertyNames[] =
2125*b1cdbd2cSJim Jagielski 			{
2126*b1cdbd2cSJim Jagielski 				PROPERTY_NAME, /*PROPERTY_TARGETURL,*/ PROPERTY_COMMAND, PROPERTY_FILTER, PROPERTY_ORDER
2127*b1cdbd2cSJim Jagielski 			};
2128*b1cdbd2cSJim Jagielski 			sal_Int32 nIdCount = sizeof(eStringPropertyIds) / sizeof(eStringPropertyIds[0]);
2129*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
2130*b1cdbd2cSJim Jagielski 			sal_Int32 nNameCount = sizeof(aStringPropertyNames) / sizeof(aStringPropertyNames[0]);
2131*b1cdbd2cSJim Jagielski 			OSL_ENSURE((nIdCount == nNameCount),
2132*b1cdbd2cSJim Jagielski 				"OFormExport::exportAttributes: somebody tampered with the maps (1)!");
2133*b1cdbd2cSJim Jagielski 		#endif
2134*b1cdbd2cSJim Jagielski 			for (i=0; i<nIdCount; ++i)
2135*b1cdbd2cSJim Jagielski 				exportStringPropertyAttribute(
2136*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getFormAttributeNamespace(eStringPropertyIds[i]),
2137*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getFormAttributeName(eStringPropertyIds[i]),
2138*b1cdbd2cSJim Jagielski 					aStringPropertyNames[i]);
2139*b1cdbd2cSJim Jagielski 
2140*b1cdbd2cSJim Jagielski             // #i112082# xlink:type is added as part of exportTargetLocationAttribute
2141*b1cdbd2cSJim Jagielski 
2142*b1cdbd2cSJim Jagielski             // now export the data source name or databaselocation or connection resource
2143*b1cdbd2cSJim Jagielski 			::rtl::OUString sPropValue;
2144*b1cdbd2cSJim Jagielski 			m_xProps->getPropertyValue( PROPERTY_DATASOURCENAME ) >>= sPropValue;
2145*b1cdbd2cSJim Jagielski             m_bCreateConnectionResourceElement = !sPropValue.getLength();
2146*b1cdbd2cSJim Jagielski 			if ( !m_bCreateConnectionResourceElement )
2147*b1cdbd2cSJim Jagielski 			{
2148*b1cdbd2cSJim Jagielski 				INetURLObject aURL(sPropValue);
2149*b1cdbd2cSJim Jagielski                 m_bCreateConnectionResourceElement = ( aURL.GetProtocol() == INET_PROT_FILE );
2150*b1cdbd2cSJim Jagielski 				if ( !m_bCreateConnectionResourceElement )
2151*b1cdbd2cSJim Jagielski 					exportStringPropertyAttribute(
2152*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getFormAttributeNamespace(faDatasource),
2153*b1cdbd2cSJim Jagielski 						OAttributeMetaData::getFormAttributeName(faDatasource),
2154*b1cdbd2cSJim Jagielski 						PROPERTY_DATASOURCENAME);
2155*b1cdbd2cSJim Jagielski 			}
2156*b1cdbd2cSJim Jagielski 			else
2157*b1cdbd2cSJim Jagielski 				exportedProperty(PROPERTY_URL);
2158*b1cdbd2cSJim Jagielski 			if ( m_bCreateConnectionResourceElement )
2159*b1cdbd2cSJim Jagielski 				exportedProperty(PROPERTY_DATASOURCENAME);
2160*b1cdbd2cSJim Jagielski 		}
2161*b1cdbd2cSJim Jagielski 
2162*b1cdbd2cSJim Jagielski 		// ----------------------
2163*b1cdbd2cSJim Jagielski 		// the boolean properties
2164*b1cdbd2cSJim Jagielski 		{
2165*b1cdbd2cSJim Jagielski 			static FormAttributes eBooleanPropertyIds[] =
2166*b1cdbd2cSJim Jagielski 			{
2167*b1cdbd2cSJim Jagielski 				faAllowDeletes, faAllowInserts, faAllowUpdates, faApplyFilter, faEscapeProcessing, faIgnoreResult
2168*b1cdbd2cSJim Jagielski 			};
2169*b1cdbd2cSJim Jagielski 			static const ::rtl::OUString* pBooleanPropertyNames[] =
2170*b1cdbd2cSJim Jagielski 			{
2171*b1cdbd2cSJim Jagielski 				&PROPERTY_ALLOWDELETES, &PROPERTY_ALLOWINSERTS, &PROPERTY_ALLOWUPDATES, &PROPERTY_APPLYFILTER, &PROPERTY_ESCAPEPROCESSING, &PROPERTY_IGNORERESULT
2172*b1cdbd2cSJim Jagielski 			};
2173*b1cdbd2cSJim Jagielski 			static sal_Int8 nBooleanPropertyAttrFlags[] =
2174*b1cdbd2cSJim Jagielski 			{
2175*b1cdbd2cSJim Jagielski 				BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_FALSE
2176*b1cdbd2cSJim Jagielski 			};
2177*b1cdbd2cSJim Jagielski 			sal_Int32 nIdCount = sizeof(eBooleanPropertyIds) / sizeof(eBooleanPropertyIds[0]);
2178*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
2179*b1cdbd2cSJim Jagielski 			sal_Int32 nNameCount = sizeof(pBooleanPropertyNames) / sizeof(pBooleanPropertyNames[0]);
2180*b1cdbd2cSJim Jagielski 			sal_Int32 nFlagsCount = sizeof(nBooleanPropertyAttrFlags) / sizeof(nBooleanPropertyAttrFlags[0]);
2181*b1cdbd2cSJim Jagielski 			OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nFlagsCount),
2182*b1cdbd2cSJim Jagielski 				"OFormExport::exportAttributes: somebody tampered with the maps (2)!");
2183*b1cdbd2cSJim Jagielski 		#endif
2184*b1cdbd2cSJim Jagielski 			for (i=0; i<nIdCount; ++i)
2185*b1cdbd2cSJim Jagielski 				exportBooleanPropertyAttribute(
2186*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getFormAttributeNamespace(eBooleanPropertyIds[i]),
2187*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getFormAttributeName(eBooleanPropertyIds[i]),
2188*b1cdbd2cSJim Jagielski 					*(pBooleanPropertyNames[i]),
2189*b1cdbd2cSJim Jagielski 					nBooleanPropertyAttrFlags[i]
2190*b1cdbd2cSJim Jagielski 				);
2191*b1cdbd2cSJim Jagielski 		}
2192*b1cdbd2cSJim Jagielski 
2193*b1cdbd2cSJim Jagielski 		// -------------------
2194*b1cdbd2cSJim Jagielski 		// the enum properties
2195*b1cdbd2cSJim Jagielski 		{
2196*b1cdbd2cSJim Jagielski 			static FormAttributes eEnumPropertyIds[] =
2197*b1cdbd2cSJim Jagielski 			{
2198*b1cdbd2cSJim Jagielski 				faEnctype, faMethod, faCommandType, faNavigationMode, faTabbingCycle
2199*b1cdbd2cSJim Jagielski 			};
2200*b1cdbd2cSJim Jagielski 			static const sal_Char* pEnumPropertyNames[] =
2201*b1cdbd2cSJim Jagielski 			{
2202*b1cdbd2cSJim Jagielski 				PROPERTY_SUBMIT_ENCODING, PROPERTY_SUBMIT_METHOD, PROPERTY_COMMAND_TYPE, PROPERTY_NAVIGATION, PROPERTY_CYCLE
2203*b1cdbd2cSJim Jagielski 			};
2204*b1cdbd2cSJim Jagielski 			static OEnumMapper::EnumProperties eEnumPropertyMaps[] =
2205*b1cdbd2cSJim Jagielski 			{
2206*b1cdbd2cSJim Jagielski 				OEnumMapper::epSubmitEncoding, OEnumMapper::epSubmitMethod, OEnumMapper::epCommandType, OEnumMapper::epNavigationType, OEnumMapper::epTabCyle
2207*b1cdbd2cSJim Jagielski 			};
2208*b1cdbd2cSJim Jagielski 			static sal_Int32 nEnumPropertyAttrDefaults[] =
2209*b1cdbd2cSJim Jagielski 			{
2210*b1cdbd2cSJim Jagielski 				FormSubmitEncoding_URL, FormSubmitMethod_GET, CommandType::COMMAND, NavigationBarMode_CURRENT, TabulatorCycle_RECORDS
2211*b1cdbd2cSJim Jagielski 			};
2212*b1cdbd2cSJim Jagielski 			static sal_Bool nEnumPropertyAttrDefaultFlags[] =
2213*b1cdbd2cSJim Jagielski 			{
2214*b1cdbd2cSJim Jagielski 				sal_False, sal_False, sal_False, sal_False, sal_True
2215*b1cdbd2cSJim Jagielski 			};
2216*b1cdbd2cSJim Jagielski 			sal_Int32 nIdCount = sizeof(eEnumPropertyIds) / sizeof(eEnumPropertyIds[0]);
2217*b1cdbd2cSJim Jagielski 		#if OSL_DEBUG_LEVEL > 0
2218*b1cdbd2cSJim Jagielski 			sal_Int32 nNameCount = sizeof(pEnumPropertyNames) / sizeof(pEnumPropertyNames[0]);
2219*b1cdbd2cSJim Jagielski 			sal_Int32 nDefaultCount = sizeof(nEnumPropertyAttrDefaults) / sizeof(nEnumPropertyAttrDefaults[0]);
2220*b1cdbd2cSJim Jagielski 			sal_Int32 nDefaultFlagCount = sizeof(nEnumPropertyAttrDefaultFlags) / sizeof(nEnumPropertyAttrDefaultFlags[0]);
2221*b1cdbd2cSJim Jagielski 			sal_Int32 nMapCount = sizeof(eEnumPropertyMaps) / sizeof(eEnumPropertyMaps[0]);
2222*b1cdbd2cSJim Jagielski 			OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nDefaultCount) && (nDefaultCount == nDefaultFlagCount) && (nDefaultFlagCount == nMapCount),
2223*b1cdbd2cSJim Jagielski 				"OFormExport::exportAttributes: somebody tampered with the maps (3)!");
2224*b1cdbd2cSJim Jagielski 		#endif
2225*b1cdbd2cSJim Jagielski 			for (i=0; i<nIdCount; ++i)
2226*b1cdbd2cSJim Jagielski 				exportEnumPropertyAttribute(
2227*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getFormAttributeNamespace(eEnumPropertyIds[i]),
2228*b1cdbd2cSJim Jagielski 					OAttributeMetaData::getFormAttributeName(eEnumPropertyIds[i]),
2229*b1cdbd2cSJim Jagielski 					pEnumPropertyNames[i],
2230*b1cdbd2cSJim Jagielski 					OEnumMapper::getEnumMap(eEnumPropertyMaps[i]),
2231*b1cdbd2cSJim Jagielski 					nEnumPropertyAttrDefaults[i],
2232*b1cdbd2cSJim Jagielski 					nEnumPropertyAttrDefaultFlags[i]
2233*b1cdbd2cSJim Jagielski                 );
2234*b1cdbd2cSJim Jagielski 		}
2235*b1cdbd2cSJim Jagielski 
2236*b1cdbd2cSJim Jagielski 		// the service name
2237*b1cdbd2cSJim Jagielski 		exportServiceNameAttribute();
2238*b1cdbd2cSJim Jagielski 		// the target frame
2239*b1cdbd2cSJim Jagielski 		exportTargetFrameAttribute();
2240*b1cdbd2cSJim Jagielski 		// the target URL
2241*b1cdbd2cSJim Jagielski 		exportTargetLocationAttribute(true);    // #i110911# add type attribute (for form, but not for control)
2242*b1cdbd2cSJim Jagielski 
2243*b1cdbd2cSJim Jagielski 		// master fields
2244*b1cdbd2cSJim Jagielski 		exportStringSequenceAttribute(
2245*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getFormAttributeNamespace(faMasterFields),
2246*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getFormAttributeName(faMasterFields),
2247*b1cdbd2cSJim Jagielski 			PROPERTY_MASTERFIELDS);
2248*b1cdbd2cSJim Jagielski 		// detail fields
2249*b1cdbd2cSJim Jagielski 		exportStringSequenceAttribute(
2250*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getFormAttributeNamespace(faDetailFiels),
2251*b1cdbd2cSJim Jagielski 			OAttributeMetaData::getFormAttributeName(faDetailFiels),
2252*b1cdbd2cSJim Jagielski 			PROPERTY_DETAILFIELDS);
2253*b1cdbd2cSJim Jagielski 	}
2254*b1cdbd2cSJim Jagielski //.........................................................................
2255*b1cdbd2cSJim Jagielski }	// namespace xmloff
2256*b1cdbd2cSJim Jagielski //.........................................................................
2257