/**************************************************************
 *
 * 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_RELATIONCONTROL_HXX
#define DBAUI_RELATIONCONTROL_HXX

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef DBAUI_JOINTABLEVIEW_HXX
#include "JoinTableView.hxx"
#endif

namespace dbaui
{
	//========================================================================
	class OTableListBoxControl;
	class OTableConnectionData;
	class ORelationTableConnectionData;
	class IRelationControlInterface;
	class ORelationControl;

	class OTableListBoxControl	: public Window
	{
		FixedLine								m_aFL_InvolvedTables;
		ListBox									m_lmbLeftTable,
												m_lmbRightTable;
		FixedLine								m_aFL_InvolvedFields;

		ORelationControl*						m_pRC_Tables;
		const OJoinTableView::OTableWindowMap*	m_pTableMap;
		IRelationControlInterface*				m_pParentDialog;
		String									m_strCurrentLeft;
		String									m_strCurrentRight;
	private:
		DECL_LINK( OnTableChanged, ListBox* );
	public:
		OTableListBoxControl(Window* _pParent,
							 const ResId& _rResId,
							 const OJoinTableView::OTableWindowMap*	_pTableMap,
							 IRelationControlInterface* _pParentDialog);
		virtual ~OTableListBoxControl();

		/** fillListBoxes fills the list boxes with the table windows
		*/
		void fillListBoxes();

		/** fillAndDisable fill the listboxes only with one entry and then disable them
			@param	_pConnectionData
					contains the data which should be filled into the listboxes
		*/
		void fillAndDisable(const TTableConnectionData::value_type& _pConnectionData);

		/** enables the relation control
		*
		* \param _bEnable when sal_True enables it, otherwise disable it.
		*/
		void enableRelation(bool _bEnable);

		/** NotifyCellChange notifies the browse control that the connection data has changed
		*/
		void NotifyCellChange();

		/** Init is a call through to the control inside this one
			@param	_pConnData
					the connection data which is used to init the control
		*/
		void Init(const TTableConnectionData::value_type& _pConnData);
		void lateUIInit(Window* _pTableSeparator = NULL);
		void lateInit();

		sal_Bool SaveModified();

		TTableWindowData::value_type getReferencingTable()	const;

		/** getContainer returns the container interface
			@return the interface of the container
		*/
		IRelationControlInterface* getContainer() const { return m_pParentDialog; }
	};
}
#endif // DBAUI_RELATIONCONTROL_HXX

/* vim: set noet sw=4 ts=4: */
