#include "InputSlider.h"
#include <stdio.h>
#include <Message.h>
#include <MessageFilter.h>
#include "NummericalTextView.h"
class NumericInputFilter : public BMessageFilter {
public:
NumericInputFilter(InputSlider* slider);
virtual filter_result Filter(BMessage*, BHandler** target);
private:
InputSlider* fSlider;
};
NumericInputFilter::NumericInputFilter(InputSlider* slider)
: BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
fSlider(slider)
{
}
filter_result
NumericInputFilter::Filter(BMessage* msg, BHandler** target)
{
filter_result result = B_DISPATCH_MESSAGE;
switch (msg->what)
{
case B_KEY_DOWN:
case B_KEY_UP:
{
msg->PrintToStream();
const char *string;
if (msg->FindString("bytes", &string) == B_OK) {
while (*string != 0) {
if (*string < '0' || *string > '9') {
if (*string != '-') {
result = B_SKIP_MESSAGE;
}
}
string++;
}
}
break;
}
default:
break;
}
return result;
}
InputSlider::InputSlider(const char* name, const char* label,
BMessage* model, BHandler* target,
int32 min, int32 max, int32 value,
const char* formatString)
: PopupSlider(name, label, model, target, min, max, value, formatString),
fTextView(new NummericalTextView(BRect(0, 0 , 20, 20),
"input",
BRect(5, 5, 15, 15),
B_FOLLOW_NONE,
B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE))
{
fTextView->SetWordWrap(false);
fTextView->SetViewColor(255,255,255,0);
fTextView->SetValue(Value());
AddChild(fTextView);
}
InputSlider::~InputSlider()
{
}
BRect
InputSlider::layout(BRect frame)
{
PopupSlider::layout(frame);
frame = SliderFrame();
frame.right -= 10.0;
frame.InsetBy(2, 2);
fTextView->MoveTo(frame.LeftTop());
fTextView->ResizeTo(frame.Width(), frame.Height());
BRect textRect(fTextView->Bounds());
textRect.InsetBy(1, 1);
fTextView->SetTextRect(textRect);
fTextView->SetAlignment(B_ALIGN_CENTER);
return Frame();
}
void
InputSlider::MouseDown(BPoint where)
{
if (fTextView->Frame().Contains(where))
return;
fTextView->MakeFocus(true);
if (SliderFrame().Contains(where)) {
SetValue(fTextView->IntValue());
PopupSlider::MouseDown(where);
}
}
void
InputSlider::SetEnabled(bool enable)
{
PopupSlider::SetEnabled(enable);
}
void
InputSlider::ValueChanged(int32 newValue)
{
PopupSlider::ValueChanged(newValue);
if (LockLooper()) {
fTextView->SetValue(Value());
UnlockLooper();
}
}
void
InputSlider::DrawSlider(BRect frame, bool enabled)
{
rgb_color background = ui_color(B_PANEL_BACKGROUND_COLOR);
rgb_color lightShadow;
rgb_color midShadow;
rgb_color darkShadow;
rgb_color light;
if (enabled) {
lightShadow = tint_color(background, B_DARKEN_1_TINT);
midShadow = tint_color(background, B_DARKEN_2_TINT);
darkShadow = tint_color(background, B_DARKEN_4_TINT);
light = tint_color(background, B_LIGHTEN_MAX_TINT);
} else {
lightShadow = background;
midShadow = tint_color(background, B_DARKEN_1_TINT);
darkShadow = tint_color(background, B_DARKEN_2_TINT);
light = tint_color(background, B_LIGHTEN_1_TINT);
}
BRect r(frame);
BeginLineArray(16);
AddLine(BPoint(r.left, r.bottom),
BPoint(r.left, r.top), lightShadow);
AddLine(BPoint(r.left + 1.0, r.top),
BPoint(r.right, r.top), lightShadow);
AddLine(BPoint(r.right, r.top + 1.0),
BPoint(r.right, r.bottom), light);
AddLine(BPoint(r.right - 1.0, r.bottom),
BPoint(r.left + 1.0, r.bottom), light);
r = fTextView->Frame().InsetByCopy(-1, -1);
AddLine(BPoint(r.left, r.bottom),
BPoint(r.left, r.top), darkShadow);
AddLine(BPoint(r.left + 1.0, r.top),
BPoint(r.right, r.top), darkShadow);
AddLine(BPoint(r.right, r.top + 1.0),
BPoint(r.right, r.bottom), background);
AddLine(BPoint(r.right - 1.0, r.bottom),
BPoint(r.left + 1.0, r.bottom), background);
r.left = r.right + 1;
r.right = frame.right - 1;
AddLine(BPoint(r.left, r.bottom),
BPoint(r.left, r.top + 1.0), midShadow);
AddLine(BPoint(r.left, r.top),
BPoint(r.right, r.top), darkShadow);
AddLine(BPoint(r.right, r.top + 1.0),
BPoint(r.right, r.bottom), midShadow);
AddLine(BPoint(r.right - 1.0, r.bottom),
BPoint(r.left + 1.0, r.bottom), midShadow);
r.InsetBy(1, 1);
AddLine(BPoint(r.left, r.bottom),
BPoint(r.left, r.top), light);
AddLine(BPoint(r.left + 1.0, r.top),
BPoint(r.right, r.top), light);
AddLine(BPoint(r.right, r.top + 1.0),
BPoint(r.right, r.bottom), lightShadow);
AddLine(BPoint(r.right - 1.0, r.bottom),
BPoint(r.left + 1.0, r.bottom), lightShadow);
EndLineArray();
r.InsetBy(1, 1);
SetLowColor(background);
FillRect(r, B_SOLID_LOW);
}