| /************************************************************** | |
| * | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| * | |
| *************************************************************/ | |
| // MARKER(update_precomp.py): autogen include statement, do not remove | |
| #include "precompiled_forms.hxx" | |
| #include "refvaluecomponent.hxx" | |
| /** === begin UNO includes === **/ | |
| /** === end UNO includes === **/ | |
| #include <tools/diagnose_ex.h> | |
| #include <list> | |
| //........................................................................ | |
| namespace frm | |
| { | |
| //........................................................................ | |
| using namespace ::com::sun::star::uno; | |
| using namespace ::com::sun::star::lang; | |
| using namespace ::com::sun::star::beans; | |
| using namespace ::com::sun::star::form::binding; | |
| //==================================================================== | |
| //= | |
| //==================================================================== | |
| //-------------------------------------------------------------------- | |
| OReferenceValueComponent::OReferenceValueComponent( const Reference< XMultiServiceFactory>& _rxFactory, const ::rtl::OUString& _rUnoControlModelTypeName, const ::rtl::OUString& _rDefault, sal_Bool _bSupportNoCheckRefValue ) | |
| :OBoundControlModel( _rxFactory, _rUnoControlModelTypeName, _rDefault, sal_False, sal_True, sal_True ) | |
| ,m_eDefaultChecked( STATE_NOCHECK ) | |
| ,m_bSupportSecondRefValue( _bSupportNoCheckRefValue ) | |
| { | |
| } | |
| //-------------------------------------------------------------------- | |
| OReferenceValueComponent::OReferenceValueComponent( const OReferenceValueComponent* _pOriginal, const Reference< XMultiServiceFactory>& _rxFactory ) | |
| :OBoundControlModel( _pOriginal, _rxFactory ) | |
| { | |
| m_sReferenceValue = _pOriginal->m_sReferenceValue; | |
| m_sNoCheckReferenceValue = _pOriginal->m_sNoCheckReferenceValue; | |
| m_eDefaultChecked = _pOriginal->m_eDefaultChecked; | |
| m_bSupportSecondRefValue = _pOriginal->m_bSupportSecondRefValue; | |
| calculateExternalValueType(); | |
| } | |
| //-------------------------------------------------------------------- | |
| OReferenceValueComponent::~OReferenceValueComponent() | |
| { | |
| } | |
| //-------------------------------------------------------------------- | |
| void OReferenceValueComponent::setReferenceValue( const ::rtl::OUString& _rRefValue ) | |
| { | |
| m_sReferenceValue = _rRefValue; | |
| calculateExternalValueType(); | |
| } | |
| //-------------------------------------------------------------------- | |
| void SAL_CALL OReferenceValueComponent::getFastPropertyValue( Any& _rValue, sal_Int32 _nHandle ) const | |
| { | |
| switch ( _nHandle ) | |
| { | |
| case PROPERTY_ID_REFVALUE: _rValue <<= m_sReferenceValue; break; | |
| case PROPERTY_ID_DEFAULT_STATE: _rValue <<= (sal_Int16)m_eDefaultChecked; break; | |
| case PROPERTY_ID_UNCHECKED_REFVALUE: | |
| OSL_ENSURE( m_bSupportSecondRefValue, "OReferenceValueComponent::getFastPropertyValue: not supported!" ); | |
| _rValue <<= m_sNoCheckReferenceValue; | |
| break; | |
| default: | |
| OBoundControlModel::getFastPropertyValue( _rValue, _nHandle ); | |
| } | |
| } | |
| //-------------------------------------------------------------------- | |
| void SAL_CALL OReferenceValueComponent::setFastPropertyValue_NoBroadcast( sal_Int32 _nHandle, const Any& _rValue ) throw (Exception) | |
| { | |
| switch ( _nHandle ) | |
| { | |
| case PROPERTY_ID_REFVALUE : | |
| OSL_VERIFY( _rValue >>= m_sReferenceValue ); | |
| calculateExternalValueType(); | |
| break; | |
| case PROPERTY_ID_UNCHECKED_REFVALUE: | |
| OSL_ENSURE( m_bSupportSecondRefValue, "OReferenceValueComponent::setFastPropertyValue_NoBroadcast: not supported!" ); | |
| OSL_VERIFY( _rValue >>= m_sNoCheckReferenceValue ); | |
| break; | |
| case PROPERTY_ID_DEFAULT_STATE: | |
| { | |
| sal_Int16 nDefaultChecked( (sal_Int16)STATE_NOCHECK ); | |
| OSL_VERIFY( _rValue >>= nDefaultChecked ); | |
| m_eDefaultChecked = (ToggleState)nDefaultChecked; | |
| resetNoBroadcast(); | |
| } | |
| break; | |
| default: | |
| OBoundControlModel::setFastPropertyValue_NoBroadcast( _nHandle, _rValue ); | |
| } | |
| } | |
| //-------------------------------------------------------------------- | |
| sal_Bool SAL_CALL OReferenceValueComponent::convertFastPropertyValue( Any& _rConvertedValue, Any& _rOldValue, sal_Int32 _nHandle, const Any& _rValue ) throw (IllegalArgumentException) | |
| { | |
| sal_Bool bModified = sal_False; | |
| switch ( _nHandle ) | |
| { | |
| case PROPERTY_ID_REFVALUE: | |
| bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_sReferenceValue ); | |
| break; | |
| case PROPERTY_ID_UNCHECKED_REFVALUE: | |
| OSL_ENSURE( m_bSupportSecondRefValue, "OReferenceValueComponent::convertFastPropertyValue: not supported!" ); | |
| bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_sNoCheckReferenceValue ); | |
| break; | |
| case PROPERTY_ID_DEFAULT_STATE: | |
| bModified = tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, (sal_Int16)m_eDefaultChecked ); | |
| break; | |
| default: | |
| bModified = OBoundControlModel::convertFastPropertyValue( _rConvertedValue, _rOldValue, _nHandle, _rValue ); | |
| break; | |
| } | |
| return bModified; | |
| } | |
| //------------------------------------------------------------------------------ | |
| Any OReferenceValueComponent::getDefaultForReset() const | |
| { | |
| return makeAny( (sal_Int16)m_eDefaultChecked ); | |
| } | |
| //-------------------------------------------------------------------- | |
| void OReferenceValueComponent::describeFixedProperties( Sequence< Property >& _rProps ) const | |
| { | |
| BEGIN_DESCRIBE_PROPERTIES( m_bSupportSecondRefValue ? 3 : 2, OBoundControlModel ) | |
| DECL_PROP1( REFVALUE, ::rtl::OUString, BOUND ); | |
| DECL_PROP1( DEFAULT_STATE, sal_Int16, BOUND ); | |
| if ( m_bSupportSecondRefValue ) | |
| { | |
| DECL_PROP1( UNCHECKED_REFVALUE, ::rtl::OUString, BOUND ); | |
| } | |
| END_DESCRIBE_PROPERTIES(); | |
| } | |
| //----------------------------------------------------------------------------- | |
| Sequence< Type > OReferenceValueComponent::getSupportedBindingTypes() | |
| { | |
| ::std::list< Type > aTypes; | |
| aTypes.push_back( ::getCppuType( static_cast< sal_Bool* >( NULL ) ) ); | |
| if ( m_sReferenceValue.getLength() ) | |
| aTypes.push_front( ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ) ); | |
| // push_front, because this is the preferred type | |
| Sequence< Type > aTypesRet( aTypes.size() ); | |
| ::std::copy( aTypes.begin(), aTypes.end(), aTypesRet.getArray() ); | |
| return aTypesRet; | |
| } | |
| //----------------------------------------------------------------------------- | |
| Any OReferenceValueComponent::translateExternalValueToControlValue( const Any& _rExternalValue ) const | |
| { | |
| sal_Int16 nState = STATE_DONTKNOW; | |
| sal_Bool bExternalState = sal_False; | |
| ::rtl::OUString sExternalValue; | |
| if ( _rExternalValue >>= bExternalState ) | |
| { | |
| nState = ::sal::static_int_cast< sal_Int16 >( bExternalState ? STATE_CHECK : STATE_NOCHECK ); | |
| } | |
| else if ( _rExternalValue >>= sExternalValue ) | |
| { | |
| if ( sExternalValue == m_sReferenceValue ) | |
| nState = STATE_CHECK; | |
| else | |
| { | |
| if ( !m_bSupportSecondRefValue || ( sExternalValue == m_sNoCheckReferenceValue ) ) | |
| nState = STATE_NOCHECK; | |
| else | |
| nState = STATE_DONTKNOW; | |
| } | |
| } | |
| else if ( !_rExternalValue.hasValue() ) | |
| { | |
| nState = STATE_DONTKNOW; | |
| } | |
| else | |
| { | |
| OSL_ENSURE( false, "OReferenceValueComponent::translateExternalValueToControlValue: unexpected value type!" ); | |
| } | |
| return makeAny( nState ); | |
| } | |
| //----------------------------------------------------------------------------- | |
| Any OReferenceValueComponent::translateControlValueToExternalValue( ) const | |
| { | |
| Any aExternalValue; | |
| try | |
| { | |
| Any aControlValue( m_xAggregateSet->getPropertyValue( PROPERTY_STATE ) ); | |
| sal_Int16 nControlValue = STATE_DONTKNOW; | |
| aControlValue >>= nControlValue; | |
| bool bBooleanExchange = getExternalValueType().getTypeClass() == TypeClass_BOOLEAN; | |
| bool bStringExchange = getExternalValueType().getTypeClass() == TypeClass_STRING; | |
| OSL_ENSURE( bBooleanExchange || bStringExchange, | |
| "OReferenceValueComponent::translateControlValueToExternalValue: unexpected value exchange type!" ); | |
| switch( nControlValue ) | |
| { | |
| case STATE_CHECK: | |
| if ( bBooleanExchange ) | |
| { | |
| aExternalValue <<= (sal_Bool)sal_True; | |
| } | |
| else if ( bStringExchange ) | |
| { | |
| aExternalValue <<= m_sReferenceValue; | |
| } | |
| break; | |
| case STATE_NOCHECK: | |
| if ( bBooleanExchange ) | |
| { | |
| aExternalValue <<= (sal_Bool)sal_False; | |
| } | |
| else if ( bStringExchange ) | |
| { | |
| aExternalValue <<= m_bSupportSecondRefValue ? m_sNoCheckReferenceValue : ::rtl::OUString(); | |
| } | |
| break; | |
| } | |
| } | |
| catch( const Exception& ) | |
| { | |
| OSL_ENSURE( sal_False, "OReferenceValueComponent::translateControlValueToExternalValue: caught an exception!" ); | |
| } | |
| return aExternalValue; | |
| } | |
| //----------------------------------------------------------------------------- | |
| Any OReferenceValueComponent::translateControlValueToValidatableValue( ) const | |
| { | |
| if ( !m_xAggregateSet.is() ) | |
| return Any(); | |
| Any aControlValue( m_xAggregateSet->getPropertyValue( PROPERTY_STATE ) ); | |
| sal_Int16 nControlValue = STATE_DONTKNOW; | |
| aControlValue >>= nControlValue; | |
| Any aValidatableValue; | |
| switch ( nControlValue ) | |
| { | |
| case STATE_CHECK: | |
| aValidatableValue <<= (sal_Bool)sal_True; | |
| break; | |
| case STATE_NOCHECK: | |
| aValidatableValue <<= (sal_Bool)sal_False; | |
| break; | |
| } | |
| return aValidatableValue; | |
| } | |
| //........................................................................ | |
| } // namespace frm | |
| //........................................................................ | |