package minizoo.c; import minizoo.App; import minizoo.i.Collider; import minizoo.i.TouchListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Point2D; import java.util.Timer; import java.util.TimerTask; public class Touch implements MouseListener, MouseMotionListener { public final long DoubleClickElapse = 250; public void Update() { if (current == null || currentDrag != null) { return; } Entity _currHovered = null; Object[] entities = Entity.list.toArray(); for (int i=entities.length-1; i>=0; --i) { if (entities[i] instanceof Collider) { Collider collider = (Collider)entities[i]; if (collider.intersect(current, null)) { _currHovered = (Entity)entities[i]; break; } } } setCurrentHover(_currHovered); } public Point2D getCurrent() { return current; } Point2D current; public Entity getLastHovered() { return lastHovered; } public Entity getCurrentDrag() { return currentDrag; } public void setCurrentDrag(Entity _currentDrag) { if (pressed) { if (currentDrag != null && currentDrag instanceof TouchListener) { TouchListener touchListener = (TouchListener)currentDrag; touchListener.Press(false, current); } if (_currentDrag != null && _currentDrag instanceof TouchListener) { TouchListener touchListener = (TouchListener)_currentDrag; touchListener.Press(true, current); } currentDrag = _currentDrag; } } public Entity getCurrentHover() { return currHovered; } public void setCurrentHover(Entity currentHover) { if (currHovered != currentHover) { if ((currHovered!=null) && currHovered instanceof TouchListener) { ((TouchListener)currHovered).Hover(false); } if ((currentHover!=null) && currentHover instanceof TouchListener) { ((TouchListener)currentHover).Hover(true); } if (currentHover != null) { lastHovered = currentHover; } currHovered = currentHover; } } Entity lastHovered; Entity currHovered; Entity currentDrag; boolean pressed; boolean isWaitDoubleClick = false; public void setCurrentTouchPosition(MouseEvent mouseEvent) { double ratioX = (double)App.Instance().getCanvas().getWidth()/App.ScreenWidth; double ratioY = (double)App.Instance().getCanvas().getHeight()/App.ScreenHeight; current = new Point2D.Double(mouseEvent.getX() / ratioX, mouseEvent.getY() / ratioY); } @Override public void mouseClicked(MouseEvent arg0) { if (currHovered == null) { return; } if (isWaitDoubleClick) { isWaitDoubleClick = false; // Double Click if (currHovered instanceof TouchListener) { TouchListener touchListener; touchListener = (TouchListener)currHovered; touchListener.DoubleClick(); } } else { if (currHovered instanceof TouchListener) { TouchListener touchListener; touchListener = (TouchListener)currHovered; if (!touchListener.isNeededSupportingDoubleClicking()) { touchListener.Click(); return; } } isWaitDoubleClick = true; Timer t = new Timer("doubleClickTimer",false); t.schedule(new TimerTask() { @Override public void run() { if (isWaitDoubleClick) { // Just Click TouchListener touchListener = null; if (currHovered instanceof TouchListener) { touchListener = (TouchListener)currHovered; } if (currHovered == null && lastHovered != null && lastHovered instanceof TouchListener) { touchListener = (TouchListener)lastHovered; } if (touchListener != null) { touchListener.Click(); } } isWaitDoubleClick = false; } }, DoubleClickElapse); } } @Override public void mouseEntered(MouseEvent arg0) { setCurrentTouchPosition(arg0); } @Override public void mouseExited(MouseEvent arg0) { setCurrentTouchPosition(arg0); } @Override public void mousePressed(MouseEvent arg0) { pressed = true; currentDrag = currHovered; setCurrentTouchPosition(arg0); if (currentDrag != null && currentDrag instanceof TouchListener) { TouchListener touchListener = (TouchListener)currentDrag; touchListener.Press(true, current); } } @Override public void mouseReleased(MouseEvent arg0) { pressed = false; setCurrentTouchPosition(arg0); if (currentDrag != null && currentDrag instanceof TouchListener) { TouchListener touchListener = (TouchListener)currentDrag; touchListener.Press(false, current); } currentDrag = null; } @Override public void mouseDragged(MouseEvent arg0) { setCurrentTouchPosition(arg0); if (currentDrag != null && currentDrag instanceof TouchListener) { TouchListener touchListener = (TouchListener)currentDrag; touchListener.Drag(current); } } @Override public void mouseMoved(MouseEvent arg0) { setCurrentTouchPosition(arg0); } }