/* ****************************************************************************** * 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 static org.xmind.ui.mindmap.MindMapUI.SOURCE_ANCHOR; import static org.xmind.ui.mindmap.MindMapUI.SOURCE_CONTROL_POINT; import static org.xmind.ui.mindmap.MindMapUI.TARGET_ANCHOR; import static org.xmind.ui.mindmap.MindMapUI.TARGET_CONTROL_POINT; import org.eclipse.draw2d.Cursors; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.swt.graphics.Cursor; import org.xmind.core.Core; import org.xmind.core.IControlPoint; import org.xmind.core.IRelationship; import org.xmind.core.IRelationshipEnd; import org.xmind.core.ITitled; import org.xmind.core.event.CoreEvent; import org.xmind.core.event.ICoreEventRegister; import org.xmind.gef.GEF; import org.xmind.gef.part.IGraphicalEditPart; import org.xmind.gef.part.IPart; import org.xmind.gef.part.IRequestHandler; import org.xmind.gef.policy.NullEditPolicy; import org.xmind.gef.service.IFeedback; import org.xmind.ui.internal.decorators.RelationshipDecorator; import org.xmind.ui.internal.figures.RelationshipFigure; import org.xmind.ui.internal.graphicalpolicies.RelationshipGraphicalPolicy; import org.xmind.ui.mindmap.INodePart; import org.xmind.ui.mindmap.IRelationshipPart; import org.xmind.ui.mindmap.ISelectionFeedbackHelper; import org.xmind.ui.mindmap.ISheetPart; import org.xmind.ui.mindmap.ITitleTextPart; import org.xmind.ui.mindmap.MindMapUI; /** * @author MANGOSOFT * */ public class RelationshipPart extends ConnectionPart implements IRelationshipPart { private ITitleTextPart title = null; public RelationshipPart() { setDecorator(RelationshipDecorator.getInstance()); setGraphicalPolicy(RelationshipGraphicalPolicy.getInstance()); } protected IFeedback createFeedback() { RelationshipFeedback feedback = new RelationshipFeedback(this); feedback.addFeedback(new DecoratedRelFeedback(this)); return feedback; } protected ISelectionFeedbackHelper createSelectionFeedbackHelper() { return new RelationshipSelectionHelper(); } public IRelationship getRelationship() { return (IRelationship) super.getRealModel(); } public ISheetPart getOwnerSheet() { if (getParent() instanceof ISheetPart) { return (ISheetPart) getParent(); } return null; } public void setParent(IPart parent) { if (getParent() instanceof SheetPart) { ((SheetPart) getParent()).removeRelationship(this); } super.setParent(parent); if (getParent() instanceof SheetPart) { ((SheetPart) getParent()).addRelationship(this); } } public ITitleTextPart getTitle() { return title; } public void setTitle(ITitleTextPart title) { this.title = title; ((RelationshipFigure) getFigure()).setTitle(title == null ? null : title.getTextFigure()); } protected void register() { registerModel(getRelationship()); super.register(); } protected void unregister() { super.unregister(); unregisterModel(getRelationship()); } private boolean hasTitle() { ITitled titled = getRelationship(); return titled.hasTitle() && !"".equals(titled.getTitleText()); //$NON-NLS-1$ } protected Object[] getModelChildren(Object model) { return new Object[] { new ViewerModel(RelTitleTextPart.class, getRelationship()) }; } protected void declareEditPolicies(IRequestHandler reqHandler) { super.declareEditPolicies(reqHandler); reqHandler.installEditPolicy(GEF.ROLE_SELECTABLE, NullEditPolicy.getInstance()); reqHandler.installEditPolicy(GEF.ROLE_MOVABLE, MindMapUI.POLICY_RELATIONSHIP_MOVABLE); reqHandler.installEditPolicy(GEF.ROLE_EDITABLE, MindMapUI.POLICY_EDITABLE); reqHandler.installEditPolicy(GEF.ROLE_MODIFIABLE, MindMapUI.POLICY_MODIFIABLE); reqHandler.installEditPolicy(GEF.ROLE_DELETABLE, MindMapUI.POLICY_DELETABLE); reqHandler.installEditPolicy(GEF.ROLE_CREATABLE, MindMapUI.POLICY_RELATIONSHIP_CREATABLE); reqHandler.installEditPolicy(GEF.ROLE_TRAVERSABLE, MindMapUI.POLICY_RELATIONSHIP_TRAVERSABLE); reqHandler.installEditPolicy(GEF.ROLE_NAVIGABLE, MindMapUI.POLICY_TOPIC_NAVIGABLE); } @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { if (adapter.isAssignableFrom(IRelationship.class)) return getRelationship(); if (adapter == TitleTextPart.class || adapter == ITitleTextPart.class) return getTitle(); return super.getAdapter(adapter); } public int getPointId(Point position) { return ((RelationshipFeedback) getFeedback()).getPointId(position); } public boolean containsPoint(Point position) { return super.containsPoint(position) || ((getStatus().isSelected() || getStatus().isPreSelected()) && getPointId(position) != 0); } public IPart findAt(Point position) { IPart ret; ITitleTextPart title = getTitle(); if (title != null) { ret = ((IGraphicalEditPart) title).findAt(position); if (ret != null) return this; } ret = super.findAt(position); return ret; } public Cursor getCursor(Point pos) { int pointId = getPointId(pos); if (pointId == SOURCE_ANCHOR || pointId == TARGET_ANCHOR) return Cursors.HAND; if (pointId == SOURCE_CONTROL_POINT || pointId == TARGET_CONTROL_POINT) return Cursors.CROSS; return super.getCursor(pos); } public void refresh() { super.refresh(); ITitleTextPart title = getTitle(); if (title != null) { title.refresh(); } } public void update() { super.update(); ITitleTextPart title = getTitle(); if (title != null) { title.update(); } } protected IFigure createFigure() { RelationshipFigure fig = new RelationshipFigure(); // fig.setTitle(title.getTextFigure()); fig.setTitleVisible(hasTitle()); return fig; } protected INodePart findSourceNode() { return findNode(getRelationship().getEnd1()); } protected INodePart findTargetNode() { return findNode(getRelationship().getEnd2()); } private INodePart findNode(IRelationshipEnd end) { if (end != null) { IPart p = getSite().getViewer().findPart(end); if (p instanceof INodePart) return (INodePart) p; } return null; } // public void addNotify() { // register(); // for (IPart child : getChildren()) { // child.addNotify(); // } // refresh(); // } // // public void removeNotify() { // getStatus().dePreSelect(); // getStatus().deSelect(); // getStatus().lostFocus(); // title.removeNotify(); // for (Object o : getChildren().toArray()) { // ((IPart) o).removeNotify(); // } // removeTitleView(); // unregister(); // } // // public void figureMoved(IFigure source) { // update(); // } protected void registerCoreEvents(Object source, ICoreEventRegister register) { super.registerCoreEvents(source, register); // register.register(Core.RelationshipControlPoint); register.register(Core.RelationshipEnd1); register.register(Core.RelationshipEnd2); register.register(Core.Style); // register.register(Core.TitleText); if (source instanceof IRelationship) { IControlPoint cp1 = ((IRelationship) source).getControlPoint(0); if (cp1 != null) { register.setNextSourceFrom(cp1); register.register(Core.Position); } IControlPoint cp2 = ((IRelationship) source).getControlPoint(1); if (cp2 != null) { register.setNextSourceFrom(cp2); register.register(Core.Position); } } } @Override public void handleCoreEvent(CoreEvent event) { String type = event.getType(); if (Core.Position.equals(type)) { update(); } else if (Core.RelationshipEnd1.equals(type) || Core.RelationshipEnd2.equals(type)) { refresh(); } else if (Core.Style.equals(type)) { update(); // } else if (Core.TitleText.equals(type)) { // ((RelationshipFigure) getFigure()).setTitleVisible(hasTitle()); // refresh(); } else { super.handleCoreEvent(event); } } // public void setModel(Object model) { // super.setModel(model); // title.setModel(new ViewerModel(RelTitleTextPart.class, getRealModel())); // } // // protected void onActivated() { // super.onActivated(); // title.getStatus().activate(); // } // // protected void onDeactivated() { // title.getStatus().deactivate(); // super.onDeactivated(); // } // // protected void addTitleView() { // Layer layer = ((IGraphicalViewer) getSite().getViewer()) // .getLayer(MindMapUI.LAYER_TITLE); // if (layer != null) { // layer.add(title.getTextFigure()); // } // } // // protected void removeTitleView() { // ITextFigure titleFigure = title.getTextFigure(); // if (titleFigure.getParent() != null) { // titleFigure.getParent().remove(titleFigure); // } // } }