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_extensions.hxx" 30*cdf0e10cSrcweir #include "eformshelper.hxx" 31*cdf0e10cSrcweir #include "formstrings.hxx" 32*cdf0e10cSrcweir #ifndef _EXTENSIONS_FORMCTRLR_PROPRESID_HRC_ 33*cdf0e10cSrcweir #include "formresid.hrc" 34*cdf0e10cSrcweir #endif 35*cdf0e10cSrcweir #ifndef _EXTENSIONS_PROPCTRLR_MODULEPRC_HXX_ 36*cdf0e10cSrcweir #include "modulepcr.hxx" 37*cdf0e10cSrcweir #endif 38*cdf0e10cSrcweir #include "propeventtranslation.hxx" 39*cdf0e10cSrcweir #include "formbrowsertools.hxx" 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir /** === begin UNO includes === **/ 42*cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/form/FormComponentType.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/xforms/XFormsUIHelper1.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/xsd/DataTypeClass.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/form/binding/XListEntrySink.hpp> 47*cdf0e10cSrcweir /** === end UNO includes === **/ 48*cdf0e10cSrcweir #include <tools/diagnose_ex.h> 49*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir #include <functional> 52*cdf0e10cSrcweir #include <algorithm> 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir //........................................................................ 55*cdf0e10cSrcweir namespace pcr 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir //........................................................................ 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir using namespace ::com::sun::star; 60*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 61*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 62*cdf0e10cSrcweir using namespace ::com::sun::star::container; 63*cdf0e10cSrcweir using namespace ::com::sun::star::form::binding; 64*cdf0e10cSrcweir using namespace ::com::sun::star::xsd; 65*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 66*cdf0e10cSrcweir using namespace ::com::sun::star::form; 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir //==================================================================== 69*cdf0e10cSrcweir //= file-local helpers 70*cdf0e10cSrcweir //==================================================================== 71*cdf0e10cSrcweir namespace 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir //-------------------------------------------------------------------- 74*cdf0e10cSrcweir ::rtl::OUString composeModelElementUIName( const ::rtl::OUString& _rModelName, const ::rtl::OUString& _rElementName ) 75*cdf0e10cSrcweir { 76*cdf0e10cSrcweir ::rtl::OUStringBuffer aBuffer; 77*cdf0e10cSrcweir aBuffer.appendAscii( "[" ); 78*cdf0e10cSrcweir aBuffer.append( _rModelName ); 79*cdf0e10cSrcweir aBuffer.appendAscii( "] " ); 80*cdf0e10cSrcweir aBuffer.append( _rElementName ); 81*cdf0e10cSrcweir return aBuffer.makeStringAndClear(); 82*cdf0e10cSrcweir } 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir //==================================================================== 86*cdf0e10cSrcweir //= EFormsHelper 87*cdf0e10cSrcweir //==================================================================== 88*cdf0e10cSrcweir //-------------------------------------------------------------------- 89*cdf0e10cSrcweir EFormsHelper::EFormsHelper( ::osl::Mutex& _rMutex, const Reference< XPropertySet >& _rxControlModel, const Reference< frame::XModel >& _rxContextDocument ) 90*cdf0e10cSrcweir :m_xControlModel( _rxControlModel ) 91*cdf0e10cSrcweir ,m_aPropertyListeners( _rMutex ) 92*cdf0e10cSrcweir { 93*cdf0e10cSrcweir OSL_ENSURE( _rxControlModel.is(), "EFormsHelper::EFormsHelper: invalid control model!" ); 94*cdf0e10cSrcweir m_xBindableControl = m_xBindableControl.query( _rxControlModel ); 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir m_xDocument = m_xDocument.query( _rxContextDocument ); 97*cdf0e10cSrcweir OSL_ENSURE( m_xDocument.is(), "EFormsHelper::EFormsHelper: invalid document!" ); 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir //-------------------------------------------------------------------- 102*cdf0e10cSrcweir bool EFormsHelper::isEForm( const Reference< frame::XModel >& _rxContextDocument ) 103*cdf0e10cSrcweir { 104*cdf0e10cSrcweir try 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir Reference< xforms::XFormsSupplier > xDocument( _rxContextDocument, UNO_QUERY ); 107*cdf0e10cSrcweir if ( !xDocument.is() ) 108*cdf0e10cSrcweir return false; 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir return xDocument->getXForms().is(); 111*cdf0e10cSrcweir } 112*cdf0e10cSrcweir catch( const Exception& ) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::isEForm: caught an exception!" ); 115*cdf0e10cSrcweir } 116*cdf0e10cSrcweir return false; 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir //-------------------------------------------------------------------- 120*cdf0e10cSrcweir bool EFormsHelper::canBindToDataType( sal_Int32 _nDataType ) const SAL_THROW(()) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir if ( !m_xBindableControl.is() ) 123*cdf0e10cSrcweir // cannot bind at all 124*cdf0e10cSrcweir return false; 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir // some types cannot be bound, independent from the control type 127*cdf0e10cSrcweir if ( ( DataTypeClass::hexBinary == _nDataType ) 128*cdf0e10cSrcweir || ( DataTypeClass::base64Binary == _nDataType ) 129*cdf0e10cSrcweir || ( DataTypeClass::QName == _nDataType ) 130*cdf0e10cSrcweir || ( DataTypeClass::NOTATION == _nDataType ) 131*cdf0e10cSrcweir ) 132*cdf0e10cSrcweir return false; 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir bool bCan = false; 135*cdf0e10cSrcweir try 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir // classify the control model 138*cdf0e10cSrcweir sal_Int16 nControlType = FormComponentType::CONTROL; 139*cdf0e10cSrcweir OSL_VERIFY( m_xControlModel->getPropertyValue( PROPERTY_CLASSID ) >>= nControlType ); 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir // some lists 142*cdf0e10cSrcweir sal_Int16 nNumericCompatibleTypes[] = { DataTypeClass::DECIMAL, DataTypeClass::FLOAT, DataTypeClass::DOUBLE, 0 }; 143*cdf0e10cSrcweir sal_Int16 nDateCompatibleTypes[] = { DataTypeClass::DATE, 0 }; 144*cdf0e10cSrcweir sal_Int16 nTimeCompatibleTypes[] = { DataTypeClass::TIME, 0 }; 145*cdf0e10cSrcweir sal_Int16 nCheckboxCompatibleTypes[] = { DataTypeClass::BOOLEAN, DataTypeClass::STRING, DataTypeClass::anyURI, 0 }; 146*cdf0e10cSrcweir sal_Int16 nRadiobuttonCompatibleTypes[] = { DataTypeClass::STRING, DataTypeClass::anyURI, 0 }; 147*cdf0e10cSrcweir sal_Int16 nFormattedCompatibleTypes[] = { DataTypeClass::DECIMAL, DataTypeClass::FLOAT, DataTypeClass::DOUBLE, DataTypeClass::DATETIME, DataTypeClass::DATE, DataTypeClass::TIME, 0 }; 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir sal_Int16* pCompatibleTypes = NULL; 150*cdf0e10cSrcweir switch ( nControlType ) 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir case FormComponentType::SPINBUTTON: 153*cdf0e10cSrcweir case FormComponentType::NUMERICFIELD: 154*cdf0e10cSrcweir pCompatibleTypes = nNumericCompatibleTypes; 155*cdf0e10cSrcweir break; 156*cdf0e10cSrcweir case FormComponentType::DATEFIELD: 157*cdf0e10cSrcweir pCompatibleTypes = nDateCompatibleTypes; 158*cdf0e10cSrcweir break; 159*cdf0e10cSrcweir case FormComponentType::TIMEFIELD: 160*cdf0e10cSrcweir pCompatibleTypes = nTimeCompatibleTypes; 161*cdf0e10cSrcweir break; 162*cdf0e10cSrcweir case FormComponentType::CHECKBOX: 163*cdf0e10cSrcweir pCompatibleTypes = nCheckboxCompatibleTypes; 164*cdf0e10cSrcweir break; 165*cdf0e10cSrcweir case FormComponentType::RADIOBUTTON: 166*cdf0e10cSrcweir pCompatibleTypes = nRadiobuttonCompatibleTypes; 167*cdf0e10cSrcweir break; 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir case FormComponentType::TEXTFIELD: 170*cdf0e10cSrcweir { 171*cdf0e10cSrcweir // both the normal text field, and the formatted field, claim to be a TEXTFIELD 172*cdf0e10cSrcweir // need to distinguish by service name 173*cdf0e10cSrcweir Reference< XServiceInfo > xSI( m_xControlModel, UNO_QUERY ); 174*cdf0e10cSrcweir OSL_ENSURE( xSI.is(), "EFormsHelper::canBindToDataType: a control model which has no service info?" ); 175*cdf0e10cSrcweir if ( xSI.is() ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir if ( xSI->supportsService( SERVICE_COMPONENT_FORMATTEDFIELD ) ) 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir pCompatibleTypes = nFormattedCompatibleTypes; 180*cdf0e10cSrcweir break; 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir } 183*cdf0e10cSrcweir // NO break here! 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir case FormComponentType::LISTBOX: 186*cdf0e10cSrcweir case FormComponentType::COMBOBOX: 187*cdf0e10cSrcweir // edit fields and list/combo boxes can be bound to anything 188*cdf0e10cSrcweir bCan = true; 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir if ( !bCan && pCompatibleTypes ) 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir if ( _nDataType == -1 ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir // the control can be bound to at least one type, and exactly this is being asked for 196*cdf0e10cSrcweir bCan = true; 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir else 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir while ( *pCompatibleTypes && !bCan ) 201*cdf0e10cSrcweir bCan = ( *pCompatibleTypes++ == _nDataType ); 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir } 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir catch( const Exception& ) 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::canBindToDataType: caught an exception!" ); 208*cdf0e10cSrcweir } 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir return bCan; 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir //-------------------------------------------------------------------- 214*cdf0e10cSrcweir bool EFormsHelper::isListEntrySink() const SAL_THROW(()) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir bool bIs = false; 217*cdf0e10cSrcweir try 218*cdf0e10cSrcweir { 219*cdf0e10cSrcweir Reference< XListEntrySink > xAsSink( m_xControlModel, UNO_QUERY ); 220*cdf0e10cSrcweir bIs = xAsSink.is(); 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir catch( const Exception& ) 223*cdf0e10cSrcweir { 224*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::isListEntrySink: caught an exception!" ); 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir return bIs; 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir //-------------------------------------------------------------------- 230*cdf0e10cSrcweir void EFormsHelper::impl_switchBindingListening_throw( bool _bDoListening, const Reference< XPropertyChangeListener >& _rxListener ) 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir Reference< XPropertySet > xBindingProps; 233*cdf0e10cSrcweir if ( m_xBindableControl.is() ) 234*cdf0e10cSrcweir xBindingProps = xBindingProps.query( m_xBindableControl->getValueBinding() ); 235*cdf0e10cSrcweir if ( !xBindingProps.is() ) 236*cdf0e10cSrcweir return; 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir if ( _bDoListening ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir xBindingProps->addPropertyChangeListener( ::rtl::OUString(), _rxListener ); 241*cdf0e10cSrcweir } 242*cdf0e10cSrcweir else 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir xBindingProps->removePropertyChangeListener( ::rtl::OUString(), _rxListener ); 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir //-------------------------------------------------------------------- 249*cdf0e10cSrcweir void EFormsHelper::registerBindingListener( const Reference< XPropertyChangeListener >& _rxBindingListener ) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir if ( !_rxBindingListener.is() ) 252*cdf0e10cSrcweir return; 253*cdf0e10cSrcweir impl_toggleBindingPropertyListening_throw( true, _rxBindingListener ); 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir //-------------------------------------------------------------------- 257*cdf0e10cSrcweir void EFormsHelper::impl_toggleBindingPropertyListening_throw( bool _bDoListen, const Reference< XPropertyChangeListener >& _rxConcreteListenerOrNull ) 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir if ( !_bDoListen ) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir ::std::auto_ptr< ::cppu::OInterfaceIteratorHelper > pListenerIterator = m_aPropertyListeners.createIterator(); 262*cdf0e10cSrcweir while ( pListenerIterator->hasMoreElements() ) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir PropertyEventTranslation* pTranslator = dynamic_cast< PropertyEventTranslation* >( pListenerIterator->next() ); 265*cdf0e10cSrcweir OSL_ENSURE( pTranslator, "EFormsHelper::impl_toggleBindingPropertyListening_throw: invalid listener element in my container!" ); 266*cdf0e10cSrcweir if ( !pTranslator ) 267*cdf0e10cSrcweir continue; 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir Reference< XPropertyChangeListener > xEventSourceTranslator( pTranslator ); 270*cdf0e10cSrcweir if ( _rxConcreteListenerOrNull.is() ) 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir if ( pTranslator->getDelegator() == _rxConcreteListenerOrNull ) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir impl_switchBindingListening_throw( false, xEventSourceTranslator ); 275*cdf0e10cSrcweir m_aPropertyListeners.removeListener( xEventSourceTranslator ); 276*cdf0e10cSrcweir break; 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir else 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir impl_switchBindingListening_throw( false, xEventSourceTranslator ); 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir } 285*cdf0e10cSrcweir else 286*cdf0e10cSrcweir { 287*cdf0e10cSrcweir if ( _rxConcreteListenerOrNull.is() ) 288*cdf0e10cSrcweir { 289*cdf0e10cSrcweir Reference< XPropertyChangeListener > xEventSourceTranslator( new PropertyEventTranslation( _rxConcreteListenerOrNull, m_xBindableControl ) ); 290*cdf0e10cSrcweir m_aPropertyListeners.addListener( xEventSourceTranslator ); 291*cdf0e10cSrcweir impl_switchBindingListening_throw( true, xEventSourceTranslator ); 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir else 294*cdf0e10cSrcweir { 295*cdf0e10cSrcweir ::std::auto_ptr< ::cppu::OInterfaceIteratorHelper > pListenerIterator = m_aPropertyListeners.createIterator(); 296*cdf0e10cSrcweir while ( pListenerIterator->hasMoreElements() ) 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir Reference< XPropertyChangeListener > xListener( pListenerIterator->next(), UNO_QUERY ); 299*cdf0e10cSrcweir impl_switchBindingListening_throw( true, xListener ); 300*cdf0e10cSrcweir } 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir } 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir 305*cdf0e10cSrcweir //-------------------------------------------------------------------- 306*cdf0e10cSrcweir void EFormsHelper::revokeBindingListener( const Reference< XPropertyChangeListener >& _rxBindingListener ) 307*cdf0e10cSrcweir { 308*cdf0e10cSrcweir impl_toggleBindingPropertyListening_throw( false, _rxBindingListener ); 309*cdf0e10cSrcweir } 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir //-------------------------------------------------------------------- 312*cdf0e10cSrcweir void EFormsHelper::getFormModelNames( ::std::vector< ::rtl::OUString >& /* [out] */ _rModelNames ) const SAL_THROW(()) 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir if ( m_xDocument.is() ) 315*cdf0e10cSrcweir { 316*cdf0e10cSrcweir try 317*cdf0e10cSrcweir { 318*cdf0e10cSrcweir _rModelNames.resize( 0 ); 319*cdf0e10cSrcweir 320*cdf0e10cSrcweir Reference< XNameContainer > xForms( m_xDocument->getXForms() ); 321*cdf0e10cSrcweir OSL_ENSURE( xForms.is(), "EFormsHelper::getFormModelNames: invalid forms container!" ); 322*cdf0e10cSrcweir if ( xForms.is() ) 323*cdf0e10cSrcweir { 324*cdf0e10cSrcweir Sequence< ::rtl::OUString > aModelNames = xForms->getElementNames(); 325*cdf0e10cSrcweir _rModelNames.resize( aModelNames.getLength() ); 326*cdf0e10cSrcweir ::std::copy( aModelNames.getConstArray(), aModelNames.getConstArray() + aModelNames.getLength(), 327*cdf0e10cSrcweir _rModelNames.begin() 328*cdf0e10cSrcweir ); 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir catch( const Exception& ) 332*cdf0e10cSrcweir { 333*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getFormModelNames: caught an exception!" ); 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir //-------------------------------------------------------------------- 339*cdf0e10cSrcweir void EFormsHelper::getBindingNames( const ::rtl::OUString& _rModelName, ::std::vector< ::rtl::OUString >& /* [out] */ _rBindingNames ) const SAL_THROW(()) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir _rBindingNames.resize( 0 ); 342*cdf0e10cSrcweir try 343*cdf0e10cSrcweir { 344*cdf0e10cSrcweir Reference< xforms::XModel > xModel( getFormModelByName( _rModelName ) ); 345*cdf0e10cSrcweir if ( xModel.is() ) 346*cdf0e10cSrcweir { 347*cdf0e10cSrcweir Reference< XNameAccess > xBindings( xModel->getBindings(), UNO_QUERY ); 348*cdf0e10cSrcweir OSL_ENSURE( xBindings.is(), "EFormsHelper::getBindingNames: invalid bindings container obtained from the model!" ); 349*cdf0e10cSrcweir if ( xBindings.is() ) 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames = xBindings->getElementNames(); 352*cdf0e10cSrcweir _rBindingNames.resize( aNames.getLength() ); 353*cdf0e10cSrcweir ::std::copy( aNames.getConstArray(), aNames.getConstArray() + aNames.getLength(), _rBindingNames.begin() ); 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir } 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir catch( const Exception& ) 358*cdf0e10cSrcweir { 359*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getBindingNames: caught an exception!" ); 360*cdf0e10cSrcweir } 361*cdf0e10cSrcweir } 362*cdf0e10cSrcweir 363*cdf0e10cSrcweir //-------------------------------------------------------------------- 364*cdf0e10cSrcweir Reference< xforms::XModel > EFormsHelper::getFormModelByName( const ::rtl::OUString& _rModelName ) const SAL_THROW(()) 365*cdf0e10cSrcweir { 366*cdf0e10cSrcweir Reference< xforms::XModel > xReturn; 367*cdf0e10cSrcweir try 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir Reference< XNameContainer > xForms( m_xDocument->getXForms() ); 370*cdf0e10cSrcweir OSL_ENSURE( xForms.is(), "EFormsHelper::getFormModelByName: invalid forms container!" ); 371*cdf0e10cSrcweir if ( xForms.is() ) 372*cdf0e10cSrcweir OSL_VERIFY( xForms->getByName( _rModelName ) >>= xReturn ); 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir catch( const Exception& ) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getFormModelByName: caught an exception!" ); 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir return xReturn; 379*cdf0e10cSrcweir } 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir //-------------------------------------------------------------------- 382*cdf0e10cSrcweir Reference< xforms::XModel > EFormsHelper::getCurrentFormModel() const SAL_THROW(()) 383*cdf0e10cSrcweir { 384*cdf0e10cSrcweir Reference< xforms::XModel > xModel; 385*cdf0e10cSrcweir try 386*cdf0e10cSrcweir { 387*cdf0e10cSrcweir Reference< XPropertySet > xBinding( getCurrentBinding() ); 388*cdf0e10cSrcweir if ( xBinding.is() ) 389*cdf0e10cSrcweir { 390*cdf0e10cSrcweir OSL_VERIFY( xBinding->getPropertyValue( PROPERTY_MODEL ) >>= xModel ); 391*cdf0e10cSrcweir } 392*cdf0e10cSrcweir } 393*cdf0e10cSrcweir catch( const Exception& ) 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getCurrentFormModel: caught an exception!" ); 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir return xModel; 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir //-------------------------------------------------------------------- 401*cdf0e10cSrcweir ::rtl::OUString EFormsHelper::getCurrentFormModelName() const SAL_THROW(()) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir ::rtl::OUString sModelName; 404*cdf0e10cSrcweir try 405*cdf0e10cSrcweir { 406*cdf0e10cSrcweir Reference< xforms::XModel > xFormsModel( getCurrentFormModel() ); 407*cdf0e10cSrcweir if ( xFormsModel.is() ) 408*cdf0e10cSrcweir sModelName = xFormsModel->getID(); 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir catch( const Exception& ) 411*cdf0e10cSrcweir { 412*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getCurrentFormModel: caught an exception!" ); 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir return sModelName; 415*cdf0e10cSrcweir } 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir //-------------------------------------------------------------------- 418*cdf0e10cSrcweir Reference< XPropertySet > EFormsHelper::getCurrentBinding() const SAL_THROW(()) 419*cdf0e10cSrcweir { 420*cdf0e10cSrcweir Reference< XPropertySet > xBinding; 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir try 423*cdf0e10cSrcweir { 424*cdf0e10cSrcweir if ( m_xBindableControl.is() ) 425*cdf0e10cSrcweir xBinding = xBinding.query( m_xBindableControl->getValueBinding() ); 426*cdf0e10cSrcweir } 427*cdf0e10cSrcweir catch( const Exception& ) 428*cdf0e10cSrcweir { 429*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getCurrentBinding: caught an exception!" ); 430*cdf0e10cSrcweir } 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir return xBinding; 433*cdf0e10cSrcweir } 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir //-------------------------------------------------------------------- 436*cdf0e10cSrcweir ::rtl::OUString EFormsHelper::getCurrentBindingName() const SAL_THROW(()) 437*cdf0e10cSrcweir { 438*cdf0e10cSrcweir ::rtl::OUString sBindingName; 439*cdf0e10cSrcweir try 440*cdf0e10cSrcweir { 441*cdf0e10cSrcweir Reference< XPropertySet > xBinding( getCurrentBinding() ); 442*cdf0e10cSrcweir if ( xBinding.is() ) 443*cdf0e10cSrcweir xBinding->getPropertyValue( PROPERTY_BINDING_ID ) >>= sBindingName; 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir catch( const Exception& ) 446*cdf0e10cSrcweir { 447*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getCurrentBindingName: caught an exception!" ); 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir return sBindingName; 450*cdf0e10cSrcweir } 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir //-------------------------------------------------------------------- 453*cdf0e10cSrcweir Reference< XListEntrySource > EFormsHelper::getCurrentListSourceBinding() const SAL_THROW(()) 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir Reference< XListEntrySource > xReturn; 456*cdf0e10cSrcweir try 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir Reference< XListEntrySink > xAsSink( m_xControlModel, UNO_QUERY ); 459*cdf0e10cSrcweir OSL_ENSURE( xAsSink.is(), "EFormsHelper::getCurrentListSourceBinding: you should have used isListEntrySink before!" ); 460*cdf0e10cSrcweir if ( xAsSink.is() ) 461*cdf0e10cSrcweir xReturn = xAsSink->getListEntrySource(); 462*cdf0e10cSrcweir } 463*cdf0e10cSrcweir catch( const Exception& ) 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getCurrentListSourceBinding: caught an exception!" ); 466*cdf0e10cSrcweir } 467*cdf0e10cSrcweir return xReturn; 468*cdf0e10cSrcweir } 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir //-------------------------------------------------------------------- 471*cdf0e10cSrcweir void EFormsHelper::setListSourceBinding( const Reference< XListEntrySource >& _rxListSource ) SAL_THROW(()) 472*cdf0e10cSrcweir { 473*cdf0e10cSrcweir try 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir Reference< XListEntrySink > xAsSink( m_xControlModel, UNO_QUERY ); 476*cdf0e10cSrcweir OSL_ENSURE( xAsSink.is(), "EFormsHelper::setListSourceBinding: you should have used isListEntrySink before!" ); 477*cdf0e10cSrcweir if ( xAsSink.is() ) 478*cdf0e10cSrcweir xAsSink->setListEntrySource( _rxListSource ); 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir catch( const Exception& ) 481*cdf0e10cSrcweir { 482*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::setListSourceBinding: caught an exception!" ); 483*cdf0e10cSrcweir } 484*cdf0e10cSrcweir } 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir //-------------------------------------------------------------------- 487*cdf0e10cSrcweir void EFormsHelper::setBinding( const Reference< ::com::sun::star::beans::XPropertySet >& _rxBinding ) SAL_THROW(()) 488*cdf0e10cSrcweir { 489*cdf0e10cSrcweir if ( !m_xBindableControl.is() ) 490*cdf0e10cSrcweir return; 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir try 493*cdf0e10cSrcweir { 494*cdf0e10cSrcweir Reference< XPropertySet > xOldBinding( m_xBindableControl->getValueBinding(), UNO_QUERY ); 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir Reference< XValueBinding > xBinding( _rxBinding, UNO_QUERY ); 497*cdf0e10cSrcweir OSL_ENSURE( xBinding.is() || !_rxBinding.is(), "EFormsHelper::setBinding: invalid binding!" ); 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir impl_toggleBindingPropertyListening_throw( false, NULL ); 500*cdf0e10cSrcweir m_xBindableControl->setValueBinding( xBinding ); 501*cdf0e10cSrcweir impl_toggleBindingPropertyListening_throw( true, NULL ); 502*cdf0e10cSrcweir 503*cdf0e10cSrcweir ::std::set< ::rtl::OUString > aSet; 504*cdf0e10cSrcweir firePropertyChanges( xOldBinding, _rxBinding, aSet ); 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir catch( const Exception& ) 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::setBinding: caught an exception!" ); 509*cdf0e10cSrcweir } 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir //-------------------------------------------------------------------- 513*cdf0e10cSrcweir Reference< XPropertySet > EFormsHelper::getOrCreateBindingForModel( const ::rtl::OUString& _rTargetModel, const ::rtl::OUString& _rBindingName ) const SAL_THROW(()) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir OSL_ENSURE( _rBindingName.getLength(), "EFormsHelper::getOrCreateBindingForModel: invalid binding name!" ); 516*cdf0e10cSrcweir return implGetOrCreateBinding( _rTargetModel, _rBindingName ); 517*cdf0e10cSrcweir } 518*cdf0e10cSrcweir 519*cdf0e10cSrcweir //-------------------------------------------------------------------- 520*cdf0e10cSrcweir Reference< XPropertySet > EFormsHelper::implGetOrCreateBinding( const ::rtl::OUString& _rTargetModel, const ::rtl::OUString& _rBindingName ) const SAL_THROW(()) 521*cdf0e10cSrcweir { 522*cdf0e10cSrcweir OSL_ENSURE( !( !_rTargetModel.getLength() && _rBindingName .getLength() ), "EFormsHelper::implGetOrCreateBinding: no model, but a binding name?" ); 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir Reference< XPropertySet > xBinding; 525*cdf0e10cSrcweir try 526*cdf0e10cSrcweir { 527*cdf0e10cSrcweir ::rtl::OUString sTargetModel( _rTargetModel ); 528*cdf0e10cSrcweir // determine the model which the binding should belong to 529*cdf0e10cSrcweir if ( !sTargetModel.getLength() ) 530*cdf0e10cSrcweir { 531*cdf0e10cSrcweir ::std::vector< ::rtl::OUString > aModelNames; 532*cdf0e10cSrcweir getFormModelNames( aModelNames ); 533*cdf0e10cSrcweir if ( !aModelNames.empty() ) 534*cdf0e10cSrcweir sTargetModel = *aModelNames.begin(); 535*cdf0e10cSrcweir OSL_ENSURE( sTargetModel.getLength(), "EFormsHelper::implGetOrCreateBinding: unable to obtain a default model!" ); 536*cdf0e10cSrcweir } 537*cdf0e10cSrcweir Reference< xforms::XModel > xModel( getFormModelByName( sTargetModel ) ); 538*cdf0e10cSrcweir Reference< XNameAccess > xBindingNames( xModel.is() ? xModel->getBindings() : Reference< XSet >(), UNO_QUERY ); 539*cdf0e10cSrcweir if ( xBindingNames.is() ) 540*cdf0e10cSrcweir { 541*cdf0e10cSrcweir // get or create the binding instance 542*cdf0e10cSrcweir if ( _rBindingName.getLength() ) 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir if ( xBindingNames->hasByName( _rBindingName ) ) 545*cdf0e10cSrcweir OSL_VERIFY( xBindingNames->getByName( _rBindingName ) >>= xBinding ); 546*cdf0e10cSrcweir else 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir xBinding = xModel->createBinding( ); 549*cdf0e10cSrcweir if ( xBinding.is() ) 550*cdf0e10cSrcweir { 551*cdf0e10cSrcweir xBinding->setPropertyValue( PROPERTY_BINDING_ID, makeAny( _rBindingName ) ); 552*cdf0e10cSrcweir xModel->getBindings()->insert( makeAny( xBinding ) ); 553*cdf0e10cSrcweir } 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir else 557*cdf0e10cSrcweir { 558*cdf0e10cSrcweir xBinding = xModel->createBinding( ); 559*cdf0e10cSrcweir if ( xBinding.is() ) 560*cdf0e10cSrcweir { 561*cdf0e10cSrcweir // find a nice name for it 562*cdf0e10cSrcweir String sBaseName( PcrRes( RID_STR_BINDING_UI_NAME ) ); 563*cdf0e10cSrcweir sBaseName += String::CreateFromAscii( " " ); 564*cdf0e10cSrcweir String sNewName; 565*cdf0e10cSrcweir sal_Int32 nNumber = 1; 566*cdf0e10cSrcweir do 567*cdf0e10cSrcweir { 568*cdf0e10cSrcweir sNewName = sBaseName + ::rtl::OUString::valueOf( nNumber++ ); 569*cdf0e10cSrcweir } 570*cdf0e10cSrcweir while ( xBindingNames->hasByName( sNewName ) ); 571*cdf0e10cSrcweir Reference< XNamed > xName( xBinding, UNO_QUERY_THROW ); 572*cdf0e10cSrcweir xName->setName( sNewName ); 573*cdf0e10cSrcweir // and insert into the model 574*cdf0e10cSrcweir xModel->getBindings()->insert( makeAny( xBinding ) ); 575*cdf0e10cSrcweir } 576*cdf0e10cSrcweir } 577*cdf0e10cSrcweir } 578*cdf0e10cSrcweir } 579*cdf0e10cSrcweir catch( const Exception& ) 580*cdf0e10cSrcweir { 581*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 582*cdf0e10cSrcweir } 583*cdf0e10cSrcweir 584*cdf0e10cSrcweir return xBinding; 585*cdf0e10cSrcweir } 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir //-------------------------------------------------------------------- 588*cdf0e10cSrcweir namespace 589*cdf0e10cSrcweir { 590*cdf0e10cSrcweir //................................................................ 591*cdf0e10cSrcweir struct PropertyBagInserter : public ::std::unary_function< Property, void > 592*cdf0e10cSrcweir { 593*cdf0e10cSrcweir private: 594*cdf0e10cSrcweir PropertyBag& m_rProperties; 595*cdf0e10cSrcweir 596*cdf0e10cSrcweir public: 597*cdf0e10cSrcweir PropertyBagInserter( PropertyBag& rProperties ) : m_rProperties( rProperties ) { } 598*cdf0e10cSrcweir 599*cdf0e10cSrcweir void operator()( const Property& _rProp ) 600*cdf0e10cSrcweir { 601*cdf0e10cSrcweir m_rProperties.insert( _rProp ); 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir }; 604*cdf0e10cSrcweir 605*cdf0e10cSrcweir //................................................................ 606*cdf0e10cSrcweir Reference< XPropertySetInfo > collectPropertiesGetInfo( const Reference< XPropertySet >& _rxProps, PropertyBag& _rBag ) 607*cdf0e10cSrcweir { 608*cdf0e10cSrcweir Reference< XPropertySetInfo > xInfo; 609*cdf0e10cSrcweir if ( _rxProps.is() ) 610*cdf0e10cSrcweir xInfo = _rxProps->getPropertySetInfo(); 611*cdf0e10cSrcweir if ( xInfo.is() ) 612*cdf0e10cSrcweir { 613*cdf0e10cSrcweir Sequence< Property > aProperties = xInfo->getProperties(); 614*cdf0e10cSrcweir ::std::for_each( aProperties.getConstArray(), aProperties.getConstArray() + aProperties.getLength(), 615*cdf0e10cSrcweir PropertyBagInserter( _rBag ) 616*cdf0e10cSrcweir ); 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir return xInfo; 619*cdf0e10cSrcweir } 620*cdf0e10cSrcweir } 621*cdf0e10cSrcweir 622*cdf0e10cSrcweir //-------------------------------------------------------------------- 623*cdf0e10cSrcweir ::rtl::OUString EFormsHelper::getModelElementUIName( const EFormsHelper::ModelElementType _eType, const Reference< XPropertySet >& _rxElement ) const SAL_THROW(()) 624*cdf0e10cSrcweir { 625*cdf0e10cSrcweir ::rtl::OUString sUIName; 626*cdf0e10cSrcweir try 627*cdf0e10cSrcweir { 628*cdf0e10cSrcweir // determine the model which the element belongs to 629*cdf0e10cSrcweir Reference< xforms::XFormsUIHelper1 > xHelper; 630*cdf0e10cSrcweir if ( _rxElement.is() ) 631*cdf0e10cSrcweir _rxElement->getPropertyValue( PROPERTY_MODEL ) >>= xHelper; 632*cdf0e10cSrcweir OSL_ENSURE( xHelper.is(), "EFormsHelper::getModelElementUIName: invalid element or model!" ); 633*cdf0e10cSrcweir if ( xHelper.is() ) 634*cdf0e10cSrcweir { 635*cdf0e10cSrcweir ::rtl::OUString sElementName = ( _eType == Submission ) ? xHelper->getSubmissionName( _rxElement, sal_True ) : xHelper->getBindingName( _rxElement, sal_True ); 636*cdf0e10cSrcweir Reference< xforms::XModel > xModel( xHelper, UNO_QUERY_THROW ); 637*cdf0e10cSrcweir sUIName = composeModelElementUIName( xModel->getID(), sElementName ); 638*cdf0e10cSrcweir } 639*cdf0e10cSrcweir } 640*cdf0e10cSrcweir catch( const Exception& ) 641*cdf0e10cSrcweir { 642*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getModelElementUIName: caught an exception!" ); 643*cdf0e10cSrcweir } 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir return sUIName; 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir 648*cdf0e10cSrcweir //-------------------------------------------------------------------- 649*cdf0e10cSrcweir Reference< XPropertySet > EFormsHelper::getModelElementFromUIName( const EFormsHelper::ModelElementType _eType, const ::rtl::OUString& _rUIName ) const SAL_THROW(()) 650*cdf0e10cSrcweir { 651*cdf0e10cSrcweir const MapStringToPropertySet& rMapUINameToElement( ( _eType == Submission ) ? m_aSubmissionUINames : m_aBindingUINames ); 652*cdf0e10cSrcweir MapStringToPropertySet::const_iterator pos = rMapUINameToElement.find( _rUIName ); 653*cdf0e10cSrcweir OSL_ENSURE( pos != rMapUINameToElement.end(), "EFormsHelper::getModelElementFromUIName: didn't find it!" ); 654*cdf0e10cSrcweir 655*cdf0e10cSrcweir return ( pos != rMapUINameToElement.end() ) ? pos->second : Reference< XPropertySet >(); 656*cdf0e10cSrcweir } 657*cdf0e10cSrcweir 658*cdf0e10cSrcweir //-------------------------------------------------------------------- 659*cdf0e10cSrcweir void EFormsHelper::getAllElementUINames( const ModelElementType _eType, ::std::vector< ::rtl::OUString >& /* [out] */ _rElementNames, bool _bPrepentEmptyEntry ) 660*cdf0e10cSrcweir { 661*cdf0e10cSrcweir MapStringToPropertySet& rMapUINameToElement( ( _eType == Submission ) ? m_aSubmissionUINames : m_aBindingUINames ); 662*cdf0e10cSrcweir rMapUINameToElement.clear(); 663*cdf0e10cSrcweir _rElementNames.resize( 0 ); 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir if ( _bPrepentEmptyEntry ) 666*cdf0e10cSrcweir rMapUINameToElement[ ::rtl::OUString() ] = Reference< XPropertySet >(); 667*cdf0e10cSrcweir 668*cdf0e10cSrcweir try 669*cdf0e10cSrcweir { 670*cdf0e10cSrcweir // obtain the model names 671*cdf0e10cSrcweir ::std::vector< ::rtl::OUString > aModels; 672*cdf0e10cSrcweir getFormModelNames( aModels ); 673*cdf0e10cSrcweir _rElementNames.reserve( aModels.size() * 2 ); // heuristics 674*cdf0e10cSrcweir 675*cdf0e10cSrcweir // for every model, obtain the element 676*cdf0e10cSrcweir for ( ::std::vector< ::rtl::OUString >::const_iterator pModelName = aModels.begin(); 677*cdf0e10cSrcweir pModelName != aModels.end(); 678*cdf0e10cSrcweir ++pModelName 679*cdf0e10cSrcweir ) 680*cdf0e10cSrcweir { 681*cdf0e10cSrcweir Reference< xforms::XModel > xModel = getFormModelByName( *pModelName ); 682*cdf0e10cSrcweir OSL_ENSURE( xModel.is(), "EFormsHelper::getAllElementUINames: inconsistency in the models!" ); 683*cdf0e10cSrcweir Reference< xforms::XFormsUIHelper1 > xHelper( xModel, UNO_QUERY ); 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir Reference< XIndexAccess > xElements; 686*cdf0e10cSrcweir if ( xModel.is() ) 687*cdf0e10cSrcweir xElements = xElements.query( ( _eType == Submission ) ? xModel->getSubmissions() : xModel->getBindings() ); 688*cdf0e10cSrcweir if ( !xElements.is() ) 689*cdf0e10cSrcweir break; 690*cdf0e10cSrcweir 691*cdf0e10cSrcweir sal_Int32 nElementCount = xElements->getCount(); 692*cdf0e10cSrcweir for ( sal_Int32 i = 0; i < nElementCount; ++i ) 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir Reference< XPropertySet > xElement( xElements->getByIndex( i ), UNO_QUERY ); 695*cdf0e10cSrcweir OSL_ENSURE( xElement.is(), "EFormsHelper::getAllElementUINames: empty element!" ); 696*cdf0e10cSrcweir if ( !xElement.is() ) 697*cdf0e10cSrcweir continue; 698*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 699*cdf0e10cSrcweir { 700*cdf0e10cSrcweir Reference< xforms::XModel > xElementsModel; 701*cdf0e10cSrcweir xElement->getPropertyValue( PROPERTY_MODEL ) >>= xElementsModel; 702*cdf0e10cSrcweir OSL_ENSURE( xElementsModel == xModel, "EFormsHelper::getAllElementUINames: inconsistency in the model-element relationship!" ); 703*cdf0e10cSrcweir if ( !( xElementsModel == xModel ) ) 704*cdf0e10cSrcweir xElement->setPropertyValue( PROPERTY_MODEL, makeAny( xModel ) ); 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir #endif 707*cdf0e10cSrcweir ::rtl::OUString sElementName = ( _eType == Submission ) ? xHelper->getSubmissionName( xElement, sal_True ) : xHelper->getBindingName( xElement, sal_True ); 708*cdf0e10cSrcweir ::rtl::OUString sUIName = composeModelElementUIName( *pModelName, sElementName ); 709*cdf0e10cSrcweir 710*cdf0e10cSrcweir OSL_ENSURE( rMapUINameToElement.find( sUIName ) == rMapUINameToElement.end(), "EFormsHelper::getAllElementUINames: duplicate name!" ); 711*cdf0e10cSrcweir rMapUINameToElement.insert( MapStringToPropertySet::value_type( sUIName, xElement ) ); 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir } 714*cdf0e10cSrcweir } 715*cdf0e10cSrcweir catch( const Exception& ) 716*cdf0e10cSrcweir { 717*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::getAllElementUINames: caught an exception!" ); 718*cdf0e10cSrcweir } 719*cdf0e10cSrcweir 720*cdf0e10cSrcweir _rElementNames.resize( rMapUINameToElement.size() ); 721*cdf0e10cSrcweir ::std::transform( rMapUINameToElement.begin(), rMapUINameToElement.end(), _rElementNames.begin(), ::std::select1st< MapStringToPropertySet::value_type >() ); 722*cdf0e10cSrcweir } 723*cdf0e10cSrcweir 724*cdf0e10cSrcweir //-------------------------------------------------------------------- 725*cdf0e10cSrcweir void EFormsHelper::firePropertyChange( const ::rtl::OUString& _rName, const Any& _rOldValue, const Any& _rNewValue ) const 726*cdf0e10cSrcweir { 727*cdf0e10cSrcweir if ( m_aPropertyListeners.empty() ) 728*cdf0e10cSrcweir return; 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir if ( _rOldValue == _rNewValue ) 731*cdf0e10cSrcweir return; 732*cdf0e10cSrcweir 733*cdf0e10cSrcweir try 734*cdf0e10cSrcweir { 735*cdf0e10cSrcweir PropertyChangeEvent aEvent; 736*cdf0e10cSrcweir 737*cdf0e10cSrcweir aEvent.Source = m_xBindableControl.get(); 738*cdf0e10cSrcweir aEvent.PropertyName = _rName; 739*cdf0e10cSrcweir aEvent.OldValue = _rOldValue; 740*cdf0e10cSrcweir aEvent.NewValue = _rNewValue; 741*cdf0e10cSrcweir 742*cdf0e10cSrcweir const_cast< EFormsHelper* >( this )->m_aPropertyListeners.notify( aEvent, &XPropertyChangeListener::propertyChange ); 743*cdf0e10cSrcweir } 744*cdf0e10cSrcweir catch( const Exception& ) 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::firePropertyChange: caught an exception!" ); 747*cdf0e10cSrcweir } 748*cdf0e10cSrcweir } 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir //-------------------------------------------------------------------- 751*cdf0e10cSrcweir void EFormsHelper::firePropertyChanges( const Reference< XPropertySet >& _rxOldProps, const Reference< XPropertySet >& _rxNewProps, ::std::set< ::rtl::OUString >& _rFilter ) const 752*cdf0e10cSrcweir { 753*cdf0e10cSrcweir if ( m_aPropertyListeners.empty() ) 754*cdf0e10cSrcweir return; 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir try 757*cdf0e10cSrcweir { 758*cdf0e10cSrcweir PropertyBag aProperties; 759*cdf0e10cSrcweir Reference< XPropertySetInfo > xOldInfo = collectPropertiesGetInfo( _rxOldProps, aProperties ); 760*cdf0e10cSrcweir Reference< XPropertySetInfo > xNewInfo = collectPropertiesGetInfo( _rxNewProps, aProperties ); 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir for ( PropertyBag::const_iterator aProp = aProperties.begin(); 763*cdf0e10cSrcweir aProp != aProperties.end(); 764*cdf0e10cSrcweir ++aProp 765*cdf0e10cSrcweir ) 766*cdf0e10cSrcweir { 767*cdf0e10cSrcweir if ( _rFilter.find( aProp->Name ) != _rFilter.end() ) 768*cdf0e10cSrcweir continue; 769*cdf0e10cSrcweir 770*cdf0e10cSrcweir Any aOldValue( NULL, aProp->Type ); 771*cdf0e10cSrcweir if ( xOldInfo.is() && xOldInfo->hasPropertyByName( aProp->Name ) ) 772*cdf0e10cSrcweir aOldValue = _rxOldProps->getPropertyValue( aProp->Name ); 773*cdf0e10cSrcweir 774*cdf0e10cSrcweir Any aNewValue( NULL, aProp->Type ); 775*cdf0e10cSrcweir if ( xNewInfo.is() && xNewInfo->hasPropertyByName( aProp->Name ) ) 776*cdf0e10cSrcweir aNewValue = _rxNewProps->getPropertyValue( aProp->Name ); 777*cdf0e10cSrcweir 778*cdf0e10cSrcweir firePropertyChange( aProp->Name, aOldValue, aNewValue ); 779*cdf0e10cSrcweir } 780*cdf0e10cSrcweir } 781*cdf0e10cSrcweir catch( const Exception& ) 782*cdf0e10cSrcweir { 783*cdf0e10cSrcweir OSL_ENSURE( sal_False, "EFormsHelper::firePropertyChanges: caught an exception!" ); 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir } 786*cdf0e10cSrcweir 787*cdf0e10cSrcweir //........................................................................ 788*cdf0e10cSrcweir } // namespace pcr 789*cdf0e10cSrcweir //........................................................................ 790*cdf0e10cSrcweir 791