1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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>
48 namespace com
{ namespace sun
{ namespace star
{
49 namespace inspection
{
50 struct LineDescriptor
;
51 class XPropertyControlFactory
;
55 namespace vcl
{ class Window
; }
61 typedef sal_Int32 PropertyId
;
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
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
;
83 /// the property listener which has been registered
84 PropertyChangeListeners m_aPropertyListeners
;
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
;
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
;
123 virtual void SAL_CALL
disposing() SAL_OVERRIDE
;
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();
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
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
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
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
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
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
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
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
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
229 // helper for accessing and maintaining meta data about our supported properties
231 /** retrieves a property given by handle
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
276 impl_getPropertyNameFromId_nothrow( PropertyId _nPropId
) const;
278 /** returns the value of the ContextDocument property in the ComponentContext which was used to create
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;
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
359 PropertyHandlerComponent(
360 const ::com::sun::star::uno::Reference
< ::com::sun::star::uno::XComponentContext
>& _rxContext
364 DECLARE_XTYPEPROVIDER()
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
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:
387 typedef HandlerComponentBase< MyHandler > MyHandler_Base;
388 class MyHandler : MyHandler_Base
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);
397 template < class HANDLER
>
398 class HandlerComponentBase
: public PropertyHandlerComponent
401 HandlerComponentBase( const ::com::sun::star::uno::Reference
< ::com::sun::star::uno::XComponentContext
>& _rxContext
)
402 :PropertyHandlerComponent( _rxContext
)
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
);
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(),
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
) );
454 #endif // INCLUDED_EXTENSIONS_SOURCE_PROPCTRLR_PROPERTYHANDLER_HXX
456 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */