// Copyright (c) 1996-98 The Regents of the University of California. All // Rights Reserved. Permission to use, copy, modify, and distribute this // software and its documentation for educational, research and non-profit // purposes, without fee, and without a written agreement is hereby granted, // provided that the above copyright notice and this paragraph appear in all // copies. Permission to incorporate this software into commercial products may // be obtained by contacting the University of California. David F. Redmiles // Department of Information and Computer Science (ICS) University of // California Irvine, California 92697-3425 Phone: 714-824-3823. This software // program and documentation are copyrighted by The Regents of the University // of California. The software program and documentation are supplied "as is", // without any accompanying services from The Regents. The Regents do not // warrant that the operation of the program will be uninterrupted or // error-free. The end-user understands that the program was developed for // research purposes and is advised not to rely exclusively on the program for // any reason. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY // PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, // INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS // DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY // DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE // SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF // CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, // ENHANCEMENTS, OR MODIFICATIONS. // File: ModeCreateFigPoly.java // Classes: ModeCreateFigPoly // Original Author: jrobbins@ics.uci.edu // $Id: ModeCreateFigPoly.java,v 1.10 1997/06/10 23:43:08 jrobbins Exp $ package uci.graphedit; import java.awt.*; /** A Mode to interpert user input while creating a FigPoly. All of * the actual event handling is inherited from ModeCreate. This class * just implements the differences needed to make it specific to * Polys. * * FEATURE: basic_shapes_polygon */ public class ModeCreateFigPoly extends ModeCreate { //////////////////////////////////////////////////////////////// // instance variables public static final int GRIP_SIZE = 4; protected int _npoints = 0; protected int _lastX, _lastY, _startX, _startY; protected Handle _handle = new Handle(-1); //////////////////////////////////////////////////////////////// // Mode API public String instructions() { return "Click to add a point; Double-click to finish"; } //////////////////////////////////////////////////////////////// // ModeCreate API /** Create a new FigRect instance based on the given mouse down * event and the state of the parent Editor. */ public DiagramElement createNewItem(Event e, int snapX, int snapY) { FigPoly p = new FigPoly(snapX, snapY, parent.graphAttrs()); p.addPoint(snapX, snapY); // add the first point twice _startX = _lastX = snapX; _startY = _lastY = snapY; _npoints = 2; return p; } //////////////////////////////////////////////////////////////// // Event handlers public boolean mouseDown(Event e, int x, int y) { if (_npoints == 0) return super.mouseDown(e, x, y); if (!nearLast(x, y)) { parent.damaged(newItem); Point snapPt = new Point(x, y); parent.snap(snapPt); ((FigPoly)newItem).addPoint(snapPt.x, snapPt.y); _npoints++; parent.damaged(newItem); } return true; } public boolean mouseUp(Event e, int x, int y) { if (_npoints > 2 && nearLast(x, y)) { FigPoly p = (FigPoly) newItem; parent.damaged(newItem); _handle.index = p.npoints() - 1; p.moveVertex(_handle, _startX, _startY, true); _npoints = 0; parent.damaged(p); parent.add(p); parent.selectItem(p); newItem = null; done(); return true; } _lastX = x; _lastY = y; return true; } public boolean mouseMove(Event e, int x, int y) { return mouseDrag(e, x, y); } public boolean mouseDrag(Event e, int x, int y) { if (_npoints == 0) return false; FigPoly p = (FigPoly)newItem; parent.damaged(newItem); // startTrans? Point snapPt = new Point(x, y); parent.snap(snapPt); _handle.index = p.npoints() - 1; p.moveVertex(_handle, snapPt.x, snapPt.y, true); parent.damaged(newItem); // endTrans? return true; } /** Internal function to see if the user clicked twice on the same spot. */ protected boolean nearLast(int x, int y) { return x > _lastX - GRIP_SIZE && x < _lastX + GRIP_SIZE && y > _lastY - GRIP_SIZE && y < _lastY + GRIP_SIZE; } } /* end class ModeCreateFigPoly */