virtual void MessageReceived(BMessage* message) { switch (message->what) { case MSG_SCROLL_TABS_LEFT: fTabContainerView->SetFirstVisibleTabIndex( fTabContainerView->FirstVisibleTabIndex() - 1); break; case MSG_SCROLL_TABS_RIGHT: fTabContainerView->SetFirstVisibleTabIndex( fTabContainerView->FirstVisibleTabIndex() + 1); break; case MSG_OPEN_TAB_MENU: { BPopUpMenu* tabMenu = new BPopUpMenu("tab menu", true, false); int tabCount = fTabContainerView->GetLayout()->CountItems(); for (int i = 0; i < tabCount; i++) { TabView* tab = fTabContainerView->TabAt(i); if (tab) { BMenuItem* item = new BMenuItem(tab->Label(), NULL); tabMenu->AddItem(item); if (tab->IsFront()) item->SetMarked(true); } } // Force layout to get the final menu size. InvalidateLayout() // did not seem to work here. tabMenu->AttachedToWindow(); BRect buttonFrame = fTabMenuButton->Frame(); BRect menuFrame = tabMenu->Frame(); BPoint openPoint = ConvertToScreen(buttonFrame.LeftBottom()); // Open with the right side of the menu aligned with the right // side of the button and a little below. openPoint.x -= menuFrame.Width() - buttonFrame.Width(); openPoint.y += 2; BMenuItem *selected = tabMenu->Go(openPoint, false, false, ConvertToScreen(buttonFrame)); if (selected) { selected->SetMarked(true); int32 index = tabMenu->IndexOf(selected); if (index != B_ERROR) fTabContainerView->SelectTab(index); } fTabMenuButton->MenuClosed(); delete tabMenu; break; } default: BGroupView::MessageReceived(message); break; } }