From 64162796a6cc8b8d7953e7c9656409fec915987f Mon Sep 17 00:00:00 2001 From: Florian Hoelzl <hoelzl@fortiss.org> Date: Tue, 30 Aug 2011 11:20:42 +0000 Subject: [PATCH] refactored disconnect refs 133 --- .../ConnectorConnectionCompositorBase.java | 8 +-- ...archicElementConnectionCompositorBase.java | 4 +- .../HierarchicElementCompositorBase.java | 9 +-- .../kernel/ui/internal/ActionService.java | 44 ++++++++++++--- .../extension/IConnectionCompositor.java | 19 +------ .../internal/ConnectionCompositorService.java | 56 +++++++++++-------- .../service/IConnectionCompositorService.java | 8 +-- 7 files changed, 80 insertions(+), 68 deletions(-) diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java index cee567af9..8455be2ac 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java @@ -264,9 +264,8 @@ public abstract class ConnectorConnectionCompositorBase<HE extends IHierarchicEl /** {@inheritDoc} */ @Override - public boolean canDisconnect(S source, T target, EObject connection, - IConnectionCompositionContext context) { - if (!canDisconnectSpecific(source, target, connection, context)) { + public boolean canDisconnect(EObject connection) { + if (!canDisconnectSpecific(connection)) { return false; } if (connection instanceof IConnection) { @@ -282,6 +281,5 @@ public abstract class ConnectorConnectionCompositorBase<HE extends IHierarchicEl } /** Base implementation returns true by default */ - public abstract boolean canDisconnectSpecific(S source, T target, - EObject connection, IConnectionCompositionContext context); + public abstract boolean canDisconnectSpecific(EObject connection); } diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java index f621aac57..bfdbac807 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java @@ -140,8 +140,7 @@ public abstract class HierarchicElementConnectionCompositorBase<HE extends IHier /** {@inheritDoc} */ @Override - public boolean canDisconnect(S source, T target, EObject connection, - IConnectionCompositionContext context) { + public boolean canDisconnect(EObject connection) { if (connection instanceof IConnection) { IConnection conn = (IConnection) connection; for (IModelElementSpecification spec : conn.getSpecificationsList()) { @@ -150,7 +149,6 @@ public abstract class HierarchicElementConnectionCompositorBase<HE extends IHier } } } - return true; } diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java index 126d3efd5..78b691d1a 100644 --- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java +++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java @@ -307,8 +307,7 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem * may override. */ protected boolean canDecomposeConnection(IConnection conn) { - return IConnectionCompositorService.INSTANCE.canDisconnect( - conn.getSource(), conn.getTarget(), conn, null); + return IConnectionCompositorService.INSTANCE.canDisconnect(conn); } protected boolean decomposeSpecification(IModelElementSpecification element) { @@ -337,8 +336,7 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem list.addAll(element.getOutgoingList()); for (IConnection conn : list) { System.out.println("disconnect: " + element + " ### " + this); - if (!IConnectionCompositorService.INSTANCE.disconnect( - conn.getSource(), conn.getTarget(), conn, null)) { + if (!IConnectionCompositorService.INSTANCE.disconnect(conn)) { return false; } } @@ -348,8 +346,7 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem protected boolean decomposeConnection(IConnection conn) { System.out.println("connection: " + conn + " ### " + this); - return IConnectionCompositorService.INSTANCE.disconnect( - conn.getSource(), conn.getTarget(), conn, null); + return IConnectionCompositorService.INSTANCE.disconnect(conn); } } diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java index 547ab9157..db30d082a 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java +++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java @@ -22,12 +22,14 @@ import java.util.EventObject; import org.eclipse.emf.common.command.CommandStackListener; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IActionBars; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; import org.fortiss.tooling.kernel.service.ICommandStackService; +import org.fortiss.tooling.kernel.service.IConnectionCompositorService; import org.fortiss.tooling.kernel.service.IElementCompositorService; import org.fortiss.tooling.kernel.service.IPersistencyService; import org.fortiss.tooling.kernel.service.listener.IPersistencyServiceListener; @@ -76,9 +78,26 @@ public class ActionService implements IActionService, }; /** The global delete action. */ - public final EObjectActionBase globalDeleteAction = new EObjectActionBase( - "Delete", PlatformUI.getWorkbench().getSharedImages() - .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)) { + public final DeleteAction globalDeleteAction = new DeleteAction("Delete", + PlatformUI.getWorkbench().getSharedImages() + .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); + + private static class DeleteAction extends EObjectActionBase { + + private boolean useElementCompositor; + + /** + * @param text + * @param image + */ + public DeleteAction(String text, ImageDescriptor image) { + super(text, image); + } + + public void setUseElementCompositor(boolean useElementCompositor) { + this.useElementCompositor = useElementCompositor; + } + @Override public void run() { final EObject selectedObject = getTarget(); @@ -94,7 +113,7 @@ public class ActionService implements IActionService, } }); } - }; + } /** Constructor. */ public ActionService() { @@ -157,12 +176,19 @@ public class ActionService implements IActionService, globalRedoAction.setEnabled(ICommandStackService.INSTANCE .canRedo(target)); - boolean canDelete = IElementCompositorService.INSTANCE - .canDecompose(target); - canDelete = canDelete - && !IPersistencyService.INSTANCE.isTopLevelElement(target); globalDeleteAction.setTarget(target); - globalDeleteAction.setEnabled(canDelete); + boolean enabled = false; + if (!IPersistencyService.INSTANCE.isTopLevelElement(target)) { + if (IElementCompositorService.INSTANCE.canDecompose(target)) { + enabled = true; + globalDeleteAction.setUseElementCompositor(true); + } else if (IConnectionCompositorService.INSTANCE + .canDisconnect(target)) { + enabled = true; + globalDeleteAction.setUseElementCompositor(false); + } + } + globalDeleteAction.setEnabled(enabled); } /** {@inheritDoc} */ diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java index 583d19516..54703a2dd 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java @@ -93,24 +93,11 @@ public interface IConnectionCompositor<P extends EObject, S extends EObject, T e * Returns whether a connection between the source and the target can be * removed. */ - boolean canDisconnect(S source, T target, EObject connection, - IConnectionCompositionContext context); + boolean canDisconnect(EObject connection); /** * Actually disconnects the given source and destination. This will only be - * called if - * {@link #canDisconnect(EObject, EObject, EObject, IConnectionCompositionContext)} - * returned true. - * - * @param source - * the source of the connection. - * @param target - * the target of the connection. - * @param connection - * the existing connection object. - * @param context - * context information for the connection. May be null. + * called if {@link #canDisconnect(EObject)} returned true. */ - boolean disconnect(S source, T target, EObject connection, - IConnectionCompositionContext context); + boolean disconnect(EObject connection); } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java index bb50b5eff..b4112eef8 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java @@ -18,6 +18,7 @@ $Id$ package org.fortiss.tooling.kernel.internal; import java.util.List; +import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.fortiss.tooling.kernel.extension.IConnectionCompositor; @@ -52,8 +53,7 @@ public class ConnectionCompositorService @Override public boolean canConnect(EObject source, EObject destination, EObject connection, IConnectionCompositionContext context) { - return findWorkingConnector(source, destination, connection, true, - context) != null; + return findWorkingConnector(source, destination, connection, context) != null; } /** {@inheritDoc} */ @@ -61,7 +61,7 @@ public class ConnectionCompositorService public boolean connect(EObject source, EObject destination, EObject connection, IConnectionCompositionContext context) { IConnectionCompositor<EObject, EObject, EObject> connector = findWorkingConnector( - source, destination, connection, true, context); + source, destination, connection, context); IPersistencyService.INSTANCE.getTopLevelElementFor(source).prepareIDs( connection); return connector.connect(source, destination, connection, context); @@ -69,23 +69,16 @@ public class ConnectionCompositorService /** {@inheritDoc} */ @Override - public boolean canDisconnect(EObject source, EObject destination, - EObject connection, IConnectionCompositionContext context) { - // TODO remove - System.out.println(connection); - return findWorkingConnector(source, destination, connection, false, - context) != null - && findWorkingConnector(source, destination, connection, false, - context).canDisconnect(source, destination, connection, - context); + public boolean canDisconnect(EObject connection) { + IConnectionCompositor<EObject, EObject, EObject> dc = findWorkingDisconnector(connection); + return dc != null && dc.canDisconnect(connection); } /** {@inheritDoc} */ @Override - public boolean disconnect(EObject source, EObject destination, - EObject connection, IConnectionCompositionContext context) { - return findWorkingConnector(source, destination, connection, true, - context).disconnect(source, destination, connection, context); + public boolean disconnect(EObject connection) { + IConnectionCompositor<EObject, EObject, EObject> dc = findWorkingDisconnector(connection); + return dc != null && dc.disconnect(connection); } /** @@ -94,22 +87,37 @@ public class ConnectionCompositorService */ private IConnectionCompositor<EObject, EObject, EObject> findWorkingConnector( EObject source, EObject target, EObject connection, - boolean connect, IConnectionCompositionContext context) { + IConnectionCompositionContext context) { List<IConnectionCompositor<EObject, EObject, EObject>> list = getRegisteredHandlers( source.getClass(), target.getClass()); if (list == null) { return null; } for (IConnectionCompositor<EObject, EObject, EObject> connector : list) { - if (connect - && connector - .canConnect(source, target, connection, context)) { + if (connector.canConnect(source, target, connection, context)) { return connector; } - if (!connect - && connector.canDisconnect(source, target, connection, - context)) { - return connector; + } + return null; + } + + /** + * Returns the first {@link IConnectionCompositor} which can disconnect the + * given elements (or <code>null</code> if no such connector exists). + */ + private IConnectionCompositor<EObject, EObject, EObject> findWorkingDisconnector( + EObject connection) { + for (Class<?> c : handlersBySource.keySet()) { + Map<Class<?>, List<IConnectionCompositor<EObject, EObject, EObject>>> tmap = handlersBySource + .get(c); + for (Class<?> c2 : tmap.keySet()) { + List<IConnectionCompositor<EObject, EObject, EObject>> list = tmap + .get(c2); + for (IConnectionCompositor<EObject, EObject, EObject> comp : list) { + if (comp.canDisconnect(connection)) { + return comp; + } + } } } return null; diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java index d7779ee4f..5bf129546 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java @@ -73,15 +73,13 @@ public interface IConnectionCompositorService { /** * Determines if there is a compositor that allows the decomposition of the - * connection between the source and target model element. + * given connection. */ - boolean canDisconnect(EObject source, EObject destination, - EObject connection, IConnectionCompositionContext context); + boolean canDisconnect(EObject connection); /** * Decomposes the connection. Since this operation may be canceled by the * user, it returns a boolean value. */ - boolean disconnect(EObject source, EObject destination, EObject connection, - IConnectionCompositionContext context); + boolean disconnect(EObject connection); } -- GitLab