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