/**************************************************************
 * 
 * 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_TABLECONNECTIONDATA_HXX
#include "TableConnectionData.hxx"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _COMPHELPER_STLTYPES_HXX_
#include <comphelper/stl_types.hxx>
#endif

using namespace dbaui;
using namespace comphelper;
//==================================================================
// class OTableConnectionData
//==================================================================
DBG_NAME(OTableConnectionData)
//------------------------------------------------------------------------
OTableConnectionData::OTableConnectionData()
{
	DBG_CTOR(OTableConnectionData,NULL);
	Init();
}
// -----------------------------------------------------------------------------
OTableConnectionData::OTableConnectionData(const TTableWindowData::value_type& _pReferencingTable
                                          ,const TTableWindowData::value_type& _pReferencedTable
                                          ,const String& rConnName )
 :m_pReferencingTable(_pReferencingTable)
 ,m_pReferencedTable(_pReferencedTable)
 ,m_aConnName( rConnName )
{
    DBG_CTOR(OTableConnectionData,NULL);
	Init();
}
//------------------------------------------------------------------------
void OTableConnectionData::Init()
{
	//////////////////////////////////////////////////////////////////////
	// LineDataList mit Defaults initialisieren
	DBG_ASSERT(m_vConnLineData.size() == 0, "OTableConnectionData::Init() : nur mit leere Linienliste aufzurufen !");
	ResetConnLines(sal_True);
		// das legt Defaults an
}
//------------------------------------------------------------------------
OTableConnectionData::OTableConnectionData( const OTableConnectionData& rConnData )
{
	DBG_CTOR(OTableConnectionData,NULL);
	*this = rConnData;
}
//------------------------------------------------------------------------
void OTableConnectionData::CopyFrom(const OTableConnectionData& rSource)
{
	*this = rSource;
	// hier ziehe ich mich auf das (nicht-virtuelle) operator= zurueck, das nur meine Members kopiert
}

//------------------------------------------------------------------------
OTableConnectionData::~OTableConnectionData()
{
	DBG_DTOR(OTableConnectionData,NULL);
	// LineDataList loeschen
	OConnectionLineDataVec().swap(m_vConnLineData);
	//ResetConnLines(sal_False);	
}

//------------------------------------------------------------------------
OTableConnectionData& OTableConnectionData::operator=( const OTableConnectionData& rConnData )
{
	if (&rConnData == this)
		return *this;

	m_pReferencingTable = rConnData.m_pReferencingTable;
	m_pReferencedTable = rConnData.m_pReferencedTable;
	m_aConnName = rConnData.GetConnName();

	// clear line list
	ResetConnLines(sal_False);

	// und kopieren
	OConnectionLineDataVec* pLineData = const_cast<OTableConnectionData*>(&rConnData)->GetConnLineDataList();
	
	OConnectionLineDataVec::const_iterator aIter = pLineData->begin();
    OConnectionLineDataVec::const_iterator aEnd = pLineData->end();
	for(;aIter != aEnd;++aIter)
		m_vConnLineData.push_back(new OConnectionLineData(**aIter));

	return *this;
}

//------------------------------------------------------------------------
sal_Bool OTableConnectionData::SetConnLine( sal_uInt16 nIndex, const String& rSourceFieldName, const String& rDestFieldName )
{
	if (sal_uInt16(m_vConnLineData.size()) < nIndex)
		return sal_False;
		// == ist noch erlaubt, das entspricht einem Append

	if (m_vConnLineData.size() == nIndex)
		return AppendConnLine(rSourceFieldName, rDestFieldName);

	OConnectionLineDataRef pConnLineData = m_vConnLineData[nIndex];
	DBG_ASSERT(pConnLineData != NULL, "OTableConnectionData::SetConnLine : habe ungueltiges LineData-Objekt");

	pConnLineData->SetSourceFieldName( rSourceFieldName );
	pConnLineData->SetDestFieldName( rDestFieldName );

	return sal_True;
}

//------------------------------------------------------------------------
sal_Bool OTableConnectionData::AppendConnLine( const ::rtl::OUString& rSourceFieldName, const ::rtl::OUString& rDestFieldName )
{
	OConnectionLineDataVec::iterator aIter = m_vConnLineData.begin();
    OConnectionLineDataVec::iterator aEnd = m_vConnLineData.end();
	for(;aIter != aEnd;++aIter)
	{
		if((*aIter)->GetDestFieldName() == rDestFieldName && (*aIter)->GetSourceFieldName() == rSourceFieldName)
			break;
	}
	if(aIter == aEnd)
	{
		OConnectionLineDataRef pNew = new OConnectionLineData(rSourceFieldName, rDestFieldName);
		if (!pNew.isValid())
			return sal_False;

		m_vConnLineData.push_back(pNew);
	}
	return sal_True;
}

//------------------------------------------------------------------------
void OTableConnectionData::ResetConnLines( sal_Bool /*bUseDefaults*/ )
{
	OConnectionLineDataVec().swap(m_vConnLineData);
}

//------------------------------------------------------------------------
OConnectionLineDataRef OTableConnectionData::CreateLineDataObj()
{
	return new OConnectionLineData();
}

//------------------------------------------------------------------------
OConnectionLineDataRef OTableConnectionData::CreateLineDataObj( const OConnectionLineData& rConnLineData )
{
	return new OConnectionLineData( rConnLineData );
}
// -----------------------------------------------------------------------------
OTableConnectionData* OTableConnectionData::NewInstance() const 
{ 
	return new OTableConnectionData(); 
}
// -----------------------------------------------------------------------------
void OTableConnectionData::normalizeLines()
{
	// noch ein wenig Normalisierung auf den LineDatas : leere Lines vom Anfang an das Ende verschieben
	sal_Int32 nCount = m_vConnLineData.size();
	for(sal_Int32 i=0;i<nCount;)
	{
		if(!m_vConnLineData[i]->GetSourceFieldName().getLength() || !m_vConnLineData[i]->GetDestFieldName().getLength())
		{
			OConnectionLineDataRef pData = m_vConnLineData[i];
			m_vConnLineData.erase(m_vConnLineData.begin()+i);
			m_vConnLineData.push_back(pData);
			--nCount;
		}
		else
			++i;
	}
}
// -----------------------------------------------------------------------------




