xref: /haiku/src/apps/cortex/ValControl/ValControl.h (revision a0795c6fe30e25338049a952326c61deb7a343b6)
1*a0795c6fSMarcus Overhagen // ValControl.h
2*a0795c6fSMarcus Overhagen // +++++ cortex integration 23aug99:
3*a0795c6fSMarcus Overhagen //       - way too many protected members
4*a0795c6fSMarcus Overhagen //       - config'able font
5*a0795c6fSMarcus Overhagen //       - implement GetPreferredSize() (should work before the view is attached
6*a0795c6fSMarcus Overhagen //         to a window -- doable?)
7*a0795c6fSMarcus Overhagen //       - keyboard entry (pop-up text field)
8*a0795c6fSMarcus Overhagen //       - 'spin' mode: value changes based on vertical distance of pointer
9*a0795c6fSMarcus Overhagen //         (configurable; set buttons/modifiers to activate either mode?)
10*a0795c6fSMarcus Overhagen //
11*a0795c6fSMarcus Overhagen //       - should parameter binding happen at this level?
12*a0795c6fSMarcus Overhagen //       +++++ how about a ValControlFactory?  give it a BParameter, get back a
13*a0795c6fSMarcus Overhagen //             ValControl subclass... +++++
14*a0795c6fSMarcus Overhagen //
15*a0795c6fSMarcus Overhagen // e.moon 16jan99
16*a0795c6fSMarcus Overhagen //
17*a0795c6fSMarcus Overhagen // ABSTRACT CLASS: ValControl
18*a0795c6fSMarcus Overhagen // An abstract base class for 'value controls' -- interface
19*a0795c6fSMarcus Overhagen // components that display a value that may be modified via
20*a0795c6fSMarcus Overhagen // click-drag.  Other editing methods (such as 'click, then
21*a0795c6fSMarcus Overhagen // type') may be supported by subclasses.
22*a0795c6fSMarcus Overhagen //
23*a0795c6fSMarcus Overhagen // IMPLEMENT
24*a0795c6fSMarcus Overhagen //   getValue() and setValue(), for raw (BParameter-style) value access
25*a0795c6fSMarcus Overhagen //   MessageReceived(), to handle:
26*a0795c6fSMarcus Overhagen //     M_SET_VALUE
27*a0795c6fSMarcus Overhagen //     M_GET_VALUE
28*a0795c6fSMarcus Overhagen //     M_OFFSET_VALUE		(May be sent by segments during mouse action,
29*a0795c6fSMarcus Overhagen //                       +++++ is a faster method needed?)
30*a0795c6fSMarcus Overhagen //
31*a0795c6fSMarcus Overhagen // NOTES
32*a0795c6fSMarcus Overhagen // The control view consists of:
33*a0795c6fSMarcus Overhagen //
34*a0795c6fSMarcus Overhagen // - One or more segments.  Each segment is individually
35*a0795c6fSMarcus Overhagen //   draggable.  Subclasses may mix segment types, or add
36*a0795c6fSMarcus Overhagen //   and remove segments dynamically.
37*a0795c6fSMarcus Overhagen //
38*a0795c6fSMarcus Overhagen // - A manipulator region, to which subcontrols (such as 'spin
39*a0795c6fSMarcus Overhagen //   arrows') may be added.
40*a0795c6fSMarcus Overhagen //
41*a0795c6fSMarcus Overhagen // Views/segments may be aligned flush left or flush right.  The
42*a0795c6fSMarcus Overhagen // side towards which views are aligned may be referred to as
43*a0795c6fSMarcus Overhagen // the 'anchor' side.
44*a0795c6fSMarcus Overhagen //
45*a0795c6fSMarcus Overhagen // Quickie interface guidelines:
46*a0795c6fSMarcus Overhagen //
47*a0795c6fSMarcus Overhagen // - Value controls are always underlined, indicating that the
48*a0795c6fSMarcus Overhagen //   value is editable.  (+++++ possible extension: dotted-underline
49*a0795c6fSMarcus Overhagen //   for continuous variation, and solid for discrete/step variation)
50*a0795c6fSMarcus Overhagen //
51*a0795c6fSMarcus Overhagen // - When a value control's 'click action' is to pop down a menu of
52*a0795c6fSMarcus Overhagen //   available choices (or pop up any sort of non-typable display)
53*a0795c6fSMarcus Overhagen //   this should be indicated by a small right triangle in the
54*a0795c6fSMarcus Overhagen //   manipulator area.
55*a0795c6fSMarcus Overhagen //   +++++ this may need some clarification; pop-down sliders, for example?
56*a0795c6fSMarcus Overhagen //
57*a0795c6fSMarcus Overhagen // * HISTORY
58*a0795c6fSMarcus Overhagen //   e.moon		19sep99		Cleanup
59*a0795c6fSMarcus Overhagen //   e.moon		23aug99		begun Cortex integration
60*a0795c6fSMarcus Overhagen //   e.moon		17jan99		started
61*a0795c6fSMarcus Overhagen 
62*a0795c6fSMarcus Overhagen #ifndef __ValControl_H__
63*a0795c6fSMarcus Overhagen #define __ValControl_H__
64*a0795c6fSMarcus Overhagen 
65*a0795c6fSMarcus Overhagen #include <vector>
66*a0795c6fSMarcus Overhagen 
67*a0795c6fSMarcus Overhagen #include <Bitmap.h>
68*a0795c6fSMarcus Overhagen #include <View.h>
69*a0795c6fSMarcus Overhagen #include <Font.h>
70*a0795c6fSMarcus Overhagen #include <Control.h>
71*a0795c6fSMarcus Overhagen #include <Message.h>
72*a0795c6fSMarcus Overhagen 
73*a0795c6fSMarcus Overhagen #include "ValCtrlLayoutEntry.h"
74*a0795c6fSMarcus Overhagen 
75*a0795c6fSMarcus Overhagen #include "cortex_defs.h"
76*a0795c6fSMarcus Overhagen __BEGIN_CORTEX_NAMESPACE
77*a0795c6fSMarcus Overhagen 
78*a0795c6fSMarcus Overhagen class ValControlSegment;
79*a0795c6fSMarcus Overhagen 
80*a0795c6fSMarcus Overhagen // ---------------------------------------------------------------- //
81*a0795c6fSMarcus Overhagen 
82*a0795c6fSMarcus Overhagen 
83*a0795c6fSMarcus Overhagen /* abstract */
84*a0795c6fSMarcus Overhagen class ValControl : public BControl {
85*a0795c6fSMarcus Overhagen 	typedef BControl _inherited;
86*a0795c6fSMarcus Overhagen 
87*a0795c6fSMarcus Overhagen public:													// types & constants
88*a0795c6fSMarcus Overhagen 	// child-view alignment options:
89*a0795c6fSMarcus Overhagen 	enum align_mode {
90*a0795c6fSMarcus Overhagen 		ALIGN_FLUSH_LEFT,
91*a0795c6fSMarcus Overhagen 		ALIGN_FLUSH_RIGHT
92*a0795c6fSMarcus Overhagen 	};
93*a0795c6fSMarcus Overhagen 
94*a0795c6fSMarcus Overhagen 	// alignment flags +++++ 23aug99: not implemented -- should they be?
95*a0795c6fSMarcus Overhagen 	enum align_flags {
96*a0795c6fSMarcus Overhagen 		ALIGN_NONE 					= 0,
97*a0795c6fSMarcus Overhagen 		ALIGN_GROW 					= 1
98*a0795c6fSMarcus Overhagen 	};
99*a0795c6fSMarcus Overhagen 
100*a0795c6fSMarcus Overhagen 	// should value update messages be sent asynchronously (during
101*a0795c6fSMarcus Overhagen 	// a mouse operation) or synchronously (after the mouse is
102*a0795c6fSMarcus Overhagen 	// released)?
103*a0795c6fSMarcus Overhagen 	enum update_mode {
104*a0795c6fSMarcus Overhagen 		UPDATE_ASYNC,
105*a0795c6fSMarcus Overhagen 		UPDATE_SYNC
106*a0795c6fSMarcus Overhagen 	};
107*a0795c6fSMarcus Overhagen 
108*a0795c6fSMarcus Overhagen 	enum entry_location {
109*a0795c6fSMarcus Overhagen 		LEFT_MOST = 0,
110*a0795c6fSMarcus Overhagen 		FROM_LEFT = 0,
111*a0795c6fSMarcus Overhagen 		RIGHT_MOST = 1,
112*a0795c6fSMarcus Overhagen 		FROM_RIGHT = 1
113*a0795c6fSMarcus Overhagen 	};
114*a0795c6fSMarcus Overhagen 
115*a0795c6fSMarcus Overhagen 	// layout system state +++++
116*a0795c6fSMarcus Overhagen 
117*a0795c6fSMarcus Overhagen public:													// types
118*a0795c6fSMarcus Overhagen 
119*a0795c6fSMarcus Overhagen public:													// messages (all ValControl-related messages go here!)
120*a0795c6fSMarcus Overhagen 	enum message_t {
121*a0795c6fSMarcus Overhagen 
122*a0795c6fSMarcus Overhagen 		// Set value of a control or segment:
123*a0795c6fSMarcus Overhagen 		// [your value field(s)] or "_value" (string)
124*a0795c6fSMarcus Overhagen 		M_SET_VALUE					= ValControl_message_base,
125*a0795c6fSMarcus Overhagen 
126*a0795c6fSMarcus Overhagen 		// Request for value of control/segment:
127*a0795c6fSMarcus Overhagen 		// [your value field(s)]
128*a0795c6fSMarcus Overhagen 		M_GET_VALUE,
129*a0795c6fSMarcus Overhagen 
130*a0795c6fSMarcus Overhagen 		// ... reply to M_GET_VALUE with this:
131*a0795c6fSMarcus Overhagen 		// [your value field(s)]
132*a0795c6fSMarcus Overhagen 		M_VALUE
133*a0795c6fSMarcus Overhagen 	};
134*a0795c6fSMarcus Overhagen 
135*a0795c6fSMarcus Overhagen public:													// hooks
136*a0795c6fSMarcus Overhagen 
137*a0795c6fSMarcus Overhagen 	// * parameter-mode value access
138*a0795c6fSMarcus Overhagen 
139*a0795c6fSMarcus Overhagen 	// called to set the control's value from raw BParameter data
140*a0795c6fSMarcus Overhagen 	virtual void setValue(
141*a0795c6fSMarcus Overhagen 		const void*									data,
142*a0795c6fSMarcus Overhagen 		size_t											size)=0;
143*a0795c6fSMarcus Overhagen 
144*a0795c6fSMarcus Overhagen 	// called to request the control's value in raw form
145*a0795c6fSMarcus Overhagen 	virtual void getValue(
146*a0795c6fSMarcus Overhagen 		void*												data,
147*a0795c6fSMarcus Overhagen 		size_t*											ioSize)=0;
148*a0795c6fSMarcus Overhagen 
149*a0795c6fSMarcus Overhagen 	// * string value access
150*a0795c6fSMarcus Overhagen 
151*a0795c6fSMarcus Overhagen 	virtual status_t setValueFrom(
152*a0795c6fSMarcus Overhagen 		const char*									text)=0;
153*a0795c6fSMarcus Overhagen 
154*a0795c6fSMarcus Overhagen 	virtual status_t getString(
155*a0795c6fSMarcus Overhagen 		BString&										buffer)=0;
156*a0795c6fSMarcus Overhagen 
157*a0795c6fSMarcus Overhagen 	// called when a child view's preferred size has changed;
158*a0795c6fSMarcus Overhagen 	// it's up to the ValControl to grant the resize request.
159*a0795c6fSMarcus Overhagen 	// Return true to notify the child that the request has
160*a0795c6fSMarcus Overhagen 	// been granted, or false if denied (the default.)
161*a0795c6fSMarcus Overhagen 
162*a0795c6fSMarcus Overhagen 	virtual bool childResizeRequest(
163*a0795c6fSMarcus Overhagen 		BView*											child)	{ return false; }
164*a0795c6fSMarcus Overhagen 
165*a0795c6fSMarcus Overhagen public:													// ctor/dtor/accessors
166*a0795c6fSMarcus Overhagen 	virtual ~ValControl();
167*a0795c6fSMarcus Overhagen 
168*a0795c6fSMarcus Overhagen 	// value-access methods are left up to the subclasses,
169*a0795c6fSMarcus Overhagen 	//   since they'll take varying types of arguments.
170*a0795c6fSMarcus Overhagen 	//  (M_SET_VALUE and M_GET_VALUE should always behave
171*a0795c6fSMarcus Overhagen 	//   as you'd expect, with a 'value' field of the appropriate
172*a0795c6fSMarcus Overhagen 	//   type replacing or returning the current value.) +++++ decrepit
173*a0795c6fSMarcus Overhagen 	//
174*a0795c6fSMarcus Overhagen 	// Note that all implementations offering pop-up keyboard entry
175*a0795c6fSMarcus Overhagen 	// must accept an M_SET_VALUE with a value of B_STRING_TYPE.
176*a0795c6fSMarcus Overhagen 
177*a0795c6fSMarcus Overhagen 	// get/set update mode (determines whether value updates are
178*a0795c6fSMarcus Overhagen 	// sent to the target during mouse operations, or only on
179*a0795c6fSMarcus Overhagen 	// mouse-up)
180*a0795c6fSMarcus Overhagen 	update_mode updateMode() const;
181*a0795c6fSMarcus Overhagen 	void setUpdateMode(
182*a0795c6fSMarcus Overhagen 		update_mode									mode);
183*a0795c6fSMarcus Overhagen 
184*a0795c6fSMarcus Overhagen 	// +++++ get/set font used by segments
185*a0795c6fSMarcus Overhagen 	// (would separate 'value' and 'label' fonts be a good move?)
186*a0795c6fSMarcus Overhagen //	const BFont* font() const;
187*a0795c6fSMarcus Overhagen 
188*a0795c6fSMarcus Overhagen 	const BFont* labelFont() const; //nyi
189*a0795c6fSMarcus Overhagen 	void setLabelFont(
190*a0795c6fSMarcus Overhagen 		const BFont*								labelFont); //nyi
191*a0795c6fSMarcus Overhagen 
192*a0795c6fSMarcus Overhagen 	const BFont* valueFont() const; //nyi
193*a0795c6fSMarcus Overhagen 	void setValueFont(
194*a0795c6fSMarcus Overhagen 		const BFont*								valueFont); //nyi
195*a0795c6fSMarcus Overhagen 
196*a0795c6fSMarcus Overhagen 	// get baseline y offset: this is measured relative to the top of the
197*a0795c6fSMarcus Overhagen 	// view
198*a0795c6fSMarcus Overhagen 	float baselineOffset() const;
199*a0795c6fSMarcus Overhagen 
200*a0795c6fSMarcus Overhagen 	// segment padding: this amount of padding is added to the
201*a0795c6fSMarcus Overhagen 	// right of each segment bounds-rectangle
202*a0795c6fSMarcus Overhagen 	float segmentPadding() const;
203*a0795c6fSMarcus Overhagen 
204*a0795c6fSMarcus Overhagen 	// fast drag rate: returns ratio of pixels:units for fast
205*a0795c6fSMarcus Overhagen 	// (left-button) dragging
206*a0795c6fSMarcus Overhagen 	float fastDragRate() const; //nyi
207*a0795c6fSMarcus Overhagen 
208*a0795c6fSMarcus Overhagen 	// slow drag rate: returns ratio for precise (both/middle-button)
209*a0795c6fSMarcus Overhagen 	// dragging
210*a0795c6fSMarcus Overhagen 	float slowDragRate() const; //nyi
211*a0795c6fSMarcus Overhagen 
212*a0795c6fSMarcus Overhagen 	// fetch back-buffer
213*a0795c6fSMarcus Overhagen 	BView* backBufferView() const; //nyi
214*a0795c6fSMarcus Overhagen 	BBitmap* backBuffer() const; //nyi
215*a0795c6fSMarcus Overhagen 
216*a0795c6fSMarcus Overhagen 	// pop up keyboard input field
217*a0795c6fSMarcus Overhagen 	// +++++ should this turn into a message?
218*a0795c6fSMarcus Overhagen 	virtual void showEditField();
219*a0795c6fSMarcus Overhagen 
220*a0795c6fSMarcus Overhagen public:													// debugging [23aug99]
221*a0795c6fSMarcus Overhagen 	virtual void dump();
222*a0795c6fSMarcus Overhagen 
223*a0795c6fSMarcus Overhagen public:													// BControl impl.
224*a0795c6fSMarcus Overhagen 	// SetValue(), Value() aren't defined, since they only support
225*a0795c6fSMarcus Overhagen 	//   32-bit integer values.  TextControl provides a precedent for
226*a0795c6fSMarcus Overhagen 	//   this kind of naughtiness.
227*a0795c6fSMarcus Overhagen 
228*a0795c6fSMarcus Overhagen 	// empty implementation (hands off to BControl)
229*a0795c6fSMarcus Overhagen 	virtual void SetEnabled(
230*a0795c6fSMarcus Overhagen 		bool												enabled);
231*a0795c6fSMarcus Overhagen 
232*a0795c6fSMarcus Overhagen public:													// BView impl.
233*a0795c6fSMarcus Overhagen 
234*a0795c6fSMarcus Overhagen 	// handle initial layout stuff:
235*a0795c6fSMarcus Overhagen 	virtual void AttachedToWindow();
236*a0795c6fSMarcus Overhagen 	virtual void AllAttached();
237*a0795c6fSMarcus Overhagen 
238*a0795c6fSMarcus Overhagen 	// paint decorations (& decimal point)
239*a0795c6fSMarcus Overhagen 	virtual void Draw(
240*a0795c6fSMarcus Overhagen 		BRect												updateRect);
241*a0795c6fSMarcus Overhagen 
242*a0795c6fSMarcus Overhagen 	virtual void drawDecimalPoint(
243*a0795c6fSMarcus Overhagen 		ValCtrlLayoutEntry&					entry);
244*a0795c6fSMarcus Overhagen 
245*a0795c6fSMarcus Overhagen 	// handle frame resize (grow backbuffer if need be)
246*a0795c6fSMarcus Overhagen 	virtual void FrameResized(
247*a0795c6fSMarcus Overhagen 		float												width,
248*a0795c6fSMarcus Overhagen 		float												height);
249*a0795c6fSMarcus Overhagen 
250*a0795c6fSMarcus Overhagen 	// calculate minimum size
251*a0795c6fSMarcus Overhagen 	virtual void GetPreferredSize(
252*a0795c6fSMarcus Overhagen 		float*											outWidth,
253*a0795c6fSMarcus Overhagen 		float*											outHeight);
254*a0795c6fSMarcus Overhagen 
255*a0795c6fSMarcus Overhagen 	virtual void MakeFocus(
256*a0795c6fSMarcus Overhagen 		bool												focused=true);
257*a0795c6fSMarcus Overhagen 
258*a0795c6fSMarcus Overhagen 	virtual void MouseDown(
259*a0795c6fSMarcus Overhagen 		BPoint											where);
260*a0795c6fSMarcus Overhagen 
261*a0795c6fSMarcus Overhagen public:						// BHandler impl.
262*a0795c6fSMarcus Overhagen 	virtual void MessageReceived(
263*a0795c6fSMarcus Overhagen 		BMessage*										message);
264*a0795c6fSMarcus Overhagen 
265*a0795c6fSMarcus Overhagen public:						// archiving/instantiation
266*a0795c6fSMarcus Overhagen 	ValControl(
267*a0795c6fSMarcus Overhagen 		BMessage*										archive);
268*a0795c6fSMarcus Overhagen 
269*a0795c6fSMarcus Overhagen 	status_t Archive(
270*a0795c6fSMarcus Overhagen 		BMessage*										archive,
271*a0795c6fSMarcus Overhagen 		bool												deep=true) const;
272*a0795c6fSMarcus Overhagen 
273*a0795c6fSMarcus Overhagen protected:					// internal ctor/operations
274*a0795c6fSMarcus Overhagen 	ValControl(
275*a0795c6fSMarcus Overhagen 		BRect												frame,
276*a0795c6fSMarcus Overhagen 		const char*									name,
277*a0795c6fSMarcus Overhagen 		const char*									label,
278*a0795c6fSMarcus Overhagen 		BMessage*										message,
279*a0795c6fSMarcus Overhagen 		align_mode									alignMode,
280*a0795c6fSMarcus Overhagen 		align_flags									alignFlags,
281*a0795c6fSMarcus Overhagen 		update_mode									updateMode=UPDATE_ASYNC,
282*a0795c6fSMarcus Overhagen 		bool												backBuffer=true);
283*a0795c6fSMarcus Overhagen 
284*a0795c6fSMarcus Overhagen 	// add segment view (which is responsible for generating its
285*a0795c6fSMarcus Overhagen 	// own ValCtrlLayoutEntry)
286*a0795c6fSMarcus Overhagen 	void add(
287*a0795c6fSMarcus Overhagen 		ValControlSegment*					segment,
288*a0795c6fSMarcus Overhagen 		entry_location							from,
289*a0795c6fSMarcus Overhagen 		uint16											distance=0);
290*a0795c6fSMarcus Overhagen 
291*a0795c6fSMarcus Overhagen 	// add general view (manipulator, label, etc.)
292*a0795c6fSMarcus Overhagen 	// (the entry's frame rectangle will be filled in)
293*a0795c6fSMarcus Overhagen 	// covers ValCtrlLayoutEntry ctor:
294*a0795c6fSMarcus Overhagen 	void add(
295*a0795c6fSMarcus Overhagen 		ValCtrlLayoutEntry&					entry,
296*a0795c6fSMarcus Overhagen 		entry_location							from);
297*a0795c6fSMarcus Overhagen 
298*a0795c6fSMarcus Overhagen 	// access child-view ValCtrlLayoutEntry
299*a0795c6fSMarcus Overhagen 	// (indexOf returns index from left)
300*a0795c6fSMarcus Overhagen 	const ValCtrlLayoutEntry& entryAt(
301*a0795c6fSMarcus Overhagen 		uint16											offset) const;
302*a0795c6fSMarcus Overhagen 
303*a0795c6fSMarcus Overhagen 	const ValCtrlLayoutEntry& entryAt(
304*a0795c6fSMarcus Overhagen 		entry_location							from,
305*a0795c6fSMarcus Overhagen 		uint16											distance=0) const;
306*a0795c6fSMarcus Overhagen 
307*a0795c6fSMarcus Overhagen 	uint16 indexOf(
308*a0795c6fSMarcus Overhagen 		BView*											child) const;
309*a0795c6fSMarcus Overhagen 
310*a0795c6fSMarcus Overhagen 	uint16 countEntries() const;
311*a0795c6fSMarcus Overhagen 
312*a0795c6fSMarcus Overhagen private:												// steaming entrails
313*a0795c6fSMarcus Overhagen 
314*a0795c6fSMarcus Overhagen 	// (re-)initialize the backbuffer
315*a0795c6fSMarcus Overhagen 	void _allocBackBuffer(
316*a0795c6fSMarcus Overhagen 		float												width,
317*a0795c6fSMarcus Overhagen 		float												height);
318*a0795c6fSMarcus Overhagen 
319*a0795c6fSMarcus Overhagen 	// insert a layout entry in ordered position (doesn't call
320*a0795c6fSMarcus Overhagen 	// AddChild())
321*a0795c6fSMarcus Overhagen 	void _insertEntry(
322*a0795c6fSMarcus Overhagen 		ValCtrlLayoutEntry&					entry,
323*a0795c6fSMarcus Overhagen 		uint16											index);
324*a0795c6fSMarcus Overhagen 
325*a0795c6fSMarcus Overhagen 	// move given entry horizontally (update child view's position
326*a0795c6fSMarcus Overhagen 	// and size as well, if any)
327*a0795c6fSMarcus Overhagen 	void _slideEntry(
328*a0795c6fSMarcus Overhagen 		int													index,
329*a0795c6fSMarcus Overhagen 		float												delta);
330*a0795c6fSMarcus Overhagen 
331*a0795c6fSMarcus Overhagen 	// turn entry_location/offset into an index:
332*a0795c6fSMarcus Overhagen 	uint16 _locationToIndex(
333*a0795c6fSMarcus Overhagen 		entry_location							from,
334*a0795c6fSMarcus Overhagen 		uint16											distance=0) const;
335*a0795c6fSMarcus Overhagen 
336*a0795c6fSMarcus Overhagen 	void _getDefaultEntrySize(
337*a0795c6fSMarcus Overhagen 		ValCtrlLayoutEntry::entry_type		type,
338*a0795c6fSMarcus Overhagen 		float*											outWidth,
339*a0795c6fSMarcus Overhagen 		float*											outHeight);
340*a0795c6fSMarcus Overhagen 
341*a0795c6fSMarcus Overhagen 	void _invalidateAll();
342*a0795c6fSMarcus Overhagen 
343*a0795c6fSMarcus Overhagen protected:											// impl. members
344*a0795c6fSMarcus Overhagen 
345*a0795c6fSMarcus Overhagen 	// the set of visible segments and other child views,
346*a0795c6fSMarcus Overhagen 	// in left-to-right. top-to-bottom order
347*a0795c6fSMarcus Overhagen 	typedef vector<ValCtrlLayoutEntry>		layout_set;
348*a0795c6fSMarcus Overhagen 	layout_set										m_layoutSet;
349*a0795c6fSMarcus Overhagen 
350*a0795c6fSMarcus Overhagen 	// true if value has been changed since last request
351*a0795c6fSMarcus Overhagen 	// (allows caching of value)
352*a0795c6fSMarcus Overhagen 	bool													m_dirty;
353*a0795c6fSMarcus Overhagen 
354*a0795c6fSMarcus Overhagen 	// when should messages be sent to the target?
355*a0795c6fSMarcus Overhagen 	update_mode										m_updateMode;
356*a0795c6fSMarcus Overhagen 
357*a0795c6fSMarcus Overhagen 	// layout stuff
358*a0795c6fSMarcus Overhagen //	BFont													m_font;
359*a0795c6fSMarcus Overhagen 
360*a0795c6fSMarcus Overhagen 	BFont													m_labelFont;
361*a0795c6fSMarcus Overhagen 	BFont													m_valueFont;
362*a0795c6fSMarcus Overhagen 
363*a0795c6fSMarcus Overhagen 	align_mode										m_alignMode;
364*a0795c6fSMarcus Overhagen 	align_flags										m_alignFlags;
365*a0795c6fSMarcus Overhagen 
366*a0795c6fSMarcus Overhagen 	// the bounds rectangle requested upon construction.
367*a0795c6fSMarcus Overhagen 	// if the ALIGN_GROW flag is set, the real bounds
368*a0795c6fSMarcus Overhagen 	// rectangle may be wider
369*a0795c6fSMarcus Overhagen 	BRect													m_origBounds;
370*a0795c6fSMarcus Overhagen 
371*a0795c6fSMarcus Overhagen 	// backbuffer (made available to segments for flicker-free
372*a0795c6fSMarcus Overhagen 	// drawing)
373*a0795c6fSMarcus Overhagen 	bool													m_haveBackBuffer;
374*a0795c6fSMarcus Overhagen 	BBitmap*											m_backBuffer;
375*a0795c6fSMarcus Overhagen 	BView*												m_backBufferView;
376*a0795c6fSMarcus Overhagen 
377*a0795c6fSMarcus Overhagen 	static const float						s_segmentPadding;
378*a0795c6fSMarcus Overhagen 
379*a0795c6fSMarcus Overhagen 	static const float						s_decimalPointWidth;
380*a0795c6fSMarcus Overhagen 	static const float						s_decimalPointHeight;
381*a0795c6fSMarcus Overhagen 
382*a0795c6fSMarcus Overhagen private:												// guts
383*a0795c6fSMarcus Overhagen 	class fnInitChild;
384*a0795c6fSMarcus Overhagen };
385*a0795c6fSMarcus Overhagen 
386*a0795c6fSMarcus Overhagen __END_CORTEX_NAMESPACE
387*a0795c6fSMarcus Overhagen #endif /* __ValControl_H__ */
388