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