Skip to content
Snippets Groups Projects
Commit 64162796 authored by Florian Hölzl's avatar Florian Hölzl
Browse files

refactored disconnect

refs 133
parent b5697d9d
No related branches found
No related tags found
No related merge requests found
Showing with 80 additions and 68 deletions
......@@ -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);
}
......@@ -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;
}
......
......@@ -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);
}
}
......@@ -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} */
......
......@@ -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);
}
......@@ -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;
......
......@@ -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);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment