diff options
Diffstat (limited to 'extensions/source/propctrlr/propertyhandler.hxx')
-rw-r--r-- | extensions/source/propctrlr/propertyhandler.hxx | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/extensions/source/propctrlr/propertyhandler.hxx b/extensions/source/propctrlr/propertyhandler.hxx new file mode 100644 index 000000000000..073debdccda5 --- /dev/null +++ b/extensions/source/propctrlr/propertyhandler.hxx @@ -0,0 +1,457 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef EXTENSIONS_SOURCE_PROPCTRLR_PROPERTYHANDLER_HXX +#define EXTENSIONS_SOURCE_PROPCTRLR_PROPERTYHANDLER_HXX + +#include "pcrcomponentcontext.hxx" +#include "pcrcommon.hxx" +#ifndef _EXTENSIONS_PROPCTRLR_MODULEPCR_HXX_ +#include "modulepcr.hxx" +#endif + +/** === begin UNO includes === **/ +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/beans/PropertyState.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/Property.hpp> +#include <com/sun/star/script/XTypeConverter.hpp> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/util/Date.hpp> +#include <com/sun/star/util/Time.hpp> +#include <com/sun/star/util/DateTime.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/inspection/XPropertyHandler.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +/** === end UNO includes === **/ +#include <osl/interlck.h> +#include <cppuhelper/compbase1.hxx> +#include <cppuhelper/implbase1.hxx> +#include <comphelper/uno3.hxx> + +#include <memory> +#include <vector> + +namespace com { namespace sun { namespace star { + namespace inspection { + struct LineDescriptor; + class XPropertyControlFactory; + } +} } } + +class Window; +//........................................................................ +namespace pcr +{ +//........................................................................ + + typedef sal_Int32 PropertyId; + + //==================================================================== + //= PropertyHandler + //==================================================================== + class OPropertyInfoService; + typedef ::cppu::WeakComponentImplHelper1 < ::com::sun::star::inspection::XPropertyHandler + > PropertyHandler_Base; + /** the base class for property handlers + */ + class PropertyHandler : public PropertyHandler_Base + { + private: + /// cache for getSupportedProperties + mutable StlSyntaxSequence< ::com::sun::star::beans::Property > + m_aSupportedProperties; + mutable bool m_bSupportedPropertiesAreKnown; + + /// helper which ensures that we can access resources as long as the instance lives + PcrClient m_aEnsureResAccess; + + private: + /// the property listener which has been registered + PropertyChangeListeners m_aPropertyListeners; + + protected: + mutable ::osl::Mutex m_aMutex; + /// the context in which the instance was created + ComponentContext m_aContext; + /// the component we're inspecting + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xComponent; + /// info about our component's properties + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > m_xComponentPropertyInfo; + /// type converter, needed on various occasions + ::com::sun::star::uno::Reference< ::com::sun::star::script::XTypeConverter > m_xTypeConverter; + /// access to property meta data + ::std::auto_ptr< OPropertyInfoService > m_pInfoService; + + protected: + PropertyHandler( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext + ); + ~PropertyHandler(); + + // default implementations for XPropertyHandler + virtual void SAL_CALL inspect( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxIntrospectee ) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::NullPointerException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL getSupportedProperties() throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupersededProperties( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getActuatingProperties( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Any SAL_CALL convertToPropertyValue( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Any& _rControlValue ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Any SAL_CALL convertToControlValue( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Any& _rPropertyValue, const ::com::sun::star::uno::Type& _rControlValueType ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& _rPropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::inspection::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 ::sal_Bool SAL_CALL isComposable( const ::rtl::OUString& _rPropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::inspection::InteractiveSelectionResult SAL_CALL onInteractivePropertySelection( const ::rtl::OUString& _rPropertyName, sal_Bool _bPrimary, ::com::sun::star::uno::Any& _rData, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XObjectInspectorUI >& _rxInspectorUI ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const ::com::sun::star::uno::Any& _rNewValue, const ::com::sun::star::uno::Any& _rOldValue, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XObjectInspectorUI >& _rxInspectorUI, sal_Bool _bFirstTimeInit ) throw (::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 sal_Bool SAL_CALL suspend( sal_Bool _bSuspend ) throw (::com::sun::star::uno::RuntimeException); + + // XComponent + DECLARE_XCOMPONENT() + virtual void SAL_CALL disposing(); + + // own overridables + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > + SAL_CALL doDescribeSupportedProperties() const = 0; + + /// called when XPropertyHandler::inspect has been called, and we thus have a new component to inspect + virtual void onNewComponent(); + + protected: + /** fires the change in a property value to our listener (if any) + @see addPropertyChangeListener + */ + void firePropertyChange( const ::rtl::OUString& _rPropName, PropertyId _nPropId, + const ::com::sun::star::uno::Any& _rOldValue, const ::com::sun::star::uno::Any& _rNewValue ) SAL_THROW(()); + + /** retrieves a window which can be used as parent for dialogs + */ + Window* impl_getDefaultDialogParent_nothrow() const; + + /** retrieves the property id for a given property name + @throw com::sun::star::beans::UnknownPropertyException + if the property name is not known to our ->m_pInfoService + */ + PropertyId impl_getPropertyId_throw( const ::rtl::OUString& _rPropertyName ) const; + + //------------------------------------------------------------------------------- + // helper for implementing doDescribeSupportedProperties + /** adds a description for the given string property to the given property vector + Most probably to be called from within getSupportedProperties + */ + inline void addStringPropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + sal_Int16 _nAttribs = 0 + ) const; + + /** adds a description for the given int32 property to the given property vector + */ + inline void addInt32PropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + sal_Int16 _nAttribs = 0 + ) const; + + /** adds a description for the given int16 property to the given property vector + */ + inline void addInt16PropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + sal_Int16 _nAttribs = 0 + ) const; + + /** adds a description for the given double property to the given property vector + */ + inline void addDoublePropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + sal_Int16 _nAttribs = 0 + ) const; + + /** adds a description for the given date property to the given property vector + */ + inline void addDatePropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + sal_Int16 _nAttribs = 0 + ) const; + + /** adds a description for the given time property to the given property vector + */ + inline void addTimePropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + sal_Int16 _nAttribs = 0 + ) const; + + /** adds a description for the given DateTime property to the given property vector + */ + inline void addDateTimePropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + sal_Int16 _nAttribs = 0 + ) const; + + /// adds a Property, given by name only, to a given vector of Properties + void implAddPropertyDescription( + ::std::vector< ::com::sun::star::beans::Property >& _rProperties, + const ::rtl::OUString& _rPropertyName, + const ::com::sun::star::uno::Type& _rType, + sal_Int16 _nAttribs = 0 + ) const; + + //------------------------------------------------------------------------------- + // helper for accessing and maintaining meta data about our supported properties + + /** retrieves a property given by handle + + @return + a pointer to the descriptor for the given properties, if it is one of our + supported properties, <NULL/> else. + + @see doDescribeSupportedProperties + @see impl_getPropertyFromId_throw + */ + const ::com::sun::star::beans::Property* + impl_getPropertyFromId_nothrow( PropertyId _nPropId ) const; + + /** retrieves a property given by handle + + @throws UnknownPropertyException + if the handler does not support a property with the given handle + + @seealso doDescribeSupportedProperties + @see impl_getPropertyFromId_nothrow + */ + const ::com::sun::star::beans::Property& + impl_getPropertyFromId_throw( PropertyId _nPropId ) const; + + /** determines whether a given property id is part of our supported properties + @see getSupportedProperties + @see doDescribeSupportedProperties + */ + inline bool impl_isSupportedProperty_nothrow( PropertyId _nPropId ) const + { + return impl_getPropertyFromId_nothrow( _nPropId ) != NULL; + } + + /** retrieves a property given by name + + @throws UnknownPropertyException + if the handler does not support a property with the given name + + @seealso doDescribeSupportedProperties + */ + const ::com::sun::star::beans::Property& + impl_getPropertyFromName_throw( const ::rtl::OUString& _rPropertyName ) const; + + /** get the name of a property given by handle + */ + inline ::rtl::OUString + impl_getPropertyNameFromId_nothrow( PropertyId _nPropId ) const; + + /** returns the value of the ContextDocument property in the ComponentContext which was used to create + this handler. + */ + inline ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > + impl_getContextDocument_nothrow() const + { + return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >( + m_aContext.getContextValueByAsciiName( "ContextDocument" ), ::com::sun::star::uno::UNO_QUERY ); + } + + /** marks the context document as modified + + @see impl_getContextDocument_nothrow + */ + void impl_setContextDocumentModified_nothrow() const; + + /// determines whether our component has a given property + bool impl_componentHasProperty_throw( const ::rtl::OUString& _rPropName ) const; + + /** determines the default measure unit for the document in which our component lives + */ + sal_Int16 impl_getDocumentMeasurementUnit_throw() const; + + private: + PropertyHandler(); // never implemented + PropertyHandler( const PropertyHandler& ); // never implemented + PropertyHandler& operator=( const PropertyHandler& ); // never implemented + }; + + //-------------------------------------------------------------------- + inline void PropertyHandler::addStringPropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const ::rtl::OUString& _rPropertyName, sal_Int16 _nAttribs ) const + { + implAddPropertyDescription( _rProperties, _rPropertyName, ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ), _nAttribs ); + } + + inline void PropertyHandler::addInt32PropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const ::rtl::OUString& _rPropertyName, sal_Int16 _nAttribs ) const + { + implAddPropertyDescription( _rProperties, _rPropertyName, ::getCppuType( static_cast< sal_Int32* >( NULL ) ), _nAttribs ); + } + + inline void PropertyHandler::addInt16PropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const ::rtl::OUString& _rPropertyName, sal_Int16 _nAttribs ) const + { + implAddPropertyDescription( _rProperties, _rPropertyName, ::getCppuType( static_cast< sal_Int16* >( NULL ) ), _nAttribs ); + } + + inline void PropertyHandler::addDoublePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const ::rtl::OUString& _rPropertyName, sal_Int16 _nAttribs ) const + { + implAddPropertyDescription( _rProperties, _rPropertyName, ::getCppuType( static_cast< double* >( NULL ) ), _nAttribs ); + } + + inline void PropertyHandler::addDatePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const ::rtl::OUString& _rPropertyName, sal_Int16 _nAttribs ) const + { + implAddPropertyDescription( _rProperties, _rPropertyName, ::getCppuType( static_cast< com::sun::star::util::Date* >( NULL ) ), _nAttribs ); + } + + inline void PropertyHandler::addTimePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const ::rtl::OUString& _rPropertyName, sal_Int16 _nAttribs ) const + { + implAddPropertyDescription( _rProperties, _rPropertyName, ::getCppuType( static_cast< com::sun::star::util::Time* >( NULL ) ), _nAttribs ); + } + + inline void PropertyHandler::addDateTimePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const ::rtl::OUString& _rPropertyName, sal_Int16 _nAttribs ) const + { + implAddPropertyDescription( _rProperties, _rPropertyName, ::getCppuType( static_cast< com::sun::star::util::DateTime* >( NULL ) ), _nAttribs ); + } + + inline ::rtl::OUString PropertyHandler::impl_getPropertyNameFromId_nothrow( PropertyId _nPropId ) const + { + const ::com::sun::star::beans::Property* pProp = impl_getPropertyFromId_nothrow( _nPropId ); + return pProp ? pProp->Name : ::rtl::OUString(); + } + + //==================================================================== + //= PropertyHandlerComponent + //==================================================================== + typedef ::cppu::ImplHelper1 < ::com::sun::star::lang::XServiceInfo + > PropertyHandlerComponent_Base; + /** PropertyHandler implementation which additionally supports XServiceInfo + */ + class PropertyHandlerComponent :public PropertyHandler + ,public PropertyHandlerComponent_Base + { + protected: + PropertyHandlerComponent( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext + ); + + DECLARE_XINTERFACE() + DECLARE_XTYPEPROVIDER() + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException) = 0; + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException) = 0; + }; + + //==================================================================== + //= HandlerComponentBase + //==================================================================== + /** a PropertyHandlerComponent implementation which routes XServiceInfo::getImplementationName and + XServiceInfo::getSupportedServiceNames to static versions of those methods, which are part of + the derived class. + + Additionally, a method <member>Create</member> is provided which takes a component context, and returns a new + instance of the derived class. This <member>Create</member> is used to register the implementation + of the derived class at the <type>PcrModule</type>. + + Well, every time we're talking about derived class, we in fact mean the template argument of + <type>HandlerComponentBase</type>. But usually this equals your derived class: + <pre> + class MyHandler; + typedef HandlerComponentBase< MyHandler > MyHandler_Base; + class MyHandler : MyHandler_Base + { + ... + public: + static ::rtl::OUString SAL_CALL getImplementationName_static( ) throw (::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_static( ) throw (::com::sun::star::uno::RuntimeException); + }; + </pre> + */ + template < class HANDLER > + class HandlerComponentBase : public PropertyHandlerComponent + { + protected: + HandlerComponentBase( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext ) + :PropertyHandlerComponent( _rxContext ) + { + } + + protected: + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL Create( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext ); + + public: + /** registers the implementation of HANDLER at the <type>PcrModule</type> + */ + static void registerImplementation(); + }; + + //-------------------------------------------------------------------- + template < class HANDLER > + ::rtl::OUString SAL_CALL HandlerComponentBase< HANDLER >::getImplementationName( ) throw (::com::sun::star::uno::RuntimeException) + { + return HANDLER::getImplementationName_static(); + } + + //-------------------------------------------------------------------- + template < class HANDLER > + ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL HandlerComponentBase< HANDLER >::getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException) + { + return HANDLER::getSupportedServiceNames_static(); + } + + //-------------------------------------------------------------------- + template < class HANDLER > + void HandlerComponentBase< HANDLER >::registerImplementation() + { + PcrModule::getInstance().registerImplementation( + HANDLER::getImplementationName_static(), + HANDLER::getSupportedServiceNames_static(), + HANDLER::Create + ); + } + + //-------------------------------------------------------------------- + template < class HANDLER > + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL HandlerComponentBase< HANDLER >::Create( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext ) + { + return *( new HANDLER( _rxContext ) ); + } + +//........................................................................ +} // namespace pcr +//........................................................................ + +#endif // EXTENSIONS_SOURCE_PROPCTRLR_PROPERTYHANDLER_HXX + |