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


#ifndef DBAUI_CONNECTIONLINEDATA_HXX
#define DBAUI_CONNECTIONLINEDATA_HXX

#ifndef DBAUI_ENUMTYPES_HXX
#include "QEnumTypes.hxx"
#endif
#ifndef _VOS_REFERNCE_HXX_
#include <vos/refernce.hxx>
#endif
#include <vector>

#ifndef _VOS_REF_HXX_
#include <vos/ref.hxx>
#endif

#ifndef DBAUI_REFFUNCTOR_HXX
#include "RefFunctor.hxx"
#endif
#ifndef _RTL_USTRING_HXX_
#include <rtl/ustring.hxx>
#endif

namespace dbaui
{

	//==================================================================
	// ConnData		---------->*	ConnLineData
	//    ^1							^1
	//    |								|
	//	Conn		---------->*	ConnLine
	//==================================================================


	//==================================================================
	/**
		the class OConnectionLineData contains the data of a connection
		e.g. the source and the destanation field
	**/
	class OConnectionLineData : public ::vos::OReference
	{
		::rtl::OUString m_aSourceFieldName;
		::rtl::OUString m_aDestFieldName;

        friend bool operator==(const OConnectionLineData& lhs, const OConnectionLineData& rhs);
		friend bool operator!=(const OConnectionLineData& lhs, const OConnectionLineData& rhs) { return !(lhs == rhs); }
	protected:
		virtual ~OConnectionLineData();
	public:
		OConnectionLineData();
		OConnectionLineData( const ::rtl::OUString& rSourceFieldName, const ::rtl::OUString& rDestFieldName );
		OConnectionLineData( const OConnectionLineData& rConnLineData );

		// eine Kopie der eigenen Instanz liefern (das ist mir irgendwie angenehmer als ein virtueller Zuweisungsoperator)
		void CopyFrom(const OConnectionLineData& rSource);

		// Memberzugriff (schreiben)
		void SetFieldName(EConnectionSide nWhich, const ::rtl::OUString& strFieldName)
		{
			if (nWhich==JTCS_FROM)
				m_aSourceFieldName = strFieldName;
			else
				m_aDestFieldName = strFieldName;
		}
		void SetSourceFieldName( const ::rtl::OUString& rSourceFieldName){ SetFieldName(JTCS_FROM, rSourceFieldName); }
		void SetDestFieldName( const ::rtl::OUString& rDestFieldName ){ SetFieldName(JTCS_TO, rDestFieldName); }

		inline bool clearSourceFieldName() { SetSourceFieldName(::rtl::OUString()); return true;}
		inline bool clearDestFieldName() { SetDestFieldName(::rtl::OUString());		return true;}

		// Memberzugriff (lesen)
		::rtl::OUString GetFieldName(EConnectionSide nWhich) const { return (nWhich == JTCS_FROM) ? m_aSourceFieldName : m_aDestFieldName; }
		::rtl::OUString GetSourceFieldName() const { return GetFieldName(JTCS_FROM); }
		::rtl::OUString GetDestFieldName() const { return GetFieldName(JTCS_TO); }

		bool Reset();
		OConnectionLineData& operator=( const OConnectionLineData& rConnLineData );
	};

    //-------------------------------------------------------------------------
	//------------------------------------------------------------------
	typedef ::vos::ORef< OConnectionLineData >		OConnectionLineDataRef;
	typedef ::std::vector< OConnectionLineDataRef >	OConnectionLineDataVec;
}
#endif // DBAUI_CONNECTIONLINEDATA_HXX
