/**************************************************************
 * 
 * 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_dbui.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;
	}
	// -----------------------------------------------------------------------------
}



