xref: /haiku/src/apps/cortex/ValControl/ValControlSegment.h (revision f2b4344867e97c3f4e742a1b4a15e6879644601a)
1 /*
2  * Copyright (c) 1999-2000, Eric Moon.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions, and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions, and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. The name of the author may not be used to endorse or promote products
17  *    derived from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 
32 // ValControlSegment.h
33 // +++++ cortex integration 23aug99:
34 //       - allow adjustment of dragScaleFactor
35 //
36 // e.moon 17jan99
37 //
38 // ABSTRACT CLASS: ValControlSegment
39 // Represents a single manipulable (manipulatable?) segment of
40 // a ValControl interface element.
41 //
42 // CLASS: ValControlDigitSegment
43 // Extends ValControlSegment to provide a single or multi-digit
44 // numeric segment.
45 //
46 // CLASS: ValControlStringSegment
47 // Extends ValControlSegment to provide a string-selection
48 // segment.  [+++++ driven by BMenu?]
49 #ifndef VAL_CONTROL_SEGMENT_H
50 #define VAL_CONTROL_SEGMENT_H
51 
52 
53 #include <View.h>
54 
55 // possibly 'fed' by a BMenu?
56 class BMenu;
57 
58 #include "cortex_defs.h"
59 __BEGIN_CORTEX_NAMESPACE
60 
61 // forward declarations
62 class ValControl;
63 class ValCtrlLayoutEntry;
64 
65 // ---------------------------------------------------------------- //
66 // +++++ base 'manipulatable segment' class
67 
68 // Might have some functionality:
69 // - underline (overridable)
70 // - chaining: segments need to inform segments to their left
71 //             when they 'roll around', using the M_INCREMENT and
72 //             M_DECREMENT messages.
73 
74 class ValControlSegment : public BView {
75 	public:
76 		typedef BView _Inherited;
77 
78 		friend class ValControl;
79 
80 	public:
81 
82 		enum underline_style {
83 			NO_UNDERLINE,
84 			DOTTED_UNDERLINE,
85 			SOLID_UNDERLINE
86 		};
87 
88 		// mouse-tracking
89 		enum track_flags {
90 			TRACK_HORIZONTAL = 1,
91 			TRACK_VERTICAL = 2
92 		};
93 
94 	protected:											// pure virtuals
95 		// fetch layout entry (called by ValControl)
96 		virtual ValCtrlLayoutEntry makeLayoutEntry() = 0;
97 
98 	public:													// hooks
99 
100 		// * mouse-tracking callbacks
101 
102 		// do any font-related layout work
103 		virtual void fontChanged(const BFont* font) {}
104 
105 		// return 'unused pixels' (if value updates are triggered
106 		// at less than one per pixel)
107 		virtual float handleDragUpdate(float distance) { return 0; }
108 
109 		virtual void mouseReleased() {}
110 
111 		// underline size (tweak if you must)
112 		// +++++ 18sep99: 'ewww.'
113 		virtual void sizeUnderline(float* outLeft, float* outRight);
114 
115 	public:
116 		virtual ~ValControlSegment();
117 
118 	protected: // ctor/internal operations
119 		ValControlSegment(underline_style underlineStyle);
120 
121 		// get parent
122 		ValControl* parent() const;
123 
124 		// init mouse tracking: must be called from MouseDown()
125 		void trackMouse(BPoint point, track_flags flags);
126 
127 		void setTracking(bool tracking);
128 		bool isTracking() const;
129 
130 		// fetch pixel:unit ratio for dragging
131 		double dragScaleFactor() const;
132 
133 	public:// BView impl.
134 		// calls sizeUnderline()
135 		virtual void AttachedToWindow();
136 
137 		virtual void Draw(BRect updateRect);
138 
139 		// calls sizeUnderline() after bounds changed
140 		virtual void FrameResized(float width, float height);
141 
142 		// calls trackMouse(TRACK_VERTICAL) if left button down
143 		virtual void MouseDown(BPoint point);
144 
145 		// feeds trackUpdate()
146 		virtual void MouseMoved(BPoint point, uint32 transit,
147 			const BMessage* dragMessage);
148 
149 		// triggers mouseReleased()
150 		virtual void MouseUp(BPoint point);
151 
152 	public:
153 		virtual void MessageReceived(BMessage* message); //nyi
154 
155 	public:
156 		ValControlSegment(BMessage* archive);
157 		virtual status_t Archive(BMessage* archive, bool deep = true) const;
158 
159 	private:
160 		void _Init();
161 
162 		// left segment (ValControl)
163 		// ValControlSegment*		m_pLeft;
164 
165 		// mouse-tracking machinery
166 		track_flags				fTrackFlags;
167 		bool					fTracking;
168 		BPoint					fPrevPoint;
169 		double					fDragScaleFactor;
170 
171 		bigtime_t				fLastClickTime;
172 
173 		// look'n'feel parameters
174 		underline_style			fUnderlineStyle;
175 		float					fXUnderlineLeft;
176 		float					fXUnderlineRight;
177 
178 		// constants
179 		static const double		fDefDragScaleFactor;
180 };
181 
182 __END_CORTEX_NAMESPACE
183 #endif	// VAL_CONTROL_SEGMENT_H
184