/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.ide.graphiti.dcd.internal.ui.editor;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.editors.text.TextEditor;
import gov.redhawk.core.graphiti.dcd.ui.editor.GraphitiDeviceManagerExplorerEditor;
import gov.redhawk.core.graphiti.dcd.ui.modelmap.GraphitiDCDModelMap;
import gov.redhawk.core.graphiti.ui.editor.AbstractGraphitiDiagramEditor;
import gov.redhawk.ide.debug.LocalSca;
import gov.redhawk.ide.debug.ScaDebugPlugin;
import gov.redhawk.ide.debug.internal.ScaDebugInstance;
import gov.redhawk.ide.graphiti.dcd.ui.diagram.GraphitiDeviceManagerSandboxDiagramEditor;
import gov.redhawk.ide.graphiti.dcd.ui.diagram.providers.DevMgrSandboxDiagramTypeProvider;
import gov.redhawk.ide.graphiti.dcd.ui.internal.modelmap.GraphitiDCDLocalModelMap;
import gov.redhawk.ide.graphiti.ui.diagram.util.DUtil;
import gov.redhawk.model.sca.ScaDeviceManager;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import mil.jpeojtrs.sca.dcd.DcdFactory;
import mil.jpeojtrs.sca.dcd.DeviceConfiguration;
/**
* The multi-page sandbox editor for device managers ({@link ScaDeviceManager}). Includes a Graphiti diagram.
*/
public class GraphitiDeviceManagerSandboxEditor extends GraphitiDeviceManagerExplorerEditor {
public static final String EDITOR_ID = "gov.redhawk.ide.graphiti.dcd.ui.editor.DcdSandbox";
private Resource mainResource;
private boolean isSandboxDeviceManager = false;
private GraphitiDCDModelMap modelMap;
@Override
protected void setInput(IEditorInput input) {
if (input instanceof URIEditorInput) {
URIEditorInput uriInput = (URIEditorInput) input;
if (!uriInput.getURI().equals(ScaDebugInstance.getLocalSandboxDeviceManagerURI())) {
throw new IllegalStateException("Device manager sandbox editor opened with invalid input: " + uriInput.getURI());
}
ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
try {
dialog.run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
monitor.beginTask("Starting Sandbox...", IProgressMonitor.UNKNOWN);
try {
LocalSca localSca = ScaDebugPlugin.getInstance().getLocalSca(monitor);
setDeviceManager(localSca.getSandboxDeviceManager());
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
monitor.done();
}
});
} catch (InvocationTargetException e) {
throw new IllegalStateException("Failed to setup sandbox", e);
} catch (InterruptedException e) {
throw new IllegalStateException("Sandbox setup canceled, can not load editor.");
}
if (getDeviceManager() == null) {
throw new IllegalStateException("Failed to setup sandbox, null sandbox device manager.");
}
isSandboxDeviceManager = true;
}
super.setInput(input);
}
@Override
protected void createModel() {
if (isSandboxDeviceManager) {
mainResource = getEditingDomain().getResourceSet().createResource(ScaDebugInstance.getLocalSandboxDeviceManagerURI());
final DeviceConfiguration dcd = DcdFactory.eINSTANCE.createDeviceConfiguration();
getEditingDomain().getCommandStack().execute(new ScaModelCommand() {
@Override
public void execute() {
mainResource.getContents().add(dcd);
}
});
} else {
super.createModel();
}
}
@Override
public Resource getMainResource() {
return (isSandboxDeviceManager) ? mainResource : super.getMainResource();
}
////////////////////////////////////////////////////
// 1. createDiagramEditor()
////////////////////////////////////////////////////
@Override
protected AbstractGraphitiDiagramEditor createDiagramEditor() {
return new GraphitiDeviceManagerSandboxDiagramEditor(getEditingDomain());
}
////////////////////////////////////////////////////
// 2. initModelMap()
////////////////////////////////////////////////////
@Override
protected GraphitiDCDModelMap createModelMapInstance() {
modelMap = new GraphitiDCDLocalModelMap(this, getDeviceManager());
return modelMap;
}
////////////////////////////////////////////////////
// 3. createDiagramInput()
////////////////////////////////////////////////////
@Override
protected String getDiagramTypeProviderID() {
return DevMgrSandboxDiagramTypeProvider.PROVIDER_ID;
}
@Override
public String getDiagramContext() {
return DUtil.DIAGRAM_CONTEXT_LOCAL;
}
////////////////////////////////////////////////////
// Other
////////////////////////////////////////////////////
@Override
public TextEditor createTextEditor(IEditorInput input) {
// No text editor for sandbox editors
return null;
}
}