/* * @(#)LineFigure.java * * Copyright (c) 1996-2010 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.draw; import org.jhotdraw.geom.BezierPath; import org.jhotdraw.draw.handle.BezierOutlineHandle; import org.jhotdraw.draw.handle.BezierNodeHandle; import javax.swing.undo.*; import java.awt.event.*; import java.awt.geom.*; import java.util.*; import org.jhotdraw.draw.handle.Handle; /** * A {@link Figure} which draws a continuous bezier path between two points. * * @author Werner Randelshofer * @version $Id$ */ public class LineFigure extends BezierFigure { private static final long serialVersionUID = 1L; /** Creates a new instance. */ public LineFigure() { addNode(new BezierPath.Node(new Point2D.Double(0,0))); addNode(new BezierPath.Node(new Point2D.Double(0,0))); setConnectable(false); } // DRAWING // SHAPE AND BOUNDS // ATTRIBUTES // EDITING @Override public Collection<Handle> createHandles(int detailLevel) { LinkedList<Handle> handles = new LinkedList<>(); switch (detailLevel) { case -1 : // Mouse hover handles handles.add(new BezierOutlineHandle(this, true)); break; case 0 : handles.add(new BezierOutlineHandle(this)); for (int i=0, n = path.size(); i < n; i++) { handles.add(new BezierNodeHandle(this, i)); } break; } return handles; } // CONNECTING // COMPOSITE FIGURES // CLONING // EVENT HANDLING /** * Handles a mouse click. */ @Override public boolean handleMouseClick(Point2D.Double p, MouseEvent evt, DrawingView view) { if (evt.getClickCount() == 2 && view.getHandleDetailLevel() == 0) { willChange(); final int index = splitSegment(p, (float) (5f / view.getScaleFactor())); if (index != -1) { final BezierPath.Node newNode = getNode(index); fireUndoableEditHappened(new AbstractUndoableEdit() { private static final long serialVersionUID = 1L; @Override public void redo() throws CannotRedoException { super.redo(); willChange(); addNode(index, newNode); changed(); } @Override public void undo() throws CannotUndoException { super.undo(); willChange(); removeNode(index); changed(); } }); changed(); return true; } } return false; } }