void TExpandoMenuBar::AddTeam(BList* team, BBitmap* icon, char* name, char* signature) { float itemWidth = fVertical ? fBarView->Bounds().Width() : sMinimumWindowWidth; float itemHeight = -1.0f; desk_settings* settings = ((TBarApp*)be_app)->Settings(); TTeamMenuItem* item = new TTeamMenuItem(team, icon, name, signature, itemWidth, itemHeight, fDrawLabel, fVertical); if (settings->trackerAlwaysFirst && !strcmp(signature, kTrackerSignature)) { AddItem(item, fFirstApp); } else if (settings->sortRunningApps) { TTeamMenuItem* teamItem = dynamic_cast<TTeamMenuItem*>(ItemAt(fFirstApp)); int32 firstApp = fFirstApp; // if Tracker should always be the first item, we need to skip it // when sorting in the current item if (settings->trackerAlwaysFirst && teamItem != NULL && !strcmp(teamItem->Signature(), kTrackerSignature)) { firstApp++; } int32 count = CountItems(), i; for (i = firstApp; i < count; i++) { teamItem = dynamic_cast<TTeamMenuItem*>(ItemAt(i)); if (teamItem != NULL && strcasecmp(teamItem->Name(), name) > 0) { AddItem(item, i); break; } } // was the item added to the list yet? if (i == count) AddItem(item); } else AddItem(item); if (fVertical) { if (item && fShowTeamExpander && fExpandNewTeams) item->ToggleExpandState(false); fBarView->SizeWindow(BScreen(Window()).Frame()); } else CheckItemSizes(1); Window()->UpdateIfNeeded(); }
void TExpandoMenuBar::MouseMoved(BPoint where, uint32 code, const BMessage* message) { if (message == NULL) { // force a cleanup _FinishedDrag(); switch (code) { case B_ENTERED_VIEW: case B_INSIDE_VIEW: { TTeamMenuItem* item = TeamItemAtPoint(where); if (item == NULL) { // item is NULL, break out fLastMousedOverItem = NULL; break; } if (item->HasLabel()) { // item has a visible label, set the item and break out fLastMousedOverItem = item; break; } if (item == fLastMousedOverItem) { // already set the tooltip for this item, break out break; } // new item, update the tooltip with the item name SetToolTip(item->Name()); // save the current item for the next MouseMoved() call fLastMousedOverItem = item; break; } case B_OUTSIDE_VIEW: case B_EXITED_VIEW: fLastMousedOverItem = NULL; break; } BMenuBar::MouseMoved(where, code, message); return; } uint32 buttons; if (Window()->CurrentMessage() == NULL || Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons) < B_OK) { buttons = 0; } if (buttons == 0) return; switch (code) { case B_ENTERED_VIEW: // fPreviousDragTargetItem should always be NULL here anyways. if (fPreviousDragTargetItem) _FinishedDrag(); fBarView->CacheDragData(message); fPreviousDragTargetItem = NULL; break; case B_OUTSIDE_VIEW: // NOTE: Should not be here, but for the sake of defensive // programming... case B_EXITED_VIEW: _FinishedDrag(); break; case B_INSIDE_VIEW: if (fBarView->Dragging()) { TTeamMenuItem* item = NULL; int32 itemCount = CountItems(); for (int32 i = 0; i < itemCount; i++) { BMenuItem* _item = ItemAt(i); if (_item->Frame().Contains(where)) { item = dynamic_cast<TTeamMenuItem*>(_item); break; } } if (item == fPreviousDragTargetItem) break; if (fPreviousDragTargetItem != NULL) fPreviousDragTargetItem->SetOverrideSelected(false); if (item != NULL) item->SetOverrideSelected(true); fPreviousDragTargetItem = item; } break; } }