xref: /haiku/src/apps/cortex/DiagramView/DiagramItem.h (revision 17889a8c70dbb3d59c1412f6431968753c767bab)
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 // DiagramItem.h (Cortex/DiagramView)
33 //
34 // * PURPOSE
35 //   Provides a base class for all items that can be handled
36 //   by the DiagramView implementation. A basic interface with
37 //	 some common implementation is defined, with methods related
38 //   to drawing, mouse handling, selecting, dragging, comparison
39 //   for sorting, and access to the drawing context which is the
40 //   DiagramView instance.
41 //
42 // * HISTORY
43 //   c.lenz		25sep99		Begun
44 //
45 
46 #ifndef __DiagramItem_H__
47 #define __DiagramItem_H__
48 
49 #include <OS.h>
50 #include <InterfaceDefs.h>
51 #include <Region.h>
52 
53 class BMessage;
54 class BView;
55 
56 #include "cortex_defs.h"
57 __BEGIN_CORTEX_NAMESPACE
58 
59 class DiagramItemGroup;
60 class DiagramView;
61 class DiagramBox;
62 
63 int compareSelectionTime(const void *lValue, const void *rValue);
64 
65 class DiagramItem
66 {
67 	friend class DiagramItemGroup;
68 	friend class DiagramView;
69 	friend class DiagramBox;
70 
71 public:					// *** types
72 
73 	enum diagram_item_t {
74 		M_BOX		= 0x1,
75 		M_WIRE		= 0x2,
76 		M_ENDPOINT	= 0x4,
77 		M_ANY		= 0x7
78 	};
79 
80 public:					// *** ctor/dtor
81 
82 						DiagramItem(
83 							uint32 itemType);
84 
85 	virtual				~DiagramItem();
86 
87 public:					// *** accessors
88 
89 	// returns the item type assigned in the ctor
90 	uint32				type() const
91 						{ return m_type; }
92 
93 	// returns pointer to the drawing context of the DiagramView
94 	// object
95 	DiagramView		   *view() const
96 						{ return m_view; }
97 
98 	// returns pointer to the DiagramItemGroup the item belongs to
99 	DiagramItemGroup   *group() const
100 						{ return m_group; }
101 
102 	// returns true if the item is currently selected
103 	bool				isSelected() const
104 						{ return m_selected; }
105 
106 public:					// *** operations
107 
108 	// changes the selection state of the item, and updates the
109 	// m_selectionTime member in the process to ensure proper
110 	// sorting; calls the selected() hook if the state has
111 	// actually changed
112 	void				select();
113 
114 	// sets the item to selected without changing m_selectionTime
115 	// to the time of selection but prior to the last "replacing"
116 	// selection (i.e. thru select()) use this method for additive
117 	// selecting; still calls the selected() hook
118 	void				selectAdding();
119 
120 	// deselects the item; calls the deselected() hook if the
121 	// state has actually changed
122 	void				deselect();
123 
124 	// moves the items frame to a given point by calling MoveBy with the
125 	// absolute coords translated into relative shift amount
126 	void				moveTo(
127 							BPoint point,
128 							BRegion *updateRegion = 0)
129 						{ MoveBy(point.x - Frame().left, point.y - Frame().top, updateRegion); }
130 
131 	// resizes the items frame to given dimensions; simply calls the ResizeBy
132 	// implementation
133 	void				resizeTo(
134 							float width,
135 							float height)
136 						{ ResizeBy(width - Frame().Width(), height - Frame().Height()); }
137 
138 public:					// *** hook functions
139 
140 	// is called when the item has been attached to the DiagramView
141 	// and the view() pointer is valid
142 	virtual void		attachedToDiagram()
143 						{ /* does nothing */ }
144 
145 	// is called just before the item is being detached from the
146 	// the DiagramView
147 	virtual void		detachedFromDiagram()
148 						{ /* does nothing */ }
149 
150 	// is called from the DiagramViews MouseDown() function after
151 	// finding out the mouse buttons and clicks quantity.
152 	virtual void		MouseDown(
153 							BPoint point,
154 							uint32 buttons,
155 							uint32 clicks)
156 						{/* does nothing */}
157 
158 	// is called from the DiagramViews MouseMoved() when *no* message is being
159 	// dragged, i.e. the mouse is simply floating above the item
160 	virtual void		MouseOver(
161 							BPoint point,
162 							uint32 transit)
163 						{/* does nothing */}
164 
165 	// is called from the DiagramViews MouseMoved() when a message is being
166 	// dragged; always call the base class version when overriding!
167 	virtual void		MessageDragged(
168 							BPoint point,
169 							uint32 transit,
170 							const BMessage *message)
171 						{/* does nothing */}
172 
173 	// is called from the DiagramViews MessageReceived() function when an
174 	// message has been received through Drag&Drop; always call the base
175 	// class version when overriding!
176 	virtual void		MessageDropped(
177 							BPoint point,
178 							BMessage *message)
179 						{/* does nothing */}
180 
181 	// is called when the item has been selected or deselected in some way
182 	virtual void		selected()
183 						{ /* does nothing */ }
184 	virtual void		deselected()
185 						{ /* does nothing */ }
186 
187 public:					// *** interface definition
188 
189 	// this function must be implemented by derived classes to return the
190 	// items frame rectangle in the DiagramViews coordinates
191 	virtual BRect		Frame() const = 0;
192 
193 	// this function should be implemented for non-rectangular subclasses
194 	// (like wires) to estimate how close a given point is to the object;
195 	// the default implementation returns 1.0 when the point lies within
196 	// the Frame() rect and 0.0 if not
197 	virtual float		howCloseTo(
198 							BPoint point) const;
199 
200 	// this is the hook function called by DiagramView when it's time to
201 	// Draw the object
202 	virtual void		Draw(
203 							BRect updateRect) = 0;
204 
205 	// should move the items frame by the specified amount and do the
206 	// necessary drawing instructions to update the display; if the
207 	// caller supplied a BRegion pointer in updateRegion, this method
208 	// should add other areas affected by the move to it (e.g. wire
209 	// frames)
210 	virtual void		MoveBy(
211 							float x,
212 							float y,
213 							BRegion *updateRegion = 0)
214 						{ /* does nothing */ }
215 
216 	// should resize the items frame by the specified amount
217 	virtual void		ResizeBy(
218 							float horizontal,
219 							float vertical)
220 						{ /* does nothing */ }
221 
222 protected:				// *** selecting/dragging
223 
224 	// turn on/off the built-in selection handling
225 	void				makeSelectable(
226 							bool selectable)
227 							{ m_selectable = selectable; }
228 	bool				isSelectable() const
229 							{ return m_selectable; }
230 
231 	// turn on/off the built-in drag & drop handling
232 	void				makeDraggable(
233 							bool draggable)
234 							{ m_draggable = draggable; }
235 	bool				isDraggable() const
236 							{ return m_draggable; }
237 
238 protected:				// *** compare functions
239 
240 	// compares the time when each item was last selected and
241 	// returns -1 for the most recent.
242 	friend int			compareSelectionTime(
243 							const void *lValue,
244 							const void *rValue);
245 
246 protected:				// *** internal methods
247 
248 	// called only by DiagramItemGroup objects in the method
249 	// addItem()
250 	virtual void		_SetOwner(
251 							DiagramView *owner)
252 						{ m_view = owner; }
253 
254 private:				// *** data members
255 
256 	// the items type (M_BOX, M_WIRE or M_ENDPOINT)
257 	uint32				m_type;
258 
259 	// a pointer to the drawing context (the DiagramView instance)
260 	DiagramView		   *m_view;
261 
262 	// a pointer to the DiagramItemGroup the item belongs to
263 	DiagramItemGroup   *m_group;
264 
265 	// can the object be dragged
266 	bool				m_draggable;
267 
268 	// can the object be selected
269 	bool				m_selectable;
270 
271 	// is the object currently selected
272 	bool				m_selected;
273 
274 	// when was the object selected the last time or added (used
275 	// for drawing order)
276 	bigtime_t			m_selectionTime;
277 
278 	// stores the most recent time a item was selected thru
279 	// the select() method
280 	static bigtime_t	m_lastSelectionTime;
281 
282 	// counts the number of selections thru selectAdding()
283 	// since the last call to select()
284 	static int32		m_countSelected;
285 };
286 
287 __END_CORTEX_NAMESPACE
288 #endif /* __DiagramItem_H__ */
289