Java tutorial
/* * Copyright 2014 PRImA Research Lab, University of Salford, United Kingdom * * 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. */ package org.primaresearch.web.gwt.client.ui.page.tool.drawing; import org.primaresearch.maths.geometry.Point; import org.primaresearch.maths.geometry.Rect; import org.primaresearch.web.gwt.client.ui.page.PageScrollView; import org.primaresearch.web.gwt.client.ui.page.renderer.PageRenderer; import com.google.gwt.canvas.dom.client.Context2d; import com.google.gwt.canvas.dom.client.CssColor; import com.google.gwt.dom.client.Style.Cursor; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseUpEvent; /** * Tool that allows drawing a rectangle on the document. * * @author Christian Clausner * */ public class RectangleTool extends BasePageViewTool implements PageViewTool { Point p1 = null; Point p2 = null; PageScrollView view; /** * Constructor * @param view The document page view. */ public RectangleTool(PageScrollView view) { this.view = view; //Change cursor view.getViewPanel().getElement().getStyle().setCursor(Cursor.CROSSHAIR); } /** * Returns the rectangle that has been drawn by the user. * @return A rectangle or <code>null</code> */ public Rect getRect() { if (p1 == null) return null; int x1 = Math.min(p1.x, p2.x); int x2 = Math.max(p1.x, p2.x); int y1 = Math.min(p1.y, p2.y); int y2 = Math.max(p1.y, p2.y); return new Rect(x1, y1, x2, y2); } @Override public void render(PageRenderer renderer) { if (p1 == null || !isEnabled()) return; Context2d context = renderer.getContext(); //Blue rectangle context.setStrokeStyle(CssColor.make(0, 128, 255)); context.setLineWidth(1.0 / renderer.getZoomFactor()); int x1 = Math.min(p1.x, p2.x); int x2 = Math.max(p1.x, p2.x); int y1 = Math.min(p1.y, p2.y); int y2 = Math.max(p1.y, p2.y); context.beginPath(); context.rect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); context.stroke(); } @Override public boolean onMouseMove(MouseMoveEvent event) { //Dragging? if (p1 != null) { int x = view.clientToDocumentCoordsX(event.getRelativeX(view.asWidget().getElement())); int y = view.clientToDocumentCoordsY(event.getRelativeY(view.asWidget().getElement())); p2.x = x; p2.y = y; view.getRenderer().refresh(); return true; //Forbid scrolling } return false; //Allow scrolling } @Override public boolean onMouseOut(MouseOutEvent event) { if (p1 != null) { enable(false); p1 = p2 = null; notifyListenersToolFinished(false); return true; } return false; } @Override public boolean onMouseUp(MouseUpEvent event) { if (p1 != null) { enable(false); notifyListenersToolFinished(true); p1 = p2 = null; return true; } return false; } @Override public boolean onMouseDown(MouseDownEvent event) { if (p1 == null) { //Start dragging int x = view.clientToDocumentCoordsX(event.getRelativeX(view.asWidget().getElement())); int y = view.clientToDocumentCoordsY(event.getRelativeY(view.asWidget().getElement())); p1 = new Point(x, y); p2 = new Point(x, y); return true; //Forbid scrolling } return false; //Allow scrolling } @Override protected void notifyListenersToolFinished(boolean success) { view.getViewPanel().getElement().getStyle().setCursor(Cursor.AUTO); super.notifyListenersToolFinished(success); } }