/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_dbaccess.hxx"
#ifndef DBAUI_FIELDDESCRIPTIONS_HXX
#include "FieldDescriptions.hxx"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef TOOLS_DIAGNOSE_EX_H
#include <tools/diagnose_ex.h>
#endif
#ifndef _DBU_TBL_HRC_
#include "dbu_tbl.hrc"
#endif
#ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
#include <com/sun/star/sdbc/ColumnValue.hpp>
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#ifndef _COMPHELPER_EXTRACT_HXX_
#include <comphelper/extract.hxx>
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
#ifndef _COM_SUN_STAR_UTIL_NUMBERFORMAT_HPP_
#include <com/sun/star/util/NumberFormat.hpp>
#endif

#define DEFAULT_VARCHAR_PRECSION	50
#define DEFAULT_OTHER_PRECSION		16
#define DEFAULT_NUMERIC_PRECSION	5
#define DEFAULT_NUMERIC_SCALE		0


using namespace dbaui;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::util;

//========================================================================
// class OFieldDescription
//========================================================================
DBG_NAME(OFieldDescription)
//------------------------------------------------------------------------------
OFieldDescription::OFieldDescription()
    :m_pType()
	,m_nType(DataType::VARCHAR)
	,m_nPrecision(0)
	,m_nScale(0)
	,m_nIsNullable(ColumnValue::NULLABLE)
    ,m_nFormatKey(0)
	,m_eHorJustify(SVX_HOR_JUSTIFY_STANDARD)
	,m_bIsAutoIncrement(sal_False)
    ,m_bIsPrimaryKey(sal_False)
	,m_bIsCurrency(sal_False)
	,m_bHidden(sal_False)
{
	DBG_CTOR(OFieldDescription,NULL);
}
//------------------------------------------------------------------------------
OFieldDescription::OFieldDescription( const OFieldDescription& rDescr )
    :m_aDefaultValue(rDescr.m_aDefaultValue)
    ,m_aControlDefault(rDescr.m_aControlDefault)
    ,m_aWidth(rDescr.m_aWidth)
    ,m_aRelativePosition(rDescr.m_aRelativePosition)
    ,m_pType(rDescr.m_pType)
    ,m_xDest(rDescr.m_xDest)
    ,m_xDestInfo(rDescr.m_xDestInfo)
    ,m_sName(rDescr.m_sName)
    ,m_sTypeName(rDescr.m_sTypeName)
    ,m_sDescription(rDescr.m_sDescription)
    ,m_sAutoIncrementValue(rDescr.m_sAutoIncrementValue)
    ,m_nType(rDescr.m_nType)
    ,m_nPrecision(rDescr.m_nPrecision)
    ,m_nScale(rDescr.m_nScale)
    ,m_nIsNullable(rDescr.m_nIsNullable)
    ,m_nFormatKey(rDescr.m_nFormatKey)
    ,m_eHorJustify(rDescr.m_eHorJustify)
    ,m_bIsAutoIncrement(rDescr.m_bIsAutoIncrement)
    ,m_bIsPrimaryKey(rDescr.m_bIsPrimaryKey)
    ,m_bIsCurrency(rDescr.m_bIsCurrency)
    ,m_bHidden(rDescr.m_bHidden)
{
    DBG_CTOR(OFieldDescription,NULL);
}

//------------------------------------------------------------------------------
OFieldDescription::~OFieldDescription()
{
	DBG_DTOR(OFieldDescription,NULL);
}
//------------------------------------------------------------------------------
OFieldDescription::OFieldDescription(const Reference< XPropertySet >& xAffectedCol,sal_Bool _bUseAsDest)
    :m_pType()
	,m_nType(DataType::VARCHAR)
	,m_nPrecision(0)
	,m_nScale(0)
	,m_nIsNullable(ColumnValue::NULLABLE)
	,m_nFormatKey(0)
	,m_eHorJustify(SVX_HOR_JUSTIFY_STANDARD)
	,m_bIsAutoIncrement(sal_False)
    ,m_bIsPrimaryKey(sal_False)
    ,m_bIsCurrency(sal_False)
    ,m_bHidden(sal_False)
{
	DBG_CTOR(OFieldDescription,NULL);
	OSL_ENSURE(xAffectedCol.is(),"PropetySet can notbe null!");
	if ( xAffectedCol.is() )
	{
		if ( _bUseAsDest )
		{
			m_xDest = xAffectedCol;
			m_xDestInfo = xAffectedCol->getPropertySetInfo();;
		}
		else
		{
			try
			{
				Reference<XPropertySetInfo> xPropSetInfo = xAffectedCol->getPropertySetInfo();
				if(xPropSetInfo->hasPropertyByName(PROPERTY_NAME))
					SetName(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_NAME)));
				if(xPropSetInfo->hasPropertyByName(PROPERTY_DESCRIPTION))
					SetDescription(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_DESCRIPTION)));
                if(xPropSetInfo->hasPropertyByName(PROPERTY_HELPTEXT))
                {
                    ::rtl::OUString sHelpText;
                    xAffectedCol->getPropertyValue(PROPERTY_HELPTEXT) >>= sHelpText;
					SetHelpText(sHelpText);
                }
				if(xPropSetInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE))
					SetDefaultValue( xAffectedCol->getPropertyValue(PROPERTY_DEFAULTVALUE) );

				if(xPropSetInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT))
					SetControlDefault( xAffectedCol->getPropertyValue(PROPERTY_CONTROLDEFAULT) );

				if(xPropSetInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION))
					SetAutoIncrementValue(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_AUTOINCREMENTCREATION)));
				if(xPropSetInfo->hasPropertyByName(PROPERTY_TYPE))
					SetTypeValue(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_TYPE)));
                if (xPropSetInfo->hasPropertyByName(PROPERTY_TYPENAME))
					SetTypeName(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_TYPENAME)));
				if(xPropSetInfo->hasPropertyByName(PROPERTY_PRECISION))
					SetPrecision(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_PRECISION)));
				if(xPropSetInfo->hasPropertyByName(PROPERTY_SCALE))
					SetScale(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_SCALE)));
				if(xPropSetInfo->hasPropertyByName(PROPERTY_ISNULLABLE))
					SetIsNullable(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_ISNULLABLE)));
				if(xPropSetInfo->hasPropertyByName(PROPERTY_FORMATKEY))
                {
                    const Any aValue = xAffectedCol->getPropertyValue(PROPERTY_FORMATKEY);
                    if ( aValue.hasValue() )
					    SetFormatKey(::comphelper::getINT32(aValue));
                }
				if(xPropSetInfo->hasPropertyByName(PROPERTY_RELATIVEPOSITION))
					m_aRelativePosition = xAffectedCol->getPropertyValue(PROPERTY_RELATIVEPOSITION);
				if(xPropSetInfo->hasPropertyByName(PROPERTY_WIDTH))
					m_aWidth = xAffectedCol->getPropertyValue(PROPERTY_WIDTH);
				if(xPropSetInfo->hasPropertyByName(PROPERTY_HIDDEN))
					xAffectedCol->getPropertyValue(PROPERTY_HIDDEN) >>= m_bHidden;
				if(xPropSetInfo->hasPropertyByName(PROPERTY_ALIGN))
                {
                    const Any aValue = xAffectedCol->getPropertyValue(PROPERTY_ALIGN);
                    if ( aValue.hasValue() )
					    SetHorJustify( ::dbaui::mapTextJustify(::comphelper::getINT32(aValue)));
                }
				if(xPropSetInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT))
					SetAutoIncrement(::cppu::any2bool(xAffectedCol->getPropertyValue(PROPERTY_ISAUTOINCREMENT)));
			}
			catch(const Exception&)
			{
                DBG_UNHANDLED_EXCEPTION();
			}
		}
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::FillFromTypeInfo(const TOTypeInfoSP& _pType,sal_Bool _bForce,sal_Bool _bReset)
{
	TOTypeInfoSP pOldType = getTypeInfo();
	if ( _pType != pOldType )
	{
		// reset type depending information
		if ( _bReset )
		{
			SetFormatKey(0);
			SetControlDefault(Any());
		}

		sal_Bool bForce = _bForce || pOldType.get() == NULL || pOldType->nType != _pType->nType;
		switch ( _pType->nType )
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
				if ( bForce )
				{
					sal_Int32 nPrec = DEFAULT_VARCHAR_PRECSION;
					if ( GetPrecision() )
						nPrec = GetPrecision();
					SetPrecision(::std::min<sal_Int32>(nPrec,_pType->nPrecision));
				}
				break;
            case DataType::TIMESTAMP:
                if ( bForce && _pType->nMaximumScale)
				{
					SetScale(::std::min<sal_Int32>(GetScale() ? GetScale() : DEFAULT_NUMERIC_SCALE,_pType->nMaximumScale));
				}
                break;
			default:
				if ( bForce )
				{
					sal_Int32 nPrec = DEFAULT_OTHER_PRECSION;
					switch ( _pType->nType )
					{
						case DataType::BIT:
						case DataType::BLOB:
						case DataType::CLOB:
							nPrec = _pType->nPrecision;
							break;
						default:
							if ( GetPrecision() )
								nPrec = GetPrecision();
							break;
					}
					
					if ( _pType->nPrecision )
						SetPrecision(::std::min<sal_Int32>(nPrec ? nPrec : DEFAULT_NUMERIC_PRECSION,_pType->nPrecision));
					if ( _pType->nMaximumScale )
						SetScale(::std::min<sal_Int32>(GetScale() ? GetScale() : DEFAULT_NUMERIC_SCALE,_pType->nMaximumScale));
				}
		}
		if ( !_pType->aCreateParams.getLength() )
		{
			SetPrecision(_pType->nPrecision);
			SetScale(_pType->nMinimumScale);
		}
		if ( !_pType->bNullable && IsNullable() )
			SetIsNullable(ColumnValue::NO_NULLS);
		if ( !_pType->bAutoIncrement && IsAutoIncrement() )
			SetAutoIncrement(sal_False);
		SetCurrency( _pType->bCurrency );
		SetType(_pType);
		SetTypeName(_pType->aTypeName);
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetName(const ::rtl::OUString& _rName)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_NAME) )
			m_xDest->setPropertyValue(PROPERTY_NAME,makeAny(_rName));
		else
			m_sName = _rName;
	}
	catch(const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetHelpText(const ::rtl::OUString& _sHelpText)
{
    try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
			m_xDest->setPropertyValue(PROPERTY_HELPTEXT,makeAny(_sHelpText));
		else
			m_sHelpText = _sHelpText;
	}
	catch(const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetDescription(const ::rtl::OUString& _rDescription)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DESCRIPTION) )
			m_xDest->setPropertyValue(PROPERTY_DESCRIPTION,makeAny(_rDescription));
		else
			m_sDescription = _rDescription;
	}
	catch(const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetDefaultValue(const Any& _rDefaultValue)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE) )
			m_xDest->setPropertyValue(PROPERTY_DEFAULTVALUE,makeAny(_rDefaultValue));
		else
			m_aDefaultValue = _rDefaultValue;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetControlDefault(const Any& _rControlDefault)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
			m_xDest->setPropertyValue(PROPERTY_CONTROLDEFAULT,makeAny(_rControlDefault));
		else
			m_aControlDefault = _rControlDefault;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetAutoIncrementValue(const ::rtl::OUString& _sAutoIncValue)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) )
			m_xDest->setPropertyValue(PROPERTY_AUTOINCREMENTCREATION,makeAny(_sAutoIncValue));
		else
			m_sAutoIncrementValue = _sAutoIncValue;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetType(TOTypeInfoSP _pType)
{
	m_pType = _pType;
	if ( m_pType.get() )
	{
		try
		{
			if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
				m_xDest->setPropertyValue(PROPERTY_TYPE,makeAny(m_pType->nType));
			else
				m_nType = m_pType->nType;
		}
	    catch( const Exception& )
	    {
            DBG_UNHANDLED_EXCEPTION();
	    }
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetTypeValue(sal_Int32 _nType)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
			m_xDest->setPropertyValue(PROPERTY_TYPE,makeAny(_nType));
		else
		{
			m_nType = _nType;
			OSL_ENSURE(!m_pType.get(),"Invalid call here!");
		}
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetPrecision(const sal_Int32& _rPrecision)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_PRECISION) )
			m_xDest->setPropertyValue(PROPERTY_PRECISION,makeAny(_rPrecision));
		else
			m_nPrecision = _rPrecision;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetScale(const sal_Int32& _rScale)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_SCALE) )
			m_xDest->setPropertyValue(PROPERTY_SCALE,makeAny(_rScale));
		else
			m_nScale = _rScale;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetIsNullable(const sal_Int32& _rIsNullable)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
			m_xDest->setPropertyValue(PROPERTY_ISNULLABLE,makeAny(_rIsNullable));
		else
			m_nIsNullable = _rIsNullable;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetFormatKey(const sal_Int32& _rFormatKey)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
			m_xDest->setPropertyValue(PROPERTY_FORMATKEY,makeAny(_rFormatKey));
		else
			m_nFormatKey = _rFormatKey;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetHorJustify(const SvxCellHorJustify& _rHorJustify)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ALIGN) )
			m_xDest->setPropertyValue(PROPERTY_ALIGN,makeAny( dbaui::mapTextAllign(_rHorJustify)));
		else
			m_eHorJustify = _rHorJustify;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetAutoIncrement(sal_Bool _bAuto)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT) )
			m_xDest->setPropertyValue(PROPERTY_ISAUTOINCREMENT,makeAny(_bAuto));
		else
			m_bIsAutoIncrement = _bAuto;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetPrimaryKey(sal_Bool _bPKey)
{
	m_bIsPrimaryKey = _bPKey;
	if ( _bPKey )
		SetIsNullable(::com::sun::star::sdbc::ColumnValue::NO_NULLS);
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetCurrency(sal_Bool _bIsCurrency)
{
	m_bIsCurrency = _bIsCurrency;
}
// -----------------------------------------------------------------------------

::rtl::OUString				OFieldDescription::GetName()				const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_NAME) )
		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_NAME));
	else
		return m_sName;
}
// -----------------------------------------------------------------------------
::rtl::OUString				OFieldDescription::GetDescription()			const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DESCRIPTION) )
		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_DESCRIPTION));
	else
		return m_sDescription;
}
// -----------------------------------------------------------------------------
::rtl::OUString				OFieldDescription::GetHelpText()			const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_HELPTEXT));
	else
		return m_sHelpText;
}
// -----------------------------------------------------------------------------
::com::sun::star::uno::Any	OFieldDescription::GetControlDefault()		const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
		return m_xDest->getPropertyValue(PROPERTY_CONTROLDEFAULT);
	else
		return m_aControlDefault;
}
// -----------------------------------------------------------------------------
::rtl::OUString				OFieldDescription::GetAutoIncrementValue()	const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) )
		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_AUTOINCREMENTCREATION));
	else
		return m_sAutoIncrementValue;
}
// -----------------------------------------------------------------------------
sal_Int32					OFieldDescription::GetType()				const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_TYPE));
	else
		return m_pType.get() ? m_pType->nType : m_nType;
}
// -----------------------------------------------------------------------------
::rtl::OUString             OFieldDescription::GetTypeName()			const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPENAME) )
		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_TYPENAME));
	else
		return m_pType.get() ? m_pType->aTypeName : m_sTypeName;
}
// -----------------------------------------------------------------------------
sal_Int32					OFieldDescription::GetPrecision()			const
{
    sal_Int32 nPrec = m_nPrecision;
    if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_PRECISION) )
		nPrec = ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_PRECISION));

    TOTypeInfoSP pTypeInfo = getTypeInfo();
    if ( pTypeInfo )
    {
	    switch ( pTypeInfo->nType )
	    {
            case DataType::TINYINT:
            case DataType::SMALLINT:
		    case DataType::INTEGER:
            case DataType::BIGINT:
                if ( !nPrec )
                    nPrec = pTypeInfo->nPrecision;
                break;
        } // switch ( pTypeInfo->nType )
    }
	
	return nPrec;
}
// -----------------------------------------------------------------------------
sal_Int32					OFieldDescription::GetScale()				const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_SCALE) )
		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_SCALE));
	else
		return m_nScale;
}
// -----------------------------------------------------------------------------
sal_Int32					OFieldDescription::GetIsNullable()			const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ISNULLABLE));
	else
		return m_nIsNullable;
}
// -----------------------------------------------------------------------------
sal_Int32					OFieldDescription::GetFormatKey()			const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_FORMATKEY));
	else
		return m_nFormatKey;
}
// -----------------------------------------------------------------------------
SvxCellHorJustify			OFieldDescription::GetHorJustify()			const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ALIGN) )
		return ::dbaui::mapTextJustify(::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ALIGN)));
	else
		return m_eHorJustify;
}
// -----------------------------------------------------------------------------
TOTypeInfoSP				OFieldDescription::getTypeInfo()			const
{
	return m_pType;
}
// -----------------------------------------------------------------------------
TOTypeInfoSP				OFieldDescription::getSpecialTypeInfo()	const
{
    TOTypeInfoSP pSpecialType( new OTypeInfo() );
    *pSpecialType = *m_pType;
    pSpecialType->nPrecision = GetPrecision();
    pSpecialType->nMaximumScale = static_cast<sal_Int16>(GetScale());
    pSpecialType->bAutoIncrement = IsAutoIncrement(); // http://dba.openoffice.org/issues/show_bug.cgi?id=115398 fixed by ludob
    return pSpecialType;
}
// -----------------------------------------------------------------------------
sal_Bool					OFieldDescription::IsAutoIncrement()		const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT) )
		return ::cppu::any2bool(m_xDest->getPropertyValue(PROPERTY_ISAUTOINCREMENT));
	else
		return m_bIsAutoIncrement;
}
// -----------------------------------------------------------------------------
sal_Bool					OFieldDescription::IsPrimaryKey()			const
{
	return m_bIsPrimaryKey;
}
// -----------------------------------------------------------------------------
sal_Bool					OFieldDescription::IsCurrency()				const
{
		return m_bIsCurrency;
}
// -----------------------------------------------------------------------------
sal_Bool					OFieldDescription::IsNullable()				const
{
	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ISNULLABLE)) == ::com::sun::star::sdbc::ColumnValue::NULLABLE;
	else
		return m_nIsNullable == ::com::sun::star::sdbc::ColumnValue::NULLABLE;
}
// -----------------------------------------------------------------------------
void OFieldDescription::SetTypeName(const ::rtl::OUString& _sTypeName)
{
	try
	{
		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPENAME) )
			m_xDest->setPropertyValue(PROPERTY_TYPENAME,makeAny(_sTypeName));
		else
			m_sTypeName = _sTypeName;
	}
	catch( const Exception& )
	{
        DBG_UNHANDLED_EXCEPTION();
	}
}
// -----------------------------------------------------------------------------
void OFieldDescription::copyColumnSettingsTo(const Reference< XPropertySet >& _rxColumn)
{
	if ( _rxColumn.is() )
	{
		Reference<XPropertySetInfo> xInfo = _rxColumn->getPropertySetInfo();

		if ( GetFormatKey() != NumberFormat::ALL && xInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
			_rxColumn->setPropertyValue(PROPERTY_FORMATKEY,makeAny(GetFormatKey()));
		if ( GetHorJustify() != SVX_HOR_JUSTIFY_STANDARD && xInfo->hasPropertyByName(PROPERTY_ALIGN) )
			_rxColumn->setPropertyValue(PROPERTY_ALIGN,makeAny(dbaui::mapTextAllign(GetHorJustify())));
		if ( GetHelpText().getLength() && xInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
			_rxColumn->setPropertyValue(PROPERTY_HELPTEXT,makeAny(GetHelpText()));
		if ( GetControlDefault().hasValue() && xInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
			_rxColumn->setPropertyValue(PROPERTY_CONTROLDEFAULT,GetControlDefault());

		if(xInfo->hasPropertyByName(PROPERTY_RELATIVEPOSITION))
			_rxColumn->setPropertyValue(PROPERTY_RELATIVEPOSITION,m_aRelativePosition);
		if(xInfo->hasPropertyByName(PROPERTY_WIDTH))
			_rxColumn->setPropertyValue(PROPERTY_WIDTH,m_aWidth);
		if(xInfo->hasPropertyByName(PROPERTY_HIDDEN))
			_rxColumn->setPropertyValue(PROPERTY_HIDDEN,makeAny(m_bHidden));
	}
}
// -----------------------------------------------------------------------------
