diff --git a/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java b/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java index 1277755..464c244 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwingEventHandler.java @@ -257,20 +257,22 @@ } } else if (isPressOrClickOrMove(pSwingMouseEvent) && comp != null) { - final MouseEvent e_temp = new MouseEvent(comp, pSwingMouseEvent.getID(), mEvent.getWhen(), mEvent + final MouseEvent tempEvent = new MouseEvent(comp, pSwingMouseEvent.getID(), mEvent.getWhen(), mEvent .getModifiers(), point.x - offset.x, point.y - offset.y, mEvent.getClickCount(), mEvent .isPopupTrigger()); - final PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(e_temp.getID(), e_temp, aEvent); + final PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(tempEvent.getID(), tempEvent, aEvent); dispatchEvent(comp, e2); } else if (isWheelEvent(pSwingMouseEvent) && comp != null) { final MouseWheelEvent mWEvent = (MouseWheelEvent) mEvent; - final MouseWheelEvent e_temp = new MouseWheelEvent(comp, pSwingMouseEvent.getID(), mEvent.getWhen(), mEvent - .getModifiers(), point.x - offset.x, point.y - offset.y, mEvent.getClickCount(), mEvent - .isPopupTrigger(), mWEvent.getScrollType(), mWEvent.getScrollAmount(), mWEvent.getWheelRotation()); + + final MouseWheelEvent tempEvent = new MouseWheelEvent(comp, pSwingMouseEvent.getID(), mEvent.getWhen(), + mEvent.getModifiers(), point.x - offset.x, point.y - offset.y, mEvent.getClickCount(), mEvent + .isPopupTrigger(), mWEvent.getScrollType(), mWEvent.getScrollAmount(), mWEvent + .getWheelRotation()); - final PSwingMouseWheelEvent e2 = new PSwingMouseWheelEvent(e_temp.getID(), e_temp, aEvent); + final PSwingMouseWheelEvent e2 = new PSwingMouseWheelEvent(tempEvent.getID(), tempEvent, aEvent); dispatchEvent(comp, e2); } @@ -282,9 +284,9 @@ // This shouldn't happen - since we're only getting node events if (comp == null || pSwingMouseEvent.getID() == MouseEvent.MOUSE_EXITED) { - final MouseEvent e_temp = createExitEvent(mEvent); + final MouseEvent tempEvent = createExitEvent(mEvent); - final PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(e_temp.getID(), e_temp, aEvent); + final PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(tempEvent.getID(), tempEvent, aEvent); dispatchEvent(previousComponent, e2); previousComponent = null; @@ -292,18 +294,18 @@ // This means mouseExited prevComponent and mouseEntered comp else if (previousComponent != comp) { - MouseEvent e_temp = createExitEvent(mEvent); - PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(e_temp.getID(), e_temp, aEvent); + MouseEvent tempEvent = createExitEvent(mEvent); + PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(tempEvent.getID(), tempEvent, aEvent); dispatchEvent(previousComponent, e2); - e_temp = createEnterEvent(comp, mEvent, offset.x, offset.y); - e2 = PSwingMouseEvent.createMouseEvent(e_temp.getID(), e_temp, aEvent); + tempEvent = createEnterEvent(comp, mEvent, offset.x, offset.y); + e2 = PSwingMouseEvent.createMouseEvent(tempEvent.getID(), tempEvent, aEvent); comp.dispatchEvent(e2.asMouseEvent()); } } else if (comp != null) { // This means mouseEntered - final MouseEvent e_temp = createEnterEvent(comp, mEvent, offset.x, offset.y); - final PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(e_temp.getID(), e_temp, aEvent); + final MouseEvent tempEvent = createEnterEvent(comp, mEvent, offset.x, offset.y); + final PSwingEvent e2 = PSwingMouseEvent.createMouseEvent(tempEvent.getID(), tempEvent, aEvent); dispatchEvent(comp, e2); } @@ -370,7 +372,8 @@ private void handleButton(final PSwingEvent e1, final PInputEvent aEvent, final ButtonData buttonData) { final MouseEvent m1 = e1.asMouseEvent(); if (involvesSceneNode(buttonData)) { - // TODO: this probably won't handle viewing through multiple cameras. + // TODO: this probably won't handle viewing through multiple + // cameras. final Point2D pt = new Point2D.Double(m1.getX(), m1.getY()); cameraToLocal(e1.getPath().getTopCamera(), pt, buttonData.getPNode()); @@ -459,8 +462,8 @@ } /** - * Process a Piccolo2D event and (if active) dispatch the corresponding Swing - * event. + * Process a Piccolo2D event and (if active) dispatch the corresponding + * Swing event. * * @param aEvent Piccolo2D event being testing for dispatch to swing * @param type is not used in this method diff --git a/extras/src/main/java/edu/umd/cs/piccolox/swing/PScrollPaneLayout.java b/extras/src/main/java/edu/umd/cs/piccolox/swing/PScrollPaneLayout.java index 9766a03..0f25df3 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/swing/PScrollPaneLayout.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/swing/PScrollPaneLayout.java @@ -42,19 +42,15 @@ /** * A subclass of ScrollPaneLayout that looks at the Viewport for sizing * information rather than View. Also queries the Viewport for sizing - * information after each decision about scrollbar visiblity + * information after each decision about scrollbar visiblity. * * @author Lance Good */ public class PScrollPaneLayout extends ScrollPaneLayout { - - /** - * - */ private static final long serialVersionUID = 1L; /** - * MODIFIED FROM javax.swing.ScrollPaneLayout.layoutContainer + * MODIFIED FROM javax.swing.ScrollPaneLayout.layoutContainer. * * This is largely the same as ScrollPaneLayout.layoutContainer but obtains * the preferred view size from the viewport rather than directly from the @@ -63,9 +59,7 @@ * @param parent the Container to lay out */ public void layoutContainer(final Container parent) { - /* - * Sync the (now obsolete) policy fields with the JScrollPane. - */ + // Sync the (now obsolete) policy fields with the JScrollPane. if (!(parent instanceof JScrollPane)) { throw new IllegalArgumentException("layoutContainer may only be applied to JScrollPanes"); } @@ -74,7 +68,7 @@ hsbPolicy = scrollPane.getHorizontalScrollBarPolicy(); final Rectangle availR = scrollPane.getBounds(); - availR.x = availR.y = 0; + availR.setLocation(0, 0); final Insets insets = parent.getInsets(); availR.x = insets.left; @@ -82,9 +76,7 @@ availR.width -= insets.left + insets.right; availR.height -= insets.top + insets.bottom; - /* - * Get the scrollPane's orientation. - */ + // Get the scrollPane's orientation. final boolean leftToRight = scrollPane.getComponentOrientation().isLeftToRight(); /* @@ -153,14 +145,13 @@ * And we assume that the viewports layout manager will give the view * it's preferred size. */ - Dimension extentSize = viewport != null ? viewport.toViewCoordinates(availR.getSize()) : new Dimension(0, 0); + Dimension extentSize = getExtentSize(availR); final PBounds cameraBounds = new PBounds(0, 0, extentSize.getWidth(), extentSize.getHeight()); // LEG: Modification to ask the viewport for the view size rather // than asking the view directly - Dimension viewPrefSize = viewport != null ? ((PViewport) viewport).getViewSize(cameraBounds) : new Dimension(0, - 0); + Dimension viewPrefSize = getViewSize(cameraBounds); /* * If there's a vertical scrollbar and we need one, allocate space for @@ -289,31 +280,83 @@ } if (lowerLeft != null) { - lowerLeft.setBounds(leftToRight ? rowHeadR.x : vsbR.x, hsbR.y, leftToRight ? rowHeadR.width : vsbR.width, - hsbR.height); + if (leftToRight) { + lowerLeft.setBounds(rowHeadR.x, hsbR.y, rowHeadR.width, hsbR.height); + } + else { + lowerLeft.setBounds(vsbR.x, hsbR.y, vsbR.width, hsbR.height); + } } if (lowerRight != null) { - lowerRight.setBounds(leftToRight ? vsbR.x : rowHeadR.x, hsbR.y, leftToRight ? vsbR.width : rowHeadR.width, - hsbR.height); + if (leftToRight) { + lowerRight.setBounds(vsbR.x, hsbR.y, vsbR.width, hsbR.height); + } + else { + lowerRight.setBounds(rowHeadR.x, hsbR.y, rowHeadR.width, hsbR.height); + } } if (upperLeft != null) { - upperLeft.setBounds(leftToRight ? rowHeadR.x : vsbR.x, colHeadR.y, leftToRight ? rowHeadR.width - : vsbR.width, colHeadR.height); + if (leftToRight) { + upperLeft.setBounds(rowHeadR.x, colHeadR.y, rowHeadR.width, colHeadR.height); + } + else { + upperLeft.setBounds(vsbR.x, colHeadR.y, vsbR.width, colHeadR.height); + } } if (upperRight != null) { - upperRight.setBounds(leftToRight ? vsbR.x : rowHeadR.x, colHeadR.y, leftToRight ? vsbR.width - : rowHeadR.width, colHeadR.height); + if (leftToRight) { + upperRight.setBounds(vsbR.x, colHeadR.y, vsbR.width, colHeadR.height); + } + else { + upperRight.setBounds(rowHeadR.x, colHeadR.y, rowHeadR.width, colHeadR.height); + } } } /** - * Copied FROM javax.swing.ScrollPaneLayout.adjustForVSB + * @param cameraBounds + * @return + */ + private Dimension getViewSize(final PBounds cameraBounds) { + Dimension viewPrefSize; + if (viewport != null) { + viewPrefSize = ((PViewport) viewport).getViewSize(cameraBounds); + } + else { + viewPrefSize = new Dimension(0, 0); + } + return viewPrefSize; + } + + /** + * @param availR + * @return + */ + private Dimension getExtentSize(final Rectangle availR) { + Dimension extentSize; + if (viewport != null) { + extentSize = viewport.toViewCoordinates(availR.getSize()); + } + else { + extentSize = new Dimension(0, 0); + } + return extentSize; + } + + /** + * Copied FROM javax.swing.ScrollPaneLayout.adjustForVSB. * * This method is called from ScrollPaneLayout.layoutContainer and is * private in ScrollPaneLayout so it was copied here + * + * @param wantsVSB whether to account for vertical scrollbar + * @param available region to adjust + * @param vsbR vertical scroll bar region + * @param vpbInsets margin of vertical scroll bars + * @param leftToRight orientation of the text LTR or RTL */ protected void adjustForVSB(final boolean wantsVSB, final Rectangle available, final Rectangle vsbR, final Insets vpbInsets, final boolean leftToRight) { @@ -336,10 +379,15 @@ } /** - * Copied FROM javax.swing.ScrollPaneLayout.adjustForHSB + * Copied FROM javax.swing.ScrollPaneLayout.adjustForHSB. * * This method is called from ScrollPaneLayout.layoutContainer and is * private in ScrollPaneLayout so it was copied here + * + * @param wantsHSB whether to account for horizontal scrollbar + * @param available region to adjust + * @param hsbR vertical scroll bar region + * @param vpbInsets margin of the scroll bars */ protected void adjustForHSB(final boolean wantsHSB, final Rectangle available, final Rectangle hsbR, final Insets vpbInsets) { diff --git a/extras/src/main/java/edu/umd/cs/piccolox/swing/PViewport.java b/extras/src/main/java/edu/umd/cs/piccolox/swing/PViewport.java index 9bd8962..93d349c 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/swing/PViewport.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/swing/PViewport.java @@ -50,14 +50,10 @@ */ public class PViewport extends JViewport { private static final long serialVersionUID = 1L; - /** - * Controls what happens when scrolling occurs - */ + /** Controls what happens when scrolling occurs. */ PScrollDirector scrollDirector; - /** - * Pass constructor info to super - */ + /** Pass constructor info to super. */ public PViewport() { super(); @@ -79,7 +75,7 @@ * Subclasses can override this to install a different scroll director in * the constructor. Returns a new PScrollDirector object. * - * @return a PScrollDirector + * @return a PScrollDirector */ protected PScrollDirector createScrollDirector() { return new PDefaultScrollDirector(); @@ -101,14 +97,16 @@ } /** - * @return The scroll director on this viewport. + * Returns the scroll director on this viewport. + * + * @return The scroll director on this viewport */ public PScrollDirector getScrollDirector() { return scrollDirector; } /** - * Overridden to throw an exception if the view is not a ZCanvas + * Overridden to throw an exception if the view is not a PCanvas. * * @param view The new view - it better be a ZCanvas! */ @@ -138,7 +136,7 @@ * Sets the view coordinates that appear in the upper left hand corner of * the viewport, does nothing if there's no view. * - * @param p a Point object giving the upper left coordinates + * @param p a Point object giving the upper left coordinates */ public void setViewPosition(final Point p) { if (getView() == null) { @@ -154,10 +152,8 @@ oldY = vp.getY(); } - /** - * Send the scroll director the exact view position and let it interpret - * it as needed - */ + // Send the scroll director the exact view position and let it interpret + // it as needed final double newX = x; final double newY = y; @@ -172,23 +168,22 @@ /** * Gets the view position from the scroll director based on the current - * extent size + * extent size. * - * @return The new view position + * @return The new view's position */ public Point getViewPosition() { - if (scrollDirector != null) { - final Dimension extent = getExtentSize(); - return scrollDirector.getViewPosition(new PBounds(0, 0, extent.getWidth(), extent.getHeight())); - } - else { + if (scrollDirector == null) { return null; } + + final Dimension extent = getExtentSize(); + return scrollDirector.getViewPosition(new PBounds(0, 0, extent.getWidth(), extent.getHeight())); } /** * Gets the view size from the scroll director based on the current extent - * size + * size. * * @return The new view size */ @@ -199,7 +194,7 @@ /** * Gets the view size from the scroll director based on the specified extent - * size + * size. * * @param r The extent size from which the view is computed * @return The new view size @@ -209,7 +204,7 @@ } /** - * A simple layout manager to give the ZCanvas the same size as the Viewport + * A simple layout manager to give the ZCanvas the same size as the Viewport. */ public static class PViewportLayout extends ViewportLayout { private static final long serialVersionUID = 1L; diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/LineShape.java b/extras/src/main/java/edu/umd/cs/piccolox/util/LineShape.java index ed2f51d..5b399d4 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/LineShape.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/LineShape.java @@ -36,6 +36,9 @@ import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; +/** + * A shape that can be used to represent hand drawn lines. + */ public class LineShape implements Shape, MutablePoints { private MutablePoints points; private final Rectangle2D bounds = new Rectangle2D.Double(); @@ -54,11 +57,13 @@ * * @param points new Points to use as this shape's path */ - public void setPoints(MutablePoints points) { + public void setPoints(final MutablePoints points) { if (points == null) { - points = new XYArray(); + this.points = new XYArray(); } - this.points = points; + else { + this.points = points; + } } /** @@ -214,8 +219,9 @@ double dy = y2 - y1; // If line is a point then bail out - if (dx == 0 && dy == 0) + if (dx == 0 && dy == 0) { return false; + } final double dx2 = dx * dx; final double dy2 = dy * dy; @@ -400,8 +406,8 @@ * @param height height of defined rectangle * @return true if rectangle is contained */ - public boolean contains(final double x, final double y, final double w, final double h) { - return contains(x, y) && contains(x + w, y) && contains(x, y + h) && contains(x + w, y + h); + public boolean contains(final double x, final double y, final double width, final double height) { + return contains(x, y) && contains(x + width, y) && contains(x, y + height) && contains(x + width, y + height); } /** @@ -420,7 +426,6 @@ * * @param at optional transform to apply to segment before returning it. May * be null - * @param iterator for iterating over Line Paths * @return iterator for iterating segments of this LineShape */ public PathIterator getPathIterator(final AffineTransform at) { @@ -433,7 +438,6 @@ * * @param at optional transform to apply to segment before returning it. May * be null - * @param iterator for iterating over Line Paths * @param flatness ignored completely * @return iterator for iterating segments of this LineShape */ @@ -463,7 +467,8 @@ /** * Returns the winding rule being applied when selecting next paths. * - * @return GeneralPath.WIND_EVEN_ODD since that's the only policy supported + * @return GeneralPath.WIND_EVEN_ODD since that's the only policy + * supported */ public int getWindingRule() { return GeneralPath.WIND_EVEN_ODD; @@ -506,7 +511,12 @@ currentSegment(); coords[0] = (float) tempPoint.getX(); coords[1] = (float) tempPoint.getY(); - return i == 0 ? PathIterator.SEG_MOVETO : PathIterator.SEG_LINETO; + if (i == 0) { + return PathIterator.SEG_MOVETO; + } + else { + return PathIterator.SEG_LINETO; + } } /** @@ -521,7 +531,12 @@ currentSegment(); coords[0] = tempPoint.getX(); coords[1] = tempPoint.getY(); - return i == 0 ? PathIterator.SEG_MOVETO : PathIterator.SEG_LINETO; + if (i == 0) { + return PathIterator.SEG_MOVETO; + } + else { + return PathIterator.SEG_LINETO; + } } } } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/MutablePoints.java b/extras/src/main/java/edu/umd/cs/piccolox/util/MutablePoints.java index ca277df..c1b27cc 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/MutablePoints.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/MutablePoints.java @@ -30,12 +30,40 @@ import java.awt.geom.AffineTransform; +/** + * Minimal interface that a changeable sequence of points must provide. + */ public interface MutablePoints extends Points { - public void setPoint(int i, double x, double y); + /** + * Sets the coordinates for the point at the given index. + * + * @param i index of point + * @param x x component of the point's coordinates + * @param y y component of the point's coordinates + */ + void setPoint(int i, double x, double y); - public void addPoint(int pos, double x, double y); + /** + * Inserts a point at the specified position. + * + * @param pos position at which to insert the point + * @param x x component of the point's coordinates + * @param y y component of the point's coordinates + */ + void addPoint(int pos, double x, double y); - public void removePoints(int pos, int num); + /** + * Removes a subsequence of points. + * + * @param pos position to start removing points + * @param num number of points to remove + */ + void removePoints(int pos, int num); - public void transformPoints(AffineTransform t); + /** + * Modifies all points by applying the transform to them. + * + * @param t transformto apply to the points + */ + void transformPoints(AffineTransform t); } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/PBoundsLocator.java b/extras/src/main/java/edu/umd/cs/piccolox/util/PBoundsLocator.java index 7b5bd45..8092409 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/PBoundsLocator.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/PBoundsLocator.java @@ -43,58 +43,127 @@ * @author Jesse Grosjean */ public class PBoundsLocator extends PNodeLocator { - - /** - * - */ private static final long serialVersionUID = 1L; private int side; + /** + * Creates a locator for tracking the east side of the provided node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createEastLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.EAST); } + /** + * Creates a locator for tracking the north east corner of the provided + * node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createNorthEastLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.NORTH_EAST); } + /** + * Creates a locator for tracking the north west corner of the provided + * node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createNorthWestLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.NORTH_WEST); } + /** + * Creates a locator for tracking the north side of the provided node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createNorthLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.NORTH); } + /** + * Creates a locator for tracking the south side of the provided node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createSouthLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.SOUTH); } + /** + * Creates a locator for tracking the west side of the provided node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createWestLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.WEST); } + /** + * Creates a locator for tracking the south west corner of the provided + * node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createSouthWestLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.SOUTH_WEST); } + /** + * Creates a locator for tracking the south east corner of the provided + * node. + * + * @param node node to track + * @return a new locator + */ public static PBoundsLocator createSouthEastLocator(final PNode node) { return new PBoundsLocator(node, SwingConstants.SOUTH_EAST); } + /** + * Constructs a locator for tracking the position on the node provided. + * + * @param node node to track + * @param aSide specified the position on the node to track + */ public PBoundsLocator(final PNode node, final int aSide) { super(node); side = aSide; } + /** + * Returns the side of the node that's being tracked. + * + * @return tracked side + */ public int getSide() { return side; } + /** + * Sets the side to track on the node. + * + * @param side new side to track + */ public void setSide(final int side) { this.side = side; } + /** + * Maps the locator's side to its x position. + * + * @return x position on side this locator is tracking + */ public double locateX() { final Rectangle2D aBounds = node.getBoundsReference(); @@ -112,10 +181,16 @@ case SwingConstants.NORTH: case SwingConstants.SOUTH: return aBounds.getX() + aBounds.getWidth() / 2; + default: + return -1; } - return -1; } + /** + * Maps the locator's side to its y position. + * + * @return y position on side this locator is tracking + */ public double locateY() { final Rectangle2D aBounds = node.getBoundsReference(); @@ -133,7 +208,8 @@ case SwingConstants.NORTH_EAST: case SwingConstants.NORTH: return aBounds.getY(); + default: + return -1; } - return -1; } } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/PFixedWidthStroke.java b/extras/src/main/java/edu/umd/cs/piccolox/util/PFixedWidthStroke.java index bc91070..56fdafa 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/PFixedWidthStroke.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/PFixedWidthStroke.java @@ -116,6 +116,11 @@ this(new BasicStroke(width, cap, join, miterlimit, dash, dash_phase)); } + /** + * Throws an exception since PFixedWidthStrokes are not serializable. + * + * @return never returns anything + */ public Object clone() { throw new UnsupportedOperationException("Not implemented."); } @@ -160,10 +165,22 @@ return ((BasicStroke) stroke).getLineWidth(); } + /** + * Returns the miter limit of this node. + * + * @return miter limit of this node + */ public float getMiterLimit() { return ((BasicStroke) stroke).getMiterLimit(); } + /** + * Returns a stroke equivalent to this one, but scaled by the scale + * provided. + * + * @param activeScale scale to apply to the new stoke + * @return scaled stroke + */ protected Stroke newStroke(final float activeScale) { if (tmpDash != null) { for (int i = dash.length - 1; i >= 0; i--) { @@ -188,6 +205,7 @@ * * @throws ObjectStreamException doesn't actually throw this at all, why's * this here? + * @return the resolved stroke */ protected Object readResolve() throws ObjectStreamException { return new PFixedWidthStroke((BasicStroke) stroke); diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java b/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java index 636a665..6f3f2e0 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/PLocator.java @@ -42,23 +42,45 @@ */ public abstract class PLocator implements Serializable { - /** - * - */ private static final long serialVersionUID = 1L; + /** + * Default constructor provided for subclasses. Does nothing by itself. + */ public PLocator() { } - public Point2D locatePoint(Point2D aDstPoint) { + /** + * Locates the point this locator is responsible for finding, and stores it + * in dstPoints. Should dstPoints be null, it will create a new point and + * return it. + * + * @param aDstPoint output parameter to store the located point + * @return the located point + */ + public Point2D locatePoint(final Point2D aDstPoint) { + Point2D result; if (aDstPoint == null) { - aDstPoint = new Point2D.Double(); + result = new Point2D.Double(); } - aDstPoint.setLocation(locateX(), locateY()); - return aDstPoint; + else { + result = aDstPoint; + } + result.setLocation(locateX(), locateY()); + return result; } + /** + * Locates the X component of the position this locator finds. + * + * @return x component of located point + */ public abstract double locateX(); + /** + * Locates the Y component of the position this locator finds. + * + * @return y component of located point + */ public abstract double locateY(); } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/PNodeLocator.java b/extras/src/main/java/edu/umd/cs/piccolox/util/PNodeLocator.java index fdfbd7f..46d8ac6 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/PNodeLocator.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/PNodeLocator.java @@ -44,29 +44,52 @@ * @author Jesse Grosjean */ public class PNodeLocator extends PLocator { - - /** - * - */ private static final long serialVersionUID = 1L; + + /** Node being located by this locator. */ protected PNode node; + /** + * Constructs a locator responsible for locating the given node. + * + * @param node node to be located + */ public PNodeLocator(final PNode node) { setNode(node); } + /** + * Returns the node being located by this locator. + * + * @return node being located by this locator + */ public PNode getNode() { return node; } + /** + * Changes the node being located by this locator. + * + * @param node new node to have this locator locate. + */ public void setNode(final PNode node) { this.node = node; } + /** + * Locates the left of the target node's bounds. + * + * @return left of target node's bounds + */ public double locateX() { return node.getBoundsReference().getCenterX(); } + /** + * Locates the top of the target node's bounds. + * + * @return top of target node's bounds + */ public double locateY() { return node.getBoundsReference().getCenterY(); } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/POcclusionDetection.java b/extras/src/main/java/edu/umd/cs/piccolox/util/POcclusionDetection.java index f6de65d..a132b70 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/POcclusionDetection.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/POcclusionDetection.java @@ -44,11 +44,23 @@ * the tree determining which parent nodes are occluded by their children * nodes. Note that this is only detecting a subset of occlusions (parent, * child), others such as overlapping siblings or cousins are not detected. + * + * @param n node from which to detect occlusions + * @param parentBounds bounds of parent node */ public void detectOccusions(final PNode n, final PBounds parentBounds) { detectOcclusions(n, new PPickPath(null, parentBounds)); } + /** + * Traverse the pick path determining which parent nodes are occluded by + * their children nodes. Note that this is only detecting a subset of + * occlusions (parent, child), others such as overlapping siblings or + * cousins are not detected. + * + * @param node node from which to detect occlusions + * @param pickPath Pick Path to traverse + */ public void detectOcclusions(final PNode node, final PPickPath pickPath) { if (!node.fullIntersects(pickPath.getPickBounds())) { return; @@ -60,8 +72,8 @@ for (int i = count - 1; i >= 0; i--) { final PNode each = node.getChild(i); if (node.getOccluded()) { - // if n has been occuded by a previous decendent then - // this child must also be occuded + // if n has been occluded by a previous descendant then + // this child must also be occluded each.setOccluded(true); } else { @@ -80,6 +92,13 @@ pickPath.popTransform(node.getTransformReference(false)); } + /** + * Calculate whether node occludes its parents. + * + * @param n node to test + * @param pickPath pickpath identifying the parents of the node + * @return true if parents are occluded by the node + */ private boolean nodeOccludesParents(final PNode n, final PPickPath pickPath) { return !n.getOccluded() && n.intersects(pickPath.getPickBounds()) && n.isOpaque(pickPath.getPickBounds()); } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/PSemanticStroke.java b/extras/src/main/java/edu/umd/cs/piccolox/util/PSemanticStroke.java index 068e6d7..d505f38 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/PSemanticStroke.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/PSemanticStroke.java @@ -49,22 +49,32 @@ protected final Stroke stroke; protected PSemanticStroke(final Stroke stroke) { - this.stroke = recentStroke = stroke; + this.stroke = stroke; + recentStroke = stroke; recentScale = 1.0F; } /** * Ask {@link #getActiveScale()}, call {@link #newStroke(float)} if - * necessary and delegate to {@link Stroke#createStrokedShape(Shape)} + * necessary and delegate to {@link Stroke#createStrokedShape(Shape)}. + * + * @param s */ public Shape createStrokedShape(final Shape s) { final float currentScale = getActiveScale(); if (Math.abs(currentScale - recentScale) > THRESHOLD) { - recentStroke = newStroke(recentScale = currentScale); + recentScale = currentScale; + recentStroke = newStroke(recentScale); } return recentStroke.createStrokedShape(s); } + /** + * Returns true if this stroke is equivalent to the object provided. + * + * @param obj Object being tested + * @return true if object is equivalent + */ public boolean equals(final Object obj) { if (this == obj) { return true; @@ -110,8 +120,12 @@ public int hashCode() { final int prime = 31; - int result = 1; - result = prime * result + (stroke == null ? 0 : stroke.hashCode()); + int result = prime; + + if (stroke != null) { + result += stroke.hashCode(); + } + return result; } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/Points.java b/extras/src/main/java/edu/umd/cs/piccolox/util/Points.java index 23ff2b8..1c5a5f4 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/Points.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/Points.java @@ -31,14 +31,52 @@ import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; +/** + * Interface for a sequence of points. + */ public interface Points { - public int getPointCount(); + /** + * Returns the number of points in the sequence. + * + * @return number of points in the sequence + */ + int getPointCount(); - public double getX(int i); + /** + * Returns the x component of the point at the given index. + * + * @param i index of desired point + * + * @return x component of point + */ + double getX(int i); - public double getY(int i); + /** + * Returns the y component of the point at the given index. + * + * @param i index of desired point + * + * @return y component of point + */ + double getY(int i); - public Point2D getPoint(int i, Point2D dst); + /** + * Returns a point representation of the coordinates at the given index. + * + * @param i index of desired point + * @param dst output parameter into which the point's details will be + * populated, if null a new one will be created. + * + * @return a point representation of the coordinates at the given index + */ + Point2D getPoint(int i, Point2D dst); - public Rectangle2D getBounds(Rectangle2D dst); + /** + * Returns the bounds of all the points taken as a whole. + * + * @param dst output parameter to store bounds into, if null a new rectangle + * will be created + * @return rectangle containing the bounds + */ + Rectangle2D getBounds(Rectangle2D dst); } diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java b/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java index 9c67b55..49ef01f 100755 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java @@ -42,6 +42,8 @@ */ public final class ShadowUtils { + private static final int BLUR_BOUNDS_AFFORDANCE = 4; + /** * Private no-arg constructor. */ @@ -71,8 +73,8 @@ if (blurRadius < 1) { throw new IllegalArgumentException("blur radius must be greater than zero, was " + blurRadius); } - int w = src.getWidth(null) + (4 * blurRadius); - int h = src.getHeight(null) + (4 * blurRadius); + int w = src.getWidth(null) + (BLUR_BOUNDS_AFFORDANCE * blurRadius); + int h = src.getHeight(null) + (BLUR_BOUNDS_AFFORDANCE * blurRadius); // paint src image into mask BufferedImage mask = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); @@ -114,7 +116,7 @@ */ private static float[] createKernel(final int r) { int w = (2 * r) + 1; - float kernel[] = new float[w * w]; + float[] kernel = new float[w * w]; double m = 2.0d * Math.pow((r / 3.0d), 2); double n = Math.PI * m; diff --git a/extras/src/main/java/edu/umd/cs/piccolox/util/XYArray.java b/extras/src/main/java/edu/umd/cs/piccolox/util/XYArray.java index 8c55b2e..1aed1fc 100644 --- a/extras/src/main/java/edu/umd/cs/piccolox/util/XYArray.java +++ b/extras/src/main/java/edu/umd/cs/piccolox/util/XYArray.java @@ -32,11 +32,15 @@ import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; +/** + * Represents a sequence as points that's internally stored as a single array of + * point components. + */ public class XYArray implements MutablePoints, Cloneable { /** The coordinates of the points, specifically 2x the number of points. */ private double[] points = null; - /** the number of valid x, y pairs */ + /** the number of valid x, y pairs. */ private int numPoints = 0; /** @@ -51,7 +55,7 @@ /** * Constructs an XYArray of the given size. * - * @param n numbe rof points XYArray should contain + * @param n number of points XYArray should contain */ public XYArray(final int n) { initPoints(null, n); @@ -79,13 +83,17 @@ * @param i index to be normalized * @return normalized index */ - private int normalize(final int i) { if (i >= numPoints) { throw new IllegalArgumentException("The point index " + i + " is not below " + numPoints); } - return i < 0 ? numPoints + i : i; + if (i < 0) { + return numPoints + i; + } + else { + return i; + } } /** @@ -204,26 +212,36 @@ * desired * @return initialized points */ - public static double[] initPoints(double[] points, final int n, final double[] old) { + public static double[] initPoints(final double[] points, final int n, final double[] old) { + final double[] result; if (points == null || n * 2 > points.length) { - points = new double[n * 2]; + result = new double[n * 2]; } - if (old != null && points != old) { - System.arraycopy(old, 0, points, 0, Math.min(old.length, n * 2)); + else { + result = points; } - return points; + if (old != null && result != old) { + System.arraycopy(old, 0, result, 0, Math.min(old.length, n * 2)); + } + + return result; } /** * Constructs an array of point coordinates for n points. * - * @param points array to populate with point values, or null to generate a - * new array + * @param srcPoints array to populate with point values, or null to generate + * a new array * @param n number of points */ - private void initPoints(final double[] points, final int n) { - this.points = initPoints(points, n, this.points); - numPoints = points != null ? points.length / 2 : 0; + private void initPoints(final double[] srcPoints, final int n) { + this.points = initPoints(srcPoints, n, this.points); + if (srcPoints == null) { + numPoints = 0; + } + else { + numPoints = srcPoints.length / 2; + } } /** @@ -234,22 +252,26 @@ * @param start the start index within newPoints to start extracting points * @param end the end index within newPoints to finish extracting points */ - public void addPoints(final int index, final Points newPoints, int start, int end) { + public void addPoints(final int index, final Points newPoints, final int start, final int end) { + final int sanitizedEnd; if (end < 0) { - end = newPoints.getPointCount() + end + 1; + sanitizedEnd = newPoints.getPointCount() + end + 1; } - final int n = numPoints + end - start; + else { + sanitizedEnd = end; + } + final int n = numPoints + sanitizedEnd - start; points = initPoints(points, n, points); final int pos1 = index * 2; - final int pos2 = (index + end - start) * 2; + final int pos2 = (index + sanitizedEnd - start) * 2; final int len = (numPoints - index) * 2; System.arraycopy(points, pos1, points, pos2, len); numPoints = n; if (newPoints != null) { - for (int count = 0; start < end; count++, start++) { - setPoint(index + count, newPoints.getX(start), newPoints.getY(start)); + for (int count = 0, currentPos = start; currentPos < sanitizedEnd; count++, currentPos++) { + setPoint(index + count, newPoints.getX(currentPos), newPoints.getY(currentPos)); } } } @@ -313,13 +335,12 @@ * @param pos the position to start removing points * @param num the number of points to remove */ - public void removePoints(final int pos, int num) { - num = Math.min(num, numPoints - pos); - if (num <= 0) { - return; + public void removePoints(final int pos, final int num) { + int sanitizedNum = Math.min(num, numPoints - pos); + if (sanitizedNum > 0) { + System.arraycopy(points, (pos + sanitizedNum) * 2, points, pos * 2, (numPoints - (pos + sanitizedNum)) * 2); + numPoints -= sanitizedNum; } - System.arraycopy(points, (pos + num) * 2, points, pos * 2, (numPoints - (pos + num)) * 2); - numPoints -= num; } /** @@ -344,6 +365,7 @@ ps.numPoints = numPoints; } catch (final CloneNotSupportedException e) { + } return ps;