/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
/** * used as callback for an OPropertyArrayAggregationHelper
*/ class IPropertyInfoService
{ public: /** get the preferred handle for the given property @param _rName the property name @return the handle the property should be referred by, or -1 if there are no preferences for the given property
*/ virtual sal_Int32 getPreferredPropertyId(const OUString& _rName) = 0;
protected:
~IPropertyInfoService() {}
};
/** * used for implementing a cppu::IPropertyArrayHelper for classes * aggregating property sets
*/
#define DEFAULT_AGGREGATE_PROPERTY_ID 10000
class COMPHELPER_DLLPUBLIC OPropertyArrayAggregationHelper final : public ::cppu::IPropertyArrayHelper
{ friendclass OPropertySetAggregationHelper;
public: /** construct the object. @param _rProperties the properties of the object doing the aggregation. These properties are used without any checks, so the caller has to ensure that the names and handles are valid. @param _rAggProperties the properties of the aggregate, usually got via a call to getProperties on the XPropertySetInfo of the aggregate. The names of the properties are used without any checks, so the caller has to ensure that there are no doubles. The handles are stored for later quick access, but the outside-handles the aggregate properties get depend from the following two parameters. @param _pInfoService If not NULL, the object pointed to is used to calc handles which should be used for referring the aggregate's properties from outside. If one of the properties returned from the info service conflict with other handles already present (e.g. through _rProperties), the property is handled as if -1 was returned. If NULL (or, for a special property, a call to getPreferredPropertyId returns -1), the aggregate property(ies) get a new handle which they can be referred by from outside. @param _nFirstAggregateId if the object is about to create new handles for the aggregate properties, it uses id's ascending from this given id. No checks are made if the handle range determined by _nFirstAggregateId conflicts with other handles within _rProperties.
*/
OPropertyArrayAggregationHelper(const css::uno::Sequence< css::beans::Property>& _rProperties, const css::uno::Sequence< css::beans::Property>& _rAggProperties,
IPropertyInfoService* _pInfoService = nullptr,
sal_Int32 _nFirstAggregateId = DEFAULT_AGGREGATE_PROPERTY_ID);
/** returns information about a property of the aggregate. @param _pPropName points to a string to receive the property name. No name is returned if this is NULL. @param _pOriginalHandle points to a sal_Int32 to receive the original property handle. No original handle is returned if this is NULL. @param _nHandle the handle of the property as got by, for instance, fillHandles
@return sal_True, if _nHandle marks an aggregate property, otherwise sal_False
*/ bool fillAggregatePropertyInfoByHandle(OUString* _pPropName, sal_Int32* _pOriginalHandle,
sal_Int32 _nHandle) const;
/** returns information about a property given by handle
*/ bool getPropertyByHandle( sal_Int32 _nHandle, css::beans::Property& _rProperty ) const;
enumclass PropertyOrigin
{
Aggregate,
Delegator,
Unknown
}; /** prefer this one over the XPropertySetInfo of the aggregate!
<p>The reason is that OPropertyArrayAggregationHelper is the only instance which really knows which properties of the aggregate are to be exposed. <br/>
For instance, some derivee of OPropertySetAggregationHelper may decide to create an OPropertyArrayAggregationHelper which contains only a subset of the aggregate properties. This way, some of the aggregate properties may be hidden to the public.<br/>
When using the XPropertySetInfo of the aggregate set to determine the existence of a property, then this would return false positives.</p>
*/
PropertyOrigin classifyProperty( const OUString& _rName );
/** * helper class for implementing the property-set-related interfaces * for an object doin' aggregation * supports at least XPropertySet and XMultiPropertySet *
*/ class UNLESS_MERGELIBS(COMPHELPER_DLLPUBLIC) OPropertySetAggregationHelper :public OPropertyStateHelper
,public css::beans::XPropertiesChangeListener
,public css::beans::XVetoableChangeListener
{ friendclass internal::PropertyForwarder;
// OPropertySetHelper /** still waiting to be overwritten ... you <B>must<B/> use an OPropertyArrayAggregationHelper here, as the implementation strongly relies on this.
*/ virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper() override = 0;
/** only implemented for "forwarded" properties, every other property must be handled in the derivee, and will assert if passed herein
*/ virtual sal_Bool SAL_CALL convertFastPropertyValue( css::uno::Any& _rConvertedValue, css::uno::Any& _rOldValue, sal_Int32 _nHandle, const css::uno::Any& _rValue ) override;
/** only implemented for "forwarded" properties, every other property must be handled in the derivee, and will assert if passed herein
*/ virtualvoid SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 _nHandle, const css::uno::Any& _rValue ) override;
/** declares the property with the given (public) handle as one to be forwarded to the aggregate
Sometimes, you might want to <em>overwrite</em> properties at the aggregate. That is, though the aggregate implements this property, and still is to hold the property value, you want to do additional handling upon setting the property, but then forward the value to the aggregate.
Use this method to declare such properties.
When a "forwarded property" is set from outside, the class first calls <member>forwardingPropertyValue</member> for any preprocessing, then forwards the property value to the aggregate, and then calls <member>forwardedPropertyValue</member>.
When you declare a property as "forwarded", the class takes care for some multi-threading issues, for instance, it won't fire any property change notifications which result from forwarding a property value, unless it's safe to do so (i.e. unless our mutex is released).
/// must be called before aggregation, if aggregation is used /// /// @throws css::lang::IllegalArgumentException void setAggregation(const css::uno::Reference< css::uno::XInterface >&); void startListening();
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.