1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_dbaccess.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYTABLEVIEW_HXX
28*b1cdbd2cSJim Jagielski #include "QueryTableView.hxx"
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEFIELDINFO_HXX
31*b1cdbd2cSJim Jagielski #include "TableFieldInfo.hxx"
32*b1cdbd2cSJim Jagielski #endif
33*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEFIELDDESC_HXX
34*b1cdbd2cSJim Jagielski #include "TableFieldDescription.hxx"
35*b1cdbd2cSJim Jagielski #endif
36*b1cdbd2cSJim Jagielski #ifndef _TOOLS_DEBUG_HXX
37*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
38*b1cdbd2cSJim Jagielski #endif
39*b1cdbd2cSJim Jagielski #ifndef TOOLS_DIAGNOSE_EX_H
40*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski #ifndef _DBA_DBACCESS_HELPID_HRC_
43*b1cdbd2cSJim Jagielski #include "dbaccess_helpid.hrc"
44*b1cdbd2cSJim Jagielski #endif
45*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERY_TABLEWINDOW_HXX
46*b1cdbd2cSJim Jagielski #include "QTableWindow.hxx"
47*b1cdbd2cSJim Jagielski #endif
48*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYTABLECONNECTION_HXX
49*b1cdbd2cSJim Jagielski #include "QTableConnection.hxx"
50*b1cdbd2cSJim Jagielski #endif
51*b1cdbd2cSJim Jagielski #ifndef DBAUI_QTABLECONNECTIONDATA_HXX
52*b1cdbd2cSJim Jagielski #include "QTableConnectionData.hxx"
53*b1cdbd2cSJim Jagielski #endif
54*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYDESIGNVIEW_HXX
55*b1cdbd2cSJim Jagielski #include "QueryDesignView.hxx"
56*b1cdbd2cSJim Jagielski #endif
57*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYCONTROLLER_HXX
58*b1cdbd2cSJim Jagielski #include "querycontroller.hxx"
59*b1cdbd2cSJim Jagielski #endif
60*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYADDTABCONNUNDOACTION_HXX
61*b1cdbd2cSJim Jagielski #include "QueryAddTabConnUndoAction.hxx"
62*b1cdbd2cSJim Jagielski #endif
63*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYTABWINSHOWUNDOACT_HXX
64*b1cdbd2cSJim Jagielski #include "QueryTabWinShowUndoAct.hxx"
65*b1cdbd2cSJim Jagielski #endif
66*b1cdbd2cSJim Jagielski #ifndef DBACCESS_UI_BROWSER_ID_HXX
67*b1cdbd2cSJim Jagielski #include "browserids.hxx"
68*b1cdbd2cSJim Jagielski #endif
69*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
70*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
71*b1cdbd2cSJim Jagielski #endif
72*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBC_XCONNECTION_HPP_
73*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XConnection.hpp>
74*b1cdbd2cSJim Jagielski #endif
75*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_XKEYSSUPPLIER_HPP_
76*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XKeysSupplier.hpp>
77*b1cdbd2cSJim Jagielski #endif
78*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
79*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
80*b1cdbd2cSJim Jagielski #endif
81*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
82*b1cdbd2cSJim Jagielski #ifndef DBACCESS_JACCESS_HXX
83*b1cdbd2cSJim Jagielski #include "JAccess.hxx"
84*b1cdbd2cSJim Jagielski #endif
85*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_KEYTYPE_HPP_
86*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/KeyType.hpp>
87*b1cdbd2cSJim Jagielski #endif
88*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
89*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp>
90*b1cdbd2cSJim Jagielski #endif
91*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
92*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
93*b1cdbd2cSJim Jagielski #endif
94*b1cdbd2cSJim Jagielski #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
95*b1cdbd2cSJim Jagielski #include "dbustrings.hrc"
96*b1cdbd2cSJim Jagielski #endif
97*b1cdbd2cSJim Jagielski #ifndef _CONNECTIVITY_DBTOOLS_HXX_
98*b1cdbd2cSJim Jagielski #include <connectivity/dbtools.hxx>
99*b1cdbd2cSJim Jagielski #endif
100*b1cdbd2cSJim Jagielski #ifndef _COMPHELPER_SEQUENCE_HXX_
101*b1cdbd2cSJim Jagielski #include <comphelper/sequence.hxx>
102*b1cdbd2cSJim Jagielski #endif
103*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYDLG_HXX
104*b1cdbd2cSJim Jagielski #include "querydlg.hxx"
105*b1cdbd2cSJim Jagielski #endif
106*b1cdbd2cSJim Jagielski #ifndef DBAUI_JOINEXCHANGE_HXX
107*b1cdbd2cSJim Jagielski #include "JoinExchange.hxx"
108*b1cdbd2cSJim Jagielski #endif
109*b1cdbd2cSJim Jagielski #ifndef _COMPHELPER_EXTRACT_HXX_
110*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
111*b1cdbd2cSJim Jagielski #endif
112*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYDESIGNVIEW_HXX
113*b1cdbd2cSJim Jagielski #include "QueryDesignView.hxx"
114*b1cdbd2cSJim Jagielski #endif
115*b1cdbd2cSJim Jagielski #ifndef _DBU_QRY_HRC_
116*b1cdbd2cSJim Jagielski #include "dbu_qry.hrc"
117*b1cdbd2cSJim Jagielski #endif
118*b1cdbd2cSJim Jagielski #ifndef _SV_MSGBOX_HXX
119*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
120*b1cdbd2cSJim Jagielski #endif
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski using namespace dbaui;
123*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
124*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
125*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbcx;
126*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
127*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
128*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::accessibility;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
131*b1cdbd2cSJim Jagielski namespace
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
isColumnInKeyType(const Reference<XIndexAccess> & _rxKeys,const::rtl::OUString & _rColumnName,sal_Int32 _nKeyType)134*b1cdbd2cSJim Jagielski 	sal_Bool isColumnInKeyType(const Reference<XIndexAccess>& _rxKeys,const ::rtl::OUString& _rColumnName,sal_Int32 _nKeyType)
135*b1cdbd2cSJim Jagielski 	{
136*b1cdbd2cSJim Jagielski 		sal_Bool bReturn = sal_False;
137*b1cdbd2cSJim Jagielski 		if(_rxKeys.is())
138*b1cdbd2cSJim Jagielski 		{
139*b1cdbd2cSJim Jagielski 			Reference<XColumnsSupplier> xColumnsSupplier;
140*b1cdbd2cSJim Jagielski 			// search the one and only primary key
141*b1cdbd2cSJim Jagielski             const sal_Int32 nCount = _rxKeys->getCount();
142*b1cdbd2cSJim Jagielski 			for(sal_Int32 i=0;i< nCount;++i)
143*b1cdbd2cSJim Jagielski 			{
144*b1cdbd2cSJim Jagielski 				Reference<XPropertySet> xProp(_rxKeys->getByIndex(i),UNO_QUERY);
145*b1cdbd2cSJim Jagielski 				if(xProp.is())
146*b1cdbd2cSJim Jagielski 				{
147*b1cdbd2cSJim Jagielski 					sal_Int32 nKeyType = 0;
148*b1cdbd2cSJim Jagielski 					xProp->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
149*b1cdbd2cSJim Jagielski 					if(_nKeyType == nKeyType)
150*b1cdbd2cSJim Jagielski 					{
151*b1cdbd2cSJim Jagielski 						xColumnsSupplier.set(xProp,UNO_QUERY);
152*b1cdbd2cSJim Jagielski 						if(xColumnsSupplier.is())
153*b1cdbd2cSJim Jagielski 						{
154*b1cdbd2cSJim Jagielski 							Reference<XNameAccess> xColumns = xColumnsSupplier->getColumns();
155*b1cdbd2cSJim Jagielski 							if(xColumns.is() && xColumns->hasByName(_rColumnName))
156*b1cdbd2cSJim Jagielski 							{
157*b1cdbd2cSJim Jagielski 								bReturn = sal_True;
158*b1cdbd2cSJim Jagielski 								break;
159*b1cdbd2cSJim Jagielski 							}
160*b1cdbd2cSJim Jagielski 						}
161*b1cdbd2cSJim Jagielski 					}
162*b1cdbd2cSJim Jagielski 				}
163*b1cdbd2cSJim Jagielski 			}
164*b1cdbd2cSJim Jagielski 		}
165*b1cdbd2cSJim Jagielski 		return bReturn;
166*b1cdbd2cSJim Jagielski 	}
167*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
168*b1cdbd2cSJim Jagielski 	/** appends a new TabAdd Undo action at controller
169*b1cdbd2cSJim Jagielski 		@param	_pView			the view which we use
170*b1cdbd2cSJim Jagielski 		@param	_pUndoAction	the undo action which should be added
171*b1cdbd2cSJim Jagielski 		@param	_pConnection	the connection for which the undo action should be appended
172*b1cdbd2cSJim Jagielski 		@param	_bOwner			is the undo action the owner
173*b1cdbd2cSJim Jagielski 	*/
174*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
addUndoAction(OQueryTableView * _pView,OQueryTabConnUndoAction * _pUndoAction,OQueryTableConnection * _pConnection,sal_Bool _bOwner=sal_False)175*b1cdbd2cSJim Jagielski 	void addUndoAction(	OQueryTableView* _pView,
176*b1cdbd2cSJim Jagielski 						OQueryTabConnUndoAction* _pUndoAction,
177*b1cdbd2cSJim Jagielski 						OQueryTableConnection* _pConnection,
178*b1cdbd2cSJim Jagielski 						sal_Bool _bOwner = sal_False)
179*b1cdbd2cSJim Jagielski 	{
180*b1cdbd2cSJim Jagielski 		_pUndoAction->SetOwnership(_bOwner);
181*b1cdbd2cSJim Jagielski 		_pUndoAction->SetConnection(_pConnection);
182*b1cdbd2cSJim Jagielski 		_pView->getDesignView()->getController().addUndoActionAndInvalidate(_pUndoAction);
183*b1cdbd2cSJim Jagielski 	}
184*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
185*b1cdbd2cSJim Jagielski 	/** openJoinDialog opens the join dialog with this connection data
186*b1cdbd2cSJim Jagielski 		@param	_pView				the view which we use
187*b1cdbd2cSJim Jagielski 		@param	_pConnectionData	the connection data
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 		@return	true when OK was pressed otherwise false
190*b1cdbd2cSJim Jagielski 	*/
openJoinDialog(OQueryTableView * _pView,const TTableConnectionData::value_type & _pConnectionData,sal_Bool _bSelectableTables)191*b1cdbd2cSJim Jagielski     sal_Bool openJoinDialog(OQueryTableView* _pView,const TTableConnectionData::value_type& _pConnectionData,sal_Bool _bSelectableTables)
192*b1cdbd2cSJim Jagielski 	{
193*b1cdbd2cSJim Jagielski 		OQueryTableConnectionData* pData = static_cast< OQueryTableConnectionData*>(_pConnectionData.get());
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 		DlgQryJoin aDlg(_pView,_pConnectionData,_pView->GetTabWinMap(),_pView->getDesignView()->getController().getConnection(),_bSelectableTables);
196*b1cdbd2cSJim Jagielski 		sal_Bool bOk = aDlg.Execute() == RET_OK;
197*b1cdbd2cSJim Jagielski 		if( bOk )
198*b1cdbd2cSJim Jagielski 		{
199*b1cdbd2cSJim Jagielski 			pData->SetJoinType(aDlg.GetJoinType());
200*b1cdbd2cSJim Jagielski 			_pView->getDesignView()->getController().setModified(sal_True);
201*b1cdbd2cSJim Jagielski 		}
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 		return bOk;
204*b1cdbd2cSJim Jagielski 	}
205*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
206*b1cdbd2cSJim Jagielski 	/** connectionModified adds an undo action for the modified connection and forces an redraw
207*b1cdbd2cSJim Jagielski 		@param	_pView				the view which we use
208*b1cdbd2cSJim Jagielski 		@param	_pConnection	the connection which was modified
209*b1cdbd2cSJim Jagielski 		@param	_bAddUndo		true when an undo action should be appended
210*b1cdbd2cSJim Jagielski 	*/
connectionModified(OQueryTableView * _pView,OTableConnection * _pConnection,sal_Bool _bAddUndo)211*b1cdbd2cSJim Jagielski 	void connectionModified(OQueryTableView* _pView,
212*b1cdbd2cSJim Jagielski 							OTableConnection* _pConnection,
213*b1cdbd2cSJim Jagielski 							sal_Bool _bAddUndo)
214*b1cdbd2cSJim Jagielski 	{
215*b1cdbd2cSJim Jagielski 		OSL_ENSURE(_pConnection,"Invalid connection!");
216*b1cdbd2cSJim Jagielski 		_pConnection->UpdateLineList();
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 		// add an undo action
219*b1cdbd2cSJim Jagielski 		if ( _bAddUndo )
220*b1cdbd2cSJim Jagielski 			addUndoAction(	_pView,
221*b1cdbd2cSJim Jagielski 							new OQueryAddTabConnUndoAction(_pView),
222*b1cdbd2cSJim Jagielski 							static_cast< OQueryTableConnection*>(_pConnection));
223*b1cdbd2cSJim Jagielski 		// redraw
224*b1cdbd2cSJim Jagielski 		_pConnection->RecalcLines();
225*b1cdbd2cSJim Jagielski 		// force an invalidation of the bounding rectangle
226*b1cdbd2cSJim Jagielski 		_pConnection->InvalidateConnection();
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 		_pView->Invalidate(INVALIDATE_NOCHILDREN);
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
addConnections(OQueryTableView * _pView,const OQueryTableWindow & _rSource,const OQueryTableWindow & _rDest,const Reference<XNameAccess> & _rxSourceForeignKeyColumns)231*b1cdbd2cSJim Jagielski 	void addConnections(OQueryTableView* _pView,
232*b1cdbd2cSJim Jagielski 						const OQueryTableWindow& _rSource,
233*b1cdbd2cSJim Jagielski 						const OQueryTableWindow& _rDest,
234*b1cdbd2cSJim Jagielski 						const Reference<XNameAccess>& _rxSourceForeignKeyColumns)
235*b1cdbd2cSJim Jagielski 	{
236*b1cdbd2cSJim Jagielski         if ( _rSource.GetData()->isQuery() || _rDest.GetData()->isQuery() )
237*b1cdbd2cSJim Jagielski             // nothing to do if one of both denotes a query
238*b1cdbd2cSJim Jagielski             return;
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 		// we found a table in our view where we can insert some connections
241*b1cdbd2cSJim Jagielski 		// the key columns have a property called RelatedColumn
242*b1cdbd2cSJim Jagielski 		// OQueryTableConnectionData aufbauen
243*b1cdbd2cSJim Jagielski         OQueryTableConnectionData* pNewConnData = new OQueryTableConnectionData( _rSource.GetData(), _rDest.GetData() );
244*b1cdbd2cSJim Jagielski         TTableConnectionData::value_type aNewConnData(pNewConnData);
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 		Reference<XIndexAccess> xReferencedKeys( _rDest.GetData()->getKeys());
247*b1cdbd2cSJim Jagielski 		::rtl::OUString sRelatedColumn;
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 		// iterate through all foreignkey columns to create the connections
250*b1cdbd2cSJim Jagielski 		Sequence< ::rtl::OUString> aElements(_rxSourceForeignKeyColumns->getElementNames());
251*b1cdbd2cSJim Jagielski 		const ::rtl::OUString* pIter = aElements.getConstArray();
252*b1cdbd2cSJim Jagielski 		const ::rtl::OUString* pEnd   = pIter + aElements.getLength();
253*b1cdbd2cSJim Jagielski 		for(sal_Int32 i=0;pIter != pEnd;++pIter,++i)
254*b1cdbd2cSJim Jagielski 		{
255*b1cdbd2cSJim Jagielski 			Reference<XPropertySet> xColumn;
256*b1cdbd2cSJim Jagielski             if ( !( _rxSourceForeignKeyColumns->getByName(*pIter) >>= xColumn ) )
257*b1cdbd2cSJim Jagielski             {
258*b1cdbd2cSJim Jagielski                 OSL_ENSURE( false, "addConnections: invalid foreign key column!" );
259*b1cdbd2cSJim Jagielski                 continue;
260*b1cdbd2cSJim Jagielski             }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 			pNewConnData->SetFieldType(JTCS_FROM,TAB_NORMAL_FIELD);
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 			xColumn->getPropertyValue(PROPERTY_RELATEDCOLUMN) >>= sRelatedColumn;
265*b1cdbd2cSJim Jagielski 			pNewConnData->SetFieldType(JTCS_TO,isColumnInKeyType(xReferencedKeys,sRelatedColumn,KeyType::PRIMARY) ? TAB_PRIMARY_FIELD : TAB_NORMAL_FIELD);
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 			{
268*b1cdbd2cSJim Jagielski 				Sequence< sal_Int16> aFind(::comphelper::findValue(_rSource.GetOriginalColumns()->getElementNames(),*pIter,sal_True));
269*b1cdbd2cSJim Jagielski 				if(aFind.getLength())
270*b1cdbd2cSJim Jagielski 					pNewConnData->SetFieldIndex(JTCS_FROM,aFind[0]+1);
271*b1cdbd2cSJim Jagielski 				else
272*b1cdbd2cSJim Jagielski 					OSL_ENSURE(0,"Column not found!");
273*b1cdbd2cSJim Jagielski 			}
274*b1cdbd2cSJim Jagielski 			// get the position inside the tabe
275*b1cdbd2cSJim Jagielski 			Reference<XNameAccess> xRefColumns = _rDest.GetOriginalColumns();
276*b1cdbd2cSJim Jagielski 			if(xRefColumns.is())
277*b1cdbd2cSJim Jagielski 			{
278*b1cdbd2cSJim Jagielski 				Sequence< sal_Int16> aFind(::comphelper::findValue(xRefColumns->getElementNames(),sRelatedColumn,sal_True));
279*b1cdbd2cSJim Jagielski 				if(aFind.getLength())
280*b1cdbd2cSJim Jagielski 					pNewConnData->SetFieldIndex(JTCS_TO,aFind[0]+1);
281*b1cdbd2cSJim Jagielski 				else
282*b1cdbd2cSJim Jagielski 					OSL_ENSURE(0,"Column not found!");
283*b1cdbd2cSJim Jagielski 			}
284*b1cdbd2cSJim Jagielski 			pNewConnData->AppendConnLine(*pIter,sRelatedColumn);
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 			// dann die Conn selber dazu
287*b1cdbd2cSJim Jagielski 			OQueryTableConnection aNewConn(_pView, aNewConnData);
288*b1cdbd2cSJim Jagielski 				// der Verweis auf die lokale Variable ist unkritisch, da NotifyQueryTabConn eine neue Kopie anlegt
289*b1cdbd2cSJim Jagielski 			// und mir hinzufuegen (wenn nicht schon existent)
290*b1cdbd2cSJim Jagielski 			_pView->NotifyTabConnection(aNewConn, sal_False);
291*b1cdbd2cSJim Jagielski 				// don't create an Undo-Action for the new connection : the connection is
292*b1cdbd2cSJim Jagielski 				// covered by the Undo-Action for the tabwin, as the "Undo the insert" will
293*b1cdbd2cSJim Jagielski 				// automatically remove all connections adjacent to the win.
294*b1cdbd2cSJim Jagielski 				// (Because of this automatism we would have an ownerhsip ambiguity for
295*b1cdbd2cSJim Jagielski 				// the connection data if we would insert the conn-Undo-Action)
296*b1cdbd2cSJim Jagielski 				// FS - 21.10.99 - 69183
297*b1cdbd2cSJim Jagielski 		}
298*b1cdbd2cSJim Jagielski 	}
299*b1cdbd2cSJim Jagielski }
300*b1cdbd2cSJim Jagielski //==================================================================
301*b1cdbd2cSJim Jagielski // class OQueryTableView
302*b1cdbd2cSJim Jagielski //==================================================================
DBG_NAME(OQueryTableView)303*b1cdbd2cSJim Jagielski DBG_NAME(OQueryTableView)
304*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
305*b1cdbd2cSJim Jagielski OQueryTableView::OQueryTableView( Window* pParent,OQueryDesignView* pView)
306*b1cdbd2cSJim Jagielski 	: OJoinTableView( pParent,pView)
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski 	DBG_CTOR(OQueryTableView,NULL);
309*b1cdbd2cSJim Jagielski 	SetHelpId(HID_CTL_QRYDGNTAB);
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
~OQueryTableView()313*b1cdbd2cSJim Jagielski OQueryTableView::~OQueryTableView()
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski 	DBG_DTOR(OQueryTableView,NULL);
316*b1cdbd2cSJim Jagielski }
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
CountTableAlias(const String & rName,sal_Int32 & rMax)319*b1cdbd2cSJim Jagielski sal_Int32 OQueryTableView::CountTableAlias(const String& rName, sal_Int32& rMax)
320*b1cdbd2cSJim Jagielski {
321*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
322*b1cdbd2cSJim Jagielski 	sal_Int32 nRet = 0;
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	OTableWindowMapIterator aIter = GetTabWinMap()->find(rName);
325*b1cdbd2cSJim Jagielski 	while(aIter != GetTabWinMap()->end())
326*b1cdbd2cSJim Jagielski 	{
327*b1cdbd2cSJim Jagielski 		String aNewName;
328*b1cdbd2cSJim Jagielski 		aNewName = rName;
329*b1cdbd2cSJim Jagielski 		aNewName += '_';
330*b1cdbd2cSJim Jagielski 		aNewName += String::CreateFromInt32(++nRet);
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 		aIter = GetTabWinMap()->find(aNewName);
333*b1cdbd2cSJim Jagielski 	}
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	rMax = nRet;
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 	return nRet;
338*b1cdbd2cSJim Jagielski }
339*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
ReSync()340*b1cdbd2cSJim Jagielski void OQueryTableView::ReSync()
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
343*b1cdbd2cSJim Jagielski 	TTableWindowData* pTabWinDataList = m_pView->getController().getTableWindowData();
344*b1cdbd2cSJim Jagielski 	DBG_ASSERT((getTableConnections()->size()==0) && (GetTabWinMap()->size()==0),
345*b1cdbd2cSJim Jagielski 		"vor OQueryTableView::ReSync() bitte ClearAll aufrufen !");
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 	// ich brauche eine Sammlung aller Fensternamen, deren Anlegen schief geht, damit ich die entsprechenden Connections
348*b1cdbd2cSJim Jagielski 	// gar nicht erst anlege
349*b1cdbd2cSJim Jagielski 	::std::vector<String> arrInvalidTables;
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski 	TTableWindowData::reverse_iterator aIter = pTabWinDataList->rbegin();
352*b1cdbd2cSJim Jagielski 	// Fenster kreieren und einfuegen
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski 	for(;aIter != pTabWinDataList->rend();++aIter)
355*b1cdbd2cSJim Jagielski 	{
356*b1cdbd2cSJim Jagielski 		OQueryTableWindowData* pData = static_cast<OQueryTableWindowData*>(aIter->get());
357*b1cdbd2cSJim Jagielski 		OTableWindow* pTabWin = createWindow(*aIter);
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 		// ich gehe jetzt NICHT ueber ShowTabWin, da dieses die Daten des Fensters in die Liste des Docs einfuegt, was
360*b1cdbd2cSJim Jagielski 		// schlecht waere, denn genau von dort hole ich sie ja gerade
361*b1cdbd2cSJim Jagielski 		// also Schritt fuer Schritt
362*b1cdbd2cSJim Jagielski 		if (!pTabWin->Init())
363*b1cdbd2cSJim Jagielski 		{
364*b1cdbd2cSJim Jagielski 			// das Initialisieren ging schief, dass heisst, dieses TabWin steht nicht zur Verfuegung, also muss ich es inklusive
365*b1cdbd2cSJim Jagielski 			// seiner Daten am Dokument aufraeumen
366*b1cdbd2cSJim Jagielski 			pTabWin->clearListBox();
367*b1cdbd2cSJim Jagielski 			delete pTabWin;
368*b1cdbd2cSJim Jagielski 			arrInvalidTables.push_back(pData->GetAliasName());
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 			pTabWinDataList->erase( ::std::remove(pTabWinDataList->begin(),pTabWinDataList->end(),*aIter) ,pTabWinDataList->end());
371*b1cdbd2cSJim Jagielski 			continue;
372*b1cdbd2cSJim Jagielski 		}
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 		(*GetTabWinMap())[pData->GetAliasName()] = pTabWin;	// am Anfang einfuegen, da ich die DataList ja rueckwaerts durchlaufe
375*b1cdbd2cSJim Jagielski 		// wenn in den Daten keine Position oder Groesse steht -> Default
376*b1cdbd2cSJim Jagielski 		if (!pData->HasPosition() && !pData->HasSize())
377*b1cdbd2cSJim Jagielski 			SetDefaultTabWinPosSize(pTabWin);
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 		pTabWin->Show();
380*b1cdbd2cSJim Jagielski 	}
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 	// Verbindungen einfuegen
383*b1cdbd2cSJim Jagielski 	TTableConnectionData* pTabConnDataList = m_pView->getController().getTableConnectionData();
384*b1cdbd2cSJim Jagielski 	TTableConnectionData::reverse_iterator aConIter = pTabConnDataList->rbegin();
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	for(;aConIter != pTabConnDataList->rend();++aConIter)
387*b1cdbd2cSJim Jagielski 	{
388*b1cdbd2cSJim Jagielski 		OQueryTableConnectionData* pTabConnData =  static_cast<OQueryTableConnectionData*>(aConIter->get());
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 		// gibt es die beiden Tabellen zur Connection ?
391*b1cdbd2cSJim Jagielski 		String strTabExistenceTest = pTabConnData->getReferencingTable()->GetWinName();
392*b1cdbd2cSJim Jagielski 		sal_Bool bInvalid = ::std::find(arrInvalidTables.begin(),arrInvalidTables.end(),strTabExistenceTest) != arrInvalidTables.end();
393*b1cdbd2cSJim Jagielski 		strTabExistenceTest = pTabConnData->getReferencedTable()->GetWinName();
394*b1cdbd2cSJim Jagielski 		bInvalid = bInvalid && ::std::find(arrInvalidTables.begin(),arrInvalidTables.end(),strTabExistenceTest) != arrInvalidTables.end();
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 		if (bInvalid)
397*b1cdbd2cSJim Jagielski 		{	// nein -> Pech gehabt, die Connection faellt weg
398*b1cdbd2cSJim Jagielski 			pTabConnDataList->erase( ::std::remove(pTabConnDataList->begin(),pTabConnDataList->end(),*aConIter) ,pTabConnDataList->end());
399*b1cdbd2cSJim Jagielski 			continue;
400*b1cdbd2cSJim Jagielski 		}
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 		// adds a new connection to join view and notifies our accessible and invaldates the controller
403*b1cdbd2cSJim Jagielski 		addConnection(new OQueryTableConnection(this, *aConIter));
404*b1cdbd2cSJim Jagielski 	}
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
ClearAll()408*b1cdbd2cSJim Jagielski void OQueryTableView::ClearAll()
409*b1cdbd2cSJim Jagielski {
410*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
411*b1cdbd2cSJim Jagielski 	OJoinTableView::ClearAll();
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 	SetUpdateMode(sal_True);
414*b1cdbd2cSJim Jagielski 	m_pView->getController().setModified(sal_True);
415*b1cdbd2cSJim Jagielski }
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
createWindow(const TTableWindowData::value_type & _pData)418*b1cdbd2cSJim Jagielski OTableWindow* OQueryTableView::createWindow(const TTableWindowData::value_type& _pData)
419*b1cdbd2cSJim Jagielski {
420*b1cdbd2cSJim Jagielski 	return new OQueryTableWindow(this,_pData);
421*b1cdbd2cSJim Jagielski }
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
NotifyTabConnection(const OQueryTableConnection & rNewConn,sal_Bool _bCreateUndoAction)424*b1cdbd2cSJim Jagielski void OQueryTableView::NotifyTabConnection(const OQueryTableConnection& rNewConn, sal_Bool _bCreateUndoAction)
425*b1cdbd2cSJim Jagielski {
426*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
427*b1cdbd2cSJim Jagielski 	// erst mal schauen, ob ich diese Connection schon habe
428*b1cdbd2cSJim Jagielski 	OQueryTableConnection* pTabConn = NULL;
429*b1cdbd2cSJim Jagielski 	const ::std::vector<OTableConnection*>*	pConnections = getTableConnections();
430*b1cdbd2cSJim Jagielski     ::std::vector<OTableConnection*>::const_iterator aEnd = pConnections->end();
431*b1cdbd2cSJim Jagielski 	::std::vector<OTableConnection*>::const_iterator aIter = ::std::find(	pConnections->begin(),
432*b1cdbd2cSJim Jagielski 													aEnd,
433*b1cdbd2cSJim Jagielski 													static_cast<const OTableConnection*>(&rNewConn)
434*b1cdbd2cSJim Jagielski 													);
435*b1cdbd2cSJim Jagielski 	if(aIter == aEnd )
436*b1cdbd2cSJim Jagielski 	{
437*b1cdbd2cSJim Jagielski 		aIter = pConnections->begin();
438*b1cdbd2cSJim Jagielski 		for(;aIter != aEnd;++aIter)
439*b1cdbd2cSJim Jagielski 		{
440*b1cdbd2cSJim Jagielski 			if(*static_cast<OQueryTableConnection*>(*aIter) == rNewConn)
441*b1cdbd2cSJim Jagielski 			{
442*b1cdbd2cSJim Jagielski 				pTabConn = static_cast<OQueryTableConnection*>(*aIter);
443*b1cdbd2cSJim Jagielski 				break;
444*b1cdbd2cSJim Jagielski 			}
445*b1cdbd2cSJim Jagielski 		}
446*b1cdbd2cSJim Jagielski 	}
447*b1cdbd2cSJim Jagielski 	else
448*b1cdbd2cSJim Jagielski 		pTabConn = static_cast<OQueryTableConnection*>(*aIter);
449*b1cdbd2cSJim Jagielski 	// nein -> einfuegen
450*b1cdbd2cSJim Jagielski 	if (pTabConn == NULL)
451*b1cdbd2cSJim Jagielski 	{
452*b1cdbd2cSJim Jagielski 		// die neuen Daten ...
453*b1cdbd2cSJim Jagielski 		OQueryTableConnectionData* pNewData = static_cast< OQueryTableConnectionData*>(rNewConn.GetData()->NewInstance());
454*b1cdbd2cSJim Jagielski 		pNewData->CopyFrom(*rNewConn.GetData());
455*b1cdbd2cSJim Jagielski         TTableConnectionData::value_type aData(pNewData);
456*b1cdbd2cSJim Jagielski 		OQueryTableConnection* pNewConn = new OQueryTableConnection(this, aData);
457*b1cdbd2cSJim Jagielski 		GetConnection(pNewConn);
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 		connectionModified(this,pNewConn,_bCreateUndoAction);
460*b1cdbd2cSJim Jagielski 	}
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
CreateImpl(const::rtl::OUString & _rComposedName,const::rtl::OUString & _sTableName,const::rtl::OUString & _rWinName)463*b1cdbd2cSJim Jagielski OTableWindowData* OQueryTableView::CreateImpl(const ::rtl::OUString& _rComposedName
464*b1cdbd2cSJim Jagielski                                              ,const ::rtl::OUString& _sTableName
465*b1cdbd2cSJim Jagielski 											 ,const ::rtl::OUString& _rWinName)
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski 	return new OQueryTableWindowData( _rComposedName, _sTableName,_rWinName );
468*b1cdbd2cSJim Jagielski }
469*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
AddTabWin(const::rtl::OUString & _rTableName,const::rtl::OUString & _rAliasName,sal_Bool bNewTable)470*b1cdbd2cSJim Jagielski void OQueryTableView::AddTabWin(const ::rtl::OUString& _rTableName, const ::rtl::OUString& _rAliasName, sal_Bool bNewTable)
471*b1cdbd2cSJim Jagielski {
472*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
473*b1cdbd2cSJim Jagielski 	// das ist die aus der Basisklasse geerbte Methode, die fuehre ich auf die an meinem Parent zurueck, die mir eventuell einen
474*b1cdbd2cSJim Jagielski 	// Alias dazu bastelt und das an mein anderes AddTabWin weiterreicht
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski 	// leider ist _rTableName voll qualifiziert, das OQueryDesignView erwartet aber einen String, der
477*b1cdbd2cSJim Jagielski 	// nur aus Schema und Tabelle besteht und keinen Katalog enthaelt.
478*b1cdbd2cSJim Jagielski 	Reference< XConnection> xConnection = m_pView->getController().getConnection();
479*b1cdbd2cSJim Jagielski 	if(!xConnection.is())
480*b1cdbd2cSJim Jagielski 		return;
481*b1cdbd2cSJim Jagielski 	try
482*b1cdbd2cSJim Jagielski 	{
483*b1cdbd2cSJim Jagielski 		Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
484*b1cdbd2cSJim Jagielski 		::rtl::OUString sCatalog, sSchema, sTable;
485*b1cdbd2cSJim Jagielski 		::dbtools::qualifiedNameComponents(xMetaData,
486*b1cdbd2cSJim Jagielski 									_rTableName,
487*b1cdbd2cSJim Jagielski 									sCatalog,
488*b1cdbd2cSJim Jagielski 									sSchema,
489*b1cdbd2cSJim Jagielski 									sTable,
490*b1cdbd2cSJim Jagielski 									::dbtools::eInDataManipulation);
491*b1cdbd2cSJim Jagielski 		::rtl::OUString sRealName(sSchema);
492*b1cdbd2cSJim Jagielski 		if (sRealName.getLength())
493*b1cdbd2cSJim Jagielski 			sRealName+= ::rtl::OUString('.');
494*b1cdbd2cSJim Jagielski 		sRealName += sTable;
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski 		AddTabWin(_rTableName, sRealName, _rAliasName, bNewTable);
497*b1cdbd2cSJim Jagielski 	}
498*b1cdbd2cSJim Jagielski 	catch(SQLException&)
499*b1cdbd2cSJim Jagielski 	{
500*b1cdbd2cSJim Jagielski 		OSL_ASSERT(!"qualifiedNameComponents");
501*b1cdbd2cSJim Jagielski 	}
502*b1cdbd2cSJim Jagielski }
503*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
504*b1cdbd2cSJim Jagielski // find the table which has a foreign key with this referencedTable name
getKeyReferencedTo(const Reference<XIndexAccess> & _rxKeys,const::rtl::OUString & _rReferencedTable)505*b1cdbd2cSJim Jagielski Reference<XPropertySet> getKeyReferencedTo(const Reference<XIndexAccess>& _rxKeys,const ::rtl::OUString& _rReferencedTable)
506*b1cdbd2cSJim Jagielski {
507*b1cdbd2cSJim Jagielski 	if(!_rxKeys.is())
508*b1cdbd2cSJim Jagielski 		return Reference<XPropertySet>();
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski 	if ( !_rxKeys.is() )
511*b1cdbd2cSJim Jagielski 		return Reference<XPropertySet>();
512*b1cdbd2cSJim Jagielski 	// search the one and only primary key
513*b1cdbd2cSJim Jagielski     const sal_Int32 nCount = _rxKeys->getCount();
514*b1cdbd2cSJim Jagielski 	for(sal_Int32 i=0;i<nCount ;++i)
515*b1cdbd2cSJim Jagielski 	{
516*b1cdbd2cSJim Jagielski 		Reference<XPropertySet> xKey(_rxKeys->getByIndex(i),UNO_QUERY);
517*b1cdbd2cSJim Jagielski 		if(xKey.is())
518*b1cdbd2cSJim Jagielski 		{
519*b1cdbd2cSJim Jagielski 			sal_Int32 nKeyType = 0;
520*b1cdbd2cSJim Jagielski 			xKey->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
521*b1cdbd2cSJim Jagielski 			if(KeyType::FOREIGN == nKeyType)
522*b1cdbd2cSJim Jagielski 			{
523*b1cdbd2cSJim Jagielski 				::rtl::OUString sReferencedTable;
524*b1cdbd2cSJim Jagielski 				xKey->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= sReferencedTable;
525*b1cdbd2cSJim Jagielski 				// TODO check case
526*b1cdbd2cSJim Jagielski 				if(sReferencedTable == _rReferencedTable)
527*b1cdbd2cSJim Jagielski 					return xKey;
528*b1cdbd2cSJim Jagielski 			}
529*b1cdbd2cSJim Jagielski 		}
530*b1cdbd2cSJim Jagielski 	}
531*b1cdbd2cSJim Jagielski 	return Reference<XPropertySet>();
532*b1cdbd2cSJim Jagielski }
533*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
AddTabWin(const::rtl::OUString & _rComposedName,const::rtl::OUString & _rTableName,const::rtl::OUString & strAlias,sal_Bool bNewTable)534*b1cdbd2cSJim Jagielski void OQueryTableView::AddTabWin(const ::rtl::OUString& _rComposedName, const ::rtl::OUString& _rTableName, const ::rtl::OUString& strAlias, sal_Bool bNewTable)
535*b1cdbd2cSJim Jagielski {
536*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
537*b1cdbd2cSJim Jagielski 	DBG_ASSERT(_rTableName.getLength() || strAlias.getLength(), "OQueryTableView::AddTabWin : kein Tabellen- und kein Aliasname !");
538*b1cdbd2cSJim Jagielski 		// wenn der Tabellenname nicht gesetzt ist, steht das fuer ein Dummy-Fenster, das braucht aber wenigstens einen Alias-Namen
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski 	// neue Datenstruktur erzeugen
541*b1cdbd2cSJim Jagielski 	// first check if this already hav it's data
542*b1cdbd2cSJim Jagielski 	sal_Bool bAppend = bNewTable;
543*b1cdbd2cSJim Jagielski 	TTableWindowData::value_type pNewTabWinData;
544*b1cdbd2cSJim Jagielski 	TTableWindowData* pWindowData = getDesignView()->getController().getTableWindowData();
545*b1cdbd2cSJim Jagielski 	TTableWindowData::iterator aWinIter = pWindowData->begin();
546*b1cdbd2cSJim Jagielski     TTableWindowData::iterator aWinEnd = pWindowData->end();
547*b1cdbd2cSJim Jagielski 	for(;aWinIter != aWinEnd;++aWinIter)
548*b1cdbd2cSJim Jagielski 	{
549*b1cdbd2cSJim Jagielski 		pNewTabWinData = *aWinIter;
550*b1cdbd2cSJim Jagielski 		if (pNewTabWinData && pNewTabWinData->GetWinName() == strAlias && pNewTabWinData->GetComposedName() == _rComposedName && pNewTabWinData->GetTableName() == _rTableName)
551*b1cdbd2cSJim Jagielski 			break;
552*b1cdbd2cSJim Jagielski 	}
553*b1cdbd2cSJim Jagielski     if ( !bAppend )
554*b1cdbd2cSJim Jagielski         bAppend = ( aWinIter == aWinEnd );
555*b1cdbd2cSJim Jagielski 	if ( bAppend )
556*b1cdbd2cSJim Jagielski 		pNewTabWinData = createTableWindowData(_rComposedName, _rTableName, strAlias);
557*b1cdbd2cSJim Jagielski 		// die TabWinData brauche ich nicht in die entsprechende Liste der DocShell eintragen, das macht ShowTabWin
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 	// neues Fenster erzeugen
560*b1cdbd2cSJim Jagielski 	OQueryTableWindow* pNewTabWin = static_cast<OQueryTableWindow*>(createWindow(pNewTabWinData));
561*b1cdbd2cSJim Jagielski 	// das Init kann ich hier weglassen, da das in ShowTabWin passiert
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 	// Neue UndoAction
564*b1cdbd2cSJim Jagielski 	OQueryTabWinShowUndoAct* pUndoAction = new OQueryTabWinShowUndoAct(this);
565*b1cdbd2cSJim Jagielski 	pUndoAction->SetTabWin(pNewTabWin);	// Fenster
566*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = ShowTabWin(pNewTabWin, pUndoAction,bAppend);
567*b1cdbd2cSJim Jagielski 	if(!bSuccess)
568*b1cdbd2cSJim Jagielski 	{
569*b1cdbd2cSJim Jagielski 		// reset table window
570*b1cdbd2cSJim Jagielski 		pUndoAction->SetTabWin(NULL);
571*b1cdbd2cSJim Jagielski 		pUndoAction->SetOwnership(sal_False);
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski 		delete pUndoAction;
574*b1cdbd2cSJim Jagielski 		return;
575*b1cdbd2cSJim Jagielski 	}
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	// Relationen zwischen den einzelnen Tabellen anzeigen
578*b1cdbd2cSJim Jagielski 	OTableWindowMap* pTabWins = GetTabWinMap();
579*b1cdbd2cSJim Jagielski 	if(bNewTable && !pTabWins->empty() && _rTableName.getLength())
580*b1cdbd2cSJim Jagielski 	{
581*b1cdbd2cSJim Jagielski 		modified();
582*b1cdbd2cSJim Jagielski 		if ( m_pAccessible )
583*b1cdbd2cSJim Jagielski 			m_pAccessible->notifyAccessibleEvent(	AccessibleEventId::CHILD,
584*b1cdbd2cSJim Jagielski 													Any(),
585*b1cdbd2cSJim Jagielski 													makeAny(pNewTabWin->GetAccessible())
586*b1cdbd2cSJim Jagielski 													);
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski         do {
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski         if ( pNewTabWin->GetData()->isQuery() )
591*b1cdbd2cSJim Jagielski             break;
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski         try
594*b1cdbd2cSJim Jagielski         {
595*b1cdbd2cSJim Jagielski             //////////////////////////////////////////////////////////////////////
596*b1cdbd2cSJim Jagielski 			// find relations between the table an the tables already inserted
597*b1cdbd2cSJim Jagielski 			Reference< XIndexAccess> xKeyIndex = pNewTabWin->GetData()->getKeys();
598*b1cdbd2cSJim Jagielski 			if ( !xKeyIndex.is() )
599*b1cdbd2cSJim Jagielski                 break;
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski             Reference<XNameAccess> xFKeyColumns;
602*b1cdbd2cSJim Jagielski 			::rtl::OUString aReferencedTable;
603*b1cdbd2cSJim Jagielski 			Reference<XColumnsSupplier> xColumnsSupplier;
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski             const sal_Int32 nKeyCount = xKeyIndex->getCount();
606*b1cdbd2cSJim Jagielski             for ( sal_Int32 i=0; i<nKeyCount ; ++i )
607*b1cdbd2cSJim Jagielski 			{
608*b1cdbd2cSJim Jagielski                 Reference< XPropertySet > xProp( xKeyIndex->getByIndex(i), UNO_QUERY_THROW );
609*b1cdbd2cSJim Jagielski                 xColumnsSupplier.set( xProp, UNO_QUERY_THROW );
610*b1cdbd2cSJim Jagielski 				xFKeyColumns.set( xColumnsSupplier->getColumns(), UNO_QUERY_THROW );
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski                 sal_Int32 nKeyType = 0;
613*b1cdbd2cSJim Jagielski 				xProp->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski                 switch ( nKeyType )
616*b1cdbd2cSJim Jagielski                 {
617*b1cdbd2cSJim Jagielski                 case KeyType::FOREIGN:
618*b1cdbd2cSJim Jagielski 				{	// our new table has a foreign key
619*b1cdbd2cSJim Jagielski 					// so look if the referenced table is already in our list
620*b1cdbd2cSJim Jagielski 					xProp->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= aReferencedTable;
621*b1cdbd2cSJim Jagielski 					OSL_ENSURE(aReferencedTable.getLength(),"Foreign key without referencedTableName");
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 					OTableWindowMap::const_iterator aIter = pTabWins->find(aReferencedTable);
624*b1cdbd2cSJim Jagielski                     OTableWindowMap::const_iterator aEnd  = pTabWins->end();
625*b1cdbd2cSJim Jagielski 					if(aIter == aEnd)
626*b1cdbd2cSJim Jagielski 					{
627*b1cdbd2cSJim Jagielski 						for(aIter = pTabWins->begin();aIter != aEnd;++aIter)
628*b1cdbd2cSJim Jagielski 						{
629*b1cdbd2cSJim Jagielski 							OQueryTableWindow* pTabWinTmp = static_cast<OQueryTableWindow*>(aIter->second);
630*b1cdbd2cSJim Jagielski 							OSL_ENSURE( pTabWinTmp,"TableWindow is null!" );
631*b1cdbd2cSJim Jagielski 							if ( pTabWinTmp != pNewTabWin && pTabWinTmp->GetComposedName() == aReferencedTable )
632*b1cdbd2cSJim Jagielski 								break;
633*b1cdbd2cSJim Jagielski 						}
634*b1cdbd2cSJim Jagielski 					}
635*b1cdbd2cSJim Jagielski 					if ( aIter != aEnd && pNewTabWin != aIter->second )
636*b1cdbd2cSJim Jagielski 						addConnections( this, *pNewTabWin, *static_cast<OQueryTableWindow*>(aIter->second), xFKeyColumns );
637*b1cdbd2cSJim Jagielski 				}
638*b1cdbd2cSJim Jagielski                 break;
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski                 case KeyType::PRIMARY:
641*b1cdbd2cSJim Jagielski 				{
642*b1cdbd2cSJim Jagielski 					// we have a primary key so look in our list if there exsits a key which this is refered to
643*b1cdbd2cSJim Jagielski 					OTableWindowMap::const_iterator aIter = pTabWins->begin();
644*b1cdbd2cSJim Jagielski                     OTableWindowMap::const_iterator aEnd  = pTabWins->end();
645*b1cdbd2cSJim Jagielski 					for(;aIter != aEnd;++aIter)
646*b1cdbd2cSJim Jagielski 					{
647*b1cdbd2cSJim Jagielski 						OQueryTableWindow* pTabWinTmp = static_cast<OQueryTableWindow*>(aIter->second);
648*b1cdbd2cSJim Jagielski 						if ( pTabWinTmp == pNewTabWin )
649*b1cdbd2cSJim Jagielski                             continue;
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski                         if ( pTabWinTmp->GetData()->isQuery() )
652*b1cdbd2cSJim Jagielski                             continue;
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski                         OSL_ENSURE(pTabWinTmp,"TableWindow is null!");
655*b1cdbd2cSJim Jagielski 						Reference< XPropertySet > xFKKey = getKeyReferencedTo( pTabWinTmp->GetData()->getKeys(), pNewTabWin->GetComposedName() );
656*b1cdbd2cSJim Jagielski                         if ( !xFKKey.is() )
657*b1cdbd2cSJim Jagielski                             continue;
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski                         Reference<XColumnsSupplier> xFKColumnsSupplier( xFKKey, UNO_QUERY_THROW );
660*b1cdbd2cSJim Jagielski 						Reference< XNameAccess > xTColumns( xFKColumnsSupplier->getColumns(), UNO_QUERY_THROW );
661*b1cdbd2cSJim Jagielski 						addConnections( this, *pTabWinTmp, *pNewTabWin, xTColumns );
662*b1cdbd2cSJim Jagielski 					}
663*b1cdbd2cSJim Jagielski 				}
664*b1cdbd2cSJim Jagielski                 break;
665*b1cdbd2cSJim Jagielski                 }
666*b1cdbd2cSJim Jagielski             }
667*b1cdbd2cSJim Jagielski 		}
668*b1cdbd2cSJim Jagielski         catch( const Exception& )
669*b1cdbd2cSJim Jagielski         {
670*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
671*b1cdbd2cSJim Jagielski         }
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski         } while ( false );
674*b1cdbd2cSJim Jagielski 	}
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski 	// mein Parent brauche ich, da es vom Loeschen erfahren soll
677*b1cdbd2cSJim Jagielski 	m_pView->getController().addUndoActionAndInvalidate( pUndoAction );
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 	if (bSuccess && m_lnkTabWinsChangeHandler.IsSet())
680*b1cdbd2cSJim Jagielski 	{
681*b1cdbd2cSJim Jagielski 		TabWinsChangeNotification aHint(TabWinsChangeNotification::AT_ADDED_WIN, pNewTabWin->GetAliasName());
682*b1cdbd2cSJim Jagielski 		m_lnkTabWinsChangeHandler.Call(&aHint);
683*b1cdbd2cSJim Jagielski 	}
684*b1cdbd2cSJim Jagielski }
685*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
686*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
AddConnection(const OJoinExchangeData & jxdSource,const OJoinExchangeData & jxdDest)687*b1cdbd2cSJim Jagielski void OQueryTableView::AddConnection(const OJoinExchangeData& jxdSource, const OJoinExchangeData& jxdDest)
688*b1cdbd2cSJim Jagielski {
689*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
690*b1cdbd2cSJim Jagielski 	OQueryTableWindow* pSourceWin = static_cast< OQueryTableWindow*>(jxdSource.pListBox->GetTabWin());
691*b1cdbd2cSJim Jagielski 	OQueryTableWindow* pDestWin = static_cast< OQueryTableWindow*>(jxdDest.pListBox->GetTabWin());
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski 	String aSourceFieldName, aDestFieldName;
694*b1cdbd2cSJim Jagielski 	aSourceFieldName	= jxdSource.pListBox->GetEntryText(jxdSource.pEntry);
695*b1cdbd2cSJim Jagielski 	aDestFieldName		= jxdDest.pListBox->GetEntryText(jxdDest.pEntry);
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 	OTableConnection* pConn = GetTabConn(pSourceWin,pDestWin,true);
698*b1cdbd2cSJim Jagielski 	if ( !pConn )
699*b1cdbd2cSJim Jagielski 	{
700*b1cdbd2cSJim Jagielski 		// neues Daten-Objekt
701*b1cdbd2cSJim Jagielski 		OQueryTableConnectionData* pNewConnectionData = new OQueryTableConnectionData(pSourceWin->GetData(), pDestWin->GetData());
702*b1cdbd2cSJim Jagielski         TTableConnectionData::value_type aNewConnectionData(pNewConnectionData);
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski 		sal_uInt32			nSourceFieldIndex, nDestFieldIndex;
705*b1cdbd2cSJim Jagielski 		ETableFieldType	eSourceFieldType, eDestFieldType;
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski 		// Namen/Position/Typ der beiden betroffenen Felder besorgen ...
708*b1cdbd2cSJim Jagielski 		// Source
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski 		nSourceFieldIndex = jxdSource.pListBox->GetModel()->GetAbsPos(jxdSource.pEntry);
711*b1cdbd2cSJim Jagielski 		eSourceFieldType = static_cast< OTableFieldInfo*>(jxdSource.pEntry->GetUserData())->GetKeyType();
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski 		// Dest
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski 		nDestFieldIndex = jxdDest.pListBox->GetModel()->GetAbsPos(jxdDest.pEntry);
716*b1cdbd2cSJim Jagielski 		eDestFieldType = static_cast< OTableFieldInfo*>(jxdDest.pEntry->GetUserData())->GetKeyType();
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski 		// ... und setzen
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 		pNewConnectionData->SetFieldIndex(JTCS_FROM, nSourceFieldIndex);
721*b1cdbd2cSJim Jagielski 		pNewConnectionData->SetFieldIndex(JTCS_TO, nDestFieldIndex);
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 		pNewConnectionData->SetFieldType(JTCS_FROM, eSourceFieldType);
724*b1cdbd2cSJim Jagielski 		pNewConnectionData->SetFieldType(JTCS_TO, eDestFieldType);
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski 		pNewConnectionData->AppendConnLine( aSourceFieldName,aDestFieldName );
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 		OQueryTableConnection aNewConnection(this, aNewConnectionData);
729*b1cdbd2cSJim Jagielski 		NotifyTabConnection(aNewConnection);
730*b1cdbd2cSJim Jagielski 			// wie immer bei NotifyTabConnection ist das Verwenden lokaler Variablen unkritisch, da sowieso eine Kopie erzeugt wird
731*b1cdbd2cSJim Jagielski 	}
732*b1cdbd2cSJim Jagielski 	else
733*b1cdbd2cSJim Jagielski 	{
734*b1cdbd2cSJim Jagielski 		// the connection could point on the other side
735*b1cdbd2cSJim Jagielski 		if(pConn->GetSourceWin() == pDestWin)
736*b1cdbd2cSJim Jagielski 		{
737*b1cdbd2cSJim Jagielski 			String aTmp(aSourceFieldName);
738*b1cdbd2cSJim Jagielski 			aSourceFieldName = aDestFieldName;
739*b1cdbd2cSJim Jagielski 			aDestFieldName = aTmp;
740*b1cdbd2cSJim Jagielski 		}
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski 		pConn->GetData()->AppendConnLine( aSourceFieldName,aDestFieldName );
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 		connectionModified(this,pConn,sal_False);
745*b1cdbd2cSJim Jagielski 	}
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
ConnDoubleClicked(OTableConnection * pConnection)748*b1cdbd2cSJim Jagielski void OQueryTableView::ConnDoubleClicked(OTableConnection* pConnection)
749*b1cdbd2cSJim Jagielski {
750*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
751*b1cdbd2cSJim Jagielski 	if( openJoinDialog(this,pConnection->GetData(),sal_False) )
752*b1cdbd2cSJim Jagielski 	{
753*b1cdbd2cSJim Jagielski 		connectionModified(this,pConnection,sal_False);
754*b1cdbd2cSJim Jagielski 		SelectConn( pConnection );
755*b1cdbd2cSJim Jagielski 	}
756*b1cdbd2cSJim Jagielski }
757*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
createNewConnection()758*b1cdbd2cSJim Jagielski void OQueryTableView::createNewConnection()
759*b1cdbd2cSJim Jagielski {
760*b1cdbd2cSJim Jagielski     TTableConnectionData::value_type pData(new OQueryTableConnectionData());
761*b1cdbd2cSJim Jagielski 	if( openJoinDialog(this,pData,sal_True) )
762*b1cdbd2cSJim Jagielski 	{
763*b1cdbd2cSJim Jagielski 		OTableWindowMap* pMap = GetTabWinMap();
764*b1cdbd2cSJim Jagielski 		OQueryTableWindow* pSourceWin	= static_cast< OQueryTableWindow*>((*pMap)[pData->getReferencingTable()->GetWinName()]);
765*b1cdbd2cSJim Jagielski 		OQueryTableWindow* pDestWin		= static_cast< OQueryTableWindow*>((*pMap)[pData->getReferencedTable()->GetWinName()]);
766*b1cdbd2cSJim Jagielski 		// first we have to look if the this connection already exists
767*b1cdbd2cSJim Jagielski 		OTableConnection* pConn = GetTabConn(pSourceWin,pDestWin,true);
768*b1cdbd2cSJim Jagielski 		sal_Bool bNew = sal_True;
769*b1cdbd2cSJim Jagielski 		if ( pConn )
770*b1cdbd2cSJim Jagielski 		{
771*b1cdbd2cSJim Jagielski 			pConn->GetData()->CopyFrom( *pData );
772*b1cdbd2cSJim Jagielski 			bNew = sal_False;
773*b1cdbd2cSJim Jagielski 		}
774*b1cdbd2cSJim Jagielski 		else
775*b1cdbd2cSJim Jagielski 		{
776*b1cdbd2cSJim Jagielski 			// create a new conenction and append it
777*b1cdbd2cSJim Jagielski 			OQueryTableConnection* pQConn = new OQueryTableConnection(this, pData);
778*b1cdbd2cSJim Jagielski 			GetConnection(pQConn);
779*b1cdbd2cSJim Jagielski 			pConn = pQConn;
780*b1cdbd2cSJim Jagielski 		}
781*b1cdbd2cSJim Jagielski 		connectionModified(this,pConn,bNew);
782*b1cdbd2cSJim Jagielski 		if ( !bNew && pConn == GetSelectedConn() ) // our connection was selected before so we have to reselect it
783*b1cdbd2cSJim Jagielski 			SelectConn( pConn );
784*b1cdbd2cSJim Jagielski 	}
785*b1cdbd2cSJim Jagielski }
786*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
RemoveConnection(OTableConnection * _pConnection,sal_Bool)787*b1cdbd2cSJim Jagielski bool OQueryTableView::RemoveConnection( OTableConnection* _pConnection,sal_Bool /*_bDelete*/ )
788*b1cdbd2cSJim Jagielski {
789*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 	// we don't want that our connection will be deleted, we put it in the undo manager
792*b1cdbd2cSJim Jagielski 	bool bRet = OJoinTableView::RemoveConnection( _pConnection,sal_False);
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski 	// add undo action
795*b1cdbd2cSJim Jagielski 	addUndoAction(	this,
796*b1cdbd2cSJim Jagielski 					new OQueryDelTabConnUndoAction(this),
797*b1cdbd2cSJim Jagielski 					static_cast< OQueryTableConnection*>(_pConnection),
798*b1cdbd2cSJim Jagielski 					sal_True);
799*b1cdbd2cSJim Jagielski 	return bRet;
800*b1cdbd2cSJim Jagielski }
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
KeyInput(const KeyEvent & rEvt)803*b1cdbd2cSJim Jagielski void OQueryTableView::KeyInput( const KeyEvent& rEvt )
804*b1cdbd2cSJim Jagielski {
805*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
806*b1cdbd2cSJim Jagielski 	OJoinTableView::KeyInput( rEvt );
807*b1cdbd2cSJim Jagielski }
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
FindTable(const String & rAliasName)810*b1cdbd2cSJim Jagielski OQueryTableWindow* OQueryTableView::FindTable(const String& rAliasName)
811*b1cdbd2cSJim Jagielski {
812*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
813*b1cdbd2cSJim Jagielski 	DBG_ASSERT(rAliasName.Len(), "OQueryTableView::FindTable : der AliasName sollte nicht leer sein !");
814*b1cdbd2cSJim Jagielski 		// (nicht dass es schadet, aber es ist sinnlos und weist vielleicht auf Fehler beim Aufrufer hin)
815*b1cdbd2cSJim Jagielski 	OTableWindowMap::const_iterator aIter = GetTabWinMap()->find(rAliasName);
816*b1cdbd2cSJim Jagielski 	if(aIter != GetTabWinMap()->end())
817*b1cdbd2cSJim Jagielski 		return static_cast<OQueryTableWindow*>(aIter->second);
818*b1cdbd2cSJim Jagielski 	return NULL;
819*b1cdbd2cSJim Jagielski }
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
FindTableFromField(const String & rFieldName,OTableFieldDescRef & rInfo,sal_uInt16 & rCnt)822*b1cdbd2cSJim Jagielski sal_Bool OQueryTableView::FindTableFromField(const String& rFieldName, OTableFieldDescRef& rInfo, sal_uInt16& rCnt)
823*b1cdbd2cSJim Jagielski {
824*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
825*b1cdbd2cSJim Jagielski 	rCnt = 0;
826*b1cdbd2cSJim Jagielski 	OTableWindowMap::const_iterator aIter = GetTabWinMap()->begin();
827*b1cdbd2cSJim Jagielski     OTableWindowMap::const_iterator aEnd  = GetTabWinMap()->end();
828*b1cdbd2cSJim Jagielski 	for(;aIter != aEnd;++aIter)
829*b1cdbd2cSJim Jagielski 	{
830*b1cdbd2cSJim Jagielski 		if(static_cast<OQueryTableWindow*>(aIter->second)->ExistsField(rFieldName, rInfo))
831*b1cdbd2cSJim Jagielski 			++rCnt;
832*b1cdbd2cSJim Jagielski 	}
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski 	return rCnt == 1;
835*b1cdbd2cSJim Jagielski }
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ContainsTabWin(const OTableWindow & rTabWin)838*b1cdbd2cSJim Jagielski bool OQueryTableView::ContainsTabWin(const OTableWindow& rTabWin)
839*b1cdbd2cSJim Jagielski {
840*b1cdbd2cSJim Jagielski     OTableWindowMap* pTabWins = GetTabWinMap();
841*b1cdbd2cSJim Jagielski     DBG_ASSERT(pTabWins != NULL, "OQueryTableView::HideTabWin : habe keine TabWins !");
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski     OTableWindowMap::iterator aIter = pTabWins->begin();
844*b1cdbd2cSJim Jagielski     OTableWindowMap::iterator aEnd  = pTabWins->end();
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski     for ( ;aIter != aEnd ; ++aIter )
847*b1cdbd2cSJim Jagielski     {
848*b1cdbd2cSJim Jagielski         if ( aIter->second == &rTabWin )
849*b1cdbd2cSJim Jagielski         {
850*b1cdbd2cSJim Jagielski             return true;
851*b1cdbd2cSJim Jagielski         }
852*b1cdbd2cSJim Jagielski     }
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski     return false;
855*b1cdbd2cSJim Jagielski }
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
RemoveTabWin(OTableWindow * pTabWin)858*b1cdbd2cSJim Jagielski void OQueryTableView::RemoveTabWin(OTableWindow* pTabWin)
859*b1cdbd2cSJim Jagielski {
860*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
861*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pTabWin != NULL, "OQueryTableView::RemoveTabWin : Fenster sollte ungleich NULL sein !");
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski     if(pTabWin && ContainsTabWin(*pTabWin)) // #122589# check if registered before deleting
864*b1cdbd2cSJim Jagielski     {
865*b1cdbd2cSJim Jagielski 	    // mein Parent brauche ich, da es vom Loeschen erfahren soll
866*b1cdbd2cSJim Jagielski 	    OQueryDesignView* pParent = static_cast<OQueryDesignView*>(getDesignView());
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 	    SfxUndoManager& rUndoMgr = m_pView->getController().GetUndoManager();
869*b1cdbd2cSJim Jagielski 	    rUndoMgr.EnterListAction( String( ModuleRes(STR_QUERY_UNDO_TABWINDELETE) ), String() );
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski 	    // Undo-Action anlegen
872*b1cdbd2cSJim Jagielski 	    OQueryTabWinDelUndoAct* pUndoAction = new OQueryTabWinDelUndoAct(this);
873*b1cdbd2cSJim Jagielski 	    pUndoAction->SetTabWin(static_cast< OQueryTableWindow*>(pTabWin));
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski 	    // und Fenster verstecken
876*b1cdbd2cSJim Jagielski 	    HideTabWin(static_cast< OQueryTableWindow*>(pTabWin), pUndoAction);
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 	    // Undo Actions und Loeschen der Felder in SelectionBrowseBox
879*b1cdbd2cSJim Jagielski 	    pParent->TableDeleted( static_cast< OQueryTableWindowData*>(pTabWin->GetData().get())->GetAliasName() );
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski 	    m_pView->getController().addUndoActionAndInvalidate( pUndoAction );
882*b1cdbd2cSJim Jagielski 	    rUndoMgr.LeaveListAction();
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 	    if (m_lnkTabWinsChangeHandler.IsSet())
885*b1cdbd2cSJim Jagielski 	    {
886*b1cdbd2cSJim Jagielski 		    TabWinsChangeNotification aHint(TabWinsChangeNotification::AT_REMOVED_WIN, static_cast< OQueryTableWindow*>(pTabWin)->GetAliasName());
887*b1cdbd2cSJim Jagielski 		    m_lnkTabWinsChangeHandler.Call(&aHint);
888*b1cdbd2cSJim Jagielski 	    }
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 	    modified();
891*b1cdbd2cSJim Jagielski 	    if ( m_pAccessible )
892*b1cdbd2cSJim Jagielski 		    m_pAccessible->notifyAccessibleEvent(	AccessibleEventId::CHILD,
893*b1cdbd2cSJim Jagielski 												    makeAny(pTabWin->GetAccessible()),
894*b1cdbd2cSJim Jagielski 												    Any()
895*b1cdbd2cSJim Jagielski 												    );
896*b1cdbd2cSJim Jagielski     }
897*b1cdbd2cSJim Jagielski }
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
EnsureVisible(const OTableWindow * pWin)900*b1cdbd2cSJim Jagielski void OQueryTableView::EnsureVisible(const OTableWindow* pWin)
901*b1cdbd2cSJim Jagielski {
902*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski 	Invalidate(INVALIDATE_NOCHILDREN);
905*b1cdbd2cSJim Jagielski 	OJoinTableView::EnsureVisible(pWin);
906*b1cdbd2cSJim Jagielski }
907*b1cdbd2cSJim Jagielski 
908*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
GetConnection(OQueryTableConnection * pConn)909*b1cdbd2cSJim Jagielski void OQueryTableView::GetConnection(OQueryTableConnection* pConn)
910*b1cdbd2cSJim Jagielski {
911*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
912*b1cdbd2cSJim Jagielski 	// bei mir und dem Dokument einfuegen
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski 	addConnection( pConn );
915*b1cdbd2cSJim Jagielski 	// invalidieren (damit es neu gezeichnet wird)
916*b1cdbd2cSJim Jagielski 	//	pConn->Invalidate();
917*b1cdbd2cSJim Jagielski }
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
DropConnection(OQueryTableConnection * pConn)920*b1cdbd2cSJim Jagielski void OQueryTableView::DropConnection(OQueryTableConnection* pConn)
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
923*b1cdbd2cSJim Jagielski 	// Selektion beachten
924*b1cdbd2cSJim Jagielski 	// bei mir und dem Dokument rausnehmen
925*b1cdbd2cSJim Jagielski 	RemoveConnection( pConn ,sal_False);
926*b1cdbd2cSJim Jagielski }
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
HideTabWin(OQueryTableWindow * pTabWin,OQueryTabWinUndoAct * pUndoAction)929*b1cdbd2cSJim Jagielski void OQueryTableView::HideTabWin( OQueryTableWindow* pTabWin, OQueryTabWinUndoAct* pUndoAction )
930*b1cdbd2cSJim Jagielski {
931*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
932*b1cdbd2cSJim Jagielski 	OTableWindowMap* pTabWins = GetTabWinMap();
933*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pTabWins != NULL, "OQueryTableView::HideTabWin : habe keine TabWins !");
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski 	if (pTabWin)
936*b1cdbd2cSJim Jagielski 	{
937*b1cdbd2cSJim Jagielski 		// Fenster
938*b1cdbd2cSJim Jagielski 		// die Position in seinen Daten speichern
939*b1cdbd2cSJim Jagielski 		getDesignView()->SaveTabWinUIConfig(pTabWin);
940*b1cdbd2cSJim Jagielski 			// (ich muss ueber das Parent gehen, da nur das die Position der Scrollbars kennt)
941*b1cdbd2cSJim Jagielski 		// dann aus der Liste der TabWins raus und verstecken
942*b1cdbd2cSJim Jagielski         OTableWindowMap::iterator aIter = pTabWins->begin();
943*b1cdbd2cSJim Jagielski         OTableWindowMap::iterator aEnd  = pTabWins->end();
944*b1cdbd2cSJim Jagielski         for ( ;aIter != aEnd ; ++aIter )
945*b1cdbd2cSJim Jagielski             if ( aIter->second == pTabWin )
946*b1cdbd2cSJim Jagielski             {
947*b1cdbd2cSJim Jagielski                 pTabWins->erase( aIter );
948*b1cdbd2cSJim Jagielski                 break;
949*b1cdbd2cSJim Jagielski             }
950*b1cdbd2cSJim Jagielski 
951*b1cdbd2cSJim Jagielski 		pTabWin->Hide();	// nicht zerstoeren, steht im Undo!!
952*b1cdbd2cSJim Jagielski 
953*b1cdbd2cSJim Jagielski 		// die Daten zum TabWin muessen auch aus meiner Verantwortung entlassen werden
954*b1cdbd2cSJim Jagielski 		TTableWindowData* pTabWinDataList = m_pView->getController().getTableWindowData();
955*b1cdbd2cSJim Jagielski 		pTabWinDataList->erase( ::std::remove(pTabWinDataList->begin(),pTabWinDataList->end(),pTabWin->GetData()),pTabWinDataList->end());
956*b1cdbd2cSJim Jagielski 			// NICHT loeschen, da ja das TabWin selber - das noch lebt - sie auch noch braucht
957*b1cdbd2cSJim Jagielski 			// Entweder geht es irgendwann wieder in meine Verantwortung ueber, (ueber ShowTabWin), dann fuege ich
958*b1cdbd2cSJim Jagielski 			// auch die Daten wieder ein, oder die Undo-Action, die im Augenblick die alleinige Verantwortung fuer das Fenster
959*b1cdbd2cSJim Jagielski 			// und dessen Daten hat, wird zestoert, dann loescht es beides
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski 		if (m_pLastFocusTabWin == pTabWin)
962*b1cdbd2cSJim Jagielski 			m_pLastFocusTabWin = NULL;
963*b1cdbd2cSJim Jagielski 
964*b1cdbd2cSJim Jagielski 		// Verbindungen, die zum Fenster gehoeren, einsammeln und der UndoAction uebergeben
965*b1cdbd2cSJim Jagielski 		sal_Int16 nCnt = 0;
966*b1cdbd2cSJim Jagielski 		const ::std::vector<OTableConnection*>* pTabConList = getTableConnections();
967*b1cdbd2cSJim Jagielski 		::std::vector<OTableConnection*>::const_iterator aIter2 = pTabConList->begin();
968*b1cdbd2cSJim Jagielski 		for(;aIter2 != pTabConList->end();)// the end may change
969*b1cdbd2cSJim Jagielski 		{
970*b1cdbd2cSJim Jagielski 			OQueryTableConnection* pTmpEntry = static_cast<OQueryTableConnection*>(*aIter2);
971*b1cdbd2cSJim Jagielski 			OSL_ENSURE(pTmpEntry,"OQueryTableConnection is null!");
972*b1cdbd2cSJim Jagielski 			if( pTmpEntry->GetAliasName(JTCS_FROM) == pTabWin->GetAliasName() ||
973*b1cdbd2cSJim Jagielski 				pTmpEntry->GetAliasName(JTCS_TO) == pTabWin->GetAliasName() )
974*b1cdbd2cSJim Jagielski 			{
975*b1cdbd2cSJim Jagielski 				// add to undo list
976*b1cdbd2cSJim Jagielski 				pUndoAction->InsertConnection(pTmpEntry);
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski 				// call base class because we append an undo action
979*b1cdbd2cSJim Jagielski 				// but this time we are in a undo action list
980*b1cdbd2cSJim Jagielski 				OJoinTableView::RemoveConnection(pTmpEntry,sal_False);
981*b1cdbd2cSJim Jagielski                 aIter2 = pTabConList->begin();
982*b1cdbd2cSJim Jagielski 				++nCnt;
983*b1cdbd2cSJim Jagielski 			}
984*b1cdbd2cSJim Jagielski 			else
985*b1cdbd2cSJim Jagielski 				++aIter2;
986*b1cdbd2cSJim Jagielski 		}
987*b1cdbd2cSJim Jagielski 
988*b1cdbd2cSJim Jagielski 		if (nCnt)
989*b1cdbd2cSJim Jagielski 			InvalidateConnections();
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski 		m_pView->getController().InvalidateFeature(ID_BROWSER_ADDTABLE);
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski 		// der UndoAction sagen, dass das Fenster (inklusive der Connections) jetzt in seinem Besitzt ist
994*b1cdbd2cSJim Jagielski 		pUndoAction->SetOwnership(sal_True);
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski 		// damit habe ich das Doc natuerlich modifiziert
997*b1cdbd2cSJim Jagielski 		m_pView->getController().setModified( sal_True );
998*b1cdbd2cSJim Jagielski 		m_pView->getController().InvalidateFeature(SID_BROWSER_CLEAR_QUERY);
999*b1cdbd2cSJim Jagielski 	}
1000*b1cdbd2cSJim Jagielski }
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
ShowTabWin(OQueryTableWindow * pTabWin,OQueryTabWinUndoAct * pUndoAction,sal_Bool _bAppend)1003*b1cdbd2cSJim Jagielski sal_Bool OQueryTableView::ShowTabWin( OQueryTableWindow* pTabWin, OQueryTabWinUndoAct* pUndoAction,sal_Bool _bAppend )
1004*b1cdbd2cSJim Jagielski {
1005*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
1008*b1cdbd2cSJim Jagielski 
1009*b1cdbd2cSJim Jagielski 	if (pTabWin)
1010*b1cdbd2cSJim Jagielski 	{
1011*b1cdbd2cSJim Jagielski 		if (pTabWin->Init())
1012*b1cdbd2cSJim Jagielski 		{
1013*b1cdbd2cSJim Jagielski 			TTableWindowData::value_type pData = pTabWin->GetData();
1014*b1cdbd2cSJim Jagielski 			DBG_ASSERT( bool(pData), "OQueryTableView::ShowTabWin : TabWin hat keine Daten !");
1015*b1cdbd2cSJim Jagielski 			// Wenn die Daten schon PosSize haben, diese benutzen
1016*b1cdbd2cSJim Jagielski 			if (pData->HasPosition() && pData->HasSize())
1017*b1cdbd2cSJim Jagielski 			{
1018*b1cdbd2cSJim Jagielski 				Size aSize(CalcZoom(pData->GetSize().Width()),CalcZoom(pData->GetSize().Height()));
1019*b1cdbd2cSJim Jagielski 				pTabWin->SetPosSizePixel(pData->GetPosition(), aSize);
1020*b1cdbd2cSJim Jagielski 			}
1021*b1cdbd2cSJim Jagielski 			else
1022*b1cdbd2cSJim Jagielski 				// ansonsten selber eine Default-Position ermitteln
1023*b1cdbd2cSJim Jagielski 				SetDefaultTabWinPosSize(pTabWin);
1024*b1cdbd2cSJim Jagielski 
1025*b1cdbd2cSJim Jagielski 			// Fenster zeigen und in Liste eintragen
1026*b1cdbd2cSJim Jagielski 			::rtl::OUString sName = static_cast< OQueryTableWindowData*>(pData.get())->GetAliasName();
1027*b1cdbd2cSJim Jagielski 			OSL_ENSURE(GetTabWinMap()->find(sName) == GetTabWinMap()->end(),"Alias name already in list!");
1028*b1cdbd2cSJim Jagielski 			GetTabWinMap()->insert(OTableWindowMap::value_type(sName,pTabWin));
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski 			pTabWin->Show();
1031*b1cdbd2cSJim Jagielski 
1032*b1cdbd2cSJim Jagielski 			pTabWin->Update();
1033*b1cdbd2cSJim Jagielski 				// Das Update ist notwendig, damit die Connections an dem Fenster richtig gezeichnet werden. Klingt absurd,
1034*b1cdbd2cSJim Jagielski 				// ich weiss. Aber die Listbox haelt sich intern ein Member, was bei ersten Zeichnen (nachdem die Listbox im Init
1035*b1cdbd2cSJim Jagielski 				// gerade neu gefuellt wurde) initialisiert wird, und genau dieses Member wird irgendwann benoetigt fuer
1036*b1cdbd2cSJim Jagielski 				// GetEntryPos, und dieses wiederum von der Connection, wenn sie ihren Ansatzpunkt am Fenster feststellen will.
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski 			// die Connections
1039*b1cdbd2cSJim Jagielski 			::std::vector<OTableConnection*>* pTableCon = pUndoAction->GetTabConnList();
1040*b1cdbd2cSJim Jagielski 			::std::vector<OTableConnection*>::iterator aIter = pTableCon->begin();
1041*b1cdbd2cSJim Jagielski             ::std::vector<OTableConnection*>::iterator aEnd = pTableCon->end();
1042*b1cdbd2cSJim Jagielski 
1043*b1cdbd2cSJim Jagielski 			for(;aIter != aEnd;++aIter)
1044*b1cdbd2cSJim Jagielski 				addConnection(*aIter); // add all connections from the undo action
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski 			// each connection should invalidated inside addConnection so we don't need this here any longer
1047*b1cdbd2cSJim Jagielski //			if ( !pOwnList->empty() )
1048*b1cdbd2cSJim Jagielski //				InvalidateConnections();
1049*b1cdbd2cSJim Jagielski 			pTableCon->clear();
1050*b1cdbd2cSJim Jagielski 
1051*b1cdbd2cSJim Jagielski 			// und die Daten des Fensters ebenfalls in Liste (des Docs)
1052*b1cdbd2cSJim Jagielski 			if(_bAppend)
1053*b1cdbd2cSJim Jagielski 				m_pView->getController().getTableWindowData()->push_back(pTabWin->GetData());
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski 			m_pView->getController().InvalidateFeature(ID_BROWSER_ADDTABLE);
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski 			// und der UndoAction sagen, dass das Fenster jetzt meine ist ...
1058*b1cdbd2cSJim Jagielski 			pUndoAction->SetOwnership(sal_False);
1059*b1cdbd2cSJim Jagielski 
1060*b1cdbd2cSJim Jagielski 			bSuccess = sal_True;
1061*b1cdbd2cSJim Jagielski 		}
1062*b1cdbd2cSJim Jagielski 		else
1063*b1cdbd2cSJim Jagielski 		{
1064*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////
1065*b1cdbd2cSJim Jagielski 			// Initialisierung fehlgeschlagen
1066*b1cdbd2cSJim Jagielski 			// (z.B. wenn Verbindung zur Datenbank in diesem Augenblick unterbrochen worden ist)
1067*b1cdbd2cSJim Jagielski 			pTabWin->clearListBox();
1068*b1cdbd2cSJim Jagielski 			delete pTabWin;
1069*b1cdbd2cSJim Jagielski 		}
1070*b1cdbd2cSJim Jagielski 	}
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski 	// damit habe ich das Doc natuerlich modifiziert
1073*b1cdbd2cSJim Jagielski 	if(!m_pView->getController().isReadOnly())
1074*b1cdbd2cSJim Jagielski 		m_pView->getController().setModified( sal_True );
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski 	m_pView->getController().InvalidateFeature(SID_BROWSER_CLEAR_QUERY);
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski 	return bSuccess;
1079*b1cdbd2cSJim Jagielski }
1080*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
InsertField(const OTableFieldDescRef & rInfo)1081*b1cdbd2cSJim Jagielski void OQueryTableView::InsertField(const OTableFieldDescRef& rInfo)
1082*b1cdbd2cSJim Jagielski {
1083*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
1084*b1cdbd2cSJim Jagielski 	DBG_ASSERT(getDesignView() != NULL, "OQueryTableView::InsertField : habe kein Parent !");
1085*b1cdbd2cSJim Jagielski 	static_cast<OQueryDesignView*>(getDesignView())->InsertField(rInfo);
1086*b1cdbd2cSJim Jagielski }
1087*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ExistsAVisitedConn(const OQueryTableWindow * pFrom) const1088*b1cdbd2cSJim Jagielski sal_Bool OQueryTableView::ExistsAVisitedConn(const OQueryTableWindow* pFrom) const
1089*b1cdbd2cSJim Jagielski {
1090*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OQueryTableView,NULL);
1091*b1cdbd2cSJim Jagielski 	const ::std::vector<OTableConnection*>* pList = getTableConnections();
1092*b1cdbd2cSJim Jagielski 	if (pList)
1093*b1cdbd2cSJim Jagielski 	{
1094*b1cdbd2cSJim Jagielski 		::std::vector<OTableConnection*>::const_iterator aIter = pList->begin();
1095*b1cdbd2cSJim Jagielski         ::std::vector<OTableConnection*>::const_iterator aEnd = pList->end();
1096*b1cdbd2cSJim Jagielski 		for(;aIter != aEnd;++aIter)
1097*b1cdbd2cSJim Jagielski 		{
1098*b1cdbd2cSJim Jagielski 			OQueryTableConnection* pTemp = static_cast<OQueryTableConnection*>(*aIter);
1099*b1cdbd2cSJim Jagielski 			if (pTemp->IsVisited() &&
1100*b1cdbd2cSJim Jagielski 				(pFrom == static_cast< OQueryTableWindow*>(pTemp->GetSourceWin()) || pFrom == static_cast< OQueryTableWindow*>(pTemp->GetDestWin())))
1101*b1cdbd2cSJim Jagielski 				return pTemp != NULL;
1102*b1cdbd2cSJim Jagielski 		}
1103*b1cdbd2cSJim Jagielski 	}
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 	return sal_False;
1106*b1cdbd2cSJim Jagielski }
1107*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onNoColumns_throw()1108*b1cdbd2cSJim Jagielski void OQueryTableView::onNoColumns_throw()
1109*b1cdbd2cSJim Jagielski {
1110*b1cdbd2cSJim Jagielski     String sError( ModuleRes( STR_STATEMENT_WITHOUT_RESULT_SET ) );
1111*b1cdbd2cSJim Jagielski     ::dbtools::throwSQLException( sError, ::dbtools::SQL_GENERAL_ERROR, NULL );
1112*b1cdbd2cSJim Jagielski }
1113*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
supressCrossNaturalJoin(const TTableConnectionData::value_type & _pData) const1114*b1cdbd2cSJim Jagielski bool OQueryTableView::supressCrossNaturalJoin(const TTableConnectionData::value_type& _pData) const
1115*b1cdbd2cSJim Jagielski {
1116*b1cdbd2cSJim Jagielski     OQueryTableConnectionData* pQueryData = static_cast<OQueryTableConnectionData*>(_pData.get());
1117*b1cdbd2cSJim Jagielski     return pQueryData && (pQueryData->GetJoinType() == CROSS_JOIN);
1118*b1cdbd2cSJim Jagielski }
1119*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1120