/**************************************************************
 * 
 * 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_TABLEROW_HXX
#include "TableRow.hxx"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef DBAUI_FIELDDESCRIPTIONS_HXX
#include "FieldDescriptions.hxx"
#endif
#include <algorithm>
#include <comphelper/types.hxx>

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

//========================================================================
// class OTableRow
//========================================================================
DBG_NAME(OTableRow)
//------------------------------------------------------------------------------
OTableRow::OTableRow() 
	:m_pActFieldDescr( NULL )
	,m_nPos( -1 )
	,m_bReadOnly( false )
	,m_bOwnsDescriptions(false)
{
	DBG_CTOR(OTableRow,NULL);
}												 
//------------------------------------------------------------------------------
OTableRow::OTableRow(const Reference< XPropertySet >& xAffectedCol)
	:m_pActFieldDescr( NULL )
	,m_nPos( -1 )
	,m_bReadOnly( false )
	,m_bOwnsDescriptions(true)
{
	DBG_CTOR(OTableRow,NULL);
	m_pActFieldDescr = new OFieldDescription(xAffectedCol);
}
//------------------------------------------------------------------------------
OTableRow::OTableRow( const OTableRow& rRow, long nPosition )
    :m_pActFieldDescr(NULL)
	,m_nPos( nPosition )
	,m_bReadOnly(rRow.IsReadOnly())
	,m_bOwnsDescriptions(false)
{
	DBG_CTOR(OTableRow,NULL);

	OFieldDescription* pSrcField = rRow.GetActFieldDescr();
	if(pSrcField)
	{
		m_pActFieldDescr = new OFieldDescription(*pSrcField);
		m_bOwnsDescriptions = true;
	}
}

//------------------------------------------------------------------------------
OTableRow::~OTableRow()
{
	DBG_DTOR(OTableRow,NULL);
	if(m_bOwnsDescriptions)
		delete m_pActFieldDescr;	
}

//------------------------------------------------------------------------------
void OTableRow::SetPrimaryKey( sal_Bool bSet )
{
	DBG_CHKTHIS(OTableRow,NULL);
	if(m_pActFieldDescr)
		m_pActFieldDescr->SetPrimaryKey(bSet);
}
// -----------------------------------------------------------------------------
sal_Bool OTableRow::IsPrimaryKey() const
{
	DBG_CHKTHIS(OTableRow,NULL);
	return m_pActFieldDescr && m_pActFieldDescr->IsPrimaryKey();
}
// -----------------------------------------------------------------------------
void OTableRow::SetFieldType( const TOTypeInfoSP& _pType, sal_Bool _bForce )
{
	DBG_CHKTHIS(OTableRow,NULL);
	if ( _pType.get() )
	{
		if( !m_pActFieldDescr )
		{
			m_pActFieldDescr = new OFieldDescription();
			m_bOwnsDescriptions = true;
		}
		m_pActFieldDescr->FillFromTypeInfo(_pType,_bForce,sal_True);
	}
	else
	{
		delete m_pActFieldDescr;
		m_pActFieldDescr = NULL;
	}
}
// -----------------------------------------------------------------------------
namespace dbaui
{
	// -----------------------------------------------------------------------------
	SvStream& operator<<( SvStream& _rStr, const OTableRow& _rRow )
	{
		_rStr << _rRow.m_nPos;
		OFieldDescription* pFieldDesc = _rRow.GetActFieldDescr();
		if(pFieldDesc)
		{
			_rStr << (sal_Int32)1;
			_rStr.WriteByteString(pFieldDesc->GetName());
			_rStr.WriteByteString(pFieldDesc->GetDescription());
            _rStr.WriteByteString(pFieldDesc->GetHelpText());
			double nValue = 0.0;
			Any aValue = pFieldDesc->GetControlDefault();
			if ( aValue >>= nValue )
			{
				_rStr << sal_Int32(1);
				_rStr << nValue;
			}
			else 
			{
				_rStr << sal_Int32(2);
				_rStr.WriteByteString(::comphelper::getString(aValue));
			}

			_rStr << pFieldDesc->GetType();

			_rStr << pFieldDesc->GetPrecision();
			_rStr << pFieldDesc->GetScale();
			_rStr << pFieldDesc->GetIsNullable();
			_rStr << pFieldDesc->GetFormatKey();
			_rStr << (sal_Int32)pFieldDesc->GetHorJustify();
			_rStr << sal_Int32(pFieldDesc->IsAutoIncrement() ? 1 : 0);
			_rStr << sal_Int32(pFieldDesc->IsPrimaryKey() ? 1 : 0);
			_rStr << sal_Int32(pFieldDesc->IsCurrency() ? 1 : 0);
		} // if(pFieldDesc)
		else
			_rStr << (sal_Int32)0;
		return _rStr;
	}
	// -----------------------------------------------------------------------------
	SvStream& operator>>( SvStream& _rStr, OTableRow& _rRow )
	{
		_rStr >> _rRow.m_nPos;
		sal_Int32 nValue = 0;
		_rStr >> nValue;
		if ( nValue )
		{		
			OFieldDescription* pFieldDesc = new OFieldDescription();
			_rRow.m_pActFieldDescr = pFieldDesc;
			String sValue;
			_rStr.ReadByteString(sValue);
			pFieldDesc->SetName(sValue);
			
			_rStr.ReadByteString(sValue);
			pFieldDesc->SetDescription(sValue);
            _rStr.ReadByteString(sValue);
			pFieldDesc->SetHelpText(sValue);

			_rStr >> nValue;
			Any aControlDefault;
			switch ( nValue )
			{
				case 1:
				{
					double nControlDefault;
					_rStr >> nControlDefault;
					aControlDefault <<= nControlDefault;
					break;
				}
				case 2:
					_rStr.ReadByteString(sValue);
					aControlDefault <<= ::rtl::OUString(sValue);
					break;
			}

			pFieldDesc->SetControlDefault(aControlDefault);

			
			_rStr >> nValue;
			pFieldDesc->SetTypeValue(nValue);

			_rStr >> nValue;
			pFieldDesc->SetPrecision(nValue);
			_rStr >> nValue;
			pFieldDesc->SetScale(nValue);
			_rStr >> nValue;
			pFieldDesc->SetIsNullable(nValue);
			_rStr >> nValue;
			pFieldDesc->SetFormatKey(nValue);
			_rStr >> nValue;
			pFieldDesc->SetHorJustify((SvxCellHorJustify)nValue);

			_rStr >> nValue;
			pFieldDesc->SetAutoIncrement(nValue != 0);
			_rStr >> nValue;
			pFieldDesc->SetPrimaryKey(nValue != 0);
			_rStr >> nValue;
			pFieldDesc->SetCurrency(nValue != 0);
		}
		return _rStr;
	}
	// -----------------------------------------------------------------------------
}



