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 #ifndef DBAUI_QUERYTABLEVIEW_HXX
27*b1cdbd2cSJim Jagielski #include "JoinTableView.hxx"
28*b1cdbd2cSJim Jagielski #endif
29*b1cdbd2cSJim Jagielski #ifndef _TOOLS_DEBUG_HXX
30*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
31*b1cdbd2cSJim Jagielski #endif
32*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYCONTROLLER_HXX
33*b1cdbd2cSJim Jagielski #include "querycontroller.hxx"
34*b1cdbd2cSJim Jagielski #endif
35*b1cdbd2cSJim Jagielski #ifndef DBAUI_JOINDESIGNVIEW_HXX
36*b1cdbd2cSJim Jagielski #include "JoinDesignView.hxx"
37*b1cdbd2cSJim Jagielski #endif
38*b1cdbd2cSJim Jagielski #ifndef _DBU_QRY_HRC_
39*b1cdbd2cSJim Jagielski #include "dbu_qry.hrc"
40*b1cdbd2cSJim Jagielski #endif
41*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEWINDOW_HXX
42*b1cdbd2cSJim Jagielski #include "TableWindow.hxx"
43*b1cdbd2cSJim Jagielski #endif
44*b1cdbd2cSJim Jagielski //#ifndef DBAUI_QUERY_TABLEWINDOWDATA_HXX
45*b1cdbd2cSJim Jagielski //#include "QTableWindowData.hxx"
46*b1cdbd2cSJim Jagielski //#endif
47*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEWINDOWLISTBOX_HXX
48*b1cdbd2cSJim Jagielski #include "TableWindowListBox.hxx"
49*b1cdbd2cSJim Jagielski #endif
50*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLECONNECTION_HXX
51*b1cdbd2cSJim Jagielski #include "TableConnection.hxx"
52*b1cdbd2cSJim Jagielski #endif
53*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLECONNECTIONDATA_HXX
54*b1cdbd2cSJim Jagielski #include "TableConnectionData.hxx"
55*b1cdbd2cSJim Jagielski #endif
56*b1cdbd2cSJim Jagielski #ifndef DBAUI_CONNECTIONLINE_HXX
57*b1cdbd2cSJim Jagielski #include "ConnectionLine.hxx"
58*b1cdbd2cSJim Jagielski #endif
59*b1cdbd2cSJim Jagielski #ifndef DBAUI_CONNECTIONLINEDATA_HXX
60*b1cdbd2cSJim Jagielski #include "ConnectionLineData.hxx"
61*b1cdbd2cSJim Jagielski #endif
62*b1cdbd2cSJim Jagielski #ifndef DBACCESS_UI_BROWSER_ID_HXX
63*b1cdbd2cSJim Jagielski #include "browserids.hxx"
64*b1cdbd2cSJim Jagielski #endif
65*b1cdbd2cSJim Jagielski #ifndef _URLBMK_HXX
66*b1cdbd2cSJim Jagielski #include <svl/urlbmk.hxx>
67*b1cdbd2cSJim Jagielski #endif
68*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_
69*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski #ifndef DBAUI_OQUERYMOVETABWINUNDOACT_HXX
72*b1cdbd2cSJim Jagielski #include "QueryMoveTabWinUndoAct.hxx"
73*b1cdbd2cSJim Jagielski #endif
74*b1cdbd2cSJim Jagielski #ifndef DBAUI_QUERYSIZETABWINUNDOACT_HXX
75*b1cdbd2cSJim Jagielski #include "QuerySizeTabWinUndoAct.hxx"
76*b1cdbd2cSJim Jagielski #endif
77*b1cdbd2cSJim Jagielski #ifndef _SV_SVAPP_HXX
78*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
79*b1cdbd2cSJim Jagielski #endif
80*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEWINDOWDATA_HXX
81*b1cdbd2cSJim Jagielski #include "TableWindowData.hxx"
82*b1cdbd2cSJim Jagielski #endif
83*b1cdbd2cSJim Jagielski #ifndef DBACCESS_JACCESS_HXX
84*b1cdbd2cSJim Jagielski #include "JAccess.hxx"
85*b1cdbd2cSJim Jagielski #endif
86*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLE_HPP_
87*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/XAccessible.hpp>
88*b1cdbd2cSJim Jagielski #endif
89*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
90*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRole.hpp>
91*b1cdbd2cSJim Jagielski #endif
92*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
93*b1cdbd2cSJim Jagielski #ifndef DBAUI_TOOLS_HXX
94*b1cdbd2cSJim Jagielski #include "UITools.hxx"
95*b1cdbd2cSJim Jagielski #endif
96*b1cdbd2cSJim Jagielski #include <cppuhelper/exc_hlp.hxx>
97*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
98*b1cdbd2cSJim Jagielski #include <boost/bind.hpp>
99*b1cdbd2cSJim Jagielski #include <algorithm>
100*b1cdbd2cSJim Jagielski #include <functional>
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski using namespace dbaui;
103*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
104*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
105*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::accessibility;
106*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
107*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski #define LINE_SIZE			50
110*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////
111*b1cdbd2cSJim Jagielski // Konstanten fuer das Fensterlayout
112*b1cdbd2cSJim Jagielski #define TABWIN_SPACING_X	17
113*b1cdbd2cSJim Jagielski #define TABWIN_SPACING_Y	17
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski #define TABWIN_WIDTH_STD	120
116*b1cdbd2cSJim Jagielski #define TABWIN_HEIGHT_STD	120
117*b1cdbd2cSJim Jagielski 
DBG_NAME(OScrollWindowHelper)118*b1cdbd2cSJim Jagielski DBG_NAME(OScrollWindowHelper)
119*b1cdbd2cSJim Jagielski OScrollWindowHelper::OScrollWindowHelper( Window* pParent) : Window( pParent)
120*b1cdbd2cSJim Jagielski 	,m_aHScrollBar( this, WB_HSCROLL|WB_REPEAT|WB_DRAG )
121*b1cdbd2cSJim Jagielski 	,m_aVScrollBar( this, WB_VSCROLL|WB_REPEAT|WB_DRAG )
122*b1cdbd2cSJim Jagielski 	,m_pCornerWindow(new ScrollBarBox(this, WB_3DLOOK))
123*b1cdbd2cSJim Jagielski 	,m_pTableView(NULL)
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski 	DBG_CTOR(OScrollWindowHelper,NULL);
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
128*b1cdbd2cSJim Jagielski 	// ScrollBars
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	GetHScrollBar()->SetRange( Range(0, 1000) );
131*b1cdbd2cSJim Jagielski 	GetVScrollBar()->SetRange( Range(0, 1000) );
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	GetHScrollBar()->SetLineSize( LINE_SIZE );
134*b1cdbd2cSJim Jagielski 	GetVScrollBar()->SetLineSize( LINE_SIZE );
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 	GetHScrollBar()->Show();
137*b1cdbd2cSJim Jagielski 	GetVScrollBar()->Show();
138*b1cdbd2cSJim Jagielski 	m_pCornerWindow->Show();
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 	// normally we should be SCROLL_PANE
141*b1cdbd2cSJim Jagielski 	SetAccessibleRole(AccessibleRole::SCROLL_PANE);
142*b1cdbd2cSJim Jagielski }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
~OScrollWindowHelper()145*b1cdbd2cSJim Jagielski OScrollWindowHelper::~OScrollWindowHelper()
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski 	DBG_DTOR(OScrollWindowHelper,NULL);
148*b1cdbd2cSJim Jagielski 	::std::auto_ptr<Window> aTemp(m_pCornerWindow);
149*b1cdbd2cSJim Jagielski 	m_pCornerWindow = NULL;
150*b1cdbd2cSJim Jagielski 	m_pTableView = NULL;
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
setTableView(OJoinTableView * _pTableView)154*b1cdbd2cSJim Jagielski void OScrollWindowHelper::setTableView(OJoinTableView* _pTableView)
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski 	m_pTableView = _pTableView;
157*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
158*b1cdbd2cSJim Jagielski 	// ScrollBars
159*b1cdbd2cSJim Jagielski 	GetHScrollBar()->SetScrollHdl( LINK(m_pTableView, OJoinTableView, ScrollHdl) );
160*b1cdbd2cSJim Jagielski 	GetVScrollBar()->SetScrollHdl( LINK(m_pTableView, OJoinTableView, ScrollHdl) );
161*b1cdbd2cSJim Jagielski }
162*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
resetRange(const Point & _aSize)163*b1cdbd2cSJim Jagielski void OScrollWindowHelper::resetRange(const Point& _aSize)
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski     Point aPos = PixelToLogic(_aSize);
166*b1cdbd2cSJim Jagielski     GetHScrollBar()->SetRange( Range(0, aPos.X() + TABWIN_SPACING_X) );
167*b1cdbd2cSJim Jagielski 	GetVScrollBar()->SetRange( Range(0, aPos.Y() + TABWIN_SPACING_Y) );
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Resize()170*b1cdbd2cSJim Jagielski void OScrollWindowHelper::Resize()
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski 	Window::Resize();
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	Size aTotalOutputSize = GetOutputSizePixel();
175*b1cdbd2cSJim Jagielski 	long nHScrollHeight = GetHScrollBar()->GetSizePixel().Height();
176*b1cdbd2cSJim Jagielski 	long nVScrollWidth = GetVScrollBar()->GetSizePixel().Width();
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 	GetHScrollBar()->SetPosSizePixel(
179*b1cdbd2cSJim Jagielski 		Point( 0, aTotalOutputSize.Height()-nHScrollHeight ),
180*b1cdbd2cSJim Jagielski 		Size( aTotalOutputSize.Width()-nVScrollWidth, nHScrollHeight )
181*b1cdbd2cSJim Jagielski 		);
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 	GetVScrollBar()->SetPosSizePixel(
184*b1cdbd2cSJim Jagielski 		Point( aTotalOutputSize.Width()-nVScrollWidth, 0 ),
185*b1cdbd2cSJim Jagielski 		Size( nVScrollWidth, aTotalOutputSize.Height()-nHScrollHeight )
186*b1cdbd2cSJim Jagielski 		);
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 	m_pCornerWindow->SetPosSizePixel(
189*b1cdbd2cSJim Jagielski 		Point( aTotalOutputSize.Width() - nVScrollWidth, aTotalOutputSize.Height() - nHScrollHeight),
190*b1cdbd2cSJim Jagielski 		Size( nVScrollWidth, nHScrollHeight )
191*b1cdbd2cSJim Jagielski 		);
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 	GetHScrollBar()->SetPageSize( aTotalOutputSize.Width() );
194*b1cdbd2cSJim Jagielski 	GetHScrollBar()->SetVisibleSize( aTotalOutputSize.Width() );
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	GetVScrollBar()->SetPageSize( aTotalOutputSize.Height() );
197*b1cdbd2cSJim Jagielski 	GetVScrollBar()->SetVisibleSize( aTotalOutputSize.Height() );
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 	// adjust the ranges of the scrollbars if neccessary
200*b1cdbd2cSJim Jagielski 	long lRange = GetHScrollBar()->GetRange().Max() - GetHScrollBar()->GetRange().Min();
201*b1cdbd2cSJim Jagielski 	if (m_pTableView->GetScrollOffset().X() + aTotalOutputSize.Width() > lRange)
202*b1cdbd2cSJim Jagielski 		GetHScrollBar()->SetRangeMax(m_pTableView->GetScrollOffset().X() + aTotalOutputSize.Width() + GetHScrollBar()->GetRange().Min());
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 	lRange = GetVScrollBar()->GetRange().Max() - GetVScrollBar()->GetRange().Min();
205*b1cdbd2cSJim Jagielski 	if (m_pTableView->GetScrollOffset().Y() + aTotalOutputSize.Height() > lRange)
206*b1cdbd2cSJim Jagielski 		GetVScrollBar()->SetRangeMax(m_pTableView->GetScrollOffset().Y() + aTotalOutputSize.Height() + GetVScrollBar()->GetRange().Min());
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 	m_pTableView->SetPosSizePixel(Point( 0, 0 ),Size( aTotalOutputSize.Width()-nVScrollWidth, aTotalOutputSize.Height()-nHScrollHeight ));
209*b1cdbd2cSJim Jagielski }
210*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
211*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
212*b1cdbd2cSJim Jagielski //==================================================================
213*b1cdbd2cSJim Jagielski // class OJoinTableView
214*b1cdbd2cSJim Jagielski //==================================================================
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski //const long WINDOW_WIDTH = 1000;
217*b1cdbd2cSJim Jagielski //const long WINDOW_HEIGHT = 1000;
218*b1cdbd2cSJim Jagielski DBG_NAME(OJoinTableView);
219*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
OJoinTableView(Window * pParent,OJoinDesignView * pView)220*b1cdbd2cSJim Jagielski OJoinTableView::OJoinTableView( Window* pParent, OJoinDesignView* pView )
221*b1cdbd2cSJim Jagielski     :Window( pParent,WB_BORDER )
222*b1cdbd2cSJim Jagielski 	,DropTargetHelper(this)
223*b1cdbd2cSJim Jagielski     ,m_aDragOffset( Point(0,0) )
224*b1cdbd2cSJim Jagielski     ,m_aScrollOffset( Point(0,0) )
225*b1cdbd2cSJim Jagielski     ,m_pDragWin( NULL )
226*b1cdbd2cSJim Jagielski 	,m_pSizingWin( NULL )
227*b1cdbd2cSJim Jagielski 	,m_pSelectedConn( NULL )
228*b1cdbd2cSJim Jagielski 	,m_bTrackingInitiallyMoved(sal_False)
229*b1cdbd2cSJim Jagielski     ,m_pLastFocusTabWin(NULL)
230*b1cdbd2cSJim Jagielski 	,m_pView( pView )
231*b1cdbd2cSJim Jagielski 	,m_pAccessible(NULL)
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski 	DBG_CTOR(OJoinTableView,NULL);
234*b1cdbd2cSJim Jagielski 	SetSizePixel( Size(1000, 1000) );
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 	InitColors();
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 	m_aDragScrollTimer.SetTimeoutHdl(LINK(this, OJoinTableView, OnDragScrollTimer));
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
~OJoinTableView()242*b1cdbd2cSJim Jagielski OJoinTableView::~OJoinTableView()
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski     DBG_DTOR(OJoinTableView,NULL);
245*b1cdbd2cSJim Jagielski     if( m_pAccessible )
246*b1cdbd2cSJim Jagielski     {
247*b1cdbd2cSJim Jagielski         m_pAccessible->clearTableView();
248*b1cdbd2cSJim Jagielski         m_pAccessible = NULL;
249*b1cdbd2cSJim Jagielski     }
250*b1cdbd2cSJim Jagielski     //////////////////////////////////////////////////////////////////////
251*b1cdbd2cSJim Jagielski     // Listen loeschen
252*b1cdbd2cSJim Jagielski     clearLayoutInformation();
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IMPL_LINK(OJoinTableView,ScrollHdl,ScrollBar *,pScrollBar)255*b1cdbd2cSJim Jagielski IMPL_LINK( OJoinTableView, ScrollHdl, ScrollBar*, pScrollBar )
256*b1cdbd2cSJim Jagielski {
257*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
258*b1cdbd2cSJim Jagielski 	// Alle Fenster verschieben
259*b1cdbd2cSJim Jagielski 	ScrollPane( pScrollBar->GetDelta(), (pScrollBar == GetHScrollBar()), sal_False );
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 	return 0;
262*b1cdbd2cSJim Jagielski }
263*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Resize()264*b1cdbd2cSJim Jagielski void OJoinTableView::Resize()
265*b1cdbd2cSJim Jagielski {
266*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
267*b1cdbd2cSJim Jagielski 	Window::Resize();
268*b1cdbd2cSJim Jagielski 	m_aOutputSize = GetSizePixel();
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 	// tab win positions may not be up-to-date
271*b1cdbd2cSJim Jagielski 	if (m_aTableMap.empty())
272*b1cdbd2cSJim Jagielski 		// no tab wins ...
273*b1cdbd2cSJim Jagielski 		return;
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski 	// we have at least one table so resize it
276*b1cdbd2cSJim Jagielski 	m_aScrollOffset.X() = GetHScrollBar()->GetThumbPos();
277*b1cdbd2cSJim Jagielski 	m_aScrollOffset.Y() = GetVScrollBar()->GetThumbPos();
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 	OTableWindow* pCheck = m_aTableMap.begin()->second;
280*b1cdbd2cSJim Jagielski 	Point aRealPos = pCheck->GetPosPixel();
281*b1cdbd2cSJim Jagielski 	Point aAssumedPos = pCheck->GetData()->GetPosition() - GetScrollOffset();
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	if (aRealPos == aAssumedPos)
284*b1cdbd2cSJim Jagielski 		// all ok
285*b1cdbd2cSJim Jagielski 		return;
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 	OTableWindowMapIterator aIter = m_aTableMap.begin();
288*b1cdbd2cSJim Jagielski     OTableWindowMapIterator aEnd = m_aTableMap.end();
289*b1cdbd2cSJim Jagielski 	for(;aIter != aEnd;++aIter)
290*b1cdbd2cSJim Jagielski 	{
291*b1cdbd2cSJim Jagielski 		OTableWindow* pCurrent = aIter->second;
292*b1cdbd2cSJim Jagielski 		Point aPos(pCurrent->GetData()->GetPosition() - GetScrollOffset());
293*b1cdbd2cSJim Jagielski 		pCurrent->SetPosPixel(aPos);
294*b1cdbd2cSJim Jagielski 	}
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetTabWinCount()297*b1cdbd2cSJim Jagielski sal_uLong OJoinTableView::GetTabWinCount()
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
300*b1cdbd2cSJim Jagielski 	return m_aTableMap.size();
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
RemoveConnection(OTableConnection * _pConn,sal_Bool _bDelete)304*b1cdbd2cSJim Jagielski bool OJoinTableView::RemoveConnection( OTableConnection* _pConn,sal_Bool _bDelete )
305*b1cdbd2cSJim Jagielski {
306*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
307*b1cdbd2cSJim Jagielski 	DeselectConn(_pConn);
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 	// to force a redraw
310*b1cdbd2cSJim Jagielski 	_pConn->InvalidateConnection();
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 	m_pView->getController().removeConnectionData( _pConn->GetData() );
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 	m_vTableConnection.erase(
315*b1cdbd2cSJim Jagielski 						::std::find(m_vTableConnection.begin(),m_vTableConnection.end(),_pConn) );
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski 	modified();
318*b1cdbd2cSJim Jagielski 	if ( m_pAccessible )
319*b1cdbd2cSJim Jagielski 		m_pAccessible->notifyAccessibleEvent(	AccessibleEventId::CHILD,
320*b1cdbd2cSJim Jagielski 												makeAny(_pConn->GetAccessible()),
321*b1cdbd2cSJim Jagielski 												Any());
322*b1cdbd2cSJim Jagielski 	if ( _bDelete )
323*b1cdbd2cSJim Jagielski 	{
324*b1cdbd2cSJim Jagielski 		delete _pConn;
325*b1cdbd2cSJim Jagielski 	}
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 	return true;
328*b1cdbd2cSJim Jagielski }
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
GetTabWindow(const String & rName)331*b1cdbd2cSJim Jagielski OTableWindow* OJoinTableView::GetTabWindow( const String& rName )
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
334*b1cdbd2cSJim Jagielski 	OTableWindowMapIterator aIter = m_aTableMap.find(rName);
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 	return aIter == m_aTableMap.end() ? NULL : aIter->second;
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
createTableWindowData(const::rtl::OUString & _rComposedName,const::rtl::OUString & _sTableName,const::rtl::OUString & _rWinName)339*b1cdbd2cSJim Jagielski TTableWindowData::value_type OJoinTableView::createTableWindowData(const ::rtl::OUString& _rComposedName
340*b1cdbd2cSJim Jagielski                                                                   ,const ::rtl::OUString& _sTableName
341*b1cdbd2cSJim Jagielski 											                      ,const ::rtl::OUString& _rWinName)
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski     TTableWindowData::value_type pData( CreateImpl(_rComposedName, _sTableName,_rWinName) );
344*b1cdbd2cSJim Jagielski     OJoinDesignView* pParent = getDesignView();
345*b1cdbd2cSJim Jagielski     try
346*b1cdbd2cSJim Jagielski     {
347*b1cdbd2cSJim Jagielski         if ( !pData->init(pParent->getController().getConnection(),allowQueries()) )
348*b1cdbd2cSJim Jagielski         {
349*b1cdbd2cSJim Jagielski             if ( pData->isValid() )
350*b1cdbd2cSJim Jagielski                 onNoColumns_throw();
351*b1cdbd2cSJim Jagielski             else
352*b1cdbd2cSJim Jagielski                 pData.reset();
353*b1cdbd2cSJim Jagielski         }
354*b1cdbd2cSJim Jagielski     }
355*b1cdbd2cSJim Jagielski 	catch ( const SQLException& )
356*b1cdbd2cSJim Jagielski 	{
357*b1cdbd2cSJim Jagielski         ::dbaui::showError( ::dbtools::SQLExceptionInfo( ::cppu::getCaughtException() ),
358*b1cdbd2cSJim Jagielski             pParent, pParent->getController().getORB() );
359*b1cdbd2cSJim Jagielski 	}
360*b1cdbd2cSJim Jagielski 	catch( const WrappedTargetException& e )
361*b1cdbd2cSJim Jagielski 	{
362*b1cdbd2cSJim Jagielski 		SQLException aSql;
363*b1cdbd2cSJim Jagielski 		if ( e.TargetException >>= aSql )
364*b1cdbd2cSJim Jagielski 			::dbaui::showError( ::dbtools::SQLExceptionInfo( aSql ), pParent, pParent->getController().getORB() );
365*b1cdbd2cSJim Jagielski 	}
366*b1cdbd2cSJim Jagielski     catch( const Exception& )
367*b1cdbd2cSJim Jagielski     {
368*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
369*b1cdbd2cSJim Jagielski     }
370*b1cdbd2cSJim Jagielski     return pData;
371*b1cdbd2cSJim Jagielski }
372*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
CreateImpl(const::rtl::OUString & _rComposedName,const::rtl::OUString & _sTableName,const::rtl::OUString & _rWinName)373*b1cdbd2cSJim Jagielski OTableWindowData* OJoinTableView::CreateImpl(const ::rtl::OUString& _rComposedName
374*b1cdbd2cSJim Jagielski                                              ,const ::rtl::OUString& _sTableName
375*b1cdbd2cSJim Jagielski 											 ,const ::rtl::OUString& _rWinName)
376*b1cdbd2cSJim Jagielski {
377*b1cdbd2cSJim Jagielski 	return new OTableWindowData( NULL,_rComposedName,_sTableName, _rWinName );
378*b1cdbd2cSJim Jagielski }
379*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
AddTabWin(const::rtl::OUString & _rComposedName,const::rtl::OUString & rWinName,sal_Bool)380*b1cdbd2cSJim Jagielski void OJoinTableView::AddTabWin(const ::rtl::OUString& _rComposedName, const ::rtl::OUString& rWinName, sal_Bool /*bNewTable*/)
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
383*b1cdbd2cSJim Jagielski 	OSL_ENSURE(_rComposedName.getLength(),"There must be a table name supplied!");
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 	TTableWindowData::value_type pNewTabWinData(createTableWindowData( _rComposedName, rWinName,rWinName ));
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////
388*b1cdbd2cSJim Jagielski 	// Neues Fenster in Fensterliste eintragen
389*b1cdbd2cSJim Jagielski 	OTableWindow* pNewTabWin = createWindow( pNewTabWinData );
390*b1cdbd2cSJim Jagielski 	if ( pNewTabWin->Init() )
391*b1cdbd2cSJim Jagielski 	{
392*b1cdbd2cSJim Jagielski 		m_pView->getController().getTableWindowData()->push_back( pNewTabWinData);
393*b1cdbd2cSJim Jagielski 		// when we already have a table with this name insert the full qualified one instead
394*b1cdbd2cSJim Jagielski 		if(m_aTableMap.find(rWinName) != m_aTableMap.end())
395*b1cdbd2cSJim Jagielski 			m_aTableMap[_rComposedName] = pNewTabWin;
396*b1cdbd2cSJim Jagielski 		else
397*b1cdbd2cSJim Jagielski 			m_aTableMap[rWinName] = pNewTabWin;
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 		SetDefaultTabWinPosSize( pNewTabWin );
400*b1cdbd2cSJim Jagielski 		pNewTabWin->Show();
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 		modified();
403*b1cdbd2cSJim Jagielski 		if ( m_pAccessible )
404*b1cdbd2cSJim Jagielski 			m_pAccessible->notifyAccessibleEvent(	AccessibleEventId::CHILD,
405*b1cdbd2cSJim Jagielski 													Any(),
406*b1cdbd2cSJim Jagielski 													makeAny(pNewTabWin->GetAccessible()));
407*b1cdbd2cSJim Jagielski 	}
408*b1cdbd2cSJim Jagielski 	else
409*b1cdbd2cSJim Jagielski 	{
410*b1cdbd2cSJim Jagielski 		pNewTabWin->clearListBox();
411*b1cdbd2cSJim Jagielski 		delete pNewTabWin;
412*b1cdbd2cSJim Jagielski 	}
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
RemoveTabWin(OTableWindow * pTabWin)416*b1cdbd2cSJim Jagielski void OJoinTableView::RemoveTabWin( OTableWindow* pTabWin )
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
419*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
420*b1cdbd2cSJim Jagielski 	// first delete all connections of this window to others
421*b1cdbd2cSJim Jagielski     bool bRemove = true;
422*b1cdbd2cSJim Jagielski     TTableWindowData::value_type pData = pTabWin->GetData();
423*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = m_vTableConnection.size();
424*b1cdbd2cSJim Jagielski 	::std::vector<OTableConnection*>::reverse_iterator aIter = m_vTableConnection.rbegin();
425*b1cdbd2cSJim Jagielski 	while(aIter != m_vTableConnection.rend() && bRemove)
426*b1cdbd2cSJim Jagielski 	{
427*b1cdbd2cSJim Jagielski 		OTableConnection* pTabConn = (*aIter);
428*b1cdbd2cSJim Jagielski 		if(
429*b1cdbd2cSJim Jagielski 			( pData == pTabConn->GetData()->getReferencingTable())		||
430*b1cdbd2cSJim Jagielski 			( pData == pTabConn->GetData()->getReferencedTable())
431*b1cdbd2cSJim Jagielski         )
432*b1cdbd2cSJim Jagielski         {
433*b1cdbd2cSJim Jagielski 		  bRemove = RemoveConnection( pTabConn ,sal_True);
434*b1cdbd2cSJim Jagielski           aIter = m_vTableConnection.rbegin();
435*b1cdbd2cSJim Jagielski         }
436*b1cdbd2cSJim Jagielski         else
437*b1cdbd2cSJim Jagielski             ++aIter;
438*b1cdbd2cSJim Jagielski 	}
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
441*b1cdbd2cSJim Jagielski 	// then delete the window itself
442*b1cdbd2cSJim Jagielski     if ( bRemove )
443*b1cdbd2cSJim Jagielski     {
444*b1cdbd2cSJim Jagielski 	    if ( m_pAccessible )
445*b1cdbd2cSJim Jagielski 		    m_pAccessible->notifyAccessibleEvent(	AccessibleEventId::CHILD,
446*b1cdbd2cSJim Jagielski 												    makeAny(pTabWin->GetAccessible()),Any()
447*b1cdbd2cSJim Jagielski 												    );
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 	    pTabWin->Hide();
450*b1cdbd2cSJim Jagielski         OJoinController& rController = m_pView->getController();
451*b1cdbd2cSJim Jagielski 	    TTableWindowData::iterator aFind = ::std::find(rController.getTableWindowData()->begin(),rController.getTableWindowData()->end(),pData);
452*b1cdbd2cSJim Jagielski 	    if(aFind != rController.getTableWindowData()->end())
453*b1cdbd2cSJim Jagielski 	    {
454*b1cdbd2cSJim Jagielski 		    rController.getTableWindowData()->erase(aFind);
455*b1cdbd2cSJim Jagielski 		    rController.setModified(sal_True);
456*b1cdbd2cSJim Jagielski 	    }
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski         String aWinName = pTabWin->GetWinName();
459*b1cdbd2cSJim Jagielski 	    if(m_aTableMap.find(aWinName) != m_aTableMap.end())
460*b1cdbd2cSJim Jagielski 		    m_aTableMap.erase( aWinName );
461*b1cdbd2cSJim Jagielski 	    else
462*b1cdbd2cSJim Jagielski 		    m_aTableMap.erase( pTabWin->GetComposedName() );
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	    if (pTabWin == m_pLastFocusTabWin)
465*b1cdbd2cSJim Jagielski 		    m_pLastFocusTabWin = NULL;
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 	    pTabWin->clearListBox();
468*b1cdbd2cSJim Jagielski 	    delete pTabWin;
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski     }
471*b1cdbd2cSJim Jagielski 	if ( (sal_Int32)m_vTableConnection.size() < (nCount-1) ) // if some connections could be removed
472*b1cdbd2cSJim Jagielski 		modified();
473*b1cdbd2cSJim Jagielski }
474*b1cdbd2cSJim Jagielski namespace
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
isScrollAllowed(OJoinTableView * _pView,long nDelta,sal_Bool bHoriz)477*b1cdbd2cSJim Jagielski 	sal_Bool isScrollAllowed( OJoinTableView* _pView,long nDelta, sal_Bool bHoriz)
478*b1cdbd2cSJim Jagielski 	{
479*b1cdbd2cSJim Jagielski 		sal_Bool bRet = sal_True;
480*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
481*b1cdbd2cSJim Jagielski 		// adjust ScrollBar-Positions
482*b1cdbd2cSJim Jagielski 		ScrollBar* pBar = _pView->GetVScrollBar();
483*b1cdbd2cSJim Jagielski 		if( bHoriz )
484*b1cdbd2cSJim Jagielski 			pBar = _pView->GetHScrollBar();
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski 		long nOldThumbPos = pBar->GetThumbPos();
487*b1cdbd2cSJim Jagielski 		long nNewThumbPos = nOldThumbPos + nDelta;
488*b1cdbd2cSJim Jagielski 		if( nNewThumbPos < 0 )
489*b1cdbd2cSJim Jagielski 			nNewThumbPos = 0;//	bRet = sal_False;
490*b1cdbd2cSJim Jagielski 		else if( nNewThumbPos > pBar->GetRangeMax() )
491*b1cdbd2cSJim Jagielski 			nNewThumbPos = pBar->GetRangeMax();// bRet = sal_False;
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski 		if ( bHoriz )
494*b1cdbd2cSJim Jagielski 		{
495*b1cdbd2cSJim Jagielski 			if( nNewThumbPos == _pView->GetScrollOffset().X() )
496*b1cdbd2cSJim Jagielski 				return sal_False;
497*b1cdbd2cSJim Jagielski 		}
498*b1cdbd2cSJim Jagielski 		else if ( nNewThumbPos == _pView->GetScrollOffset().Y() )
499*b1cdbd2cSJim Jagielski 			return sal_False;
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski 		return bRet;
502*b1cdbd2cSJim Jagielski 	}
503*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------------
getMovementImpl(OJoinTableView * _pView,const Point & _rPoint,const Size & _rSize,long & _nScrollX,long & _nScrollY)504*b1cdbd2cSJim Jagielski 	sal_Bool getMovementImpl(OJoinTableView* _pView,const Point& _rPoint,const Size& _rSize,long& _nScrollX,long& _nScrollY)
505*b1cdbd2cSJim Jagielski 	{
506*b1cdbd2cSJim Jagielski 		_nScrollY = _nScrollX = 0;
507*b1cdbd2cSJim Jagielski 		// data about the tab win
508*b1cdbd2cSJim Jagielski 		Point aUpperLeft = _rPoint;
509*b1cdbd2cSJim Jagielski 		// normalize with respect to visibility
510*b1cdbd2cSJim Jagielski 		aUpperLeft -= _pView->GetScrollOffset();
511*b1cdbd2cSJim Jagielski 		//	aUpperLeft.Y() -= _pView->GetScrollOffset().Y();
512*b1cdbd2cSJim Jagielski 		Point aLowerRight(aUpperLeft.X() + _rSize.Width(), aUpperLeft.Y() + _rSize.Height());
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 		// data about ourself
515*b1cdbd2cSJim Jagielski 		Size aSize = _pView->getRealOutputSize(); //GetOutputSizePixel();
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 		sal_Bool bVisbile = sal_True;
518*b1cdbd2cSJim Jagielski 		sal_Bool bFitsHor = (aUpperLeft.X() >= 0) && (aLowerRight.X() <= aSize.Width());
519*b1cdbd2cSJim Jagielski 		sal_Bool bFitsVert= (aUpperLeft.Y() >= 0) && (aLowerRight.Y() <= aSize.Height());
520*b1cdbd2cSJim Jagielski 		if (!bFitsHor || !bFitsVert)
521*b1cdbd2cSJim Jagielski 		{
522*b1cdbd2cSJim Jagielski 			// #100386# OJ
523*b1cdbd2cSJim Jagielski 			if (!bFitsHor)
524*b1cdbd2cSJim Jagielski 			{
525*b1cdbd2cSJim Jagielski 				// ensure the visibility of the right border
526*b1cdbd2cSJim Jagielski 				if ( aLowerRight.X() > aSize.Width() )
527*b1cdbd2cSJim Jagielski 					_nScrollX = aLowerRight.X() - aSize.Width() + TABWIN_SPACING_X;
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski 				// ensure the visibility of the left border (higher priority)
530*b1cdbd2cSJim Jagielski 				//	if ( (aUpperLeft.X() - _nScrollX) < 0 )
531*b1cdbd2cSJim Jagielski 				if ( aUpperLeft.X() < 0 )
532*b1cdbd2cSJim Jagielski 					_nScrollX = aUpperLeft.X() - TABWIN_SPACING_X;
533*b1cdbd2cSJim Jagielski 			}
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 			if (!bFitsVert)
536*b1cdbd2cSJim Jagielski 			{
537*b1cdbd2cSJim Jagielski 				// lower border
538*b1cdbd2cSJim Jagielski 				if ( aLowerRight.Y() > aSize.Height() )
539*b1cdbd2cSJim Jagielski 					_nScrollY = aLowerRight.Y() - aSize.Height() + TABWIN_SPACING_Y;
540*b1cdbd2cSJim Jagielski 				// upper border
541*b1cdbd2cSJim Jagielski 				//	if ( (aUpperLeft.Y() - _nScrollY) < 0 )
542*b1cdbd2cSJim Jagielski 				if ( aUpperLeft.Y() < 0 )
543*b1cdbd2cSJim Jagielski 					_nScrollY = aUpperLeft.Y() - TABWIN_SPACING_Y;
544*b1cdbd2cSJim Jagielski 			}
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski 			if ( _nScrollX ) // aSize.Width() > _rSize.Width() &&
547*b1cdbd2cSJim Jagielski 				bVisbile = isScrollAllowed(_pView,_nScrollX, sal_True);
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski 			if ( _nScrollY ) // aSize.Height() > _rSize.Height() &&
550*b1cdbd2cSJim Jagielski 				bVisbile = bVisbile && isScrollAllowed(_pView,_nScrollY, sal_False);
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski 			if ( bVisbile )
553*b1cdbd2cSJim Jagielski 			{
554*b1cdbd2cSJim Jagielski 				sal_Int32 nHRangeMax = _pView->GetHScrollBar()->GetRangeMax();
555*b1cdbd2cSJim Jagielski 				sal_Int32 nVRangeMax = _pView->GetVScrollBar()->GetRangeMax();
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski 				if ( aSize.Width() + _pView->GetHScrollBar()->GetThumbPos() + _nScrollX > nHRangeMax )
558*b1cdbd2cSJim Jagielski 					bVisbile = sal_False;
559*b1cdbd2cSJim Jagielski 				if ( bVisbile && aSize.Height() + _pView->GetVScrollBar()->GetThumbPos() + _nScrollY > nVRangeMax )
560*b1cdbd2cSJim Jagielski 					bVisbile = sal_False;
561*b1cdbd2cSJim Jagielski 			}
562*b1cdbd2cSJim Jagielski 		}
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski 		return bVisbile;
566*b1cdbd2cSJim Jagielski 	}
567*b1cdbd2cSJim Jagielski } // end of ano namespace
568*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
isMovementAllowed(const Point & _rPoint,const Size & _rSize)569*b1cdbd2cSJim Jagielski sal_Bool OJoinTableView::isMovementAllowed(const Point& _rPoint,const Size& _rSize)
570*b1cdbd2cSJim Jagielski {
571*b1cdbd2cSJim Jagielski 	long nX,nY;
572*b1cdbd2cSJim Jagielski 	return getMovementImpl(this,_rPoint,_rSize,nX,nY);
573*b1cdbd2cSJim Jagielski }
574*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
EnsureVisible(const OTableWindow * _pWin)575*b1cdbd2cSJim Jagielski void OJoinTableView::EnsureVisible(const OTableWindow* _pWin)
576*b1cdbd2cSJim Jagielski {
577*b1cdbd2cSJim Jagielski 	// data about the tab win
578*b1cdbd2cSJim Jagielski 	TTableWindowData::value_type pData = _pWin->GetData();
579*b1cdbd2cSJim Jagielski 	//	Point aUpperLeft = pData->GetPosition();
580*b1cdbd2cSJim Jagielski 	EnsureVisible( pData->GetPosition() , pData->GetSize());
581*b1cdbd2cSJim Jagielski 	Invalidate(INVALIDATE_NOCHILDREN);
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
EnsureVisible(const Point & _rPoint,const Size & _rSize)584*b1cdbd2cSJim Jagielski void OJoinTableView::EnsureVisible(const Point& _rPoint,const Size& _rSize)
585*b1cdbd2cSJim Jagielski {
586*b1cdbd2cSJim Jagielski 	long nScrollX,nScrollY;
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski 	if ( getMovementImpl(this,_rPoint,_rSize,nScrollX,nScrollY) )
589*b1cdbd2cSJim Jagielski 	{
590*b1cdbd2cSJim Jagielski 		sal_Bool bVisbile = sal_True;
591*b1cdbd2cSJim Jagielski 		if (nScrollX)
592*b1cdbd2cSJim Jagielski 			bVisbile = ScrollPane(nScrollX, sal_True, sal_True);
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski 		if (nScrollY)
595*b1cdbd2cSJim Jagielski 			bVisbile = bVisbile && ScrollPane(nScrollY, sal_False, sal_True);
596*b1cdbd2cSJim Jagielski 	}
597*b1cdbd2cSJim Jagielski }
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetDefaultTabWinPosSize(OTableWindow * pTabWin)600*b1cdbd2cSJim Jagielski void OJoinTableView::SetDefaultTabWinPosSize( OTableWindow* pTabWin )
601*b1cdbd2cSJim Jagielski {
602*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
603*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////
604*b1cdbd2cSJim Jagielski 	// Position bestimmen:
605*b1cdbd2cSJim Jagielski 	// Das Fenster wird in Zeilen der Hoehe TABWIN_SPACING_Y+TABWIN_HEIGTH_STD aufgeteilt.
606*b1cdbd2cSJim Jagielski 	// Dann wird fuer jede Zeile geprueft, ob noch Platz fuer ein weiteres Fenster ist.
607*b1cdbd2cSJim Jagielski 	// Wenn kein Platz ist, wird die naechste Zeile ueberprueft.
608*b1cdbd2cSJim Jagielski 	Size aOutSize = GetSizePixel();
609*b1cdbd2cSJim Jagielski 	Point aNewPos( 0,0 );
610*b1cdbd2cSJim Jagielski 	sal_uInt16 nRow = 0;
611*b1cdbd2cSJim Jagielski 	sal_Bool bEnd = sal_False;
612*b1cdbd2cSJim Jagielski 	while( !bEnd )
613*b1cdbd2cSJim Jagielski 	{
614*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////
615*b1cdbd2cSJim Jagielski 		// Neue Position auf Zeilenbeginn setzen
616*b1cdbd2cSJim Jagielski 		aNewPos.X() = TABWIN_SPACING_X;
617*b1cdbd2cSJim Jagielski 		aNewPos.Y() = (nRow+1) * TABWIN_SPACING_Y;
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////
620*b1cdbd2cSJim Jagielski 		// Rectangle fuer die jeweilige Zeile bestimmen
621*b1cdbd2cSJim Jagielski 		Rectangle aRowRect( Point(0,0), aOutSize );
622*b1cdbd2cSJim Jagielski 		aRowRect.Top() = nRow * ( TABWIN_SPACING_Y + TABWIN_HEIGHT_STD );
623*b1cdbd2cSJim Jagielski 		aRowRect.Bottom() = (nRow+1) * ( TABWIN_SPACING_Y + TABWIN_HEIGHT_STD );
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////
626*b1cdbd2cSJim Jagielski 		// Belegte Bereiche dieser Zeile pruefen
627*b1cdbd2cSJim Jagielski 		OTableWindow* pOtherTabWin;// = GetTabWinMap()->First();
628*b1cdbd2cSJim Jagielski 		OTableWindowMapIterator aIter = m_aTableMap.begin();
629*b1cdbd2cSJim Jagielski 		OTableWindowMapIterator aEnd = m_aTableMap.end();
630*b1cdbd2cSJim Jagielski 	    for(;aIter != aEnd;++aIter)
631*b1cdbd2cSJim Jagielski 		{
632*b1cdbd2cSJim Jagielski 			pOtherTabWin = aIter->second;
633*b1cdbd2cSJim Jagielski 			Rectangle aOtherTabWinRect( pOtherTabWin->GetPosPixel(), pOtherTabWin->GetSizePixel() );
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski 			if(
636*b1cdbd2cSJim Jagielski 				( (aOtherTabWinRect.Top()>aRowRect.Top()) && (aOtherTabWinRect.Top()<aRowRect.Bottom()) ) ||
637*b1cdbd2cSJim Jagielski 				( (aOtherTabWinRect.Bottom()>aRowRect.Top()) && (aOtherTabWinRect.Bottom()<aRowRect.Bottom()) )
638*b1cdbd2cSJim Jagielski 			  )
639*b1cdbd2cSJim Jagielski 			{
640*b1cdbd2cSJim Jagielski 				//////////////////////////////////////////////////////////////////
641*b1cdbd2cSJim Jagielski 				// TabWin liegt in der Zeile
642*b1cdbd2cSJim Jagielski 				if( aOtherTabWinRect.Right()>aNewPos.X() )
643*b1cdbd2cSJim Jagielski 					aNewPos.X() = aOtherTabWinRect.Right() + TABWIN_SPACING_X;
644*b1cdbd2cSJim Jagielski 			}
645*b1cdbd2cSJim Jagielski 		}
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////
648*b1cdbd2cSJim Jagielski 		// Ist in dieser Zeile noch Platz?
649*b1cdbd2cSJim Jagielski 		if( (aNewPos.X()+TABWIN_WIDTH_STD)<aRowRect.Right() )
650*b1cdbd2cSJim Jagielski 		{
651*b1cdbd2cSJim Jagielski 			aNewPos.Y() = aRowRect.Top() + TABWIN_SPACING_Y;
652*b1cdbd2cSJim Jagielski 			bEnd = sal_True;
653*b1cdbd2cSJim Jagielski 		}
654*b1cdbd2cSJim Jagielski 		else
655*b1cdbd2cSJim Jagielski 		{
656*b1cdbd2cSJim Jagielski 			if( (aRowRect.Bottom()+aRowRect.GetHeight()) > aOutSize.Height() )
657*b1cdbd2cSJim Jagielski 			{
658*b1cdbd2cSJim Jagielski 				// insert it in the first row
659*b1cdbd2cSJim Jagielski 				sal_Int32 nCount = m_aTableMap.size() % (nRow+1);
660*b1cdbd2cSJim Jagielski 				++nCount;
661*b1cdbd2cSJim Jagielski 				aNewPos.Y() = nCount * TABWIN_SPACING_Y + (nCount-1)*CalcZoom(TABWIN_HEIGHT_STD);
662*b1cdbd2cSJim Jagielski 				bEnd = sal_True;
663*b1cdbd2cSJim Jagielski 			}
664*b1cdbd2cSJim Jagielski 			else
665*b1cdbd2cSJim Jagielski 				nRow++;
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski 		}
668*b1cdbd2cSJim Jagielski 	}
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////
671*b1cdbd2cSJim Jagielski 	// Groesse bestimmen
672*b1cdbd2cSJim Jagielski 	Size aNewSize( CalcZoom(TABWIN_WIDTH_STD), CalcZoom(TABWIN_HEIGHT_STD) );
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 	// check if the new position in inside the scrollbars ranges
675*b1cdbd2cSJim Jagielski 	Point aBottom(aNewPos);
676*b1cdbd2cSJim Jagielski 	aBottom.X() += aNewSize.Width();
677*b1cdbd2cSJim Jagielski 	aBottom.Y() += aNewSize.Height();
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 	if(!GetHScrollBar()->GetRange().IsInside(aBottom.X()))
680*b1cdbd2cSJim Jagielski 		GetHScrollBar()->SetRange( Range(0, aBottom.X()) );
681*b1cdbd2cSJim Jagielski 	if(!GetVScrollBar()->GetRange().IsInside(aBottom.Y()))
682*b1cdbd2cSJim Jagielski 		GetVScrollBar()->SetRange( Range(0, aBottom.Y()) );
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	pTabWin->SetPosSizePixel( aNewPos, aNewSize );
685*b1cdbd2cSJim Jagielski }
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
DataChanged(const DataChangedEvent & rDCEvt)688*b1cdbd2cSJim Jagielski void OJoinTableView::DataChanged(const DataChangedEvent& rDCEvt)
689*b1cdbd2cSJim Jagielski {
690*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
691*b1cdbd2cSJim Jagielski 	if (rDCEvt.GetType() == DATACHANGED_SETTINGS)
692*b1cdbd2cSJim Jagielski 	{
693*b1cdbd2cSJim Jagielski 		// nehmen wir den worst-case an : die Farben haben sich geaendert, also
694*b1cdbd2cSJim Jagielski 		// mich anpassen
695*b1cdbd2cSJim Jagielski 		InitColors();
696*b1cdbd2cSJim Jagielski 		Invalidate(INVALIDATE_NOCHILDREN);
697*b1cdbd2cSJim Jagielski 		// durch das Invalidate werden auch die Connections neu gezeichnet, so dass die auch
698*b1cdbd2cSJim Jagielski 		// gleich in den neuen Farben dargestellt werden
699*b1cdbd2cSJim Jagielski 	}
700*b1cdbd2cSJim Jagielski }
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
InitColors()703*b1cdbd2cSJim Jagielski void OJoinTableView::InitColors()
704*b1cdbd2cSJim Jagielski {
705*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
706*b1cdbd2cSJim Jagielski 	// die Farben fuer die Darstellung sollten die Systemfarben sein
707*b1cdbd2cSJim Jagielski 	StyleSettings aSystemStyle = Application::GetSettings().GetStyleSettings();
708*b1cdbd2cSJim Jagielski 	SetBackground(Wallpaper(Color(aSystemStyle.GetDialogColor())));
709*b1cdbd2cSJim Jagielski }
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
BeginChildMove(OTableWindow * pTabWin,const Point & rMousePos)712*b1cdbd2cSJim Jagielski void OJoinTableView::BeginChildMove( OTableWindow* pTabWin, const Point& rMousePos  )
713*b1cdbd2cSJim Jagielski {
714*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski 	if (m_pView->getController().isReadOnly())
717*b1cdbd2cSJim Jagielski 		return;
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski 	m_pDragWin = pTabWin;
720*b1cdbd2cSJim Jagielski 	SetPointer(Pointer(POINTER_MOVE));
721*b1cdbd2cSJim Jagielski 	Point aMousePos = ScreenToOutputPixel( rMousePos );
722*b1cdbd2cSJim Jagielski 	m_aDragOffset = aMousePos - pTabWin->GetPosPixel();
723*b1cdbd2cSJim Jagielski 	m_pDragWin->SetZOrder(NULL, WINDOW_ZORDER_FIRST);
724*b1cdbd2cSJim Jagielski 	m_bTrackingInitiallyMoved = sal_False;
725*b1cdbd2cSJim Jagielski 	StartTracking();
726*b1cdbd2cSJim Jagielski }
727*b1cdbd2cSJim Jagielski 
NotifyTitleClicked(OTableWindow * pTabWin,const Point rMousePos)728*b1cdbd2cSJim Jagielski void OJoinTableView::NotifyTitleClicked( OTableWindow* pTabWin, const Point rMousePos )
729*b1cdbd2cSJim Jagielski {
730*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
731*b1cdbd2cSJim Jagielski 	DeselectConn(GetSelectedConn());
732*b1cdbd2cSJim Jagielski 	BeginChildMove(pTabWin, rMousePos);
733*b1cdbd2cSJim Jagielski }
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
BeginChildSizing(OTableWindow * pTabWin,const Pointer & rPointer)736*b1cdbd2cSJim Jagielski void OJoinTableView::BeginChildSizing( OTableWindow* pTabWin, const Pointer& rPointer )
737*b1cdbd2cSJim Jagielski {
738*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski 	if (m_pView->getController().isReadOnly())
741*b1cdbd2cSJim Jagielski 		return;
742*b1cdbd2cSJim Jagielski 
743*b1cdbd2cSJim Jagielski 	SetPointer( rPointer );
744*b1cdbd2cSJim Jagielski 	m_pSizingWin = pTabWin;
745*b1cdbd2cSJim Jagielski 	StartTracking();
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ScrollPane(long nDelta,sal_Bool bHoriz,sal_Bool bPaintScrollBars)749*b1cdbd2cSJim Jagielski sal_Bool OJoinTableView::ScrollPane( long nDelta, sal_Bool bHoriz, sal_Bool bPaintScrollBars )
750*b1cdbd2cSJim Jagielski {
751*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
752*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_True;
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
755*b1cdbd2cSJim Jagielski 	// ScrollBar-Positionen anpassen
756*b1cdbd2cSJim Jagielski 	if( bPaintScrollBars )
757*b1cdbd2cSJim Jagielski 	{
758*b1cdbd2cSJim Jagielski 		if( bHoriz )
759*b1cdbd2cSJim Jagielski 		{
760*b1cdbd2cSJim Jagielski 			long nOldThumbPos = GetHScrollBar()->GetThumbPos();
761*b1cdbd2cSJim Jagielski 			long nNewThumbPos = nOldThumbPos + nDelta;
762*b1cdbd2cSJim Jagielski 			if( nNewThumbPos < 0 )
763*b1cdbd2cSJim Jagielski 			{
764*b1cdbd2cSJim Jagielski 				nNewThumbPos = 0;
765*b1cdbd2cSJim Jagielski 				bRet = sal_False;
766*b1cdbd2cSJim Jagielski 			}
767*b1cdbd2cSJim Jagielski 			if( nNewThumbPos > GetHScrollBar()->GetRange().Max() )
768*b1cdbd2cSJim Jagielski 			{
769*b1cdbd2cSJim Jagielski 				nNewThumbPos = GetHScrollBar()->GetRange().Max();
770*b1cdbd2cSJim Jagielski 				bRet = sal_False;
771*b1cdbd2cSJim Jagielski 			}
772*b1cdbd2cSJim Jagielski 			GetHScrollBar()->SetThumbPos( nNewThumbPos );
773*b1cdbd2cSJim Jagielski 			nDelta = GetHScrollBar()->GetThumbPos() - nOldThumbPos;
774*b1cdbd2cSJim Jagielski 		}
775*b1cdbd2cSJim Jagielski 		else
776*b1cdbd2cSJim Jagielski 		{
777*b1cdbd2cSJim Jagielski 			long nOldThumbPos = GetVScrollBar()->GetThumbPos();
778*b1cdbd2cSJim Jagielski 			long nNewThumbPos = nOldThumbPos+nDelta;
779*b1cdbd2cSJim Jagielski 			if( nNewThumbPos < 0 )
780*b1cdbd2cSJim Jagielski 			{
781*b1cdbd2cSJim Jagielski 				nNewThumbPos = 0;
782*b1cdbd2cSJim Jagielski 				bRet = sal_False;
783*b1cdbd2cSJim Jagielski 			}
784*b1cdbd2cSJim Jagielski 			if( nNewThumbPos > GetVScrollBar()->GetRange().Max() )
785*b1cdbd2cSJim Jagielski 			{
786*b1cdbd2cSJim Jagielski 				nNewThumbPos = GetVScrollBar()->GetRange().Max();
787*b1cdbd2cSJim Jagielski 				bRet = sal_False;
788*b1cdbd2cSJim Jagielski 			}
789*b1cdbd2cSJim Jagielski 			GetVScrollBar()->SetThumbPos( nNewThumbPos );
790*b1cdbd2cSJim Jagielski 			nDelta = GetVScrollBar()->GetThumbPos() - nOldThumbPos;
791*b1cdbd2cSJim Jagielski 		}
792*b1cdbd2cSJim Jagielski 	}
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
795*b1cdbd2cSJim Jagielski 	// Wenn ScrollOffset bereits an den Grenzen liegt, kein Neuzeichnen
796*b1cdbd2cSJim Jagielski 	if( (GetHScrollBar()->GetThumbPos()==m_aScrollOffset.X()) &&
797*b1cdbd2cSJim Jagielski 		(GetVScrollBar()->GetThumbPos()==m_aScrollOffset.Y()) )
798*b1cdbd2cSJim Jagielski 		return sal_False;
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
801*b1cdbd2cSJim Jagielski 	// ScrollOffset neu setzen
802*b1cdbd2cSJim Jagielski 	if (bHoriz)
803*b1cdbd2cSJim Jagielski 		m_aScrollOffset.X() = GetHScrollBar()->GetThumbPos();
804*b1cdbd2cSJim Jagielski 	else
805*b1cdbd2cSJim Jagielski 		m_aScrollOffset.Y() = GetVScrollBar()->GetThumbPos();
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
808*b1cdbd2cSJim Jagielski 	// Alle Fenster verschieben
809*b1cdbd2cSJim Jagielski 	OTableWindow* pTabWin;
810*b1cdbd2cSJim Jagielski 	Point aPos;
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski 	OTableWindowMapIterator aIter = m_aTableMap.begin();
813*b1cdbd2cSJim Jagielski 	OTableWindowMapIterator aEnd = m_aTableMap.end();
814*b1cdbd2cSJim Jagielski 	for(;aIter != aEnd;++aIter)
815*b1cdbd2cSJim Jagielski 	{
816*b1cdbd2cSJim Jagielski 		pTabWin = aIter->second;
817*b1cdbd2cSJim Jagielski 		aPos = pTabWin->GetPosPixel();
818*b1cdbd2cSJim Jagielski 
819*b1cdbd2cSJim Jagielski 		if( bHoriz )
820*b1cdbd2cSJim Jagielski 			aPos.X() -= nDelta;
821*b1cdbd2cSJim Jagielski 		else aPos.Y() -= nDelta;
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski 		pTabWin->SetPosPixel( aPos );
824*b1cdbd2cSJim Jagielski 	}
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 	Invalidate(); // INVALIDATE_NOCHILDREN
827*b1cdbd2cSJim Jagielski 
828*b1cdbd2cSJim Jagielski 	return bRet;
829*b1cdbd2cSJim Jagielski }
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Tracking(const TrackingEvent & rTEvt)832*b1cdbd2cSJim Jagielski void OJoinTableView::Tracking( const TrackingEvent& rTEvt )
833*b1cdbd2cSJim Jagielski {
834*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
835*b1cdbd2cSJim Jagielski 	HideTracking();
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski 	if (rTEvt.IsTrackingEnded())
838*b1cdbd2cSJim Jagielski 	{
839*b1cdbd2cSJim Jagielski 		if( m_pDragWin )
840*b1cdbd2cSJim Jagielski 		{
841*b1cdbd2cSJim Jagielski 			if (m_aDragScrollTimer.IsActive())
842*b1cdbd2cSJim Jagielski 				m_aDragScrollTimer.Stop();
843*b1cdbd2cSJim Jagielski 
844*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////////
845*b1cdbd2cSJim Jagielski 			// Position des Childs nach Verschieben anpassen
846*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////////
847*b1cdbd2cSJim Jagielski 			// Fenster duerfen nicht aus Anzeigebereich herausbewegt werden
848*b1cdbd2cSJim Jagielski 			Point aDragWinPos = rTEvt.GetMouseEvent().GetPosPixel() - m_aDragOffset;
849*b1cdbd2cSJim Jagielski 			Size aDragWinSize = m_pDragWin->GetSizePixel();
850*b1cdbd2cSJim Jagielski 			if( aDragWinPos.X() < 0 )
851*b1cdbd2cSJim Jagielski 				aDragWinPos.X() = 0;
852*b1cdbd2cSJim Jagielski 			if( aDragWinPos.Y() < 0 )
853*b1cdbd2cSJim Jagielski 				aDragWinPos.Y() = 0;
854*b1cdbd2cSJim Jagielski 			if( (aDragWinPos.X() + aDragWinSize.Width()) > m_aOutputSize.Width() )
855*b1cdbd2cSJim Jagielski 				aDragWinPos.X() = m_aOutputSize.Width() - aDragWinSize.Width() - 1;
856*b1cdbd2cSJim Jagielski 			if( (aDragWinPos.Y() + aDragWinSize.Height()) > m_aOutputSize.Height() )
857*b1cdbd2cSJim Jagielski 				aDragWinPos.Y() = m_aOutputSize.Height() - aDragWinSize.Height() - 1;
858*b1cdbd2cSJim Jagielski 			if( aDragWinPos.X() < 0 )
859*b1cdbd2cSJim Jagielski 				aDragWinPos.X() = 0;
860*b1cdbd2cSJim Jagielski 			if( aDragWinPos.Y() < 0 )
861*b1cdbd2cSJim Jagielski 				aDragWinPos.Y() = 0;
862*b1cdbd2cSJim Jagielski 			// TODO : nicht das Fenster neu positionieren, wenn es uebersteht, sondern einfach meinen Bereich erweitern
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////////
866*b1cdbd2cSJim Jagielski 			// Fenster positionieren
867*b1cdbd2cSJim Jagielski 			EndTracking();
868*b1cdbd2cSJim Jagielski 			m_pDragWin->SetZOrder(NULL, WINDOW_ZORDER_FIRST);
869*b1cdbd2cSJim Jagielski 			// erst mal testen, ob ich mich ueberhaupt bewegt habe
870*b1cdbd2cSJim Jagielski 			// (das verhindert das Setzen des modified-Flags, wenn sich eigentlich gar nichts getan hat)
871*b1cdbd2cSJim Jagielski 			TTableWindowData::value_type pData = m_pDragWin->GetData();
872*b1cdbd2cSJim Jagielski 			if ( ! (pData && pData->HasPosition() && (pData->GetPosition() == aDragWinPos)))
873*b1cdbd2cSJim Jagielski 			{
874*b1cdbd2cSJim Jagielski 				// die alten logischen Koordinaten
875*b1cdbd2cSJim Jagielski 				Point ptOldPos = m_pDragWin->GetPosPixel() + Point(GetHScrollBar()->GetThumbPos(), GetVScrollBar()->GetThumbPos());
876*b1cdbd2cSJim Jagielski 				// neu positionieren
877*b1cdbd2cSJim Jagielski 				m_pDragWin->SetPosPixel(aDragWinPos);
878*b1cdbd2cSJim Jagielski 				TabWinMoved(m_pDragWin, ptOldPos);
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski 				m_pDragWin->GrabFocus();
881*b1cdbd2cSJim Jagielski 			}
882*b1cdbd2cSJim Jagielski 			m_pDragWin = NULL;
883*b1cdbd2cSJim Jagielski 			SetPointer(Pointer(POINTER_ARROW));
884*b1cdbd2cSJim Jagielski 		}
885*b1cdbd2cSJim Jagielski 		// else we handle the resizing
886*b1cdbd2cSJim Jagielski 		else if( m_pSizingWin )
887*b1cdbd2cSJim Jagielski 		{
888*b1cdbd2cSJim Jagielski 			SetPointer( Pointer() );
889*b1cdbd2cSJim Jagielski 			EndTracking();
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski 			// die alten physikalischen Koordinaten
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski 			Size szOld = m_pSizingWin->GetSizePixel();
894*b1cdbd2cSJim Jagielski 			Point ptOld = m_pSizingWin->GetPosPixel();
895*b1cdbd2cSJim Jagielski 			Size aNewSize(CalcZoom(m_aSizingRect.GetSize().Width()),CalcZoom(m_aSizingRect.GetSize().Height()));
896*b1cdbd2cSJim Jagielski 			m_pSizingWin->SetPosSizePixel( m_aSizingRect.TopLeft(), aNewSize );
897*b1cdbd2cSJim Jagielski 			TabWinSized(m_pSizingWin, ptOld, szOld);
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski 			m_pSizingWin->Invalidate( m_aSizingRect );
900*b1cdbd2cSJim Jagielski 			m_pSizingWin = NULL;
901*b1cdbd2cSJim Jagielski 		}
902*b1cdbd2cSJim Jagielski 	}
903*b1cdbd2cSJim Jagielski 	else if (rTEvt.IsTrackingCanceled())
904*b1cdbd2cSJim Jagielski 	{
905*b1cdbd2cSJim Jagielski 		if (m_aDragScrollTimer.IsActive())
906*b1cdbd2cSJim Jagielski 			m_aDragScrollTimer.Stop();
907*b1cdbd2cSJim Jagielski 		EndTracking();
908*b1cdbd2cSJim Jagielski 	}
909*b1cdbd2cSJim Jagielski 	else
910*b1cdbd2cSJim Jagielski 	{
911*b1cdbd2cSJim Jagielski 		if( m_pDragWin )
912*b1cdbd2cSJim Jagielski 		{
913*b1cdbd2cSJim Jagielski 			m_ptPrevDraggingPos = rTEvt.GetMouseEvent().GetPosPixel();
914*b1cdbd2cSJim Jagielski 			// an Fenstergrenzen scrollen
915*b1cdbd2cSJim Jagielski 			ScrollWhileDragging();
916*b1cdbd2cSJim Jagielski 		}
917*b1cdbd2cSJim Jagielski 
918*b1cdbd2cSJim Jagielski 		if( m_pSizingWin )
919*b1cdbd2cSJim Jagielski 		{
920*b1cdbd2cSJim Jagielski 			Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
921*b1cdbd2cSJim Jagielski 			m_aSizingRect = m_pSizingWin->getSizingRect(aMousePos,m_aOutputSize);
922*b1cdbd2cSJim Jagielski 			Update();
923*b1cdbd2cSJim Jagielski 			ShowTracking( m_aSizingRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW );
924*b1cdbd2cSJim Jagielski 		}
925*b1cdbd2cSJim Jagielski 	}
926*b1cdbd2cSJim Jagielski }
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ConnDoubleClicked(OTableConnection *)929*b1cdbd2cSJim Jagielski void OJoinTableView::ConnDoubleClicked( OTableConnection* /*pConnection*/ )
930*b1cdbd2cSJim Jagielski {
931*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
932*b1cdbd2cSJim Jagielski }
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
MouseButtonDown(const MouseEvent & rEvt)935*b1cdbd2cSJim Jagielski void OJoinTableView::MouseButtonDown( const MouseEvent& rEvt )
936*b1cdbd2cSJim Jagielski {
937*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
938*b1cdbd2cSJim Jagielski 	GrabFocus();
939*b1cdbd2cSJim Jagielski 	Window::MouseButtonDown(rEvt);
940*b1cdbd2cSJim Jagielski }
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
MouseButtonUp(const MouseEvent & rEvt)943*b1cdbd2cSJim Jagielski void OJoinTableView::MouseButtonUp( const MouseEvent& rEvt )
944*b1cdbd2cSJim Jagielski {
945*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
946*b1cdbd2cSJim Jagielski 	Window::MouseButtonUp(rEvt);
947*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
948*b1cdbd2cSJim Jagielski 	// Wurde eine Connection ausgewaehlt?
949*b1cdbd2cSJim Jagielski 	if( !m_vTableConnection.empty() )
950*b1cdbd2cSJim Jagielski 	{
951*b1cdbd2cSJim Jagielski 		DeselectConn(GetSelectedConn());
952*b1cdbd2cSJim Jagielski 
953*b1cdbd2cSJim Jagielski 		::std::vector<OTableConnection*>::iterator aIter = m_vTableConnection.begin();
954*b1cdbd2cSJim Jagielski         ::std::vector<OTableConnection*>::iterator aEnd = m_vTableConnection.end();
955*b1cdbd2cSJim Jagielski 		for(;aIter != aEnd;++aIter)
956*b1cdbd2cSJim Jagielski 		{
957*b1cdbd2cSJim Jagielski 			if( (*aIter)->CheckHit(rEvt.GetPosPixel()) )
958*b1cdbd2cSJim Jagielski 			{
959*b1cdbd2cSJim Jagielski 				SelectConn((*aIter));
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski 				// Doppelclick
962*b1cdbd2cSJim Jagielski 				if( rEvt.GetClicks() == 2 )
963*b1cdbd2cSJim Jagielski 					ConnDoubleClicked( (*aIter) );
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski 				break;
966*b1cdbd2cSJim Jagielski 			}
967*b1cdbd2cSJim Jagielski 		}
968*b1cdbd2cSJim Jagielski 	}
969*b1cdbd2cSJim Jagielski }
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
KeyInput(const KeyEvent & rEvt)972*b1cdbd2cSJim Jagielski void OJoinTableView::KeyInput( const KeyEvent& rEvt )
973*b1cdbd2cSJim Jagielski {
974*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
975*b1cdbd2cSJim Jagielski 	sal_uInt16 nCode = rEvt.GetKeyCode().GetCode();
976*b1cdbd2cSJim Jagielski 	sal_Bool   bShift = rEvt.GetKeyCode().IsShift();
977*b1cdbd2cSJim Jagielski 	sal_Bool   bCtrl = rEvt.GetKeyCode().IsMod1();
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski 	if( !bCtrl && !bShift && (nCode==KEY_DELETE) )
980*b1cdbd2cSJim Jagielski 	{
981*b1cdbd2cSJim Jagielski 		if (GetSelectedConn())
982*b1cdbd2cSJim Jagielski 			RemoveConnection( GetSelectedConn() ,sal_True);
983*b1cdbd2cSJim Jagielski 	}
984*b1cdbd2cSJim Jagielski 	else
985*b1cdbd2cSJim Jagielski 		Window::KeyInput( rEvt );
986*b1cdbd2cSJim Jagielski }
987*b1cdbd2cSJim Jagielski 
988*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
DeselectConn(OTableConnection * pConn)989*b1cdbd2cSJim Jagielski void OJoinTableView::DeselectConn(OTableConnection* pConn)
990*b1cdbd2cSJim Jagielski {
991*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
992*b1cdbd2cSJim Jagielski 	if (!pConn || !pConn->IsSelected())
993*b1cdbd2cSJim Jagielski 		return;
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski 	// die zugehoerigen Eitnraege in der ListBox des Tabellenfenster deselektieren
996*b1cdbd2cSJim Jagielski 	OTableWindow* pWin = pConn->GetSourceWin();
997*b1cdbd2cSJim Jagielski 	if (pWin && pWin->GetListBox())
998*b1cdbd2cSJim Jagielski 		pWin->GetListBox()->SelectAll(sal_False);
999*b1cdbd2cSJim Jagielski 
1000*b1cdbd2cSJim Jagielski 	pWin = pConn->GetDestWin();
1001*b1cdbd2cSJim Jagielski 	if (pWin && pWin->GetListBox())
1002*b1cdbd2cSJim Jagielski 		pWin->GetListBox()->SelectAll(sal_False);
1003*b1cdbd2cSJim Jagielski 
1004*b1cdbd2cSJim Jagielski 	pConn->Deselect();
1005*b1cdbd2cSJim Jagielski 	m_pSelectedConn = NULL;
1006*b1cdbd2cSJim Jagielski }
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SelectConn(OTableConnection * pConn)1009*b1cdbd2cSJim Jagielski void OJoinTableView::SelectConn(OTableConnection* pConn)
1010*b1cdbd2cSJim Jagielski {
1011*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1012*b1cdbd2cSJim Jagielski 	DeselectConn(GetSelectedConn());
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski 	pConn->Select();
1015*b1cdbd2cSJim Jagielski 	m_pSelectedConn = pConn;
1016*b1cdbd2cSJim Jagielski 	GrabFocus(); // has to be called here because a table window may still be focused
1017*b1cdbd2cSJim Jagielski 
1018*b1cdbd2cSJim Jagielski 	// die betroffenene Eintraege in den Windows selektieren
1019*b1cdbd2cSJim Jagielski 	OTableWindow* pConnSource = pConn->GetSourceWin();
1020*b1cdbd2cSJim Jagielski 	OTableWindow* pConnDest = pConn->GetDestWin();
1021*b1cdbd2cSJim Jagielski 	if (pConnSource && pConnDest)
1022*b1cdbd2cSJim Jagielski 	{
1023*b1cdbd2cSJim Jagielski 		OTableWindowListBox* pSourceBox = pConnSource->GetListBox();
1024*b1cdbd2cSJim Jagielski 		OTableWindowListBox* pDestBox = pConnDest->GetListBox();
1025*b1cdbd2cSJim Jagielski 		if (pSourceBox && pDestBox)
1026*b1cdbd2cSJim Jagielski 		{
1027*b1cdbd2cSJim Jagielski 			pSourceBox->SelectAll(sal_False);
1028*b1cdbd2cSJim Jagielski 			pDestBox->SelectAll(sal_False);
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pFirstSourceVisible = pSourceBox->GetFirstEntryInView();
1031*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pFirstDestVisible = pDestBox->GetFirstEntryInView();
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski 			const ::std::vector<OConnectionLine*>* pLines = pConn->GetConnLineList();
1034*b1cdbd2cSJim Jagielski 			::std::vector<OConnectionLine*>::const_reverse_iterator aIter = pLines->rbegin();
1035*b1cdbd2cSJim Jagielski 			for(;aIter != pLines->rend();++aIter)
1036*b1cdbd2cSJim Jagielski 			{
1037*b1cdbd2cSJim Jagielski 				if ((*aIter)->IsValid())
1038*b1cdbd2cSJim Jagielski 				{
1039*b1cdbd2cSJim Jagielski 					SvLBoxEntry* pSourceEntry = pSourceBox->GetEntryFromText((*aIter)->GetData()->GetSourceFieldName());
1040*b1cdbd2cSJim Jagielski 					if (pSourceEntry)
1041*b1cdbd2cSJim Jagielski 					{
1042*b1cdbd2cSJim Jagielski 						pSourceBox->Select(pSourceEntry, sal_True);
1043*b1cdbd2cSJim Jagielski 						pSourceBox->MakeVisible(pSourceEntry);
1044*b1cdbd2cSJim Jagielski 					}
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski 					SvLBoxEntry* pDestEntry = pDestBox->GetEntryFromText((*aIter)->GetData()->GetDestFieldName());
1047*b1cdbd2cSJim Jagielski 					if (pDestEntry)
1048*b1cdbd2cSJim Jagielski 					{
1049*b1cdbd2cSJim Jagielski 						pDestBox->Select(pDestEntry, sal_True);
1050*b1cdbd2cSJim Jagielski 						pDestBox->MakeVisible(pDestEntry);
1051*b1cdbd2cSJim Jagielski 					}
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski 				}
1054*b1cdbd2cSJim Jagielski 			}
1055*b1cdbd2cSJim Jagielski 
1056*b1cdbd2cSJim Jagielski 			if ((pFirstSourceVisible != pSourceBox->GetFirstEntryInView())
1057*b1cdbd2cSJim Jagielski 				|| (pFirstDestVisible != pDestBox->GetFirstEntryInView()))
1058*b1cdbd2cSJim Jagielski 				// es wurde gescrollt -> neu zeichnen
1059*b1cdbd2cSJim Jagielski 				Invalidate(INVALIDATE_NOCHILDREN);
1060*b1cdbd2cSJim Jagielski 		}
1061*b1cdbd2cSJim Jagielski 	}
1062*b1cdbd2cSJim Jagielski }
1063*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Paint(const Rectangle & rRect)1064*b1cdbd2cSJim Jagielski void OJoinTableView::Paint( const Rectangle& rRect )
1065*b1cdbd2cSJim Jagielski {
1066*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1067*b1cdbd2cSJim Jagielski 	DrawConnections( rRect );
1068*b1cdbd2cSJim Jagielski }
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
InvalidateConnections()1071*b1cdbd2cSJim Jagielski void OJoinTableView::InvalidateConnections()
1072*b1cdbd2cSJim Jagielski {
1073*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1074*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1075*b1cdbd2cSJim Jagielski 	// Die Joins zeichnen
1076*b1cdbd2cSJim Jagielski 	::std::for_each(m_vTableConnection.begin(),m_vTableConnection.end(),
1077*b1cdbd2cSJim Jagielski 		::std::mem_fun(& OTableConnection::InvalidateConnection));
1078*b1cdbd2cSJim Jagielski }
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
DrawConnections(const Rectangle & rRect)1081*b1cdbd2cSJim Jagielski void OJoinTableView::DrawConnections( const Rectangle& rRect )
1082*b1cdbd2cSJim Jagielski {
1083*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1084*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1085*b1cdbd2cSJim Jagielski 	// Die Joins zeichnen
1086*b1cdbd2cSJim Jagielski     ::std::for_each(m_vTableConnection.begin(),m_vTableConnection.end(),boost::bind( &OTableConnection::Draw, _1, boost::cref( rRect )));
1087*b1cdbd2cSJim Jagielski 	// zum Schluss noch mal die selektierte ueber alle anderen drueber
1088*b1cdbd2cSJim Jagielski 	if (GetSelectedConn())
1089*b1cdbd2cSJim Jagielski 		GetSelectedConn()->Draw( rRect );
1090*b1cdbd2cSJim Jagielski }
1091*b1cdbd2cSJim Jagielski 
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getTableConnections(const OTableWindow * _pFromWin) const1094*b1cdbd2cSJim Jagielski ::std::vector<OTableConnection*>::const_iterator OJoinTableView::getTableConnections(const OTableWindow* _pFromWin) const
1095*b1cdbd2cSJim Jagielski {
1096*b1cdbd2cSJim Jagielski 	return ::std::find_if(	m_vTableConnection.begin(),
1097*b1cdbd2cSJim Jagielski 							m_vTableConnection.end(),
1098*b1cdbd2cSJim Jagielski 							::std::bind2nd(::std::mem_fun(&OTableConnection::isTableConnection),_pFromWin));
1099*b1cdbd2cSJim Jagielski }
1100*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getConnectionCount(const OTableWindow * _pFromWin) const1101*b1cdbd2cSJim Jagielski sal_Int32 OJoinTableView::getConnectionCount(const OTableWindow* _pFromWin) const
1102*b1cdbd2cSJim Jagielski {
1103*b1cdbd2cSJim Jagielski 	return ::std::count_if(	m_vTableConnection.begin(),
1104*b1cdbd2cSJim Jagielski 							m_vTableConnection.end(),
1105*b1cdbd2cSJim Jagielski 							::std::bind2nd(::std::mem_fun(&OTableConnection::isTableConnection),_pFromWin));
1106*b1cdbd2cSJim Jagielski }
1107*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ExistsAConn(const OTableWindow * pFrom) const1108*b1cdbd2cSJim Jagielski sal_Bool OJoinTableView::ExistsAConn(const OTableWindow* pFrom) const
1109*b1cdbd2cSJim Jagielski {
1110*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1111*b1cdbd2cSJim Jagielski 	return getTableConnections(pFrom) != m_vTableConnection.end();
1112*b1cdbd2cSJim Jagielski }
1113*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
ClearAll()1114*b1cdbd2cSJim Jagielski void OJoinTableView::ClearAll()
1115*b1cdbd2cSJim Jagielski {
1116*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1117*b1cdbd2cSJim Jagielski 	SetUpdateMode(sal_False);
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski 	HideTabWins();
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski 	// und das selbe mit den Connections
1122*b1cdbd2cSJim Jagielski 	::std::vector<OTableConnection*>::iterator aIter = m_vTableConnection.begin();
1123*b1cdbd2cSJim Jagielski     ::std::vector<OTableConnection*>::iterator aEnd = m_vTableConnection.end();
1124*b1cdbd2cSJim Jagielski 	for(;aIter != aEnd;++aIter)
1125*b1cdbd2cSJim Jagielski 		RemoveConnection( *aIter ,sal_True);
1126*b1cdbd2cSJim Jagielski 	m_vTableConnection.clear();
1127*b1cdbd2cSJim Jagielski 
1128*b1cdbd2cSJim Jagielski 	m_pLastFocusTabWin	= NULL;
1129*b1cdbd2cSJim Jagielski 	m_pSelectedConn		= NULL;
1130*b1cdbd2cSJim Jagielski 
1131*b1cdbd2cSJim Jagielski 	// scroll to the upper left
1132*b1cdbd2cSJim Jagielski 	ScrollPane(-GetScrollOffset().X(), sal_True, sal_True);
1133*b1cdbd2cSJim Jagielski 	ScrollPane(-GetScrollOffset().Y(), sal_False, sal_True);
1134*b1cdbd2cSJim Jagielski 	Invalidate();
1135*b1cdbd2cSJim Jagielski }
1136*b1cdbd2cSJim Jagielski 
1137*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
ScrollWhileDragging()1138*b1cdbd2cSJim Jagielski sal_Bool OJoinTableView::ScrollWhileDragging()
1139*b1cdbd2cSJim Jagielski {
1140*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1141*b1cdbd2cSJim Jagielski 	DBG_ASSERT(m_pDragWin != NULL, "OJoinTableView::ScrollWhileDragging darf nur waehrend Dragging eines Fensters aufgerufen werden !");
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski 	// den Timer schon mal killen
1144*b1cdbd2cSJim Jagielski 	if (m_aDragScrollTimer.IsActive())
1145*b1cdbd2cSJim Jagielski 		m_aDragScrollTimer.Stop();
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski 	Point aDragWinPos = m_ptPrevDraggingPos - m_aDragOffset;
1148*b1cdbd2cSJim Jagielski 	Size aDragWinSize = m_pDragWin->GetSizePixel();
1149*b1cdbd2cSJim Jagielski 	Point aLowerRight(aDragWinPos.X() + aDragWinSize.Width(), aDragWinPos.Y() + aDragWinSize.Height());
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski 	if (!m_bTrackingInitiallyMoved && (aDragWinPos == m_pDragWin->GetPosPixel()))
1152*b1cdbd2cSJim Jagielski 		return sal_True;
1153*b1cdbd2cSJim Jagielski 
1154*b1cdbd2cSJim Jagielski 	// Darstellungsfehler vermeiden (wenn bei aktivem TrackingRect gescrollt wird)
1155*b1cdbd2cSJim Jagielski 	HideTracking();
1156*b1cdbd2cSJim Jagielski 
1157*b1cdbd2cSJim Jagielski 	sal_Bool bScrolling = sal_False;
1158*b1cdbd2cSJim Jagielski 	sal_Bool bNeedScrollTimer = sal_False;
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski 	// An Fenstergrenzen scrollen
1161*b1cdbd2cSJim Jagielski 	// TODO : nur dann abfangen, wenn das Fenster komplett verschwinden wuerde (nicht, solange noch ein Pixel sichtbar ist)
1162*b1cdbd2cSJim Jagielski 	if( aDragWinPos.X() < 5 )
1163*b1cdbd2cSJim Jagielski 	{
1164*b1cdbd2cSJim Jagielski 		bScrolling = ScrollPane( -LINE_SIZE, sal_True, sal_True );
1165*b1cdbd2cSJim Jagielski 		if( !bScrolling && (aDragWinPos.X()<0) )
1166*b1cdbd2cSJim Jagielski 			aDragWinPos.X() = 0;
1167*b1cdbd2cSJim Jagielski 
1168*b1cdbd2cSJim Jagielski 		// brauche ich weiteres (timergesteuertes) Scrolling ?
1169*b1cdbd2cSJim Jagielski 		bNeedScrollTimer = bScrolling && (aDragWinPos.X() < 5);
1170*b1cdbd2cSJim Jagielski 	}
1171*b1cdbd2cSJim Jagielski 
1172*b1cdbd2cSJim Jagielski 	if( aLowerRight.X() > m_aOutputSize.Width() - 5 )
1173*b1cdbd2cSJim Jagielski 	{
1174*b1cdbd2cSJim Jagielski 		bScrolling = ScrollPane( LINE_SIZE, sal_True, sal_True ) ;
1175*b1cdbd2cSJim Jagielski 		if( !bScrolling && ( aLowerRight.X() > m_aOutputSize.Width() ) )
1176*b1cdbd2cSJim Jagielski 			aDragWinPos.X() = m_aOutputSize.Width() - aDragWinSize.Width();
1177*b1cdbd2cSJim Jagielski 
1178*b1cdbd2cSJim Jagielski 		// brauche ich weiteres (timergesteuertes) Scrolling ?
1179*b1cdbd2cSJim Jagielski 		bNeedScrollTimer = bScrolling && (aLowerRight.X() > m_aOutputSize.Width() - 5);
1180*b1cdbd2cSJim Jagielski 	}
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski 	if( aDragWinPos.Y() < 5 )
1183*b1cdbd2cSJim Jagielski 	{
1184*b1cdbd2cSJim Jagielski 		bScrolling = ScrollPane( -LINE_SIZE, sal_False, sal_True );
1185*b1cdbd2cSJim Jagielski 		if( !bScrolling && (aDragWinPos.Y()<0) )
1186*b1cdbd2cSJim Jagielski 			aDragWinPos.Y() = 0;
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski 		bNeedScrollTimer = bScrolling && (aDragWinPos.Y() < 5);
1189*b1cdbd2cSJim Jagielski 	}
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski 	if( aLowerRight.Y() > m_aOutputSize.Height() - 5 )
1192*b1cdbd2cSJim Jagielski 	{
1193*b1cdbd2cSJim Jagielski 		bScrolling = ScrollPane( LINE_SIZE, sal_False, sal_True );
1194*b1cdbd2cSJim Jagielski 		if( !bScrolling && ( (aDragWinPos.Y() + aDragWinSize.Height()) > m_aOutputSize.Height() ) )
1195*b1cdbd2cSJim Jagielski 			aDragWinPos.Y() =  m_aOutputSize.Height() - aDragWinSize.Height();
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 		bNeedScrollTimer = bScrolling && (aLowerRight.Y() > m_aOutputSize.Height() - 5);
1198*b1cdbd2cSJim Jagielski 	}
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski 	// Timer neu setzen, wenn noch notwendig
1201*b1cdbd2cSJim Jagielski 	if (bNeedScrollTimer)
1202*b1cdbd2cSJim Jagielski 	{
1203*b1cdbd2cSJim Jagielski 		m_aDragScrollTimer.SetTimeout(100);
1204*b1cdbd2cSJim Jagielski 		m_aDragScrollTimer.Start();
1205*b1cdbd2cSJim Jagielski 	}
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 	// das DraggingRect neu zeichnen
1208*b1cdbd2cSJim Jagielski 	m_aDragRect = Rectangle(m_ptPrevDraggingPos - m_aDragOffset, m_pDragWin->GetSizePixel());
1209*b1cdbd2cSJim Jagielski 	Update();
1210*b1cdbd2cSJim Jagielski 	ShowTracking( m_aDragRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW );
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski 	return bScrolling;
1213*b1cdbd2cSJim Jagielski }
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
IMPL_LINK(OJoinTableView,OnDragScrollTimer,void *,EMPTYARG)1216*b1cdbd2cSJim Jagielski IMPL_LINK(OJoinTableView, OnDragScrollTimer, void*, EMPTYARG)
1217*b1cdbd2cSJim Jagielski {
1218*b1cdbd2cSJim Jagielski 	ScrollWhileDragging();
1219*b1cdbd2cSJim Jagielski 	return 0L;
1220*b1cdbd2cSJim Jagielski }
1221*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
invalidateAndModify(SfxUndoAction * _pAction)1222*b1cdbd2cSJim Jagielski void OJoinTableView::invalidateAndModify(SfxUndoAction *_pAction)
1223*b1cdbd2cSJim Jagielski {
1224*b1cdbd2cSJim Jagielski 	Invalidate(INVALIDATE_NOCHILDREN);
1225*b1cdbd2cSJim Jagielski 	m_pView->getController().addUndoActionAndInvalidate(_pAction);
1226*b1cdbd2cSJim Jagielski }
1227*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
TabWinMoved(OTableWindow * ptWhich,const Point & ptOldPosition)1228*b1cdbd2cSJim Jagielski void OJoinTableView::TabWinMoved(OTableWindow* ptWhich, const Point& ptOldPosition)
1229*b1cdbd2cSJim Jagielski {
1230*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1231*b1cdbd2cSJim Jagielski 	Point ptThumbPos(GetHScrollBar()->GetThumbPos(), GetVScrollBar()->GetThumbPos());
1232*b1cdbd2cSJim Jagielski 	ptWhich->GetData()->SetPosition(ptWhich->GetPosPixel() + ptThumbPos);
1233*b1cdbd2cSJim Jagielski 
1234*b1cdbd2cSJim Jagielski 	invalidateAndModify(new OJoinMoveTabWinUndoAct(this, ptOldPosition, ptWhich));
1235*b1cdbd2cSJim Jagielski }
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
TabWinSized(OTableWindow * ptWhich,const Point & ptOldPosition,const Size & szOldSize)1238*b1cdbd2cSJim Jagielski void OJoinTableView::TabWinSized(OTableWindow* ptWhich, const Point& ptOldPosition, const Size& szOldSize)
1239*b1cdbd2cSJim Jagielski {
1240*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1241*b1cdbd2cSJim Jagielski 	ptWhich->GetData()->SetSize(ptWhich->GetSizePixel());
1242*b1cdbd2cSJim Jagielski 	ptWhich->GetData()->SetPosition(ptWhich->GetPosPixel());
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski 	invalidateAndModify(new OJoinSizeTabWinUndoAct(this, ptOldPosition, szOldSize, ptWhich));
1245*b1cdbd2cSJim Jagielski }
1246*b1cdbd2cSJim Jagielski 
1247*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsAddAllowed()1248*b1cdbd2cSJim Jagielski sal_Bool OJoinTableView::IsAddAllowed()
1249*b1cdbd2cSJim Jagielski {
1250*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 	// nicht wenn Db readonly
1253*b1cdbd2cSJim Jagielski 	if (m_pView->getController().isReadOnly())
1254*b1cdbd2cSJim Jagielski 		return sal_False;
1255*b1cdbd2cSJim Jagielski 
1256*b1cdbd2cSJim Jagielski 	try
1257*b1cdbd2cSJim Jagielski 	{
1258*b1cdbd2cSJim Jagielski 		Reference< XConnection> xConnection = m_pView->getController().getConnection();
1259*b1cdbd2cSJim Jagielski 		if(!xConnection.is())
1260*b1cdbd2cSJim Jagielski 			return sal_False;
1261*b1cdbd2cSJim Jagielski 		// nicht wenn schon zuviele Tabellen
1262*b1cdbd2cSJim Jagielski 		Reference < XDatabaseMetaData > xMetaData( xConnection->getMetaData() );
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski 		sal_Int32 nMax = xMetaData.is() ? xMetaData->getMaxTablesInSelect() : 0;
1265*b1cdbd2cSJim Jagielski 		if (nMax && nMax <= (sal_Int32)m_aTableMap.size())
1266*b1cdbd2cSJim Jagielski 			return sal_False;
1267*b1cdbd2cSJim Jagielski 	}
1268*b1cdbd2cSJim Jagielski 	catch(SQLException&)
1269*b1cdbd2cSJim Jagielski 	{
1270*b1cdbd2cSJim Jagielski 		return sal_False;
1271*b1cdbd2cSJim Jagielski 	}
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski 	// nicht wenn keine Joins moeglich
1274*b1cdbd2cSJim Jagielski //	if (!GetDatabase()->IsCapable(SDB_CAP_JOIN) && nMax <= GetTabWinCount())
1275*b1cdbd2cSJim Jagielski //		return sal_False;
1276*b1cdbd2cSJim Jagielski 
1277*b1cdbd2cSJim Jagielski 	return sal_True;
1278*b1cdbd2cSJim Jagielski }
1279*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
executePopup(const Point & _aPos,OTableConnection * _pSelConnection)1280*b1cdbd2cSJim Jagielski void OJoinTableView::executePopup(const Point& _aPos,OTableConnection* _pSelConnection)
1281*b1cdbd2cSJim Jagielski {
1282*b1cdbd2cSJim Jagielski 	PopupMenu aContextMenu( ModuleRes( RID_MENU_JOINVIEW_CONNECTION ) );
1283*b1cdbd2cSJim Jagielski 	switch (aContextMenu.Execute(this, _aPos))
1284*b1cdbd2cSJim Jagielski 	{
1285*b1cdbd2cSJim Jagielski 		case SID_DELETE:
1286*b1cdbd2cSJim Jagielski 			RemoveConnection( _pSelConnection ,sal_True);
1287*b1cdbd2cSJim Jagielski 			break;
1288*b1cdbd2cSJim Jagielski 		case ID_QUERY_EDIT_JOINCONNECTION:
1289*b1cdbd2cSJim Jagielski 			ConnDoubleClicked( _pSelConnection ); // is the same as double clicked
1290*b1cdbd2cSJim Jagielski 			break;
1291*b1cdbd2cSJim Jagielski 	}
1292*b1cdbd2cSJim Jagielski }
1293*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Command(const CommandEvent & rEvt)1294*b1cdbd2cSJim Jagielski void OJoinTableView::Command(const CommandEvent& rEvt)
1295*b1cdbd2cSJim Jagielski {
1296*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski 	sal_Bool bHandled = sal_False;
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski 	switch (rEvt.GetCommand())
1301*b1cdbd2cSJim Jagielski 	{
1302*b1cdbd2cSJim Jagielski 		case COMMAND_CONTEXTMENU:
1303*b1cdbd2cSJim Jagielski 		{
1304*b1cdbd2cSJim Jagielski 			if( m_vTableConnection.empty() )
1305*b1cdbd2cSJim Jagielski 				return;
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski 			OTableConnection* pSelConnection = GetSelectedConn();
1308*b1cdbd2cSJim Jagielski 			// when it wasn't a mouse event use the selected connection
1309*b1cdbd2cSJim Jagielski 			if (!rEvt.IsMouseEvent())
1310*b1cdbd2cSJim Jagielski 			{
1311*b1cdbd2cSJim Jagielski 				if( pSelConnection )
1312*b1cdbd2cSJim Jagielski 				{
1313*b1cdbd2cSJim Jagielski 					const ::std::vector<OConnectionLine*>* pLines = pSelConnection->GetConnLineList();
1314*b1cdbd2cSJim Jagielski 					::std::vector<OConnectionLine*>::const_iterator aIter = ::std::find_if(pLines->begin(),pLines->end(),::std::mem_fun(&OConnectionLine::IsValid));
1315*b1cdbd2cSJim Jagielski 					if( aIter != pLines->end() )
1316*b1cdbd2cSJim Jagielski 						executePopup((*aIter)->getMidPoint(),pSelConnection);
1317*b1cdbd2cSJim Jagielski 				}
1318*b1cdbd2cSJim Jagielski 			}
1319*b1cdbd2cSJim Jagielski 			else
1320*b1cdbd2cSJim Jagielski 			{
1321*b1cdbd2cSJim Jagielski 				DeselectConn(pSelConnection);
1322*b1cdbd2cSJim Jagielski 
1323*b1cdbd2cSJim Jagielski 				const Point& aMousePos = rEvt.GetMousePosPixel();
1324*b1cdbd2cSJim Jagielski 				::std::vector<OTableConnection*>::iterator aIter = m_vTableConnection.begin();
1325*b1cdbd2cSJim Jagielski                 ::std::vector<OTableConnection*>::iterator aEnd = m_vTableConnection.end();
1326*b1cdbd2cSJim Jagielski 	            for(;aIter != aEnd;++aIter)
1327*b1cdbd2cSJim Jagielski 				{
1328*b1cdbd2cSJim Jagielski 					if( (*aIter)->CheckHit(aMousePos) )
1329*b1cdbd2cSJim Jagielski 					{
1330*b1cdbd2cSJim Jagielski 						SelectConn(*aIter);
1331*b1cdbd2cSJim Jagielski 						if(!getDesignView()->getController().isReadOnly() && getDesignView()->getController().isConnected())
1332*b1cdbd2cSJim Jagielski 							executePopup(rEvt.GetMousePosPixel(),*aIter);
1333*b1cdbd2cSJim Jagielski 						break;
1334*b1cdbd2cSJim Jagielski 					}
1335*b1cdbd2cSJim Jagielski 				}
1336*b1cdbd2cSJim Jagielski 			}
1337*b1cdbd2cSJim Jagielski 			bHandled = sal_True;
1338*b1cdbd2cSJim Jagielski 		}
1339*b1cdbd2cSJim Jagielski 	}
1340*b1cdbd2cSJim Jagielski 	if (!bHandled)
1341*b1cdbd2cSJim Jagielski 		Window::Command(rEvt);
1342*b1cdbd2cSJim Jagielski }
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetTabConn(const OTableWindow * pLhs,const OTableWindow * pRhs,bool _bSupressCrossOrNaturalJoin,const OTableConnection * _rpFirstAfter) const1345*b1cdbd2cSJim Jagielski OTableConnection* OJoinTableView::GetTabConn(const OTableWindow* pLhs,const OTableWindow* pRhs,bool _bSupressCrossOrNaturalJoin,const OTableConnection* _rpFirstAfter) const
1346*b1cdbd2cSJim Jagielski {
1347*b1cdbd2cSJim Jagielski 	OTableConnection* pConn = NULL;
1348*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pRhs || pLhs, "OJoinTableView::GetTabConn : invalid args !");
1349*b1cdbd2cSJim Jagielski 		// only one NULL-arg allowed
1350*b1cdbd2cSJim Jagielski 
1351*b1cdbd2cSJim Jagielski 	if ((!pLhs || pLhs->ExistsAConn()) && (!pRhs || pRhs->ExistsAConn()))
1352*b1cdbd2cSJim Jagielski 	{
1353*b1cdbd2cSJim Jagielski 		sal_Bool bFoundStart = _rpFirstAfter ? sal_False : sal_True;
1354*b1cdbd2cSJim Jagielski 
1355*b1cdbd2cSJim Jagielski 		::std::vector<OTableConnection*>::const_iterator aIter = m_vTableConnection.begin();
1356*b1cdbd2cSJim Jagielski         ::std::vector<OTableConnection*>::const_iterator aEnd = m_vTableConnection.end();
1357*b1cdbd2cSJim Jagielski 	    for(;aIter != aEnd;++aIter)
1358*b1cdbd2cSJim Jagielski 		{
1359*b1cdbd2cSJim Jagielski 			OTableConnection* pData = *aIter;
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski 			if	(	(	(pData->GetSourceWin() == pLhs)
1362*b1cdbd2cSJim Jagielski 					&&	(	(pData->GetDestWin() == pRhs)
1363*b1cdbd2cSJim Jagielski 						||	(NULL == pRhs)
1364*b1cdbd2cSJim Jagielski 						)
1365*b1cdbd2cSJim Jagielski 					)
1366*b1cdbd2cSJim Jagielski 				||	(	(pData->GetSourceWin() == pRhs)
1367*b1cdbd2cSJim Jagielski 					&&	(	(pData->GetDestWin() == pLhs)
1368*b1cdbd2cSJim Jagielski 						||	(NULL == pLhs)
1369*b1cdbd2cSJim Jagielski 						)
1370*b1cdbd2cSJim Jagielski 					)
1371*b1cdbd2cSJim Jagielski 				)
1372*b1cdbd2cSJim Jagielski 			{
1373*b1cdbd2cSJim Jagielski                 if ( _bSupressCrossOrNaturalJoin )
1374*b1cdbd2cSJim Jagielski                 {
1375*b1cdbd2cSJim Jagielski                     if ( supressCrossNaturalJoin(pData->GetData()) )
1376*b1cdbd2cSJim Jagielski                         continue;
1377*b1cdbd2cSJim Jagielski                 }
1378*b1cdbd2cSJim Jagielski 				if (bFoundStart)
1379*b1cdbd2cSJim Jagielski 				{
1380*b1cdbd2cSJim Jagielski 					pConn = pData;
1381*b1cdbd2cSJim Jagielski 					break;
1382*b1cdbd2cSJim Jagielski 				}
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski 				if (!pConn)
1385*b1cdbd2cSJim Jagielski 					// used as fallback : if there is no conn after _rpFirstAfter the first conn between the two tables
1386*b1cdbd2cSJim Jagielski 					// will be used
1387*b1cdbd2cSJim Jagielski 					pConn = pData;
1388*b1cdbd2cSJim Jagielski 
1389*b1cdbd2cSJim Jagielski 				if (pData == _rpFirstAfter)
1390*b1cdbd2cSJim Jagielski 					bFoundStart = sal_True;
1391*b1cdbd2cSJim Jagielski 			}
1392*b1cdbd2cSJim Jagielski 		}
1393*b1cdbd2cSJim Jagielski 	}
1394*b1cdbd2cSJim Jagielski 	return pConn;
1395*b1cdbd2cSJim Jagielski }
1396*b1cdbd2cSJim Jagielski 
1397*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
PreNotify(NotifyEvent & rNEvt)1398*b1cdbd2cSJim Jagielski long OJoinTableView::PreNotify(NotifyEvent& rNEvt)
1399*b1cdbd2cSJim Jagielski {
1400*b1cdbd2cSJim Jagielski 	sal_Bool bHandled = sal_False;
1401*b1cdbd2cSJim Jagielski 	switch (rNEvt.GetType())
1402*b1cdbd2cSJim Jagielski 	{
1403*b1cdbd2cSJim Jagielski 		case EVENT_COMMAND:
1404*b1cdbd2cSJim Jagielski 		{
1405*b1cdbd2cSJim Jagielski 			const CommandEvent* pCommand = rNEvt.GetCommandEvent();
1406*b1cdbd2cSJim Jagielski 			if (pCommand->GetCommand() == COMMAND_WHEEL)
1407*b1cdbd2cSJim Jagielski 			{
1408*b1cdbd2cSJim Jagielski 				const CommandWheelData* pData = rNEvt.GetCommandEvent()->GetWheelData();
1409*b1cdbd2cSJim Jagielski 				if (pData->GetMode() == COMMAND_WHEEL_SCROLL)
1410*b1cdbd2cSJim Jagielski 				{
1411*b1cdbd2cSJim Jagielski 					if (pData->GetDelta() > 0)
1412*b1cdbd2cSJim Jagielski 						ScrollPane(-10 * pData->GetScrollLines(), pData->IsHorz(), sal_True);
1413*b1cdbd2cSJim Jagielski 					else
1414*b1cdbd2cSJim Jagielski 						ScrollPane(10 * pData->GetScrollLines(), pData->IsHorz(), sal_True);
1415*b1cdbd2cSJim Jagielski 					bHandled = sal_True;
1416*b1cdbd2cSJim Jagielski 				}
1417*b1cdbd2cSJim Jagielski 			}
1418*b1cdbd2cSJim Jagielski 		}
1419*b1cdbd2cSJim Jagielski 		break;
1420*b1cdbd2cSJim Jagielski 		case EVENT_KEYINPUT:
1421*b1cdbd2cSJim Jagielski 		{
1422*b1cdbd2cSJim Jagielski 			if (m_aTableMap.empty())
1423*b1cdbd2cSJim Jagielski 				// no tab wins -> no conns -> no traveling
1424*b1cdbd2cSJim Jagielski 				break;
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski 			const KeyEvent* pKeyEvent =	rNEvt.GetKeyEvent();
1427*b1cdbd2cSJim Jagielski 			if (!pKeyEvent->GetKeyCode().IsMod1())
1428*b1cdbd2cSJim Jagielski 			{
1429*b1cdbd2cSJim Jagielski 				switch (pKeyEvent->GetKeyCode().GetCode())
1430*b1cdbd2cSJim Jagielski 				{
1431*b1cdbd2cSJim Jagielski 					case KEY_TAB:
1432*b1cdbd2cSJim Jagielski 					{
1433*b1cdbd2cSJim Jagielski 						if (!HasChildPathFocus())
1434*b1cdbd2cSJim Jagielski 							break;
1435*b1cdbd2cSJim Jagielski 
1436*b1cdbd2cSJim Jagielski 						sal_Bool bForward = !pKeyEvent->GetKeyCode().IsShift();
1437*b1cdbd2cSJim Jagielski 						// is there an active tab win ?
1438*b1cdbd2cSJim Jagielski 						OTableWindowMapIterator aIter = m_aTableMap.begin();
1439*b1cdbd2cSJim Jagielski                         OTableWindowMapIterator aEnd = m_aTableMap.end();
1440*b1cdbd2cSJim Jagielski 						for(;aIter != aEnd;++aIter)
1441*b1cdbd2cSJim Jagielski 							if (aIter->second && aIter->second->HasChildPathFocus())
1442*b1cdbd2cSJim Jagielski 								break;
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski 						OTableWindow* pNextWin = NULL;
1445*b1cdbd2cSJim Jagielski 						OTableConnection* pNextConn = NULL;
1446*b1cdbd2cSJim Jagielski 
1447*b1cdbd2cSJim Jagielski 						if (aIter != m_aTableMap.end())
1448*b1cdbd2cSJim Jagielski 						{	// there is a currently active tab win
1449*b1cdbd2cSJim Jagielski 							// check if there is an "overflow" and we should select a conn instead of a win
1450*b1cdbd2cSJim Jagielski 							if (!m_vTableConnection.empty())
1451*b1cdbd2cSJim Jagielski 							{
1452*b1cdbd2cSJim Jagielski 								if ((aIter->second == m_aTableMap.rbegin()->second) && bForward)
1453*b1cdbd2cSJim Jagielski 									// the last win is active and we're travelling forward -> select the first conn
1454*b1cdbd2cSJim Jagielski 									pNextConn = *m_vTableConnection.begin();
1455*b1cdbd2cSJim Jagielski 								if ((aIter == m_aTableMap.begin()) && !bForward)
1456*b1cdbd2cSJim Jagielski 									// the first win is active an we're traveling backward -> select the last conn
1457*b1cdbd2cSJim Jagielski 									pNextConn = *m_vTableConnection.rbegin();
1458*b1cdbd2cSJim Jagielski 							}
1459*b1cdbd2cSJim Jagielski 
1460*b1cdbd2cSJim Jagielski 							if (!pNextConn)
1461*b1cdbd2cSJim Jagielski 							{
1462*b1cdbd2cSJim Jagielski 								// no conn for any reason -> select the next or previous tab win
1463*b1cdbd2cSJim Jagielski 								if(bForward)
1464*b1cdbd2cSJim Jagielski 								{
1465*b1cdbd2cSJim Jagielski 									if( aIter->second == m_aTableMap.rbegin()->second)
1466*b1cdbd2cSJim Jagielski 										pNextWin = m_aTableMap.begin()->second;
1467*b1cdbd2cSJim Jagielski 									else
1468*b1cdbd2cSJim Jagielski 									{
1469*b1cdbd2cSJim Jagielski 										++aIter;
1470*b1cdbd2cSJim Jagielski 										pNextWin = aIter->second;
1471*b1cdbd2cSJim Jagielski 									}
1472*b1cdbd2cSJim Jagielski 								}
1473*b1cdbd2cSJim Jagielski 								else
1474*b1cdbd2cSJim Jagielski 								{
1475*b1cdbd2cSJim Jagielski 									if (aIter == m_aTableMap.begin())
1476*b1cdbd2cSJim Jagielski 										pNextWin = m_aTableMap.rbegin()->second;
1477*b1cdbd2cSJim Jagielski 									else
1478*b1cdbd2cSJim Jagielski 									{
1479*b1cdbd2cSJim Jagielski 										--aIter;
1480*b1cdbd2cSJim Jagielski 										pNextWin = aIter->second;
1481*b1cdbd2cSJim Jagielski 									}
1482*b1cdbd2cSJim Jagielski 								}
1483*b1cdbd2cSJim Jagielski 							}
1484*b1cdbd2cSJim Jagielski 						}
1485*b1cdbd2cSJim Jagielski 						else
1486*b1cdbd2cSJim Jagielski 						{	// no active tab win -> travel the connections
1487*b1cdbd2cSJim Jagielski 							// find the currently selected conn within the conn list
1488*b1cdbd2cSJim Jagielski 							sal_Int32 i(0);
1489*b1cdbd2cSJim Jagielski 							for (   ::std::vector<OTableConnection*>::iterator connectionIter = m_vTableConnection.begin();
1490*b1cdbd2cSJim Jagielski                                     connectionIter != m_vTableConnection.end();
1491*b1cdbd2cSJim Jagielski                                     ++connectionIter, ++i
1492*b1cdbd2cSJim Jagielski                                 )
1493*b1cdbd2cSJim Jagielski 							{
1494*b1cdbd2cSJim Jagielski 								if ( (*connectionIter) == GetSelectedConn() )
1495*b1cdbd2cSJim Jagielski 									break;
1496*b1cdbd2cSJim Jagielski 							}
1497*b1cdbd2cSJim Jagielski 							if (i == sal_Int32(m_vTableConnection.size() - 1) && bForward)
1498*b1cdbd2cSJim Jagielski 								// the last conn is active and we're travelling forward -> select the first win
1499*b1cdbd2cSJim Jagielski 								pNextWin = m_aTableMap.begin()->second;
1500*b1cdbd2cSJim Jagielski 							if ((i == 0) && !bForward && !m_aTableMap.empty())
1501*b1cdbd2cSJim Jagielski 								// the first conn is active and we're travelling backward -> select the last win
1502*b1cdbd2cSJim Jagielski 								pNextWin = m_aTableMap.rbegin()->second;
1503*b1cdbd2cSJim Jagielski 
1504*b1cdbd2cSJim Jagielski 							if (pNextWin)
1505*b1cdbd2cSJim Jagielski 								DeselectConn(GetSelectedConn());
1506*b1cdbd2cSJim Jagielski 							else
1507*b1cdbd2cSJim Jagielski 								// no win for any reason -> select the next or previous conn
1508*b1cdbd2cSJim Jagielski 								if (i < (sal_Int32)m_vTableConnection.size())
1509*b1cdbd2cSJim Jagielski 									// there is a currently active conn
1510*b1cdbd2cSJim Jagielski 									pNextConn = m_vTableConnection[(i + (bForward ? 1 : m_vTableConnection.size() - 1)) % m_vTableConnection.size()];
1511*b1cdbd2cSJim Jagielski 								else
1512*b1cdbd2cSJim Jagielski 								{	// no tab win selected, no conn selected
1513*b1cdbd2cSJim Jagielski 									if (!m_vTableConnection.empty())
1514*b1cdbd2cSJim Jagielski 										pNextConn = m_vTableConnection[bForward ? 0 : m_vTableConnection.size() - 1];
1515*b1cdbd2cSJim Jagielski 									else if (!m_aTableMap.empty())
1516*b1cdbd2cSJim Jagielski 									{
1517*b1cdbd2cSJim Jagielski 										if(bForward)
1518*b1cdbd2cSJim Jagielski 											pNextWin = m_aTableMap.begin()->second;
1519*b1cdbd2cSJim Jagielski 										else
1520*b1cdbd2cSJim Jagielski 											pNextWin = m_aTableMap.rbegin()->second;
1521*b1cdbd2cSJim Jagielski 									}
1522*b1cdbd2cSJim Jagielski 								}
1523*b1cdbd2cSJim Jagielski 						}
1524*b1cdbd2cSJim Jagielski 
1525*b1cdbd2cSJim Jagielski 						// now select the object
1526*b1cdbd2cSJim Jagielski 						if (pNextWin)
1527*b1cdbd2cSJim Jagielski 						{
1528*b1cdbd2cSJim Jagielski 							if (pNextWin->GetListBox())
1529*b1cdbd2cSJim Jagielski 								pNextWin->GetListBox()->GrabFocus();
1530*b1cdbd2cSJim Jagielski 							else
1531*b1cdbd2cSJim Jagielski 								pNextWin->GrabFocus();
1532*b1cdbd2cSJim Jagielski 							EnsureVisible(pNextWin);
1533*b1cdbd2cSJim Jagielski 						}
1534*b1cdbd2cSJim Jagielski 						else if (pNextConn)
1535*b1cdbd2cSJim Jagielski 						{
1536*b1cdbd2cSJim Jagielski 							GrabFocus();
1537*b1cdbd2cSJim Jagielski 								// neccessary : a conn may be selected even if a tab win has the focus, in this case
1538*b1cdbd2cSJim Jagielski 								// the next travel would select the same conn again if we would not reset te focus ...
1539*b1cdbd2cSJim Jagielski 							SelectConn(pNextConn);
1540*b1cdbd2cSJim Jagielski 						}
1541*b1cdbd2cSJim Jagielski 					}
1542*b1cdbd2cSJim Jagielski 					break;
1543*b1cdbd2cSJim Jagielski 					case KEY_RETURN:
1544*b1cdbd2cSJim Jagielski 					{
1545*b1cdbd2cSJim Jagielski 						if (!pKeyEvent->GetKeyCode().IsShift() && GetSelectedConn() && HasFocus())
1546*b1cdbd2cSJim Jagielski 							ConnDoubleClicked(GetSelectedConn());
1547*b1cdbd2cSJim Jagielski 						break;
1548*b1cdbd2cSJim Jagielski 					}
1549*b1cdbd2cSJim Jagielski 				}
1550*b1cdbd2cSJim Jagielski 			}
1551*b1cdbd2cSJim Jagielski 		}
1552*b1cdbd2cSJim Jagielski 		break;
1553*b1cdbd2cSJim Jagielski 		case EVENT_GETFOCUS:
1554*b1cdbd2cSJim Jagielski 		{
1555*b1cdbd2cSJim Jagielski 			if (m_aTableMap.empty())
1556*b1cdbd2cSJim Jagielski 				// no tab wins -> no conns -> no focus change
1557*b1cdbd2cSJim Jagielski 				break;
1558*b1cdbd2cSJim Jagielski 			Window* pSource = rNEvt.GetWindow();
1559*b1cdbd2cSJim Jagielski 			if (pSource)
1560*b1cdbd2cSJim Jagielski 			{
1561*b1cdbd2cSJim Jagielski 				Window* pSearchFor = NULL;
1562*b1cdbd2cSJim Jagielski 				if (pSource->GetParent() == this)
1563*b1cdbd2cSJim Jagielski 					// it may be one of the tab wins
1564*b1cdbd2cSJim Jagielski 					pSearchFor = pSource;
1565*b1cdbd2cSJim Jagielski 				else if (pSource->GetParent() && (pSource->GetParent()->GetParent() == this))
1566*b1cdbd2cSJim Jagielski 					// it may be one of th list boxes of one of the tab wins
1567*b1cdbd2cSJim Jagielski 					pSearchFor = pSource->GetParent();
1568*b1cdbd2cSJim Jagielski 
1569*b1cdbd2cSJim Jagielski 				if (pSearchFor)
1570*b1cdbd2cSJim Jagielski 				{
1571*b1cdbd2cSJim Jagielski 					OTableWindowMapIterator aIter = m_aTableMap.begin();
1572*b1cdbd2cSJim Jagielski                     OTableWindowMapIterator aEnd = m_aTableMap.end();
1573*b1cdbd2cSJim Jagielski 					for(;aIter != aEnd;++aIter)
1574*b1cdbd2cSJim Jagielski 					{
1575*b1cdbd2cSJim Jagielski 						if (aIter->second == pSearchFor)
1576*b1cdbd2cSJim Jagielski 						{
1577*b1cdbd2cSJim Jagielski 							m_pLastFocusTabWin = aIter->second;
1578*b1cdbd2cSJim Jagielski 							break;
1579*b1cdbd2cSJim Jagielski 						}
1580*b1cdbd2cSJim Jagielski 					}
1581*b1cdbd2cSJim Jagielski 				}
1582*b1cdbd2cSJim Jagielski 			}
1583*b1cdbd2cSJim Jagielski 		}
1584*b1cdbd2cSJim Jagielski 		break;
1585*b1cdbd2cSJim Jagielski 	}
1586*b1cdbd2cSJim Jagielski 
1587*b1cdbd2cSJim Jagielski 	if (!bHandled)
1588*b1cdbd2cSJim Jagielski 		return Window::PreNotify(rNEvt);
1589*b1cdbd2cSJim Jagielski 	return 1L;
1590*b1cdbd2cSJim Jagielski }
1591*b1cdbd2cSJim Jagielski 
1592*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GrabTabWinFocus()1593*b1cdbd2cSJim Jagielski void OJoinTableView::GrabTabWinFocus()
1594*b1cdbd2cSJim Jagielski {
1595*b1cdbd2cSJim Jagielski 	if (m_pLastFocusTabWin && m_pLastFocusTabWin->IsVisible())
1596*b1cdbd2cSJim Jagielski 	{
1597*b1cdbd2cSJim Jagielski 		if (m_pLastFocusTabWin->GetListBox())
1598*b1cdbd2cSJim Jagielski 			m_pLastFocusTabWin->GetListBox()->GrabFocus();
1599*b1cdbd2cSJim Jagielski 		else
1600*b1cdbd2cSJim Jagielski 			m_pLastFocusTabWin->GrabFocus();
1601*b1cdbd2cSJim Jagielski 	}
1602*b1cdbd2cSJim Jagielski 	else if (!m_aTableMap.empty() && m_aTableMap.begin()->second && m_aTableMap.begin()->second->IsVisible())
1603*b1cdbd2cSJim Jagielski 	{
1604*b1cdbd2cSJim Jagielski 		OTableWindow* pFirstWin = m_aTableMap.begin()->second;
1605*b1cdbd2cSJim Jagielski 		if (pFirstWin->GetListBox())
1606*b1cdbd2cSJim Jagielski 			pFirstWin->GetListBox()->GrabFocus();
1607*b1cdbd2cSJim Jagielski 		else
1608*b1cdbd2cSJim Jagielski 			pFirstWin->GrabFocus();
1609*b1cdbd2cSJim Jagielski 	}
1610*b1cdbd2cSJim Jagielski }
1611*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
StateChanged(StateChangedType nType)1612*b1cdbd2cSJim Jagielski void OJoinTableView::StateChanged( StateChangedType nType )
1613*b1cdbd2cSJim Jagielski {
1614*b1cdbd2cSJim Jagielski 	Window::StateChanged( nType );
1615*b1cdbd2cSJim Jagielski 
1616*b1cdbd2cSJim Jagielski 	if ( nType == STATE_CHANGE_ZOOM )
1617*b1cdbd2cSJim Jagielski 	{
1618*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1619*b1cdbd2cSJim Jagielski 
1620*b1cdbd2cSJim Jagielski 		Font aFont = rStyleSettings.GetGroupFont();
1621*b1cdbd2cSJim Jagielski 		if ( IsControlFont() )
1622*b1cdbd2cSJim Jagielski 			aFont.Merge( GetControlFont() );
1623*b1cdbd2cSJim Jagielski 		SetZoomedPointFont( aFont );
1624*b1cdbd2cSJim Jagielski 
1625*b1cdbd2cSJim Jagielski 		OTableWindowMapIterator aIter = m_aTableMap.begin();
1626*b1cdbd2cSJim Jagielski 		OTableWindowMapIterator aEnd = m_aTableMap.end();
1627*b1cdbd2cSJim Jagielski 		for(;aIter != aEnd;++aIter)
1628*b1cdbd2cSJim Jagielski 		{
1629*b1cdbd2cSJim Jagielski 			aIter->second->SetZoom(GetZoom());
1630*b1cdbd2cSJim Jagielski 			Size aSize(CalcZoom(aIter->second->GetSizePixel().Width()),CalcZoom(aIter->second->GetSizePixel().Height()));
1631*b1cdbd2cSJim Jagielski 			aIter->second->SetSizePixel(aSize);
1632*b1cdbd2cSJim Jagielski 		}
1633*b1cdbd2cSJim Jagielski 		Resize();
1634*b1cdbd2cSJim Jagielski 	}
1635*b1cdbd2cSJim Jagielski }
1636*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
HideTabWins()1637*b1cdbd2cSJim Jagielski void OJoinTableView::HideTabWins()
1638*b1cdbd2cSJim Jagielski {
1639*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OJoinTableView,NULL);
1640*b1cdbd2cSJim Jagielski 	SetUpdateMode(sal_False);
1641*b1cdbd2cSJim Jagielski 
1642*b1cdbd2cSJim Jagielski 	OTableWindowMap* pTabWins = GetTabWinMap();
1643*b1cdbd2cSJim Jagielski 	if ( pTabWins )
1644*b1cdbd2cSJim Jagielski 	{
1645*b1cdbd2cSJim Jagielski         // working on a copy because the real list will be cleared in inner calls
1646*b1cdbd2cSJim Jagielski         OTableWindowMap aCopy(*pTabWins);
1647*b1cdbd2cSJim Jagielski 		OTableWindowMap::iterator aIter = aCopy.begin();
1648*b1cdbd2cSJim Jagielski         OTableWindowMap::iterator aEnd = aCopy.end();
1649*b1cdbd2cSJim Jagielski 		for(;aIter != aEnd;++aIter)
1650*b1cdbd2cSJim Jagielski 			RemoveTabWin(aIter->second);
1651*b1cdbd2cSJim Jagielski 	}
1652*b1cdbd2cSJim Jagielski 
1653*b1cdbd2cSJim Jagielski 	m_pView->getController().setModified(sal_True);
1654*b1cdbd2cSJim Jagielski 
1655*b1cdbd2cSJim Jagielski 	SetUpdateMode(sal_True);
1656*b1cdbd2cSJim Jagielski 
1657*b1cdbd2cSJim Jagielski }
1658*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
AcceptDrop(const AcceptDropEvent &)1659*b1cdbd2cSJim Jagielski sal_Int8 OJoinTableView::AcceptDrop( const AcceptDropEvent& /*_rEvt*/ )
1660*b1cdbd2cSJim Jagielski {
1661*b1cdbd2cSJim Jagielski 	return DND_ACTION_NONE;
1662*b1cdbd2cSJim Jagielski }
1663*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
ExecuteDrop(const ExecuteDropEvent &)1664*b1cdbd2cSJim Jagielski sal_Int8 OJoinTableView::ExecuteDrop( const ExecuteDropEvent& /*_rEvt*/ )
1665*b1cdbd2cSJim Jagielski {
1666*b1cdbd2cSJim Jagielski 	return DND_ACTION_NONE;
1667*b1cdbd2cSJim Jagielski }
1668*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
dragFinished()1669*b1cdbd2cSJim Jagielski void OJoinTableView::dragFinished( )
1670*b1cdbd2cSJim Jagielski {
1671*b1cdbd2cSJim Jagielski }
1672*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
StartDrag(sal_Int8,const Point &)1673*b1cdbd2cSJim Jagielski void OJoinTableView::StartDrag( sal_Int8 /*nAction*/, const Point& /*rPosPixel*/ )
1674*b1cdbd2cSJim Jagielski {
1675*b1cdbd2cSJim Jagielski }
1676*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
clearLayoutInformation()1677*b1cdbd2cSJim Jagielski void OJoinTableView::clearLayoutInformation()
1678*b1cdbd2cSJim Jagielski {
1679*b1cdbd2cSJim Jagielski 	m_pLastFocusTabWin	= NULL;
1680*b1cdbd2cSJim Jagielski 	m_pSelectedConn		= NULL;
1681*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1682*b1cdbd2cSJim Jagielski 	// Listen loeschen
1683*b1cdbd2cSJim Jagielski 	OTableWindowMapIterator aIter = m_aTableMap.begin();
1684*b1cdbd2cSJim Jagielski 	OTableWindowMapIterator aEnd  = m_aTableMap.end();
1685*b1cdbd2cSJim Jagielski 	for(;aIter != aEnd;++aIter)
1686*b1cdbd2cSJim Jagielski 	{
1687*b1cdbd2cSJim Jagielski 		if ( aIter->second )
1688*b1cdbd2cSJim Jagielski 			aIter->second->clearListBox();
1689*b1cdbd2cSJim Jagielski 		::std::auto_ptr<Window> aTemp(aIter->second);
1690*b1cdbd2cSJim Jagielski 		aIter->second = NULL;
1691*b1cdbd2cSJim Jagielski 	}
1692*b1cdbd2cSJim Jagielski 
1693*b1cdbd2cSJim Jagielski 	m_aTableMap.clear();
1694*b1cdbd2cSJim Jagielski 
1695*b1cdbd2cSJim Jagielski 	::std::vector<OTableConnection*>::const_iterator aIter2 = m_vTableConnection.begin();
1696*b1cdbd2cSJim Jagielski     ::std::vector<OTableConnection*>::const_iterator aEnd2 = m_vTableConnection.end();
1697*b1cdbd2cSJim Jagielski 	for(;aIter2 != aEnd2;++aIter2)
1698*b1cdbd2cSJim Jagielski 		delete *aIter2;
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski 	m_vTableConnection.clear();
1701*b1cdbd2cSJim Jagielski }
1702*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
lookForUiActivities()1703*b1cdbd2cSJim Jagielski void OJoinTableView::lookForUiActivities()
1704*b1cdbd2cSJim Jagielski {
1705*b1cdbd2cSJim Jagielski }
1706*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
LoseFocus()1707*b1cdbd2cSJim Jagielski void OJoinTableView::LoseFocus()
1708*b1cdbd2cSJim Jagielski {
1709*b1cdbd2cSJim Jagielski 	DeselectConn(GetSelectedConn());
1710*b1cdbd2cSJim Jagielski 	Window::LoseFocus();
1711*b1cdbd2cSJim Jagielski }
1712*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetFocus()1713*b1cdbd2cSJim Jagielski void OJoinTableView::GetFocus()
1714*b1cdbd2cSJim Jagielski {
1715*b1cdbd2cSJim Jagielski 	Window::GetFocus();
1716*b1cdbd2cSJim Jagielski 	if ( !m_aTableMap.empty() && !GetSelectedConn() )
1717*b1cdbd2cSJim Jagielski 		GrabTabWinFocus();
1718*b1cdbd2cSJim Jagielski }
1719*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
CreateAccessible()1720*b1cdbd2cSJim Jagielski Reference< XAccessible > OJoinTableView::CreateAccessible()
1721*b1cdbd2cSJim Jagielski {
1722*b1cdbd2cSJim Jagielski 	m_pAccessible = new OJoinDesignViewAccess(this);
1723*b1cdbd2cSJim Jagielski 	return m_pAccessible;
1724*b1cdbd2cSJim Jagielski }
1725*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
modified()1726*b1cdbd2cSJim Jagielski void OJoinTableView::modified()
1727*b1cdbd2cSJim Jagielski {
1728*b1cdbd2cSJim Jagielski 	OJoinController& rController = m_pView->getController();
1729*b1cdbd2cSJim Jagielski 	rController.setModified( sal_True );
1730*b1cdbd2cSJim Jagielski 	rController.InvalidateFeature(ID_BROWSER_ADDTABLE);
1731*b1cdbd2cSJim Jagielski 	rController.InvalidateFeature(SID_RELATION_ADD_RELATION);
1732*b1cdbd2cSJim Jagielski }
1733*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
addConnection(OTableConnection * _pConnection,sal_Bool _bAddData)1734*b1cdbd2cSJim Jagielski void OJoinTableView::addConnection(OTableConnection* _pConnection,sal_Bool _bAddData)
1735*b1cdbd2cSJim Jagielski {
1736*b1cdbd2cSJim Jagielski 	if ( _bAddData )
1737*b1cdbd2cSJim Jagielski 	{
1738*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
1739*b1cdbd2cSJim Jagielski 		TTableConnectionData* pTabConnDataList = m_pView->getController().getTableConnectionData();
1740*b1cdbd2cSJim Jagielski 		OSL_ENSURE( ::std::find(pTabConnDataList->begin(),pTabConnDataList->end(),_pConnection->GetData()) == pTabConnDataList->end(),"Data already in vector!");
1741*b1cdbd2cSJim Jagielski #endif
1742*b1cdbd2cSJim Jagielski 		m_pView->getController().getTableConnectionData()->push_back(_pConnection->GetData());
1743*b1cdbd2cSJim Jagielski 	}
1744*b1cdbd2cSJim Jagielski 	m_vTableConnection.push_back(_pConnection);
1745*b1cdbd2cSJim Jagielski 	_pConnection->RecalcLines();
1746*b1cdbd2cSJim Jagielski 	_pConnection->InvalidateConnection();
1747*b1cdbd2cSJim Jagielski 
1748*b1cdbd2cSJim Jagielski 	modified();
1749*b1cdbd2cSJim Jagielski 	if ( m_pAccessible )
1750*b1cdbd2cSJim Jagielski 		m_pAccessible->notifyAccessibleEvent(	AccessibleEventId::CHILD,
1751*b1cdbd2cSJim Jagielski 												Any(),
1752*b1cdbd2cSJim Jagielski 												makeAny(_pConnection->GetAccessible()));
1753*b1cdbd2cSJim Jagielski }
1754*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
allowQueries() const1755*b1cdbd2cSJim Jagielski bool OJoinTableView::allowQueries() const
1756*b1cdbd2cSJim Jagielski {
1757*b1cdbd2cSJim Jagielski     return true;
1758*b1cdbd2cSJim Jagielski }
1759*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onNoColumns_throw()1760*b1cdbd2cSJim Jagielski void OJoinTableView::onNoColumns_throw()
1761*b1cdbd2cSJim Jagielski {
1762*b1cdbd2cSJim Jagielski     OSL_ENSURE( false, "OTableWindow::onNoColumns_throw: cannot really handle this!" );
1763*b1cdbd2cSJim Jagielski     throw SQLException();
1764*b1cdbd2cSJim Jagielski }
1765*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
supressCrossNaturalJoin(const TTableConnectionData::value_type &) const1766*b1cdbd2cSJim Jagielski bool OJoinTableView::supressCrossNaturalJoin(const TTableConnectionData::value_type& ) const
1767*b1cdbd2cSJim Jagielski {
1768*b1cdbd2cSJim Jagielski     return false;
1769*b1cdbd2cSJim Jagielski }
1770