package de.ugoe.cs.autoquest.eventcore.gui; import java.util.LinkedList; import java.util.List; import de.ugoe.cs.autoquest.eventcore.Event; import de.ugoe.cs.autoquest.eventcore.IEventTarget; /** *

* This class condenses mouse clicks, i.e. it reduces a sequence of mouse button down, mouse button * up and mouse click with the same button on the same event target to a single mouse click with * that button on that target. The mouse button down and mouse button up events are discarded. For * this, it iterates the provided sequence and identifies any match of the named event sequence * pattern. This match is condensed to the mouse click event. *

* * @version 1.0 * @author Patrick Harms */ public class MouseClickCondenser { /** *

* This method performs the work described in the description of the class. A new list is * instantiated and returned. This list is filled with the events provided by the sequence being * the parameter of the method except for mouse button down and mouse button up events which are * followed by a mouse click event with the same button on the same target. *

* * @param sequence * the event sequence to condense the mouse clicks in * * @return the resulting sequence, in which mouse clicks are condensed to single mouse click * events */ public List condenseMouseClicks(List sequence) { List resultingSequence = new LinkedList(); int index = 0; while (index < sequence.size()) // -2 because we don't need to go to the end { if ((index + 2) < sequence.size()) { Event mouseButtonDown = sequence.get(index); Event mouseButtonUp = sequence.get(index + 1); Event mouseClick = sequence.get(index + 2); if (mouseClickSequenceFound(mouseButtonDown, mouseButtonUp, mouseClick)) { // skip the mouse button down and mouse button up event index += 2; } } resultingSequence.add(sequence.get(index)); index++; } return resultingSequence; } /** * */ private boolean mouseClickSequenceFound(Event mouseButtonDown, Event mouseButtonUp, Event mouseClick) { // check the first in a row of three for validity if (!(mouseButtonDown.getType() instanceof MouseButtonDown)) { return false; } // check the second node for validity if (!(mouseButtonUp.getType() instanceof MouseButtonUp)) { return false; } IEventTarget eventTarget = mouseButtonDown.getTarget(); if (!eventTarget.equals(mouseButtonUp.getTarget())) { return false; } MouseButtonInteraction.Button button = ((MouseButtonDown) mouseButtonDown.getType()).getButton(); if (!button.equals(((MouseButtonUp) mouseButtonUp.getType()).getButton())) { return false; } // check the third node for validity if (!(mouseClick.getType() instanceof MouseClick)) { return false; } if (!eventTarget.equals(mouseClick.getTarget())) { return false; } if (!button.equals(((MouseClick) mouseClick.getType()).getButton())) { return false; } return true; } }