| /************************************************************** |
| * |
| * 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 <com/sun/star/beans/PropertyAttribute.hpp> |
| #include <com/sun/star/util/Date.hpp> |
| #include <com/sun/star/util/Time.hpp> |
| #include <com/sun/star/util/DateTime.hpp> |
| #include <com/sun/star/xsd/XDataType.hpp> |
| #include <com/sun/star/xsd/DataTypeClass.hpp> |
| /** === end UNO includes === **/ |
| #include <cppuhelper/implbase1.hxx> |
| #include <comphelper/uno3.hxx> |
| #include <comphelper/propertycontainer.hxx> |
| #include <comphelper/proparrhlp.hxx> |
| #include <comphelper/broadcasthelper.hxx> |
| #include "warnings_guard_unicode_regex.h" |
| |
| #include <memory> |
| |
| //........................................................................ |
| 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: |
| // <properties> |
| sal_Bool m_bIsBasic; |
| sal_Int16 m_nTypeClass; |
| ::rtl::OUString m_sName; |
| ::rtl::OUString m_sPattern; |
| sal_uInt16 m_nWST; |
| // </properties> |
| |
| ::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 <NULL/>, and is of type <member>ValueType</member> |
| */ |
| virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const = 0; |
| |
| /** translates a <member>ValueType</member> 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 <code>foo</code> is less than <code>bar</code>, the same |
| must hold for their normalizations. |
| |
| @param _rValue |
| the value to translate. Guaranteed to be not <NULL/>, and of type <member>ValueType</member> |
| @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<com::sun::star::beans::XPropertySetInfo> 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: |
| // <properties> |
| ::com::sun::star::uno::Any m_aLength; |
| ::com::sun::star::uno::Any m_aMinLength; |
| ::com::sun::star::uno::Any m_aMaxLength; |
| // </properties> |
| |
| 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 |
| |