1*2a97ec55SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*2a97ec55SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*2a97ec55SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*2a97ec55SAndrew Rist * distributed with this work for additional information 6*2a97ec55SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*2a97ec55SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*2a97ec55SAndrew Rist * "License"); you may not use this file except in compliance 9*2a97ec55SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*2a97ec55SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*2a97ec55SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*2a97ec55SAndrew Rist * software distributed under the License is distributed on an 15*2a97ec55SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2a97ec55SAndrew Rist * KIND, either express or implied. See the License for the 17*2a97ec55SAndrew Rist * specific language governing permissions and limitations 18*2a97ec55SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*2a97ec55SAndrew Rist *************************************************************/ 21*2a97ec55SAndrew Rist 22*2a97ec55SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_extensions.hxx" 26cdf0e10cSrcweir #include "cellbindinghandler.hxx" 27cdf0e10cSrcweir #include "formstrings.hxx" 28cdf0e10cSrcweir #include "formmetadata.hxx" 29cdf0e10cSrcweir #include "cellbindinghelper.hxx" 30cdf0e10cSrcweir 31cdf0e10cSrcweir /** === begin UNO includes === **/ 32cdf0e10cSrcweir #include <com/sun/star/form/binding/XValueBinding.hpp> 33cdf0e10cSrcweir #include <com/sun/star/table/CellAddress.hpp> 34cdf0e10cSrcweir #include <com/sun/star/inspection/XObjectInspectorUI.hpp> 35cdf0e10cSrcweir /** === end UNO includes === **/ 36cdf0e10cSrcweir #include <tools/debug.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir //------------------------------------------------------------------------ 39cdf0e10cSrcweir extern "C" void SAL_CALL createRegistryInfo_CellBindingPropertyHandler() 40cdf0e10cSrcweir { 41cdf0e10cSrcweir ::pcr::CellBindingPropertyHandler::registerImplementation(); 42cdf0e10cSrcweir } 43cdf0e10cSrcweir 44cdf0e10cSrcweir //........................................................................ 45cdf0e10cSrcweir namespace pcr 46cdf0e10cSrcweir { 47cdf0e10cSrcweir //........................................................................ 48cdf0e10cSrcweir 49cdf0e10cSrcweir using namespace ::com::sun::star::uno; 50cdf0e10cSrcweir using namespace ::com::sun::star::table; 51cdf0e10cSrcweir using namespace ::com::sun::star::lang; 52cdf0e10cSrcweir using namespace ::com::sun::star::beans; 53cdf0e10cSrcweir using namespace ::com::sun::star::script; 54cdf0e10cSrcweir using namespace ::com::sun::star::frame; 55cdf0e10cSrcweir using namespace ::com::sun::star::inspection; 56cdf0e10cSrcweir using namespace ::com::sun::star::form::binding; 57cdf0e10cSrcweir using namespace ::comphelper; 58cdf0e10cSrcweir 59cdf0e10cSrcweir //==================================================================== 60cdf0e10cSrcweir //= CellBindingPropertyHandler 61cdf0e10cSrcweir //==================================================================== 62cdf0e10cSrcweir DBG_NAME( CellBindingPropertyHandler ) 63cdf0e10cSrcweir //-------------------------------------------------------------------- 64cdf0e10cSrcweir CellBindingPropertyHandler::CellBindingPropertyHandler( const Reference< XComponentContext >& _rxContext ) 65cdf0e10cSrcweir :CellBindingPropertyHandler_Base( _rxContext ) 66cdf0e10cSrcweir ,m_pCellExchangeConverter( new DefaultEnumRepresentation( *m_pInfoService, ::getCppuType( static_cast< sal_Int16* >( NULL ) ), PROPERTY_ID_CELL_EXCHANGE_TYPE ) ) 67cdf0e10cSrcweir { 68cdf0e10cSrcweir DBG_CTOR( CellBindingPropertyHandler, NULL ); 69cdf0e10cSrcweir } 70cdf0e10cSrcweir 71cdf0e10cSrcweir //-------------------------------------------------------------------- 72cdf0e10cSrcweir ::rtl::OUString SAL_CALL CellBindingPropertyHandler::getImplementationName_static( ) throw (RuntimeException) 73cdf0e10cSrcweir { 74cdf0e10cSrcweir return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.CellBindingPropertyHandler" ) ); 75cdf0e10cSrcweir } 76cdf0e10cSrcweir 77cdf0e10cSrcweir //-------------------------------------------------------------------- 78cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL CellBindingPropertyHandler::getSupportedServiceNames_static( ) throw (RuntimeException) 79cdf0e10cSrcweir { 80cdf0e10cSrcweir Sequence< ::rtl::OUString > aSupported( 1 ); 81cdf0e10cSrcweir aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.inspection.CellBindingPropertyHandler" ) ); 82cdf0e10cSrcweir return aSupported; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir //-------------------------------------------------------------------- 86cdf0e10cSrcweir void CellBindingPropertyHandler::onNewComponent() 87cdf0e10cSrcweir { 88cdf0e10cSrcweir PropertyHandlerComponent::onNewComponent(); 89cdf0e10cSrcweir 90cdf0e10cSrcweir Reference< XModel > xDocument( impl_getContextDocument_nothrow() ); 91cdf0e10cSrcweir DBG_ASSERT( xDocument.is(), "CellBindingPropertyHandler::onNewComponent: no document!" ); 92cdf0e10cSrcweir if ( CellBindingHelper::isSpreadsheetDocument( xDocument ) ) 93cdf0e10cSrcweir m_pHelper.reset( new CellBindingHelper( m_xComponent, xDocument ) ); 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir //-------------------------------------------------------------------- 97cdf0e10cSrcweir CellBindingPropertyHandler::~CellBindingPropertyHandler( ) 98cdf0e10cSrcweir { 99cdf0e10cSrcweir DBG_DTOR( CellBindingPropertyHandler, NULL ); 100cdf0e10cSrcweir } 101cdf0e10cSrcweir 102cdf0e10cSrcweir //-------------------------------------------------------------------- 103cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL CellBindingPropertyHandler::getActuatingProperties( ) throw (RuntimeException) 104cdf0e10cSrcweir { 105cdf0e10cSrcweir Sequence< ::rtl::OUString > aInterestingProperties( 3 ); 106cdf0e10cSrcweir aInterestingProperties[0] = PROPERTY_LIST_CELL_RANGE; 107cdf0e10cSrcweir aInterestingProperties[1] = PROPERTY_BOUND_CELL; 108cdf0e10cSrcweir aInterestingProperties[2] = PROPERTY_CONTROLSOURCE; 109cdf0e10cSrcweir return aInterestingProperties; 110cdf0e10cSrcweir } 111cdf0e10cSrcweir 112cdf0e10cSrcweir //-------------------------------------------------------------------- 113cdf0e10cSrcweir void SAL_CALL CellBindingPropertyHandler::actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const Any& _rNewValue, const Any& /*_rOldValue*/, const Reference< XObjectInspectorUI >& _rxInspectorUI, sal_Bool _bFirstTimeInit ) throw (NullPointerException, RuntimeException) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 116cdf0e10cSrcweir PropertyId nActuatingPropId( impl_getPropertyId_throw( _rActuatingPropertyName ) ); 117cdf0e10cSrcweir OSL_PRECOND( m_pHelper.get(), "CellBindingPropertyHandler::actuatingPropertyChanged: inconsistentcy!" ); 118cdf0e10cSrcweir // if we survived impl_getPropertyId_throw, we should have a helper, since no helper implies no properties 119cdf0e10cSrcweir 120cdf0e10cSrcweir OSL_PRECOND( _rxInspectorUI.is(), "FormComponentPropertyHandler::actuatingPropertyChanged: no access to the UI!" ); 121cdf0e10cSrcweir if ( !_rxInspectorUI.is() ) 122cdf0e10cSrcweir throw NullPointerException(); 123cdf0e10cSrcweir 124cdf0e10cSrcweir ::std::vector< PropertyId > aDependentProperties; 125cdf0e10cSrcweir 126cdf0e10cSrcweir switch ( nActuatingPropId ) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir // ----- BoundCell ----- 129cdf0e10cSrcweir case PROPERTY_ID_BOUND_CELL: 130cdf0e10cSrcweir { 131cdf0e10cSrcweir // the SQL-data-binding related properties need to be enabled if and only if 132cdf0e10cSrcweir // there is *no* valid cell binding 133cdf0e10cSrcweir Reference< XValueBinding > xBinding; 134cdf0e10cSrcweir _rNewValue >>= xBinding; 135cdf0e10cSrcweir 136cdf0e10cSrcweir if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_CELL_EXCHANGE_TYPE ) ) 137cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_CELL_EXCHANGE_TYPE, xBinding.is() ); 138cdf0e10cSrcweir if ( impl_componentHasProperty_throw( PROPERTY_CONTROLSOURCE ) ) 139cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_CONTROLSOURCE, !xBinding.is() ); 140cdf0e10cSrcweir 141cdf0e10cSrcweir if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_FILTERPROPOSAL ) ) 142cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_FILTERPROPOSAL, !xBinding.is() ); 143cdf0e10cSrcweir if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_EMPTY_IS_NULL ) ) 144cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_EMPTY_IS_NULL, !xBinding.is() ); 145cdf0e10cSrcweir 146cdf0e10cSrcweir aDependentProperties.push_back( PROPERTY_ID_BOUNDCOLUMN ); 147cdf0e10cSrcweir 148cdf0e10cSrcweir if ( !xBinding.is() && m_pHelper->getCurrentBinding().is() ) 149cdf0e10cSrcweir { 150cdf0e10cSrcweir // ensure that the "transfer selection as" property is reset. Since we can't remember 151cdf0e10cSrcweir // it at the object itself, but derive it from the binding only, we have to normalize 152cdf0e10cSrcweir // it now that there *is* no binding anymore. 153cdf0e10cSrcweir setPropertyValue( PROPERTY_CELL_EXCHANGE_TYPE, makeAny( (sal_Int16) 0 ) ); 154cdf0e10cSrcweir } 155cdf0e10cSrcweir } 156cdf0e10cSrcweir break; 157cdf0e10cSrcweir 158cdf0e10cSrcweir // ----- CellRange ----- 159cdf0e10cSrcweir case PROPERTY_ID_LIST_CELL_RANGE: 160cdf0e10cSrcweir { 161cdf0e10cSrcweir // the list source related properties need to be enabled if and only if 162cdf0e10cSrcweir // there is *no* valid external list source for the control 163cdf0e10cSrcweir Reference< XListEntrySource > xSource; 164cdf0e10cSrcweir _rNewValue >>= xSource; 165cdf0e10cSrcweir 166cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_STRINGITEMLIST, !xSource.is() ); 167cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_LISTSOURCE, !xSource.is() ); 168cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_LISTSOURCETYPE, !xSource.is() ); 169cdf0e10cSrcweir 170cdf0e10cSrcweir aDependentProperties.push_back( PROPERTY_ID_BOUNDCOLUMN ); 171cdf0e10cSrcweir 172cdf0e10cSrcweir // also reset the list entries if the cell range is reset 173cdf0e10cSrcweir // #i28319# - 2004-04-27 - fs@openoffice.org 174cdf0e10cSrcweir if ( !_bFirstTimeInit ) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir try 177cdf0e10cSrcweir { 178cdf0e10cSrcweir if ( !xSource.is() ) 179cdf0e10cSrcweir setPropertyValue( PROPERTY_STRINGITEMLIST, makeAny( Sequence< ::rtl::OUString >() ) ); 180cdf0e10cSrcweir } 181cdf0e10cSrcweir catch( const Exception& ) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir OSL_ENSURE( sal_False, "OPropertyBrowserController::actuatingPropertyChanged( ListCellRange ): caught an exception while resetting the string items!" ); 184cdf0e10cSrcweir } 185cdf0e10cSrcweir } 186cdf0e10cSrcweir } 187cdf0e10cSrcweir break; // case PROPERTY_ID_LIST_CELL_RANGE 188cdf0e10cSrcweir 189cdf0e10cSrcweir // ----- DataField ----- 190cdf0e10cSrcweir case PROPERTY_ID_CONTROLSOURCE: 191cdf0e10cSrcweir { 192cdf0e10cSrcweir ::rtl::OUString sControlSource; 193cdf0e10cSrcweir _rNewValue >>= sControlSource; 194cdf0e10cSrcweir if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_BOUND_CELL ) ) 195cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_BOUND_CELL, sControlSource.getLength() == 0 ); 196cdf0e10cSrcweir } 197cdf0e10cSrcweir break; // case PROPERTY_ID_CONTROLSOURCE 198cdf0e10cSrcweir 199cdf0e10cSrcweir default: 200cdf0e10cSrcweir DBG_ERROR( "CellBindingPropertyHandler::actuatingPropertyChanged: did not register for this property!" ); 201cdf0e10cSrcweir } 202cdf0e10cSrcweir 203cdf0e10cSrcweir for ( ::std::vector< PropertyId >::const_iterator loopAffected = aDependentProperties.begin(); 204cdf0e10cSrcweir loopAffected != aDependentProperties.end(); 205cdf0e10cSrcweir ++loopAffected 206cdf0e10cSrcweir ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir impl_updateDependentProperty_nothrow( *loopAffected, _rxInspectorUI ); 209cdf0e10cSrcweir } 210cdf0e10cSrcweir } 211cdf0e10cSrcweir 212cdf0e10cSrcweir //-------------------------------------------------------------------- 213cdf0e10cSrcweir void CellBindingPropertyHandler::impl_updateDependentProperty_nothrow( PropertyId _nPropId, const Reference< XObjectInspectorUI >& _rxInspectorUI ) const 214cdf0e10cSrcweir { 215cdf0e10cSrcweir try 216cdf0e10cSrcweir { 217cdf0e10cSrcweir switch ( _nPropId ) 218cdf0e10cSrcweir { 219cdf0e10cSrcweir // ----- BoundColumn ----- 220cdf0e10cSrcweir case PROPERTY_ID_BOUNDCOLUMN: 221cdf0e10cSrcweir { 222cdf0e10cSrcweir CellBindingPropertyHandler* pNonConstThis = const_cast< CellBindingPropertyHandler* >( this ); 223cdf0e10cSrcweir Reference< XValueBinding > xBinding( pNonConstThis->getPropertyValue( PROPERTY_BOUND_CELL ), UNO_QUERY ); 224cdf0e10cSrcweir Reference< XListEntrySource > xListSource( pNonConstThis->getPropertyValue( PROPERTY_LIST_CELL_RANGE ), UNO_QUERY ); 225cdf0e10cSrcweir 226cdf0e10cSrcweir if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_BOUNDCOLUMN ) ) 227cdf0e10cSrcweir _rxInspectorUI->enablePropertyUI( PROPERTY_BOUNDCOLUMN, !xBinding.is() && !xListSource.is() ); 228cdf0e10cSrcweir } 229cdf0e10cSrcweir break; // case PROPERTY_ID_BOUNDCOLUMN 230cdf0e10cSrcweir 231cdf0e10cSrcweir } // switch 232cdf0e10cSrcweir 233cdf0e10cSrcweir } 234cdf0e10cSrcweir catch( const Exception& ) 235cdf0e10cSrcweir { 236cdf0e10cSrcweir OSL_ENSURE( sal_False, "CellBindingPropertyHandler::impl_updateDependentProperty_nothrow: caught an exception!" ); 237cdf0e10cSrcweir } 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir //-------------------------------------------------------------------- 241cdf0e10cSrcweir Any SAL_CALL CellBindingPropertyHandler::getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException) 242cdf0e10cSrcweir { 243cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 244cdf0e10cSrcweir PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) ); 245cdf0e10cSrcweir 246cdf0e10cSrcweir OSL_ENSURE( m_pHelper.get(), "CellBindingPropertyHandler::getPropertyValue: inconsistency!" ); 247cdf0e10cSrcweir // if we survived impl_getPropertyId_throw, we should have a helper, since no helper implies no properties 248cdf0e10cSrcweir 249cdf0e10cSrcweir Any aReturn; 250cdf0e10cSrcweir switch ( nPropId ) 251cdf0e10cSrcweir { 252cdf0e10cSrcweir case PROPERTY_ID_BOUND_CELL: 253cdf0e10cSrcweir { 254cdf0e10cSrcweir Reference< XValueBinding > xBinding( m_pHelper->getCurrentBinding() ); 255cdf0e10cSrcweir if ( !m_pHelper->isCellBinding( xBinding ) ) 256cdf0e10cSrcweir xBinding.clear(); 257cdf0e10cSrcweir 258cdf0e10cSrcweir aReturn <<= xBinding; 259cdf0e10cSrcweir } 260cdf0e10cSrcweir break; 261cdf0e10cSrcweir 262cdf0e10cSrcweir case PROPERTY_ID_LIST_CELL_RANGE: 263cdf0e10cSrcweir { 264cdf0e10cSrcweir Reference< XListEntrySource > xSource( m_pHelper->getCurrentListSource() ); 265cdf0e10cSrcweir if ( !m_pHelper->isCellRangeListSource( xSource ) ) 266cdf0e10cSrcweir xSource.clear(); 267cdf0e10cSrcweir 268cdf0e10cSrcweir aReturn <<= xSource; 269cdf0e10cSrcweir } 270cdf0e10cSrcweir break; 271cdf0e10cSrcweir 272cdf0e10cSrcweir case PROPERTY_ID_CELL_EXCHANGE_TYPE: 273cdf0e10cSrcweir { 274cdf0e10cSrcweir Reference< XValueBinding > xBinding( m_pHelper->getCurrentBinding() ); 275cdf0e10cSrcweir aReturn <<= (sal_Int16)( m_pHelper->isCellIntegerBinding( xBinding ) ? 1 : 0 ); 276cdf0e10cSrcweir } 277cdf0e10cSrcweir break; 278cdf0e10cSrcweir 279cdf0e10cSrcweir default: 280cdf0e10cSrcweir DBG_ERROR( "CellBindingPropertyHandler::getPropertyValue: cannot handle this!" ); 281cdf0e10cSrcweir break; 282cdf0e10cSrcweir } 283cdf0e10cSrcweir return aReturn; 284cdf0e10cSrcweir } 285cdf0e10cSrcweir 286cdf0e10cSrcweir //-------------------------------------------------------------------- 287cdf0e10cSrcweir void SAL_CALL CellBindingPropertyHandler::setPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 290cdf0e10cSrcweir PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) ); 291cdf0e10cSrcweir 292cdf0e10cSrcweir OSL_ENSURE( m_pHelper.get(), "CellBindingPropertyHandler::setPropertyValue: inconsistency!" ); 293cdf0e10cSrcweir // if we survived impl_getPropertyId_throw, we should have a helper, since no helper implies no properties 294cdf0e10cSrcweir 295cdf0e10cSrcweir try 296cdf0e10cSrcweir { 297cdf0e10cSrcweir Any aOldValue = getPropertyValue( _rPropertyName ); 298cdf0e10cSrcweir 299cdf0e10cSrcweir switch ( nPropId ) 300cdf0e10cSrcweir { 301cdf0e10cSrcweir case PROPERTY_ID_BOUND_CELL: 302cdf0e10cSrcweir { 303cdf0e10cSrcweir Reference< XValueBinding > xBinding; 304cdf0e10cSrcweir _rValue >>= xBinding; 305cdf0e10cSrcweir m_pHelper->setBinding( xBinding ); 306cdf0e10cSrcweir } 307cdf0e10cSrcweir break; 308cdf0e10cSrcweir 309cdf0e10cSrcweir case PROPERTY_ID_LIST_CELL_RANGE: 310cdf0e10cSrcweir { 311cdf0e10cSrcweir Reference< XListEntrySource > xSource; 312cdf0e10cSrcweir _rValue >>= xSource; 313cdf0e10cSrcweir m_pHelper->setListSource( xSource ); 314cdf0e10cSrcweir } 315cdf0e10cSrcweir break; 316cdf0e10cSrcweir 317cdf0e10cSrcweir case PROPERTY_ID_CELL_EXCHANGE_TYPE: 318cdf0e10cSrcweir { 319cdf0e10cSrcweir sal_Int16 nExchangeType = 0; 320cdf0e10cSrcweir OSL_VERIFY( _rValue >>= nExchangeType ); 321cdf0e10cSrcweir 322cdf0e10cSrcweir Reference< XValueBinding > xBinding = m_pHelper->getCurrentBinding( ); 323cdf0e10cSrcweir if ( xBinding.is() ) 324cdf0e10cSrcweir { 325cdf0e10cSrcweir sal_Bool bNeedIntegerBinding = ( nExchangeType == 1 ); 326cdf0e10cSrcweir if ( (bool)bNeedIntegerBinding != m_pHelper->isCellIntegerBinding( xBinding ) ) 327cdf0e10cSrcweir { 328cdf0e10cSrcweir CellAddress aAddress; 329cdf0e10cSrcweir if ( m_pHelper->getAddressFromCellBinding( xBinding, aAddress ) ) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir xBinding = m_pHelper->createCellBindingFromAddress( aAddress, bNeedIntegerBinding ); 332cdf0e10cSrcweir m_pHelper->setBinding( xBinding ); 333cdf0e10cSrcweir } 334cdf0e10cSrcweir } 335cdf0e10cSrcweir } 336cdf0e10cSrcweir } 337cdf0e10cSrcweir break; 338cdf0e10cSrcweir 339cdf0e10cSrcweir default: 340cdf0e10cSrcweir DBG_ERROR( "CellBindingPropertyHandler::setPropertyValue: cannot handle this!" ); 341cdf0e10cSrcweir break; 342cdf0e10cSrcweir } 343cdf0e10cSrcweir 344cdf0e10cSrcweir impl_setContextDocumentModified_nothrow(); 345cdf0e10cSrcweir 346cdf0e10cSrcweir Any aNewValue( getPropertyValue( _rPropertyName ) ); 347cdf0e10cSrcweir firePropertyChange( _rPropertyName, nPropId, aOldValue, aNewValue ); 348cdf0e10cSrcweir // TODO/UNOize: can't we make this a part of the base class, for all those "virtual" 349cdf0e10cSrcweir // properties? Base class'es |setPropertyValue| could call some |doSetPropertyValue|, 350cdf0e10cSrcweir // and handle the listener notification itself 351cdf0e10cSrcweir } 352cdf0e10cSrcweir catch( const Exception& ) 353cdf0e10cSrcweir { 354cdf0e10cSrcweir OSL_ENSURE( sal_False, "CellBindingPropertyHandler::setPropertyValue: caught an exception!" ); 355cdf0e10cSrcweir } 356cdf0e10cSrcweir } 357cdf0e10cSrcweir 358cdf0e10cSrcweir //-------------------------------------------------------------------- 359cdf0e10cSrcweir Any SAL_CALL CellBindingPropertyHandler::convertToPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rControlValue ) throw (UnknownPropertyException, RuntimeException) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 362cdf0e10cSrcweir Any aPropertyValue; 363cdf0e10cSrcweir 364cdf0e10cSrcweir OSL_ENSURE( m_pHelper.get(), "CellBindingPropertyHandler::convertToPropertyValue: we have no SupportedProperties!" ); 365cdf0e10cSrcweir if ( !m_pHelper.get() ) 366cdf0e10cSrcweir return aPropertyValue; 367cdf0e10cSrcweir 368cdf0e10cSrcweir PropertyId nPropId( m_pInfoService->getPropertyId( _rPropertyName ) ); 369cdf0e10cSrcweir 370cdf0e10cSrcweir ::rtl::OUString sControlValue; 371cdf0e10cSrcweir OSL_VERIFY( _rControlValue >>= sControlValue ); 372cdf0e10cSrcweir switch( nPropId ) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir case PROPERTY_ID_LIST_CELL_RANGE: 375cdf0e10cSrcweir aPropertyValue <<= m_pHelper->createCellListSourceFromStringAddress( sControlValue ); 376cdf0e10cSrcweir break; 377cdf0e10cSrcweir 378cdf0e10cSrcweir case PROPERTY_ID_BOUND_CELL: 379cdf0e10cSrcweir { 380cdf0e10cSrcweir // if we have the possibility of an integer binding, then we must preserve 381cdf0e10cSrcweir // this property's value (e.g. if the current binding is an integer binding, then 382cdf0e10cSrcweir // the newly created one must be, too) 383cdf0e10cSrcweir bool bIntegerBinding = false; 384cdf0e10cSrcweir if ( m_pHelper->isCellIntegerBindingAllowed() ) 385cdf0e10cSrcweir { 386cdf0e10cSrcweir sal_Int16 nCurrentBindingType = 0; 387cdf0e10cSrcweir getPropertyValue( PROPERTY_CELL_EXCHANGE_TYPE ) >>= nCurrentBindingType; 388cdf0e10cSrcweir bIntegerBinding = ( nCurrentBindingType != 0 ); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir aPropertyValue <<= m_pHelper->createCellBindingFromStringAddress( sControlValue, bIntegerBinding ); 391cdf0e10cSrcweir } 392cdf0e10cSrcweir break; 393cdf0e10cSrcweir 394cdf0e10cSrcweir case PROPERTY_ID_CELL_EXCHANGE_TYPE: 395cdf0e10cSrcweir m_pCellExchangeConverter->getValueFromDescription( sControlValue, aPropertyValue ); 396cdf0e10cSrcweir break; 397cdf0e10cSrcweir 398cdf0e10cSrcweir default: 399cdf0e10cSrcweir DBG_ERROR( "CellBindingPropertyHandler::convertToPropertyValue: cannot handle this!" ); 400cdf0e10cSrcweir break; 401cdf0e10cSrcweir } 402cdf0e10cSrcweir 403cdf0e10cSrcweir return aPropertyValue; 404cdf0e10cSrcweir } 405cdf0e10cSrcweir 406cdf0e10cSrcweir //-------------------------------------------------------------------- 407cdf0e10cSrcweir Any SAL_CALL CellBindingPropertyHandler::convertToControlValue( const ::rtl::OUString& _rPropertyName, 408cdf0e10cSrcweir const Any& _rPropertyValue, const Type& /*_rControlValueType*/ ) throw (UnknownPropertyException, RuntimeException) 409cdf0e10cSrcweir { 410cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 411cdf0e10cSrcweir Any aControlValue; 412cdf0e10cSrcweir 413cdf0e10cSrcweir OSL_ENSURE( m_pHelper.get(), "CellBindingPropertyHandler::convertToControlValue: we have no SupportedProperties!" ); 414cdf0e10cSrcweir if ( !m_pHelper.get() ) 415cdf0e10cSrcweir return aControlValue; 416cdf0e10cSrcweir 417cdf0e10cSrcweir PropertyId nPropId( m_pInfoService->getPropertyId( _rPropertyName ) ); 418cdf0e10cSrcweir 419cdf0e10cSrcweir switch ( nPropId ) 420cdf0e10cSrcweir { 421cdf0e10cSrcweir case PROPERTY_ID_BOUND_CELL: 422cdf0e10cSrcweir { 423cdf0e10cSrcweir Reference< XValueBinding > xBinding; 424cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 425cdf0e10cSrcweir sal_Bool bSuccess = 426cdf0e10cSrcweir #endif 427cdf0e10cSrcweir _rPropertyValue >>= xBinding; 428cdf0e10cSrcweir OSL_ENSURE( bSuccess, "CellBindingPropertyHandler::convertToControlValue: invalid value (1)!" ); 429cdf0e10cSrcweir 430cdf0e10cSrcweir // the only value binding we support so far is linking to spreadsheet cells 431cdf0e10cSrcweir aControlValue <<= m_pHelper->getStringAddressFromCellBinding( xBinding ); 432cdf0e10cSrcweir } 433cdf0e10cSrcweir break; 434cdf0e10cSrcweir 435cdf0e10cSrcweir case PROPERTY_ID_LIST_CELL_RANGE: 436cdf0e10cSrcweir { 437cdf0e10cSrcweir Reference< XListEntrySource > xSource; 438cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 439cdf0e10cSrcweir sal_Bool bSuccess = 440cdf0e10cSrcweir #endif 441cdf0e10cSrcweir _rPropertyValue >>= xSource; 442cdf0e10cSrcweir OSL_ENSURE( bSuccess, "CellBindingPropertyHandler::convertToControlValue: invalid value (2)!" ); 443cdf0e10cSrcweir 444cdf0e10cSrcweir // the only value binding we support so far is linking to spreadsheet cells 445cdf0e10cSrcweir aControlValue <<= m_pHelper->getStringAddressFromCellListSource( xSource ); 446cdf0e10cSrcweir } 447cdf0e10cSrcweir break; 448cdf0e10cSrcweir 449cdf0e10cSrcweir case PROPERTY_ID_CELL_EXCHANGE_TYPE: 450cdf0e10cSrcweir aControlValue <<= m_pCellExchangeConverter->getDescriptionForValue( _rPropertyValue ); 451cdf0e10cSrcweir break; 452cdf0e10cSrcweir 453cdf0e10cSrcweir default: 454cdf0e10cSrcweir DBG_ERROR( "CellBindingPropertyHandler::convertToControlValue: cannot handle this!" ); 455cdf0e10cSrcweir break; 456cdf0e10cSrcweir } 457cdf0e10cSrcweir 458cdf0e10cSrcweir return aControlValue; 459cdf0e10cSrcweir } 460cdf0e10cSrcweir 461cdf0e10cSrcweir //-------------------------------------------------------------------- 462cdf0e10cSrcweir Sequence< Property > SAL_CALL CellBindingPropertyHandler::doDescribeSupportedProperties() const 463cdf0e10cSrcweir { 464cdf0e10cSrcweir ::std::vector< Property > aProperties; 465cdf0e10cSrcweir 466cdf0e10cSrcweir bool bAllowCellLinking = m_pHelper.get() && m_pHelper->isCellBindingAllowed(); 467cdf0e10cSrcweir bool bAllowCellIntLinking = m_pHelper.get() && m_pHelper->isCellIntegerBindingAllowed(); 468cdf0e10cSrcweir bool bAllowListCellRange = m_pHelper.get() && m_pHelper->isListCellRangeAllowed(); 469cdf0e10cSrcweir if ( bAllowCellLinking || bAllowListCellRange || bAllowCellIntLinking ) 470cdf0e10cSrcweir { 471cdf0e10cSrcweir sal_Int32 nPos = ( bAllowCellLinking ? 1 : 0 ) 472cdf0e10cSrcweir + ( bAllowListCellRange ? 1 : 0 ) 473cdf0e10cSrcweir + ( bAllowCellIntLinking ? 1 : 0 ); 474cdf0e10cSrcweir aProperties.resize( nPos ); 475cdf0e10cSrcweir 476cdf0e10cSrcweir if ( bAllowCellLinking ) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir aProperties[ --nPos ] = Property( PROPERTY_BOUND_CELL, PROPERTY_ID_BOUND_CELL, 479cdf0e10cSrcweir ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ), 0 ); 480cdf0e10cSrcweir } 481cdf0e10cSrcweir if ( bAllowCellIntLinking ) 482cdf0e10cSrcweir { 483cdf0e10cSrcweir aProperties[ --nPos ] = Property( PROPERTY_CELL_EXCHANGE_TYPE, PROPERTY_ID_CELL_EXCHANGE_TYPE, 484cdf0e10cSrcweir ::getCppuType( static_cast< sal_Int16* >( NULL ) ), 0 ); 485cdf0e10cSrcweir } 486cdf0e10cSrcweir if ( bAllowListCellRange ) 487cdf0e10cSrcweir { 488cdf0e10cSrcweir aProperties[ --nPos ] = Property( PROPERTY_LIST_CELL_RANGE, PROPERTY_ID_LIST_CELL_RANGE, 489cdf0e10cSrcweir ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ), 0 ); 490cdf0e10cSrcweir } 491cdf0e10cSrcweir } 492cdf0e10cSrcweir 493cdf0e10cSrcweir if ( aProperties.empty() ) 494cdf0e10cSrcweir return Sequence< Property >(); 495cdf0e10cSrcweir return Sequence< Property >( &(*aProperties.begin()), aProperties.size() ); 496cdf0e10cSrcweir } 497cdf0e10cSrcweir 498cdf0e10cSrcweir //........................................................................ 499cdf0e10cSrcweir } // namespace pcr 500cdf0e10cSrcweir //........................................................................ 501