/******************************************************************************* * Copyright (c) 2006-2012 * Software Technology Group, Dresden University of Technology * DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026 * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Software Technology Group - TU Dresden, Germany; * DevBoost GmbH - Berlin, Germany * - initial API and implementation ******************************************************************************/ /* * @(#)AbstractAttributedDecoratedFigure.java 1.0 January 5, 2007 * * Copyright (c) 1996-2007 by the original authors of JHotDraw * and all its contributors. * All rights reserved. * * The copyright of this software is owned by the authors and * contributors of the JHotDraw project ("the copyright holders"). * You may not use, copy or modify this software, except in * accordance with the license agreement you entered into with * the copyright holders. For details see accompanying license terms. */ package org.jhotdraw.draw; import java.awt.*; import java.awt.geom.*; import java.io.*; import static org.jhotdraw.draw.AttributeKeys.*; import org.jhotdraw.geom.*; import org.jhotdraw.xml.*; /** * AbstractAttributedDecoratedFigure. * * @author Werner Randelshofer * @version 1.0 January 5, 2007 Created. */ public abstract class AbstractAttributedDecoratedFigure extends AbstractAttributedFigure implements DecoratedFigure { private Figure decorator; public final void draw(Graphics2D g) { if (decorator != null) { drawDecorator(g); } drawFigure(g); } protected void drawFigure(Graphics2D g) { super.draw(g); } protected void drawDecorator(Graphics2D g) { updateDecoratorBounds(); decorator.draw(g); } public final Rectangle2D.Double getDrawingArea() { Rectangle2D.Double r = getFigureDrawingArea(); if (decorator != null) { updateDecoratorBounds(); r.add(decorator.getDrawingArea()); } return r; } protected Rectangle2D.Double getFigureDrawingArea() { return super.getDrawingArea(); } public void setDecorator(Figure newValue) { willChange(); decorator = newValue; if (decorator != null) { decorator.setBounds(getStartPoint(), getEndPoint()); } changed(); } public Figure getDecorator() { return decorator; } protected void updateDecoratorBounds() { if (decorator != null) { Point2D.Double sp = getStartPoint(); Point2D.Double ep = getEndPoint(); Insets2D.Double decoratorInsets = DECORATOR_INSETS.get(this); sp.x -= decoratorInsets.left; sp.y -= decoratorInsets.top; ep.x += decoratorInsets.right; ep.y += decoratorInsets.bottom; decorator.setBounds(sp, ep); } } public final boolean contains(Point2D.Double p) { if (decorator != null) { updateDecoratorBounds(); if (decorator.contains(p)) { return true; } } return figureContains(p); } protected abstract boolean figureContains(Point2D.Double p); public void read(DOMInput in) throws IOException { super.read(in); readDecorator(in); } public void write(DOMOutput out) throws IOException { super.write(out); writeDecorator(out); } protected void writeDecorator(DOMOutput out) throws IOException { if (decorator != null) { out.openElement("decorator"); out.writeObject(decorator); out.closeElement(); } } protected void readDecorator(DOMInput in) throws IOException { if (in.getElementCount("decorator") > 0) { in.openElement("decorator"); decorator = (Figure) in.readObject(); in.closeElement(); } else { decorator = null; } } public AbstractAttributedDecoratedFigure clone() { AbstractAttributedDecoratedFigure that = (AbstractAttributedDecoratedFigure) super.clone(); if (this.decorator != null) { that.decorator = (Figure) this.decorator.clone(); } return that; } }