/* * @(#)BoundsOutlineHandle.java * * Copyright (c) 2007-2008 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.samples.svg.figures; import javax.annotation.Nullable; import org.jhotdraw.draw.handle.HandleAttributeKeys; import org.jhotdraw.draw.handle.AbstractHandle; import org.jhotdraw.draw.*; import java.awt.*; import org.jhotdraw.geom.ConvexHull; import static org.jhotdraw.draw.AttributeKeys.*; /** * Draws the outline of the Figure bounds to make adjustment easier. * * @author Werner Randelshofer * @version $Id$ */ public class ConvexHullOutlineHandle extends AbstractHandle { @Nullable private Shape outline; private AttributeKey<Stroke> stroke1Enabled; private AttributeKey<Stroke> stroke2Enabled; private AttributeKey<Stroke> stroke1Disabled; private AttributeKey<Stroke> stroke2Disabled; private AttributeKey<Color> strokeColor1Enabled; private AttributeKey<Color> strokeColor2Enabled; private AttributeKey<Color> strokeColor1Disabled; private AttributeKey<Color> strokeColor2Disabled; /** * Creates a bounds outline handle for resizing a component. * * @param owner */ public ConvexHullOutlineHandle(SVGPathFigure owner) { this(owner, false, false); } /** * Creates a bounds outline handle for resizing or transforming a component. * * @param owner */ public ConvexHullOutlineHandle(SVGPathFigure owner, boolean isTransformHandle, boolean isHoverHandle) { super(owner); if (isTransformHandle) { if (isHoverHandle) { stroke1Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_STROKE_1_HOVER; strokeColor1Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_COLOR_1_HOVER; stroke2Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_STROKE_2_HOVER; strokeColor2Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_COLOR_2_HOVER; } else { stroke1Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_STROKE_1; strokeColor1Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_COLOR_1; stroke2Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_STROKE_2; strokeColor2Enabled = HandleAttributeKeys.TRANSFORM_BOUNDS_COLOR_2; } stroke1Disabled = HandleAttributeKeys.TRANSFORM_BOUNDS_STROKE_1_DISABLED; strokeColor1Disabled = HandleAttributeKeys.TRANSFORM_BOUNDS_COLOR_1_DISABLED; stroke2Disabled = HandleAttributeKeys.TRANSFORM_BOUNDS_STROKE_2_DISABLED; strokeColor2Disabled = HandleAttributeKeys.TRANSFORM_BOUNDS_COLOR_2_DISABLED; } else { if (isHoverHandle) { stroke1Enabled = HandleAttributeKeys.RESIZE_BOUNDS_STROKE_1_HOVER; strokeColor1Enabled = HandleAttributeKeys.RESIZE_BOUNDS_COLOR_1_HOVER; stroke2Enabled = HandleAttributeKeys.RESIZE_BOUNDS_STROKE_2_HOVER; strokeColor2Enabled = HandleAttributeKeys.RESIZE_BOUNDS_COLOR_2_HOVER; } else { stroke1Enabled = HandleAttributeKeys.RESIZE_BOUNDS_STROKE_1; strokeColor1Enabled = HandleAttributeKeys.RESIZE_BOUNDS_COLOR_1; stroke2Enabled = HandleAttributeKeys.RESIZE_BOUNDS_STROKE_2; strokeColor2Enabled = HandleAttributeKeys.RESIZE_BOUNDS_COLOR_2; } stroke1Disabled = HandleAttributeKeys.RESIZE_BOUNDS_STROKE_1_DISABLED; strokeColor1Disabled = HandleAttributeKeys.RESIZE_BOUNDS_COLOR_1_DISABLED; stroke2Disabled = HandleAttributeKeys.RESIZE_BOUNDS_STROKE_2_DISABLED; strokeColor2Disabled = HandleAttributeKeys.RESIZE_BOUNDS_COLOR_2_DISABLED; } } /** * Creates a bounds outline handle for resizing or transforming a component. * * @param owner */ public ConvexHullOutlineHandle(SVGPathFigure owner, // AttributeKey<Stroke> stroke1Enabled, AttributeKey<Color> strokeColor1Enabled,// AttributeKey<Stroke> stroke2Enabled, AttributeKey<Color> strokeColor2Enabled,// AttributeKey<Stroke> stroke1Disabled, AttributeKey<Color> strokeColor1Disabled,// AttributeKey<Stroke> stroke2Disabled, AttributeKey<Color> strokeColor2Disabled ) { super(owner); this.stroke1Enabled = stroke1Enabled; this.strokeColor1Enabled = strokeColor1Enabled; this.stroke2Enabled = stroke2Enabled; this.strokeColor2Enabled = strokeColor2Enabled; this.stroke1Disabled = stroke1Disabled; this.strokeColor1Disabled = strokeColor1Disabled; this.stroke2Disabled = stroke2Disabled; this.strokeColor2Disabled = strokeColor2Disabled; } @Override protected Rectangle basicGetBounds() { Shape bounds = getOwner().getBounds(); if (getOwner().get(TRANSFORM) != null) { bounds = getOwner().get(TRANSFORM).createTransformedShape(bounds); } bounds = view.getDrawingToViewTransform().createTransformedShape(bounds); Rectangle r = bounds.getBounds(); r.grow(2, 2); return r; } @Override public SVGPathFigure getOwner() { return (SVGPathFigure) super.getOwner(); } @Override public boolean contains(Point p) { return false; } @Override public void trackStart(Point anchor, int modifiersEx) { } @Override public void trackStep(Point anchor, Point lead, int modifiersEx) { } @Override public void trackEnd(Point anchor, Point lead, int modifiersEx) { } @Override public void draw(Graphics2D g) { if (outline==null) { Shape bounds = getOwner().getPath(); if (getOwner().get(TRANSFORM) != null) { bounds = getOwner().get(TRANSFORM).createTransformedShape(bounds); } bounds = view.getDrawingToViewTransform().createTransformedShape(bounds); outline = ConvexHull.getConvexHullPath2D(bounds); } Stroke stroke1; Color strokeColor1; Stroke stroke2; Color strokeColor2; if (getEditor().getTool().supportsHandleInteraction()) { stroke1 = getEditor().getHandleAttribute(stroke1Enabled); strokeColor1 = getEditor().getHandleAttribute(strokeColor1Enabled); stroke2 = getEditor().getHandleAttribute(stroke2Enabled); strokeColor2 = getEditor().getHandleAttribute(strokeColor2Enabled); } else { stroke1 = getEditor().getHandleAttribute(stroke1Disabled); strokeColor1 = getEditor().getHandleAttribute(strokeColor1Disabled); stroke2 = getEditor().getHandleAttribute(stroke2Disabled); strokeColor2 = getEditor().getHandleAttribute(strokeColor2Disabled); } if (stroke1 != null && strokeColor1 != null) { g.setStroke(stroke1); g.setColor(strokeColor1); g.draw(outline); } if (stroke2 != null && strokeColor2 != null) { g.setStroke(stroke2); g.setColor(strokeColor2); g.draw(outline); } } @Override protected void updateBounds() { outline=null; super.updateBounds(); } }