Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #ifndef FORMS_SOURCE_XFORMS_DATATYPES_HXX
21 : #define FORMS_SOURCE_XFORMS_DATATYPES_HXX
22 :
23 : #include <com/sun/star/beans/PropertyAttribute.hpp>
24 : #include <com/sun/star/util/Date.hpp>
25 : #include <com/sun/star/util/Time.hpp>
26 : #include <com/sun/star/util/DateTime.hpp>
27 : #include <com/sun/star/xsd/XDataType.hpp>
28 : #include <com/sun/star/xsd/DataTypeClass.hpp>
29 : #include <cppuhelper/implbase1.hxx>
30 : #include <comphelper/uno3.hxx>
31 : #include <comphelper/propertycontainer.hxx>
32 : #include <comphelper/proparrhlp.hxx>
33 : #include <comphelper/broadcasthelper.hxx>
34 : #include "warnings_guard_unicode_regex.h"
35 :
36 : #include <memory>
37 :
38 : //........................................................................
39 : namespace xforms
40 : {
41 : //........................................................................
42 :
43 : //====================================================================
44 : //= OXSDDataType
45 : //====================================================================
46 : typedef ::cppu::WeakImplHelper1 < ::com::sun::star::xsd::XDataType
47 : > OXSDDataType_Base;
48 : typedef ::comphelper::OMutexAndBroadcastHelper OXSDDataType_BBase;
49 : typedef ::comphelper::OPropertyContainer OXSDDataType_PBase;
50 :
51 : class OXSDDataType :public OXSDDataType_Base
52 : ,public OXSDDataType_BBase // order matters: OMutexAndBroadcastHelper before
53 : ,public OXSDDataType_PBase // OPropertyContainer
54 : {
55 : private:
56 : // <properties>
57 : sal_Bool m_bIsBasic;
58 : sal_Int16 m_nTypeClass;
59 : ::rtl::OUString m_sName;
60 : ::rtl::OUString m_sPattern;
61 : sal_uInt16 m_nWST;
62 : // </properties>
63 :
64 : ::std::auto_ptr< U_NAMESPACE_QUALIFIER RegexMatcher >
65 : m_pPatternMatcher;
66 : bool m_bPatternMatcherDirty;
67 :
68 : protected:
69 :
70 : sal_Bool isBasic() const { return m_bIsBasic; }
71 0 : sal_Int16 getTypeClass() const { return m_nTypeClass; }
72 : const ::rtl::OUString&
73 : getName() const { return m_sName; }
74 :
75 : private:
76 : OXSDDataType( ); // never implemented
77 : OXSDDataType( const OXSDDataType& ); // never implemented
78 : OXSDDataType& operator=( const OXSDDataType& ); // never implemented
79 :
80 : protected:
81 : // create basic data type
82 : OXSDDataType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass );
83 : ~OXSDDataType();
84 :
85 : public:
86 : DECLARE_XINTERFACE()
87 : DECLARE_XTYPEPROVIDER()
88 :
89 : virtual ::rtl::OUString SAL_CALL getName( ) throw (::com::sun::star::uno::RuntimeException);
90 : virtual void SAL_CALL setName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::util::VetoException);
91 : virtual ::rtl::OUString SAL_CALL getPattern() throw (::com::sun::star::uno::RuntimeException);
92 : virtual void SAL_CALL setPattern( const ::rtl::OUString& _pattern ) throw (::com::sun::star::uno::RuntimeException);
93 : virtual sal_Int16 SAL_CALL getWhiteSpaceTreatment() throw (::com::sun::star::uno::RuntimeException);
94 : virtual void SAL_CALL setWhiteSpaceTreatment( sal_Int16 _whitespacetreatment ) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException);
95 : virtual sal_Bool SAL_CALL getIsBasic() throw (::com::sun::star::uno::RuntimeException);
96 : virtual sal_Int16 SAL_CALL getTypeClass() throw (::com::sun::star::uno::RuntimeException);
97 :
98 : virtual sal_Bool SAL_CALL validate( const ::rtl::OUString& value ) throw (::com::sun::star::uno::RuntimeException);
99 : virtual ::rtl::OUString SAL_CALL explainInvalid( const ::rtl::OUString& value ) throw (::com::sun::star::uno::RuntimeException);
100 :
101 : // XPropertySet - is a base of XDataType and needs to be disambiguated
102 : 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);
103 : 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);
104 : 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);
105 : 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);
106 : 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);
107 : 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);
108 :
109 : public:
110 : OXSDDataType* clone( const ::rtl::OUString& _rNewName ) const;
111 :
112 : protected:
113 : // XPropertySet and friends
114 : 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);
115 : virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
116 : sal_Int32 nHandle,
117 : const ::com::sun::star::uno::Any& rValue
118 : )
119 : throw (::com::sun::star::uno::Exception);
120 :
121 : // --- own overridables ---
122 : // helper for implementing cloning of data types
123 : virtual OXSDDataType* createClone( const ::rtl::OUString& _rName ) const = 0;
124 : virtual void initializeClone( const OXSDDataType& _rCloneSource );
125 :
126 : // helper method for validate and explainInvalid
127 : virtual sal_uInt16 _validate( const ::rtl::OUString& value );
128 : virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason );
129 :
130 : // helper method for checking properties values which are to be set
131 : virtual bool checkPropertySanity( sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rNewValue, ::rtl::OUString& _rErrorMessage );
132 :
133 : // register properties implemented by this instance - call the base class when overriding
134 : virtual void registerProperties();
135 : };
136 :
137 : //====================================================================
138 : //= helper for deriving from OXSDDataType
139 : //====================================================================
140 : #define DECLARE_DEFAULT_CLONING( classname ) \
141 : virtual OXSDDataType* createClone( const ::rtl::OUString& _rName ) const; \
142 : virtual void initializeClone( const OXSDDataType& _rCloneSource ); \
143 : void initializeTypedClone( const classname& _rCloneSource );
144 :
145 : #define IMPLEMENT_DEFAULT_CLONING( classname, baseclass ) \
146 : OXSDDataType* classname::createClone( const ::rtl::OUString& _rName ) const \
147 : { \
148 : return new classname( _rName ); \
149 : } \
150 : void classname::initializeClone( const OXSDDataType& _rCloneSource ) \
151 : { \
152 : baseclass::initializeClone( _rCloneSource ); \
153 : initializeTypedClone( static_cast< const classname& >( _rCloneSource ) ); \
154 : } \
155 :
156 : #define IMPLEMENT_DEFAULT_TYPED_CLONING( classname, baseclass ) \
157 : OXSDDataType* classname::createClone( const ::rtl::OUString& _rName ) const \
158 : { \
159 : return new classname( _rName, getTypeClass() ); \
160 : } \
161 : void classname::initializeClone( const OXSDDataType& _rCloneSource ) \
162 : { \
163 : baseclass::initializeClone( _rCloneSource ); \
164 : initializeTypedClone( static_cast< const classname& >( _rCloneSource ) ); \
165 : } \
166 :
167 : #define REGISTER_VOID_PROP( prop, memberAny, type ) \
168 : registerMayBeVoidProperty( PROPERTY_##prop, PROPERTY_ID_##prop, ::com::sun::star::beans::PropertyAttribute::BOUND | ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, \
169 : &memberAny, ::getCppuType( static_cast< type* >( NULL ) ) );
170 :
171 : //====================================================================
172 : //= OValueLimitedType_Base
173 : //====================================================================
174 0 : class OValueLimitedType_Base : public OXSDDataType
175 : {
176 : protected:
177 : ::com::sun::star::uno::Any m_aMaxInclusive;
178 : ::com::sun::star::uno::Any m_aMaxExclusive;
179 : ::com::sun::star::uno::Any m_aMinInclusive;
180 : ::com::sun::star::uno::Any m_aMinExclusive;
181 :
182 : double m_fCachedMaxInclusive;
183 : double m_fCachedMaxExclusive;
184 : double m_fCachedMinInclusive;
185 : double m_fCachedMinExclusive;
186 :
187 : protected:
188 : OValueLimitedType_Base( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass );
189 :
190 : virtual void initializeClone( const OXSDDataType& _rCloneSource );
191 : void initializeTypedClone( const OValueLimitedType_Base& _rCloneSource );
192 :
193 : // XPropertySet and friends
194 : virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
195 : sal_Int32 nHandle,
196 : const ::com::sun::star::uno::Any& rValue
197 : )
198 : throw (::com::sun::star::uno::Exception);
199 :
200 : // OXSDDataType overridables
201 : virtual bool _getValue( const ::rtl::OUString& value, double& fValue );
202 : virtual sal_uInt16 _validate( const ::rtl::OUString& value );
203 : virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason );
204 :
205 : // own overridables
206 : /** translate a given value into a human-readable string
207 :
208 : The value is guaranteed to be not <NULL/>, and is of type <member>ValueType</member>
209 : */
210 : virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const = 0;
211 :
212 : /** translates a <member>ValueType</member> value into a double value
213 :
214 : The normalization must respect the "<" and "==" relations on the value
215 : space. That is, if two values are equal, their normalizations must be equal, too.
216 : Similarily, if <code>foo</code> is less than <code>bar</code>, the same
217 : must hold for their normalizations.
218 :
219 : @param _rValue
220 : the value to translate. Guranteed to be not <NULL/>, and of type <member>ValueType</member>
221 : @param _rDoubleValue
222 : output parameter to hold the resulting double value
223 : */
224 : virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const = 0;
225 : };
226 :
227 : //====================================================================
228 : //= OValueLimitedType
229 : //====================================================================
230 : template < typename VALUE_TYPE >
231 0 : class OValueLimitedType : public OValueLimitedType_Base
232 : {
233 : protected:
234 : typedef VALUE_TYPE ValueType;
235 : inline const ::com::sun::star::uno::Type&
236 0 : getCppuType() const { return ::getCppuType( static_cast< ValueType* >( NULL ) ); }
237 :
238 : protected:
239 : OValueLimitedType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass );
240 :
241 : // OXSDDataType overridables
242 : virtual void registerProperties();
243 : };
244 :
245 : //====================================================================
246 : //= ODerivedDataType
247 : //====================================================================
248 : /** helper class for implementing interfaces derived from XDataType
249 : */
250 : template< typename CONCRETE_DATA_TYPE_IMPL, typename SUPERCLASS = OXSDDataType >
251 0 : class ODerivedDataType :public SUPERCLASS
252 : ,::comphelper::OPropertyArrayUsageHelper< CONCRETE_DATA_TYPE_IMPL >
253 : {
254 : private:
255 : bool m_bPropertiesRegistered;
256 :
257 : protected:
258 : ODerivedDataType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass );
259 :
260 : protected:
261 : // OPropertyArrayUsageHelper
262 : virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;
263 :
264 : // XPropertySet
265 : virtual com::sun::star::uno::Reference<com::sun::star::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() throw(com::sun::star::uno::RuntimeException);
266 : virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
267 : };
268 :
269 : //====================================================================
270 : //= OBooleanType
271 : //====================================================================
272 : class OBooleanType;
273 : typedef ODerivedDataType< OBooleanType > OBooleanType_Base;
274 0 : class OBooleanType : public OBooleanType_Base
275 : {
276 : public:
277 : OBooleanType( const ::rtl::OUString& _rName );
278 :
279 : protected:
280 : DECLARE_DEFAULT_CLONING( OBooleanType )
281 :
282 : // OXSDDataType overridables
283 : virtual sal_uInt16 _validate( const ::rtl::OUString& value );
284 : virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason );
285 : };
286 :
287 : //====================================================================
288 : //= OStringType
289 : //====================================================================
290 : class OStringType;
291 : typedef ODerivedDataType< OStringType > OStringType_Base;
292 0 : class OStringType :public OStringType_Base
293 : {
294 : protected:
295 : // <properties>
296 : ::com::sun::star::uno::Any m_aLength;
297 : ::com::sun::star::uno::Any m_aMinLength;
298 : ::com::sun::star::uno::Any m_aMaxLength;
299 : // </properties>
300 :
301 : public:
302 : OStringType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass /* = ::com::sun::star::xsd::DataTypeClass::STRING */ );
303 :
304 : protected:
305 : DECLARE_DEFAULT_CLONING( OStringType )
306 :
307 : // OXSDDataType overridables
308 : virtual sal_uInt16 _validate( const ::rtl::OUString& value );
309 : virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason );
310 : virtual bool checkPropertySanity( sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rNewValue, ::rtl::OUString& _rErrorMessage );
311 : virtual void registerProperties();
312 : };
313 :
314 : //====================================================================
315 : //= ODecimalType
316 : //====================================================================
317 : class ODecimalType;
318 : typedef ODerivedDataType< ODecimalType, OValueLimitedType< double > > ODecimalType_Base;
319 0 : class ODecimalType : public ODecimalType_Base
320 : {
321 : protected:
322 : ::com::sun::star::uno::Any m_aTotalDigits;
323 : ::com::sun::star::uno::Any m_aFractionDigits;
324 :
325 : public:
326 : ODecimalType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass /* = ::com::sun::star::xsd::DataTypeClass::DECIMAL */ );
327 :
328 : protected:
329 : DECLARE_DEFAULT_CLONING( ODecimalType )
330 :
331 : // OXSDDataType overridables
332 : virtual sal_uInt16 _validate( const ::rtl::OUString& value );
333 : virtual ::rtl::OUString _explainInvalid( sal_uInt16 nReason );
334 : virtual void registerProperties();
335 :
336 : // OValueLimitedType overridables
337 : virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const;
338 : virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const;
339 :
340 : private:
341 : using ODecimalType_Base::initializeTypedClone;
342 : };
343 :
344 : //====================================================================
345 : //=
346 : //====================================================================
347 : #define DEFAULT_DECLARE_SUBTYPE( classname, valuetype ) \
348 : class classname; \
349 : typedef ODerivedDataType< classname, OValueLimitedType< valuetype > > classname##_Base; \
350 : class classname : public classname##_Base \
351 : { \
352 : public: \
353 : classname( const ::rtl::OUString& _rName ); \
354 : \
355 : protected: \
356 : DECLARE_DEFAULT_CLONING( classname ) \
357 : \
358 : /* OXSDDataType overridables */ \
359 : virtual sal_uInt16 _validate( const ::rtl::OUString& value ); \
360 : virtual bool _getValue( const ::rtl::OUString& value, double& fValue ); \
361 : \
362 : /* OValueLimitedType overridables */ \
363 : virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const; \
364 : virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const; \
365 : \
366 : private: \
367 : using classname##_Base::initializeTypedClone; \
368 : };
369 :
370 : //====================================================================
371 : //= ODateType
372 : //====================================================================
373 0 : DEFAULT_DECLARE_SUBTYPE( ODateType, ::com::sun::star::util::Date )
374 :
375 : //====================================================================
376 : //= OTimeType
377 : //====================================================================
378 0 : DEFAULT_DECLARE_SUBTYPE( OTimeType, ::com::sun::star::util::Time )
379 :
380 : //====================================================================
381 : //= ODateTimeType
382 : //====================================================================
383 0 : DEFAULT_DECLARE_SUBTYPE( ODateTimeType, ::com::sun::star::util::DateTime )
384 :
385 : //====================================================================
386 : //= OShortIntegerType
387 : //====================================================================
388 : class OShortIntegerType;
389 : typedef ODerivedDataType< OShortIntegerType, OValueLimitedType< sal_Int16 > > OShortIntegerType_Base;
390 0 : class OShortIntegerType : public OShortIntegerType_Base
391 : {
392 : public:
393 : OShortIntegerType( const ::rtl::OUString& _rName, sal_Int16 _nTypeClass );
394 :
395 : protected:
396 : DECLARE_DEFAULT_CLONING( OShortIntegerType )
397 :
398 : // OXSDDataType overridables
399 : virtual bool _getValue( const ::rtl::OUString& value, double& fValue );
400 :
401 : // OValueLimitedType overridables
402 : virtual ::rtl::OUString typedValueAsHumanReadableString( const ::com::sun::star::uno::Any& _rValue ) const;
403 : virtual void normalizeValue( const ::com::sun::star::uno::Any& _rValue, double& _rDoubleValue ) const;
404 :
405 : private:
406 : using OShortIntegerType_Base::initializeTypedClone;
407 : };
408 :
409 : //........................................................................
410 : } // namespace xforms
411 : //........................................................................
412 :
413 : #endif // FORMS_SOURCE_XFORMS_DATATYPES_HXX
414 :
415 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|