/*
 * Copyright 2005, Jérôme Duval. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Inspired by SoundCapture from Be newsletter (Media Kit Basics: Consumers 
 * and Producers)
 */
#include "UpDownButton.h"
#include "icon_button.h"
 
UpDownButton::UpDownButton(BRect _rect, BMessage *msg, uint32 resizeFlags)
	: BControl(_rect, "button", NULL, msg, resizeFlags, B_WILL_DRAW),
	fLastValue(B_CONTROL_ON)
{
	BRect rect = BRect(0, 0, kUpDownButtonWidth - 1, kUpDownButtonHeight - 1);
	fBitmapUp = new BBitmap(rect, B_CMAP8);
	fBitmapUp->SetBits(kButtonUpBits, kUpDownButtonWidth * kUpDownButtonHeight,
		0, B_CMAP8);
	fBitmapDown = new BBitmap(rect, B_CMAP8);
	fBitmapDown->SetBits(kButtonDownBits, kUpDownButtonWidth 
		* kUpDownButtonHeight, 0, B_CMAP8);
	fBitmapMiddle = new BBitmap(rect, B_CMAP8);
	fBitmapMiddle->SetBits(kButtonMiddleBits, kUpDownButtonWidth 
		* kUpDownButtonHeight, 0, B_CMAP8);
}
 
 
UpDownButton::~UpDownButton()
{
	delete fBitmapUp;
	delete fBitmapDown;
	delete fBitmapMiddle;
}
 
 
void
UpDownButton::Draw(BRect updateRect)
{
	SetDrawingMode(B_OP_OVER);
	
	if(IsTracking()) {
		if((Bounds().top + Bounds().Height()/2) > (fTrackingY + 3))
			DrawBitmap(fBitmapUp);
		else if((Bounds().top + Bounds().Height()/2) < (fTrackingY - 3))
			DrawBitmap(fBitmapDown);
		else
			DrawBitmap(fBitmapMiddle);
	} else {
		if(Value()==B_CONTROL_OFF)
			DrawBitmap(fBitmapUp);
		else
			DrawBitmap(fBitmapDown);	
	}
	
	SetDrawingMode(B_OP_COPY);
}
 
 
void
UpDownButton::MouseDown(BPoint point)
{
	if(!IsEnabled())
		return;
	
	fLastValue = Value();
	fTrackingY = (Bounds().top + Bounds().Height()/2);
	
	SetTracking(true);
	SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
	
	SetValue(Value() == B_CONTROL_ON ? B_CONTROL_OFF : B_CONTROL_ON);	
}
 
 
void 
UpDownButton::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
{
	if (!IsTracking())
		return;
		
	fTrackingY = point.y;
	Draw(Bounds());
	Flush();
}
 
 
void
UpDownButton::MouseUp(BPoint point)
{
	if (!IsTracking())
		return;
	
	if((Bounds().top + Bounds().Height()/2) > (fTrackingY + 3))
		SetValue(B_CONTROL_ON);
	else if((Bounds().top + Bounds().Height()/2) < (fTrackingY - 3))
		SetValue(B_CONTROL_OFF);
	
	if(Value()!=fLastValue)
		Invoke();
	SetTracking(false);
	Draw(Bounds());
	Flush();
	fLastValue = Value();
}

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fTrackingY.