blob: b52b03260b7f45bb12888b270d6dc21e3bfab054 [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.EventObject;
import org.eclipse.bpel.common.extension.model.ExtensionMap;
import org.eclipse.bpel.common.ui.editmodel.EditModelCommandStack;
import org.eclipse.bpel.common.ui.editmodel.EditModelCommandStack.SharedCommandStackListener;
import org.eclipse.bpel.ui.extensions.BPELUIRegistry;
import org.eclipse.bpel.ui.extensions.ListenerDescriptor;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.gef.commands.CommandStackListener;
/**
* ModelListenerAdapter
*
*/
public class ModelListenerAdapter extends EContentAdapter implements CommandStackListener {
ExtensionMap fxtensionMap = null;
Adapter linkNotificationAdapter;
int executionStackLevel = 0;
boolean ignoreChanges = true;
/**
*
* @param adapter
*/
public void setLinkNotificationAdapter(Adapter adapter) {
this.linkNotificationAdapter = adapter;
}
/**
* @see org.eclipse.emf.ecore.util.EContentAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
@Override
public void notifyChanged (Notification n) {
super.notifyChanged(n);
for (ListenerDescriptor desc : BPELUIRegistry.getInstance().getListenerDescriptors() ) {
desc.getModelListener().handleChange(n);
}
// TODO: should the descriptor-based listeners be protected by this as well?
if (!ignoreChanges) {
if (linkNotificationAdapter != null) {
linkNotificationAdapter.notifyChanged(n);
}
}
}
/**
* @see org.eclipse.emf.ecore.util.EContentAdapter#setTarget(org.eclipse.emf.common.notify.Notifier)
*/
@Override
public void setTarget(Notifier notifier) {
super.setTarget(notifier);
if ((notifier instanceof EObject) && (fxtensionMap != null)) {
if (executionStackLevel > 0) {
ModelHelper.createExtensionIfNecessary(fxtensionMap, (EObject)notifier);
}
}
}
/**
* @param extensionMap
*/
public void setExtensionMap(ExtensionMap extensionMap) {
this.fxtensionMap = extensionMap;
}
/**
* @see org.eclipse.gef.commands.CommandStackListener#commandStackChanged(java.util.EventObject)
*/
public void commandStackChanged(EventObject e) {
if (e instanceof EditModelCommandStack.SharedCommandStackChangedEvent) {
switch (((EditModelCommandStack.SharedCommandStackChangedEvent)e).getProperty()) {
case SharedCommandStackListener.EVENT_START_EXECUTE:
executionStackLevel++; ignoreChanges = false; break;
case SharedCommandStackListener.EVENT_START_UNDO:
case SharedCommandStackListener.EVENT_START_REDO:
ignoreChanges = false; break;
case SharedCommandStackListener.EVENT_FINISH_EXECUTE:
executionStackLevel--; ignoreChanges = true; break;
case SharedCommandStackListener.EVENT_FINISH_UNDO:
case SharedCommandStackListener.EVENT_FINISH_REDO:
ignoreChanges = true; break;
}
}
}
}