/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * KeyboardListener.java * * Created on 29. August 2007, 13:55 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package de.cismet.cismap.commons.gui.piccolo.eventlistener; import edu.umd.cs.piccolo.event.PBasicInputEventHandler; import edu.umd.cs.piccolo.event.PInputEvent; import edu.umd.cs.piccolo.util.PBounds; import java.awt.event.KeyEvent; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.interaction.CismapBroker; import de.cismet.tools.CismetThreadPool; /** * DOCUMENT ME! * * @author hell * @version $Revision$, $Date$ */ public class KeyboardListener extends PBasicInputEventHandler { //~ Static fields/initializers --------------------------------------------- public static final String X_PAN = "X_PAN"; // NOI18N public static final String Y_PAN = "Y_PAN"; // NOI18N //~ Instance fields -------------------------------------------------------- MappingComponent viewer; Thread refreshThread; long refreshTime; private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); //~ Constructors ----------------------------------------------------------- /** * Creates a new KeyboardListener object. * * @param map DOCUMENT ME! */ public KeyboardListener(final MappingComponent map) { viewer = map; } //~ Methods ---------------------------------------------------------------- @Override public void keyPressed(final PInputEvent event) { super.keyPressed(event); if (log.isDebugEnabled()) { log.debug("keyPressed " + event); // NOI18N } if (event.getKeyChar() == 'a') { zoom(0.95f, event, 0, 800); } else if (event.getKeyChar() == 'y') { zoom(1.05f, event, 0, 800); } else if (event.getKeyCode() == KeyEvent.VK_UP) { pan(Y_PAN, 0.05f, 0, 800); } else if (event.getKeyCode() == KeyEvent.VK_DOWN) { pan(Y_PAN, -0.05f, 0, 800); } else if (event.getKeyCode() == KeyEvent.VK_RIGHT) { pan(X_PAN, -0.05f, 0, 800); } else if (event.getKeyCode() == KeyEvent.VK_LEFT) { pan(X_PAN, 0.05f, 0, 800); } else if (event.getKeyCode() == KeyEvent.VK_BACK_SPACE) { final CreateNewGeometryListener listener = (CreateNewGeometryListener)viewer.getInputListener( MappingComponent.NEW_POLYGON); if (log.isDebugEnabled()) { log.debug("Event an CreateGeometryListener weitergeleitet:" + listener); // NOI18N } listener.keyPressed(event); } else { if (log.isDebugEnabled()) { log.debug("kein treffer:" + event.getKeyCode() + " (" + KeyEvent.VK_DOWN); // NOI18N } } } /** * DOCUMENT ME! * * @param direction DOCUMENT ME! * @param factor DOCUMENT ME! * @param localAnimationDuration DOCUMENT ME! * @param delayTime DOCUMENT ME! */ public void pan(final String direction, final float factor, final int localAnimationDuration, final int delayTime) { final PBounds b = viewer.getCamera().getViewBounds(); if (direction.equals(X_PAN)) { b.setOrigin(b.getX() + (b.getWidth() * factor), b.getY()); viewer.getHandleLayer().removeAllChildren(); viewer.getCamera().animateViewToCenterBounds(b, false, localAnimationDuration); viewer.showHandles(true); } else if (direction.equals(Y_PAN)) { b.setOrigin(b.getX(), b.getY() + (b.getHeight() * factor)); viewer.getHandleLayer().removeAllChildren(); viewer.getCamera().animateViewToCenterBounds(b, false, localAnimationDuration); viewer.showHandles(true); } if (localAnimationDuration == 0) { CismapBroker.getInstance().fireMapBoundsChanged(); } try { refreshTime = System.currentTimeMillis() + delayTime; if ((refreshThread == null) || !refreshThread.isAlive()) { refreshThread = new Thread("KeyboardListener pan()") { @Override public void run() { while (System.currentTimeMillis() < refreshTime) { try { sleep(100); // log.debug("WAIT"); } catch (InterruptedException iex) { } } // log.debug("ZOOOOOOOOOOOOOOOOOOOOOOOOOOOM"); viewer.setNewViewBounds(b); viewer.queryServices(); } }; CismetThreadPool.execute(refreshThread); // log.fatal("Breite src:"+((MappingComponent)e.getComponent()).getWtst().getSourceRect().getWidth()); } } catch (Exception ex) { if (log.isDebugEnabled()) { log.debug("error in pan", ex); // NOI18N } } } /** * DOCUMENT ME! * * @param factor DOCUMENT ME! * @param e DOCUMENT ME! * @param localAnimationDuration DOCUMENT ME! * @param delayTime DOCUMENT ME! */ public void zoom(final float factor, final PInputEvent e, final int localAnimationDuration, final int delayTime) { try { if (log.isDebugEnabled()) { log.debug("zoom"); // NOI18N } final PBounds b = new PBounds(); final double h = viewer.getCamera().getViewBounds().getHeight(); final double w = viewer.getCamera().getViewBounds().getWidth(); final double scale = factor; final double oldWidth = viewer.getCamera().getViewBounds().getWidth(); final double newWidth = oldWidth * (1 - scale + 1); final double oldHeight = viewer.getCamera().getViewBounds().getHeight(); final double newHeight = oldHeight * (1 - scale + 1); final double offsetX = (newWidth - oldWidth) / 2; final double offsetY = (newHeight - oldHeight) / 2; // Offsetverschiebung sorgt daf\u00FCr das der Punkt auf den man geclickt hat an der gleichen Stelle bleibt // double xR=e.getPosition().getX()-offsetX; // double yR=e.getPosition().getY()-offsetY; b.setOrigin(viewer.getCamera().getViewBounds().getOrigin().getX() - offsetX, viewer.getCamera().getViewBounds().getOrigin().getY() - offsetY); // ); b.setSize(newWidth, newHeight); viewer.getHandleLayer().removeAllChildren(); viewer.getCamera().animateViewToCenterBounds(b, true, localAnimationDuration); viewer.showHandles(true); if (localAnimationDuration == 0) { CismapBroker.getInstance().fireMapBoundsChanged(); } // if (e.getComponent() instanceof SimpleFeatureViewer) { // ((SimpleFeatureViewer)e.getComponent()).refreshBackground(); // } refreshTime = System.currentTimeMillis() + delayTime; if ((refreshThread == null) || !refreshThread.isAlive()) { refreshThread = new Thread("MappingComponent KeyListener-Timeout") { @Override public void run() { while (System.currentTimeMillis() < refreshTime) { try { sleep(100); // log.debug("WAIT"); } catch (InterruptedException iex) { } } // log.debug("ZOOOOOOOOOOOOOOOOOOOOOOOOOOOM"); viewer.setNewViewBounds(b); viewer.queryServices(); } }; refreshThread.setPriority(Thread.NORM_PRIORITY); CismetThreadPool.execute(refreshThread); // log.fatal("Breite src:"+((MappingComponent)e.getComponent()).getWtst().getSourceRect().getWidth()); } } catch (Exception ex) { if (log.isDebugEnabled()) { log.debug("error in zoom", ex); // NOI18N } } } }