package jetbrains.mps.lang.test.runtime;
/*Generated by MPS */
import java.awt.event.MouseEvent;
import java.awt.Component;
import java.lang.reflect.InvocationTargetException;
import java.awt.Point;
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.nodeEditor.cells.EditorCell;
import javax.swing.SwingUtilities;
import java.util.Queue;
import jetbrains.mps.internal.collections.runtime.QueueSequence;
import java.util.LinkedList;
import jetbrains.mps.openapi.editor.cells.EditorCell_Collection;
import jetbrains.mps.internal.collections.runtime.Sequence;
public class MouseEventsDispatcher {
private final BaseEditorTestBody myEditorTest;
public MouseEventsDispatcher(BaseEditorTestBody editorTest) {
myEditorTest = editorTest;
}
private static MouseEvent createMouseEvent(Component targetComponent, int id, int x, int y) {
return new MouseEvent(targetComponent, id, System.currentTimeMillis(), 0, x, y, x, y, 1, false, MouseEvent.BUTTON1);
}
public void processSecondaryMouseEvent(final Component targetComponent, int x, int y, int eventType) throws InvocationTargetException, InterruptedException {
Point componentPoint = convertToComponent(x, y, targetComponent);
final MouseEvent e = MouseEventsDispatcher.createMouseEvent(targetComponent, eventType, componentPoint.x, componentPoint.y);
myEditorTest.runUndoableInEDTAndWait(new Runnable() {
public void run() {
targetComponent.dispatchEvent(e);
}
});
}
private Point convertToComponent(int x, int y, final Component targetComponent) {
final EditorComponent editorComponent = myEditorTest.getEditorComponent();
EditorCell rootCell = editorComponent.getRootCell();
return SwingUtilities.convertPoint(editorComponent, x + rootCell.getX(), y + rootCell.getY(), targetComponent);
}
public Component processMouseEvent(int x, int y, int eventType) throws InvocationTargetException, InterruptedException {
final EditorComponent editorComponent = myEditorTest.getEditorComponent();
EditorCell rootCell = editorComponent.getRootCell();
assert rootCell != null;
Queue<jetbrains.mps.openapi.editor.cells.EditorCell> cellCandidates = QueueSequence.fromQueue(new LinkedList<jetbrains.mps.openapi.editor.cells.EditorCell>());
QueueSequence.fromQueue(cellCandidates).addLastElement(rootCell);
int editorX = x + rootCell.getX();
int editorY = y + rootCell.getY();
jetbrains.mps.openapi.editor.cells.EditorCell eventTargetCell = null;
while (QueueSequence.fromQueue(cellCandidates).isNotEmpty()) {
jetbrains.mps.openapi.editor.cells.EditorCell nextCell = QueueSequence.fromQueue(cellCandidates).removeFirstElement();
if (nextCell.getX() <= editorX && nextCell.getY() <= editorY && nextCell.getX() + nextCell.getWidth() > editorX && nextCell.getY() + nextCell.getHeight() > editorY) {
eventTargetCell = nextCell;
if (nextCell instanceof EditorCell_Collection) {
QueueSequence.fromQueue(cellCandidates).addSequence(Sequence.fromIterable((EditorCell_Collection) nextCell));
}
}
}
assert eventTargetCell != null;
Component cellComponent = EditorUtil.getEventTargetComponent(eventTargetCell, editorComponent);
Point cellComponentPoint = SwingUtilities.convertPoint(editorComponent, editorX, editorY, cellComponent);
final Component targetComponent = cellComponent.getComponentAt(cellComponentPoint);
assert targetComponent != null;
Point targetComponentPoint = SwingUtilities.convertPoint(editorComponent, editorX, editorY, targetComponent);
final MouseEvent e = MouseEventsDispatcher.createMouseEvent(cellComponent, eventType, targetComponentPoint.x, targetComponentPoint.y);
myEditorTest.runUndoableInEDTAndWait(new Runnable() {
public void run() {
targetComponent.dispatchEvent(e);
}
});
return targetComponent;
}
}