package org.expeditee.gio.gesture; import java.util.Collection; import java.util.List; import org.expeditee.core.Point; import org.expeditee.gio.EcosystemManager; import org.expeditee.gio.TimeoutQueue.TimeoutHandle; import org.expeditee.gio.gesture.Gesture.GestureType; import org.expeditee.gio.gesture.StandardGestureActions.StandardGestureType; import org.expeditee.gio.gesture.data.ChangeColourGestureData; import org.expeditee.gio.gesture.data.ClickGestureData; import org.expeditee.gio.gesture.data.CreateItemGestureData; import org.expeditee.gio.gesture.data.CreateItemGestureData.ItemType; import org.expeditee.gio.gesture.data.DeleteGestureData; import org.expeditee.gio.gesture.data.FormatGestureData; import org.expeditee.gio.gesture.data.GestureData; import org.expeditee.gio.gesture.data.InsertStringGestureData; import org.expeditee.gio.gesture.data.ItemSpecificGestureData; import org.expeditee.gio.gesture.data.JustifyGestureData; import org.expeditee.gio.gesture.data.LinkGestureData; import org.expeditee.gio.gesture.data.NavigateFrameGestureData; import org.expeditee.gio.gesture.data.NavigateTextGestureData; import org.expeditee.gio.gesture.data.PanGestureData; import org.expeditee.gio.gesture.data.PickUpGestureData; import org.expeditee.gio.gesture.data.RefreshGestureData; import org.expeditee.gio.gesture.data.ScaleGestureData; import org.expeditee.gio.gesture.data.SelectAreaGestureData; import org.expeditee.gio.gesture.data.UndoGestureData; import org.expeditee.gio.gesture.data.ZoomGestureData; import org.expeditee.gio.input.InputEvent; import org.expeditee.gio.input.InputEvent.InputType; import org.expeditee.gio.input.InputEventToGestureTranslator; import org.expeditee.gio.input.InputEventToGestureTranslatorSet; import org.expeditee.gio.input.KBMInputEvent; import org.expeditee.gio.input.KBMInputEvent.EventType; import org.expeditee.gio.input.KBMInputEvent.Key; import org.expeditee.gio.input.KBMInputEvent.MouseButton; import org.expeditee.gio.input.StandardInputEventListeners; import org.expeditee.gio.input.TimeoutInputEvent; import org.expeditee.gui.DisplayController; import org.expeditee.gui.FrameUtils; import org.expeditee.gui.FreeItems; import org.expeditee.items.Item; import org.expeditee.items.Line; import org.expeditee.items.Text; import org.expeditee.settings.UserSettings; import org.expeditee.settings.experimental.ExperimentalFeatures; /** * Class for translating raw keyboard and mouse input into Expeditee gestures. * * @author cts16 */ public class ExpediteeKBMGestureTranslator extends InputEventToGestureTranslatorSet { /** Convenience definition of this translator's input type. */ private static final InputType KBM = InputType.KBM; /** Tracks when the mouse has moved too far away from it's click position and should no-op. */ private static boolean _noop = false; /** Tracks the starting position of a mouse drag. */ private static Point _mouseDragStart; public ExpediteeKBMGestureTranslator() { // Create the list of sub-translators initialiseExpediteeTranslators(); } @Override public List onInputEvent(InputEvent event) { // Track when the mouse has moved too far and should no-op if (event.getInputType() == KBM) { trackMouseDragNoop((KBMInputEvent) event); } return super.onInputEvent(event); } /** Adds all gesture translators that base Expeditee utilises. */ private void initialiseExpediteeTranslators() { // TODO: Remove. Reference automatically falls through. cts16 ExpediteeKBMGestureTranslator kbmTranslator = this; // Add the CHAR_TYPED -> INSERT_STRING gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CHAR_TYPED -> INSERT_STRING"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check if it's a typing event if (kbmEvent.getEventType() != KBMInputEvent.EventType.CHAR_TYPED) { return null; } //System.err.println("ExpediteeKBMGestureTranslator::" + details() + ": " + kbmEvent.getCharTyped()); // Generate a INSERT_STRING gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.INSERT_STRING), new InsertStringGestureData(kbmEvent.getCharTyped(), kbmTranslator.isKeyDown(Key.SHIFT))); } }); // Add the MOUSE_MOVED -> MOVE_CURSOR gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "MOUSE_MOVED -> MOVE_CURSOR"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check if it's a mouse movement event if (kbmEvent.getEventType() != KBMInputEvent.EventType.MOUSE_MOVE) { return null; } // Generate a CURSOR_MOVED gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.MOVE_CURSOR), new GestureData(kbmEvent.getMouseMove().getSecondEnd().clone())); } }); // Add the LEFT CLICK + MOUSE_MOVE -> SELECT_AREA gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { //private static final int NO_CONSTRAINT = 0; private SelectAreaGestureData _draggedFromData = null; //private int _constrainedDirection = NO_CONSTRAINT; @Override public String details() { return "LEFT CLICK + MOUSE_MOVE -> SELECT_AREA"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check we are holding the left button only if (!kbmTranslator.isOnlyMouseButtonDown(MouseButton.LEFT)) { // If we were dragging, reset the dragging tracker and send the drag-finished gesture if (_draggedFromData != null) { SelectAreaGestureData finalData = _draggedFromData.finalise(); _draggedFromData = null; return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.SELECT_AREA), finalData); // Otherwise just return } else { return null; } } // Check if it's a mouse movement event if (kbmEvent.getEventType() != KBMInputEvent.EventType.MOUSE_MOVE) { return null; } // If we are just starting to drag, save the start position of the gesture if (_draggedFromData == null) { _draggedFromData = new SelectAreaGestureData(kbmEvent.getMouseMove().getSecondEnd().clone(), kbmEvent.getMouseMove().getFirstEnd().clone()); } // If holding control, move the mouse cursor to a constrained position Point newMousePos = kbmEvent.getMouseMove().getFirstEnd().clone(); /* if (kbmTranslator.isKeyDown(Key.CTRL) && FreeItems.hasItemsAttachedToCursor()) { if (_constrainedDirection == NO_CONSTRAINT) { // Decide the direction of constraint _constrainedDirection = Constraint.DIAGONAL_POS; int absX = kbmEvent.getMouseMove().deltaX(); if (absX < 0) { absX = -absX; _constrainedDirection = Constraint.DIAGONAL_NEG; } int absY = kbmEvent.getMouseMove().deltaY(); if (absY < 0) { absY = -absY; if (_constrainedDirection == Constraint.DIAGONAL_NEG) { _constrainedDirection = Constraint.DIAGONAL_POS; } else { _constrainedDirection = Constraint.DIAGONAL_NEG; } } if (absY <= absX / 2) { _constrainedDirection = Constraint.HORIZONTAL; } else if (absX <= absY / 2) { _constrainedDirection = Constraint.VERTICAL; } } int dX, dY; if (_constrainedDirection == Constraint.HORIZONTAL) { dX = kbmEvent.getMouseMove().deltaX(); dY = 0; } else if (_constrainedDirection == Constraint.VERTICAL) { dX = 0; dY = kbmEvent.getMouseMove().deltaY(); } else if (_constrainedDirection == Constraint.DIAGONAL_POS) { dX = dY = (kbmEvent.getMouseMove().deltaX() + kbmEvent.getMouseMove().deltaY()) / 2; } else { dY = (kbmEvent.getMouseMove().deltaY() - kbmEvent.getMouseMove().deltaX()) / 2; dX = -dY; } // Cause feedback loop by moving the mouse to the calculated position newMousePos.add(1, 1); } else*/ { //_constrainedDirection = NO_CONSTRAINT; newMousePos = kbmEvent.getMouseMove().getSecondEnd().clone(); } // Generate a SELECT_AREA gesture _draggedFromData = _draggedFromData.carryOn(newMousePos); return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.SELECT_AREA), _draggedFromData); } }); // Add the HOME/END/LEFT/RIGHT/PAGE_UP/PAGE_DOWN -> NAVIGATE_FRAME gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "HOME/END/LEFT/RIGHT/PAGE_UP/PAGE_DOWN/BACKSPACE -> NAVIGATE_FRAME"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Alt is for mouse emulation if (kbmTranslator.isKeyDown(Key.ALT)) { return null; } // Decide which frame to navigate to NavigateFrameGestureData.NavigateTo navigateTo; if (kbmEvent.getKeyDown() == Key.HOME) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateFrameGestureData.NavigateTo.EARLIEST_FRAME; } else { navigateTo = NavigateFrameGestureData.NavigateTo.ZERO_FRAME; } } else if(kbmEvent.getKeyDown() == Key.END) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateFrameGestureData.NavigateTo.LATEST_FRAME; } else { navigateTo = NavigateFrameGestureData.NavigateTo.LAST_FRAME; } } else if(kbmEvent.getKeyDown() == Key.LEFT_ARROW && !kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateFrameGestureData.NavigateTo.PREVIOUS_FRAME; } else if(kbmEvent.getKeyDown() == Key.RIGHT_ARROW && !kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateFrameGestureData.NavigateTo.NEXT_FRAME; } else if(kbmEvent.getKeyDown() == Key.PAGE_UP) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateFrameGestureData.NavigateTo.BACK_FRAME; } else { navigateTo = NavigateFrameGestureData.NavigateTo.NEXT_FRAME; } } else if(kbmEvent.getKeyDown() == Key.PAGE_DOWN) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateFrameGestureData.NavigateTo.FORWARD_FRAME; } else { navigateTo = NavigateFrameGestureData.NavigateTo.PREVIOUS_FRAME; } } else if(kbmEvent.getKeyDown() == Key.BACKSPACE && kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateFrameGestureData.NavigateTo.BACK_FRAME; } else { return null; } // Check we aren't over text Item on = FrameUtils.getCurrentItem(); if (on != null && on instanceof Text && !on.isFrameName()) { return null; } // Generate a CURSOR_MOVED gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.NAVIGATE_FRAME), new NavigateFrameGestureData(navigateTo)); } }); // Add the HOME/END/LEFT/RIGHT/PAGE_UP/PAGE_DOWN -> NAVIGATE_TEXT gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "HOME/END/LEFT/RIGHT/PAGE_UP/PAGE_DOWN -> NAVIGATE_TEXT"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Alt is for mouse emulation if (kbmTranslator.isKeyDown(Key.ALT)) { return null; } // Decide which frame to navigate to NavigateTextGestureData.NavigateTo navigateTo; if (kbmEvent.getKeyDown() == Key.HOME) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateTextGestureData.NavigateTo.PARAGRAPH_HOME; } else { navigateTo = NavigateTextGestureData.NavigateTo.LINE_HOME; } } else if(kbmEvent.getKeyDown() == Key.END) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateTextGestureData.NavigateTo.PARAGRAPH_END; } else { navigateTo = NavigateTextGestureData.NavigateTo.LINE_END; } } else if(kbmEvent.getKeyDown() == Key.LEFT_ARROW) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateTextGestureData.NavigateTo.PREVIOUS_WORD; } else { navigateTo = NavigateTextGestureData.NavigateTo.PREVIOUS_CHARACTER; } } else if(kbmEvent.getKeyDown() == Key.RIGHT_ARROW) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateTextGestureData.NavigateTo.NEXT_WORD; } else { navigateTo = NavigateTextGestureData.NavigateTo.NEXT_CHARACTER; } } else if(kbmEvent.getKeyDown() == Key.UP_ARROW) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateTextGestureData.NavigateTo.PREVIOUS_TEXT_ITEM; } else { navigateTo = NavigateTextGestureData.NavigateTo.ABOVE_LINE; } } else if(kbmEvent.getKeyDown() == Key.DOWN_ARROW) { if (kbmTranslator.isKeyDown(Key.CTRL)) { navigateTo = NavigateTextGestureData.NavigateTo.NEXT_TEXT_ITEM; } else { navigateTo = NavigateTextGestureData.NavigateTo.BELOW_LINE; } } else { return null; } // Check we are over text Item on = FrameUtils.getCurrentItem(); if (on == null || !(on instanceof Text) || on.isFrameName()) { return null; } // See if we are holding shift to select text boolean selecting = kbmTranslator.isKeyDown(Key.SHIFT); // Generate a CURSOR_MOVED gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.NAVIGATE_TEXT), new NavigateTextGestureData(navigateTo, selecting)); } }); // Add the SHIFT + LEFT_CLICK + MOUSE_MOVE -> PAN gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private Point _panStart; @Override public String details() { return "SHIFT + LEFT_CLICK + MOUSE_MOVE -> PAN"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // See if we are panning if (ExperimentalFeatures.MousePan.get() && !FrameUtils.hasCurrentItem() && kbmTranslator.isMouseButtonDown(MouseButton.LEFT) && kbmTranslator.isKeyDown(Key.SHIFT) && kbmEvent.getEventType() == KBMInputEvent.EventType.MOUSE_MOVE) { if (_panStart == null) { _panStart = kbmEvent.getMouseMove().getFirstEnd().clone(); } } else { _panStart = null; return null; } // Generate a PAN gesture Point panPosition = kbmEvent.getMouseMove().getSecondEnd(); Point panDelta = Point.difference(kbmEvent.getMouseMove().getSecondEnd(), kbmEvent.getMouseMove().getFirstEnd()); return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PAN), new PanGestureData(panPosition, _panStart, panDelta)); } }); // Add the ALT + ARROW_KEYS -> MOVE_CURSOR gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private final int MACRO_CURSOR_MOVE_DISTANCE = 20; private final int MICRO_CURSOR_MOVE_DISTANCE = 1; @Override public String details() { return "ALT + ARROW_KEYS -> MOVE_CURSOR"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Can return if not pressing any of the arrow keys if ( (kbmEvent.getKeyDown() != Key.UP_ARROW) && (kbmEvent.getKeyDown() != Key.DOWN_ARROW) && (kbmEvent.getKeyDown() != Key.LEFT_ARROW) && (kbmEvent.getKeyDown() != Key.RIGHT_ARROW)) { return null; } // Must be holding ALT for mouse emulation if (!kbmTranslator.isKeyDown(Key.ALT)) { return null; } // Decide how far to move int distance = kbmTranslator.isKeyDown(Key.SHIFT) ? MICRO_CURSOR_MOVE_DISTANCE : MACRO_CURSOR_MOVE_DISTANCE; // Calculate the new cursor position Point cursorPosition = EcosystemManager.getInputManager().getCursorPosition(); if (kbmEvent.getKeyDown() == Key.UP_ARROW) { cursorPosition.setY(cursorPosition.getY() - distance); } if (kbmEvent.getKeyDown() == Key.DOWN_ARROW) { cursorPosition.setY(cursorPosition.getY() + distance); } if (kbmEvent.getKeyDown() == Key.LEFT_ARROW) { cursorPosition.setX(cursorPosition.getX() - distance); } if (kbmEvent.getKeyDown() == Key.RIGHT_ARROW) { cursorPosition.setX(cursorPosition.getX() + distance); } // Create the MOVE_CURSOR gesture and return it Gesture moveCursorGesture = new Gesture(StandardGestureActions.getInstance().gestureType(StandardGestureType.MOVE_CURSOR), new SelectAreaGestureData(cursorPosition)); moveCursorGesture.setRobotic(true); return Gesture.single(moveCursorGesture); } }); // Add the F1/F2 -> ZOOM_IN/OUT gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private final float ZOOM_IN_SCALE_FACTOR = 1.1f; private final float ZOOM_OUT_SCALE_FACTOR = 1f / ZOOM_IN_SCALE_FACTOR; @Override public String details() { return "F1/F2 -> ZOOM_IN/OUT"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Decide on a scale factor float scaleFactor; if (kbmEvent.getKeyDown() == KBMInputEvent.Key.F1) { scaleFactor = ZOOM_IN_SCALE_FACTOR; } else if (kbmEvent.getKeyDown() == KBMInputEvent.Key.F2) { scaleFactor = ZOOM_OUT_SCALE_FACTOR; } else { return null; } // Return if zoom is disabled if (!ExperimentalFeatures.FrameZoom.get()) { return null; } // Make sure we are pointing at free space (or the frame name) Item currentItem = FrameUtils.getCurrentItem(); Collection currentItems = FrameUtils.getCurrentItems(currentItem); if ((currentItem != null && !currentItem.isFrameName()) || (currentItems != null && currentItems.size() > 0)) { return null; } // Decide on where to zoom around Point centreOfZoom; if (ExperimentalFeatures.FrameZoomAroundCursor.get()) { centreOfZoom = EcosystemManager.getInputManager().getCursorPosition(); } else { centreOfZoom = new Point(0, 0); } // Return zoom gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.ZOOM), new ZoomGestureData(centreOfZoom, scaleFactor)); } }); // Add the F1/F2 -> SCALE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private final int SCALE_UP_FACTOR = 1; private final int SCALE_DOWN_FACTOR = -1; @Override public String details() { return "F1/F2 -> SCALE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Decide whether to scale up or down or not at all int scaleFactor; if (kbmEvent.getKeyDown() == KBMInputEvent.Key.F1) { scaleFactor = SCALE_UP_FACTOR; } else if (kbmEvent.getKeyDown() == KBMInputEvent.Key.F2) { scaleFactor = SCALE_DOWN_FACTOR; } else { return null; } // Decide where to scale around ScaleGestureData data; if (kbmTranslator.isKeyDown(Key.CTRL)) { data = new ScaleGestureData(scaleFactor); } else { data = new ScaleGestureData(null, scaleFactor); } // Return scale gestures return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.SCALE), data); } }); // Add the F3 -> CHANGE_COLOUR gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F3 -> CHANGE_COLOUR"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F3 to change colours if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F3) { return null; } // Decide how to change the colour boolean shouldSetTransparent = kbmTranslator.isKeyDown(Key.SHIFT); boolean shouldSetSecondaryColour = kbmTranslator.isKeyDown(Key.CTRL); // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CHANGE_COLOUR), new ChangeColourGestureData(shouldSetTransparent, shouldSetSecondaryColour)); } }); // Add the F4 -> TOGGLE_ANNOTATION gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F4 -> TOGGLE_ANNOTATION"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F4 to toggle annotations if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F4) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_ANNOTATION), new ItemSpecificGestureData()); } }); // Add the F5 -> INSERT_DATE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F5 -> INSERT_DATE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F5 to insert the date if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F5) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.INSERT_DATE), new ItemSpecificGestureData()); } }); // Add the F6 -> NEW_FRAMESET gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F6 -> NEW_FRAMESET"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F6 to create a new frameset if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F6) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.NEW_FRAMESET), new ItemSpecificGestureData()); } }); // Add the F7 -> ROTATE_FONT_STYLE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F7 -> ROTATE_FONT_STYLE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F7 to rotate font style if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F7) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.ROTATE_FONT_STYLE), new ItemSpecificGestureData()); } }); // Add the F8 -> ROTATE_FONT_FAMILY gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F8 -> ROTATE_FONT_FAMILY"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F8 to rotate font family if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F8) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.ROTATE_FONT_FAMILY), new ItemSpecificGestureData()); } }); // Add the F9 -> TOGGLE_AUDIENCE_MODE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F9 -> TOGGLE_AUDIENCE_MODE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F9 to toggle audience mode if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F9) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.ROTATE_DISPLAY_MODE), null); } }); // Add the F10 -> TOGGLE_XRAY_MODE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F10 -> TOGGLE_XRAY_MODE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F10 to xray mode if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F10 || kbmTranslator.isKeyDown(Key.SHIFT)) { return null; } return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_XRAY_MODE), null); } }); // Add the F10 -> CYCLE_SURROGATE_MODE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F10 -> CYCLE_SURROGATE_MODE"; } @Override public List onInputEvent(InputEvent event) { // Case to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F10 to surrogate mode if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F10 || !kbmTranslator.isKeyDown(Key.SHIFT)) { return null; } UndoGestureData data = new UndoGestureData(kbmTranslator.isKeyDown(Key.CTRL)); return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CYCLE_SURROGATE_MODE), data); } }); // Add the F11 -> SAVE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F11 -> SAVE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F11 to save if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F11) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.SAVE), null); } }); // Add the F12 -> REFRESH gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "F12 -> REFRESH"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Must be pressing F12 to refresh if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F12) { return null; } // Decide how to refresh boolean shouldReloadFrameFirst = kbmTranslator.isKeyDown(Key.CTRL); boolean shouldRefreshFrameSize = kbmTranslator.isKeyDown(Key.SHIFT); // Return the gesture return standardSingle(StandardGestureType.REFRESH, new RefreshGestureData(shouldReloadFrameFirst, shouldRefreshFrameSize)); } }); // Add the ESC -> DROP_DOWN gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "ESC -> DROP_DOWN"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Shift/Ctrl + Esc is calculate if (kbmTranslator.isKeyDown(Key.SHIFT) || kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing ESC to drop down if (kbmEvent.getKeyDown() != KBMInputEvent.Key.ESC) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.DROP_DOWN), null); } }); // Add the SHIFT/CTRL + ESC -> CALCULATE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "SHIFT/CTRL + ESC -> CALCULATE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that shift or ctrl is down if (!kbmTranslator.isKeyDown(Key.SHIFT) && !kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing Esc to calculate if (kbmEvent.getKeyDown() != KBMInputEvent.Key.ESC) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CALCULATE), new ItemSpecificGestureData()); } }); // Add the CTRL + TAB -> CALCULATE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + TAB -> CALCULATE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing tab to calculate if (kbmEvent.getKeyDown() != KBMInputEvent.Key.TAB) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CALCULATE), new ItemSpecificGestureData()); } }); // Add the CTRL + L -> LINK gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + L -> LINK"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing L to link if (kbmEvent.getKeyDown() != KBMInputEvent.Key.L) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.LINK), new LinkGestureData(false)); } }); // Add the CTRL + G -> LINK gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + G -> LINK"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing G to link if (kbmEvent.getKeyDown() != KBMInputEvent.Key.G) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.LINK), new LinkGestureData(true)); } }); // Add the CTRL + A -> ACTION gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + A -> ACTION"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing A to action if (kbmEvent.getKeyDown() != KBMInputEvent.Key.A) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.ACTION), new ItemSpecificGestureData()); } }); // Add the CTRL + B -> TOGGLE_BOLD gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + B -> TOGGLE_BOLD"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing B to toggle bold if (kbmEvent.getKeyDown() != KBMInputEvent.Key.B) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_BOLD), new ItemSpecificGestureData()); } }); // Add the CTRL + I -> TOGGLE_ITALICS gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + I -> TOGGLE_ITALICS"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing I to toggle italics if (kbmEvent.getKeyDown() != KBMInputEvent.Key.I) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_ITALICS), new ItemSpecificGestureData()); } }); // Add the CTRL + V -> PASTE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + V -> PASTE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing V to paste if (kbmEvent.getKeyDown() != KBMInputEvent.Key.V) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PASTE), null); } }); // Add the CTRL + C -> COPY gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + C -> COPY"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing C to copy if (kbmEvent.getKeyDown() != KBMInputEvent.Key.C) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.COPY), new ItemSpecificGestureData()); } }); // Add the CTRL + C -> MAKE_CIRCLE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + C -> MAKE_CIRCLE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing C to make circle if (kbmEvent.getKeyDown() != KBMInputEvent.Key.C) { return null; } // Make sure we aren't trying to do a copy-clone if (FreeItems.hasItemsAttachedToCursor()) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.MAKE_CIRCLE), new ItemSpecificGestureData()); } }); // Add the CTRL + X -> CUT gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + X -> CUT"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing X to cut if (kbmEvent.getKeyDown() != KBMInputEvent.Key.X) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CUT), null); } }); // Add the CTRL + M -> TOGGLE_ITEMS_MARK gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + M -> TOGGLE_ITEMS_MARK"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing M to toggle items mark if (kbmEvent.getKeyDown() != KBMInputEvent.Key.M) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_ITEMS_MARK), new ItemSpecificGestureData()); } }); // Add the CTRL + Z -> UNDO gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + Z -> UNDO"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing Z to undo if (kbmEvent.getKeyDown() != KBMInputEvent.Key.X) { return null; } // Holding shift as well makes this a redo gesture boolean redo = kbmTranslator.isKeyDown(Key.SHIFT); // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.UNDO), new UndoGestureData(redo)); } }); // Add the CTRL + D -> INSERT_STRING gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + D -> INSERT_STRING"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing D to delete character if (kbmEvent.getKeyDown() != KBMInputEvent.Key.D) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.INSERT_STRING), new InsertStringGestureData(Text.DELETE_CHARACTER, false)); } }); // Add the CTRL + DELETE -> DELETE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + DELETE -> DELETE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing DELETE to delete if (kbmEvent.getKeyDown() != KBMInputEvent.Key.DELETE) { return null; } // Decide if this is an alternate mode delete // TODO: What specifically is alternate mode delete? cts16 boolean alternateMode = kbmTranslator.isKeyDown(Key.SHIFT); // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.DELETE), new DeleteGestureData(alternateMode)); } }); // Add the CTRL + F -> FORMAT gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + F -> FORMAT"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing F to format if (kbmEvent.getKeyDown() != KBMInputEvent.Key.F) { return null; } // Decide if this is an horizontal or vertical format boolean horizontal = kbmTranslator.isKeyDown(Key.SHIFT); // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.FORMAT), new FormatGestureData(horizontal)); } }); // Add the CTRL + J -> JUSTIFY gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + J -> JUSTIFY"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing J to justify if (kbmEvent.getKeyDown() != KBMInputEvent.Key.J) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.JUSTIFY), new JustifyGestureData(false)); } }); // Add the CTRL + R -> JUSTIFY gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + R -> JUSTIFY"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Must be pressing R to justify if (kbmEvent.getKeyDown() != KBMInputEvent.Key.R) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.JUSTIFY), new JustifyGestureData(true)); } }); // Add the CTRL + S -> SAVE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + S -> SAVE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Ctrl + Shift + S is split text if (kbmTranslator.isKeyDown(Key.SHIFT)) { return null; } // Must be pressing S to save if (kbmEvent.getKeyDown() != KBMInputEvent.Key.S) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.SAVE), null); } }); // Add the CTRL + SHIFT + S -> SPLIT_TEXT gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "CTRL + SHIFT + S -> SPLIT_TEXT"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check that ctrl is down if (!kbmTranslator.isKeyDown(Key.CTRL)) { return null; } // Ctrl + Shift + S is split text if (!kbmTranslator.isKeyDown(Key.SHIFT)) { return null; } // Must be pressing S to save if (kbmEvent.getKeyDown() != KBMInputEvent.Key.S) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.SPLIT_TEXT), new ItemSpecificGestureData()); } }); // Add the MIDDLE MOUSE + MOUSE_MOVE -> PICK_UP gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private SelectAreaGestureData _draggedFromData = null; @Override public String details() { return "MIDDLE MOUSE + MOUSE_MOVE -> PICK_UP"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check we are holding the middle button only if (!kbmTranslator.isOnlyMouseButtonDown(MouseButton.MIDDLE)) { // If we were dragging, reset the dragging tracker and send the drag-finished gesture if (_draggedFromData != null) { SelectAreaGestureData finalData = _draggedFromData.finalise(); _draggedFromData = null; return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PICK_UP), finalData); // Otherwise just return } else { return null; } } // Check if it's a mouse movement event if (kbmEvent.getEventType() != KBMInputEvent.EventType.MOUSE_MOVE) { return null; } // See if we should inherit the attributes of the thing we're picking up boolean inheritAttributes = kbmTranslator.isKeyDown(Key.SHIFT); // If we are just starting to drag, save the start position of the gesture if (_draggedFromData == null) { _draggedFromData = new PickUpGestureData(kbmEvent.getMouseMove().getSecondEnd().clone(), kbmEvent.getMouseMove().getFirstEnd().clone(), false, inheritAttributes); } // Wait till we have moved out of no-op range before performing drag-pickup if (!isMouseDragNoOp()) { return null; } // Generate a PICK_UP gesture _draggedFromData = _draggedFromData.carryOn(kbmEvent.getMouseMove().getSecondEnd().clone()); return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PICK_UP), _draggedFromData); } }); // Add the MIDDLE MOUSE -> PICK_UP gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private Boolean _pickup = null; private Item _clickDownOn = null; @Override public String details() { return "MIDDLE MOUSE -> PICK_UP"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check for single middle click if (_pickup == null && kbmEvent.getMouseButtonDown() == MouseButton.MIDDLE) { _pickup = true; _clickDownOn = FrameUtils.getCurrentItem(); return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _pickup = false; return null; } else if (Boolean.FALSE.equals(_pickup) && kbmTranslator.isAnyMouseButtonDown() == false) { _pickup = null; return null; } // Wait for the button up to perform the pickup if (!Boolean.TRUE.equals(_pickup) || kbmEvent.getMouseButtonUp() != MouseButton.MIDDLE) { return null; } // Reset pickup for next gesture _pickup = null; // Check we haven't moved too far if (isMouseDragNoOp()) { if (!(_clickDownOn instanceof Text)) { printNoopMessage(); } return null; } // Check we should be picking up (shift forces line creation) if (FreeItems.hasItemsAttachedToCursor() || kbmTranslator.isKeyDown(Key.SHIFT)) { return null; } // Check there is something to pick up if (!FrameUtils.hasCurrentItem() && FrameUtils.getCurrentItems() == null) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PICK_UP), new PickUpGestureData(false)); } }); // Add the RIGHT MOUSE + MOUSE_MOVE -> PICK_UP gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private SelectAreaGestureData _draggedFromData = null; @Override public String details() { return "RIGHT MOUSE + MOUSE_MOVE -> PICK_UP"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check we are holding the middle button only if (!kbmTranslator.isOnlyMouseButtonDown(MouseButton.RIGHT)) { // If we were dragging, reset the dragging tracker and send the drag-finished gesture if (_draggedFromData != null) { SelectAreaGestureData finalData = _draggedFromData.finalise(); _draggedFromData = null; return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PICK_UP), finalData); // Otherwise just return } else { return null; } } // Check if it's a mouse movement event if (kbmEvent.getEventType() != KBMInputEvent.EventType.MOUSE_MOVE) { return null; } // See if we should inherit the attributes of the thing we're picking up boolean inheritAttributes = kbmTranslator.isKeyDown(Key.SHIFT); // If we are just starting to drag, save the start position of the gesture if (_draggedFromData == null) { _draggedFromData = new PickUpGestureData(kbmEvent.getMouseMove().getSecondEnd().clone(), kbmEvent.getMouseMove().getFirstEnd().clone(), true, inheritAttributes); } // Wait till we have moved out of no-op range before performing drag-pickup if (!isMouseDragNoOp()) { return null; } // Generate a PICK_UP gesture _draggedFromData = _draggedFromData.carryOn(kbmEvent.getMouseMove().getSecondEnd().clone()); return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PICK_UP), _draggedFromData); } }); // Add the RIGHT MOUSE -> PICK_UP gesture recogniser addTranslator(new InputEventToGestureTranslator(new InputType[] { InputType.KBM, InputType.TIMEOUT }) { private final static int EXTRUSION_DELAY_MS = 750; private final static int PULSE_AMOUNT = 2; private Boolean _pickup = null; private Item _clickedItem = null; private TimeoutHandle _timeoutHandle; private boolean _extrusionDelayExpired = false; @Override public String details() { return "RIGHT MOUSE -> PICK_UP"; } @Override public List onInputEvent(InputEvent event) { if (event == null) { return null; } else if (event.getInputType() == InputType.KBM) { return onKBMInputEvent((KBMInputEvent) event); } else if (event.getInputType() == InputType.TIMEOUT) { return onTimeoutInputEvent((TimeoutInputEvent) event); } return null; } private List onKBMInputEvent(KBMInputEvent kbmEvent) { // Check for single right click if (_pickup == null && kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _pickup = true; _timeoutHandle = EcosystemManager.getInputManager().addTimeout(EXTRUSION_DELAY_MS); _extrusionDelayExpired = false; _clickedItem = FrameUtils.getCurrentItem(); return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _pickup = false; EcosystemManager.getInputManager().cancelTimeout(_timeoutHandle); return null; } else if (Boolean.FALSE.equals(_pickup) && kbmTranslator.isAnyMouseButtonDown() == false) { _pickup = null; return null; } // Wait for the button up to perform the pickup if (!Boolean.TRUE.equals(_pickup) || kbmEvent.getMouseButtonUp() != MouseButton.RIGHT) { return null; } // Reset pickup for next gesture _pickup = null; // Cancel the extrusion timeout if it's pending EcosystemManager.getInputManager().cancelTimeout(_timeoutHandle); // Reset the line pulse if it occured if (_extrusionDelayExpired) { pulseExtrusionLines(false); } // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Check we should be picking up (shift forces line creation) if (FreeItems.hasItemsAttachedToCursor() || kbmTranslator.isKeyDown(Key.SHIFT)) { return null; } // Check there is something to pick up if (!FrameUtils.hasCurrentItem() && FrameUtils.getCurrentItems() == null) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PICK_UP), new PickUpGestureData(true, _extrusionDelayExpired)); } private List onTimeoutInputEvent(TimeoutInputEvent event) { if (event.getHandle() == _timeoutHandle) { _extrusionDelayExpired = true; pulseExtrusionLines(true); } return null; } private void pulseExtrusionLines(boolean pulseOn) { int amount = PULSE_AMOUNT; if (!pulseOn) { amount *= -1; } if (_clickedItem != null) { for (Item i : _clickedItem.getAllConnected()) { if (i instanceof Line) { Line line = (Line) i; line.setThickness(line.getThickness() + amount); } } } DisplayController.requestRefresh(true); } }); // Add the MIDDLE MOUSE -> PLACE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { Boolean _place = null; @Override public String details() { return "MIDDLE MOUSE -> PLACE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check for single middle click if (_place == null && kbmEvent.getMouseButtonDown() == MouseButton.MIDDLE) { _place = true; return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _place = false; return null; } else if (Boolean.FALSE.equals(_place) && isAnyMouseButtonDown() == false) { _place = null; return null; } // Wait for the button up to perform the place if (!Boolean.TRUE.equals(_place) || kbmEvent.getMouseButtonUp() != MouseButton.MIDDLE) { return null; } // Reset place for next gesture _place = null; // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Check we should be placing if (!FreeItems.hasItemsAttachedToCursor()) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PLACE), new PickUpGestureData(false)); } }); // Add the RIGHT MOUSE -> PLACE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { Boolean _place = null; @Override public String details() { return "RIGHT MOUSE -> PLACE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check for single right click if (_place == null && kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _place = true; return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _place = false; return null; } else if (Boolean.FALSE.equals(_place) && kbmTranslator.isAnyMouseButtonDown() == false) { _place = null; return null; } // Wait for the button up to perform the place if (!Boolean.TRUE.equals(_place) || kbmEvent.getMouseButtonUp() != MouseButton.RIGHT) { return null; } // Reset place for next gesture _place = null; // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Check we should be placing if (!FreeItems.hasItemsAttachedToCursor()) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.PLACE), new PickUpGestureData(true)); } }); // Add the MIDDLE + RIGHT MOUSE -> DELETE gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private static final int STATE_NO_MOUSE_BUTTON_DOWN = 0; private static final int STATE_MIDDLE_MOUSE_BUTTON_DOWN = 1; private static final int STATE_RIGHT_MOUSE_BUTTON_DOWN = 2; private static final int STATE_BOTH_MOUSE_BUTTON_DOWN = 3; private static final int STATE_ERROR = 4; private int _state = STATE_NO_MOUSE_BUTTON_DOWN; @Override public String details() { return "MIDDLE + RIGHT MOUSE -> DELETE"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Keep track of mouse button state if (_state == STATE_NO_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _state = STATE_RIGHT_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonDown() == MouseButton.MIDDLE) { _state = STATE_MIDDLE_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_MIDDLE_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _state = STATE_BOTH_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonUp() == MouseButton.MIDDLE) { _state = STATE_NO_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_RIGHT_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.MIDDLE) { _state = STATE_BOTH_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonUp() == MouseButton.RIGHT) { _state = STATE_NO_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_BOTH_MOUSE_BUTTON_DOWN) { if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; return null; } } else if (kbmTranslator.isAnyMouseButtonDown() == false) { _state = STATE_NO_MOUSE_BUTTON_DOWN; return null; } // Wait for the button up to perform the delete if (_state != STATE_BOTH_MOUSE_BUTTON_DOWN || kbmTranslator.isAnyMouseButtonDown()) { return null; } // Reset state for next gesture _state = STATE_NO_MOUSE_BUTTON_DOWN; // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Decide if this is an alternate mode delete // TODO: What specifically is alternate mode delete? cts16 boolean alternateMode = kbmTranslator.isKeyDown(Key.SHIFT); // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.DELETE), new DeleteGestureData(alternateMode)); } }); // Add the MIDDLE MOUSE -> CREATE_ITEM gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { Boolean _create = null; @Override public String details() { return "MIDDLE MOUSE -> CREATE_ITEM"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check for single middle click if (_create == null && kbmEvent.getMouseButtonDown() == MouseButton.MIDDLE) { _create = true; return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _create = false; return null; } else if (Boolean.FALSE.equals(_create) && kbmTranslator.isAnyMouseButtonDown() == false) { _create = null; return null; } // Wait for the button up to perform the create if (!Boolean.TRUE.equals(_create) || kbmEvent.getMouseButtonUp() != MouseButton.MIDDLE) { return null; } // Reset create for next gesture _create = null; // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Check we can create if (FreeItems.hasItemsAttachedToCursor()) { return null; } // Check we're not trying to pick up (shift forces item creation) if (!kbmTranslator.isKeyDown(Key.SHIFT) && (FrameUtils.hasCurrentItem() || FrameUtils.getCurrentItems() != null)) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CREATE_ITEM), new CreateItemGestureData(ItemType.LINE)); } }); // Add the RIGHT MOUSE -> CREATE_ITEM gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { Boolean _create = null; @Override public String details() { return "RIGHT MOUSE -> CREATE_ITEM"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check for single middle click if (_create == null && kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _create = true; return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _create = false; return null; } else if (Boolean.FALSE.equals(_create) && kbmTranslator.isAnyMouseButtonDown() == false) { _create = null; return null; } // Wait for the button up to perform the create if (!Boolean.TRUE.equals(_create) || kbmEvent.getMouseButtonUp() != MouseButton.RIGHT) { return null; } // Reset create for next gesture _create = null; // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Check we can create if (FreeItems.hasItemsAttachedToCursor()) { return null; } // Check we're not trying to pick up (shift forces item creation) if (!kbmTranslator.isKeyDown(Key.SHIFT) && (FrameUtils.hasCurrentItem() || FrameUtils.getCurrentItems() != null)) { return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CREATE_ITEM), new CreateItemGestureData(ItemType.BOX)); } }); // Add the LEFT MOUSE -> CLICK gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private static final int LONG_CLICK_DELAY_MS = 500; private Boolean _click = null; private long _clickStartTime; @Override public String details() { return "LEFT MOUSE -> CLICK"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Check for single left click if (_click == null && kbmEvent.getMouseButtonDown() == MouseButton.LEFT) { _click = true; _clickStartTime = System.currentTimeMillis(); return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _click = false; return null; } else if (Boolean.FALSE.equals(_click) && kbmTranslator.isAnyMouseButtonDown() == false) { _click = null; return null; } // Wait for the button up to perform the click if (!Boolean.TRUE.equals(_click) || kbmEvent.getMouseButtonUp() != MouseButton.LEFT) { return null; } // Reset click for next gesture _click = null; // Check if this is a long click boolean longClick = System.currentTimeMillis() >= _clickStartTime + LONG_CLICK_DELAY_MS; // Check if we are toggling arrowhead if (longClick && FrameUtils.getCurrentItem() == null) { if (FreeItems.getInstance().size() <= 2) { for (Item i : FreeItems.getInstance()) { if (i instanceof Line) { return null; } } } } // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Return the gesture return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.CLICK), new ClickGestureData(longClick)); } }); // Add the LEFT MOUSE -> TOGGLE_ARROWHEAD gesture recogniser addTranslator(new InputEventToGestureTranslator(new InputType[] { InputType.KBM, InputType.TIMEOUT }) { private static final int LONG_CLICK_DELAY_MS = 500; private Boolean _click = null; private TimeoutHandle _timeoutHandle = null; @Override public String details() { return "LEFT MOUSE -> TOGGLE_ARROWHEAD"; } @Override public List onInputEvent(InputEvent event) { if (event == null) { return null; } else if (event.getInputType() == InputType.KBM) { return onKBMInputEvent((KBMInputEvent) event); } else if (event.getInputType() == InputType.TIMEOUT) { return onTimeoutInputEvent((TimeoutInputEvent) event); } return null; } private List onKBMInputEvent(KBMInputEvent kbmEvent) { // Check for single left click if (_click == null && kbmEvent.getMouseButtonDown() == MouseButton.LEFT) { _click = true; _timeoutHandle = EcosystemManager.getInputManager().addTimeout(LONG_CLICK_DELAY_MS); return null; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _click = false; EcosystemManager.getInputManager().cancelTimeout(_timeoutHandle); return null; } else if (Boolean.FALSE.equals(_click) && kbmTranslator.isAnyMouseButtonDown() == false) { _click = null; return null; } // Wait for the button up to perform the click if (!Boolean.TRUE.equals(_click) || kbmEvent.getMouseButtonUp() != MouseButton.LEFT) { return null; } // Reset click for next gesture _click = null; // Cancel the timer if it's still pending EcosystemManager.getInputManager().cancelTimeout(_timeoutHandle); return null; } private List onTimeoutInputEvent(TimeoutInputEvent event) { if (event.getHandle() == _timeoutHandle) { // Check if we are toggling arrowhead Item line = null; if (FrameUtils.getCurrentItem() == null) { if (FreeItems.getInstance().size() <= 2) { for (Item i : FreeItems.getInstance()) { if (i instanceof Line) { line = i; } } } } if (line == null) { return null; } // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_ARROWHEAD), new ItemSpecificGestureData(line)); } // Someone else's timeout event return null; } }); // Add the LEFT + RIGHT MOUSE -> EXTRACT_ATTRIBUTES gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private static final int STATE_NO_MOUSE_BUTTON_DOWN = 0; private static final int STATE_LEFT_MOUSE_BUTTON_DOWN = 1; private static final int STATE_RIGHT_MOUSE_BUTTON_DOWN = 2; private static final int STATE_BOTH_MOUSE_BUTTON_DOWN = 3; private static final int STATE_ERROR = 4; private int _state = STATE_NO_MOUSE_BUTTON_DOWN; @Override public String details() { return "LEFT + RIGHT MOUSE -> EXTRACT_ATTRIBUTES"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Keep track of mouse button state if (_state == STATE_NO_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _state = STATE_RIGHT_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonDown() == MouseButton.LEFT) { _state = STATE_LEFT_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_LEFT_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _state = STATE_BOTH_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonUp() == MouseButton.LEFT) { _state = STATE_NO_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_RIGHT_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.LEFT) { _state = STATE_BOTH_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonUp() == MouseButton.RIGHT) { _state = STATE_NO_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_BOTH_MOUSE_BUTTON_DOWN) { if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; return null; } } else if (kbmTranslator.isAnyMouseButtonDown() == false) { _state = STATE_NO_MOUSE_BUTTON_DOWN; return null; } // Wait for the button up to perform the extraction if (_state != STATE_BOTH_MOUSE_BUTTON_DOWN || kbmTranslator.isAnyMouseButtonDown()) { return null; } // Reset state for next gesture _state = STATE_NO_MOUSE_BUTTON_DOWN; // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Make sure we are over something to extract from if (!FrameUtils.hasCurrentItem()) { return null; } // Return the gesture return standardSingle(StandardGestureType.EXTRACT_ATTRIBUTES, new ItemSpecificGestureData()); } }); // Add the LEFT + RIGHT MOUSE -> FORMAT gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { private static final int STATE_NO_MOUSE_BUTTON_DOWN = 0; private static final int STATE_LEFT_MOUSE_BUTTON_DOWN = 1; private static final int STATE_RIGHT_MOUSE_BUTTON_DOWN = 2; private static final int STATE_BOTH_MOUSE_BUTTON_DOWN = 3; private static final int STATE_ERROR = 4; private int _state = STATE_NO_MOUSE_BUTTON_DOWN; @Override public String details() { return "LEFT + RIGHT MOUSE -> FORMAT"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // Keep track of mouse button state if (_state == STATE_NO_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _state = STATE_RIGHT_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonDown() == MouseButton.LEFT) { _state = STATE_LEFT_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_LEFT_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.RIGHT) { _state = STATE_BOTH_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonUp() == MouseButton.LEFT) { _state = STATE_NO_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_RIGHT_MOUSE_BUTTON_DOWN) { if (kbmEvent.getMouseButtonDown() == MouseButton.LEFT) { _state = STATE_BOTH_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getMouseButtonUp() == MouseButton.RIGHT) { _state = STATE_NO_MOUSE_BUTTON_DOWN; } else if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; } return null; } else if (_state == STATE_BOTH_MOUSE_BUTTON_DOWN) { if (kbmEvent.getEventType() == EventType.MOUSE_BUTTON_DOWN) { _state = STATE_ERROR; return null; } } else if (kbmTranslator.isAnyMouseButtonDown() == false) { _state = STATE_NO_MOUSE_BUTTON_DOWN; return null; } // Wait for the button up to perform the extraction if (_state != STATE_BOTH_MOUSE_BUTTON_DOWN || kbmTranslator.isAnyMouseButtonDown()) { return null; } // Reset state for next gesture _state = STATE_NO_MOUSE_BUTTON_DOWN; // Check we haven't moved too far if (isMouseDragNoOp()) { printNoopMessage(); return null; } // Make sure we are not extracting if (FrameUtils.hasCurrentItem()) { return null; } // Return the gestures Gesture hFormat = new Gesture(StandardGestureActions.getInstance().gestureType(StandardGestureType.FORMAT), new FormatGestureData(true)); Gesture vFormat = new Gesture(StandardGestureActions.getInstance().gestureType(StandardGestureType.FORMAT), new FormatGestureData(false)); if (kbmTranslator.isKeyDown(Key.CTRL) && kbmTranslator.isKeyDown(Key.SHIFT)) { List gestures = Gesture.single(hFormat); gestures.add(vFormat); return gestures; } else if (kbmTranslator.isKeyDown(Key.CTRL)) { return Gesture.single(hFormat); } else { return Gesture.single(vFormat); } } }); // Add the ENTER_KEY_HIT -> ACTIVATE BUTTON addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "ENTER_CHAR_TYPED -> ACTIVATE BUTTON"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; List ret_gesture = null; if ((kbmEvent.getEventType() == EventType.CHAR_TYPED) && (kbmEvent.getCharTyped() == '\n')) { GestureType gestureType = StandardGestureActions.getInstance().gestureType(StandardGestureType.ACTIVATE_BUTTON); ItemSpecificGestureData data = new ClickGestureData(false); ret_gesture = Gesture.single(gestureType, data); } return ret_gesture; /* if (kbmEvent.getKeyDown() != Key.ENTER) { return null; } GestureType gestureType = StandardGestureActions.getInstance().gestureType(StandardGestureType.ACTIVATE_BUTTON); ItemSpecificGestureData data = new ClickGestureData(false); return Gesture.single(gestureType, data); */ } }); // TEMPLATE // Add the DETAILS gesture recogniser addTranslator(new InputEventToGestureTranslator(InputType.KBM) { @Override public String details() { return "DETAILS"; } @Override public List onInputEvent(InputEvent event) { // Cast to keyboard/mouse event KBMInputEvent kbmEvent = (KBMInputEvent) event; // TODO Auto-generated method stub return null; } }); } public boolean isKeyDown(Key key) { return StandardInputEventListeners.kbmStateListener.isKeyDown(key); } public boolean isMouseButtonDown(MouseButton button) { return StandardInputEventListeners.kbmStateListener.isMouseButtonDown(button); } public boolean isOnlyMouseButtonDown(MouseButton button) { return StandardInputEventListeners.kbmStateListener.isOnlyMouseButtonDown(button); } public boolean isAnyMouseButtonDown() { return StandardInputEventListeners.kbmStateListener.isAnyMouseButtonDown(); } public static boolean isMouseDragNoOp() { return _noop; } public static void printNoopMessage() { System.err.println("Exceeded NoOp Threshold of " + UserSettings.NoOpThreshold.get() + " pixels. Reinterpreting origonal Gesture."); //MessageBay.displayMessage("Gesture cancelled, mouse moved more than " + UserSettings.NoOpThreshold.get() + " pixels."); } public static void trackMouseDragNoop(KBMInputEvent event) { if (!StandardInputEventListeners.kbmStateListener.isAnyMouseButtonDown() && (event.getEventType() != EventType.MOUSE_BUTTON_UP)) { _noop = false; _mouseDragStart = null; } else if (_mouseDragStart == null) { org.expeditee.core.Line mouseMove = event.getMouseMove(); if (mouseMove != null) { _mouseDragStart = mouseMove.getFirstEnd().clone(); } } else if (_noop == false) { org.expeditee.core.Line mouseMove = event.getMouseMove(); if (mouseMove != null) { mouseMove.setFirstEnd(_mouseDragStart.clone()); if (mouseMove.length() > UserSettings.NoOpThreshold.get()) { _noop = true; } } } } /** Convenience function to create a single standard gesture. */ public static List standardSingle(StandardGestureType type, GestureData data) { return Gesture.single(StandardGestureActions.getInstance().gestureType(type), data); } }