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