21#include <com/sun/star/beans/PropertyAttribute.hpp>
22#include <com/sun/star/resource/XStringResourceResolver.hpp>
23#include <osl/diagnose.h>
26#include <helper/property.hxx>
32#define GCM_PROPERTY_ID_POS_X 1
33#define GCM_PROPERTY_ID_POS_Y 2
34#define GCM_PROPERTY_ID_WIDTH 3
35#define GCM_PROPERTY_ID_HEIGHT 4
36#define GCM_PROPERTY_ID_NAME 5
37#define GCM_PROPERTY_ID_TABINDEX 6
38#define GCM_PROPERTY_ID_STEP 7
39#define GCM_PROPERTY_ID_TAG 8
40#define GCM_PROPERTY_ID_RESOURCERESOLVER 9
52#define DEFAULT_ATTRIBS() PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT
72 :OPropertySetAggregationHelper( m_aBHelper )
73 ,OPropertyContainer( m_aBHelper )
83 OSL_ENSURE(
nullptr != _pAggregateInstance,
"OGeometryControlModel_Base::OGeometryControlModel_Base: invalid aggregate!");
90 Reference< XCloneable > xCloneAccess(
m_xAggregate, UNO_QUERY);
104 :OPropertySetAggregationHelper( m_aBHelper )
105 ,OPropertyContainer( m_aBHelper )
113 ,m_bCloneable(_rxAggregateInstance.is())
115 osl_atomic_increment(&m_refCount);
121 OSL_ENSURE(
m_xAggregate.is(),
"OGeometryControlModel_Base::OGeometryControlModel_Base: invalid object given!");
124 _rxAggregateInstance.clear();
128 m_xAggregate->setDelegator(
static_cast< XWeak*
>(
this));
130 osl_atomic_decrement(&m_refCount);
139 Sequence< Type >
aTypes = ::comphelper::concatSequences(
140 OPropertySetAggregationHelper::getTypes(),
148 Reference< XTypeProvider > xAggregateTypeProv;
150 OSL_ENSURE( xAggregateTypeProv.is(),
"OGeometryControlModel_Base::getTypes: aggregate should be a type provider!" );
151 Sequence< Type > aAggTypes;
152 if ( xAggregateTypeProv.is() )
153 aAggTypes = xAggregateTypeProv->getTypes();
156 sal_Int32 nOldSize =
aTypes.getLength();
157 aTypes.realloc( nOldSize + aAggTypes.getLength() );
159 std::cbegin(aAggTypes),
160 std::cend(aAggTypes),
161 aTypes.getArray() + nOldSize
186 css::uno::Any aDefault;
199 default: OSL_FAIL(
"ImplGetDefaultValueByHandle - unknown Property" );
208 css::uno::Any aValue;
221 default: OSL_FAIL(
"ImplGetPropertyValueByHandle - unknown Property" );
241 default: OSL_FAIL(
"ImplSetPropertyValueByHandle - unknown Property" );
259 if (!aReturn.hasValue())
260 aReturn = OPropertySetAggregationHelper::queryInterface(_rType);
294 setAggregation(
nullptr);
305 sal_Int32 _nHandle,
const Any& _rValue)
307 return OPropertyContainer::convertFastPropertyValue(_rConvertedValue, _rOldValue, _nHandle, _rValue);
313 OPropertyContainer::setFastPropertyValue_NoBroadcast(_nHandle, _rValue);
319 OPropertyArrayAggregationHelper& rPH =
static_cast<OPropertyArrayAggregationHelper&
>(
const_cast<OGeometryControlModel_Base*
>(
this)->getInfoHelper());
321 sal_Int32 nOriginalHandle = -1;
323 if (rPH.fillAggregatePropertyInfoByHandle(&sPropName, &nOriginalHandle, _nHandle))
324 OPropertySetAggregationHelper::getFastPropertyValue(_rValue, _nHandle);
326 OPropertyContainer::getFastPropertyValue(_rValue, _nHandle);
335 return CompareProperties( aValue, aDefault ) ? css::beans::PropertyState_DEFAULT_VALUE : css::beans::PropertyState_DIRECT_VALUE;
353 return OPropertySetAggregationHelper::createPropertySetInfo(getInfoHelper());
359 OSL_ENSURE(
m_bCloneable,
"OGeometryControlModel_Base::createClone: invalid call!");
361 return Reference< XCloneable >();
365 Reference< XCloneable > xCloneAccess;
367 OSL_ENSURE(xCloneAccess.is(),
"OGeometryControlModel_Base::createClone: suspicious aggregate!");
368 if (!xCloneAccess.is())
369 return Reference< XCloneable >();
371 Reference< XCloneable > xAggregateClone = xCloneAccess->createClone();
372 OSL_ENSURE(xAggregateClone.is(),
"OGeometryControlModel_Base::createClone: suspicious return of the aggregate!");
376 OSL_ENSURE(pOwnClone,
"OGeometryControlModel_Base::createClone: invalid derivee behaviour!");
377 OSL_ENSURE(!xAggregateClone.is(),
"OGeometryControlModel_Base::createClone: invalid ctor behaviour!");
388 pOwnClone->m_aTag =
m_aTag;
392 Reference< css::script::XScriptEventsSupplier > xEventsSupplier =
393 static_cast< css::script::XScriptEventsSupplier*
>( this );
395 if( xEventsSupplier.is() )
397 Reference< XNameContainer > xEventCont = xEventsSupplier->getEvents();
398 Reference< XNameContainer > xCloneEventCont = pOwnClone->getEvents();
400 const css::uno::Sequence< OUString > aNames =
401 xEventCont->getElementNames();
403 for(
const OUString&
aName : aNames )
405 css::uno::Any aElement = xEventCont->getByName(
aName );
406 xCloneEventCont->insertByName(
aName, aElement );
424 OGCM_Base::disposing();
425 OPropertySetAggregationHelper::disposing();
427 Reference<XComponent> xComp;
437 typedef std::vector< css::uno::Sequence< css::beans::Property > >
PropSeqArray;
461 ,m_sServiceSpecifier(
std::move( _aServiceSpecifier ))
462 ,m_nPropertyMapId( 0 )
464 Reference< XPropertySetInfo > xPI;
465 if ( m_xAggregateSet.is() )
470 throw IllegalArgumentException();
473 HashMapString2Int::iterator aPropMapIdPos = gServiceSpecifierMap.find(
m_sServiceSpecifier );
474 if ( gServiceSpecifierMap.end() == aPropMapIdPos )
477 gAggregateProperties.push_back( xPI->getProperties() );
478 gAmbiguousPropertyIds.emplace_back( );
488 struct PropertyNameLess
490 bool operator()(
const Property& _rLHS,
const Property& _rRHS )
492 return _rLHS.Name < _rRHS.Name;
497 struct PropertyNameEqual
500 explicit PropertyNameEqual(
const OUString& _rCompare ) :
m_rCompare( _rCompare ) { }
502 bool operator()(
const Property& _rLHS )
512 OSL_ENSURE( _nId ==
m_nPropertyMapId,
"OCommonGeometryControlModel::createArrayHelper: invalid argument!" );
513 OSL_ENSURE( _nId <
static_cast<sal_Int32
>(gAggregateProperties.size()),
"OCommonGeometryControlModel::createArrayHelper: invalid status info (1)!" );
514 OSL_ENSURE( _nId <
static_cast<sal_Int32
>(gAmbiguousPropertyIds.size()),
"OCommonGeometryControlModel::createArrayHelper: invalid status info (2)!" );
517 Sequence< Property > aProps;
518 OPropertyContainer::describeProperties( aProps );
521 Sequence< Property > aAggregateProps = gAggregateProperties[ _nId ];
524 IntArrayArray::value_type& rDuplicateIds = gAmbiguousPropertyIds[ _nId ];
526 auto [
begin,
end] = asNonConstRange(aAggregateProps);
534 for (
const Property& rProp : std::as_const(aProps) )
537 const Property* pAggPropPos = ::std::find_if( std::cbegin(aAggregateProps), std::cend(aAggregateProps), PropertyNameEqual( rProp.Name ) );
538 if ( pAggPropPos != std::cend(aAggregateProps) )
541 ::comphelper::removeElementAt( aAggregateProps, pAggPropPos - std::cbegin(aAggregateProps) );
544 rDuplicateIds.push_back( rProp.Handle );
549 ::std::sort( rDuplicateIds.begin(), rDuplicateIds.end(), ::std::less< sal_Int32 >() );
551 return new OPropertyArrayAggregationHelper(aProps, aAggregateProps);
568 return css::uno::Sequence<sal_Int8>();
575 sal_Int32 m_nCompare;
576 explicit Int32Equal( sal_Int32 _nCompare ) : m_nCompare( _nCompare ) { }
578 bool operator()( sal_Int32 _nLHS )
580 return _nLHS == m_nCompare;
591 IntArrayArray::value_type& rDuplicateIds = gAmbiguousPropertyIds[
m_nPropertyMapId ];
593 if ( std::any_of(rDuplicateIds.begin(), rDuplicateIds.end(), Int32Equal( _nHandle )) )
600 if ( m_xAggregateSet.is() && !sPropName.isEmpty() )
601 m_xAggregateSet->setPropertyValue( sPropName, _rValue );
OUString m_sServiceSpecifier
virtual rtl::Reference< OGeometryControlModel_Base > createClone_Impl(css::uno::Reference< css::util::XCloneable > &_rxAggregateInstance) override
virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const css::uno::Any &_rValue) override
virtual ::cppu::IPropertyArrayHelper * createArrayHelper(sal_Int32 nId) const override
virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override
OCommonGeometryControlModel(css::uno::Reference< css::util::XCloneable > &_rxAgg, OUString _aServiceSpecifier)
instantiate the model
sal_Int32 m_nPropertyMapId
virtual ::cppu::IPropertyArrayHelper &SAL_CALL getInfoHelper() override
OGeometryControlModel_Base(css::uno::XAggregation *_pAggregateInstance)
virtual sal_Bool SAL_CALL convertFastPropertyValue(css::uno::Any &_rConvertedValue, css::uno::Any &_rOldValue, sal_Int32 _nHandle, const css::uno::Any &_rValue) override
virtual css::uno::Reference< css::container::XNameContainer > SAL_CALL getEvents() override
void registerProperties()
virtual void SAL_CALL getFastPropertyValue(css::uno::Any &_rValue, sal_Int32 _nHandle) const override
css::uno::Any ImplGetPropertyValueByHandle(sal_Int32 nHandle) const
virtual void SAL_CALL acquire() noexcept override
css::uno::Reference< css::resource::XStringResourceResolver > m_xStrResolver
static css::uno::Any ImplGetDefaultValueByHandle(sal_Int32 nHandle)
virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override
virtual ~OGeometryControlModel_Base() override
virtual void setPropertyToDefaultByHandle(sal_Int32 nHandle) override
virtual void SAL_CALL release() noexcept override
virtual void SAL_CALL disposing() override
css::uno::Reference< css::container::XNameContainer > mxEventContainer
css::uno::Reference< css::uno::XAggregation > m_xAggregate
virtual css::uno::Reference< css::util::XCloneable > SAL_CALL createClone() override
virtual rtl::Reference< OGeometryControlModel_Base > createClone_Impl(css::uno::Reference< css::util::XCloneable > &_rxAggregateInstance)=0
css::uno::Any SAL_CALL queryAggregation(const css::uno::Type &_aType) override
void releaseAggregation()
releases the aggregation
void ImplSetPropertyValueByHandle(sal_Int32 nHandle, const css::uno::Any &aValue)
virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const css::uno::Any &_rValue) override
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override
virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type &aType) override
virtual css::uno::Any getPropertyDefaultByHandle(sal_Int32 nHandle) const override
virtual css::beans::PropertyState getPropertyStateByHandle(sal_Int32 nHandle) override
::cppu::IPropertyArrayHelper * getArrayHelper(sal_Int32 nId)
void registerProperty(const OUString &_rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, void *_pPointerToMember, const css::uno::Type &_rMemberType)
static css::uno::Sequence< css::uno::Type > getBaseTypes()
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) SAL_OVERRIDE
virtual void SAL_CALL release() SAL_NOEXCEPT SAL_OVERRIDE
virtual css::uno::Any SAL_CALL queryAggregation(css::uno::Type const &rType) SAL_OVERRIDE
virtual void SAL_CALL acquire() SAL_NOEXCEPT SAL_OVERRIDE
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() SAL_OVERRIDE
#define GCM_PROPERTY_ID_NAME
#define GCM_PROPERTY_ID_POS_Y
constexpr OUStringLiteral GCM_PROPERTY_STEP
std::unordered_map< OUString, sal_Int32 > HashMapString2Int
#define GCM_PROPERTY_ID_RESOURCERESOLVER
#define GCM_PROPERTY_ID_TABINDEX
constexpr OUStringLiteral GCM_PROPERTY_HEIGHT
constexpr OUStringLiteral GCM_PROPERTY_POS_Y
#define GCM_PROPERTY_ID_HEIGHT
#define GCM_PROPERTY_ID_POS_X
#define GCM_PROPERTY_ID_WIDTH
std::vector< css::uno::Sequence< css::beans::Property > > PropSeqArray
constexpr OUStringLiteral GCM_PROPERTY_POS_X
constexpr OUStringLiteral GCM_PROPERTY_TAG
#define GCM_PROPERTY_ID_STEP
std::vector< ::std::vector< sal_Int32 > > IntArrayArray
constexpr OUStringLiteral GCM_PROPERTY_TABINDEX
constexpr OUStringLiteral GCM_PROPERTY_RESOURCERESOLVER
#define DEFAULT_ATTRIBS()
constexpr OUStringLiteral GCM_PROPERTY_WIDTH
#define GCM_PROPERTY_ID_TAG
constexpr OUStringLiteral GCM_PROPERTY_NAME
bool query_aggregation(const css::uno::Reference< css::uno::XAggregation > &_rxAggregate, css::uno::Reference< iface > &_rxOut)
enumrange< T >::Iterator begin(enumrange< T >)
bool CompareProperties(const css::uno::Any &r1, const css::uno::Any &r2)
OUString const m_rCompare