summaryrefslogtreecommitdiff
path: root/extensions/source/propctrlr/formgeometryhandler.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/propctrlr/formgeometryhandler.cxx')
-rw-r--r--extensions/source/propctrlr/formgeometryhandler.cxx829
1 files changed, 0 insertions, 829 deletions
diff --git a/extensions/source/propctrlr/formgeometryhandler.cxx b/extensions/source/propctrlr/formgeometryhandler.cxx
deleted file mode 100644
index 9f02c35b1..000000000
--- a/extensions/source/propctrlr/formgeometryhandler.cxx
+++ /dev/null
@@ -1,829 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
-************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_extensions.hxx"
-
-#include "propertyhandler.hxx"
-#include "formmetadata.hxx"
-#include "formstrings.hxx"
-#include "handlerhelper.hxx"
-#include "cellbindinghelper.hxx"
-
-/** === begin UNO includes === **/
-#include <com/sun/star/inspection/XObjectInspectorUI.hpp>
-#include <com/sun/star/awt/XControlModel.hpp>
-#include <com/sun/star/drawing/XControlShape.hpp>
-#include <com/sun/star/container/XMap.hpp>
-#include <com/sun/star/inspection/XNumericControl.hpp>
-#include <com/sun/star/util/MeasureUnit.hpp>
-#include <com/sun/star/text/TextContentAnchorType.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/sheet/XSpreadsheet.hpp>
-#include <com/sun/star/table/XColumnRowRange.hpp>
-#include <com/sun/star/table/XCellRange.hpp>
-#include <com/sun/star/container/XChild.hpp>
-#include <com/sun/star/form/XGridColumnFactory.hpp>
-/** === end UNO includes === **/
-
-#include <cppuhelper/interfacecontainer.hxx>
-#include <comphelper/componentbase.hxx>
-#include <tools/debug.hxx>
-#include <tools/diagnose_ex.h>
-
-//........................................................................
-namespace pcr
-{
-//........................................................................
-
- /** === begin UNO using === **/
- using ::com::sun::star::uno::Reference;
- using ::com::sun::star::uno::XInterface;
- using ::com::sun::star::uno::UNO_QUERY;
- using ::com::sun::star::uno::UNO_QUERY_THROW;
- using ::com::sun::star::uno::UNO_SET_THROW;
- using ::com::sun::star::uno::Exception;
- using ::com::sun::star::uno::RuntimeException;
- using ::com::sun::star::uno::Any;
- using ::com::sun::star::uno::makeAny;
- using ::com::sun::star::uno::Sequence;
- using ::com::sun::star::uno::Type;
- using ::com::sun::star::uno::XComponentContext;
- using ::com::sun::star::beans::UnknownPropertyException;
- using ::com::sun::star::beans::Property;
- using ::com::sun::star::awt::XControlModel;
- using ::com::sun::star::drawing::XControlShape;
- using ::com::sun::star::container::XMap;
- using ::com::sun::star::inspection::LineDescriptor;
- using ::com::sun::star::inspection::XPropertyControlFactory;
- using ::com::sun::star::lang::NullPointerException;
- using ::com::sun::star::beans::Optional;
- using ::com::sun::star::inspection::XNumericControl;
- using ::com::sun::star::drawing::XShape;
- using ::com::sun::star::beans::PropertyChangeEvent;
- using ::com::sun::star::lang::EventObject;
- using ::com::sun::star::beans::XPropertySet;
- using ::com::sun::star::beans::XPropertyChangeListener;
- using ::com::sun::star::text::TextContentAnchorType;
- using ::com::sun::star::text::TextContentAnchorType_AT_PARAGRAPH;
- using ::com::sun::star::text::TextContentAnchorType_AS_CHARACTER;
- using ::com::sun::star::beans::XPropertySetInfo;
- using ::com::sun::star::inspection::XObjectInspectorUI;
- using ::com::sun::star::lang::XServiceInfo;
- using ::com::sun::star::sheet::XSpreadsheet;
- using ::com::sun::star::table::XColumnRowRange;
- using ::com::sun::star::table::XTableColumns;
- using ::com::sun::star::table::XTableRows;
- using ::com::sun::star::table::XCellRange;
- using ::com::sun::star::container::XIndexAccess;
- using ::com::sun::star::container::XChild;
- using ::com::sun::star::form::XGridColumnFactory;
- /** === end UNO using === **/
- namespace MeasureUnit = ::com::sun::star::util::MeasureUnit;
-
- typedef ::com::sun::star::awt::Point AwtPoint;
- typedef ::com::sun::star::awt::Size AwtSize;
-
- #define ANCHOR_TO_SHEET 0
- #define ANCHOR_TO_CELL 1
-
- //====================================================================
- //= BroadcastHelperBase
- //====================================================================
- class BroadcastHelperBase
- {
- protected:
- BroadcastHelperBase( ::osl::Mutex& _rMutex )
- :maBHelper( _rMutex )
- {
- }
-
- protected:
- ::cppu::OBroadcastHelper& getBroadcastHelper() { return maBHelper; }
-
- private:
- ::cppu::OBroadcastHelper maBHelper;
- };
-
- //====================================================================
- //= ShapeGeometryChangeNotifier - declaration
- //====================================================================
- /** helper class to work around the ...unfortunate implementation of property change broadcasts
- in the XShape implementation, which broadcasts way too generous and unspecified
- */
- typedef ::comphelper::ComponentBase ShapeGeometryChangeNotifier_CBase;
- typedef ::cppu::WeakImplHelper1 < ::com::sun::star::beans::XPropertyChangeListener
- > ShapeGeometryChangeNotifier_IBase;
-
- class ShapeGeometryChangeNotifier :public BroadcastHelperBase
- ,public ShapeGeometryChangeNotifier_CBase
- ,public ShapeGeometryChangeNotifier_IBase
- {
- public:
- ShapeGeometryChangeNotifier( ::cppu::OWeakObject& _rParent, ::osl::Mutex& _rParentMutex, const Reference< XShape >& _shape )
- :BroadcastHelperBase( _rParentMutex )
- ,ShapeGeometryChangeNotifier_CBase( BroadcastHelperBase::getBroadcastHelper(), ::comphelper::ComponentBase::NoInitializationNeeded() )
- ,ShapeGeometryChangeNotifier_IBase()
- ,m_rParent( _rParent )
- ,m_aPropertyChangeListeners( _rParentMutex )
- ,m_xShape( _shape )
- {
- ENSURE_OR_THROW( m_xShape.is(), "illegal shape!" );
- impl_init_nothrow();
- }
-
- // property change broadcasting
- void addPropertyChangeListener( const Reference< XPropertyChangeListener >& _listener )
- {
- m_aPropertyChangeListeners.addInterface( _listener );
- }
- void removePropertyChangeListener( const Reference< XPropertyChangeListener >& _listener )
- {
- m_aPropertyChangeListeners.removeInterface( _listener );
- }
-
- // XComponent equivalent
- void dispose()
- {
- ::osl::MutexGuard aGuard( getMutex() );
- impl_dispose_nothrow();
- }
-
- // XInterface
- virtual void SAL_CALL acquire( ) throw ()
- {
- m_rParent.acquire();
- }
-
- virtual void SAL_CALL release( ) throw ()
- {
- m_rParent.release();
- }
-
- // XPropertyChangeListener
- virtual void SAL_CALL propertyChange( const PropertyChangeEvent& _event ) throw (RuntimeException);
-
- // XEventListener
- virtual void SAL_CALL disposing( const EventObject& _event ) throw (RuntimeException);
-
- protected:
- virtual ~ShapeGeometryChangeNotifier()
- {
- if ( !getBroadcastHelper().bDisposed )
- {
- acquire();
- dispose();
- }
- }
-
- protected:
- ::cppu::OBroadcastHelper& getBroadcastHelper() { return BroadcastHelperBase::getBroadcastHelper(); }
-
- private:
- void impl_init_nothrow();
- void impl_dispose_nothrow();
-
- private:
- ::cppu::OWeakObject& m_rParent;
- ::cppu::OInterfaceContainerHelper m_aPropertyChangeListeners;
- Reference< XShape > m_xShape;
- };
-
- //====================================================================
- //= FormGeometryHandler - declaration
- //====================================================================
- class FormGeometryHandler;
- typedef HandlerComponentBase< FormGeometryHandler > FormGeometryHandler_Base;
- /** a property handler for any virtual string properties
- */
- class FormGeometryHandler : public FormGeometryHandler_Base
- {
- public:
- FormGeometryHandler(
- const Reference< XComponentContext >& _rxContext
- );
-
- static ::rtl::OUString SAL_CALL getImplementationName_static( ) throw (RuntimeException);
- static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_static( ) throw (RuntimeException);
-
- protected:
- ~FormGeometryHandler();
-
- protected:
- // XPropertyHandler overriables
- virtual Any SAL_CALL getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException);
- virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException);
- virtual LineDescriptor SAL_CALL describePropertyLine( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControlFactory >& _rxControlFactory ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException);
- virtual void SAL_CALL addPropertyChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& _rxListener ) throw (::com::sun::star::uno::RuntimeException);
- virtual void SAL_CALL removePropertyChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& _rxListener ) throw (::com::sun::star::uno::RuntimeException);
- virtual Sequence< ::rtl::OUString > SAL_CALL getActuatingProperties( ) throw (RuntimeException);
- virtual void SAL_CALL actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const Any& _rNewValue, const Any& _rOldValue, const Reference< XObjectInspectorUI >& _rxInspectorUI, sal_Bool _bFirstTimeInit ) throw (NullPointerException, RuntimeException);
-
- // OComponentHandler overridables
- virtual void SAL_CALL disposing();
-
- // PropertyHandler overridables
- virtual Sequence< Property > SAL_CALL doDescribeSupportedProperties() const;
-
- protected:
- virtual void onNewComponent();
-
- private:
- bool impl_haveTextAnchorType_nothrow() const;
- bool impl_haveSheetAnchorType_nothrow() const;
- void impl_setSheetAnchorType_nothrow( const sal_Int32 _nAnchorType ) const;
-
- private:
- Reference< XControlShape > m_xAssociatedShape;
- Reference< XPropertySet > m_xShapeProperties;
- ::rtl::Reference< ShapeGeometryChangeNotifier > m_xChangeNotifier;
- };
-
- //====================================================================
- //= FormGeometryHandler - implementation
- //====================================================================
- DBG_NAME( FormGeometryHandler )
- //--------------------------------------------------------------------
- FormGeometryHandler::FormGeometryHandler( const Reference< XComponentContext >& _rxContext )
- :FormGeometryHandler_Base( _rxContext )
- {
- DBG_CTOR( FormGeometryHandler, NULL );
- }
-
- //--------------------------------------------------------------------
- FormGeometryHandler::~FormGeometryHandler( )
- {
- if ( !rBHelper.bDisposed )
- {
- acquire();
- dispose();
- }
-
- DBG_DTOR( FormGeometryHandler, NULL );
- }
-
- //--------------------------------------------------------------------
- void FormGeometryHandler::onNewComponent()
- {
- if ( m_xChangeNotifier.is() )
- {
- m_xChangeNotifier->dispose();
- m_xChangeNotifier.clear();
- }
- m_xAssociatedShape.clear();
- m_xShapeProperties.clear();
-
- FormGeometryHandler_Base::onNewComponent();
-
- try
- {
- Reference< XControlModel > xControlModel( m_xComponent, UNO_QUERY );
- if ( xControlModel.is() )
- {
- // do not ask the map for shapes for grid control columns ....
- Reference< XChild > xCompChild( m_xComponent, UNO_QUERY_THROW );
- Reference< XGridColumnFactory > xCheckGrid( xCompChild->getParent(), UNO_QUERY );
- if ( !xCheckGrid.is() )
- {
- Reference< XMap > xControlMap( m_aContext.getContextValueByAsciiName( "ControlShapeAccess" ), UNO_QUERY_THROW );
- m_xAssociatedShape.set( xControlMap->get( makeAny( xControlModel ) ), UNO_QUERY_THROW );
- m_xShapeProperties.set( m_xAssociatedShape, UNO_QUERY_THROW );
- }
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-
- if ( m_xAssociatedShape.is() )
- m_xChangeNotifier = new ShapeGeometryChangeNotifier( *this, m_aMutex, m_xAssociatedShape.get() );
- }
-
- //--------------------------------------------------------------------
- ::rtl::OUString SAL_CALL FormGeometryHandler::getImplementationName_static( ) throw (RuntimeException)
- {
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.FormGeometryHandler" ) );
- }
-
- //--------------------------------------------------------------------
- Sequence< ::rtl::OUString > SAL_CALL FormGeometryHandler::getSupportedServiceNames_static( ) throw (RuntimeException)
- {
- Sequence< ::rtl::OUString > aSupported( 1 );
- aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.inspection.FormGeometryHandler" ) );
- return aSupported;
- }
-
- //--------------------------------------------------------------------
- Any SAL_CALL FormGeometryHandler::getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
- {
- ::osl::MutexGuard aGuard( m_aMutex );
- PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
-
- ENSURE_OR_THROW2( m_xAssociatedShape.is(), "internal error: properties, but no shape!", *this );
- ENSURE_OR_THROW2( m_xShapeProperties.is(), "internal error: no shape properties!", *this );
-
- Any aReturn;
- try
- {
- switch ( nPropId )
- {
- case PROPERTY_ID_POSITIONX:
- aReturn <<= m_xAssociatedShape->getPosition().X;
- break;
- case PROPERTY_ID_POSITIONY:
- aReturn <<= m_xAssociatedShape->getPosition().Y;
- break;
- case PROPERTY_ID_WIDTH:
- aReturn <<= m_xAssociatedShape->getSize().Width;
- break;
- case PROPERTY_ID_HEIGHT:
- aReturn <<= m_xAssociatedShape->getSize().Height;
- break;
- case PROPERTY_ID_TEXT_ANCHOR_TYPE:
- aReturn = m_xShapeProperties->getPropertyValue( PROPERTY_ANCHOR_TYPE );
- OSL_ENSURE( aReturn.hasValue(), "FormGeometryHandler::getPropertyValue: illegal anchor type!" );
- break;
- case PROPERTY_ID_SHEET_ANCHOR_TYPE:
- {
- Reference< XSpreadsheet > xAnchorSheet( m_xShapeProperties->getPropertyValue( PROPERTY_ANCHOR ), UNO_QUERY );
- aReturn <<= sal_Int32( xAnchorSheet.is() ? ANCHOR_TO_SHEET : ANCHOR_TO_CELL );
- }
- break;
-
- default:
- OSL_FAIL( "FormGeometryHandler::getPropertyValue: huh?" );
- break;
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- return aReturn;
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL FormGeometryHandler::setPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException)
- {
- ::osl::MutexGuard aGuard( m_aMutex );
- PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
-
- ENSURE_OR_THROW2( m_xAssociatedShape.is(), "internal error: properties, but no shape!", *this );
- ENSURE_OR_THROW2( m_xShapeProperties.is(), "internal error: properties, but no shape!", *this );
-
- try
- {
- switch ( nPropId )
- {
- case PROPERTY_ID_POSITIONX:
- case PROPERTY_ID_POSITIONY:
- {
- sal_Int32 nPosition(0);
- OSL_VERIFY( _rValue >>= nPosition );
-
- AwtPoint aPos( m_xAssociatedShape->getPosition() );
- if ( nPropId == PROPERTY_ID_POSITIONX )
- aPos.X = nPosition;
- else
- aPos.Y = nPosition;
- m_xAssociatedShape->setPosition( aPos );
- }
- break;
-
- case PROPERTY_ID_WIDTH:
- case PROPERTY_ID_HEIGHT:
- {
- sal_Int32 nSize(0);
- OSL_VERIFY( _rValue >>= nSize );
-
- AwtSize aSize( m_xAssociatedShape->getSize() );
- if ( nPropId == PROPERTY_ID_WIDTH )
- aSize.Width = nSize;
- else
- aSize.Height = nSize;
- m_xAssociatedShape->setSize( aSize );
- }
- break;
-
- case PROPERTY_ID_TEXT_ANCHOR_TYPE:
- m_xShapeProperties->setPropertyValue( PROPERTY_ANCHOR_TYPE, _rValue );
- break;
-
- case PROPERTY_ID_SHEET_ANCHOR_TYPE:
- {
- sal_Int32 nSheetAnchorType = 0;
- OSL_VERIFY( _rValue >>= nSheetAnchorType );
- impl_setSheetAnchorType_nothrow( nSheetAnchorType );
- }
- break;
-
- default:
- OSL_FAIL( "FormGeometryHandler::getPropertyValue: huh?" );
- break;
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
-
- //--------------------------------------------------------------------
- LineDescriptor SAL_CALL FormGeometryHandler::describePropertyLine( const ::rtl::OUString& _rPropertyName,
- const Reference< XPropertyControlFactory >& _rxControlFactory )
- throw (UnknownPropertyException, NullPointerException, RuntimeException)
- {
- ::osl::MutexGuard aGuard( m_aMutex );
- PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
-
- LineDescriptor aLineDesc( PropertyHandler::describePropertyLine( _rPropertyName, _rxControlFactory ) );
- try
- {
- bool bIsSize = false;
- switch ( nPropId )
- {
- case PROPERTY_ID_WIDTH:
- case PROPERTY_ID_HEIGHT:
- bIsSize = true;
- // NO break!
- case PROPERTY_ID_POSITIONX:
- case PROPERTY_ID_POSITIONY:
- {
- Optional< double > aZero( sal_True, 0 );
- Optional< double > aValueNotPresent( sal_False, 0 );
- aLineDesc.Control = PropertyHandlerHelper::createNumericControl(
- _rxControlFactory, 2, bIsSize ? aZero : aValueNotPresent, aValueNotPresent, sal_False );
-
- Reference< XNumericControl > xNumericControl( aLineDesc.Control, UNO_QUERY_THROW );
- xNumericControl->setValueUnit( MeasureUnit::MM_100TH );
- xNumericControl->setDisplayUnit( impl_getDocumentMeasurementUnit_throw() );
- }
- break;
-
- case PROPERTY_ID_TEXT_ANCHOR_TYPE:
- case PROPERTY_ID_SHEET_ANCHOR_TYPE:
- // default handling from PropertyHandler is sufficient
- break;
-
- default:
- OSL_FAIL( "FormGeometryHandler::describePropertyLine: huh?" );
- break;
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- return aLineDesc;
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL FormGeometryHandler::addPropertyChangeListener( const Reference< XPropertyChangeListener >& _listener ) throw (RuntimeException)
- {
- ::osl::MutexGuard aGuard( m_aMutex );
- OSL_PRECOND( m_xChangeNotifier.is(), "FormGeometryHandler::addPropertyChangeListener: no notified, implies no shape!?" );
- if ( m_xChangeNotifier.is() )
- m_xChangeNotifier->addPropertyChangeListener( _listener );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL FormGeometryHandler::removePropertyChangeListener( const Reference< XPropertyChangeListener >& _listener ) throw (RuntimeException)
- {
- ::osl::MutexGuard aGuard( m_aMutex );
- OSL_PRECOND( m_xChangeNotifier.is(), "FormGeometryHandler::removePropertyChangeListener: no notified, implies no shape!?" );
- if ( m_xChangeNotifier.is() )
- m_xChangeNotifier->removePropertyChangeListener( _listener );
- }
-
- //--------------------------------------------------------------------
- Sequence< ::rtl::OUString > SAL_CALL FormGeometryHandler::getActuatingProperties( ) throw (RuntimeException)
- {
- Sequence< ::rtl::OUString > aInterestedIn(1);
- aInterestedIn[0] = PROPERTY_TEXT_ANCHOR_TYPE;
- return aInterestedIn;
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL FormGeometryHandler::actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const Any& _rNewValue, const Any& /*_rOldValue*/, const Reference< XObjectInspectorUI >& _rxInspectorUI, sal_Bool /*_bFirstTimeInit*/ ) throw (NullPointerException, RuntimeException)
- {
- if ( !_rxInspectorUI.is() )
- throw NullPointerException();
-
- ::osl::MutexGuard aGuard( m_aMutex );
- PropertyId nActuatingPropId( impl_getPropertyId_throw( _rActuatingPropertyName ) );
-
- switch ( nActuatingPropId )
- {
- case PROPERTY_ID_TEXT_ANCHOR_TYPE:
- {
- TextContentAnchorType eAnchorType( TextContentAnchorType_AT_PARAGRAPH );
- OSL_VERIFY( _rNewValue >>= eAnchorType );
- _rxInspectorUI->enablePropertyUI( PROPERTY_POSITIONX, eAnchorType != TextContentAnchorType_AS_CHARACTER );
- }
- break;
- default:
- OSL_FAIL( "FormGeometryHandler::actuatingPropertyChanged: not registered for this property!" );
- break;
- }
- }
-
- //--------------------------------------------------------------------
- Sequence< Property > SAL_CALL FormGeometryHandler::doDescribeSupportedProperties() const
- {
- if ( !m_xAssociatedShape.is() )
- return Sequence< Property >();
-
- ::std::vector< Property > aProperties;
-
- addInt32PropertyDescription( aProperties, PROPERTY_POSITIONX );
- addInt32PropertyDescription( aProperties, PROPERTY_POSITIONY );
- addInt32PropertyDescription( aProperties, PROPERTY_WIDTH );
- addInt32PropertyDescription( aProperties, PROPERTY_HEIGHT );
-
- if ( impl_haveTextAnchorType_nothrow() )
- implAddPropertyDescription( aProperties, PROPERTY_TEXT_ANCHOR_TYPE, ::cppu::UnoType< TextContentAnchorType >::get() );
-
- if ( impl_haveSheetAnchorType_nothrow() )
- addInt32PropertyDescription( aProperties, PROPERTY_SHEET_ANCHOR_TYPE );
-
- return Sequence< Property >( &(*aProperties.begin()), aProperties.size() );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL FormGeometryHandler::disposing()
- {
- FormGeometryHandler_Base::disposing();
-
- if ( m_xChangeNotifier.is() )
- {
- m_xChangeNotifier->dispose();
- m_xChangeNotifier.clear();
- }
- }
-
- //--------------------------------------------------------------------
- bool FormGeometryHandler::impl_haveTextAnchorType_nothrow() const
- {
- ENSURE_OR_THROW( m_xShapeProperties.is(), "not to be called without shape properties" );
- try
- {
- Reference< XPropertySetInfo > xPSI( m_xShapeProperties->getPropertySetInfo(), UNO_SET_THROW );
- if ( xPSI->hasPropertyByName( PROPERTY_ANCHOR_TYPE ) )
- return true;
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- return false;
- }
-
- //--------------------------------------------------------------------
- bool FormGeometryHandler::impl_haveSheetAnchorType_nothrow() const
- {
- ENSURE_OR_THROW( m_xShapeProperties.is(), "not to be called without shape properties" );
- try
- {
- Reference< XPropertySetInfo > xPSI( m_xShapeProperties->getPropertySetInfo(), UNO_SET_THROW );
- if ( !xPSI->hasPropertyByName( PROPERTY_ANCHOR ) )
- return false;
- Reference< XServiceInfo > xSI( m_xAssociatedShape, UNO_QUERY_THROW );
- if ( xSI->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.Shape" ) ) ) )
- return true;
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- return false;
- }
-
- //--------------------------------------------------------------------
- namespace
- {
- static sal_Int32 lcl_getLowerBoundRowOrColumn( const Reference< XIndexAccess >& _rxRowsOrColumns, const bool _bRows,
- const AwtPoint& _rRelativePosition )
- {
- sal_Int32 nAccumulated = 0;
-
- const sal_Int32& rRelativePos = _bRows ? _rRelativePosition.Y : _rRelativePosition.X;
-
- sal_Int32 nElements = _rxRowsOrColumns->getCount();
- sal_Int32 currentPos = 0;
- for ( currentPos=0; currentPos<nElements; ++currentPos )
- {
- Reference< XPropertySet > xRowOrColumn( _rxRowsOrColumns->getByIndex( currentPos ), UNO_QUERY_THROW );
-
- sal_Bool bIsVisible = sal_True;
- OSL_VERIFY( xRowOrColumn->getPropertyValue( PROPERTY_IS_VISIBLE ) >>= bIsVisible );
- if ( !bIsVisible )
- continue;
-
- sal_Int32 nHeightOrWidth( 0 );
- OSL_VERIFY( xRowOrColumn->getPropertyValue( _bRows ? PROPERTY_HEIGHT : PROPERTY_WIDTH ) >>= nHeightOrWidth );
-
- if ( nAccumulated + nHeightOrWidth > rRelativePos )
- break;
-
- nAccumulated += nHeightOrWidth;
- }
-
- return currentPos;
- }
- }
-
- //--------------------------------------------------------------------
- void FormGeometryHandler::impl_setSheetAnchorType_nothrow( const sal_Int32 _nAnchorType ) const
- {
- ENSURE_OR_THROW( m_xShapeProperties.is(), "illegal to be called without shape properties." );
- try
- {
- CellBindingHelper aHelper( m_xComponent, impl_getContextDocument_nothrow() );
- // find the sheet which the control belongs to
- Reference< XSpreadsheet > xSheet;
- aHelper.getControlSheetIndex( xSheet );
-
- switch ( _nAnchorType )
- {
- case ANCHOR_TO_SHEET:
- OSL_ENSURE( xSheet.is(),
- "FormGeometryHandler::impl_setSheetAnchorType_nothrow: sheet not found!" );
- if ( xSheet.is() )
- {
- AwtPoint aPreservePosition( m_xAssociatedShape->getPosition() );
- m_xShapeProperties->setPropertyValue( PROPERTY_ANCHOR, makeAny( xSheet ) );
- m_xAssociatedShape->setPosition( aPreservePosition );
- }
- break;
-
- case ANCHOR_TO_CELL:
- {
- Reference< XColumnRowRange > xColsRows( xSheet, UNO_QUERY_THROW );
-
- // get the current anchor
- Reference< XSpreadsheet > xCurrentAnchor;
- OSL_VERIFY( m_xShapeProperties->getPropertyValue( PROPERTY_ANCHOR ) >>= xCurrentAnchor );
- OSL_ENSURE( xCurrentAnchor.is(), "FormGeometryHandler::impl_setSheetAnchorType_nothrow: only to be called when currently anchored to a sheet!" );
-
- // get the current position
- AwtPoint aRelativePosition( m_xAssociatedShape->getPosition() );
-
- Reference< XTableColumns > xCols( xColsRows->getColumns(), UNO_SET_THROW );
- sal_Int32 nNewAnchorCol = lcl_getLowerBoundRowOrColumn( xCols.get(), false, aRelativePosition );
-
- Reference< XTableRows > xRows( xColsRows->getRows(), UNO_SET_THROW );
- sal_Int32 nNewAnchorRow = lcl_getLowerBoundRowOrColumn( xRows.get(), true, aRelativePosition );
-
- Reference< XCellRange > xSheetCellRange( xSheet, UNO_QUERY_THROW );
- Any aNewAnchorCell( xSheetCellRange->getCellByPosition( nNewAnchorCol, nNewAnchorRow ) );
- m_xShapeProperties->setPropertyValue( PROPERTY_ANCHOR, aNewAnchorCell );
- }
- break;
-
- default:
- OSL_FAIL( "FormGeometryHandler::impl_setSheetAnchorType_nothrow: illegal anchor type!" );
- break;
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
-
- //====================================================================
- //= ShapeGeometryChangeNotifier - implementation
- //====================================================================
- namespace
- {
- struct EventTranslation
- {
- ::rtl::OUString sPropertyName;
- Any aNewPropertyValue;
-
- EventTranslation( const ::rtl::OUString& _propertyName, const Any& _newPropertyValue )
- :sPropertyName( _propertyName )
- ,aNewPropertyValue( _newPropertyValue )
- {
- }
- };
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL ShapeGeometryChangeNotifier::propertyChange( const PropertyChangeEvent& _event ) throw (RuntimeException)
- {
- ::comphelper::ComponentMethodGuard aGuard( *this );
-
- ::std::vector< EventTranslation > aEventTranslations;
- aEventTranslations.reserve(2);
-
- if ( _event.PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Position" ) ) )
- {
- AwtPoint aPos = m_xShape->getPosition();
- aEventTranslations.push_back( EventTranslation( PROPERTY_POSITIONX, makeAny( aPos.X ) ) );
- aEventTranslations.push_back( EventTranslation( PROPERTY_POSITIONY, makeAny( aPos.Y ) ) );
- }
- else if ( _event.PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Size" ) ) )
- {
- AwtSize aSize = m_xShape->getSize();
- aEventTranslations.push_back( EventTranslation( PROPERTY_WIDTH, makeAny( aSize.Width ) ) );
- aEventTranslations.push_back( EventTranslation( PROPERTY_HEIGHT, makeAny( aSize.Height ) ) );
- }
- else if ( _event.PropertyName == PROPERTY_ANCHOR_TYPE )
- {
- aEventTranslations.push_back( EventTranslation( PROPERTY_TEXT_ANCHOR_TYPE, makeAny( _event.NewValue ) ) );
- }
- else if ( _event.PropertyName == PROPERTY_ANCHOR )
- {
- aEventTranslations.push_back( EventTranslation( PROPERTY_SHEET_ANCHOR_TYPE, makeAny( _event.NewValue ) ) );
- }
-
- PropertyChangeEvent aTranslatedEvent( _event );
- aTranslatedEvent.Source = m_rParent;
-
- aGuard.clear();
- for ( ::std::vector< EventTranslation >::const_iterator t = aEventTranslations.begin();
- t != aEventTranslations.end();
- ++t
- )
- {
- aTranslatedEvent.PropertyName = t->sPropertyName;
- aTranslatedEvent.NewValue = t->aNewPropertyValue;
- m_aPropertyChangeListeners.notifyEach( &XPropertyChangeListener::propertyChange, aTranslatedEvent );
- }
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL ShapeGeometryChangeNotifier::disposing( const EventObject& /*_event*/ ) throw (RuntimeException)
- {
- ::comphelper::ComponentMethodGuard aGuard( *this );
- impl_dispose_nothrow();
- }
-
- //--------------------------------------------------------------------
- void ShapeGeometryChangeNotifier::impl_init_nothrow()
- {
- osl_incrementInterlockedCount( &m_refCount );
- try
- {
- Reference< XPropertySet > xShapeProperties( m_xShape, UNO_QUERY_THROW );
- xShapeProperties->addPropertyChangeListener( ::rtl::OUString(), this );
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- osl_decrementInterlockedCount( &m_refCount );
- }
-
- //--------------------------------------------------------------------
- void ShapeGeometryChangeNotifier::impl_dispose_nothrow()
- {
- try
- {
- Reference< XPropertySet > xShapeProperties( m_xShape, UNO_QUERY_THROW );
- xShapeProperties->removePropertyChangeListener( ::rtl::OUString(), this );
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-
- getBroadcastHelper().bDisposed = true;
- }
-
-//........................................................................
-} // namespace pcr
-//........................................................................
-
-extern "C" void SAL_CALL createRegistryInfo_FormGeometryHandler()
-{
- ::pcr::FormGeometryHandler::registerImplementation();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */