1/*
2 * Copyright 2005, J��r��me Duval. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Inspired by SoundCapture from Be newsletter (Media Kit Basics: Consumers
6 * and Producers)
7 */
8#include "UpDownButton.h"
9#include "icon_button.h"
10
11UpDownButton::UpDownButton(BRect _rect, BMessage *msg, uint32 resizeFlags)
12	: BControl(_rect, "button", NULL, msg, resizeFlags, B_WILL_DRAW),
13	fLastValue(B_CONTROL_ON)
14{
15	BRect rect = BRect(0, 0, kUpDownButtonWidth - 1, kUpDownButtonHeight - 1);
16	fBitmapUp = new BBitmap(rect, B_CMAP8);
17	fBitmapUp->SetBits(kButtonUpBits, kUpDownButtonWidth * kUpDownButtonHeight,
18		0, B_CMAP8);
19	fBitmapDown = new BBitmap(rect, B_CMAP8);
20	fBitmapDown->SetBits(kButtonDownBits, kUpDownButtonWidth
21		* kUpDownButtonHeight, 0, B_CMAP8);
22	fBitmapMiddle = new BBitmap(rect, B_CMAP8);
23	fBitmapMiddle->SetBits(kButtonMiddleBits, kUpDownButtonWidth
24		* kUpDownButtonHeight, 0, B_CMAP8);
25}
26
27
28UpDownButton::~UpDownButton()
29{
30	delete fBitmapUp;
31	delete fBitmapDown;
32	delete fBitmapMiddle;
33}
34
35
36void
37UpDownButton::Draw(BRect updateRect)
38{
39	SetDrawingMode(B_OP_OVER);
40
41	if(IsTracking()) {
42		if((Bounds().top + Bounds().Height()/2) > (fTrackingY + 3))
43			DrawBitmap(fBitmapUp);
44		else if((Bounds().top + Bounds().Height()/2) < (fTrackingY - 3))
45			DrawBitmap(fBitmapDown);
46		else
47			DrawBitmap(fBitmapMiddle);
48	} else {
49		if(Value()==B_CONTROL_OFF)
50			DrawBitmap(fBitmapUp);
51		else
52			DrawBitmap(fBitmapDown);
53	}
54
55	SetDrawingMode(B_OP_COPY);
56}
57
58
59void
60UpDownButton::MouseDown(BPoint point)
61{
62	if(!IsEnabled())
63		return;
64
65	fLastValue = Value();
66	fTrackingY = (Bounds().top + Bounds().Height()/2);
67
68	SetTracking(true);
69	SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
70
71	SetValue(Value() == B_CONTROL_ON ? B_CONTROL_OFF : B_CONTROL_ON);
72}
73
74
75void
76UpDownButton::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
77{
78	if (!IsTracking())
79		return;
80
81	fTrackingY = point.y;
82	Draw(Bounds());
83	Flush();
84}
85
86
87void
88UpDownButton::MouseUp(BPoint point)
89{
90	if (!IsTracking())
91		return;
92
93	if((Bounds().top + Bounds().Height()/2) > (fTrackingY + 3))
94		SetValue(B_CONTROL_ON);
95	else if((Bounds().top + Bounds().Height()/2) < (fTrackingY - 3))
96		SetValue(B_CONTROL_OFF);
97
98	if(Value()!=fLastValue)
99		Invoke();
100	SetTracking(false);
101	Draw(Bounds());
102	Flush();
103	fLastValue = Value();
104}
105