xref: /aoo41x/main/svtools/source/brwbox/datwin.cxx (revision 5900e8ec)
1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5900e8ecSAndrew Rist  * distributed with this work for additional information
6*5900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5900e8ecSAndrew Rist  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5900e8ecSAndrew Rist  *
13*5900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist  * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
17*5900e8ecSAndrew Rist  * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist  * under the License.
19*5900e8ecSAndrew Rist  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "datwin.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #ifndef GCC
30cdf0e10cSrcweir #endif
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #ifndef _APP_HXX //autogen
33cdf0e10cSrcweir #include <vcl/svapp.hxx>
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #ifndef _HELP_HXX
37cdf0e10cSrcweir #include <vcl/help.hxx>
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir #ifndef _IMAGE_HXX
40cdf0e10cSrcweir #include <vcl/image.hxx>
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #include <tools/debug.hxx>
44cdf0e10cSrcweir 
DECLARE_LIST(BrowserColumns,BrowserColumn *)45cdf0e10cSrcweir DECLARE_LIST( BrowserColumns, BrowserColumn* )
46cdf0e10cSrcweir 
47cdf0e10cSrcweir //===================================================================
48cdf0e10cSrcweir void ButtonFrame::Draw( OutputDevice& rDev )
49cdf0e10cSrcweir {
50cdf0e10cSrcweir 	Color aOldFillColor = rDev.GetFillColor();
51cdf0e10cSrcweir 	Color aOldLineColor = rDev.GetLineColor();
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 	const StyleSettings &rSettings = rDev.GetSettings().GetStyleSettings();
54cdf0e10cSrcweir 	Color aColLight( rSettings.GetLightColor() );
55cdf0e10cSrcweir 	Color aColShadow( rSettings.GetShadowColor() );
56cdf0e10cSrcweir 	Color aColFace( rSettings.GetFaceColor() );
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 	rDev.SetLineColor( aColFace );
59cdf0e10cSrcweir 	rDev.SetFillColor( aColFace );
60cdf0e10cSrcweir 	rDev.DrawRect( aRect );
61cdf0e10cSrcweir 
62cdf0e10cSrcweir     if( rDev.GetOutDevType() == OUTDEV_WINDOW )
63cdf0e10cSrcweir     {
64cdf0e10cSrcweir         Window *pWin = (Window*) &rDev;
65cdf0e10cSrcweir         if( bPressed )
66cdf0e10cSrcweir             pWin->DrawSelectionBackground( aRect, 0, sal_True, sal_False, sal_False );
67cdf0e10cSrcweir     }
68cdf0e10cSrcweir     else
69cdf0e10cSrcweir     {
70cdf0e10cSrcweir 	    rDev.SetLineColor( bPressed ? aColShadow : aColLight );
71cdf0e10cSrcweir 	    rDev.DrawLine( aRect.TopLeft(), Point( aRect.Right(), aRect.Top() ) );
72cdf0e10cSrcweir 	    rDev.DrawLine( aRect.TopLeft(), Point( aRect.Left(), aRect.Bottom() - 1 ) );
73cdf0e10cSrcweir 	    rDev.SetLineColor( bPressed ? aColLight : aColShadow );
74cdf0e10cSrcweir 	    rDev.DrawLine( aRect.BottomRight(), Point( aRect.Right(), aRect.Top() ) );
75cdf0e10cSrcweir 	    rDev.DrawLine( aRect.BottomRight(), Point( aRect.Left(), aRect.Bottom() ) );
76cdf0e10cSrcweir     }
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 	if ( aText.Len() )
79cdf0e10cSrcweir 	{
80cdf0e10cSrcweir 		String aVal = rDev.GetEllipsisString(aText,aInnerRect.GetWidth() - 2*MIN_COLUMNWIDTH);
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 		Font aFont( rDev.GetFont() );
83cdf0e10cSrcweir 		sal_Bool bOldTransp = aFont.IsTransparent();
84cdf0e10cSrcweir 		if ( !bOldTransp )
85cdf0e10cSrcweir 		{
86cdf0e10cSrcweir 			aFont.SetTransparent( sal_True );
87cdf0e10cSrcweir 			rDev.SetFont( aFont );
88cdf0e10cSrcweir 		}
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 		Color aOldColor = rDev.GetTextColor();
91cdf0e10cSrcweir 		if (m_bDrawDisabled)
92cdf0e10cSrcweir 			rDev.SetTextColor(rSettings.GetDisableColor());
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 		rDev.DrawText( Point(
95cdf0e10cSrcweir 			( aInnerRect.Left() + aInnerRect.Right() ) / 2 - ( rDev.GetTextWidth(aVal) / 2 ),
96cdf0e10cSrcweir 			aInnerRect.Top() ), aVal );
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 		// restore settings
99cdf0e10cSrcweir 		if ( !bOldTransp )
100cdf0e10cSrcweir 		{
101cdf0e10cSrcweir 			aFont.SetTransparent(sal_False);
102cdf0e10cSrcweir 			rDev.SetFont( aFont );
103cdf0e10cSrcweir 		}
104cdf0e10cSrcweir 		if (m_bDrawDisabled)
105cdf0e10cSrcweir 			rDev.SetTextColor(aOldColor);
106cdf0e10cSrcweir 	}
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 	if ( bCurs )
109cdf0e10cSrcweir 	{
110cdf0e10cSrcweir 		rDev.SetLineColor( Color( COL_BLACK ) );
111cdf0e10cSrcweir 		rDev.SetFillColor();
112cdf0e10cSrcweir 		rDev.DrawRect( Rectangle(
113cdf0e10cSrcweir 			Point( aRect.Left(), aRect.Top() ), Point( aRect.Right(), aRect.Bottom() ) ) );
114cdf0e10cSrcweir 	}
115cdf0e10cSrcweir 
116cdf0e10cSrcweir 	rDev.SetLineColor( aOldLineColor );
117cdf0e10cSrcweir 	rDev.SetFillColor( aOldFillColor );
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
120cdf0e10cSrcweir //-------------------------------------------------------------------
121cdf0e10cSrcweir 
BrowserColumn(sal_uInt16 nItemId,const class Image & rImage,const String & rTitle,sal_uLong nWidthPixel,const Fraction & rCurrentZoom,HeaderBarItemBits nFlags)122cdf0e10cSrcweir BrowserColumn::BrowserColumn( sal_uInt16 nItemId, const class Image &rImage,
123cdf0e10cSrcweir 							  const String& rTitle, sal_uLong nWidthPixel, const Fraction& rCurrentZoom,
124cdf0e10cSrcweir 							  HeaderBarItemBits nFlags )
125cdf0e10cSrcweir :	_nId( nItemId ),
126cdf0e10cSrcweir 	_nWidth( nWidthPixel ),
127cdf0e10cSrcweir 	_aImage( rImage ),
128cdf0e10cSrcweir 	_aTitle( rTitle ),
129cdf0e10cSrcweir 	_bFrozen( sal_False ),
130cdf0e10cSrcweir 	_nFlags( nFlags )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir 	double n = (double)_nWidth;
133cdf0e10cSrcweir 	n *= (double)rCurrentZoom.GetDenominator();
134cdf0e10cSrcweir 	n /= (double)rCurrentZoom.GetNumerator();
135cdf0e10cSrcweir 	_nOriginalWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
136cdf0e10cSrcweir }
137cdf0e10cSrcweir 
~BrowserColumn()138cdf0e10cSrcweir BrowserColumn::~BrowserColumn()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir //-------------------------------------------------------------------
143cdf0e10cSrcweir 
SetWidth(sal_uLong nNewWidthPixel,const Fraction & rCurrentZoom)144cdf0e10cSrcweir void BrowserColumn::SetWidth(sal_uLong nNewWidthPixel, const Fraction& rCurrentZoom)
145cdf0e10cSrcweir {
146cdf0e10cSrcweir 	_nWidth = nNewWidthPixel;
147cdf0e10cSrcweir 	double n = (double)_nWidth;
148cdf0e10cSrcweir 	n *= (double)rCurrentZoom.GetDenominator();
149cdf0e10cSrcweir 	n /= (double)rCurrentZoom.GetNumerator();
150cdf0e10cSrcweir 	_nOriginalWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
153cdf0e10cSrcweir //-------------------------------------------------------------------
154cdf0e10cSrcweir 
Draw(BrowseBox & rBox,OutputDevice & rDev,const Point & rPos,sal_Bool bCurs)155cdf0e10cSrcweir void BrowserColumn::Draw( BrowseBox& rBox, OutputDevice& rDev, const Point& rPos, sal_Bool bCurs  )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir 	if ( _nId == 0 )
158cdf0e10cSrcweir 	{
159cdf0e10cSrcweir 		// paint handle column
160cdf0e10cSrcweir 		ButtonFrame( rPos, Size( Width()-1, rBox.GetDataRowHeight()-1 ),
161cdf0e10cSrcweir 					 String(), sal_False, bCurs,
162cdf0e10cSrcweir 					 0 != (BROWSER_COLUMN_TITLEABBREVATION&_nFlags) ).Draw( rDev );
163cdf0e10cSrcweir 		Color aOldLineColor = rDev.GetLineColor();
164cdf0e10cSrcweir 		rDev.SetLineColor( Color( COL_BLACK ) );
165cdf0e10cSrcweir 		rDev.DrawLine(
166cdf0e10cSrcweir 			Point( rPos.X(), rPos.Y()+rBox.GetDataRowHeight()-1 ),
167cdf0e10cSrcweir 			Point( rPos.X() + Width() - 1, rPos.Y()+rBox.GetDataRowHeight()-1 ) );
168cdf0e10cSrcweir 		rDev.DrawLine(
169cdf0e10cSrcweir 			Point( rPos.X() + Width() - 1, rPos.Y() ),
170cdf0e10cSrcweir 			Point( rPos.X() + Width() - 1, rPos.Y()+rBox.GetDataRowHeight()-1 ) );
171cdf0e10cSrcweir 		rDev.SetLineColor( aOldLineColor );
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 		rBox.DoPaintField( rDev,
174cdf0e10cSrcweir 			Rectangle(
175cdf0e10cSrcweir 				Point( rPos.X() + 2, rPos.Y() + 2 ),
176cdf0e10cSrcweir 				Size( Width()-1, rBox.GetDataRowHeight()-1 ) ),
177cdf0e10cSrcweir 			GetId(),
178cdf0e10cSrcweir             BrowseBox::BrowserColumnAccess() );
179cdf0e10cSrcweir 	}
180cdf0e10cSrcweir 	else
181cdf0e10cSrcweir 	{
182cdf0e10cSrcweir 		// paint data column
183cdf0e10cSrcweir 		long nWidth = Width() == LONG_MAX ? rBox.GetDataWindow().GetSizePixel().Width() : Width();
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 		rBox.DoPaintField( rDev,
186cdf0e10cSrcweir 			Rectangle(
187cdf0e10cSrcweir 				Point( rPos.X() + MIN_COLUMNWIDTH, rPos.Y() ),
188cdf0e10cSrcweir 				Size( nWidth-2*MIN_COLUMNWIDTH, rBox.GetDataRowHeight()-1 ) ),
189cdf0e10cSrcweir 			GetId(),
190cdf0e10cSrcweir             BrowseBox::BrowserColumnAccess() );
191cdf0e10cSrcweir 	}
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
194cdf0e10cSrcweir //-------------------------------------------------------------------
195cdf0e10cSrcweir 
ZoomChanged(const Fraction & rNewZoom)196cdf0e10cSrcweir void BrowserColumn::ZoomChanged(const Fraction& rNewZoom)
197cdf0e10cSrcweir {
198cdf0e10cSrcweir 	double n = (double)_nOriginalWidth;
199cdf0e10cSrcweir 	n *= (double)rNewZoom.GetNumerator();
200cdf0e10cSrcweir 	n /= (double)rNewZoom.GetDenominator();
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	_nWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
203cdf0e10cSrcweir }
204cdf0e10cSrcweir 
205cdf0e10cSrcweir //-------------------------------------------------------------------
206cdf0e10cSrcweir 
BrowserDataWin(BrowseBox * pParent)207cdf0e10cSrcweir BrowserDataWin::BrowserDataWin( BrowseBox* pParent )
208cdf0e10cSrcweir     :Control( pParent, WinBits(WB_CLIPCHILDREN) )
209cdf0e10cSrcweir 	,DragSourceHelper( this )
210cdf0e10cSrcweir 	,DropTargetHelper( this )
211cdf0e10cSrcweir 	,pHeaderBar( 0 )
212cdf0e10cSrcweir 	,pEventWin( pParent )
213cdf0e10cSrcweir 	,pCornerWin( 0 )
214cdf0e10cSrcweir 	,pDtorNotify( 0 )
215cdf0e10cSrcweir 	,bInPaint( sal_False )
216cdf0e10cSrcweir 	,bInCommand( sal_False )
217cdf0e10cSrcweir 	,bNoScrollBack( sal_False )
218cdf0e10cSrcweir     ,bNoHScroll( sal_False )
219cdf0e10cSrcweir     ,bNoVScroll( sal_False )
220cdf0e10cSrcweir 	,bUpdateMode( sal_True )
221cdf0e10cSrcweir 	,bResizeOnPaint( sal_False )
222cdf0e10cSrcweir 	,bUpdateOnUnlock( sal_False )
223cdf0e10cSrcweir 	,bInUpdateScrollbars( sal_False )
224cdf0e10cSrcweir 	,bHadRecursion( sal_False )
225cdf0e10cSrcweir 	,bOwnDataChangedHdl( sal_False )
226cdf0e10cSrcweir 	,bCallingDropCallback( sal_False )
227cdf0e10cSrcweir 	,nUpdateLock( 0 )
228cdf0e10cSrcweir 	,nCursorHidden( 0 )
229cdf0e10cSrcweir     ,m_nDragRowDividerLimit( 0 )
230cdf0e10cSrcweir     ,m_nDragRowDividerOffset( 0 )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir 	aMouseTimer.SetTimeoutHdl( LINK( this, BrowserDataWin, RepeatedMouseMove ) );
233cdf0e10cSrcweir 	aMouseTimer.SetTimeout( 100 );
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir //-------------------------------------------------------------------
~BrowserDataWin()237cdf0e10cSrcweir BrowserDataWin::~BrowserDataWin()
238cdf0e10cSrcweir {
239cdf0e10cSrcweir 	if( pDtorNotify )
240cdf0e10cSrcweir 		*pDtorNotify = sal_True;
241cdf0e10cSrcweir }
242cdf0e10cSrcweir 
243cdf0e10cSrcweir //-------------------------------------------------------------------
LeaveUpdateLock()244cdf0e10cSrcweir void BrowserDataWin::LeaveUpdateLock()
245cdf0e10cSrcweir {
246cdf0e10cSrcweir 	if ( !--nUpdateLock )
247cdf0e10cSrcweir 	{
248cdf0e10cSrcweir 		DoOutstandingInvalidations();
249cdf0e10cSrcweir 		if (bUpdateOnUnlock )
250cdf0e10cSrcweir 		{
251cdf0e10cSrcweir 			Control::Update();
252cdf0e10cSrcweir 			bUpdateOnUnlock = sal_False;
253cdf0e10cSrcweir 		}
254cdf0e10cSrcweir 	}
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir //-------------------------------------------------------------------
InitSettings_Impl(Window * pWin,sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground)258cdf0e10cSrcweir void InitSettings_Impl( Window *pWin,
259cdf0e10cSrcweir 					 sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir 	const StyleSettings& rStyleSettings =
262cdf0e10cSrcweir 			pWin->GetSettings().GetStyleSettings();
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 	if ( bFont )
265cdf0e10cSrcweir 	{
266cdf0e10cSrcweir 		Font aFont = rStyleSettings.GetFieldFont();
267cdf0e10cSrcweir 		if ( pWin->IsControlFont() )
268cdf0e10cSrcweir 			aFont.Merge( pWin->GetControlFont() );
269cdf0e10cSrcweir 		pWin->SetZoomedPointFont( aFont );
270cdf0e10cSrcweir 	}
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 	if ( bFont || bForeground )
273cdf0e10cSrcweir 	{
274cdf0e10cSrcweir 		Color aTextColor = rStyleSettings.GetWindowTextColor();
275cdf0e10cSrcweir 		if ( pWin->IsControlForeground() )
276cdf0e10cSrcweir 			aTextColor = pWin->GetControlForeground();
277cdf0e10cSrcweir 		pWin->SetTextColor( aTextColor );
278cdf0e10cSrcweir 	}
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 	if ( bBackground )
281cdf0e10cSrcweir 	{
282cdf0e10cSrcweir 		if( pWin->IsControlBackground() )
283cdf0e10cSrcweir 			pWin->SetBackground( pWin->GetControlBackground() );
284cdf0e10cSrcweir 		else
285cdf0e10cSrcweir 			pWin->SetBackground( rStyleSettings.GetWindowColor() );
286cdf0e10cSrcweir 	}
287cdf0e10cSrcweir }
288cdf0e10cSrcweir 
289cdf0e10cSrcweir //-------------------------------------------------------------------
Update()290cdf0e10cSrcweir void BrowserDataWin::Update()
291cdf0e10cSrcweir {
292cdf0e10cSrcweir 	if ( !nUpdateLock )
293cdf0e10cSrcweir 		Control::Update();
294cdf0e10cSrcweir 	else
295cdf0e10cSrcweir 		bUpdateOnUnlock = sal_True;
296cdf0e10cSrcweir }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir //-------------------------------------------------------------------
DataChanged(const DataChangedEvent & rDCEvt)299cdf0e10cSrcweir void BrowserDataWin::DataChanged( const DataChangedEvent& rDCEvt )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
302cdf0e10cSrcweir 		 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
303cdf0e10cSrcweir 	{
304cdf0e10cSrcweir 		if( !bOwnDataChangedHdl )
305cdf0e10cSrcweir 		{
306cdf0e10cSrcweir 			InitSettings_Impl( this, sal_True, sal_True, sal_True );
307cdf0e10cSrcweir 			Invalidate();
308cdf0e10cSrcweir 			InitSettings_Impl( GetParent(), sal_True, sal_True, sal_True );
309cdf0e10cSrcweir 			GetParent()->Invalidate();
310cdf0e10cSrcweir 			GetParent()->Resize();
311cdf0e10cSrcweir 		}
312cdf0e10cSrcweir 	}
313cdf0e10cSrcweir 	else
314cdf0e10cSrcweir 		Control::DataChanged( rDCEvt );
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir //-------------------------------------------------------------------
Paint(const Rectangle & rRect)318cdf0e10cSrcweir void BrowserDataWin::Paint( const Rectangle& rRect )
319cdf0e10cSrcweir {
320cdf0e10cSrcweir 	if ( !nUpdateLock && GetUpdateMode() )
321cdf0e10cSrcweir 	{
322cdf0e10cSrcweir 		if ( bInPaint )
323cdf0e10cSrcweir 		{
324cdf0e10cSrcweir 			aInvalidRegion.Insert( new Rectangle( rRect ) );
325cdf0e10cSrcweir 			return;
326cdf0e10cSrcweir 		}
327cdf0e10cSrcweir 		bInPaint = sal_True;
328cdf0e10cSrcweir 		( (BrowseBox*) GetParent() )->PaintData( *this, rRect );
329cdf0e10cSrcweir 		bInPaint = sal_False;
330cdf0e10cSrcweir 		DoOutstandingInvalidations();
331cdf0e10cSrcweir 	}
332cdf0e10cSrcweir 	else
333cdf0e10cSrcweir 		aInvalidRegion.Insert( new Rectangle( rRect ) );
334cdf0e10cSrcweir }
335cdf0e10cSrcweir 
336cdf0e10cSrcweir //-------------------------------------------------------------------
337cdf0e10cSrcweir 
CreateBrowseEvent(const Point & rPosPixel)338cdf0e10cSrcweir BrowseEvent BrowserDataWin::CreateBrowseEvent( const Point& rPosPixel )
339cdf0e10cSrcweir {
340cdf0e10cSrcweir 	BrowseBox *pBox = GetParent();
341cdf0e10cSrcweir 
342cdf0e10cSrcweir 	// seek to row under mouse
343cdf0e10cSrcweir 	long nRelRow = rPosPixel.Y() < 0
344cdf0e10cSrcweir 			? -1
345cdf0e10cSrcweir 			: rPosPixel.Y() / pBox->GetDataRowHeight();
346cdf0e10cSrcweir 	long nRow = nRelRow < 0 ? -1 : nRelRow + pBox->nTopRow;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 	// find column under mouse
349cdf0e10cSrcweir 	long nMouseX = rPosPixel.X();
350cdf0e10cSrcweir 	long nColX = 0;
351cdf0e10cSrcweir 	sal_uInt16 nCol;
352cdf0e10cSrcweir 	for ( nCol = 0;
353cdf0e10cSrcweir 		  nCol < pBox->pCols->Count() && nColX < GetSizePixel().Width();
354cdf0e10cSrcweir 		  ++nCol )
355cdf0e10cSrcweir 		if ( pBox->pCols->GetObject(nCol)->IsFrozen() || nCol >= pBox->nFirstCol )
356cdf0e10cSrcweir 		{
357cdf0e10cSrcweir 			nColX += pBox->pCols->GetObject(nCol)->Width();
358cdf0e10cSrcweir 			if ( nMouseX < nColX )
359cdf0e10cSrcweir 				break;
360cdf0e10cSrcweir 		}
361cdf0e10cSrcweir 	sal_uInt16 nColId = BROWSER_INVALIDID;
362cdf0e10cSrcweir 	if ( nCol < pBox->pCols->Count() )
363cdf0e10cSrcweir 		nColId = pBox->pCols->GetObject(nCol)->GetId();
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 	// compute the field rectangle and field relative MouseEvent
366cdf0e10cSrcweir 	Rectangle aFieldRect;
367cdf0e10cSrcweir 	if ( nCol < pBox->pCols->Count() )
368cdf0e10cSrcweir 	{
369cdf0e10cSrcweir 		nColX -= pBox->pCols->GetObject(nCol)->Width();
370cdf0e10cSrcweir 		aFieldRect = Rectangle(
371cdf0e10cSrcweir 			Point( nColX, nRelRow * pBox->GetDataRowHeight() ),
372cdf0e10cSrcweir 			Size( pBox->pCols->GetObject(nCol)->Width(),
373cdf0e10cSrcweir 				  pBox->GetDataRowHeight() ) );
374cdf0e10cSrcweir 	}
375cdf0e10cSrcweir 
376cdf0e10cSrcweir 	// assemble and return the BrowseEvent
377cdf0e10cSrcweir 	return BrowseEvent( this, nRow, nCol, nColId, aFieldRect );
378cdf0e10cSrcweir }
379cdf0e10cSrcweir 
380cdf0e10cSrcweir //-------------------------------------------------------------------
AcceptDrop(const AcceptDropEvent & _rEvt)381cdf0e10cSrcweir sal_Int8 BrowserDataWin::AcceptDrop( const AcceptDropEvent& _rEvt )
382cdf0e10cSrcweir {
383cdf0e10cSrcweir 	bCallingDropCallback = sal_True;
384cdf0e10cSrcweir 	sal_Int8 nReturn = DND_ACTION_NONE;
385cdf0e10cSrcweir 	nReturn = GetParent()->AcceptDrop( BrowserAcceptDropEvent( this, _rEvt ) );
386cdf0e10cSrcweir 	bCallingDropCallback = sal_False;
387cdf0e10cSrcweir 	return nReturn;
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir //-------------------------------------------------------------------
ExecuteDrop(const ExecuteDropEvent & _rEvt)391cdf0e10cSrcweir sal_Int8 BrowserDataWin::ExecuteDrop( const ExecuteDropEvent& _rEvt )
392cdf0e10cSrcweir {
393cdf0e10cSrcweir 	bCallingDropCallback = sal_True;
394cdf0e10cSrcweir 	sal_Int8 nReturn = DND_ACTION_NONE;
395cdf0e10cSrcweir 	nReturn = GetParent()->ExecuteDrop( BrowserExecuteDropEvent( this, _rEvt ) );
396cdf0e10cSrcweir 	bCallingDropCallback = sal_False;
397cdf0e10cSrcweir 	return nReturn;
398cdf0e10cSrcweir }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir //-------------------------------------------------------------------
StartDrag(sal_Int8 _nAction,const Point & _rPosPixel)401cdf0e10cSrcweir void BrowserDataWin::StartDrag( sal_Int8 _nAction, const Point& _rPosPixel )
402cdf0e10cSrcweir {
403cdf0e10cSrcweir     if ( !GetParent()->bRowDividerDrag )
404cdf0e10cSrcweir     {
405cdf0e10cSrcweir 	    Point aEventPos( _rPosPixel );
406cdf0e10cSrcweir 	    aEventPos.Y() += GetParent()->GetTitleHeight();
407cdf0e10cSrcweir 	    GetParent()->StartDrag( _nAction, aEventPos );
408cdf0e10cSrcweir     }
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir //-------------------------------------------------------------------
Command(const CommandEvent & rEvt)412cdf0e10cSrcweir void BrowserDataWin::Command( const CommandEvent& rEvt )
413cdf0e10cSrcweir {
414cdf0e10cSrcweir 	// Scrollmaus-Event?
415cdf0e10cSrcweir 	BrowseBox *pBox = GetParent();
416cdf0e10cSrcweir 	if ( ( (rEvt.GetCommand() == COMMAND_WHEEL) ||
417cdf0e10cSrcweir 		   (rEvt.GetCommand() == COMMAND_STARTAUTOSCROLL) ||
418cdf0e10cSrcweir 		   (rEvt.GetCommand() == COMMAND_AUTOSCROLL) ) &&
419cdf0e10cSrcweir 		 ( HandleScrollCommand( rEvt, &pBox->aHScroll, pBox->pVScroll ) ) )
420cdf0e10cSrcweir 	  return;
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 	Point aEventPos( rEvt.GetMousePosPixel() );
423cdf0e10cSrcweir 	long nRow = pBox->GetRowAtYPosPixel( aEventPos.Y(), sal_False);
424cdf0e10cSrcweir 	MouseEvent aMouseEvt( aEventPos, 1, MOUSE_SELECT, MOUSE_LEFT );
425cdf0e10cSrcweir 	if ( COMMAND_CONTEXTMENU == rEvt.GetCommand() && rEvt.IsMouseEvent() &&
426cdf0e10cSrcweir 		 nRow < pBox->GetRowCount() && !pBox->IsRowSelected(nRow) )
427cdf0e10cSrcweir 	{
428cdf0e10cSrcweir 		sal_Bool bDeleted = sal_False;
429cdf0e10cSrcweir 		pDtorNotify = &bDeleted;
430cdf0e10cSrcweir 		bInCommand = sal_True;
431cdf0e10cSrcweir 		MouseButtonDown( aMouseEvt );
432cdf0e10cSrcweir 		if( bDeleted )
433cdf0e10cSrcweir 			return;
434cdf0e10cSrcweir 		MouseButtonUp( aMouseEvt );
435cdf0e10cSrcweir 		if( bDeleted )
436cdf0e10cSrcweir 			return;
437cdf0e10cSrcweir 		pDtorNotify = 0;
438cdf0e10cSrcweir 		bInCommand = sal_False;
439cdf0e10cSrcweir 	}
440cdf0e10cSrcweir 
441cdf0e10cSrcweir 	aEventPos.Y() += GetParent()->GetTitleHeight();
442cdf0e10cSrcweir 	CommandEvent aEvt( aEventPos, rEvt.GetCommand(),
443cdf0e10cSrcweir 						rEvt.IsMouseEvent(), rEvt.GetData() );
444cdf0e10cSrcweir 	bInCommand = sal_True;
445cdf0e10cSrcweir 	sal_Bool bDeleted = sal_False;
446cdf0e10cSrcweir 	pDtorNotify = &bDeleted;
447cdf0e10cSrcweir 	GetParent()->Command( aEvt );
448cdf0e10cSrcweir 	if( bDeleted )
449cdf0e10cSrcweir 		return;
450cdf0e10cSrcweir 	pDtorNotify = 0;
451cdf0e10cSrcweir 	bInCommand = sal_False;
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 	if ( COMMAND_STARTDRAG == rEvt.GetCommand() )
454cdf0e10cSrcweir 		MouseButtonUp( aMouseEvt );
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 	Control::Command( rEvt );
457cdf0e10cSrcweir }
458cdf0e10cSrcweir 
459cdf0e10cSrcweir //-------------------------------------------------------------------
460cdf0e10cSrcweir 
ImplRowDividerHitTest(const BrowserMouseEvent & _rEvent)461cdf0e10cSrcweir sal_Bool BrowserDataWin::ImplRowDividerHitTest( const BrowserMouseEvent& _rEvent )
462cdf0e10cSrcweir {
463cdf0e10cSrcweir     if ( ! (  GetParent()->IsInteractiveRowHeightEnabled()
464cdf0e10cSrcweir            && ( _rEvent.GetRow() >= 0 )
465cdf0e10cSrcweir            && ( _rEvent.GetRow() < GetParent()->GetRowCount() )
466cdf0e10cSrcweir            && ( _rEvent.GetColumnId() == 0 )
467cdf0e10cSrcweir            )
468cdf0e10cSrcweir        )
469cdf0e10cSrcweir        return sal_False;
470cdf0e10cSrcweir 
471cdf0e10cSrcweir     long nDividerDistance = GetParent()->GetDataRowHeight() - ( _rEvent.GetPosPixel().Y() % GetParent()->GetDataRowHeight() );
472cdf0e10cSrcweir     return ( nDividerDistance <= 4 );
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir //-------------------------------------------------------------------
476cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rEvt)477cdf0e10cSrcweir void BrowserDataWin::MouseButtonDown( const MouseEvent& rEvt )
478cdf0e10cSrcweir {
479cdf0e10cSrcweir 	aLastMousePos = OutputToScreenPixel( rEvt.GetPosPixel() );
480cdf0e10cSrcweir 
481cdf0e10cSrcweir     BrowserMouseEvent aBrowserEvent( this, rEvt );
482cdf0e10cSrcweir     if ( ( aBrowserEvent.GetClicks() == 1 ) && ImplRowDividerHitTest( aBrowserEvent ) )
483cdf0e10cSrcweir     {
484cdf0e10cSrcweir         StartRowDividerDrag( aBrowserEvent.GetPosPixel() );
485cdf0e10cSrcweir         return;
486cdf0e10cSrcweir     }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir     GetParent()->MouseButtonDown( BrowserMouseEvent( this, rEvt ) );
489cdf0e10cSrcweir }
490cdf0e10cSrcweir 
491cdf0e10cSrcweir //-------------------------------------------------------------------
492cdf0e10cSrcweir 
MouseMove(const MouseEvent & rEvt)493cdf0e10cSrcweir void BrowserDataWin::MouseMove( const MouseEvent& rEvt )
494cdf0e10cSrcweir {
495cdf0e10cSrcweir 	// Pseudo MouseMoves verhindern
496cdf0e10cSrcweir 	Point aNewPos = OutputToScreenPixel( rEvt.GetPosPixel() );
497cdf0e10cSrcweir 	if ( ( aNewPos == aLastMousePos ) )
498cdf0e10cSrcweir 		return;
499cdf0e10cSrcweir 	aLastMousePos = aNewPos;
500cdf0e10cSrcweir 
501cdf0e10cSrcweir 	// transform to a BrowseEvent
502cdf0e10cSrcweir     BrowserMouseEvent aBrowserEvent( this, rEvt );
503cdf0e10cSrcweir 	GetParent()->MouseMove( aBrowserEvent );
504cdf0e10cSrcweir 
505cdf0e10cSrcweir     // pointer shape
506cdf0e10cSrcweir 	PointerStyle ePointerStyle = POINTER_ARROW;
507cdf0e10cSrcweir     if ( ImplRowDividerHitTest( aBrowserEvent ) )
508cdf0e10cSrcweir         ePointerStyle = POINTER_VSIZEBAR;
509cdf0e10cSrcweir 	SetPointer( Pointer( ePointerStyle ) );
510cdf0e10cSrcweir 
511cdf0e10cSrcweir     // dragging out of the visible area?
512cdf0e10cSrcweir 	if ( rEvt.IsLeft() &&
513cdf0e10cSrcweir 		 ( rEvt.GetPosPixel().Y() > GetSizePixel().Height() ||
514cdf0e10cSrcweir 		   rEvt.GetPosPixel().Y() < 0 ) )
515cdf0e10cSrcweir 	{
516cdf0e10cSrcweir 		// repeat the event
517cdf0e10cSrcweir 		aRepeatEvt = rEvt;
518cdf0e10cSrcweir 		aMouseTimer.Start();
519cdf0e10cSrcweir 	}
520cdf0e10cSrcweir 	else
521cdf0e10cSrcweir 		// killing old repeat-event
522cdf0e10cSrcweir 		if ( aMouseTimer.IsActive() )
523cdf0e10cSrcweir 			aMouseTimer.Stop();
524cdf0e10cSrcweir }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir //-------------------------------------------------------------------
527cdf0e10cSrcweir 
IMPL_LINK_INLINE_START(BrowserDataWin,RepeatedMouseMove,void *,EMPTYARG)528cdf0e10cSrcweir IMPL_LINK_INLINE_START( BrowserDataWin, RepeatedMouseMove, void *, EMPTYARG )
529cdf0e10cSrcweir {
530cdf0e10cSrcweir 	GetParent()->MouseMove( BrowserMouseEvent( this, aRepeatEvt ) );
531cdf0e10cSrcweir 	return 0;
532cdf0e10cSrcweir }
IMPL_LINK_INLINE_END(BrowserDataWin,RepeatedMouseMove,void *,EMPTYARG)533cdf0e10cSrcweir IMPL_LINK_INLINE_END( BrowserDataWin, RepeatedMouseMove, void *, EMPTYARG )
534cdf0e10cSrcweir 
535cdf0e10cSrcweir //-------------------------------------------------------------------
536cdf0e10cSrcweir 
537cdf0e10cSrcweir void BrowserDataWin::MouseButtonUp( const MouseEvent& rEvt )
538cdf0e10cSrcweir {
539cdf0e10cSrcweir 	// Pseudo MouseMoves verhindern
540cdf0e10cSrcweir 	Point aNewPos = OutputToScreenPixel( rEvt.GetPosPixel() );
541cdf0e10cSrcweir 	aLastMousePos = aNewPos;
542cdf0e10cSrcweir 
543cdf0e10cSrcweir 	// Move an die aktuelle Position simulieren
544cdf0e10cSrcweir 	MouseMove( rEvt );
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 	// eigentliches Up-Handling
547cdf0e10cSrcweir 	ReleaseMouse();
548cdf0e10cSrcweir 	if ( aMouseTimer.IsActive() )
549cdf0e10cSrcweir 		aMouseTimer.Stop();
550cdf0e10cSrcweir 	GetParent()->MouseButtonUp( BrowserMouseEvent( this, rEvt ) );
551cdf0e10cSrcweir }
552cdf0e10cSrcweir 
553cdf0e10cSrcweir //-------------------------------------------------------------------
554cdf0e10cSrcweir 
StartRowDividerDrag(const Point & _rStartPos)555cdf0e10cSrcweir void BrowserDataWin::StartRowDividerDrag( const Point& _rStartPos )
556cdf0e10cSrcweir {
557cdf0e10cSrcweir     long nDataRowHeight = GetParent()->GetDataRowHeight();
558cdf0e10cSrcweir     // the exact separation pos of the two rows
559cdf0e10cSrcweir     long nDragRowDividerCurrentPos = _rStartPos.Y();
560cdf0e10cSrcweir     if ( ( nDragRowDividerCurrentPos % nDataRowHeight ) > nDataRowHeight / 2 )
561cdf0e10cSrcweir         nDragRowDividerCurrentPos += nDataRowHeight;
562cdf0e10cSrcweir     nDragRowDividerCurrentPos /= nDataRowHeight;
563cdf0e10cSrcweir     nDragRowDividerCurrentPos *= nDataRowHeight;
564cdf0e10cSrcweir 
565cdf0e10cSrcweir     m_nDragRowDividerOffset = nDragRowDividerCurrentPos - _rStartPos.Y();
566cdf0e10cSrcweir 
567cdf0e10cSrcweir     m_nDragRowDividerLimit = nDragRowDividerCurrentPos - nDataRowHeight;
568cdf0e10cSrcweir 
569cdf0e10cSrcweir     GetParent()->bRowDividerDrag = sal_True;
570cdf0e10cSrcweir     GetParent()->ImplStartTracking();
571cdf0e10cSrcweir 
572cdf0e10cSrcweir 	Rectangle aDragSplitRect( 0, m_nDragRowDividerLimit, GetOutputSizePixel().Width(), nDragRowDividerCurrentPos );
573cdf0e10cSrcweir 	ShowTracking( aDragSplitRect, SHOWTRACK_SMALL );
574cdf0e10cSrcweir 
575cdf0e10cSrcweir     StartTracking();
576cdf0e10cSrcweir }
577cdf0e10cSrcweir 
578cdf0e10cSrcweir //-------------------------------------------------------------------
579cdf0e10cSrcweir 
Tracking(const TrackingEvent & rTEvt)580cdf0e10cSrcweir void BrowserDataWin::Tracking( const TrackingEvent& rTEvt )
581cdf0e10cSrcweir {
582cdf0e10cSrcweir     if ( !GetParent()->bRowDividerDrag )
583cdf0e10cSrcweir         return;
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 	Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
586cdf0e10cSrcweir     // stop resizing at our bottom line
587cdf0e10cSrcweir     if ( aMousePos.Y() > GetOutputSizePixel().Height() )
588cdf0e10cSrcweir         aMousePos.Y() = GetOutputSizePixel().Height();
589cdf0e10cSrcweir 
590cdf0e10cSrcweir 	if ( rTEvt.IsTrackingEnded() )
591cdf0e10cSrcweir     {
592cdf0e10cSrcweir     	HideTracking();
593cdf0e10cSrcweir         GetParent()->bRowDividerDrag = sal_False;
594cdf0e10cSrcweir         GetParent()->ImplEndTracking();
595cdf0e10cSrcweir 
596cdf0e10cSrcweir         if ( !rTEvt.IsTrackingCanceled() )
597cdf0e10cSrcweir         {
598cdf0e10cSrcweir             long nNewRowHeight = aMousePos.Y() + m_nDragRowDividerOffset - m_nDragRowDividerLimit;
599cdf0e10cSrcweir 
600cdf0e10cSrcweir             // care for minimum row height
601cdf0e10cSrcweir             if ( nNewRowHeight < GetParent()->QueryMinimumRowHeight() )
602cdf0e10cSrcweir                 nNewRowHeight = GetParent()->QueryMinimumRowHeight();
603cdf0e10cSrcweir 
604cdf0e10cSrcweir             GetParent()->SetDataRowHeight( nNewRowHeight );
605cdf0e10cSrcweir             GetParent()->RowHeightChanged();
606cdf0e10cSrcweir         }
607cdf0e10cSrcweir     }
608cdf0e10cSrcweir 	else
609cdf0e10cSrcweir     {
610cdf0e10cSrcweir         GetParent()->ImplTracking();
611cdf0e10cSrcweir 
612cdf0e10cSrcweir         long nDragRowDividerCurrentPos = aMousePos.Y() + m_nDragRowDividerOffset;
613cdf0e10cSrcweir 
614cdf0e10cSrcweir         // care for minimum row height
615cdf0e10cSrcweir         if ( nDragRowDividerCurrentPos < m_nDragRowDividerLimit + GetParent()->QueryMinimumRowHeight() )
616cdf0e10cSrcweir             nDragRowDividerCurrentPos = m_nDragRowDividerLimit + GetParent()->QueryMinimumRowHeight();
617cdf0e10cSrcweir 
618cdf0e10cSrcweir         Rectangle aDragSplitRect( 0, m_nDragRowDividerLimit, GetOutputSizePixel().Width(), nDragRowDividerCurrentPos );
619cdf0e10cSrcweir         ShowTracking( aDragSplitRect, SHOWTRACK_SMALL );
620cdf0e10cSrcweir     }
621cdf0e10cSrcweir }
622cdf0e10cSrcweir 
623cdf0e10cSrcweir //-------------------------------------------------------------------
624cdf0e10cSrcweir 
KeyInput(const KeyEvent & rEvt)625cdf0e10cSrcweir void BrowserDataWin::KeyInput( const KeyEvent& rEvt )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir 	// pass to parent window
628cdf0e10cSrcweir 	if ( !GetParent()->ProcessKey( rEvt ) )
629cdf0e10cSrcweir 		Control::KeyInput( rEvt );
630cdf0e10cSrcweir }
631cdf0e10cSrcweir 
632cdf0e10cSrcweir //-------------------------------------------------------------------
633cdf0e10cSrcweir 
RequestHelp(const HelpEvent & rHEvt)634cdf0e10cSrcweir void BrowserDataWin::RequestHelp( const HelpEvent& rHEvt )
635cdf0e10cSrcweir {
636cdf0e10cSrcweir 	pEventWin = this;
637cdf0e10cSrcweir 	GetParent()->RequestHelp( rHEvt );
638cdf0e10cSrcweir 	pEventWin = GetParent();
639cdf0e10cSrcweir }
640cdf0e10cSrcweir 
641cdf0e10cSrcweir //===================================================================
642cdf0e10cSrcweir 
BrowseEvent(Window * pWindow,long nAbsRow,sal_uInt16 nColumn,sal_uInt16 nColumnId,const Rectangle & rRect)643cdf0e10cSrcweir BrowseEvent::BrowseEvent( Window* pWindow,
644cdf0e10cSrcweir 						  long nAbsRow, sal_uInt16 nColumn, sal_uInt16 nColumnId,
645cdf0e10cSrcweir 						  const Rectangle& rRect ):
646cdf0e10cSrcweir 	pWin(pWindow),
647cdf0e10cSrcweir 	nRow(nAbsRow),
648cdf0e10cSrcweir 	aRect(rRect),
649cdf0e10cSrcweir 	nCol(nColumn),
650cdf0e10cSrcweir 	nColId(nColumnId)
651cdf0e10cSrcweir {
652cdf0e10cSrcweir }
653cdf0e10cSrcweir 
654cdf0e10cSrcweir //===================================================================
BrowserMouseEvent(BrowserDataWin * pWindow,const MouseEvent & rEvt)655cdf0e10cSrcweir BrowserMouseEvent::BrowserMouseEvent( BrowserDataWin *pWindow,
656cdf0e10cSrcweir 						  const MouseEvent& rEvt ):
657cdf0e10cSrcweir 	MouseEvent(rEvt),
658cdf0e10cSrcweir 	BrowseEvent( pWindow->CreateBrowseEvent( rEvt.GetPosPixel() ) )
659cdf0e10cSrcweir {
660cdf0e10cSrcweir }
661cdf0e10cSrcweir 
662cdf0e10cSrcweir //-------------------------------------------------------------------
663cdf0e10cSrcweir 
BrowserMouseEvent(Window * pWindow,const MouseEvent & rEvt,long nAbsRow,sal_uInt16 nColumn,sal_uInt16 nColumnId,const Rectangle & rRect)664cdf0e10cSrcweir BrowserMouseEvent::BrowserMouseEvent( Window *pWindow, const MouseEvent& rEvt,
665cdf0e10cSrcweir 						  long nAbsRow, sal_uInt16 nColumn, sal_uInt16 nColumnId,
666cdf0e10cSrcweir 						  const Rectangle& rRect ):
667cdf0e10cSrcweir 	MouseEvent(rEvt),
668cdf0e10cSrcweir 	BrowseEvent( pWindow, nAbsRow, nColumn, nColumnId, rRect )
669cdf0e10cSrcweir {
670cdf0e10cSrcweir }
671cdf0e10cSrcweir 
672cdf0e10cSrcweir //===================================================================
673cdf0e10cSrcweir 
BrowserAcceptDropEvent(BrowserDataWin * pWindow,const AcceptDropEvent & rEvt)674cdf0e10cSrcweir BrowserAcceptDropEvent::BrowserAcceptDropEvent( BrowserDataWin *pWindow, const AcceptDropEvent& rEvt )
675cdf0e10cSrcweir 	:AcceptDropEvent(rEvt)
676cdf0e10cSrcweir 	,BrowseEvent( pWindow->CreateBrowseEvent( rEvt.maPosPixel ) )
677cdf0e10cSrcweir {
678cdf0e10cSrcweir }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir //===================================================================
681cdf0e10cSrcweir 
BrowserExecuteDropEvent(BrowserDataWin * pWindow,const ExecuteDropEvent & rEvt)682cdf0e10cSrcweir BrowserExecuteDropEvent::BrowserExecuteDropEvent( BrowserDataWin *pWindow, const ExecuteDropEvent& rEvt )
683cdf0e10cSrcweir 	:ExecuteDropEvent(rEvt)
684cdf0e10cSrcweir 	,BrowseEvent( pWindow->CreateBrowseEvent( rEvt.maPosPixel ) )
685cdf0e10cSrcweir {
686cdf0e10cSrcweir }
687cdf0e10cSrcweir 
688cdf0e10cSrcweir //===================================================================
689cdf0e10cSrcweir 
690cdf0e10cSrcweir //-------------------------------------------------------------------
691cdf0e10cSrcweir 
SetUpdateMode(sal_Bool bMode)692cdf0e10cSrcweir void BrowserDataWin::SetUpdateMode( sal_Bool bMode )
693cdf0e10cSrcweir {
694cdf0e10cSrcweir 	DBG_ASSERT( !bUpdateMode || aInvalidRegion.Count() == 0,
695cdf0e10cSrcweir 				"invalid region not empty" );
696cdf0e10cSrcweir 	if ( bMode == bUpdateMode )
697cdf0e10cSrcweir 		return;
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 	bUpdateMode = bMode;
700cdf0e10cSrcweir 	if ( bMode )
701cdf0e10cSrcweir 		DoOutstandingInvalidations();
702cdf0e10cSrcweir }
703cdf0e10cSrcweir 
704cdf0e10cSrcweir //-------------------------------------------------------------------
DoOutstandingInvalidations()705cdf0e10cSrcweir void BrowserDataWin::DoOutstandingInvalidations()
706cdf0e10cSrcweir {
707cdf0e10cSrcweir 	for ( Rectangle* pRect = aInvalidRegion.First();
708cdf0e10cSrcweir 		  pRect;
709cdf0e10cSrcweir 		  pRect = aInvalidRegion.Next() )
710cdf0e10cSrcweir 	{
711cdf0e10cSrcweir 		Control::Invalidate( *pRect );
712cdf0e10cSrcweir 		delete pRect;
713cdf0e10cSrcweir 	}
714cdf0e10cSrcweir 	aInvalidRegion.Clear();
715cdf0e10cSrcweir }
716cdf0e10cSrcweir 
717cdf0e10cSrcweir //-------------------------------------------------------------------
718cdf0e10cSrcweir 
Invalidate(sal_uInt16 nFlags)719cdf0e10cSrcweir void BrowserDataWin::Invalidate( sal_uInt16 nFlags )
720cdf0e10cSrcweir {
721cdf0e10cSrcweir 	if ( !GetUpdateMode() )
722cdf0e10cSrcweir 	{
723cdf0e10cSrcweir 		for ( Rectangle* pRect = aInvalidRegion.First();
724cdf0e10cSrcweir 			  pRect;
725cdf0e10cSrcweir 			  pRect = aInvalidRegion.Next() )
726cdf0e10cSrcweir 			delete pRect;
727cdf0e10cSrcweir 		aInvalidRegion.Clear();
728cdf0e10cSrcweir 		aInvalidRegion.Insert( new Rectangle( Point( 0, 0 ), GetOutputSizePixel() ) );
729cdf0e10cSrcweir 	}
730cdf0e10cSrcweir 	else
731cdf0e10cSrcweir 		Window::Invalidate( nFlags );
732cdf0e10cSrcweir }
733cdf0e10cSrcweir 
734cdf0e10cSrcweir //-------------------------------------------------------------------
735cdf0e10cSrcweir 
Invalidate(const Rectangle & rRect,sal_uInt16 nFlags)736cdf0e10cSrcweir void BrowserDataWin::Invalidate( const Rectangle& rRect, sal_uInt16 nFlags )
737cdf0e10cSrcweir {
738cdf0e10cSrcweir 	if ( !GetUpdateMode() )
739cdf0e10cSrcweir 		aInvalidRegion.Insert( new Rectangle( rRect ) );
740cdf0e10cSrcweir 	else
741cdf0e10cSrcweir 		Window::Invalidate( rRect, nFlags );
742cdf0e10cSrcweir }
743cdf0e10cSrcweir 
744cdf0e10cSrcweir //===================================================================
745cdf0e10cSrcweir 
Tracking(const TrackingEvent & rTEvt)746cdf0e10cSrcweir void BrowserScrollBar::Tracking( const TrackingEvent& rTEvt )
747cdf0e10cSrcweir {
748cdf0e10cSrcweir 	sal_uLong nPos = GetThumbPos();
749cdf0e10cSrcweir 	if ( nPos != _nLastPos )
750cdf0e10cSrcweir 	{
751cdf0e10cSrcweir 		String aTip( String::CreateFromInt32(nPos) );
752cdf0e10cSrcweir 		aTip += '/';
753cdf0e10cSrcweir 		if ( _pDataWin->GetRealRowCount().Len() )
754cdf0e10cSrcweir 			aTip += _pDataWin->GetRealRowCount();
755cdf0e10cSrcweir 		else
756cdf0e10cSrcweir 			aTip += String::CreateFromInt32(GetRangeMax());
757cdf0e10cSrcweir 
758cdf0e10cSrcweir         Rectangle aRect( GetPointerPosPixel(), Size( GetTextHeight(), GetTextWidth( aTip ) ) );
759cdf0e10cSrcweir         if ( _nTip )
760cdf0e10cSrcweir             Help::UpdateTip( _nTip, this, aRect, aTip );
761cdf0e10cSrcweir 		else
762cdf0e10cSrcweir             _nTip = Help::ShowTip( this, aRect, aTip );
763cdf0e10cSrcweir 		_nLastPos = nPos;
764cdf0e10cSrcweir 	}
765cdf0e10cSrcweir 
766cdf0e10cSrcweir 	ScrollBar::Tracking( rTEvt );
767cdf0e10cSrcweir }
768cdf0e10cSrcweir 
769cdf0e10cSrcweir //-------------------------------------------------------------------
770cdf0e10cSrcweir 
EndScroll()771cdf0e10cSrcweir void BrowserScrollBar::EndScroll()
772cdf0e10cSrcweir {
773cdf0e10cSrcweir 	if ( _nTip )
774cdf0e10cSrcweir 		Help::HideTip( _nTip );
775cdf0e10cSrcweir 	_nTip = 0;
776cdf0e10cSrcweir 	ScrollBar::EndScroll();
777cdf0e10cSrcweir }
778cdf0e10cSrcweir 
779cdf0e10cSrcweir 
780