package uk.org.squirm3.ui.collider; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Point2D; import javax.swing.JPanel; import javax.swing.Scrollable; import uk.org.squirm3.model.Atom; import uk.org.squirm3.model.DraggingPoint; /** * TODO read * http://download.oracle.com/javase/tutorial/uiswing/components/scrollpane.html */ class ImagePanel extends JPanel implements Scrollable { private static final long serialVersionUID = 1L; private final AtomsPanel atomsPanel; public ImagePanel(final AtomsPanel atomsPanel) { this.atomsPanel = atomsPanel; addMouseListener(new ImageMouseListener()); addMouseMotionListener(new ImageMouseMotionListener()); } @Override public void paint(final Graphics g) { super.paint(g); atomsPanel.updateImage(); final float zoom = (float) atomsPanel.scale / 100; g.drawImage(atomsPanel.bimg, 0, 0, (int) (atomsPanel.bimg.getWidth() * zoom), (int) (atomsPanel.bimg.getHeight() * zoom), this); } @Override public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } @Override public int getScrollableBlockIncrement(final Rectangle arg0, final int arg1, final int arg2) { return 1; // TODO } @Override public boolean getScrollableTracksViewportHeight() { return false; } @Override public boolean getScrollableTracksViewportWidth() { return false; } @Override public int getScrollableUnitIncrement(final Rectangle arg0, final int arg1, final int arg2) { return 1; } private final class ImageMouseMotionListener implements MouseMotionListener { @Override public void mouseDragged(final MouseEvent event) { if (atomsPanel.draggingPoint != null) { final float zoom = (float) atomsPanel.scale / 100; atomsPanel.applicationEngine .setDraggingPoint(new DraggingPoint((long) (event .getPoint().x / zoom), (long) (event.getPoint().y / zoom), atomsPanel.draggingPoint .getWhichBeingDragging())); } } @Override public void mouseMoved(final MouseEvent event) { if (atomsPanel.draggingPoint != null) { final float zoom = (float) atomsPanel.scale / 100; atomsPanel.applicationEngine .setDraggingPoint(new DraggingPoint((long) (event .getPoint().x / zoom), (long) (event.getPoint().y / zoom), atomsPanel.draggingPoint .getWhichBeingDragging())); } } } private final class ImageMouseListener implements MouseListener { @Override public void mouseClicked(final MouseEvent event) { } @Override public void mouseEntered(final MouseEvent event) { } @Override public void mouseExited(final MouseEvent event) { } @Override public void mousePressed(final MouseEvent event) { if (isLeftClick(event)) { setDraggingPoint(event); } } private void setDraggingPoint(final MouseEvent event) { final Point p = event.getPoint(); final int R = (int) Atom.getAtomSize(); final float zoom = (float) atomsPanel.scale / 100; final Point2D.Float p1 = new Point2D.Float(); final Point2D.Float p2 = new Point2D.Float(p.x / zoom, p.y / zoom); for (int i = 0; i < atomsPanel.latestAtomsCopy.length; i++) { p1.x = atomsPanel.latestAtomsCopy[i].getPhysicalPoint() .getPositionX(); p1.y = atomsPanel.latestAtomsCopy[i].getPhysicalPoint() .getPositionY(); if (p2.distanceSq(p1) < R * R) { atomsPanel.applicationEngine .setDraggingPoint(new DraggingPoint((long) p2.x, (long) p2.y, i)); break; } } } private boolean isLeftClick(final MouseEvent event) { return (event.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK; } @Override public void mouseReleased(final MouseEvent event) { atomsPanel.applicationEngine.setDraggingPoint(null); } } }