/** * 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.sca.sad.diagram.part; import gov.redhawk.sca.sad.diagram.palette.LabelEditPart; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.common.ui.URIEditorInput; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.ui.dnd.LocalTransfer; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.internal.ui.palette.editparts.ToolbarEditPart; import org.eclipse.gef.palette.PaletteContainer; import org.eclipse.gef.palette.PaletteEntry; import org.eclipse.gef.palette.PaletteRoot; import org.eclipse.gef.palette.PaletteToolbar; import org.eclipse.gef.palette.ToolEntry; import org.eclipse.gef.ui.palette.PaletteEditPartFactory; import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramDropTargetListener; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.EditorInputProxy; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; /** * */ public class SadDiagramEditor extends mil.jpeojtrs.sca.sad.diagram.part.SadDiagramEditor { private static final List<String> FILTER_TOOL_IDS = Arrays.asList(new String[] { "createComponentInstantiation1CreationTool", "createComponentPlacement2CreationTool", "createPartitioning5CreationTool" }); public static final String EDITING_DOMAIN_ID = "mil.jpeojtrs.sca.sad.diagram.EditingDomain"; public SadDiagramEditor(final boolean hasflyoutPalette) { super(hasflyoutPalette); } public SadDiagramEditor() { super(true); } @Override protected IDocumentProvider getDocumentProvider(final IEditorInput input) { if (input instanceof IFileEditorInput || input instanceof URIEditorInput || input instanceof EditorInputProxy) { return SadDocumentProvider.getInstance(); } return super.getDocumentProvider(input); } @Override public TransactionalEditingDomain getEditingDomain() { final IDocumentProvider provider = getDocumentProvider(); final IEditorInput input = getEditorInput(); if (provider == null || input == null) { // editor has been programmatically closed while the dialog was open return null; } final IDocument document = provider.getDocument(input); if (document instanceof IDiagramDocument) { return ((IDiagramDocument) document).getEditingDomain(); } return super.getEditingDomain(); } @Override protected void setDocumentProvider(final IEditorInput input) { if (input instanceof IFileEditorInput || input instanceof URIEditorInput || input instanceof EditorInputProxy) { setDocumentProvider(SadDocumentProvider.getInstance()); } else { super.setDocumentProvider(input); } } @Override protected void initializeGraphicalViewer() { super.initializeGraphicalViewer(); getDiagramGraphicalViewer().addDropTargetListener(new DropTargetListener(getDiagramGraphicalViewer(), LocalSelectionTransfer.getTransfer()) { @Override protected Object getJavaObject(final TransferData data) { return LocalSelectionTransfer.getTransfer().getSelection(); // return LocalSelectionTransfer.getTransfer().nativeToJava(data); } }); getDiagramGraphicalViewer().addDropTargetListener(new DropTargetListener(getDiagramGraphicalViewer(), LocalTransfer.getInstance()) { @Override protected Object getJavaObject(final TransferData data) { return LocalTransfer.getInstance().nativeToJava(data); } }); } private abstract class DropTargetListener extends DiagramDropTargetListener { public DropTargetListener(final EditPartViewer viewer, final Transfer xfer) { super(viewer, xfer); } @Override protected List< ? extends EObject> getObjectsBeingDropped() { final TransferData data = getCurrentEvent().currentDataType; final Collection<URI> uris = new HashSet<URI>(); final Object transferedObject = getJavaObject(data); if (transferedObject instanceof IStructuredSelection) { final IStructuredSelection selection = (IStructuredSelection) transferedObject; for (final Iterator< ? > it = selection.iterator(); it.hasNext();) { Object nextSelectedObject = it.next(); if (nextSelectedObject instanceof IAdaptable) { final IAdaptable adaptable = (IAdaptable) nextSelectedObject; nextSelectedObject = adaptable.getAdapter(EObject.class); } if (nextSelectedObject instanceof EObject) { final EObject modelElement = (EObject) nextSelectedObject; final Resource modelElementResource = modelElement.eResource(); uris.add(modelElementResource.getURI().appendFragment(modelElementResource.getURIFragment(modelElement))); } } } final List<EObject> result = new ArrayList<EObject>(); for (final Iterator<URI> it = uris.iterator(); it.hasNext();) { final URI nextURI = it.next(); final EObject modelObject = getEditingDomain().getResourceSet().getEObject(nextURI, true); result.add(modelObject); } return result; } protected abstract Object getJavaObject(TransferData data); } @Override protected PaletteRoot createPaletteRoot(final PaletteRoot existingPaletteRoot) { final PaletteRoot root = super.createPaletteRoot(existingPaletteRoot); filterOutTools(root); return root; } /* * @see org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditorWithFlyOutPalette#constructPaletteViewer() */ @Override protected PaletteViewer constructPaletteViewer() { PaletteViewer retVal = super.constructPaletteViewer(); setPaletteViewerFactory(retVal); return retVal; } private void setPaletteViewerFactory(final PaletteViewer paletteViewer) { paletteViewer.setEditPartFactory(new PaletteEditPartFactory() { /* * @see org.eclipse.gef.ui.palette.PaletteEditPartFactory#createToolbarEditPart(org.eclipse.gef.EditPart, java.lang.Object) */ @SuppressWarnings("unchecked") @Override protected EditPart createToolbarEditPart(EditPart parentEditPart, final Object model) { ToolbarEditPart retVal = new ToolbarEditPart((PaletteToolbar) model) { /* * @see org.eclipse.gef.editparts.AbstractEditPart#createChild(java.lang.Object) */ @Override protected EditPart createChild(Object model) { if ("Text".equals(model)) { LabelEditPart label = new LabelEditPart(paletteViewer); return label; } return super.createChild(model); } /* * @see org.eclipse.gef.ui.palette.editparts.PaletteEditPart#getModelChildren() */ @Override public List<Object> getModelChildren() { List<Object> retVal = super.getModelChildren(); retVal.add("Text"); return retVal; } }; return retVal; } }); } private void filterOutTools(final PaletteEntry entry) { if (entry instanceof PaletteContainer) { for (final Object obj : ((PaletteContainer) entry).getChildren()) { if (obj instanceof PaletteEntry) { filterOutTools((PaletteEntry) obj); } } } if (entry instanceof ToolEntry) { final ToolEntry tool = (ToolEntry) entry; if (SadDiagramEditor.FILTER_TOOL_IDS.contains(tool.getId())) { tool.setVisible(false); } } } }