xref: /AOO41X/main/dbaccess/source/ui/querydesign/TableWindow.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
30*cdf0e10cSrcweir #ifndef DBAUI_TABLEWINDOW_HXX
31*cdf0e10cSrcweir #include "TableWindow.hxx"
32*cdf0e10cSrcweir #endif
33*cdf0e10cSrcweir #ifndef DBAUI_TABLEWINDOWLISTBOX_HXX
34*cdf0e10cSrcweir #include "TableWindowListBox.hxx"
35*cdf0e10cSrcweir #endif
36*cdf0e10cSrcweir #ifndef DBAUI_QUERYTABLEVIEW_HXX
37*cdf0e10cSrcweir #include "QueryTableView.hxx"
38*cdf0e10cSrcweir #endif
39*cdf0e10cSrcweir #ifndef DBAUI_QUERYDESIGNVIEW_HXX
40*cdf0e10cSrcweir #include "QueryDesignView.hxx"
41*cdf0e10cSrcweir #endif
42*cdf0e10cSrcweir #ifndef DBAUI_TABLEWINDOWDATA_HXX
43*cdf0e10cSrcweir #include "TableWindowData.hxx"
44*cdf0e10cSrcweir #endif
45*cdf0e10cSrcweir #ifndef DBACCESS_IMAGEPROVIDER_HXX
46*cdf0e10cSrcweir #include "imageprovider.hxx"
47*cdf0e10cSrcweir #endif
48*cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX
49*cdf0e10cSrcweir #include <tools/debug.hxx>
50*cdf0e10cSrcweir #endif
51*cdf0e10cSrcweir #ifndef TOOLS_DIAGNOSE_EX_H
52*cdf0e10cSrcweir #include <tools/diagnose_ex.h>
53*cdf0e10cSrcweir #endif
54*cdf0e10cSrcweir #ifndef _SV_SVAPP_HXX
55*cdf0e10cSrcweir #include <vcl/svapp.hxx>
56*cdf0e10cSrcweir #endif
57*cdf0e10cSrcweir #ifndef _SV_WALL_HXX
58*cdf0e10cSrcweir #include <vcl/wall.hxx>
59*cdf0e10cSrcweir #endif
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
62*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
63*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
64*cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
65*cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
66*cdf0e10cSrcweir #include "querycontroller.hxx"
67*cdf0e10cSrcweir #include "dbu_qry.hrc"
68*cdf0e10cSrcweir #include "dbustrings.hrc"
69*cdf0e10cSrcweir #include "Query.hrc"
70*cdf0e10cSrcweir #include <comphelper/extract.hxx>
71*cdf0e10cSrcweir #include "UITools.hxx"
72*cdf0e10cSrcweir #include "TableWindowAccess.hxx"
73*cdf0e10cSrcweir #include "browserids.hxx"
74*cdf0e10cSrcweir #include <connectivity/dbtools.hxx>
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir using namespace dbaui;
78*cdf0e10cSrcweir using namespace ::utl;
79*cdf0e10cSrcweir using namespace ::com::sun::star;
80*cdf0e10cSrcweir using namespace ::com::sun::star::sdb;
81*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
82*cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
83*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
84*cdf0e10cSrcweir using namespace ::com::sun::star::beans;
85*cdf0e10cSrcweir using namespace ::com::sun::star::container;
86*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
87*cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir #define TABWIN_SIZING_AREA		4
90*cdf0e10cSrcweir #define LISTBOX_SCROLLING_AREA	6
91*cdf0e10cSrcweir #define SCROLLING_TIMESPAN		500
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir #define TABWIN_WIDTH_MIN	90
94*cdf0e10cSrcweir #define TABWIN_HEIGHT_MIN	80
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir //========================================================================
97*cdf0e10cSrcweir // class OTableWindow
98*cdf0e10cSrcweir //========================================================================
99*cdf0e10cSrcweir DBG_NAME(OTableWindow)
100*cdf0e10cSrcweir //------------------------------------------------------------------------------
101*cdf0e10cSrcweir OTableWindow::OTableWindow( Window* pParent, const TTableWindowData::value_type& pTabWinData )
102*cdf0e10cSrcweir 		  : ::comphelper::OContainerListener(m_aMutex)
103*cdf0e10cSrcweir           ,Window( pParent, WB_3DLOOK|WB_MOVEABLE )
104*cdf0e10cSrcweir           ,m_aTypeImage( this )
105*cdf0e10cSrcweir 		  ,m_aTitle( this )
106*cdf0e10cSrcweir 		  ,m_pListBox(NULL)
107*cdf0e10cSrcweir 		  ,m_pAccessible(NULL)
108*cdf0e10cSrcweir           ,m_pData( pTabWinData )
109*cdf0e10cSrcweir 		  ,m_nMoveCount(0)
110*cdf0e10cSrcweir 		  ,m_nMoveIncrement(1)
111*cdf0e10cSrcweir           ,m_nSizingFlags( SIZING_NONE )
112*cdf0e10cSrcweir 		  ,m_bActive( sal_False )
113*cdf0e10cSrcweir {
114*cdf0e10cSrcweir 	DBG_CTOR(OTableWindow,NULL);
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir     // Position und Groesse bestimmen
117*cdf0e10cSrcweir 	if( GetData()->HasPosition() )
118*cdf0e10cSrcweir 		SetPosPixel( GetData()->GetPosition() );
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 	if( GetData()->HasSize() )
121*cdf0e10cSrcweir 		SetSizePixel( GetData()->GetSize() );
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 	// Hintergrund setzen
124*cdf0e10cSrcweir 	const StyleSettings&  aSystemStyle = Application::GetSettings().GetStyleSettings();
125*cdf0e10cSrcweir 	SetBackground(Wallpaper(aSystemStyle.GetFaceColor()));
126*cdf0e10cSrcweir 	// und Textfarbe (obwohl ich eigentlich keinen Text habe, aber wer weiss, was
127*cdf0e10cSrcweir 	// abgeleitete Klassen machen)
128*cdf0e10cSrcweir 	SetTextColor(aSystemStyle.GetButtonTextColor());
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir 	EnableClipSiblings();
131*cdf0e10cSrcweir }
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir //------------------------------------------------------------------------------
134*cdf0e10cSrcweir OTableWindow::~OTableWindow()
135*cdf0e10cSrcweir {
136*cdf0e10cSrcweir 	DBG_DTOR(OTableWindow,NULL);
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 	if (m_pListBox)
139*cdf0e10cSrcweir 	{
140*cdf0e10cSrcweir 		OSL_ENSURE(m_pListBox->GetEntryCount()==0,"Forgot to call EmptyListbox()!");
141*cdf0e10cSrcweir 		::std::auto_ptr<Window> aTemp(m_pListBox);
142*cdf0e10cSrcweir 		m_pListBox = NULL;
143*cdf0e10cSrcweir 	} // if (m_pListBox)
144*cdf0e10cSrcweir     if ( m_pContainerListener.is() )
145*cdf0e10cSrcweir         m_pContainerListener->dispose();
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir 	m_pAccessible = NULL;
148*cdf0e10cSrcweir }
149*cdf0e10cSrcweir // -----------------------------------------------------------------------------
150*cdf0e10cSrcweir const OJoinTableView* OTableWindow::getTableView() const
151*cdf0e10cSrcweir {
152*cdf0e10cSrcweir 	OSL_ENSURE(static_cast<OJoinTableView*>(GetParent()),"No OJoinTableView!");
153*cdf0e10cSrcweir 	return static_cast<OJoinTableView*>(GetParent());
154*cdf0e10cSrcweir }
155*cdf0e10cSrcweir // -----------------------------------------------------------------------------
156*cdf0e10cSrcweir OJoinTableView* OTableWindow::getTableView()
157*cdf0e10cSrcweir {
158*cdf0e10cSrcweir 	OSL_ENSURE(static_cast<OJoinTableView*>(GetParent()),"No OJoinTableView!");
159*cdf0e10cSrcweir 	return static_cast<OJoinTableView*>(GetParent());
160*cdf0e10cSrcweir }
161*cdf0e10cSrcweir // -----------------------------------------------------------------------------
162*cdf0e10cSrcweir OJoinDesignView* OTableWindow::getDesignView()
163*cdf0e10cSrcweir {
164*cdf0e10cSrcweir 	OSL_ENSURE(static_cast<OJoinDesignView*>(GetParent()->GetParent()->GetParent()),"No OJoinDesignView!");
165*cdf0e10cSrcweir 	return static_cast<OJoinDesignView*>(GetParent()->GetParent()->GetParent());
166*cdf0e10cSrcweir }
167*cdf0e10cSrcweir //------------------------------------------------------------------------------
168*cdf0e10cSrcweir void OTableWindow::SetPosPixel( const Point& rNewPos )
169*cdf0e10cSrcweir {
170*cdf0e10cSrcweir 	Point aNewPosData = rNewPos + getTableView()->GetScrollOffset();
171*cdf0e10cSrcweir 	GetData()->SetPosition( aNewPosData );
172*cdf0e10cSrcweir 	Window::SetPosPixel( rNewPos );
173*cdf0e10cSrcweir }
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir //------------------------------------------------------------------------------
176*cdf0e10cSrcweir void OTableWindow::SetSizePixel( const Size& rNewSize )
177*cdf0e10cSrcweir {
178*cdf0e10cSrcweir 	Size aOutSize(rNewSize);
179*cdf0e10cSrcweir 	if( aOutSize.Width() < TABWIN_WIDTH_MIN )
180*cdf0e10cSrcweir 		aOutSize.Width() = TABWIN_WIDTH_MIN;
181*cdf0e10cSrcweir 	if( aOutSize.Height() < TABWIN_HEIGHT_MIN )
182*cdf0e10cSrcweir 		aOutSize.Height() = TABWIN_HEIGHT_MIN;
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir 	GetData()->SetSize( aOutSize );
185*cdf0e10cSrcweir 	Window::SetSizePixel( aOutSize );
186*cdf0e10cSrcweir }
187*cdf0e10cSrcweir //------------------------------------------------------------------------------
188*cdf0e10cSrcweir void OTableWindow::SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
189*cdf0e10cSrcweir {
190*cdf0e10cSrcweir 	SetPosPixel( rNewPos );
191*cdf0e10cSrcweir 	SetSizePixel( rNewSize );
192*cdf0e10cSrcweir }
193*cdf0e10cSrcweir //------------------------------------------------------------------------------
194*cdf0e10cSrcweir OTableWindowListBox* OTableWindow::CreateListBox()
195*cdf0e10cSrcweir {
196*cdf0e10cSrcweir 	return new OTableWindowListBox(this);
197*cdf0e10cSrcweir }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir //------------------------------------------------------------------------------
200*cdf0e10cSrcweir sal_Bool OTableWindow::FillListBox()
201*cdf0e10cSrcweir {
202*cdf0e10cSrcweir     m_pListBox->Clear();
203*cdf0e10cSrcweir     if ( !m_pContainerListener.is() )
204*cdf0e10cSrcweir     {
205*cdf0e10cSrcweir         Reference< XContainer> xContainer(m_pData->getColumns(),UNO_QUERY);
206*cdf0e10cSrcweir         if ( xContainer.is() )
207*cdf0e10cSrcweir             m_pContainerListener = new ::comphelper::OContainerListenerAdapter(this,xContainer);
208*cdf0e10cSrcweir     }
209*cdf0e10cSrcweir 	// mark all primary keys with special image
210*cdf0e10cSrcweir     ModuleRes TmpRes(isHiContrast(m_pListBox) ? IMG_JOINS_H : IMG_JOINS);
211*cdf0e10cSrcweir 	ImageList aImageList(TmpRes);
212*cdf0e10cSrcweir 	Image aPrimKeyImage = aImageList.GetImage(IMG_PRIMARY_KEY);
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir 	if (GetData()->IsShowAll())
215*cdf0e10cSrcweir 	{
216*cdf0e10cSrcweir 		SvLBoxEntry* pEntry = m_pListBox->InsertEntry( ::rtl::OUString::createFromAscii("*") );
217*cdf0e10cSrcweir 		pEntry->SetUserData( createUserData(NULL,false) );
218*cdf0e10cSrcweir 	}
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 	Reference<XNameAccess> xPKeyColumns;
221*cdf0e10cSrcweir 	try
222*cdf0e10cSrcweir 	{
223*cdf0e10cSrcweir         xPKeyColumns = dbtools::getPrimaryKeyColumns_throw(m_pData->getTable());
224*cdf0e10cSrcweir 	}
225*cdf0e10cSrcweir 	catch(Exception&)
226*cdf0e10cSrcweir 	{
227*cdf0e10cSrcweir 		OSL_ENSURE(0,"Exception occured!");
228*cdf0e10cSrcweir 	}
229*cdf0e10cSrcweir 	try
230*cdf0e10cSrcweir 	{
231*cdf0e10cSrcweir         Reference< XNameAccess > xColumns = m_pData->getColumns();
232*cdf0e10cSrcweir 		if( xColumns.is() )
233*cdf0e10cSrcweir 		{
234*cdf0e10cSrcweir 			Sequence< ::rtl::OUString> aColumns = xColumns->getElementNames();
235*cdf0e10cSrcweir 			const ::rtl::OUString* pIter = aColumns.getConstArray();
236*cdf0e10cSrcweir 			const ::rtl::OUString* pEnd = pIter + aColumns.getLength();
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir 			SvLBoxEntry* pEntry = NULL;
239*cdf0e10cSrcweir 			for (; pIter != pEnd; ++pIter)
240*cdf0e10cSrcweir 			{
241*cdf0e10cSrcweir 				bool bPrimaryKeyColumn = xPKeyColumns.is() && xPKeyColumns->hasByName( *pIter );
242*cdf0e10cSrcweir 				// is this column in the primary key
243*cdf0e10cSrcweir 				if ( bPrimaryKeyColumn )
244*cdf0e10cSrcweir 					pEntry = m_pListBox->InsertEntry(*pIter, aPrimKeyImage, aPrimKeyImage);
245*cdf0e10cSrcweir 				else
246*cdf0e10cSrcweir 					pEntry = m_pListBox->InsertEntry(*pIter);
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir                 Reference<XPropertySet> xColumn(xColumns->getByName(*pIter),UNO_QUERY);
249*cdf0e10cSrcweir 				if ( xColumn.is() )
250*cdf0e10cSrcweir 					pEntry->SetUserData( createUserData(xColumn,bPrimaryKeyColumn) );
251*cdf0e10cSrcweir 			}
252*cdf0e10cSrcweir 		}
253*cdf0e10cSrcweir 	}
254*cdf0e10cSrcweir 	catch(Exception&)
255*cdf0e10cSrcweir 	{
256*cdf0e10cSrcweir 		OSL_ENSURE(0,"Exception occured!");
257*cdf0e10cSrcweir 	}
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 	return sal_True;
260*cdf0e10cSrcweir }
261*cdf0e10cSrcweir // -----------------------------------------------------------------------------
262*cdf0e10cSrcweir void* OTableWindow::createUserData(const Reference< XPropertySet>& /*_xColumn*/,bool /*_bPrimaryKey*/)
263*cdf0e10cSrcweir {
264*cdf0e10cSrcweir 	return NULL;
265*cdf0e10cSrcweir }
266*cdf0e10cSrcweir // -----------------------------------------------------------------------------
267*cdf0e10cSrcweir void OTableWindow::deleteUserData(void*& _pUserData)
268*cdf0e10cSrcweir {
269*cdf0e10cSrcweir 	OSL_ENSURE(!_pUserData,"INVALID call. Need to delete the userclass!");
270*cdf0e10cSrcweir 	_pUserData = NULL;
271*cdf0e10cSrcweir }
272*cdf0e10cSrcweir //------------------------------------------------------------------------------
273*cdf0e10cSrcweir void OTableWindow::clearListBox()
274*cdf0e10cSrcweir {
275*cdf0e10cSrcweir 	if ( m_pListBox )
276*cdf0e10cSrcweir 	{
277*cdf0e10cSrcweir 		SvLBoxEntry* pEntry = m_pListBox->First();
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir 		while(pEntry)
280*cdf0e10cSrcweir 		{
281*cdf0e10cSrcweir 			void* pUserData = pEntry->GetUserData();
282*cdf0e10cSrcweir 			deleteUserData(pUserData);
283*cdf0e10cSrcweir 			SvLBoxEntry* pNextEntry = m_pListBox->Next(pEntry);
284*cdf0e10cSrcweir 			m_pListBox->GetModel()->Remove(pEntry);
285*cdf0e10cSrcweir 			pEntry = pNextEntry;
286*cdf0e10cSrcweir 		}
287*cdf0e10cSrcweir 	}
288*cdf0e10cSrcweir }
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir //------------------------------------------------------------------------------
291*cdf0e10cSrcweir void OTableWindow::impl_updateImage()
292*cdf0e10cSrcweir {
293*cdf0e10cSrcweir     ImageProvider aImageProvider( getDesignView()->getController().getConnection() );
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir     Image aImage, aImageHC;
296*cdf0e10cSrcweir     aImageProvider.getImages( GetComposedName(), m_pData->isQuery() ? DatabaseObject::QUERY : DatabaseObject::TABLE, aImage, aImageHC );
297*cdf0e10cSrcweir 
298*cdf0e10cSrcweir     if ( !aImage || !aImageHC )
299*cdf0e10cSrcweir     {
300*cdf0e10cSrcweir         OSL_ENSURE( false, "OTableWindow::impl_updateImage: no images!" );
301*cdf0e10cSrcweir         return;
302*cdf0e10cSrcweir     }
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir     m_aTypeImage.SetModeImage( aImage, BMP_COLOR_NORMAL );
305*cdf0e10cSrcweir     m_aTypeImage.SetModeImage( aImageHC, BMP_COLOR_HIGHCONTRAST );
306*cdf0e10cSrcweir     m_aTypeImage.Show();
307*cdf0e10cSrcweir }
308*cdf0e10cSrcweir 
309*cdf0e10cSrcweir //------------------------------------------------------------------------------
310*cdf0e10cSrcweir sal_Bool OTableWindow::Init()
311*cdf0e10cSrcweir {
312*cdf0e10cSrcweir 	// create list box if necessary
313*cdf0e10cSrcweir 	if ( !m_pListBox )
314*cdf0e10cSrcweir 	{
315*cdf0e10cSrcweir 		m_pListBox = CreateListBox();
316*cdf0e10cSrcweir 		DBG_ASSERT( m_pListBox != NULL, "OTableWindow::Init() : CreateListBox hat NULL geliefert !" );
317*cdf0e10cSrcweir 		m_pListBox->SetSelectionMode( MULTIPLE_SELECTION );
318*cdf0e10cSrcweir 	}
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir 	// Titel setzen
321*cdf0e10cSrcweir 	m_aTitle.SetText( m_pData->GetWinName() );
322*cdf0e10cSrcweir 	m_aTitle.Show();
323*cdf0e10cSrcweir 
324*cdf0e10cSrcweir 	m_pListBox->Show();
325*cdf0e10cSrcweir 
326*cdf0e10cSrcweir 	// die Felder in die ListBox eintragen
327*cdf0e10cSrcweir 	clearListBox();
328*cdf0e10cSrcweir     sal_Bool bSuccess = FillListBox();
329*cdf0e10cSrcweir 	if ( bSuccess )
330*cdf0e10cSrcweir 		m_pListBox->SelectAll( sal_False );
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir     impl_updateImage();
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir 	return bSuccess;
335*cdf0e10cSrcweir }
336*cdf0e10cSrcweir //------------------------------------------------------------------------------
337*cdf0e10cSrcweir void OTableWindow::DataChanged(const DataChangedEvent& rDCEvt)
338*cdf0e10cSrcweir {
339*cdf0e10cSrcweir 	if (rDCEvt.GetType() == DATACHANGED_SETTINGS)
340*cdf0e10cSrcweir 	{
341*cdf0e10cSrcweir 		// nehmen wir den worst-case an : die Farben haben sich geaendert, also
342*cdf0e10cSrcweir 		// mich anpassen
343*cdf0e10cSrcweir 		const StyleSettings&  aSystemStyle = Application::GetSettings().GetStyleSettings();
344*cdf0e10cSrcweir 		SetBackground(Wallpaper(Color(aSystemStyle.GetFaceColor())));
345*cdf0e10cSrcweir 		SetTextColor(aSystemStyle.GetButtonTextColor());
346*cdf0e10cSrcweir 	}
347*cdf0e10cSrcweir }
348*cdf0e10cSrcweir //------------------------------------------------------------------------------
349*cdf0e10cSrcweir void OTableWindow::Paint( const Rectangle& rRect )
350*cdf0e10cSrcweir {
351*cdf0e10cSrcweir 	Rectangle aRect( Point(0,0), GetOutputSizePixel() );
352*cdf0e10cSrcweir 	Window::Paint( rRect );
353*cdf0e10cSrcweir 	Draw3DBorder( aRect );
354*cdf0e10cSrcweir }
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir //------------------------------------------------------------------------------
357*cdf0e10cSrcweir void OTableWindow::Draw3DBorder(const Rectangle& rRect)
358*cdf0e10cSrcweir {
359*cdf0e10cSrcweir 	// die Style-Settings des Systems fuer meine Farben
360*cdf0e10cSrcweir 	const StyleSettings& aSystemStyle = Application::GetSettings().GetStyleSettings();
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir 	// Schwarze Linie unten und rechts
363*cdf0e10cSrcweir 	SetLineColor(aSystemStyle.GetDarkShadowColor());
364*cdf0e10cSrcweir 	DrawLine( rRect.BottomLeft(), rRect.BottomRight() );
365*cdf0e10cSrcweir 	DrawLine( rRect.BottomRight(), rRect.TopRight() );
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir 	// Dunkelgraue Linie ueber der schwarzen
368*cdf0e10cSrcweir 	SetLineColor(aSystemStyle.GetShadowColor());
369*cdf0e10cSrcweir 	Point aEHvector(1,1);
370*cdf0e10cSrcweir 	DrawLine( rRect.BottomLeft()+Point(1,-1), rRect.BottomRight() - aEHvector );
371*cdf0e10cSrcweir 	DrawLine( rRect.BottomRight() - aEHvector, rRect.TopRight()+Point(-1,1) );
372*cdf0e10cSrcweir 
373*cdf0e10cSrcweir 	// Hellgraue Linie links und oben
374*cdf0e10cSrcweir 	SetLineColor(aSystemStyle.GetLightColor());
375*cdf0e10cSrcweir 	DrawLine( rRect.BottomLeft()+Point(1,-2), rRect.TopLeft() + aEHvector );
376*cdf0e10cSrcweir 	DrawLine( rRect.TopLeft() + aEHvector, rRect.TopRight()+Point(-2,1) );
377*cdf0e10cSrcweir }
378*cdf0e10cSrcweir // -----------------------------------------------------------------------------
379*cdf0e10cSrcweir Rectangle OTableWindow::getSizingRect(const Point& _rPos,const Size& _rOutputSize) const
380*cdf0e10cSrcweir {
381*cdf0e10cSrcweir 	Rectangle aSizingRect = Rectangle( GetPosPixel(), GetSizePixel() );
382*cdf0e10cSrcweir 	sal_uInt16 nSizingFlags = GetSizingFlags();
383*cdf0e10cSrcweir 
384*cdf0e10cSrcweir 	if( nSizingFlags & SIZING_TOP )
385*cdf0e10cSrcweir 	{
386*cdf0e10cSrcweir 		if( _rPos.Y() < 0 )
387*cdf0e10cSrcweir 			aSizingRect.Top() = 0;
388*cdf0e10cSrcweir 		else
389*cdf0e10cSrcweir 			aSizingRect.Top() = _rPos.Y();
390*cdf0e10cSrcweir 	}
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir 	if( nSizingFlags & SIZING_BOTTOM )
393*cdf0e10cSrcweir 	{
394*cdf0e10cSrcweir 		if( _rPos.Y() > _rOutputSize.Height() )
395*cdf0e10cSrcweir 			aSizingRect.Bottom() = _rOutputSize.Height();
396*cdf0e10cSrcweir 		else
397*cdf0e10cSrcweir 			aSizingRect.Bottom() = _rPos.Y();
398*cdf0e10cSrcweir 	}
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir 	if( nSizingFlags & SIZING_RIGHT )
402*cdf0e10cSrcweir 	{
403*cdf0e10cSrcweir 		if( _rPos.X() > _rOutputSize.Width() )
404*cdf0e10cSrcweir 			aSizingRect.Right() = _rOutputSize.Width();
405*cdf0e10cSrcweir 		else
406*cdf0e10cSrcweir 			aSizingRect.Right() = _rPos.X();
407*cdf0e10cSrcweir 	}
408*cdf0e10cSrcweir 
409*cdf0e10cSrcweir 	if( nSizingFlags & SIZING_LEFT )
410*cdf0e10cSrcweir 	{
411*cdf0e10cSrcweir 		if( _rPos.X() < 0 )
412*cdf0e10cSrcweir 			aSizingRect.Left() = 0;
413*cdf0e10cSrcweir 		else
414*cdf0e10cSrcweir 			aSizingRect.Left() = _rPos.X();
415*cdf0e10cSrcweir 	}
416*cdf0e10cSrcweir 	return aSizingRect;
417*cdf0e10cSrcweir }
418*cdf0e10cSrcweir // -----------------------------------------------------------------------------
419*cdf0e10cSrcweir void OTableWindow::setSizingFlag(const Point& _rPos)
420*cdf0e10cSrcweir {
421*cdf0e10cSrcweir 	Size	aOutSize = GetOutputSizePixel();
422*cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////////
423*cdf0e10cSrcweir 	// Flags anpassen, wenn Mauszeiger in sizingArea
424*cdf0e10cSrcweir 	m_nSizingFlags = SIZING_NONE;
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir 	if( _rPos.X() < TABWIN_SIZING_AREA )
427*cdf0e10cSrcweir 		m_nSizingFlags |= SIZING_LEFT;
428*cdf0e10cSrcweir 
429*cdf0e10cSrcweir 	if( _rPos.Y() < TABWIN_SIZING_AREA )
430*cdf0e10cSrcweir 		m_nSizingFlags |= SIZING_TOP;
431*cdf0e10cSrcweir 
432*cdf0e10cSrcweir 	if( _rPos.X() > aOutSize.Width()-TABWIN_SIZING_AREA )
433*cdf0e10cSrcweir 		m_nSizingFlags |= SIZING_RIGHT;
434*cdf0e10cSrcweir 
435*cdf0e10cSrcweir 	if( _rPos.Y() > aOutSize.Height()-TABWIN_SIZING_AREA )
436*cdf0e10cSrcweir 		m_nSizingFlags |= SIZING_BOTTOM;
437*cdf0e10cSrcweir }
438*cdf0e10cSrcweir //------------------------------------------------------------------------------
439*cdf0e10cSrcweir void OTableWindow::MouseMove( const MouseEvent& rEvt )
440*cdf0e10cSrcweir {
441*cdf0e10cSrcweir 	Window::MouseMove(rEvt);
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir 	OJoinTableView* pCont = getTableView();
444*cdf0e10cSrcweir 	if (pCont->getDesignView()->getController().isReadOnly())
445*cdf0e10cSrcweir 		return;
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir 	Point	aPos = rEvt.GetPosPixel();
448*cdf0e10cSrcweir 	setSizingFlag(aPos);
449*cdf0e10cSrcweir 	Pointer	aPointer;
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////////
453*cdf0e10cSrcweir 	// Mauszeiger anpassen, wenn Mauszeiger in sizingArea
454*cdf0e10cSrcweir 	switch( m_nSizingFlags )
455*cdf0e10cSrcweir 	{
456*cdf0e10cSrcweir 	case SIZING_TOP:
457*cdf0e10cSrcweir 	case SIZING_BOTTOM:
458*cdf0e10cSrcweir 		aPointer = Pointer( POINTER_SSIZE );
459*cdf0e10cSrcweir 		break;
460*cdf0e10cSrcweir 
461*cdf0e10cSrcweir 	case SIZING_LEFT:
462*cdf0e10cSrcweir 	case SIZING_RIGHT:
463*cdf0e10cSrcweir 		aPointer = Pointer( POINTER_ESIZE );
464*cdf0e10cSrcweir 		break;
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir 	case SIZING_LEFT+SIZING_TOP:
467*cdf0e10cSrcweir 	case SIZING_RIGHT+SIZING_BOTTOM:
468*cdf0e10cSrcweir 		aPointer = Pointer( POINTER_SESIZE );
469*cdf0e10cSrcweir 		break;
470*cdf0e10cSrcweir 
471*cdf0e10cSrcweir 	case SIZING_RIGHT+SIZING_TOP:
472*cdf0e10cSrcweir 	case SIZING_LEFT+SIZING_BOTTOM:
473*cdf0e10cSrcweir 		aPointer = Pointer( POINTER_NESIZE );
474*cdf0e10cSrcweir 		break;
475*cdf0e10cSrcweir 	}
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir 	SetPointer( aPointer );
478*cdf0e10cSrcweir }
479*cdf0e10cSrcweir 
480*cdf0e10cSrcweir //------------------------------------------------------------------------------
481*cdf0e10cSrcweir void OTableWindow::MouseButtonDown( const MouseEvent& rEvt )
482*cdf0e10cSrcweir {
483*cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////////
484*cdf0e10cSrcweir 	// Wenn sizing, dann bekommt Parent die Nachricht,
485*cdf0e10cSrcweir 	// dass jetzt die Fenstergroesse seines Childs veraendert wird
486*cdf0e10cSrcweir 	if( m_nSizingFlags )
487*cdf0e10cSrcweir 		getTableView()->BeginChildSizing( this, GetPointer() );
488*cdf0e10cSrcweir 
489*cdf0e10cSrcweir 	Window::MouseButtonDown( rEvt );
490*cdf0e10cSrcweir }
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir 
494*cdf0e10cSrcweir //------------------------------------------------------------------------------
495*cdf0e10cSrcweir void OTableWindow::Resize()
496*cdf0e10cSrcweir {
497*cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////////
498*cdf0e10cSrcweir 	// Das Fenster darf nicht verschwinden, deshalb min. Groesse setzen
499*cdf0e10cSrcweir 	Size	aOutSize = GetOutputSizePixel();
500*cdf0e10cSrcweir 	aOutSize = Size(CalcZoom(aOutSize.Width()),CalcZoom(aOutSize.Height()));
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir 	long nTitleHeight = CalcZoom( GetTextHeight() )+ CalcZoom( 4 );
503*cdf0e10cSrcweir 
504*cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////////
505*cdf0e10cSrcweir 	// Titel und ListBox anpassen
506*cdf0e10cSrcweir 	long n5Pos = CalcZoom(5);
507*cdf0e10cSrcweir     long nPositionX = n5Pos;
508*cdf0e10cSrcweir     long nPositionY = n5Pos;
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir     // position the image which indicates the type
511*cdf0e10cSrcweir     m_aTypeImage.SetPosPixel( Point( nPositionX, nPositionY ) );
512*cdf0e10cSrcweir     Size aImageSize( m_aTypeImage.GetImage().GetSizePixel() );
513*cdf0e10cSrcweir     m_aTypeImage.SetSizePixel( aImageSize );
514*cdf0e10cSrcweir 
515*cdf0e10cSrcweir     if ( nTitleHeight < aImageSize.Height() )
516*cdf0e10cSrcweir         nTitleHeight = aImageSize.Height();
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir     nPositionX += aImageSize.Width() + CalcZoom( 2 );
519*cdf0e10cSrcweir 	m_aTitle.SetPosSizePixel( Point( nPositionX, nPositionY ), Size( aOutSize.Width() - nPositionX - n5Pos, nTitleHeight ) );
520*cdf0e10cSrcweir 
521*cdf0e10cSrcweir     long nTitleToList = CalcZoom( 3 );
522*cdf0e10cSrcweir 
523*cdf0e10cSrcweir 	m_pListBox->SetPosSizePixel(
524*cdf0e10cSrcweir         Point( n5Pos, nPositionY + nTitleHeight + nTitleToList ),
525*cdf0e10cSrcweir         Size( aOutSize.Width() - 2 * n5Pos, aOutSize.Height() - ( nPositionY + nTitleHeight + nTitleToList ) - n5Pos )
526*cdf0e10cSrcweir     );
527*cdf0e10cSrcweir 
528*cdf0e10cSrcweir     Window::Invalidate();
529*cdf0e10cSrcweir }
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir //------------------------------------------------------------------------------
532*cdf0e10cSrcweir void OTableWindow::SetBoldTitle( sal_Bool bBold )
533*cdf0e10cSrcweir {
534*cdf0e10cSrcweir 	Font aFont = m_aTitle.GetFont();
535*cdf0e10cSrcweir 	aFont.SetWeight( bBold?WEIGHT_BOLD:WEIGHT_NORMAL );
536*cdf0e10cSrcweir 	m_aTitle.SetFont( aFont );
537*cdf0e10cSrcweir 	m_aTitle.Invalidate();
538*cdf0e10cSrcweir }
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir //------------------------------------------------------------------------------
541*cdf0e10cSrcweir void OTableWindow::GetFocus()
542*cdf0e10cSrcweir {
543*cdf0e10cSrcweir 	Window::GetFocus();
544*cdf0e10cSrcweir 	// we have to forward the focus to our listbox to enable keystokes
545*cdf0e10cSrcweir 	if(m_pListBox)
546*cdf0e10cSrcweir 		m_pListBox->GrabFocus();
547*cdf0e10cSrcweir }
548*cdf0e10cSrcweir // -----------------------------------------------------------------------------
549*cdf0e10cSrcweir void OTableWindow::setActive(sal_Bool _bActive)
550*cdf0e10cSrcweir {
551*cdf0e10cSrcweir 	SetBoldTitle( _bActive );
552*cdf0e10cSrcweir 	m_bActive = _bActive;
553*cdf0e10cSrcweir 	if (!_bActive && m_pListBox && m_pListBox->GetSelectionCount() != 0)
554*cdf0e10cSrcweir 		m_pListBox->SelectAll(sal_False);
555*cdf0e10cSrcweir }
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir //------------------------------------------------------------------------------
558*cdf0e10cSrcweir void OTableWindow::Remove()
559*cdf0e10cSrcweir {
560*cdf0e10cSrcweir 	//////////////////////////////////////////////////////////////////
561*cdf0e10cSrcweir 	// Fenster loeschen
562*cdf0e10cSrcweir 	OJoinTableView* pTabWinCont = getTableView();
563*cdf0e10cSrcweir 	pTabWinCont->RemoveTabWin( this );
564*cdf0e10cSrcweir 	pTabWinCont->Invalidate();
565*cdf0e10cSrcweir }
566*cdf0e10cSrcweir //------------------------------------------------------------------------------
567*cdf0e10cSrcweir sal_Bool OTableWindow::HandleKeyInput( const KeyEvent& rEvt )
568*cdf0e10cSrcweir {
569*cdf0e10cSrcweir 	const KeyCode& rCode = rEvt.GetKeyCode();
570*cdf0e10cSrcweir 	sal_uInt16 nCode = rCode.GetCode();
571*cdf0e10cSrcweir 	sal_Bool   bShift = rCode.IsShift();
572*cdf0e10cSrcweir 	sal_Bool   bCtrl = rCode.IsMod1();
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir 	sal_Bool bHandle = sal_False;
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir 	if( !bCtrl && !bShift && (nCode==KEY_DELETE) )
577*cdf0e10cSrcweir 	{
578*cdf0e10cSrcweir 		Remove();
579*cdf0e10cSrcweir 		bHandle = sal_True;
580*cdf0e10cSrcweir 	}
581*cdf0e10cSrcweir 	return bHandle;
582*cdf0e10cSrcweir }
583*cdf0e10cSrcweir 
584*cdf0e10cSrcweir //------------------------------------------------------------------------------
585*cdf0e10cSrcweir sal_Bool OTableWindow::ExistsAConn() const
586*cdf0e10cSrcweir {
587*cdf0e10cSrcweir 	return getTableView()->ExistsAConn(this);
588*cdf0e10cSrcweir }
589*cdf0e10cSrcweir //------------------------------------------------------------------------------
590*cdf0e10cSrcweir void OTableWindow::EnumValidFields(::std::vector< ::rtl::OUString>& arrstrFields)
591*cdf0e10cSrcweir {
592*cdf0e10cSrcweir 	arrstrFields.clear();
593*cdf0e10cSrcweir 	// diese Default-Implementierung zaehlt einfach alles auf, was es in der ListBox gibt ... fuer anderes Verhalten ueberschreiben
594*cdf0e10cSrcweir 	if ( m_pListBox )
595*cdf0e10cSrcweir 	{
596*cdf0e10cSrcweir 		arrstrFields.reserve(m_pListBox->GetEntryCount());
597*cdf0e10cSrcweir 		SvLBoxEntry* pEntryLoop = m_pListBox->First();
598*cdf0e10cSrcweir 		while (pEntryLoop)
599*cdf0e10cSrcweir 		{
600*cdf0e10cSrcweir 			arrstrFields.push_back(m_pListBox->GetEntryText(pEntryLoop));
601*cdf0e10cSrcweir 			pEntryLoop = m_pListBox->Next(pEntryLoop);
602*cdf0e10cSrcweir 		}
603*cdf0e10cSrcweir 	}
604*cdf0e10cSrcweir }
605*cdf0e10cSrcweir // -----------------------------------------------------------------------------
606*cdf0e10cSrcweir void OTableWindow::StateChanged( StateChangedType nType )
607*cdf0e10cSrcweir {
608*cdf0e10cSrcweir 	Window::StateChanged( nType );
609*cdf0e10cSrcweir 
610*cdf0e10cSrcweir 	if ( nType == STATE_CHANGE_ZOOM )
611*cdf0e10cSrcweir 	{
612*cdf0e10cSrcweir 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir 		Font aFont = rStyleSettings.GetGroupFont();
615*cdf0e10cSrcweir 		if ( IsControlFont() )
616*cdf0e10cSrcweir 			aFont.Merge( GetControlFont() );
617*cdf0e10cSrcweir 		SetZoomedPointFont( aFont );
618*cdf0e10cSrcweir 
619*cdf0e10cSrcweir 		m_aTitle.SetZoom(GetZoom());
620*cdf0e10cSrcweir 		m_pListBox->SetZoom(GetZoom());
621*cdf0e10cSrcweir 		Resize();
622*cdf0e10cSrcweir 		Invalidate();
623*cdf0e10cSrcweir 	}
624*cdf0e10cSrcweir }
625*cdf0e10cSrcweir // -----------------------------------------------------------------------------
626*cdf0e10cSrcweir Reference< XAccessible > OTableWindow::CreateAccessible()
627*cdf0e10cSrcweir {
628*cdf0e10cSrcweir 	OTableWindowAccess* pAccessible = new OTableWindowAccess(this);
629*cdf0e10cSrcweir 	m_pAccessible = pAccessible;
630*cdf0e10cSrcweir 	return pAccessible;
631*cdf0e10cSrcweir }
632*cdf0e10cSrcweir // -----------------------------------------------------------------------------
633*cdf0e10cSrcweir void OTableWindow::Command(const CommandEvent& rEvt)
634*cdf0e10cSrcweir {
635*cdf0e10cSrcweir 	switch (rEvt.GetCommand())
636*cdf0e10cSrcweir 	{
637*cdf0e10cSrcweir 		case COMMAND_CONTEXTMENU:
638*cdf0e10cSrcweir 		{
639*cdf0e10cSrcweir 			OJoinController& rController = getDesignView()->getController();
640*cdf0e10cSrcweir 			if(!rController.isReadOnly() && rController.isConnected())
641*cdf0e10cSrcweir 			{
642*cdf0e10cSrcweir 				Point ptWhere;
643*cdf0e10cSrcweir 				if ( rEvt.IsMouseEvent() )
644*cdf0e10cSrcweir 					ptWhere = rEvt.GetMousePosPixel();
645*cdf0e10cSrcweir 				else
646*cdf0e10cSrcweir 				{
647*cdf0e10cSrcweir 					SvLBoxEntry* pCurrent = m_pListBox->GetCurEntry();
648*cdf0e10cSrcweir 					if ( pCurrent )
649*cdf0e10cSrcweir 						ptWhere = m_pListBox->GetEntryPosition(pCurrent);
650*cdf0e10cSrcweir 					else
651*cdf0e10cSrcweir 						ptWhere = m_aTitle.GetPosPixel();
652*cdf0e10cSrcweir 				}
653*cdf0e10cSrcweir 
654*cdf0e10cSrcweir 				PopupMenu aContextMenu(ModuleRes(RID_MENU_JOINVIEW_TABLE));
655*cdf0e10cSrcweir 				switch (aContextMenu.Execute(this, ptWhere))
656*cdf0e10cSrcweir 				{
657*cdf0e10cSrcweir 					case SID_DELETE:
658*cdf0e10cSrcweir 						Remove();
659*cdf0e10cSrcweir 						break;
660*cdf0e10cSrcweir 				}
661*cdf0e10cSrcweir 			}
662*cdf0e10cSrcweir 			break;
663*cdf0e10cSrcweir 		}
664*cdf0e10cSrcweir 		default:
665*cdf0e10cSrcweir 			Window::Command(rEvt);
666*cdf0e10cSrcweir 	}
667*cdf0e10cSrcweir }
668*cdf0e10cSrcweir // -----------------------------------------------------------------------------
669*cdf0e10cSrcweir long OTableWindow::PreNotify(NotifyEvent& rNEvt)
670*cdf0e10cSrcweir {
671*cdf0e10cSrcweir 	sal_Bool bHandled = sal_False;
672*cdf0e10cSrcweir 	switch (rNEvt.GetType())
673*cdf0e10cSrcweir 	{
674*cdf0e10cSrcweir 		case EVENT_KEYINPUT:
675*cdf0e10cSrcweir 		{
676*cdf0e10cSrcweir 			if ( getDesignView()->getController().isReadOnly() )
677*cdf0e10cSrcweir 				break;
678*cdf0e10cSrcweir 
679*cdf0e10cSrcweir 			const KeyEvent* pKeyEvent =	rNEvt.GetKeyEvent();
680*cdf0e10cSrcweir 			const KeyCode& rCode = pKeyEvent->GetKeyCode();
681*cdf0e10cSrcweir 			if ( rCode.IsMod1() )
682*cdf0e10cSrcweir 			{
683*cdf0e10cSrcweir 				Point aStartPoint = GetPosPixel();
684*cdf0e10cSrcweir 				if ( rCode.IsShift() )
685*cdf0e10cSrcweir 				{
686*cdf0e10cSrcweir 					aStartPoint.X() = GetSizePixel().Width();
687*cdf0e10cSrcweir 					aStartPoint.Y() = GetSizePixel().Height();
688*cdf0e10cSrcweir 				}
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir 				switch( rCode.GetCode() )
691*cdf0e10cSrcweir 				{
692*cdf0e10cSrcweir 					case KEY_DOWN:
693*cdf0e10cSrcweir 						bHandled = sal_True;
694*cdf0e10cSrcweir 						aStartPoint.Y() += m_nMoveIncrement;
695*cdf0e10cSrcweir 						break;
696*cdf0e10cSrcweir 					case KEY_UP:
697*cdf0e10cSrcweir 						bHandled = sal_True;
698*cdf0e10cSrcweir 						aStartPoint.Y() += -m_nMoveIncrement;
699*cdf0e10cSrcweir 						break;
700*cdf0e10cSrcweir 					case KEY_LEFT:
701*cdf0e10cSrcweir 						bHandled = sal_True;
702*cdf0e10cSrcweir 						aStartPoint.X() += -m_nMoveIncrement;
703*cdf0e10cSrcweir 						break;
704*cdf0e10cSrcweir 					case KEY_RIGHT:
705*cdf0e10cSrcweir 						bHandled = sal_True;
706*cdf0e10cSrcweir 						aStartPoint.X()  += m_nMoveIncrement;
707*cdf0e10cSrcweir 						break;
708*cdf0e10cSrcweir 				}
709*cdf0e10cSrcweir 				if ( bHandled )
710*cdf0e10cSrcweir 				{
711*cdf0e10cSrcweir 					if ( rCode.IsShift() )
712*cdf0e10cSrcweir 					{
713*cdf0e10cSrcweir 						OJoinTableView* pView = getTableView();
714*cdf0e10cSrcweir 						Point ptOld = GetPosPixel();
715*cdf0e10cSrcweir 						Size aSize = pView->getRealOutputSize();
716*cdf0e10cSrcweir 						Size aNewSize(aStartPoint.X(),aStartPoint.Y());
717*cdf0e10cSrcweir 						if (   ((ptOld.X() + aNewSize.Width())  <= aSize.Width())
718*cdf0e10cSrcweir 							&& ((ptOld.Y() + aNewSize.Height()) <= aSize.Height()) )
719*cdf0e10cSrcweir 						{
720*cdf0e10cSrcweir 							if ( aNewSize.Width() < TABWIN_WIDTH_MIN )
721*cdf0e10cSrcweir 								aNewSize.Width() = TABWIN_WIDTH_MIN;
722*cdf0e10cSrcweir 							if ( aNewSize.Height() < TABWIN_HEIGHT_MIN )
723*cdf0e10cSrcweir 								aNewSize.Height() = TABWIN_HEIGHT_MIN;
724*cdf0e10cSrcweir 
725*cdf0e10cSrcweir 							Size szOld = GetSizePixel();
726*cdf0e10cSrcweir 
727*cdf0e10cSrcweir 							aNewSize = Size(pView->CalcZoom(aNewSize.Width()),pView->CalcZoom(aNewSize.Height()));
728*cdf0e10cSrcweir 							SetPosSizePixel( ptOld, aNewSize );
729*cdf0e10cSrcweir 							pView->TabWinSized(this, ptOld, szOld);
730*cdf0e10cSrcweir 							Invalidate( INVALIDATE_NOCHILDREN );
731*cdf0e10cSrcweir 						}
732*cdf0e10cSrcweir 					}
733*cdf0e10cSrcweir 					else
734*cdf0e10cSrcweir 					{
735*cdf0e10cSrcweir 						// remember how often the user moved our window
736*cdf0e10cSrcweir 						++m_nMoveCount;
737*cdf0e10cSrcweir 						if( m_nMoveCount == 5 )
738*cdf0e10cSrcweir 							m_nMoveIncrement = 10;
739*cdf0e10cSrcweir 						else if( m_nMoveCount > 15 )
740*cdf0e10cSrcweir 							m_nMoveCount = m_nMoveIncrement = 20;
741*cdf0e10cSrcweir 
742*cdf0e10cSrcweir 						Point aOldDataPoint = GetData()->GetPosition();
743*cdf0e10cSrcweir 						Point aNewDataPoint = aStartPoint + getTableView()->GetScrollOffset();
744*cdf0e10cSrcweir 						if ( aNewDataPoint.X() > -1 && aNewDataPoint.Y() > -1 )
745*cdf0e10cSrcweir 						{
746*cdf0e10cSrcweir 							OJoinTableView* pView = getTableView();
747*cdf0e10cSrcweir 							if ( pView->isMovementAllowed(aNewDataPoint, GetData()->GetSize()) )
748*cdf0e10cSrcweir 							{
749*cdf0e10cSrcweir 								SetPosPixel(aStartPoint);
750*cdf0e10cSrcweir 
751*cdf0e10cSrcweir 								// aNewDataPoint can not be used here because SetPosPixel reset it
752*cdf0e10cSrcweir 								pView->EnsureVisible(GetData()->GetPosition(), GetData()->GetSize());
753*cdf0e10cSrcweir 								pView->TabWinMoved(this,aOldDataPoint);
754*cdf0e10cSrcweir 								Invalidate(INVALIDATE_NOCHILDREN);
755*cdf0e10cSrcweir 								getDesignView()->getController().setModified( sal_True );
756*cdf0e10cSrcweir 							}
757*cdf0e10cSrcweir 							else
758*cdf0e10cSrcweir 							{
759*cdf0e10cSrcweir 								m_nMoveCount		= 0; // reset our movement count
760*cdf0e10cSrcweir 								m_nMoveIncrement	= 1;
761*cdf0e10cSrcweir 							}
762*cdf0e10cSrcweir 						}
763*cdf0e10cSrcweir 						else
764*cdf0e10cSrcweir 						{
765*cdf0e10cSrcweir 							m_nMoveCount		= 0; // reset our movement count
766*cdf0e10cSrcweir 							m_nMoveIncrement	= 1;
767*cdf0e10cSrcweir 						}
768*cdf0e10cSrcweir 					}
769*cdf0e10cSrcweir 					resetSizingFlag();
770*cdf0e10cSrcweir 				}
771*cdf0e10cSrcweir 				else
772*cdf0e10cSrcweir 				{
773*cdf0e10cSrcweir 					m_nMoveCount		= 0; // reset our movement count
774*cdf0e10cSrcweir 					m_nMoveIncrement	= 1;
775*cdf0e10cSrcweir 				}
776*cdf0e10cSrcweir 			}
777*cdf0e10cSrcweir 			else
778*cdf0e10cSrcweir 			{
779*cdf0e10cSrcweir 				m_nMoveCount		= 0; // reset our movement count
780*cdf0e10cSrcweir 				m_nMoveIncrement	= 1;
781*cdf0e10cSrcweir 			}
782*cdf0e10cSrcweir 		}
783*cdf0e10cSrcweir 			break;
784*cdf0e10cSrcweir 		case EVENT_KEYUP:
785*cdf0e10cSrcweir 		{
786*cdf0e10cSrcweir 			const KeyEvent* pKeyEvent =	rNEvt.GetKeyEvent();
787*cdf0e10cSrcweir 			const KeyCode& rCode = pKeyEvent->GetKeyCode();
788*cdf0e10cSrcweir 			sal_uInt16 nKeyCode = rCode.GetCode();
789*cdf0e10cSrcweir 			if ( rCode.IsMod2() && nKeyCode != KEY_UP && nKeyCode != KEY_DOWN && nKeyCode != KEY_LEFT && nKeyCode != KEY_RIGHT )
790*cdf0e10cSrcweir 			{
791*cdf0e10cSrcweir 				m_nMoveCount		= 0; // reset our movement count
792*cdf0e10cSrcweir 				m_nMoveIncrement	= 1;
793*cdf0e10cSrcweir 			}
794*cdf0e10cSrcweir 		}
795*cdf0e10cSrcweir 			break;
796*cdf0e10cSrcweir 	}
797*cdf0e10cSrcweir 	if (!bHandled)
798*cdf0e10cSrcweir 		return Window::PreNotify(rNEvt);
799*cdf0e10cSrcweir 	return 1L;
800*cdf0e10cSrcweir }
801*cdf0e10cSrcweir // -----------------------------------------------------------------------------
802*cdf0e10cSrcweir String OTableWindow::getTitle() const
803*cdf0e10cSrcweir {
804*cdf0e10cSrcweir 	return m_aTitle.GetText();
805*cdf0e10cSrcweir }
806*cdf0e10cSrcweir // -----------------------------------------------------------------------------
807*cdf0e10cSrcweir void OTableWindow::_elementInserted( const container::ContainerEvent& /*_rEvent*/ )  throw(::com::sun::star::uno::RuntimeException)
808*cdf0e10cSrcweir {
809*cdf0e10cSrcweir     FillListBox();
810*cdf0e10cSrcweir }
811*cdf0e10cSrcweir // -----------------------------------------------------------------------------
812*cdf0e10cSrcweir void OTableWindow::_elementRemoved( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
813*cdf0e10cSrcweir {
814*cdf0e10cSrcweir     FillListBox();
815*cdf0e10cSrcweir }
816*cdf0e10cSrcweir // -----------------------------------------------------------------------------
817*cdf0e10cSrcweir void OTableWindow::_elementReplaced( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
818*cdf0e10cSrcweir {
819*cdf0e10cSrcweir     FillListBox();
820*cdf0e10cSrcweir }
821*cdf0e10cSrcweir // -----------------------------------------------------------------------------
822*cdf0e10cSrcweir 
823