| /******************************************************************************* |
| * 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(); |
| // } |
| } |
| |
| } |