blob: 6392356c79e1462c0eba63eeafe68f1c9789b270 [file] [log] [blame]
/*******************************************************************************
* 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();
// }
}
}