/******************************************************************************* | |
* Copyright (c) 2005, 2012 IBM Corporation and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.bpel.ui; | |
import java.util.Map; | |
import org.eclipse.bpel.model.Activity; | |
import org.eclipse.bpel.model.BPELPackage; | |
import org.eclipse.bpel.model.Link; | |
import org.eclipse.bpel.model.Links; | |
import org.eclipse.bpel.model.Source; | |
import org.eclipse.bpel.model.Sources; | |
import org.eclipse.bpel.model.Target; | |
import org.eclipse.bpel.model.Targets; | |
import org.eclipse.bpel.ui.editparts.BPELEditPart; | |
import org.eclipse.bpel.ui.util.FlowLinkUtil; | |
import org.eclipse.bpel.ui.util.MultiObjectAdapter; | |
import org.eclipse.emf.common.notify.Notification; | |
import org.eclipse.gef.EditPart; | |
/** | |
* An adapter which gets notified of all model changes and refreshes the connections | |
* of the appropriate edit parts when there are model changes involving links. | |
* | |
* The adapter is currently attached to ModelListenerAdapter (since that is already | |
* an EContentAdapter). | |
*/ | |
class LinkNotificationAdapter extends MultiObjectAdapter { | |
private BPELEditor bpelEditor; | |
protected boolean DEBUG = false; | |
LinkNotificationAdapter(BPELEditor editor) { | |
this.bpelEditor = editor; | |
} | |
@Override | |
public void notify(Notification n) { | |
if (bpelEditor.getGraphicalViewer() == null) return; | |
if (n.getNotifier() instanceof Links) { | |
if (n.getFeatureID(Links.class) == BPELPackage.LINKS__CHILDREN) { | |
if (DEBUG) System.out.println("Links change not handled yet!"); //$NON-NLS-1$ | |
} | |
} | |
if (n.getNotifier() instanceof Sources) { | |
if (n.getFeatureID(Sources.class) == BPELPackage.SOURCES__CHILDREN) { | |
if (DEBUG) System.out.println("Sources change not handled yet!"); //$NON-NLS-1$ | |
} | |
} | |
if (n.getNotifier() instanceof Targets) { | |
if (n.getFeatureID(Targets.class) == BPELPackage.TARGETS__CHILDREN) { | |
if (DEBUG) System.out.println("Targets change not handled yet!"); //$NON-NLS-1$ | |
} | |
} | |
if (n.getNotifier() instanceof Source) { | |
if (n.getFeatureID(Source.class) == BPELPackage.SOURCE__ACTIVITY) { | |
if (n.getOldValue() instanceof Activity) { | |
refreshConnections((Activity)n.getOldValue(), "old source",true,false); //$NON-NLS-1$ | |
} | |
if (n.getNewValue() instanceof Activity) { | |
refreshConnections((Activity)n.getNewValue(), "new source",true,false); //$NON-NLS-1$ | |
} | |
} | |
} | |
if (n.getNotifier() instanceof Target) { | |
if (n.getFeatureID(Target.class) == BPELPackage.TARGET__ACTIVITY) { | |
if (n.getOldValue() instanceof Activity) { | |
refreshConnections((Activity)n.getOldValue(), "old target",false,true); //$NON-NLS-1$ | |
} | |
if (n.getNewValue() instanceof Activity) { | |
refreshConnections((Activity)n.getNewValue(), "new target",false,true); //$NON-NLS-1$ | |
} | |
} | |
} | |
if (n.getNotifier() instanceof Activity) { | |
if (n.getFeatureID(Activity.class) == BPELPackage.ACTIVITY__SOURCES) { | |
switch (n.getEventType()) { | |
case Notification.REMOVE: | |
case Notification.REMOVE_MANY: | |
refreshConnections((Activity)n.getNotifier(), "old source(2)",true,false); break; //$NON-NLS-1$ | |
case Notification.ADD: | |
case Notification.ADD_MANY: | |
refreshConnections((Activity)n.getNotifier(), "new source(2)",true,false); break; //$NON-NLS-1$ | |
} | |
} | |
if (n.getFeatureID(Activity.class) == BPELPackage.ACTIVITY__TARGETS) { | |
switch (n.getEventType()) { | |
case Notification.REMOVE: | |
case Notification.REMOVE_MANY: | |
refreshConnections((Activity)n.getNotifier(), "old target(2)",false,true); break; //$NON-NLS-1$ | |
case Notification.ADD: | |
case Notification.ADD_MANY: | |
refreshConnections((Activity)n.getNotifier(), "new target(2)",false,true); break; //$NON-NLS-1$ | |
} | |
} | |
} | |
// TODO: this part is kind of iffy... (how do I detect the containment features??) | |
if (n.getOldValue() instanceof Activity) { | |
activityMoved((Activity)n.getOldValue()); | |
} | |
if (n.getNewValue() instanceof Activity) { | |
activityMoved((Activity)n.getNewValue()); | |
} | |
} | |
protected void refreshConnections(Activity activity, String debugRole, boolean refreshSource, boolean refreshTarget) { | |
Map registry = this.bpelEditor.getGraphicalViewer().getEditPartRegistry(); | |
EditPart editPart = (EditPart)registry.get(activity); | |
if ((editPart instanceof BPELEditPart) && editPart.isActive()) { | |
System.out.println(debugRole+": "+editPart.getModel()); //$NON-NLS-1$ | |
if (refreshSource) ((BPELEditPart)editPart).refreshSourceConnections(); | |
if (refreshTarget) ((BPELEditPart)editPart).refreshTargetConnections(); | |
} | |
} | |
protected void refreshConnectionTargets(Sources sources) { | |
Map registry = this.bpelEditor.getGraphicalViewer().getEditPartRegistry(); | |
for (Source source : sources.getChildren()) { | |
Link link = source.getLink(); | |
if (link != null) { | |
Activity targetActivity = FlowLinkUtil.getLinkTarget(link); | |
if (targetActivity != null) { | |
EditPart targetEditPart = (EditPart)registry.get(targetActivity); | |
if ((targetEditPart instanceof BPELEditPart) && targetEditPart.isActive()) { | |
if (DEBUG) System.out.println("refreshConnectionTargets on: "+targetEditPart); //$NON-NLS-1$ | |
((BPELEditPart)targetEditPart).refreshTargetConnections(); | |
} | |
} | |
} | |
} | |
} | |
protected void refreshConnectionSources(Targets targets) { | |
Map registry = this.bpelEditor.getGraphicalViewer().getEditPartRegistry(); | |
for (Target target : targets.getChildren()) { | |
Link link = target.getLink(); | |
if (link != null) { | |
Activity sourceActivity = FlowLinkUtil.getLinkSource(link); | |
if (sourceActivity != null) { | |
EditPart sourceEditPart = (EditPart)registry.get(sourceActivity); | |
if ((sourceEditPart instanceof BPELEditPart) && sourceEditPart.isActive()) { | |
if (DEBUG) System.out.println("refreshConnectionSources on: "+sourceEditPart); //$NON-NLS-1$ | |
((BPELEditPart)sourceEditPart).refreshSourceConnections(); | |
} | |
} | |
} | |
} | |
} | |
protected void activityMoved(Activity activity) { | |
Map registry = this.bpelEditor.getGraphicalViewer().getEditPartRegistry(); | |
EditPart editPart = (EditPart)registry.get(activity); | |
if ((editPart instanceof BPELEditPart) && editPart.isActive()) { | |
if (DEBUG) System.out.println("moved activity: "+editPart.getModel()); //$NON-NLS-1$ | |
((BPELEditPart)editPart).refreshSourceConnections(); | |
((BPELEditPart)editPart).refreshTargetConnections(); | |
} | |
// refresh the target connections of activities at the other end of | |
// links for which we are the source! | |
if (activity.getSources() != null) { | |
refreshConnectionTargets(activity.getSources()); | |
} | |
// refresh the source connections of activities at the other end of | |
// links for which we are the target! | |
if (activity.getTargets() != null) { | |
refreshConnectionSources(activity.getTargets()); | |
} | |
// if ((editPart instanceof BPELEditPart) && editPart.isActive()) { | |
// System.out.println("(re-refresh!)"); | |
// ((BPELEditPart)editPart).refreshSourceConnections(); | |
// ((BPELEditPart)editPart).refreshTargetConnections(); | |
// } | |
} | |
} |