blob: 9a1b21bce486cd5c730979ab6e3905a7c1cc7cda [file] [log] [blame]
/**
* <copyright>
* </copyright>
*
* $Id$
*/
package org.eclipse.stem.loggers.imagewriter.impl;
import org.eclipse.emf.common.notify.Notification;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Locale;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.stem.adapters.time.TimeProvider;
import org.eclipse.stem.adapters.time.TimeProviderAdapterFactory;
import org.eclipse.stem.core.model.STEMTime;
import org.eclipse.stem.jobs.DisplaySafeExecutor;
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.Activator;
import org.eclipse.stem.loggers.imagewriter.ImagewriterPackage;
import org.eclipse.stem.loggers.imagewriter.MapViewImageWriterLogger;
import org.eclipse.stem.ui.views.geographic.GeographicControl;
import org.eclipse.stem.ui.views.geographic.GeographicViewer;
import org.eclipse.stem.ui.views.geographic.map.MapView;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Map View Image Writer Logger</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.stem.loggers.imagewriter.impl.MapViewImageWriterLoggerImpl#isOpenMapView <em>Open Map View</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class MapViewImageWriterLoggerImpl extends ImageWriterLoggerImpl implements MapViewImageWriterLogger {
/**
* The default value of the '{@link #isOpenMapView() <em>Open Map View</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isOpenMapView()
* @generated
* @ordered
*/
protected static final boolean OPEN_MAP_VIEW_EDEFAULT = true;
/**
* The cached value of the '{@link #isOpenMapView() <em>Open Map View</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isOpenMapView()
* @generated
* @ordered
*/
protected boolean openMapView = OPEN_MAP_VIEW_EDEFAULT;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public MapViewImageWriterLoggerImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return ImagewriterPackage.Literals.MAP_VIEW_IMAGE_WRITER_LOGGER;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isOpenMapView() {
return openMapView;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setOpenMapView(boolean newOpenMapView) {
boolean oldOpenMapView = openMapView;
openMapView = newOpenMapView;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, ImagewriterPackage.MAP_VIEW_IMAGE_WRITER_LOGGER__OPEN_MAP_VIEW, oldOpenMapView, openMapView));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case ImagewriterPackage.MAP_VIEW_IMAGE_WRITER_LOGGER__OPEN_MAP_VIEW:
return isOpenMapView();
}
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.MAP_VIEW_IMAGE_WRITER_LOGGER__OPEN_MAP_VIEW:
setOpenMapView((Boolean)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case ImagewriterPackage.MAP_VIEW_IMAGE_WRITER_LOGGER__OPEN_MAP_VIEW:
setOpenMapView(OPEN_MAP_VIEW_EDEFAULT);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case ImagewriterPackage.MAP_VIEW_IMAGE_WRITER_LOGGER__OPEN_MAP_VIEW:
return openMapView != OPEN_MAP_VIEW_EDEFAULT;
}
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(" (openMapView: ");
result.append(openMapView);
result.append(')');
return result.toString();
}
private static final String MAP_VIEW_ID = "org.eclipse.stem.ui.views.geographic.map";
private MapView getMapViewFromWorkbench()
{
IViewPart view = null;
MapView retValue = null;
if (PlatformUI.isWorkbenchRunning()) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
if (page != null) {
// Try to find the view directly
view = page.findView(MAP_VIEW_ID);
// Try to find the view by reference
if (view == null || !(view instanceof MapView)) {
IViewReference viewRef = page.findViewReference(MAP_VIEW_ID);
if (viewRef != null) {
view = viewRef.getView(true);
}
}
// Still cannot find the map view. it's probably open in a different perspective.
// if the logger is configured to open the map view, then attempt to open it
if ((view == null || !(view instanceof MapView)) && isOpenMapView()) {
try {
if (isOpenMapView()) {
view = page.showView(MAP_VIEW_ID);
}
} catch (PartInitException e) {
Activator.logError("Error opening the map view for the map image logger", e);
}
}
}
}
if (view != null && view instanceof MapView) {
retValue = (MapView)view;
}
return retValue;
}
private GeographicControl getMapControlForSimulation()
{
MapView view = getMapViewFromWorkbench();
if (view != null && view.getSite().getSelectionProvider() instanceof GeographicViewer) {
GeographicViewer viewer = (GeographicViewer)view.getSite().getSelectionProvider();
Control[] controls = ((Composite)viewer.getControl()).getChildren();
for (Control control : controls) {
if (control instanceof GeographicControl
&& simulation == ((GeographicControl)control).getSimulation()) {
return (GeographicControl)control;
}
}
}
return null;
}
private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
private File logDirectory;
private TimeProvider timeProvider;
private ISimulation simulation;
boolean beforeStart = false;
private STEMTime getScenarioTime()
{
STEMTime time = getTimeProvider().getTime();
if(time == null) {
time = simulation.getScenario().getSequencer().getStartTime();
}
if(!beforeStart) {
time = time.addIncrement(simulation.getScenario().getSequencer().getTimeDelta());
}
return time;
}
private TimeProvider getTimeProvider()
{
if (timeProvider == null) {
timeProvider = (TimeProvider) TimeProviderAdapterFactory.INSTANCE
.adapt(simulation.getScenario().getCanonicalGraph(), TimeProvider.class);
}
return timeProvider;
}
private File getImageFile() {
if (logDirectory == null) {
logDirectory = new File(getLogFileDirectory(simulation), "MapImages");
logDirectory.mkdirs();
}
return new File(logDirectory, DATE_FORMATTER.format(getScenarioTime().getTime()) +".png");
}
private void saveSimulationImageFile(Image mapImage)
{
if (mapImage != null && !mapImage.isDisposed()) {
try {
File imageFile = getImageFile();
ImageLoader loader = new ImageLoader();
loader.data = new ImageData[] {mapImage.getImageData()};
loader.save(imageFile.getAbsolutePath(), SWT.IMAGE_PNG);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/* (non-Javadoc)
* @see org.eclipse.stem.loggers.impl.SimulationLoggerImpl#simulationEvent(org.eclipse.stem.jobs.simulation.SimulationEvent)
*/
@Override
public void simulationEvent(final SimulationEvent event)
{
if (!PlatformUI.isWorkbenchRunning()) {
return;
}
if (SimulationState.COMPLETED_CYCLE.equals(event.getSimulationState())) {
DisplaySafeExecutor.executeSync(new Runnable() {
@Override
public void run() {
GeographicControl control = getMapControlForSimulation();
if (control != null) {
Image image = control.getMapCanvasImage();
saveSimulationImageFile(image);
} else {
Activator.logWarning("The Map View Logger could not find the Map Canvas.", null);
}
}
});
}
}
/* (non-Javadoc)
* @see org.eclipse.stem.loggers.impl.SimulationLoggerImpl#loggerEvent(org.eclipse.stem.jobs.simulation.ISimulation, org.eclipse.stem.loggers.LOGGER_EVENTS)
*/
@Override
public void loggerEvent(ISimulation simulation, LOGGER_EVENTS event)
{
if (LOGGER_EVENTS.LOGGER_STARTED.equals(event)) {
if (!PlatformUI.isWorkbenchRunning()) {
Activator.logWarning("Map View Logger is disabled in headless mode.", null);
return;
}
this.simulation = simulation;
}
}
} //MapViewImageWriterLoggerImpl