/** * 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.util.ArrayList; import java.util.List; 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.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.ui.forms.editor.IFormPage; import org.eclipse.ui.statushandlers.StatusManager; import gov.redhawk.core.graphiti.dcd.ui.editor.AbstractGraphitiDCDEditor; import gov.redhawk.core.graphiti.ui.editor.AbstractGraphitiDiagramEditor; import gov.redhawk.ide.dcd.internal.ui.editor.DevicesPage; import gov.redhawk.ide.dcd.internal.ui.editor.NodeOverviewPage; import gov.redhawk.ide.graphiti.dcd.ui.DCDUIGraphitiPlugin; import gov.redhawk.ide.graphiti.dcd.ui.diagram.GraphitiDCDDiagramEditor; import gov.redhawk.ide.graphiti.dcd.ui.diagram.providers.DCDEditorDiagramTypeProvider; import gov.redhawk.ide.graphiti.ui.diagram.util.DUtil; import gov.redhawk.ide.internal.ui.handlers.CleanUpComponentFilesAction; import mil.jpeojtrs.sca.dcd.DcdPackage; import mil.jpeojtrs.sca.dcd.DeviceConfiguration; import mil.jpeojtrs.sca.util.ScaFileSystemConstants; /** * A multi-page editor for DCD files. Includes a Graphiti diagram. */ public class GraphitiDCDEditor extends AbstractGraphitiDCDEditor { private ResourceListener nameListener; private IFormPage overviewPage; private IFormPage devicesPage; private class ResourceListener extends AdapterImpl { private DeviceConfiguration dcd; private final Resource dcdResource; public ResourceListener(final Resource dcdResource) { this.dcdResource = dcdResource; if (this.dcdResource != null) { this.dcdResource.eAdapters().add(this); this.dcd = DeviceConfiguration.Util.getDeviceConfiguration(this.dcdResource); if (this.dcd != null) { this.dcd.eAdapters().add(this); updateTitle(); } } } public void dispose() { if (this.dcd != null) { this.dcd.eAdapters().remove(this); } if (this.dcdResource != null) { this.dcdResource.eAdapters().remove(this); } } @Override public void notifyChanged(final Notification msg) { if (msg.getNotifier() instanceof Resource) { switch (msg.getFeatureID(Resource.class)) { case Resource.RESOURCE__IS_LOADED: if (this.dcd != null) { this.dcd.eAdapters().remove(this); this.dcd = null; } if (this.dcdResource.isLoaded()) { this.dcd = DeviceConfiguration.Util.getDeviceConfiguration(this.dcdResource); if (this.dcd != null) { this.dcd.eAdapters().add(this); updateTitle(); } } break; default: break; } } else if (msg.getNotifier() instanceof DeviceConfiguration) { final int featureID = msg.getFeatureID(DeviceConfiguration.class); if (featureID == DcdPackage.DEVICE_CONFIGURATION__NAME) { if (msg.getEventType() == Notification.SET) { updateTitle(); } } } } } @Override public void dispose() { if (this.nameListener != null) { this.nameListener.dispose(); this.nameListener = null; } super.dispose(); } @Override protected void addPages() { try { this.nameListener = new ResourceListener(getMainResource()); overviewPage = createOverviewPage(getMainResource()); addPage(overviewPage); devicesPage = createDcdDevicesPage(getMainResource()); addPage(devicesPage); } catch (CoreException e) { StatusManager.getManager().handle(new Status(IStatus.ERROR, DCDUIGraphitiPlugin.PLUGIN_ID, "Failed to create editor parts.", e), StatusManager.LOG | StatusManager.SHOW); } super.addPages(); } private IFormPage createOverviewPage(final Resource dcdResource) { final NodeOverviewPage retVal = new NodeOverviewPage(this); retVal.setInput(dcdResource); return retVal; } private IFormPage createDcdDevicesPage(final Resource dcdResource) { final DevicesPage retVal = new DevicesPage(this); retVal.setInput(dcdResource); return retVal; } //////////////////////////////////////////////////// // 1. createDiagramEditor() (#2 in super class) //////////////////////////////////////////////////// @Override protected AbstractGraphitiDiagramEditor createDiagramEditor() { return new GraphitiDCDDiagramEditor(getEditingDomain()); } //////////////////////////////////////////////////// // 3. createDiagramInput() (#2 in super class) //////////////////////////////////////////////////// @Override protected String getDiagramTypeProviderID() { return DCDEditorDiagramTypeProvider.PROVIDER_ID; } @Override protected String getDiagramContext() { // If the SCA file system scheme is in use that means the file is from the Target SDR. if (ScaFileSystemConstants.SCHEME.equals(getMainResource().getURI().scheme())) { return DUtil.DIAGRAM_CONTEXT_TARGET_SDR; } else { return DUtil.DIAGRAM_CONTEXT_DESIGN; } } //////////////////////////////////////////////////// // Other //////////////////////////////////////////////////// @Override public void updateTitle() { String name = null; final DeviceConfiguration dcd = getDeviceConfiguration(); if (dcd != null) { name = dcd.getName(); if (name == null) { name = getEditorInput().getName(); } } if (name == null) { name = ""; } setPartName(name); } @Override public List<Object> getOutlineItems() { final List<Object> items = new ArrayList<Object>(); if (overviewPage != null) { items.add(overviewPage); } if (getDeviceConfiguration().getPartitioning() != null) { items.add(getDeviceConfiguration().getPartitioning()); } return items; } @Override public void doSave(IProgressMonitor monitor) { final CleanUpComponentFilesAction cleanAction = new CleanUpComponentFilesAction(); cleanAction.setRoot(getDeviceConfiguration()); cleanAction.run(); super.doSave(monitor); } }