bump product version to 5.0.4.1
[LibreOffice.git] / extensions / source / propctrlr / propertyhandler.hxx
blobba4b8410a66fac874b2ea68d8e252ac5b9594dc4
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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 #ifndef INCLUDED_EXTENSIONS_SOURCE_PROPCTRLR_PROPERTYHANDLER_HXX
21 #define INCLUDED_EXTENSIONS_SOURCE_PROPCTRLR_PROPERTYHANDLER_HXX
23 #include "pcrcommon.hxx"
24 #include "modulepcr.hxx"
26 #include <com/sun/star/uno/XComponentContext.hpp>
27 #include <com/sun/star/beans/PropertyState.hpp>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/beans/Property.hpp>
30 #include <com/sun/star/script/XTypeConverter.hpp>
31 #include <com/sun/star/frame/XModel.hpp>
32 #include <com/sun/star/uno/Sequence.hxx>
33 #include <com/sun/star/uno/Any.hxx>
34 #include <com/sun/star/util/Date.hpp>
35 #include <com/sun/star/util/Time.hpp>
36 #include <com/sun/star/util/DateTime.hpp>
37 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 #include <com/sun/star/inspection/XPropertyHandler.hpp>
39 #include <com/sun/star/lang/XServiceInfo.hpp>
40 #include <osl/interlck.h>
41 #include <cppuhelper/compbase1.hxx>
42 #include <cppuhelper/implbase1.hxx>
43 #include <comphelper/uno3.hxx>
45 #include <memory>
46 #include <vector>
48 namespace com { namespace sun { namespace star {
49 namespace inspection {
50 struct LineDescriptor;
51 class XPropertyControlFactory;
53 } } }
55 namespace vcl { class Window; }
57 namespace pcr
61 typedef sal_Int32 PropertyId;
64 //= PropertyHandler
66 class OPropertyInfoService;
67 typedef ::cppu::WeakComponentImplHelper1 < ::com::sun::star::inspection::XPropertyHandler
68 > PropertyHandler_Base;
69 /** the base class for property handlers
71 class PropertyHandler : public PropertyHandler_Base
73 private:
74 /// cache for getSupportedProperties
75 mutable StlSyntaxSequence< ::com::sun::star::beans::Property >
76 m_aSupportedProperties;
77 mutable bool m_bSupportedPropertiesAreKnown;
79 /// helper which ensures that we can access resources as long as the instance lives
80 PcrClient m_aEnsureResAccess;
82 private:
83 /// the property listener which has been registered
84 PropertyChangeListeners m_aPropertyListeners;
86 protected:
87 mutable ::osl::Mutex m_aMutex;
88 /// the context in which the instance was created
89 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext;
90 /// the component we're inspecting
91 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xComponent;
92 /// info about our component's properties
93 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > m_xComponentPropertyInfo;
94 /// type converter, needed on various occasions
95 ::com::sun::star::uno::Reference< ::com::sun::star::script::XTypeConverter > m_xTypeConverter;
96 /// access to property meta data
97 ::std::unique_ptr< OPropertyInfoService > m_pInfoService;
99 protected:
100 PropertyHandler(
101 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext
103 virtual ~PropertyHandler();
105 // default implementations for XPropertyHandler
106 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, std::exception) SAL_OVERRIDE;
107 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL getSupportedProperties() throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
108 virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupersededProperties( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
109 virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getActuatingProperties( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
110 virtual ::com::sun::star::uno::Any SAL_CALL convertToPropertyValue( const OUString& _rPropertyName, const ::com::sun::star::uno::Any& _rControlValue ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
111 virtual ::com::sun::star::uno::Any SAL_CALL convertToControlValue( const 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, std::exception) SAL_OVERRIDE;
112 virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const OUString& _rPropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
113 virtual ::com::sun::star::inspection::LineDescriptor SAL_CALL describePropertyLine( const 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, std::exception) SAL_OVERRIDE;
114 virtual sal_Bool SAL_CALL isComposable( const OUString& _rPropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
115 virtual ::com::sun::star::inspection::InteractiveSelectionResult SAL_CALL onInteractivePropertySelection( const 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, std::exception) SAL_OVERRIDE;
116 virtual void SAL_CALL actuatingPropertyChanged( const 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, std::exception) SAL_OVERRIDE;
117 virtual void SAL_CALL addPropertyChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& _rxListener ) throw (::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
118 virtual void SAL_CALL removePropertyChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& _rxListener ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
119 virtual sal_Bool SAL_CALL suspend( sal_Bool _bSuspend ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
121 // XComponent
122 DECLARE_XCOMPONENT()
123 virtual void SAL_CALL disposing() SAL_OVERRIDE;
125 // own overridables
126 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >
127 SAL_CALL doDescribeSupportedProperties() const = 0;
129 /// called when XPropertyHandler::inspect has been called, and we thus have a new component to inspect
130 virtual void onNewComponent();
132 protected:
133 /** fires the change in a property value to our listener (if any)
134 @see addPropertyChangeListener
136 void firePropertyChange( const OUString& _rPropName, PropertyId _nPropId,
137 const ::com::sun::star::uno::Any& _rOldValue, const ::com::sun::star::uno::Any& _rNewValue );
139 /** retrieves a window which can be used as parent for dialogs
141 vcl::Window* impl_getDefaultDialogParent_nothrow() const;
143 /** retrieves the property id for a given property name
144 @throw com::sun::star::beans::UnknownPropertyException
145 if the property name is not known to our ->m_pInfoService
147 PropertyId impl_getPropertyId_throwUnknownProperty( const OUString& _rPropertyName ) const;
149 /** retrieves the property id for a given property name
150 @throw com::sun::star::uno::RuntimeException
151 if the property name is not known to our ->m_pInfoService
153 PropertyId impl_getPropertyId_throwRuntime( const OUString& _rPropertyName ) const;
156 /** retrieves the property id for a given property name
157 @returns -1
158 if the property name is not known to our ->m_pInfoService
160 PropertyId impl_getPropertyId_nothrow( const OUString& _rPropertyName ) const;
162 // helper for implementing doDescribeSupportedProperties
163 /** adds a description for the given string property to the given property vector
164 Most probably to be called from within getSupportedProperties
166 inline void addStringPropertyDescription(
167 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
168 const OUString& _rPropertyName,
169 sal_Int16 _nAttribs = 0
170 ) const;
172 /** adds a description for the given int32 property to the given property vector
174 inline void addInt32PropertyDescription(
175 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
176 const OUString& _rPropertyName,
177 sal_Int16 _nAttribs = 0
178 ) const;
180 /** adds a description for the given int16 property to the given property vector
182 inline void addInt16PropertyDescription(
183 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
184 const OUString& _rPropertyName,
185 sal_Int16 _nAttribs = 0
186 ) const;
188 /** adds a description for the given double property to the given property vector
190 inline void addDoublePropertyDescription(
191 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
192 const OUString& _rPropertyName,
193 sal_Int16 _nAttribs = 0
194 ) const;
196 /** adds a description for the given date property to the given property vector
198 inline void addDatePropertyDescription(
199 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
200 const OUString& _rPropertyName,
201 sal_Int16 _nAttribs = 0
202 ) const;
204 /** adds a description for the given time property to the given property vector
206 inline void addTimePropertyDescription(
207 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
208 const OUString& _rPropertyName,
209 sal_Int16 _nAttribs = 0
210 ) const;
212 /** adds a description for the given DateTime property to the given property vector
214 inline void addDateTimePropertyDescription(
215 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
216 const OUString& _rPropertyName,
217 sal_Int16 _nAttribs = 0
218 ) const;
220 /// adds a Property, given by name only, to a given vector of Properties
221 void implAddPropertyDescription(
222 ::std::vector< ::com::sun::star::beans::Property >& _rProperties,
223 const OUString& _rPropertyName,
224 const ::com::sun::star::uno::Type& _rType,
225 sal_Int16 _nAttribs = 0
226 ) const;
229 // helper for accessing and maintaining meta data about our supported properties
231 /** retrieves a property given by handle
233 @return
234 a pointer to the descriptor for the given properties, if it is one of our
235 supported properties, <NULL/> else.
237 @see doDescribeSupportedProperties
238 @see impl_getPropertyFromId_throw
240 const ::com::sun::star::beans::Property*
241 impl_getPropertyFromId_nothrow( PropertyId _nPropId ) const;
243 /** retrieves a property given by handle
245 @throws UnknownPropertyException
246 if the handler does not support a property with the given handle
248 @seealso doDescribeSupportedProperties
249 @see impl_getPropertyFromId_nothrow
251 const ::com::sun::star::beans::Property&
252 impl_getPropertyFromId_throw( PropertyId _nPropId ) const;
254 /** determines whether a given property id is part of our supported properties
255 @see getSupportedProperties
256 @see doDescribeSupportedProperties
258 inline bool impl_isSupportedProperty_nothrow( PropertyId _nPropId ) const
260 return impl_getPropertyFromId_nothrow( _nPropId ) != NULL;
263 /** retrieves a property given by name
265 @throws UnknownPropertyException
266 if the handler does not support a property with the given name
268 @seealso doDescribeSupportedProperties
270 const ::com::sun::star::beans::Property&
271 impl_getPropertyFromName_throw( const OUString& _rPropertyName ) const;
273 /** get the name of a property given by handle
275 inline OUString
276 impl_getPropertyNameFromId_nothrow( PropertyId _nPropId ) const;
278 /** returns the value of the ContextDocument property in the ComponentContext which was used to create
279 this handler.
281 inline ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >
282 impl_getContextDocument_nothrow() const
284 return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >(
285 m_xContext->getValueByName( "ContextDocument" ), ::com::sun::star::uno::UNO_QUERY );
288 /** marks the context document as modified
290 @see impl_getContextDocument_nothrow
292 void impl_setContextDocumentModified_nothrow() const;
294 /// determines whether our component has a given property
295 bool impl_componentHasProperty_throw( const OUString& _rPropName ) const;
297 /** determines the default measure unit for the document in which our component lives
299 sal_Int16 impl_getDocumentMeasurementUnit_throw() const;
301 private:
302 PropertyHandler( const PropertyHandler& ) SAL_DELETED_FUNCTION;
303 PropertyHandler& operator=( const PropertyHandler& ) SAL_DELETED_FUNCTION;
307 inline void PropertyHandler::addStringPropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const OUString& _rPropertyName, sal_Int16 _nAttribs ) const
309 implAddPropertyDescription( _rProperties, _rPropertyName, ::cppu::UnoType<OUString>::get(), _nAttribs );
312 inline void PropertyHandler::addInt32PropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const OUString& _rPropertyName, sal_Int16 _nAttribs ) const
314 implAddPropertyDescription( _rProperties, _rPropertyName, ::cppu::UnoType<sal_Int32>::get(), _nAttribs );
317 inline void PropertyHandler::addInt16PropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const OUString& _rPropertyName, sal_Int16 _nAttribs ) const
319 implAddPropertyDescription( _rProperties, _rPropertyName, ::cppu::UnoType<sal_Int16>::get(), _nAttribs );
322 inline void PropertyHandler::addDoublePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const OUString& _rPropertyName, sal_Int16 _nAttribs ) const
324 implAddPropertyDescription( _rProperties, _rPropertyName, ::cppu::UnoType<double>::get(), _nAttribs );
327 inline void PropertyHandler::addDatePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const OUString& _rPropertyName, sal_Int16 _nAttribs ) const
329 implAddPropertyDescription( _rProperties, _rPropertyName, ::cppu::UnoType<com::sun::star::util::Date>::get(), _nAttribs );
332 inline void PropertyHandler::addTimePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const OUString& _rPropertyName, sal_Int16 _nAttribs ) const
334 implAddPropertyDescription( _rProperties, _rPropertyName, ::cppu::UnoType<com::sun::star::util::Time>::get(), _nAttribs );
337 inline void PropertyHandler::addDateTimePropertyDescription( ::std::vector< ::com::sun::star::beans::Property >& _rProperties, const OUString& _rPropertyName, sal_Int16 _nAttribs ) const
339 implAddPropertyDescription( _rProperties, _rPropertyName, ::cppu::UnoType<com::sun::star::util::DateTime>::get(), _nAttribs );
342 inline OUString PropertyHandler::impl_getPropertyNameFromId_nothrow( PropertyId _nPropId ) const
344 const ::com::sun::star::beans::Property* pProp = impl_getPropertyFromId_nothrow( _nPropId );
345 return pProp ? pProp->Name : OUString();
349 //= PropertyHandlerComponent
351 typedef ::cppu::ImplHelper1 < ::com::sun::star::lang::XServiceInfo
352 > PropertyHandlerComponent_Base;
353 /** PropertyHandler implementation which additionally supports XServiceInfo
355 class PropertyHandlerComponent :public PropertyHandler
356 ,public PropertyHandlerComponent_Base
358 protected:
359 PropertyHandlerComponent(
360 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext
363 DECLARE_XINTERFACE()
364 DECLARE_XTYPEPROVIDER()
366 // XServiceInfo
367 virtual OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE = 0;
368 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
369 virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE = 0;
373 //= HandlerComponentBase
375 /** a PropertyHandlerComponent implementation which routes XServiceInfo::getImplementationName and
376 XServiceInfo::getSupportedServiceNames to static versions of those methods, which are part of
377 the derived class.
379 Additionally, a method <member>Create</member> is provided which takes a component context, and returns a new
380 instance of the derived class. This <member>Create</member> is used to register the implementation
381 of the derived class at the <type>PcrModule</type>.
383 Well, every time we're talking about derived class, we in fact mean the template argument of
384 <type>HandlerComponentBase</type>. But usually this equals your derived class:
385 <pre>
386 class MyHandler;
387 typedef HandlerComponentBase< MyHandler > MyHandler_Base;
388 class MyHandler : MyHandler_Base
391 public:
392 static OUString SAL_CALL getImplementationName_static( ) throw (::com::sun::star::uno::RuntimeException);
393 static ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames_static( ) throw (::com::sun::star::uno::RuntimeException);
395 </pre>
397 template < class HANDLER >
398 class HandlerComponentBase : public PropertyHandlerComponent
400 protected:
401 HandlerComponentBase( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext )
402 :PropertyHandlerComponent( _rxContext )
406 protected:
407 // XServiceInfo
408 virtual OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
409 virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
410 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 );
412 public:
413 /** registers the implementation of HANDLER at the <type>PcrModule</type>
415 static void registerImplementation();
419 template < class HANDLER >
420 OUString SAL_CALL HandlerComponentBase< HANDLER >::getImplementationName( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
422 return HANDLER::getImplementationName_static();
426 template < class HANDLER >
427 ::com::sun::star::uno::Sequence< OUString > SAL_CALL HandlerComponentBase< HANDLER >::getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
429 return HANDLER::getSupportedServiceNames_static();
433 template < class HANDLER >
434 void HandlerComponentBase< HANDLER >::registerImplementation()
436 PcrModule::getInstance().registerImplementation(
437 HANDLER::getImplementationName_static(),
438 HANDLER::getSupportedServiceNames_static(),
439 HANDLER::Create
444 template < class HANDLER >
445 ::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 )
447 return *( new HANDLER( _rxContext ) );
451 } // namespace pcr
454 #endif // INCLUDED_EXTENSIONS_SOURCE_PROPCTRLR_PROPERTYHANDLER_HXX
456 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */