xref: /AOO41X/main/extensions/source/propctrlr/eformshelper.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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