Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include "vcl/event.hxx"
31 : : #include "vcl/decoview.hxx"
32 : : #include "vcl/scrbar.hxx"
33 : : #include "vcl/timer.hxx"
34 : :
35 : : #include "svdata.hxx"
36 : :
37 : : #include "rtl/string.hxx"
38 : : #include "tools/rc.h"
39 : :
40 : : using ::rtl::OUString;
41 : :
42 : :
43 : : /* #i77549#
44 : : HACK: for scrollbars in case of thumb rect, page up and page down rect we
45 : : abuse the HitTestNativeControl interface. All theming engines but aqua
46 : : are actually able to draw the thumb according to our internal representation.
47 : : However aqua draws a little outside. The canonical way would be to enhance the
48 : : HitTestNativeControl passing a ScrollbarValue additionally so all necessary
49 : : information is available in the call.
50 : : .
51 : : However since there is only this one small exception we will deviate a little and
52 : : instead pass the respective rect as control region to allow for a small correction.
53 : :
54 : : So all places using HitTestNativeControl on PART_THUMB_HORZ, PART_THUMB_VERT,
55 : : PART_TRACK_HORZ_LEFT, PART_TRACK_HORZ_RIGHT, PART_TRACK_VERT_UPPER, PART_TRACK_VERT_LOWER
56 : : do not use the control rectangle as region but the actuall part rectangle, making
57 : : only small deviations feasible.
58 : : */
59 : :
60 : : #include "thumbpos.hxx"
61 : :
62 : : // =======================================================================
63 : :
64 : : #define SCRBAR_DRAW_BTN1 ((sal_uInt16)0x0001)
65 : : #define SCRBAR_DRAW_BTN2 ((sal_uInt16)0x0002)
66 : : #define SCRBAR_DRAW_PAGE1 ((sal_uInt16)0x0004)
67 : : #define SCRBAR_DRAW_PAGE2 ((sal_uInt16)0x0008)
68 : : #define SCRBAR_DRAW_THUMB ((sal_uInt16)0x0010)
69 : : #define SCRBAR_DRAW_BACKGROUND ((sal_uInt16)0x0020)
70 : : #define SCRBAR_DRAW_ALL (SCRBAR_DRAW_BTN1 | SCRBAR_DRAW_BTN2 | \
71 : : SCRBAR_DRAW_PAGE1 | SCRBAR_DRAW_PAGE2 |\
72 : : SCRBAR_DRAW_THUMB | SCRBAR_DRAW_BACKGROUND )
73 : :
74 : : #define SCRBAR_STATE_BTN1_DOWN ((sal_uInt16)0x0001)
75 : : #define SCRBAR_STATE_BTN1_DISABLE ((sal_uInt16)0x0002)
76 : : #define SCRBAR_STATE_BTN2_DOWN ((sal_uInt16)0x0004)
77 : : #define SCRBAR_STATE_BTN2_DISABLE ((sal_uInt16)0x0008)
78 : : #define SCRBAR_STATE_PAGE1_DOWN ((sal_uInt16)0x0010)
79 : : #define SCRBAR_STATE_PAGE2_DOWN ((sal_uInt16)0x0020)
80 : : #define SCRBAR_STATE_THUMB_DOWN ((sal_uInt16)0x0040)
81 : :
82 : : #define SCRBAR_VIEW_STYLE (WB_3DLOOK | WB_HORZ | WB_VERT)
83 : :
84 [ + - ]: 25343 : struct ImplScrollBarData
85 : : {
86 : : AutoTimer maTimer; // Timer
87 : : sal_Bool mbHide;
88 : : Rectangle maTrackRect; // TODO: move to ScrollBar class when binary incompatibility of ScrollBar class is no longer problematic
89 : : };
90 : :
91 : : // =======================================================================
92 : :
93 : 12774 : void ScrollBar::ImplInit( Window* pParent, WinBits nStyle )
94 : : {
95 : 12774 : mpData = NULL;
96 : 12774 : mnThumbPixRange = 0;
97 : 12774 : mnThumbPixPos = 0;
98 : 12774 : mnThumbPixSize = 0;
99 : 12774 : mnMinRange = 0;
100 : 12774 : mnMaxRange = 100;
101 : 12774 : mnThumbPos = 0;
102 : 12774 : mnVisibleSize = 0;
103 : 12774 : mnLineSize = 1;
104 : 12774 : mnPageSize = 1;
105 : 12774 : mnDelta = 0;
106 : 12774 : mnDragDraw = 0;
107 : 12774 : mnStateFlags = 0;
108 : 12774 : meScrollType = SCROLL_DONTKNOW;
109 : 12774 : meDDScrollType = SCROLL_DONTKNOW;
110 : 12774 : mbCalcSize = sal_True;
111 : 12774 : mbFullDrag = 0;
112 : :
113 [ + - ]: 12774 : if( !mpData ) // TODO: remove when maTrackRect is no longer in mpData
114 : : {
115 [ + - ]: 12774 : mpData = new ImplScrollBarData;
116 : 12774 : mpData->maTimer.SetTimeoutHdl( LINK( this, ScrollBar, ImplAutoTimerHdl ) );
117 : 12774 : mpData->mbHide = sal_False;
118 : : }
119 : :
120 : 12774 : ImplInitStyle( nStyle );
121 : 12774 : Control::ImplInit( pParent, nStyle, NULL );
122 : :
123 : 12774 : long nScrollSize = GetSettings().GetStyleSettings().GetScrollBarSize();
124 [ + - ]: 12774 : SetSizePixel( Size( nScrollSize, nScrollSize ) );
125 : 12774 : SetBackground();
126 : 12774 : }
127 : :
128 : : // -----------------------------------------------------------------------
129 : :
130 : 12776 : void ScrollBar::ImplInitStyle( WinBits nStyle )
131 : : {
132 [ + + ]: 12776 : if ( nStyle & WB_DRAG )
133 : 9846 : mbFullDrag = sal_True;
134 : : else
135 : 2930 : mbFullDrag = (GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_SCROLL) != 0;
136 : 12776 : }
137 : :
138 : : // -----------------------------------------------------------------------
139 : :
140 : 12774 : ScrollBar::ScrollBar( Window* pParent, WinBits nStyle ) :
141 [ + - ][ + - ]: 12774 : Control( WINDOW_SCROLLBAR )
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
142 : : {
143 [ + - ]: 12774 : ImplInit( pParent, nStyle );
144 : 12774 : }
145 : :
146 : : // -----------------------------------------------------------------------
147 : :
148 : 0 : ScrollBar::ScrollBar( Window* pParent, const ResId& rResId ) :
149 [ # # ][ # # ]: 0 : Control( WINDOW_SCROLLBAR )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
150 : : {
151 : 0 : rResId.SetRT( RSC_SCROLLBAR );
152 [ # # ]: 0 : WinBits nStyle = ImplInitRes( rResId );
153 [ # # ]: 0 : ImplInit( pParent, nStyle );
154 [ # # ]: 0 : ImplLoadRes( rResId );
155 : :
156 [ # # ]: 0 : if ( !(nStyle & WB_HIDE) )
157 [ # # ]: 0 : Show();
158 : 0 : }
159 : :
160 : : // -----------------------------------------------------------------------
161 : :
162 : 12569 : ScrollBar::~ScrollBar()
163 : : {
164 [ + - ]: 12569 : if( mpData )
165 [ + - ][ + - ]: 12569 : delete mpData;
166 [ - + ]: 21049 : }
167 : :
168 : : // -----------------------------------------------------------------------
169 : :
170 : 0 : void ScrollBar::ImplLoadRes( const ResId& rResId )
171 : : {
172 : 0 : Control::ImplLoadRes( rResId );
173 : :
174 : 0 : sal_Int16 nMin = ReadShortRes();
175 : 0 : sal_Int16 nMax = ReadShortRes();
176 : 0 : sal_Int16 nThumbPos = ReadShortRes();
177 : 0 : sal_Int16 nPage = ReadShortRes();
178 : 0 : sal_Int16 nStep = ReadShortRes();
179 : 0 : sal_Int16 nVisibleSize = ReadShortRes();
180 : :
181 [ # # ]: 0 : SetRange( Range( nMin, nMax ) );
182 : 0 : SetLineSize( nStep );
183 : 0 : SetPageSize( nPage );
184 : 0 : SetVisibleSize( nVisibleSize );
185 : 0 : SetThumbPos( nThumbPos );
186 : 0 : }
187 : :
188 : : // -----------------------------------------------------------------------
189 : :
190 : 10689 : void ScrollBar::ImplUpdateRects( sal_Bool bUpdate )
191 : : {
192 : 10689 : sal_uInt16 nOldStateFlags = mnStateFlags;
193 : 10689 : Rectangle aOldPage1Rect = maPage1Rect;
194 : 10689 : Rectangle aOldPage2Rect = maPage2Rect;
195 : 10689 : Rectangle aOldThumbRect = maThumbRect;
196 : :
197 : 10689 : mnStateFlags &= ~SCRBAR_STATE_BTN1_DISABLE;
198 : 10689 : mnStateFlags &= ~SCRBAR_STATE_BTN2_DISABLE;
199 : :
200 : 10689 : Rectangle& maTrackRect = mpData->maTrackRect; // TODO: remove when maTrackRect is no longer in mpData
201 [ + + ]: 10689 : if ( mnThumbPixRange )
202 : : {
203 [ + - ][ + + ]: 7115 : if ( GetStyle() & WB_HORZ )
204 : : {
205 : 2470 : maThumbRect.Left() = maTrackRect.Left()+mnThumbPixPos;
206 : 2470 : maThumbRect.Right() = maThumbRect.Left()+mnThumbPixSize-1;
207 [ + + ]: 2470 : if ( !mnThumbPixPos )
208 : 1750 : maPage1Rect.Right() = RECT_EMPTY;
209 : : else
210 : 720 : maPage1Rect.Right() = maThumbRect.Left()-1;
211 [ + + ]: 2470 : if ( mnThumbPixPos >= (mnThumbPixRange-mnThumbPixSize) )
212 : 201 : maPage2Rect.Right() = RECT_EMPTY;
213 : : else
214 : : {
215 : 2269 : maPage2Rect.Left() = maThumbRect.Right()+1;
216 : 2269 : maPage2Rect.Right() = maTrackRect.Right();
217 : : }
218 : : }
219 : : else
220 : : {
221 : 4645 : maThumbRect.Top() = maTrackRect.Top()+mnThumbPixPos;
222 : 4645 : maThumbRect.Bottom() = maThumbRect.Top()+mnThumbPixSize-1;
223 [ + + ]: 4645 : if ( !mnThumbPixPos )
224 : 3505 : maPage1Rect.Bottom() = RECT_EMPTY;
225 : : else
226 : 1140 : maPage1Rect.Bottom() = maThumbRect.Top()-1;
227 [ + + ]: 4645 : if ( mnThumbPixPos >= (mnThumbPixRange-mnThumbPixSize) )
228 : 219 : maPage2Rect.Bottom() = RECT_EMPTY;
229 : : else
230 : : {
231 : 4426 : maPage2Rect.Top() = maThumbRect.Bottom()+1;
232 : 4426 : maPage2Rect.Bottom() = maTrackRect.Bottom();
233 : : }
234 : : }
235 : : }
236 : : else
237 : : {
238 [ + - ][ + + ]: 3574 : if ( GetStyle() & WB_HORZ )
239 : : {
240 : 1903 : const long nSpace = maTrackRect.Right() - maTrackRect.Left();
241 [ - + ]: 1903 : if ( nSpace > 0 )
242 : : {
243 : 0 : maPage1Rect.Left() = maTrackRect.Left();
244 : 0 : maPage1Rect.Right() = maTrackRect.Left() + (nSpace/2);
245 : 0 : maPage2Rect.Left() = maPage1Rect.Right() + 1;
246 : 0 : maPage2Rect.Right() = maTrackRect.Right();
247 : : }
248 : : }
249 : : else
250 : : {
251 : 1671 : const long nSpace = maTrackRect.Bottom() - maTrackRect.Top();
252 [ - + ]: 1671 : if ( nSpace > 0 )
253 : : {
254 : 0 : maPage1Rect.Top() = maTrackRect.Top();
255 : 0 : maPage1Rect.Bottom() = maTrackRect.Top() + (nSpace/2);
256 : 0 : maPage2Rect.Top() = maPage1Rect.Bottom() + 1;
257 : 0 : maPage2Rect.Bottom() = maTrackRect.Bottom();
258 : : }
259 : : }
260 : : }
261 : :
262 [ + - ][ + - ]: 10689 : if( !IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL) )
263 : : {
264 : : // disable scrollbar buttons only in VCL's own 'theme'
265 : : // as it is uncommon on other platforms
266 [ + + ]: 10689 : if ( mnThumbPos == mnMinRange )
267 : 8814 : mnStateFlags |= SCRBAR_STATE_BTN1_DISABLE;
268 [ + + ]: 10689 : if ( mnThumbPos >= (mnMaxRange-mnVisibleSize) )
269 : 580 : mnStateFlags |= SCRBAR_STATE_BTN2_DISABLE;
270 : : }
271 : :
272 [ + + ]: 10689 : if ( bUpdate )
273 : : {
274 : 132 : sal_uInt16 nDraw = 0;
275 [ + + ]: 132 : if ( (nOldStateFlags & SCRBAR_STATE_BTN1_DISABLE) !=
276 : : (mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
277 : 22 : nDraw |= SCRBAR_DRAW_BTN1;
278 [ + + ]: 132 : if ( (nOldStateFlags & SCRBAR_STATE_BTN2_DISABLE) !=
279 : : (mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
280 : 12 : nDraw |= SCRBAR_DRAW_BTN2;
281 [ + - ][ + + ]: 132 : if ( aOldPage1Rect != maPage1Rect )
282 : 107 : nDraw |= SCRBAR_DRAW_PAGE1;
283 [ + - ][ + + ]: 132 : if ( aOldPage2Rect != maPage2Rect )
284 : 118 : nDraw |= SCRBAR_DRAW_PAGE2;
285 [ + - ][ + + ]: 132 : if ( aOldThumbRect != maThumbRect )
286 : 118 : nDraw |= SCRBAR_DRAW_THUMB;
287 [ + - ]: 132 : ImplDraw( nDraw, this );
288 : : }
289 : 10689 : }
290 : :
291 : : // -----------------------------------------------------------------------
292 : :
293 : 0 : long ScrollBar::ImplCalcThumbPos( long nPixPos )
294 : : {
295 : : // Position berechnen
296 : : long nCalcThumbPos;
297 : : nCalcThumbPos = ImplMulDiv( nPixPos, mnMaxRange-mnVisibleSize-mnMinRange,
298 : 0 : mnThumbPixRange-mnThumbPixSize );
299 : 0 : nCalcThumbPos += mnMinRange;
300 : 0 : return nCalcThumbPos;
301 : : }
302 : :
303 : : // -----------------------------------------------------------------------
304 : :
305 : 6719 : long ScrollBar::ImplCalcThumbPosPix( long nPos )
306 : : {
307 : : long nCalcThumbPos;
308 : :
309 : : // Position berechnen
310 : : nCalcThumbPos = ImplMulDiv( nPos-mnMinRange, mnThumbPixRange-mnThumbPixSize,
311 : 6719 : mnMaxRange-mnVisibleSize-mnMinRange );
312 : :
313 : : // Am Anfang und Ende des ScrollBars versuchen wir die Anzeige korrekt
314 : : // anzuzeigen
315 [ - + ][ + + ]: 6719 : if ( !nCalcThumbPos && (mnThumbPos > mnMinRange) )
316 : 0 : nCalcThumbPos = 1;
317 [ + + ][ + + ]: 6719 : if ( nCalcThumbPos &&
[ - + ]
318 : : ((nCalcThumbPos+mnThumbPixSize) >= mnThumbPixRange) &&
319 : : (mnThumbPos < (mnMaxRange-mnVisibleSize)) )
320 : 0 : nCalcThumbPos--;
321 : :
322 : 6719 : return nCalcThumbPos;
323 : : }
324 : :
325 : : // -----------------------------------------------------------------------
326 : :
327 : 10689 : void ScrollBar::ImplCalc( sal_Bool bUpdate )
328 : : {
329 : 10689 : const Size aSize = GetOutputSizePixel();
330 : 10689 : const long nMinThumbSize = GetSettings().GetStyleSettings().GetMinThumbSize();
331 : :
332 : 10689 : Rectangle& maTrackRect = mpData->maTrackRect; // TODO: remove when maTrackRect is no longer in mpData
333 [ + + ]: 10689 : if ( mbCalcSize )
334 : : {
335 [ + - ]: 7692 : const Rectangle aControlRegion( Point(0,0), aSize );
336 [ + - ][ + - ]: 7692 : Rectangle aBtn1Region, aBtn2Region, aTrackRegion, aBoundingRegion;
[ + - ][ + - ]
337 : :
338 [ + - ][ + + ]: 7692 : if ( GetStyle() & WB_HORZ )
339 : : {
340 [ - + ][ # # ]: 6890 : if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_LEFT,
[ - + ]
341 [ + - ][ + - ]: 6890 : aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn1Region ) &&
[ + - ][ + - ]
[ # # # # ]
342 : : GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_RIGHT,
343 [ # # ][ - + ]: 3445 : aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn2Region ) )
[ # # ][ - + ]
[ # # # # ]
344 : : {
345 : 0 : maBtn1Rect = aBtn1Region;
346 : 0 : maBtn2Rect = aBtn2Region;
347 : : }
348 : : else
349 : : {
350 : 3445 : Size aBtnSize( aSize.Height(), aSize.Height() );
351 : 3445 : maBtn2Rect.Top() = maBtn1Rect.Top();
352 : 3445 : maBtn2Rect.Left() = aSize.Width()-aSize.Height();
353 [ + - ]: 3445 : maBtn1Rect.SetSize( aBtnSize );
354 [ + - ]: 3445 : maBtn2Rect.SetSize( aBtnSize );
355 : : }
356 : :
357 [ - + ]: 3445 : if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_TRACK_HORZ_AREA,
358 [ + - ][ + - ]: 3445 : aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aTrackRegion ) )
359 : 0 : maTrackRect = aTrackRegion;
360 : : else
361 [ + - ][ + - ]: 3445 : maTrackRect = Rectangle( maBtn1Rect.TopRight(), maBtn2Rect.BottomLeft() );
[ + - ]
362 : :
363 : : // Check if available space is big enough for thumb ( min thumb size = ScrBar width/height )
364 : 3445 : mnThumbPixRange = maTrackRect.Right() - maTrackRect.Left();
365 [ + + ]: 3445 : if( mnThumbPixRange > 0 )
366 : : {
367 : 1696 : maPage1Rect.Left() = maTrackRect.Left();
368 : 1696 : maPage1Rect.Bottom() =
369 : 1696 : maPage2Rect.Bottom() =
370 : 1696 : maThumbRect.Bottom() = maTrackRect.Bottom();
371 : : }
372 : : else
373 : : {
374 : 1749 : mnThumbPixRange = 0;
375 : 1749 : maPage1Rect.SetEmpty();
376 : 1749 : maPage2Rect.SetEmpty();
377 : : }
378 : : }
379 : : else
380 : : {
381 [ - + ][ # # ]: 8494 : if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_UP,
[ - + ]
382 [ + - ][ + - ]: 8494 : aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn1Region ) &&
[ + - ][ + - ]
[ # # # # ]
383 : : GetNativeControlRegion( CTRL_SCROLLBAR, PART_BUTTON_DOWN,
384 [ # # ][ - + ]: 4247 : aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aBtn2Region ) )
[ # # ][ - + ]
[ # # # # ]
385 : : {
386 : 0 : maBtn1Rect = aBtn1Region;
387 : 0 : maBtn2Rect = aBtn2Region;
388 : : }
389 : : else
390 : : {
391 : 4247 : const Size aBtnSize( aSize.Width(), aSize.Width() );
392 : 4247 : maBtn2Rect.Left() = maBtn1Rect.Left();
393 : 4247 : maBtn2Rect.Top() = aSize.Height()-aSize.Width();
394 [ + - ]: 4247 : maBtn1Rect.SetSize( aBtnSize );
395 [ + - ]: 4247 : maBtn2Rect.SetSize( aBtnSize );
396 : : }
397 : :
398 [ - + ]: 4247 : if ( GetNativeControlRegion( CTRL_SCROLLBAR, PART_TRACK_VERT_AREA,
399 [ + - ][ + - ]: 4247 : aControlRegion, 0, ImplControlValue(), rtl::OUString(), aBoundingRegion, aTrackRegion ) )
400 : 0 : maTrackRect = aTrackRegion;
401 : : else
402 [ + - ][ + - ]: 4247 : maTrackRect = Rectangle( maBtn1Rect.BottomLeft()+Point(0,1), maBtn2Rect.TopRight() );
[ + - ]
403 : :
404 : : // Check if available space is big enough for thumb
405 : 4247 : mnThumbPixRange = maTrackRect.Bottom() - maTrackRect.Top();
406 [ + + ]: 4247 : if( mnThumbPixRange > 0 )
407 : : {
408 : 2586 : maPage1Rect.Top() = maTrackRect.Top();
409 : 2586 : maPage1Rect.Right() =
410 : 2586 : maPage2Rect.Right() =
411 : 2586 : maThumbRect.Right() = maTrackRect.Right();
412 : : }
413 : : else
414 : : {
415 : 1661 : mnThumbPixRange = 0;
416 : 1661 : maPage1Rect.SetEmpty();
417 : 1661 : maPage2Rect.SetEmpty();
418 : : }
419 : : }
420 : :
421 [ + + ]: 7692 : if ( !mnThumbPixRange )
422 : 3410 : maThumbRect.SetEmpty();
423 : :
424 : 7692 : mbCalcSize = sal_False;
425 : : }
426 : :
427 [ + + ]: 10689 : if ( mnThumbPixRange )
428 : : {
429 : : // Werte berechnen
430 [ + + ][ + + ]: 7115 : if ( (mnVisibleSize >= (mnMaxRange-mnMinRange)) ||
431 : : ((mnMaxRange-mnMinRange) <= 0) )
432 : : {
433 : 396 : mnThumbPos = mnMinRange;
434 : 396 : mnThumbPixPos = 0;
435 : 396 : mnThumbPixSize = mnThumbPixRange;
436 : : }
437 : : else
438 : : {
439 [ + + ]: 6719 : if ( mnVisibleSize )
440 : 6549 : mnThumbPixSize = ImplMulDiv( mnThumbPixRange, mnVisibleSize, mnMaxRange-mnMinRange );
441 : : else
442 : : {
443 [ + - ][ + + ]: 170 : if ( GetStyle() & WB_HORZ )
444 [ + - ]: 40 : mnThumbPixSize = maThumbRect.GetWidth();
445 : : else
446 [ + - ]: 130 : mnThumbPixSize = maThumbRect.GetHeight();
447 : : }
448 [ + + ]: 6719 : if ( mnThumbPixSize < nMinThumbSize )
449 : 76 : mnThumbPixSize = nMinThumbSize;
450 [ + + ]: 6719 : if ( mnThumbPixSize > mnThumbPixRange )
451 : 6 : mnThumbPixSize = mnThumbPixRange;
452 : 7115 : mnThumbPixPos = ImplCalcThumbPosPix( mnThumbPos );
453 : : }
454 : : }
455 : :
456 : : // Wenn neu ausgegeben werden soll und wir schon ueber eine
457 : : // Aktion einen Paint-Event ausgeloest bekommen haben, dann
458 : : // geben wir nicht direkt aus, sondern invalidieren nur alles
459 [ + + ][ + - ]: 10689 : if ( bUpdate && HasPaintEvent() )
[ + + ][ + + ]
460 : : {
461 [ + - ]: 2875 : Invalidate();
462 : 2875 : bUpdate = sal_False;
463 : : }
464 [ + - ]: 10689 : ImplUpdateRects( bUpdate );
465 : 10689 : }
466 : :
467 : : // -----------------------------------------------------------------------
468 : :
469 : 0 : void ScrollBar::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
470 : : {
471 [ # # ]: 0 : Point aPos = pDev->LogicToPixel( rPos );
472 [ # # ]: 0 : Size aSize = pDev->LogicToPixel( rSize );
473 [ # # ]: 0 : Rectangle aRect( aPos, aSize );
474 : :
475 [ # # ]: 0 : pDev->Push();
476 [ # # ]: 0 : pDev->SetMapMode();
477 [ # # ]: 0 : if ( !(nFlags & WINDOW_DRAW_MONO) )
478 : : {
479 : : // DecoView uses the FaceColor...
480 [ # # ]: 0 : AllSettings aSettings = pDev->GetSettings();
481 [ # # ]: 0 : StyleSettings aStyleSettings = aSettings.GetStyleSettings();
482 [ # # ][ # # ]: 0 : if ( IsControlBackground() )
483 [ # # ][ # # ]: 0 : aStyleSettings.SetFaceColor( GetControlBackground() );
484 : : else
485 [ # # ]: 0 : aStyleSettings.SetFaceColor( GetSettings().GetStyleSettings().GetFaceColor() );
486 : :
487 [ # # ]: 0 : aSettings.SetStyleSettings( aStyleSettings );
488 [ # # ][ # # ]: 0 : pDev->SetSettings( aSettings );
[ # # ]
489 : : }
490 : :
491 : : // for printing:
492 : : // -calculate the size of the rects
493 : : // -because this is zero-based add the correct offset
494 : : // -print
495 : : // -force recalculate
496 : :
497 [ # # ]: 0 : if ( mbCalcSize )
498 [ # # ]: 0 : ImplCalc( sal_False );
499 : :
500 [ # # ]: 0 : maBtn1Rect+=aPos;
501 [ # # ]: 0 : maBtn2Rect+=aPos;
502 [ # # ]: 0 : maThumbRect+=aPos;
503 [ # # ]: 0 : mpData->maTrackRect+=aPos; // TODO: update when maTrackRect is no longer in mpData
504 [ # # ]: 0 : maPage1Rect+=aPos;
505 [ # # ]: 0 : maPage2Rect+=aPos;
506 : :
507 [ # # ]: 0 : ImplDraw( SCRBAR_DRAW_ALL, pDev );
508 [ # # ]: 0 : pDev->Pop();
509 : :
510 : 0 : mbCalcSize = sal_True;
511 : 0 : }
512 : :
513 : : // -----------------------------------------------------------------------
514 : :
515 : 24917 : sal_Bool ScrollBar::ImplDrawNative( sal_uInt16 nDrawFlags )
516 : : {
517 [ + - ]: 24917 : ScrollbarValue scrValue;
518 : :
519 [ + - ]: 24917 : sal_Bool bNativeOK = IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL);
520 [ - + ]: 24917 : if( bNativeOK )
521 : : {
522 [ # # ]: 0 : sal_Bool bHorz = (GetStyle() & WB_HORZ ? true : false);
523 : :
524 : : // Draw the entire background if the control supports it
525 [ # # ][ # # ]: 0 : if( IsNativeControlSupported(CTRL_SCROLLBAR, bHorz ? PART_DRAW_BACKGROUND_HORZ : PART_DRAW_BACKGROUND_VERT) )
[ # # ]
526 : : {
527 [ # # ][ # # ]: 0 : ControlState nState = ( IsEnabled() ? CTRL_STATE_ENABLED : 0 ) | ( HasFocus() ? CTRL_STATE_FOCUSED : 0 );
[ # # ][ # # ]
528 : :
529 : 0 : scrValue.mnMin = mnMinRange;
530 : 0 : scrValue.mnMax = mnMaxRange;
531 : 0 : scrValue.mnCur = mnThumbPos;
532 : 0 : scrValue.mnVisibleSize = mnVisibleSize;
533 : 0 : scrValue.maThumbRect = maThumbRect;
534 : 0 : scrValue.maButton1Rect = maBtn1Rect;
535 : 0 : scrValue.maButton2Rect = maBtn2Rect;
536 : : scrValue.mnButton1State = ((mnStateFlags & SCRBAR_STATE_BTN1_DOWN) ? CTRL_STATE_PRESSED : 0) |
537 [ # # ][ # # ]: 0 : ((!(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE)) ? CTRL_STATE_ENABLED : 0);
538 : : scrValue.mnButton2State = ((mnStateFlags & SCRBAR_STATE_BTN2_DOWN) ? CTRL_STATE_PRESSED : 0) |
539 [ # # ]: 0 : ((!(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE)) ? CTRL_STATE_ENABLED : 0);
540 [ # # ]: 0 : scrValue.mnThumbState = nState | ((mnStateFlags & SCRBAR_STATE_THUMB_DOWN) ? CTRL_STATE_PRESSED : 0);
541 [ # # ]: 0 : scrValue.mnPage1State = nState | ((mnStateFlags & SCRBAR_STATE_PAGE1_DOWN) ? CTRL_STATE_PRESSED : 0);
542 [ # # ]: 0 : scrValue.mnPage2State = nState | ((mnStateFlags & SCRBAR_STATE_PAGE2_DOWN) ? CTRL_STATE_PRESSED : 0);
543 : :
544 [ # # ][ # # ]: 0 : if( IsMouseOver() )
545 : : {
546 [ # # ][ # # ]: 0 : Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
547 [ # # ]: 0 : if( pRect )
548 : : {
549 [ # # ]: 0 : if( pRect == &maThumbRect )
550 : 0 : scrValue.mnThumbState |= CTRL_STATE_ROLLOVER;
551 [ # # ]: 0 : else if( pRect == &maBtn1Rect )
552 : 0 : scrValue.mnButton1State |= CTRL_STATE_ROLLOVER;
553 [ # # ]: 0 : else if( pRect == &maBtn2Rect )
554 : 0 : scrValue.mnButton2State |= CTRL_STATE_ROLLOVER;
555 [ # # ]: 0 : else if( pRect == &maPage1Rect )
556 : 0 : scrValue.mnPage1State |= CTRL_STATE_ROLLOVER;
557 [ # # ]: 0 : else if( pRect == &maPage2Rect )
558 : 0 : scrValue.mnPage2State |= CTRL_STATE_ROLLOVER;
559 : : }
560 : : }
561 : :
562 [ # # ]: 0 : Rectangle aCtrlRegion;
563 [ # # ]: 0 : aCtrlRegion.Union( maBtn1Rect );
564 [ # # ]: 0 : aCtrlRegion.Union( maBtn2Rect );
565 [ # # ]: 0 : aCtrlRegion.Union( maPage1Rect );
566 [ # # ]: 0 : aCtrlRegion.Union( maPage2Rect );
567 [ # # ]: 0 : aCtrlRegion.Union( maThumbRect );
568 : : bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, (bHorz ? PART_DRAW_BACKGROUND_HORZ : PART_DRAW_BACKGROUND_VERT),
569 [ # # ][ # # ]: 0 : aCtrlRegion, nState, scrValue, rtl::OUString() );
570 : : }
571 : : else
572 : : {
573 [ # # ][ # # ]: 0 : if ( (nDrawFlags & SCRBAR_DRAW_PAGE1) || (nDrawFlags & SCRBAR_DRAW_PAGE2) )
574 : : {
575 [ # # ]: 0 : sal_uInt32 part1 = bHorz ? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER;
576 [ # # ]: 0 : sal_uInt32 part2 = bHorz ? PART_TRACK_HORZ_RIGHT : PART_TRACK_VERT_LOWER;
577 : 0 : Rectangle aCtrlRegion1( maPage1Rect );
578 : 0 : Rectangle aCtrlRegion2( maPage2Rect );
579 [ # # ][ # # ]: 0 : ControlState nState1 = (IsEnabled() ? CTRL_STATE_ENABLED : 0) | (HasFocus() ? CTRL_STATE_FOCUSED : 0);
[ # # ][ # # ]
580 : 0 : ControlState nState2 = nState1;
581 : :
582 [ # # ]: 0 : nState1 |= ((mnStateFlags & SCRBAR_STATE_PAGE1_DOWN) ? CTRL_STATE_PRESSED : 0);
583 [ # # ]: 0 : nState2 |= ((mnStateFlags & SCRBAR_STATE_PAGE2_DOWN) ? CTRL_STATE_PRESSED : 0);
584 : :
585 [ # # ][ # # ]: 0 : if( IsMouseOver() )
586 : : {
587 [ # # ][ # # ]: 0 : Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
588 [ # # ]: 0 : if( pRect )
589 : : {
590 [ # # ]: 0 : if( pRect == &maPage1Rect )
591 : 0 : nState1 |= CTRL_STATE_ROLLOVER;
592 [ # # ]: 0 : else if( pRect == &maPage2Rect )
593 : 0 : nState2 |= CTRL_STATE_ROLLOVER;
594 : : }
595 : : }
596 : :
597 [ # # ]: 0 : if ( nDrawFlags & SCRBAR_DRAW_PAGE1 )
598 : : bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part1, aCtrlRegion1, nState1,
599 [ # # ]: 0 : scrValue, rtl::OUString() );
600 : :
601 [ # # ]: 0 : if ( nDrawFlags & SCRBAR_DRAW_PAGE2 )
602 : : bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part2, aCtrlRegion2, nState2,
603 [ # # ]: 0 : scrValue, rtl::OUString() );
604 : : }
605 [ # # ][ # # ]: 0 : if ( (nDrawFlags & SCRBAR_DRAW_BTN1) || (nDrawFlags & SCRBAR_DRAW_BTN2) )
606 : : {
607 [ # # ]: 0 : sal_uInt32 part1 = bHorz ? PART_BUTTON_LEFT : PART_BUTTON_UP;
608 [ # # ]: 0 : sal_uInt32 part2 = bHorz ? PART_BUTTON_RIGHT : PART_BUTTON_DOWN;
609 : 0 : Rectangle aCtrlRegion1( maBtn1Rect );
610 : 0 : Rectangle aCtrlRegion2( maBtn2Rect );
611 [ # # ][ # # ]: 0 : ControlState nState1 = HasFocus() ? CTRL_STATE_FOCUSED : 0;
612 : 0 : ControlState nState2 = nState1;
613 : :
614 [ # # ][ # # ]: 0 : if ( !Window::IsEnabled() || !IsEnabled() )
[ # # ][ # # ]
[ # # ]
615 : 0 : nState1 = (nState2 &= ~CTRL_STATE_ENABLED);
616 : : else
617 : 0 : nState1 = (nState2 |= CTRL_STATE_ENABLED);
618 : :
619 [ # # ]: 0 : nState1 |= ((mnStateFlags & SCRBAR_STATE_BTN1_DOWN) ? CTRL_STATE_PRESSED : 0);
620 : 0 : nState2 |= ((mnStateFlags & SCRBAR_STATE_BTN2_DOWN) ? CTRL_STATE_PRESSED : 0);
621 : :
622 [ # # ]: 0 : if(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE)
623 : 0 : nState1 &= ~CTRL_STATE_ENABLED;
624 [ # # ]: 0 : if(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE)
625 : 0 : nState2 &= ~CTRL_STATE_ENABLED;
626 : :
627 [ # # ][ # # ]: 0 : if( IsMouseOver() )
628 : : {
629 [ # # ][ # # ]: 0 : Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
630 [ # # ]: 0 : if( pRect )
631 : : {
632 [ # # ]: 0 : if( pRect == &maBtn1Rect )
633 : 0 : nState1 |= CTRL_STATE_ROLLOVER;
634 [ # # ]: 0 : else if( pRect == &maBtn2Rect )
635 : 0 : nState2 |= CTRL_STATE_ROLLOVER;
636 : : }
637 : : }
638 : :
639 [ # # ]: 0 : if ( nDrawFlags & SCRBAR_DRAW_BTN1 )
640 : : bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part1, aCtrlRegion1, nState1,
641 [ # # ]: 0 : scrValue, rtl::OUString() );
642 : :
643 [ # # ]: 0 : if ( nDrawFlags & SCRBAR_DRAW_BTN2 )
644 : : bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, part2, aCtrlRegion2, nState2,
645 [ # # ]: 0 : scrValue, rtl::OUString() );
646 : : }
647 [ # # ][ # # ]: 0 : if ( (nDrawFlags & SCRBAR_DRAW_THUMB) && !maThumbRect.IsEmpty() )
[ # # ][ # # ]
648 : : {
649 [ # # ][ # # ]: 0 : ControlState nState = IsEnabled() ? CTRL_STATE_ENABLED : 0;
650 : 0 : Rectangle aCtrlRegion( maThumbRect );
651 : :
652 [ # # ]: 0 : if ( mnStateFlags & SCRBAR_STATE_THUMB_DOWN )
653 : 0 : nState |= CTRL_STATE_PRESSED;
654 : :
655 [ # # ][ # # ]: 0 : if ( HasFocus() )
656 : 0 : nState |= CTRL_STATE_FOCUSED;
657 : :
658 [ # # ][ # # ]: 0 : if( IsMouseOver() )
659 : : {
660 [ # # ][ # # ]: 0 : Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
661 [ # # ]: 0 : if( pRect )
662 : : {
663 [ # # ]: 0 : if( pRect == &maThumbRect )
664 : 0 : nState |= CTRL_STATE_ROLLOVER;
665 : : }
666 : : }
667 : :
668 : : bNativeOK = DrawNativeControl( CTRL_SCROLLBAR, (bHorz ? PART_THUMB_HORZ : PART_THUMB_VERT),
669 [ # # ][ # # ]: 0 : aCtrlRegion, nState, scrValue, rtl::OUString() );
670 : : }
671 : : }
672 : : }
673 [ + - ]: 24917 : return bNativeOK;
674 : : }
675 : :
676 : 5040 : void ScrollBar::ImplDraw( sal_uInt16 nDrawFlags, OutputDevice* pOutDev )
677 : : {
678 : 5040 : DecorationView aDecoView( pOutDev );
679 [ + - ]: 5040 : Rectangle aTempRect;
680 : : sal_uInt16 nStyle;
681 : 5040 : const StyleSettings& rStyleSettings = pOutDev->GetSettings().GetStyleSettings();
682 : : SymbolType eSymbolType;
683 [ + - ]: 5040 : sal_Bool bEnabled = IsEnabled();
684 : :
685 : : // Evt. noch offene Berechnungen nachholen
686 [ + + ]: 5040 : if ( mbCalcSize )
687 [ + - ]: 1887 : ImplCalc( sal_False );
688 : :
689 : 5040 : Window *pWin = NULL;
690 [ + - ]: 5040 : if( pOutDev->GetOutDevType() == OUTDEV_WINDOW )
691 : 5040 : pWin = (Window*) pOutDev;
692 : :
693 : : // Draw the entire control if the native theme engine needs it
694 [ + + ][ + - ]: 5040 : if ( nDrawFlags && pWin && pWin->IsNativeControlSupported(CTRL_SCROLLBAR, PART_DRAW_BACKGROUND_HORZ) )
[ + - ][ - + ]
[ - + ]
695 : : {
696 [ # # ]: 0 : ImplDrawNative( SCRBAR_DRAW_BACKGROUND );
697 : 5040 : return;
698 : : }
699 : :
700 [ + + ][ + - ]: 5040 : if( (nDrawFlags & SCRBAR_DRAW_BTN1) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_BTN1 ) ) )
[ + - ][ + - ]
[ + + ]
701 : : {
702 : 4930 : nStyle = BUTTON_DRAW_NOLIGHTBORDER;
703 [ - + ]: 4930 : if ( mnStateFlags & SCRBAR_STATE_BTN1_DOWN )
704 : 0 : nStyle |= BUTTON_DRAW_PRESSED;
705 [ + - ]: 4930 : aTempRect = aDecoView.DrawButton( maBtn1Rect, nStyle );
706 [ + - ]: 4930 : ImplCalcSymbolRect( aTempRect );
707 : 4930 : nStyle = 0;
708 [ + + ][ - + ]: 4930 : if ( (mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) || !bEnabled )
709 : 4116 : nStyle |= SYMBOL_DRAW_DISABLE;
710 [ - + ]: 4930 : if ( rStyleSettings.GetOptions() & STYLE_OPTION_SCROLLARROW )
711 : : {
712 [ # # ][ # # ]: 0 : if ( GetStyle() & WB_HORZ )
713 : 0 : eSymbolType = SYMBOL_ARROW_LEFT;
714 : : else
715 : 0 : eSymbolType = SYMBOL_ARROW_UP;
716 : : }
717 : : else
718 : : {
719 [ + - ][ + + ]: 4930 : if ( GetStyle() & WB_HORZ )
720 : 2227 : eSymbolType = SYMBOL_SPIN_LEFT;
721 : : else
722 : 2703 : eSymbolType = SYMBOL_SPIN_UP;
723 : : }
724 [ + - ]: 4930 : aDecoView.DrawSymbol( aTempRect, eSymbolType, rStyleSettings.GetButtonTextColor(), nStyle );
725 : : }
726 : :
727 [ + + ][ + - ]: 5040 : if ( (nDrawFlags & SCRBAR_DRAW_BTN2) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_BTN2 ) ) )
[ + - ][ + - ]
[ + + ]
728 : : {
729 : 4920 : nStyle = BUTTON_DRAW_NOLIGHTBORDER;
730 [ - + ]: 4920 : if ( mnStateFlags & SCRBAR_STATE_BTN2_DOWN )
731 : 0 : nStyle |= BUTTON_DRAW_PRESSED;
732 [ + - ]: 4920 : aTempRect = aDecoView.DrawButton( maBtn2Rect, nStyle );
733 [ + - ]: 4920 : ImplCalcSymbolRect( aTempRect );
734 : 4920 : nStyle = 0;
735 [ + + ][ + + ]: 4920 : if ( (mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) || !bEnabled )
736 : 231 : nStyle |= SYMBOL_DRAW_DISABLE;
737 [ - + ]: 4920 : if ( rStyleSettings.GetOptions() & STYLE_OPTION_SCROLLARROW )
738 : : {
739 [ # # ][ # # ]: 0 : if ( GetStyle() & WB_HORZ )
740 : 0 : eSymbolType = SYMBOL_ARROW_RIGHT;
741 : : else
742 : 0 : eSymbolType = SYMBOL_ARROW_DOWN;
743 : : }
744 : : else
745 : : {
746 [ + - ][ + + ]: 4920 : if ( GetStyle() & WB_HORZ )
747 : 2236 : eSymbolType = SYMBOL_SPIN_RIGHT;
748 : : else
749 : 2684 : eSymbolType = SYMBOL_SPIN_DOWN;
750 : : }
751 [ + - ]: 4920 : aDecoView.DrawSymbol( aTempRect, eSymbolType, rStyleSettings.GetButtonTextColor(), nStyle );
752 : : }
753 : :
754 [ + - ]: 5040 : pOutDev->SetLineColor();
755 : :
756 [ + + ][ + - ]: 5040 : if ( (nDrawFlags & SCRBAR_DRAW_THUMB) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_THUMB ) ) )
[ + - ][ + - ]
[ + + ]
757 : : {
758 [ + - ][ + + ]: 5026 : if ( !maThumbRect.IsEmpty() )
759 : : {
760 [ + + ]: 4993 : if ( bEnabled )
761 : : {
762 : 4916 : nStyle = BUTTON_DRAW_NOLIGHTBORDER;
763 [ + - ]: 4916 : aTempRect = aDecoView.DrawButton( maThumbRect, nStyle );
764 : : }
765 : : else
766 : : {
767 [ + - ]: 77 : pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
768 [ + - ]: 77 : pOutDev->DrawRect( maThumbRect );
769 : : }
770 : : }
771 : : }
772 : :
773 [ + + ][ + - ]: 5040 : if ( (nDrawFlags & SCRBAR_DRAW_PAGE1) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_PAGE1 ) ) )
[ + - ][ + - ]
[ + + ]
774 : : {
775 [ - + ]: 5015 : if ( mnStateFlags & SCRBAR_STATE_PAGE1_DOWN )
776 [ # # ]: 0 : pOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
777 : : else
778 [ + - ]: 5015 : pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
779 [ + - ]: 5015 : pOutDev->DrawRect( maPage1Rect );
780 : : }
781 [ + + ][ + - ]: 5040 : if ( (nDrawFlags & SCRBAR_DRAW_PAGE2) && (!pWin || !ImplDrawNative( SCRBAR_DRAW_PAGE2 ) ) )
[ + - ][ + - ]
[ + + ]
782 : : {
783 [ - + ]: 5026 : if ( mnStateFlags & SCRBAR_STATE_PAGE2_DOWN )
784 [ # # ]: 0 : pOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
785 : : else
786 [ + - ]: 5026 : pOutDev->SetFillColor( rStyleSettings.GetCheckedColor() );
787 [ + - ]: 5040 : pOutDev->DrawRect( maPage2Rect );
788 : : }
789 : : }
790 : :
791 : : // -----------------------------------------------------------------------
792 : :
793 : 4 : long ScrollBar::ImplScroll( long nNewPos, sal_Bool bCallEndScroll )
794 : : {
795 : 4 : long nOldPos = mnThumbPos;
796 : 4 : SetThumbPos( nNewPos );
797 : 4 : long nDelta = mnThumbPos-nOldPos;
798 [ + - ]: 4 : if ( nDelta )
799 : : {
800 : 4 : mnDelta = nDelta;
801 : 4 : Scroll();
802 [ + - ]: 4 : if ( bCallEndScroll )
803 : 4 : EndScroll();
804 : 4 : mnDelta = 0;
805 : : }
806 : 4 : return nDelta;
807 : : }
808 : :
809 : : // -----------------------------------------------------------------------
810 : :
811 : 4 : long ScrollBar::ImplDoAction( sal_Bool bCallEndScroll )
812 : : {
813 : 4 : long nDelta = 0;
814 : :
815 [ - + - - : 4 : switch ( meScrollType )
- ]
816 : : {
817 : : case SCROLL_LINEUP:
818 : 0 : nDelta = ImplScroll( mnThumbPos-mnLineSize, bCallEndScroll );
819 : 0 : break;
820 : :
821 : : case SCROLL_LINEDOWN:
822 : 4 : nDelta = ImplScroll( mnThumbPos+mnLineSize, bCallEndScroll );
823 : 4 : break;
824 : :
825 : : case SCROLL_PAGEUP:
826 : 0 : nDelta = ImplScroll( mnThumbPos-mnPageSize, bCallEndScroll );
827 : 0 : break;
828 : :
829 : : case SCROLL_PAGEDOWN:
830 : 0 : nDelta = ImplScroll( mnThumbPos+mnPageSize, bCallEndScroll );
831 : 0 : break;
832 : : default:
833 : : ;
834 : : }
835 : :
836 : 4 : return nDelta;
837 : : }
838 : :
839 : : // -----------------------------------------------------------------------
840 : :
841 : 0 : void ScrollBar::ImplDoMouseAction( const Point& rMousePos, sal_Bool bCallAction )
842 : : {
843 : 0 : sal_uInt16 nOldStateFlags = mnStateFlags;
844 : 0 : sal_Bool bAction = sal_False;
845 [ # # ][ # # ]: 0 : sal_Bool bHorizontal = ( GetStyle() & WB_HORZ )? sal_True: sal_False;
846 : 0 : sal_Bool bIsInside = sal_False;
847 : :
848 : 0 : Point aPoint( 0, 0 );
849 [ # # ]: 0 : Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
850 : :
851 [ # # # # : 0 : switch ( meScrollType )
# ]
852 : : {
853 : : case SCROLL_LINEUP:
854 [ # # ]: 0 : if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_LEFT: PART_BUTTON_UP,
855 [ # # ][ # # ]: 0 : aControlRegion, rMousePos, bIsInside )?
856 : : bIsInside:
857 [ # # ][ # # ]: 0 : maBtn1Rect.IsInside( rMousePos ) )
858 : : {
859 : 0 : bAction = bCallAction;
860 : 0 : mnStateFlags |= SCRBAR_STATE_BTN1_DOWN;
861 : : }
862 : : else
863 : 0 : mnStateFlags &= ~SCRBAR_STATE_BTN1_DOWN;
864 : 0 : break;
865 : :
866 : : case SCROLL_LINEDOWN:
867 [ # # ]: 0 : if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_RIGHT: PART_BUTTON_DOWN,
868 [ # # ][ # # ]: 0 : aControlRegion, rMousePos, bIsInside )?
869 : : bIsInside:
870 [ # # ][ # # ]: 0 : maBtn2Rect.IsInside( rMousePos ) )
871 : : {
872 : 0 : bAction = bCallAction;
873 : 0 : mnStateFlags |= SCRBAR_STATE_BTN2_DOWN;
874 : : }
875 : : else
876 : 0 : mnStateFlags &= ~SCRBAR_STATE_BTN2_DOWN;
877 : 0 : break;
878 : :
879 : : case SCROLL_PAGEUP:
880 : : // HitTestNativeControl, see remark at top of file
881 [ # # ]: 0 : if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_LEFT: PART_TRACK_VERT_UPPER,
882 [ # # ][ # # ]: 0 : maPage1Rect, rMousePos, bIsInside )?
883 : : bIsInside:
884 [ # # ][ # # ]: 0 : maPage1Rect.IsInside( rMousePos ) )
885 : : {
886 : 0 : bAction = bCallAction;
887 : 0 : mnStateFlags |= SCRBAR_STATE_PAGE1_DOWN;
888 : : }
889 : : else
890 : 0 : mnStateFlags &= ~SCRBAR_STATE_PAGE1_DOWN;
891 : 0 : break;
892 : :
893 : : case SCROLL_PAGEDOWN:
894 : : // HitTestNativeControl, see remark at top of file
895 [ # # ]: 0 : if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_RIGHT: PART_TRACK_VERT_LOWER,
896 [ # # ][ # # ]: 0 : maPage2Rect, rMousePos, bIsInside )?
897 : : bIsInside:
898 [ # # ][ # # ]: 0 : maPage2Rect.IsInside( rMousePos ) )
899 : : {
900 : 0 : bAction = bCallAction;
901 : 0 : mnStateFlags |= SCRBAR_STATE_PAGE2_DOWN;
902 : : }
903 : : else
904 : 0 : mnStateFlags &= ~SCRBAR_STATE_PAGE2_DOWN;
905 : 0 : break;
906 : : default:
907 : : ;
908 : : }
909 : :
910 [ # # ]: 0 : if ( nOldStateFlags != mnStateFlags )
911 [ # # ]: 0 : ImplDraw( mnDragDraw, this );
912 [ # # ]: 0 : if ( bAction )
913 [ # # ]: 0 : ImplDoAction( sal_False );
914 : 0 : }
915 : :
916 : : // -----------------------------------------------------------------------
917 : :
918 : 0 : void ScrollBar::ImplDragThumb( const Point& rMousePos )
919 : : {
920 : : long nMovePix;
921 [ # # ]: 0 : if ( GetStyle() & WB_HORZ )
922 : 0 : nMovePix = rMousePos.X()-(maThumbRect.Left()+mnMouseOff);
923 : : else
924 : 0 : nMovePix = rMousePos.Y()-(maThumbRect.Top()+mnMouseOff);
925 : :
926 : : // move thumb if necessary
927 [ # # ]: 0 : if ( nMovePix )
928 : : {
929 : 0 : mnThumbPixPos += nMovePix;
930 [ # # ]: 0 : if ( mnThumbPixPos < 0 )
931 : 0 : mnThumbPixPos = 0;
932 [ # # ]: 0 : if ( mnThumbPixPos > (mnThumbPixRange-mnThumbPixSize) )
933 : 0 : mnThumbPixPos = mnThumbPixRange-mnThumbPixSize;
934 : 0 : long nOldPos = mnThumbPos;
935 : 0 : mnThumbPos = ImplCalcThumbPos( mnThumbPixPos );
936 : 0 : ImplUpdateRects();
937 [ # # ][ # # ]: 0 : if ( mbFullDrag && (nOldPos != mnThumbPos) )
938 : : {
939 : 0 : mnDelta = mnThumbPos-nOldPos;
940 : 0 : Scroll();
941 : 0 : mnDelta = 0;
942 : : }
943 : : }
944 : 0 : }
945 : :
946 : : // -----------------------------------------------------------------------
947 : :
948 : 0 : void ScrollBar::MouseButtonDown( const MouseEvent& rMEvt )
949 : : {
950 [ # # ][ # # ]: 0 : if ( rMEvt.IsLeft() || rMEvt.IsMiddle() )
[ # # ]
951 : : {
952 : 0 : const Point& rMousePos = rMEvt.GetPosPixel();
953 : 0 : sal_uInt16 nTrackFlags = 0;
954 [ # # ][ # # ]: 0 : sal_Bool bHorizontal = ( GetStyle() & WB_HORZ )? sal_True: sal_False;
955 : 0 : sal_Bool bIsInside = sal_False;
956 : 0 : sal_Bool bDragToMouse = sal_False;
957 : :
958 : 0 : Point aPoint( 0, 0 );
959 [ # # ]: 0 : Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
960 : :
961 [ # # ]: 0 : if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_LEFT: PART_BUTTON_UP,
962 [ # # ][ # # ]: 0 : aControlRegion, rMousePos, bIsInside )?
963 : : bIsInside:
964 [ # # ][ # # ]: 0 : maBtn1Rect.IsInside( rMousePos ) )
965 : : {
966 [ # # ]: 0 : if ( !(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
967 : : {
968 : 0 : nTrackFlags = STARTTRACK_BUTTONREPEAT;
969 : 0 : meScrollType = SCROLL_LINEUP;
970 : 0 : mnDragDraw = SCRBAR_DRAW_BTN1;
971 : : }
972 : : }
973 [ # # ]: 0 : else if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_RIGHT: PART_BUTTON_DOWN,
974 [ # # ][ # # ]: 0 : aControlRegion, rMousePos, bIsInside )?
975 : : bIsInside:
976 [ # # ][ # # ]: 0 : maBtn2Rect.IsInside( rMousePos ) )
977 : : {
978 [ # # ]: 0 : if ( !(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
979 : : {
980 : 0 : nTrackFlags = STARTTRACK_BUTTONREPEAT;
981 : 0 : meScrollType = SCROLL_LINEDOWN;
982 : 0 : mnDragDraw = SCRBAR_DRAW_BTN2;
983 : : }
984 : : }
985 : : else
986 : : {
987 : : bool bThumbHit = HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_THUMB_HORZ : PART_THUMB_VERT,
988 [ # # ][ # # ]: 0 : maThumbRect, rMousePos, bIsInside )
989 [ # # ][ # # ]: 0 : ? bIsInside : maThumbRect.IsInside( rMousePos );
990 [ # # ][ # # ]: 0 : bool bDragHandling = rMEvt.IsMiddle() || bThumbHit || ImplGetSVData()->maNWFData.mbScrollbarJumpPage;
[ # # ][ # # ]
991 [ # # ]: 0 : if( bDragHandling )
992 : : {
993 [ # # ]: 0 : if( mpData )
994 : : {
995 : 0 : mpData->mbHide = sal_True; // disable focus blinking
996 [ # # ][ # # ]: 0 : if( HasFocus() )
997 [ # # ]: 0 : ImplDraw( SCRBAR_DRAW_THUMB, this ); // paint without focus
998 : : }
999 : :
1000 [ # # ]: 0 : if ( mnVisibleSize < mnMaxRange-mnMinRange )
1001 : : {
1002 : 0 : nTrackFlags = 0;
1003 : 0 : meScrollType = SCROLL_DRAG;
1004 : 0 : mnDragDraw = SCRBAR_DRAW_THUMB;
1005 : :
1006 : : // calculate mouse offset
1007 [ # # ][ # # ]: 0 : if( rMEvt.IsMiddle() || (ImplGetSVData()->maNWFData.mbScrollbarJumpPage && !bThumbHit) )
[ # # ][ # # ]
[ # # ]
1008 : : {
1009 : 0 : bDragToMouse = sal_True;
1010 [ # # ][ # # ]: 0 : if ( GetStyle() & WB_HORZ )
1011 [ # # ]: 0 : mnMouseOff = maThumbRect.GetWidth()/2;
1012 : : else
1013 [ # # ]: 0 : mnMouseOff = maThumbRect.GetHeight()/2;
1014 : : }
1015 : : else
1016 : : {
1017 [ # # ][ # # ]: 0 : if ( GetStyle() & WB_HORZ )
1018 : 0 : mnMouseOff = rMousePos.X()-maThumbRect.Left();
1019 : : else
1020 : 0 : mnMouseOff = rMousePos.Y()-maThumbRect.Top();
1021 : : }
1022 : :
1023 : 0 : mnStateFlags |= SCRBAR_STATE_THUMB_DOWN;
1024 [ # # ]: 0 : ImplDraw( mnDragDraw, this );
1025 : : }
1026 : : }
1027 [ # # ]: 0 : else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_AREA : PART_TRACK_VERT_AREA,
1028 [ # # ][ # # ]: 0 : aControlRegion, rMousePos, bIsInside )?
1029 [ # # ][ # # ]: 0 : bIsInside : sal_True )
1030 : : {
1031 : 0 : nTrackFlags = STARTTRACK_BUTTONREPEAT;
1032 : :
1033 : : // HitTestNativeControl, see remark at top of file
1034 [ # # ]: 0 : if ( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER,
1035 [ # # ][ # # ]: 0 : maPage1Rect, rMousePos, bIsInside )?
1036 : : bIsInside:
1037 [ # # ][ # # ]: 0 : maPage1Rect.IsInside( rMousePos ) )
1038 : : {
1039 : 0 : meScrollType = SCROLL_PAGEUP;
1040 : 0 : mnDragDraw = SCRBAR_DRAW_PAGE1;
1041 : : }
1042 : : else
1043 : : {
1044 : 0 : meScrollType = SCROLL_PAGEDOWN;
1045 : 0 : mnDragDraw = SCRBAR_DRAW_PAGE2;
1046 : : }
1047 : : }
1048 : : }
1049 : :
1050 : : // Soll Tracking gestartet werden
1051 [ # # ]: 0 : if ( meScrollType != SCROLL_DONTKNOW )
1052 : : {
1053 : : // remember original position in case of abort or EndScroll-Delta
1054 : 0 : mnStartPos = mnThumbPos;
1055 : : // #92906# Call StartTracking() before ImplDoMouseAction(), otherwise
1056 : : // MouseButtonUp() / EndTracking() may be called if somebody is spending
1057 : : // a lot of time in the scroll handler
1058 [ # # ]: 0 : StartTracking( nTrackFlags );
1059 [ # # ]: 0 : ImplDoMouseAction( rMousePos );
1060 : :
1061 [ # # ]: 0 : if( bDragToMouse )
1062 [ # # ]: 0 : ImplDragThumb( rMousePos );
1063 : : }
1064 : : }
1065 : 0 : }
1066 : :
1067 : : // -----------------------------------------------------------------------
1068 : :
1069 : 0 : void ScrollBar::Tracking( const TrackingEvent& rTEvt )
1070 : : {
1071 [ # # ]: 0 : if ( rTEvt.IsTrackingEnded() )
1072 : : {
1073 : : // Button und PageRect-Status wieder herstellen
1074 : 0 : sal_uInt16 nOldStateFlags = mnStateFlags;
1075 : : mnStateFlags &= ~(SCRBAR_STATE_BTN1_DOWN | SCRBAR_STATE_BTN2_DOWN |
1076 : : SCRBAR_STATE_PAGE1_DOWN | SCRBAR_STATE_PAGE2_DOWN |
1077 : 0 : SCRBAR_STATE_THUMB_DOWN);
1078 [ # # ]: 0 : if ( nOldStateFlags != mnStateFlags )
1079 : 0 : ImplDraw( mnDragDraw, this );
1080 : 0 : mnDragDraw = 0;
1081 : :
1082 : : // Bei Abbruch, die alte ThumbPosition wieder herstellen
1083 [ # # ]: 0 : if ( rTEvt.IsTrackingCanceled() )
1084 : : {
1085 : 0 : long nOldPos = mnThumbPos;
1086 : 0 : SetThumbPos( mnStartPos );
1087 : 0 : mnDelta = mnThumbPos-nOldPos;
1088 : 0 : Scroll();
1089 : : }
1090 : :
1091 [ # # ]: 0 : if ( meScrollType == SCROLL_DRAG )
1092 : : {
1093 : : // Wenn gedragt wurde, berechnen wir den Thumb neu, damit
1094 : : // er wieder auf einer gerundeten ThumbPosition steht
1095 : 0 : ImplCalc();
1096 : :
1097 [ # # ][ # # ]: 0 : if ( !mbFullDrag && (mnStartPos != mnThumbPos) )
1098 : : {
1099 : 0 : mnDelta = mnThumbPos-mnStartPos;
1100 : 0 : Scroll();
1101 : 0 : mnDelta = 0;
1102 : : }
1103 : : }
1104 : :
1105 : 0 : mnDelta = mnThumbPos-mnStartPos;
1106 : 0 : EndScroll();
1107 : 0 : mnDelta = 0;
1108 : 0 : meScrollType = SCROLL_DONTKNOW;
1109 : :
1110 [ # # ]: 0 : if( mpData )
1111 : 0 : mpData->mbHide = sal_False; // re-enable focus blinking
1112 : : }
1113 : : else
1114 : : {
1115 : 0 : const Point rMousePos = rTEvt.GetMouseEvent().GetPosPixel();
1116 : :
1117 : : // Dragging wird speziell behandelt
1118 [ # # ]: 0 : if ( meScrollType == SCROLL_DRAG )
1119 [ # # ]: 0 : ImplDragThumb( rMousePos );
1120 : : else
1121 [ # # ]: 0 : ImplDoMouseAction( rMousePos, rTEvt.IsTrackingRepeat() );
1122 : :
1123 : : // Wenn ScrollBar-Werte so umgesetzt wurden, das es nichts
1124 : : // mehr zum Tracking gibt, dann berechen wir hier ab
1125 [ # # ][ # # ]: 0 : if ( !IsVisible() || (mnVisibleSize >= (mnMaxRange-mnMinRange)) )
[ # # ][ # # ]
1126 [ # # ]: 0 : EndTracking();
1127 : : }
1128 : 0 : }
1129 : :
1130 : : // -----------------------------------------------------------------------
1131 : :
1132 : 0 : void ScrollBar::KeyInput( const KeyEvent& rKEvt )
1133 : : {
1134 [ # # ]: 0 : if ( !rKEvt.GetKeyCode().GetModifier() )
1135 : : {
1136 [ # # # # : 0 : switch ( rKEvt.GetKeyCode().GetCode() )
# # # ]
1137 : : {
1138 : : case KEY_HOME:
1139 : 0 : DoScroll( 0 );
1140 : 0 : break;
1141 : :
1142 : : case KEY_END:
1143 : 0 : DoScroll( GetRangeMax() );
1144 : 0 : break;
1145 : :
1146 : : case KEY_LEFT:
1147 : : case KEY_UP:
1148 : 0 : DoScrollAction( SCROLL_LINEUP );
1149 : 0 : break;
1150 : :
1151 : : case KEY_RIGHT:
1152 : : case KEY_DOWN:
1153 : 0 : DoScrollAction( SCROLL_LINEDOWN );
1154 : 0 : break;
1155 : :
1156 : : case KEY_PAGEUP:
1157 : 0 : DoScrollAction( SCROLL_PAGEUP );
1158 : 0 : break;
1159 : :
1160 : : case KEY_PAGEDOWN:
1161 : 0 : DoScrollAction( SCROLL_PAGEDOWN );
1162 : 0 : break;
1163 : :
1164 : : default:
1165 : 0 : Control::KeyInput( rKEvt );
1166 : 0 : break;
1167 : : }
1168 : : }
1169 : : else
1170 : 0 : Control::KeyInput( rKEvt );
1171 : 0 : }
1172 : :
1173 : : // -----------------------------------------------------------------------
1174 : :
1175 : 4908 : void ScrollBar::Paint( const Rectangle& )
1176 : : {
1177 : 4908 : ImplDraw( SCRBAR_DRAW_ALL, this );
1178 : 4908 : }
1179 : :
1180 : : // -----------------------------------------------------------------------
1181 : :
1182 : 8963 : void ScrollBar::Resize()
1183 : : {
1184 : 8963 : Control::Resize();
1185 : 8963 : mbCalcSize = sal_True;
1186 [ + + ]: 8963 : if ( IsReallyVisible() )
1187 : 1127 : ImplCalc( sal_False );
1188 : 8963 : Invalidate();
1189 : 8963 : }
1190 : :
1191 : : // -----------------------------------------------------------------------
1192 : :
1193 : 0 : IMPL_LINK_NOARG(ScrollBar, ImplAutoTimerHdl)
1194 : : {
1195 [ # # ][ # # ]: 0 : if( mpData && mpData->mbHide )
1196 : 0 : return 0;
1197 : 0 : ImplInvert();
1198 : 0 : return 0;
1199 : : }
1200 : :
1201 : 0 : void ScrollBar::ImplInvert()
1202 : : {
1203 : 0 : Rectangle aRect( maThumbRect );
1204 [ # # ]: 0 : if( aRect.getWidth() > 4 )
1205 : : {
1206 : 0 : aRect.Left() += 2;
1207 : 0 : aRect.Right() -= 2;
1208 : : }
1209 [ # # ]: 0 : if( aRect.getHeight() > 4 )
1210 : : {
1211 : 0 : aRect.Top() += 2;
1212 : 0 : aRect.Bottom() -= 2;
1213 : : }
1214 : :
1215 [ # # ]: 0 : Invert( aRect, 0 );
1216 : 0 : }
1217 : :
1218 : : // -----------------------------------------------------------------------
1219 : :
1220 : 0 : void ScrollBar::GetFocus()
1221 : : {
1222 [ # # ]: 0 : if( !mpData )
1223 : : {
1224 [ # # ]: 0 : mpData = new ImplScrollBarData;
1225 : 0 : mpData->maTimer.SetTimeoutHdl( LINK( this, ScrollBar, ImplAutoTimerHdl ) );
1226 : 0 : mpData->mbHide = sal_False;
1227 : : }
1228 : 0 : ImplInvert(); // react immediately
1229 : 0 : mpData->maTimer.SetTimeout( GetSettings().GetStyleSettings().GetCursorBlinkTime() );
1230 : 0 : mpData->maTimer.Start();
1231 : 0 : Control::GetFocus();
1232 : 0 : }
1233 : :
1234 : : // -----------------------------------------------------------------------
1235 : :
1236 : 0 : void ScrollBar::LoseFocus()
1237 : : {
1238 [ # # ]: 0 : if( mpData )
1239 : 0 : mpData->maTimer.Stop();
1240 : 0 : ImplDraw( SCRBAR_DRAW_THUMB, this );
1241 : :
1242 : 0 : Control::LoseFocus();
1243 : 0 : }
1244 : :
1245 : : // -----------------------------------------------------------------------
1246 : :
1247 : 30661 : void ScrollBar::StateChanged( StateChangedType nType )
1248 : : {
1249 : 30661 : Control::StateChanged( nType );
1250 : :
1251 [ + + ]: 30661 : if ( nType == STATE_CHANGE_INITSHOW )
1252 : 3932 : ImplCalc( sal_False );
1253 [ + + ]: 26729 : else if ( nType == STATE_CHANGE_DATA )
1254 : : {
1255 [ + + ][ + - ]: 17971 : if ( IsReallyVisible() && IsUpdateMode() )
[ + + ]
1256 : 3007 : ImplCalc( sal_True );
1257 : : }
1258 [ - + ]: 8758 : else if ( nType == STATE_CHANGE_UPDATEMODE )
1259 : : {
1260 [ # # ][ # # ]: 0 : if ( IsReallyVisible() && IsUpdateMode() )
[ # # ]
1261 : : {
1262 : 0 : ImplCalc( sal_False );
1263 : 0 : Invalidate();
1264 : : }
1265 : : }
1266 [ + + ]: 8758 : else if ( nType == STATE_CHANGE_ENABLE )
1267 : : {
1268 [ + + ][ + - ]: 1242 : if ( IsReallyVisible() && IsUpdateMode() )
[ + + ]
1269 : 656 : Invalidate();
1270 : : }
1271 [ + + ]: 7516 : else if ( nType == STATE_CHANGE_STYLE )
1272 : : {
1273 : 2 : ImplInitStyle( GetStyle() );
1274 [ # # ][ - + ]: 2 : if ( IsReallyVisible() && IsUpdateMode() )
[ - + ]
1275 : : {
1276 [ # # ]: 0 : if ( (GetPrevStyle() & SCRBAR_VIEW_STYLE) !=
1277 : 0 : (GetStyle() & SCRBAR_VIEW_STYLE) )
1278 : : {
1279 : 0 : mbCalcSize = sal_True;
1280 : 0 : ImplCalc( sal_False );
1281 : 0 : Invalidate();
1282 : : }
1283 : : }
1284 : : }
1285 : 30661 : }
1286 : :
1287 : : // -----------------------------------------------------------------------
1288 : :
1289 : 850 : void ScrollBar::DataChanged( const DataChangedEvent& rDCEvt )
1290 : : {
1291 : 850 : Control::DataChanged( rDCEvt );
1292 : :
1293 [ + + ]: 1700 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
[ + - + + ]
1294 : 850 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1295 : : {
1296 : 736 : mbCalcSize = sal_True;
1297 : 736 : ImplCalc( sal_False );
1298 : 736 : Invalidate();
1299 : : }
1300 : 850 : }
1301 : :
1302 : : // -----------------------------------------------------------------------
1303 : :
1304 : 0 : Rectangle* ScrollBar::ImplFindPartRect( const Point& rPt )
1305 : : {
1306 [ # # ][ # # ]: 0 : sal_Bool bHorizontal = ( GetStyle() & WB_HORZ )? sal_True: sal_False;
1307 : 0 : sal_Bool bIsInside = sal_False;
1308 : :
1309 : 0 : Point aPoint( 0, 0 );
1310 [ # # ]: 0 : Rectangle aControlRegion( aPoint, GetOutputSizePixel() );
1311 : :
1312 [ # # ]: 0 : if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_LEFT: PART_BUTTON_UP,
1313 [ # # ][ # # ]: 0 : aControlRegion, rPt, bIsInside )?
1314 : : bIsInside:
1315 [ # # ][ # # ]: 0 : maBtn1Rect.IsInside( rPt ) )
1316 : 0 : return &maBtn1Rect;
1317 [ # # ]: 0 : else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_BUTTON_RIGHT: PART_BUTTON_DOWN,
1318 [ # # ][ # # ]: 0 : aControlRegion, rPt, bIsInside )?
1319 : : bIsInside:
1320 [ # # ][ # # ]: 0 : maBtn2Rect.IsInside( rPt ) )
1321 : 0 : return &maBtn2Rect;
1322 : : // HitTestNativeControl, see remark at top of file
1323 [ # # ]: 0 : else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal ? PART_TRACK_HORZ_LEFT : PART_TRACK_VERT_UPPER,
1324 [ # # ][ # # ]: 0 : maPage1Rect, rPt, bIsInside)?
1325 : : bIsInside:
1326 [ # # ][ # # ]: 0 : maPage1Rect.IsInside( rPt ) )
1327 : 0 : return &maPage1Rect;
1328 : : // HitTestNativeControl, see remark at top of file
1329 [ # # ]: 0 : else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal ? PART_TRACK_HORZ_RIGHT : PART_TRACK_VERT_LOWER,
1330 [ # # ][ # # ]: 0 : maPage2Rect, rPt, bIsInside)?
1331 : : bIsInside:
1332 [ # # ][ # # ]: 0 : maPage2Rect.IsInside( rPt ) )
1333 : 0 : return &maPage2Rect;
1334 : : // HitTestNativeControl, see remark at top of file
1335 [ # # ]: 0 : else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal ? PART_THUMB_HORZ : PART_THUMB_VERT,
1336 [ # # ][ # # ]: 0 : maThumbRect, rPt, bIsInside)?
1337 : : bIsInside:
1338 [ # # ][ # # ]: 0 : maThumbRect.IsInside( rPt ) )
1339 : 0 : return &maThumbRect;
1340 : : else
1341 : 0 : return NULL;
1342 : : }
1343 : :
1344 : 0 : long ScrollBar::PreNotify( NotifyEvent& rNEvt )
1345 : : {
1346 : 0 : long nDone = 0;
1347 : 0 : const MouseEvent* pMouseEvt = NULL;
1348 : :
1349 [ # # ][ # # ]: 0 : if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL )
[ # # ]
1350 : : {
1351 [ # # ][ # # ]: 0 : if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() )
[ # # ][ # # ]
1352 : : {
1353 : : // trigger redraw if mouse over state has changed
1354 [ # # ]: 0 : if( IsNativeControlSupported(CTRL_SCROLLBAR, PART_ENTIRE_CONTROL) )
1355 : : {
1356 [ # # ]: 0 : Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
1357 [ # # ]: 0 : Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() );
1358 [ # # ][ # # ]: 0 : if( pRect != pLastRect || pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow() )
[ # # ][ # # ]
1359 : : {
1360 [ # # ]: 0 : Region aRgn( GetActiveClipRegion() );
1361 [ # # ]: 0 : Region aClipRegion;
1362 : :
1363 [ # # ]: 0 : if ( pRect )
1364 [ # # ]: 0 : aClipRegion.Union( *pRect );
1365 [ # # ]: 0 : if ( pLastRect )
1366 [ # # ]: 0 : aClipRegion.Union( *pLastRect );
1367 : :
1368 : : // Support for 3-button scroll bars
1369 [ # # ]: 0 : sal_Bool bHas3Buttons = IsNativeControlSupported( CTRL_SCROLLBAR, HAS_THREE_BUTTONS );
1370 [ # # ][ # # ]: 0 : if ( bHas3Buttons && ( pRect == &maBtn1Rect || pLastRect == &maBtn1Rect ) )
[ # # ]
1371 : : {
1372 [ # # ]: 0 : aClipRegion.Union( maBtn2Rect );
1373 : : }
1374 : :
1375 [ # # ]: 0 : SetClipRegion( aClipRegion );
1376 [ # # ][ # # ]: 0 : Paint( aClipRegion.GetBoundRect() );
1377 : :
1378 [ # # ][ # # ]: 0 : SetClipRegion( aRgn );
[ # # ]
1379 : : }
1380 : : }
1381 : : }
1382 : : }
1383 : :
1384 [ # # ]: 0 : return nDone ? nDone : Control::PreNotify(rNEvt);
1385 : : }
1386 : :
1387 : : // -----------------------------------------------------------------------
1388 : :
1389 : 4 : void ScrollBar::Scroll()
1390 : : {
1391 : 4 : ImplCallEventListenersAndHandler( VCLEVENT_SCROLLBAR_SCROLL, maScrollHdl, this );
1392 : 4 : }
1393 : :
1394 : : // -----------------------------------------------------------------------
1395 : :
1396 : 4 : void ScrollBar::EndScroll()
1397 : : {
1398 : 4 : ImplCallEventListenersAndHandler( VCLEVENT_SCROLLBAR_ENDSCROLL, maEndScrollHdl, this );
1399 : 4 : }
1400 : :
1401 : : // -----------------------------------------------------------------------
1402 : :
1403 : 0 : long ScrollBar::DoScroll( long nNewPos )
1404 : : {
1405 [ # # ]: 0 : if ( meScrollType != SCROLL_DONTKNOW )
1406 : 0 : return 0;
1407 : :
1408 : 0 : meScrollType = SCROLL_DRAG;
1409 : 0 : long nDelta = ImplScroll( nNewPos, sal_True );
1410 : 0 : meScrollType = SCROLL_DONTKNOW;
1411 : 0 : return nDelta;
1412 : : }
1413 : :
1414 : : // -----------------------------------------------------------------------
1415 : :
1416 : 4 : long ScrollBar::DoScrollAction( ScrollType eScrollType )
1417 : : {
1418 [ + - ][ + - ]: 4 : if ( (meScrollType != SCROLL_DONTKNOW) ||
[ - + ]
1419 : : (eScrollType == SCROLL_DONTKNOW) ||
1420 : : (eScrollType == SCROLL_DRAG) )
1421 : 0 : return 0;
1422 : :
1423 : 4 : meScrollType = eScrollType;
1424 : 4 : long nDelta = ImplDoAction( sal_True );
1425 : 4 : meScrollType = SCROLL_DONTKNOW;
1426 : 4 : return nDelta;
1427 : : }
1428 : :
1429 : : // -----------------------------------------------------------------------
1430 : :
1431 : 23 : void ScrollBar::SetRangeMin( long nNewRange )
1432 : : {
1433 [ + - ]: 23 : SetRange( Range( nNewRange, GetRangeMax() ) );
1434 : 23 : }
1435 : :
1436 : : // -----------------------------------------------------------------------
1437 : :
1438 : 486 : void ScrollBar::SetRangeMax( long nNewRange )
1439 : : {
1440 [ + - ]: 486 : SetRange( Range( GetRangeMin(), nNewRange ) );
1441 : 486 : }
1442 : :
1443 : : // -----------------------------------------------------------------------
1444 : :
1445 : 21095 : void ScrollBar::SetRange( const Range& rRange )
1446 : : {
1447 : : // Range einpassen
1448 : 21095 : Range aRange = rRange;
1449 : 21095 : aRange.Justify();
1450 : 21095 : long nNewMinRange = aRange.Min();
1451 : 21095 : long nNewMaxRange = aRange.Max();
1452 : :
1453 : : // Wenn Range sich unterscheidet, dann neuen setzen
1454 [ + + ][ + + ]: 21095 : if ( (mnMinRange != nNewMinRange) ||
1455 : : (mnMaxRange != nNewMaxRange) )
1456 : : {
1457 : 7091 : mnMinRange = nNewMinRange;
1458 : 7091 : mnMaxRange = nNewMaxRange;
1459 : :
1460 : : // Thumb einpassen
1461 [ + + ]: 7091 : if ( mnThumbPos > mnMaxRange-mnVisibleSize )
1462 : 1018 : mnThumbPos = mnMaxRange-mnVisibleSize;
1463 [ + + ]: 7091 : if ( mnThumbPos < mnMinRange )
1464 : 1012 : mnThumbPos = mnMinRange;
1465 : :
1466 [ + - ]: 7091 : StateChanged( STATE_CHANGE_DATA );
1467 : : }
1468 : 21095 : }
1469 : :
1470 : : // -----------------------------------------------------------------------
1471 : :
1472 : 46031 : void ScrollBar::SetThumbPos( long nNewThumbPos )
1473 : : {
1474 [ + + ]: 46031 : if ( nNewThumbPos > mnMaxRange-mnVisibleSize )
1475 : 735 : nNewThumbPos = mnMaxRange-mnVisibleSize;
1476 [ + + ]: 46031 : if ( nNewThumbPos < mnMinRange )
1477 : 737 : nNewThumbPos = mnMinRange;
1478 : :
1479 [ + + ]: 46031 : if ( mnThumbPos != nNewThumbPos )
1480 : : {
1481 : 2962 : mnThumbPos = nNewThumbPos;
1482 : 2962 : StateChanged( STATE_CHANGE_DATA );
1483 : : }
1484 : 46031 : }
1485 : :
1486 : : // -----------------------------------------------------------------------
1487 : :
1488 : 14679 : void ScrollBar::SetVisibleSize( long nNewSize )
1489 : : {
1490 [ + + ]: 14679 : if ( mnVisibleSize != nNewSize )
1491 : : {
1492 : 7918 : mnVisibleSize = nNewSize;
1493 : :
1494 : : // Thumb einpassen
1495 [ + + ]: 7918 : if ( mnThumbPos > mnMaxRange-mnVisibleSize )
1496 : 895 : mnThumbPos = mnMaxRange-mnVisibleSize;
1497 [ + + ]: 7918 : if ( mnThumbPos < mnMinRange )
1498 : 835 : mnThumbPos = mnMinRange;
1499 : 7918 : StateChanged( STATE_CHANGE_DATA );
1500 : : }
1501 : 14679 : }
1502 : :
1503 : : // =======================================================================
1504 : :
1505 : 5959 : void ScrollBarBox::ImplInit( Window* pParent, WinBits nStyle )
1506 : : {
1507 : 5959 : Window::ImplInit( pParent, nStyle, NULL );
1508 : :
1509 : 5959 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1510 : 5959 : long nScrollSize = rStyleSettings.GetScrollBarSize();
1511 [ + - ]: 5959 : SetSizePixel( Size( nScrollSize, nScrollSize ) );
1512 : 5959 : ImplInitSettings();
1513 : 5959 : }
1514 : :
1515 : : // -----------------------------------------------------------------------
1516 : :
1517 : 5959 : ScrollBarBox::ScrollBarBox( Window* pParent, WinBits nStyle ) :
1518 : 5959 : Window( WINDOW_SCROLLBARBOX )
1519 : : {
1520 [ + - ]: 5959 : ImplInit( pParent, nStyle );
1521 : 5959 : }
1522 : :
1523 : : // -----------------------------------------------------------------------
1524 : :
1525 : 6244 : void ScrollBarBox::ImplInitSettings()
1526 : : {
1527 : : // Hack, damit man auch DockingWindows ohne Hintergrund bauen kann
1528 : : // und noch nicht alles umgestellt ist
1529 [ + - ]: 6244 : if ( IsBackground() )
1530 : : {
1531 : 6244 : Color aColor;
1532 [ - + ][ + - ]: 6244 : if ( IsControlBackground() )
1533 [ # # ]: 0 : aColor = GetControlBackground();
1534 : : else
1535 : 6244 : aColor = GetSettings().GetStyleSettings().GetFaceColor();
1536 [ + - ][ + - ]: 6244 : SetBackground( aColor );
[ + - ]
1537 : : }
1538 : 6244 : }
1539 : :
1540 : : // -----------------------------------------------------------------------
1541 : :
1542 : 4655 : void ScrollBarBox::StateChanged( StateChangedType nType )
1543 : : {
1544 : 4655 : Window::StateChanged( nType );
1545 : :
1546 [ - + ]: 4655 : if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
1547 : : {
1548 : 0 : ImplInitSettings();
1549 : 0 : Invalidate();
1550 : : }
1551 : 4655 : }
1552 : :
1553 : : // -----------------------------------------------------------------------
1554 : :
1555 : 341 : void ScrollBarBox::DataChanged( const DataChangedEvent& rDCEvt )
1556 : : {
1557 : 341 : Window::DataChanged( rDCEvt );
1558 : :
1559 [ + + ]: 682 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
[ + - + + ]
1560 : 341 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1561 : : {
1562 : 285 : ImplInitSettings();
1563 : 285 : Invalidate();
1564 : : }
1565 : 341 : }
1566 : :
1567 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|