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