/**************************************************************
 *
 * 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_TABLECONNECTION_HXX
#include "TableConnection.hxx"
#endif
#ifndef DBAUI_CONNECTIONLINE_HXX
#include "ConnectionLine.hxx"
#endif
#ifndef DBAUI_TABLECONNECTIONDATA_HXX
#include "TableConnectionData.hxx"
#endif
#ifndef DBAUI_JOINTABLEVIEW_HXX
#include "JoinTableView.hxx"
#endif
#ifndef _COMPHELPER_STLTYPES_HXX_
#include <comphelper/stl_types.hxx>
#endif
#ifndef DBACCESS_CONNECTIONLINEACCESS_HXX
#include "ConnectionLineAccess.hxx"
#endif
#include <algorithm>


using namespace dbaui;
using namespace comphelper;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::accessibility;

//========================================================================
// class OTableConnection
//========================================================================
namespace dbaui
{
	DBG_NAME(OTableConnection)
	//------------------------------------------------------------------------
    OTableConnection::OTableConnection( OJoinTableView* _pContainer,const TTableConnectionData::value_type& _pTabConnData )
		:Window(_pContainer)
		,m_pData( _pTabConnData )
		,m_pParent( _pContainer )
		,m_bSelected( sal_False )
	{
		DBG_CTOR(OTableConnection,NULL);
		Init();
		Show();
	}

	//------------------------------------------------------------------------
	OTableConnection::OTableConnection( const OTableConnection& _rConn ) : Window(_rConn.m_pParent)
        ,m_pData(_rConn.GetData()->NewInstance())
	{
		DBG_CTOR(OTableConnection,NULL);
		*this = _rConn;
	}

	//------------------------------------------------------------------------
	void OTableConnection::Init()
	{
		//////////////////////////////////////////////////////////////////////
		// Linienliste mit Defaults initialisieren
		OConnectionLineDataVec* pLineData = GetData()->GetConnLineDataList();
		OConnectionLineDataVec::const_iterator aIter = pLineData->begin();
        OConnectionLineDataVec::const_iterator aEnd = pLineData->end();
		m_vConnLine.reserve(pLineData->size());
		for(;aIter != aEnd;++aIter)
			m_vConnLine.push_back( new OConnectionLine(this, *aIter) );
	}

	//------------------------------------------------------------------------
	OConnectionLine* OTableConnection::CreateConnLine( const OConnectionLine& rConnLine )
	{
		return new OConnectionLine( rConnLine );
	}
	// -----------------------------------------------------------------------------
	void OTableConnection::clearLineData()
	{
        ::std::vector<OConnectionLine*>::iterator aLineEnd = m_vConnLine.end();
		for(::std::vector<OConnectionLine*>::iterator aLineIter = m_vConnLine.begin();aLineIter != aLineEnd;++aLineIter)
			delete *aLineIter;
		m_vConnLine.clear();
	}
	//------------------------------------------------------------------------
	void OTableConnection::UpdateLineList()
	{
		//////////////////////////////////////////////////////////////////////
		// Linienliste loeschen
		clearLineData();

		Init();
	}

	//------------------------------------------------------------------------
	OTableConnection& OTableConnection::operator=( const OTableConnection& rConn )
	{
		if( &rConn == this )
			return *this;

		// Linienliste loeschen
		clearLineData();

		// Linienliste kopieren
		if(! rConn.GetConnLineList()->empty() )
		{
			const ::std::vector<OConnectionLine*>* pLine = rConn.GetConnLineList();
			::std::vector<OConnectionLine*>::const_iterator aIter = pLine->begin();
            ::std::vector<OConnectionLine*>::const_iterator aEnd = pLine->end();
			m_vConnLine.reserve(pLine->size());
			for(;aIter != aEnd;++aIter)
				m_vConnLine.push_back( CreateConnLine( **aIter ));
		}

		// da mir die Daten nicht gehoeren, loesche ich die alten nicht
		m_pData->CopyFrom(*rConn.GetData());
			// CopyFrom ist virtuell, damit ist es kein Problem, wenn m_pData von einem von OTableConnectionData abgeleiteten Typ ist

		m_bSelected = rConn.m_bSelected;
		m_pParent = rConn.m_pParent;

		return *this;
	}


	//------------------------------------------------------------------------
	bool OTableConnection::RecalcLines()
	{
		// call RecalcLines on each line
		::std::for_each(m_vConnLine.begin(),m_vConnLine.end(),::std::mem_fun(&OConnectionLine::RecalcLine));
		return true;
	}
	//------------------------------------------------------------------------
	OTableWindow* OTableConnection::GetSourceWin() const
	{
        TTableWindowData::value_type pRef = GetData()->getReferencingTable();
        OTableWindow* pRet = m_pParent->GetTabWindow( pRef->GetWinName() );
        if ( !pRet )
        {
            pRet = m_pParent->GetTabWindow( pRef->GetComposedName() );
        }
		return pRet;
	}
	//------------------------------------------------------------------------
	OTableWindow* OTableConnection::GetDestWin() const
	{
        TTableWindowData::value_type pRef = GetData()->getReferencedTable();
        OTableWindow* pRet = m_pParent->GetTabWindow( pRef->GetWinName() );
        if ( !pRet )
        {
            pRet = m_pParent->GetTabWindow( pRef->GetComposedName() );
        }
		return pRet;
	}

	//------------------------------------------------------------------------
	void OTableConnection::Select()
	{
		m_bSelected = sal_True;
		m_pParent->Invalidate( GetBoundingRect(), INVALIDATE_NOCHILDREN);
	}

	//------------------------------------------------------------------------
	void OTableConnection::Deselect()
	{
		m_bSelected = sal_False;
		InvalidateConnection();
	}

	//------------------------------------------------------------------------
	sal_Bool OTableConnection::CheckHit( const Point& rMousePos ) const
	{
		//////////////////////////////////////////////////////////////////////
		// check if the point hit our line
		::std::vector<OConnectionLine*>::const_iterator aIter = ::std::find_if(m_vConnLine.begin(),
																		 m_vConnLine.end(),
																		 ::std::bind2nd(TConnectionLineCheckHitFunctor(),rMousePos));
		return aIter != m_vConnLine.end();
	}

	//------------------------------------------------------------------------
	bool OTableConnection::InvalidateConnection()
	{
		Rectangle rcBounding = GetBoundingRect();
		rcBounding.Bottom() += 1;
		rcBounding.Right() += 1;
			// ich glaube, dass sich Invalidate und Draw(Rectangle) nicht konsistent verhalten : jedenfalls waere dadurch zu
			// erklaeren, warum ohne diesen Fake hier beim Loeschen einer Connection ein Strich an ihrem unteren Ende stehen bleibt :
			// Invalidate erfasst dabei offensichtlich eine Pixelzeile weniger als Draw.
			// Oder alles haengt ganz anders zusammen ... jedenfalls klappt es so ...
		m_pParent->Invalidate( rcBounding, INVALIDATE_NOCHILDREN );

		return true;
	}

	//------------------------------------------------------------------------
	Rectangle OTableConnection::GetBoundingRect() const
	{
		//////////////////////////////////////////////////////////////////////
		// Aus allen Linien das umgebende Rechteck bestimmen
		Rectangle aBoundingRect( Point(0,0), Point(0,0) );
		Rectangle aTempRect;
        ::std::vector<OConnectionLine*>::const_iterator aEnd = m_vConnLine.end();
		for(::std::vector<OConnectionLine*>::const_iterator aIter = m_vConnLine.begin();aIter != aEnd;++aIter)
		{
			aTempRect = (*aIter)->GetBoundingRect();

			//////////////////////////////////////////////////////////////////////
			// Ist das BoundingRect dieser Linie gueltig?
			if( (aTempRect.GetWidth()!=1) && (aTempRect.GetHeight()!=1) )
			{
				if( (aBoundingRect.GetWidth()==1) && (aBoundingRect.GetHeight()==1) )
					aBoundingRect = aTempRect;
				else
					aBoundingRect.Union( aTempRect );
			}
		}

		return aBoundingRect;
	}

	//------------------------------------------------------------------------
	void OTableConnection::Draw( const Rectangle& /*rRect*/ )
	{
		//////////////////////////////////////////////////////////////////////
		// Linien zeichnen
		::std::for_each(m_vConnLine.begin(),m_vConnLine.end(),TConnectionLineDrawFunctor(m_pParent));
	}
	// -----------------------------------------------------------------------------
}
