/* ****************************************************************************** * 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.tools; import java.util.List; import org.eclipse.draw2d.FigureListener; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.xmind.core.IControlPoint; import org.xmind.core.IRelationship; import org.xmind.core.ISheet; import org.xmind.core.ITopic; import org.xmind.core.IWorkbook; import org.xmind.gef.IGraphicalViewer; import org.xmind.gef.draw2d.AbstractAnchor; import org.xmind.gef.draw2d.IAnchor; import org.xmind.gef.draw2d.IReferencedFigure; import org.xmind.gef.draw2d.ReferencedFigure; import org.xmind.gef.draw2d.SelectionFigure; import org.xmind.gef.draw2d.geometry.PrecisionPoint; import org.xmind.gef.part.IGraphicalPart; import org.xmind.gef.part.IPart; import org.xmind.gef.service.IFeedbackService; import org.xmind.ui.internal.mindmap.NodePart; import org.xmind.ui.internal.mindmap.RelationshipFeedback; import org.xmind.ui.internal.mindmap.RelationshipPart; import org.xmind.ui.mindmap.IConnectionPart; import org.xmind.ui.mindmap.INodePart; import org.xmind.ui.mindmap.IRelationshipPart; import org.xmind.ui.mindmap.MindMapUI; public class RelationshipDummy { private static class DummyNodePart extends NodePart implements FigureListener { private IGraphicalPart source; private IAnchor anchor = null; public DummyNodePart(IGraphicalPart source) { this.source = source; } public DummyNodePart() { this(null); } protected void fillSourceConnections(List<IConnectionPart> list) { } protected void fillTargetConnections(List<IConnectionPart> list) { } @Override protected IFigure createFigure() { ReferencedFigure fig = new ReferencedFigure(); if (source != null) { fig.setBounds(source.getFigure().getBounds()); } else { fig.setSize(5, 5); } return fig; } @Override public void addNotify() { super.addNotify(); if (source != null) { source.getFigure().addFigureListener(this); } } @Override public void removeNotify() { if (source != null) { source.getFigure().removeFigureListener(this); } super.removeNotify(); } public IAnchor getSourceAnchor(IGraphicalPart connection) { return getAnchor(); } public IAnchor getTargetAnchor(IGraphicalPart connection) { return getAnchor(); } private IAnchor getAnchor() { if (anchor == null) { if (source != null && source instanceof INodePart) { anchor = ((INodePart) source).getSourceAnchor(null); } else { anchor = new ReferenceAnchor(getFigure()); } } return anchor; } public void figureMoved(IFigure source) { getFigure().setBounds(source.getBounds()); } } private class DummyRelPart extends RelationshipPart { @Override protected INodePart findSourceNode() { return sn; } @Override protected INodePart findTargetNode() { return tn; } } private static class ReferenceAnchor extends AbstractAnchor { public ReferenceAnchor(IFigure owner) { super(owner); } public PrecisionPoint getLocation(double x, double y, double expansion) { return getReferencePoint(); } } private IGraphicalViewer viewer; private INodePart sn; private INodePart tn; private IRelationshipPart rel; private ITopic t1; private ITopic t2; private IRelationship r; private IFeedbackService feedbackService; private RelationshipFeedback feedback; public RelationshipDummy(IFigure layer, IGraphicalPart sourceNode, Point cursorPosition, IGraphicalViewer viewer) { this.viewer = viewer; createDummyModels(); IControlPoint cp1 = r.getControlPoint(0); IControlPoint cp2 = r.getControlPoint(1); cp1.setPolarAngle(Math.PI / 12); cp1.setPolarAmount(0.3); cp2.setPolarAngle(Math.PI / 12); cp2.setPolarAmount(0.3); sn = new DummyNodePart(sourceNode); tn = new DummyNodePart(); rel = new DummyRelPart(); activateParts(layer); ((IReferencedFigure) tn.getFigure()).setReference(cursorPosition); feedbackService = (IFeedbackService) viewer .getService(IFeedbackService.class); if (feedbackService != null) { SelectionFigure selectionDummy = feedbackService .setSelected(sn.getFigure()); //selectionDummy.setSelectionColor(ColorUtils.getColor(MindMapUI.COLOR_WARNING)); selectionDummy.setSelectionAlpha(0x90); } } public RelationshipDummy(IFigure layer, IRelationshipPart sourceRel, int pointId, IGraphicalViewer viewer) { this.viewer = viewer; createDummyModels(); IRelationship sr = sourceRel.getRelationship(); r.setStyleId(sr.getStyleId()); r.getControlPoint(0).setPosition(sr.getControlPoint(0).getPosition()); r.getControlPoint(1).setPosition(sr.getControlPoint(1).getPosition()); r.getControlPoint(0) .setPolarAngle(sr.getControlPoint(0).getPolarAngle()); r.getControlPoint(0) .setPolarAmount(sr.getControlPoint(0).getPolarAmount()); r.getControlPoint(1) .setPolarAngle(sr.getControlPoint(1).getPolarAngle()); r.getControlPoint(1) .setPolarAmount(sr.getControlPoint(1).getPolarAmount()); // if (cp != null) { // r.setControlPoint(0, cp.getAngle(), cp.getAmount()); // } // cp = sr.getControlPoint(1); // if (cp != null) { // r.setControlPoint(1, cp.getAngle(), cp.getAmount()); // } sn = tn = null; if (pointId == MindMapUI.SOURCE_ANCHOR) { sn = new DummyNodePart(); } else if (pointId == MindMapUI.TARGET_ANCHOR) { tn = new DummyNodePart(); } if (sn == null) sn = new DummyNodePart(sourceRel.getSourceNode()); if (tn == null) tn = new DummyNodePart(sourceRel.getTargetNode()); rel = new DummyRelPart(); activateParts(layer); feedbackService = (IFeedbackService) viewer .getService(IFeedbackService.class); if (feedbackService != null) { feedback = new RelationshipFeedback(rel); feedback.setAlpha(0xe0); feedbackService.addFeedback(feedback); } } private void createDummyModels() { ISheet sheet = (ISheet) viewer.getAdapter(ISheet.class); IWorkbook wb = sheet.getOwnedWorkbook(); t1 = wb.createTopic(); t2 = wb.createTopic(); r = wb.createRelationship(); r.setEnd1Id(t1.getId()); r.setEnd2Id(t2.getId()); } private void activateParts(IFigure layer) { IPart root = viewer.getRootPart(); sn.setModel(t1); sn.setParent(root); layer.add(sn.getFigure()); sn.addNotify(); sn.getStatus().activate(); tn.setModel(t2); tn.setParent(root); layer.add(tn.getFigure()); tn.addNotify(); tn.getStatus().activate(); rel.setModel(r); rel.setParent(root); layer.add(rel.getFigure()); rel.addNotify(); rel.getStatus().activate(); } public INodePart getSourceNodeDummy() { return sn; } public INodePart getTargetNodeDummy() { return tn; } public IRelationshipPart getRelDummy() { return rel; } public void refreshFeedback() { if (feedbackService == null) return; if (feedback != null) feedback.update(); } public void dispose() { if (feedbackService != null) { if (sn != null) feedbackService.removeSelection(sn.getFigure()); feedbackService.removeFeedback(feedback); feedbackService = null; } if (rel != null) { rel.getStatus().deactivate(); rel.removeNotify(); rel.getFigure().getParent().remove(rel.getFigure()); rel.setParent(null); rel = null; } if (tn != null) { tn.getStatus().deactivate(); tn.removeNotify(); tn.getFigure().getParent().remove(tn.getFigure()); tn.setParent(null); tn = null; } if (sn != null) { sn.getStatus().deactivate(); sn.removeNotify(); sn.getFigure().getParent().remove(sn.getFigure()); sn.setParent(null); sn = null; } } }