package de.gaalop.vis2d; import de.gaalop.vis2d.drawing.DrawVisitorBufferedImage; import de.gaalop.vis2d.drawing.DrawVisitorPrintable; import java.awt.Point; import java.awt.event.*; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; /** * * @author Christian Steinmetz */ public class Interaction implements KeyListener, MouseMotionListener, MouseListener, MouseWheelListener { public Vis2dCodeGen vis2dCodeGen; private int lastMouseX = 0; private int lastMouseY = 0; private Point from; public Interaction(Vis2dCodeGen vis2dCodeGen) { this.vis2dCodeGen = vis2dCodeGen; } public void initialize() { vis2dCodeGen.vis2dUI.addKeyListener(this); vis2dCodeGen.panel.addMouseMotionListener(this); vis2dCodeGen.panel.addMouseListener(this); vis2dCodeGen.panel.addMouseWheelListener(this); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { Rectangle2D.Double world = vis2dCodeGen.world; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: world.x-=world.getWidth()/10; break; case KeyEvent.VK_RIGHT: world.x+=world.getWidth()/10; break; case KeyEvent.VK_UP: world.y+=world.getHeight()/10; break; case KeyEvent.VK_DOWN: world.y-=world.getHeight()/10; break; case KeyEvent.VK_MINUS: world.x -= world.width/2; world.y -= world.height/2; world.width *= 2; world.height *= 2; break; case KeyEvent.VK_PLUS: world.width /= 2; world.height /= 2; world.x += world.width/2; world.y += world.height/2; break; case KeyEvent.VK_P: //Print PrinterJob job = PrinterJob.getPrinterJob(); if ( job.printDialog() == false ) return; job.setPrintable( new DrawVisitorPrintable(vis2dCodeGen.drawing, world) ); try { job.print(); } catch (PrinterException ex) { Logger.getLogger(Vis2dCodeGen.class.getName()).log(Level.SEVERE, null, ex); } break; case KeyEvent.VK_S: //Save as PNG-File JFileChooser jFC = new JFileChooser(); jFC.setFileFilter(new FileNameExtensionFilter("PNG-Dateien", "png")); if (jFC.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { File f = jFC.getSelectedFile(); DrawVisitorBufferedImage imageVisitor = new DrawVisitorBufferedImage(world, 500, 500); vis2dCodeGen.drawing.draw(imageVisitor); try { ImageIO.write(imageVisitor.getImage(),"png",f); } catch (IOException ex) { Logger.getLogger(Vis2dCodeGen.class.getName()).log(Level.SEVERE, null, ex); } } break; } vis2dCodeGen.repaintDrawing(); updateLabelPosition(); } @Override public void keyReleased(KeyEvent e) { } @Override public void mouseDragged(MouseEvent e) { Point2D.Double pFrom = vis2dCodeGen.visitor.transformPointBack(from.x,from.y); Point to = e.getPoint(); Point2D.Double pTo = vis2dCodeGen.visitor.transformPointBack(to.x,to.y); vis2dCodeGen.world.x -= pTo.x-pFrom.x; vis2dCodeGen.world.y -= pTo.y-pFrom.y; from = to; vis2dCodeGen.repaintDrawing(); updateLabelPosition(); } @Override public void mouseMoved(MouseEvent e) { lastMouseX = e.getX(); lastMouseY = e.getY(); updateLabelPosition(); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { from = new Point(e.getPoint()); } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseWheelMoved(MouseWheelEvent e) { Rectangle2D.Double world = vis2dCodeGen.world; int wheelRotation = e.getWheelRotation(); if (wheelRotation >= 0) { for (int i=0;i<wheelRotation;i++) { world.x -= world.width/2; world.y -= world.height/2; world.width *= 2; world.height *= 2; } } else { for (int i=-wheelRotation;i>0;i--) { world.width /= 2; world.height /= 2; world.x += world.width/2; world.y += world.height/2; } } vis2dCodeGen.repaintDrawing(); } private void updateLabelPosition() { Point2D.Double p = vis2dCodeGen.visitor.transformPointBack(lastMouseX, lastMouseY); vis2dCodeGen.vis2dUI.laPosition.setText(round(p.x)+" | "+round(p.y)); } public double round(double val) { double f = vis2dCodeGen.panel.getWidth()/vis2dCodeGen.world.width; int v = (int) Math.round(val * f); return v / f; } }