summaryrefslogtreecommitdiff
path: root/forms/source/xforms/datatyperepository.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'forms/source/xforms/datatyperepository.cxx')
-rw-r--r--forms/source/xforms/datatyperepository.cxx298
1 files changed, 298 insertions, 0 deletions
diff --git a/forms/source/xforms/datatyperepository.cxx b/forms/source/xforms/datatyperepository.cxx
new file mode 100644
index 000000000000..8a9a4847af62
--- /dev/null
+++ b/forms/source/xforms/datatyperepository.cxx
@@ -0,0 +1,298 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_forms.hxx"
+
+#ifndef FORMS_SOURCE_XFORMS_DATATYPEREPOSITORY_HXX
+#include "datatyperepository.hxx"
+#endif
+#include "datatypes.hxx"
+#ifndef _FRM_RESOURCE_HRC_
+#include "frm_resource.hrc"
+#endif
+#include "frm_resource.hxx"
+#include "frm_strings.hxx"
+#ifndef _FRM_PROPERTY_HRC_
+#include "property.hrc"
+#endif
+
+/** === begin UNO includes === **/
+/** === end UNO includes === **/
+#include <tools/debug.hxx>
+#include <comphelper/enumhelper.hxx>
+
+#include <functional>
+#include <algorithm>
+
+//........................................................................
+namespace xforms
+{
+//........................................................................
+
+ using ::com::sun::star::uno::Reference;
+ using ::com::sun::star::uno::RuntimeException;
+ using ::com::sun::star::uno::Any;
+ using ::com::sun::star::uno::Type;
+ using ::com::sun::star::uno::makeAny;
+ using ::com::sun::star::uno::Sequence;
+ using ::com::sun::star::util::VetoException;
+ using ::com::sun::star::container::NoSuchElementException;
+ using ::com::sun::star::container::ElementExistException;
+ using ::com::sun::star::container::XEnumeration;
+ using ::com::sun::star::lang::WrappedTargetException;
+ using ::com::sun::star::xsd::XDataType;
+ using namespace frm;
+
+ //====================================================================
+ //= ODataTypeRepository
+ //====================================================================
+ DBG_NAME( ODataTypeRepository )
+ //--------------------------------------------------------------------
+ ODataTypeRepository::ODataTypeRepository( )
+ {
+ DBG_CTOR( ODataTypeRepository, NULL );
+
+ // insert some basic types
+ ::rtl::OUString sName( FRM_RES_STRING( RID_STR_DATATYPE_STRING ) );
+ m_aRepository[ sName ] = new OStringType( sName, ::com::sun::star::xsd::DataTypeClass::STRING );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_URL );
+ m_aRepository[ sName ] = new OStringType( sName, ::com::sun::star::xsd::DataTypeClass::anyURI );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_BOOLEAN );
+ m_aRepository[ sName ] = new OBooleanType( sName );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_DECIMAL );
+ m_aRepository[ sName ] = new ODecimalType( sName, ::com::sun::star::xsd::DataTypeClass::DECIMAL );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_FLOAT );
+ m_aRepository[ sName ] = new ODecimalType( sName, ::com::sun::star::xsd::DataTypeClass::FLOAT );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_DOUBLE );
+ m_aRepository[ sName ] = new ODecimalType( sName, ::com::sun::star::xsd::DataTypeClass::DOUBLE );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_DATE );
+ m_aRepository[ sName ] = new ODateType( sName );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_TIME );
+ m_aRepository[ sName ] = new OTimeType( sName );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_DATETIME );
+ m_aRepository[ sName ] = new ODateTimeType( sName );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_YEAR );
+ m_aRepository[ sName ] = new OShortIntegerType( sName, ::com::sun::star::xsd::DataTypeClass::gYear );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_MONTH );
+ m_aRepository[ sName ] = new OShortIntegerType( sName, ::com::sun::star::xsd::DataTypeClass::gMonth );
+
+ sName = FRM_RES_STRING( RID_STR_DATATYPE_DAY );
+ m_aRepository[ sName ] = new OShortIntegerType( sName, ::com::sun::star::xsd::DataTypeClass::gDay );
+ }
+
+ //--------------------------------------------------------------------
+ ODataTypeRepository::~ODataTypeRepository( )
+ {
+ DBG_DTOR( ODataTypeRepository, NULL );
+ }
+
+ //--------------------------------------------------------------------
+ ODataTypeRepository::Repository::iterator ODataTypeRepository::implLocate( const ::rtl::OUString& _rName, bool _bAllowMiss ) SAL_THROW( ( NoSuchElementException ) )
+ {
+ Repository::iterator aTypePos = m_aRepository.find( _rName );
+ if ( aTypePos == m_aRepository.end() && !_bAllowMiss )
+ throw NoSuchElementException( ::rtl::OUString(), *this );
+
+ return aTypePos;
+ }
+
+ //--------------------------------------------------------------------
+ Reference< XDataType > SAL_CALL ODataTypeRepository::getBasicDataType( sal_Int16 dataTypeClass ) throw (NoSuchElementException, RuntimeException)
+ {
+ Reference< XDataType > xReturn;
+
+ for ( Repository::const_iterator lookup = m_aRepository.begin();
+ ( lookup != m_aRepository.end() ) && ! xReturn.is();
+ ++lookup
+ )
+ {
+ if ( lookup->second->getIsBasic() && ( lookup->second->getTypeClass() == dataTypeClass ) )
+ xReturn = lookup->second.get();
+ }
+
+ if ( !xReturn.is() )
+ throw NoSuchElementException( ::rtl::OUString(), *this );
+
+ return xReturn;
+ }
+
+ //--------------------------------------------------------------------
+ Reference< XDataType > SAL_CALL ODataTypeRepository::cloneDataType( const ::rtl::OUString& sourceName, const ::rtl::OUString& newName ) throw (NoSuchElementException, ElementExistException, RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ Repository::iterator aTypePos = implLocate( newName, true );
+ if ( aTypePos != m_aRepository.end() )
+ throw ElementExistException( ::rtl::OUString(), *this );
+
+ aTypePos = implLocate( sourceName );
+ OXSDDataType* pClone = aTypePos->second->clone( newName );
+ m_aRepository[ newName ] = pClone;
+
+ return pClone;
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL ODataTypeRepository::revokeDataType( const ::rtl::OUString& typeName ) throw (NoSuchElementException, VetoException, RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ Repository::iterator aTypePos = implLocate( typeName );
+ if ( aTypePos->second->getIsBasic() )
+ throw VetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "This is a built-in type and cannot be removed." ) ), *this );
+ // TODO: localize this error message
+
+ m_aRepository.erase( aTypePos );
+ }
+
+ //--------------------------------------------------------------------
+ Reference< XDataType > SAL_CALL ODataTypeRepository::getDataType( const ::rtl::OUString& typeName ) throw (NoSuchElementException, RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ return implLocate( typeName, false )->second.get();
+ }
+
+
+ //--------------------------------------------------------------------
+ Reference< XEnumeration > SAL_CALL ODataTypeRepository::createEnumeration( ) throw (RuntimeException)
+ {
+ return new ::comphelper::OEnumerationByName( this );
+ }
+
+ //--------------------------------------------------------------------
+ Any SAL_CALL ODataTypeRepository::getByName( const ::rtl::OUString& aName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException)
+ {
+ return makeAny( getDataType( aName ) );
+ }
+
+ //--------------------------------------------------------------------
+ Sequence< ::rtl::OUString > SAL_CALL ODataTypeRepository::getElementNames( ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ Sequence< ::rtl::OUString > aNames( m_aRepository.size() );
+ ::std::transform(
+ m_aRepository.begin(),
+ m_aRepository.end(),
+ aNames.getArray(),
+ ::std::select1st< Repository::value_type >()
+ );
+ return aNames;
+ }
+
+ //--------------------------------------------------------------------
+ sal_Bool SAL_CALL ODataTypeRepository::hasByName( const ::rtl::OUString& aName ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ return m_aRepository.find( aName ) != m_aRepository.end();
+ }
+
+ //--------------------------------------------------------------------
+ Type SAL_CALL ODataTypeRepository::getElementType( ) throw (RuntimeException)
+ {
+ return ::getCppuType( static_cast< Reference< XDataType >* >( NULL ) );
+ }
+
+ //--------------------------------------------------------------------
+ sal_Bool SAL_CALL ODataTypeRepository::hasElements( ) throw (RuntimeException)
+ {
+ return !m_aRepository.empty();
+ }
+
+ //--------------------------------------------------------------------
+ // type specific implementation of registerProperties, using explicit
+ // template instantiations
+
+ template<>
+ void OValueLimitedType<com::sun::star::util::Date>::registerProperties()
+ {
+ OValueLimitedType_Base::registerProperties();
+
+ REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_DATE, m_aMaxInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_DATE, m_aMaxExclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_DATE, m_aMinInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_DATE, m_aMinExclusive, ValueType );
+ }
+
+ template<>
+ void OValueLimitedType<com::sun::star::util::Time>::registerProperties()
+ {
+ OValueLimitedType_Base::registerProperties();
+
+ REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_TIME, m_aMaxInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_TIME, m_aMaxExclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_TIME, m_aMinInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_TIME, m_aMinExclusive, ValueType );
+ }
+
+ template<>
+ void OValueLimitedType<com::sun::star::util::DateTime>::registerProperties()
+ {
+ OValueLimitedType_Base::registerProperties();
+
+ REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_DATE_TIME, m_aMaxInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_DATE_TIME, m_aMaxExclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_DATE_TIME, m_aMinInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_DATE_TIME, m_aMinExclusive, ValueType );
+ }
+
+ template<>
+ void OValueLimitedType<double>::registerProperties()
+ {
+ OValueLimitedType_Base::registerProperties();
+
+ REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_DOUBLE, m_aMaxInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_DOUBLE, m_aMaxExclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_DOUBLE, m_aMinInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_DOUBLE, m_aMinExclusive, ValueType );
+ }
+
+ template<>
+ void OValueLimitedType<sal_Int16>::registerProperties()
+ {
+ OValueLimitedType_Base::registerProperties();
+
+ REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_INT, m_aMaxInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_INT, m_aMaxExclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_INT, m_aMinInclusive, ValueType );
+ REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_INT, m_aMinExclusive, ValueType );
+ }
+//........................................................................
+} // namespace xforms
+//........................................................................
+