/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef FORMS_SOURCE_XFORMS_DATATYPES_HXX #define FORMS_SOURCE_XFORMS_DATATYPES_HXX /** === begin UNO includes === **/ #include #include #include #include #include #include /** === end UNO includes === **/ #include #include #include #include #include #include "warnings_guard_unicode_regex.h" #include //........................................................................ namespace xforms { //........................................................................ //==================================================================== //= OXSDDataType //==================================================================== typedef ::cppu::WeakImplHelper1 < ::com::sun::star::xsd::XDataType > OXSDDataType_Base; typedef ::comphelper::OMutexAndBroadcastHelper OXSDDataType_BBase; typedef ::comphelper::OPropertyContainer OXSDDataType_PBase; class OXSDDataType :public OXSDDataType_Base ,public OXSDDataType_BBase // order matters: OMutexAndBroadcastHelper before ,public OXSDDataType_PBase // OPropertyContainer { private: // sal_Bool m_bIsBasic; sal_Int16 m_nTypeClass; ::rtl::OUString m_sName; ::rtl::OUString m_sPattern; sal_uInt16 m_nWST; // ::std::auto_ptr< U_NAMESPACE_QUALIFIER RegexMatcher > m_pPatternMatcher; bool m_bPatternMatcherDirty; protected: sal_Bool isBasic() const { return m_bIsBasic; } sal_Int16 getTypeClass() const { return m_nTypeClass; } const ::rtl::OUString& getName() const { return m_sName; } private: OXSDDataType( ); // never implemented OXSDDataType( const OXSDDataType& ); // never implemented OXSDDataType& operator=( const OXSDDataType& ); // never implemented protected: // create basic data type OXSDDataType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass ); ~OXSDDataType(); public: DECLARE_XINTERFACE() DECLARE_XTYPEPROVIDER() virtual ::rtl::OUString SAL_CALL getName( ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::util::VetoException); virtual ::rtl::OUString SAL_CALL getPattern() throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setPattern( const ::rtl::OUString& _pattern ) throw (::com::sun::star::uno::RuntimeException); virtual sal_Int16 SAL_CALL getWhiteSpaceTreatment() throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setWhiteSpaceTreatment( sal_Int16 _whitespacetreatment ) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException); virtual sal_Bool SAL_CALL getIsBasic() throw (::com::sun::star::uno::RuntimeException); virtual sal_Int16 SAL_CALL getTypeClass() throw (::com::sun::star::uno::RuntimeException); virtual sal_Bool SAL_CALL validate( const ::rtl::OUString& value ) throw (::com::sun::star::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL explainInvalid( const ::rtl::OUString& value ) throw (::com::sun::star::uno::RuntimeException); // XPropertySet - is a base of XDataType and needs to be disambiguated virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); public: OXSDDataType* clone( const ::rtl::OUString& _rNewName ) const; protected: // XPropertySet and friends virtual sal_Bool SAL_CALL convertFastPropertyValue( ::com::sun::star::uno::Any& _rConvertedValue, ::com::sun::star::uno::Any& _rOldValue, sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rValue ) throw(::com::sun::star::lang::IllegalArgumentException); virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw (::com::sun::star::uno::Exception); // --- own overridables --- // helper for implementing cloning of data types virtual OXSDDataType* createClone( const ::rtl::OUString& _rName ) const = 0; virtual void initializeClone( const OXSDDataType& _rCloneSource ); // helper method for validate and explainInvalid virtual sal_uInt16 _validate( const ::rtl::OUString& value ); virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason ); // helper method for checking properties values which are to be set virtual bool checkPropertySanity( sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rNewValue, ::rtl::OUString& _rErrorMessage ); // register properties implemented by this instance - call the base class when overriding virtual void registerProperties(); }; //==================================================================== //= helper for deriving from OXSDDataType //==================================================================== #define DECLARE_DEFAULT_CLONING( classname ) \ virtual OXSDDataType* createClone( const ::rtl::OUString& _rName ) const; \ virtual void initializeClone( const OXSDDataType& _rCloneSource ); \ void initializeTypedClone( const classname& _rCloneSource ); #define IMPLEMENT_DEFAULT_CLONING( classname, baseclass ) \ OXSDDataType* classname::createClone( const ::rtl::OUString& _rName ) const \ { \ return new classname( _rName ); \ } \ void classname::initializeClone( const OXSDDataType& _rCloneSource ) \ { \ baseclass::initializeClone( _rCloneSource ); \ initializeTypedClone( static_cast< const classname& >( _rCloneSource ) ); \ } \ #define IMPLEMENT_DEFAULT_TYPED_CLONING( classname, baseclass ) \ OXSDDataType* classname::createClone( const ::rtl::OUString& _rName ) const \ { \ return new classname( _rName, getTypeClass() ); \ } \ void classname::initializeClone( const OXSDDataType& _rCloneSource ) \ { \ baseclass::initializeClone( _rCloneSource ); \ initializeTypedClone( static_cast< const classname& >( _rCloneSource ) ); \ } \ #define REGISTER_VOID_PROP( prop, memberAny, type ) \ registerMayBeVoidProperty( PROPERTY_##prop, PROPERTY_ID_##prop, ::com::sun::star::beans::PropertyAttribute::BOUND | ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, \ &memberAny, ::getCppuType( static_cast< type* >( NULL ) ) ); //==================================================================== //= OValueLimitedType_Base //==================================================================== class OValueLimitedType_Base : public OXSDDataType { protected: ::com::sun::star::uno::Any m_aMaxInclusive; ::com::sun::star::uno::Any m_aMaxExclusive; ::com::sun::star::uno::Any m_aMinInclusive; ::com::sun::star::uno::Any m_aMinExclusive; double m_fCachedMaxInclusive; double m_fCachedMaxExclusive; double m_fCachedMinInclusive; double m_fCachedMinExclusive; protected: OValueLimitedType_Base( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass ); virtual void initializeClone( const OXSDDataType& _rCloneSource ); void initializeTypedClone( const OValueLimitedType_Base& _rCloneSource ); // XPropertySet and friends virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw (::com::sun::star::uno::Exception); // OXSDDataType overridables virtual bool _getValue( const ::rtl::OUString& value, double& fValue ); virtual sal_uInt16 _validate( const ::rtl::OUString& value ); virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason ); // own overridables /** translate a given value into a human-readable string The value is guaranteed to be not , and is of type ValueType */ virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const = 0; /** translates a ValueType value into a double value The normalization must respect the "<" and "==" relations on the value space. That is, if two values are equal, their normalizations must be equal, too. Similarly, if foo is less than bar, the same must hold for their normalizations. @param _rValue the value to translate. Guaranteed to be not , and of type ValueType @param _rDoubleValue output parameter to hold the resulting double value */ virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const = 0; }; //==================================================================== //= OValueLimitedType //==================================================================== template < typename VALUE_TYPE > class OValueLimitedType : public OValueLimitedType_Base { protected: typedef VALUE_TYPE ValueType; inline const ::com::sun::star::uno::Type& getCppuType() const { return ::getCppuType( static_cast< ValueType* >( NULL ) ); } protected: OValueLimitedType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass ); // OXSDDataType overridables virtual void registerProperties(); }; //==================================================================== //= ODerivedDataType //==================================================================== /** helper class for implementing interfaces derived from XDataType */ template< typename CONCRETE_DATA_TYPE_IMPL, typename SUPERCLASS = OXSDDataType > class ODerivedDataType :public SUPERCLASS ,::comphelper::OPropertyArrayUsageHelper< CONCRETE_DATA_TYPE_IMPL > { private: bool m_bPropertiesRegistered; protected: ODerivedDataType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass ); protected: // OPropertyArrayUsageHelper virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; // XPropertySet virtual com::sun::star::uno::Reference SAL_CALL getPropertySetInfo() throw(com::sun::star::uno::RuntimeException); virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); }; //==================================================================== //= OBooleanType //==================================================================== class OBooleanType; typedef ODerivedDataType< OBooleanType > OBooleanType_Base; class OBooleanType : public OBooleanType_Base { public: OBooleanType( const ::rtl::OUString& _rName ); protected: DECLARE_DEFAULT_CLONING( OBooleanType ) // OXSDDataType overridables virtual sal_uInt16 _validate( const ::rtl::OUString& value ); virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason ); }; //==================================================================== //= OStringType //==================================================================== class OStringType; typedef ODerivedDataType< OStringType > OStringType_Base; class OStringType :public OStringType_Base { protected: // ::com::sun::star::uno::Any m_aLength; ::com::sun::star::uno::Any m_aMinLength; ::com::sun::star::uno::Any m_aMaxLength; // public: OStringType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass /* = ::com::sun::star::xsd::DataTypeClass::STRING */ ); protected: DECLARE_DEFAULT_CLONING( OStringType ) // OXSDDataType overridables virtual sal_uInt16 _validate( const ::rtl::OUString& value ); virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason ); virtual bool checkPropertySanity( sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rNewValue, ::rtl::OUString& _rErrorMessage ); virtual void registerProperties(); }; //==================================================================== //= ODecimalType //==================================================================== class ODecimalType; typedef ODerivedDataType< ODecimalType, OValueLimitedType< double > > ODecimalType_Base; class ODecimalType : public ODecimalType_Base { protected: ::com::sun::star::uno::Any m_aTotalDigits; ::com::sun::star::uno::Any m_aFractionDigits; public: ODecimalType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass /* = ::com::sun::star::xsd::DataTypeClass::DECIMAL */ ); protected: DECLARE_DEFAULT_CLONING( ODecimalType ) // OXSDDataType overridables virtual sal_uInt16 _validate( const ::rtl::OUString& value ); virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason ); virtual void registerProperties(); // OValueLimitedType overridables virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const; virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const; private: using ODecimalType_Base::initializeTypedClone; }; //==================================================================== //= //==================================================================== #define DEFAULT_DECLARE_SUBTYPE( classname, valuetype ) \ class classname; \ typedef ODerivedDataType< classname, OValueLimitedType< valuetype > > classname##_Base; \ class classname : public classname##_Base \ { \ public: \ classname( const ::rtl::OUString& _rName ); \ \ protected: \ DECLARE_DEFAULT_CLONING( classname ) \ \ /* OXSDDataType overridables */ \ virtual sal_uInt16 _validate( const ::rtl::OUString& value ); \ virtual bool _getValue( const ::rtl::OUString& value, double& fValue ); \ \ /* OValueLimitedType overridables */ \ virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const; \ virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const; \ \ private: \ using classname##_Base::initializeTypedClone; \ }; //==================================================================== //= ODateType //==================================================================== DEFAULT_DECLARE_SUBTYPE( ODateType, ::com::sun::star::util::Date ) //==================================================================== //= OTimeType //==================================================================== DEFAULT_DECLARE_SUBTYPE( OTimeType, ::com::sun::star::util::Time ) //==================================================================== //= ODateTimeType //==================================================================== DEFAULT_DECLARE_SUBTYPE( ODateTimeType, ::com::sun::star::util::DateTime ) //==================================================================== //= OShortIntegerType //==================================================================== class OShortIntegerType; typedef ODerivedDataType< OShortIntegerType, OValueLimitedType< sal_Int16 > > OShortIntegerType_Base; class OShortIntegerType : public OShortIntegerType_Base { public: OShortIntegerType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass ); protected: DECLARE_DEFAULT_CLONING( OShortIntegerType ) // OXSDDataType overridables virtual bool _getValue( const ::rtl::OUString& value, double& fValue ); // OValueLimitedType overridables virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const; virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const; private: using OShortIntegerType_Base::initializeTypedClone; }; //........................................................................ } // namespace xforms //........................................................................ #endif // FORMS_SOURCE_XFORMS_DATATYPES_HXX