xref: /haiku/src/apps/cortex/MediaRoutingView/MediaNodePanel.cpp (revision 5680c33e4801511fcff87f56174d2afd663b0f0b)
1a0795c6fSMarcus Overhagen // MediaNodePanel.cpp
2a0795c6fSMarcus Overhagen // c.lenz 10oct99
3a0795c6fSMarcus Overhagen 
4a0795c6fSMarcus Overhagen #include "MediaNodePanel.h"
5a0795c6fSMarcus Overhagen // InfoWindow
6a0795c6fSMarcus Overhagen #include "InfoWindowManager.h"
7a0795c6fSMarcus Overhagen // MediaRoutingView
8a0795c6fSMarcus Overhagen #include "MediaRoutingView.h"
9a0795c6fSMarcus Overhagen #include "MediaWire.h"
10a0795c6fSMarcus Overhagen #include "RouteAppNodeManager.h"
11a0795c6fSMarcus Overhagen // NodeManager
12a0795c6fSMarcus Overhagen #include "NodeRef.h"
13a0795c6fSMarcus Overhagen #include "NodeGroup.h"
14a0795c6fSMarcus Overhagen // ParameterWindow
15a0795c6fSMarcus Overhagen #include "ParameterWindow.h"
16a0795c6fSMarcus Overhagen // Support
17a0795c6fSMarcus Overhagen #include "cortex_ui.h"
18a0795c6fSMarcus Overhagen #include "MediaIcon.h"
19a0795c6fSMarcus Overhagen #include "MediaString.h"
20a0795c6fSMarcus Overhagen // RouteApp
21a0795c6fSMarcus Overhagen #include "RouteWindow.h"
22a0795c6fSMarcus Overhagen // TipManager
23a0795c6fSMarcus Overhagen #include "TipManager.h"
24a0795c6fSMarcus Overhagen 
25a0795c6fSMarcus Overhagen // App Kit
26a0795c6fSMarcus Overhagen #include <Application.h>
27a0795c6fSMarcus Overhagen #include <Roster.h>
28a0795c6fSMarcus Overhagen // Interface Kit
29a0795c6fSMarcus Overhagen #include <MenuItem.h>
30a0795c6fSMarcus Overhagen #include <PopUpMenu.h>
31a0795c6fSMarcus Overhagen // Media Kit
32a0795c6fSMarcus Overhagen #include <MediaDefs.h>
33a0795c6fSMarcus Overhagen #include <MediaRoster.h>
34a0795c6fSMarcus Overhagen 
3523e67806SIthamar R. Adema using namespace std;
3623e67806SIthamar R. Adema 
37a0795c6fSMarcus Overhagen __USE_CORTEX_NAMESPACE
38a0795c6fSMarcus Overhagen 
39a0795c6fSMarcus Overhagen #include <Debug.h>
40a0795c6fSMarcus Overhagen #define D_METHOD(x) //PRINT (x)
41a0795c6fSMarcus Overhagen #define D_MESSAGE(x) //PRINT (x)
42a0795c6fSMarcus Overhagen #define D_DRAW(x) //PRINT (x)
43a0795c6fSMarcus Overhagen 
44a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
45a0795c6fSMarcus Overhagen // constants
46a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
47a0795c6fSMarcus Overhagen 
48a0795c6fSMarcus Overhagen float	MediaNodePanel::M_DEFAULT_WIDTH		= 90.0;
49a0795c6fSMarcus Overhagen float	MediaNodePanel::M_DEFAULT_HEIGHT	= 60.0;
50a0795c6fSMarcus Overhagen float	MediaNodePanel::M_LABEL_H_MARGIN	= 3.0;
51a0795c6fSMarcus Overhagen float	MediaNodePanel::M_LABEL_V_MARGIN	= 3.0;
52a0795c6fSMarcus Overhagen float	MediaNodePanel::M_BODY_H_MARGIN		= 5.0;
53a0795c6fSMarcus Overhagen float	MediaNodePanel::M_BODY_V_MARGIN		= 5.0;
54a0795c6fSMarcus Overhagen 
55a0795c6fSMarcus Overhagen // [e.moon 7dec99]
56a0795c6fSMarcus Overhagen const BPoint MediaNodePanel::s_invalidPosition(-200.0, -200.0);
57a0795c6fSMarcus Overhagen 
58a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
59a0795c6fSMarcus Overhagen // *** ctor/dtor
60a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
61a0795c6fSMarcus Overhagen 
62a0795c6fSMarcus Overhagen MediaNodePanel::MediaNodePanel(
63a0795c6fSMarcus Overhagen 	BPoint position,
64a0795c6fSMarcus Overhagen 	NodeRef *nodeRef)
65a0795c6fSMarcus Overhagen 	: DiagramBox(BRect(position, position + BPoint(M_DEFAULT_WIDTH, M_DEFAULT_HEIGHT))),
66a0795c6fSMarcus Overhagen 	  BHandler(nodeRef->name()),
67a0795c6fSMarcus Overhagen 	  ref(nodeRef),
68a0795c6fSMarcus Overhagen 	  m_bitmap(0),
69a0795c6fSMarcus Overhagen 	  m_icon(0),
70a0795c6fSMarcus Overhagen 	  m_alternatePosition(s_invalidPosition)
71a0795c6fSMarcus Overhagen {
72a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::MediaNodePanel()\n"));
73a0795c6fSMarcus Overhagen 	ASSERT(ref);
74a0795c6fSMarcus Overhagen }
75a0795c6fSMarcus Overhagen 
76a0795c6fSMarcus Overhagen MediaNodePanel::~MediaNodePanel()
77a0795c6fSMarcus Overhagen {
78a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::~MediaNodePanel()\n"));
79a0795c6fSMarcus Overhagen 	if (m_icon)
80a0795c6fSMarcus Overhagen 	{
81a0795c6fSMarcus Overhagen 		delete m_icon;
82a0795c6fSMarcus Overhagen 	}
83a0795c6fSMarcus Overhagen 	if (m_bitmap)
84a0795c6fSMarcus Overhagen 	{
85a0795c6fSMarcus Overhagen 		delete m_bitmap;
86a0795c6fSMarcus Overhagen 	}
87a0795c6fSMarcus Overhagen }
88a0795c6fSMarcus Overhagen 
89a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
90a0795c6fSMarcus Overhagen // *** derived from DiagramBox
91a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
92a0795c6fSMarcus Overhagen 
93a0795c6fSMarcus Overhagen void MediaNodePanel::attachedToDiagram()
94a0795c6fSMarcus Overhagen {
95a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::attachedToDiagram()\n"));
96a0795c6fSMarcus Overhagen 
97a0795c6fSMarcus Overhagen 	resizeTo(M_DEFAULT_WIDTH, M_DEFAULT_HEIGHT);
98a0795c6fSMarcus Overhagen 	_updateIcon(dynamic_cast<MediaRoutingView *>(view())->getLayout());
99a0795c6fSMarcus Overhagen 	_prepareLabel();
100a0795c6fSMarcus Overhagen 	populateInit();
101a0795c6fSMarcus Overhagen 	arrangeIOJacks();
102a0795c6fSMarcus Overhagen 
103a0795c6fSMarcus Overhagen 	view()->Looper()->AddHandler(this);
104a0795c6fSMarcus Overhagen }
105a0795c6fSMarcus Overhagen 
106a0795c6fSMarcus Overhagen void MediaNodePanel::detachedFromDiagram()
107a0795c6fSMarcus Overhagen {
108a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::detachedFromDiagram()\n"));
109a0795c6fSMarcus Overhagen 
110*5680c33eSIngo Weinhold 	BRect labelRect = m_labelRect.OffsetByCopy(Frame().LeftTop());
111a0795c6fSMarcus Overhagen 	if (m_mouseOverLabel && m_labelTruncated)
112a0795c6fSMarcus Overhagen 	{
113a0795c6fSMarcus Overhagen 		TipManager *tips = TipManager::Instance();
114a0795c6fSMarcus Overhagen 		tips->hideTip(view()->ConvertToScreen(labelRect));
115a0795c6fSMarcus Overhagen 	}
116a0795c6fSMarcus Overhagen 
117a0795c6fSMarcus Overhagen 	view()->Looper()->RemoveHandler(this);
118a0795c6fSMarcus Overhagen }
119a0795c6fSMarcus Overhagen 
120*5680c33eSIngo Weinhold void MediaNodePanel::DrawBox()
121a0795c6fSMarcus Overhagen {
122*5680c33eSIngo Weinhold 	D_DRAW(("MediaNodePanel::DrawBox()\n"));
123a0795c6fSMarcus Overhagen 	if (m_bitmap)
124a0795c6fSMarcus Overhagen 	{
125*5680c33eSIngo Weinhold 		view()->DrawBitmap(m_bitmap, Frame().LeftTop());
126a0795c6fSMarcus Overhagen 	}
127a0795c6fSMarcus Overhagen }
128a0795c6fSMarcus Overhagen 
129*5680c33eSIngo Weinhold void MediaNodePanel::MouseDown(
130a0795c6fSMarcus Overhagen 	BPoint point,
131a0795c6fSMarcus Overhagen 	uint32 buttons,
132a0795c6fSMarcus Overhagen 	uint32 clicks)
133a0795c6fSMarcus Overhagen {
134*5680c33eSIngo Weinhold 	D_METHOD(("MediaNodePanel::MouseDown()\n"));
135a0795c6fSMarcus Overhagen 
136*5680c33eSIngo Weinhold 	_inherited::MouseDown(point, buttons, clicks);
137a0795c6fSMarcus Overhagen 
138a0795c6fSMarcus Overhagen 	// +++ REALLY BAD WORKAROUND
139595c89bcSAxel Dörfler 	MediaJack *jack = dynamic_cast<MediaJack *>(_LastItemUnder());
140*5680c33eSIngo Weinhold 	if (jack && jack->Frame().Contains(point))
141a0795c6fSMarcus Overhagen 	{
142a0795c6fSMarcus Overhagen 		return;
143a0795c6fSMarcus Overhagen 	}
144a0795c6fSMarcus Overhagen 
145a0795c6fSMarcus Overhagen 	switch (buttons) {
146a0795c6fSMarcus Overhagen 		case B_PRIMARY_MOUSE_BUTTON:
147a0795c6fSMarcus Overhagen 		{
148a0795c6fSMarcus Overhagen 			if (clicks == 2) {
149a0795c6fSMarcus Overhagen 				if (ref->kind() & B_CONTROLLABLE) {
150a0795c6fSMarcus Overhagen 					BMessage message(MediaRoutingView::M_NODE_TWEAK_PARAMETERS);
151a0795c6fSMarcus Overhagen 					DiagramView* v = view();
152a0795c6fSMarcus Overhagen 					BMessenger(v).SendMessage(&message);
153a0795c6fSMarcus Overhagen 				}
154a0795c6fSMarcus Overhagen 			}
155a0795c6fSMarcus Overhagen 			break;
156a0795c6fSMarcus Overhagen 		}
157a0795c6fSMarcus Overhagen 		case B_SECONDARY_MOUSE_BUTTON:
158a0795c6fSMarcus Overhagen 		{
159a0795c6fSMarcus Overhagen 			if (clicks == 1) {
160a0795c6fSMarcus Overhagen 				showContextMenu(point);
161a0795c6fSMarcus Overhagen 			}
162a0795c6fSMarcus Overhagen 			break;
163a0795c6fSMarcus Overhagen 		}
164a0795c6fSMarcus Overhagen 	}
165a0795c6fSMarcus Overhagen }
166a0795c6fSMarcus Overhagen 
167*5680c33eSIngo Weinhold void MediaNodePanel::MouseOver(
168a0795c6fSMarcus Overhagen 	BPoint point,
169a0795c6fSMarcus Overhagen 	uint32 transit)
170a0795c6fSMarcus Overhagen {
171*5680c33eSIngo Weinhold 	D_METHOD(("MediaNodePanel::MouseOver()\n"));
172*5680c33eSIngo Weinhold 	_inherited::MouseOver(point, transit);
173a0795c6fSMarcus Overhagen 
174a0795c6fSMarcus Overhagen 	switch (transit)
175a0795c6fSMarcus Overhagen 	{
176a0795c6fSMarcus Overhagen 		case B_ENTERED_VIEW:
177a0795c6fSMarcus Overhagen 		{
178a0795c6fSMarcus Overhagen 			break;
179a0795c6fSMarcus Overhagen 		}
180a0795c6fSMarcus Overhagen 		case B_INSIDE_VIEW:
181a0795c6fSMarcus Overhagen 		{
182*5680c33eSIngo Weinhold 			BRect labelRect = m_labelRect.OffsetByCopy(Frame().LeftTop());
183a0795c6fSMarcus Overhagen 			if (labelRect.Contains(point))
184a0795c6fSMarcus Overhagen 			{
185a0795c6fSMarcus Overhagen 				if (!m_mouseOverLabel && m_labelTruncated)
186a0795c6fSMarcus Overhagen 				{
187a0795c6fSMarcus Overhagen 					TipManager *tips = TipManager::Instance();
188a0795c6fSMarcus Overhagen 					tips->showTip(m_fullLabel.String(), view()->ConvertToScreen(labelRect));
189a0795c6fSMarcus Overhagen 					m_mouseOverLabel = true;
190a0795c6fSMarcus Overhagen 				}
191a0795c6fSMarcus Overhagen 			}
192a0795c6fSMarcus Overhagen 			else
193a0795c6fSMarcus Overhagen 			{
194a0795c6fSMarcus Overhagen 				m_mouseOverLabel = false;
195a0795c6fSMarcus Overhagen 			}
196a0795c6fSMarcus Overhagen 			break;
197a0795c6fSMarcus Overhagen 		}
198a0795c6fSMarcus Overhagen 		case B_EXITED_VIEW:
199a0795c6fSMarcus Overhagen 		{
200a0795c6fSMarcus Overhagen 			m_mouseOverLabel = false;
201a0795c6fSMarcus Overhagen 			break;
202a0795c6fSMarcus Overhagen 		}
203a0795c6fSMarcus Overhagen 	}
204a0795c6fSMarcus Overhagen }
205a0795c6fSMarcus Overhagen 
206*5680c33eSIngo Weinhold void MediaNodePanel::MessageDropped(
207a0795c6fSMarcus Overhagen 	BPoint point,
208a0795c6fSMarcus Overhagen 	BMessage *message)
209a0795c6fSMarcus Overhagen {
210*5680c33eSIngo Weinhold 	D_METHOD(("MediaNodePanel::MessageDropped()\n"));
211a0795c6fSMarcus Overhagen 
212a0795c6fSMarcus Overhagen 	// +++ REALLY BAD WORKAROUND
213595c89bcSAxel Dörfler 	MediaJack *jack = dynamic_cast<MediaJack *>(ItemUnder(point));
214a0795c6fSMarcus Overhagen 	if (jack)
215a0795c6fSMarcus Overhagen 	{
216*5680c33eSIngo Weinhold 		jack->MessageDropped(point, message);
217a0795c6fSMarcus Overhagen 		return;
218a0795c6fSMarcus Overhagen 	}
219a0795c6fSMarcus Overhagen 	else
220a0795c6fSMarcus Overhagen 	{
221a0795c6fSMarcus Overhagen 		be_app->SetCursor(B_HAND_CURSOR);
222a0795c6fSMarcus Overhagen 	}
223a0795c6fSMarcus Overhagen }
224a0795c6fSMarcus Overhagen 
225a0795c6fSMarcus Overhagen void MediaNodePanel::selected()
226a0795c6fSMarcus Overhagen {
227a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::selected()\n"));
228a0795c6fSMarcus Overhagen 	_updateBitmap();
229a0795c6fSMarcus Overhagen }
230a0795c6fSMarcus Overhagen 
231a0795c6fSMarcus Overhagen void MediaNodePanel::deselected()
232a0795c6fSMarcus Overhagen {
233a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::deselected()\n"));
234a0795c6fSMarcus Overhagen 	_updateBitmap();
235a0795c6fSMarcus Overhagen }
236a0795c6fSMarcus Overhagen 
237a0795c6fSMarcus Overhagen // ---------------------------------------------------------------- //
238a0795c6fSMarcus Overhagen // *** updating
239a0795c6fSMarcus Overhagen // ---------------------------------------------------------------- //
240a0795c6fSMarcus Overhagen 
241a0795c6fSMarcus Overhagen void MediaNodePanel::layoutChanged(
242a0795c6fSMarcus Overhagen 	int32 layout)
243a0795c6fSMarcus Overhagen {
244a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::layoutChanged()\n"));
245a0795c6fSMarcus Overhagen 
246*5680c33eSIngo Weinhold 	BPoint p = Frame().LeftTop();
247a0795c6fSMarcus Overhagen 	if (m_alternatePosition == s_invalidPosition)
248a0795c6fSMarcus Overhagen 	{
249a0795c6fSMarcus Overhagen 		m_alternatePosition = dynamic_cast<MediaRoutingView *>
250a0795c6fSMarcus Overhagen 							  (view())->findFreePositionFor(this);
251a0795c6fSMarcus Overhagen 	}
252a0795c6fSMarcus Overhagen 	moveTo(m_alternatePosition);
253a0795c6fSMarcus Overhagen 	m_alternatePosition = p;
254a0795c6fSMarcus Overhagen 
255a0795c6fSMarcus Overhagen 	resizeTo(M_DEFAULT_WIDTH, M_DEFAULT_HEIGHT);
256595c89bcSAxel Dörfler 	for (uint32 i = 0; i < CountItems(); i++)
257a0795c6fSMarcus Overhagen 	{
258595c89bcSAxel Dörfler 		MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
259a0795c6fSMarcus Overhagen 		jack->layoutChanged(layout);
260a0795c6fSMarcus Overhagen 	}
261a0795c6fSMarcus Overhagen 	_updateIcon(layout);
262a0795c6fSMarcus Overhagen 	_prepareLabel();
263a0795c6fSMarcus Overhagen 	arrangeIOJacks();
264a0795c6fSMarcus Overhagen 	_updateBitmap();
265a0795c6fSMarcus Overhagen }
266a0795c6fSMarcus Overhagen 
267a0795c6fSMarcus Overhagen void MediaNodePanel::populateInit()
268a0795c6fSMarcus Overhagen {
269a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::populateInit()\n"));
270a0795c6fSMarcus Overhagen 	if (ref->kind() & B_BUFFER_CONSUMER)
271a0795c6fSMarcus Overhagen 	{
272a0795c6fSMarcus Overhagen 		vector<media_input> freeInputs;
273a0795c6fSMarcus Overhagen 		ref->getFreeInputs(freeInputs);
274a0795c6fSMarcus Overhagen 		for (uint32 i = 0; i < freeInputs.size(); i++)
275a0795c6fSMarcus Overhagen 		{
276595c89bcSAxel Dörfler 			AddItem(new MediaJack(freeInputs[i]));
277a0795c6fSMarcus Overhagen 		}
278a0795c6fSMarcus Overhagen 	}
279a0795c6fSMarcus Overhagen 	if (ref->kind() & B_BUFFER_PRODUCER)
280a0795c6fSMarcus Overhagen 	{
281a0795c6fSMarcus Overhagen 		vector<media_output> freeOutputs;
282a0795c6fSMarcus Overhagen 		ref->getFreeOutputs(freeOutputs);
283a0795c6fSMarcus Overhagen 		for (uint32 i = 0; i < freeOutputs.size(); i++)
284a0795c6fSMarcus Overhagen 		{
285595c89bcSAxel Dörfler 			AddItem(new MediaJack(freeOutputs[i]));
286a0795c6fSMarcus Overhagen 		}
287a0795c6fSMarcus Overhagen 	}
288a0795c6fSMarcus Overhagen }
289a0795c6fSMarcus Overhagen 
290a0795c6fSMarcus Overhagen void MediaNodePanel::updateIOJacks()
291a0795c6fSMarcus Overhagen {
292a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::updateIOJacks()\n"));
293a0795c6fSMarcus Overhagen 
294a0795c6fSMarcus Overhagen 	// remove all free inputs/outputs, they may be outdated
295595c89bcSAxel Dörfler 	for (uint32 i = 0; i < CountItems(); i++)
296a0795c6fSMarcus Overhagen 	{
297595c89bcSAxel Dörfler 		MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
298a0795c6fSMarcus Overhagen 		if (jack && !jack->isConnected())
299a0795c6fSMarcus Overhagen 		{
300595c89bcSAxel Dörfler 			RemoveItem(jack);
301a0795c6fSMarcus Overhagen 			delete jack;
302a0795c6fSMarcus Overhagen 			i--; // account for reindexing in the BList
303a0795c6fSMarcus Overhagen 		}
304a0795c6fSMarcus Overhagen 	}
305a0795c6fSMarcus Overhagen 
306a0795c6fSMarcus Overhagen 	// add free inputs
307a0795c6fSMarcus Overhagen 	if (ref->kind() & B_BUFFER_CONSUMER)
308a0795c6fSMarcus Overhagen 	{
309a0795c6fSMarcus Overhagen 		vector<media_input> freeInputs;
310a0795c6fSMarcus Overhagen 		ref->getFreeInputs(freeInputs);
311a0795c6fSMarcus Overhagen 		for (uint32 i = 0; i < freeInputs.size(); i++)
312a0795c6fSMarcus Overhagen 		{
313a0795c6fSMarcus Overhagen 			MediaJack *jack;
314595c89bcSAxel Dörfler 			AddItem(jack = new MediaJack(freeInputs[i]));
315a0795c6fSMarcus Overhagen 		}
316a0795c6fSMarcus Overhagen 	}
317a0795c6fSMarcus Overhagen 
318a0795c6fSMarcus Overhagen 	// add free outputs
319a0795c6fSMarcus Overhagen 	if (ref->kind() & B_BUFFER_PRODUCER)
320a0795c6fSMarcus Overhagen 	{
321a0795c6fSMarcus Overhagen 		vector<media_output> freeOutputs;
322a0795c6fSMarcus Overhagen 		ref->getFreeOutputs(freeOutputs);
323a0795c6fSMarcus Overhagen 		for (uint32 i = 0; i < freeOutputs.size(); i++)
324a0795c6fSMarcus Overhagen 		{
325a0795c6fSMarcus Overhagen 			MediaJack *jack;
326595c89bcSAxel Dörfler 			AddItem(jack = new MediaJack(freeOutputs[i]));
327a0795c6fSMarcus Overhagen 		}
328a0795c6fSMarcus Overhagen 	}
329a0795c6fSMarcus Overhagen 
330a0795c6fSMarcus Overhagen 	// the supported media types might have changed -> this could
331a0795c6fSMarcus Overhagen 	// require changing the icon
332a0795c6fSMarcus Overhagen 	_updateIcon(dynamic_cast<MediaRoutingView *>(view())->getLayout());
333a0795c6fSMarcus Overhagen }
334a0795c6fSMarcus Overhagen 
335a0795c6fSMarcus Overhagen void MediaNodePanel::arrangeIOJacks()
336a0795c6fSMarcus Overhagen {
337a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::arrangeIOJacks()\n"));
338595c89bcSAxel Dörfler 	SortItems(DiagramItem::M_ENDPOINT, &compareTypeAndID);
339a0795c6fSMarcus Overhagen 
340a0795c6fSMarcus Overhagen 	switch (dynamic_cast<MediaRoutingView *>(view())->getLayout())
341a0795c6fSMarcus Overhagen 	{
342a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_ICON_VIEW:
343a0795c6fSMarcus Overhagen 		{
344a0795c6fSMarcus Overhagen 			BRegion updateRegion;
345a0795c6fSMarcus Overhagen 			float align = 1.0;
346595c89bcSAxel Dörfler 			view()->GetItemAlignment(0, &align);
347a0795c6fSMarcus Overhagen 
348a0795c6fSMarcus Overhagen 			// adjust this panel's size
349a0795c6fSMarcus Overhagen 			int32 numInputs = 0, numOutputs = 0;
350595c89bcSAxel Dörfler 			for (uint32 i = 0; i < CountItems(); i++)
351a0795c6fSMarcus Overhagen 			{
352595c89bcSAxel Dörfler 				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
353a0795c6fSMarcus Overhagen 				if (jack)
354a0795c6fSMarcus Overhagen 				{
355a0795c6fSMarcus Overhagen 					if (jack->isInput())
356a0795c6fSMarcus Overhagen 					{
357a0795c6fSMarcus Overhagen 						numInputs++;
358a0795c6fSMarcus Overhagen 					}
359a0795c6fSMarcus Overhagen 					if (jack->isOutput())
360a0795c6fSMarcus Overhagen 					{
361a0795c6fSMarcus Overhagen 						numOutputs++;
362a0795c6fSMarcus Overhagen 					}
363a0795c6fSMarcus Overhagen 				}
364a0795c6fSMarcus Overhagen 			}
365a0795c6fSMarcus Overhagen 			float minHeight = MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP;
366a0795c6fSMarcus Overhagen 			minHeight *= numInputs > numOutputs ? numInputs : numOutputs;
367a0795c6fSMarcus Overhagen 			minHeight += m_labelRect.Height();
368a0795c6fSMarcus Overhagen 			minHeight += 2 * MediaJack::M_DEFAULT_GAP;
369a0795c6fSMarcus Overhagen 			minHeight = ((int)minHeight / (int)align) * align + align;
370*5680c33eSIngo Weinhold 			if ((Frame().Height() < minHeight)
371*5680c33eSIngo Weinhold 			 || ((Frame().Height() > minHeight)
372a0795c6fSMarcus Overhagen 			 && (minHeight >= MediaNodePanel::M_DEFAULT_HEIGHT)))
373a0795c6fSMarcus Overhagen 			{
374*5680c33eSIngo Weinhold 				updateRegion.Include(Frame());
375*5680c33eSIngo Weinhold 				resizeTo(Frame().Width(), minHeight);
376*5680c33eSIngo Weinhold 				updateRegion.Include(Frame());
377a0795c6fSMarcus Overhagen 				_prepareLabel();
378a0795c6fSMarcus Overhagen 			}
379a0795c6fSMarcus Overhagen 
380a0795c6fSMarcus Overhagen 			// adjust the placement of the jacks
381a0795c6fSMarcus Overhagen 			BRect r = m_bodyRect;
382a0795c6fSMarcus Overhagen 			r.bottom -= M_BODY_V_MARGIN;
383a0795c6fSMarcus Overhagen 			float inputOffset = 0.0, outputOffset = 0.0;
384*5680c33eSIngo Weinhold 			float center = Frame().top + r.top + (r.Height() / 2.0);
385a0795c6fSMarcus Overhagen 			center += MediaJack::M_DEFAULT_GAP - (MediaJack::M_DEFAULT_HEIGHT / 2.0);
386a0795c6fSMarcus Overhagen 			center = ((int)center / (int)align) * align;
387a0795c6fSMarcus Overhagen 			if (numInputs)
388a0795c6fSMarcus Overhagen 			{
389a0795c6fSMarcus Overhagen 				if (numInputs % 2) // odd number of inputs
390a0795c6fSMarcus Overhagen 				{
391a0795c6fSMarcus Overhagen 					inputOffset = center - (numInputs / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
392a0795c6fSMarcus Overhagen 				}
393a0795c6fSMarcus Overhagen 				else // even number of inputs
394a0795c6fSMarcus Overhagen 				{
395a0795c6fSMarcus Overhagen 					inputOffset = center - ((numInputs + 1) / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
396a0795c6fSMarcus Overhagen 				}
397a0795c6fSMarcus Overhagen 			}
398a0795c6fSMarcus Overhagen 			if (numOutputs)
399a0795c6fSMarcus Overhagen 			{
400a0795c6fSMarcus Overhagen 				if (numOutputs % 2) // odd number of outputs
401a0795c6fSMarcus Overhagen 				{
402a0795c6fSMarcus Overhagen 					outputOffset = center - (numOutputs / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
403a0795c6fSMarcus Overhagen 				}
404a0795c6fSMarcus Overhagen 				else // even number of outputs
405a0795c6fSMarcus Overhagen 				{
406a0795c6fSMarcus Overhagen 					outputOffset = center - ((numOutputs + 1) / 2) * (MediaJack::M_DEFAULT_HEIGHT + MediaJack::M_DEFAULT_GAP);
407a0795c6fSMarcus Overhagen 				}
408a0795c6fSMarcus Overhagen 			}
409595c89bcSAxel Dörfler 			for (uint32 i = 0; i < CountItems(); i++)
410a0795c6fSMarcus Overhagen 			{
411595c89bcSAxel Dörfler 				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
412a0795c6fSMarcus Overhagen 				if (jack)
413a0795c6fSMarcus Overhagen 				{
414a0795c6fSMarcus Overhagen 					if (jack->isInput())
415a0795c6fSMarcus Overhagen 					{
416*5680c33eSIngo Weinhold 						jack->setPosition(inputOffset, Frame().left, Frame().right, &updateRegion);
417*5680c33eSIngo Weinhold 						inputOffset += jack->Frame().Height() + MediaJack::M_DEFAULT_GAP;
418a0795c6fSMarcus Overhagen 					}
419a0795c6fSMarcus Overhagen 					if (jack->isOutput())
420a0795c6fSMarcus Overhagen 					{
421*5680c33eSIngo Weinhold 						jack->setPosition(outputOffset, Frame().left, Frame().right, &updateRegion);
422*5680c33eSIngo Weinhold 						outputOffset += jack->Frame().Height() + MediaJack::M_DEFAULT_GAP;
423a0795c6fSMarcus Overhagen 					}
424a0795c6fSMarcus Overhagen 				}
425a0795c6fSMarcus Overhagen 			}
426a0795c6fSMarcus Overhagen 			for (int32 i = 0; i < updateRegion.CountRects(); i++)
427a0795c6fSMarcus Overhagen 			{
428a0795c6fSMarcus Overhagen 				view()->Invalidate(updateRegion.RectAt(i));
429a0795c6fSMarcus Overhagen 			}
430a0795c6fSMarcus Overhagen 			break;
431a0795c6fSMarcus Overhagen 		}
432a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_MINI_ICON_VIEW:
433a0795c6fSMarcus Overhagen 		{
434a0795c6fSMarcus Overhagen 			BRegion updateRegion;
435a0795c6fSMarcus Overhagen 			float align = 1.0;
436595c89bcSAxel Dörfler 			view()->GetItemAlignment(&align, 0);
437a0795c6fSMarcus Overhagen 
438a0795c6fSMarcus Overhagen 			// adjust this panel's size
439a0795c6fSMarcus Overhagen 			int32 numInputs = 0, numOutputs = 0;
440595c89bcSAxel Dörfler 			for (uint32 i = 0; i < CountItems(); i++)
441a0795c6fSMarcus Overhagen 			{
442595c89bcSAxel Dörfler 				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
443a0795c6fSMarcus Overhagen 				if (jack)
444a0795c6fSMarcus Overhagen 				{
445a0795c6fSMarcus Overhagen 					if (jack->isInput())
446a0795c6fSMarcus Overhagen 					{
447a0795c6fSMarcus Overhagen 						numInputs++;
448a0795c6fSMarcus Overhagen 					}
449a0795c6fSMarcus Overhagen 					if (jack->isOutput())
450a0795c6fSMarcus Overhagen 					{
451a0795c6fSMarcus Overhagen 						numOutputs++;
452a0795c6fSMarcus Overhagen 					}
453a0795c6fSMarcus Overhagen 				}
454a0795c6fSMarcus Overhagen 			}
455a0795c6fSMarcus Overhagen 			float minWidth = MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP;
456a0795c6fSMarcus Overhagen 			minWidth *= numInputs > numOutputs ? numInputs : numOutputs;
457a0795c6fSMarcus Overhagen 			minWidth += m_bodyRect.Width();
458a0795c6fSMarcus Overhagen 			minWidth += 2 * MediaJack::M_DEFAULT_GAP;
459a0795c6fSMarcus Overhagen 			minWidth = ((int)minWidth / (int)align) * align + align;
460*5680c33eSIngo Weinhold 			if ((Frame().Width() < minWidth)
461*5680c33eSIngo Weinhold 			 || ((Frame().Width() > minWidth)
462a0795c6fSMarcus Overhagen 			 && (minWidth >= MediaNodePanel::M_DEFAULT_WIDTH)))
463a0795c6fSMarcus Overhagen 			{
464*5680c33eSIngo Weinhold 				updateRegion.Include(Frame());
465*5680c33eSIngo Weinhold 				resizeTo(minWidth, Frame().Height());
466*5680c33eSIngo Weinhold 				updateRegion.Include(Frame());
467a0795c6fSMarcus Overhagen 				_prepareLabel();
468a0795c6fSMarcus Overhagen 			}
469a0795c6fSMarcus Overhagen 			// adjust the placement of the jacks
470a0795c6fSMarcus Overhagen 			float inputOffset = 0.0, outputOffset = 0.0;
471*5680c33eSIngo Weinhold 			float center = Frame().left + m_labelRect.left + (m_labelRect.Width() / 2.0);
472a0795c6fSMarcus Overhagen 			center += MediaJack::M_DEFAULT_GAP - (MediaJack::M_DEFAULT_WIDTH / 2.0);
473a0795c6fSMarcus Overhagen 			center = ((int)center / (int)align) * align;
474a0795c6fSMarcus Overhagen 			if (numInputs)
475a0795c6fSMarcus Overhagen 			{
476a0795c6fSMarcus Overhagen 				if (numInputs % 2) // odd number of inputs
477a0795c6fSMarcus Overhagen 				{
478a0795c6fSMarcus Overhagen 					inputOffset = center - (numInputs / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
479a0795c6fSMarcus Overhagen 				}
480a0795c6fSMarcus Overhagen 				else // even number of inputs
481a0795c6fSMarcus Overhagen 				{
482a0795c6fSMarcus Overhagen 					inputOffset = center - ((numInputs + 1) / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
483a0795c6fSMarcus Overhagen 				}
484a0795c6fSMarcus Overhagen 			}
485a0795c6fSMarcus Overhagen 			if (numOutputs)
486a0795c6fSMarcus Overhagen 			{
487a0795c6fSMarcus Overhagen 				if (numOutputs % 2) // odd number of outputs
488a0795c6fSMarcus Overhagen 				{
489a0795c6fSMarcus Overhagen 					outputOffset = center - (numOutputs / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
490a0795c6fSMarcus Overhagen 				}
491a0795c6fSMarcus Overhagen 				else // even number of outputs
492a0795c6fSMarcus Overhagen 				{
493a0795c6fSMarcus Overhagen 					outputOffset = center - ((numOutputs + 1) / 2) * (MediaJack::M_DEFAULT_WIDTH + MediaJack::M_DEFAULT_GAP);
494a0795c6fSMarcus Overhagen 				}
495a0795c6fSMarcus Overhagen 			}
496595c89bcSAxel Dörfler 			for (uint32 i = 0; i < CountItems(); i++)
497a0795c6fSMarcus Overhagen 			{
498595c89bcSAxel Dörfler 				MediaJack *jack = dynamic_cast<MediaJack *>(ItemAt(i));
499a0795c6fSMarcus Overhagen 				if (jack)
500a0795c6fSMarcus Overhagen 				{
501a0795c6fSMarcus Overhagen 					if (jack->isInput())
502a0795c6fSMarcus Overhagen 					{
503*5680c33eSIngo Weinhold 						jack->setPosition(inputOffset, Frame().top, Frame().bottom, &updateRegion);
504*5680c33eSIngo Weinhold 						inputOffset += jack->Frame().Width() + MediaJack::M_DEFAULT_GAP;
505a0795c6fSMarcus Overhagen 					}
506a0795c6fSMarcus Overhagen 					if (jack->isOutput())
507a0795c6fSMarcus Overhagen 					{
508*5680c33eSIngo Weinhold 						jack->setPosition(outputOffset, Frame().top, Frame().bottom, &updateRegion);
509*5680c33eSIngo Weinhold 						outputOffset += jack->Frame().Width() + MediaJack::M_DEFAULT_GAP;
510a0795c6fSMarcus Overhagen 					}
511a0795c6fSMarcus Overhagen 				}
512a0795c6fSMarcus Overhagen 			}
513a0795c6fSMarcus Overhagen 			for (int32 i = 0; i < updateRegion.CountRects(); i++)
514a0795c6fSMarcus Overhagen 			{
515a0795c6fSMarcus Overhagen 				view()->Invalidate(updateRegion.RectAt(i));
516a0795c6fSMarcus Overhagen 			}
517a0795c6fSMarcus Overhagen 			break;
518a0795c6fSMarcus Overhagen 		}
519a0795c6fSMarcus Overhagen 	}
520a0795c6fSMarcus Overhagen 	_updateBitmap();
521a0795c6fSMarcus Overhagen }
522a0795c6fSMarcus Overhagen 
523a0795c6fSMarcus Overhagen void MediaNodePanel::showContextMenu(
524a0795c6fSMarcus Overhagen 	BPoint point)
525a0795c6fSMarcus Overhagen {
526a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::showContextMenu()\n"));
527a0795c6fSMarcus Overhagen 
528a0795c6fSMarcus Overhagen 	BPopUpMenu *menu = new BPopUpMenu("MediaNodePanel PopUp", false, false, B_ITEMS_IN_COLUMN);
529a0795c6fSMarcus Overhagen 	menu->SetFont(be_plain_font);
530a0795c6fSMarcus Overhagen 
531a0795c6fSMarcus Overhagen 	BMenuItem *item;
532a0795c6fSMarcus Overhagen 	BMessage *message;
533a0795c6fSMarcus Overhagen 
534a0795c6fSMarcus Overhagen 	// add the "Tweak Parameters" item
535a0795c6fSMarcus Overhagen 	message = new BMessage(MediaRoutingView::M_NODE_TWEAK_PARAMETERS);
536a0795c6fSMarcus Overhagen 	menu->AddItem(item = new BMenuItem("Tweak Parameters", message, 'P'));
537a0795c6fSMarcus Overhagen 	if (!(ref->kind() & B_CONTROLLABLE))
538a0795c6fSMarcus Overhagen 	{
539a0795c6fSMarcus Overhagen 		item->SetEnabled(false);
540a0795c6fSMarcus Overhagen 	}
541a0795c6fSMarcus Overhagen 
542a0795c6fSMarcus Overhagen 	message = new BMessage(InfoWindowManager::M_INFO_WINDOW_REQUESTED);
543a0795c6fSMarcus Overhagen 	message->AddInt32("nodeID", ref->id());
544a0795c6fSMarcus Overhagen 	menu->AddItem(new BMenuItem("Get Info", message, 'I'));
545a0795c6fSMarcus Overhagen 	menu->AddSeparatorItem();
546a0795c6fSMarcus Overhagen 
547a0795c6fSMarcus Overhagen 	menu->AddItem(item = new BMenuItem("Release", new BMessage(MediaRoutingView::M_DELETE_SELECTION), 'T'));
548a0795c6fSMarcus Overhagen 	if (!ref->isInternal())
549a0795c6fSMarcus Overhagen 	{
550a0795c6fSMarcus Overhagen 		item->SetEnabled(false);
551a0795c6fSMarcus Overhagen 	}
552a0795c6fSMarcus Overhagen 	menu->AddSeparatorItem();
553a0795c6fSMarcus Overhagen 
554a0795c6fSMarcus Overhagen 	// add the "Cycle" item
555a0795c6fSMarcus Overhagen 	message = new BMessage(MediaRoutingView::M_NODE_CHANGE_CYCLING);
556a0795c6fSMarcus Overhagen 	message->AddBool("cycle", !ref->isCycling());
557a0795c6fSMarcus Overhagen 	menu->AddItem(item = new BMenuItem("Cycle", message));
558a0795c6fSMarcus Overhagen 	item->SetMarked(ref->isCycling());
559a0795c6fSMarcus Overhagen 	if (ref->flags() & NodeRef::NO_SEEK)
560a0795c6fSMarcus Overhagen 	{
561a0795c6fSMarcus Overhagen 		item->SetEnabled(false);
562a0795c6fSMarcus Overhagen 	}
563a0795c6fSMarcus Overhagen 
564a0795c6fSMarcus Overhagen 	// add the "Run Mode" sub menu
565a0795c6fSMarcus Overhagen 	BMenu *subMenu = new BMenu("Run Mode");
566a0795c6fSMarcus Overhagen 	subMenu->SetFont(be_plain_font);
567a0795c6fSMarcus Overhagen 	for (uint32 runMode = 1; runMode <= BMediaNode::B_RECORDING; runMode++)
568a0795c6fSMarcus Overhagen 	{
569a0795c6fSMarcus Overhagen 		BString itemName = MediaString::getStringFor(static_cast<BMediaNode::run_mode>
570a0795c6fSMarcus Overhagen 													 (runMode));
571a0795c6fSMarcus Overhagen 		message = new BMessage(MediaRoutingView::M_NODE_CHANGE_RUN_MODE);
572a0795c6fSMarcus Overhagen 		message->AddInt32("run_mode", runMode);
573a0795c6fSMarcus Overhagen 		subMenu->AddItem(item = new BMenuItem(itemName.String(), message));
574a0795c6fSMarcus Overhagen 		if (ref->runMode() == runMode)
575a0795c6fSMarcus Overhagen 		{
576a0795c6fSMarcus Overhagen 			item->SetMarked(true);
577a0795c6fSMarcus Overhagen 		}
578a0795c6fSMarcus Overhagen 		else if ((ref->runMode() == 0)
579a0795c6fSMarcus Overhagen 			  && (ref->group()) && (ref->group()->runMode() == BMediaNode::run_mode(runMode)))
580a0795c6fSMarcus Overhagen 		{
581a0795c6fSMarcus Overhagen 			item->SetMarked(true);
582a0795c6fSMarcus Overhagen 		}
583a0795c6fSMarcus Overhagen 	}
584a0795c6fSMarcus Overhagen 	subMenu->AddSeparatorItem();
585a0795c6fSMarcus Overhagen 	message = new BMessage(MediaRoutingView::M_NODE_CHANGE_RUN_MODE);
586a0795c6fSMarcus Overhagen 	message->AddInt32("run_mode", 0);
587a0795c6fSMarcus Overhagen 	subMenu->AddItem(item = new BMenuItem("(same as group)", message));
588a0795c6fSMarcus Overhagen 	if (ref->group() == 0)
589a0795c6fSMarcus Overhagen 	{
590a0795c6fSMarcus Overhagen 		item->SetEnabled(false);
591a0795c6fSMarcus Overhagen 	}
592a0795c6fSMarcus Overhagen 	else if ((ref->runMode() < 1) && (ref->group()->runMode() > 0))
593a0795c6fSMarcus Overhagen 	{
594a0795c6fSMarcus Overhagen 		item->SetMarked(true);
595a0795c6fSMarcus Overhagen 	}
596a0795c6fSMarcus Overhagen 	menu->AddItem(subMenu);
597a0795c6fSMarcus Overhagen 	subMenu->SetTargetForItems(view());
598a0795c6fSMarcus Overhagen 
599a0795c6fSMarcus Overhagen 	// [c.lenz 24dec99] hide rarely used commands in a 'Advanced' submenu
600a0795c6fSMarcus Overhagen 	subMenu = new BMenu("Advanced");
601a0795c6fSMarcus Overhagen 	subMenu->SetFont(be_plain_font);
602a0795c6fSMarcus Overhagen 	// [e.moon 5dec99] ad-hoc timesource support
603a0795c6fSMarcus Overhagen 	if(ref->kind() & B_TIME_SOURCE) {
604a0795c6fSMarcus Overhagen 		message = new BMessage(MediaRoutingView::M_NODE_START_TIME_SOURCE);
605a0795c6fSMarcus Overhagen 		message->AddInt32("nodeID", ref->id());
606a0795c6fSMarcus Overhagen 		subMenu->AddItem(new BMenuItem(
607a0795c6fSMarcus Overhagen 			"Start Time Source",
608a0795c6fSMarcus Overhagen 			message));
609a0795c6fSMarcus Overhagen 		message = new BMessage(MediaRoutingView::M_NODE_START_TIME_SOURCE);
610a0795c6fSMarcus Overhagen 		message->AddInt32("nodeID", ref->id());
611a0795c6fSMarcus Overhagen 		subMenu->AddItem(new BMenuItem(
612a0795c6fSMarcus Overhagen 			"Stop Time Source",
613a0795c6fSMarcus Overhagen 			message));
614a0795c6fSMarcus Overhagen 	}
615a0795c6fSMarcus Overhagen 	// [c.lenz 24dec99] support for BControllable::StartControlPanel()
616a0795c6fSMarcus Overhagen 	if(ref->kind() & B_CONTROLLABLE) {
617a0795c6fSMarcus Overhagen 		if (subMenu->CountItems() > 0)
618a0795c6fSMarcus Overhagen 			subMenu->AddSeparatorItem();
619a0795c6fSMarcus Overhagen 		message = new BMessage(MediaRoutingView::M_NODE_START_CONTROL_PANEL);
620a0795c6fSMarcus Overhagen 		subMenu->AddItem(new BMenuItem("Start Control Panel", message,
621a0795c6fSMarcus Overhagen 									   'P', B_COMMAND_KEY | B_SHIFT_KEY));
622a0795c6fSMarcus Overhagen 	}
623a0795c6fSMarcus Overhagen 	// [em 1feb00] group tweaks
624a0795c6fSMarcus Overhagen 	if(ref->group())
625a0795c6fSMarcus Overhagen 	{
626a0795c6fSMarcus Overhagen 		message = new BMessage(MediaRoutingView::M_GROUP_SET_LOCKED);
627a0795c6fSMarcus Overhagen 		message->AddInt32("groupID", ref->group()->id());
628a0795c6fSMarcus Overhagen 		bool isLocked = (ref->group()->groupFlags() & NodeGroup::GROUP_LOCKED);
629a0795c6fSMarcus Overhagen 		message->AddBool("locked", !isLocked);
630a0795c6fSMarcus Overhagen 		if (subMenu->CountItems() > 0)
631a0795c6fSMarcus Overhagen 			subMenu->AddSeparatorItem();
632a0795c6fSMarcus Overhagen 		subMenu->AddItem(
633a0795c6fSMarcus Overhagen 			new BMenuItem(
634a0795c6fSMarcus Overhagen 				isLocked ? "Unlock Group" : "Lock Group", message));
635a0795c6fSMarcus Overhagen 	}
636a0795c6fSMarcus Overhagen 
637a0795c6fSMarcus Overhagen 	if (subMenu->CountItems() > 0)
638a0795c6fSMarcus Overhagen 	{
639a0795c6fSMarcus Overhagen 		menu->AddItem(subMenu);
640a0795c6fSMarcus Overhagen 		subMenu->SetTargetForItems(view());
641a0795c6fSMarcus Overhagen 	}
642a0795c6fSMarcus Overhagen 
643a0795c6fSMarcus Overhagen 	menu->SetTargetForItems(view());
644a0795c6fSMarcus Overhagen 	view()->ConvertToScreen(&point);
645a0795c6fSMarcus Overhagen 	point -= BPoint(1.0, 1.0);
646a0795c6fSMarcus Overhagen 	menu->Go(point, true, true, true);
647a0795c6fSMarcus Overhagen }
648a0795c6fSMarcus Overhagen 
649a0795c6fSMarcus Overhagen // ---------------------------------------------------------------- //
650a0795c6fSMarcus Overhagen // BHandler impl
651a0795c6fSMarcus Overhagen // ---------------------------------------------------------------- //
652a0795c6fSMarcus Overhagen 
653a0795c6fSMarcus Overhagen void MediaNodePanel::MessageReceived(
654a0795c6fSMarcus Overhagen 	BMessage *message)
655a0795c6fSMarcus Overhagen {
656a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::MessageReceived()\n"));
657a0795c6fSMarcus Overhagen 	switch (message->what)
658a0795c6fSMarcus Overhagen 	{
659a0795c6fSMarcus Overhagen 		case NodeRef::M_INPUTS_CHANGED:
660a0795c6fSMarcus Overhagen 		{
661a0795c6fSMarcus Overhagen 			D_MESSAGE(("MediaNodePanel::MessageReceived(NodeRef::M_INPUTS_CHANGED)\n"));
662a0795c6fSMarcus Overhagen 			_updateIcon(dynamic_cast<MediaRoutingView *>(view())->getLayout());
663a0795c6fSMarcus Overhagen 			break;
664a0795c6fSMarcus Overhagen 		}
665a0795c6fSMarcus Overhagen 		case NodeRef::M_OUTPUTS_CHANGED:
666a0795c6fSMarcus Overhagen 		{
667a0795c6fSMarcus Overhagen 			D_MESSAGE(("MediaNodePanel::MessageReceived(NodeRef::M_OUTPUTS_CHANGED)\n"));
668a0795c6fSMarcus Overhagen 			_updateIcon(dynamic_cast<MediaRoutingView *>(view())->getLayout());
669a0795c6fSMarcus Overhagen 			break;
670a0795c6fSMarcus Overhagen 		}
671a0795c6fSMarcus Overhagen 		default:
672a0795c6fSMarcus Overhagen 		{
673a0795c6fSMarcus Overhagen 			BHandler::MessageReceived(message);
674a0795c6fSMarcus Overhagen 			break;
675a0795c6fSMarcus Overhagen 		}
676a0795c6fSMarcus Overhagen 	}
677a0795c6fSMarcus Overhagen }
678a0795c6fSMarcus Overhagen 
679a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
680a0795c6fSMarcus Overhagen // *** IStateArchivable
681a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
682a0795c6fSMarcus Overhagen 
683a0795c6fSMarcus Overhagen status_t MediaNodePanel::importState(
684a0795c6fSMarcus Overhagen 	const BMessage*						archive) {
685a0795c6fSMarcus Overhagen 
686a0795c6fSMarcus Overhagen 	BPoint iconPos(s_invalidPosition);
687a0795c6fSMarcus Overhagen 	BPoint miniIconPos(s_invalidPosition);
688a0795c6fSMarcus Overhagen 
689a0795c6fSMarcus Overhagen 	MediaRoutingView* v = dynamic_cast<MediaRoutingView*>(view());
690a0795c6fSMarcus Overhagen 	ASSERT(v);
691a0795c6fSMarcus Overhagen 	MediaRoutingView::layout_t layoutMode = v->getLayout();
692a0795c6fSMarcus Overhagen 	archive->FindPoint("iconPos", &iconPos);
693a0795c6fSMarcus Overhagen 	archive->FindPoint("miniIconPos", &miniIconPos);
694a0795c6fSMarcus Overhagen 
695a0795c6fSMarcus Overhagen 	switch(layoutMode) {
696a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_ICON_VIEW:
697a0795c6fSMarcus Overhagen 			if(iconPos != s_invalidPosition)
698a0795c6fSMarcus Overhagen 				moveTo(iconPos);
699a0795c6fSMarcus Overhagen 			m_alternatePosition = miniIconPos;
700a0795c6fSMarcus Overhagen 			break;
701a0795c6fSMarcus Overhagen 
702a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_MINI_ICON_VIEW:
703a0795c6fSMarcus Overhagen 			if(miniIconPos != s_invalidPosition)
704a0795c6fSMarcus Overhagen 				moveTo(miniIconPos);
705a0795c6fSMarcus Overhagen 			m_alternatePosition = iconPos;
706a0795c6fSMarcus Overhagen 			break;
707a0795c6fSMarcus Overhagen 	}
708a0795c6fSMarcus Overhagen 
709a0795c6fSMarcus Overhagen 	return B_OK;
710a0795c6fSMarcus Overhagen }
711a0795c6fSMarcus Overhagen 
712a0795c6fSMarcus Overhagen status_t MediaNodePanel::exportState(
713a0795c6fSMarcus Overhagen 	BMessage*									archive) const {
714a0795c6fSMarcus Overhagen 
715a0795c6fSMarcus Overhagen 	BPoint iconPos, miniIconPos;
716a0795c6fSMarcus Overhagen 
717a0795c6fSMarcus Overhagen 	MediaRoutingView* v = dynamic_cast<MediaRoutingView*>(view());
718a0795c6fSMarcus Overhagen 	ASSERT(v);
719a0795c6fSMarcus Overhagen 	MediaRoutingView::layout_t layoutMode = v->getLayout();
720a0795c6fSMarcus Overhagen 	switch(layoutMode) {
721a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_ICON_VIEW:
722*5680c33eSIngo Weinhold 			iconPos = Frame().LeftTop();
723a0795c6fSMarcus Overhagen 			miniIconPos = m_alternatePosition;
724a0795c6fSMarcus Overhagen 			break;
725a0795c6fSMarcus Overhagen 
726a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_MINI_ICON_VIEW:
727*5680c33eSIngo Weinhold 			miniIconPos = Frame().LeftTop();
728a0795c6fSMarcus Overhagen 			iconPos = m_alternatePosition;
729a0795c6fSMarcus Overhagen 			break;
730a0795c6fSMarcus Overhagen 	}
731a0795c6fSMarcus Overhagen 
732a0795c6fSMarcus Overhagen 	if(iconPos != s_invalidPosition)
733a0795c6fSMarcus Overhagen 		archive->AddPoint("iconPos", iconPos);
734a0795c6fSMarcus Overhagen 	if(miniIconPos != s_invalidPosition)
735a0795c6fSMarcus Overhagen 		archive->AddPoint("miniIconPos", miniIconPos);
736a0795c6fSMarcus Overhagen 
737a0795c6fSMarcus Overhagen 	// determine if I'm a 'system' node
738a0795c6fSMarcus Overhagen 	port_info portInfo;
739a0795c6fSMarcus Overhagen 	app_info appInfo;
740a0795c6fSMarcus Overhagen 
741a0795c6fSMarcus Overhagen 	if ((get_port_info(ref->node().port, &portInfo) == B_OK)
742a0795c6fSMarcus Overhagen 		&& (be_roster->GetRunningAppInfo(portInfo.team, &appInfo) == B_OK)) {
743a0795c6fSMarcus Overhagen 		BEntry appEntry(&appInfo.ref);
744a0795c6fSMarcus Overhagen 		char appName[B_FILE_NAME_LENGTH];
745a0795c6fSMarcus Overhagen 		if(
746a0795c6fSMarcus Overhagen 			appEntry.InitCheck() == B_OK &&
747a0795c6fSMarcus Overhagen 			appEntry.GetName(appName) == B_OK &&
748a0795c6fSMarcus Overhagen 			(!strcmp(appName, "media_addon_server") ||
749a0795c6fSMarcus Overhagen 			 !strcmp(appName, "audio_server"))) {
750a0795c6fSMarcus Overhagen 
751a0795c6fSMarcus Overhagen 			archive->AddBool("sysOwned", true);
752a0795c6fSMarcus Overhagen 		}
753a0795c6fSMarcus Overhagen 	}
754a0795c6fSMarcus Overhagen 
755a0795c6fSMarcus Overhagen 	return B_OK;
756a0795c6fSMarcus Overhagen }
757a0795c6fSMarcus Overhagen 
758a0795c6fSMarcus Overhagen // ---------------------------------------------------------------- //
759a0795c6fSMarcus Overhagen // *** internal operations
760a0795c6fSMarcus Overhagen // ---------------------------------------------------------------- //
761a0795c6fSMarcus Overhagen 
762a0795c6fSMarcus Overhagen void MediaNodePanel::_prepareLabel()
763a0795c6fSMarcus Overhagen {
764a0795c6fSMarcus Overhagen 	// find out if its a file node first
765a0795c6fSMarcus Overhagen 	if (ref->kind() & B_FILE_INTERFACE)
766a0795c6fSMarcus Overhagen 	{
767a0795c6fSMarcus Overhagen 		entry_ref nodeFile;
768a0795c6fSMarcus Overhagen 		status_t error = BMediaRoster::Roster()->GetRefFor(ref->node(),	&nodeFile);
769a0795c6fSMarcus Overhagen 		if (error)
770a0795c6fSMarcus Overhagen 		{
771a0795c6fSMarcus Overhagen 			m_fullLabel = ref->name();
772a0795c6fSMarcus Overhagen 			m_fullLabel += " (no file)";
773a0795c6fSMarcus Overhagen 		}
774a0795c6fSMarcus Overhagen 		else
775a0795c6fSMarcus Overhagen 		{
776a0795c6fSMarcus Overhagen 			BEntry entry(&nodeFile);
777a0795c6fSMarcus Overhagen 			char fileName[B_FILE_NAME_LENGTH];
778a0795c6fSMarcus Overhagen 			entry.GetName(fileName);
779a0795c6fSMarcus Overhagen 			m_fullLabel = fileName;
780a0795c6fSMarcus Overhagen 		}
781a0795c6fSMarcus Overhagen 	}
782a0795c6fSMarcus Overhagen 	else
783a0795c6fSMarcus Overhagen 	{
784a0795c6fSMarcus Overhagen 		m_fullLabel = ref->name();
785a0795c6fSMarcus Overhagen 	}
786a0795c6fSMarcus Overhagen 
787a0795c6fSMarcus Overhagen 	int32 layout = dynamic_cast<MediaRoutingView *>(view())->getLayout();
788a0795c6fSMarcus Overhagen 
789a0795c6fSMarcus Overhagen 	// Construct labelRect
790a0795c6fSMarcus Overhagen 	font_height fh;
791a0795c6fSMarcus Overhagen 	be_plain_font->GetHeight(&fh);
792a0795c6fSMarcus Overhagen 	switch (layout)
793a0795c6fSMarcus Overhagen 	{
794a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_ICON_VIEW:
795a0795c6fSMarcus Overhagen 		{
796*5680c33eSIngo Weinhold 			m_labelRect = Frame();
797a0795c6fSMarcus Overhagen 			m_labelRect.OffsetTo(0.0, 0.0);
798a0795c6fSMarcus Overhagen 			m_labelRect.bottom = 2 * M_LABEL_V_MARGIN + (fh.ascent + fh.descent + fh.leading) + 1.0;
799a0795c6fSMarcus Overhagen 			break;
800a0795c6fSMarcus Overhagen 		}
801a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_MINI_ICON_VIEW:
802a0795c6fSMarcus Overhagen 		{
803*5680c33eSIngo Weinhold 			m_labelRect = Frame();
804a0795c6fSMarcus Overhagen 			m_labelRect.OffsetTo(0.0, 0.0);
805a0795c6fSMarcus Overhagen 			m_labelRect.left = M_BODY_H_MARGIN + B_MINI_ICON;
806a0795c6fSMarcus Overhagen 			m_labelRect.top += MediaJack::M_DEFAULT_HEIGHT;
807a0795c6fSMarcus Overhagen 			m_labelRect.bottom -= MediaJack::M_DEFAULT_HEIGHT;
808a0795c6fSMarcus Overhagen 			break;
809a0795c6fSMarcus Overhagen 		}
810a0795c6fSMarcus Overhagen 	}
811a0795c6fSMarcus Overhagen 
812a0795c6fSMarcus Overhagen 	// truncate the label to fit in the panel
813a0795c6fSMarcus Overhagen 	float maxWidth = m_labelRect.Width() - (2.0 * M_LABEL_H_MARGIN) - 2.0;
814a0795c6fSMarcus Overhagen 	if (be_plain_font->StringWidth(m_fullLabel.String()) > maxWidth)
815a0795c6fSMarcus Overhagen 	{
816a0795c6fSMarcus Overhagen 		char *truncatedLabel[1];
817a0795c6fSMarcus Overhagen 		truncatedLabel[0] = new char[B_MEDIA_NAME_LENGTH];
818a0795c6fSMarcus Overhagen 		const char *originalLabel[1];
819a0795c6fSMarcus Overhagen 		originalLabel[0] = new char[B_MEDIA_NAME_LENGTH];
820a0795c6fSMarcus Overhagen 		m_fullLabel.CopyInto(const_cast<char *>(originalLabel[0]), 0, B_MEDIA_NAME_LENGTH);
821a0795c6fSMarcus Overhagen 		be_plain_font->GetTruncatedStrings(originalLabel, 1, B_TRUNCATE_END, maxWidth, (char **) truncatedLabel);
822a0795c6fSMarcus Overhagen 		m_label = truncatedLabel[0];
823a0795c6fSMarcus Overhagen 		m_labelTruncated = true;
824a0795c6fSMarcus Overhagen 		delete [] originalLabel[0];
825a0795c6fSMarcus Overhagen 		delete [] truncatedLabel[0];
826a0795c6fSMarcus Overhagen 	}
827a0795c6fSMarcus Overhagen 	else
828a0795c6fSMarcus Overhagen 	{
829a0795c6fSMarcus Overhagen 		m_label = m_fullLabel;
830a0795c6fSMarcus Overhagen 		m_labelTruncated = false;
831a0795c6fSMarcus Overhagen 	}
832a0795c6fSMarcus Overhagen 
833a0795c6fSMarcus Overhagen 	// Construct labelOffset
834a0795c6fSMarcus Overhagen 	float fw = be_plain_font->StringWidth(m_label.String());
835a0795c6fSMarcus Overhagen 	m_labelOffset.x = m_labelRect.left + m_labelRect.Width() / 2.0 - fw / 2.0;
836a0795c6fSMarcus Overhagen 	m_labelOffset.y = m_labelRect.bottom - M_LABEL_V_MARGIN - fh.descent - (fh.leading / 2.0) - 1.0;
837a0795c6fSMarcus Overhagen 
838a0795c6fSMarcus Overhagen 	// Construct bodyRect
839a0795c6fSMarcus Overhagen 	switch (layout)
840a0795c6fSMarcus Overhagen 	{
841a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_ICON_VIEW:
842a0795c6fSMarcus Overhagen 		{
843*5680c33eSIngo Weinhold 			m_bodyRect = Frame();
844a0795c6fSMarcus Overhagen 			m_bodyRect.OffsetTo(0.0, 0.0);
845a0795c6fSMarcus Overhagen 			m_bodyRect.top = m_labelRect.bottom;
846a0795c6fSMarcus Overhagen 			break;
847a0795c6fSMarcus Overhagen 		}
848a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_MINI_ICON_VIEW:
849a0795c6fSMarcus Overhagen 		{
850*5680c33eSIngo Weinhold 			m_bodyRect = Frame();
851a0795c6fSMarcus Overhagen 			m_bodyRect.OffsetTo(0.0, 0.0);
852a0795c6fSMarcus Overhagen 			m_bodyRect.right = m_labelRect.left;
853a0795c6fSMarcus Overhagen 			break;
854a0795c6fSMarcus Overhagen 		}
855a0795c6fSMarcus Overhagen 	}
856a0795c6fSMarcus Overhagen }
857a0795c6fSMarcus Overhagen 
858a0795c6fSMarcus Overhagen void MediaNodePanel::_updateBitmap()
859a0795c6fSMarcus Overhagen {
860a0795c6fSMarcus Overhagen 	if (m_bitmap)
861a0795c6fSMarcus Overhagen 	{
862a0795c6fSMarcus Overhagen 		delete m_bitmap;
863a0795c6fSMarcus Overhagen 	}
864*5680c33eSIngo Weinhold 	BBitmap *tempBitmap = new BBitmap(Frame().OffsetToCopy(0.0, 0.0), B_CMAP8, true);
865a0795c6fSMarcus Overhagen 	tempBitmap->Lock();
866a0795c6fSMarcus Overhagen 	{
867a0795c6fSMarcus Overhagen 		BView *tempView = new BView(tempBitmap->Bounds(), "", B_FOLLOW_NONE, 0);
868a0795c6fSMarcus Overhagen 		tempBitmap->AddChild(tempView);
869a0795c6fSMarcus Overhagen 		tempView->SetOrigin(0.0, 0.0);
870a0795c6fSMarcus Overhagen 
871a0795c6fSMarcus Overhagen 		int32 layout = dynamic_cast<MediaRoutingView *>(view())->getLayout();
872a0795c6fSMarcus Overhagen 		_drawInto(tempView, tempView->Bounds(), layout);
873a0795c6fSMarcus Overhagen 
874a0795c6fSMarcus Overhagen 		tempView->Sync();
875a0795c6fSMarcus Overhagen 		tempBitmap->RemoveChild(tempView);
876a0795c6fSMarcus Overhagen 		delete tempView;
877a0795c6fSMarcus Overhagen 	}
878a0795c6fSMarcus Overhagen 	tempBitmap->Unlock();
879a0795c6fSMarcus Overhagen 	m_bitmap = new BBitmap(tempBitmap);
880a0795c6fSMarcus Overhagen 	delete tempBitmap;
881a0795c6fSMarcus Overhagen }
882a0795c6fSMarcus Overhagen 
883a0795c6fSMarcus Overhagen void MediaNodePanel::_drawInto(
884a0795c6fSMarcus Overhagen 	BView *target,
885a0795c6fSMarcus Overhagen 	BRect targetRect,
886a0795c6fSMarcus Overhagen 	int32 layout)
887a0795c6fSMarcus Overhagen {
888a0795c6fSMarcus Overhagen 	switch (layout)
889a0795c6fSMarcus Overhagen 	{
890a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_ICON_VIEW:
891a0795c6fSMarcus Overhagen 		{
892a0795c6fSMarcus Overhagen 			BRect r;
893a0795c6fSMarcus Overhagen 			BPoint p;
894a0795c6fSMarcus Overhagen 
895a0795c6fSMarcus Overhagen 			// Draw borders
896a0795c6fSMarcus Overhagen 			r = targetRect;
897a0795c6fSMarcus Overhagen 			target->BeginLineArray(16);
898a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftTop(), r.RightTop(), M_DARK_GRAY_COLOR);
899a0795c6fSMarcus Overhagen 				target->AddLine(r.RightTop(), r.RightBottom(), M_DARK_GRAY_COLOR);
900a0795c6fSMarcus Overhagen 				target->AddLine(r.RightBottom(), r.LeftBottom(), M_DARK_GRAY_COLOR);
901a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftBottom(), r.LeftTop(), M_DARK_GRAY_COLOR);
902a0795c6fSMarcus Overhagen 				r.InsetBy(1.0, 1.0);
903a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftTop(), r.RightTop(), M_LIGHT_GRAY_COLOR);
904a0795c6fSMarcus Overhagen 				target->AddLine(r.RightTop(), r.RightBottom(), M_MED_GRAY_COLOR);
905a0795c6fSMarcus Overhagen 				target->AddLine(r.RightBottom(), r.LeftBottom(), M_MED_GRAY_COLOR);
906a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftBottom(), r.LeftTop(), M_LIGHT_GRAY_COLOR);
907a0795c6fSMarcus Overhagen 			target->EndLineArray();
908a0795c6fSMarcus Overhagen 
909a0795c6fSMarcus Overhagen 			// Fill background
910a0795c6fSMarcus Overhagen 			r.InsetBy(1.0, 1.0);
911a0795c6fSMarcus Overhagen 			target->SetLowColor(M_GRAY_COLOR);
912a0795c6fSMarcus Overhagen 			target->FillRect(r, B_SOLID_LOW);
913a0795c6fSMarcus Overhagen 
914a0795c6fSMarcus Overhagen 			// Draw icon
915a0795c6fSMarcus Overhagen 			if (m_icon)
916a0795c6fSMarcus Overhagen 			{
917a0795c6fSMarcus Overhagen 				p.x = m_bodyRect.left + m_bodyRect.Width() / 2.0 - B_LARGE_ICON / 2.0;
918a0795c6fSMarcus Overhagen 				p.y = m_labelRect.bottom + m_bodyRect.Height() / 2.0 - B_LARGE_ICON / 2.0;
919a0795c6fSMarcus Overhagen 				if (isSelected())
920a0795c6fSMarcus Overhagen 				{
921a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_INVERT);
922a0795c6fSMarcus Overhagen 					target->DrawBitmapAsync(m_icon, p);
923a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_ALPHA);
924a0795c6fSMarcus Overhagen 					target->SetHighColor(0, 0, 0, 180);
925a0795c6fSMarcus Overhagen 					target->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE);
926a0795c6fSMarcus Overhagen 					target->DrawBitmapAsync(m_icon, p);
927a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_OVER);
928a0795c6fSMarcus Overhagen 				}
929a0795c6fSMarcus Overhagen 				else
930a0795c6fSMarcus Overhagen 				{
931a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_OVER);
932a0795c6fSMarcus Overhagen 					target->DrawBitmapAsync(m_icon, p);
933a0795c6fSMarcus Overhagen 				}
934a0795c6fSMarcus Overhagen 			}
935a0795c6fSMarcus Overhagen 
936a0795c6fSMarcus Overhagen 			// Draw label
937a0795c6fSMarcus Overhagen 			if (isSelected())
938a0795c6fSMarcus Overhagen 			{
939a0795c6fSMarcus Overhagen 				r = m_labelRect;
940a0795c6fSMarcus Overhagen 				r.InsetBy(M_LABEL_H_MARGIN, M_LABEL_V_MARGIN);
941a0795c6fSMarcus Overhagen 				target->BeginLineArray(4);
942a0795c6fSMarcus Overhagen 					target->AddLine(r.LeftTop(), r.RightTop(), M_LIGHT_BLUE_COLOR);
943a0795c6fSMarcus Overhagen 					target->AddLine(r.RightTop(), r.RightBottom(), M_LIGHT_BLUE_COLOR);
944a0795c6fSMarcus Overhagen 					target->AddLine(r.RightBottom(), r.LeftBottom(), M_LIGHT_BLUE_COLOR);
945a0795c6fSMarcus Overhagen 					target->AddLine(r.LeftBottom(), r.LeftTop(), M_LIGHT_BLUE_COLOR);
946a0795c6fSMarcus Overhagen 				target->EndLineArray();
947a0795c6fSMarcus Overhagen 				r.InsetBy(1.0, 1.0);
948a0795c6fSMarcus Overhagen 				target->SetHighColor(M_DARK_BLUE_COLOR);
949a0795c6fSMarcus Overhagen 				target->FillRect(r, B_SOLID_HIGH);
950a0795c6fSMarcus Overhagen 			}
951a0795c6fSMarcus Overhagen 			target->SetDrawingMode(B_OP_OVER);
952a0795c6fSMarcus Overhagen 			target->SetHighColor(isSelected() ? M_WHITE_COLOR : M_BLACK_COLOR);
953a0795c6fSMarcus Overhagen 			target->DrawString(m_label.String(), m_labelOffset);
954a0795c6fSMarcus Overhagen 			break;
955a0795c6fSMarcus Overhagen 		}
956a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_MINI_ICON_VIEW:
957a0795c6fSMarcus Overhagen 		{
958a0795c6fSMarcus Overhagen 			BRect r;
959a0795c6fSMarcus Overhagen 			BPoint p;
960a0795c6fSMarcus Overhagen 
961a0795c6fSMarcus Overhagen 			// Draw borders
962a0795c6fSMarcus Overhagen 			r = targetRect;
963a0795c6fSMarcus Overhagen 			target->BeginLineArray(16);
964a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftTop(), r.RightTop(), M_DARK_GRAY_COLOR);
965a0795c6fSMarcus Overhagen 				target->AddLine(r.RightTop(), r.RightBottom(), M_DARK_GRAY_COLOR);
966a0795c6fSMarcus Overhagen 				target->AddLine(r.RightBottom(), r.LeftBottom(), M_DARK_GRAY_COLOR);
967a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftBottom(), r.LeftTop(), M_DARK_GRAY_COLOR);
968a0795c6fSMarcus Overhagen 				r.InsetBy(1.0, 1.0);
969a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftTop(), r.RightTop(), M_LIGHT_GRAY_COLOR);
970a0795c6fSMarcus Overhagen 				target->AddLine(r.RightTop(), r.RightBottom(), M_MED_GRAY_COLOR);
971a0795c6fSMarcus Overhagen 				target->AddLine(r.RightBottom(), r.LeftBottom(), M_MED_GRAY_COLOR);
972a0795c6fSMarcus Overhagen 				target->AddLine(r.LeftBottom(), r.LeftTop(), M_LIGHT_GRAY_COLOR);
973a0795c6fSMarcus Overhagen 			target->EndLineArray();
974a0795c6fSMarcus Overhagen 
975a0795c6fSMarcus Overhagen 			// Fill background
976a0795c6fSMarcus Overhagen 			r.InsetBy(1.0, 1.0);
977a0795c6fSMarcus Overhagen 			target->SetLowColor(M_GRAY_COLOR);
978a0795c6fSMarcus Overhagen 			target->FillRect(r, B_SOLID_LOW);
979a0795c6fSMarcus Overhagen 
980a0795c6fSMarcus Overhagen 			// Draw icon
981a0795c6fSMarcus Overhagen 			if (m_icon)
982a0795c6fSMarcus Overhagen 			{
983a0795c6fSMarcus Overhagen 				p.x = m_bodyRect.left + M_BODY_H_MARGIN;
984a0795c6fSMarcus Overhagen 				p.y = m_bodyRect.top + (m_bodyRect.Height() / 2.0) - (B_MINI_ICON / 2.0);
985a0795c6fSMarcus Overhagen 				if (isSelected())
986a0795c6fSMarcus Overhagen 				{
987a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_INVERT);
988a0795c6fSMarcus Overhagen 					target->DrawBitmapAsync(m_icon, p);
989a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_ALPHA);
990a0795c6fSMarcus Overhagen 					target->SetHighColor(0, 0, 0, 180);
991a0795c6fSMarcus Overhagen 					target->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE);
992a0795c6fSMarcus Overhagen 					target->DrawBitmapAsync(m_icon, p);
993a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_OVER);
994a0795c6fSMarcus Overhagen 				}
995a0795c6fSMarcus Overhagen 				else
996a0795c6fSMarcus Overhagen 				{
997a0795c6fSMarcus Overhagen 					target->SetDrawingMode(B_OP_OVER);
998a0795c6fSMarcus Overhagen 					target->DrawBitmapAsync(m_icon, p);
999a0795c6fSMarcus Overhagen 				}
1000a0795c6fSMarcus Overhagen 			}
1001a0795c6fSMarcus Overhagen 
1002a0795c6fSMarcus Overhagen 			// Draw label
1003a0795c6fSMarcus Overhagen 			if (isSelected())
1004a0795c6fSMarcus Overhagen 			{
1005a0795c6fSMarcus Overhagen 				r = m_labelRect;
1006a0795c6fSMarcus Overhagen 				r.InsetBy(M_LABEL_H_MARGIN, M_LABEL_V_MARGIN);
1007a0795c6fSMarcus Overhagen 				target->BeginLineArray(4);
1008a0795c6fSMarcus Overhagen 					target->AddLine(r.LeftTop(), r.RightTop(), M_LIGHT_BLUE_COLOR);
1009a0795c6fSMarcus Overhagen 					target->AddLine(r.RightTop(), r.RightBottom(), M_LIGHT_BLUE_COLOR);
1010a0795c6fSMarcus Overhagen 					target->AddLine(r.RightBottom(), r.LeftBottom(), M_LIGHT_BLUE_COLOR);
1011a0795c6fSMarcus Overhagen 					target->AddLine(r.LeftBottom(), r.LeftTop(), M_LIGHT_BLUE_COLOR);
1012a0795c6fSMarcus Overhagen 				target->EndLineArray();
1013a0795c6fSMarcus Overhagen 				r.InsetBy(1.0, 1.0);
1014a0795c6fSMarcus Overhagen 				target->SetHighColor(M_DARK_BLUE_COLOR);
1015a0795c6fSMarcus Overhagen 				target->FillRect(r, B_SOLID_HIGH);
1016a0795c6fSMarcus Overhagen 			}
1017a0795c6fSMarcus Overhagen 			target->SetDrawingMode(B_OP_OVER);
1018a0795c6fSMarcus Overhagen 			target->SetHighColor(isSelected() ? M_WHITE_COLOR : M_BLACK_COLOR);
1019a0795c6fSMarcus Overhagen 			target->DrawString(m_label.String(), m_labelOffset);
1020a0795c6fSMarcus Overhagen 			break;
1021a0795c6fSMarcus Overhagen 		}
1022a0795c6fSMarcus Overhagen 	}
1023a0795c6fSMarcus Overhagen }
1024a0795c6fSMarcus Overhagen 
1025a0795c6fSMarcus Overhagen void MediaNodePanel::_updateIcon(
1026a0795c6fSMarcus Overhagen 	int32 layout)
1027a0795c6fSMarcus Overhagen {
1028a0795c6fSMarcus Overhagen 	D_METHOD(("MediaNodePanel::_updateIcon()\n"));
1029a0795c6fSMarcus Overhagen 
1030a0795c6fSMarcus Overhagen 	if (m_icon)
1031a0795c6fSMarcus Overhagen 	{
1032a0795c6fSMarcus Overhagen 		delete m_icon;
1033a0795c6fSMarcus Overhagen 		m_icon = 0;
1034a0795c6fSMarcus Overhagen 	}
1035a0795c6fSMarcus Overhagen 	RouteAppNodeManager *manager;
1036a0795c6fSMarcus Overhagen 	manager = dynamic_cast<MediaRoutingView *>(view())->manager;
1037a0795c6fSMarcus Overhagen 	switch (layout)
1038a0795c6fSMarcus Overhagen 	{
1039a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_ICON_VIEW:
1040a0795c6fSMarcus Overhagen 		{
1041a0795c6fSMarcus Overhagen 			const MediaIcon *icon = manager->mediaIconFor(ref->id(), B_LARGE_ICON);
1042a0795c6fSMarcus Overhagen 			m_icon = new BBitmap(dynamic_cast<const BBitmap *>(icon));
1043a0795c6fSMarcus Overhagen 			break;
1044a0795c6fSMarcus Overhagen 		}
1045a0795c6fSMarcus Overhagen 		case MediaRoutingView::M_MINI_ICON_VIEW:
1046a0795c6fSMarcus Overhagen 		{
1047a0795c6fSMarcus Overhagen 			const MediaIcon *icon = manager->mediaIconFor(ref->id(), B_MINI_ICON);
1048a0795c6fSMarcus Overhagen 			m_icon = new BBitmap(dynamic_cast<const BBitmap *>(icon));
1049a0795c6fSMarcus Overhagen 			break;
1050a0795c6fSMarcus Overhagen 		}
1051a0795c6fSMarcus Overhagen 	}
1052a0795c6fSMarcus Overhagen }
1053a0795c6fSMarcus Overhagen 
1054a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
1055a0795c6fSMarcus Overhagen // *** sorting methods (friend)
1056a0795c6fSMarcus Overhagen // -------------------------------------------------------- //
1057a0795c6fSMarcus Overhagen 
1058a0795c6fSMarcus Overhagen int __CORTEX_NAMESPACE__ compareID(
1059a0795c6fSMarcus Overhagen 	const void *lValue,
1060a0795c6fSMarcus Overhagen 	const void *rValue)
1061a0795c6fSMarcus Overhagen {
1062a0795c6fSMarcus Overhagen 	int retValue = 0;
1063a0795c6fSMarcus Overhagen 	const MediaNodePanel *lPanel = *(reinterpret_cast<MediaNodePanel * const*>(reinterpret_cast<void * const*>(lValue)));
1064a0795c6fSMarcus Overhagen 	const MediaNodePanel *rPanel = *(reinterpret_cast<MediaNodePanel * const*>(reinterpret_cast<void * const*>(rValue)));
1065a0795c6fSMarcus Overhagen 	if (lPanel && rPanel)
1066a0795c6fSMarcus Overhagen 	{
1067a0795c6fSMarcus Overhagen 		if (lPanel->ref->id() < rPanel->ref->id())
1068a0795c6fSMarcus Overhagen 		{
1069a0795c6fSMarcus Overhagen 			retValue = -1;
1070a0795c6fSMarcus Overhagen 		}
1071a0795c6fSMarcus Overhagen 		else if (lPanel->ref->id() > rPanel->ref->id())
1072a0795c6fSMarcus Overhagen 		{
1073a0795c6fSMarcus Overhagen 			retValue = 1;
1074a0795c6fSMarcus Overhagen 		}
1075a0795c6fSMarcus Overhagen 	}
1076a0795c6fSMarcus Overhagen 	return retValue;
1077a0795c6fSMarcus Overhagen }
1078a0795c6fSMarcus Overhagen 
1079a0795c6fSMarcus Overhagen // END -- MediaNodePanel.cpp --
1080