wxCustomButton::~wxCustomButton() { if (HasCapture()) ReleaseMouse(); if (m_timer) delete m_timer; }
void wxSashWindow::OnMouseEvent(wxMouseEvent& event) { wxCoord x, y; event.GetPosition(&x, &y); wxSashEdgePosition sashHit = SashHitTest(x, y); if (event.LeftDown()) { CaptureMouse(); m_mouseCaptured = true; if ( sashHit != wxSASH_NONE ) { // Required for X to specify that // that we wish to draw on top of all windows // - and we optimise by specifying the area // for creating the overlap window. // Find the first frame or dialog and use this to specify // the area to draw on. wxWindow* parent = this; while (parent && !parent->IsKindOf(CLASSINFO(wxDialog)) && !parent->IsKindOf(CLASSINFO(wxFrame))) parent = parent->GetParent(); wxScreenDC::StartDrawingOnTop(parent); // We don't say we're dragging yet; we leave that // decision for the Dragging() branch, to ensure // the user has dragged a little bit. m_dragMode = wxSASH_DRAG_LEFT_DOWN; m_draggingEdge = sashHit; m_firstX = x; m_firstY = y; if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) ) { if (m_currentCursor != m_sashCursorWE) { SetCursor(*m_sashCursorWE); } m_currentCursor = m_sashCursorWE; } else { if (m_currentCursor != m_sashCursorNS) { SetCursor(*m_sashCursorNS); } m_currentCursor = m_sashCursorNS; } } } else if ( event.LeftUp() && m_dragMode == wxSASH_DRAG_LEFT_DOWN ) { // Wasn't a proper drag if (m_mouseCaptured) ReleaseMouse(); m_mouseCaptured = false; wxScreenDC::EndDrawingOnTop(); m_dragMode = wxSASH_DRAG_NONE; m_draggingEdge = wxSASH_NONE; } else if (event.LeftUp() && m_dragMode == wxSASH_DRAG_DRAGGING) { // We can stop dragging now and see what we've got. m_dragMode = wxSASH_DRAG_NONE; if (m_mouseCaptured) ReleaseMouse(); m_mouseCaptured = false; // Erase old tracker DrawSashTracker(m_draggingEdge, m_oldX, m_oldY); // End drawing on top (frees the window used for drawing // over the screen) wxScreenDC::EndDrawingOnTop(); int w, h; GetSize(&w, &h); int xp, yp; GetPosition(&xp, &yp); wxSashEdgePosition edge = m_draggingEdge; m_draggingEdge = wxSASH_NONE; wxRect dragRect; wxSashDragStatus status = wxSASH_STATUS_OK; // the new height and width of the window - if -1, it didn't change int newHeight = wxDefaultCoord, newWidth = wxDefaultCoord; // NB: x and y may be negative and they're relative to the sash window // upper left corner, while xp and yp are expressed in the parent // window system of coordinates, so adjust them! After this // adjustment, all coordinates are relative to the parent window. y += yp; x += xp; switch (edge) { case wxSASH_TOP: if ( y > yp + h ) { // top sash shouldn't get below the bottom one status = wxSASH_STATUS_OUT_OF_RANGE; } else { newHeight = h - (y - yp); } break; case wxSASH_BOTTOM: if ( y < yp ) { // bottom sash shouldn't get above the top one status = wxSASH_STATUS_OUT_OF_RANGE; } else { newHeight = y - yp; } break; case wxSASH_LEFT: if ( x > xp + w ) { // left sash shouldn't get beyond the right one status = wxSASH_STATUS_OUT_OF_RANGE; } else { newWidth = w - (x - xp); } break; case wxSASH_RIGHT: if ( x < xp ) { // and the right sash, finally, shouldn't be beyond the // left one status = wxSASH_STATUS_OUT_OF_RANGE; } else { newWidth = x - xp; } break; case wxSASH_NONE: // can this happen at all? break; } if ( newHeight == wxDefaultCoord ) { // didn't change newHeight = h; } else { // make sure it's in m_minimumPaneSizeY..m_maximumPaneSizeY range newHeight = wxMax(newHeight, m_minimumPaneSizeY); newHeight = wxMin(newHeight, m_maximumPaneSizeY); } if ( newWidth == wxDefaultCoord ) { // didn't change newWidth = w; } else { // make sure it's in m_minimumPaneSizeY..m_maximumPaneSizeY range newWidth = wxMax(newWidth, m_minimumPaneSizeX); newWidth = wxMin(newWidth, m_maximumPaneSizeX); } dragRect = wxRect(x, y, newWidth, newHeight); wxSashEvent event(GetId(), edge); event.SetEventObject(this); event.SetDragStatus(status); event.SetDragRect(dragRect); GetEventHandler()->ProcessEvent(event); } else if ( event.LeftUp() ) { if (m_mouseCaptured) ReleaseMouse(); m_mouseCaptured = false; } else if (event.Moving() && !event.Dragging()) { // Just change the cursor if required if ( sashHit != wxSASH_NONE ) { if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) ) { if (m_currentCursor != m_sashCursorWE) { SetCursor(*m_sashCursorWE); } m_currentCursor = m_sashCursorWE; } else { if (m_currentCursor != m_sashCursorNS) { SetCursor(*m_sashCursorNS); } m_currentCursor = m_sashCursorNS; } } else { SetCursor(wxNullCursor); m_currentCursor = NULL; } } else if ( event.Dragging() && ((m_dragMode == wxSASH_DRAG_DRAGGING) || (m_dragMode == wxSASH_DRAG_LEFT_DOWN)) ) { if ( (m_draggingEdge == wxSASH_LEFT) || (m_draggingEdge == wxSASH_RIGHT) ) { if (m_currentCursor != m_sashCursorWE) { SetCursor(*m_sashCursorWE); } m_currentCursor = m_sashCursorWE; } else { if (m_currentCursor != m_sashCursorNS) { SetCursor(*m_sashCursorNS); } m_currentCursor = m_sashCursorNS; } if (m_dragMode == wxSASH_DRAG_LEFT_DOWN) { m_dragMode = wxSASH_DRAG_DRAGGING; DrawSashTracker(m_draggingEdge, x, y); } else { if ( m_dragMode == wxSASH_DRAG_DRAGGING ) { // Erase old tracker DrawSashTracker(m_draggingEdge, m_oldX, m_oldY); // Draw new one DrawSashTracker(m_draggingEdge, x, y); } } m_oldX = x; m_oldY = y; } else if ( event.LeftDClick() ) { // Nothing } else { } }
void wxCustomButton::OnMouseEvents(wxMouseEvent& event) { if (m_button_style & wxCUSTBUT_NOTOGGLE) return; if (event.LeftDown() || event.RightDown()) { if (!HasCapture()) CaptureMouse(); // keep depressed until up m_down++; Redraw(); } else if (event.LeftDClick() || event.RightDClick()) { m_down++; // GTK eats second down event Redraw(); } else if (event.LeftUp()) { if (HasCapture()) ReleaseMouse(); m_eventType = wxEVT_LEFT_UP; if (wxRect(wxPoint(0,0), GetSize()).Inside(event.GetPosition())) { if ((m_button_style & wxCUSTBUT_BUTTON) && (m_down > 0)) { m_down = 0; Redraw(); SendEvent(); return; } else { if (!m_timer) { m_timer = new wxTimer(this, m_down+1); m_timer->Start(200, true); } else { m_eventType = wxEVT_LEFT_DCLICK; } if ((m_button_style & wxCUSTBUT_TOGGLE) && (m_button_style & wxCUSTBUT_TOG_DCLICK_BUT)) m_down++; } } Redraw(); } else if (event.RightUp()) { if (HasCapture()) ReleaseMouse(); m_eventType = wxEVT_RIGHT_UP; if (wxRect(wxPoint(0,0), GetSize()).Inside(event.GetPosition())) { if ((m_button_style & wxCUSTBUT_BUTTON) && (m_down > 0)) { m_down = 0; Redraw(); SendEvent(); return; } else { m_down++; if (!m_timer) { m_timer = new wxTimer(this, m_down); m_timer->Start(250, true); } else { m_eventType = wxEVT_RIGHT_DCLICK; } } } Redraw(); } else if (event.Entering()) { m_focused = true; if ((event.LeftIsDown() || event.RightIsDown()) && HasCapture()) m_down++; Redraw(); } else if (event.Leaving()) { m_focused = false; if ((event.LeftIsDown() || event.RightIsDown()) && HasCapture()) m_down--; Redraw(); } }
void wxToolBar::OnMouseEvent( wxMouseEvent& rEvent ) { POINTL vPoint; HWND hWnd; wxCoord vX; wxCoord vY; HPOINTER hPtr = ::WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE); ::WinSetPointer(HWND_DESKTOP, hPtr); ::WinQueryPointerPos(HWND_DESKTOP, &vPoint); hWnd = ::WinWindowFromPoint(HWND_DESKTOP, &vPoint, TRUE); if (hWnd != (HWND)GetHwnd()) { m_vToolTimer.Stop(); return; } rEvent.GetPosition(&vX, &vY); wxToolBarTool* pTool = (wxToolBarTool *)FindToolForPosition( vX ,vY ); if (rEvent.LeftDown()) { CaptureMouse(); } if (rEvent.LeftUp()) { ReleaseMouse(); } if (!pTool) { m_vToolTimer.Stop(); if (m_nCurrentTool > -1) { if (rEvent.LeftIsDown()) SpringUpButton(m_nCurrentTool); pTool = (wxToolBarTool *)FindById(m_nCurrentTool); if (pTool && !pTool->IsToggled()) { RaiseTool( pTool, FALSE ); } m_nCurrentTool = -1; OnMouseEnter(-1); } return; } if (!rEvent.IsButton()) { if (pTool->GetId() != m_nCurrentTool) { // // If the left button is kept down and moved over buttons, // press those buttons. // if (rEvent.LeftIsDown() && pTool->IsEnabled()) { SpringUpButton(m_nCurrentTool); if (pTool->CanBeToggled()) { pTool->Toggle(); } DrawTool(pTool); } wxToolBarTool* pOldTool = (wxToolBarTool*)FindById(m_nCurrentTool); if (pOldTool && !pTool->IsToggled()) RaiseTool( pOldTool, FALSE ); m_nCurrentTool = pTool->GetId(); OnMouseEnter(m_nCurrentTool); if (!pTool->GetShortHelp().empty()) { if (m_pToolTip) delete m_pToolTip; m_pToolTip = new wxToolTip(pTool->GetShortHelp()); m_vXMouse = (wxCoord)vPoint.x; m_vYMouse = (wxCoord)vPoint.y; m_vToolTimer.Start(1000L, TRUE); } if (!pTool->IsToggled()) RaiseTool(pTool); } return; } // Left button pressed. if (rEvent.LeftDown() && pTool->IsEnabled()) { if (pTool->CanBeToggled()) { pTool->Toggle(); } DrawTool(pTool); } else if (rEvent.RightDown()) { OnRightClick( pTool->GetId() ,vX ,vY ); } // // Left Button Released. Only this action confirms selection. // If the button is enabled and it is not a toggle tool and it is // in the pressed state, then raise the button and call OnLeftClick. // if (rEvent.LeftUp() && pTool->IsEnabled() ) { // // Pass the OnLeftClick event to tool // if (!OnLeftClick( pTool->GetId() ,pTool->IsToggled()) && pTool->CanBeToggled()) { // // If it was a toggle, and OnLeftClick says No Toggle allowed, // then change it back // pTool->Toggle(); } DrawTool(pTool); } } // end of wxToolBar::OnMouseEvent
void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { int x = (int)event.GetX(), y = (int)event.GetY(); if ( GetWindowStyle() & wxSP_NOSASH ) { event.Skip(); return; } bool isLive = IsLive(this); if (event.LeftDown()) { if ( SashHitTest(x, y) ) { // Start the drag now m_dragMode = wxSPLIT_DRAG_DRAGGING; // Capture mouse and set the cursor CaptureMouse(); SetResizeCursor(); if ( !isLive ) { // remember the initial sash position and draw the initial // shadow sash m_sashPositionCurrent = m_sashPosition; m_oldX = (m_splitMode == wxSPLIT_VERTICAL ? m_sashPositionCurrent : x); m_oldY = (m_splitMode != wxSPLIT_VERTICAL ? m_sashPositionCurrent : y); DrawSashTracker(m_oldX, m_oldY); } m_ptStart = wxPoint(x,y); m_sashStart = m_sashPosition; return; } } else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING) { // We can stop dragging now and see what we've got. m_dragMode = wxSPLIT_DRAG_NONE; // Release mouse and unset the cursor ReleaseMouse(); SetCursor(* wxSTANDARD_CURSOR); // exit if unsplit after doubleclick if ( !IsSplit() ) { return; } // Erase old tracker if ( !isLive ) { DrawSashTracker(m_oldX, m_oldY); } // the position of the click doesn't exactly correspond to // m_sashPosition, rather it changes it by the distance by which the // mouse has moved int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_ptStart.x : y - m_ptStart.y; int posSashNew = OnSashPositionChanging(m_sashStart + diff); if ( posSashNew == -1 ) { // change not allowed return; } if ( m_permitUnsplitAlways || m_minimumPaneSize == 0 ) { // Deal with possible unsplit scenarios if ( posSashNew == 0 ) { // We remove the first window from the view wxWindow *removedWindow = m_windowOne; m_windowOne = m_windowTwo; m_windowTwo = NULL; OnUnsplit(removedWindow); wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); eventUnsplit.m_data.win = removedWindow; (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else if ( posSashNew == GetWindowSize() ) { // We remove the second window from the view wxWindow *removedWindow = m_windowTwo; m_windowTwo = NULL; OnUnsplit(removedWindow); wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); eventUnsplit.m_data.win = removedWindow; (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else { SetSashPositionAndNotify(posSashNew); } } else { SetSashPositionAndNotify(posSashNew); } SizeWindows(); } // left up && dragging else if ((event.Moving() || event.Leaving() || event.Entering()) && (m_dragMode == wxSPLIT_DRAG_NONE)) { if ( event.Leaving() || !SashHitTest(x, y) ) OnLeaveSash(); else OnEnterSash(); } else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) { int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_ptStart.x : y - m_ptStart.y; int posSashNew = OnSashPositionChanging(m_sashStart + diff); if ( posSashNew == -1 ) { // change not allowed return; } if ( !isLive ) { if ( posSashNew == m_sashPositionCurrent ) return; m_sashPositionCurrent = posSashNew; // Erase old tracker DrawSashTracker(m_oldX, m_oldY); m_oldX = (m_splitMode == wxSPLIT_VERTICAL ? m_sashPositionCurrent : x); m_oldY = (m_splitMode != wxSPLIT_VERTICAL ? m_sashPositionCurrent : y); #ifdef __WXMSW__ // As we captured the mouse, we may get the mouse events from outside // our window - for example, negative values in x, y. This has a weird // consequence under MSW where we use unsigned values sometimes and // signed ones other times: the coordinates turn as big positive // numbers and so the sash is drawn on the *right* side of the window // instead of the left (or bottom instead of top). Correct this. if ( (short)m_oldX < 0 ) m_oldX = 0; if ( (short)m_oldY < 0 ) m_oldY = 0; #endif // __WXMSW__ // Draw new one DrawSashTracker(m_oldX, m_oldY); } else { if ( posSashNew == m_sashPosition ) return; DoSetSashPosition(posSashNew); // in live mode, the new position is the actual sash position, clear requested position! m_requestedSashPosition = INT_MAX; m_needUpdating = true; } } else if ( event.LeftDClick() && m_windowTwo ) { OnDoubleClickSash(x, y); } else { event.Skip(); } }
void AButton::OnMouseEvent(wxMouseEvent & event) { wxSize clientSize = GetClientSize(); AButtonState prevState = GetState(); if (event.Entering()) mCursorIsInWindow = true; else if (event.Leaving()) mCursorIsInWindow = false; else mCursorIsInWindow = (event.m_x >= 0 && event.m_y >= 0 && event.m_x < clientSize.x && event.m_y < clientSize.y); if (HasAlternateImages() && !mButtonIsDown) mAlternate = event.ShiftDown(); if (mEnabled && event.IsButton()) { if (event.ButtonIsDown(wxMOUSE_BTN_ANY)) { mIsClicking = true; CaptureMouse(); } else if (mIsClicking) { mIsClicking = false; if (HasCapture()) ReleaseMouse(); if (mCursorIsInWindow && (mToggle || !mButtonIsDown)) { if (mToggle) mButtonIsDown = !mButtonIsDown; else mButtonIsDown = true; mWasShiftDown = event.ShiftDown(); mWasControlDown = event.ControlDown(); Click(); } } } // Only redraw and change tooltips if the state has changed. AButtonState newState = GetState(); if (newState != prevState) { Refresh(false); if (mCursorIsInWindow) { #if wxUSE_TOOLTIPS // Not available in wxX11 // Display the tooltip in the status bar wxToolTip * pTip = this->GetToolTip(); if( pTip ) { wxString tipText = pTip->GetTip(); if (!mEnabled) tipText += _(" (disabled)"); GetActiveProject()->TP_DisplayStatusMessage(tipText); } #endif } else { GetActiveProject()->TP_DisplayStatusMessage(wxT("")); } } }
void ExportMixerPanel::OnMouseEvent(wxMouseEvent & event) { if( event.ButtonDown() ) { CaptureMouse(); bool reset = true; //check tracks for( int i = 0; i < mMixerSpec->GetNumTracks(); i++ ) if( mTrackRects[ i ].Inside( event.m_x, event.m_y ) ) { reset = false; if( mSelectedTrack == i ) mSelectedTrack = -1; else { mSelectedTrack = i; if( mSelectedChannel != -1 ) mMixerSpec->mMap[ mSelectedTrack ][ mSelectedChannel ] = !mMixerSpec->mMap[ mSelectedTrack ][ mSelectedChannel ]; } goto found; } //check channels for( int i = 0; i < mMixerSpec->GetNumChannels(); i++ ) if( mChannelRects[ i ].Inside( event.m_x, event.m_y ) ) { reset = false; if( mSelectedChannel == i ) mSelectedChannel = -1; else { mSelectedChannel = i; if( mSelectedTrack != -1 ) mMixerSpec->mMap[ mSelectedTrack ][ mSelectedChannel ] = !mMixerSpec->mMap[ mSelectedTrack ][ mSelectedChannel ]; } goto found; } //check links for( int i = 0; i < mMixerSpec->GetNumTracks(); i++ ) for( int j = 0; j < mMixerSpec->GetNumChannels(); j++ ) if( mMixerSpec->mMap[ i ][ j ] && IsOnLine( wxPoint( event.m_x, event.m_y ), wxPoint( mTrackRects[ i ].x + mBoxWidth, mTrackRects[ i ].y + mTrackHeight / 2 ), wxPoint( mChannelRects[ j ].x, mChannelRects[ j ].y + mChannelHeight / 2 ) ) ) mMixerSpec->mMap[ i ][ j ] = false; found: if( reset ) mSelectedTrack = mSelectedChannel = -1; Refresh( false ); } if( event.ButtonUp() ) { if( HasCapture() ) ReleaseMouse(); } }
WeightsManFrame::~WeightsManFrame() { if (HasCapture()) ReleaseMouse(); DeregisterAsActive(); w_man_state->removeObserver(this); }
ToolFrame::~ToolFrame() { if(HasCapture()) ReleaseMouse(); }
void mmMultiButton::OnMouse(wxMouseEvent& event) // Update button state { #ifdef __MMDEBUG__ //*gDebug<<"mmMultiButton::OnMouse,type:"<<event.GetEventType()<<"\n"; #endif mIsActivated = FALSE; if ((mStyle & mmMB_STATIC) || !IsEnabled()) { mHasFocus = FALSE; mIsToggleDown = FALSE; mIsWholeDropToggleDown = FALSE; mIsDropToggleDown = FALSE; mIsSelected = FALSE; return; } if (!(mStyle & mmMB_TOGGLE)) mIsToggleDown = FALSE; if (!(mStyle & mmMB_WHOLEDROPDOWN)) mIsWholeDropToggleDown = FALSE; if (!(mStyle & mmMB_DROPDOWN)) mIsDropToggleDown = FALSE; bool focus_changed = FALSE, toggle_changed = FALSE, wholedroptoggle_changed = FALSE, droptoggle_changed = FALSE, selected_changed = FALSE; int w,h; GetClientSize(&w,&h); wxPoint mp = event.GetPosition(); if (event.Entering()) { // ENTER if ((mStyle & mmMB_AUTODRAW) || (mStyle & mmMB_FOCUS)) focus_changed = !mHasFocus; mHasFocus = TRUE; } else if (event.Leaving()) { // LEAVE mIsSelected = FALSE; if (!mIsDropToggleDown && !mIsWholeDropToggleDown) { if ((mStyle & mmMB_AUTODRAW) || (mStyle & mmMB_FOCUS)) focus_changed = mHasFocus; mHasFocus = FALSE; if (HasCapture()) ReleaseMouse(); } } else if (event.LeftDown() || event.LeftDClick()) { // SELECT if (mStyle & mmMB_TOGGLE) { // TOGGLE if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; CaptureMouse(); } else if (mStyle & mmMB_WHOLEDROPDOWN) { // WHOLEDROPDOWN if (MouseIsOnButton()) { if (!mIsSelected) selected_changed = TRUE; mIsSelected = TRUE; wholedroptoggle_changed = TRUE; mIsWholeDropToggleDown = !mIsWholeDropToggleDown; if (mIsWholeDropToggleDown) CaptureMouse(); else if (HasCapture()) ReleaseMouse(); } else { // Pressed outside of button if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; if (mIsWholeDropToggleDown) wholedroptoggle_changed = TRUE; mIsWholeDropToggleDown = FALSE; if (HasCapture()) ReleaseMouse(); } } else /* if (mStyle & mmMB_DROPDOWN) { // DROPDOWN if (mp.x > w-gDownBM.GetWidth()-mBorderSize && mp.x < w && mp.y > mBorderSize && mp.y < h-mBorderSize) { // Drop down arrow pressed if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; droptoggle_changed = TRUE; mIsDropToggleDown = !mIsDropToggleDown; if (mIsDropToggleDown) CaptureMouse(); else if (HasCapture()) ReleaseMouse(); } else if (MouseIsOnButton()) { // Button (not arrow) pressed if (!mIsSelected) selected_changed = TRUE; mIsSelected = TRUE; //if (mIsDropToggleDown) //droptoggle_changed = TRUE; //mIsDropToggleDown = FALSE; CaptureMouse(); } else { // Pressed outside of button if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; if (mIsDropToggleDown) droptoggle_changed = TRUE; mIsDropToggleDown = FALSE; if (HasCapture()) ReleaseMouse(); } } else */ { // 'Normal' button if (!mIsSelected) selected_changed = TRUE; mIsSelected = TRUE; CaptureMouse(); } if (!MouseIsOnButton()) { focus_changed = mHasFocus; mHasFocus = FALSE; } } else if (event.LeftUp()) { // ACTIVATE if (mStyle & mmMB_TOGGLE) { // TOGGLE if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; toggle_changed = TRUE; mIsToggleDown = !mIsToggleDown; if (HasCapture()) ReleaseMouse(); } else if (mStyle & mmMB_WHOLEDROPDOWN) { // WHOLEDROPDOWN if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; if (!mIsWholeDropToggleDown) if (HasCapture()) ReleaseMouse(); } /* else if (mStyle & mmMB_DROPDOWN) { // DROPDOWN if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; if (mp.x > w-gDownBM.GetWidth()-mBorderSize && mp.x < w && mp.y > mBorderSize && mp.y < h-mBorderSize) { // Drop down arrow pressed if (!mIsDropToggleDown) if (HasCapture()) ReleaseMouse(); } else if (MouseIsOnButton()) { // Button (not arrow) pressed if (mIsDropToggleDown) droptoggle_changed = TRUE; mIsDropToggleDown = FALSE; if (!droptoggle_changed) mIsActivated = TRUE; // NOTE! SEND ACTIVATE SIGNAL! if (HasCapture()) ReleaseMouse(); } } */ else { // 'Normal' button if (mIsSelected) selected_changed = TRUE; mIsSelected = FALSE; mIsActivated = TRUE; // NOTE! SEND ACTIVATE SIGNAL! if (HasCapture()) ReleaseMouse(); } } // Redraw only if neccessary if (focus_changed || selected_changed || wholedroptoggle_changed || droptoggle_changed || toggle_changed) { Refresh(); // Generate events to let derived class know what happened if (focus_changed) { // ENTER/LEAVE wxCommandEvent ev(event.GetEventType(),GetId()); if (mHasFocus) ev.SetEventType(wxEVT_ENTER_WINDOW); else ev.SetEventType(wxEVT_LEAVE_WINDOW); GetEventHandler()->ProcessEvent(ev); // Neccessary? } if (toggle_changed) { // TOGGLE wxCommandEvent ev(mmEVT_TOGGLE,GetId()); GetEventHandler()->ProcessEvent(ev); } if (wholedroptoggle_changed) { // WHOLEDROPDOWN wxCommandEvent ev(mmEVT_WHOLEDROP_TOGGLE,GetId()); GetEventHandler()->ProcessEvent(ev); } if (droptoggle_changed) { // DROPDOWN wxCommandEvent ev(mmEVT_DROP_TOGGLE,GetId()); GetEventHandler()->ProcessEvent(ev); } if (selected_changed) { // SELECT wxCommandEvent ev(wxEVT_COMMAND_LEFT_CLICK,GetId()); GetEventHandler()->ProcessEvent(ev); } if (mIsActivated) { // ACTIVATE wxCommandEvent ev(wxEVT_COMMAND_BUTTON_CLICKED,GetId()); GetEventHandler()->ProcessEvent(ev); } } // if event.Skip(); } // OnMouse
void GribGrabberWin::OnMouseEvent( wxMouseEvent& event ) { if( event.RightDown() ) { wxMouseEvent evt(event); ((wxEvtHandler*)GetParent())->ProcessEvent( evt ); return; } static wxPoint s_gspt; int x, y; event.GetPosition( &x, &y ); wxPoint spt = ClientToScreen( wxPoint( x, y ) ); #ifdef __WXOSX__ if (!m_bLeftDown && event.LeftIsDown()) { m_bLeftDown = true; s_gspt = spt; if (!HasCapture()) CaptureMouse(); } else if (m_bLeftDown && !event.LeftIsDown()) { // GetParent()->Move( GetParent()->GetPosition() ); m_bLeftDown = false; if (HasCapture()) ReleaseMouse(); } #else if( event.LeftDown() ) { s_gspt = spt; CaptureMouse(); } if( event.LeftUp() ) { //GetParent()->Move( GetParent()->GetPosition() ); if( HasCapture() ) ReleaseMouse(); } #endif if( event.Dragging() ) { wxPoint par_pos_old = GetParent()->GetPosition(); wxPoint par_pos = par_pos_old; par_pos.x += spt.x - s_gspt.x; par_pos.y += spt.y - s_gspt.y; wxPoint pos_in_parent = GetOCPNCanvasWindow()->ScreenToClient( par_pos ); wxPoint pos_in_parent_old = GetOCPNCanvasWindow()->ScreenToClient( par_pos_old ); // X if( pos_in_parent.x < pos_in_parent_old.x ) { // moving left if( pos_in_parent.x < 10 ) { pos_in_parent.x = 0; } } else if( pos_in_parent.x > pos_in_parent_old.x ) { // moving right int max_right = GetOCPNCanvasWindow()->GetClientSize().x - GetParent()->GetSize().x; if( pos_in_parent.x > ( max_right - 10 ) ) { pos_in_parent.x = max_right; } } // Y if( pos_in_parent.y < pos_in_parent_old.y ) { // moving up if( pos_in_parent.y < 10 ) { pos_in_parent.y = 0; } } else if( pos_in_parent.y > pos_in_parent_old.y ) { // moving dow int max_down = GetOCPNCanvasWindow()->GetClientSize().y - GetParent()->GetSize().y; if( pos_in_parent.y > ( max_down - 10 ) ) { pos_in_parent.y = max_down; } } wxPoint final_pos = GetOCPNCanvasWindow()->ClientToScreen( pos_in_parent ); GetParent()->Move( final_pos ); s_gspt = spt; } }
void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { int x = (int)event.GetX(), y = (int)event.GetY(); if ( GetWindowStyle() & wxSP_NOSASH ) { event.Skip(); return; } // with wxSP_LIVE_UPDATE style the splitter windows are always resized // following the mouse movement while it drags the sash, without it we only // draw the sash at the new position but only resize the windows when the // dragging is finished #if defined( __WXMAC__ ) && defined(TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX == 1 bool isLive = true ; // FIXME: why? #else bool isLive = HasFlag(wxSP_LIVE_UPDATE); #endif if (event.LeftDown()) { if ( SashHitTest(x, y) ) { // Start the drag now m_dragMode = wxSPLIT_DRAG_DRAGGING; // Capture mouse and set the cursor CaptureMouse(); SetResizeCursor(); if ( !isLive ) { // remember the initial sash position and draw the initial // shadow sash m_sashPositionCurrent = m_sashPosition; DrawSashTracker(x, y); } m_oldX = x; m_oldY = y; SetResizeCursor(); return; } } else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING) { // We can stop dragging now and see what we've got. m_dragMode = wxSPLIT_DRAG_NONE; // Release mouse and unset the cursor ReleaseMouse(); SetCursor(* wxSTANDARD_CURSOR); // exit if unsplit after doubleclick if ( !IsSplit() ) { return; } // Erase old tracker if ( !isLive ) { DrawSashTracker(m_oldX, m_oldY); } // the position of the click doesn't exactly correspond to // m_sashPosition, rather it changes it by the distance by which the // mouse has moved int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_oldX : y - m_oldY; int posSashOld = isLive ? m_sashPosition : m_sashPositionCurrent; int posSashNew = OnSashPositionChanging(posSashOld + diff); if ( posSashNew == -1 ) { // change not allowed return; } if ( m_permitUnsplitAlways || m_minimumPaneSize == 0 ) { // Deal with possible unsplit scenarios if ( posSashNew == 0 ) { // We remove the first window from the view wxWindow *removedWindow = m_windowOne; m_windowOne = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); eventUnsplit.m_data.win = removedWindow; (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else if ( posSashNew == GetWindowSize() ) { // We remove the second window from the view wxWindow *removedWindow = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); eventUnsplit.m_data.win = removedWindow; (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else { SetSashPositionAndNotify(posSashNew); } } else { SetSashPositionAndNotify(posSashNew); } SizeWindows(); } // left up && dragging else if ((event.Moving() || event.Leaving() || event.Entering()) && (m_dragMode == wxSPLIT_DRAG_NONE)) { if ( event.Leaving() || !SashHitTest(x, y) ) OnLeaveSash(); else OnEnterSash(); } else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) { int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_oldX : y - m_oldY; if ( !diff ) { // nothing to do, mouse didn't really move far enough return; } int posSashOld = isLive ? m_sashPosition : m_sashPositionCurrent; int posSashNew = OnSashPositionChanging(posSashOld + diff); if ( posSashNew == -1 ) { // change not allowed return; } if ( posSashNew == m_sashPosition ) return; // Erase old tracker if ( !isLive ) { DrawSashTracker(m_oldX, m_oldY); } if (m_splitMode == wxSPLIT_VERTICAL) x = posSashNew; else y = posSashNew; // Remember old positions m_oldX = x; m_oldY = y; #ifdef __WXMSW__ // As we captured the mouse, we may get the mouse events from outside // our window - for example, negative values in x, y. This has a weird // consequence under MSW where we use unsigned values sometimes and // signed ones other times: the coordinates turn as big positive // numbers and so the sash is drawn on the *right* side of the window // instead of the left (or bottom instead of top). Correct this. if ( (short)m_oldX < 0 ) m_oldX = 0; if ( (short)m_oldY < 0 ) m_oldY = 0; #endif // __WXMSW__ // Draw new one if ( !isLive ) { m_sashPositionCurrent = posSashNew; DrawSashTracker(m_oldX, m_oldY); } else { DoSetSashPosition(posSashNew); m_needUpdating = true; } } else if ( event.LeftDClick() && m_windowTwo ) { OnDoubleClickSash(x, y); } else { event.Skip(); } }
EffectAutoDuckPanel::~EffectAutoDuckPanel() { if(HasCapture()) ReleaseMouse(); }
void BaseGrid::OnMouseEvent(wxMouseEvent &event) { int h = GetClientSize().GetHeight(); bool shift = event.ShiftDown(); bool alt = event.AltDown(); bool ctrl = event.CmdDown(); // Row that mouse is over bool click = event.LeftDown(); bool dclick = event.LeftDClick(); int row = event.GetY() / lineHeight + yPos - 1; if (holding && !click) { row = mid(0,row,GetRows()-1); } AssDialogue *dlg = GetDialogue(row); if (!dlg) row = 0; if (event.ButtonDown() && OPT_GET("Subtitle/Grid/Focus Allow")->GetBool()) SetFocus(); if (holding) { if (!event.LeftIsDown()) { if (dlg) MakeCellVisible(row, 0, false); holding = false; ReleaseMouse(); } else { // Only scroll if the mouse has moved to a different row to avoid // scrolling on sloppy clicks if (row != extendRow) { if (row <= yPos) ScrollTo(yPos - 3); // When dragging down we give a 3 row margin to make it easier // to see what's going on, but we don't want to scroll down if // the user clicks on the bottom row and drags up else if (row > yPos + h / lineHeight - (row > extendRow ? 3 : 1)) ScrollTo(yPos + 3); } } } else if (click && dlg) { holding = true; CaptureMouse(); } if ((click || holding || dclick) && dlg) { int old_extend = extendRow; // SetActiveLine will scroll the grid if the row is only half-visible, // but we don't want to scroll until the mouse moves or the button is // released, to avoid selecting multiple lines on a click int old_y_pos = yPos; SetActiveLine(dlg); ScrollTo(old_y_pos); // Toggle selected if (click && ctrl && !shift && !alt) { bool isSel = !!selection.count(dlg); if (isSel && selection.size() == 1) return; SelectRow(row, true, !isSel); return; } // Normal click if ((click || dclick) && !shift && !ctrl && !alt) { if (dclick) { context->audioBox->ScrollToActiveLine(); context->videoController->JumpToTime(dlg->Start); } SelectRow(row, false); return; } // Change active line only if (click && !shift && !ctrl && alt) return; // Block select if ((click && shift && !alt) || holding) { extendRow = old_extend; int i1 = row; int i2 = extendRow; if (i1 > i2) std::swap(i1, i2); // Toggle each Selection newsel; if (ctrl) newsel = selection; for (int i = i1; i <= i2; i++) { newsel.insert(GetDialogue(i)); } SetSelectedSet(newsel); return; } return; } // Mouse wheel if (event.GetWheelRotation() != 0) { if (ForwardMouseWheelEvent(this, event)) { int step = shift ? h / lineHeight - 2 : 3; ScrollTo(yPos - step * event.GetWheelRotation() / event.GetWheelDelta()); } return; } event.Skip(); }