BView *BubbleHelper::FindView(BPoint where) { BView *winview=NULL; BWindow *win; long windex=0; while((winview==NULL)&&((win=be_app->WindowAt(windex++))!=NULL)) { if(win!=textwin) { // lock with timeout, in case somebody has a non-running window around // in their app. if(win->LockWithTimeout(1E6)==B_OK) { BRect frame=win->Frame(); if(frame.Contains(where)) { BPoint winpoint; winpoint=where-frame.LeftTop(); winview=win->FindView(winpoint); if(winview) { BRegion region; BPoint newpoint=where; winview->ConvertFromScreen(&newpoint); winview->GetClippingRegion(®ion); if(!region.Contains(newpoint)) winview=0; } } win->Unlock(); } } } return winview; }
void MouseView::MouseDown(BPoint where) { BMessage *mouseMsg = Window()->CurrentMessage(); fButtons = mouseMsg->FindInt32("buttons"); int32 modifiers = mouseMsg->FindInt32("modifiers"); if (modifiers & B_CONTROL_KEY) { if (modifiers & B_COMMAND_KEY) fButtons = B_TERTIARY_MOUSE_BUTTON; else fButtons = B_SECONDARY_MOUSE_BUTTON; } // Get the current clipping region before requesting any updates. // Otherwise those parts would be excluded from the region. BRegion clipping; GetClippingRegion(&clipping); if (fOldButtons != fButtons) { Invalidate(_ButtonsRect()); fOldButtons = fButtons; } const int32* offset = getButtonOffsets(fType); int32 button = -1; for (int32 i = 0; i <= fType; i++) { if (_ButtonRect(offset, i).Contains(where)) { button = i; break; } } if (button < 0) return; // We are setup to receive all mouse events, even if our window // is not active, so make sure that we don't display the menu when // the user clicked inside our view, but another window is on top. if (clipping.Contains(where)) { button = _ConvertFromVisualOrder(button); BPopUpMenu menu("Mouse Map Menu"); BMessage message(kMsgMouseMap); message.AddInt32("button", button); menu.AddItem(new BMenuItem("1", new BMessage(message))); menu.AddItem(new BMenuItem("2", new BMessage(message))); menu.AddItem(new BMenuItem("3", new BMessage(message))); menu.ItemAt(getMappingNumber(fSettings.Mapping(button))) ->SetMarked(true); menu.SetTargetForItems(Window()); ConvertToScreen(&where); menu.Go(where, true); } }
void PadView::MouseDown(BPoint where) { BWindow* window = Window(); if (window == NULL) return; BRegion region; GetClippingRegion(®ion); if (!region.Contains(where)) return; bool handle = true; for (int32 i = 0; BView* child = ChildAt(i); i++) { if (child->Frame().Contains(where)) { handle = false; break; } } if (!handle) return; BMessage* message = window->CurrentMessage(); if (message == NULL) return; uint32 buttons; message->FindInt32("buttons", (int32*)&buttons); if (buttons & B_SECONDARY_MOUSE_BUTTON) { BRect r = Bounds(); r.InsetBy(2.0, 2.0); r.top += 6.0; if (r.Contains(where)) { DisplayMenu(where); } else { // sends the window to the back window->Activate(false); } } else { if (system_time() - fClickTime < sActivationDelay) { window->Minimize(true); fClickTime = 0; } else { window->Activate(); fDragOffset = ConvertToScreen(where) - window->Frame().LeftTop(); fDragging = true; SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); fClickTime = system_time(); } } }
HyperTextAction* HyperTextView::_ActionAt(const BPoint& where) const { int32 offset = OffsetAt(where); ActionInfo pointer(offset, offset + 1, NULL); const ActionInfo* action = fActionInfos->BinarySearch(pointer, ActionInfo::CompareEqualIfIntersecting); if (action != NULL) { // verify that the text region was hit BRegion textRegion; GetTextRegion(action->startOffset, action->endOffset, &textRegion); if (textRegion.Contains(where)) return action->action; } return NULL; }
void TPanelWindowView::MessageReceived( BMessage *message ) { if ( fDebugLevel >= 20 ) message->PrintToStream(); if ( message->what == B_GET_PROPERTY || message->what == B_SET_PROPERTY || message->what == B_COUNT_PROPERTIES || message->what == B_CREATE_PROPERTY || message->what == B_DELETE_PROPERTY || message->what == B_EXECUTE_PROPERTY ) { int32 index, what; BMessage specifier; const char *property; if ( message->GetCurrentSpecifier( &index, &specifier, &what, &property ) == B_OK ) { BMessage reply( B_REPLY ); if ( message->what == B_GET_PROPERTY || message->what == B_COUNT_PROPERTIES || message->what == B_EXECUTE_PROPERTY ) { if ( GetOptions( property, &reply ) ) reply.AddInt32( "error", 0 ); else reply.AddInt32( "error", -1 ); } else if ( message->what == B_SET_PROPERTY ) { if ( SetOptions( property, message ) ) reply.AddInt32( "error", 0 ); else reply.AddInt32( "error", -1 ); } else if ( message->what == B_CREATE_PROPERTY ) { if ( !strcasecmp( property, "tab" ) ) { int32 index; if ( message->FindInt32( "index", &index ) != B_OK ) index = -1; TShortcutPanel *panel = new TShortcutPanel( this ); fPanels.Lock(); if ( index >= 0 ) { TInnerPanel *rightpanel = fPanels.ItemAt(index); AddPanel( panel, rightpanel ); } else { AddPanel( panel ); } fPanels.Unlock(); ChangedSize(0); reply.AddInt32( "error", 0 ); } else reply.AddInt32( "error", -1 ); } else if ( message->what == B_DELETE_PROPERTY ) { int32 index; if ( specifier.FindInt32( "index", &index ) != B_OK ) reply.AddInt32( "error", -1 ); else { fPanels.Lock(); TInnerPanel *panel = fPanels.ItemAt(index); if ( !panel ) reply.AddInt32( "error", -1 ); else { if ( panel != fRunningAppPanel ) { RemovePanel( panel ); reply.AddInt32( "error", 0 ); } else reply.AddInt32( "error", -1 ); } fPanels.Unlock(); } } message->SendReply( &reply ); } return; } if ( message->WasDropped() ) { BPoint point = message->DropPoint(); ConvertFromScreen( &point ); TInnerPanel *panel = PanelAt( point ); if ( message->what == 'IDRG' ) { TPanelIcon *item; if ( message->FindPointer( "source", (void**)&item ) == B_OK ) { TRaisingIconPanel *previous_parent = item->fParent; TRaisingIconPanel *rpanel; if ( modifiers() & B_CONTROL_KEY ) { rpanel = new TShortcutPanel(this); bool left = false; if ( point.x < (panel->Frame().left+(panel->Frame().Width()/2) ) ) { left = true; } rpanel = new TShortcutPanel(this); AddPanel( rpanel, left ? panel : 0 ); } else rpanel = dynamic_cast<TRaisingIconPanel*>(panel); if ( rpanel && rpanel != fRunningAppPanel ) { TPanelIcon *icon = rpanel->IconAt( point, true ); if ( previous_parent == fRunningAppPanel && dynamic_cast<TShortcutPanel*>(rpanel) ) { int32 index = rpanel->IndexOf(icon); AddShortcut( dynamic_cast<TShortcutPanel*>(rpanel), dynamic_cast<TAppPanelIcon*>(item)->Ref(), index ); } else if ( !dynamic_cast<TTrashIcon*>(icon) || (modifiers() & B_SHIFT_KEY) ) { previous_parent->RemoveItem( item, false ); int32 index = rpanel->IndexOf(icon); rpanel->AddItem( item, index ); } else { if ( item->Removable() ) RemoveShortcut(item); } if ( previous_parent->CountItems() == 0 && previous_parent != fRunningAppPanel ) RemovePanel( previous_parent ); } } } else { if ( panel && panel->HitsFrame( point ) ) { panel->HandleDroppedMessage( message, point ); } else { HandleDroppedMessage( message, point ); } } return; } switch ( message->what ) { case kPanelWindowViewTimer: { if ( DoIconSmallerWithTime() == 0 ) { fTimer->SetInterval( 999999999 ); } break; } case T_MENU_CLOSED: { DebugCall( 8, "Got T_MENU_CLOSED" ); TAwarePopupMenu *source; if ( message->FindPointer( "source", (void**)&source ) == B_OK ) { if ( source == fOpenMenu ) { DebugCall( 9, "fOpenMenu is now 0" ); fOpenMenu = 0; BPoint point; uint32 buttons; GetMouse( &point, &buttons ); if ( !Bounds().Contains( point ) ) Window()->PostMessage(B_EXITED_VIEW); } } break; } case B_SOME_APP_LAUNCHED: { team_id tid; if ( message->FindInt32( "be:team", &tid ) != B_OK ) break; const char *sig; if ( message->FindString( "be:signature", &sig ) != B_OK ) break; entry_ref ref; if ( message->FindRef( "be:ref", &ref ) != B_OK ) break; int32 flags; if ( message->FindInt32( "be:flags", &flags ) != B_OK ) break; if ( sig && strlen(sig) && ( ( flags & B_BACKGROUND_APP ) == 0 ) ) AddTeam( tid, sig, ref ); break; } case B_SOME_APP_QUIT: { team_id tid; if ( message->FindInt32( "be:team", &tid ) != B_OK ) break; RemoveTeam( tid ); break; } case B_SOME_APP_ACTIVATED: { team_id tid; if ( message->FindInt32( "be:team", &tid ) == B_OK ) { TAppPanelIcon *icon = ItemWith( tid ); if ( icon != fLastActiveAppIcon ) { DebugCall( 10, "B_SOME_APP_ACTIVATED %p[..]->%p[%i]", fLastActiveAppIcon, icon, tid ); if ( fLastActiveAppIcon ) fLastActiveAppIcon->SetActive( false ); if ( icon ) icon->SetActive( true ); fLastActiveAppIcon = icon; } } BString temp; message->FindString( "be:signature", &temp ); if ( temp != "application/x-vnd.Be-TSKB" ) fLastActivatedAppSig = temp; break; } case kDoBubbleHelp: { BPoint point; uint32 buttons; GetMouse(&point, &buttons); if ( fPreviousMousePosition != point ) { if ( fBubbleCounter > 0 ) { if ( fBubbleCounter >= 6 ) { fBubbleHelp->HideBubble(); } fBubbleCounter = 0; } fPreviousMousePosition = point; } else { BRegion region; GetClippingRegion(®ion); if ( region.Contains( point ) ) { fBubbleCounter ++; if ( fBubbleCounter == 6 ) { ConvertToScreen(&point); TBubbleTarget *target = fBubbleHelp->TargetAt( point ); if (dynamic_cast<TTrackerIcon*>(target)) { TTrackerIcon *trackerIcon = dynamic_cast<TTrackerIcon*>(target); point.x = Window()->Frame().left + trackerIcon->ContentLocation().x + trackerIcon->Frame().Width() + 4; point.y = Window()->Frame().top; float height = TBubbleHelp::BubbleHeight(target); point.y += height; point.y += (Window()->Frame().Height() - height)/2 -4; } fBubbleHelp->ShowBubble( point, target ); } // else if ( fBubbleCounter == 12 ) // { // fBubbleHelp->HideBubble(); // } } } break; } case 'flsh': { BMessenger target; if ( message->FindMessenger("source", &target ) == B_OK && target.IsValid() ) { TAppPanelIcon *teamicon = ItemWith( target.Team() ); if ( teamicon ) { // todo: flashing teamicon->Flash(); } } break; } case 'mctx': { // todo: context menus break; } default: BView::MessageReceived(message); } }