LibreOffice Module forms (master) 1
datatyperepository.cxx
Go to the documentation of this file.
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
22#include "datatypes.hxx"
23#include <strings.hrc>
24#include <frm_resource.hxx>
25#include <frm_strings.hxx>
26#include <property.hxx>
27
28#include <com/sun/star/container/ElementExistException.hpp>
29#include <com/sun/star/util/VetoException.hpp>
30#include <com/sun/star/xsd/DataTypeClass.hpp>
32
33namespace xforms
34{
35
36 using ::com::sun::star::uno::Reference;
37 using ::com::sun::star::uno::Any;
38 using ::com::sun::star::uno::Type;
39 using ::com::sun::star::uno::Sequence;
40 using ::com::sun::star::util::VetoException;
41 using ::com::sun::star::container::NoSuchElementException;
42 using ::com::sun::star::container::ElementExistException;
43 using ::com::sun::star::container::XEnumeration;
44 using ::com::sun::star::xsd::XDataType;
45 using namespace frm;
46
48 {
49
50 // insert some basic types
51 OUString sName( ResourceManager::loadString(RID_STR_DATATYPE_STRING) );
52 m_aRepository[ sName ] = new OStringType( sName, css::xsd::DataTypeClass::STRING );
53
54 sName = ResourceManager::loadString(RID_STR_DATATYPE_URL);
55 m_aRepository[ sName ] = new OAnyURIType( sName, css::xsd::DataTypeClass::anyURI );
56
57 sName = ResourceManager::loadString(RID_STR_DATATYPE_BOOLEAN);
59
60 sName = ResourceManager::loadString(RID_STR_DATATYPE_DECIMAL);
61 m_aRepository[ sName ] = new ODecimalType( sName, css::xsd::DataTypeClass::DECIMAL );
62
63 sName = ResourceManager::loadString(RID_STR_DATATYPE_FLOAT);
64 m_aRepository[ sName ] = new ODecimalType( sName, css::xsd::DataTypeClass::FLOAT );
65
66 sName = ResourceManager::loadString(RID_STR_DATATYPE_DOUBLE);
67 m_aRepository[ sName ] = new ODecimalType( sName, css::xsd::DataTypeClass::DOUBLE );
68
69 sName = ResourceManager::loadString(RID_STR_DATATYPE_DATE);
71
72 sName = ResourceManager::loadString(RID_STR_DATATYPE_TIME);
74
75 sName = ResourceManager::loadString(RID_STR_DATATYPE_DATETIME);
77
78 sName = ResourceManager::loadString(RID_STR_DATATYPE_YEAR);
79 m_aRepository[ sName ] = new OShortIntegerType( sName, css::xsd::DataTypeClass::gYear );
80
81 sName = ResourceManager::loadString(RID_STR_DATATYPE_MONTH);
82 m_aRepository[ sName ] = new OShortIntegerType( sName, css::xsd::DataTypeClass::gMonth );
83
84 sName = ResourceManager::loadString(RID_STR_DATATYPE_DAY);
85 m_aRepository[ sName ] = new OShortIntegerType( sName, css::xsd::DataTypeClass::gDay );
86 }
87
88
90 {
91 }
92
93
94 ODataTypeRepository::Repository::iterator ODataTypeRepository::implLocate( const OUString& _rName, bool _bAllowMiss )
95 {
96 Repository::iterator aTypePos = m_aRepository.find( _rName );
97 if ( aTypePos == m_aRepository.end() && !_bAllowMiss )
98 throw NoSuchElementException( OUString(), *this );
99
100 return aTypePos;
101 }
102
103
104 Reference< XDataType > SAL_CALL ODataTypeRepository::getBasicDataType( sal_Int16 dataTypeClass )
105 {
106 Reference< XDataType > xReturn;
107
108 for ( Repository::const_iterator lookup = m_aRepository.begin();
109 ( lookup != m_aRepository.end() ) && ! xReturn.is();
110 ++lookup
111 )
112 {
113 if ( lookup->second->getIsBasic() && ( lookup->second->getTypeClass() == dataTypeClass ) )
114 xReturn = lookup->second.get();
115 }
116
117 if ( !xReturn.is() )
118 throw NoSuchElementException( OUString(), *this );
119
120 return xReturn;
121 }
122
123
124 Reference< XDataType > SAL_CALL ODataTypeRepository::cloneDataType( const OUString& sourceName, const OUString& newName )
125 {
126 ::osl::MutexGuard aGuard( m_aMutex );
127
128 Repository::iterator aTypePos = implLocate( newName, true );
129 if ( aTypePos != m_aRepository.end() )
130 throw ElementExistException( OUString(), *this );
131
132 aTypePos = implLocate( sourceName );
133 rtl::Reference<OXSDDataType> pClone = aTypePos->second->clone( newName );
134 m_aRepository[ newName ] = pClone;
135
136 return pClone;
137 }
138
139
140 void SAL_CALL ODataTypeRepository::revokeDataType( const OUString& typeName )
141 {
142 ::osl::MutexGuard aGuard( m_aMutex );
143
144 Repository::iterator aTypePos = implLocate( typeName );
145 if ( aTypePos->second->getIsBasic() )
146 // "This is a built-in type and cannot be removed."
147 throw VetoException(ResourceManager::loadString(RID_STR_XFORMS_CANT_REMOVE_TYPE), *this );
148
149 m_aRepository.erase( aTypePos );
150 }
151
152
153 Reference< XDataType > SAL_CALL ODataTypeRepository::getDataType( const OUString& typeName )
154 {
155 ::osl::MutexGuard aGuard( m_aMutex );
156 return implLocate( typeName )->second;
157 }
158
159
160 Reference< XEnumeration > SAL_CALL ODataTypeRepository::createEnumeration( )
161 {
162 return new ::comphelper::OEnumerationByName( this );
163 }
164
165
166 Any SAL_CALL ODataTypeRepository::getByName( const OUString& aName )
167 {
168 return Any( getDataType( aName ) );
169 }
170
171
172 Sequence< OUString > SAL_CALL ODataTypeRepository::getElementNames( )
173 {
174 ::osl::MutexGuard aGuard( m_aMutex );
175
177 }
178
179
180 sal_Bool SAL_CALL ODataTypeRepository::hasByName( const OUString& aName )
181 {
182 ::osl::MutexGuard aGuard( m_aMutex );
183 return m_aRepository.find( aName ) != m_aRepository.end();
184 }
185
186
188 {
190 }
191
192
194 {
195 return !m_aRepository.empty();
196 }
197
198
199 // type specific implementation of registerProperties, using explicit
200 // template instantiations
201
202 template<>
204 {
206
207 registerMayBeVoidProperty( PROPERTY_XSD_MAX_INCLUSIVE_DATE, PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
208 &m_aMaxInclusive, cppu::UnoType<ValueType>::get() );
209
210 registerMayBeVoidProperty( PROPERTY_XSD_MAX_EXCLUSIVE_DATE, PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
211 &m_aMaxExclusive, cppu::UnoType<ValueType>::get() );
212
213 registerMayBeVoidProperty( PROPERTY_XSD_MIN_INCLUSIVE_DATE, PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
214 &m_aMinInclusive, cppu::UnoType<ValueType>::get() );
215
216 registerMayBeVoidProperty( PROPERTY_XSD_MIN_EXCLUSIVE_DATE, PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
217 &m_aMinExclusive, cppu::UnoType<ValueType>::get() );
218 }
219
220 template<>
222 {
224
225 registerMayBeVoidProperty( PROPERTY_XSD_MAX_INCLUSIVE_TIME, PROPERTY_ID_XSD_MAX_INCLUSIVE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
226 &m_aMaxInclusive, cppu::UnoType<ValueType>::get() );
227
228 registerMayBeVoidProperty( PROPERTY_XSD_MAX_EXCLUSIVE_TIME, PROPERTY_ID_XSD_MAX_EXCLUSIVE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
229 &m_aMaxExclusive, cppu::UnoType<ValueType>::get() );
230
231 registerMayBeVoidProperty( PROPERTY_XSD_MIN_INCLUSIVE_TIME, PROPERTY_ID_XSD_MIN_INCLUSIVE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
232 &m_aMinInclusive, cppu::UnoType<ValueType>::get() );
233
234 registerMayBeVoidProperty( PROPERTY_XSD_MIN_EXCLUSIVE_TIME, PROPERTY_ID_XSD_MIN_EXCLUSIVE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
235 &m_aMinExclusive, cppu::UnoType<ValueType>::get() );
236 }
237
238 template<>
240 {
242
243 registerMayBeVoidProperty( PROPERTY_XSD_MAX_INCLUSIVE_DATE_TIME, PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
244 &m_aMaxInclusive, cppu::UnoType<ValueType>::get() );
245
246 registerMayBeVoidProperty( PROPERTY_XSD_MAX_EXCLUSIVE_DATE_TIME, PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
247 &m_aMaxExclusive, cppu::UnoType<ValueType>::get() );
248
249 registerMayBeVoidProperty( PROPERTY_XSD_MIN_INCLUSIVE_DATE_TIME, PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
250 &m_aMinInclusive, cppu::UnoType<ValueType>::get() );
251
252 registerMayBeVoidProperty( PROPERTY_XSD_MIN_EXCLUSIVE_DATE_TIME, PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE_TIME, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
253 &m_aMinExclusive, cppu::UnoType<ValueType>::get() );
254 }
255
256 template<>
258 {
260
261 registerMayBeVoidProperty( PROPERTY_XSD_MAX_INCLUSIVE_DOUBLE, PROPERTY_ID_XSD_MAX_INCLUSIVE_DOUBLE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
262 &m_aMaxInclusive, cppu::UnoType<ValueType>::get() );
263
264 registerMayBeVoidProperty( PROPERTY_XSD_MAX_EXCLUSIVE_DOUBLE, PROPERTY_ID_XSD_MAX_EXCLUSIVE_DOUBLE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
265 &m_aMaxExclusive, cppu::UnoType<ValueType>::get() );
266
267 registerMayBeVoidProperty( PROPERTY_XSD_MIN_INCLUSIVE_DOUBLE, PROPERTY_ID_XSD_MIN_INCLUSIVE_DOUBLE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
268 &m_aMinInclusive, cppu::UnoType<ValueType>::get() );
269
270 registerMayBeVoidProperty( PROPERTY_XSD_MIN_EXCLUSIVE_DOUBLE, PROPERTY_ID_XSD_MIN_EXCLUSIVE_DOUBLE, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
271 &m_aMinExclusive, cppu::UnoType<ValueType>::get() );
272 }
273
274 template<>
276 {
278
279 registerMayBeVoidProperty( PROPERTY_XSD_MAX_INCLUSIVE_INT, PROPERTY_ID_XSD_MAX_INCLUSIVE_INT, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
280 &m_aMaxInclusive, cppu::UnoType<ValueType>::get() );
281
282 registerMayBeVoidProperty( PROPERTY_XSD_MAX_EXCLUSIVE_INT, PROPERTY_ID_XSD_MAX_EXCLUSIVE_INT, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
283 &m_aMaxExclusive, cppu::UnoType<ValueType>::get() );
284
285 registerMayBeVoidProperty( PROPERTY_XSD_MIN_INCLUSIVE_INT, PROPERTY_ID_XSD_MIN_INCLUSIVE_INT, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
286 &m_aMinInclusive, cppu::UnoType<ValueType>::get() );
287
288 registerMayBeVoidProperty( PROPERTY_XSD_MIN_EXCLUSIVE_INT, PROPERTY_ID_XSD_MIN_EXCLUSIVE_INT, css::beans::PropertyAttribute::BOUND | css::beans::PropertyAttribute::MAYBEVOID,
289 &m_aMinExclusive, cppu::UnoType<ValueType>::get() );
290 }
291
292} // namespace xforms
293
294
295/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
css::uno::Type const & get()
Repository::iterator implLocate(const OUString &_rName, bool _bAllowMiss=false)
locates the type with the given name in our repository, or throws an exception if there is no such ty...
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual css::uno::Reference< css::xsd::XDataType > SAL_CALL getDataType(const OUString &typeName) override
virtual sal_Bool SAL_CALL hasElements() override
virtual css::uno::Type SAL_CALL getElementType() override
virtual css::uno::Reference< css::xsd::XDataType > SAL_CALL getBasicDataType(sal_Int16 dataTypeClass) override
virtual css::uno::Reference< css::xsd::XDataType > SAL_CALL cloneDataType(const OUString &sourceName, const OUString &newName) override
virtual css::uno::Any SAL_CALL getByName(const OUString &aName) override
virtual sal_Bool SAL_CALL hasByName(const OUString &aName) override
virtual void SAL_CALL revokeDataType(const OUString &typeName) override
virtual ~ODataTypeRepository() override
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override
virtual void registerProperties() override
virtual void registerProperties()
Definition: datatypes.cxx:74
OUString sName
constexpr OUStringLiteral PROPERTY_XSD_MIN_EXCLUSIVE_INT
constexpr OUStringLiteral PROPERTY_XSD_MAX_EXCLUSIVE_DATE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MIN_EXCLUSIVE_DATE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MIN_EXCLUSIVE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MIN_EXCLUSIVE_DOUBLE
constexpr OUStringLiteral PROPERTY_XSD_MAX_INCLUSIVE_DATE
constexpr OUStringLiteral PROPERTY_XSD_MAX_EXCLUSIVE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MIN_INCLUSIVE_DOUBLE
constexpr OUStringLiteral PROPERTY_XSD_MAX_INCLUSIVE_DATE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MAX_EXCLUSIVE_DOUBLE
constexpr OUStringLiteral PROPERTY_XSD_MAX_EXCLUSIVE_INT
constexpr OUStringLiteral PROPERTY_XSD_MIN_EXCLUSIVE_DATE
constexpr OUStringLiteral PROPERTY_XSD_MIN_INCLUSIVE_DATE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MAX_INCLUSIVE_DOUBLE
constexpr OUStringLiteral PROPERTY_XSD_MAX_EXCLUSIVE_DATE
constexpr OUStringLiteral PROPERTY_XSD_MAX_INCLUSIVE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MIN_INCLUSIVE_INT
constexpr OUStringLiteral PROPERTY_XSD_MAX_INCLUSIVE_INT
constexpr OUStringLiteral PROPERTY_XSD_MIN_INCLUSIVE_TIME
constexpr OUStringLiteral PROPERTY_XSD_MIN_INCLUSIVE_DATE
OUString aName
css::uno::Sequence< typename M::key_type > mapKeysToSequence(M const &map)
Type
OUString newName(std::u16string_view aNewPrefix, std::u16string_view aOldPrefix, std::u16string_view old_Name)
OUString loadString(TranslateId aResId)
loads the string with the specified resource id from the FormLayer mo file
ListBox is a bit confusing / different from other form components, so here are a few notes:
Definition: BaseListBox.hxx:25
OUString typeName
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_INT
Definition: property.hxx:276
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE_TIME
Definition: property.hxx:294
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_INT
Definition: property.hxx:277
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DOUBLE
Definition: property.hxx:281
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_TIME
Definition: property.hxx:288
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE_TIME
Definition: property.hxx:295
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE_TIME
Definition: property.hxx:293
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE
Definition: property.hxx:284
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE
Definition: property.hxx:286
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_TIME
Definition: property.hxx:289
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_TIME
Definition: property.hxx:290
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_DOUBLE
Definition: property.hxx:282
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_TIME
Definition: property.hxx:291
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE_TIME
Definition: property.hxx:292
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DOUBLE
Definition: property.hxx:283
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_INT
Definition: property.hxx:279
#define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE
Definition: property.hxx:287
#define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE
Definition: property.hxx:285
#define PROPERTY_ID_XSD_MAX_INCLUSIVE_DOUBLE
Definition: property.hxx:280
#define PROPERTY_ID_XSD_MIN_INCLUSIVE_INT
Definition: property.hxx:278
unsigned char sal_Bool