19f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
39f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
49f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file
59f62ea84SAndrew Rist * distributed with this work for additional information
69f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file
79f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the
89f62ea84SAndrew Rist * "License"); you may not use this file except in compliance
99f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
139f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing,
149f62ea84SAndrew Rist * software distributed under the License is distributed on an
159f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169f62ea84SAndrew Rist * KIND, either express or implied. See the License for the
179f62ea84SAndrew Rist * specific language governing permissions and limitations
189f62ea84SAndrew Rist * under the License.
19cdf0e10cSrcweir *
209f62ea84SAndrew Rist *************************************************************/
219f62ea84SAndrew Rist
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_vcl.hxx"
24cdf0e10cSrcweir #include <tools/rcid.h>
25cdf0e10cSrcweir #include <vcl/spin.h>
26cdf0e10cSrcweir #include <vcl/event.hxx>
27cdf0e10cSrcweir #include <vcl/spin.hxx>
28cdf0e10cSrcweir
29cdf0e10cSrcweir // =======================================================================
30cdf0e10cSrcweir
ImplInit(Window * pParent,WinBits nStyle)31cdf0e10cSrcweir void SpinButton::ImplInit( Window* pParent, WinBits nStyle )
32cdf0e10cSrcweir {
33cdf0e10cSrcweir mbUpperIn = sal_False;
34cdf0e10cSrcweir mbLowerIn = sal_False;
35cdf0e10cSrcweir mbInitialUp = sal_False;
36cdf0e10cSrcweir mbInitialDown = sal_False;
37cdf0e10cSrcweir
38cdf0e10cSrcweir mnMinRange = 0;
39cdf0e10cSrcweir mnMaxRange = 100;
40cdf0e10cSrcweir mnValue = 0;
41cdf0e10cSrcweir mnValueStep = 1;
42cdf0e10cSrcweir
43cdf0e10cSrcweir maRepeatTimer.SetTimeout( GetSettings().GetMouseSettings().GetButtonStartRepeat() );
44cdf0e10cSrcweir maRepeatTimer.SetTimeoutHdl( LINK( this, SpinButton, ImplTimeout ) );
45cdf0e10cSrcweir
46cdf0e10cSrcweir mbRepeat = 0 != ( nStyle & WB_REPEAT );
47cdf0e10cSrcweir
48cdf0e10cSrcweir if ( nStyle & WB_HSCROLL )
49cdf0e10cSrcweir mbHorz = sal_True;
50cdf0e10cSrcweir else
51cdf0e10cSrcweir mbHorz = sal_False;
52cdf0e10cSrcweir
53cdf0e10cSrcweir Control::ImplInit( pParent, nStyle, NULL );
54cdf0e10cSrcweir }
55cdf0e10cSrcweir
56cdf0e10cSrcweir // -----------------------------------------------------------------------
57cdf0e10cSrcweir
SpinButton(Window * pParent,WinBits nStyle)58cdf0e10cSrcweir SpinButton::SpinButton( Window* pParent, WinBits nStyle )
59cdf0e10cSrcweir :Control( WINDOW_SPINBUTTON )
60cdf0e10cSrcweir ,mbUpperIsFocused( sal_False )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir ImplInit( pParent, nStyle );
63cdf0e10cSrcweir }
64cdf0e10cSrcweir
65cdf0e10cSrcweir // -----------------------------------------------------------------------
66cdf0e10cSrcweir
SpinButton(Window * pParent,const ResId & rResId)67cdf0e10cSrcweir SpinButton::SpinButton( Window* pParent, const ResId& rResId )
68cdf0e10cSrcweir :Control( WINDOW_SPINBUTTON )
69cdf0e10cSrcweir ,mbUpperIsFocused( sal_False )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir rResId.SetRT( RSC_SPINBUTTON );
72cdf0e10cSrcweir ImplInit( pParent, ImplInitRes( rResId ) );
73cdf0e10cSrcweir ImplLoadRes( rResId );
74cdf0e10cSrcweir Resize();
75cdf0e10cSrcweir }
76cdf0e10cSrcweir
77cdf0e10cSrcweir // -----------------------------------------------------------------------
78cdf0e10cSrcweir
~SpinButton()79cdf0e10cSrcweir SpinButton::~SpinButton()
80cdf0e10cSrcweir {
81cdf0e10cSrcweir }
82cdf0e10cSrcweir
83cdf0e10cSrcweir // -----------------------------------------------------------------------
84cdf0e10cSrcweir
IMPL_LINK(SpinButton,ImplTimeout,Timer *,pTimer)85cdf0e10cSrcweir IMPL_LINK( SpinButton, ImplTimeout, Timer*, pTimer )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir if ( pTimer->GetTimeout() == GetSettings().GetMouseSettings().GetButtonStartRepeat() )
88cdf0e10cSrcweir {
89cdf0e10cSrcweir pTimer->SetTimeout( GetSettings().GetMouseSettings().GetButtonRepeat() );
90cdf0e10cSrcweir pTimer->Start();
91cdf0e10cSrcweir }
92cdf0e10cSrcweir else
93cdf0e10cSrcweir {
94cdf0e10cSrcweir if ( mbInitialUp )
95cdf0e10cSrcweir Up();
96cdf0e10cSrcweir else
97cdf0e10cSrcweir Down();
98cdf0e10cSrcweir }
99cdf0e10cSrcweir
100cdf0e10cSrcweir return 0;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir
103cdf0e10cSrcweir // -----------------------------------------------------------------------
104cdf0e10cSrcweir
Up()105cdf0e10cSrcweir void SpinButton::Up()
106cdf0e10cSrcweir {
107cdf0e10cSrcweir if ( ImplIsUpperEnabled() )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir mnValue += mnValueStep;
110cdf0e10cSrcweir StateChanged( STATE_CHANGE_DATA );
111cdf0e10cSrcweir
112cdf0e10cSrcweir ImplMoveFocus( sal_True );
113cdf0e10cSrcweir }
114cdf0e10cSrcweir
115cdf0e10cSrcweir ImplCallEventListenersAndHandler( VCLEVENT_SPINBUTTON_UP, maUpHdlLink, this );
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
118cdf0e10cSrcweir // -----------------------------------------------------------------------
119cdf0e10cSrcweir
Down()120cdf0e10cSrcweir void SpinButton::Down()
121cdf0e10cSrcweir {
122cdf0e10cSrcweir if ( ImplIsLowerEnabled() )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir mnValue -= mnValueStep;
125cdf0e10cSrcweir StateChanged( STATE_CHANGE_DATA );
126cdf0e10cSrcweir
127cdf0e10cSrcweir ImplMoveFocus( sal_False );
128cdf0e10cSrcweir }
129cdf0e10cSrcweir
130cdf0e10cSrcweir ImplCallEventListenersAndHandler( VCLEVENT_SPINBUTTON_DOWN, maDownHdlLink, this );
131cdf0e10cSrcweir }
132cdf0e10cSrcweir
133cdf0e10cSrcweir // -----------------------------------------------------------------------
134cdf0e10cSrcweir
Resize()135cdf0e10cSrcweir void SpinButton::Resize()
136cdf0e10cSrcweir {
137cdf0e10cSrcweir Control::Resize();
138cdf0e10cSrcweir
139cdf0e10cSrcweir Size aSize( GetOutputSizePixel() );
140cdf0e10cSrcweir Point aTmpPoint;
141cdf0e10cSrcweir Rectangle aRect( aTmpPoint, aSize );
142cdf0e10cSrcweir if ( mbHorz )
143cdf0e10cSrcweir {
144cdf0e10cSrcweir maLowerRect = Rectangle( 0, 0, aSize.Width() / 2, aSize.Height() - 1 );
145cdf0e10cSrcweir maUpperRect = Rectangle( maLowerRect.TopRight(), aRect.BottomRight() );
146cdf0e10cSrcweir }
147cdf0e10cSrcweir else
148cdf0e10cSrcweir {
149cdf0e10cSrcweir maUpperRect = Rectangle( 0, 0, aSize.Width() - 1, aSize.Height() / 2 );
150cdf0e10cSrcweir maLowerRect = Rectangle( maUpperRect.BottomLeft(), aRect.BottomRight() );
151cdf0e10cSrcweir }
152cdf0e10cSrcweir
153cdf0e10cSrcweir ImplCalcFocusRect( ImplIsUpperEnabled() || !ImplIsLowerEnabled() );
154cdf0e10cSrcweir
155cdf0e10cSrcweir Invalidate();
156cdf0e10cSrcweir }
157cdf0e10cSrcweir
158cdf0e10cSrcweir // -----------------------------------------------------------------------
159cdf0e10cSrcweir
Draw(OutputDevice * pDev,const Point & rPos,const Size & rSize,sal_uLong nFlags)160cdf0e10cSrcweir void SpinButton::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir Point aPos = pDev->LogicToPixel( rPos );
163cdf0e10cSrcweir Size aSize = pDev->LogicToPixel( rSize );
164cdf0e10cSrcweir
165cdf0e10cSrcweir pDev->Push();
166cdf0e10cSrcweir pDev->SetMapMode();
167cdf0e10cSrcweir if ( !(nFlags & WINDOW_DRAW_MONO) )
168cdf0e10cSrcweir {
169cdf0e10cSrcweir // DecoView uses the FaceColor...
170cdf0e10cSrcweir AllSettings aSettings = pDev->GetSettings();
171cdf0e10cSrcweir StyleSettings aStyleSettings = aSettings.GetStyleSettings();
172cdf0e10cSrcweir if ( IsControlBackground() )
173cdf0e10cSrcweir aStyleSettings.SetFaceColor( GetControlBackground() );
174cdf0e10cSrcweir else
175cdf0e10cSrcweir aStyleSettings.SetFaceColor( GetSettings().GetStyleSettings().GetFaceColor() );
176cdf0e10cSrcweir
177cdf0e10cSrcweir aSettings.SetStyleSettings( aStyleSettings );
178cdf0e10cSrcweir pDev->SetSettings( aSettings );
179cdf0e10cSrcweir }
180cdf0e10cSrcweir
181cdf0e10cSrcweir Rectangle aRect( Point( 0, 0 ), aSize );
182cdf0e10cSrcweir Rectangle aLowerRect, aUpperRect;
183cdf0e10cSrcweir if ( mbHorz )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir aLowerRect = Rectangle( 0, 0, aSize.Width() / 2, aSize.Height() - 1 );
186cdf0e10cSrcweir aUpperRect = Rectangle( aLowerRect.TopRight(), aRect.BottomRight() );
187cdf0e10cSrcweir }
188cdf0e10cSrcweir else
189cdf0e10cSrcweir {
190cdf0e10cSrcweir aUpperRect = Rectangle( 0, 0, aSize.Width() - 1, aSize.Height() / 2 );
191cdf0e10cSrcweir aLowerRect = Rectangle( aUpperRect.BottomLeft(), aRect.BottomRight() );
192cdf0e10cSrcweir }
193cdf0e10cSrcweir
194cdf0e10cSrcweir aUpperRect += aPos;
195cdf0e10cSrcweir aLowerRect += aPos;
196cdf0e10cSrcweir
197cdf0e10cSrcweir ImplDrawSpinButton( pDev, aUpperRect, aLowerRect, sal_False, sal_False,
198cdf0e10cSrcweir IsEnabled() && ImplIsUpperEnabled(),
199cdf0e10cSrcweir IsEnabled() && ImplIsLowerEnabled(), mbHorz, sal_True );
200cdf0e10cSrcweir pDev->Pop();
201cdf0e10cSrcweir }
202cdf0e10cSrcweir
203cdf0e10cSrcweir
Paint(const Rectangle &)204cdf0e10cSrcweir void SpinButton::Paint( const Rectangle& )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir HideFocus();
207cdf0e10cSrcweir
208cdf0e10cSrcweir sal_Bool bEnable = IsEnabled();
209cdf0e10cSrcweir ImplDrawSpinButton( this, maUpperRect, maLowerRect, mbUpperIn, mbLowerIn,
210cdf0e10cSrcweir bEnable && ImplIsUpperEnabled(),
211cdf0e10cSrcweir bEnable && ImplIsLowerEnabled(), mbHorz, sal_True );
212cdf0e10cSrcweir
213cdf0e10cSrcweir if ( HasFocus() )
214cdf0e10cSrcweir ShowFocus( maFocusRect );
215cdf0e10cSrcweir }
216cdf0e10cSrcweir
217cdf0e10cSrcweir // -----------------------------------------------------------------------
218cdf0e10cSrcweir
MouseButtonDown(const MouseEvent & rMEvt)219cdf0e10cSrcweir void SpinButton::MouseButtonDown( const MouseEvent& rMEvt )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir if ( maUpperRect.IsInside( rMEvt.GetPosPixel() ) && ( ImplIsUpperEnabled() ) )
222cdf0e10cSrcweir {
223cdf0e10cSrcweir mbUpperIn = sal_True;
224cdf0e10cSrcweir mbInitialUp = sal_True;
225cdf0e10cSrcweir Invalidate( maUpperRect );
226cdf0e10cSrcweir }
227cdf0e10cSrcweir else if ( maLowerRect.IsInside( rMEvt.GetPosPixel() ) && ( ImplIsLowerEnabled() ) )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir mbLowerIn = sal_True;
230cdf0e10cSrcweir mbInitialDown = sal_True;
231cdf0e10cSrcweir Invalidate( maLowerRect );
232cdf0e10cSrcweir }
233cdf0e10cSrcweir
234cdf0e10cSrcweir if ( mbUpperIn || mbLowerIn )
235cdf0e10cSrcweir {
236cdf0e10cSrcweir Update();
237cdf0e10cSrcweir CaptureMouse();
238cdf0e10cSrcweir if ( mbRepeat )
239cdf0e10cSrcweir maRepeatTimer.Start();
240cdf0e10cSrcweir }
241cdf0e10cSrcweir }
242cdf0e10cSrcweir
243cdf0e10cSrcweir // -----------------------------------------------------------------------
244cdf0e10cSrcweir
MouseButtonUp(const MouseEvent &)245cdf0e10cSrcweir void SpinButton::MouseButtonUp( const MouseEvent& )
246cdf0e10cSrcweir {
247cdf0e10cSrcweir ReleaseMouse();
248cdf0e10cSrcweir if ( mbRepeat )
249cdf0e10cSrcweir {
250cdf0e10cSrcweir maRepeatTimer.Stop();
251cdf0e10cSrcweir maRepeatTimer.SetTimeout(GetSettings().GetMouseSettings().GetButtonStartRepeat() );
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
254cdf0e10cSrcweir if ( mbUpperIn )
255cdf0e10cSrcweir {
256cdf0e10cSrcweir mbUpperIn = sal_False;
257cdf0e10cSrcweir Invalidate( maUpperRect );
258cdf0e10cSrcweir Update();
259cdf0e10cSrcweir Up();
260cdf0e10cSrcweir }
261cdf0e10cSrcweir else if ( mbLowerIn )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir mbLowerIn = sal_False;
264cdf0e10cSrcweir Invalidate( maLowerRect );
265cdf0e10cSrcweir Update();
266cdf0e10cSrcweir Down();
267cdf0e10cSrcweir }
268cdf0e10cSrcweir
269cdf0e10cSrcweir mbInitialUp = mbInitialDown = sal_False;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir
272cdf0e10cSrcweir // -----------------------------------------------------------------------
273cdf0e10cSrcweir
MouseMove(const MouseEvent & rMEvt)274cdf0e10cSrcweir void SpinButton::MouseMove( const MouseEvent& rMEvt )
275cdf0e10cSrcweir {
276cdf0e10cSrcweir if ( !rMEvt.IsLeft() || (!mbInitialUp && !mbInitialDown) )
277cdf0e10cSrcweir return;
278cdf0e10cSrcweir
279cdf0e10cSrcweir if ( !maUpperRect.IsInside( rMEvt.GetPosPixel() ) &&
280cdf0e10cSrcweir mbUpperIn && mbInitialUp )
281cdf0e10cSrcweir {
282cdf0e10cSrcweir mbUpperIn = sal_False;
283cdf0e10cSrcweir maRepeatTimer.Stop();
284cdf0e10cSrcweir Invalidate( maUpperRect );
285cdf0e10cSrcweir Update();
286cdf0e10cSrcweir }
287cdf0e10cSrcweir else if ( !maLowerRect.IsInside( rMEvt.GetPosPixel() ) &&
288cdf0e10cSrcweir mbLowerIn & mbInitialDown )
289cdf0e10cSrcweir {
290cdf0e10cSrcweir mbLowerIn = sal_False;
291cdf0e10cSrcweir maRepeatTimer.Stop();
292cdf0e10cSrcweir Invalidate( maLowerRect );
293cdf0e10cSrcweir Update();
294cdf0e10cSrcweir }
295cdf0e10cSrcweir else if ( maUpperRect.IsInside( rMEvt.GetPosPixel() ) &&
296cdf0e10cSrcweir !mbUpperIn && mbInitialUp )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir mbUpperIn = sal_True;
299cdf0e10cSrcweir if ( mbRepeat )
300cdf0e10cSrcweir maRepeatTimer.Start();
301cdf0e10cSrcweir Invalidate( maUpperRect );
302cdf0e10cSrcweir Update();
303cdf0e10cSrcweir }
304cdf0e10cSrcweir else if ( maLowerRect.IsInside( rMEvt.GetPosPixel() ) &&
305cdf0e10cSrcweir !mbLowerIn && mbInitialDown )
306cdf0e10cSrcweir {
307cdf0e10cSrcweir mbLowerIn = sal_True;
308cdf0e10cSrcweir if ( mbRepeat )
309cdf0e10cSrcweir maRepeatTimer.Start();
310cdf0e10cSrcweir Invalidate( maLowerRect );
311cdf0e10cSrcweir Update();
312cdf0e10cSrcweir }
313cdf0e10cSrcweir }
314cdf0e10cSrcweir
315cdf0e10cSrcweir // -----------------------------------------------------------------------
316cdf0e10cSrcweir
KeyInput(const KeyEvent & rKEvt)317cdf0e10cSrcweir void SpinButton::KeyInput( const KeyEvent& rKEvt )
318cdf0e10cSrcweir {
319cdf0e10cSrcweir KeyCode aCode = rKEvt.GetKeyCode();
320cdf0e10cSrcweir
321cdf0e10cSrcweir if ( !rKEvt.GetKeyCode().GetModifier() )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir switch ( rKEvt.GetKeyCode().GetCode() )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir case KEY_LEFT:
326cdf0e10cSrcweir case KEY_RIGHT:
327cdf0e10cSrcweir {
328cdf0e10cSrcweir sal_Bool bUp = KEY_RIGHT == rKEvt.GetKeyCode().GetCode();
329cdf0e10cSrcweir if ( mbHorz && !ImplMoveFocus( bUp ) )
330cdf0e10cSrcweir bUp ? Up() : Down();
331cdf0e10cSrcweir }
332cdf0e10cSrcweir break;
333cdf0e10cSrcweir
334cdf0e10cSrcweir case KEY_UP:
335cdf0e10cSrcweir case KEY_DOWN:
336cdf0e10cSrcweir {
337cdf0e10cSrcweir sal_Bool bUp = KEY_UP == rKEvt.GetKeyCode().GetCode();
338cdf0e10cSrcweir if ( !mbHorz && !ImplMoveFocus( KEY_UP == rKEvt.GetKeyCode().GetCode() ) )
339cdf0e10cSrcweir bUp ? Up() : Down();
340cdf0e10cSrcweir }
341cdf0e10cSrcweir break;
342cdf0e10cSrcweir
343cdf0e10cSrcweir case KEY_SPACE:
344cdf0e10cSrcweir mbUpperIsFocused ? Up() : Down();
345cdf0e10cSrcweir break;
346cdf0e10cSrcweir
347cdf0e10cSrcweir default:
348cdf0e10cSrcweir Control::KeyInput( rKEvt );
349cdf0e10cSrcweir break;
350cdf0e10cSrcweir }
351cdf0e10cSrcweir }
352cdf0e10cSrcweir else
353cdf0e10cSrcweir Control::KeyInput( rKEvt );
354cdf0e10cSrcweir }
355cdf0e10cSrcweir
356cdf0e10cSrcweir // -----------------------------------------------------------------------
357cdf0e10cSrcweir
StateChanged(StateChangedType nType)358cdf0e10cSrcweir void SpinButton::StateChanged( StateChangedType nType )
359cdf0e10cSrcweir {
360cdf0e10cSrcweir switch ( nType )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir case STATE_CHANGE_DATA:
363cdf0e10cSrcweir case STATE_CHANGE_ENABLE:
364cdf0e10cSrcweir Invalidate();
365cdf0e10cSrcweir break;
366cdf0e10cSrcweir
367cdf0e10cSrcweir case STATE_CHANGE_STYLE:
368cdf0e10cSrcweir {
369cdf0e10cSrcweir sal_Bool bNewRepeat = 0 != ( GetStyle() & WB_REPEAT );
370cdf0e10cSrcweir if ( bNewRepeat != mbRepeat )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir if ( maRepeatTimer.IsActive() )
373cdf0e10cSrcweir {
374cdf0e10cSrcweir maRepeatTimer.Stop();
375cdf0e10cSrcweir maRepeatTimer.SetTimeout( GetSettings().GetMouseSettings().GetButtonStartRepeat() );
376cdf0e10cSrcweir }
377cdf0e10cSrcweir mbRepeat = bNewRepeat;
378cdf0e10cSrcweir }
379cdf0e10cSrcweir
380cdf0e10cSrcweir sal_Bool bNewHorz = 0 != ( GetStyle() & WB_HSCROLL );
381cdf0e10cSrcweir if ( bNewHorz != mbHorz )
382cdf0e10cSrcweir {
383cdf0e10cSrcweir mbHorz = bNewHorz;
384cdf0e10cSrcweir Resize();
385cdf0e10cSrcweir }
386cdf0e10cSrcweir }
387cdf0e10cSrcweir break;
388cdf0e10cSrcweir }
389cdf0e10cSrcweir
390cdf0e10cSrcweir Control::StateChanged( nType );
391cdf0e10cSrcweir }
392cdf0e10cSrcweir
393cdf0e10cSrcweir // -----------------------------------------------------------------------
394cdf0e10cSrcweir
SetRangeMin(long nNewRange)395cdf0e10cSrcweir void SpinButton::SetRangeMin( long nNewRange )
396cdf0e10cSrcweir {
397cdf0e10cSrcweir SetRange( Range( nNewRange, GetRangeMax() ) );
398cdf0e10cSrcweir }
399cdf0e10cSrcweir
400cdf0e10cSrcweir // -----------------------------------------------------------------------
401cdf0e10cSrcweir
SetRangeMax(long nNewRange)402cdf0e10cSrcweir void SpinButton::SetRangeMax( long nNewRange )
403cdf0e10cSrcweir {
404cdf0e10cSrcweir SetRange( Range( GetRangeMin(), nNewRange ) );
405cdf0e10cSrcweir }
406cdf0e10cSrcweir
407cdf0e10cSrcweir // -----------------------------------------------------------------------
408cdf0e10cSrcweir
SetRange(const Range & rRange)409cdf0e10cSrcweir void SpinButton::SetRange( const Range& rRange )
410cdf0e10cSrcweir {
411*f85112c9Smseidel // adjust range
412cdf0e10cSrcweir Range aRange = rRange;
413cdf0e10cSrcweir aRange.Justify();
414cdf0e10cSrcweir long nNewMinRange = aRange.Min();
415cdf0e10cSrcweir long nNewMaxRange = aRange.Max();
416cdf0e10cSrcweir
417cdf0e10cSrcweir // do something only if old and new range differ
418cdf0e10cSrcweir if ( (mnMinRange != nNewMinRange) ||
419cdf0e10cSrcweir (mnMaxRange != nNewMaxRange) )
420cdf0e10cSrcweir {
421cdf0e10cSrcweir mnMinRange = nNewMinRange;
422cdf0e10cSrcweir mnMaxRange = nNewMaxRange;
423cdf0e10cSrcweir
424cdf0e10cSrcweir // adjust value to new range, if necessary
425cdf0e10cSrcweir if ( mnValue > mnMaxRange )
426cdf0e10cSrcweir mnValue = mnMaxRange;
427cdf0e10cSrcweir if ( mnValue < mnMinRange )
428cdf0e10cSrcweir mnValue = mnMinRange;
429cdf0e10cSrcweir
430cdf0e10cSrcweir StateChanged( STATE_CHANGE_DATA );
431cdf0e10cSrcweir }
432cdf0e10cSrcweir }
433cdf0e10cSrcweir
434cdf0e10cSrcweir // -----------------------------------------------------------------------
435cdf0e10cSrcweir
SetValue(long nValue)436cdf0e10cSrcweir void SpinButton::SetValue( long nValue )
437cdf0e10cSrcweir {
438cdf0e10cSrcweir // adjust, if necessary
439cdf0e10cSrcweir if ( nValue > mnMaxRange )
440cdf0e10cSrcweir nValue = mnMaxRange;
441cdf0e10cSrcweir if ( nValue < mnMinRange )
442cdf0e10cSrcweir nValue = mnMinRange;
443cdf0e10cSrcweir
444cdf0e10cSrcweir if ( mnValue != nValue )
445cdf0e10cSrcweir {
446cdf0e10cSrcweir mnValue = nValue;
447cdf0e10cSrcweir StateChanged( STATE_CHANGE_DATA );
448cdf0e10cSrcweir }
449cdf0e10cSrcweir }
450cdf0e10cSrcweir
451cdf0e10cSrcweir // -----------------------------------------------------------------------
452cdf0e10cSrcweir
GetFocus()453cdf0e10cSrcweir void SpinButton::GetFocus()
454cdf0e10cSrcweir {
455cdf0e10cSrcweir ShowFocus( maFocusRect );
456cdf0e10cSrcweir Control::GetFocus();
457cdf0e10cSrcweir }
458cdf0e10cSrcweir
459cdf0e10cSrcweir // -----------------------------------------------------------------------
460cdf0e10cSrcweir
LoseFocus()461cdf0e10cSrcweir void SpinButton::LoseFocus()
462cdf0e10cSrcweir {
463cdf0e10cSrcweir HideFocus();
464cdf0e10cSrcweir Control::LoseFocus();
465cdf0e10cSrcweir }
466cdf0e10cSrcweir
467cdf0e10cSrcweir // -----------------------------------------------------------------------
468cdf0e10cSrcweir
ImplMoveFocus(sal_Bool _bUpper)469cdf0e10cSrcweir sal_Bool SpinButton::ImplMoveFocus( sal_Bool _bUpper )
470cdf0e10cSrcweir {
471cdf0e10cSrcweir if ( _bUpper == mbUpperIsFocused )
472cdf0e10cSrcweir return sal_False;
473cdf0e10cSrcweir
474cdf0e10cSrcweir HideFocus();
475cdf0e10cSrcweir ImplCalcFocusRect( _bUpper );
476cdf0e10cSrcweir if ( HasFocus() )
477cdf0e10cSrcweir ShowFocus( maFocusRect );
478cdf0e10cSrcweir return sal_True;
479cdf0e10cSrcweir }
480cdf0e10cSrcweir
481cdf0e10cSrcweir // -----------------------------------------------------------------------
482cdf0e10cSrcweir
ImplCalcFocusRect(sal_Bool _bUpper)483cdf0e10cSrcweir void SpinButton::ImplCalcFocusRect( sal_Bool _bUpper )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir maFocusRect = _bUpper ? maUpperRect : maLowerRect;
486cdf0e10cSrcweir // inflate by some pixels
487cdf0e10cSrcweir maFocusRect.Left() += 2;
488cdf0e10cSrcweir maFocusRect.Top() += 2;
489cdf0e10cSrcweir maFocusRect.Right() -= 2;
490cdf0e10cSrcweir maFocusRect.Bottom() -= 2;
491cdf0e10cSrcweir mbUpperIsFocused = _bUpper;
492cdf0e10cSrcweir }
493cdf0e10cSrcweir
494cdf0e10cSrcweir // -----------------------------------------------------------------------
495cdf0e10cSrcweir
ImplFindPartRect(const Point & rPt)496cdf0e10cSrcweir Rectangle* SpinButton::ImplFindPartRect( const Point& rPt )
497cdf0e10cSrcweir {
498cdf0e10cSrcweir if( maUpperRect.IsInside( rPt ) )
499cdf0e10cSrcweir return &maUpperRect;
500cdf0e10cSrcweir else if( maLowerRect.IsInside( rPt ) )
501cdf0e10cSrcweir return &maLowerRect;
502cdf0e10cSrcweir else
503cdf0e10cSrcweir return NULL;
504cdf0e10cSrcweir }
505cdf0e10cSrcweir
PreNotify(NotifyEvent & rNEvt)506cdf0e10cSrcweir long SpinButton::PreNotify( NotifyEvent& rNEvt )
507cdf0e10cSrcweir {
508cdf0e10cSrcweir long nDone = 0;
509cdf0e10cSrcweir const MouseEvent* pMouseEvt = NULL;
510cdf0e10cSrcweir
511cdf0e10cSrcweir if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL )
512cdf0e10cSrcweir {
513cdf0e10cSrcweir if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() )
514cdf0e10cSrcweir {
515cdf0e10cSrcweir // trigger redraw if mouse over state has changed
516cdf0e10cSrcweir if( IsNativeControlSupported(CTRL_SPINBOX, PART_ENTIRE_CONTROL) ||
517cdf0e10cSrcweir IsNativeControlSupported(CTRL_SPINBOX, PART_ALL_BUTTONS) )
518cdf0e10cSrcweir {
519cdf0e10cSrcweir Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
520cdf0e10cSrcweir Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() );
521cdf0e10cSrcweir if( pRect != pLastRect || (pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow()) )
522cdf0e10cSrcweir {
523cdf0e10cSrcweir Region aRgn( GetActiveClipRegion() );
524cdf0e10cSrcweir if( pLastRect )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir SetClipRegion( *pLastRect );
527cdf0e10cSrcweir Paint( *pLastRect );
528cdf0e10cSrcweir SetClipRegion( aRgn );
529cdf0e10cSrcweir }
530cdf0e10cSrcweir if( pRect )
531cdf0e10cSrcweir {
532cdf0e10cSrcweir SetClipRegion( *pRect );
533cdf0e10cSrcweir Paint( *pRect );
534cdf0e10cSrcweir SetClipRegion( aRgn );
535cdf0e10cSrcweir }
536cdf0e10cSrcweir }
537cdf0e10cSrcweir }
538cdf0e10cSrcweir }
539cdf0e10cSrcweir }
540cdf0e10cSrcweir
541cdf0e10cSrcweir return nDone ? nDone : Control::PreNotify(rNEvt);
542cdf0e10cSrcweir }
543cdf0e10cSrcweir
544*f85112c9Smseidel /* vim: set noet sw=4 ts=4: */
545