xref: /aoo4110/main/svtools/source/brwbox/brwbox2.cxx (revision b1cdbd2c)
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_svtools.hxx"
26*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
27*b1cdbd2cSJim Jagielski #include <svtools/brwbox.hxx>
28*b1cdbd2cSJim Jagielski #include "datwin.hxx"
29*b1cdbd2cSJim Jagielski #include <svtools/colorcfg.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/salgtype.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #ifndef GCC
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski #include <tools/multisel.hxx>
35*b1cdbd2cSJim Jagielski #include <algorithm>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::datatransfer;
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #define getDataWindow() ((BrowserDataWin*)pDataWin)
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski //===================================================================
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski DBG_NAMEEX(BrowseBox)
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski //===================================================================
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski extern const char* BrowseBoxCheckInvariants( const void * pVoid );
49*b1cdbd2cSJim Jagielski 
DECLARE_LIST(BrowserColumns,BrowserColumn *)50*b1cdbd2cSJim Jagielski DECLARE_LIST( BrowserColumns, BrowserColumn* )
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski //===================================================================
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski void BrowseBox::StartDrag( sal_Int8 /* _nAction */, const Point& /* _rPosPixel */ )
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
57*b1cdbd2cSJim Jagielski 	// not interested in this event
58*b1cdbd2cSJim Jagielski }
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski //===================================================================
61*b1cdbd2cSJim Jagielski 
AcceptDrop(const AcceptDropEvent & _rEvt)62*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::AcceptDrop( const AcceptDropEvent& _rEvt )
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski 	BrowserDataWin* pDataWindow = static_cast<BrowserDataWin*>(pDataWin);
65*b1cdbd2cSJim Jagielski 	AcceptDropEvent aTransformed( _rEvt );
66*b1cdbd2cSJim Jagielski 	aTransformed.maPosPixel = pDataWindow->ScreenToOutputPixel( OutputToScreenPixel( _rEvt.maPosPixel ) );
67*b1cdbd2cSJim Jagielski 	return pDataWindow->AcceptDrop( aTransformed );
68*b1cdbd2cSJim Jagielski }
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski //===================================================================
71*b1cdbd2cSJim Jagielski 
ExecuteDrop(const ExecuteDropEvent & _rEvt)72*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::ExecuteDrop( const ExecuteDropEvent& _rEvt )
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 	BrowserDataWin* pDataWindow = static_cast<BrowserDataWin*>(pDataWin);
75*b1cdbd2cSJim Jagielski 	ExecuteDropEvent aTransformed( _rEvt );
76*b1cdbd2cSJim Jagielski 	aTransformed.maPosPixel = pDataWindow->ScreenToOutputPixel( OutputToScreenPixel( _rEvt.maPosPixel ) );
77*b1cdbd2cSJim Jagielski 	return pDataWindow->ExecuteDrop( aTransformed );
78*b1cdbd2cSJim Jagielski }
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski //===================================================================
81*b1cdbd2cSJim Jagielski 
AcceptDrop(const BrowserAcceptDropEvent &)82*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::AcceptDrop( const BrowserAcceptDropEvent& )
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
85*b1cdbd2cSJim Jagielski 	// not interested in this event
86*b1cdbd2cSJim Jagielski 	return DND_ACTION_NONE;
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski //===================================================================
90*b1cdbd2cSJim Jagielski 
ExecuteDrop(const BrowserExecuteDropEvent &)91*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::ExecuteDrop( const BrowserExecuteDropEvent& )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
94*b1cdbd2cSJim Jagielski 	// not interested in this event
95*b1cdbd2cSJim Jagielski 	return DND_ACTION_NONE;
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski //===================================================================
99*b1cdbd2cSJim Jagielski 
implGetDataFlavors() const100*b1cdbd2cSJim Jagielski void* BrowseBox::implGetDataFlavors() const
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski 	if (static_cast<BrowserDataWin*>(pDataWin)->bCallingDropCallback)
103*b1cdbd2cSJim Jagielski 		return &static_cast<BrowserDataWin*>(pDataWin)->GetDataFlavorExVector();
104*b1cdbd2cSJim Jagielski 	return &GetDataFlavorExVector();
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski //===================================================================
108*b1cdbd2cSJim Jagielski 
IsDropFormatSupported(SotFormatStringId _nFormat)109*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( SotFormatStringId _nFormat )
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski 	if ( static_cast< BrowserDataWin* >( pDataWin )->bCallingDropCallback )
112*b1cdbd2cSJim Jagielski 		return static_cast< BrowserDataWin* >( pDataWin )->IsDropFormatSupported( _nFormat );
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 	return DropTargetHelper::IsDropFormatSupported( _nFormat );
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski //===================================================================
118*b1cdbd2cSJim Jagielski 
IsDropFormatSupported(SotFormatStringId _nFormat) const119*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( SotFormatStringId _nFormat ) const
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski 	return const_cast< BrowseBox* >( this )->IsDropFormatSupported( _nFormat );
122*b1cdbd2cSJim Jagielski }
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski //===================================================================
125*b1cdbd2cSJim Jagielski 
IsDropFormatSupported(const DataFlavor & _rFlavor)126*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( const DataFlavor& _rFlavor )
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski 	if ( static_cast< BrowserDataWin* >( pDataWin )->bCallingDropCallback )
129*b1cdbd2cSJim Jagielski 		return static_cast< BrowserDataWin* >( pDataWin )->IsDropFormatSupported( _rFlavor );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 	return DropTargetHelper::IsDropFormatSupported( _rFlavor );
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski //===================================================================
135*b1cdbd2cSJim Jagielski 
IsDropFormatSupported(const DataFlavor & _rFlavor) const136*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( const DataFlavor& _rFlavor ) const
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski 	return const_cast< BrowseBox* >( this )->IsDropFormatSupported( _rFlavor );
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski //===================================================================
142*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rEvt)143*b1cdbd2cSJim Jagielski void BrowseBox::Command( const CommandEvent& rEvt )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski 	if ( !getDataWindow()->bInCommand )
146*b1cdbd2cSJim Jagielski 		Control::Command( rEvt );
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski //===================================================================
150*b1cdbd2cSJim Jagielski 
IsInCommandEvent() const151*b1cdbd2cSJim Jagielski bool BrowseBox::IsInCommandEvent() const
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski 	return getDataWindow()->bInCommand;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski //===================================================================
157*b1cdbd2cSJim Jagielski 
StateChanged(StateChangedType nStateChange)158*b1cdbd2cSJim Jagielski void BrowseBox::StateChanged( StateChangedType nStateChange )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     Control::StateChanged( nStateChange );
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     if ( STATE_CHANGE_MIRRORING == nStateChange )
163*b1cdbd2cSJim Jagielski     {
164*b1cdbd2cSJim Jagielski         getDataWindow()->EnableRTL( IsRTLEnabled() );
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski         HeaderBar* pHeaderBar = getDataWindow()->pHeaderBar;
167*b1cdbd2cSJim Jagielski         if ( pHeaderBar )
168*b1cdbd2cSJim Jagielski             pHeaderBar->EnableRTL( IsRTLEnabled() );
169*b1cdbd2cSJim Jagielski         aHScroll.EnableRTL( IsRTLEnabled() );
170*b1cdbd2cSJim Jagielski         if( pVScroll )
171*b1cdbd2cSJim Jagielski             pVScroll->EnableRTL( IsRTLEnabled() );
172*b1cdbd2cSJim Jagielski         Resize();
173*b1cdbd2cSJim Jagielski     }
174*b1cdbd2cSJim Jagielski 	else if ( STATE_CHANGE_INITSHOW == nStateChange )
175*b1cdbd2cSJim Jagielski 	{
176*b1cdbd2cSJim Jagielski 		bBootstrapped = sal_True; // muss zuerst gesetzt werden!
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 		Resize();
179*b1cdbd2cSJim Jagielski 		if ( bMultiSelection )
180*b1cdbd2cSJim Jagielski 			uRow.pSel->SetTotalRange( Range( 0, nRowCount - 1 ) );
181*b1cdbd2cSJim Jagielski 		if ( nRowCount == 0 )
182*b1cdbd2cSJim Jagielski 			nCurRow = BROWSER_ENDOFSELECTION;
183*b1cdbd2cSJim Jagielski 		else if ( nCurRow == BROWSER_ENDOFSELECTION )
184*b1cdbd2cSJim Jagielski 			nCurRow = 0;
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 		if ( HasFocus() )
188*b1cdbd2cSJim Jagielski 		{
189*b1cdbd2cSJim Jagielski 			bSelectionIsVisible = sal_True;
190*b1cdbd2cSJim Jagielski 			bHasFocus = sal_True;
191*b1cdbd2cSJim Jagielski 		}
192*b1cdbd2cSJim Jagielski 		UpdateScrollbars();
193*b1cdbd2cSJim Jagielski 		AutoSizeLastColumn();
194*b1cdbd2cSJim Jagielski 		CursorMoved();
195*b1cdbd2cSJim Jagielski 	}
196*b1cdbd2cSJim Jagielski 	else if (STATE_CHANGE_ZOOM == nStateChange)
197*b1cdbd2cSJim Jagielski 	{
198*b1cdbd2cSJim Jagielski 		pDataWin->SetZoom(GetZoom());
199*b1cdbd2cSJim Jagielski 		HeaderBar* pHeaderBar = getDataWindow()->pHeaderBar;
200*b1cdbd2cSJim Jagielski 		if (pHeaderBar)
201*b1cdbd2cSJim Jagielski 			pHeaderBar->SetZoom(GetZoom());
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 		// let the cols calc their new widths and adjust the header bar
204*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 nPos = 0; nPos < pCols->Count(); ++nPos )
205*b1cdbd2cSJim Jagielski 		{
206*b1cdbd2cSJim Jagielski 			pCols->GetObject(nPos)->ZoomChanged(GetZoom());
207*b1cdbd2cSJim Jagielski 			if ( pHeaderBar )
208*b1cdbd2cSJim Jagielski 				pHeaderBar->SetItemSize( pCols->GetObject(nPos)->GetId(), pCols->GetObject(nPos)->Width() );
209*b1cdbd2cSJim Jagielski 		}
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 		// all our controls have to be repositioned
212*b1cdbd2cSJim Jagielski 		Resize();
213*b1cdbd2cSJim Jagielski 	}
214*b1cdbd2cSJim Jagielski 	else if (STATE_CHANGE_ENABLE == nStateChange)
215*b1cdbd2cSJim Jagielski 	{
216*b1cdbd2cSJim Jagielski 		// do we have a handle column?
217*b1cdbd2cSJim Jagielski 		sal_Bool bHandleCol	= pCols->Count() && (0 == pCols->GetObject(0)->GetId());
218*b1cdbd2cSJim Jagielski 		// do we have a header bar
219*b1cdbd2cSJim Jagielski 		sal_Bool bHeaderBar = (NULL != static_cast<BrowserDataWin&>(GetDataWindow()).pHeaderBar);
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 		if	(	nTitleLines
222*b1cdbd2cSJim Jagielski 			&&	(	!bHeaderBar
223*b1cdbd2cSJim Jagielski 				||	bHandleCol
224*b1cdbd2cSJim Jagielski 				)
225*b1cdbd2cSJim Jagielski 			)
226*b1cdbd2cSJim Jagielski 			// we draw the text in our header bar in a color dependent on the enabled state. So if this state changed
227*b1cdbd2cSJim Jagielski 			// -> redraw
228*b1cdbd2cSJim Jagielski 			Invalidate(Rectangle(Point(0, 0), Size(GetOutputSizePixel().Width(), GetTitleHeight() - 1)));
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski //===================================================================
233*b1cdbd2cSJim Jagielski 
Select()234*b1cdbd2cSJim Jagielski void BrowseBox::Select()
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
240*b1cdbd2cSJim Jagielski 
DoubleClick(const BrowserMouseEvent &)241*b1cdbd2cSJim Jagielski void BrowseBox::DoubleClick( const BrowserMouseEvent & )
242*b1cdbd2cSJim Jagielski {
243*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
247*b1cdbd2cSJim Jagielski 
QueryMinimumRowHeight()248*b1cdbd2cSJim Jagielski long BrowseBox::QueryMinimumRowHeight()
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
251*b1cdbd2cSJim Jagielski     return CalcZoom( 5 );
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
255*b1cdbd2cSJim Jagielski 
ImplStartTracking()256*b1cdbd2cSJim Jagielski void BrowseBox::ImplStartTracking()
257*b1cdbd2cSJim Jagielski {
258*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( BrowseBox, BrowseBoxCheckInvariants );
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
262*b1cdbd2cSJim Jagielski 
ImplTracking()263*b1cdbd2cSJim Jagielski void BrowseBox::ImplTracking()
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( BrowseBox, BrowseBoxCheckInvariants );
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
269*b1cdbd2cSJim Jagielski 
ImplEndTracking()270*b1cdbd2cSJim Jagielski void BrowseBox::ImplEndTracking()
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( BrowseBox, BrowseBoxCheckInvariants );
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
276*b1cdbd2cSJim Jagielski 
RowHeightChanged()277*b1cdbd2cSJim Jagielski void BrowseBox::RowHeightChanged()
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
280*b1cdbd2cSJim Jagielski }
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
283*b1cdbd2cSJim Jagielski 
QueryColumnResize(sal_uInt16,long nWidth)284*b1cdbd2cSJim Jagielski long BrowseBox::QueryColumnResize( sal_uInt16, long nWidth )
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
287*b1cdbd2cSJim Jagielski 	return nWidth;
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
291*b1cdbd2cSJim Jagielski 
ColumnResized(sal_uInt16)292*b1cdbd2cSJim Jagielski void BrowseBox::ColumnResized( sal_uInt16 )
293*b1cdbd2cSJim Jagielski {
294*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
298*b1cdbd2cSJim Jagielski 
ColumnMoved(sal_uInt16)299*b1cdbd2cSJim Jagielski void BrowseBox::ColumnMoved( sal_uInt16 )
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
305*b1cdbd2cSJim Jagielski 
StartScroll()306*b1cdbd2cSJim Jagielski void BrowseBox::StartScroll()
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
309*b1cdbd2cSJim Jagielski 	//((Control*)pDataWin)->HideFocus();
310*b1cdbd2cSJim Jagielski 	DoHideCursor( "StartScroll" );
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
314*b1cdbd2cSJim Jagielski 
EndScroll()315*b1cdbd2cSJim Jagielski void BrowseBox::EndScroll()
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
318*b1cdbd2cSJim Jagielski 	UpdateScrollbars();
319*b1cdbd2cSJim Jagielski 	AutoSizeLastColumn();
320*b1cdbd2cSJim Jagielski 	DoShowCursor( "EndScroll" );
321*b1cdbd2cSJim Jagielski }
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
326*b1cdbd2cSJim Jagielski #pragma optimize( "", off )
327*b1cdbd2cSJim Jagielski #endif
328*b1cdbd2cSJim Jagielski 
ToggleSelection(sal_Bool bForce)329*b1cdbd2cSJim Jagielski void BrowseBox::ToggleSelection( sal_Bool bForce )
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 	// selection highlight-toggling allowed?
334*b1cdbd2cSJim Jagielski 	if ( bHideSelect )
335*b1cdbd2cSJim Jagielski 		return;
336*b1cdbd2cSJim Jagielski 	if ( !bForce &&
337*b1cdbd2cSJim Jagielski 		 ( bNotToggleSel || !IsUpdateMode() || !bSelectionIsVisible ) )
338*b1cdbd2cSJim Jagielski 		return;
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	// only highlight painted areas!
341*b1cdbd2cSJim Jagielski 	bNotToggleSel = sal_True;
342*b1cdbd2cSJim Jagielski 	if ( sal_False && !getDataWindow()->bInPaint )
343*b1cdbd2cSJim Jagielski 		pDataWin->Update();
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski 	// accumulate areas of rows to highlight
346*b1cdbd2cSJim Jagielski 	RectangleList aHighlightList;
347*b1cdbd2cSJim Jagielski 	long nLastRowInRect = 0; // fuer den CFront
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 	// Handle-Column nicht highlighten
350*b1cdbd2cSJim Jagielski 	BrowserColumn *pFirstCol = pCols->GetObject(0);
351*b1cdbd2cSJim Jagielski 	long nOfsX = (!pFirstCol || pFirstCol->GetId()) ? 0 : pFirstCol->Width();
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 	// accumulate old row selection
354*b1cdbd2cSJim Jagielski 	long nBottomRow = nTopRow +
355*b1cdbd2cSJim Jagielski 		pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight();
356*b1cdbd2cSJim Jagielski 	if ( nBottomRow > GetRowCount() && GetRowCount() )
357*b1cdbd2cSJim Jagielski 		nBottomRow = GetRowCount();
358*b1cdbd2cSJim Jagielski 	for ( long nRow = bMultiSelection ? uRow.pSel->FirstSelected() : uRow.nSel;
359*b1cdbd2cSJim Jagielski 		  nRow != BROWSER_ENDOFSELECTION && nRow <= nBottomRow;
360*b1cdbd2cSJim Jagielski 		  nRow = bMultiSelection ? uRow.pSel->NextSelected() : BROWSER_ENDOFSELECTION )
361*b1cdbd2cSJim Jagielski 	{
362*b1cdbd2cSJim Jagielski 		if ( nRow < nTopRow )
363*b1cdbd2cSJim Jagielski 			continue;
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 		Rectangle aAddRect(
366*b1cdbd2cSJim Jagielski 			Point( nOfsX, (nRow-nTopRow)*GetDataRowHeight() ),
367*b1cdbd2cSJim Jagielski 			Size( pDataWin->GetSizePixel().Width(), GetDataRowHeight() ) );
368*b1cdbd2cSJim Jagielski 		if ( aHighlightList.Count() && nLastRowInRect == ( nRow - 1 ) )
369*b1cdbd2cSJim Jagielski 			aHighlightList.First()->Union( aAddRect );
370*b1cdbd2cSJim Jagielski 		else
371*b1cdbd2cSJim Jagielski 			aHighlightList.Insert( new Rectangle( aAddRect ), (sal_uLong) 0 );
372*b1cdbd2cSJim Jagielski 		nLastRowInRect = nRow;
373*b1cdbd2cSJim Jagielski 	}
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 	// unhighlight the old selection (if any)
376*b1cdbd2cSJim Jagielski 	while ( aHighlightList.Count() )
377*b1cdbd2cSJim Jagielski 	{
378*b1cdbd2cSJim Jagielski 		Rectangle *pRect = aHighlightList.Remove( aHighlightList.Count() - 1 );
379*b1cdbd2cSJim Jagielski 		pDataWin->Invalidate( *pRect );
380*b1cdbd2cSJim Jagielski 		delete pRect;
381*b1cdbd2cSJim Jagielski 	}
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski 	// unhighlight old column selection (if any)
384*b1cdbd2cSJim Jagielski 	for ( long nColId = pColSel ? pColSel->FirstSelected() : BROWSER_ENDOFSELECTION;
385*b1cdbd2cSJim Jagielski 		  nColId != BROWSER_ENDOFSELECTION;
386*b1cdbd2cSJim Jagielski 		  nColId = pColSel->NextSelected() )
387*b1cdbd2cSJim Jagielski 	{
388*b1cdbd2cSJim Jagielski 		Rectangle aRect( GetFieldRectPixel(nCurRow,
389*b1cdbd2cSJim Jagielski 										   pCols->GetObject(nColId)->GetId(),
390*b1cdbd2cSJim Jagielski 										   sal_False ) );
391*b1cdbd2cSJim Jagielski 		aRect.Left() -= MIN_COLUMNWIDTH;
392*b1cdbd2cSJim Jagielski 		aRect.Right() += MIN_COLUMNWIDTH;
393*b1cdbd2cSJim Jagielski 		aRect.Top() = 0;
394*b1cdbd2cSJim Jagielski 		aRect.Bottom() = pDataWin->GetOutputSizePixel().Height();
395*b1cdbd2cSJim Jagielski 		pDataWin->Invalidate( aRect );
396*b1cdbd2cSJim Jagielski 	}
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 	bNotToggleSel = sal_False;
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
402*b1cdbd2cSJim Jagielski #pragma optimize( "", on )
403*b1cdbd2cSJim Jagielski #endif
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
406*b1cdbd2cSJim Jagielski 
DrawCursor()407*b1cdbd2cSJim Jagielski void BrowseBox::DrawCursor()
408*b1cdbd2cSJim Jagielski {
409*b1cdbd2cSJim Jagielski 	sal_Bool bReallyHide = sal_False;
410*b1cdbd2cSJim Jagielski 	if ( SMART_CURSOR_HIDE == bHideCursor )
411*b1cdbd2cSJim Jagielski 	{
412*b1cdbd2cSJim Jagielski 		if ( !GetSelectRowCount() && !GetSelectColumnCount() )
413*b1cdbd2cSJim Jagielski 			bReallyHide = sal_True;
414*b1cdbd2cSJim Jagielski 	}
415*b1cdbd2cSJim Jagielski 	else if ( HARD_CURSOR_HIDE == bHideCursor )
416*b1cdbd2cSJim Jagielski 	{
417*b1cdbd2cSJim Jagielski 		bReallyHide = sal_True;
418*b1cdbd2cSJim Jagielski 	}
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 	bReallyHide |= !bSelectionIsVisible || !IsUpdateMode() || bScrolling || nCurRow < 0;
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski 	if (PaintCursorIfHiddenOnce())
423*b1cdbd2cSJim Jagielski 		bReallyHide |= ( GetCursorHideCount() > 1 );
424*b1cdbd2cSJim Jagielski 	else
425*b1cdbd2cSJim Jagielski 		bReallyHide |= ( GetCursorHideCount() > 0 );
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 	// keine Cursor auf Handle-Column
428*b1cdbd2cSJim Jagielski 	if ( nCurColId == 0 )
429*b1cdbd2cSJim Jagielski 		nCurColId = GetColumnId(1);
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 	// Cursor-Rechteck berechnen
432*b1cdbd2cSJim Jagielski 	Rectangle aCursor;
433*b1cdbd2cSJim Jagielski 	if ( bColumnCursor )
434*b1cdbd2cSJim Jagielski 	{
435*b1cdbd2cSJim Jagielski 		aCursor = GetFieldRectPixel( nCurRow, nCurColId, sal_False );
436*b1cdbd2cSJim Jagielski 		//! --aCursor.Bottom();
437*b1cdbd2cSJim Jagielski 		aCursor.Left() -= MIN_COLUMNWIDTH;
438*b1cdbd2cSJim Jagielski 		aCursor.Right() += 1;
439*b1cdbd2cSJim Jagielski 		aCursor.Bottom() += 1;
440*b1cdbd2cSJim Jagielski 	}
441*b1cdbd2cSJim Jagielski 	else
442*b1cdbd2cSJim Jagielski 		aCursor = Rectangle(
443*b1cdbd2cSJim Jagielski 			Point( ( pCols->Count() && pCols->GetObject(0)->GetId() == 0 ) ?
444*b1cdbd2cSJim Jagielski 						pCols->GetObject(0)->Width() : 0,
445*b1cdbd2cSJim Jagielski 						(nCurRow - nTopRow) * GetDataRowHeight() + 1 ),
446*b1cdbd2cSJim Jagielski 			Size( pDataWin->GetOutputSizePixel().Width() + 1,
447*b1cdbd2cSJim Jagielski 				  GetDataRowHeight() - 2 ) );
448*b1cdbd2cSJim Jagielski 	if ( bHLines )
449*b1cdbd2cSJim Jagielski 	{
450*b1cdbd2cSJim Jagielski 		if ( !bMultiSelection )
451*b1cdbd2cSJim Jagielski 			--aCursor.Top();
452*b1cdbd2cSJim Jagielski 		--aCursor.Bottom();
453*b1cdbd2cSJim Jagielski 	}
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 	//!mi_mac pDataWin->Update();
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 	if (m_aCursorColor == COL_TRANSPARENT)
458*b1cdbd2cSJim Jagielski 	{
459*b1cdbd2cSJim Jagielski 		// auf diesem Plattformen funktioniert der StarView-Focus richtig
460*b1cdbd2cSJim Jagielski 		if ( bReallyHide )
461*b1cdbd2cSJim Jagielski 			((Control*)pDataWin)->HideFocus();
462*b1cdbd2cSJim Jagielski 		else
463*b1cdbd2cSJim Jagielski 			((Control*)pDataWin)->ShowFocus( aCursor );
464*b1cdbd2cSJim Jagielski 	}
465*b1cdbd2cSJim Jagielski 	else
466*b1cdbd2cSJim Jagielski 	{
467*b1cdbd2cSJim Jagielski 		Color rCol = bReallyHide ? pDataWin->GetFillColor() : m_aCursorColor;
468*b1cdbd2cSJim Jagielski 		Color aOldFillColor = pDataWin->GetFillColor();
469*b1cdbd2cSJim Jagielski 		Color aOldLineColor = pDataWin->GetLineColor();
470*b1cdbd2cSJim Jagielski 		pDataWin->SetFillColor();
471*b1cdbd2cSJim Jagielski 		pDataWin->SetLineColor( rCol );
472*b1cdbd2cSJim Jagielski 		pDataWin->DrawRect( aCursor );
473*b1cdbd2cSJim Jagielski 		pDataWin->SetLineColor( aOldLineColor );
474*b1cdbd2cSJim Jagielski 		pDataWin->SetFillColor( aOldFillColor );
475*b1cdbd2cSJim Jagielski 	}
476*b1cdbd2cSJim Jagielski }
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
479*b1cdbd2cSJim Jagielski 
GetColumnWidth(sal_uInt16 nId) const480*b1cdbd2cSJim Jagielski sal_uLong BrowseBox::GetColumnWidth( sal_uInt16 nId ) const
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 	sal_uInt16 nItemPos = GetColumnPos( nId );
485*b1cdbd2cSJim Jagielski 	if ( nItemPos >= pCols->Count() )
486*b1cdbd2cSJim Jagielski 		return 0;
487*b1cdbd2cSJim Jagielski 	return pCols->GetObject(nItemPos)->Width();
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
491*b1cdbd2cSJim Jagielski 
GetColumnId(sal_uInt16 nPos) const492*b1cdbd2cSJim Jagielski sal_uInt16 BrowseBox::GetColumnId( sal_uInt16 nPos ) const
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski 	if ( nPos >= pCols->Count() )
497*b1cdbd2cSJim Jagielski 		return 0;
498*b1cdbd2cSJim Jagielski 	return pCols->GetObject(nPos)->GetId();
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
502*b1cdbd2cSJim Jagielski 
GetColumnPos(sal_uInt16 nId) const503*b1cdbd2cSJim Jagielski sal_uInt16 BrowseBox::GetColumnPos( sal_uInt16 nId ) const
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nPos = 0; nPos < pCols->Count(); ++nPos )
508*b1cdbd2cSJim Jagielski 		if ( pCols->GetObject(nPos)->GetId() == nId )
509*b1cdbd2cSJim Jagielski 			return nPos;
510*b1cdbd2cSJim Jagielski 	return BROWSER_INVALIDID;
511*b1cdbd2cSJim Jagielski }
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
514*b1cdbd2cSJim Jagielski 
IsFrozen(sal_uInt16 nColumnId) const515*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsFrozen( sal_uInt16 nColumnId ) const
516*b1cdbd2cSJim Jagielski {
517*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nPos = 0; nPos < pCols->Count(); ++nPos )
520*b1cdbd2cSJim Jagielski 		if ( pCols->GetObject(nPos)->GetId() == nColumnId )
521*b1cdbd2cSJim Jagielski 			return pCols->GetObject(nPos)->IsFrozen();
522*b1cdbd2cSJim Jagielski 	return sal_False;
523*b1cdbd2cSJim Jagielski }
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
526*b1cdbd2cSJim Jagielski 
ExpandRowSelection(const BrowserMouseEvent & rEvt)527*b1cdbd2cSJim Jagielski void BrowseBox::ExpandRowSelection( const BrowserMouseEvent& rEvt )
528*b1cdbd2cSJim Jagielski {
529*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski 	DoHideCursor( "ExpandRowSelection" );
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski 	// expand the last selection
534*b1cdbd2cSJim Jagielski 	if ( bMultiSelection )
535*b1cdbd2cSJim Jagielski 	{
536*b1cdbd2cSJim Jagielski 		Range aJustifiedRange( aSelRange );
537*b1cdbd2cSJim Jagielski 		aJustifiedRange.Justify();
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski         sal_Bool bSelectThis = ( bSelect != aJustifiedRange.IsInside( rEvt.GetRow() ) );
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski 		if ( aJustifiedRange.IsInside( rEvt.GetRow() ) )
542*b1cdbd2cSJim Jagielski 		{
543*b1cdbd2cSJim Jagielski 			// down and up
544*b1cdbd2cSJim Jagielski 			while ( rEvt.GetRow() < aSelRange.Max() )
545*b1cdbd2cSJim Jagielski 			{   // ZTC/Mac bug - dont put these statemants together!
546*b1cdbd2cSJim Jagielski 				SelectRow( aSelRange.Max(), bSelectThis, sal_True );
547*b1cdbd2cSJim Jagielski 				--aSelRange.Max();
548*b1cdbd2cSJim Jagielski 			}
549*b1cdbd2cSJim Jagielski 			while ( rEvt.GetRow() > aSelRange.Max() )
550*b1cdbd2cSJim Jagielski 			{   // ZTC/Mac bug - dont put these statemants together!
551*b1cdbd2cSJim Jagielski 				SelectRow( aSelRange.Max(), bSelectThis, sal_True );
552*b1cdbd2cSJim Jagielski 				++aSelRange.Max();
553*b1cdbd2cSJim Jagielski 			}
554*b1cdbd2cSJim Jagielski 		}
555*b1cdbd2cSJim Jagielski 		else
556*b1cdbd2cSJim Jagielski 		{
557*b1cdbd2cSJim Jagielski 			// up and down
558*b1cdbd2cSJim Jagielski 			sal_Bool bOldSelecting = bSelecting;
559*b1cdbd2cSJim Jagielski 			bSelecting = sal_True;
560*b1cdbd2cSJim Jagielski 			while ( rEvt.GetRow() < aSelRange.Max() )
561*b1cdbd2cSJim Jagielski 			{   // ZTC/Mac bug - dont put these statemants together!
562*b1cdbd2cSJim Jagielski 				--aSelRange.Max();
563*b1cdbd2cSJim Jagielski 				if ( !IsRowSelected( aSelRange.Max() ) )
564*b1cdbd2cSJim Jagielski 				{
565*b1cdbd2cSJim Jagielski 					SelectRow( aSelRange.Max(), bSelectThis, sal_True );
566*b1cdbd2cSJim Jagielski 					bSelect = sal_True;
567*b1cdbd2cSJim Jagielski 				}
568*b1cdbd2cSJim Jagielski 			}
569*b1cdbd2cSJim Jagielski 			while ( rEvt.GetRow() > aSelRange.Max() )
570*b1cdbd2cSJim Jagielski 			{   // ZTC/Mac bug - dont put these statemants together!
571*b1cdbd2cSJim Jagielski 				++aSelRange.Max();
572*b1cdbd2cSJim Jagielski 				if ( !IsRowSelected( aSelRange.Max() ) )
573*b1cdbd2cSJim Jagielski 				{
574*b1cdbd2cSJim Jagielski 					SelectRow( aSelRange.Max(), bSelectThis, sal_True );
575*b1cdbd2cSJim Jagielski 					bSelect = sal_True;
576*b1cdbd2cSJim Jagielski 				}
577*b1cdbd2cSJim Jagielski 			}
578*b1cdbd2cSJim Jagielski 			bSelecting = bOldSelecting;
579*b1cdbd2cSJim Jagielski 			if ( bSelect )
580*b1cdbd2cSJim Jagielski 				Select();
581*b1cdbd2cSJim Jagielski 		}
582*b1cdbd2cSJim Jagielski 	}
583*b1cdbd2cSJim Jagielski 	else
584*b1cdbd2cSJim Jagielski 		if ( !bMultiSelection || !IsRowSelected( rEvt.GetRow() ) )
585*b1cdbd2cSJim Jagielski 			SelectRow( rEvt.GetRow(), sal_True );
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski 	GoToRow( rEvt.GetRow(), sal_False );
588*b1cdbd2cSJim Jagielski 	DoShowCursor( "ExpandRowSelection" );
589*b1cdbd2cSJim Jagielski }
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
592*b1cdbd2cSJim Jagielski 
Resize()593*b1cdbd2cSJim Jagielski void BrowseBox::Resize()
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
596*b1cdbd2cSJim Jagielski 	if ( !bBootstrapped && IsReallyVisible() )
597*b1cdbd2cSJim Jagielski 		BrowseBox::StateChanged( STATE_CHANGE_INITSHOW );
598*b1cdbd2cSJim Jagielski 	if ( !pCols->Count() )
599*b1cdbd2cSJim Jagielski 	{
600*b1cdbd2cSJim Jagielski 		getDataWindow()->bResizeOnPaint = sal_True;
601*b1cdbd2cSJim Jagielski 		return;
602*b1cdbd2cSJim Jagielski 	}
603*b1cdbd2cSJim Jagielski 	getDataWindow()->bResizeOnPaint = sal_False;
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 	// calc the size of the scrollbars
606*b1cdbd2cSJim Jagielski 	// (we can't ask the scrollbars for their widths cause if we're zoomed they still have to be
607*b1cdbd2cSJim Jagielski 	// resized - which is done in UpdateScrollbars)
608*b1cdbd2cSJim Jagielski 	sal_uLong nSBSize = GetSettings().GetStyleSettings().GetScrollBarSize();
609*b1cdbd2cSJim Jagielski 	if (IsZoom())
610*b1cdbd2cSJim Jagielski 		nSBSize = (sal_uLong)(nSBSize * (double)GetZoom());
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski 	DoHideCursor( "Resize" );
613*b1cdbd2cSJim Jagielski 	sal_uInt16 nOldVisibleRows =
614*b1cdbd2cSJim Jagielski 		(sal_uInt16)(pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight() + 1);
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski 	// did we need a horiz. scroll bar oder gibt es eine Control Area?
617*b1cdbd2cSJim Jagielski 	if ( !getDataWindow()->bNoHScroll &&
618*b1cdbd2cSJim Jagielski 		 ( ( pCols->Count() - FrozenColCount() ) > 1 ) )
619*b1cdbd2cSJim Jagielski 		aHScroll.Show();
620*b1cdbd2cSJim Jagielski 	else
621*b1cdbd2cSJim Jagielski 		aHScroll.Hide();
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 	// calculate the size of the data window
624*b1cdbd2cSJim Jagielski 	long nDataHeight = GetOutputSizePixel().Height() - GetTitleHeight();
625*b1cdbd2cSJim Jagielski 	if ( aHScroll.IsVisible() || ( nControlAreaWidth != USHRT_MAX ) )
626*b1cdbd2cSJim Jagielski 		nDataHeight -= nSBSize;
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski 	long nDataWidth = GetOutputSizePixel().Width();
629*b1cdbd2cSJim Jagielski 	if ( pVScroll->IsVisible() )
630*b1cdbd2cSJim Jagielski 		nDataWidth -= nSBSize;
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski 	// adjust position and size of data window
633*b1cdbd2cSJim Jagielski 	pDataWin->SetPosSizePixel(
634*b1cdbd2cSJim Jagielski 		Point( 0, GetTitleHeight() ),
635*b1cdbd2cSJim Jagielski 		Size( nDataWidth, nDataHeight ) );
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	sal_uInt16 nVisibleRows =
638*b1cdbd2cSJim Jagielski 		(sal_uInt16)(pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight() + 1);
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski 	// TopRow ist unveraendert, aber die Anzahl sichtbarer Zeilen hat sich
641*b1cdbd2cSJim Jagielski 	// geaendert
642*b1cdbd2cSJim Jagielski 	if ( nVisibleRows != nOldVisibleRows )
643*b1cdbd2cSJim Jagielski 		VisibleRowsChanged(nTopRow, nVisibleRows);
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski 	UpdateScrollbars();
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 	// Control-Area
648*b1cdbd2cSJim Jagielski 	Rectangle aInvalidArea( GetControlArea() );
649*b1cdbd2cSJim Jagielski 	aInvalidArea.Right() = GetOutputSizePixel().Width();
650*b1cdbd2cSJim Jagielski 	aInvalidArea.Left() = 0;
651*b1cdbd2cSJim Jagielski 	Invalidate( aInvalidArea );
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski 	// external header-bar
654*b1cdbd2cSJim Jagielski 	HeaderBar* pHeaderBar = getDataWindow()->pHeaderBar;
655*b1cdbd2cSJim Jagielski 	if ( pHeaderBar )
656*b1cdbd2cSJim Jagielski 	{
657*b1cdbd2cSJim Jagielski 		// Handle-Column beruecksichtigen
658*b1cdbd2cSJim Jagielski 		BrowserColumn *pFirstCol = pCols->GetObject(0);
659*b1cdbd2cSJim Jagielski 		long nOfsX = pFirstCol->GetId() ? 0 : pFirstCol->Width();
660*b1cdbd2cSJim Jagielski 		pHeaderBar->SetPosSizePixel( Point( nOfsX, 0 ), Size( GetOutputSizePixel().Width() - nOfsX, GetTitleHeight() ) );
661*b1cdbd2cSJim Jagielski 	}
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 	AutoSizeLastColumn(); // adjust last column width
664*b1cdbd2cSJim Jagielski 	DoShowCursor( "Resize" );
665*b1cdbd2cSJim Jagielski }
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
668*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)669*b1cdbd2cSJim Jagielski void BrowseBox::Paint( const Rectangle& rRect )
670*b1cdbd2cSJim Jagielski {
671*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski 	// initializations
674*b1cdbd2cSJim Jagielski 	if ( !bBootstrapped && IsReallyVisible() )
675*b1cdbd2cSJim Jagielski 		BrowseBox::StateChanged( STATE_CHANGE_INITSHOW );
676*b1cdbd2cSJim Jagielski 	if ( !pCols->Count() )
677*b1cdbd2cSJim Jagielski 		return;
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 	BrowserColumn *pFirstCol = pCols->GetObject(0);
680*b1cdbd2cSJim Jagielski 	sal_Bool bHandleCol	= pFirstCol && pFirstCol->GetId() == 0;
681*b1cdbd2cSJim Jagielski 	sal_Bool bHeaderBar = getDataWindow()->pHeaderBar != NULL;
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 	// draw delimitational lines
684*b1cdbd2cSJim Jagielski 	if ( !getDataWindow()->bNoHScroll )
685*b1cdbd2cSJim Jagielski 		DrawLine( Point( 0, aHScroll.GetPosPixel().Y() ),
686*b1cdbd2cSJim Jagielski 				  Point( GetOutputSizePixel().Width(),
687*b1cdbd2cSJim Jagielski 						 aHScroll.GetPosPixel().Y() ) );
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski 	if ( nTitleLines )
690*b1cdbd2cSJim Jagielski 	{
691*b1cdbd2cSJim Jagielski 		if ( !bHeaderBar )
692*b1cdbd2cSJim Jagielski 			DrawLine( Point( 0, GetTitleHeight() - 1 ),
693*b1cdbd2cSJim Jagielski 					  Point( GetOutputSizePixel().Width(),
694*b1cdbd2cSJim Jagielski 							 GetTitleHeight() - 1 ) );
695*b1cdbd2cSJim Jagielski 		else if ( bHandleCol )
696*b1cdbd2cSJim Jagielski 			DrawLine( Point( 0, GetTitleHeight() - 1 ),
697*b1cdbd2cSJim Jagielski 					  Point( pFirstCol->Width(), GetTitleHeight() - 1 ) );
698*b1cdbd2cSJim Jagielski 	}
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski 	// Title Bar
701*b1cdbd2cSJim Jagielski 	// Wenn es eine Handle Column gibt und die Headerbar verfuegbar ist, dann nur
702*b1cdbd2cSJim Jagielski 	// die HandleColumn
703*b1cdbd2cSJim Jagielski 	// Handle-Column beruecksichtigen
704*b1cdbd2cSJim Jagielski 	if ( nTitleLines && (!bHeaderBar || bHandleCol) )
705*b1cdbd2cSJim Jagielski 	{
706*b1cdbd2cSJim Jagielski 		// iterate through columns to redraw
707*b1cdbd2cSJim Jagielski 		long nX = 0;
708*b1cdbd2cSJim Jagielski 		sal_uInt16 nCol;
709*b1cdbd2cSJim Jagielski 		for ( nCol = 0;
710*b1cdbd2cSJim Jagielski 			  nCol < pCols->Count() && nX < rRect.Right();
711*b1cdbd2cSJim Jagielski 			  ++nCol )
712*b1cdbd2cSJim Jagielski 		{
713*b1cdbd2cSJim Jagielski 			// skip invisible colums between frozen and scrollable area
714*b1cdbd2cSJim Jagielski 			if ( nCol < nFirstCol && !pCols->GetObject(nCol)->IsFrozen() )
715*b1cdbd2cSJim Jagielski 				nCol = nFirstCol;
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 			// nur die HandleCol ?
718*b1cdbd2cSJim Jagielski 			if (bHeaderBar && bHandleCol && nCol > 0)
719*b1cdbd2cSJim Jagielski 				break;
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 			BrowserColumn *pCol = pCols->GetObject(nCol);
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 			// draw the column and increment position
724*b1cdbd2cSJim Jagielski 			if ( pCol->Width() > 4 )
725*b1cdbd2cSJim Jagielski 			{
726*b1cdbd2cSJim Jagielski 				ButtonFrame aButtonFrame( Point( nX, 0 ),
727*b1cdbd2cSJim Jagielski 					Size( pCol->Width()-1, GetTitleHeight()-1 ),
728*b1cdbd2cSJim Jagielski 					pCol->Title(), sal_False, sal_False,
729*b1cdbd2cSJim Jagielski 					0 != (BROWSER_COLUMN_TITLEABBREVATION&pCol->Flags()),
730*b1cdbd2cSJim Jagielski 					!IsEnabled());
731*b1cdbd2cSJim Jagielski 				aButtonFrame.Draw( *this );
732*b1cdbd2cSJim Jagielski 				DrawLine( Point( nX + pCol->Width() - 1, 0 ),
733*b1cdbd2cSJim Jagielski 				   Point( nX + pCol->Width() - 1, GetTitleHeight()-1 ) );
734*b1cdbd2cSJim Jagielski 			}
735*b1cdbd2cSJim Jagielski 			else
736*b1cdbd2cSJim Jagielski 			{
737*b1cdbd2cSJim Jagielski 				Color aOldFillColor = GetFillColor();
738*b1cdbd2cSJim Jagielski 				SetFillColor( Color( COL_BLACK ) );
739*b1cdbd2cSJim Jagielski 				DrawRect( Rectangle( Point( nX, 0 ), Size( pCol->Width(), GetTitleHeight() - 1 ) ) );
740*b1cdbd2cSJim Jagielski 				SetFillColor( aOldFillColor );
741*b1cdbd2cSJim Jagielski 			}
742*b1cdbd2cSJim Jagielski 
743*b1cdbd2cSJim Jagielski 			// skip column
744*b1cdbd2cSJim Jagielski 			nX += pCol->Width();
745*b1cdbd2cSJim Jagielski 		}
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski 		// retouching
748*b1cdbd2cSJim Jagielski 		if ( !bHeaderBar && nCol == pCols->Count() )
749*b1cdbd2cSJim Jagielski 		{
750*b1cdbd2cSJim Jagielski 			const StyleSettings &rSettings = GetSettings().GetStyleSettings();
751*b1cdbd2cSJim Jagielski 			Color aColFace( rSettings.GetFaceColor() );
752*b1cdbd2cSJim Jagielski 			Color aOldFillColor = GetFillColor();
753*b1cdbd2cSJim Jagielski 			Color aOldLineColor = GetLineColor();
754*b1cdbd2cSJim Jagielski 			SetFillColor( aColFace );
755*b1cdbd2cSJim Jagielski 			SetLineColor( aColFace );
756*b1cdbd2cSJim Jagielski 			DrawRect( Rectangle(
757*b1cdbd2cSJim Jagielski 				Point( nX, 0 ),
758*b1cdbd2cSJim Jagielski 				Point( rRect.Right(), GetTitleHeight() - 2 ) ) );
759*b1cdbd2cSJim Jagielski 			SetFillColor( aOldFillColor); // aOldLineColor );  oj 09.02.00 seems to be a copy&paste bug
760*b1cdbd2cSJim Jagielski 			SetLineColor( aOldLineColor); // aOldFillColor );
761*b1cdbd2cSJim Jagielski 		}
762*b1cdbd2cSJim Jagielski 	}
763*b1cdbd2cSJim Jagielski }
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
766*b1cdbd2cSJim Jagielski 
PaintRow(OutputDevice &,const Rectangle &)767*b1cdbd2cSJim Jagielski void BrowseBox::PaintRow( OutputDevice&, const Rectangle& )
768*b1cdbd2cSJim Jagielski {
769*b1cdbd2cSJim Jagielski }
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
772*b1cdbd2cSJim Jagielski 
Draw(OutputDevice * pDev,const Point & rPos,const Size & rSize,sal_uLong nFlags)773*b1cdbd2cSJim Jagielski void BrowseBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
774*b1cdbd2cSJim Jagielski {
775*b1cdbd2cSJim Jagielski 	sal_Bool bDrawSelection = (nFlags & WINDOW_DRAW_NOSELECTION) == 0;
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski 	// we need pixel coordinates
778*b1cdbd2cSJim Jagielski 	Size aRealSize = pDev->LogicToPixel(rSize);
779*b1cdbd2cSJim Jagielski 	Point aRealPos = pDev->LogicToPixel(rPos);
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski 	if ((rSize.Width() < 3) || (rSize.Height() < 3))
782*b1cdbd2cSJim Jagielski 		// we want to have two pixels frame ...
783*b1cdbd2cSJim Jagielski 		return;
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski 	Font aFont = GetDataWindow().GetDrawPixelFont( pDev );
786*b1cdbd2cSJim Jagielski 		// the 'normal' painting uses always the data window as device to output to, so we have to calc the new font
787*b1cdbd2cSJim Jagielski 		// relative to the data wins current settings
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski 	pDev->Push();
790*b1cdbd2cSJim Jagielski 	pDev->SetMapMode();
791*b1cdbd2cSJim Jagielski 	pDev->SetFont( aFont );
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski 	// draw a frame
794*b1cdbd2cSJim Jagielski 	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
795*b1cdbd2cSJim Jagielski 	pDev->SetLineColor(rStyleSettings.GetDarkShadowColor());
796*b1cdbd2cSJim Jagielski 	pDev->DrawLine(Point(aRealPos.X(), aRealPos.Y()),
797*b1cdbd2cSJim Jagielski 				   Point(aRealPos.X(), aRealPos.Y() + aRealSize.Height() - 1));
798*b1cdbd2cSJim Jagielski 	pDev->DrawLine(Point(aRealPos.X(), aRealPos.Y()),
799*b1cdbd2cSJim Jagielski 				   Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y()));
800*b1cdbd2cSJim Jagielski 	pDev->SetLineColor(rStyleSettings.GetShadowColor());
801*b1cdbd2cSJim Jagielski 	pDev->DrawLine(Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y() + 1),
802*b1cdbd2cSJim Jagielski 				   Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y() + aRealSize.Height() - 1));
803*b1cdbd2cSJim Jagielski 	pDev->DrawLine(Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y() + aRealSize.Height() - 1),
804*b1cdbd2cSJim Jagielski 				   Point(aRealPos.X() + 1, aRealPos.Y() + aRealSize.Height() - 1));
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski 	HeaderBar* pBar = getDataWindow()->pHeaderBar;
807*b1cdbd2cSJim Jagielski 
808*b1cdbd2cSJim Jagielski 	// we're drawing onto a foreign device, so we have to fake the DataRowHeight for the subsequent ImplPaintData
809*b1cdbd2cSJim Jagielski 	// (as it is based on the settings of our data window, not the foreign device)
810*b1cdbd2cSJim Jagielski 	if (!nDataRowHeight)
811*b1cdbd2cSJim Jagielski 		ImpGetDataRowHeight();
812*b1cdbd2cSJim Jagielski 	long nHeightLogic = PixelToLogic(Size(0, nDataRowHeight), MAP_10TH_MM).Height();
813*b1cdbd2cSJim Jagielski 	long nForeignHeightPixel = pDev->LogicToPixel(Size(0, nHeightLogic), MAP_10TH_MM).Height();
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski 	long nOriginalHeight = nDataRowHeight;
816*b1cdbd2cSJim Jagielski 	nDataRowHeight = nForeignHeightPixel;
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 	// this counts for the column widths, too
819*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos;
820*b1cdbd2cSJim Jagielski 	for ( nPos = 0; nPos < pCols->Count(); ++nPos )
821*b1cdbd2cSJim Jagielski 	{
822*b1cdbd2cSJim Jagielski 		BrowserColumn* pCurrent = pCols->GetObject(nPos);
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski 		long nWidthLogic = PixelToLogic(Size(pCurrent->Width(), 0), MAP_10TH_MM).Width();
825*b1cdbd2cSJim Jagielski 		long nForeignWidthPixel = pDev->LogicToPixel(Size(nWidthLogic, 0), MAP_10TH_MM).Width();
826*b1cdbd2cSJim Jagielski 
827*b1cdbd2cSJim Jagielski 		pCurrent->SetWidth(nForeignWidthPixel, GetZoom());
828*b1cdbd2cSJim Jagielski 		if ( pBar )
829*b1cdbd2cSJim Jagielski 			pBar->SetItemSize( pCurrent->GetId(), pCurrent->Width() );
830*b1cdbd2cSJim Jagielski 	}
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski 	// a smaller area for the content
833*b1cdbd2cSJim Jagielski 	++aRealPos.X();
834*b1cdbd2cSJim Jagielski 	++aRealPos.Y();
835*b1cdbd2cSJim Jagielski 	aRealSize.Width() -= 2;
836*b1cdbd2cSJim Jagielski 	aRealSize.Height() -= 2;
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 	// let the header bar draw itself
839*b1cdbd2cSJim Jagielski 	if ( pBar )
840*b1cdbd2cSJim Jagielski 	{
841*b1cdbd2cSJim Jagielski 		// the title height with respect to the font set for the given device
842*b1cdbd2cSJim Jagielski 		long nTitleHeight = PixelToLogic(Size(0, GetTitleHeight()), MAP_10TH_MM).Height();
843*b1cdbd2cSJim Jagielski 		nTitleHeight = pDev->LogicToPixel(Size(0, nTitleHeight), MAP_10TH_MM).Height();
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski 		BrowserColumn* pFirstCol = pCols->Count() ? pCols->GetObject(0) : NULL;
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 		Point aHeaderPos(pFirstCol && (pFirstCol->GetId() == 0) ? pFirstCol->Width() : 0, 0);
848*b1cdbd2cSJim Jagielski 		Size aHeaderSize(aRealSize.Width() - aHeaderPos.X(), nTitleHeight);
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski 		aHeaderPos += aRealPos;
851*b1cdbd2cSJim Jagielski 			// do this before converting to logics !
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski 		// the header's draw expects logic coordinates, again
854*b1cdbd2cSJim Jagielski 		aHeaderPos = pDev->PixelToLogic(aHeaderPos);
855*b1cdbd2cSJim Jagielski 		aHeaderSize = pDev->PixelToLogic(aHeaderSize);
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski 		pBar->Draw(pDev, aHeaderPos, aHeaderSize, nFlags);
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski 		// draw the "upper left cell" (the intersection between the header bar and the handle column)
860*b1cdbd2cSJim Jagielski 		if (( pFirstCol->GetId() == 0 ) && ( pFirstCol->Width() > 4 ))
861*b1cdbd2cSJim Jagielski 		{
862*b1cdbd2cSJim Jagielski 			ButtonFrame aButtonFrame( aRealPos,
863*b1cdbd2cSJim Jagielski 				Size( pFirstCol->Width()-1, nTitleHeight-1 ),
864*b1cdbd2cSJim Jagielski 				pFirstCol->Title(), sal_False, sal_False, sal_False, !IsEnabled());
865*b1cdbd2cSJim Jagielski 			aButtonFrame.Draw( *pDev );
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski             pDev->Push( PUSH_LINECOLOR );
868*b1cdbd2cSJim Jagielski 			pDev->SetLineColor( Color( COL_BLACK ) );
869*b1cdbd2cSJim Jagielski 
870*b1cdbd2cSJim Jagielski 			pDev->DrawLine( Point( aRealPos.X(), aRealPos.Y() + nTitleHeight-1 ),
871*b1cdbd2cSJim Jagielski 			   Point( aRealPos.X() + pFirstCol->Width() - 1, aRealPos.Y() + nTitleHeight-1 ) );
872*b1cdbd2cSJim Jagielski 			pDev->DrawLine( Point( aRealPos.X() + pFirstCol->Width() - 1, aRealPos.Y() ),
873*b1cdbd2cSJim Jagielski 			   Point( aRealPos.X() + pFirstCol->Width() - 1, aRealPos.Y() + nTitleHeight-1 ) );
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski             pDev->Pop();
876*b1cdbd2cSJim Jagielski 		}
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 		aRealPos.Y() += aHeaderSize.Height();
879*b1cdbd2cSJim Jagielski 		aRealSize.Height() -= aHeaderSize.Height();
880*b1cdbd2cSJim Jagielski 	}
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski 	// draw our own content (with clipping)
883*b1cdbd2cSJim Jagielski 	Region aRegion(Rectangle(aRealPos, aRealSize));
884*b1cdbd2cSJim Jagielski 	pDev->SetClipRegion( pDev->PixelToLogic( aRegion ) );
885*b1cdbd2cSJim Jagielski 
886*b1cdbd2cSJim Jagielski     // do we have to paint the background
887*b1cdbd2cSJim Jagielski     sal_Bool bBackground = !(nFlags & WINDOW_DRAW_NOBACKGROUND) && GetDataWindow().IsControlBackground();
888*b1cdbd2cSJim Jagielski     if ( bBackground )
889*b1cdbd2cSJim Jagielski     {
890*b1cdbd2cSJim Jagielski         Rectangle aRect( aRealPos, aRealSize );
891*b1cdbd2cSJim Jagielski         pDev->SetFillColor( GetDataWindow().GetControlBackground() );
892*b1cdbd2cSJim Jagielski         pDev->DrawRect( aRect );
893*b1cdbd2cSJim Jagielski     }
894*b1cdbd2cSJim Jagielski 
895*b1cdbd2cSJim Jagielski 	ImplPaintData( *pDev, Rectangle( aRealPos, aRealSize ), sal_True, bDrawSelection );
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski 	// restore the column widths/data row height
898*b1cdbd2cSJim Jagielski 	nDataRowHeight = nOriginalHeight;
899*b1cdbd2cSJim Jagielski 	for ( nPos = 0; nPos < pCols->Count(); ++nPos )
900*b1cdbd2cSJim Jagielski 	{
901*b1cdbd2cSJim Jagielski 		BrowserColumn* pCurrent = pCols->GetObject(nPos);
902*b1cdbd2cSJim Jagielski 
903*b1cdbd2cSJim Jagielski 		long nForeignWidthLogic = pDev->PixelToLogic(Size(pCurrent->Width(), 0), MAP_10TH_MM).Width();
904*b1cdbd2cSJim Jagielski 		long nWidthPixel = LogicToPixel(Size(nForeignWidthLogic, 0), MAP_10TH_MM).Width();
905*b1cdbd2cSJim Jagielski 
906*b1cdbd2cSJim Jagielski 		pCurrent->SetWidth(nWidthPixel, GetZoom());
907*b1cdbd2cSJim Jagielski 		if ( pBar )
908*b1cdbd2cSJim Jagielski 			pBar->SetItemSize( pCurrent->GetId(), pCurrent->Width() );
909*b1cdbd2cSJim Jagielski 	}
910*b1cdbd2cSJim Jagielski 
911*b1cdbd2cSJim Jagielski 	pDev->Pop();
912*b1cdbd2cSJim Jagielski }
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
915*b1cdbd2cSJim Jagielski 
ImplPaintData(OutputDevice & _rOut,const Rectangle & _rRect,sal_Bool _bForeignDevice,sal_Bool _bDrawSelections)916*b1cdbd2cSJim Jagielski void BrowseBox::ImplPaintData(OutputDevice& _rOut, const Rectangle& _rRect, sal_Bool _bForeignDevice, sal_Bool _bDrawSelections)
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski 	Point aOverallAreaPos = _bForeignDevice ? _rRect.TopLeft() : Point(0,0);
919*b1cdbd2cSJim Jagielski 	Size aOverallAreaSize = _bForeignDevice ? _rRect.GetSize() : GetDataWindow().GetOutputSizePixel();
920*b1cdbd2cSJim Jagielski 	Point aOverallAreaBRPos = _bForeignDevice ? _rRect.BottomRight() : Point( aOverallAreaSize.Width(), aOverallAreaSize.Height() );
921*b1cdbd2cSJim Jagielski 
922*b1cdbd2cSJim Jagielski 	long nDataRowHeigt = GetDataRowHeight();
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski 	// compute relative rows to redraw
925*b1cdbd2cSJim Jagielski 	sal_uLong nRelTopRow = _bForeignDevice ? 0 : ((sal_uLong)_rRect.Top() / nDataRowHeigt);
926*b1cdbd2cSJim Jagielski 	sal_uLong nRelBottomRow = (sal_uLong)(_bForeignDevice ? aOverallAreaSize.Height() : _rRect.Bottom()) / nDataRowHeigt;
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski 	// cache frequently used values
929*b1cdbd2cSJim Jagielski 	Point aPos( aOverallAreaPos.X(), nRelTopRow * nDataRowHeigt + aOverallAreaPos.Y() );
930*b1cdbd2cSJim Jagielski 	_rOut.SetLineColor( Color( COL_WHITE ) );
931*b1cdbd2cSJim Jagielski 	const AllSettings& rAllSets = _rOut.GetSettings();
932*b1cdbd2cSJim Jagielski 	const StyleSettings &rSettings = rAllSets.GetStyleSettings();
933*b1cdbd2cSJim Jagielski 	const Color &rHighlightTextColor = rSettings.GetHighlightTextColor();
934*b1cdbd2cSJim Jagielski 	const Color &rHighlightFillColor = rSettings.GetHighlightColor();
935*b1cdbd2cSJim Jagielski 	Color aOldTextColor = _rOut.GetTextColor();
936*b1cdbd2cSJim Jagielski 	Color aOldFillColor = _rOut.GetFillColor();
937*b1cdbd2cSJim Jagielski 	Color aOldLineColor = _rOut.GetLineColor();
938*b1cdbd2cSJim Jagielski 	long nHLineX = 0 == pCols->GetObject(0)->GetId()
939*b1cdbd2cSJim Jagielski 					? pCols->GetObject(0)->Width()
940*b1cdbd2cSJim Jagielski 					: 0;
941*b1cdbd2cSJim Jagielski 	nHLineX += aOverallAreaPos.X();
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski     Color aDelimiterLineColor( ::svtools::ColorConfig().GetColorValue( ::svtools::CALCGRID ).nColor );
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski     // redraw the invalid fields
946*b1cdbd2cSJim Jagielski 	sal_Bool bRetouching = sal_False;
947*b1cdbd2cSJim Jagielski 	for ( sal_uLong nRelRow = nRelTopRow;
948*b1cdbd2cSJim Jagielski 		  nRelRow <= nRelBottomRow && (sal_uLong)nTopRow+nRelRow < (sal_uLong)nRowCount;
949*b1cdbd2cSJim Jagielski 		  ++nRelRow, aPos.Y() += nDataRowHeigt )
950*b1cdbd2cSJim Jagielski 	{
951*b1cdbd2cSJim Jagielski 		// get row
952*b1cdbd2cSJim Jagielski 		// Zur Sicherheit auf zul"assigen Bereich abfragen:
953*b1cdbd2cSJim Jagielski 		DBG_ASSERT( (sal_uInt16)(nTopRow+nRelRow) < nRowCount, "BrowseBox::ImplPaintData: invalid seek" );
954*b1cdbd2cSJim Jagielski 		if ( (nTopRow+long(nRelRow)) < 0 || (sal_uInt16)(nTopRow+nRelRow) >= nRowCount )
955*b1cdbd2cSJim Jagielski 			continue;
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski 		// prepare row
958*b1cdbd2cSJim Jagielski 		sal_uLong nRow = nTopRow+nRelRow;
959*b1cdbd2cSJim Jagielski 		if ( !SeekRow( nRow) ) {
960*b1cdbd2cSJim Jagielski 			DBG_ERROR("BrowseBox::ImplPaintData: SeekRow gescheitert");
961*b1cdbd2cSJim Jagielski         }
962*b1cdbd2cSJim Jagielski 		_rOut.SetClipRegion();
963*b1cdbd2cSJim Jagielski 		aPos.X() = aOverallAreaPos.X();
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski 		// #73325# don't paint the row outside the painting rectangle (DG)
967*b1cdbd2cSJim Jagielski 		// prepare auto-highlight
968*b1cdbd2cSJim Jagielski 		Rectangle aRowRect( Point( _rRect.TopLeft().X(), aPos.Y() ),
969*b1cdbd2cSJim Jagielski 				Size( _rRect.GetSize().Width(), nDataRowHeigt ) );
970*b1cdbd2cSJim Jagielski 		PaintRow( _rOut, aRowRect );
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 		sal_Bool bRowSelected   =   _bDrawSelections
973*b1cdbd2cSJim Jagielski 							&&  !bHideSelect
974*b1cdbd2cSJim Jagielski 							&&  IsRowSelected( nRow );
975*b1cdbd2cSJim Jagielski 		if ( bRowSelected )
976*b1cdbd2cSJim Jagielski 		{
977*b1cdbd2cSJim Jagielski 			_rOut.SetTextColor( rHighlightTextColor );
978*b1cdbd2cSJim Jagielski 			_rOut.SetFillColor( rHighlightFillColor );
979*b1cdbd2cSJim Jagielski 			_rOut.SetLineColor();
980*b1cdbd2cSJim Jagielski 			_rOut.DrawRect( aRowRect );
981*b1cdbd2cSJim Jagielski 		}
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski 		// iterate through columns to redraw
984*b1cdbd2cSJim Jagielski 		sal_uInt16 nCol;
985*b1cdbd2cSJim Jagielski 		for ( nCol = 0; nCol < pCols->Count(); ++nCol )
986*b1cdbd2cSJim Jagielski 		{
987*b1cdbd2cSJim Jagielski 			// get column
988*b1cdbd2cSJim Jagielski 			BrowserColumn *pCol = pCols->GetObject(nCol);
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski 			// at end of invalid area
991*b1cdbd2cSJim Jagielski 			if ( aPos.X() >= _rRect.Right() )
992*b1cdbd2cSJim Jagielski 				break;
993*b1cdbd2cSJim Jagielski 
994*b1cdbd2cSJim Jagielski 			// skip invisible colums between frozen and scrollable area
995*b1cdbd2cSJim Jagielski 			if ( nCol < nFirstCol && !pCol->IsFrozen() )
996*b1cdbd2cSJim Jagielski 			{
997*b1cdbd2cSJim Jagielski 				nCol = nFirstCol;
998*b1cdbd2cSJim Jagielski 				pCol = pCols->GetObject(nCol);
999*b1cdbd2cSJim Jagielski 				if (!pCol)
1000*b1cdbd2cSJim Jagielski 				{	// FS - 21.05.99 - 66325
1001*b1cdbd2cSJim Jagielski 					// ist zwar eigentlich woanders (an der richtigen Stelle) gefixt, aber sicher ist sicher ...
1002*b1cdbd2cSJim Jagielski 					DBG_ERROR("BrowseBox::PaintData : nFirstCol is probably invalid !");
1003*b1cdbd2cSJim Jagielski 					break;
1004*b1cdbd2cSJim Jagielski 				}
1005*b1cdbd2cSJim Jagielski 			}
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski 			// prepare Column-AutoHighlight
1008*b1cdbd2cSJim Jagielski 			sal_Bool bColAutoHighlight	=	_bDrawSelections
1009*b1cdbd2cSJim Jagielski 									&&	bColumnCursor
1010*b1cdbd2cSJim Jagielski 									&&	IsColumnSelected( pCol->GetId() );
1011*b1cdbd2cSJim Jagielski 			if ( bColAutoHighlight )
1012*b1cdbd2cSJim Jagielski 			{
1013*b1cdbd2cSJim Jagielski 				_rOut.SetClipRegion();
1014*b1cdbd2cSJim Jagielski 				_rOut.SetTextColor( rHighlightTextColor );
1015*b1cdbd2cSJim Jagielski 				_rOut.SetFillColor( rHighlightFillColor );
1016*b1cdbd2cSJim Jagielski 				_rOut.SetLineColor();
1017*b1cdbd2cSJim Jagielski 				Rectangle aFieldRect( aPos,
1018*b1cdbd2cSJim Jagielski 						Size( pCol->Width(), nDataRowHeigt ) );
1019*b1cdbd2cSJim Jagielski 				_rOut.DrawRect( aFieldRect );
1020*b1cdbd2cSJim Jagielski 			}
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski 			if (!m_bFocusOnlyCursor && (pCol->GetId() == GetCurColumnId()) && (nRow == (sal_uLong)GetCurRow()))
1023*b1cdbd2cSJim Jagielski 				DrawCursor();
1024*b1cdbd2cSJim Jagielski 
1025*b1cdbd2cSJim Jagielski 			// draw a single field
1026*b1cdbd2cSJim Jagielski 			// #63864#, Sonst wird auch etwas gezeichnet, bsp Handle Column
1027*b1cdbd2cSJim Jagielski 			if (pCol->Width())
1028*b1cdbd2cSJim Jagielski 			{
1029*b1cdbd2cSJim Jagielski 				// clip the column's output to the field area
1030*b1cdbd2cSJim Jagielski 				if (_bForeignDevice)
1031*b1cdbd2cSJim Jagielski 				{	// (not neccessary if painting onto the data window)
1032*b1cdbd2cSJim Jagielski 					Size aFieldSize(pCol->Width(), nDataRowHeigt);
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski 					if (aPos.X() + aFieldSize.Width() > aOverallAreaBRPos.X())
1035*b1cdbd2cSJim Jagielski 						aFieldSize.Width() = aOverallAreaBRPos.X() - aPos.X();
1036*b1cdbd2cSJim Jagielski 
1037*b1cdbd2cSJim Jagielski 					if (aPos.Y() + aFieldSize.Height() > aOverallAreaBRPos.Y() + 1)
1038*b1cdbd2cSJim Jagielski 					{
1039*b1cdbd2cSJim Jagielski 						// for non-handle cols we don't clip vertically : we just don't draw the cell if the line isn't completely visible
1040*b1cdbd2cSJim Jagielski 						if (pCol->GetId() != 0)
1041*b1cdbd2cSJim Jagielski 							continue;
1042*b1cdbd2cSJim Jagielski 						aFieldSize.Height() = aOverallAreaBRPos.Y() + 1 - aPos.Y();
1043*b1cdbd2cSJim Jagielski 					}
1044*b1cdbd2cSJim Jagielski 
1045*b1cdbd2cSJim Jagielski 					Region aClipToField(Rectangle(aPos, aFieldSize));
1046*b1cdbd2cSJim Jagielski 					_rOut.SetClipRegion(aClipToField);
1047*b1cdbd2cSJim Jagielski 				}
1048*b1cdbd2cSJim Jagielski 				pCol->Draw( *this, _rOut, aPos, sal_False );
1049*b1cdbd2cSJim Jagielski 				if (_bForeignDevice)
1050*b1cdbd2cSJim Jagielski 					_rOut.SetClipRegion();
1051*b1cdbd2cSJim Jagielski 			}
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski 			// reset Column-auto-highlight
1054*b1cdbd2cSJim Jagielski 			if ( bColAutoHighlight )
1055*b1cdbd2cSJim Jagielski 			{
1056*b1cdbd2cSJim Jagielski 				_rOut.SetTextColor( aOldTextColor );
1057*b1cdbd2cSJim Jagielski 				_rOut.SetFillColor( aOldFillColor );
1058*b1cdbd2cSJim Jagielski 				_rOut.SetLineColor( aOldLineColor );
1059*b1cdbd2cSJim Jagielski 			}
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski 			// skip column
1062*b1cdbd2cSJim Jagielski 			aPos.X() += pCol->Width();
1063*b1cdbd2cSJim Jagielski 		}
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski 		if ( nCol == pCols->Count() )
1066*b1cdbd2cSJim Jagielski 			bRetouching = sal_True;
1067*b1cdbd2cSJim Jagielski 
1068*b1cdbd2cSJim Jagielski 		// reset auto-highlight
1069*b1cdbd2cSJim Jagielski 		if ( bRowSelected )
1070*b1cdbd2cSJim Jagielski 		{
1071*b1cdbd2cSJim Jagielski 			_rOut.SetTextColor( aOldTextColor );
1072*b1cdbd2cSJim Jagielski 			_rOut.SetFillColor( aOldFillColor );
1073*b1cdbd2cSJim Jagielski 			_rOut.SetLineColor( aOldLineColor );
1074*b1cdbd2cSJim Jagielski 		}
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski 		if ( bHLines )
1077*b1cdbd2cSJim Jagielski 		{
1078*b1cdbd2cSJim Jagielski 			// draw horizontal delimitation lines
1079*b1cdbd2cSJim Jagielski 			_rOut.SetClipRegion();
1080*b1cdbd2cSJim Jagielski             _rOut.Push( PUSH_LINECOLOR );
1081*b1cdbd2cSJim Jagielski 			_rOut.SetLineColor( aDelimiterLineColor );
1082*b1cdbd2cSJim Jagielski 			long nY = aPos.Y() + nDataRowHeigt - 1;
1083*b1cdbd2cSJim Jagielski 			if (nY <= aOverallAreaBRPos.Y())
1084*b1cdbd2cSJim Jagielski 				_rOut.DrawLine(	Point( nHLineX, nY ),
1085*b1cdbd2cSJim Jagielski 								Point( bVLines
1086*b1cdbd2cSJim Jagielski 										? std::min(long(long(aPos.X()) - 1), aOverallAreaBRPos.X())
1087*b1cdbd2cSJim Jagielski 										: aOverallAreaBRPos.X(),
1088*b1cdbd2cSJim Jagielski 									  nY ) );
1089*b1cdbd2cSJim Jagielski             _rOut.Pop();
1090*b1cdbd2cSJim Jagielski 		}
1091*b1cdbd2cSJim Jagielski 	}
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski 	if (aPos.Y() > aOverallAreaBRPos.Y() + 1)
1094*b1cdbd2cSJim Jagielski 		aPos.Y() = aOverallAreaBRPos.Y() + 1;
1095*b1cdbd2cSJim Jagielski 		// needed for some of the following drawing
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski 	// retouching
1098*b1cdbd2cSJim Jagielski 	_rOut.SetClipRegion();
1099*b1cdbd2cSJim Jagielski 	aOldLineColor = _rOut.GetLineColor();
1100*b1cdbd2cSJim Jagielski 	aOldFillColor = _rOut.GetFillColor();
1101*b1cdbd2cSJim Jagielski 	_rOut.SetFillColor( rSettings.GetFaceColor() );
1102*b1cdbd2cSJim Jagielski 	if ( pCols->Count() && ( pCols->GetObject(0)->GetId() == 0 ) && ( aPos.Y() <= _rRect.Bottom() ) )
1103*b1cdbd2cSJim Jagielski 	{
1104*b1cdbd2cSJim Jagielski 		// fill rectangle gray below handle column
1105*b1cdbd2cSJim Jagielski 		// DG: fill it only until the end of the drawing rect and not to the end, as this may overpaint handle columns
1106*b1cdbd2cSJim Jagielski 		_rOut.SetLineColor( Color( COL_BLACK ) );
1107*b1cdbd2cSJim Jagielski 		_rOut.DrawRect( Rectangle(
1108*b1cdbd2cSJim Jagielski 			Point( aOverallAreaPos.X() - 1, aPos.Y() - 1 ),
1109*b1cdbd2cSJim Jagielski 			Point( aOverallAreaPos.X() + pCols->GetObject(0)->Width() - 1,
1110*b1cdbd2cSJim Jagielski 				   _rRect.Bottom() + 1) ) );
1111*b1cdbd2cSJim Jagielski 	}
1112*b1cdbd2cSJim Jagielski 	_rOut.SetFillColor( aOldFillColor );
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski 	// draw vertical delimitational line between frozen and scrollable cols
1115*b1cdbd2cSJim Jagielski 	_rOut.SetLineColor( COL_BLACK );
1116*b1cdbd2cSJim Jagielski 	long nFrozenWidth = GetFrozenWidth()-1;
1117*b1cdbd2cSJim Jagielski 	_rOut.DrawLine( Point( aOverallAreaPos.X() + nFrozenWidth, aPos.Y() ),
1118*b1cdbd2cSJim Jagielski 				   Point( aOverallAreaPos.X() + nFrozenWidth, bHLines
1119*b1cdbd2cSJim Jagielski 							? aPos.Y() - 1
1120*b1cdbd2cSJim Jagielski 							: aOverallAreaBRPos.Y() ) );
1121*b1cdbd2cSJim Jagielski 
1122*b1cdbd2cSJim Jagielski 	// draw vertical delimitational lines?
1123*b1cdbd2cSJim Jagielski 	if ( bVLines )
1124*b1cdbd2cSJim Jagielski 	{
1125*b1cdbd2cSJim Jagielski 		_rOut.SetLineColor( aDelimiterLineColor );
1126*b1cdbd2cSJim Jagielski         Point aVertPos( aOverallAreaPos.X() - 1, aOverallAreaPos.Y() );
1127*b1cdbd2cSJim Jagielski 		long nDeltaY = aOverallAreaBRPos.Y();
1128*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 nCol = 0; nCol < pCols->Count(); ++nCol )
1129*b1cdbd2cSJim Jagielski 		{
1130*b1cdbd2cSJim Jagielski 			// get column
1131*b1cdbd2cSJim Jagielski 			BrowserColumn *pCol = pCols->GetObject(nCol);
1132*b1cdbd2cSJim Jagielski 
1133*b1cdbd2cSJim Jagielski 			// skip invisible colums between frozen and scrollable area
1134*b1cdbd2cSJim Jagielski 			if ( nCol < nFirstCol && !pCol->IsFrozen() )
1135*b1cdbd2cSJim Jagielski 			{
1136*b1cdbd2cSJim Jagielski 				nCol = nFirstCol;
1137*b1cdbd2cSJim Jagielski 				pCol = pCols->GetObject(nCol);
1138*b1cdbd2cSJim Jagielski 			}
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski 			// skip column
1141*b1cdbd2cSJim Jagielski 			aVertPos.X() += pCol->Width();
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski 			// at end of invalid area
1144*b1cdbd2cSJim Jagielski 			// invalid area is first reached when X > Right
1145*b1cdbd2cSJim Jagielski 			// and not >=
1146*b1cdbd2cSJim Jagielski 			if ( aVertPos.X() > _rRect.Right() )
1147*b1cdbd2cSJim Jagielski 				break;
1148*b1cdbd2cSJim Jagielski 
1149*b1cdbd2cSJim Jagielski 			// draw a single line
1150*b1cdbd2cSJim Jagielski 			if ( pCol->GetId() != 0 )
1151*b1cdbd2cSJim Jagielski 				_rOut.DrawLine( aVertPos, Point( aVertPos.X(),
1152*b1cdbd2cSJim Jagielski 							   bHLines
1153*b1cdbd2cSJim Jagielski 								? aPos.Y() - 1
1154*b1cdbd2cSJim Jagielski 								: aPos.Y() + nDeltaY ) );
1155*b1cdbd2cSJim Jagielski 		}
1156*b1cdbd2cSJim Jagielski 	}
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 	_rOut.SetLineColor( aOldLineColor );
1159*b1cdbd2cSJim Jagielski }
1160*b1cdbd2cSJim Jagielski 
1161*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1162*b1cdbd2cSJim Jagielski 
PaintData(Window & rWin,const Rectangle & rRect)1163*b1cdbd2cSJim Jagielski void BrowseBox::PaintData( Window& rWin, const Rectangle& rRect )
1164*b1cdbd2cSJim Jagielski {
1165*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1166*b1cdbd2cSJim Jagielski 	if ( !bBootstrapped && IsReallyVisible() )
1167*b1cdbd2cSJim Jagielski 		BrowseBox::StateChanged( STATE_CHANGE_INITSHOW );
1168*b1cdbd2cSJim Jagielski 
1169*b1cdbd2cSJim Jagielski 	// initializations
1170*b1cdbd2cSJim Jagielski 	if ( !pCols || !pCols->Count() || !rWin.IsUpdateMode() )
1171*b1cdbd2cSJim Jagielski 		return;
1172*b1cdbd2cSJim Jagielski 	if ( getDataWindow()->bResizeOnPaint )
1173*b1cdbd2cSJim Jagielski 		Resize();
1174*b1cdbd2cSJim Jagielski 	// MI: wer war das denn? Window::Update();
1175*b1cdbd2cSJim Jagielski 
1176*b1cdbd2cSJim Jagielski 	ImplPaintData(rWin, rRect, sal_False, sal_True);
1177*b1cdbd2cSJim Jagielski }
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1180*b1cdbd2cSJim Jagielski 
UpdateScrollbars()1181*b1cdbd2cSJim Jagielski void BrowseBox::UpdateScrollbars()
1182*b1cdbd2cSJim Jagielski {
1183*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski 	if ( !bBootstrapped || !IsUpdateMode() )
1186*b1cdbd2cSJim Jagielski 		return;
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski 	// Rekursionsschutz
1189*b1cdbd2cSJim Jagielski 	BrowserDataWin *pBDW = (BrowserDataWin*) pDataWin;
1190*b1cdbd2cSJim Jagielski 	if ( pBDW->bInUpdateScrollbars )
1191*b1cdbd2cSJim Jagielski 	{
1192*b1cdbd2cSJim Jagielski 		pBDW->bHadRecursion = sal_True;
1193*b1cdbd2cSJim Jagielski 		return;
1194*b1cdbd2cSJim Jagielski 	}
1195*b1cdbd2cSJim Jagielski 	pBDW->bInUpdateScrollbars = sal_True;
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 	// the size of the corner window (and the width of the VSB/height of the HSB)
1198*b1cdbd2cSJim Jagielski 	sal_uLong nCornerSize = GetSettings().GetStyleSettings().GetScrollBarSize();
1199*b1cdbd2cSJim Jagielski 	if (IsZoom())
1200*b1cdbd2cSJim Jagielski 		nCornerSize = (sal_uLong)(nCornerSize * (double)GetZoom());
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski 	// needs VScroll?
1203*b1cdbd2cSJim Jagielski 	long nMaxRows = (pDataWin->GetSizePixel().Height()) / GetDataRowHeight();
1204*b1cdbd2cSJim Jagielski 	sal_Bool bNeedsVScroll =    getDataWindow()->bAutoVScroll
1205*b1cdbd2cSJim Jagielski 						?   nTopRow || ( nRowCount > nMaxRows )
1206*b1cdbd2cSJim Jagielski 						:   !getDataWindow()->bNoVScroll;
1207*b1cdbd2cSJim Jagielski 	Size aDataWinSize = pDataWin->GetSizePixel();
1208*b1cdbd2cSJim Jagielski 	if ( !bNeedsVScroll )
1209*b1cdbd2cSJim Jagielski 	{
1210*b1cdbd2cSJim Jagielski 		if ( pVScroll->IsVisible() )
1211*b1cdbd2cSJim Jagielski 		{
1212*b1cdbd2cSJim Jagielski 			pVScroll->Hide();
1213*b1cdbd2cSJim Jagielski 			Size aNewSize( aDataWinSize );
1214*b1cdbd2cSJim Jagielski 			aNewSize.Width() = GetOutputSizePixel().Width();
1215*b1cdbd2cSJim Jagielski 			aDataWinSize = aNewSize;
1216*b1cdbd2cSJim Jagielski 		}
1217*b1cdbd2cSJim Jagielski 	}
1218*b1cdbd2cSJim Jagielski 	else if ( !pVScroll->IsVisible() )
1219*b1cdbd2cSJim Jagielski 	{
1220*b1cdbd2cSJim Jagielski 		Size aNewSize( aDataWinSize );
1221*b1cdbd2cSJim Jagielski 		aNewSize.Width() = GetOutputSizePixel().Width() - nCornerSize;
1222*b1cdbd2cSJim Jagielski 		aDataWinSize = aNewSize;
1223*b1cdbd2cSJim Jagielski 	}
1224*b1cdbd2cSJim Jagielski 
1225*b1cdbd2cSJim Jagielski 	// needs HScroll?
1226*b1cdbd2cSJim Jagielski 	sal_uLong nLastCol = GetColumnAtXPosPixel( aDataWinSize.Width() - 1 );
1227*b1cdbd2cSJim Jagielski 
1228*b1cdbd2cSJim Jagielski 	sal_uInt16 nFrozenCols = FrozenColCount();
1229*b1cdbd2cSJim Jagielski 	sal_Bool bNeedsHScroll =    getDataWindow()->bAutoHScroll
1230*b1cdbd2cSJim Jagielski 		                ?   ( nFirstCol > nFrozenCols ) || ( nLastCol <= pCols->Count() )
1231*b1cdbd2cSJim Jagielski 		                :   !getDataWindow()->bNoHScroll;
1232*b1cdbd2cSJim Jagielski 	if ( !bNeedsHScroll )
1233*b1cdbd2cSJim Jagielski 	{
1234*b1cdbd2cSJim Jagielski 		if ( aHScroll.IsVisible() )
1235*b1cdbd2cSJim Jagielski 		{
1236*b1cdbd2cSJim Jagielski 			aHScroll.Hide();
1237*b1cdbd2cSJim Jagielski 		}
1238*b1cdbd2cSJim Jagielski         aDataWinSize.Height() = GetOutputSizePixel().Height() - GetTitleHeight();
1239*b1cdbd2cSJim Jagielski         if ( nControlAreaWidth != USHRT_MAX )
1240*b1cdbd2cSJim Jagielski             aDataWinSize.Height() -= nCornerSize;
1241*b1cdbd2cSJim Jagielski 	}
1242*b1cdbd2cSJim Jagielski 	else if ( !aHScroll.IsVisible() )
1243*b1cdbd2cSJim Jagielski 	{
1244*b1cdbd2cSJim Jagielski 		Size aNewSize( aDataWinSize );
1245*b1cdbd2cSJim Jagielski 		aNewSize.Height() = GetOutputSizePixel().Height() - GetTitleHeight() - nCornerSize;
1246*b1cdbd2cSJim Jagielski 		aDataWinSize = aNewSize;
1247*b1cdbd2cSJim Jagielski 	}
1248*b1cdbd2cSJim Jagielski 
1249*b1cdbd2cSJim Jagielski 	// adjust position and Width of horizontal scrollbar
1250*b1cdbd2cSJim Jagielski 	sal_uLong nHScrX = nControlAreaWidth == USHRT_MAX
1251*b1cdbd2cSJim Jagielski 		? 0
1252*b1cdbd2cSJim Jagielski 		: nControlAreaWidth;
1253*b1cdbd2cSJim Jagielski 
1254*b1cdbd2cSJim Jagielski 	aHScroll.SetPosSizePixel(
1255*b1cdbd2cSJim Jagielski 		Point( nHScrX, GetOutputSizePixel().Height() - nCornerSize ),
1256*b1cdbd2cSJim Jagielski 		Size( aDataWinSize.Width() - nHScrX, nCornerSize ) );
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski 	// Scrollable Columns insgesamt
1259*b1cdbd2cSJim Jagielski 	short nScrollCols = short(pCols->Count()) - (short)nFrozenCols;
1260*b1cdbd2cSJim Jagielski 	/*short nVisibleHSize= std::max(nLastCol == BROWSER_INVALIDID
1261*b1cdbd2cSJim Jagielski 								? pCols->Count() - nFirstCol -1
1262*b1cdbd2cSJim Jagielski 								: nLastCol - nFirstCol - 1, 0);
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski 	aHScroll.SetVisibleSize( nVisibleHSize );
1265*b1cdbd2cSJim Jagielski 	aHScroll.SetRange( Range( 0, Max( std::min(nScrollCols, nVisibleHSize), (short)0 ) ) );
1266*b1cdbd2cSJim Jagielski 	if ( bNeedsHScroll && !aHScroll.IsVisible() )
1267*b1cdbd2cSJim Jagielski 		aHScroll.Show();*/
1268*b1cdbd2cSJim Jagielski 
1269*b1cdbd2cSJim Jagielski 	// Sichtbare Columns
1270*b1cdbd2cSJim Jagielski 	short nVisibleHSize = nLastCol == BROWSER_INVALIDID
1271*b1cdbd2cSJim Jagielski 		? (short)( pCols->Count() - nFirstCol )
1272*b1cdbd2cSJim Jagielski 		: (short)( nLastCol - nFirstCol );
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski 	short nRange = Max( nScrollCols, (short)0 );
1275*b1cdbd2cSJim Jagielski 	aHScroll.SetVisibleSize( nVisibleHSize );
1276*b1cdbd2cSJim Jagielski 	aHScroll.SetRange( Range( 0, nRange ));
1277*b1cdbd2cSJim Jagielski 	if ( bNeedsHScroll && !aHScroll.IsVisible() )
1278*b1cdbd2cSJim Jagielski 		aHScroll.Show();
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski 	// adjust position and height of vertical scrollbar
1281*b1cdbd2cSJim Jagielski 	pVScroll->SetPageSize( nMaxRows );
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski 	if ( nTopRow > nRowCount )
1284*b1cdbd2cSJim Jagielski 	{
1285*b1cdbd2cSJim Jagielski 		nTopRow = nRowCount - 1;
1286*b1cdbd2cSJim Jagielski 		DBG_ERROR("BrowseBox: nTopRow > nRowCount");
1287*b1cdbd2cSJim Jagielski 	}
1288*b1cdbd2cSJim Jagielski 
1289*b1cdbd2cSJim Jagielski 	if ( pVScroll->GetThumbPos() != nTopRow )
1290*b1cdbd2cSJim Jagielski 		pVScroll->SetThumbPos( nTopRow );
1291*b1cdbd2cSJim Jagielski 	long nVisibleSize = Min( Min( nRowCount, nMaxRows ), long(nRowCount-nTopRow) );
1292*b1cdbd2cSJim Jagielski 	pVScroll->SetVisibleSize( nVisibleSize ? nVisibleSize : 1 );
1293*b1cdbd2cSJim Jagielski 	pVScroll->SetRange( Range( 0, nRowCount ) );
1294*b1cdbd2cSJim Jagielski 	pVScroll->SetPosSizePixel(
1295*b1cdbd2cSJim Jagielski 		Point( aDataWinSize.Width(), GetTitleHeight() ),
1296*b1cdbd2cSJim Jagielski 		Size( nCornerSize, aDataWinSize.Height()) );
1297*b1cdbd2cSJim Jagielski 	if ( nRowCount <
1298*b1cdbd2cSJim Jagielski 		 long( aDataWinSize.Height() / GetDataRowHeight() ) )
1299*b1cdbd2cSJim Jagielski 		ScrollRows( -nTopRow );
1300*b1cdbd2cSJim Jagielski 	if ( bNeedsVScroll && !pVScroll->IsVisible() )
1301*b1cdbd2cSJim Jagielski 		pVScroll->Show();
1302*b1cdbd2cSJim Jagielski 
1303*b1cdbd2cSJim Jagielski 	pDataWin->SetPosSizePixel(
1304*b1cdbd2cSJim Jagielski 		Point( 0, GetTitleHeight() ),
1305*b1cdbd2cSJim Jagielski 		aDataWinSize );
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski 	// needs corner-window?
1308*b1cdbd2cSJim Jagielski 	// (do that AFTER positioning BOTH scrollbars)
1309*b1cdbd2cSJim Jagielski     sal_uLong nActualCorderWidth = 0;
1310*b1cdbd2cSJim Jagielski     if (aHScroll.IsVisible() && pVScroll && pVScroll->IsVisible() )
1311*b1cdbd2cSJim Jagielski     {
1312*b1cdbd2cSJim Jagielski         // if we have both scrollbars, the corner window fills the point of intersection of these two
1313*b1cdbd2cSJim Jagielski         nActualCorderWidth = nCornerSize;
1314*b1cdbd2cSJim Jagielski     }
1315*b1cdbd2cSJim Jagielski     else if ( !aHScroll.IsVisible() && ( nControlAreaWidth != USHRT_MAX ) )
1316*b1cdbd2cSJim Jagielski     {
1317*b1cdbd2cSJim Jagielski         // if we have no horizontal scrollbar, but a control area, we need the corner window to
1318*b1cdbd2cSJim Jagielski         // fill the space between the control are and the right border
1319*b1cdbd2cSJim Jagielski         nActualCorderWidth = GetOutputSizePixel().Width() - nControlAreaWidth;
1320*b1cdbd2cSJim Jagielski     }
1321*b1cdbd2cSJim Jagielski 	if ( nActualCorderWidth )
1322*b1cdbd2cSJim Jagielski 	{
1323*b1cdbd2cSJim Jagielski 		if ( !getDataWindow()->pCornerWin )
1324*b1cdbd2cSJim Jagielski 			getDataWindow()->pCornerWin = new ScrollBarBox( this, 0 );
1325*b1cdbd2cSJim Jagielski 		getDataWindow()->pCornerWin->SetPosSizePixel(
1326*b1cdbd2cSJim Jagielski 			Point( GetOutputSizePixel().Width() - nActualCorderWidth, aHScroll.GetPosPixel().Y() ),
1327*b1cdbd2cSJim Jagielski 			Size( nActualCorderWidth, nCornerSize ) );
1328*b1cdbd2cSJim Jagielski 		getDataWindow()->pCornerWin->Show();
1329*b1cdbd2cSJim Jagielski 	}
1330*b1cdbd2cSJim Jagielski 	else
1331*b1cdbd2cSJim Jagielski 		DELETEZ( getDataWindow()->pCornerWin );
1332*b1cdbd2cSJim Jagielski 
1333*b1cdbd2cSJim Jagielski 	// ggf. Headerbar mitscrollen
1334*b1cdbd2cSJim Jagielski 	if ( getDataWindow()->pHeaderBar )
1335*b1cdbd2cSJim Jagielski 	{
1336*b1cdbd2cSJim Jagielski 		long nWidth = 0;
1337*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 nCol = 0;
1338*b1cdbd2cSJim Jagielski 			  nCol < pCols->Count() && nCol < nFirstCol;
1339*b1cdbd2cSJim Jagielski 			  ++nCol )
1340*b1cdbd2cSJim Jagielski 		{
1341*b1cdbd2cSJim Jagielski 			// HandleColumn nicht
1342*b1cdbd2cSJim Jagielski 			if ( pCols->GetObject(nCol)->GetId() )
1343*b1cdbd2cSJim Jagielski 				nWidth += pCols->GetObject(nCol)->Width();
1344*b1cdbd2cSJim Jagielski 		}
1345*b1cdbd2cSJim Jagielski 
1346*b1cdbd2cSJim Jagielski 		getDataWindow()->pHeaderBar->SetOffset( nWidth );
1347*b1cdbd2cSJim Jagielski 	}
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski 	pBDW->bInUpdateScrollbars = sal_False;
1350*b1cdbd2cSJim Jagielski 	if ( pBDW->bHadRecursion )
1351*b1cdbd2cSJim Jagielski 	{
1352*b1cdbd2cSJim Jagielski 		pBDW->bHadRecursion = sal_False;
1353*b1cdbd2cSJim Jagielski 		UpdateScrollbars();
1354*b1cdbd2cSJim Jagielski 	}
1355*b1cdbd2cSJim Jagielski }
1356*b1cdbd2cSJim Jagielski 
1357*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1358*b1cdbd2cSJim Jagielski 
SetUpdateMode(sal_Bool bUpdate)1359*b1cdbd2cSJim Jagielski void BrowseBox::SetUpdateMode( sal_Bool bUpdate )
1360*b1cdbd2cSJim Jagielski {
1361*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1362*b1cdbd2cSJim Jagielski 
1363*b1cdbd2cSJim Jagielski 	sal_Bool bWasUpdate = IsUpdateMode();
1364*b1cdbd2cSJim Jagielski 	if ( bWasUpdate == bUpdate )
1365*b1cdbd2cSJim Jagielski 		return;
1366*b1cdbd2cSJim Jagielski 
1367*b1cdbd2cSJim Jagielski 	Control::SetUpdateMode( bUpdate );
1368*b1cdbd2cSJim Jagielski 	// OV
1369*b1cdbd2cSJim Jagielski 	// Wenn an der BrowseBox WB_CLIPCHILDREN gesetzt ist (wg. Flackerminimierung),
1370*b1cdbd2cSJim Jagielski 	// wird das Datenfenster nicht von SetUpdateMode invalidiert.
1371*b1cdbd2cSJim Jagielski 	if( bUpdate )
1372*b1cdbd2cSJim Jagielski 		getDataWindow()->Invalidate();
1373*b1cdbd2cSJim Jagielski 	getDataWindow()->SetUpdateMode( bUpdate );
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski 	if ( bUpdate )
1377*b1cdbd2cSJim Jagielski 	{
1378*b1cdbd2cSJim Jagielski 		if ( bBootstrapped )
1379*b1cdbd2cSJim Jagielski 		{
1380*b1cdbd2cSJim Jagielski 			UpdateScrollbars();
1381*b1cdbd2cSJim Jagielski 			AutoSizeLastColumn();
1382*b1cdbd2cSJim Jagielski 		}
1383*b1cdbd2cSJim Jagielski 		DoShowCursor( "SetUpdateMode" );
1384*b1cdbd2cSJim Jagielski 	}
1385*b1cdbd2cSJim Jagielski 	else
1386*b1cdbd2cSJim Jagielski 		DoHideCursor( "SetUpdateMode" );
1387*b1cdbd2cSJim Jagielski }
1388*b1cdbd2cSJim Jagielski 
1389*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1390*b1cdbd2cSJim Jagielski 
GetUpdateMode() const1391*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::GetUpdateMode() const
1392*b1cdbd2cSJim Jagielski {
1393*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski 	return getDataWindow()->IsUpdateMode();
1396*b1cdbd2cSJim Jagielski }
1397*b1cdbd2cSJim Jagielski 
1398*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1399*b1cdbd2cSJim Jagielski 
GetFrozenWidth() const1400*b1cdbd2cSJim Jagielski long BrowseBox::GetFrozenWidth() const
1401*b1cdbd2cSJim Jagielski {
1402*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski 	long nWidth = 0;
1405*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nCol = 0;
1406*b1cdbd2cSJim Jagielski 		  nCol < pCols->Count() && pCols->GetObject(nCol)->IsFrozen();
1407*b1cdbd2cSJim Jagielski 		  ++nCol )
1408*b1cdbd2cSJim Jagielski 		nWidth += pCols->GetObject(nCol)->Width();
1409*b1cdbd2cSJim Jagielski 	return nWidth;
1410*b1cdbd2cSJim Jagielski }
1411*b1cdbd2cSJim Jagielski 
1412*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1413*b1cdbd2cSJim Jagielski 
ColumnInserted(sal_uInt16 nPos)1414*b1cdbd2cSJim Jagielski void BrowseBox::ColumnInserted( sal_uInt16 nPos )
1415*b1cdbd2cSJim Jagielski {
1416*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1417*b1cdbd2cSJim Jagielski 
1418*b1cdbd2cSJim Jagielski 	if ( pColSel )
1419*b1cdbd2cSJim Jagielski 		pColSel->Insert( nPos );
1420*b1cdbd2cSJim Jagielski 	UpdateScrollbars();
1421*b1cdbd2cSJim Jagielski }
1422*b1cdbd2cSJim Jagielski 
1423*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1424*b1cdbd2cSJim Jagielski 
FrozenColCount() const1425*b1cdbd2cSJim Jagielski sal_uInt16 BrowseBox::FrozenColCount() const
1426*b1cdbd2cSJim Jagielski {
1427*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1428*b1cdbd2cSJim Jagielski 	sal_uInt16 nCol;
1429*b1cdbd2cSJim Jagielski 	for ( nCol = 0;
1430*b1cdbd2cSJim Jagielski 		  nCol < pCols->Count() && pCols->GetObject(nCol)->IsFrozen();
1431*b1cdbd2cSJim Jagielski 		  ++nCol )
1432*b1cdbd2cSJim Jagielski 		/* empty loop */;
1433*b1cdbd2cSJim Jagielski 	return nCol;
1434*b1cdbd2cSJim Jagielski }
1435*b1cdbd2cSJim Jagielski 
1436*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1437*b1cdbd2cSJim Jagielski 
IMPL_LINK(BrowseBox,ScrollHdl,ScrollBar *,pBar)1438*b1cdbd2cSJim Jagielski IMPL_LINK(BrowseBox,ScrollHdl,ScrollBar*,pBar)
1439*b1cdbd2cSJim Jagielski {
1440*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1441*b1cdbd2cSJim Jagielski 
1442*b1cdbd2cSJim Jagielski 	if ( pBar->GetDelta() == 0 )
1443*b1cdbd2cSJim Jagielski 		return 0;
1444*b1cdbd2cSJim Jagielski 
1445*b1cdbd2cSJim Jagielski 	if ( pBar->GetDelta() < 0 && getDataWindow()->bNoScrollBack )
1446*b1cdbd2cSJim Jagielski 	{
1447*b1cdbd2cSJim Jagielski 		UpdateScrollbars();
1448*b1cdbd2cSJim Jagielski 		return 0;
1449*b1cdbd2cSJim Jagielski 	}
1450*b1cdbd2cSJim Jagielski 
1451*b1cdbd2cSJim Jagielski 	if ( pBar == &aHScroll )
1452*b1cdbd2cSJim Jagielski 		ScrollColumns( aHScroll.GetDelta() );
1453*b1cdbd2cSJim Jagielski 	if ( pBar == pVScroll )
1454*b1cdbd2cSJim Jagielski 		ScrollRows( pVScroll->GetDelta() );
1455*b1cdbd2cSJim Jagielski 
1456*b1cdbd2cSJim Jagielski 	return 0;
1457*b1cdbd2cSJim Jagielski }
1458*b1cdbd2cSJim Jagielski 
1459*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1460*b1cdbd2cSJim Jagielski 
IMPL_LINK(BrowseBox,EndScrollHdl,ScrollBar *,EMPTYARG)1461*b1cdbd2cSJim Jagielski IMPL_LINK( BrowseBox,EndScrollHdl,ScrollBar*, EMPTYARG )
1462*b1cdbd2cSJim Jagielski {
1463*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski 	// kein Focus grabben!
1466*b1cdbd2cSJim Jagielski 	/// GrabFocus();
1467*b1cdbd2cSJim Jagielski 
1468*b1cdbd2cSJim Jagielski 	if ( /*pBar->GetDelta() <= 0 &&*/ getDataWindow()->bNoScrollBack )
1469*b1cdbd2cSJim Jagielski 	{
1470*b1cdbd2cSJim Jagielski 		// UpdateScrollbars();
1471*b1cdbd2cSJim Jagielski 		EndScroll();
1472*b1cdbd2cSJim Jagielski 		return 0;
1473*b1cdbd2cSJim Jagielski 	}
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski 	return 0;
1476*b1cdbd2cSJim Jagielski }
1477*b1cdbd2cSJim Jagielski 
1478*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1479*b1cdbd2cSJim Jagielski 
IMPL_LINK(BrowseBox,StartDragHdl,HeaderBar *,pBar)1480*b1cdbd2cSJim Jagielski IMPL_LINK( BrowseBox, StartDragHdl, HeaderBar*, pBar )
1481*b1cdbd2cSJim Jagielski {
1482*b1cdbd2cSJim Jagielski 	pBar->SetDragSize( pDataWin->GetOutputSizePixel().Height() );
1483*b1cdbd2cSJim Jagielski 	return 0;
1484*b1cdbd2cSJim Jagielski }
1485*b1cdbd2cSJim Jagielski 
1486*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1487*b1cdbd2cSJim Jagielski // MI: es wurde immer nur die 1. Spalte resized
1488*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
1489*b1cdbd2cSJim Jagielski #pragma optimize("",off)
1490*b1cdbd2cSJim Jagielski #endif
1491*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rEvt)1492*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonDown( const MouseEvent& rEvt )
1493*b1cdbd2cSJim Jagielski {
1494*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1495*b1cdbd2cSJim Jagielski 
1496*b1cdbd2cSJim Jagielski 	GrabFocus();
1497*b1cdbd2cSJim Jagielski 
1498*b1cdbd2cSJim Jagielski 	// onl< mouse events in the title-line are supported
1499*b1cdbd2cSJim Jagielski 	const Point &rEvtPos = rEvt.GetPosPixel();
1500*b1cdbd2cSJim Jagielski 	if ( rEvtPos.Y() >= GetTitleHeight() )
1501*b1cdbd2cSJim Jagielski 		return;
1502*b1cdbd2cSJim Jagielski 
1503*b1cdbd2cSJim Jagielski 	long nX = 0;
1504*b1cdbd2cSJim Jagielski 	long nWidth = GetOutputSizePixel().Width();
1505*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nCol = 0; nCol < pCols->Count() && nX < nWidth; ++nCol )
1506*b1cdbd2cSJim Jagielski 	{
1507*b1cdbd2cSJim Jagielski 		// is this column visible?
1508*b1cdbd2cSJim Jagielski 		BrowserColumn *pCol = pCols->GetObject(nCol);
1509*b1cdbd2cSJim Jagielski 		if ( pCol->IsFrozen() || nCol >= nFirstCol )
1510*b1cdbd2cSJim Jagielski 		{
1511*b1cdbd2cSJim Jagielski 			// compute right end of column
1512*b1cdbd2cSJim Jagielski 			long nR = nX + pCol->Width() - 1;
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski 			// at the end of a column (and not handle column)?
1515*b1cdbd2cSJim Jagielski 			if ( pCol->GetId() && Abs( nR - rEvtPos.X() ) < 2 )
1516*b1cdbd2cSJim Jagielski 			{
1517*b1cdbd2cSJim Jagielski 				// start resizing the column
1518*b1cdbd2cSJim Jagielski 				bResizing = sal_True;
1519*b1cdbd2cSJim Jagielski 				nResizeCol = nCol;
1520*b1cdbd2cSJim Jagielski 				nDragX = nResizeX = rEvtPos.X();
1521*b1cdbd2cSJim Jagielski 				SetPointer( Pointer( POINTER_HSPLIT ) );
1522*b1cdbd2cSJim Jagielski 				CaptureMouse();
1523*b1cdbd2cSJim Jagielski 				pDataWin->DrawLine( Point( nDragX, 0 ),
1524*b1cdbd2cSJim Jagielski 					Point( nDragX, pDataWin->GetSizePixel().Height() ) );
1525*b1cdbd2cSJim Jagielski 				nMinResizeX = nX + MIN_COLUMNWIDTH;
1526*b1cdbd2cSJim Jagielski 				return;
1527*b1cdbd2cSJim Jagielski 			}
1528*b1cdbd2cSJim Jagielski 			else if ( nX < rEvtPos.X() && nR > rEvtPos.X() )
1529*b1cdbd2cSJim Jagielski 			{
1530*b1cdbd2cSJim Jagielski 				MouseButtonDown( BrowserMouseEvent(
1531*b1cdbd2cSJim Jagielski 					this, rEvt, -1, nCol, pCol->GetId(), Rectangle() ) );
1532*b1cdbd2cSJim Jagielski 				return;
1533*b1cdbd2cSJim Jagielski 			}
1534*b1cdbd2cSJim Jagielski 			nX = nR + 1;
1535*b1cdbd2cSJim Jagielski 		}
1536*b1cdbd2cSJim Jagielski 	}
1537*b1cdbd2cSJim Jagielski 
1538*b1cdbd2cSJim Jagielski 	// event occured out of data area
1539*b1cdbd2cSJim Jagielski 	if ( rEvt.IsRight() )
1540*b1cdbd2cSJim Jagielski 		pDataWin->Command(
1541*b1cdbd2cSJim Jagielski 			CommandEvent( Point( 1, LONG_MAX ), COMMAND_CONTEXTMENU, sal_True ) );
1542*b1cdbd2cSJim Jagielski 	else
1543*b1cdbd2cSJim Jagielski 		SetNoSelection();
1544*b1cdbd2cSJim Jagielski }
1545*b1cdbd2cSJim Jagielski 
1546*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
1547*b1cdbd2cSJim Jagielski #pragma optimize("",on)
1548*b1cdbd2cSJim Jagielski #endif
1549*b1cdbd2cSJim Jagielski 
1550*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1551*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rEvt)1552*b1cdbd2cSJim Jagielski void BrowseBox::MouseMove( const MouseEvent& rEvt )
1553*b1cdbd2cSJim Jagielski {
1554*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1555*b1cdbd2cSJim Jagielski     DBG_TRACE( "BrowseBox::MouseMove( MouseEvent )" );
1556*b1cdbd2cSJim Jagielski 
1557*b1cdbd2cSJim Jagielski 	Pointer aNewPointer;
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski 	sal_uInt16 nX = 0;
1560*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nCol = 0;
1561*b1cdbd2cSJim Jagielski 		  nCol < sal_uInt16(pCols->Count()) &&
1562*b1cdbd2cSJim Jagielski 			( nX + pCols->GetObject(nCol)->Width() ) < sal_uInt16(GetOutputSizePixel().Width());
1563*b1cdbd2cSJim Jagielski 		  ++nCol )
1564*b1cdbd2cSJim Jagielski 		// is this column visible?
1565*b1cdbd2cSJim Jagielski 		if ( pCols->GetObject(nCol)->IsFrozen() || nCol >= nFirstCol )
1566*b1cdbd2cSJim Jagielski 		{
1567*b1cdbd2cSJim Jagielski 			// compute right end of column
1568*b1cdbd2cSJim Jagielski 			BrowserColumn *pCol = pCols->GetObject(nCol);
1569*b1cdbd2cSJim Jagielski 			sal_uInt16 nR = (sal_uInt16)(nX + pCol->Width() - 1);
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski 			// show resize-pointer?
1572*b1cdbd2cSJim Jagielski 			if ( bResizing || ( pCol->GetId() &&
1573*b1cdbd2cSJim Jagielski 				 Abs( ((long) nR ) - rEvt.GetPosPixel().X() ) < MIN_COLUMNWIDTH ) )
1574*b1cdbd2cSJim Jagielski 			{
1575*b1cdbd2cSJim Jagielski 				aNewPointer = Pointer( POINTER_HSPLIT );
1576*b1cdbd2cSJim Jagielski 				if ( bResizing )
1577*b1cdbd2cSJim Jagielski 				{
1578*b1cdbd2cSJim Jagielski 					// alte Hilfslinie loeschen
1579*b1cdbd2cSJim Jagielski 					pDataWin->HideTracking() ;
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski 					// erlaubte breite abholen und neues Delta
1582*b1cdbd2cSJim Jagielski 					nDragX = Max( rEvt.GetPosPixel().X(), nMinResizeX );
1583*b1cdbd2cSJim Jagielski 					long nDeltaX = nDragX - nResizeX;
1584*b1cdbd2cSJim Jagielski 					sal_uInt16 nId = GetColumnId(nResizeCol);
1585*b1cdbd2cSJim Jagielski 					sal_uLong nOldWidth = GetColumnWidth(nId);
1586*b1cdbd2cSJim Jagielski 					nDragX = QueryColumnResize( GetColumnId(nResizeCol),
1587*b1cdbd2cSJim Jagielski 									nOldWidth + nDeltaX )
1588*b1cdbd2cSJim Jagielski 							 + nResizeX - nOldWidth;
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski 					// neue Hilfslinie zeichnen
1591*b1cdbd2cSJim Jagielski 					pDataWin->ShowTracking( Rectangle( Point( nDragX, 0 ),
1592*b1cdbd2cSJim Jagielski 							Size( 1, pDataWin->GetSizePixel().Height() ) ),
1593*b1cdbd2cSJim Jagielski 							SHOWTRACK_SPLIT|SHOWTRACK_WINDOW );
1594*b1cdbd2cSJim Jagielski 				}
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski 			}
1597*b1cdbd2cSJim Jagielski 
1598*b1cdbd2cSJim Jagielski 			nX = nR + 1;
1599*b1cdbd2cSJim Jagielski 		}
1600*b1cdbd2cSJim Jagielski 
1601*b1cdbd2cSJim Jagielski 	SetPointer( aNewPointer );
1602*b1cdbd2cSJim Jagielski }
1603*b1cdbd2cSJim Jagielski 
1604*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1605*b1cdbd2cSJim Jagielski 
MouseButtonUp(const MouseEvent & rEvt)1606*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonUp( const MouseEvent & rEvt )
1607*b1cdbd2cSJim Jagielski {
1608*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1609*b1cdbd2cSJim Jagielski 
1610*b1cdbd2cSJim Jagielski 	if ( bResizing )
1611*b1cdbd2cSJim Jagielski 	{
1612*b1cdbd2cSJim Jagielski 		// Hilfslinie loeschen
1613*b1cdbd2cSJim Jagielski 		pDataWin->HideTracking();
1614*b1cdbd2cSJim Jagielski 
1615*b1cdbd2cSJim Jagielski 		// width changed?
1616*b1cdbd2cSJim Jagielski 		nDragX = Max( rEvt.GetPosPixel().X(), nMinResizeX );
1617*b1cdbd2cSJim Jagielski 		if ( (nDragX - nResizeX) != (long)pCols->GetObject(nResizeCol)->Width() )
1618*b1cdbd2cSJim Jagielski 		{
1619*b1cdbd2cSJim Jagielski 			// resize column
1620*b1cdbd2cSJim Jagielski 			long nMaxX = pDataWin->GetSizePixel().Width();
1621*b1cdbd2cSJim Jagielski 			nDragX = Min( nDragX, nMaxX );
1622*b1cdbd2cSJim Jagielski 			long nDeltaX = nDragX - nResizeX;
1623*b1cdbd2cSJim Jagielski 			sal_uInt16 nId = GetColumnId(nResizeCol);
1624*b1cdbd2cSJim Jagielski 			SetColumnWidth( GetColumnId(nResizeCol), GetColumnWidth(nId) + nDeltaX );
1625*b1cdbd2cSJim Jagielski 			ColumnResized( nId );
1626*b1cdbd2cSJim Jagielski 		}
1627*b1cdbd2cSJim Jagielski 
1628*b1cdbd2cSJim Jagielski 		// end action
1629*b1cdbd2cSJim Jagielski 		SetPointer( Pointer() );
1630*b1cdbd2cSJim Jagielski 		ReleaseMouse();
1631*b1cdbd2cSJim Jagielski 		bResizing = sal_False;
1632*b1cdbd2cSJim Jagielski 	}
1633*b1cdbd2cSJim Jagielski 	else
1634*b1cdbd2cSJim Jagielski 		MouseButtonUp( BrowserMouseEvent( (BrowserDataWin*)pDataWin,
1635*b1cdbd2cSJim Jagielski 				MouseEvent( Point( rEvt.GetPosPixel().X(),
1636*b1cdbd2cSJim Jagielski 						rEvt.GetPosPixel().Y() - pDataWin->GetPosPixel().Y() ),
1637*b1cdbd2cSJim Jagielski 					rEvt.GetClicks(), rEvt.GetMode(), rEvt.GetButtons(),
1638*b1cdbd2cSJim Jagielski 					rEvt.GetModifier() ) ) );
1639*b1cdbd2cSJim Jagielski }
1640*b1cdbd2cSJim Jagielski 
1641*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1642*b1cdbd2cSJim Jagielski 
1643*b1cdbd2cSJim Jagielski sal_Bool bExtendedMode = sal_False;
1644*b1cdbd2cSJim Jagielski sal_Bool bFieldMode = sal_False;
1645*b1cdbd2cSJim Jagielski 
MouseButtonDown(const BrowserMouseEvent & rEvt)1646*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonDown( const BrowserMouseEvent& rEvt )
1647*b1cdbd2cSJim Jagielski {
1648*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1649*b1cdbd2cSJim Jagielski 
1650*b1cdbd2cSJim Jagielski 	GrabFocus();
1651*b1cdbd2cSJim Jagielski 
1652*b1cdbd2cSJim Jagielski 	// adjust selection while and after double-click
1653*b1cdbd2cSJim Jagielski 	if ( rEvt.GetClicks() == 2 )
1654*b1cdbd2cSJim Jagielski 	{
1655*b1cdbd2cSJim Jagielski 		SetNoSelection();
1656*b1cdbd2cSJim Jagielski 		if ( rEvt.GetRow() >= 0 )
1657*b1cdbd2cSJim Jagielski 		{
1658*b1cdbd2cSJim Jagielski 			GoToRow( rEvt.GetRow() );
1659*b1cdbd2cSJim Jagielski 			SelectRow( rEvt.GetRow(), sal_True, sal_False );
1660*b1cdbd2cSJim Jagielski 		}
1661*b1cdbd2cSJim Jagielski 		else
1662*b1cdbd2cSJim Jagielski 		{
1663*b1cdbd2cSJim Jagielski 			if ( bColumnCursor && rEvt.GetColumn() != 0 )
1664*b1cdbd2cSJim Jagielski 			{
1665*b1cdbd2cSJim Jagielski 				if ( rEvt.GetColumn() < pCols->Count() )
1666*b1cdbd2cSJim Jagielski 					SelectColumnPos( rEvt.GetColumn(), sal_True, sal_False);
1667*b1cdbd2cSJim Jagielski 			}
1668*b1cdbd2cSJim Jagielski 		}
1669*b1cdbd2cSJim Jagielski 		DoubleClick( rEvt );
1670*b1cdbd2cSJim Jagielski 	}
1671*b1cdbd2cSJim Jagielski 	// selections
1672*b1cdbd2cSJim Jagielski 	else if ( ( rEvt.GetMode() & ( MOUSE_SELECT | MOUSE_SIMPLECLICK ) ) &&
1673*b1cdbd2cSJim Jagielski 		 ( bColumnCursor || rEvt.GetRow() >= 0 ) )
1674*b1cdbd2cSJim Jagielski 	{
1675*b1cdbd2cSJim Jagielski 		if ( rEvt.GetClicks() == 1 )
1676*b1cdbd2cSJim Jagielski 		{
1677*b1cdbd2cSJim Jagielski 			// initialise flags
1678*b1cdbd2cSJim Jagielski 			bHit            = sal_False;
1679*b1cdbd2cSJim Jagielski 			a1stPoint       =
1680*b1cdbd2cSJim Jagielski 			a2ndPoint       = PixelToLogic( rEvt.GetPosPixel() );
1681*b1cdbd2cSJim Jagielski 
1682*b1cdbd2cSJim Jagielski 			// selection out of range?
1683*b1cdbd2cSJim Jagielski 			if ( rEvt.GetRow() >= nRowCount ||
1684*b1cdbd2cSJim Jagielski 				 rEvt.GetColumnId() == BROWSER_INVALIDID )
1685*b1cdbd2cSJim Jagielski 			{
1686*b1cdbd2cSJim Jagielski 				SetNoSelection();
1687*b1cdbd2cSJim Jagielski 				return;
1688*b1cdbd2cSJim Jagielski 			}
1689*b1cdbd2cSJim Jagielski 
1690*b1cdbd2cSJim Jagielski 			// while selecting, no cursor
1691*b1cdbd2cSJim Jagielski 			bSelecting = sal_True;
1692*b1cdbd2cSJim Jagielski 			DoHideCursor( "MouseButtonDown" );
1693*b1cdbd2cSJim Jagielski 
1694*b1cdbd2cSJim Jagielski 			// DataRow?
1695*b1cdbd2cSJim Jagielski 			if ( rEvt.GetRow() >= 0 )
1696*b1cdbd2cSJim Jagielski 			{
1697*b1cdbd2cSJim Jagielski 				// Zeilenselektion?
1698*b1cdbd2cSJim Jagielski 				if ( rEvt.GetColumnId() == 0 || !bColumnCursor )
1699*b1cdbd2cSJim Jagielski 				{
1700*b1cdbd2cSJim Jagielski 					if ( bMultiSelection )
1701*b1cdbd2cSJim Jagielski 					{
1702*b1cdbd2cSJim Jagielski 						// remove column-selection, if exists
1703*b1cdbd2cSJim Jagielski 						if ( pColSel && pColSel->GetSelectCount() )
1704*b1cdbd2cSJim Jagielski 						{
1705*b1cdbd2cSJim Jagielski 							ToggleSelection();
1706*b1cdbd2cSJim Jagielski 							if ( bMultiSelection )
1707*b1cdbd2cSJim Jagielski 								uRow.pSel->SelectAll(sal_False);
1708*b1cdbd2cSJim Jagielski 							else
1709*b1cdbd2cSJim Jagielski 								uRow.nSel = BROWSER_ENDOFSELECTION;
1710*b1cdbd2cSJim Jagielski 							if ( pColSel )
1711*b1cdbd2cSJim Jagielski 								pColSel->SelectAll(sal_False);
1712*b1cdbd2cSJim Jagielski 							bSelect = sal_True;
1713*b1cdbd2cSJim Jagielski 						}
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski 						// expanding mode?
1716*b1cdbd2cSJim Jagielski 						if ( rEvt.GetMode() & MOUSE_RANGESELECT )
1717*b1cdbd2cSJim Jagielski 						{
1718*b1cdbd2cSJim Jagielski 							// select the further touched rows too
1719*b1cdbd2cSJim Jagielski 							bSelect = sal_True;
1720*b1cdbd2cSJim Jagielski 							ExpandRowSelection( rEvt );
1721*b1cdbd2cSJim Jagielski 							return;
1722*b1cdbd2cSJim Jagielski 						}
1723*b1cdbd2cSJim Jagielski 
1724*b1cdbd2cSJim Jagielski 						// click in the selected area?
1725*b1cdbd2cSJim Jagielski 						else if ( IsRowSelected( rEvt.GetRow() ) )
1726*b1cdbd2cSJim Jagielski 						{
1727*b1cdbd2cSJim Jagielski 							// auf Drag&Drop warten
1728*b1cdbd2cSJim Jagielski 							bHit = sal_True;
1729*b1cdbd2cSJim Jagielski 							bExtendedMode = MOUSE_MULTISELECT ==
1730*b1cdbd2cSJim Jagielski 									( rEvt.GetMode() & MOUSE_MULTISELECT );
1731*b1cdbd2cSJim Jagielski 							return;
1732*b1cdbd2cSJim Jagielski 						}
1733*b1cdbd2cSJim Jagielski 
1734*b1cdbd2cSJim Jagielski 						// extension mode?
1735*b1cdbd2cSJim Jagielski 						else if ( rEvt.GetMode() & MOUSE_MULTISELECT )
1736*b1cdbd2cSJim Jagielski 						{
1737*b1cdbd2cSJim Jagielski 							// determine the new selection range
1738*b1cdbd2cSJim Jagielski 							// and selection/deselection
1739*b1cdbd2cSJim Jagielski 							aSelRange = Range( rEvt.GetRow(), rEvt.GetRow() );
1740*b1cdbd2cSJim Jagielski 							SelectRow( rEvt.GetRow(),
1741*b1cdbd2cSJim Jagielski 									!uRow.pSel->IsSelected( rEvt.GetRow() ) );
1742*b1cdbd2cSJim Jagielski 							bSelect = sal_True;
1743*b1cdbd2cSJim Jagielski 							return;
1744*b1cdbd2cSJim Jagielski 						}
1745*b1cdbd2cSJim Jagielski 					}
1746*b1cdbd2cSJim Jagielski 
1747*b1cdbd2cSJim Jagielski 					// select directly
1748*b1cdbd2cSJim Jagielski 					SetNoSelection();
1749*b1cdbd2cSJim Jagielski 					GoToRow( rEvt.GetRow() );
1750*b1cdbd2cSJim Jagielski 					SelectRow( rEvt.GetRow(), sal_True );
1751*b1cdbd2cSJim Jagielski 					aSelRange = Range( rEvt.GetRow(), rEvt.GetRow() );
1752*b1cdbd2cSJim Jagielski 					bSelect = sal_True;
1753*b1cdbd2cSJim Jagielski 				}
1754*b1cdbd2cSJim Jagielski 				else // Column/Field-Selection
1755*b1cdbd2cSJim Jagielski 				{
1756*b1cdbd2cSJim Jagielski 					// click in selected column
1757*b1cdbd2cSJim Jagielski 					if ( IsColumnSelected( rEvt.GetColumn() ) ||
1758*b1cdbd2cSJim Jagielski 						 IsRowSelected( rEvt.GetRow() ) )
1759*b1cdbd2cSJim Jagielski 					{
1760*b1cdbd2cSJim Jagielski 						bHit = sal_True;
1761*b1cdbd2cSJim Jagielski 						bFieldMode = sal_True;
1762*b1cdbd2cSJim Jagielski 						return;
1763*b1cdbd2cSJim Jagielski 					}
1764*b1cdbd2cSJim Jagielski 
1765*b1cdbd2cSJim Jagielski 					SetNoSelection();
1766*b1cdbd2cSJim Jagielski 					GoToRowColumnId( rEvt.GetRow(), rEvt.GetColumnId() );
1767*b1cdbd2cSJim Jagielski 					bSelect = sal_True;
1768*b1cdbd2cSJim Jagielski 				}
1769*b1cdbd2cSJim Jagielski 			}
1770*b1cdbd2cSJim Jagielski 			else
1771*b1cdbd2cSJim Jagielski 			{
1772*b1cdbd2cSJim Jagielski 				if ( bMultiSelection && rEvt.GetColumnId() == 0 )
1773*b1cdbd2cSJim Jagielski 				{
1774*b1cdbd2cSJim Jagielski 					// toggle all-selection
1775*b1cdbd2cSJim Jagielski 					if ( uRow.pSel->GetSelectCount() > ( GetRowCount() / 2 ) )
1776*b1cdbd2cSJim Jagielski 						SetNoSelection();
1777*b1cdbd2cSJim Jagielski 					else
1778*b1cdbd2cSJim Jagielski 						SelectAll();
1779*b1cdbd2cSJim Jagielski 				}
1780*b1cdbd2cSJim Jagielski 				else
1781*b1cdbd2cSJim Jagielski 					SelectColumnId( rEvt.GetColumnId(), sal_True, sal_False );
1782*b1cdbd2cSJim Jagielski 			}
1783*b1cdbd2cSJim Jagielski 
1784*b1cdbd2cSJim Jagielski 			// ggf. Cursor wieder an
1785*b1cdbd2cSJim Jagielski 			bSelecting = sal_False;
1786*b1cdbd2cSJim Jagielski 			DoShowCursor( "MouseButtonDown" );
1787*b1cdbd2cSJim Jagielski 			if ( bSelect )
1788*b1cdbd2cSJim Jagielski 				Select();
1789*b1cdbd2cSJim Jagielski 		}
1790*b1cdbd2cSJim Jagielski 	}
1791*b1cdbd2cSJim Jagielski }
1792*b1cdbd2cSJim Jagielski 
1793*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1794*b1cdbd2cSJim Jagielski 
MouseMove(const BrowserMouseEvent &)1795*b1cdbd2cSJim Jagielski void BrowseBox::MouseMove( const BrowserMouseEvent& )
1796*b1cdbd2cSJim Jagielski {
1797*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1798*b1cdbd2cSJim Jagielski }
1799*b1cdbd2cSJim Jagielski 
1800*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1801*b1cdbd2cSJim Jagielski 
MouseButtonUp(const BrowserMouseEvent & rEvt)1802*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonUp( const BrowserMouseEvent &rEvt )
1803*b1cdbd2cSJim Jagielski {
1804*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1805*b1cdbd2cSJim Jagielski 
1806*b1cdbd2cSJim Jagielski 	// D&D was possible, but did not occur
1807*b1cdbd2cSJim Jagielski 	if ( bHit )
1808*b1cdbd2cSJim Jagielski 	{
1809*b1cdbd2cSJim Jagielski 		aSelRange = Range( rEvt.GetRow(), rEvt.GetRow() );
1810*b1cdbd2cSJim Jagielski 		if ( bExtendedMode )
1811*b1cdbd2cSJim Jagielski 			SelectRow( rEvt.GetRow(), sal_False );
1812*b1cdbd2cSJim Jagielski 		else
1813*b1cdbd2cSJim Jagielski 		{
1814*b1cdbd2cSJim Jagielski 			SetNoSelection();
1815*b1cdbd2cSJim Jagielski 			if ( bFieldMode )
1816*b1cdbd2cSJim Jagielski 				GoToRowColumnId( rEvt.GetRow(), rEvt.GetColumnId() );
1817*b1cdbd2cSJim Jagielski 			else
1818*b1cdbd2cSJim Jagielski 			{
1819*b1cdbd2cSJim Jagielski 				GoToRow( rEvt.GetRow() );
1820*b1cdbd2cSJim Jagielski 				SelectRow( rEvt.GetRow(), sal_True );
1821*b1cdbd2cSJim Jagielski 			}
1822*b1cdbd2cSJim Jagielski 		}
1823*b1cdbd2cSJim Jagielski 		bSelect = sal_True;
1824*b1cdbd2cSJim Jagielski 		bExtendedMode = sal_False;
1825*b1cdbd2cSJim Jagielski 		bFieldMode = sal_False;
1826*b1cdbd2cSJim Jagielski 		bHit = sal_False;
1827*b1cdbd2cSJim Jagielski 	}
1828*b1cdbd2cSJim Jagielski 
1829*b1cdbd2cSJim Jagielski 	// activate cursor
1830*b1cdbd2cSJim Jagielski 	if ( bSelecting )
1831*b1cdbd2cSJim Jagielski 	{
1832*b1cdbd2cSJim Jagielski 		bSelecting = sal_False;
1833*b1cdbd2cSJim Jagielski 		DoShowCursor( "MouseButtonUp" );
1834*b1cdbd2cSJim Jagielski 		if ( bSelect )
1835*b1cdbd2cSJim Jagielski 			Select();
1836*b1cdbd2cSJim Jagielski 	}
1837*b1cdbd2cSJim Jagielski }
1838*b1cdbd2cSJim Jagielski 
1839*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1840*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rEvt)1841*b1cdbd2cSJim Jagielski void BrowseBox::KeyInput( const KeyEvent& rEvt )
1842*b1cdbd2cSJim Jagielski {
1843*b1cdbd2cSJim Jagielski 	if ( !ProcessKey( rEvt ) )
1844*b1cdbd2cSJim Jagielski 		Control::KeyInput( rEvt );
1845*b1cdbd2cSJim Jagielski }
1846*b1cdbd2cSJim Jagielski 
1847*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1848*b1cdbd2cSJim Jagielski 
ProcessKey(const KeyEvent & rEvt)1849*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::ProcessKey( const KeyEvent& rEvt )
1850*b1cdbd2cSJim Jagielski {
1851*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1852*b1cdbd2cSJim Jagielski 
1853*b1cdbd2cSJim Jagielski 	sal_uInt16 nCode = rEvt.GetKeyCode().GetCode();
1854*b1cdbd2cSJim Jagielski 	sal_Bool   bShift = rEvt.GetKeyCode().IsShift();
1855*b1cdbd2cSJim Jagielski 	sal_Bool   bCtrl = rEvt.GetKeyCode().IsMod1();
1856*b1cdbd2cSJim Jagielski 	sal_Bool   bAlt = rEvt.GetKeyCode().IsMod2();
1857*b1cdbd2cSJim Jagielski 
1858*b1cdbd2cSJim Jagielski 	sal_uInt16 nId = BROWSER_NONE;
1859*b1cdbd2cSJim Jagielski 
1860*b1cdbd2cSJim Jagielski 	if ( !bAlt && !bCtrl && !bShift )
1861*b1cdbd2cSJim Jagielski 	{
1862*b1cdbd2cSJim Jagielski 		switch ( nCode )
1863*b1cdbd2cSJim Jagielski 		{
1864*b1cdbd2cSJim Jagielski 			case KEY_DOWN:          nId = BROWSER_CURSORDOWN; break;
1865*b1cdbd2cSJim Jagielski 			case KEY_UP:            nId = BROWSER_CURSORUP; break;
1866*b1cdbd2cSJim Jagielski 			case KEY_HOME:          nId = BROWSER_CURSORHOME; break;
1867*b1cdbd2cSJim Jagielski 			case KEY_END:           nId = BROWSER_CURSOREND; break;
1868*b1cdbd2cSJim Jagielski 			case KEY_TAB:
1869*b1cdbd2cSJim Jagielski 				if ( !bColumnCursor )
1870*b1cdbd2cSJim Jagielski 					break;
1871*b1cdbd2cSJim Jagielski 			case KEY_RIGHT:         nId = BROWSER_CURSORRIGHT; break;
1872*b1cdbd2cSJim Jagielski 			case KEY_LEFT:          nId = BROWSER_CURSORLEFT; break;
1873*b1cdbd2cSJim Jagielski 			case KEY_SPACE:         nId = BROWSER_SELECT; break;
1874*b1cdbd2cSJim Jagielski 		}
1875*b1cdbd2cSJim Jagielski 		if ( BROWSER_NONE != nId )
1876*b1cdbd2cSJim Jagielski 			SetNoSelection();
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski 		switch ( nCode )
1879*b1cdbd2cSJim Jagielski 		{
1880*b1cdbd2cSJim Jagielski 			case KEY_PAGEDOWN:      nId = BROWSER_CURSORPAGEDOWN; break;
1881*b1cdbd2cSJim Jagielski 			case KEY_PAGEUP:        nId = BROWSER_CURSORPAGEUP; break;
1882*b1cdbd2cSJim Jagielski 		}
1883*b1cdbd2cSJim Jagielski 	}
1884*b1cdbd2cSJim Jagielski 
1885*b1cdbd2cSJim Jagielski 	if ( !bAlt && !bCtrl && bShift )
1886*b1cdbd2cSJim Jagielski 		switch ( nCode )
1887*b1cdbd2cSJim Jagielski 		{
1888*b1cdbd2cSJim Jagielski 			case KEY_DOWN:          nId = BROWSER_SELECTDOWN; break;
1889*b1cdbd2cSJim Jagielski 			case KEY_UP:            nId = BROWSER_SELECTUP; break;
1890*b1cdbd2cSJim Jagielski 			case KEY_TAB:
1891*b1cdbd2cSJim Jagielski 				if ( !bColumnCursor )
1892*b1cdbd2cSJim Jagielski 					break;
1893*b1cdbd2cSJim Jagielski 									nId = BROWSER_CURSORLEFT; break;
1894*b1cdbd2cSJim Jagielski 			case KEY_HOME:          nId = BROWSER_SELECTHOME; break;
1895*b1cdbd2cSJim Jagielski 			case KEY_END:           nId = BROWSER_SELECTEND; break;
1896*b1cdbd2cSJim Jagielski 		}
1897*b1cdbd2cSJim Jagielski 
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski 	if ( !bAlt && bCtrl && !bShift )
1900*b1cdbd2cSJim Jagielski 		switch ( nCode )
1901*b1cdbd2cSJim Jagielski 		{
1902*b1cdbd2cSJim Jagielski 			case KEY_DOWN:          nId = BROWSER_CURSORDOWN; break;
1903*b1cdbd2cSJim Jagielski 			case KEY_UP:            nId = BROWSER_CURSORUP; break;
1904*b1cdbd2cSJim Jagielski 			case KEY_PAGEDOWN:      nId = BROWSER_CURSORENDOFFILE; break;
1905*b1cdbd2cSJim Jagielski 			case KEY_PAGEUP:        nId = BROWSER_CURSORTOPOFFILE; break;
1906*b1cdbd2cSJim Jagielski 			case KEY_HOME:          nId = BROWSER_CURSORTOPOFSCREEN; break;
1907*b1cdbd2cSJim Jagielski 			case KEY_END:           nId = BROWSER_CURSORENDOFSCREEN; break;
1908*b1cdbd2cSJim Jagielski 			case KEY_SPACE:         nId = BROWSER_ENHANCESELECTION; break;
1909*b1cdbd2cSJim Jagielski 			case KEY_LEFT:          nId = BROWSER_MOVECOLUMNLEFT; break;
1910*b1cdbd2cSJim Jagielski 			case KEY_RIGHT:         nId = BROWSER_MOVECOLUMNRIGHT; break;
1911*b1cdbd2cSJim Jagielski 		}
1912*b1cdbd2cSJim Jagielski 
1913*b1cdbd2cSJim Jagielski 	if ( nId != BROWSER_NONE )
1914*b1cdbd2cSJim Jagielski 		Dispatch( nId );
1915*b1cdbd2cSJim Jagielski 	return nId != BROWSER_NONE;
1916*b1cdbd2cSJim Jagielski }
1917*b1cdbd2cSJim Jagielski 
1918*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1919*b1cdbd2cSJim Jagielski 
Dispatch(sal_uInt16 nId)1920*b1cdbd2cSJim Jagielski void BrowseBox::Dispatch( sal_uInt16 nId )
1921*b1cdbd2cSJim Jagielski {
1922*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1923*b1cdbd2cSJim Jagielski 
1924*b1cdbd2cSJim Jagielski 	long nRowsOnPage = pDataWin->GetSizePixel().Height() / GetDataRowHeight();
1925*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
1926*b1cdbd2cSJim Jagielski 
1927*b1cdbd2cSJim Jagielski 	switch ( nId )
1928*b1cdbd2cSJim Jagielski 	{
1929*b1cdbd2cSJim Jagielski 		case BROWSER_SELECTCOLUMN:
1930*b1cdbd2cSJim Jagielski 			if ( ColCount() )
1931*b1cdbd2cSJim Jagielski 				SelectColumnId( GetCurColumnId() );
1932*b1cdbd2cSJim Jagielski 			break;
1933*b1cdbd2cSJim Jagielski 
1934*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORDOWN:
1935*b1cdbd2cSJim Jagielski 			if ( ( GetCurRow() + 1 ) < nRowCount )
1936*b1cdbd2cSJim Jagielski 				bDone = GoToRow( GetCurRow() + 1, sal_False );
1937*b1cdbd2cSJim Jagielski 			break;
1938*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORUP:
1939*b1cdbd2cSJim Jagielski 			if ( GetCurRow() > 0 )
1940*b1cdbd2cSJim Jagielski 				bDone = GoToRow( GetCurRow() - 1, sal_False );
1941*b1cdbd2cSJim Jagielski 			break;
1942*b1cdbd2cSJim Jagielski 		case BROWSER_SELECTHOME:
1943*b1cdbd2cSJim Jagielski 			if ( GetRowCount() )
1944*b1cdbd2cSJim Jagielski 			{
1945*b1cdbd2cSJim Jagielski 				DoHideCursor( "BROWSER_SELECTHOME" );
1946*b1cdbd2cSJim Jagielski 				for ( long nRow = GetCurRow(); nRow >= 0; --nRow )
1947*b1cdbd2cSJim Jagielski 					SelectRow( nRow );
1948*b1cdbd2cSJim Jagielski 				GoToRow( 0, sal_True );
1949*b1cdbd2cSJim Jagielski 				DoShowCursor( "BROWSER_SELECTHOME" );
1950*b1cdbd2cSJim Jagielski 			}
1951*b1cdbd2cSJim Jagielski 			break;
1952*b1cdbd2cSJim Jagielski 		case BROWSER_SELECTEND:
1953*b1cdbd2cSJim Jagielski 			if ( GetRowCount() )
1954*b1cdbd2cSJim Jagielski 			{
1955*b1cdbd2cSJim Jagielski 				DoHideCursor( "BROWSER_SELECTEND" );
1956*b1cdbd2cSJim Jagielski 				long nRows = GetRowCount();
1957*b1cdbd2cSJim Jagielski 				for ( long nRow = GetCurRow(); nRow < nRows; ++nRow )
1958*b1cdbd2cSJim Jagielski 					SelectRow( nRow );
1959*b1cdbd2cSJim Jagielski 				GoToRow( GetRowCount() - 1, sal_True );
1960*b1cdbd2cSJim Jagielski 				DoShowCursor( "BROWSER_SELECTEND" );
1961*b1cdbd2cSJim Jagielski 			}
1962*b1cdbd2cSJim Jagielski 			break;
1963*b1cdbd2cSJim Jagielski 		case BROWSER_SELECTDOWN:
1964*b1cdbd2cSJim Jagielski 		{
1965*b1cdbd2cSJim Jagielski 			if ( GetRowCount() && ( GetCurRow() + 1 ) < nRowCount )
1966*b1cdbd2cSJim Jagielski 			{
1967*b1cdbd2cSJim Jagielski 				// deselect the current row, if it isn't the first
1968*b1cdbd2cSJim Jagielski 				// and there is no other selected row above
1969*b1cdbd2cSJim Jagielski 				long nRow = GetCurRow();
1970*b1cdbd2cSJim Jagielski 				sal_Bool bLocalSelect = ( !IsRowSelected( nRow ) ||
1971*b1cdbd2cSJim Jagielski 								 GetSelectRowCount() == 1 || IsRowSelected( nRow - 1 ) );
1972*b1cdbd2cSJim Jagielski 				SelectRow( nRow, bLocalSelect, sal_True );
1973*b1cdbd2cSJim Jagielski 				bDone = GoToRow( GetCurRow() + 1 , sal_False );
1974*b1cdbd2cSJim Jagielski 				if ( bDone )
1975*b1cdbd2cSJim Jagielski 					SelectRow( GetCurRow(), sal_True, sal_True );
1976*b1cdbd2cSJim Jagielski 			}
1977*b1cdbd2cSJim Jagielski 			else
1978*b1cdbd2cSJim Jagielski 				bDone = ScrollRows( 1 ) != 0;
1979*b1cdbd2cSJim Jagielski 			break;
1980*b1cdbd2cSJim Jagielski 		}
1981*b1cdbd2cSJim Jagielski 		case BROWSER_SELECTUP:
1982*b1cdbd2cSJim Jagielski 			if ( GetRowCount() )
1983*b1cdbd2cSJim Jagielski 			{
1984*b1cdbd2cSJim Jagielski 				// deselect the current row, if it isn't the first
1985*b1cdbd2cSJim Jagielski 				// and there is no other selected row under
1986*b1cdbd2cSJim Jagielski 				long nRow = GetCurRow();
1987*b1cdbd2cSJim Jagielski 				sal_Bool bLocalSelect = ( !IsRowSelected( nRow ) ||
1988*b1cdbd2cSJim Jagielski 								 GetSelectRowCount() == 1 || IsRowSelected( nRow + 1 ) );
1989*b1cdbd2cSJim Jagielski 				SelectRow( nCurRow, bLocalSelect, sal_True );
1990*b1cdbd2cSJim Jagielski                 bDone = GoToRow( nRow - 1 , sal_False );
1991*b1cdbd2cSJim Jagielski 				if ( bDone )
1992*b1cdbd2cSJim Jagielski 					SelectRow( GetCurRow(), sal_True, sal_True );
1993*b1cdbd2cSJim Jagielski 			}
1994*b1cdbd2cSJim Jagielski 			break;
1995*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORPAGEDOWN:
1996*b1cdbd2cSJim Jagielski 			bDone = (sal_Bool)ScrollRows( nRowsOnPage );
1997*b1cdbd2cSJim Jagielski 			break;
1998*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORPAGEUP:
1999*b1cdbd2cSJim Jagielski 			bDone = (sal_Bool)ScrollRows( -nRowsOnPage );
2000*b1cdbd2cSJim Jagielski 			break;
2001*b1cdbd2cSJim Jagielski 		case BROWSER_CURSOREND:
2002*b1cdbd2cSJim Jagielski 			if ( bColumnCursor )
2003*b1cdbd2cSJim Jagielski 			{
2004*b1cdbd2cSJim Jagielski 				sal_uInt16 nNewId = GetColumnId(ColCount() -1);
2005*b1cdbd2cSJim Jagielski 				bDone = (nNewId != 0) && GoToColumnId( nNewId );
2006*b1cdbd2cSJim Jagielski 				break;
2007*b1cdbd2cSJim Jagielski 			}
2008*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORENDOFFILE:
2009*b1cdbd2cSJim Jagielski 			bDone = GoToRow( nRowCount - 1, sal_False );
2010*b1cdbd2cSJim Jagielski 			break;
2011*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORRIGHT:
2012*b1cdbd2cSJim Jagielski 			if ( bColumnCursor )
2013*b1cdbd2cSJim Jagielski 			{
2014*b1cdbd2cSJim Jagielski 				sal_uInt16 nNewPos = GetColumnPos( GetCurColumnId() ) + 1;
2015*b1cdbd2cSJim Jagielski 				sal_uInt16 nNewId = GetColumnId( nNewPos );
2016*b1cdbd2cSJim Jagielski 				if (nNewId != 0)	// Am Zeilenende ?
2017*b1cdbd2cSJim Jagielski 					bDone = GoToColumnId( nNewId );
2018*b1cdbd2cSJim Jagielski 				else
2019*b1cdbd2cSJim Jagielski 				{
2020*b1cdbd2cSJim Jagielski 					sal_uInt16 nColId = ( GetColumnId(0) == 0 ) ? GetColumnId(1) : GetColumnId(0);
2021*b1cdbd2cSJim Jagielski 					if ( GetRowCount() )
2022*b1cdbd2cSJim Jagielski 						bDone = ( nCurRow < GetRowCount() - 1 ) && GoToRowColumnId( nCurRow + 1, nColId );
2023*b1cdbd2cSJim Jagielski 					else if ( ColCount() )
2024*b1cdbd2cSJim Jagielski 						GoToColumnId( nColId );
2025*b1cdbd2cSJim Jagielski 				}
2026*b1cdbd2cSJim Jagielski 			}
2027*b1cdbd2cSJim Jagielski 			else
2028*b1cdbd2cSJim Jagielski 				bDone = ScrollColumns( 1 ) != 0;
2029*b1cdbd2cSJim Jagielski 			break;
2030*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORHOME:
2031*b1cdbd2cSJim Jagielski 			if ( bColumnCursor )
2032*b1cdbd2cSJim Jagielski 			{
2033*b1cdbd2cSJim Jagielski 				sal_uInt16 nNewId = GetColumnId(1);
2034*b1cdbd2cSJim Jagielski 				bDone = (nNewId != 0) && GoToColumnId( nNewId );
2035*b1cdbd2cSJim Jagielski 				break;
2036*b1cdbd2cSJim Jagielski 			}
2037*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORTOPOFFILE:
2038*b1cdbd2cSJim Jagielski 			bDone = GoToRow( 0, sal_False );
2039*b1cdbd2cSJim Jagielski 			break;
2040*b1cdbd2cSJim Jagielski 		case BROWSER_CURSORLEFT:
2041*b1cdbd2cSJim Jagielski 			if ( bColumnCursor )
2042*b1cdbd2cSJim Jagielski 			{
2043*b1cdbd2cSJim Jagielski 				sal_uInt16 nNewPos = GetColumnPos( GetCurColumnId() ) - 1;
2044*b1cdbd2cSJim Jagielski 				sal_uInt16 nNewId = GetColumnId( nNewPos );
2045*b1cdbd2cSJim Jagielski 				if (nNewId != 0)
2046*b1cdbd2cSJim Jagielski 					bDone = GoToColumnId( nNewId );
2047*b1cdbd2cSJim Jagielski 				else
2048*b1cdbd2cSJim Jagielski 				{
2049*b1cdbd2cSJim Jagielski 					if ( GetRowCount() )
2050*b1cdbd2cSJim Jagielski 						bDone = (nCurRow > 0) && GoToRowColumnId(nCurRow - 1, GetColumnId(ColCount() -1));
2051*b1cdbd2cSJim Jagielski 					else if ( ColCount() )
2052*b1cdbd2cSJim Jagielski 						GoToColumnId( GetColumnId(ColCount() -1) );
2053*b1cdbd2cSJim Jagielski 				}
2054*b1cdbd2cSJim Jagielski 			}
2055*b1cdbd2cSJim Jagielski 			else
2056*b1cdbd2cSJim Jagielski 				bDone = ScrollColumns( -1 ) != 0;
2057*b1cdbd2cSJim Jagielski 			break;
2058*b1cdbd2cSJim Jagielski 		case BROWSER_ENHANCESELECTION:
2059*b1cdbd2cSJim Jagielski 			if ( GetRowCount() )
2060*b1cdbd2cSJim Jagielski 				SelectRow( GetCurRow(), !IsRowSelected( GetCurRow() ), sal_True );
2061*b1cdbd2cSJim Jagielski 			bDone = sal_True;
2062*b1cdbd2cSJim Jagielski 			break;
2063*b1cdbd2cSJim Jagielski 		case BROWSER_SELECT:
2064*b1cdbd2cSJim Jagielski 			if ( GetRowCount() )
2065*b1cdbd2cSJim Jagielski 				SelectRow( GetCurRow(), !IsRowSelected( GetCurRow() ), sal_False );
2066*b1cdbd2cSJim Jagielski 			bDone = sal_True;
2067*b1cdbd2cSJim Jagielski 			break;
2068*b1cdbd2cSJim Jagielski 		case BROWSER_MOVECOLUMNLEFT:
2069*b1cdbd2cSJim Jagielski 		case BROWSER_MOVECOLUMNRIGHT:
2070*b1cdbd2cSJim Jagielski 			{ // check if column moving is allowed
2071*b1cdbd2cSJim Jagielski 				BrowserHeader* pHeaderBar = getDataWindow()->pHeaderBar;
2072*b1cdbd2cSJim Jagielski 				if ( pHeaderBar && pHeaderBar->IsDragable() )
2073*b1cdbd2cSJim Jagielski 				{
2074*b1cdbd2cSJim Jagielski 					sal_uInt16 nColId = GetCurColumnId();
2075*b1cdbd2cSJim Jagielski 					sal_Bool bColumnSelected = IsColumnSelected(nColId);
2076*b1cdbd2cSJim Jagielski 					sal_uInt16 nNewPos = GetColumnPos(nColId);
2077*b1cdbd2cSJim Jagielski 					sal_Bool bMoveAllowed = sal_False;
2078*b1cdbd2cSJim Jagielski 					if ( BROWSER_MOVECOLUMNLEFT == nId && nNewPos > 1 )
2079*b1cdbd2cSJim Jagielski 						--nNewPos,bMoveAllowed = sal_True;
2080*b1cdbd2cSJim Jagielski 					else if ( BROWSER_MOVECOLUMNRIGHT == nId && nNewPos < (ColCount()-1) )
2081*b1cdbd2cSJim Jagielski 						++nNewPos,bMoveAllowed = sal_True;
2082*b1cdbd2cSJim Jagielski 
2083*b1cdbd2cSJim Jagielski 					if ( bMoveAllowed )
2084*b1cdbd2cSJim Jagielski 					{
2085*b1cdbd2cSJim Jagielski 						SetColumnPos( nColId, nNewPos );
2086*b1cdbd2cSJim Jagielski 						ColumnMoved( nColId );
2087*b1cdbd2cSJim Jagielski 						MakeFieldVisible(GetCurRow(),nColId,sal_True);
2088*b1cdbd2cSJim Jagielski 						if ( bColumnSelected )
2089*b1cdbd2cSJim Jagielski 							SelectColumnId(nColId);
2090*b1cdbd2cSJim Jagielski 					}
2091*b1cdbd2cSJim Jagielski 				}
2092*b1cdbd2cSJim Jagielski 			}
2093*b1cdbd2cSJim Jagielski 			break;
2094*b1cdbd2cSJim Jagielski 	}
2095*b1cdbd2cSJim Jagielski 
2096*b1cdbd2cSJim Jagielski 	//! return bDone;
2097*b1cdbd2cSJim Jagielski }
2098*b1cdbd2cSJim Jagielski 
2099*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
2100*b1cdbd2cSJim Jagielski 
SetCursorColor(const Color & _rCol)2101*b1cdbd2cSJim Jagielski void BrowseBox::SetCursorColor(const Color& _rCol)
2102*b1cdbd2cSJim Jagielski {
2103*b1cdbd2cSJim Jagielski 	if (_rCol == m_aCursorColor)
2104*b1cdbd2cSJim Jagielski 		return;
2105*b1cdbd2cSJim Jagielski 
2106*b1cdbd2cSJim Jagielski 	// ensure the cursor is hidden
2107*b1cdbd2cSJim Jagielski 	DoHideCursor("SetCursorColor");
2108*b1cdbd2cSJim Jagielski 	if (!m_bFocusOnlyCursor)
2109*b1cdbd2cSJim Jagielski 		DoHideCursor("SetCursorColor - force");
2110*b1cdbd2cSJim Jagielski 
2111*b1cdbd2cSJim Jagielski 	m_aCursorColor = _rCol;
2112*b1cdbd2cSJim Jagielski 
2113*b1cdbd2cSJim Jagielski 	if (!m_bFocusOnlyCursor)
2114*b1cdbd2cSJim Jagielski 		DoShowCursor("SetCursorColor - force");
2115*b1cdbd2cSJim Jagielski 	DoShowCursor("SetCursorColor");
2116*b1cdbd2cSJim Jagielski }
2117*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
calcHeaderRect(sal_Bool _bIsColumnBar,sal_Bool _bOnScreen)2118*b1cdbd2cSJim Jagielski Rectangle BrowseBox::calcHeaderRect(sal_Bool _bIsColumnBar,sal_Bool _bOnScreen)
2119*b1cdbd2cSJim Jagielski {
2120*b1cdbd2cSJim Jagielski 	Window* pParent = NULL;
2121*b1cdbd2cSJim Jagielski 	if ( !_bOnScreen )
2122*b1cdbd2cSJim Jagielski 		pParent = GetAccessibleParentWindow();
2123*b1cdbd2cSJim Jagielski 
2124*b1cdbd2cSJim Jagielski 	Point aTopLeft;
2125*b1cdbd2cSJim Jagielski 	long nWidth;
2126*b1cdbd2cSJim Jagielski 	long nHeight;
2127*b1cdbd2cSJim Jagielski 	if ( _bIsColumnBar )
2128*b1cdbd2cSJim Jagielski 	{
2129*b1cdbd2cSJim Jagielski 		nWidth = GetDataWindow().GetOutputSizePixel().Width();
2130*b1cdbd2cSJim Jagielski 		nHeight = GetDataRowHeight();
2131*b1cdbd2cSJim Jagielski 	}
2132*b1cdbd2cSJim Jagielski 	else
2133*b1cdbd2cSJim Jagielski 	{
2134*b1cdbd2cSJim Jagielski 		aTopLeft.Y() = GetDataRowHeight();
2135*b1cdbd2cSJim Jagielski 		nWidth = GetColumnWidth(0);
2136*b1cdbd2cSJim Jagielski 		nHeight = GetWindowExtentsRelative( pParent ).GetHeight() - aTopLeft.Y() - GetControlArea().GetSize().B();
2137*b1cdbd2cSJim Jagielski 	}
2138*b1cdbd2cSJim Jagielski 	aTopLeft += GetWindowExtentsRelative( pParent ).TopLeft();
2139*b1cdbd2cSJim Jagielski 	return Rectangle(aTopLeft,Size(nWidth,nHeight));
2140*b1cdbd2cSJim Jagielski }
2141*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
calcTableRect(sal_Bool _bOnScreen)2142*b1cdbd2cSJim Jagielski Rectangle BrowseBox::calcTableRect(sal_Bool _bOnScreen)
2143*b1cdbd2cSJim Jagielski {
2144*b1cdbd2cSJim Jagielski 	Window* pParent = NULL;
2145*b1cdbd2cSJim Jagielski 	if ( !_bOnScreen )
2146*b1cdbd2cSJim Jagielski 		pParent = GetAccessibleParentWindow();
2147*b1cdbd2cSJim Jagielski 
2148*b1cdbd2cSJim Jagielski 	Rectangle aRect( GetWindowExtentsRelative( pParent ) );
2149*b1cdbd2cSJim Jagielski 	Rectangle aRowBar = calcHeaderRect(sal_False,pParent == NULL);
2150*b1cdbd2cSJim Jagielski 
2151*b1cdbd2cSJim Jagielski 	long nX = aRowBar.Right() - aRect.Left();
2152*b1cdbd2cSJim Jagielski 	long nY = aRowBar.Top() - aRect.Top();
2153*b1cdbd2cSJim Jagielski 	Size aSize(aRect.GetSize());
2154*b1cdbd2cSJim Jagielski 
2155*b1cdbd2cSJim Jagielski 	return Rectangle(aRowBar.TopRight(), Size(aSize.A() - nX, aSize.B() - nY - aHScroll.GetSizePixel().Height()) );
2156*b1cdbd2cSJim Jagielski }
2157*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetFieldRectPixelAbs(sal_Int32 _nRowId,sal_uInt16 _nColId,sal_Bool,sal_Bool _bOnScreen)2158*b1cdbd2cSJim Jagielski Rectangle BrowseBox::GetFieldRectPixelAbs( sal_Int32 _nRowId,sal_uInt16 _nColId, sal_Bool /*_bIsHeader*/, sal_Bool _bOnScreen )
2159*b1cdbd2cSJim Jagielski {
2160*b1cdbd2cSJim Jagielski 	Window* pParent = NULL;
2161*b1cdbd2cSJim Jagielski 	if ( !_bOnScreen )
2162*b1cdbd2cSJim Jagielski 		pParent = GetAccessibleParentWindow();
2163*b1cdbd2cSJim Jagielski 
2164*b1cdbd2cSJim Jagielski 	Rectangle aRect = GetFieldRectPixel(_nRowId,_nColId,_bOnScreen);
2165*b1cdbd2cSJim Jagielski 
2166*b1cdbd2cSJim Jagielski 	Point aTopLeft = aRect.TopLeft();
2167*b1cdbd2cSJim Jagielski 	aTopLeft += GetWindowExtentsRelative( pParent ).TopLeft();
2168*b1cdbd2cSJim Jagielski 
2169*b1cdbd2cSJim Jagielski 	return Rectangle(aTopLeft,aRect.GetSize());
2170*b1cdbd2cSJim Jagielski }
2171*b1cdbd2cSJim Jagielski 
2172*b1cdbd2cSJim Jagielski // ------------------------------------------------------------------------- EOF
2173*b1cdbd2cSJim Jagielski 
2174