1/*
2 * Copyright 2006, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Stephan Aßmus <superstippi@gmx.de>
7 */
8
9#include "BoolValueView.h"
10
11#include <stdio.h>
12
13#include "ui_defines.h"
14
15// constructor
16BoolValueView::BoolValueView(BoolProperty* property)
17	: PropertyEditorView(),
18	  fProperty(property),
19	  fCheckBoxRect(0.0, 0.0, -1.0, -1.0),
20	  fEnabled(true)
21{
22}
23
24// destructor
25BoolValueView::~BoolValueView()
26{
27}
28
29// Draw
30void
31BoolValueView::Draw(BRect updateRect)
32{
33	BRect b(Bounds());
34	// focus indication
35	if (IsFocus()) {
36		SetHighColor(ui_color(B_KEYBOARD_NAVIGATION_COLOR));
37		StrokeRect(b);
38		b.InsetBy(1.0, 1.0);
39	}
40	// background
41	FillRect(b, B_SOLID_LOW);
42
43	// checkmark box
44	rgb_color crossOutline = kBlack;
45	rgb_color crossColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
46
47	if (!fEnabled) {
48		crossOutline = tint_color(crossOutline, B_LIGHTEN_2_TINT);
49		crossColor = tint_color(crossColor, B_LIGHTEN_2_TINT);
50	}
51
52	SetHighColor(crossOutline);
53	b = fCheckBoxRect;
54	StrokeRect(b);
55
56	// checkmark
57	if (fProperty && fProperty->Value()) {
58		SetHighColor(crossColor);
59		b.InsetBy(3.0, 3.0);
60		SetPenSize(2.0);
61		StrokeLine(b.LeftTop(), b.RightBottom());
62		StrokeLine(b.LeftBottom(), b.RightTop());
63	}
64}
65
66// FrameResized
67void
68BoolValueView::FrameResized(float width, float height)
69{
70	float radius = ceilf((height - 6.0) / 2.0);
71	float centerX = floorf(Bounds().left + width / 2.0);
72	float centerY = floorf(Bounds().top + height / 2.0);
73	fCheckBoxRect.Set(centerX - radius, centerY - radius,
74					  centerX + radius, centerY + radius);
75}
76
77// MakeFocus
78void
79BoolValueView::MakeFocus(bool focused)
80{
81	PropertyEditorView::MakeFocus(focused);
82	Invalidate();
83}
84
85// MouseDown
86void
87BoolValueView::MouseDown(BPoint where)
88{
89	MakeFocus(true);
90	if (fCheckBoxRect.Contains(where)) {
91		_ToggleValue();
92	}
93	// NOTE: careful, when this function returns, the object might
94	// in fact have been deleted
95}
96
97// KeyDown
98void
99BoolValueView::KeyDown(const char* bytes, int32 numBytes)
100{
101	bool handled = true;
102	if (numBytes > 0) {
103		switch (bytes[0]) {
104			case B_RETURN:
105			case B_SPACE:
106			case B_UP_ARROW:
107			case B_DOWN_ARROW:
108			case B_LEFT_ARROW:
109			case B_RIGHT_ARROW:
110				_ToggleValue();
111				break;
112			default:
113				handled = false;
114				break;
115		}
116	}
117	if (!handled)
118		PropertyEditorView::KeyDown(bytes, numBytes);
119}
120
121// _ToggleValue
122void
123BoolValueView::_ToggleValue()
124{
125	if (!fEnabled)
126		return;
127
128	if (fProperty) {
129		fProperty->SetValue(!fProperty->Value());
130		BRect b(fCheckBoxRect);
131		b.InsetBy(1.0, 1.0);
132		Invalidate(b);
133		ValueChanged();
134	}
135}
136
137// SetEnabled
138void
139BoolValueView::SetEnabled(bool enabled)
140{
141	if (fEnabled != enabled) {
142		fEnabled = enabled;
143		Invalidate();
144	}
145}
146
147// AdoptProperty
148bool
149BoolValueView::AdoptProperty(Property* property)
150{
151	BoolProperty* p = dynamic_cast<BoolProperty*>(property);
152	if (p) {
153		BRect b(fCheckBoxRect);
154		b.InsetBy(1.0, 1.0);
155		Invalidate(b);
156
157		fProperty = p;
158		return true;
159	}
160	return false;
161}
162
163// GetProperty
164Property*
165BoolValueView::GetProperty() const
166{
167	return fProperty;
168}
169
170