/*
* JaamSim Discrete Event Simulation
* Copyright (C) 2012 Ausenco Engineering Canada Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jaamsim.render;
import com.jogamp.newt.event.InputEvent;
import com.jogamp.newt.event.MouseAdapter;
import com.jogamp.newt.event.MouseEvent;
/**
* Basic Mouse interface handler for JaamSim renderer. This is the Mouse side of the 'WindowInteractionListener'
* framework. This class packages Next mouse events and calls the appropriate WindowInteractionListener handlers
*
* @author Matt Chudleigh
*
*/
public class MouseHandler extends MouseAdapter {
private static int modsFromEvent(InputEvent e) {
int flags = 0;
flags += e.isShiftDown() ? WindowInteractionListener.MOD_SHIFT : 0;
flags += e.isAltDown() ? WindowInteractionListener.MOD_ALT : 0;
flags += e.isControlDown() ? WindowInteractionListener.MOD_CTRL : 0;
return flags;
}
private boolean[] _isDown;
private int _startX, _startY;
private int _lastX, _lastY;
private WindowInteractionListener _listener;
RenderWindow _window;
int _windowID;
public MouseHandler(RenderWindow window, WindowInteractionListener listener) {
_listener = listener;
_window = window;
_windowID = _window.getWindowID();
_isDown = new boolean[5];
}
@Override
public void mouseClicked(MouseEvent e) {
_window.setMouseIn(true); // If we're clicked the mouse is in the window (some of the events seem to get dropped
_listener.mouseClicked(_windowID, e.getX(), e.getY(), e.getButton(), modsFromEvent(e), e.getClickCount());
}
@Override
public void mouseEntered(MouseEvent e) {
//_isDown = false;
_window.setMouseIn(true);
_listener.mouseEntry(_windowID, e.getX(), e.getY(), true);
}
@Override
public void mouseExited(MouseEvent e) {
//_isDown = false;
_window.setMouseIn(false);
_listener.mouseEntry(_windowID, e.getX(), e.getY(), false);
}
@Override
public void mousePressed(MouseEvent e) {
_isDown[e.getButton()] = true;
_startX = e.getX();
_startY = e.getY();
_lastX = e.getX();
_lastY = e.getY();
_listener.mouseButtonDown(_windowID, _lastX, _lastY, e.getButton(), true, modsFromEvent(e));
}
@Override
public void mouseReleased(MouseEvent e) {
_isDown[e.getButton()] = false;
_listener.mouseButtonDown(_windowID, _lastX, _lastY, e.getButton(), false, modsFromEvent(e));
}
@Override
public void mouseMoved(MouseEvent e) {
_lastX = e.getX();
_lastY = e.getY();
_window.setMouseX(_lastX);
_window.setMouseY(_lastY);
_listener.mouseMoved(_windowID, _lastX, _lastY);
}
@Override
public void mouseDragged(MouseEvent e) {
if (!_isDown[e.getButton()]) {
return; // This should probably not happen, but just in case...
}
int deltaX = e.getX() - _lastX;
int deltaY = e.getY() - _lastY;
_lastX = e.getX();
_lastY = e.getY();
_window.setMouseX(_lastX);
_window.setMouseY(_lastY);
WindowInteractionListener.DragInfo dragInfo = new WindowInteractionListener.DragInfo();
dragInfo.windowID = _windowID;
dragInfo.x = _lastX;
dragInfo.y = _lastY;
dragInfo.dx = deltaX;
dragInfo.dy = deltaY;
dragInfo.startX = _startX;
dragInfo.startY = _startY;
dragInfo.button = e.getButton();
dragInfo.modFlags = modsFromEvent(e);
_listener.mouseDragged(dragInfo);
}
@Override
public void mouseWheelMoved(MouseEvent e) {
_listener.mouseWheelMoved(_windowID, e.getX(), e.getY(), (int)e.getRotation()[1], modsFromEvent(e));
}
}