package edu.purdue.pivot.skwiki.client.vector; import gwt.g2d.shared.math.Vector2; import org.vaadin.gwtgraphics.client.DrawingArea; import org.vaadin.gwtgraphics.client.Line; import org.vaadin.gwtgraphics.client.shape.Circle; import org.vaadin.gwtgraphics.client.shape.Path; import org.vaadin.gwtgraphics.client.shape.Rectangle; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.dom.client.HasFocusHandlers; import com.google.gwt.event.dom.client.HasMouseDownHandlers; import com.google.gwt.event.dom.client.HasMouseMoveHandlers; import com.google.gwt.event.dom.client.HasMouseUpHandlers; 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.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Event; public class VectorPanel extends DrawingArea implements HasMouseDownHandlers, HasMouseMoveHandlers, HasMouseUpHandlers, MouseDownHandler, MouseUpHandler, MouseMoveHandler, HasFocusHandlers { VectorToolbar toolbar; String shape = "none"; public VectorPanel(int width, int height) { super(width, height); this.sinkEvents(Event.MOUSEEVENTS); this.setHeight(height + "px"); this.setWidth(width + "px"); toolbar = new VectorToolbar(this); this.addMouseDownHandler(this); this.addMouseUpHandler(this); this.addMouseMoveHandler(this); } public void addCircle() { shape = "circle"; } public void addRectangle() { shape = "rectangle"; } public void addLine() { shape = "line"; } public void addPolygon() { shape = "polygon"; } public void addCurve() { shape = "curve"; } public VectorToolbar getToolbar() { return toolbar; } Vector2 circle_center; Vector2 line_start; Vector2 polygon_start; Vector2 rect_start; //Shapes Circle circle1; Line line1; Path polygon; Rectangle rect; Boolean isShape = false; int polygon_sides = 0; @Override public void onMouseDown(MouseDownEvent event) { if (shape.equals("circle")) { circle_center = new Vector2(); circle_center.set(event.getX(), event.getY()); circle1 = new Circle((int) circle_center.getX(), (int) circle_center.getY(), 2); this.add(circle1); circle1.setFillColor("blue"); isShape = true; } else if (shape.equals("line")) { line_start = new Vector2(); line_start.set(event.getX(), event.getY()); line1 = new Line(line_start.getIntX(), line_start.getIntY(), line_start.getIntX()+1, line_start.getIntY()+1); this.add(line1); line1.setStrokeColor("blue"); isShape = true; } else if (shape.equals("polygon") && polygon_sides == 0) { polygon_start = new Vector2(); polygon_start.set(event.getX(), event.getY()); polygon = new Path(polygon_start.getIntX(), polygon_start.getIntY()); this.add(polygon); polygon.setFillColor("blue"); isShape = true; } else if (shape.equals("rectangle")) { rect_start = new Vector2(); rect_start.set(event.getX(), event.getY()); rect = new Rectangle(rect_start.getIntX(), rect_start.getIntY(), 1, 1); this.add(rect); rect.setFillColor("blue"); isShape = true; } } @Override public void onMouseMove(MouseMoveEvent event) { event.preventDefault(); int x = event.getX(); int y = event.getY(); if (isShape == true && shape.equals("circle")) { int radius = (int) Math.sqrt(Math.pow(x - circle_center.getX(), 2) + Math.pow(y - circle_center.getY(), 2)); circle1.setRadius(radius); } else if(isShape == true && shape.equals("line")) { line1.setX2(x); line1.setY2(y); } else if(isShape == true && shape.equals("rectangle")) { if (x < rect_start.getIntX() && y < rect_start.getIntY()){ rect.setX(x); rect.setY(y); rect.setWidth(rect_start.getIntX() - x); rect.setHeight(rect_start.getIntY() - y); } else { rect.setWidth(x - rect_start.getIntX()); rect.setHeight(y - rect_start.getIntY()); } } } @Override public void onMouseUp(MouseUpEvent event) { int x = event.getX(); int y = event.getY(); if (isShape == true && shape.equals("circle")) { int radius = (int) Math.sqrt(Math.pow(x - circle_center.getX(), 2) + Math.pow(y - circle_center.getY(), 2)); circle1.setRadius(radius); isShape = false; } else if(isShape == true && shape.equals("line")) { line1.setX2(x); line1.setY2(y); isShape = false; } else if(isShape == true && shape.equals("polygon")) { if (Math.abs(x - polygon_start.getIntX()) < 25 && Math.abs(y - polygon_start.getIntY()) < 15) { polygon.lineTo(polygon_start.getIntX(), polygon_start.getIntY()); isShape = false; polygon.close(); polygon_sides = 0; }else { polygon.lineTo(x, y); polygon_sides++; } } else if(isShape == true && shape.equals("rectangle")) { if (x < rect_start.getIntX() && y < rect_start.getIntY()){ rect.setX(x); rect.setY(y); rect.setWidth(rect_start.getIntX() - x); rect.setHeight(rect_start.getIntY() - y); isShape = false; } else { rect.setWidth(x - rect_start.getIntX()); rect.setHeight(y - rect_start.getIntY()); isShape = false; } } } @Override public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) { return addHandler(handler, MouseDownEvent.getType()); } @Override public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) { return addHandler(handler, MouseUpEvent.getType()); } @Override public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) { return addHandler(handler, MouseMoveEvent.getType()); } @Override public HandlerRegistration addFocusHandler(FocusHandler handler) { return addHandler(handler, FocusEvent.getType()); } }