1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "elementimport.hxx" 32*cdf0e10cSrcweir #include "xmloff/xmlimp.hxx" 33*cdf0e10cSrcweir #include "xmloff/nmspmap.hxx" 34*cdf0e10cSrcweir #include "xmloff/xmluconv.hxx" 35*cdf0e10cSrcweir #include "strings.hxx" 36*cdf0e10cSrcweir #include "callbacks.hxx" 37*cdf0e10cSrcweir #include "attriblistmerge.hxx" 38*cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 39*cdf0e10cSrcweir #include "eventimport.hxx" 40*cdf0e10cSrcweir #include "xmloff/txtstyli.hxx" 41*cdf0e10cSrcweir #include "formenums.hxx" 42*cdf0e10cSrcweir #include "xmloff/xmltoken.hxx" 43*cdf0e10cSrcweir #include "gridcolumnproptranslator.hxx" 44*cdf0e10cSrcweir #include "property_description.hxx" 45*cdf0e10cSrcweir #include "property_meta_data.hxx" 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir /** === begin UNO includes === **/ 48*cdf0e10cSrcweir #include <com/sun/star/text/XText.hpp> 49*cdf0e10cSrcweir #include <com/sun/star/util/XCloneable.hpp> 50*cdf0e10cSrcweir #include <com/sun/star/form/FormComponentType.hpp> 51*cdf0e10cSrcweir #include <com/sun/star/awt/ImagePosition.hpp> 52*cdf0e10cSrcweir #include <com/sun/star/beans/XMultiPropertySet.hpp> 53*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertyContainer.hpp> 54*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp> 55*cdf0e10cSrcweir /** === end UNO includes === **/ 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir #include <tools/urlobj.hxx> 58*cdf0e10cSrcweir #include <tools/diagnose_ex.h> 59*cdf0e10cSrcweir #include <tools/time.hxx> 60*cdf0e10cSrcweir #include <rtl/logfile.hxx> 61*cdf0e10cSrcweir #include <comphelper/extract.hxx> 62*cdf0e10cSrcweir #include <comphelper/types.hxx> 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir #include <algorithm> 65*cdf0e10cSrcweir #include <functional> 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir //......................................................................... 68*cdf0e10cSrcweir namespace xmloff 69*cdf0e10cSrcweir { 70*cdf0e10cSrcweir //......................................................................... 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir using namespace ::xmloff::token; 73*cdf0e10cSrcweir using namespace ::com::sun::star; 74*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 75*cdf0e10cSrcweir using namespace ::com::sun::star::awt; 76*cdf0e10cSrcweir using namespace ::com::sun::star::container; 77*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 78*cdf0e10cSrcweir using namespace ::com::sun::star::script; 79*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 80*cdf0e10cSrcweir using namespace ::com::sun::star::form; 81*cdf0e10cSrcweir using namespace ::com::sun::star::xml; 82*cdf0e10cSrcweir using namespace ::com::sun::star::util; 83*cdf0e10cSrcweir using namespace ::com::sun::star::text; 84*cdf0e10cSrcweir using namespace ::comphelper; 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir #define PROPID_VALUE 1 87*cdf0e10cSrcweir #define PROPID_CURRENT_VALUE 2 88*cdf0e10cSrcweir #define PROPID_MIN_VALUE 3 89*cdf0e10cSrcweir #define PROPID_MAX_VALUE 4 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir //===================================================================== 92*cdf0e10cSrcweir struct PropertyValueLess 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir sal_Bool operator()(const PropertyValue& _rLeft, const PropertyValue& _rRight) 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir return _rLeft.Name < _rRight.Name; 97*cdf0e10cSrcweir } 98*cdf0e10cSrcweir }; 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir //===================================================================== 101*cdf0e10cSrcweir struct PropertyValueCompare : public ::std::binary_function< PropertyValue, ::rtl::OUString, bool> 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir bool operator() (const PropertyValue& lhs, const ::rtl::OUString& rhs) const 104*cdf0e10cSrcweir { 105*cdf0e10cSrcweir return lhs.Name == rhs; 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir bool operator() (const ::rtl::OUString& lhs, const PropertyValue& rhs) const 108*cdf0e10cSrcweir { 109*cdf0e10cSrcweir return lhs == rhs.Name; 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir }; 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir //===================================================================== 114*cdf0e10cSrcweir template <class ELEMENT> 115*cdf0e10cSrcweir void pushBackSequenceElement(Sequence< ELEMENT >& _rContainer, const ELEMENT& _rElement) 116*cdf0e10cSrcweir { 117*cdf0e10cSrcweir sal_Int32 nLen = _rContainer.getLength(); 118*cdf0e10cSrcweir _rContainer.realloc(nLen + 1); 119*cdf0e10cSrcweir _rContainer[nLen] = _rElement; 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir //===================================================================== 123*cdf0e10cSrcweir //= OElementNameMap 124*cdf0e10cSrcweir //===================================================================== 125*cdf0e10cSrcweir //--------------------------------------------------------------------- 126*cdf0e10cSrcweir OElementNameMap::MapString2Element OElementNameMap::s_sElementTranslations; 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir //--------------------------------------------------------------------- 129*cdf0e10cSrcweir const OControlElement::ElementType& operator ++(OControlElement::ElementType& _e) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir OControlElement::ElementType e = _e; 132*cdf0e10cSrcweir sal_Int32 nAsInt = static_cast<sal_Int32>(e); 133*cdf0e10cSrcweir _e = static_cast<OControlElement::ElementType>( ++nAsInt ); 134*cdf0e10cSrcweir return _e; 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir //--------------------------------------------------------------------- 138*cdf0e10cSrcweir OControlElement::ElementType OElementNameMap::getElementType(const ::rtl::OUString& _rName) 139*cdf0e10cSrcweir { 140*cdf0e10cSrcweir if ( s_sElementTranslations.empty() ) 141*cdf0e10cSrcweir { // initialize 142*cdf0e10cSrcweir for (ElementType eType=(ElementType)0; eType<UNKNOWN; ++eType) 143*cdf0e10cSrcweir s_sElementTranslations[::rtl::OUString::createFromAscii(getElementName(eType))] = eType; 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir ConstMapString2ElementIterator aPos = s_sElementTranslations.find(_rName); 146*cdf0e10cSrcweir if (s_sElementTranslations.end() != aPos) 147*cdf0e10cSrcweir return aPos->second; 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir return UNKNOWN; 150*cdf0e10cSrcweir } 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir //===================================================================== 153*cdf0e10cSrcweir //= OElementImport 154*cdf0e10cSrcweir //===================================================================== 155*cdf0e10cSrcweir //--------------------------------------------------------------------- 156*cdf0e10cSrcweir OElementImport::OElementImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 157*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer) 158*cdf0e10cSrcweir :OPropertyImport(_rImport, _nPrefix, _rName) 159*cdf0e10cSrcweir ,m_rFormImport(_rImport) 160*cdf0e10cSrcweir ,m_rEventManager(_rEventManager) 161*cdf0e10cSrcweir ,m_pStyleElement( NULL ) 162*cdf0e10cSrcweir ,m_xParentContainer(_rxParentContainer) 163*cdf0e10cSrcweir ,m_bImplicitGenericAttributeHandling( true ) 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir OSL_ENSURE(m_xParentContainer.is(), "OElementImport::OElementImport: invalid parent container!"); 166*cdf0e10cSrcweir } 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir //--------------------------------------------------------------------- 169*cdf0e10cSrcweir OElementImport::~OElementImport() 170*cdf0e10cSrcweir { 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir //--------------------------------------------------------------------- 174*cdf0e10cSrcweir ::rtl::OUString OElementImport::determineDefaultServiceName() const 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir return ::rtl::OUString(); 177*cdf0e10cSrcweir } 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir //--------------------------------------------------------------------- 180*cdf0e10cSrcweir void OElementImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir ENTER_LOG_CONTEXT( "xmloff::OElementImport - importing one element" ); 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir const SvXMLNamespaceMap& rMap = m_rContext.getGlobalContext().GetNamespaceMap(); 185*cdf0e10cSrcweir const ::rtl::OUString sImplNameAttribute = rMap.GetQNameByKey( XML_NAMESPACE_FORM, GetXMLToken( XML_CONTROL_IMPLEMENTATION ) ); 186*cdf0e10cSrcweir const ::rtl::OUString sControlImplementation = _rxAttrList->getValueByName( sImplNameAttribute ); 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir // retrieve the service name 189*cdf0e10cSrcweir if ( sControlImplementation.getLength() > 0 ) 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir ::rtl::OUString sOOoImplementationName; 192*cdf0e10cSrcweir const sal_uInt16 nImplPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sControlImplementation, &sOOoImplementationName ); 193*cdf0e10cSrcweir m_sServiceName = ( nImplPrefix == XML_NAMESPACE_OOO ) ? sOOoImplementationName : sControlImplementation; 194*cdf0e10cSrcweir } 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir if ( !m_sServiceName.getLength() ) 197*cdf0e10cSrcweir determineDefaultServiceName(); 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir // create the object *now*. This allows setting properties in the various handleAttribute methods. 200*cdf0e10cSrcweir // (Though currently not all code is migrated to this pattern, most attributes are still handled 201*cdf0e10cSrcweir // by remembering the value (via implPushBackPropertyValue), and setting the correct property value 202*cdf0e10cSrcweir // later (in OControlImport::StartElement).) 203*cdf0e10cSrcweir m_xElement = createElement(); 204*cdf0e10cSrcweir if ( m_xElement.is() ) 205*cdf0e10cSrcweir m_xInfo = m_xElement->getPropertySetInfo(); 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir // call the base class 208*cdf0e10cSrcweir OPropertyImport::StartElement( _rxAttrList ); 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir //--------------------------------------------------------------------- 212*cdf0e10cSrcweir SvXMLImportContext* OElementImport::CreateChildContext(sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, 213*cdf0e10cSrcweir const Reference< sax::XAttributeList >& _rxAttrList) 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir if( token::IsXMLToken(_rLocalName, token::XML_EVENT_LISTENERS) && (XML_NAMESPACE_OFFICE == _nPrefix)) 216*cdf0e10cSrcweir return new OFormEventsImportContext(m_rFormImport.getGlobalContext(), _nPrefix, _rLocalName, *this); 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir return OPropertyImport::CreateChildContext(_nPrefix, _rLocalName, _rxAttrList); 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir //--------------------------------------------------------------------- 222*cdf0e10cSrcweir void OElementImport::EndElement() 223*cdf0e10cSrcweir { 224*cdf0e10cSrcweir OSL_ENSURE(m_xElement.is(), "OElementImport::EndElement: invalid element created!"); 225*cdf0e10cSrcweir if (!m_xElement.is()) 226*cdf0e10cSrcweir return; 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir // apply the non-generic properties 229*cdf0e10cSrcweir implApplySpecificProperties(); 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir // set the generic properties 232*cdf0e10cSrcweir implApplyGenericProperties(); 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir // set the style properties 235*cdf0e10cSrcweir if ( m_pStyleElement && m_xElement.is() ) 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir Reference< XPropertySet > xPropTranslation = 238*cdf0e10cSrcweir new OGridColumnPropertyTranslator( Reference< XMultiPropertySet >( m_xElement, UNO_QUERY ) ); 239*cdf0e10cSrcweir const_cast< XMLTextStyleContext* >( m_pStyleElement )->FillPropertySet( xPropTranslation ); 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir const ::rtl::OUString sNumberStyleName = const_cast< XMLTextStyleContext* >( m_pStyleElement )->GetDataStyleName( ); 242*cdf0e10cSrcweir if ( sNumberStyleName.getLength() ) 243*cdf0e10cSrcweir // the style also has a number (sub) style 244*cdf0e10cSrcweir m_rContext.applyControlNumberStyle( m_xElement, sNumberStyleName ); 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir // insert the element into the parent container 248*cdf0e10cSrcweir if (!m_sName.getLength()) 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir OSL_ENSURE(sal_False, "OElementImport::EndElement: did not find a name attribute!"); 251*cdf0e10cSrcweir m_sName = implGetDefaultName(); 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir m_xParentContainer->insertByName(m_sName, makeAny(m_xElement)); 255*cdf0e10cSrcweir LEAVE_LOG_CONTEXT( ); 256*cdf0e10cSrcweir } 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir //--------------------------------------------------------------------- 259*cdf0e10cSrcweir void OElementImport::implApplySpecificProperties() 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir if ( m_aValues.empty() ) 262*cdf0e10cSrcweir return; 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir // set all the properties we collected 265*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 266*cdf0e10cSrcweir // check if the object has all the properties 267*cdf0e10cSrcweir // (We do this in the non-pro version only. Doing it all the time would be much to expensive) 268*cdf0e10cSrcweir if ( m_xInfo.is() ) 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir PropertyValueArray::const_iterator aEnd = m_aValues.end(); 271*cdf0e10cSrcweir for ( PropertyValueArray::iterator aCheck = m_aValues.begin(); 272*cdf0e10cSrcweir aCheck != aEnd; 273*cdf0e10cSrcweir ++aCheck 274*cdf0e10cSrcweir ) 275*cdf0e10cSrcweir { 276*cdf0e10cSrcweir OSL_ENSURE(m_xInfo->hasPropertyByName(aCheck->Name), 277*cdf0e10cSrcweir ::rtl::OString("OElementImport::implApplySpecificProperties: read a property (") 278*cdf0e10cSrcweir += ::rtl::OString(aCheck->Name.getStr(), aCheck->Name.getLength(), RTL_TEXTENCODING_ASCII_US) 279*cdf0e10cSrcweir += ::rtl::OString(") which does not exist on the element!")); 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir } 282*cdf0e10cSrcweir #endif 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir // set the properties 285*cdf0e10cSrcweir const Reference< XMultiPropertySet > xMultiProps(m_xElement, UNO_QUERY); 286*cdf0e10cSrcweir sal_Bool bSuccess = sal_False; 287*cdf0e10cSrcweir if (xMultiProps.is()) 288*cdf0e10cSrcweir { 289*cdf0e10cSrcweir // translate our properties so that the XMultiPropertySet can handle them 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir // sort our property value array so that we can use it in a setPropertyValues 292*cdf0e10cSrcweir ::std::sort( m_aValues.begin(), m_aValues.end(), PropertyValueLess()); 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir // the names 295*cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames(m_aValues.size()); 296*cdf0e10cSrcweir ::rtl::OUString* pNames = aNames.getArray(); 297*cdf0e10cSrcweir // the values 298*cdf0e10cSrcweir Sequence< Any > aValues(m_aValues.size()); 299*cdf0e10cSrcweir Any* pValues = aValues.getArray(); 300*cdf0e10cSrcweir // copy 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir PropertyValueArray::iterator aEnd = m_aValues.end(); 303*cdf0e10cSrcweir for ( PropertyValueArray::iterator aPropValues = m_aValues.begin(); 304*cdf0e10cSrcweir aPropValues != aEnd; 305*cdf0e10cSrcweir ++aPropValues, ++pNames, ++pValues 306*cdf0e10cSrcweir ) 307*cdf0e10cSrcweir { 308*cdf0e10cSrcweir *pNames = aPropValues->Name; 309*cdf0e10cSrcweir *pValues = aPropValues->Value; 310*cdf0e10cSrcweir } 311*cdf0e10cSrcweir 312*cdf0e10cSrcweir try 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir xMultiProps->setPropertyValues(aNames, aValues); 315*cdf0e10cSrcweir bSuccess = sal_True; 316*cdf0e10cSrcweir } 317*cdf0e10cSrcweir catch(Exception&) 318*cdf0e10cSrcweir { 319*cdf0e10cSrcweir OSL_ENSURE(sal_False, "OElementImport::implApplySpecificProperties: could not set the properties (using the XMultiPropertySet)!"); 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir if (!bSuccess) 324*cdf0e10cSrcweir { // no XMultiPropertySet or setting all properties at once failed 325*cdf0e10cSrcweir PropertyValueArray::iterator aEnd = m_aValues.end(); 326*cdf0e10cSrcweir for ( PropertyValueArray::iterator aPropValues = m_aValues.begin(); 327*cdf0e10cSrcweir aPropValues != aEnd; 328*cdf0e10cSrcweir ++aPropValues 329*cdf0e10cSrcweir ) 330*cdf0e10cSrcweir { 331*cdf0e10cSrcweir // this try/catch here is expensive, but because this is just a fallback which should normally not be 332*cdf0e10cSrcweir // used it's acceptable this way ... 333*cdf0e10cSrcweir try 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir m_xElement->setPropertyValue(aPropValues->Name, aPropValues->Value); 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir catch(Exception&) 338*cdf0e10cSrcweir { 339*cdf0e10cSrcweir OSL_ENSURE(sal_False, 340*cdf0e10cSrcweir ::rtl::OString("OElementImport::implApplySpecificProperties: could not set the property \"") 341*cdf0e10cSrcweir += ::rtl::OString(aPropValues->Name.getStr(), aPropValues->Name.getLength(), RTL_TEXTENCODING_ASCII_US) 342*cdf0e10cSrcweir += ::rtl::OString("\"!")); 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir } 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir //--------------------------------------------------------------------- 349*cdf0e10cSrcweir void OElementImport::implApplyGenericProperties() 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir if ( m_aGenericValues.empty() ) 352*cdf0e10cSrcweir return; 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir Reference< XPropertyContainer > xDynamicProperties( m_xElement, UNO_QUERY ); 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir PropertyValueArray::iterator aEnd = m_aGenericValues.end(); 357*cdf0e10cSrcweir for ( PropertyValueArray::iterator aPropValues = 358*cdf0e10cSrcweir m_aGenericValues.begin(); 359*cdf0e10cSrcweir aPropValues != aEnd; 360*cdf0e10cSrcweir ++aPropValues 361*cdf0e10cSrcweir ) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir // check property type for numeric types before setting 364*cdf0e10cSrcweir // the property 365*cdf0e10cSrcweir try 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir // if such a property does not yet exist at the element, create it if necessary 368*cdf0e10cSrcweir const bool bExistentProperty = m_xInfo->hasPropertyByName( aPropValues->Name ); 369*cdf0e10cSrcweir if ( !bExistentProperty ) 370*cdf0e10cSrcweir { 371*cdf0e10cSrcweir if ( !xDynamicProperties.is() ) 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 374*cdf0e10cSrcweir ::rtl::OString aMessage( "OElementImport::implApplyGenericProperties: encountered an unknown property (" ); 375*cdf0e10cSrcweir aMessage += ::rtl::OUStringToOString( aPropValues->Name, RTL_TEXTENCODING_ASCII_US ); 376*cdf0e10cSrcweir aMessage += "), but component is no PropertyBag!"; 377*cdf0e10cSrcweir OSL_ENSURE( false, aMessage.getStr() ); 378*cdf0e10cSrcweir #endif 379*cdf0e10cSrcweir continue; 380*cdf0e10cSrcweir } 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir xDynamicProperties->addProperty( 383*cdf0e10cSrcweir aPropValues->Name, 384*cdf0e10cSrcweir PropertyAttribute::BOUND | PropertyAttribute::REMOVEABLE, 385*cdf0e10cSrcweir aPropValues->Value 386*cdf0e10cSrcweir ); 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir // re-fetch the PropertySetInfo 389*cdf0e10cSrcweir m_xInfo = m_xElement->getPropertySetInfo(); 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir // determine the type of the value (source for the following conversion) 393*cdf0e10cSrcweir TypeClass eValueTypeClass = aPropValues->Value.getValueTypeClass(); 394*cdf0e10cSrcweir const sal_Bool bValueIsSequence = TypeClass_SEQUENCE == eValueTypeClass; 395*cdf0e10cSrcweir if ( bValueIsSequence ) 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir uno::Type aSimpleType( getSequenceElementType( aPropValues->Value.getValueType() ) ); 398*cdf0e10cSrcweir eValueTypeClass = aSimpleType.getTypeClass(); 399*cdf0e10cSrcweir } 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir // determine the type of the property (target for the following conversion) 402*cdf0e10cSrcweir const Property aProperty( m_xInfo->getPropertyByName( aPropValues->Name ) ); 403*cdf0e10cSrcweir TypeClass ePropTypeClass = aProperty.Type.getTypeClass(); 404*cdf0e10cSrcweir const sal_Bool bPropIsSequence = TypeClass_SEQUENCE == ePropTypeClass; 405*cdf0e10cSrcweir if( bPropIsSequence ) 406*cdf0e10cSrcweir { 407*cdf0e10cSrcweir uno::Type aSimpleType( ::comphelper::getSequenceElementType( aProperty.Type ) ); 408*cdf0e10cSrcweir ePropTypeClass = aSimpleType.getTypeClass(); 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir if ( bPropIsSequence != bValueIsSequence ) 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir OSL_ENSURE( false, "OElementImport::implApplyGenericProperties: either both value and property should be a sequence, or none of them!" ); 414*cdf0e10cSrcweir continue; 415*cdf0e10cSrcweir } 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir if ( bValueIsSequence ) 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir OSL_ENSURE( eValueTypeClass == TypeClass_ANY, 420*cdf0e10cSrcweir "OElementImport::implApplyGenericProperties: only ANYs should have been imported as generic list property!" ); 421*cdf0e10cSrcweir // (OPropertyImport should produce only Sequencer< Any >, since it cannot know the real type 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir OSL_ENSURE( ePropTypeClass == TypeClass_SHORT, 424*cdf0e10cSrcweir "OElementImport::implApplyGenericProperties: conversion to sequences other than 'sequence< short >' not implemented, yet!" ); 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir Sequence< Any > aXMLValueList; 427*cdf0e10cSrcweir aPropValues->Value >>= aXMLValueList; 428*cdf0e10cSrcweir Sequence< sal_Int16 > aPropertyValueList( aXMLValueList.getLength() ); 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir const Any* pXMLValue = aXMLValueList.getConstArray(); 431*cdf0e10cSrcweir sal_Int16* pPropValue = aPropertyValueList.getArray(); 432*cdf0e10cSrcweir 433*cdf0e10cSrcweir for ( sal_Int32 i=0; i<aXMLValueList.getLength(); ++i, ++pXMLValue, ++pPropValue ) 434*cdf0e10cSrcweir { 435*cdf0e10cSrcweir // only value sequences of numeric types implemented so far. 436*cdf0e10cSrcweir double nVal( 0 ); 437*cdf0e10cSrcweir OSL_VERIFY( *pXMLValue >>= nVal ); 438*cdf0e10cSrcweir *pPropValue = static_cast< sal_Int16 >( nVal ); 439*cdf0e10cSrcweir } 440*cdf0e10cSrcweir 441*cdf0e10cSrcweir aPropValues->Value <<= aPropertyValueList; 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir else if ( ePropTypeClass != eValueTypeClass ) 444*cdf0e10cSrcweir { 445*cdf0e10cSrcweir switch ( eValueTypeClass ) 446*cdf0e10cSrcweir { 447*cdf0e10cSrcweir case TypeClass_DOUBLE: 448*cdf0e10cSrcweir { 449*cdf0e10cSrcweir double nVal = 0; 450*cdf0e10cSrcweir aPropValues->Value >>= nVal; 451*cdf0e10cSrcweir switch( ePropTypeClass ) 452*cdf0e10cSrcweir { 453*cdf0e10cSrcweir case TypeClass_BYTE: 454*cdf0e10cSrcweir aPropValues->Value <<= static_cast< sal_Int8 >( nVal ); 455*cdf0e10cSrcweir break; 456*cdf0e10cSrcweir case TypeClass_SHORT: 457*cdf0e10cSrcweir aPropValues->Value <<= static_cast< sal_Int16 >( nVal ); 458*cdf0e10cSrcweir break; 459*cdf0e10cSrcweir case TypeClass_LONG: 460*cdf0e10cSrcweir case TypeClass_ENUM: 461*cdf0e10cSrcweir aPropValues->Value <<= static_cast< sal_Int32 >( nVal ); 462*cdf0e10cSrcweir break; 463*cdf0e10cSrcweir case TypeClass_HYPER: 464*cdf0e10cSrcweir aPropValues->Value <<= static_cast< sal_Int64 >( nVal ); 465*cdf0e10cSrcweir break; 466*cdf0e10cSrcweir default: 467*cdf0e10cSrcweir OSL_ENSURE( false, "OElementImport::implApplyGenericProperties: unsupported value type!" ); 468*cdf0e10cSrcweir break; 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir break; 472*cdf0e10cSrcweir default: 473*cdf0e10cSrcweir OSL_ENSURE( false, "OElementImport::implApplyGenericProperties: non-double values not supported!" ); 474*cdf0e10cSrcweir break; 475*cdf0e10cSrcweir } 476*cdf0e10cSrcweir } 477*cdf0e10cSrcweir 478*cdf0e10cSrcweir m_xElement->setPropertyValue( aPropValues->Name, aPropValues->Value ); 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir catch(Exception&) 481*cdf0e10cSrcweir { 482*cdf0e10cSrcweir OSL_ENSURE(sal_False, 483*cdf0e10cSrcweir ::rtl::OString("OElementImport::EndElement: could not set the property \"") 484*cdf0e10cSrcweir += ::rtl::OString(aPropValues->Name.getStr(), aPropValues->Name.getLength(), RTL_TEXTENCODING_ASCII_US) 485*cdf0e10cSrcweir += ::rtl::OString("\"!")); 486*cdf0e10cSrcweir } 487*cdf0e10cSrcweir } 488*cdf0e10cSrcweir } 489*cdf0e10cSrcweir 490*cdf0e10cSrcweir //--------------------------------------------------------------------- 491*cdf0e10cSrcweir ::rtl::OUString OElementImport::implGetDefaultName() const 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir // no optimization here. If this method gets called, the XML stream did not contain a name for the 494*cdf0e10cSrcweir // element, which is a heavy error. So in this case we don't care for performance 495*cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames = m_xParentContainer->getElementNames(); 496*cdf0e10cSrcweir static const ::rtl::OUString sUnnamedName = ::rtl::OUString::createFromAscii("unnamed"); 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir ::rtl::OUString sReturn; 499*cdf0e10cSrcweir const ::rtl::OUString* pNames = NULL; 500*cdf0e10cSrcweir const ::rtl::OUString* pNamesEnd = aNames.getConstArray() + aNames.getLength(); 501*cdf0e10cSrcweir for (sal_Int32 i=0; i<32768; ++i) // the limit is nearly arbitrary ... 502*cdf0e10cSrcweir { 503*cdf0e10cSrcweir // assemble the new name (suggestion) 504*cdf0e10cSrcweir sReturn = sUnnamedName; 505*cdf0e10cSrcweir sReturn += ::rtl::OUString::valueOf(i); 506*cdf0e10cSrcweir // check the existence (this is the bad performance part ....) 507*cdf0e10cSrcweir for (pNames = aNames.getConstArray(); pNames<pNamesEnd; ++pNames) 508*cdf0e10cSrcweir { 509*cdf0e10cSrcweir if (*pNames == sReturn) 510*cdf0e10cSrcweir { 511*cdf0e10cSrcweir break; 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir } 514*cdf0e10cSrcweir if (pNames<pNamesEnd) 515*cdf0e10cSrcweir // found the name 516*cdf0e10cSrcweir continue; 517*cdf0e10cSrcweir return sReturn; 518*cdf0e10cSrcweir } 519*cdf0e10cSrcweir OSL_ENSURE(sal_False, "OElementImport::implGetDefaultName: did not find a free name!"); 520*cdf0e10cSrcweir return sUnnamedName; 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir 523*cdf0e10cSrcweir //--------------------------------------------------------------------- 524*cdf0e10cSrcweir PropertyGroups::const_iterator OElementImport::impl_matchPropertyGroup( const PropertyGroups& i_propertyGroups ) const 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir ENSURE_OR_RETURN( m_xInfo.is(), "OElementImport::impl_matchPropertyGroup: no property set info!", i_propertyGroups.end() ); 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir for ( PropertyGroups::const_iterator group = i_propertyGroups.begin(); 529*cdf0e10cSrcweir group != i_propertyGroups.end(); 530*cdf0e10cSrcweir ++group 531*cdf0e10cSrcweir ) 532*cdf0e10cSrcweir { 533*cdf0e10cSrcweir bool missingProp = false; 534*cdf0e10cSrcweir for ( PropertyDescriptionList::const_iterator prop = group->begin(); 535*cdf0e10cSrcweir prop != group->end(); 536*cdf0e10cSrcweir ++prop 537*cdf0e10cSrcweir ) 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir if ( !m_xInfo->hasPropertyByName( (*prop)->propertyName ) ) 540*cdf0e10cSrcweir { 541*cdf0e10cSrcweir missingProp = true; 542*cdf0e10cSrcweir break; 543*cdf0e10cSrcweir } 544*cdf0e10cSrcweir } 545*cdf0e10cSrcweir 546*cdf0e10cSrcweir if ( missingProp ) 547*cdf0e10cSrcweir // try next group 548*cdf0e10cSrcweir continue; 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir return group; 551*cdf0e10cSrcweir } 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir return i_propertyGroups.end(); 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir 556*cdf0e10cSrcweir //--------------------------------------------------------------------- 557*cdf0e10cSrcweir bool OElementImport::tryGenericAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue ) 558*cdf0e10cSrcweir { 559*cdf0e10cSrcweir // the generic approach (which I hope all props will be migrated to, on the medium term): property handlers 560*cdf0e10cSrcweir const AttributeDescription attribute( metadata::getAttributeDescription( _nNamespaceKey, _rLocalName ) ); 561*cdf0e10cSrcweir if ( attribute.attributeToken != XML_TOKEN_INVALID ) 562*cdf0e10cSrcweir { 563*cdf0e10cSrcweir PropertyGroups propertyGroups; 564*cdf0e10cSrcweir metadata::getPropertyGroupList( attribute, propertyGroups ); 565*cdf0e10cSrcweir const PropertyGroups::const_iterator pos = impl_matchPropertyGroup( propertyGroups ); 566*cdf0e10cSrcweir if ( pos == propertyGroups.end() ) 567*cdf0e10cSrcweir return false; 568*cdf0e10cSrcweir 569*cdf0e10cSrcweir do 570*cdf0e10cSrcweir { 571*cdf0e10cSrcweir const PropertyDescriptionList& rProperties( *pos ); 572*cdf0e10cSrcweir const PropertyDescription* first = *rProperties.begin(); 573*cdf0e10cSrcweir ENSURE_OR_BREAK( first != NULL, "OElementImport::handleAttribute: invalid property description!" ); 574*cdf0e10cSrcweir const PPropertyHandler handler = (*first->factory)( first->propertyId ); 575*cdf0e10cSrcweir ENSURE_OR_BREAK( handler.get() != NULL, "OElementImport::handleAttribute: invalid property handler!" ); 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir PropertyValues aValues; 578*cdf0e10cSrcweir for ( PropertyDescriptionList::const_iterator propDesc = rProperties.begin(); 579*cdf0e10cSrcweir propDesc != rProperties.end(); 580*cdf0e10cSrcweir ++propDesc 581*cdf0e10cSrcweir ) 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir aValues[ (*propDesc)->propertyId ] = Any(); 584*cdf0e10cSrcweir } 585*cdf0e10cSrcweir if ( handler->getPropertyValues( _rValue, aValues ) ) 586*cdf0e10cSrcweir { 587*cdf0e10cSrcweir for ( PropertyDescriptionList::const_iterator propDesc = rProperties.begin(); 588*cdf0e10cSrcweir propDesc != rProperties.end(); 589*cdf0e10cSrcweir ++propDesc 590*cdf0e10cSrcweir ) 591*cdf0e10cSrcweir { 592*cdf0e10cSrcweir implPushBackPropertyValue( (*propDesc)->propertyName, aValues[ (*propDesc)->propertyId ] ); 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir } 595*cdf0e10cSrcweir } 596*cdf0e10cSrcweir while ( false ); 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir // handled 599*cdf0e10cSrcweir return true; 600*cdf0e10cSrcweir } 601*cdf0e10cSrcweir return false; 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir //--------------------------------------------------------------------- 605*cdf0e10cSrcweir bool OElementImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue) 606*cdf0e10cSrcweir { 607*cdf0e10cSrcweir if ( token::IsXMLToken( _rLocalName, token::XML_CONTROL_IMPLEMENTATION ) ) 608*cdf0e10cSrcweir // ignore this, it has already been handled in OElementImport::StartElement 609*cdf0e10cSrcweir return true; 610*cdf0e10cSrcweir 611*cdf0e10cSrcweir if ( token::IsXMLToken( _rLocalName, token::XML_NAME ) ) 612*cdf0e10cSrcweir { 613*cdf0e10cSrcweir if ( !m_sName.getLength() ) 614*cdf0e10cSrcweir // remember the name for later use in EndElement 615*cdf0e10cSrcweir m_sName = _rValue; 616*cdf0e10cSrcweir return true; 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir // maybe it's the style attribute? 620*cdf0e10cSrcweir if ( token::IsXMLToken( _rLocalName, token::XML_TEXT_STYLE_NAME ) ) 621*cdf0e10cSrcweir { 622*cdf0e10cSrcweir const SvXMLStyleContext* pStyleContext = m_rContext.getStyleElement( _rValue ); 623*cdf0e10cSrcweir OSL_ENSURE( pStyleContext, "OElementImport::handleAttribute: do not know the style!" ); 624*cdf0e10cSrcweir // remember the element for later usage. 625*cdf0e10cSrcweir m_pStyleElement = PTR_CAST( XMLTextStyleContext, pStyleContext ); 626*cdf0e10cSrcweir return true; 627*cdf0e10cSrcweir } 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir if ( m_bImplicitGenericAttributeHandling ) 630*cdf0e10cSrcweir if ( tryGenericAttribute( _nNamespaceKey, _rLocalName, _rValue ) ) 631*cdf0e10cSrcweir return true; 632*cdf0e10cSrcweir 633*cdf0e10cSrcweir // let the base class handle it 634*cdf0e10cSrcweir return OPropertyImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue); 635*cdf0e10cSrcweir } 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir //--------------------------------------------------------------------- 638*cdf0e10cSrcweir Reference< XPropertySet > OElementImport::createElement() 639*cdf0e10cSrcweir { 640*cdf0e10cSrcweir Reference< XPropertySet > xReturn; 641*cdf0e10cSrcweir if (m_sServiceName.getLength()) 642*cdf0e10cSrcweir { 643*cdf0e10cSrcweir Reference< XInterface > xPure = m_rFormImport.getGlobalContext().getServiceFactory()->createInstance(m_sServiceName); 644*cdf0e10cSrcweir OSL_ENSURE(xPure.is(), 645*cdf0e10cSrcweir ::rtl::OString("OElementImport::createElement: service factory gave me no object (service name: ") 646*cdf0e10cSrcweir += ::rtl::OString(m_sServiceName.getStr(), m_sServiceName.getLength(), RTL_TEXTENCODING_ASCII_US) 647*cdf0e10cSrcweir += ::rtl::OString(")!")); 648*cdf0e10cSrcweir xReturn = Reference< XPropertySet >(xPure, UNO_QUERY); 649*cdf0e10cSrcweir } 650*cdf0e10cSrcweir else 651*cdf0e10cSrcweir OSL_ENSURE(sal_False, "OElementImport::createElement: no service name to create an element!"); 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir return xReturn; 654*cdf0e10cSrcweir } 655*cdf0e10cSrcweir 656*cdf0e10cSrcweir //--------------------------------------------------------------------- 657*cdf0e10cSrcweir void OElementImport::registerEvents(const Sequence< ScriptEventDescriptor >& _rEvents) 658*cdf0e10cSrcweir { 659*cdf0e10cSrcweir OSL_ENSURE(m_xElement.is(), "OElementImport::registerEvents: no element to register events for!"); 660*cdf0e10cSrcweir m_rEventManager.registerEvents(m_xElement, _rEvents); 661*cdf0e10cSrcweir } 662*cdf0e10cSrcweir 663*cdf0e10cSrcweir //--------------------------------------------------------------------- 664*cdf0e10cSrcweir void OElementImport::simulateDefaultedAttribute(const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName, const sal_Char* _pAttributeDefault) 665*cdf0e10cSrcweir { 666*cdf0e10cSrcweir OSL_ENSURE( m_xInfo.is(), "OPropertyImport::simulateDefaultedAttribute: the component should be more gossipy about it's properties!" ); 667*cdf0e10cSrcweir 668*cdf0e10cSrcweir if ( !m_xInfo.is() || m_xInfo->hasPropertyByName( _rPropertyName ) ) 669*cdf0e10cSrcweir { 670*cdf0e10cSrcweir ::rtl::OUString sLocalAttrName = ::rtl::OUString::createFromAscii(_pAttributeName); 671*cdf0e10cSrcweir if ( !encounteredAttribute( sLocalAttrName ) ) 672*cdf0e10cSrcweir OSL_VERIFY( handleAttribute( XML_NAMESPACE_FORM, sLocalAttrName, ::rtl::OUString::createFromAscii( _pAttributeDefault ) ) ); 673*cdf0e10cSrcweir } 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir //===================================================================== 677*cdf0e10cSrcweir //= OControlImport 678*cdf0e10cSrcweir //===================================================================== 679*cdf0e10cSrcweir //--------------------------------------------------------------------- 680*cdf0e10cSrcweir OControlImport::OControlImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 681*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer) 682*cdf0e10cSrcweir :OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer) 683*cdf0e10cSrcweir ,m_eElementType(OControlElement::UNKNOWN) 684*cdf0e10cSrcweir { 685*cdf0e10cSrcweir disableImplicitGenericAttributeHandling(); 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir 688*cdf0e10cSrcweir //--------------------------------------------------------------------- 689*cdf0e10cSrcweir OControlImport::OControlImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 690*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType) 691*cdf0e10cSrcweir :OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer) 692*cdf0e10cSrcweir ,m_eElementType(_eType) 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir disableImplicitGenericAttributeHandling(); 695*cdf0e10cSrcweir } 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir //--------------------------------------------------------------------- 698*cdf0e10cSrcweir ::rtl::OUString OControlImport::determineDefaultServiceName() const 699*cdf0e10cSrcweir { 700*cdf0e10cSrcweir const sal_Char* pServiceName = NULL; 701*cdf0e10cSrcweir switch ( m_eElementType ) 702*cdf0e10cSrcweir { 703*cdf0e10cSrcweir case OControlElement::TEXT: 704*cdf0e10cSrcweir case OControlElement::TEXT_AREA: 705*cdf0e10cSrcweir case OControlElement::PASSWORD: pServiceName = "com.sun.star.form.component.TextField"; break; 706*cdf0e10cSrcweir case OControlElement::FILE: pServiceName = "com.sun.star.form.component.FileControl"; break; 707*cdf0e10cSrcweir case OControlElement::FORMATTED_TEXT: pServiceName = "com.sun.star.form.component.FormattedField"; break; 708*cdf0e10cSrcweir case OControlElement::FIXED_TEXT: pServiceName = "com.sun.star.form.component.FixedText"; break; 709*cdf0e10cSrcweir case OControlElement::COMBOBOX: pServiceName = "com.sun.star.form.component.ComboBox"; break; 710*cdf0e10cSrcweir case OControlElement::LISTBOX: pServiceName = "com.sun.star.form.component.ListBox"; break; 711*cdf0e10cSrcweir case OControlElement::BUTTON: pServiceName = "com.sun.star.form.component.CommandButton"; break; 712*cdf0e10cSrcweir case OControlElement::IMAGE: pServiceName = "com.sun.star.form.component.ImageButton"; break; 713*cdf0e10cSrcweir case OControlElement::CHECKBOX: pServiceName = "com.sun.star.form.component.CheckBox"; break; 714*cdf0e10cSrcweir case OControlElement::RADIO: pServiceName = "com.sun.star.form.component.RadioButton"; break; 715*cdf0e10cSrcweir case OControlElement::FRAME: pServiceName = "com.sun.star.form.component.GroupBox"; break; 716*cdf0e10cSrcweir case OControlElement::IMAGE_FRAME: pServiceName = "com.sun.star.form.component.DatabaseImageControl"; break; 717*cdf0e10cSrcweir case OControlElement::HIDDEN: pServiceName = "com.sun.star.form.component.HiddenControl"; break; 718*cdf0e10cSrcweir case OControlElement::GRID: pServiceName = "com.sun.star.form.component.GridControl"; break; 719*cdf0e10cSrcweir case OControlElement::TIME: pServiceName = "com.sun.star.form.component.DateField"; break; 720*cdf0e10cSrcweir case OControlElement::DATE: pServiceName = "com.sun.star.form.component.TimeField"; break; 721*cdf0e10cSrcweir default: break; 722*cdf0e10cSrcweir } 723*cdf0e10cSrcweir if ( pServiceName != NULL ) 724*cdf0e10cSrcweir return ::rtl::OUString::createFromAscii( pServiceName ); 725*cdf0e10cSrcweir return ::rtl::OUString(); 726*cdf0e10cSrcweir } 727*cdf0e10cSrcweir 728*cdf0e10cSrcweir //--------------------------------------------------------------------- 729*cdf0e10cSrcweir void OControlImport::addOuterAttributes(const Reference< sax::XAttributeList >& _rxOuterAttribs) 730*cdf0e10cSrcweir { 731*cdf0e10cSrcweir OSL_ENSURE(!m_xOuterAttributes.is(), "OControlImport::addOuterAttributes: already have these attributes!"); 732*cdf0e10cSrcweir m_xOuterAttributes = _rxOuterAttribs; 733*cdf0e10cSrcweir } 734*cdf0e10cSrcweir 735*cdf0e10cSrcweir //--------------------------------------------------------------------- 736*cdf0e10cSrcweir bool OControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue) 737*cdf0e10cSrcweir { 738*cdf0e10cSrcweir static const sal_Char* pLinkedCellAttributeName = OAttributeMetaData::getBindingAttributeName(BA_LINKED_CELL); 739*cdf0e10cSrcweir 740*cdf0e10cSrcweir if (IsXMLToken(_rLocalName, XML_ID)) 741*cdf0e10cSrcweir { // it's the control id 742*cdf0e10cSrcweir if (XML_NAMESPACE_XML == _nNamespaceKey) 743*cdf0e10cSrcweir { 744*cdf0e10cSrcweir m_sControlId = _rValue; 745*cdf0e10cSrcweir } 746*cdf0e10cSrcweir else if (XML_NAMESPACE_FORM == _nNamespaceKey) 747*cdf0e10cSrcweir { 748*cdf0e10cSrcweir if (!m_sControlId.getLength()) 749*cdf0e10cSrcweir { 750*cdf0e10cSrcweir m_sControlId = _rValue; 751*cdf0e10cSrcweir } 752*cdf0e10cSrcweir } 753*cdf0e10cSrcweir return true; 754*cdf0e10cSrcweir } 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir if ( _rLocalName.equalsAscii( pLinkedCellAttributeName ) ) 757*cdf0e10cSrcweir { // it's the address of a spreadsheet cell 758*cdf0e10cSrcweir m_sBoundCellAddress = _rValue; 759*cdf0e10cSrcweir return true; 760*cdf0e10cSrcweir } 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir if ( _nNamespaceKey == XML_NAMESPACE_XFORMS && IsXMLToken( _rLocalName, XML_BIND ) ) 763*cdf0e10cSrcweir { 764*cdf0e10cSrcweir m_sBindingID = _rValue; 765*cdf0e10cSrcweir return true; 766*cdf0e10cSrcweir } 767*cdf0e10cSrcweir 768*cdf0e10cSrcweir if ( _nNamespaceKey == XML_NAMESPACE_FORM && IsXMLToken( _rLocalName, XML_XFORMS_LIST_SOURCE ) ) 769*cdf0e10cSrcweir { 770*cdf0e10cSrcweir m_sListBindingID = _rValue; 771*cdf0e10cSrcweir return true; 772*cdf0e10cSrcweir } 773*cdf0e10cSrcweir 774*cdf0e10cSrcweir if ( ( ( _nNamespaceKey == XML_NAMESPACE_FORM ) 775*cdf0e10cSrcweir && IsXMLToken( _rLocalName, XML_XFORMS_SUBMISSION ) 776*cdf0e10cSrcweir ) 777*cdf0e10cSrcweir || ( ( _nNamespaceKey == XML_NAMESPACE_XFORMS ) 778*cdf0e10cSrcweir && IsXMLToken( _rLocalName, XML_SUBMISSION ) 779*cdf0e10cSrcweir ) 780*cdf0e10cSrcweir ) 781*cdf0e10cSrcweir { 782*cdf0e10cSrcweir m_sSubmissionID = _rValue; 783*cdf0e10cSrcweir return true; 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir 786*cdf0e10cSrcweir if ( OElementImport::tryGenericAttribute( _nNamespaceKey, _rLocalName, _rValue ) ) 787*cdf0e10cSrcweir return true; 788*cdf0e10cSrcweir 789*cdf0e10cSrcweir static const sal_Char* pValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_VALUE); 790*cdf0e10cSrcweir static const sal_Char* pCurrentValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_VALUE); 791*cdf0e10cSrcweir static const sal_Char* pMinValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MIN_VALUE); 792*cdf0e10cSrcweir static const sal_Char* pMaxValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MAX_VALUE); 793*cdf0e10cSrcweir static const sal_Char* pRepeatDelayAttributeName = OAttributeMetaData::getSpecialAttributeName( SCA_REPEAT_DELAY ); 794*cdf0e10cSrcweir 795*cdf0e10cSrcweir sal_Int32 nHandle = -1; 796*cdf0e10cSrcweir if ( _rLocalName.equalsAscii( pValueAttributeName ) ) 797*cdf0e10cSrcweir nHandle = PROPID_VALUE; 798*cdf0e10cSrcweir else if ( _rLocalName.equalsAscii( pCurrentValueAttributeName ) ) 799*cdf0e10cSrcweir nHandle = PROPID_CURRENT_VALUE; 800*cdf0e10cSrcweir else if ( _rLocalName.equalsAscii( pMinValueAttributeName ) ) 801*cdf0e10cSrcweir nHandle = PROPID_MIN_VALUE; 802*cdf0e10cSrcweir else if ( _rLocalName.equalsAscii( pMaxValueAttributeName ) ) 803*cdf0e10cSrcweir nHandle = PROPID_MAX_VALUE; 804*cdf0e10cSrcweir if ( nHandle != -1 ) 805*cdf0e10cSrcweir { 806*cdf0e10cSrcweir // for the moment, simply remember the name and the value 807*cdf0e10cSrcweir PropertyValue aProp; 808*cdf0e10cSrcweir aProp.Name = _rLocalName; 809*cdf0e10cSrcweir aProp.Handle = nHandle; 810*cdf0e10cSrcweir aProp.Value <<= _rValue; 811*cdf0e10cSrcweir m_aValueProperties.push_back(aProp); 812*cdf0e10cSrcweir return true; 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir 815*cdf0e10cSrcweir if ( _rLocalName.equalsAscii( pRepeatDelayAttributeName ) ) 816*cdf0e10cSrcweir { 817*cdf0e10cSrcweir ::Time aTime; 818*cdf0e10cSrcweir sal_Int32 nFractions = 0; 819*cdf0e10cSrcweir if ( SvXMLUnitConverter::convertTimeDuration( _rValue, aTime, &nFractions ) ) 820*cdf0e10cSrcweir { 821*cdf0e10cSrcweir PropertyValue aProp; 822*cdf0e10cSrcweir aProp.Name = PROPERTY_REPEAT_DELAY; 823*cdf0e10cSrcweir aProp.Value <<= (sal_Int32)( ( ( aTime.GetMSFromTime() / 1000 ) * 1000 ) + nFractions ); 824*cdf0e10cSrcweir 825*cdf0e10cSrcweir implPushBackPropertyValue(aProp); 826*cdf0e10cSrcweir } 827*cdf0e10cSrcweir return true; 828*cdf0e10cSrcweir } 829*cdf0e10cSrcweir 830*cdf0e10cSrcweir return OElementImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue ); 831*cdf0e10cSrcweir } 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir //--------------------------------------------------------------------- 834*cdf0e10cSrcweir void OControlImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 835*cdf0e10cSrcweir { 836*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > xAttributes; 837*cdf0e10cSrcweir if( m_xOuterAttributes.is() ) 838*cdf0e10cSrcweir { 839*cdf0e10cSrcweir // merge the attribute lists 840*cdf0e10cSrcweir OAttribListMerger* pMerger = new OAttribListMerger; 841*cdf0e10cSrcweir // our own one 842*cdf0e10cSrcweir pMerger->addList(_rxAttrList); 843*cdf0e10cSrcweir // and the ones of our enclosing element 844*cdf0e10cSrcweir pMerger->addList(m_xOuterAttributes); 845*cdf0e10cSrcweir xAttributes = pMerger; 846*cdf0e10cSrcweir } 847*cdf0e10cSrcweir else 848*cdf0e10cSrcweir { 849*cdf0e10cSrcweir xAttributes = _rxAttrList; 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir 852*cdf0e10cSrcweir // let the base class handle all the attributes 853*cdf0e10cSrcweir OElementImport::StartElement(xAttributes); 854*cdf0e10cSrcweir 855*cdf0e10cSrcweir if ( !m_aValueProperties.empty() && m_xElement.is()) 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir // get the property set info 858*cdf0e10cSrcweir if (!m_xInfo.is()) 859*cdf0e10cSrcweir { 860*cdf0e10cSrcweir OSL_ENSURE(sal_False, "OControlImport::StartElement: no PropertySetInfo!"); 861*cdf0e10cSrcweir return; 862*cdf0e10cSrcweir } 863*cdf0e10cSrcweir 864*cdf0e10cSrcweir const sal_Char* pValueProperty = NULL; 865*cdf0e10cSrcweir const sal_Char* pCurrentValueProperty = NULL; 866*cdf0e10cSrcweir const sal_Char* pMinValueProperty = NULL; 867*cdf0e10cSrcweir const sal_Char* pMaxValueProperty = NULL; 868*cdf0e10cSrcweir 869*cdf0e10cSrcweir sal_Bool bRetrievedValues = sal_False; 870*cdf0e10cSrcweir sal_Bool bRetrievedValueLimits = sal_False; 871*cdf0e10cSrcweir 872*cdf0e10cSrcweir // get the class id of our element 873*cdf0e10cSrcweir sal_Int16 nClassId = FormComponentType::CONTROL; 874*cdf0e10cSrcweir m_xElement->getPropertyValue(PROPERTY_CLASSID) >>= nClassId; 875*cdf0e10cSrcweir 876*cdf0e10cSrcweir // translate the value properties we collected in handleAttributes 877*cdf0e10cSrcweir PropertyValueArray::iterator aEnd = m_aValueProperties.end(); 878*cdf0e10cSrcweir for ( PropertyValueArray::iterator aValueProps = m_aValueProperties.begin(); 879*cdf0e10cSrcweir aValueProps != aEnd; 880*cdf0e10cSrcweir ++aValueProps 881*cdf0e10cSrcweir ) 882*cdf0e10cSrcweir { 883*cdf0e10cSrcweir bool bSuccess = false; 884*cdf0e10cSrcweir switch (aValueProps->Handle) 885*cdf0e10cSrcweir { 886*cdf0e10cSrcweir case PROPID_VALUE: 887*cdf0e10cSrcweir case PROPID_CURRENT_VALUE: 888*cdf0e10cSrcweir { 889*cdf0e10cSrcweir // get the property names 890*cdf0e10cSrcweir if (!bRetrievedValues) 891*cdf0e10cSrcweir { 892*cdf0e10cSrcweir getValuePropertyNames(m_eElementType, nClassId, pCurrentValueProperty, pValueProperty); 893*cdf0e10cSrcweir ENSURE_OR_BREAK( pValueProperty, "OControlImport::StartElement: illegal value property names!" ); 894*cdf0e10cSrcweir bRetrievedValues = sal_True; 895*cdf0e10cSrcweir } 896*cdf0e10cSrcweir ENSURE_OR_BREAK((PROPID_VALUE != aValueProps->Handle) || pValueProperty, 897*cdf0e10cSrcweir "OControlImport::StartElement: the control does not have a value property!"); 898*cdf0e10cSrcweir ENSURE_OR_BREAK((PROPID_CURRENT_VALUE != aValueProps->Handle) || pCurrentValueProperty, 899*cdf0e10cSrcweir "OControlImport::StartElement: the control does not have a current-value property!"); 900*cdf0e10cSrcweir 901*cdf0e10cSrcweir // transfer the name 902*cdf0e10cSrcweir if (PROPID_VALUE == aValueProps->Handle) 903*cdf0e10cSrcweir aValueProps->Name = ::rtl::OUString::createFromAscii(pValueProperty); 904*cdf0e10cSrcweir else 905*cdf0e10cSrcweir aValueProps->Name = ::rtl::OUString::createFromAscii(pCurrentValueProperty); 906*cdf0e10cSrcweir bSuccess = true; 907*cdf0e10cSrcweir } 908*cdf0e10cSrcweir break; 909*cdf0e10cSrcweir case PROPID_MIN_VALUE: 910*cdf0e10cSrcweir case PROPID_MAX_VALUE: 911*cdf0e10cSrcweir { 912*cdf0e10cSrcweir // get the property names 913*cdf0e10cSrcweir if (!bRetrievedValueLimits) 914*cdf0e10cSrcweir { 915*cdf0e10cSrcweir getValueLimitPropertyNames(nClassId, pMinValueProperty, pMaxValueProperty); 916*cdf0e10cSrcweir ENSURE_OR_BREAK( pMinValueProperty && pMaxValueProperty, "OControlImport::StartElement: illegal value limit property names!" ); 917*cdf0e10cSrcweir bRetrievedValueLimits = sal_True; 918*cdf0e10cSrcweir } 919*cdf0e10cSrcweir OSL_ENSURE((PROPID_MIN_VALUE != aValueProps->Handle) || pMinValueProperty, 920*cdf0e10cSrcweir "OControlImport::StartElement: the control does not have a value property!"); 921*cdf0e10cSrcweir OSL_ENSURE((PROPID_MAX_VALUE != aValueProps->Handle) || pMaxValueProperty, 922*cdf0e10cSrcweir "OControlImport::StartElement: the control does not have a current-value property!"); 923*cdf0e10cSrcweir 924*cdf0e10cSrcweir // transfer the name 925*cdf0e10cSrcweir if (PROPID_MIN_VALUE == aValueProps->Handle) 926*cdf0e10cSrcweir aValueProps->Name = ::rtl::OUString::createFromAscii(pMinValueProperty); 927*cdf0e10cSrcweir else 928*cdf0e10cSrcweir aValueProps->Name = ::rtl::OUString::createFromAscii(pMaxValueProperty); 929*cdf0e10cSrcweir bSuccess = true; 930*cdf0e10cSrcweir } 931*cdf0e10cSrcweir break; 932*cdf0e10cSrcweir } 933*cdf0e10cSrcweir 934*cdf0e10cSrcweir if ( !bSuccess ) 935*cdf0e10cSrcweir continue; 936*cdf0e10cSrcweir 937*cdf0e10cSrcweir // translate the value 938*cdf0e10cSrcweir implTranslateValueProperty(m_xInfo, *aValueProps); 939*cdf0e10cSrcweir // add the property to the base class' array 940*cdf0e10cSrcweir implPushBackPropertyValue(*aValueProps); 941*cdf0e10cSrcweir } 942*cdf0e10cSrcweir } 943*cdf0e10cSrcweir } 944*cdf0e10cSrcweir 945*cdf0e10cSrcweir //--------------------------------------------------------------------- 946*cdf0e10cSrcweir void OControlImport::implTranslateValueProperty(const Reference< XPropertySetInfo >& _rxPropInfo, 947*cdf0e10cSrcweir PropertyValue& _rPropValue) 948*cdf0e10cSrcweir { 949*cdf0e10cSrcweir OSL_ENSURE(_rxPropInfo->hasPropertyByName(_rPropValue.Name), 950*cdf0e10cSrcweir "OControlImport::implTranslateValueProperty: invalid property name!"); 951*cdf0e10cSrcweir 952*cdf0e10cSrcweir // retrieve the type of the property 953*cdf0e10cSrcweir Property aProp = _rxPropInfo->getPropertyByName(_rPropValue.Name); 954*cdf0e10cSrcweir // the untranslated string value as read in handleAttribute 955*cdf0e10cSrcweir ::rtl::OUString sValue; 956*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 957*cdf0e10cSrcweir sal_Bool bSuccess = 958*cdf0e10cSrcweir #endif 959*cdf0e10cSrcweir _rPropValue.Value >>= sValue; 960*cdf0e10cSrcweir OSL_ENSURE(bSuccess, "OControlImport::implTranslateValueProperty: supposed to be called with non-translated string values!"); 961*cdf0e10cSrcweir 962*cdf0e10cSrcweir if (TypeClass_ANY == aProp.Type.getTypeClass()) 963*cdf0e10cSrcweir { 964*cdf0e10cSrcweir // we have exactly 2 properties where this type class is allowed: 965*cdf0e10cSrcweir OSL_ENSURE( 966*cdf0e10cSrcweir (0 == _rPropValue.Name.compareToAscii(PROPERTY_EFFECTIVE_VALUE)) 967*cdf0e10cSrcweir || (0 == _rPropValue.Name.compareToAscii(PROPERTY_EFFECTIVE_DEFAULT)), 968*cdf0e10cSrcweir "OControlImport::implTranslateValueProperty: invalid property type/name combination!"); 969*cdf0e10cSrcweir 970*cdf0e10cSrcweir // Both properties are allowed to have a double or a string value, 971*cdf0e10cSrcweir // so first try to convert the string into a number 972*cdf0e10cSrcweir double nValue; 973*cdf0e10cSrcweir if (GetImport().GetMM100UnitConverter().convertDouble(nValue, sValue)) 974*cdf0e10cSrcweir _rPropValue.Value <<= nValue; 975*cdf0e10cSrcweir else 976*cdf0e10cSrcweir _rPropValue.Value <<= sValue; 977*cdf0e10cSrcweir } 978*cdf0e10cSrcweir else 979*cdf0e10cSrcweir _rPropValue.Value = PropertyConversion::convertString(GetImport(), aProp.Type, sValue); 980*cdf0e10cSrcweir } 981*cdf0e10cSrcweir 982*cdf0e10cSrcweir //--------------------------------------------------------------------- 983*cdf0e10cSrcweir void OControlImport::EndElement() 984*cdf0e10cSrcweir { 985*cdf0e10cSrcweir OSL_ENSURE(m_xElement.is(), "OControlImport::EndElement: invalid control!"); 986*cdf0e10cSrcweir if ( !m_xElement.is() ) 987*cdf0e10cSrcweir return; 988*cdf0e10cSrcweir 989*cdf0e10cSrcweir // register our control with it's id 990*cdf0e10cSrcweir if (m_sControlId.getLength()) 991*cdf0e10cSrcweir m_rFormImport.registerControlId(m_xElement, m_sControlId); 992*cdf0e10cSrcweir // it's allowed to have no control id. In this case we're importing a column 993*cdf0e10cSrcweir 994*cdf0e10cSrcweir // one more pre-work to do: 995*cdf0e10cSrcweir // when we set default values, then by definition the respective value is set 996*cdf0e10cSrcweir // to this default value, too. This means if the sequence contains for example 997*cdf0e10cSrcweir // a DefaultText value, then the Text will be affected by this, too. 998*cdf0e10cSrcweir // In case the Text is not part of the property sequence (or occurs _before_ 999*cdf0e10cSrcweir // the DefaultText, which can happen for other value/default-value property names), 1000*cdf0e10cSrcweir // this means that the Text (the value property) is incorrectly imported. 1001*cdf0e10cSrcweir // #102475# - 04.09.2002 - fs@openoffice.org 1002*cdf0e10cSrcweir 1003*cdf0e10cSrcweir sal_Bool bRestoreValuePropertyValue = sal_False; 1004*cdf0e10cSrcweir Any aValuePropertyValue; 1005*cdf0e10cSrcweir 1006*cdf0e10cSrcweir sal_Int16 nClassId = FormComponentType::CONTROL; 1007*cdf0e10cSrcweir try 1008*cdf0e10cSrcweir { 1009*cdf0e10cSrcweir // get the class id of our element 1010*cdf0e10cSrcweir m_xElement->getPropertyValue(PROPERTY_CLASSID) >>= nClassId; 1011*cdf0e10cSrcweir } 1012*cdf0e10cSrcweir catch( const Exception& ) 1013*cdf0e10cSrcweir { 1014*cdf0e10cSrcweir OSL_ENSURE( sal_False, "OControlImport::EndElement: caught an exception while retrieving the class id!" ); 1015*cdf0e10cSrcweir } 1016*cdf0e10cSrcweir 1017*cdf0e10cSrcweir const sal_Char* pValueProperty = NULL; 1018*cdf0e10cSrcweir const sal_Char* pDefaultValueProperty = NULL; 1019*cdf0e10cSrcweir getRuntimeValuePropertyNames(m_eElementType, nClassId, pValueProperty, pDefaultValueProperty); 1020*cdf0e10cSrcweir if ( pDefaultValueProperty && pValueProperty ) 1021*cdf0e10cSrcweir { 1022*cdf0e10cSrcweir sal_Bool bNonDefaultValuePropertyValue = sal_False; 1023*cdf0e10cSrcweir // is the "value property" part of the sequence? 1024*cdf0e10cSrcweir 1025*cdf0e10cSrcweir // look up this property in our sequence 1026*cdf0e10cSrcweir PropertyValueArray::iterator aEnd = m_aValues.end(); 1027*cdf0e10cSrcweir for ( PropertyValueArray::iterator aCheck = m_aValues.begin(); 1028*cdf0e10cSrcweir ( aCheck != aEnd ); 1029*cdf0e10cSrcweir ++aCheck 1030*cdf0e10cSrcweir ) 1031*cdf0e10cSrcweir { 1032*cdf0e10cSrcweir if ( aCheck->Name.equalsAscii( pDefaultValueProperty ) ) 1033*cdf0e10cSrcweir bRestoreValuePropertyValue = sal_True; 1034*cdf0e10cSrcweir else if ( aCheck->Name.equalsAscii( pValueProperty ) ) 1035*cdf0e10cSrcweir { 1036*cdf0e10cSrcweir bNonDefaultValuePropertyValue = sal_True; 1037*cdf0e10cSrcweir // we need to restore the value property we found here, nothing else 1038*cdf0e10cSrcweir aValuePropertyValue = aCheck->Value; 1039*cdf0e10cSrcweir } 1040*cdf0e10cSrcweir } 1041*cdf0e10cSrcweir 1042*cdf0e10cSrcweir if ( bRestoreValuePropertyValue && !bNonDefaultValuePropertyValue ) 1043*cdf0e10cSrcweir { 1044*cdf0e10cSrcweir // found it -> need to remember (and restore) the "value property value", which is not set explicitly 1045*cdf0e10cSrcweir try 1046*cdf0e10cSrcweir { 1047*cdf0e10cSrcweir aValuePropertyValue = m_xElement->getPropertyValue( ::rtl::OUString::createFromAscii( pValueProperty ) ); 1048*cdf0e10cSrcweir } 1049*cdf0e10cSrcweir catch( const Exception& ) 1050*cdf0e10cSrcweir { 1051*cdf0e10cSrcweir OSL_ENSURE( sal_False, "OControlImport::EndElement: caught an exception while retrieving the current value property!" ); 1052*cdf0e10cSrcweir } 1053*cdf0e10cSrcweir } 1054*cdf0e10cSrcweir } 1055*cdf0e10cSrcweir 1056*cdf0e10cSrcweir // let the base class set all the values 1057*cdf0e10cSrcweir OElementImport::EndElement(); 1058*cdf0e10cSrcweir 1059*cdf0e10cSrcweir // restore the "value property value", if necessary 1060*cdf0e10cSrcweir if ( bRestoreValuePropertyValue && pValueProperty ) 1061*cdf0e10cSrcweir { 1062*cdf0e10cSrcweir try 1063*cdf0e10cSrcweir { 1064*cdf0e10cSrcweir m_xElement->setPropertyValue( ::rtl::OUString::createFromAscii( pValueProperty ), aValuePropertyValue ); 1065*cdf0e10cSrcweir } 1066*cdf0e10cSrcweir catch( const Exception& ) 1067*cdf0e10cSrcweir { 1068*cdf0e10cSrcweir OSL_ENSURE( sal_False, "OControlImport::EndElement: caught an exception while restoring the value property!" ); 1069*cdf0e10cSrcweir } 1070*cdf0e10cSrcweir } 1071*cdf0e10cSrcweir 1072*cdf0e10cSrcweir // the external cell binding, if applicable 1073*cdf0e10cSrcweir if ( m_xElement.is() && m_sBoundCellAddress.getLength() ) 1074*cdf0e10cSrcweir doRegisterCellValueBinding( m_sBoundCellAddress ); 1075*cdf0e10cSrcweir 1076*cdf0e10cSrcweir // XForms binding, if applicable 1077*cdf0e10cSrcweir if ( m_xElement.is() && m_sBindingID.getLength() ) 1078*cdf0e10cSrcweir doRegisterXFormsValueBinding( m_sBindingID ); 1079*cdf0e10cSrcweir 1080*cdf0e10cSrcweir // XForms list binding, if applicable 1081*cdf0e10cSrcweir if ( m_xElement.is() && m_sListBindingID.getLength() ) 1082*cdf0e10cSrcweir doRegisterXFormsListBinding( m_sListBindingID ); 1083*cdf0e10cSrcweir 1084*cdf0e10cSrcweir // XForms submission, if applicable 1085*cdf0e10cSrcweir if ( m_xElement.is() && m_sSubmissionID.getLength() ) 1086*cdf0e10cSrcweir doRegisterXFormsSubmission( m_sSubmissionID ); 1087*cdf0e10cSrcweir } 1088*cdf0e10cSrcweir 1089*cdf0e10cSrcweir //--------------------------------------------------------------------- 1090*cdf0e10cSrcweir void OControlImport::doRegisterCellValueBinding( const ::rtl::OUString& _rBoundCellAddress ) 1091*cdf0e10cSrcweir { 1092*cdf0e10cSrcweir OSL_PRECOND( m_xElement.is(), "OControlImport::doRegisterCellValueBinding: invalid element!" ); 1093*cdf0e10cSrcweir OSL_PRECOND( _rBoundCellAddress.getLength(), 1094*cdf0e10cSrcweir "OControlImport::doRegisterCellValueBinding: invalid address!" ); 1095*cdf0e10cSrcweir 1096*cdf0e10cSrcweir m_rContext.registerCellValueBinding( m_xElement, _rBoundCellAddress ); 1097*cdf0e10cSrcweir } 1098*cdf0e10cSrcweir 1099*cdf0e10cSrcweir //--------------------------------------------------------------------- 1100*cdf0e10cSrcweir void OControlImport::doRegisterXFormsValueBinding( const ::rtl::OUString& _rBindingID ) 1101*cdf0e10cSrcweir { 1102*cdf0e10cSrcweir OSL_PRECOND( m_xElement.is(), "need element" ); 1103*cdf0e10cSrcweir OSL_PRECOND( _rBindingID.getLength() > 0, "binding ID is not valid" ); 1104*cdf0e10cSrcweir 1105*cdf0e10cSrcweir m_rContext.registerXFormsValueBinding( m_xElement, _rBindingID ); 1106*cdf0e10cSrcweir } 1107*cdf0e10cSrcweir 1108*cdf0e10cSrcweir //--------------------------------------------------------------------- 1109*cdf0e10cSrcweir void OControlImport::doRegisterXFormsListBinding( const ::rtl::OUString& _rBindingID ) 1110*cdf0e10cSrcweir { 1111*cdf0e10cSrcweir OSL_PRECOND( m_xElement.is(), "need element" ); 1112*cdf0e10cSrcweir OSL_PRECOND( _rBindingID.getLength() > 0, "binding ID is not valid" ); 1113*cdf0e10cSrcweir 1114*cdf0e10cSrcweir m_rContext.registerXFormsListBinding( m_xElement, _rBindingID ); 1115*cdf0e10cSrcweir } 1116*cdf0e10cSrcweir 1117*cdf0e10cSrcweir //--------------------------------------------------------------------- 1118*cdf0e10cSrcweir void OControlImport::doRegisterXFormsSubmission( const ::rtl::OUString& _rSubmissionID ) 1119*cdf0e10cSrcweir { 1120*cdf0e10cSrcweir OSL_PRECOND( m_xElement.is(), "need element" ); 1121*cdf0e10cSrcweir OSL_PRECOND( _rSubmissionID.getLength() > 0, "binding ID is not valid" ); 1122*cdf0e10cSrcweir 1123*cdf0e10cSrcweir m_rContext.registerXFormsSubmission( m_xElement, _rSubmissionID ); 1124*cdf0e10cSrcweir } 1125*cdf0e10cSrcweir 1126*cdf0e10cSrcweir //--------------------------------------------------------------------- 1127*cdf0e10cSrcweir //added by BerryJia for fixing bug102407 2002-11-5 1128*cdf0e10cSrcweir Reference< XPropertySet > OControlImport::createElement() 1129*cdf0e10cSrcweir { 1130*cdf0e10cSrcweir const Reference<XPropertySet> xPropSet = OElementImport::createElement(); 1131*cdf0e10cSrcweir if ( xPropSet.is() ) 1132*cdf0e10cSrcweir { 1133*cdf0e10cSrcweir m_xInfo = xPropSet->getPropertySetInfo(); 1134*cdf0e10cSrcweir if ( m_xInfo.is() && m_xInfo->hasPropertyByName(PROPERTY_ALIGN) ) 1135*cdf0e10cSrcweir { 1136*cdf0e10cSrcweir Any aValue; 1137*cdf0e10cSrcweir xPropSet->setPropertyValue(PROPERTY_ALIGN,aValue); 1138*cdf0e10cSrcweir } 1139*cdf0e10cSrcweir } 1140*cdf0e10cSrcweir return xPropSet; 1141*cdf0e10cSrcweir } 1142*cdf0e10cSrcweir 1143*cdf0e10cSrcweir //===================================================================== 1144*cdf0e10cSrcweir //= OImagePositionImport 1145*cdf0e10cSrcweir //===================================================================== 1146*cdf0e10cSrcweir //--------------------------------------------------------------------- 1147*cdf0e10cSrcweir OImagePositionImport::OImagePositionImport( OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, 1148*cdf0e10cSrcweir sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, const Reference< XNameContainer >& _rxParentContainer, 1149*cdf0e10cSrcweir OControlElement::ElementType _eType ) 1150*cdf0e10cSrcweir :OControlImport( _rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType ) 1151*cdf0e10cSrcweir ,m_nImagePosition( -1 ) 1152*cdf0e10cSrcweir ,m_nImageAlign( 0 ) 1153*cdf0e10cSrcweir ,m_bHaveImagePosition( sal_False ) 1154*cdf0e10cSrcweir { 1155*cdf0e10cSrcweir } 1156*cdf0e10cSrcweir 1157*cdf0e10cSrcweir //--------------------------------------------------------------------- 1158*cdf0e10cSrcweir bool OImagePositionImport::handleAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, 1159*cdf0e10cSrcweir const ::rtl::OUString& _rValue ) 1160*cdf0e10cSrcweir { 1161*cdf0e10cSrcweir if ( _rLocalName == GetXMLToken( XML_IMAGE_POSITION ) ) 1162*cdf0e10cSrcweir { 1163*cdf0e10cSrcweir OSL_VERIFY( PropertyConversion::convertString( 1164*cdf0e10cSrcweir m_rContext.getGlobalContext(), ::getCppuType( &m_nImagePosition ), 1165*cdf0e10cSrcweir _rValue, OEnumMapper::getEnumMap( OEnumMapper::epImagePosition ) 1166*cdf0e10cSrcweir ) >>= m_nImagePosition ); 1167*cdf0e10cSrcweir m_bHaveImagePosition = sal_True; 1168*cdf0e10cSrcweir return true; 1169*cdf0e10cSrcweir } 1170*cdf0e10cSrcweir 1171*cdf0e10cSrcweir if ( _rLocalName == GetXMLToken( XML_IMAGE_ALIGN ) ) 1172*cdf0e10cSrcweir { 1173*cdf0e10cSrcweir OSL_VERIFY( PropertyConversion::convertString( 1174*cdf0e10cSrcweir m_rContext.getGlobalContext(), ::getCppuType( &m_nImageAlign ), 1175*cdf0e10cSrcweir _rValue, OEnumMapper::getEnumMap( OEnumMapper::epImageAlign ) 1176*cdf0e10cSrcweir ) >>= m_nImageAlign ); 1177*cdf0e10cSrcweir return true; 1178*cdf0e10cSrcweir } 1179*cdf0e10cSrcweir 1180*cdf0e10cSrcweir return OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue ); 1181*cdf0e10cSrcweir } 1182*cdf0e10cSrcweir 1183*cdf0e10cSrcweir //--------------------------------------------------------------------- 1184*cdf0e10cSrcweir void OImagePositionImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1185*cdf0e10cSrcweir { 1186*cdf0e10cSrcweir OControlImport::StartElement( _rxAttrList ); 1187*cdf0e10cSrcweir 1188*cdf0e10cSrcweir if ( m_bHaveImagePosition ) 1189*cdf0e10cSrcweir { 1190*cdf0e10cSrcweir sal_Int16 nUnoImagePosition = ImagePosition::Centered; 1191*cdf0e10cSrcweir if ( m_nImagePosition >= 0 ) 1192*cdf0e10cSrcweir { 1193*cdf0e10cSrcweir OSL_ENSURE( ( m_nImagePosition <= 3 ) && ( m_nImageAlign >= 0 ) && ( m_nImageAlign < 3 ), 1194*cdf0e10cSrcweir "OImagePositionImport::StartElement: unknown image align and/or position!" ); 1195*cdf0e10cSrcweir nUnoImagePosition = m_nImagePosition * 3 + m_nImageAlign; 1196*cdf0e10cSrcweir } 1197*cdf0e10cSrcweir 1198*cdf0e10cSrcweir PropertyValue aImagePosition; 1199*cdf0e10cSrcweir aImagePosition.Name = PROPERTY_IMAGE_POSITION; 1200*cdf0e10cSrcweir aImagePosition.Value <<= nUnoImagePosition; 1201*cdf0e10cSrcweir implPushBackPropertyValue( aImagePosition ); 1202*cdf0e10cSrcweir } 1203*cdf0e10cSrcweir } 1204*cdf0e10cSrcweir 1205*cdf0e10cSrcweir //===================================================================== 1206*cdf0e10cSrcweir //= OReferredControlImport 1207*cdf0e10cSrcweir //===================================================================== 1208*cdf0e10cSrcweir //--------------------------------------------------------------------- 1209*cdf0e10cSrcweir OReferredControlImport::OReferredControlImport( 1210*cdf0e10cSrcweir OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1211*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, 1212*cdf0e10cSrcweir OControlElement::ElementType ) 1213*cdf0e10cSrcweir :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer) 1214*cdf0e10cSrcweir { 1215*cdf0e10cSrcweir } 1216*cdf0e10cSrcweir 1217*cdf0e10cSrcweir //--------------------------------------------------------------------- 1218*cdf0e10cSrcweir void OReferredControlImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1219*cdf0e10cSrcweir { 1220*cdf0e10cSrcweir OControlImport::StartElement(_rxAttrList); 1221*cdf0e10cSrcweir 1222*cdf0e10cSrcweir // the base class should have created the control, so we can register it 1223*cdf0e10cSrcweir if ( m_sReferringControls.getLength() ) 1224*cdf0e10cSrcweir m_rFormImport.registerControlReferences(m_xElement, m_sReferringControls); 1225*cdf0e10cSrcweir } 1226*cdf0e10cSrcweir 1227*cdf0e10cSrcweir //--------------------------------------------------------------------- 1228*cdf0e10cSrcweir bool OReferredControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, 1229*cdf0e10cSrcweir const ::rtl::OUString& _rValue) 1230*cdf0e10cSrcweir { 1231*cdf0e10cSrcweir static const ::rtl::OUString s_sReferenceAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCA_FOR)); 1232*cdf0e10cSrcweir if (_rLocalName == s_sReferenceAttributeName) 1233*cdf0e10cSrcweir { 1234*cdf0e10cSrcweir m_sReferringControls = _rValue; 1235*cdf0e10cSrcweir return true; 1236*cdf0e10cSrcweir } 1237*cdf0e10cSrcweir return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue); 1238*cdf0e10cSrcweir } 1239*cdf0e10cSrcweir 1240*cdf0e10cSrcweir //===================================================================== 1241*cdf0e10cSrcweir //= OPasswordImport 1242*cdf0e10cSrcweir //===================================================================== 1243*cdf0e10cSrcweir //--------------------------------------------------------------------- 1244*cdf0e10cSrcweir OPasswordImport::OPasswordImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1245*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType) 1246*cdf0e10cSrcweir :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType) 1247*cdf0e10cSrcweir { 1248*cdf0e10cSrcweir } 1249*cdf0e10cSrcweir 1250*cdf0e10cSrcweir //--------------------------------------------------------------------- 1251*cdf0e10cSrcweir bool OPasswordImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue) 1252*cdf0e10cSrcweir { 1253*cdf0e10cSrcweir static const ::rtl::OUString s_sEchoCharAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getSpecialAttributeName(SCA_ECHO_CHAR)); 1254*cdf0e10cSrcweir if (_rLocalName == s_sEchoCharAttributeName) 1255*cdf0e10cSrcweir { 1256*cdf0e10cSrcweir // need a special handling for the EchoChar property 1257*cdf0e10cSrcweir PropertyValue aEchoChar; 1258*cdf0e10cSrcweir aEchoChar.Name = PROPERTY_ECHOCHAR; 1259*cdf0e10cSrcweir OSL_ENSURE(_rValue.getLength() == 1, "OPasswordImport::handleAttribute: invalid echo char attribute!"); 1260*cdf0e10cSrcweir // we ourself should not have written values other than of length 1 1261*cdf0e10cSrcweir if (_rValue.getLength() >= 1) 1262*cdf0e10cSrcweir aEchoChar.Value <<= (sal_Int16)_rValue.getStr()[0]; 1263*cdf0e10cSrcweir else 1264*cdf0e10cSrcweir aEchoChar.Value <<= (sal_Int16)0; 1265*cdf0e10cSrcweir implPushBackPropertyValue(aEchoChar); 1266*cdf0e10cSrcweir return true; 1267*cdf0e10cSrcweir } 1268*cdf0e10cSrcweir return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue); 1269*cdf0e10cSrcweir } 1270*cdf0e10cSrcweir 1271*cdf0e10cSrcweir //===================================================================== 1272*cdf0e10cSrcweir //= ORadioImport 1273*cdf0e10cSrcweir //===================================================================== 1274*cdf0e10cSrcweir //--------------------------------------------------------------------- 1275*cdf0e10cSrcweir ORadioImport::ORadioImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1276*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType) 1277*cdf0e10cSrcweir :OImagePositionImport( _rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType ) 1278*cdf0e10cSrcweir { 1279*cdf0e10cSrcweir } 1280*cdf0e10cSrcweir 1281*cdf0e10cSrcweir //--------------------------------------------------------------------- 1282*cdf0e10cSrcweir bool ORadioImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue) 1283*cdf0e10cSrcweir { 1284*cdf0e10cSrcweir // need special handling for the State & CurrentState properties: 1285*cdf0e10cSrcweir // they're stored as booleans, but expected to be int16 properties 1286*cdf0e10cSrcweir static const sal_Char* pCurrentSelectedAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_SELECTED); 1287*cdf0e10cSrcweir static const sal_Char* pSelectedAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_SELECTED); 1288*cdf0e10cSrcweir if ( _rLocalName.equalsAscii( pCurrentSelectedAttributeName ) 1289*cdf0e10cSrcweir || _rLocalName.equalsAscii( pSelectedAttributeName ) 1290*cdf0e10cSrcweir ) 1291*cdf0e10cSrcweir { 1292*cdf0e10cSrcweir const OAttribute2Property::AttributeAssignment* pProperty = m_rContext.getAttributeMap().getAttributeTranslation(_rLocalName); 1293*cdf0e10cSrcweir OSL_ENSURE(pProperty, "ORadioImport::handleAttribute: invalid property map!"); 1294*cdf0e10cSrcweir if (pProperty) 1295*cdf0e10cSrcweir { 1296*cdf0e10cSrcweir const Any aBooleanValue( PropertyConversion::convertString(m_rContext.getGlobalContext(), pProperty->aPropertyType, _rValue, pProperty->pEnumMap) ); 1297*cdf0e10cSrcweir 1298*cdf0e10cSrcweir // create and store a new PropertyValue 1299*cdf0e10cSrcweir PropertyValue aNewValue; 1300*cdf0e10cSrcweir aNewValue.Name = pProperty->sPropertyName; 1301*cdf0e10cSrcweir aNewValue.Value <<= (sal_Int16)::cppu::any2bool(aBooleanValue); 1302*cdf0e10cSrcweir 1303*cdf0e10cSrcweir implPushBackPropertyValue(aNewValue); 1304*cdf0e10cSrcweir } 1305*cdf0e10cSrcweir return true; 1306*cdf0e10cSrcweir } 1307*cdf0e10cSrcweir return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue ); 1308*cdf0e10cSrcweir } 1309*cdf0e10cSrcweir 1310*cdf0e10cSrcweir //===================================================================== 1311*cdf0e10cSrcweir //= OURLReferenceImport 1312*cdf0e10cSrcweir //===================================================================== 1313*cdf0e10cSrcweir OURLReferenceImport::OURLReferenceImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1314*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, 1315*cdf0e10cSrcweir OControlElement::ElementType _eType) 1316*cdf0e10cSrcweir :OImagePositionImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType) 1317*cdf0e10cSrcweir { 1318*cdf0e10cSrcweir } 1319*cdf0e10cSrcweir 1320*cdf0e10cSrcweir //--------------------------------------------------------------------- 1321*cdf0e10cSrcweir bool OURLReferenceImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue) 1322*cdf0e10cSrcweir { 1323*cdf0e10cSrcweir static const sal_Char* s_pTargetLocationAttributeName = OAttributeMetaData::getCommonControlAttributeName( CCA_TARGET_LOCATION ); 1324*cdf0e10cSrcweir static const sal_Char* s_pImageDataAttributeName = OAttributeMetaData::getCommonControlAttributeName( CCA_IMAGE_DATA ); 1325*cdf0e10cSrcweir 1326*cdf0e10cSrcweir // need to make the URL absolute if 1327*cdf0e10cSrcweir // * it's the image-data attribute 1328*cdf0e10cSrcweir // * it's the target-location attribute, and we're dealign with an object which has the respective property 1329*cdf0e10cSrcweir sal_Bool bMakeAbsolute = 1330*cdf0e10cSrcweir ( 0 == _rLocalName.compareToAscii( s_pImageDataAttributeName ) ) 1331*cdf0e10cSrcweir || ( ( 0 == _rLocalName.compareToAscii( s_pTargetLocationAttributeName ) ) 1332*cdf0e10cSrcweir && ( ( OControlElement::BUTTON == m_eElementType ) 1333*cdf0e10cSrcweir || ( OControlElement::IMAGE == m_eElementType ) 1334*cdf0e10cSrcweir ) 1335*cdf0e10cSrcweir ); 1336*cdf0e10cSrcweir 1337*cdf0e10cSrcweir if ( bMakeAbsolute && ( _rValue.getLength() > 0 ) ) 1338*cdf0e10cSrcweir { 1339*cdf0e10cSrcweir // make a global URL out of the local one 1340*cdf0e10cSrcweir ::rtl::OUString sAdjustedValue; 1341*cdf0e10cSrcweir // only resolve image related url 1342*cdf0e10cSrcweir // we don't want say form url targets to be resolved 1343*cdf0e10cSrcweir // using ResolveGraphicObjectURL 1344*cdf0e10cSrcweir if ( 0 == _rLocalName.compareToAscii( s_pImageDataAttributeName ) ) 1345*cdf0e10cSrcweir sAdjustedValue = m_rContext.getGlobalContext().ResolveGraphicObjectURL( _rValue, sal_False ); 1346*cdf0e10cSrcweir else 1347*cdf0e10cSrcweir sAdjustedValue = m_rContext.getGlobalContext().GetAbsoluteReference( _rValue ); 1348*cdf0e10cSrcweir return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, sAdjustedValue ); 1349*cdf0e10cSrcweir } 1350*cdf0e10cSrcweir 1351*cdf0e10cSrcweir return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue ); 1352*cdf0e10cSrcweir } 1353*cdf0e10cSrcweir 1354*cdf0e10cSrcweir //===================================================================== 1355*cdf0e10cSrcweir //= OButtonImport 1356*cdf0e10cSrcweir //===================================================================== 1357*cdf0e10cSrcweir //--------------------------------------------------------------------- 1358*cdf0e10cSrcweir OButtonImport::OButtonImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1359*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, 1360*cdf0e10cSrcweir OControlElement::ElementType _eType) 1361*cdf0e10cSrcweir :OURLReferenceImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType) 1362*cdf0e10cSrcweir { 1363*cdf0e10cSrcweir enableTrackAttributes(); 1364*cdf0e10cSrcweir } 1365*cdf0e10cSrcweir 1366*cdf0e10cSrcweir //--------------------------------------------------------------------- 1367*cdf0e10cSrcweir void OButtonImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1368*cdf0e10cSrcweir { 1369*cdf0e10cSrcweir OURLReferenceImport::StartElement(_rxAttrList); 1370*cdf0e10cSrcweir 1371*cdf0e10cSrcweir // handle the target-frame attribute 1372*cdf0e10cSrcweir simulateDefaultedAttribute(OAttributeMetaData::getCommonControlAttributeName(CCA_TARGET_FRAME), PROPERTY_TARGETFRAME, "_blank"); 1373*cdf0e10cSrcweir } 1374*cdf0e10cSrcweir 1375*cdf0e10cSrcweir //===================================================================== 1376*cdf0e10cSrcweir //= OValueRangeImport 1377*cdf0e10cSrcweir //===================================================================== 1378*cdf0e10cSrcweir //--------------------------------------------------------------------- 1379*cdf0e10cSrcweir OValueRangeImport::OValueRangeImport( OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1380*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType ) 1381*cdf0e10cSrcweir :OControlImport( _rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType ) 1382*cdf0e10cSrcweir ,m_nStepSizeValue( 1 ) 1383*cdf0e10cSrcweir { 1384*cdf0e10cSrcweir 1385*cdf0e10cSrcweir } 1386*cdf0e10cSrcweir 1387*cdf0e10cSrcweir //--------------------------------------------------------------------- 1388*cdf0e10cSrcweir bool OValueRangeImport::handleAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue ) 1389*cdf0e10cSrcweir { 1390*cdf0e10cSrcweir if ( _rLocalName.equalsAscii( OAttributeMetaData::getSpecialAttributeName( SCA_STEP_SIZE ) ) ) 1391*cdf0e10cSrcweir { 1392*cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertNumber( m_nStepSizeValue, _rValue ); 1393*cdf0e10cSrcweir return true; 1394*cdf0e10cSrcweir } 1395*cdf0e10cSrcweir return OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue ); 1396*cdf0e10cSrcweir } 1397*cdf0e10cSrcweir 1398*cdf0e10cSrcweir //--------------------------------------------------------------------- 1399*cdf0e10cSrcweir void OValueRangeImport::StartElement( const Reference< sax::XAttributeList >& _rxAttrList ) 1400*cdf0e10cSrcweir { 1401*cdf0e10cSrcweir OControlImport::StartElement( _rxAttrList ); 1402*cdf0e10cSrcweir 1403*cdf0e10cSrcweir if ( m_xInfo.is() ) 1404*cdf0e10cSrcweir { 1405*cdf0e10cSrcweir if ( m_xInfo->hasPropertyByName( PROPERTY_SPIN_INCREMENT ) ) 1406*cdf0e10cSrcweir m_xElement->setPropertyValue( PROPERTY_SPIN_INCREMENT, makeAny( m_nStepSizeValue ) ); 1407*cdf0e10cSrcweir else if ( m_xInfo->hasPropertyByName( PROPERTY_LINE_INCREMENT ) ) 1408*cdf0e10cSrcweir m_xElement->setPropertyValue( PROPERTY_LINE_INCREMENT, makeAny( m_nStepSizeValue ) ); 1409*cdf0e10cSrcweir } 1410*cdf0e10cSrcweir } 1411*cdf0e10cSrcweir 1412*cdf0e10cSrcweir //===================================================================== 1413*cdf0e10cSrcweir //= OTextLikeImport 1414*cdf0e10cSrcweir //===================================================================== 1415*cdf0e10cSrcweir //--------------------------------------------------------------------- 1416*cdf0e10cSrcweir OTextLikeImport::OTextLikeImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1417*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, 1418*cdf0e10cSrcweir OControlElement::ElementType _eType) 1419*cdf0e10cSrcweir :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType) 1420*cdf0e10cSrcweir ,m_bEncounteredTextPara( false ) 1421*cdf0e10cSrcweir { 1422*cdf0e10cSrcweir enableTrackAttributes(); 1423*cdf0e10cSrcweir } 1424*cdf0e10cSrcweir 1425*cdf0e10cSrcweir //--------------------------------------------------------------------- 1426*cdf0e10cSrcweir SvXMLImportContext* OTextLikeImport::CreateChildContext( sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, 1427*cdf0e10cSrcweir const Reference< sax::XAttributeList >& _rxAttrList ) 1428*cdf0e10cSrcweir { 1429*cdf0e10cSrcweir if ( ( XML_NAMESPACE_TEXT == _nPrefix ) && _rLocalName.equalsIgnoreAsciiCaseAscii( "p" ) ) 1430*cdf0e10cSrcweir { 1431*cdf0e10cSrcweir OSL_ENSURE( m_eElementType == OControlElement::TEXT_AREA, 1432*cdf0e10cSrcweir "OTextLikeImport::CreateChildContext: text paragraphs in a non-text-area?" ); 1433*cdf0e10cSrcweir 1434*cdf0e10cSrcweir if ( m_eElementType == OControlElement::TEXT_AREA ) 1435*cdf0e10cSrcweir { 1436*cdf0e10cSrcweir Reference< XText > xTextElement( m_xElement, UNO_QUERY ); 1437*cdf0e10cSrcweir if ( xTextElement.is() ) 1438*cdf0e10cSrcweir { 1439*cdf0e10cSrcweir UniReference < XMLTextImportHelper > xTextImportHelper( m_rContext.getGlobalContext().GetTextImport() ); 1440*cdf0e10cSrcweir 1441*cdf0e10cSrcweir if ( !m_xCursor.is() ) 1442*cdf0e10cSrcweir { 1443*cdf0e10cSrcweir m_xOldCursor = xTextImportHelper->GetCursor(); 1444*cdf0e10cSrcweir m_xCursor = xTextElement->createTextCursor(); 1445*cdf0e10cSrcweir 1446*cdf0e10cSrcweir if ( m_xCursor.is() ) 1447*cdf0e10cSrcweir xTextImportHelper->SetCursor( m_xCursor ); 1448*cdf0e10cSrcweir } 1449*cdf0e10cSrcweir if ( m_xCursor.is() ) 1450*cdf0e10cSrcweir { 1451*cdf0e10cSrcweir m_bEncounteredTextPara = true; 1452*cdf0e10cSrcweir return xTextImportHelper->CreateTextChildContext( m_rContext.getGlobalContext(), _nPrefix, _rLocalName, _rxAttrList ); 1453*cdf0e10cSrcweir } 1454*cdf0e10cSrcweir } 1455*cdf0e10cSrcweir else 1456*cdf0e10cSrcweir { 1457*cdf0e10cSrcweir // in theory, we could accumulate all the text portions (without formatting), 1458*cdf0e10cSrcweir // and set it as Text property at the model ... 1459*cdf0e10cSrcweir } 1460*cdf0e10cSrcweir } 1461*cdf0e10cSrcweir } 1462*cdf0e10cSrcweir 1463*cdf0e10cSrcweir return OControlImport::CreateChildContext( _nPrefix, _rLocalName, _rxAttrList ); 1464*cdf0e10cSrcweir } 1465*cdf0e10cSrcweir 1466*cdf0e10cSrcweir //--------------------------------------------------------------------- 1467*cdf0e10cSrcweir void OTextLikeImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1468*cdf0e10cSrcweir { 1469*cdf0e10cSrcweir OControlImport::StartElement(_rxAttrList); 1470*cdf0e10cSrcweir 1471*cdf0e10cSrcweir // handle the convert-empty-to-null attribute, whose default is different from the property default 1472*cdf0e10cSrcweir // unfortunately, different classes are imported by this class ('cause they're represented by the 1473*cdf0e10cSrcweir // same XML element), though not all of them know this property. 1474*cdf0e10cSrcweir // So we have to do a check ... 1475*cdf0e10cSrcweir if (m_xElement.is() && m_xInfo.is() && m_xInfo->hasPropertyByName(PROPERTY_EMPTY_IS_NULL) ) 1476*cdf0e10cSrcweir simulateDefaultedAttribute(OAttributeMetaData::getDatabaseAttributeName(DA_CONVERT_EMPTY), PROPERTY_EMPTY_IS_NULL, "false"); 1477*cdf0e10cSrcweir } 1478*cdf0e10cSrcweir 1479*cdf0e10cSrcweir //--------------------------------------------------------------------- 1480*cdf0e10cSrcweir struct EqualHandle : public ::std::unary_function< PropertyValue, bool > 1481*cdf0e10cSrcweir { 1482*cdf0e10cSrcweir const sal_Int32 m_nHandle; 1483*cdf0e10cSrcweir EqualHandle( sal_Int32 _nHandle ) : m_nHandle( _nHandle ) { } 1484*cdf0e10cSrcweir 1485*cdf0e10cSrcweir inline bool operator()( const PropertyValue& _rProp ) 1486*cdf0e10cSrcweir { 1487*cdf0e10cSrcweir return _rProp.Handle == m_nHandle; 1488*cdf0e10cSrcweir } 1489*cdf0e10cSrcweir }; 1490*cdf0e10cSrcweir 1491*cdf0e10cSrcweir //--------------------------------------------------------------------- 1492*cdf0e10cSrcweir void OTextLikeImport::removeRedundantCurrentValue() 1493*cdf0e10cSrcweir { 1494*cdf0e10cSrcweir if ( m_bEncounteredTextPara ) 1495*cdf0e10cSrcweir { 1496*cdf0e10cSrcweir // In case the text is written in the text:p elements, we need to ignore what we read as 1497*cdf0e10cSrcweir // current-value attribute, since it's redundant. 1498*cdf0e10cSrcweir // fortunately, OElementImport tagged the value property with the PROPID_CURRENT_VALUE 1499*cdf0e10cSrcweir // handle, so we do not need to determine the name of our value property here 1500*cdf0e10cSrcweir // (normally, it should be "Text", since no other controls than the edit field should 1501*cdf0e10cSrcweir // have the text:p elements) 1502*cdf0e10cSrcweir PropertyValueArray::iterator aValuePropertyPos = ::std::find_if( 1503*cdf0e10cSrcweir m_aValues.begin(), 1504*cdf0e10cSrcweir m_aValues.end(), 1505*cdf0e10cSrcweir EqualHandle( PROPID_CURRENT_VALUE ) 1506*cdf0e10cSrcweir ); 1507*cdf0e10cSrcweir if ( aValuePropertyPos != m_aValues.end() ) 1508*cdf0e10cSrcweir { 1509*cdf0e10cSrcweir OSL_ENSURE( aValuePropertyPos->Name == PROPERTY_TEXT, "OTextLikeImport::EndElement: text:p was present, but our value property is *not* 'Text'!" ); 1510*cdf0e10cSrcweir if ( aValuePropertyPos->Name == PROPERTY_TEXT ) 1511*cdf0e10cSrcweir { 1512*cdf0e10cSrcweir ::std::copy( 1513*cdf0e10cSrcweir aValuePropertyPos + 1, 1514*cdf0e10cSrcweir m_aValues.end(), 1515*cdf0e10cSrcweir aValuePropertyPos 1516*cdf0e10cSrcweir ); 1517*cdf0e10cSrcweir m_aValues.resize( m_aValues.size() - 1 ); 1518*cdf0e10cSrcweir } 1519*cdf0e10cSrcweir } 1520*cdf0e10cSrcweir 1521*cdf0e10cSrcweir // additionally, we need to set the "RichText" property of our element to sal_True 1522*cdf0e10cSrcweir // (the presence of the text:p is used as indicator for the value of the RichText property) 1523*cdf0e10cSrcweir sal_Bool bHasRichTextProperty = sal_False; 1524*cdf0e10cSrcweir if ( m_xInfo.is() ) 1525*cdf0e10cSrcweir bHasRichTextProperty = m_xInfo->hasPropertyByName( PROPERTY_RICH_TEXT ); 1526*cdf0e10cSrcweir OSL_ENSURE( bHasRichTextProperty, "OTextLikeImport::EndElement: text:p, but no rich text control?" ); 1527*cdf0e10cSrcweir if ( bHasRichTextProperty ) 1528*cdf0e10cSrcweir m_xElement->setPropertyValue( PROPERTY_RICH_TEXT, makeAny( (sal_Bool)sal_True ) ); 1529*cdf0e10cSrcweir } 1530*cdf0e10cSrcweir // Note that we do *not* set the RichText property (in case our element has one) to sal_False here 1531*cdf0e10cSrcweir // since this is the default of this property, anyway. 1532*cdf0e10cSrcweir } 1533*cdf0e10cSrcweir 1534*cdf0e10cSrcweir //--------------------------------------------------------------------- 1535*cdf0e10cSrcweir struct EqualName : public ::std::unary_function< PropertyValue, bool > 1536*cdf0e10cSrcweir { 1537*cdf0e10cSrcweir const ::rtl::OUString m_sName; 1538*cdf0e10cSrcweir EqualName( const ::rtl::OUString& _rName ) : m_sName( _rName ) { } 1539*cdf0e10cSrcweir 1540*cdf0e10cSrcweir inline bool operator()( const PropertyValue& _rProp ) 1541*cdf0e10cSrcweir { 1542*cdf0e10cSrcweir return _rProp.Name == m_sName; 1543*cdf0e10cSrcweir } 1544*cdf0e10cSrcweir }; 1545*cdf0e10cSrcweir 1546*cdf0e10cSrcweir //--------------------------------------------------------------------- 1547*cdf0e10cSrcweir void OTextLikeImport::adjustDefaultControlProperty() 1548*cdf0e10cSrcweir { 1549*cdf0e10cSrcweir // In OpenOffice.org 2.0, we changed the implementation of the css.form.component.TextField (the model of a text field control), 1550*cdf0e10cSrcweir // so that it now uses another default control. So if we encounter a text field where the *old* default 1551*cdf0e10cSrcweir // control property is writting, we are not allowed to use it 1552*cdf0e10cSrcweir PropertyValueArray::iterator aDefaultControlPropertyPos = ::std::find_if( 1553*cdf0e10cSrcweir m_aValues.begin(), 1554*cdf0e10cSrcweir m_aValues.end(), 1555*cdf0e10cSrcweir EqualName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultControl" ) ) ) 1556*cdf0e10cSrcweir ); 1557*cdf0e10cSrcweir if ( aDefaultControlPropertyPos != m_aValues.end() ) 1558*cdf0e10cSrcweir { 1559*cdf0e10cSrcweir ::rtl::OUString sDefaultControl; 1560*cdf0e10cSrcweir OSL_VERIFY( aDefaultControlPropertyPos->Value >>= sDefaultControl ); 1561*cdf0e10cSrcweir if ( sDefaultControl.equalsAscii( "stardiv.one.form.control.Edit" ) ) 1562*cdf0e10cSrcweir { 1563*cdf0e10cSrcweir // complete remove this property value from the array. Today's "default value" of the "DefaultControl" 1564*cdf0e10cSrcweir // property is sufficient 1565*cdf0e10cSrcweir ::std::copy( 1566*cdf0e10cSrcweir aDefaultControlPropertyPos + 1, 1567*cdf0e10cSrcweir m_aValues.end(), 1568*cdf0e10cSrcweir aDefaultControlPropertyPos 1569*cdf0e10cSrcweir ); 1570*cdf0e10cSrcweir m_aValues.resize( m_aValues.size() - 1 ); 1571*cdf0e10cSrcweir } 1572*cdf0e10cSrcweir } 1573*cdf0e10cSrcweir } 1574*cdf0e10cSrcweir 1575*cdf0e10cSrcweir //--------------------------------------------------------------------- 1576*cdf0e10cSrcweir void OTextLikeImport::EndElement() 1577*cdf0e10cSrcweir { 1578*cdf0e10cSrcweir removeRedundantCurrentValue(); 1579*cdf0e10cSrcweir adjustDefaultControlProperty(); 1580*cdf0e10cSrcweir 1581*cdf0e10cSrcweir // let the base class do the stuff 1582*cdf0e10cSrcweir OControlImport::EndElement(); 1583*cdf0e10cSrcweir 1584*cdf0e10cSrcweir // some cleanups 1585*cdf0e10cSrcweir UniReference < XMLTextImportHelper > xTextImportHelper( m_rContext.getGlobalContext().GetTextImport() ); 1586*cdf0e10cSrcweir if ( m_xCursor.is() ) 1587*cdf0e10cSrcweir { 1588*cdf0e10cSrcweir // delete the newline which has been imported errornously 1589*cdf0e10cSrcweir // TODO (fs): stole this code somewhere - why don't we fix the text import?? 1590*cdf0e10cSrcweir m_xCursor->gotoEnd( sal_False ); 1591*cdf0e10cSrcweir m_xCursor->goLeft( 1, sal_True ); 1592*cdf0e10cSrcweir m_xCursor->setString( ::rtl::OUString() ); 1593*cdf0e10cSrcweir 1594*cdf0e10cSrcweir // reset cursor 1595*cdf0e10cSrcweir xTextImportHelper->ResetCursor(); 1596*cdf0e10cSrcweir } 1597*cdf0e10cSrcweir 1598*cdf0e10cSrcweir if ( m_xOldCursor.is() ) 1599*cdf0e10cSrcweir xTextImportHelper->SetCursor( m_xOldCursor ); 1600*cdf0e10cSrcweir 1601*cdf0e10cSrcweir } 1602*cdf0e10cSrcweir 1603*cdf0e10cSrcweir //===================================================================== 1604*cdf0e10cSrcweir //= OListAndComboImport 1605*cdf0e10cSrcweir //===================================================================== 1606*cdf0e10cSrcweir //--------------------------------------------------------------------- 1607*cdf0e10cSrcweir OListAndComboImport::OListAndComboImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1608*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, 1609*cdf0e10cSrcweir OControlElement::ElementType _eType) 1610*cdf0e10cSrcweir :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType) 1611*cdf0e10cSrcweir ,m_nEmptyListItems( 0 ) 1612*cdf0e10cSrcweir ,m_nEmptyValueItems( 0 ) 1613*cdf0e10cSrcweir ,m_bEncounteredLSAttrib( sal_False ) 1614*cdf0e10cSrcweir ,m_bLinkWithIndexes( sal_False ) 1615*cdf0e10cSrcweir { 1616*cdf0e10cSrcweir if (OControlElement::COMBOBOX == m_eElementType) 1617*cdf0e10cSrcweir enableTrackAttributes(); 1618*cdf0e10cSrcweir } 1619*cdf0e10cSrcweir 1620*cdf0e10cSrcweir //--------------------------------------------------------------------- 1621*cdf0e10cSrcweir SvXMLImportContext* OListAndComboImport::CreateChildContext(sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, 1622*cdf0e10cSrcweir const Reference< sax::XAttributeList >& _rxAttrList) 1623*cdf0e10cSrcweir { 1624*cdf0e10cSrcweir // is it the "option" sub tag of a listbox ? 1625*cdf0e10cSrcweir static const ::rtl::OUString s_sOptionElementName = ::rtl::OUString::createFromAscii("option"); 1626*cdf0e10cSrcweir if (s_sOptionElementName == _rLocalName) 1627*cdf0e10cSrcweir return new OListOptionImport(GetImport(), _nPrefix, _rLocalName, this); 1628*cdf0e10cSrcweir 1629*cdf0e10cSrcweir // is it the "item" sub tag of a combobox ? 1630*cdf0e10cSrcweir static const ::rtl::OUString s_sItemElementName = ::rtl::OUString::createFromAscii("item"); 1631*cdf0e10cSrcweir if (s_sItemElementName == _rLocalName) 1632*cdf0e10cSrcweir return new OComboItemImport(GetImport(), _nPrefix, _rLocalName, this); 1633*cdf0e10cSrcweir 1634*cdf0e10cSrcweir // everything else 1635*cdf0e10cSrcweir return OControlImport::CreateChildContext(_nPrefix, _rLocalName, _rxAttrList); 1636*cdf0e10cSrcweir } 1637*cdf0e10cSrcweir 1638*cdf0e10cSrcweir //--------------------------------------------------------------------- 1639*cdf0e10cSrcweir void OListAndComboImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1640*cdf0e10cSrcweir { 1641*cdf0e10cSrcweir m_bLinkWithIndexes = sal_False; 1642*cdf0e10cSrcweir 1643*cdf0e10cSrcweir OControlImport::StartElement(_rxAttrList); 1644*cdf0e10cSrcweir 1645*cdf0e10cSrcweir if (OControlElement::COMBOBOX == m_eElementType) 1646*cdf0e10cSrcweir { 1647*cdf0e10cSrcweir // for the auto-completion 1648*cdf0e10cSrcweir // the attribute default does not equal the property default, so in case we did not read this attribute, 1649*cdf0e10cSrcweir // we have to simulate it 1650*cdf0e10cSrcweir simulateDefaultedAttribute( OAttributeMetaData::getSpecialAttributeName( SCA_AUTOMATIC_COMPLETION ), PROPERTY_AUTOCOMPLETE, "false"); 1651*cdf0e10cSrcweir 1652*cdf0e10cSrcweir // same for the convert-empty-to-null attribute, which's default is different from the property default 1653*cdf0e10cSrcweir simulateDefaultedAttribute( OAttributeMetaData::getDatabaseAttributeName( DA_CONVERT_EMPTY ), PROPERTY_EMPTY_IS_NULL, "false"); 1654*cdf0e10cSrcweir } 1655*cdf0e10cSrcweir } 1656*cdf0e10cSrcweir 1657*cdf0e10cSrcweir //--------------------------------------------------------------------- 1658*cdf0e10cSrcweir void OListAndComboImport::EndElement() 1659*cdf0e10cSrcweir { 1660*cdf0e10cSrcweir // append the list source property the the properties sequence of our importer 1661*cdf0e10cSrcweir // the string item list 1662*cdf0e10cSrcweir PropertyValue aItemList; 1663*cdf0e10cSrcweir aItemList.Name = PROPERTY_STRING_ITEM_LIST; 1664*cdf0e10cSrcweir aItemList.Value <<= m_aListSource; 1665*cdf0e10cSrcweir implPushBackPropertyValue(aItemList); 1666*cdf0e10cSrcweir 1667*cdf0e10cSrcweir if (OControlElement::LISTBOX == m_eElementType) 1668*cdf0e10cSrcweir { 1669*cdf0e10cSrcweir OSL_ENSURE((m_aListSource.getLength() + m_nEmptyListItems) == (m_aValueList.getLength() + m_nEmptyValueItems), 1670*cdf0e10cSrcweir "OListAndComboImport::EndElement: inconsistence between labels and values!"); 1671*cdf0e10cSrcweir 1672*cdf0e10cSrcweir if ( !m_bEncounteredLSAttrib ) 1673*cdf0e10cSrcweir { 1674*cdf0e10cSrcweir // the value sequence 1675*cdf0e10cSrcweir PropertyValue aValueList; 1676*cdf0e10cSrcweir aValueList.Name = PROPERTY_LISTSOURCE; 1677*cdf0e10cSrcweir aValueList.Value <<= m_aValueList; 1678*cdf0e10cSrcweir implPushBackPropertyValue(aValueList); 1679*cdf0e10cSrcweir } 1680*cdf0e10cSrcweir 1681*cdf0e10cSrcweir // the select sequence 1682*cdf0e10cSrcweir PropertyValue aSelected; 1683*cdf0e10cSrcweir aSelected.Name = PROPERTY_SELECT_SEQ; 1684*cdf0e10cSrcweir aSelected.Value <<= m_aSelectedSeq; 1685*cdf0e10cSrcweir implPushBackPropertyValue(aSelected); 1686*cdf0e10cSrcweir 1687*cdf0e10cSrcweir // the default select sequence 1688*cdf0e10cSrcweir PropertyValue aDefaultSelected; 1689*cdf0e10cSrcweir aDefaultSelected.Name = PROPERTY_DEFAULT_SELECT_SEQ; 1690*cdf0e10cSrcweir aDefaultSelected.Value <<= m_aDefaultSelectedSeq; 1691*cdf0e10cSrcweir implPushBackPropertyValue(aDefaultSelected); 1692*cdf0e10cSrcweir } 1693*cdf0e10cSrcweir 1694*cdf0e10cSrcweir OControlImport::EndElement(); 1695*cdf0e10cSrcweir 1696*cdf0e10cSrcweir // the external list source, if applicable 1697*cdf0e10cSrcweir if ( m_xElement.is() && m_sCellListSource.getLength() ) 1698*cdf0e10cSrcweir m_rContext.registerCellRangeListSource( m_xElement, m_sCellListSource ); 1699*cdf0e10cSrcweir } 1700*cdf0e10cSrcweir 1701*cdf0e10cSrcweir //--------------------------------------------------------------------- 1702*cdf0e10cSrcweir void OListAndComboImport::doRegisterCellValueBinding( const ::rtl::OUString& _rBoundCellAddress ) 1703*cdf0e10cSrcweir { 1704*cdf0e10cSrcweir ::rtl::OUString sBoundCellAddress( _rBoundCellAddress ); 1705*cdf0e10cSrcweir if ( m_bLinkWithIndexes ) 1706*cdf0e10cSrcweir { 1707*cdf0e10cSrcweir // This is a HACK. We register a string which is no valid address, but allows 1708*cdf0e10cSrcweir // (somewhere else) to determine that a non-standard binding should be created. 1709*cdf0e10cSrcweir // This hack is acceptable for OOo 1.1.1, since the file format for value 1710*cdf0e10cSrcweir // bindings of form controls is to be changed afterwards, anyway. 1711*cdf0e10cSrcweir sBoundCellAddress += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":index" ) ); 1712*cdf0e10cSrcweir } 1713*cdf0e10cSrcweir 1714*cdf0e10cSrcweir OControlImport::doRegisterCellValueBinding( sBoundCellAddress ); 1715*cdf0e10cSrcweir } 1716*cdf0e10cSrcweir 1717*cdf0e10cSrcweir //--------------------------------------------------------------------- 1718*cdf0e10cSrcweir bool OListAndComboImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue) 1719*cdf0e10cSrcweir { 1720*cdf0e10cSrcweir static const sal_Char* pListSourceAttributeName = OAttributeMetaData::getDatabaseAttributeName(DA_LIST_SOURCE); 1721*cdf0e10cSrcweir if ( _rLocalName.equalsAscii(pListSourceAttributeName) ) 1722*cdf0e10cSrcweir { 1723*cdf0e10cSrcweir PropertyValue aListSource; 1724*cdf0e10cSrcweir aListSource.Name = PROPERTY_LISTSOURCE; 1725*cdf0e10cSrcweir 1726*cdf0e10cSrcweir // it's the ListSource attribute 1727*cdf0e10cSrcweir m_bEncounteredLSAttrib = sal_True; 1728*cdf0e10cSrcweir if ( OControlElement::COMBOBOX == m_eElementType ) 1729*cdf0e10cSrcweir { 1730*cdf0e10cSrcweir aListSource.Value <<= _rValue; 1731*cdf0e10cSrcweir } 1732*cdf0e10cSrcweir else 1733*cdf0e10cSrcweir { 1734*cdf0e10cSrcweir // a listbox which has a list-source attribute must have a list-source-type of something 1735*cdf0e10cSrcweir // not equal to ValueList. 1736*cdf0e10cSrcweir // In this case, the list-source value is simply the one and only element of the ListSource property. 1737*cdf0e10cSrcweir Sequence< ::rtl::OUString > aListSourcePropValue( 1 ); 1738*cdf0e10cSrcweir aListSourcePropValue[0] = _rValue; 1739*cdf0e10cSrcweir aListSource.Value <<= aListSourcePropValue; 1740*cdf0e10cSrcweir } 1741*cdf0e10cSrcweir 1742*cdf0e10cSrcweir implPushBackPropertyValue( aListSource ); 1743*cdf0e10cSrcweir return true; 1744*cdf0e10cSrcweir } 1745*cdf0e10cSrcweir 1746*cdf0e10cSrcweir if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BA_LIST_CELL_RANGE ) ) ) 1747*cdf0e10cSrcweir { 1748*cdf0e10cSrcweir m_sCellListSource = _rValue; 1749*cdf0e10cSrcweir return true; 1750*cdf0e10cSrcweir } 1751*cdf0e10cSrcweir 1752*cdf0e10cSrcweir if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BA_LIST_LINKING_TYPE ) ) ) 1753*cdf0e10cSrcweir { 1754*cdf0e10cSrcweir sal_Int16 nLinkageType = 0; 1755*cdf0e10cSrcweir PropertyConversion::convertString( 1756*cdf0e10cSrcweir m_rContext.getGlobalContext(), 1757*cdf0e10cSrcweir ::getCppuType( static_cast< sal_Int16* >( NULL ) ), 1758*cdf0e10cSrcweir _rValue, 1759*cdf0e10cSrcweir OEnumMapper::getEnumMap( OEnumMapper::epListLinkageType ) 1760*cdf0e10cSrcweir ) >>= nLinkageType; 1761*cdf0e10cSrcweir 1762*cdf0e10cSrcweir m_bLinkWithIndexes = ( nLinkageType != 0 ); 1763*cdf0e10cSrcweir return true; 1764*cdf0e10cSrcweir } 1765*cdf0e10cSrcweir 1766*cdf0e10cSrcweir return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue); 1767*cdf0e10cSrcweir } 1768*cdf0e10cSrcweir 1769*cdf0e10cSrcweir //--------------------------------------------------------------------- 1770*cdf0e10cSrcweir void OListAndComboImport::implPushBackLabel(const ::rtl::OUString& _rLabel) 1771*cdf0e10cSrcweir { 1772*cdf0e10cSrcweir OSL_ENSURE(!m_nEmptyListItems, "OListAndComboImport::implPushBackValue: label list is already done!"); 1773*cdf0e10cSrcweir if (!m_nEmptyListItems) 1774*cdf0e10cSrcweir pushBackSequenceElement(m_aListSource, _rLabel); 1775*cdf0e10cSrcweir } 1776*cdf0e10cSrcweir 1777*cdf0e10cSrcweir //--------------------------------------------------------------------- 1778*cdf0e10cSrcweir void OListAndComboImport::implPushBackValue(const ::rtl::OUString& _rValue) 1779*cdf0e10cSrcweir { 1780*cdf0e10cSrcweir OSL_ENSURE(!m_nEmptyValueItems, "OListAndComboImport::implPushBackValue: value list is already done!"); 1781*cdf0e10cSrcweir if (!m_nEmptyValueItems) 1782*cdf0e10cSrcweir { 1783*cdf0e10cSrcweir OSL_ENSURE( !m_bEncounteredLSAttrib, "OListAndComboImport::implPushBackValue: invalid structure! Did you save this document with a version prior SRC641 m?" ); 1784*cdf0e10cSrcweir // We already had the list-source attribute, which means that the ListSourceType is 1785*cdf0e10cSrcweir // not ValueList, which means that the ListSource should contain only one string in 1786*cdf0e10cSrcweir // the first element of the sequence 1787*cdf0e10cSrcweir // All other values in the file are invalid 1788*cdf0e10cSrcweir 1789*cdf0e10cSrcweir pushBackSequenceElement( m_aValueList, _rValue ); 1790*cdf0e10cSrcweir } 1791*cdf0e10cSrcweir } 1792*cdf0e10cSrcweir 1793*cdf0e10cSrcweir //--------------------------------------------------------------------- 1794*cdf0e10cSrcweir void OListAndComboImport::implEmptyLabelFound() 1795*cdf0e10cSrcweir { 1796*cdf0e10cSrcweir ++m_nEmptyListItems; 1797*cdf0e10cSrcweir } 1798*cdf0e10cSrcweir 1799*cdf0e10cSrcweir //--------------------------------------------------------------------- 1800*cdf0e10cSrcweir void OListAndComboImport::implEmptyValueFound() 1801*cdf0e10cSrcweir { 1802*cdf0e10cSrcweir ++m_nEmptyValueItems; 1803*cdf0e10cSrcweir } 1804*cdf0e10cSrcweir 1805*cdf0e10cSrcweir //--------------------------------------------------------------------- 1806*cdf0e10cSrcweir void OListAndComboImport::implSelectCurrentItem() 1807*cdf0e10cSrcweir { 1808*cdf0e10cSrcweir OSL_ENSURE((m_aListSource.getLength() + m_nEmptyListItems) == (m_aValueList.getLength() + m_nEmptyValueItems), 1809*cdf0e10cSrcweir "OListAndComboImport::implSelectCurrentItem: inconsistence between labels and values!"); 1810*cdf0e10cSrcweir 1811*cdf0e10cSrcweir sal_Int16 nItemNumber = (sal_Int16)(m_aListSource.getLength() - 1 + m_nEmptyListItems); 1812*cdf0e10cSrcweir pushBackSequenceElement(m_aSelectedSeq, nItemNumber); 1813*cdf0e10cSrcweir } 1814*cdf0e10cSrcweir 1815*cdf0e10cSrcweir //--------------------------------------------------------------------- 1816*cdf0e10cSrcweir void OListAndComboImport::implDefaultSelectCurrentItem() 1817*cdf0e10cSrcweir { 1818*cdf0e10cSrcweir OSL_ENSURE((m_aListSource.getLength() + m_nEmptyListItems) == (m_aValueList.getLength() + m_nEmptyValueItems), 1819*cdf0e10cSrcweir "OListAndComboImport::implDefaultSelectCurrentItem: inconsistence between labels and values!"); 1820*cdf0e10cSrcweir 1821*cdf0e10cSrcweir sal_Int16 nItemNumber = (sal_Int16)(m_aListSource.getLength() - 1 + m_nEmptyListItems); 1822*cdf0e10cSrcweir pushBackSequenceElement(m_aDefaultSelectedSeq, nItemNumber); 1823*cdf0e10cSrcweir } 1824*cdf0e10cSrcweir 1825*cdf0e10cSrcweir //===================================================================== 1826*cdf0e10cSrcweir //= OListOptionImport 1827*cdf0e10cSrcweir //===================================================================== 1828*cdf0e10cSrcweir //--------------------------------------------------------------------- 1829*cdf0e10cSrcweir OListOptionImport::OListOptionImport(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1830*cdf0e10cSrcweir const OListAndComboImportRef& _rListBox) 1831*cdf0e10cSrcweir :SvXMLImportContext(_rImport, _nPrefix, _rName) 1832*cdf0e10cSrcweir ,m_xListBoxImport(_rListBox) 1833*cdf0e10cSrcweir { 1834*cdf0e10cSrcweir } 1835*cdf0e10cSrcweir 1836*cdf0e10cSrcweir //--------------------------------------------------------------------- 1837*cdf0e10cSrcweir void OListOptionImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1838*cdf0e10cSrcweir { 1839*cdf0e10cSrcweir // the label and the value 1840*cdf0e10cSrcweir const SvXMLNamespaceMap& rMap = GetImport().GetNamespaceMap(); 1841*cdf0e10cSrcweir const ::rtl::OUString sLabelAttribute = rMap.GetQNameByKey( 1842*cdf0e10cSrcweir GetPrefix(), ::rtl::OUString::createFromAscii("label")); 1843*cdf0e10cSrcweir const ::rtl::OUString sValueAttribute = rMap.GetQNameByKey( 1844*cdf0e10cSrcweir GetPrefix(), ::rtl::OUString::createFromAscii("value")); 1845*cdf0e10cSrcweir 1846*cdf0e10cSrcweir // ------------------- 1847*cdf0e10cSrcweir // the label attribute 1848*cdf0e10cSrcweir ::rtl::OUString sValue = _rxAttrList->getValueByName(sLabelAttribute); 1849*cdf0e10cSrcweir sal_Bool bNonexistentAttribute = sal_False; 1850*cdf0e10cSrcweir if (!sValue.getLength()) 1851*cdf0e10cSrcweir if (0 == _rxAttrList->getTypeByName(sLabelAttribute).getLength()) 1852*cdf0e10cSrcweir // this attribute does not really exist 1853*cdf0e10cSrcweir bNonexistentAttribute = sal_True; 1854*cdf0e10cSrcweir 1855*cdf0e10cSrcweir if (bNonexistentAttribute) 1856*cdf0e10cSrcweir m_xListBoxImport->implEmptyLabelFound(); 1857*cdf0e10cSrcweir else 1858*cdf0e10cSrcweir m_xListBoxImport->implPushBackLabel( sValue ); 1859*cdf0e10cSrcweir 1860*cdf0e10cSrcweir // ------------------- 1861*cdf0e10cSrcweir // the value attribute 1862*cdf0e10cSrcweir sValue = _rxAttrList->getValueByName(sValueAttribute); 1863*cdf0e10cSrcweir bNonexistentAttribute = sal_False; 1864*cdf0e10cSrcweir if (!sValue.getLength()) 1865*cdf0e10cSrcweir if (0 == _rxAttrList->getTypeByName(sValueAttribute).getLength()) 1866*cdf0e10cSrcweir // this attribute does not really exist 1867*cdf0e10cSrcweir bNonexistentAttribute = sal_True; 1868*cdf0e10cSrcweir 1869*cdf0e10cSrcweir if (bNonexistentAttribute) 1870*cdf0e10cSrcweir m_xListBoxImport->implEmptyValueFound(); 1871*cdf0e10cSrcweir else 1872*cdf0e10cSrcweir m_xListBoxImport->implPushBackValue( sValue ); 1873*cdf0e10cSrcweir 1874*cdf0e10cSrcweir // the current-selected and selected 1875*cdf0e10cSrcweir const ::rtl::OUString sSelectedAttribute = rMap.GetQNameByKey( 1876*cdf0e10cSrcweir GetPrefix(), ::rtl::OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_SELECTED))); 1877*cdf0e10cSrcweir const ::rtl::OUString sDefaultSelectedAttribute = rMap.GetQNameByKey( 1878*cdf0e10cSrcweir GetPrefix(), ::rtl::OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCA_SELECTED))); 1879*cdf0e10cSrcweir 1880*cdf0e10cSrcweir // propagate the selected flag 1881*cdf0e10cSrcweir sal_Bool bSelected; 1882*cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertBool(bSelected, _rxAttrList->getValueByName(sSelectedAttribute)); 1883*cdf0e10cSrcweir if (bSelected) 1884*cdf0e10cSrcweir m_xListBoxImport->implSelectCurrentItem(); 1885*cdf0e10cSrcweir 1886*cdf0e10cSrcweir // same for the default selected 1887*cdf0e10cSrcweir sal_Bool bDefaultSelected; 1888*cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertBool(bDefaultSelected, _rxAttrList->getValueByName(sDefaultSelectedAttribute)); 1889*cdf0e10cSrcweir if (bDefaultSelected) 1890*cdf0e10cSrcweir m_xListBoxImport->implDefaultSelectCurrentItem(); 1891*cdf0e10cSrcweir 1892*cdf0e10cSrcweir SvXMLImportContext::StartElement(_rxAttrList); 1893*cdf0e10cSrcweir } 1894*cdf0e10cSrcweir 1895*cdf0e10cSrcweir //===================================================================== 1896*cdf0e10cSrcweir //= OComboItemImport 1897*cdf0e10cSrcweir //===================================================================== 1898*cdf0e10cSrcweir //--------------------------------------------------------------------- 1899*cdf0e10cSrcweir OComboItemImport::OComboItemImport(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1900*cdf0e10cSrcweir const OListAndComboImportRef& _rListBox) 1901*cdf0e10cSrcweir :SvXMLImportContext(_rImport, _nPrefix, _rName) 1902*cdf0e10cSrcweir ,m_xListBoxImport(_rListBox) 1903*cdf0e10cSrcweir { 1904*cdf0e10cSrcweir } 1905*cdf0e10cSrcweir 1906*cdf0e10cSrcweir //--------------------------------------------------------------------- 1907*cdf0e10cSrcweir void OComboItemImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1908*cdf0e10cSrcweir { 1909*cdf0e10cSrcweir const ::rtl::OUString sLabelAttributeName = GetImport().GetNamespaceMap().GetQNameByKey( 1910*cdf0e10cSrcweir GetPrefix(), ::rtl::OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL))); 1911*cdf0e10cSrcweir m_xListBoxImport->implPushBackLabel(_rxAttrList->getValueByName(sLabelAttributeName)); 1912*cdf0e10cSrcweir 1913*cdf0e10cSrcweir SvXMLImportContext::StartElement(_rxAttrList); 1914*cdf0e10cSrcweir } 1915*cdf0e10cSrcweir 1916*cdf0e10cSrcweir 1917*cdf0e10cSrcweir //===================================================================== 1918*cdf0e10cSrcweir //= OColumnWrapperImport 1919*cdf0e10cSrcweir //===================================================================== 1920*cdf0e10cSrcweir //--------------------------------------------------------------------- 1921*cdf0e10cSrcweir OColumnWrapperImport::OColumnWrapperImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1922*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer) 1923*cdf0e10cSrcweir :SvXMLImportContext(_rImport.getGlobalContext(), _nPrefix, _rName) 1924*cdf0e10cSrcweir ,m_xParentContainer(_rxParentContainer) 1925*cdf0e10cSrcweir ,m_rFormImport(_rImport) 1926*cdf0e10cSrcweir ,m_rEventManager(_rEventManager) 1927*cdf0e10cSrcweir { 1928*cdf0e10cSrcweir } 1929*cdf0e10cSrcweir //--------------------------------------------------------------------- 1930*cdf0e10cSrcweir SvXMLImportContext* OColumnWrapperImport::CreateChildContext(sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, 1931*cdf0e10cSrcweir const Reference< sax::XAttributeList >&) 1932*cdf0e10cSrcweir { 1933*cdf0e10cSrcweir OControlImport* pReturn = implCreateChildContext(_nPrefix, _rLocalName, OElementNameMap::getElementType(_rLocalName)); 1934*cdf0e10cSrcweir if (pReturn) 1935*cdf0e10cSrcweir { 1936*cdf0e10cSrcweir OSL_ENSURE(m_xOwnAttributes.is(), "OColumnWrapperImport::CreateChildContext: had no form:column element!"); 1937*cdf0e10cSrcweir pReturn->addOuterAttributes(m_xOwnAttributes); 1938*cdf0e10cSrcweir } 1939*cdf0e10cSrcweir return pReturn; 1940*cdf0e10cSrcweir } 1941*cdf0e10cSrcweir //--------------------------------------------------------------------- 1942*cdf0e10cSrcweir void OColumnWrapperImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 1943*cdf0e10cSrcweir { 1944*cdf0e10cSrcweir OSL_ENSURE(!m_xOwnAttributes.is(), "OColumnWrapperImport::StartElement: aready have the cloned list!"); 1945*cdf0e10cSrcweir 1946*cdf0e10cSrcweir // clone the attributes 1947*cdf0e10cSrcweir Reference< XCloneable > xCloneList(_rxAttrList, UNO_QUERY); 1948*cdf0e10cSrcweir OSL_ENSURE(xCloneList.is(), "OColumnWrapperImport::StartElement: AttributeList not cloneable!"); 1949*cdf0e10cSrcweir if ( xCloneList.is() ) 1950*cdf0e10cSrcweir m_xOwnAttributes = Reference< sax::XAttributeList >(xCloneList->createClone(), UNO_QUERY); 1951*cdf0e10cSrcweir OSL_ENSURE(m_xOwnAttributes.is(), "OColumnWrapperImport::StartElement: no cloned list!"); 1952*cdf0e10cSrcweir } 1953*cdf0e10cSrcweir 1954*cdf0e10cSrcweir //--------------------------------------------------------------------- 1955*cdf0e10cSrcweir OControlImport* OColumnWrapperImport::implCreateChildContext( 1956*cdf0e10cSrcweir sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, 1957*cdf0e10cSrcweir OControlElement::ElementType _eType) 1958*cdf0e10cSrcweir { 1959*cdf0e10cSrcweir OSL_ENSURE( (OControlElement::TEXT == _eType) 1960*cdf0e10cSrcweir || (OControlElement::TEXT_AREA == _eType) 1961*cdf0e10cSrcweir || (OControlElement::FORMATTED_TEXT == _eType) 1962*cdf0e10cSrcweir || (OControlElement::CHECKBOX == _eType) 1963*cdf0e10cSrcweir || (OControlElement::LISTBOX == _eType) 1964*cdf0e10cSrcweir || (OControlElement::COMBOBOX == _eType) 1965*cdf0e10cSrcweir || (OControlElement::TIME == _eType) 1966*cdf0e10cSrcweir || (OControlElement::DATE == _eType), 1967*cdf0e10cSrcweir "OColumnWrapperImport::implCreateChildContext: invalid or unrecognized sub element!"); 1968*cdf0e10cSrcweir 1969*cdf0e10cSrcweir switch (_eType) 1970*cdf0e10cSrcweir { 1971*cdf0e10cSrcweir case OControlElement::COMBOBOX: 1972*cdf0e10cSrcweir case OControlElement::LISTBOX: 1973*cdf0e10cSrcweir return new OColumnImport<OListAndComboImport>(m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType ); 1974*cdf0e10cSrcweir 1975*cdf0e10cSrcweir case OControlElement::PASSWORD: 1976*cdf0e10cSrcweir return new OColumnImport<OPasswordImport>(m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType ); 1977*cdf0e10cSrcweir 1978*cdf0e10cSrcweir case OControlElement::TEXT: 1979*cdf0e10cSrcweir case OControlElement::TEXT_AREA: 1980*cdf0e10cSrcweir case OControlElement::FORMATTED_TEXT: 1981*cdf0e10cSrcweir return new OColumnImport< OTextLikeImport >( m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType ); 1982*cdf0e10cSrcweir 1983*cdf0e10cSrcweir default: 1984*cdf0e10cSrcweir return new OColumnImport<OControlImport>(m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType ); 1985*cdf0e10cSrcweir } 1986*cdf0e10cSrcweir } 1987*cdf0e10cSrcweir 1988*cdf0e10cSrcweir //===================================================================== 1989*cdf0e10cSrcweir //= OGridImport 1990*cdf0e10cSrcweir //===================================================================== 1991*cdf0e10cSrcweir //--------------------------------------------------------------------- 1992*cdf0e10cSrcweir OGridImport::OGridImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 1993*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer, 1994*cdf0e10cSrcweir OControlElement::ElementType _eType) 1995*cdf0e10cSrcweir :OGridImport_Base(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, "column") 1996*cdf0e10cSrcweir { 1997*cdf0e10cSrcweir setElementType(_eType); 1998*cdf0e10cSrcweir } 1999*cdf0e10cSrcweir 2000*cdf0e10cSrcweir //--------------------------------------------------------------------- 2001*cdf0e10cSrcweir SvXMLImportContext* OGridImport::implCreateControlWrapper(sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName) 2002*cdf0e10cSrcweir { 2003*cdf0e10cSrcweir return new OColumnWrapperImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer); 2004*cdf0e10cSrcweir } 2005*cdf0e10cSrcweir 2006*cdf0e10cSrcweir //===================================================================== 2007*cdf0e10cSrcweir //= OFormImport 2008*cdf0e10cSrcweir //===================================================================== 2009*cdf0e10cSrcweir //--------------------------------------------------------------------- 2010*cdf0e10cSrcweir OFormImport::OFormImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, 2011*cdf0e10cSrcweir const Reference< XNameContainer >& _rxParentContainer) 2012*cdf0e10cSrcweir :OFormImport_Base(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, "control") 2013*cdf0e10cSrcweir { 2014*cdf0e10cSrcweir enableTrackAttributes(); 2015*cdf0e10cSrcweir } 2016*cdf0e10cSrcweir 2017*cdf0e10cSrcweir //--------------------------------------------------------------------- 2018*cdf0e10cSrcweir SvXMLImportContext* OFormImport::CreateChildContext(sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, 2019*cdf0e10cSrcweir const Reference< sax::XAttributeList >& _rxAttrList) 2020*cdf0e10cSrcweir { 2021*cdf0e10cSrcweir if( token::IsXMLToken(_rLocalName, token::XML_FORM) ) 2022*cdf0e10cSrcweir return new OFormImport( m_rFormImport, *this, _nPrefix, _rLocalName, 2023*cdf0e10cSrcweir m_xMeAsContainer); 2024*cdf0e10cSrcweir else if ( token::IsXMLToken(_rLocalName, token::XML_CONNECTION_RESOURCE) ) 2025*cdf0e10cSrcweir return new OXMLDataSourceImport(GetImport(), _nPrefix, _rLocalName, _rxAttrList,m_xElement); 2026*cdf0e10cSrcweir else if( (token::IsXMLToken(_rLocalName, token::XML_EVENT_LISTENERS) && 2027*cdf0e10cSrcweir (XML_NAMESPACE_OFFICE == _nPrefix)) || 2028*cdf0e10cSrcweir token::IsXMLToken( _rLocalName, token::XML_PROPERTIES) ) 2029*cdf0e10cSrcweir return OElementImport::CreateChildContext( _nPrefix, _rLocalName, 2030*cdf0e10cSrcweir _rxAttrList ); 2031*cdf0e10cSrcweir else 2032*cdf0e10cSrcweir return implCreateChildContext( _nPrefix, _rLocalName, 2033*cdf0e10cSrcweir OElementNameMap::getElementType(_rLocalName) ); 2034*cdf0e10cSrcweir } 2035*cdf0e10cSrcweir 2036*cdf0e10cSrcweir //--------------------------------------------------------------------- 2037*cdf0e10cSrcweir void OFormImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList) 2038*cdf0e10cSrcweir { 2039*cdf0e10cSrcweir m_rFormImport.enterEventContext(); 2040*cdf0e10cSrcweir OFormImport_Base::StartElement(_rxAttrList); 2041*cdf0e10cSrcweir 2042*cdf0e10cSrcweir // handle the target-frame attribute 2043*cdf0e10cSrcweir simulateDefaultedAttribute(OAttributeMetaData::getCommonControlAttributeName(CCA_TARGET_FRAME), PROPERTY_TARGETFRAME, "_blank"); 2044*cdf0e10cSrcweir } 2045*cdf0e10cSrcweir 2046*cdf0e10cSrcweir //--------------------------------------------------------------------- 2047*cdf0e10cSrcweir void OFormImport::EndElement() 2048*cdf0e10cSrcweir { 2049*cdf0e10cSrcweir OFormImport_Base::EndElement(); 2050*cdf0e10cSrcweir m_rFormImport.leaveEventContext(); 2051*cdf0e10cSrcweir } 2052*cdf0e10cSrcweir 2053*cdf0e10cSrcweir //--------------------------------------------------------------------- 2054*cdf0e10cSrcweir SvXMLImportContext* OFormImport::implCreateControlWrapper(sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName) 2055*cdf0e10cSrcweir { 2056*cdf0e10cSrcweir OSL_ENSURE( !this, "illegal call to OFormImport::implCreateControlWrapper" ); 2057*cdf0e10cSrcweir return new SvXMLImportContext(GetImport(), _nPrefix, _rLocalName ); 2058*cdf0e10cSrcweir } 2059*cdf0e10cSrcweir 2060*cdf0e10cSrcweir //--------------------------------------------------------------------- 2061*cdf0e10cSrcweir bool OFormImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue) 2062*cdf0e10cSrcweir { 2063*cdf0e10cSrcweir // handle the master/details field attributes (they're way too special to let the OPropertyImport handle them) 2064*cdf0e10cSrcweir static const ::rtl::OUString s_sMasterFieldsAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getFormAttributeName(faMasterFields)); 2065*cdf0e10cSrcweir static const ::rtl::OUString s_sDetailFieldsAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getFormAttributeName(faDetailFiels)); 2066*cdf0e10cSrcweir 2067*cdf0e10cSrcweir if ( s_sMasterFieldsAttributeName == _rLocalName ) 2068*cdf0e10cSrcweir { 2069*cdf0e10cSrcweir implTranslateStringListProperty(PROPERTY_MASTERFIELDS, _rValue); 2070*cdf0e10cSrcweir return true; 2071*cdf0e10cSrcweir } 2072*cdf0e10cSrcweir 2073*cdf0e10cSrcweir if ( s_sDetailFieldsAttributeName == _rLocalName ) 2074*cdf0e10cSrcweir { 2075*cdf0e10cSrcweir implTranslateStringListProperty(PROPERTY_DETAILFIELDS, _rValue); 2076*cdf0e10cSrcweir return true; 2077*cdf0e10cSrcweir } 2078*cdf0e10cSrcweir 2079*cdf0e10cSrcweir return OFormImport_Base::handleAttribute(_nNamespaceKey, _rLocalName, _rValue); 2080*cdf0e10cSrcweir } 2081*cdf0e10cSrcweir 2082*cdf0e10cSrcweir //--------------------------------------------------------------------- 2083*cdf0e10cSrcweir void OFormImport::implTranslateStringListProperty(const ::rtl::OUString& _rPropertyName, const ::rtl::OUString& _rValue) 2084*cdf0e10cSrcweir { 2085*cdf0e10cSrcweir PropertyValue aProp; 2086*cdf0e10cSrcweir aProp.Name = _rPropertyName; 2087*cdf0e10cSrcweir 2088*cdf0e10cSrcweir Sequence< ::rtl::OUString > aList; 2089*cdf0e10cSrcweir 2090*cdf0e10cSrcweir // split up the value string 2091*cdf0e10cSrcweir if (_rValue.getLength()) 2092*cdf0e10cSrcweir { 2093*cdf0e10cSrcweir // For the moment, we build a vector instead of a Sequence. It's easier to handle because of it's 2094*cdf0e10cSrcweir // push_back method 2095*cdf0e10cSrcweir ::std::vector< ::rtl::OUString > aElements; 2096*cdf0e10cSrcweir // estimate the number of tokens 2097*cdf0e10cSrcweir sal_Int32 nEstimate = 0, nLength = _rValue.getLength(); 2098*cdf0e10cSrcweir const sal_Unicode* pChars = _rValue.getStr(); 2099*cdf0e10cSrcweir for (sal_Int32 i=0; i<nLength; ++i, ++pChars) 2100*cdf0e10cSrcweir if (*pChars == ',') 2101*cdf0e10cSrcweir ++nEstimate; 2102*cdf0e10cSrcweir aElements.reserve(nEstimate + 1); 2103*cdf0e10cSrcweir // that's the worst case. If the string contains the separator character _quoted_, we reserved to much ... 2104*cdf0e10cSrcweir 2105*cdf0e10cSrcweir 2106*cdf0e10cSrcweir sal_Int32 nElementStart = 0; 2107*cdf0e10cSrcweir sal_Int32 nNextSep = 0; 2108*cdf0e10cSrcweir sal_Int32 nElementLength; 2109*cdf0e10cSrcweir ::rtl::OUString sElement; 2110*cdf0e10cSrcweir do 2111*cdf0e10cSrcweir { 2112*cdf0e10cSrcweir // extract the current element 2113*cdf0e10cSrcweir nNextSep = SvXMLUnitConverter::indexOfComma( 2114*cdf0e10cSrcweir _rValue, nElementStart); 2115*cdf0e10cSrcweir if (-1 == nNextSep) 2116*cdf0e10cSrcweir nNextSep = nLength; 2117*cdf0e10cSrcweir sElement = _rValue.copy(nElementStart, nNextSep - nElementStart); 2118*cdf0e10cSrcweir 2119*cdf0e10cSrcweir nElementLength = sElement.getLength(); 2120*cdf0e10cSrcweir // when writing the sequence, we quoted the single elements with " characters 2121*cdf0e10cSrcweir OSL_ENSURE( (nElementLength >= 2) 2122*cdf0e10cSrcweir && (sElement.getStr()[0] == '"') 2123*cdf0e10cSrcweir && (sElement.getStr()[nElementLength - 1] == '"'), 2124*cdf0e10cSrcweir "OFormImport::implTranslateStringListProperty: invalid quoted element name."); 2125*cdf0e10cSrcweir sElement = sElement.copy(1, nElementLength - 2); 2126*cdf0e10cSrcweir 2127*cdf0e10cSrcweir aElements.push_back(sElement); 2128*cdf0e10cSrcweir 2129*cdf0e10cSrcweir // swith to the next element 2130*cdf0e10cSrcweir nElementStart = 1 + nNextSep; 2131*cdf0e10cSrcweir } 2132*cdf0e10cSrcweir while (nElementStart < nLength); 2133*cdf0e10cSrcweir 2134*cdf0e10cSrcweir ::rtl::OUString *pElements = aElements.empty() ? 0 : &aElements[0]; 2135*cdf0e10cSrcweir aList = Sequence< ::rtl::OUString >(pElements, aElements.size()); 2136*cdf0e10cSrcweir } 2137*cdf0e10cSrcweir else 2138*cdf0e10cSrcweir { 2139*cdf0e10cSrcweir OSL_ENSURE(sal_False, "OFormImport::implTranslateStringListProperty: invalid value (empty)!"); 2140*cdf0e10cSrcweir } 2141*cdf0e10cSrcweir 2142*cdf0e10cSrcweir aProp.Value <<= aList; 2143*cdf0e10cSrcweir 2144*cdf0e10cSrcweir // add the property to the base class' array 2145*cdf0e10cSrcweir implPushBackPropertyValue(aProp); 2146*cdf0e10cSrcweir } 2147*cdf0e10cSrcweir //===================================================================== 2148*cdf0e10cSrcweir //= OXMLDataSourceImport 2149*cdf0e10cSrcweir //===================================================================== 2150*cdf0e10cSrcweir OXMLDataSourceImport::OXMLDataSourceImport( 2151*cdf0e10cSrcweir SvXMLImport& _rImport 2152*cdf0e10cSrcweir ,sal_uInt16 nPrfx 2153*cdf0e10cSrcweir , const ::rtl::OUString& _sLocalName 2154*cdf0e10cSrcweir ,const Reference< ::com::sun::star::xml::sax::XAttributeList > & _xAttrList 2155*cdf0e10cSrcweir ,const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _xElement) : 2156*cdf0e10cSrcweir SvXMLImportContext( _rImport, nPrfx, _sLocalName ) 2157*cdf0e10cSrcweir { 2158*cdf0e10cSrcweir OSL_ENSURE(_xAttrList.is(),"Attribute list is NULL!"); 2159*cdf0e10cSrcweir const SvXMLNamespaceMap& rMap = _rImport.GetNamespaceMap(); 2160*cdf0e10cSrcweir 2161*cdf0e10cSrcweir sal_Int16 nLength = (_xElement.is() && _xAttrList.is()) ? _xAttrList->getLength() : 0; 2162*cdf0e10cSrcweir for(sal_Int16 i = 0; i < nLength; ++i) 2163*cdf0e10cSrcweir { 2164*cdf0e10cSrcweir ::rtl::OUString sLocalName; 2165*cdf0e10cSrcweir ::rtl::OUString sAttrName = _xAttrList->getNameByIndex( i ); 2166*cdf0e10cSrcweir sal_uInt16 nPrefix = rMap.GetKeyByAttrName( sAttrName, &sLocalName ); 2167*cdf0e10cSrcweir 2168*cdf0e10cSrcweir if ( ( nPrefix == OAttributeMetaData::getCommonControlAttributeNamespace( CCA_TARGET_LOCATION ) ) 2169*cdf0e10cSrcweir && ( sLocalName.equalsAscii( OAttributeMetaData::getCommonControlAttributeName( CCA_TARGET_LOCATION ) ) ) 2170*cdf0e10cSrcweir ) 2171*cdf0e10cSrcweir { 2172*cdf0e10cSrcweir ::rtl::OUString sValue = _xAttrList->getValueByIndex( i ); 2173*cdf0e10cSrcweir 2174*cdf0e10cSrcweir INetURLObject aURL(sValue); 2175*cdf0e10cSrcweir if ( aURL.GetProtocol() == INET_PROT_FILE ) 2176*cdf0e10cSrcweir _xElement->setPropertyValue(PROPERTY_DATASOURCENAME,makeAny(sValue)); 2177*cdf0e10cSrcweir else 2178*cdf0e10cSrcweir _xElement->setPropertyValue(PROPERTY_URL,makeAny(sValue)); // the url is the "sdbc:" string 2179*cdf0e10cSrcweir break; 2180*cdf0e10cSrcweir } 2181*cdf0e10cSrcweir } 2182*cdf0e10cSrcweir } 2183*cdf0e10cSrcweir //--------------------------------------------------------------------- 2184*cdf0e10cSrcweir OControlImport* OFormImport::implCreateChildContext( 2185*cdf0e10cSrcweir sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, 2186*cdf0e10cSrcweir OControlElement::ElementType _eType ) 2187*cdf0e10cSrcweir { 2188*cdf0e10cSrcweir switch (_eType) 2189*cdf0e10cSrcweir { 2190*cdf0e10cSrcweir case OControlElement::TEXT: 2191*cdf0e10cSrcweir case OControlElement::TEXT_AREA: 2192*cdf0e10cSrcweir case OControlElement::FORMATTED_TEXT: 2193*cdf0e10cSrcweir return new OTextLikeImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2194*cdf0e10cSrcweir 2195*cdf0e10cSrcweir case OControlElement::BUTTON: 2196*cdf0e10cSrcweir case OControlElement::IMAGE: 2197*cdf0e10cSrcweir case OControlElement::IMAGE_FRAME: 2198*cdf0e10cSrcweir return new OButtonImport( m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType ); 2199*cdf0e10cSrcweir 2200*cdf0e10cSrcweir case OControlElement::COMBOBOX: 2201*cdf0e10cSrcweir case OControlElement::LISTBOX: 2202*cdf0e10cSrcweir return new OListAndComboImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2203*cdf0e10cSrcweir 2204*cdf0e10cSrcweir case OControlElement::RADIO: 2205*cdf0e10cSrcweir return new ORadioImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2206*cdf0e10cSrcweir 2207*cdf0e10cSrcweir case OControlElement::CHECKBOX: 2208*cdf0e10cSrcweir return new OImagePositionImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2209*cdf0e10cSrcweir 2210*cdf0e10cSrcweir case OControlElement::PASSWORD: 2211*cdf0e10cSrcweir return new OPasswordImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2212*cdf0e10cSrcweir 2213*cdf0e10cSrcweir case OControlElement::FRAME: 2214*cdf0e10cSrcweir case OControlElement::FIXED_TEXT: 2215*cdf0e10cSrcweir return new OReferredControlImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2216*cdf0e10cSrcweir 2217*cdf0e10cSrcweir case OControlElement::GRID: 2218*cdf0e10cSrcweir return new OGridImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2219*cdf0e10cSrcweir 2220*cdf0e10cSrcweir case OControlElement::VALUERANGE: 2221*cdf0e10cSrcweir return new OValueRangeImport( m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType ); 2222*cdf0e10cSrcweir 2223*cdf0e10cSrcweir default: 2224*cdf0e10cSrcweir return new OControlImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType); 2225*cdf0e10cSrcweir } 2226*cdf0e10cSrcweir } 2227*cdf0e10cSrcweir 2228*cdf0e10cSrcweir //......................................................................... 2229*cdf0e10cSrcweir } // namespace xmloff 2230*cdf0e10cSrcweir //......................................................................... 2231*cdf0e10cSrcweir 2232