/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.stem.loggers.imagewriter.impl;

import org.eclipse.emf.common.notify.Notification;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.ENotificationImpl;

import org.eclipse.stem.core.model.Decorator;
import org.eclipse.stem.core.model.IntegrationDecorator;

import org.eclipse.stem.jobs.simulation.ISimulation;
import org.eclipse.stem.jobs.simulation.SimulationEvent;
import org.eclipse.stem.jobs.simulation.SimulationState;
import org.eclipse.stem.loggers.LOGGER_EVENTS;
import org.eclipse.stem.loggers.imagewriter.ImagewriterFactory;
import org.eclipse.stem.loggers.imagewriter.ImagewriterPackage;
import org.eclipse.stem.loggers.imagewriter.MAP_PROJECTIONS;
import org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger;

import org.eclipse.stem.loggers.imagewriter.logger.DecoratorPropertyImageWriter;
import org.eclipse.stem.loggers.imagewriter.logger.projections.IMapProjection;
import org.eclipse.stem.ui.adapters.color.ColorProvider;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Projected Map Image Logger</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * <ul>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#isUseLogScaling <em>Use Log Scaling</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#getGain <em>Gain</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#isLogAllDecorators <em>Log All Decorators</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#getColorProvider <em>Color Provider</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#getDecorator <em>Decorator</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#getDecoratorProperties <em>Decorator Properties</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#getWidth <em>Width</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#getHeight <em>Height</em>}</li>
 *   <li>{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl#getProjection <em>Projection</em>}</li>
 * </ul>
 * </p>
 *
 * @generated
 */
public abstract class ProjectedMapImageLoggerImpl extends ImageWriterLoggerImpl implements ProjectedMapImageLogger {
	/**
	 * The default value of the '{@link #isUseLogScaling() <em>Use Log Scaling</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isUseLogScaling()
	 * @generated
	 * @ordered
	 */
	protected static final boolean USE_LOG_SCALING_EDEFAULT = true;

	/**
	 * The cached value of the '{@link #isUseLogScaling() <em>Use Log Scaling</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isUseLogScaling()
	 * @generated
	 * @ordered
	 */
	protected boolean useLogScaling = USE_LOG_SCALING_EDEFAULT;

	/**
	 * The default value of the '{@link #getGain() <em>Gain</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getGain()
	 * @generated
	 * @ordered
	 */
	protected static final float GAIN_EDEFAULT = 1.0F;

	/**
	 * The cached value of the '{@link #getGain() <em>Gain</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getGain()
	 * @generated
	 * @ordered
	 */
	protected float gain = GAIN_EDEFAULT;

	/**
	 * The default value of the '{@link #isLogAllDecorators() <em>Log All Decorators</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isLogAllDecorators()
	 * @generated
	 * @ordered
	 */
	protected static final boolean LOG_ALL_DECORATORS_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isLogAllDecorators() <em>Log All Decorators</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isLogAllDecorators()
	 * @generated
	 * @ordered
	 */
	protected boolean logAllDecorators = LOG_ALL_DECORATORS_EDEFAULT;

	/**
	 * The default value of the '{@link #getColorProvider() <em>Color Provider</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getColorProvider()
	 * @generated
	 * @ordered
	 */
	protected static final ColorProvider COLOR_PROVIDER_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getColorProvider() <em>Color Provider</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getColorProvider()
	 * @generated
	 * @ordered
	 */
	protected ColorProvider colorProvider = COLOR_PROVIDER_EDEFAULT;

	/**
	 * The cached value of the '{@link #getDecorator() <em>Decorator</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getDecorator()
	 * @generated
	 * @ordered
	 */
	protected Decorator decorator;

	/**
	 * The default value of the '{@link #getDecoratorProperties() <em>Decorator Properties</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getDecoratorProperties()
	 * @generated
	 * @ordered
	 */
	protected static final String DECORATOR_PROPERTIES_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getDecoratorProperties() <em>Decorator Properties</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getDecoratorProperties()
	 * @generated
	 * @ordered
	 */
	protected String decoratorProperties = DECORATOR_PROPERTIES_EDEFAULT;

	/**
	 * The default value of the '{@link #getWidth() <em>Width</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getWidth()
	 * @generated
	 * @ordered
	 */
	protected static final int WIDTH_EDEFAULT = 1000;

	/**
	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getWidth()
	 * @generated
	 * @ordered
	 */
	protected int width = WIDTH_EDEFAULT;

	/**
	 * The default value of the '{@link #getHeight() <em>Height</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getHeight()
	 * @generated
	 * @ordered
	 */
	protected static final int HEIGHT_EDEFAULT = 500;

	/**
	 * The cached value of the '{@link #getHeight() <em>Height</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getHeight()
	 * @generated
	 * @ordered
	 */
	protected int height = HEIGHT_EDEFAULT;

	/**
	 * The default value of the '{@link #getProjection() <em>Projection</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getProjection()
	 * @generated
	 * @ordered
	 */
	protected static final IMapProjection PROJECTION_EDEFAULT = null; //(IMapProjection)ImagewriterFactory.eINSTANCE.createFromString(ImagewriterPackage.eINSTANCE.getIMapProjection(), "null");

	/**
	 * The cached value of the '{@link #getProjection() <em>Projection</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getProjection()
	 * @generated
	 * @ordered
	 */
	protected IMapProjection projection = PROJECTION_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ProjectedMapImageLoggerImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return ImagewriterPackage.Literals.PROJECTED_MAP_IMAGE_LOGGER;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IMapProjection getProjection() {
		return projection;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setProjection(IMapProjection newProjection) {
		IMapProjection oldProjection = projection;
		projection = newProjection;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__PROJECTION, oldProjection, projection));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isUseLogScaling() {
		return useLogScaling;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setUseLogScaling(boolean newUseLogScaling) {
		boolean oldUseLogScaling = useLogScaling;
		useLogScaling = newUseLogScaling;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING, oldUseLogScaling, useLogScaling));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public float getGain() {
		return gain;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setGain(float newGain) {
		float oldGain = gain;
		gain = newGain;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__GAIN, oldGain, gain));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isLogAllDecorators() {
		return logAllDecorators;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLogAllDecorators(boolean newLogAllDecorators) {
		boolean oldLogAllDecorators = logAllDecorators;
		logAllDecorators = newLogAllDecorators;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS, oldLogAllDecorators, logAllDecorators));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ColorProvider getColorProvider() {
		return colorProvider;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setColorProvider(ColorProvider newColorProvider) {
		ColorProvider oldColorProvider = colorProvider;
		colorProvider = newColorProvider;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER, oldColorProvider, colorProvider));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Decorator getDecorator() {
		if (decorator != null && decorator.eIsProxy()) {
			InternalEObject oldDecorator = (InternalEObject)decorator;
			decorator = (Decorator)eResolveProxy(oldDecorator);
			if (decorator != oldDecorator) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR, oldDecorator, decorator));
			}
		}
		return decorator;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Decorator basicGetDecorator() {
		return decorator;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setDecorator(Decorator newDecorator) {
		Decorator oldDecorator = decorator;
		decorator = newDecorator;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR, oldDecorator, decorator));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getDecoratorProperties() {
		return decoratorProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setDecoratorProperties(String newDecoratorProperties) {
		String oldDecoratorProperties = decoratorProperties;
		decoratorProperties = newDecoratorProperties;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES, oldDecoratorProperties, decoratorProperties));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public int getWidth() {
		return width;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setWidth(int newWidth) {
		int oldWidth = width;
		width = newWidth;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__WIDTH, oldWidth, width));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public int getHeight() {
		return height;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setHeight(int newHeight) {
		int oldHeight = height;
		height = newHeight;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__HEIGHT, oldHeight, height));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING:
				return isUseLogScaling();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__GAIN:
				return getGain();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS:
				return isLogAllDecorators();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER:
				return getColorProvider();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR:
				if (resolve) return getDecorator();
				return basicGetDecorator();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES:
				return getDecoratorProperties();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__WIDTH:
				return getWidth();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__HEIGHT:
				return getHeight();
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__PROJECTION:
				return getProjection();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING:
				setUseLogScaling((Boolean)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__GAIN:
				setGain((Float)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS:
				setLogAllDecorators((Boolean)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER:
				setColorProvider((ColorProvider)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR:
				setDecorator((Decorator)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES:
				setDecoratorProperties((String)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__WIDTH:
				setWidth((Integer)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__HEIGHT:
				setHeight((Integer)newValue);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__PROJECTION:
				setProjection((IMapProjection)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING:
				setUseLogScaling(USE_LOG_SCALING_EDEFAULT);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__GAIN:
				setGain(GAIN_EDEFAULT);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS:
				setLogAllDecorators(LOG_ALL_DECORATORS_EDEFAULT);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER:
				setColorProvider(COLOR_PROVIDER_EDEFAULT);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR:
				setDecorator((Decorator)null);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES:
				setDecoratorProperties(DECORATOR_PROPERTIES_EDEFAULT);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__WIDTH:
				setWidth(WIDTH_EDEFAULT);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__HEIGHT:
				setHeight(HEIGHT_EDEFAULT);
				return;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__PROJECTION:
				setProjection(PROJECTION_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING:
				return useLogScaling != USE_LOG_SCALING_EDEFAULT;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__GAIN:
				return gain != GAIN_EDEFAULT;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS:
				return logAllDecorators != LOG_ALL_DECORATORS_EDEFAULT;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER:
				return COLOR_PROVIDER_EDEFAULT == null ? colorProvider != null : !COLOR_PROVIDER_EDEFAULT.equals(colorProvider);
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR:
				return decorator != null;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES:
				return DECORATOR_PROPERTIES_EDEFAULT == null ? decoratorProperties != null : !DECORATOR_PROPERTIES_EDEFAULT.equals(decoratorProperties);
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__WIDTH:
				return width != WIDTH_EDEFAULT;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__HEIGHT:
				return height != HEIGHT_EDEFAULT;
			case ImagewriterPackage.PROJECTED_MAP_IMAGE_LOGGER__PROJECTION:
				return PROJECTION_EDEFAULT == null ? projection != null : !PROJECTION_EDEFAULT.equals(projection);
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (useLogScaling: ");
		result.append(useLogScaling);
		result.append(", gain: ");
		result.append(gain);
		result.append(", logAllDecorators: ");
		result.append(logAllDecorators);
		result.append(", colorProvider: ");
		result.append(colorProvider);
		result.append(", decoratorProperties: ");
		result.append(decoratorProperties);
		result.append(", width: ");
		result.append(width);
		result.append(", height: ");
		result.append(height);
		result.append(", projection: ");
		result.append(projection);
		result.append(')');
		return result.toString();
	}

	
	DecoratorPropertyImageWriter writer;
	
	@Override
	public void simulationEvent(SimulationEvent event) 
	{
		
		System.out.println("here");
		
		if (SimulationState.COMPLETED_CYCLE.equals(event.getSimulationState())) {
			writer.log();
		}
	}

	@Override
	public void loggerEvent(ISimulation simulation, LOGGER_EVENTS event) 
	{

		if (LOGGER_EVENTS.LOGGER_STARTED.equals(event)) {
			writer = new DecoratorPropertyImageWriter(simulation, this);
			writer.start();
			
			
			
		}
		
	}

	
	
	
} //ProjectedMapImageLoggerImpl
