package org.simantics.scenegraph.g2d.events;
import java.awt.Point;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import org.simantics.scenegraph.g2d.G2DFocusManager;
import org.simantics.scenegraph.g2d.G2DSceneGraph;
import org.simantics.scenegraph.g2d.IG2DNode;
import org.simantics.scenegraph.utils.NodeUtil;
/**
* Delivers AWT UI events (mouse, key, focus) to scene graph nodes that have
* registered to it.
*
*
* Mouse events are delivered as {@link SGMouseEvent} and
* {@link SGMouseWheelEvent}. The events contain double format coordinates that
* are in the coordinate system of the parent of the node the event is delivered
* to.
*
* @author Tuukka Lehtonen
* @deprecated replaced with {@link NodeEventHandler}
*/
public class EventDelegator implements MouseListener, MouseMotionListener,
MouseWheelListener, KeyListener, FocusListener {
private static final boolean ENABLED = true;
private static final boolean WARN_DEPRECATION = false;
protected ListenerList mouseListeners = new ListenerList(MouseListener.class);
protected ListenerList mouseWheelListeners = new ListenerList(MouseWheelListener.class);
protected ListenerList mouseMotionListeners = new ListenerList(MouseMotionListener.class);
protected ListenerList keyListeners = new ListenerList(KeyListener.class);
protected ListenerList focusListeners = new ListenerList(FocusListener.class);
protected G2DSceneGraph sg = null;
public EventDelegator(G2DSceneGraph sg) {
this.sg = sg;
}
@SuppressWarnings({ "hiding" })
public void addMouseListener(T node) {
mouseListeners.add((java.awt.event.MouseListener) node);
}
@SuppressWarnings("hiding")
public void removeMouseListener(T node) {
mouseListeners.remove((java.awt.event.MouseListener) node);
}
@SuppressWarnings({ "hiding" })
public void addMouseMotionListener(T node) {
mouseMotionListeners.add((java.awt.event.MouseMotionListener) node);
}
@SuppressWarnings("hiding")
public void removeMouseMotionListener(T node) {
mouseMotionListeners.remove((java.awt.event.MouseMotionListener) node);
}
@SuppressWarnings({ "hiding" })
public void addMouseWheelListener(T node) {
mouseWheelListeners.add((java.awt.event.MouseWheelListener) node);
}
@SuppressWarnings("hiding")
public void removeMouseWheelListener(T node) {
mouseWheelListeners.remove((java.awt.event.MouseWheelListener) node);
}
@SuppressWarnings({ "hiding" })
public void addKeyListener(T node) {
keyListeners.add((java.awt.event.KeyListener) node);
}
@SuppressWarnings("hiding")
public void removeKeyListener(T node) {
keyListeners.remove((java.awt.event.KeyListener) node);
}
@SuppressWarnings({ "hiding" })
public void addFocusListener(T node) {
focusListeners.add((java.awt.event.FocusListener) node);
}
@SuppressWarnings("hiding")
public void removeFocusListener(T node) {
focusListeners.remove((java.awt.event.FocusListener) node);
}
@Override
public void mouseClicked(MouseEvent event) {
if (!ENABLED)
return;
Point op = event.getPoint();
for (MouseListener l : mouseListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event, (IG2DNode) l);
l.mouseClicked(e);
event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
if (e.isConsumed())
break;
}
}
@Override
public void mouseEntered(MouseEvent event) {
if (!ENABLED)
return;
Point op = event.getPoint();
for (MouseListener l : mouseListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);
l.mouseEntered(e);
event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
if (e.isConsumed())
break;
}
}
@Override
public void mouseExited(MouseEvent event) {
if (!ENABLED)
return;
Point op = event.getPoint();
for (MouseListener l : mouseListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);
l.mouseExited(e);
event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
if (e.isConsumed())
break;
}
}
@Override
public void mousePressed(MouseEvent event) {
if (!ENABLED)
return;
G2DFocusManager.INSTANCE.clearFocus();
Point op = event.getPoint();
for (MouseListener l : mouseListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);
l.mousePressed(e);
event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
if (e.isConsumed())
break;
}
if (sg.getRootPane() != null) {
if (G2DFocusManager.INSTANCE.getFocusOwner() == null) {
sg.getRootPane().requestFocusInWindow();
//sg.getRootPane().repaint(); //TODO : why repaint here? FocusOwner seems to be always null, so this causes unnecessary delays when interacting the canvas.
}
}
}
@Override
public void mouseReleased(MouseEvent event) {
if (!ENABLED)
return;
Point op = event.getPoint();
for (MouseListener l : mouseListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);
l.mouseReleased(e);
event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
if (e.isConsumed())
break;
}
}
@Override
public void mouseDragged(MouseEvent event) {
if (!ENABLED)
return;
Point op = event.getPoint();
for (MouseMotionListener l : mouseMotionListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);
l.mouseDragged(e);
event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
if (e.isConsumed())
break;
}
}
@Override
public void mouseMoved(MouseEvent event) {
if (!ENABLED)
return;
for (MouseMotionListener l : mouseMotionListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);
l.mouseMoved(e);
if (e.isConsumed())
break;
}
}
@Override
public void mouseWheelMoved(MouseWheelEvent event) {
if (!ENABLED)
return;
Point op = event.getPoint();
for (MouseWheelListener l : mouseWheelListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
MouseWheelEvent e = (MouseWheelEvent) NodeUtil.transformEvent(event, (IG2DNode) l);
l.mouseWheelMoved(e);
event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
if (e.isConsumed())
break;
}
}
@Override
public void keyPressed(KeyEvent event) {
if (!ENABLED)
return;
for (KeyListener l : keyListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
l.keyPressed(event);
if (event.isConsumed())
break;
}
}
@Override
public void keyReleased(KeyEvent event) {
if (!ENABLED)
return;
for (KeyListener l : keyListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
l.keyReleased(event);
if (event.isConsumed())
break;
}
}
@Override
public void keyTyped(KeyEvent event) {
if (!ENABLED)
return;
for (KeyListener l : keyListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
l.keyTyped(event);
if (event.isConsumed())
break;
}
}
@Override
public void focusGained(FocusEvent event) {
if (!ENABLED)
return;
for (FocusListener l : focusListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
l.focusGained(event);
}
}
@Override
public void focusLost(FocusEvent event) {
if (!ENABLED)
return;
for (FocusListener l : focusListeners.getListeners()) {
if (WARN_DEPRECATION)
System.out.println("DEPRECATION: " + l + " listens to " + event);
l.focusLost(event);
}
}
public void dispose() {
focusListeners.clear();
focusListeners = null;
keyListeners.clear();
keyListeners = null;
mouseListeners.clear();
mouseListeners = null;
sg = null;
}
}