1/*
2 * Copyright 2009, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _MULTI_CHANNEL_CONTROL_H
6#define _MULTI_CHANNEL_CONTROL_H
7
8
9#include <Control.h>
10
11
12class BMultiChannelControl : public BControl {
13public:
14								BMultiChannelControl(BRect frame,
15									const char* name, const char* label,
16									BMessage* message, int32 channelCount = 1,
17									uint32 resize = B_FOLLOW_LEFT
18										| B_FOLLOW_TOP,
19									uint32 flags = B_WILL_DRAW);
20								BMultiChannelControl(BMessage* archive);
21	virtual						~BMultiChannelControl();
22
23	virtual	status_t			Archive(BMessage* archive,
24									bool deep = true) const;
25
26	virtual	void				Draw(BRect updateRect) = 0;
27	virtual	void				MouseDown(BPoint where) = 0;
28	virtual	void				KeyDown(const char* bytes, int32 numBytes) = 0;
29
30	virtual	void				FrameResized(float width, float height);
31	virtual	void				SetFont(const BFont* font,
32									uint32 mask = B_FONT_ALL);
33
34	virtual	void				AttachedToWindow();
35	virtual	void				DetachedFromWindow();
36	virtual	void				ResizeToPreferred();
37	virtual	void				GetPreferredSize(float* _width,
38									float* _height) = 0;
39
40	virtual	void				MessageReceived(BMessage* message);
41
42	//! SetValueChannel() determines which channel
43	virtual	void				SetValue(int32 value);
44	virtual	status_t			SetCurrentChannel(int32 channel);
45			int32				CurrentChannel() const;
46
47	virtual	int32				CountChannels() const;
48	virtual	int32				MaxChannelCount() const = 0;
49	virtual	status_t			SetChannelCount(int32 channelCount);
50			int32				ValueFor(int32 channel) const;
51	virtual	int32				GetValues(int32* _values, int32 firstChannel,
52									int32 channelCount) const;
53			status_t			SetValueFor(int32 channel, int32 value);
54	virtual	status_t			SetValues(int32 firstChannel,
55									int32 channelCount, const int32* _values);
56			status_t			SetAllValues(int32 values);
57			status_t			SetLimitsFor(int32 channel, int32 minimum,
58									int32 maximum);
59			status_t			GetLimitsFor(int32 channel, int32* _minimum,
60									int32* _maximum) const;
61	virtual	status_t			SetLimits(int32 firstChannel,
62									int32 channelCount, const int32* minimum,
63									const int32* maximum);
64	virtual	status_t			GetLimits(int32 firstChannel,
65									int32 channelCount, int32* _minimum,
66									int32* _maximum) const;
67			status_t			SetAllLimits(int32 minimum, int32 maximum);
68
69	virtual	status_t			SetLimitLabels(const char* minLabel,
70									const char* maxLabel);
71			const char*			MinLimitLabel() const;
72			const char*			MaxLimitLabel() const;
73
74private:
75	// FBC padding
76	virtual	status_t			_Reserverd_MultiChannelControl_0(void*, ...);
77	virtual	status_t			_Reserverd_MultiChannelControl_1(void*, ...);
78	virtual	status_t			_Reserverd_MultiChannelControl_2(void*, ...);
79	virtual	status_t			_Reserverd_MultiChannelControl_3(void*, ...);
80	virtual	status_t			_Reserverd_MultiChannelControl_4(void*, ...);
81	virtual	status_t			_Reserverd_MultiChannelControl_5(void*, ...);
82	virtual	status_t			_Reserverd_MultiChannelControl_6(void*, ...);
83	virtual	status_t			_Reserverd_MultiChannelControl_7(void*, ...);
84
85	// Forbidden
86								BMultiChannelControl(
87									const BMultiChannelControl&);
88			BMultiChannelControl& operator=(const BMultiChannelControl&);
89
90
91protected:
92	inline	int32* const&		MinLimitList() const;
93	inline	int32* const&		MaxLimitList() const;
94	inline	int32* const&		ValueList() const;
95
96private:
97			int32				fChannelCount;
98			int32				fValueChannel;
99			int32*				fChannelMinima;
100			int32*				fChannelMaxima;
101			int32*				fChannelValues;
102			char*				fMinLabel;
103			char*				fMaxLabel;
104
105			uint32				_reserved_[16];
106};
107
108
109inline int32* const&
110BMultiChannelControl::MinLimitList() const
111{
112	return fChannelMinima;
113}
114
115
116inline int32* const&
117BMultiChannelControl::MaxLimitList() const
118{
119	return fChannelMaxima;
120}
121
122
123inline int32* const&
124BMultiChannelControl::ValueList() const
125{
126	return fChannelValues;
127}
128
129
130#endif // _MULTI_CHANNEL_CONTROL_H
131
132