package greenfoot.gui.input.mouse;

import greenfoot.Actor;
import greenfoot.MouseInfo;
import greenfoot.MouseInfoVisitor;
import greenfoot.World;
import threadchecker.OnThread;
import threadchecker.Tag;

import java.util.Arrays;


| Class to hold data collected from the mouse events. Using MouseInfo is | not enough, since a mouse info object doesn't contain all the info we | need (whether it was a drag, move, etc) | @author Poul Henriksen | @OnThread(Tag.Any) class MouseEventData { private MouseInfo mouseInfo; private MouseInfo mouseDragEndedInfo; private MouseInfo mouseClickedInfo; private MouseInfo mousePressedInfo; private MouseInfo mouseDraggedInfo; private MouseInfo mouseMovedInfo; private MouseEventData dragStartedBy; public void init() { mousePressedInfo = null; mouseClickedInfo = null; mouseDraggedInfo = null; mouseDragEndedInfo = null; mouseMovedInfo = null; if (mouseInfo != null) { MouseInfo blankedMouseInfo = MouseInfoVisitor.newMouseInfo(); MouseInfoVisitor.setLoc(blankedMouseInfo, mouseInfo.getX(), mouseInfo.getY(), MouseInfoVisitor.getPx(mouseInfo), MouseInfoVisitor.getPy(mouseInfo)); mouseInfo = blankedMouseInfo; } } public MouseInfo getMouseInfo() { return mouseInfo; } public boolean isMousePressed() { return mousePressedInfo != null; } public boolean isMousePressedOn(Object obj) { return checkObject(obj, mousePressedInfo); }
| Record a mouse press event in the event data. | | @param x x-coordinate in world cells | @param y y-coordinate in world cells | @param px x-coordinate in pixels | @param py y-coordinate in pixels | @param button which button was pressed. | public void mousePressed(int x, int y, int px, int py, int button) { init(); mousePressedInfo = MouseInfoVisitor.newMouseInfo(); mouseInfo = mousePressedInfo; MouseInfoVisitor.setButton(mouseInfo, button); MouseInfoVisitor.setLoc(mouseInfo, x, y, px, py); } public boolean isMouseClickedOn(Object obj) { if (obj != null && (isMousePressed() && !isMousePressedOn(obj))) { return false; } return checkObject(obj, mouseClickedInfo); } public boolean isMouseClicked() { return mouseClickedInfo != null; }
| Record a mouse click in the event data. | | @param x x-coordinate in world cells | @param y y-coordinate in world cells | @param px x-coordinate in pixels | @param py y-coordinate in pixels | @param button which button was clicked | @param clickCount the click count (how many times the button has been clicked) | public void mouseClicked(int x, int y, int px, int py, int button, int clickCount) { MouseInfo tempPressedInfo = mousePressedInfo; init(); mousePressedInfo = tempPressedInfo; mouseClickedInfo = MouseInfoVisitor.newMouseInfo();; mouseInfo = mouseClickedInfo; MouseInfoVisitor.setButton(mouseInfo, button); MouseInfoVisitor.setLoc(mouseInfo, x, y, px, py); MouseInfoVisitor.setClickCount(mouseInfo, clickCount); } public boolean isMouseDragged() { return mouseDraggedInfo != null; } public boolean isMouseDraggedOn(Object obj) { return checkObject(obj, mouseDraggedInfo); }
| Record a mouse drag in the event data. | | @param x x-coordinate in world cells | @param y y-coordinate in world cells | @param px x-coordinate in pixels | @param py y-coordinate in pixels | @param button which button is pressed | @param actor the actor being dragged. | public void mouseDragged(int x, int y, int px, int py, int button, Actor actor) { init(); mouseDraggedInfo = MouseInfoVisitor.newMouseInfo(); mouseInfo = mouseDraggedInfo; MouseInfoVisitor.setButton(mouseInfo, button); MouseInfoVisitor.setLoc(mouseInfo, x, y, px, py); MouseInfoVisitor.setActor(mouseInfo, actor); } public boolean isMouseDragEnded() { return mouseDragEndedInfo != null; } public boolean isMouseDragEndedOn(Object obj) { return checkObject(obj, mouseDragEndedInfo); }
| Record a mouse drag ending in the event data. | | @param x x-coordinate in world cells | @param y y-coordinate in world cells | @param px x-coordinate in pixels | @param py y-coordinate in pixels | @param button which button was pressed | @param dragStartData the data object holding information about the drag start event. | public void mouseDragEnded(int x, int y, int px, int py, int button, MouseEventData dragStartData) { MouseInfo tempPressedInfo = mousePressedInfo; MouseInfo tempClickedInfo = mouseClickedInfo; init(); mousePressedInfo = tempPressedInfo; mouseClickedInfo = tempClickedInfo; mouseDragEndedInfo = MouseInfoVisitor.newMouseInfo();; mouseInfo = mouseDragEndedInfo; MouseInfoVisitor.setButton(mouseInfo, button); MouseInfoVisitor.setLoc(mouseInfo, x, y, px, py); MouseInfoVisitor.setActor(mouseInfo, dragStartData.getActor()); this.dragStartedBy = dragStartData; } public void mouseExited() { mouseInfo = mouseDraggedInfo; mouseMovedInfo = null; } public boolean isMouseMoved() { return mouseMovedInfo != null; } public boolean isMouseMovedOn(Object obj) { return checkObject(obj, mouseMovedInfo); }
| Record a mouse movement (with no buttons down) in the event data. | | @param x x-coordinate in world cells | @param y y-coordinate in world cells | @param px x-coordinate in pixels | @param py y-coordinate in pixels | public void mouseMoved(int x, int y, int px, int py) { init(); mouseMovedInfo = MouseInfoVisitor.newMouseInfo();; mouseInfo = mouseMovedInfo; MouseInfoVisitor.setLoc(mouseInfo, x, y, px, py); } public Actor getActor() { if (mouseInfo == null) { return null; } return mouseInfo.getActor(); } public int getButton() { if (mouseInfo == null) { return 0; } return mouseInfo.getButton(); }
| Check whether the given object can be considered to match the MouseInfo. | | @param obj The query | @param info To check against | @return | private boolean checkObject(Object obj, MouseInfo info) { if (info == null) { return false; } Actor actor = info.getActor(); public defVis return obj == null || (obj instanceof World && actor == null) || actor == obj; } public String toString() { String s = "MouseEventData "; if (mouseInfo != null) { s += mouseInfo.toString(); } if (mousePressedInfo != null) { s += " pressed"; } if (mouseClickedInfo != null) { s += " clicked"; } if (mouseDraggedInfo != null) { s += " dragged"; } if (mouseDragEndedInfo != null) { s += " dragEnded"; } if (mouseMovedInfo != null) { s += " moved"; } return s; }
| From the simulation thread (when it is safe to access the actors via the world's locator), | go through our mouse data and map X,Y positions into actors. | @param locator | @OnThread(Tag.Simulation) public void setActors(WorldLocator locator) { for (MouseInfo info : Arrays.asList(mouseInfo, mouseClickedInfo, mouseDragEndedInfo, mouseMovedInfo, mousePressedInfo, mouseDraggedInfo)) { if (info != null && info.getActor() == null) { int x = MouseInfoVisitor.getPx(info); int y = MouseInfoVisitor.getPy(info); MouseInfoVisitor.setActor(info, locator.getTopMostActorAt(x, y)); } } }
| If drag ended, and was started by the given MouseEventData, copy the drag-start | actor to the drag-end info. | public void setDragStartActor(MouseEventData dragStartData) { if (mouseDragEndedInfo != null && dragStartedBy == dragStartData) { MouseInfoVisitor.setActor(mouseDragEndedInfo, dragStartData.getActor()); } } }

.   - MouseEventData
.   init
.   getMouseInfo
.   isMousePressed
.   isMousePressedOn
.   mousePressed
.   isMouseClickedOn
.   isMouseClicked
.   mouseClicked
.   isMouseDragged
.   isMouseDraggedOn
.   mouseDragged
.   isMouseDragEnded
.   isMouseDragEndedOn
.   mouseDragEnded
.   mouseExited
.   isMouseMoved
.   isMouseMovedOn
.   mouseMoved
.   getActor
.   getButton
.   checkObject
.   toString
.   setActors
.   setDragStartActor




320 neLoCode + 45 LoComm