/*******************************************************************************
* 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.debug.internal.ui.diagram;
import gov.redhawk.ide.debug.LocalSca;
import gov.redhawk.ide.debug.LocalScaWaveform;
import gov.redhawk.ide.debug.ScaDebugPlugin;
import gov.redhawk.ide.debug.internal.ScaDebugInstance;
import gov.redhawk.ide.debug.ui.diagram.LocalScaDiagramPlugin;
import gov.redhawk.ide.sad.internal.ui.editor.SadEditor;
import gov.redhawk.ide.sad.ui.SadUiActivator;
import gov.redhawk.model.sca.RefreshDepth;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import gov.redhawk.sca.sad.diagram.part.SadDiagramEditor;
import gov.redhawk.sca.ui.ScaFileStoreEditorInput;
import gov.redhawk.sca.util.Debug;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import mil.jpeojtrs.sca.sad.SadFactory;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
import mil.jpeojtrs.sca.util.CorbaUtils;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.Notification;
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.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.statushandlers.StatusManager;
/**
*
*/
public class LocalScaEditor extends SadEditor {
private static final Debug DEBUG = new Debug(LocalScaDiagramPlugin.PLUGIN_ID, "editor");
private ScaModelAdapter scaListener;
private SadModelAdapter sadlistener;
private LocalScaWaveform waveform;
private boolean isLocalSca;
private Resource mainResource;
private SoftwareAssembly sad;
@Override
protected void createModel() {
if (isLocalSca) {
mainResource = getEditingDomain().getResourceSet().createResource(ScaDebugInstance.getLocalSandboxWaveformURI());
sad = SadFactory.eINSTANCE.createSoftwareAssembly();
getEditingDomain().getCommandStack().execute(new ScaModelCommand() {
@Override
public void execute() {
mainResource.getContents().add(sad);
}
});
} else {
super.createModel();
sad = SoftwareAssembly.Util.getSoftwareAssembly(super.getMainResource());
}
initModelMap();
}
@SuppressWarnings("restriction")
@Override
protected void setInput(IEditorInput input) {
if (input instanceof ScaFileStoreEditorInput) {
ScaFileStoreEditorInput scaInput = (ScaFileStoreEditorInput) input;
if (scaInput.getScaObject() instanceof LocalScaWaveform) {
this.waveform = (LocalScaWaveform) scaInput.getScaObject();
} else {
throw new IllegalStateException("Sandbox Editor opened on invalid sca input " + scaInput.getScaObject());
}
} else if (input instanceof URIEditorInput) {
URIEditorInput uriInput = (URIEditorInput) input;
if (uriInput.getURI().equals(ScaDebugInstance.getLocalSandboxWaveformURI())) {
final LocalSca localSca = ScaDebugPlugin.getInstance().getLocalSca();
if (!ScaDebugInstance.INSTANCE.isInit()) {
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 Chalkboard...", IProgressMonitor.UNKNOWN);
try {
ScaDebugInstance.INSTANCE.init(monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
monitor.done();
}
});
} catch (InvocationTargetException e1) {
StatusManager.getManager().handle(new Status(Status.ERROR, ScaDebugPlugin.ID, "Failed to initialize sandbox.", e1),
StatusManager.SHOW | StatusManager.LOG);
} catch (InterruptedException e1) {
// PASS
}
}
this.waveform = localSca.getSandboxWaveform();
if (waveform == null) {
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 {
ScaDebugPlugin.getInstance().getLocalSca(monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
});
} catch (InvocationTargetException e) {
throw new IllegalStateException("Failed to setup sandbox", e);
} catch (InterruptedException e) {
throw new IllegalStateException("Sandbox setup canceled, can not load editor.");
}
this.waveform = localSca.getSandboxWaveform();
if (waveform == null) {
throw new IllegalStateException("Failed to setup sandbox, null waveform.", null);
}
}
}
} else {
throw new IllegalStateException("Sandbox Editor opened on invalid input " + input);
}
if (ScaDebugPlugin.getInstance().getLocalSca().getSandboxWaveform() == waveform || this.waveform == null) {
isLocalSca = true;
}
super.setInput(input);
}
@Override
public Resource getMainResource() {
if (mainResource == null) {
return super.getMainResource();
}
return mainResource;
}
private void initModelMap() {
if (waveform == null) {
throw new IllegalStateException("Can not initialize the Model Map with null local waveform");
}
if (sad == null) {
throw new IllegalStateException("Can not initialize the Model Map with null sad");
}
if (!waveform.isSetComponents()) {
if (Display.getCurrent() != null) {
ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
try {
dialog.run(true, true, new IRunnableWithProgress() {
@Override
public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
CorbaUtils.invoke(new Callable<Object>() {
@Override
public Object call() throws Exception {
waveform.refresh(monitor, RefreshDepth.FULL);
return null;
}
}, monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
});
} catch (InvocationTargetException e) {
// PASS
} catch (InterruptedException e) {
// PASS
}
} else {
try {
waveform.refresh(null, RefreshDepth.FULL);
} catch (InterruptedException e) {
// PASS
}
}
}
final ModelMap modelMap = new ModelMap(this, sad, waveform);
if (isLocalSca) {
// Use the REDHAWK Model as source to build the SAD when we are in the chalkboard since the SAD file isn't
// modified
getEditingDomain().getCommandStack().execute(new SadModelInitializerCommand(modelMap, sad, waveform));
} else {
// Use the existing SAD file as a template when initializing the modeling map
getEditingDomain().getCommandStack().execute(new ModelMapInitializerCommand(modelMap, sad, waveform));
}
getEditingDomain().getCommandStack().flush();
this.sadlistener = new SadModelAdapter(modelMap);
this.scaListener = new ScaModelAdapter(modelMap) {
@Override
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
if (notification.getNotifier() == waveform) {
if (waveform.isDisposed() && !isDisposed()) {
getEditorSite().getPage().getWorkbenchWindow().getWorkbench().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
if (!isDisposed()) {
getEditorSite().getPage().closeEditor(LocalScaEditor.this, false);
}
}
});
}
}
}
};
ScaModelCommand.execute(this.waveform, new ScaModelCommand() {
@Override
public void execute() {
scaListener.addAdapter(waveform);
}
});
sad.eAdapters().add(this.sadlistener);
if (LocalScaEditor.DEBUG.enabled) {
try {
sad.eResource().save(null);
} catch (final IOException e) {
LocalScaEditor.DEBUG.catching("Failed to save local diagram.", e);
}
}
}
@Override
public void dispose() {
if (this.sadlistener != null) {
if (sad != null) {
sad.eAdapters().remove(this.sadlistener);
}
this.sadlistener = null;
}
if (this.scaListener != null) {
ScaModelCommand.execute(waveform, new ScaModelCommand() {
@Override
public void execute() {
waveform.eAdapters().remove(LocalScaEditor.this.scaListener);
}
});
this.scaListener = null;
}
super.dispose();
}
@Override
public void doSave(final IProgressMonitor monitor) {
doSaveAs();
}
@Override
protected void addPages() {
// Only creates the other pages if there is something that can be edited
//
if (!getEditingDomain().getResourceSet().getResources().isEmpty()
&& !(getEditingDomain().getResourceSet().getResources().get(0)).getContents().isEmpty()) {
try {
int pageIndex = 0;
final Resource sadResource = getMainResource();
final SadDiagramEditor editor = createDiagramEditor();
setDiagramEditor(editor);
final IEditorInput input = createDiagramInput(sadResource);
pageIndex = addPage(editor, input);
setPageText(pageIndex, "Diagram");
getEditingDomain().getCommandStack().removeCommandStackListener(getCommandStackListener());
} catch (final PartInitException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, SadUiActivator.getPluginId(), "Failed to create editor parts.", e),
StatusManager.LOG | StatusManager.SHOW);
} catch (final IOException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, SadUiActivator.getPluginId(), "Failed to create editor parts.", e),
StatusManager.LOG | StatusManager.SHOW);
} catch (final CoreException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, SadUiActivator.getPluginId(), "Failed to create editor parts.", e),
StatusManager.LOG | StatusManager.SHOW);
}
}
}
@Override
public List<Object> getOutlineItems() {
return Collections.emptyList();
}
@Override
protected SadDiagramEditor createDiagramEditor() {
return new SandboxDiagramEditor(this);
}
@Override
public void doSaveAs() {
final NewWaveformFromLocalWizard wizard = new NewWaveformFromLocalWizard(sad);
final WizardDialog dialog = new WizardDialog(getSite().getShell(), wizard);
dialog.open();
}
@Override
public boolean isSaveAsAllowed() {
return true;
}
@Override
public boolean isSaveOnCloseNeeded() {
return false;
}
@Override
public boolean isDirty() {
return false;
}
@Override
public String getTitle() {
if (waveform != null) {
return super.getTitle();
} else {
return "Chalkboard";
}
}
@Override
public String getTitleToolTip() {
if (waveform != null && waveform.getName() != null) {
return waveform.getName() + " dynamic waveform";
} else {
return "Chalkboard dynamic waveform";
}
}
}