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