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