1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "eformspropertyhandler.hxx"
21 #include "formstrings.hxx"
22 #include "formmetadata.hxx"
23 #include "pcrservices.hxx"
24 #include <propctrlr.h>
25 #include "formbrowsertools.hxx"
26 #include "eformshelper.hxx"
27 #include "handlerhelper.hxx"
29 #include <com/sun/star/lang/NullPointerException.hpp>
30 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
31 #include <com/sun/star/inspection/PropertyControlType.hpp>
32 #include <com/sun/star/inspection/XObjectInspectorUI.hpp>
33 #include <tools/debug.hxx>
34 #include <tools/diagnose_ex.h>
35 #include <sal/log.hxx>
40 extern "C" void createRegistryInfo_EFormsPropertyHandler()
42 ::pcr::EFormsPropertyHandler::registerImplementation();
50 using namespace ::com::sun::star
;
51 using namespace ::com::sun::star::uno
;
52 using namespace ::com::sun::star::lang
;
53 using namespace ::com::sun::star::beans
;
54 using namespace ::com::sun::star::xforms
;
55 using namespace ::com::sun::star::script
;
56 using namespace ::com::sun::star::ui::dialogs
;
57 using namespace ::com::sun::star::form::binding
;
58 using namespace ::com::sun::star::inspection
;
61 //= EFormsPropertyHandler
64 EFormsPropertyHandler::EFormsPropertyHandler( const Reference
< XComponentContext
>& _rxContext
)
65 :EFormsPropertyHandler_Base( _rxContext
)
66 ,m_bSimulatingModelChange( false )
71 EFormsPropertyHandler::~EFormsPropertyHandler( )
76 OUString
EFormsPropertyHandler::getImplementationName_static( )
78 return OUString( "com.sun.star.comp.extensions.EFormsPropertyHandler" );
82 Sequence
< OUString
> EFormsPropertyHandler::getSupportedServiceNames_static( )
84 Sequence
<OUString
> aSupported
{ "com.sun.star.form.inspection.XMLFormsPropertyHandler" };
89 OUString
EFormsPropertyHandler::getModelNamePropertyValue() const
91 OUString sModelName
= m_pHelper
->getCurrentFormModelName();
92 if ( sModelName
.isEmpty() )
93 sModelName
= m_sBindingLessModelName
;
98 Any SAL_CALL
EFormsPropertyHandler::getPropertyValue( const OUString
& _rPropertyName
)
100 ::osl::MutexGuard
aGuard( m_aMutex
);
101 PropertyId
nPropId( impl_getPropertyId_throwUnknownProperty( _rPropertyName
) );
105 "EFormsPropertyHandler::getPropertyValue: we don't have any SupportedProperties!");
106 // if we survived impl_getPropertyId_throwUnknownProperty, we should have a helper, since no helper implies no properties
113 case PROPERTY_ID_LIST_BINDING
:
114 aReturn
<<= m_pHelper
->getCurrentListSourceBinding();
117 case PROPERTY_ID_XML_DATA_MODEL
:
118 aReturn
<<= getModelNamePropertyValue();
121 case PROPERTY_ID_BINDING_NAME
:
122 aReturn
<<= m_pHelper
->getCurrentBindingName();
125 case PROPERTY_ID_BIND_EXPRESSION
:
126 case PROPERTY_ID_XSD_CONSTRAINT
:
127 case PROPERTY_ID_XSD_CALCULATION
:
128 case PROPERTY_ID_XSD_REQUIRED
:
129 case PROPERTY_ID_XSD_RELEVANT
:
130 case PROPERTY_ID_XSD_READONLY
:
132 Reference
< XPropertySet
> xBindingProps( m_pHelper
->getCurrentBinding() );
133 if ( xBindingProps
.is() )
135 aReturn
= xBindingProps
->getPropertyValue( _rPropertyName
);
136 DBG_ASSERT( aReturn
.getValueType().equals( ::cppu::UnoType
<OUString
>::get() ),
137 "EFormsPropertyHandler::getPropertyValue: invalid BindingExpression value type!" );
140 aReturn
<<= OUString();
145 OSL_FAIL( "EFormsPropertyHandler::getPropertyValue: cannot handle this property!" );
149 catch( const Exception
& )
151 css::uno::Any
ex( cppu::getCaughtException() );
152 SAL_WARN( "extensions.propctrlr", "EFormsPropertyHandler::getPropertyValue: caught an exception!"
153 "\n(have been asked for the \"" <<_rPropertyName
<< "\" property.) " << exceptionToString(ex
));
159 void SAL_CALL
EFormsPropertyHandler::setPropertyValue( const OUString
& _rPropertyName
, const Any
& _rValue
)
161 ::osl::MutexGuard
aGuard( m_aMutex
);
162 PropertyId
nPropId( impl_getPropertyId_throwUnknownProperty( _rPropertyName
) );
166 "EFormsPropertyHandler::setPropertyValue: we don't have any SupportedProperties!");
167 // if we survived impl_getPropertyId_throwUnknownProperty, we should have a helper, since no helper implies no properties
171 Any aOldValue
= getPropertyValue( _rPropertyName
);
175 case PROPERTY_ID_LIST_BINDING
:
177 Reference
< XListEntrySource
> xSource
;
178 OSL_VERIFY( _rValue
>>= xSource
);
179 m_pHelper
->setListSourceBinding( xSource
);
183 case PROPERTY_ID_XML_DATA_MODEL
:
185 OSL_VERIFY( _rValue
>>= m_sBindingLessModelName
);
187 // if the model changed, reset the binding to NULL
188 if ( m_pHelper
->getCurrentFormModelName() != m_sBindingLessModelName
)
190 OUString sOldBindingName
= m_pHelper
->getCurrentBindingName();
191 m_pHelper
->setBinding( nullptr );
192 firePropertyChange( PROPERTY_BINDING_NAME
, PROPERTY_ID_BINDING_NAME
,
193 makeAny( sOldBindingName
), makeAny( OUString() ) );
198 case PROPERTY_ID_BINDING_NAME
:
200 OUString sNewBindingName
;
201 OSL_VERIFY( _rValue
>>= sNewBindingName
);
203 bool bPreviouslyEmptyModel
= !m_pHelper
->getCurrentFormModel().is();
205 Reference
< XPropertySet
> xNewBinding
;
206 if ( !sNewBindingName
.isEmpty() )
207 // obtain the binding with this name, for the current model
208 xNewBinding
= m_pHelper
->getOrCreateBindingForModel( getModelNamePropertyValue(), sNewBindingName
);
210 m_pHelper
->setBinding( xNewBinding
);
212 if ( bPreviouslyEmptyModel
)
213 { // simulate a property change for the model property
214 // This is because we "simulate" the Model property by remembering the
215 // value ourself. Other instances might, however, not know this value,
216 // but prefer to retrieve it somewhere else - e.g. from the EFormsHelper
218 // The really correct solution would be if *all* property handlers
219 // obtain a "current property value" for *all* properties from a central
220 // instance. Then, handler A could ask it for the value of property
221 // X, and this request would be re-routed to handler B, which ultimately
222 // knows the current value.
223 // However, there's no such mechanism in place currently.
224 m_bSimulatingModelChange
= true;
225 firePropertyChange( PROPERTY_XML_DATA_MODEL
, PROPERTY_ID_XML_DATA_MODEL
,
226 makeAny( OUString() ), makeAny( getModelNamePropertyValue() ) );
227 m_bSimulatingModelChange
= false;
232 case PROPERTY_ID_BIND_EXPRESSION
:
234 Reference
< XPropertySet
> xBinding( m_pHelper
->getCurrentBinding() );
235 OSL_ENSURE( xBinding
.is(), "You should not reach this without an active binding!" );
237 xBinding
->setPropertyValue( PROPERTY_BIND_EXPRESSION
, _rValue
);
241 case PROPERTY_ID_XSD_REQUIRED
:
242 case PROPERTY_ID_XSD_RELEVANT
:
243 case PROPERTY_ID_XSD_READONLY
:
244 case PROPERTY_ID_XSD_CONSTRAINT
:
245 case PROPERTY_ID_XSD_CALCULATION
:
247 Reference
< XPropertySet
> xBindingProps( m_pHelper
->getCurrentBinding() );
248 DBG_ASSERT( xBindingProps
.is(), "EFormsPropertyHandler::setPropertyValue: how can I set a property if there's no binding?" );
249 if ( xBindingProps
.is() )
251 DBG_ASSERT( _rValue
.getValueType().equals( ::cppu::UnoType
<OUString
>::get() ),
252 "EFormsPropertyHandler::setPropertyValue: invalid value type!" );
253 xBindingProps
->setPropertyValue( _rPropertyName
, _rValue
);
259 OSL_FAIL( "EFormsPropertyHandler::setPropertyValue: cannot handle this property!" );
263 impl_setContextDocumentModified_nothrow();
265 Any
aNewValue( getPropertyValue( _rPropertyName
) );
266 firePropertyChange( _rPropertyName
, nPropId
, aOldValue
, aNewValue
);
268 catch( const Exception
& )
270 OSL_FAIL( "EFormsPropertyHandler::setPropertyValue: caught an exception!" );
275 void EFormsPropertyHandler::onNewComponent()
277 EFormsPropertyHandler_Base::onNewComponent();
279 Reference
< frame::XModel
> xDocument( impl_getContextDocument_nothrow() );
280 DBG_ASSERT( xDocument
.is(), "EFormsPropertyHandler::onNewComponent: no document!" );
281 if ( EFormsHelper::isEForm( xDocument
) )
282 m_pHelper
.reset( new EFormsHelper( m_aMutex
, m_xComponent
, xDocument
) );
288 Sequence
< Property
> EFormsPropertyHandler::doDescribeSupportedProperties() const
290 std::vector
< Property
> aProperties
;
294 if ( m_pHelper
->canBindToAnyDataType() )
296 aProperties
.reserve( 7 );
297 addStringPropertyDescription( aProperties
, PROPERTY_XML_DATA_MODEL
);
298 addStringPropertyDescription( aProperties
, PROPERTY_BINDING_NAME
);
299 addStringPropertyDescription( aProperties
, PROPERTY_BIND_EXPRESSION
);
300 addStringPropertyDescription( aProperties
, PROPERTY_XSD_REQUIRED
);
301 addStringPropertyDescription( aProperties
, PROPERTY_XSD_RELEVANT
);
302 addStringPropertyDescription( aProperties
, PROPERTY_XSD_READONLY
);
303 addStringPropertyDescription( aProperties
, PROPERTY_XSD_CONSTRAINT
);
304 addStringPropertyDescription( aProperties
, PROPERTY_XSD_CALCULATION
);
306 if ( m_pHelper
->isListEntrySink() )
308 implAddPropertyDescription( aProperties
, PROPERTY_LIST_BINDING
,
309 cppu::UnoType
<XListEntrySource
>::get() );
313 if ( aProperties
.empty() )
314 return Sequence
< Property
>();
315 return comphelper::containerToSequence(aProperties
);
319 Any SAL_CALL
EFormsPropertyHandler::convertToPropertyValue( const OUString
& _rPropertyName
, const Any
& _rControlValue
)
321 ::osl::MutexGuard
aGuard( m_aMutex
);
326 "EFormsPropertyHandler::convertToPropertyValue: we have no SupportedProperties!");
330 PropertyId
nPropId( m_pInfoService
->getPropertyId( _rPropertyName
) );
332 OUString sControlValue
;
335 case PROPERTY_ID_LIST_BINDING
:
337 OSL_VERIFY( _rControlValue
>>= sControlValue
);
338 Reference
< XListEntrySource
> xListSource( m_pHelper
->getModelElementFromUIName( EFormsHelper::Binding
, sControlValue
), UNO_QUERY
);
339 OSL_ENSURE( xListSource
.is() || !m_pHelper
->getModelElementFromUIName( EFormsHelper::Binding
, sControlValue
).is(),
340 "EFormsPropertyHandler::convertToPropertyValue: there's a binding which is no ListEntrySource!" );
341 aReturn
<<= xListSource
;
346 aReturn
= EFormsPropertyHandler_Base::convertToPropertyValue( _rPropertyName
, _rControlValue
);
354 Any SAL_CALL
EFormsPropertyHandler::convertToControlValue( const OUString
& _rPropertyName
, const Any
& _rPropertyValue
, const Type
& _rControlValueType
)
356 ::osl::MutexGuard
aGuard( m_aMutex
);
359 OSL_ENSURE(m_pHelper
,
360 "EFormsPropertyHandler::convertToControlValue: we have no SupportedProperties!");
364 PropertyId
nPropId( m_pInfoService
->getPropertyId( _rPropertyName
) );
366 OSL_ENSURE( _rControlValueType
.getTypeClass() == TypeClass_STRING
,
367 "EFormsPropertyHandler::convertToControlValue: all our controls should use strings for value exchange!" );
371 case PROPERTY_ID_LIST_BINDING
:
373 Reference
< XPropertySet
> xListSourceBinding( _rPropertyValue
, UNO_QUERY
);
374 if ( xListSourceBinding
.is() )
375 aReturn
<<= EFormsHelper::getModelElementUIName( EFormsHelper::Binding
, xListSourceBinding
);
380 aReturn
= EFormsPropertyHandler_Base::convertToControlValue( _rPropertyName
, _rPropertyValue
, _rControlValueType
);
388 Sequence
< OUString
> SAL_CALL
EFormsPropertyHandler::getActuatingProperties( )
390 ::osl::MutexGuard
aGuard( m_aMutex
);
392 return Sequence
< OUString
>();
394 std::vector
< OUString
> aInterestedInActuations( 2 );
395 aInterestedInActuations
[ 0 ] = PROPERTY_XML_DATA_MODEL
;
396 aInterestedInActuations
[ 1 ] = PROPERTY_BINDING_NAME
;
397 return comphelper::containerToSequence(aInterestedInActuations
);
401 Sequence
< OUString
> SAL_CALL
EFormsPropertyHandler::getSupersededProperties( )
403 ::osl::MutexGuard
aGuard( m_aMutex
);
405 return Sequence
< OUString
>();
407 Sequence
<OUString
> aReturn
{ PROPERTY_INPUT_REQUIRED
};
412 LineDescriptor SAL_CALL
EFormsPropertyHandler::describePropertyLine( const OUString
& _rPropertyName
,
413 const Reference
< XPropertyControlFactory
>& _rxControlFactory
)
415 ::osl::MutexGuard
aGuard( m_aMutex
);
416 if ( !_rxControlFactory
.is() )
417 throw NullPointerException();
419 throw RuntimeException();
421 LineDescriptor aDescriptor
;
422 sal_Int16 nControlType
= PropertyControlType::TextField
;
423 std::vector
< OUString
> aListEntries
;
424 PropertyId
nPropId( impl_getPropertyId_throwUnknownProperty( _rPropertyName
) );
427 case PROPERTY_ID_LIST_BINDING
:
428 nControlType
= PropertyControlType::ListBox
;
429 m_pHelper
->getAllElementUINames(EFormsHelper::Binding
, aListEntries
, true);
432 case PROPERTY_ID_XML_DATA_MODEL
:
433 nControlType
= PropertyControlType::ListBox
;
434 m_pHelper
->getFormModelNames( aListEntries
);
437 case PROPERTY_ID_BINDING_NAME
:
439 nControlType
= PropertyControlType::ComboBox
;
440 OUString
sCurrentModel( getModelNamePropertyValue() );
441 if ( !sCurrentModel
.isEmpty() )
442 m_pHelper
->getBindingNames( sCurrentModel
, aListEntries
);
446 case PROPERTY_ID_BIND_EXPRESSION
: aDescriptor
.PrimaryButtonId
= UID_PROP_DLG_BIND_EXPRESSION
; break;
447 case PROPERTY_ID_XSD_REQUIRED
: aDescriptor
.PrimaryButtonId
= UID_PROP_DLG_XSD_REQUIRED
; break;
448 case PROPERTY_ID_XSD_RELEVANT
: aDescriptor
.PrimaryButtonId
= UID_PROP_DLG_XSD_RELEVANT
; break;
449 case PROPERTY_ID_XSD_READONLY
: aDescriptor
.PrimaryButtonId
= UID_PROP_DLG_XSD_READONLY
; break;
450 case PROPERTY_ID_XSD_CONSTRAINT
: aDescriptor
.PrimaryButtonId
= UID_PROP_DLG_XSD_CONSTRAINT
; break;
451 case PROPERTY_ID_XSD_CALCULATION
: aDescriptor
.PrimaryButtonId
= UID_PROP_DLG_XSD_CALCULATION
; break;
454 OSL_FAIL( "EFormsPropertyHandler::describePropertyLine: cannot handle this property!" );
458 switch ( nControlType
)
460 case PropertyControlType::ListBox
:
461 aDescriptor
.Control
= PropertyHandlerHelper::createListBoxControl( _rxControlFactory
, aListEntries
, false, true );
463 case PropertyControlType::ComboBox
:
464 aDescriptor
.Control
= PropertyHandlerHelper::createComboBoxControl( _rxControlFactory
, aListEntries
, true );
467 aDescriptor
.Control
= _rxControlFactory
->createPropertyControl( nControlType
, false );
471 aDescriptor
.DisplayName
= m_pInfoService
->getPropertyTranslation( nPropId
);
472 aDescriptor
.Category
= "Data";
473 aDescriptor
.HelpURL
= HelpIdUrl::getHelpURL( m_pInfoService
->getPropertyHelpId( nPropId
) );
478 InteractiveSelectionResult SAL_CALL
EFormsPropertyHandler::onInteractivePropertySelection( const OUString
& _rPropertyName
, sal_Bool
/*_bPrimary*/, Any
& _rData
, const Reference
< XObjectInspectorUI
>& _rxInspectorUI
)
480 if ( !_rxInspectorUI
.is() )
481 throw NullPointerException();
483 ::osl::MutexGuard
aGuard( m_aMutex
);
484 OSL_ENSURE(m_pHelper
, "EFormsPropertyHandler::onInteractivePropertySelection: we do not "
485 "have any SupportedProperties!");
487 return InteractiveSelectionResult_Cancelled
;
489 PropertyId
nPropId( impl_getPropertyId_throwUnknownProperty( _rPropertyName
) );
490 OSL_ENSURE( ( PROPERTY_ID_BINDING_NAME
== nPropId
)
491 || ( PROPERTY_ID_BIND_EXPRESSION
== nPropId
)
492 || ( PROPERTY_ID_XSD_REQUIRED
== nPropId
)
493 || ( PROPERTY_ID_XSD_RELEVANT
== nPropId
)
494 || ( PROPERTY_ID_XSD_READONLY
== nPropId
)
495 || ( PROPERTY_ID_XSD_CONSTRAINT
== nPropId
)
496 || ( PROPERTY_ID_XSD_CALCULATION
== nPropId
), "EFormsPropertyHandler::onInteractivePropertySelection: unexpected!" );
500 Reference
< XExecutableDialog
> xDialog
;
501 xDialog
.set( m_xContext
->getServiceManager()->createInstanceWithContext( "com.sun.star.xforms.ui.dialogs.AddCondition", m_xContext
), UNO_QUERY
);
502 Reference
< XPropertySet
> xDialogProps( xDialog
, UNO_QUERY_THROW
);
504 // the model for the dialog to work with
505 Reference
< xforms::XModel
> xModel( m_pHelper
->getCurrentFormModel() );
506 // the binding for the dialog to work with
507 Reference
< XPropertySet
> xBinding( m_pHelper
->getCurrentBinding() );
508 // the aspect of the binding which the dialog should modify
509 const OUString
& sFacetName( _rPropertyName
);
511 OSL_ENSURE( xModel
.is() && xBinding
.is() && !sFacetName
.isEmpty(),
512 "EFormsPropertyHandler::onInteractivePropertySelection: something is missing for the dialog initialization!" );
513 if ( !( xModel
.is() && xBinding
.is() && !sFacetName
.isEmpty() ) )
514 return InteractiveSelectionResult_Cancelled
;
516 xDialogProps
->setPropertyValue("FormModel", makeAny( xModel
) );
517 xDialogProps
->setPropertyValue("Binding", makeAny( xBinding
) );
518 xDialogProps
->setPropertyValue("FacetName", makeAny( sFacetName
) );
520 if ( !xDialog
->execute() )
522 return InteractiveSelectionResult_Cancelled
;
524 _rData
= xDialogProps
->getPropertyValue("ConditionValue");
525 return InteractiveSelectionResult_ObtainedValue
;
527 catch( const Exception
& )
529 OSL_FAIL( "EFormsPropertyHandler::onInteractivePropertySelection: caught an exception!" );
532 // something went wrong here ...(but has been asserted already)
533 return InteractiveSelectionResult_Cancelled
;
537 void SAL_CALL
EFormsPropertyHandler::addPropertyChangeListener( const Reference
< XPropertyChangeListener
>& _rxListener
)
539 ::osl::MutexGuard
aGuard( m_aMutex
);
540 EFormsPropertyHandler_Base::addPropertyChangeListener( _rxListener
);
542 m_pHelper
->registerBindingListener( _rxListener
);
546 void SAL_CALL
EFormsPropertyHandler::removePropertyChangeListener( const Reference
< XPropertyChangeListener
>& _rxListener
)
548 ::osl::MutexGuard
aGuard( m_aMutex
);
550 m_pHelper
->revokeBindingListener( _rxListener
);
551 EFormsPropertyHandler_Base::removePropertyChangeListener( _rxListener
);
555 void SAL_CALL
EFormsPropertyHandler::actuatingPropertyChanged( const OUString
& _rActuatingPropertyName
, const Any
& _rNewValue
, const Any
& /*_rOldValue*/, const Reference
< XObjectInspectorUI
>& _rxInspectorUI
, sal_Bool
)
557 if ( !_rxInspectorUI
.is() )
558 throw NullPointerException();
560 ::osl::MutexGuard
aGuard( m_aMutex
);
561 PropertyId
nActuatingPropId( impl_getPropertyId_throwRuntime( _rActuatingPropertyName
) );
562 OSL_PRECOND(m_pHelper
, "EFormsPropertyHandler::actuatingPropertyChanged: inconsistentcy!");
563 // if we survived impl_getPropertyId_throwRuntime, we should have a helper, since no helper implies no properties
565 DBG_ASSERT( _rxInspectorUI
.is(), "EFormsPropertyHandler::actuatingPropertyChanged: invalid callback!" );
566 if ( !_rxInspectorUI
.is() )
569 switch ( nActuatingPropId
)
571 case PROPERTY_ID_XML_DATA_MODEL
:
573 if ( m_bSimulatingModelChange
)
575 OUString sDataModelName
;
576 OSL_VERIFY( _rNewValue
>>= sDataModelName
);
577 bool bBoundToSomeModel
= !sDataModelName
.isEmpty();
578 _rxInspectorUI
->rebuildPropertyUI( PROPERTY_BINDING_NAME
);
579 _rxInspectorUI
->enablePropertyUI( PROPERTY_BINDING_NAME
, bBoundToSomeModel
);
583 case PROPERTY_ID_BINDING_NAME
:
585 bool bHaveABinding
= !m_pHelper
->getCurrentBindingName().isEmpty();
586 _rxInspectorUI
->enablePropertyUI( PROPERTY_BIND_EXPRESSION
, bHaveABinding
);
587 _rxInspectorUI
->enablePropertyUI( PROPERTY_XSD_REQUIRED
, bHaveABinding
);
588 _rxInspectorUI
->enablePropertyUI( PROPERTY_XSD_RELEVANT
, bHaveABinding
);
589 _rxInspectorUI
->enablePropertyUI( PROPERTY_XSD_READONLY
, bHaveABinding
);
590 _rxInspectorUI
->enablePropertyUI( PROPERTY_XSD_CONSTRAINT
, bHaveABinding
);
591 _rxInspectorUI
->enablePropertyUI( PROPERTY_XSD_CALCULATION
, bHaveABinding
);
592 _rxInspectorUI
->enablePropertyUI( PROPERTY_XSD_DATA_TYPE
, bHaveABinding
);
597 OSL_FAIL( "EFormsPropertyHandler::actuatingPropertyChanged: cannot handle this property!" );
606 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */