1/*
2 * Copyright (c) 2006-2007, Haiku, Inc.
3 * Distributed under the terms of the MIT license.
4 *
5 * Author:
6 *		DarkWyrm, bpmagic@columbus.rr.com
7 */
8
9
10#include "TwoStateDrawButton.h"
11
12
13TwoStateDrawButton::TwoStateDrawButton(BRect frame, const char *name,
14	BBitmap *upone, BBitmap *downone, BBitmap *uptwo, BBitmap *downtwo,
15	BMessage *msg, const int32 &resize, const int32 &flags)
16	: BButton(frame, name, "", msg, resize, flags),
17 	fUpOne(upone),
18	fDownOne(downone),
19	fUpTwo(uptwo),
20	fDownTwo(downtwo),
21	fDisabledOne(NULL),
22	fDisabledTwo(NULL),
23	fButtonState(true)
24
25{
26	fButtonState = false;
27}
28
29
30TwoStateDrawButton::~TwoStateDrawButton()
31{
32	delete fUpOne;
33	delete fDownOne;
34	delete fUpTwo;
35	delete fDownTwo;
36	delete fDisabledOne;
37	delete fDisabledTwo;
38}
39
40
41void
42TwoStateDrawButton::ResizeToPreferred()
43{
44	if (fUpOne)
45		ResizeTo(fUpOne->Bounds().Width(), fUpOne->Bounds().Height());
46	else if (fDownOne)
47		ResizeTo(fDownOne->Bounds().Width(), fDownOne->Bounds().Height());
48	else if (fUpTwo)
49		ResizeTo(fUpTwo->Bounds().Width(),fUpTwo->Bounds().Height());
50	else if (fDownTwo)
51		ResizeTo(fDownTwo->Bounds().Width(), fDownTwo->Bounds().Height());
52	else if (fDisabledOne)
53		ResizeTo(fDisabledOne->Bounds().Width(), fDisabledOne->Bounds().Height());
54	else if(fDisabledTwo)
55		ResizeTo(fDisabledTwo->Bounds().Width(), fDisabledTwo->Bounds().Height());
56}
57
58
59void
60TwoStateDrawButton::SetBitmaps(BBitmap *upone, BBitmap *downone, BBitmap *uptwo,
61	BBitmap *downtwo)
62{
63	delete fUpOne;
64	delete fDownOne;
65	delete fUpTwo;
66	delete fDownTwo;
67
68	fUpOne = upone;
69	fDownOne = downone;
70	fUpTwo = uptwo;
71	fDownTwo = downtwo;
72}
73
74
75void
76TwoStateDrawButton::SetBitmaps(const int32 state, BBitmap *up, BBitmap *down)
77{
78	if (state == 0) {
79		delete fUpOne;
80		delete fDownOne;
81		fUpOne = up;
82		fDownOne = down;
83	} else {
84		delete fUpTwo;
85		delete fDownTwo;
86		fUpTwo = up;
87		fDownTwo = down;
88	}
89}
90
91
92void
93TwoStateDrawButton::SetDisabled(BBitmap *disabledone, BBitmap *disabledtwo)
94{
95	delete fDisabledOne;
96	delete fDisabledTwo;
97
98	fDisabledOne = disabledone;
99	fDisabledTwo = disabledtwo;
100}
101
102
103void
104TwoStateDrawButton::MouseUp(BPoint pt)
105{
106	BButton::MouseUp(pt);
107	fButtonState = fButtonState ? false : true;
108	Invalidate();
109}
110
111
112void
113TwoStateDrawButton::SetState(int32 value)
114{
115	if (fButtonState != value) {
116		fButtonState = (value == 0) ? false : true;
117		Invalidate();
118	}
119}
120
121
122void
123TwoStateDrawButton::Draw(BRect update)
124{
125	if (fButtonState) {
126		if (!IsEnabled()) {
127			if (fDisabledTwo)
128				DrawBitmap(fDisabledTwo, BPoint(0,0));
129			else
130				StrokeRect(Bounds());
131			return;
132		}
133
134		if (Value() == B_CONTROL_ON) {
135			if (fDownTwo)
136				DrawBitmap(fDownTwo, BPoint(0,0));
137			else
138				StrokeRect(Bounds());
139		} else {
140			if (fUpTwo)
141				DrawBitmap(fUpTwo, BPoint(0,0));
142			else
143				StrokeRect(Bounds());
144		}
145	} else {
146		if (!IsEnabled()) {
147			if (fDisabledOne)
148				DrawBitmap(fDisabledOne, BPoint(0,0));
149			else
150				StrokeRect(Bounds());
151			return;
152		}
153
154		if (Value() == B_CONTROL_ON) {
155			if (fDownOne)
156				DrawBitmap(fDownOne, BPoint(0,0));
157			else
158				StrokeRect(Bounds());
159		} else {
160			if (fUpOne)
161				DrawBitmap(fUpOne, BPoint(0,0));
162			else
163				StrokeRect(Bounds());
164		}
165	}
166}
167