/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.mindmap; import org.eclipse.draw2d.IFigure; import org.xmind.gef.draw2d.AbstractAnchor; import org.xmind.gef.draw2d.IDecoratedFigure; import org.xmind.gef.draw2d.IDecoratedFigureListener; import org.xmind.gef.draw2d.decoration.IDecoration; import org.xmind.gef.draw2d.decoration.IShapeDecorationEx; import org.xmind.gef.draw2d.geometry.Geometry; import org.xmind.gef.draw2d.geometry.PrecisionPoint; public class DecoratedAnchor extends AbstractAnchor implements IDecoratedFigureListener { public DecoratedAnchor(IFigure owner) { super(owner); } /* * (non-Javadoc) * * @see * org.xmind.gef.draw2d.AbstractAnchor#hookOwner(org.eclipse.draw2d.IFigure) */ @Override protected void hookOwner(IFigure owner) { super.hookOwner(owner); if (getOwner() instanceof IDecoratedFigure) { ((IDecoratedFigure) getOwner()).addDecoratedFigureListener(this); } } /* * (non-Javadoc) * * @see * org.xmind.gef.draw2d.AbstractAnchor#unhookOwner(org.eclipse.draw2d.IFigure * ) */ @Override protected void unhookOwner(IFigure owner) { if (getOwner() instanceof IDecoratedFigure) { ((IDecoratedFigure) getOwner()).removeDecoratedFigureListener(this); } super.unhookOwner(owner); } public PrecisionPoint getLocation(int orientation, double expansion) { if (getOwner() instanceof IDecoratedFigure) { IDecoration decoration = ((IDecoratedFigure) getOwner()) .getDecoration(); if (decoration instanceof IShapeDecorationEx) { PrecisionPoint loc = ((IShapeDecorationEx) decoration) .getAnchorLocation(getOwner(), orientation, expansion); if (loc != null) return loc; } } return super.getLocation(orientation, expansion); } public PrecisionPoint getLocation(double x, double y, double expansion) { if (getOwner() instanceof IDecoratedFigure) { IDecoration decoration = ((IDecoratedFigure) getOwner()) .getDecoration(); if (decoration instanceof IShapeDecorationEx) { PrecisionPoint loc = ((IShapeDecorationEx) decoration) .getAnchorLocation(getOwner(), x, y, expansion); if (loc != null) return loc; } } if (getOwner() != null) return Geometry.getChopBoxLocation(x, y, getOwner().getBounds(), expansion); return new PrecisionPoint(x, y); } public void decorationChanged(IDecoratedFigure figure, IDecoration oldDecoration, IDecoration newDecoration) { fireAnchorMoved(); } }