-// ============================================================================
-// wxStdButtonInputHandler
-// ============================================================================
-
-wxStdToggleButtonInputHandler::wxStdToggleButtonInputHandler(wxInputHandler *handler)
- : wxStdInputHandler(handler)
-{
- m_winCapture = NULL;
- m_winHasMouse = false;
-}
-
-bool wxStdToggleButtonInputHandler::HandleKey(wxInputConsumer *consumer,
- const wxKeyEvent& event,
- bool pressed)
-{
- int keycode = event.GetKeyCode();
- if ( keycode == WXK_SPACE || keycode == WXK_RETURN )
- {
- consumer->PerformAction(wxACTION_BUTTON_TOGGLE);
-
- return true;
- }
-
- return wxStdInputHandler::HandleKey(consumer, event, pressed);
-}
-
-bool wxStdToggleButtonInputHandler::HandleMouse(wxInputConsumer *consumer,
- const wxMouseEvent& event)
-{
- // the button has 2 states: pressed and normal with the following
- // transitions between them:
- //
- // normal -> left down -> capture mouse and go to pressed state
- // pressed -> left up inside -> generate click -> go to normal
- // outside ------------------>
- //
- // the other mouse buttons are ignored
- if ( event.Button(1) )
- {
- if ( event.LeftDown() || event.LeftDClick() )
- {
- m_winCapture = consumer->GetInputWindow();
- m_winCapture->CaptureMouse();
- m_winHasMouse = true;
-
- consumer->PerformAction(wxACTION_BUTTON_PRESS);
-
- return true;
- }
- else if ( event.LeftUp() )
- {
- if ( m_winCapture )
- {
- m_winCapture->ReleaseMouse();
- m_winCapture = NULL;
- }
-
- if ( m_winHasMouse )
- {
- // this will generate a click event
- consumer->PerformAction(wxACTION_BUTTON_TOGGLE);
-
- return true;
- }
- //else: the mouse was released outside the window, this doesn't
- // count as a click
- }
- //else: don't do anything special about the double click
- }
-
- return wxStdInputHandler::HandleMouse(consumer, event);
-}
-
-bool wxStdToggleButtonInputHandler::HandleMouseMove(wxInputConsumer *consumer,
- const wxMouseEvent& event)
-{
- // we only have to do something when the mouse leaves/enters the pressed
- // button and don't care about the other ones
- if ( event.GetEventObject() == m_winCapture )
- {
- // leaving the button should remove its pressed state
- if ( event.Leaving() )
- {
- // remember that the mouse is now outside
- m_winHasMouse = false;
-
- // we do have a pressed button, so release it
- consumer->GetInputWindow()->SetCurrent(false);
- consumer->PerformAction(wxACTION_BUTTON_RELEASE);
-
- return true;
- }
- // and entering it back should make it pressed again if it had been
- // pressed
- else if ( event.Entering() )
- {
- // the mouse is (back) inside the button
- m_winHasMouse = true;
-
- // we did have a pressed button which we released when leaving the
- // window, press it again
- consumer->GetInputWindow()->SetCurrent(true);
- consumer->PerformAction(wxACTION_BUTTON_PRESS);
-
- return true;
- }
- }
-
- return wxStdInputHandler::HandleMouseMove(consumer, event);
-}
-
-bool wxStdToggleButtonInputHandler::HandleFocus(wxInputConsumer * WXUNUSED(consumer),
- const wxFocusEvent& WXUNUSED(event))
-{
- // buttons change appearance when they get/lose focus, so return true to
- // refresh
- return true;
-}
-
-bool wxStdToggleButtonInputHandler::HandleActivation(wxInputConsumer *consumer,
- bool WXUNUSED(activated))
-{
- // the default button changes appearance when the app is [de]activated, so
- // return true to refresh
- return wxStaticCast(consumer->GetInputWindow(), wxToggleButton)->IsDefault();
-}
-