xref: /AOO41X/main/dbaccess/source/ui/control/RelationControl.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
30*cdf0e10cSrcweir #ifndef DBAUI_RELATIONCONTROL_HXX
31*cdf0e10cSrcweir #include "RelationControl.hxx"
32*cdf0e10cSrcweir #endif
33*cdf0e10cSrcweir #ifndef DBACCESS_SOURCE_UI_INC_RELATIONCONTROL_HRC
34*cdf0e10cSrcweir #include "RelationControl.hrc"
35*cdf0e10cSrcweir #endif
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir #ifndef _SVTOOLS_EDITBROWSEBOX_HXX_
38*cdf0e10cSrcweir #include <svtools/editbrowsebox.hxx>
39*cdf0e10cSrcweir #endif
40*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
41*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
42*cdf0e10cSrcweir #endif
43*cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX
44*cdf0e10cSrcweir #include <tools/debug.hxx>
45*cdf0e10cSrcweir #endif
46*cdf0e10cSrcweir #ifndef TOOLS_DIAGNOSE_EX_H
47*cdf0e10cSrcweir #include <tools/diagnose_ex.h>
48*cdf0e10cSrcweir #endif
49*cdf0e10cSrcweir #ifndef DBAUI_TABLECONNECTIONDATA_HXX
50*cdf0e10cSrcweir #include "TableConnectionData.hxx"
51*cdf0e10cSrcweir #endif
52*cdf0e10cSrcweir #ifndef DBAUI_TABLECONNECTION_HXX
53*cdf0e10cSrcweir #include "TableConnection.hxx"
54*cdf0e10cSrcweir #endif
55*cdf0e10cSrcweir #ifndef DBAUI_TABLEWINDOW_HXX
56*cdf0e10cSrcweir #include "TableWindow.hxx"
57*cdf0e10cSrcweir #endif
58*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_
59*cdf0e10cSrcweir #include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
60*cdf0e10cSrcweir #endif
61*cdf0e10cSrcweir #ifndef DBAUI_TOOLS_HXX
62*cdf0e10cSrcweir #include "UITools.hxx"
63*cdf0e10cSrcweir #endif
64*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
65*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
66*cdf0e10cSrcweir #endif
67*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
68*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
69*cdf0e10cSrcweir #endif
70*cdf0e10cSrcweir #ifndef DBAUI_RELCONTROLIFACE_HXX
71*cdf0e10cSrcweir #include "RelControliFace.hxx"
72*cdf0e10cSrcweir #endif
73*cdf0e10cSrcweir #ifndef _DBU_CONTROL_HRC_
74*cdf0e10cSrcweir #include "dbu_control.hrc"
75*cdf0e10cSrcweir #endif
76*cdf0e10cSrcweir #ifndef _DBA_DBACCESS_HELPID_HRC_
77*cdf0e10cSrcweir #include "dbaccess_helpid.hrc"
78*cdf0e10cSrcweir #endif
79*cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX
80*cdf0e10cSrcweir #include <tools/debug.hxx>
81*cdf0e10cSrcweir #endif
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir #include <algorithm>
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir #define SOURCE_COLUMN	1
86*cdf0e10cSrcweir #define DEST_COLUMN		2
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir namespace dbaui
89*cdf0e10cSrcweir {
90*cdf0e10cSrcweir 	using namespace ::com::sun::star::uno;
91*cdf0e10cSrcweir 	using namespace ::com::sun::star::beans;
92*cdf0e10cSrcweir 	using namespace ::com::sun::star::sdbc;
93*cdf0e10cSrcweir 	using namespace ::com::sun::star::sdbcx;
94*cdf0e10cSrcweir 	using namespace ::com::sun::star::container;
95*cdf0e10cSrcweir 	using namespace svt;
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir 	typedef ::svt::EditBrowseBox ORelationControl_Base;
98*cdf0e10cSrcweir 	class ORelationControl : public ORelationControl_Base
99*cdf0e10cSrcweir 	{
100*cdf0e10cSrcweir 		friend class OTableListBoxControl;
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir         ::std::auto_ptr< ::svt::ListBoxControl> m_pListCell;
103*cdf0e10cSrcweir 		TTableConnectionData::value_type		m_pConnData;
104*cdf0e10cSrcweir 		const OJoinTableView::OTableWindowMap*	m_pTableMap;
105*cdf0e10cSrcweir 		OTableListBoxControl*					m_pBoxControl;
106*cdf0e10cSrcweir 		long									m_nDataPos;
107*cdf0e10cSrcweir 		Reference< XPropertySet>				m_xSourceDef;
108*cdf0e10cSrcweir 		Reference< XPropertySet>				m_xDestDef;
109*cdf0e10cSrcweir 
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 		void fillListBox(const Reference< XPropertySet>& _xDest,long nRow,sal_uInt16 nColumnId);
112*cdf0e10cSrcweir 		/** returns the column id for the editbrowsebox
113*cdf0e10cSrcweir 			@param	_nColId
114*cdf0e10cSrcweir 					the column id SOURCE_COLUMN or DEST_COLUMN
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 			@return	the current column id eihter SOURCE_COLUMN or DEST_COLUMN depends on the connection data
117*cdf0e10cSrcweir 		*/
118*cdf0e10cSrcweir 		sal_uInt16 getColumnIdent( sal_uInt16 _nColId ) const;
119*cdf0e10cSrcweir 	public:
120*cdf0e10cSrcweir 		ORelationControl( OTableListBoxControl* pParent,const OJoinTableView::OTableWindowMap* _pTableMap );
121*cdf0e10cSrcweir 		virtual ~ORelationControl();
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 		/** searches for a connection between these two tables
124*cdf0e10cSrcweir 			@param	_pSource
125*cdf0e10cSrcweir 					the left table
126*cdf0e10cSrcweir 			@param	_pDest
127*cdf0e10cSrcweir 					the right window
128*cdf0e10cSrcweir 		*/
129*cdf0e10cSrcweir 		void setWindowTables(const OTableWindow* _pSource,const OTableWindow* _pDest);
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir 		/** allows to access the connection data from outside
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 			@return rthe connection data
134*cdf0e10cSrcweir 		*/
135*cdf0e10cSrcweir 		inline TTableConnectionData::value_type getData() const { return m_pConnData; }
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir 		void lateInit();
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir 	protected:
140*cdf0e10cSrcweir 		virtual void Resize();
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir 		virtual long PreNotify(NotifyEvent& rNEvt );
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir 		virtual sal_Bool IsTabAllowed(sal_Bool bForward) const;
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir 		virtual void Init(const TTableConnectionData::value_type& _pConnData);
147*cdf0e10cSrcweir 		virtual void Init() { ORelationControl_Base::Init(); }
148*cdf0e10cSrcweir 		virtual void InitController( ::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol );
149*cdf0e10cSrcweir 		virtual ::svt::CellController* GetController( long nRow, sal_uInt16 nCol );
150*cdf0e10cSrcweir 		virtual void PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColId ) const;
151*cdf0e10cSrcweir 		virtual sal_Bool SeekRow( long nRow );
152*cdf0e10cSrcweir 		virtual sal_Bool SaveModified();
153*cdf0e10cSrcweir 		virtual String GetCellText( long nRow, sal_uInt16 nColId ) const;
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir 		virtual void CellModified();
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir         DECL_LINK( AsynchDeactivate, void* );
158*cdf0e10cSrcweir 	private:
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir 		DECL_LINK( AsynchActivate, void* );
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 	};
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir     //========================================================================
165*cdf0e10cSrcweir 	// class ORelationControl
166*cdf0e10cSrcweir 	//========================================================================
167*cdf0e10cSrcweir 	DBG_NAME(ORelationControl)
168*cdf0e10cSrcweir 	//------------------------------------------------------------------------
169*cdf0e10cSrcweir 	ORelationControl::ORelationControl( OTableListBoxControl* pParent ,const OJoinTableView::OTableWindowMap* _pTableMap)
170*cdf0e10cSrcweir 		:EditBrowseBox( pParent, EBBF_SMART_TAB_TRAVEL | EBBF_NOROWPICTURE, WB_TABSTOP | /*WB_3DLOOK | */WB_BORDER | BROWSER_AUTOSIZE_LASTCOL)
171*cdf0e10cSrcweir 		,m_pTableMap(_pTableMap)
172*cdf0e10cSrcweir 		,m_pBoxControl(pParent)
173*cdf0e10cSrcweir 		,m_xSourceDef( NULL )
174*cdf0e10cSrcweir 		,m_xDestDef( NULL )
175*cdf0e10cSrcweir 	{
176*cdf0e10cSrcweir 		DBG_CTOR(ORelationControl,NULL);
177*cdf0e10cSrcweir 	}
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 	//------------------------------------------------------------------------
180*cdf0e10cSrcweir 	ORelationControl::~ORelationControl()
181*cdf0e10cSrcweir 	{
182*cdf0e10cSrcweir 		DBG_DTOR(ORelationControl,NULL);
183*cdf0e10cSrcweir 	}
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir 	//------------------------------------------------------------------------
186*cdf0e10cSrcweir 	void ORelationControl::Init(const TTableConnectionData::value_type& _pConnData)
187*cdf0e10cSrcweir 	{
188*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir 		m_pConnData = _pConnData;
191*cdf0e10cSrcweir 		OSL_ENSURE(m_pConnData, "No data supplied!");
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir 		m_pConnData->normalizeLines();
194*cdf0e10cSrcweir 	}
195*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
196*cdf0e10cSrcweir 	void ORelationControl::lateInit()
197*cdf0e10cSrcweir 	{
198*cdf0e10cSrcweir         if ( !m_pConnData.get() )
199*cdf0e10cSrcweir             return;
200*cdf0e10cSrcweir         m_xSourceDef = m_pConnData->getReferencingTable()->getTable();
201*cdf0e10cSrcweir 		m_xDestDef = m_pConnData->getReferencedTable()->getTable();
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir 		if ( ColCount() == 0 )
204*cdf0e10cSrcweir 		{
205*cdf0e10cSrcweir 			InsertDataColumn( SOURCE_COLUMN, m_pConnData->getReferencingTable()->GetWinName(), 100);
206*cdf0e10cSrcweir 			InsertDataColumn( DEST_COLUMN, m_pConnData->getReferencedTable()->GetWinName(), 100);
207*cdf0e10cSrcweir 				// wenn es die Defs noch nicht gibt, dann muessen sie noch mit SetSource-/-DestDef gesetzt werden !
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir 			m_pListCell.reset( new ListBoxControl( &GetDataWindow() ) );
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir 			//////////////////////////////////////////////////////////////////////
212*cdf0e10cSrcweir 			// set browse mode
213*cdf0e10cSrcweir 			SetMode(	BROWSER_COLUMNSELECTION |
214*cdf0e10cSrcweir 						BROWSER_HLINESFULL		|
215*cdf0e10cSrcweir 						BROWSER_VLINESFULL		|
216*cdf0e10cSrcweir 						BROWSER_HIDECURSOR		|
217*cdf0e10cSrcweir 						BROWSER_HIDESELECT		|
218*cdf0e10cSrcweir 						BROWSER_AUTO_HSCROLL	|
219*cdf0e10cSrcweir 						BROWSER_AUTO_VSCROLL);
220*cdf0e10cSrcweir 		}
221*cdf0e10cSrcweir 		else
222*cdf0e10cSrcweir 			// not the first call
223*cdf0e10cSrcweir 			RowRemoved(0, GetRowCount());
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir 		RowInserted(0, m_pConnData->GetConnLineDataList()->size() + 1, sal_True); // add one extra row
226*cdf0e10cSrcweir 	}
227*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
228*cdf0e10cSrcweir 	void ORelationControl::Resize()
229*cdf0e10cSrcweir 	{
230*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
231*cdf0e10cSrcweir 		EditBrowseBox::Resize();
232*cdf0e10cSrcweir 		long nOutputWidth = GetOutputSizePixel().Width();
233*cdf0e10cSrcweir 		SetColumnWidth(1, (nOutputWidth / 2));
234*cdf0e10cSrcweir 		SetColumnWidth(2, (nOutputWidth / 2));
235*cdf0e10cSrcweir 	}
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
238*cdf0e10cSrcweir 	long ORelationControl::PreNotify(NotifyEvent& rNEvt)
239*cdf0e10cSrcweir 	{
240*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
241*cdf0e10cSrcweir 		if (rNEvt.GetType() == EVENT_LOSEFOCUS && !HasChildPathFocus() )
242*cdf0e10cSrcweir 			PostUserEvent(LINK(this, ORelationControl, AsynchDeactivate));
243*cdf0e10cSrcweir 		else if (rNEvt.GetType() == EVENT_GETFOCUS)
244*cdf0e10cSrcweir 			PostUserEvent(LINK(this, ORelationControl, AsynchActivate));
245*cdf0e10cSrcweir 
246*cdf0e10cSrcweir 		return EditBrowseBox::PreNotify(rNEvt);
247*cdf0e10cSrcweir 	}
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
250*cdf0e10cSrcweir 	IMPL_LINK(ORelationControl, AsynchActivate, void*, EMPTYARG)
251*cdf0e10cSrcweir 	{
252*cdf0e10cSrcweir 		ActivateCell();
253*cdf0e10cSrcweir 		return 0L;
254*cdf0e10cSrcweir 	}
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
257*cdf0e10cSrcweir 	IMPL_LINK(ORelationControl, AsynchDeactivate, void*, EMPTYARG)
258*cdf0e10cSrcweir 	{
259*cdf0e10cSrcweir 		DeactivateCell();
260*cdf0e10cSrcweir 		return 0L;
261*cdf0e10cSrcweir 	}
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
264*cdf0e10cSrcweir 	sal_Bool ORelationControl::IsTabAllowed(sal_Bool bForward) const
265*cdf0e10cSrcweir 	{
266*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
267*cdf0e10cSrcweir 		long nRow = GetCurRow();
268*cdf0e10cSrcweir 		sal_uInt16 nCol = GetCurColumnId();
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir 		sal_Bool bRet = !((		( bForward && (nCol == DEST_COLUMN)		&& (nRow == GetRowCount() - 1)))
271*cdf0e10cSrcweir 						||	(!bForward && (nCol == SOURCE_COLUMN)	&& (nRow == 0)));
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir 		return bRet && EditBrowseBox::IsTabAllowed(bForward);
274*cdf0e10cSrcweir 	}
275*cdf0e10cSrcweir 
276*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
277*cdf0e10cSrcweir 	sal_Bool ORelationControl::SaveModified()
278*cdf0e10cSrcweir 	{
279*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
280*cdf0e10cSrcweir         sal_Int32 nRow = GetCurRow();
281*cdf0e10cSrcweir 		if ( nRow != BROWSER_ENDOFSELECTION )
282*cdf0e10cSrcweir 		{
283*cdf0e10cSrcweir             String sFieldName(m_pListCell->GetSelectEntry());
284*cdf0e10cSrcweir             OConnectionLineDataVec* pLines = m_pConnData->GetConnLineDataList();
285*cdf0e10cSrcweir             if ( pLines->size() <= static_cast<sal_uInt32>(nRow) )
286*cdf0e10cSrcweir             {
287*cdf0e10cSrcweir                 pLines->push_back(new OConnectionLineData());
288*cdf0e10cSrcweir                 nRow = pLines->size() - 1;
289*cdf0e10cSrcweir             }
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir             OConnectionLineDataRef pConnLineData = (*pLines)[nRow];
292*cdf0e10cSrcweir 
293*cdf0e10cSrcweir 			switch( getColumnIdent( GetCurColumnId() ) )
294*cdf0e10cSrcweir 			{
295*cdf0e10cSrcweir 			case SOURCE_COLUMN:
296*cdf0e10cSrcweir 				pConnLineData->SetSourceFieldName( sFieldName );
297*cdf0e10cSrcweir 				break;
298*cdf0e10cSrcweir 			case DEST_COLUMN:
299*cdf0e10cSrcweir 				pConnLineData->SetDestFieldName( sFieldName );
300*cdf0e10cSrcweir 				break;
301*cdf0e10cSrcweir 			}
302*cdf0e10cSrcweir 		}
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir 		return sal_True;
305*cdf0e10cSrcweir 	}
306*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
307*cdf0e10cSrcweir 	sal_uInt16 ORelationControl::getColumnIdent( sal_uInt16 _nColId ) const
308*cdf0e10cSrcweir 	{
309*cdf0e10cSrcweir 		sal_uInt16 nId = _nColId;
310*cdf0e10cSrcweir 		if ( m_pConnData->getReferencingTable() != m_pBoxControl->getReferencingTable() )
311*cdf0e10cSrcweir 			nId = ( _nColId == SOURCE_COLUMN) ? DEST_COLUMN : SOURCE_COLUMN;
312*cdf0e10cSrcweir 		return nId;
313*cdf0e10cSrcweir 	}
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
316*cdf0e10cSrcweir 	String ORelationControl::GetCellText( long nRow, sal_uInt16 nColId ) const
317*cdf0e10cSrcweir 	{
318*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
319*cdf0e10cSrcweir 		String sText;
320*cdf0e10cSrcweir 		if ( m_pConnData->GetConnLineDataList()->size() > static_cast<size_t>(nRow) )
321*cdf0e10cSrcweir 		{
322*cdf0e10cSrcweir 			OConnectionLineDataRef pConnLineData = (*m_pConnData->GetConnLineDataList())[nRow];
323*cdf0e10cSrcweir 			switch( getColumnIdent( nColId ) )
324*cdf0e10cSrcweir 			{
325*cdf0e10cSrcweir 			case SOURCE_COLUMN:
326*cdf0e10cSrcweir 				sText  = pConnLineData->GetSourceFieldName();
327*cdf0e10cSrcweir 				break;
328*cdf0e10cSrcweir 			case DEST_COLUMN:
329*cdf0e10cSrcweir 				sText  = pConnLineData->GetDestFieldName();
330*cdf0e10cSrcweir 				break;
331*cdf0e10cSrcweir 			}
332*cdf0e10cSrcweir 		}
333*cdf0e10cSrcweir 		return sText;
334*cdf0e10cSrcweir 	}
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
337*cdf0e10cSrcweir 	void ORelationControl::InitController( CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColumnId )
338*cdf0e10cSrcweir 	{
339*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir 		rtl::OString sHelpId( HID_RELATIONDIALOG_LEFTFIELDCELL );
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir 		Reference< XPropertySet> xDef;
344*cdf0e10cSrcweir 		switch ( getColumnIdent(nColumnId) )
345*cdf0e10cSrcweir 		{
346*cdf0e10cSrcweir 			case SOURCE_COLUMN:
347*cdf0e10cSrcweir 				xDef	= m_xSourceDef;
348*cdf0e10cSrcweir 				sHelpId = HID_RELATIONDIALOG_LEFTFIELDCELL;
349*cdf0e10cSrcweir 				break;
350*cdf0e10cSrcweir 			case DEST_COLUMN:
351*cdf0e10cSrcweir 				xDef	= m_xDestDef;
352*cdf0e10cSrcweir 				sHelpId = HID_RELATIONDIALOG_RIGHTFIELDCELL;
353*cdf0e10cSrcweir 				break;
354*cdf0e10cSrcweir 			default:
355*cdf0e10cSrcweir 				//  ?????????
356*cdf0e10cSrcweir 				break;
357*cdf0e10cSrcweir 		}
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir 		if ( xDef.is() )
360*cdf0e10cSrcweir 		{
361*cdf0e10cSrcweir 			fillListBox(xDef,nRow,nColumnId);
362*cdf0e10cSrcweir 			String sName = GetCellText( nRow, nColumnId );
363*cdf0e10cSrcweir 			m_pListCell->SelectEntry( sName );
364*cdf0e10cSrcweir             if ( m_pListCell->GetSelectEntry() != sName )
365*cdf0e10cSrcweir             {
366*cdf0e10cSrcweir                 m_pListCell->InsertEntry( sName );
367*cdf0e10cSrcweir                 m_pListCell->SelectEntry( sName );
368*cdf0e10cSrcweir             }
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir 			m_pListCell->SetHelpId(sHelpId);
371*cdf0e10cSrcweir 		}
372*cdf0e10cSrcweir 	}
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
375*cdf0e10cSrcweir 	CellController* ORelationControl::GetController( long /*nRow*/, sal_uInt16 /*nColumnId*/ )
376*cdf0e10cSrcweir 	{
377*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
378*cdf0e10cSrcweir 		return new ListBoxCellController( m_pListCell.get() );
379*cdf0e10cSrcweir 	}
380*cdf0e10cSrcweir 
381*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
382*cdf0e10cSrcweir 	sal_Bool ORelationControl::SeekRow( long nRow )
383*cdf0e10cSrcweir 	{
384*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
385*cdf0e10cSrcweir 		m_nDataPos = nRow;
386*cdf0e10cSrcweir 		return sal_True;
387*cdf0e10cSrcweir 	}
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir 	//------------------------------------------------------------------------------
390*cdf0e10cSrcweir 	void ORelationControl::PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
391*cdf0e10cSrcweir 	{
392*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
393*cdf0e10cSrcweir 		String aText  =const_cast< ORelationControl*>(this)->GetCellText( m_nDataPos, nColumnId );
394*cdf0e10cSrcweir 
395*cdf0e10cSrcweir 		Point aPos( rRect.TopLeft() );
396*cdf0e10cSrcweir 		Size aTextSize( GetDataWindow().GetTextHeight(),GetDataWindow().GetTextWidth( aText ));
397*cdf0e10cSrcweir 
398*cdf0e10cSrcweir 		if( aPos.X() < rRect.Right() || aPos.X() + aTextSize.Width() > rRect.Right() ||
399*cdf0e10cSrcweir 			aPos.Y() < rRect.Top() || aPos.Y() + aTextSize.Height() > rRect.Bottom() )
400*cdf0e10cSrcweir 			rDev.SetClipRegion( rRect );
401*cdf0e10cSrcweir 
402*cdf0e10cSrcweir 		rDev.DrawText( aPos, aText );
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir 		if( rDev.IsClipRegion() )
405*cdf0e10cSrcweir 			rDev.SetClipRegion();
406*cdf0e10cSrcweir 	}
407*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
408*cdf0e10cSrcweir 	void ORelationControl::fillListBox(const Reference< XPropertySet>& _xDest,long /*_nRow*/,sal_uInt16 /*nColumnId*/)
409*cdf0e10cSrcweir 	{
410*cdf0e10cSrcweir 		m_pListCell->Clear();
411*cdf0e10cSrcweir 		try
412*cdf0e10cSrcweir 		{
413*cdf0e10cSrcweir 			if ( _xDest.is() )
414*cdf0e10cSrcweir 			{
415*cdf0e10cSrcweir 				//sal_Int32 nRows = GetRowCount();
416*cdf0e10cSrcweir 				Reference<XColumnsSupplier> xSup(_xDest,UNO_QUERY);
417*cdf0e10cSrcweir 				Reference<XNameAccess> xColumns = xSup->getColumns();
418*cdf0e10cSrcweir 				Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
419*cdf0e10cSrcweir 				const ::rtl::OUString* pIter = aNames.getConstArray();
420*cdf0e10cSrcweir 				const ::rtl::OUString* pEnd = pIter + aNames.getLength();
421*cdf0e10cSrcweir 				for(;pIter != pEnd;++pIter)
422*cdf0e10cSrcweir 				{
423*cdf0e10cSrcweir 					m_pListCell->InsertEntry( *pIter );
424*cdf0e10cSrcweir 				}
425*cdf0e10cSrcweir 				m_pListCell->InsertEntry(String(), 0);
426*cdf0e10cSrcweir 			}
427*cdf0e10cSrcweir 		}
428*cdf0e10cSrcweir         catch( const Exception& )
429*cdf0e10cSrcweir         {
430*cdf0e10cSrcweir             DBG_UNHANDLED_EXCEPTION();
431*cdf0e10cSrcweir         }
432*cdf0e10cSrcweir 	}
433*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
434*cdf0e10cSrcweir 	void ORelationControl::setWindowTables(const OTableWindow* _pSource,const OTableWindow* _pDest)
435*cdf0e10cSrcweir 	{
436*cdf0e10cSrcweir 		// wenn ich hier gerade editiere, ausblenden
437*cdf0e10cSrcweir 		sal_Bool bWasEditing = IsEditing();
438*cdf0e10cSrcweir 		if ( bWasEditing )
439*cdf0e10cSrcweir 			DeactivateCell();
440*cdf0e10cSrcweir 
441*cdf0e10cSrcweir 		if ( _pSource && _pDest )
442*cdf0e10cSrcweir 		{
443*cdf0e10cSrcweir 			m_xSourceDef = _pSource->GetTable();
444*cdf0e10cSrcweir 			SetColumnTitle(1, _pSource->GetName());
445*cdf0e10cSrcweir 
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir 			m_xDestDef = _pDest->GetTable();
448*cdf0e10cSrcweir 			SetColumnTitle(2, _pDest->GetName());
449*cdf0e10cSrcweir 
450*cdf0e10cSrcweir 			const OJoinTableView* pView = _pSource->getTableView();
451*cdf0e10cSrcweir 			OTableConnection* pConn = pView->GetTabConn(_pSource,_pDest);
452*cdf0e10cSrcweir 			if ( pConn && !m_pConnData->GetConnLineDataList()->empty() )
453*cdf0e10cSrcweir 			{
454*cdf0e10cSrcweir 				m_pConnData->CopyFrom(*pConn->GetData());
455*cdf0e10cSrcweir 				m_pBoxControl->getContainer()->notifyConnectionChange();
456*cdf0e10cSrcweir 			}
457*cdf0e10cSrcweir 			else
458*cdf0e10cSrcweir 			{
459*cdf0e10cSrcweir 				// no connection found so we clear our data
460*cdf0e10cSrcweir 				OConnectionLineDataVec* pLines = m_pConnData->GetConnLineDataList();
461*cdf0e10cSrcweir 				::std::for_each(pLines->begin(),
462*cdf0e10cSrcweir 								pLines->end(),
463*cdf0e10cSrcweir 								OUnaryRefFunctor<OConnectionLineData>( ::std::mem_fun(&OConnectionLineData::Reset))
464*cdf0e10cSrcweir 								);
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir 				m_pConnData->setReferencingTable(_pSource->GetData());
467*cdf0e10cSrcweir 				m_pConnData->setReferencedTable(_pDest->GetData());
468*cdf0e10cSrcweir 			}
469*cdf0e10cSrcweir 			m_pConnData->normalizeLines();
470*cdf0e10cSrcweir 
471*cdf0e10cSrcweir 		}
472*cdf0e10cSrcweir 		// neu zeichnen
473*cdf0e10cSrcweir 		Invalidate();
474*cdf0e10cSrcweir 
475*cdf0e10cSrcweir 		if ( bWasEditing )
476*cdf0e10cSrcweir 		{
477*cdf0e10cSrcweir 			GoToRow(0);
478*cdf0e10cSrcweir 			ActivateCell();
479*cdf0e10cSrcweir 		}
480*cdf0e10cSrcweir 	}
481*cdf0e10cSrcweir 	//------------------------------------------------------------------------
482*cdf0e10cSrcweir 	void ORelationControl::CellModified()
483*cdf0e10cSrcweir 	{
484*cdf0e10cSrcweir 		DBG_CHKTHIS(ORelationControl,NULL);
485*cdf0e10cSrcweir 		EditBrowseBox::CellModified();
486*cdf0e10cSrcweir 		SaveModified();
487*cdf0e10cSrcweir 		static_cast<OTableListBoxControl*>(GetParent())->NotifyCellChange();
488*cdf0e10cSrcweir 	}
489*cdf0e10cSrcweir 	//========================================================================
490*cdf0e10cSrcweir 	// class OTableListBoxControl
491*cdf0e10cSrcweir DBG_NAME(OTableListBoxControl)
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir //========================================================================
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir OTableListBoxControl::OTableListBoxControl(  Window* _pParent
496*cdf0e10cSrcweir 										    ,const ResId& _rResId
497*cdf0e10cSrcweir 										    ,const OJoinTableView::OTableWindowMap* _pTableMap
498*cdf0e10cSrcweir 										    ,IRelationControlInterface* _pParentDialog)
499*cdf0e10cSrcweir 	 : Window(_pParent,_rResId)
500*cdf0e10cSrcweir 	 , m_aFL_InvolvedTables(    this, ResId(FL_INVOLVED_TABLES,*_rResId.GetResMgr()))
501*cdf0e10cSrcweir 	 , m_lmbLeftTable(			this, ResId(LB_LEFT_TABLE,*_rResId.GetResMgr()))
502*cdf0e10cSrcweir 	 , m_lmbRightTable(			this, ResId(LB_RIGHT_TABLE,*_rResId.GetResMgr()))
503*cdf0e10cSrcweir 	 , m_aFL_InvolvedFields(    this, ResId(FL_INVOLVED_FIELDS,*_rResId.GetResMgr()))
504*cdf0e10cSrcweir 	 , m_pTableMap(_pTableMap)
505*cdf0e10cSrcweir 	 , m_pParentDialog(_pParentDialog)
506*cdf0e10cSrcweir 	{
507*cdf0e10cSrcweir 		m_pRC_Tables = new ORelationControl( this,m_pTableMap );
508*cdf0e10cSrcweir 		m_pRC_Tables->SetHelpId(HID_RELDLG_KEYFIELDS);
509*cdf0e10cSrcweir 		m_pRC_Tables->Init( );
510*cdf0e10cSrcweir         m_pRC_Tables->SetZOrder(&m_lmbRightTable, WINDOW_ZORDER_BEHIND);
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir         lateUIInit();
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir 		Link aLink(LINK(this, OTableListBoxControl, OnTableChanged));
515*cdf0e10cSrcweir 		m_lmbLeftTable.SetSelectHdl(aLink);
516*cdf0e10cSrcweir 		m_lmbRightTable.SetSelectHdl(aLink);
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir 		FreeResource();
519*cdf0e10cSrcweir 		DBG_CTOR(OTableListBoxControl,NULL);
520*cdf0e10cSrcweir 	}
521*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
522*cdf0e10cSrcweir 	OTableListBoxControl::~OTableListBoxControl()
523*cdf0e10cSrcweir 	{
524*cdf0e10cSrcweir 		ORelationControl* pTemp = m_pRC_Tables;
525*cdf0e10cSrcweir 		m_pRC_Tables = NULL;
526*cdf0e10cSrcweir 		delete pTemp;
527*cdf0e10cSrcweir         DBG_DTOR(OTableListBoxControl,NULL);
528*cdf0e10cSrcweir     }
529*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
530*cdf0e10cSrcweir 	void OTableListBoxControl::fillListBoxes()
531*cdf0e10cSrcweir 	{
532*cdf0e10cSrcweir 		DBG_ASSERT( !m_pTableMap->empty(), "OTableListBoxControl::fillListBoxes: no table window!");
533*cdf0e10cSrcweir 		OTableWindow* pInitialLeft = NULL;
534*cdf0e10cSrcweir 		OTableWindow* pInitialRight = NULL;
535*cdf0e10cSrcweir 
536*cdf0e10cSrcweir 		// die Namen aller TabWins einsammeln
537*cdf0e10cSrcweir 		OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->begin();
538*cdf0e10cSrcweir         OJoinTableView::OTableWindowMap::const_iterator aEnd = m_pTableMap->end();
539*cdf0e10cSrcweir 		for(;aIter != aEnd;++aIter)
540*cdf0e10cSrcweir 		{
541*cdf0e10cSrcweir 			m_lmbLeftTable.InsertEntry(aIter->first);
542*cdf0e10cSrcweir 			m_lmbRightTable.InsertEntry(aIter->first);
543*cdf0e10cSrcweir 
544*cdf0e10cSrcweir 			if (!pInitialLeft)
545*cdf0e10cSrcweir 			{
546*cdf0e10cSrcweir 				pInitialLeft = aIter->second;
547*cdf0e10cSrcweir 				m_strCurrentLeft = aIter->first;
548*cdf0e10cSrcweir 			}
549*cdf0e10cSrcweir 			else if (!pInitialRight)
550*cdf0e10cSrcweir 			{
551*cdf0e10cSrcweir 				pInitialRight = aIter->second;
552*cdf0e10cSrcweir 				m_strCurrentRight = aIter->first;
553*cdf0e10cSrcweir 			}
554*cdf0e10cSrcweir 		} // for(;aIter != m_pTableMap->end();++aIter)
555*cdf0e10cSrcweir 
556*cdf0e10cSrcweir         if ( !pInitialRight )
557*cdf0e10cSrcweir         {
558*cdf0e10cSrcweir             pInitialRight = pInitialLeft;
559*cdf0e10cSrcweir 			m_strCurrentRight = m_strCurrentLeft;
560*cdf0e10cSrcweir         }
561*cdf0e10cSrcweir 
562*cdf0e10cSrcweir 		// die entsprechenden Defs an mein Controls
563*cdf0e10cSrcweir 		m_pRC_Tables->setWindowTables(pInitialLeft,pInitialRight);
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir 		// die in einer ComboBox ausgewaehlte Tabelle darf nicht in der anderen zur Verfuegung stehen
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir 		if ( m_pTableMap->size() > 2 )
568*cdf0e10cSrcweir 		{
569*cdf0e10cSrcweir 			m_lmbLeftTable.RemoveEntry(m_strCurrentRight);
570*cdf0e10cSrcweir 			m_lmbRightTable.RemoveEntry(m_strCurrentLeft);
571*cdf0e10cSrcweir 		}
572*cdf0e10cSrcweir 
573*cdf0e10cSrcweir 		// links das erste, rechts das zweite selektieren
574*cdf0e10cSrcweir 		m_lmbLeftTable.SelectEntry(m_strCurrentLeft);
575*cdf0e10cSrcweir 		m_lmbRightTable.SelectEntry(m_strCurrentRight);
576*cdf0e10cSrcweir 
577*cdf0e10cSrcweir 		m_lmbLeftTable.GrabFocus();
578*cdf0e10cSrcweir 	}
579*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
580*cdf0e10cSrcweir 	IMPL_LINK( OTableListBoxControl, OnTableChanged, ListBox*, pListBox )
581*cdf0e10cSrcweir 	{
582*cdf0e10cSrcweir 		String strSelected(pListBox->GetSelectEntry());
583*cdf0e10cSrcweir 		OTableWindow* pLeft		= NULL;
584*cdf0e10cSrcweir 		OTableWindow* pRight	= NULL;
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir 		// eine Sonderbehandlung : wenn es nur zwei Tabellen gibt, muss ich bei Wechsel in einer LB auch in der anderen umschalten
587*cdf0e10cSrcweir 		if ( m_pTableMap->size() == 2 )
588*cdf0e10cSrcweir 		{
589*cdf0e10cSrcweir 			ListBox* pOther;
590*cdf0e10cSrcweir 			if ( pListBox == &m_lmbLeftTable )
591*cdf0e10cSrcweir 				pOther = &m_lmbRightTable;
592*cdf0e10cSrcweir 			else
593*cdf0e10cSrcweir 				pOther = &m_lmbLeftTable;
594*cdf0e10cSrcweir 			pOther->SelectEntryPos(1 - pOther->GetSelectEntryPos());
595*cdf0e10cSrcweir 
596*cdf0e10cSrcweir 			OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->begin();
597*cdf0e10cSrcweir 			OTableWindow* pFirst = aIter->second;
598*cdf0e10cSrcweir 			++aIter;
599*cdf0e10cSrcweir 			OTableWindow* pSecond = aIter->second;
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir 			if ( m_lmbLeftTable.GetSelectEntry() == String(pFirst->GetName()) )
602*cdf0e10cSrcweir 			{
603*cdf0e10cSrcweir 				pLeft	= pFirst;
604*cdf0e10cSrcweir 				pRight	= pSecond;
605*cdf0e10cSrcweir 			}
606*cdf0e10cSrcweir 			else
607*cdf0e10cSrcweir 			{
608*cdf0e10cSrcweir 				pLeft	= pSecond;
609*cdf0e10cSrcweir 				pRight	= pFirst;
610*cdf0e10cSrcweir 			}
611*cdf0e10cSrcweir 		}
612*cdf0e10cSrcweir 		else
613*cdf0e10cSrcweir 		{
614*cdf0e10cSrcweir 			// zuerst brauche ich die TableDef zur Tabelle, dazu das TabWin
615*cdf0e10cSrcweir 			OJoinTableView::OTableWindowMap::const_iterator aFind = m_pTableMap->find(strSelected);
616*cdf0e10cSrcweir 			OTableWindow* pLoop = NULL;
617*cdf0e10cSrcweir 			if( aFind != m_pTableMap->end() )
618*cdf0e10cSrcweir 				pLoop = aFind->second;
619*cdf0e10cSrcweir 			DBG_ASSERT(pLoop != NULL, "ORelationDialog::OnTableChanged : ungueltiger Eintrag in ListBox !");
620*cdf0e10cSrcweir 				// da ich die ListBoxen selber mit eben diesen Tabellennamen, mit denen ich sie jetzt vergleiche, gefuellt habe,
621*cdf0e10cSrcweir 				// MUSS ich strSelected finden
622*cdf0e10cSrcweir 			if (pListBox == &m_lmbLeftTable)
623*cdf0e10cSrcweir 			{
624*cdf0e10cSrcweir 				// den vorher links selektierten Eintrag wieder rein rechts
625*cdf0e10cSrcweir 				m_lmbRightTable.InsertEntry(m_strCurrentLeft);
626*cdf0e10cSrcweir 				// und den jetzt selektierten raus
627*cdf0e10cSrcweir 				m_lmbRightTable.RemoveEntry(strSelected);
628*cdf0e10cSrcweir 				m_strCurrentLeft	= strSelected;
629*cdf0e10cSrcweir 
630*cdf0e10cSrcweir 				pLeft = pLoop;
631*cdf0e10cSrcweir 
632*cdf0e10cSrcweir 				OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->find(m_lmbRightTable.GetSelectEntry());
633*cdf0e10cSrcweir 				OSL_ENSURE( aIter != m_pTableMap->end(), "Invalid name");
634*cdf0e10cSrcweir 				if ( aIter != m_pTableMap->end() )
635*cdf0e10cSrcweir 					pRight = aIter->second;
636*cdf0e10cSrcweir 
637*cdf0e10cSrcweir 				m_lmbLeftTable.GrabFocus();
638*cdf0e10cSrcweir 			}
639*cdf0e10cSrcweir 			else
640*cdf0e10cSrcweir 			{
641*cdf0e10cSrcweir 				// den vorher rechts selektierten Eintrag wieder rein links
642*cdf0e10cSrcweir 				m_lmbLeftTable.InsertEntry(m_strCurrentRight);
643*cdf0e10cSrcweir 				// und den jetzt selektierten raus
644*cdf0e10cSrcweir 				m_lmbLeftTable.RemoveEntry(strSelected);
645*cdf0e10cSrcweir 				m_strCurrentRight = strSelected;
646*cdf0e10cSrcweir 
647*cdf0e10cSrcweir 				pRight = pLoop;
648*cdf0e10cSrcweir 				OJoinTableView::OTableWindowMap::const_iterator aIter = m_pTableMap->find(m_lmbLeftTable.GetSelectEntry());
649*cdf0e10cSrcweir 				OSL_ENSURE( aIter != m_pTableMap->end(), "Invalid name");
650*cdf0e10cSrcweir 				if ( aIter != m_pTableMap->end() )
651*cdf0e10cSrcweir 					pLeft = aIter->second;
652*cdf0e10cSrcweir 			}
653*cdf0e10cSrcweir 		}
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir 		pListBox->GrabFocus();
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir 		m_pRC_Tables->setWindowTables(pLeft,pRight);
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir 		NotifyCellChange();
660*cdf0e10cSrcweir 		return 0;
661*cdf0e10cSrcweir 	}
662*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
663*cdf0e10cSrcweir 	void OTableListBoxControl::NotifyCellChange()
664*cdf0e10cSrcweir 	{
665*cdf0e10cSrcweir 		// den Ok-Button en- oder disablen, je nachdem, ob ich eine gueltige Situation habe
666*cdf0e10cSrcweir         TTableConnectionData::value_type pConnData = m_pRC_Tables->getData();
667*cdf0e10cSrcweir 		const OConnectionLineDataVec* pLines = pConnData->GetConnLineDataList();
668*cdf0e10cSrcweir 		m_pParentDialog->setValid(!pLines->empty());
669*cdf0e10cSrcweir 
670*cdf0e10cSrcweir 		if ( pLines->size() >= static_cast<sal_uInt32>(m_pRC_Tables->GetRowCount()) )
671*cdf0e10cSrcweir 		{
672*cdf0e10cSrcweir 			m_pRC_Tables->DeactivateCell();
673*cdf0e10cSrcweir 			m_pRC_Tables->RowInserted(m_pRC_Tables->GetRowCount(), pLines->size() - static_cast<sal_uInt32>(m_pRC_Tables->GetRowCount()) + 1, sal_True);
674*cdf0e10cSrcweir 			m_pRC_Tables->ActivateCell();
675*cdf0e10cSrcweir 		}
676*cdf0e10cSrcweir 	}
677*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
678*cdf0e10cSrcweir 	void fillEntryAndDisable(ListBox& _rListBox,const String& _sEntry)
679*cdf0e10cSrcweir 	{
680*cdf0e10cSrcweir 		_rListBox.InsertEntry(_sEntry);
681*cdf0e10cSrcweir 		_rListBox.SelectEntryPos(0);
682*cdf0e10cSrcweir 		_rListBox.Disable();
683*cdf0e10cSrcweir 	}
684*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
685*cdf0e10cSrcweir     void OTableListBoxControl::fillAndDisable(const TTableConnectionData::value_type& _pConnectionData)
686*cdf0e10cSrcweir 	{
687*cdf0e10cSrcweir 		fillEntryAndDisable(m_lmbLeftTable,_pConnectionData->getReferencingTable()->GetWinName());
688*cdf0e10cSrcweir 		fillEntryAndDisable(m_lmbRightTable,_pConnectionData->getReferencedTable()->GetWinName());
689*cdf0e10cSrcweir 	}
690*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
691*cdf0e10cSrcweir 	void OTableListBoxControl::Init(const TTableConnectionData::value_type& _pConnData)
692*cdf0e10cSrcweir 	{
693*cdf0e10cSrcweir 		m_pRC_Tables->Init(_pConnData);
694*cdf0e10cSrcweir 	}
695*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
696*cdf0e10cSrcweir 	void OTableListBoxControl::lateUIInit(Window* _pTableSeparator)
697*cdf0e10cSrcweir 	{
698*cdf0e10cSrcweir         const sal_Int32 nDiff = LogicToPixel( Point(0,6), MAP_APPFONT ).Y();
699*cdf0e10cSrcweir         Point aDlgPoint = LogicToPixel( Point(12,43), MAP_APPFONT );
700*cdf0e10cSrcweir         if ( _pTableSeparator )
701*cdf0e10cSrcweir         {
702*cdf0e10cSrcweir             _pTableSeparator->SetZOrder(&m_lmbRightTable, WINDOW_ZORDER_BEHIND);
703*cdf0e10cSrcweir             m_pRC_Tables->SetZOrder(_pTableSeparator, WINDOW_ZORDER_BEHIND);
704*cdf0e10cSrcweir             //aDlgPoint = m_pTableSeparator->GetPosPixel() + Point(0,aSize.Height()) + LogicToPixel( Point(0,6), MAP_APPFONT );
705*cdf0e10cSrcweir             _pTableSeparator->SetPosPixel(Point(0,m_aFL_InvolvedFields.GetPosPixel().Y()));
706*cdf0e10cSrcweir             const Size aSize = _pTableSeparator->GetSizePixel();
707*cdf0e10cSrcweir             aDlgPoint.Y() = _pTableSeparator->GetPosPixel().Y() + aSize.Height();
708*cdf0e10cSrcweir             m_aFL_InvolvedFields.SetPosPixel(Point(m_aFL_InvolvedFields.GetPosPixel().X(),aDlgPoint.Y()));
709*cdf0e10cSrcweir             aDlgPoint.Y() += nDiff + m_aFL_InvolvedFields.GetSizePixel().Height();
710*cdf0e10cSrcweir         }
711*cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
712*cdf0e10cSrcweir 		// positing BrowseBox control
713*cdf0e10cSrcweir         const Size aCurrentSize = GetSizePixel();
714*cdf0e10cSrcweir 		Size aDlgSize = LogicToPixel( Size(24,0), MAP_APPFONT );
715*cdf0e10cSrcweir 		aDlgSize.Width() = aCurrentSize.Width() - aDlgSize.Width();
716*cdf0e10cSrcweir         aDlgSize.Height() = aCurrentSize.Height() - aDlgPoint.Y() - nDiff;
717*cdf0e10cSrcweir 
718*cdf0e10cSrcweir 		m_pRC_Tables->SetPosSizePixel( aDlgPoint, aDlgSize );
719*cdf0e10cSrcweir 		m_pRC_Tables->Show();
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir         lateInit();
722*cdf0e10cSrcweir     }
723*cdf0e10cSrcweir     // -----------------------------------------------------------------------------
724*cdf0e10cSrcweir 	void OTableListBoxControl::lateInit()
725*cdf0e10cSrcweir 	{
726*cdf0e10cSrcweir 		m_pRC_Tables->lateInit();
727*cdf0e10cSrcweir 	}
728*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
729*cdf0e10cSrcweir 	sal_Bool OTableListBoxControl::SaveModified()
730*cdf0e10cSrcweir 	{
731*cdf0e10cSrcweir 		sal_Bool bRet = m_pRC_Tables->SaveModified();
732*cdf0e10cSrcweir 		m_pRC_Tables->getData()->normalizeLines();
733*cdf0e10cSrcweir 		return bRet;
734*cdf0e10cSrcweir 	}
735*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
736*cdf0e10cSrcweir 	TTableWindowData::value_type OTableListBoxControl::getReferencingTable()	const
737*cdf0e10cSrcweir 	{
738*cdf0e10cSrcweir         return m_pRC_Tables->getData()->getReferencingTable();
739*cdf0e10cSrcweir 	}
740*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
741*cdf0e10cSrcweir     void OTableListBoxControl::enableRelation(bool _bEnable)
742*cdf0e10cSrcweir     {
743*cdf0e10cSrcweir         if ( !_bEnable )
744*cdf0e10cSrcweir             PostUserEvent(LINK(m_pRC_Tables, ORelationControl, AsynchDeactivate));
745*cdf0e10cSrcweir         m_pRC_Tables->Enable(_bEnable);
746*cdf0e10cSrcweir 
747*cdf0e10cSrcweir     }
748*cdf0e10cSrcweir 	// -----------------------------------------------------------------------------
749*cdf0e10cSrcweir }
750*cdf0e10cSrcweir // -----------------------------------------------------------------------------
751*cdf0e10cSrcweir 
752