/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package com.bc.ceres.swing.figure; import com.bc.ceres.swing.figure.Interactor; import com.bc.ceres.swing.figure.InteractorAware; import javax.swing.JComponent; 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; public class InteractionDispatcher implements MouseListener, MouseMotionListener, KeyListener { private final InteractorAware interactorAware; private final boolean debug = Boolean.getBoolean(InteractionDispatcher.class.getName() + ".debug"); public InteractionDispatcher(InteractorAware interactorAware) { this.interactorAware = interactorAware; } public void registerListeners(JComponent component) { component.addMouseListener(this); component.addMouseMotionListener(this); component.addKeyListener(this); } public void unregisterListeners(JComponent component) { component.removeMouseListener(this); component.removeMouseMotionListener(this); component.removeKeyListener(this); } @Override public void mouseClicked(MouseEvent event) { if (debug) { System.out.println("InteractionDispatcher.mouseClicked: event = " + event); } if (getInteractor().isActive()) { getInteractor().mouseClicked(event); } } @Override public void mousePressed(MouseEvent event) { if (debug) { System.out.println("InteractionDispatcher.mousePressed: event = " + event); } ensureKeyEventsReceived(event); if (getInteractor().isActive()) { getInteractor().mousePressed(event); } } @Override public void mouseMoved(MouseEvent event) { if (debug) { // System.out.println("InteractionDispatcher.mouseMoved: event = " + event); } if (getInteractor().isActive()) { getInteractor().mouseMoved(event); } } @Override public void mouseDragged(MouseEvent event) { if (debug) { // System.out.println("InteractionDispatcher.mouseDragged: event = " + event); } if (getInteractor().isActive()) { getInteractor().mouseDragged(event); } } @Override public void mouseReleased(MouseEvent event) { if (debug) { System.out.println("InteractionDispatcher.mouseReleased: event = " + event); } if (getInteractor().isActive()) { getInteractor().mouseReleased(event); } } @Override public void mouseEntered(MouseEvent event) { if (debug) { System.out.println("InteractionDispatcher.mouseEntered: event = " + event); } ensureKeyEventsReceived(event); if (getInteractor().isActive()) { getInteractor().mouseEntered(event); } } @Override public void mouseExited(MouseEvent event) { if (debug) { System.out.println("InteractionDispatcher.mouseExited: event = " + event); } if (getInteractor().isActive()) { getInteractor().mouseExited(event); } } @Override public void keyTyped(KeyEvent event) { if (debug) { System.out.println("InteractionDispatcher.keyTyped: event = " + event); } if (getInteractor().isActive()) { getInteractor().keyTyped(event); } } @Override public void keyPressed(KeyEvent event) { if (debug) { System.out.println("InteractionDispatcher.keyPressed: event = " + event); } if (getInteractor().isActive()) { getInteractor().keyPressed(event); } } @Override public void keyReleased(KeyEvent event) { if (debug) { System.out.println("InteractionDispatcher.keyReleased: event = " + event); } if (getInteractor().isActive()) { getInteractor().keyReleased(event); } } private Interactor getInteractor() { return interactorAware.getInteractor(); } private void ensureKeyEventsReceived(MouseEvent e) { // request focus to get notified about key events e.getComponent().requestFocusInWindow(); } }