/*******************************************************************************
 * Copyright (c) 2013 CEA LIST.
 * 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:
 *     Cedric Dumoulin - cedric.dumoulin@lifl.fr
 ******************************************************************************/
package org.eclipse.papyrus.internal.infra.gmfdiag.layers.runtime;

import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.LayersStack;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.LayersStackApplication;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.runtime.model.LayersModelResource;


/**
 * This class manage a notation.Diagram. It allows to :
 * <ul>
 * <li>Add or remove a LayersStack</li>
 * <li>get the LayersStackMngr if a LayersStack exist.</li>
 * </ul>
 *
 * @author Cedric dumoulin
 *
 */
public class NotationDiagramHelper {

	/**
	 * Associated Diagram.
	 */
	protected Diagram diagram;

	/**
	 * Layers model.
	 */
	protected LayersModelResource layersModel;

	protected LayersStackApplication layersApplication;

	// /**
	// * The associated {@link LayersStackMngr}. Maybe null if no LayersStack is associated.
	// */
	// protected LayersStackMngr layerStackMngr;
	//
	// /**
	// * Notifier sending event when the layerStack is added or removed.
	// */
	// private LayersStackAttachedNotifier layerStackAttachedNotifier;

	// /**
	// * Listen on events from the layerStackAttachedNotifier.
	// */
	// private LayersStackAttachedListener layerStackAttachedListener = new LayersStackAttachedListener() {
	//
	// public void layerStackRemoved(LayersStackAttachedEvent event) {
	// layerStackMngr.dispose();
	// layerStackMngr = null;
	// }
	//
	// public void layerStackAttached(LayersStackAttachedEvent event) {
	//
	// if(layerStackMngr != null)
	// {
	// layerStackMngr.dispose();
	// layerStackMngr = null;
	// }
	//
	// layerStackMngr = new LayersStackMngr(event.getLayersStack());
	// }
	//
	// public void diagramChanged(LayersStackAttachedEvent event) {
	// // Not used because diagram is never set.
	// if(layerStackMngr != null)
	// {
	// layerStackMngr.dispose();
	// layerStackMngr = null;
	// }
	//
	// layerStackMngr = new LayersStackMngr(event.getLayersStack());
	//
	// }
	// };

	/**
	 * Constructor.
	 * Construct the manager and initialize it.
	 *
	 * @param layersModel
	 *
	 */
	public NotationDiagramHelper(LayersModelResource layersModel, Diagram diagram) {
		this.diagram = diagram;
		this.layersModel = layersModel;

		// // Set the layerStackMngr if necessary
		// LayersStack layerStack = LayersStackUtil.getInstance().lookupLayersStack(diagram);
		// if(layerStack != null) {
		// layerStackMngr = new LayersStackMngr(layerStack);
		// }
		//
		// // Set the listeners on changes
		// layerStackAttachedNotifier = new LayersStackAttachedNotifier(diagram);
		// layerStackAttachedNotifier.addLayersStackAttachedEventListener(layerStackAttachedListener);

		activate();
	}

	/**
	 * Activate the manager.
	 */
	public void activate() {
		// layerStackAttachedNotifier.activate();
	}

	/**
	 * Deactivate the manager.
	 */
	public void deactivate() {
		// layerStackAttachedNotifier.deactivate();
	}

	/**
	 * Dispose all resources.
	 */
	public void dispose() {
		// layerStackAttachedNotifier.deactivate();

		diagram = null;
	}


	/**
	 * @return the diagram
	 */
	public Diagram getDiagram() {
		return diagram;
	}


	// /**
	// * Return the {@link LayersStackMngr} if any. Throw an
	// * @return the layerStackMngr
	// * @throws NotSetException If the layerStackMngr is not set.
	// */
	// public LayersStackMngr getLayersStackMngr() throws NotSetException {
	//
	// if(layerStackMngr == null)
	// throw new NotSetException(this.getClass().getSimpleName() + ".getLayersStackMngr(): layerStackMngr is not set.");
	//
	// return layerStackMngr;
	// }

	/**
	 * Attach the {@link LayersStack} to the diagram.
	 * Do nothing if a LayersStack is already attached.
	 */
	public void attachLayersStack() {

		LayersStackApplication application = layersModel.getLayerStackApplication();
		application.getLayersStackFor(diagram);
	}

	/**
	 * detach the {@link LayersStack} from the diagram.
	 * Do nothing if no LayersStack is attached.
	 */
	public void removeLayersStack() {
		LayersStackApplication application = layersModel.getLayerStackApplication();
		application.removeLayersStackFor(diagram);
	}

	/**
	 * Return True if a {@link LayersStack} is attached to the diagram.
	 *
	 * @return True if a {@link LayersStack} is attached to the diagram.
	 */
	public boolean isLayersStackAttached() {
		LayersStackApplication application = layersModel.lookupLayerStackApplication();
		if (application == null) {
			return false;
		}
		return application.isLayersStackAttachedFor(diagram);
	}

	// /**
	// * Add a listener for the {@link LayersStackActivatedEvent}.
	// *
	// * @param listener
	// */
	// public void addLayersStackAttachedEventListener(LayersStackAttachedListener listener) {
	// layerStackAttachedNotifier.addLayersStackAttachedEventListener(listener);
	// }
	//
	// /**
	// * Remove a listener for the {@link LayersStackActivatedEvent}.
	// *
	// * @param listener
	// */
	// public void removeLayersStackAttachedEventListener(LayersStackAttachedListener listener) {
	// layerStackAttachedNotifier.removeLayersStackAttachedEventListener(listener);
	// }


}
