package ch.unifr.pai.twice.mousecontrol.client; /* * Copyright 2013 Oliver Schmid * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.dom.client.MouseOverHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.HTML; /** * The touchpad widget for cursor based devices. Here, the relative position of the mouse is captured (in ppm) and sent to the server. The server calculates the * corresponding coordinates for the cursor based on the screen dimensions. * * @author oli * */ public class TouchPadCursorWidget extends TouchPadWidget { private int x; private int y; private int dragOffsetWidth; private int dragOffsetHeight; private final int borderSize = 40; private final HTML dragArea = new HTML(); public TouchPadCursorWidget() { super(true); dragArea.getElement().setAttribute("oncontextmenu", "return false;"); dragArea.setStyleName("dragArea"); add(dragArea); dragArea.addMouseDownHandler(new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { event.preventDefault(); down(NativeEvent.BUTTON_RIGHT != event.getNativeButton()); } }); dragArea.addMouseUpHandler(new MouseUpHandler() { @Override public void onMouseUp(MouseUpEvent event) { event.preventDefault(); up(NativeEvent.BUTTON_RIGHT != event.getNativeButton()); } }); dragArea.addMouseMoveHandler(new MouseMoveHandler() { @Override public void onMouseMove(MouseMoveEvent event) { // event.preventDefault(); x = event.getRelativeX(dragArea.getElement()); y = event.getRelativeY(dragArea.getElement()); } }); dragArea.addMouseOverHandler(new MouseOverHandler() { @Override public void onMouseOver(MouseOverEvent event) { if (keyboardHandler == null) { GWT.log("ADD KEYBOARD HANDLER"); keyboardHandler = Event.addNativePreviewHandler(keyboardPreviewHandler); } } }); dragArea.addMouseOutHandler(new MouseOutHandler() { @Override public void onMouseOut(MouseOutEvent event) { if (keyboardHandler != null) { GWT.log("REMOVE KEYBOARD HANDLER"); keyboardHandler.removeHandler(); keyboardHandler = null; } } }); } /* * (non-Javadoc) * @see ch.unifr.pai.twice.mousecontrol.client.TouchPadWidget#updateScreenDimensions() */ @Override protected void updateScreenDimensions() { // Do nothing special since we're calculating relative values } /** * */ private void updateWidgetSize() { Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { dragOffsetWidth = dragArea.getOffsetWidth() - 2 * borderSize; dragOffsetHeight = dragArea.getOffsetHeight() - 2 * borderSize; } }); } /* * (non-Javadoc) * @see com.google.gwt.user.client.ui.Widget#onAttach() */ @Override protected void onAttach() { updateWidgetSize(); super.onAttach(); } /* * (non-Javadoc) * @see com.google.gwt.user.client.ui.LayoutPanel#onResize() */ @Override public void onResize() { super.onResize(); updateWidgetSize(); } /* * (non-Javadoc) * @see ch.unifr.pai.twice.mousecontrol.client.TouchPadWidget#getX() */ @Override protected int getX() { double percent = 100.0 / dragOffsetWidth * Math.min(Math.max(0, x - borderSize), dragOffsetWidth); return (int) (screenWidth / 100.0 * percent); } /* * (non-Javadoc) * @see ch.unifr.pai.twice.mousecontrol.client.TouchPadWidget#getY() */ @Override protected int getY() { double percent = 100.0 / dragOffsetHeight * Math.min(Math.max(0, y - borderSize), dragOffsetHeight); return (int) (screenHeight / 100.0 * percent); } }