/*******************************************************************************
* 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.core.resourcefactory.ComponentDesc;
import gov.redhawk.core.resourcefactory.IResourceFactoryRegistry;
import gov.redhawk.core.resourcefactory.ResourceDesc;
import gov.redhawk.core.resourcefactory.ResourceFactoryPlugin;
import gov.redhawk.diagram.DiagramUtil;
import gov.redhawk.ide.sad.internal.ui.editor.CustomDiagramEditor;
import gov.redhawk.ide.sad.ui.providers.SpdToolEntry;
import gov.redhawk.ui.editor.SCAFormEditor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import mil.jpeojtrs.sca.sad.util.SadResourceImpl;
import mil.jpeojtrs.sca.scd.ComponentType;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PaletteStack;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.PlatformUI;
public class SandboxDiagramEditor extends CustomDiagramEditor {
private static final ImageDescriptor TOOL_ICON = SpdToolEntry.getDefaultIcon();
private java.beans.PropertyChangeListener listener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (IResourceFactoryRegistry.PROP_RESOURCES.equals(evt.getPropertyName())) {
updatePaletteJob.schedule(500);
}
}
};
private final Job updatePaletteJob = new Job("Updating Palette") {
@Override
public IStatus run(IProgressMonitor monitor) {
if (getEditDomain() == null || getEditDomain().getPaletteViewer() == null) {
return Status.CANCEL_STATUS;
}
final PaletteRoot root = getEditDomain().getPaletteViewer().getPaletteRoot();
final List<PaletteEntry> tools = getWorkspaceComponentTools();
// Add the toolbar and filter controls
tools.add(0, (PaletteEntry) rootPalette.getChildren().get(0));
if (root != null) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
root.setChildren(tools);
}
});
}
return Status.OK_STATUS;
}
};
private PaletteRoot rootPalette;
private Resource editorResource;
public SandboxDiagramEditor(final SCAFormEditor editor) {
super(editor);
editorResource = editor.getMainResource();
}
@Override
protected void initializeGraphicalViewerContents() {
super.initializeGraphicalViewerContents();
if (editorResource instanceof SadResourceImpl && !DiagramUtil.isDiagramLocalSandbox(editorResource)) {
getDiagramEditPart().enableEditMode();
// Don't allow removal of existing parts from waveform running on domain
String resourceURI = ((SadResourceImpl) editorResource).getURI().toString();
if (resourceURI.contains(".sad.xml?fs=file")) {
// Running locally, we can do whatever we want to it
return;
}
// for (final Object obj : getDiagramEditPart().getChildren()) {
// setEditMode(obj);
// }
}
}
// private void setEditMode(Object obj) {
// if (obj instanceof ComponentPlacementEditPart || obj instanceof SadComponentPlacementCompartmentEditPart
// || obj instanceof SadComponentInstantiationEditPart) {
// if (obj instanceof ComponentPlacementEditPart) {
// Object model = ((GraphicalEditPart) obj).getModel();
// ShapeImpl shape = (ShapeImpl) model;
// SadComponentPlacementImpl compPlace = (SadComponentPlacementImpl) shape.getElement();
// LocalFile localFile = compPlace.getComponentFileRef().getFile().getLocalFile();
// String compId = compPlace.getComponentInstantiation().get(0).getId();
// String implID = compPlace.getComponentInstantiation().get(0).getImplID();
// ComponentInstantiationImpl instImpl = (ComponentInstantiationImpl) compPlace.getComponentInstantiation().get(0);
//
// }
// AbstractEditPart part = (AbstractEditPart) obj;
// IEditableEditPart iPart = (IEditableEditPart) obj;
// iPart.disableEditMode();
// for (Object obj2 : part.getChildren()) {
// setEditMode(obj2);
// }
// }
// if (obj instanceof ProvidesPortStubEditPart) {
// ProvidesPortStubEditPart thePart = (ProvidesPortStubEditPart) obj;
// thePart.enableEditMode();
// for (Object obj2 : thePart.getTargetConnections()) {
// setEditMode(obj2);
// }
// }
// if (obj instanceof UsesPortStubEditPart) {
// UsesPortStubEditPart thePart = (UsesPortStubEditPart) obj;
// thePart.enableEditMode();
// for (Object obj2 : thePart.getSourceConnections()) {
// setEditMode(obj2);
// }
// }
// if (obj instanceof ConnectionEditPart) {
// ConnectionEditPart thePart = (ConnectionEditPart) obj;
// thePart.disableEditMode();
// }
// }
@Override
public void dispose() {
IResourceFactoryRegistry registry = ResourceFactoryPlugin.getDefault().getResourceFactoryRegistry();
registry.removeListener(listener);
super.dispose();
}
@Override
protected PaletteRoot createPaletteRoot(final PaletteRoot existingPaletteRoot) {
this.rootPalette = super.createPaletteRoot(existingPaletteRoot);
final PaletteRoot retVal = new PaletteRoot();
List<PaletteEntry> tools = getWorkspaceComponentTools();
// Add the toolbar and filter controls
tools.add(0, (PaletteEntry) rootPalette.getChildren().get(0));
retVal.setChildren(tools);
IResourceFactoryRegistry registry = ResourceFactoryPlugin.getDefault().getResourceFactoryRegistry();
registry.addListener(listener);
return retVal;
}
private synchronized List<PaletteEntry> getWorkspaceComponentTools() {
Map<String, List<PaletteEntry>> containerMap = new HashMap<String, List<PaletteEntry>>();
IResourceFactoryRegistry registry = ResourceFactoryPlugin.getDefault().getResourceFactoryRegistry();
registry.addListener(listener);
for (ResourceDesc desc : registry.getResourceDescriptors()) {
if (!shouldAdd(desc)) {
continue;
}
String category = desc.getCategory();
List<PaletteEntry> containerList = containerMap.get(category);
if (containerList == null) {
String label = category;
if (label == null) {
label = "Other";
}
containerList = new ArrayList<PaletteEntry>();
containerMap.put(category, containerList);
}
if (desc instanceof ComponentDesc) {
PaletteEntry newEntry = null;
ComponentDesc compDesc = (ComponentDesc) desc;
List<PaletteEntry> entries = createPaletteEntries(compDesc);
sort(entries);
if (entries.size() > 1) {
PaletteStack stack = new PaletteStack(entries.get(0).getLabel(), entries.get(0).getDescription(), entries.get(0).getLargeIcon());
stack.setChildren(entries);
newEntry = stack;
} else if (!entries.isEmpty()) {
newEntry = entries.get(0);
}
if (newEntry != null) {
containerList.add(newEntry);
}
}
}
final List<PaletteEntry> retVal = new ArrayList<PaletteEntry>();
for (Map.Entry<String, List<PaletteEntry>> entry : containerMap.entrySet()) {
PaletteDrawer container = new PaletteDrawer(entry.getKey());
sort(entry.getValue());
container.addAll(entry.getValue());
retVal.add(container);
}
sort(retVal);
return retVal;
}
private boolean shouldAdd(ResourceDesc desc) {
if (desc instanceof ComponentDesc) {
ComponentDesc compDesc = (ComponentDesc) desc;
String type = compDesc.getComponentType();
if (!ComponentType.RESOURCE.getLiteral().equalsIgnoreCase(type)) {
return false;
} else if (compDesc.getImplementationIds().isEmpty()) { // SUPPRESS CHECKSTYLE Explicit returns
return false;
} else {
return true;
}
} else {
return false;
}
}
private void sort(List<PaletteEntry> entries) {
Collections.sort(entries, new Comparator<PaletteEntry>() {
@Override
public int compare(final PaletteEntry o1, final PaletteEntry o2) {
final String str1 = o1.getLabel();
final String str2 = o2.getLabel();
if (str1 == null) {
if (str2 == null) {
return 0;
} else {
return 1;
}
} else if (str2 == null) {
return -1;
} else {
return str1.compareToIgnoreCase(str2);
}
}
});
}
private List<PaletteEntry> createPaletteEntries(ComponentDesc desc) {
List<PaletteEntry> retVal = new ArrayList<PaletteEntry>(desc.getImplementationIds().size());
if (desc.getImplementationIds().size() == 1) {
SpdToolEntry entry = new SpdToolEntry(desc.getName(), desc.getDescription(), desc.getResourceURI(), desc.getIdentifier(),
desc.getImplementationIds().get(0), SandboxDiagramEditor.TOOL_ICON);
entry.setAlwaysCreateComplonentFile(true);
retVal.add(entry);
} else {
for (String implID : desc.getImplementationIds()) {
SpdToolEntry entry = new SpdToolEntry(desc.getName() + " (" + implID + ")", desc.getDescription(), desc.getResourceURI(), desc.getIdentifier(),
implID, SandboxDiagramEditor.TOOL_ICON);
entry.setAlwaysCreateComplonentFile(true);
retVal.add(entry);
}
}
return retVal;
}
}