/******************************************************************************* * Copyright (c) 2010 Herman Lee. * 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 * * Contributors: * Herman Lee - initial API and implementation ******************************************************************************/ package ca.uwaterloo.gsd.fsml.javaMappingInterpreter; import java.util.List; import org.eclipse.core.internal.resources.Marker; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.jface.util.TransferDragSourceListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.MarkerTransfer; import ca.uwaterloo.gsd.fsml.core.Markers; import ca.uwaterloo.gsd.fsml.ecore.FSMLEcoreUtil; import ca.uwaterloo.gsd.fsml.fsml.Model; import ca.uwaterloo.gsd.fsml.fsml.ModelContainer; public class FSMLMarkerTransferDragSourceListener extends DragSourceAdapter implements TransferDragSourceListener { private IWorkbenchPage page; private final StructuredViewer viewer; private final IProject project; public FSMLMarkerTransferDragSourceListener(StructuredViewer viewer,IProject project) { this.viewer = viewer; this.project = project; } @Override public Transfer getTransfer() { return MarkerTransfer.getInstance(); } public void dragSetData(DragSourceEvent event) { Object[] data = ((IStructuredSelection) viewer.getSelection()) .toArray(); String parentKey = FSMLEcoreUtil.getFSMLId((EObject) data[0], null); List<IMarker> markers = Markers.INSTANCE.getMarkers(parentKey); Marker marker=null; if (markers.size() != 0) { event.doit = true; marker = (Marker) markers.get(0); } else { // Now for each feature EClass parentClass = ((EObject) (EObject) data[0]).eClass(); for (EStructuralFeature feature : parentClass.getEAllStructuralFeatures()) { String id = parentKey + "::" + feature.getName(); // Attributes that are * can have values if (feature.isMany() && ! (feature instanceof EReference)) { for (Object value : (EList<?>) ((EObject) data[0]).eGet(feature)) { if (Markers.INSTANCE.getMarkers(id + "(" + value + ")").size()>0) { marker =(Marker)Markers.INSTANCE.getMarkers(id + "(" + value + ")").get(0); } break; } } else { if (Markers.INSTANCE.getMarkers(id).size()>0) { marker =(Marker)Markers.INSTANCE.getMarkers(id).get(0); } break; } } } event.data = new Marker[] { marker }; event.detail = DND.DROP_MOVE; } @Override public void dragStart(DragSourceEvent event) { EObject eObj = (EObject) ((IStructuredSelection) viewer.getSelection()) .toArray()[0]; String parentKey = FSMLEcoreUtil.getFSMLId(eObj, null); Model lastReconciledModel = ((ModelContainer) eObj.eResource() .getResourceSet().getResources().get(0).getContents().get(0)) .getLastReconciledModel(); TreeIterator<EObject> allContents = lastReconciledModel.eAllContents(); boolean found = false; while (allContents.hasNext()) { if (parentKey.equals(FSMLEcoreUtil.getFSMLId(allContents.next(), null))) { found = true; break; } } if (found) { event.doit = true; Image icon = PlatformUI.getWorkbench().getSharedImages().getImage( org.eclipse.ui.ide.IDE.SharedImages.IMG_OBJS_BKMRK_TSK); double zoom = 1d * 5; final int width = icon.getBounds().width; final int height = icon.getBounds().height; event.image = new Image(Display.getDefault(), icon.getImageData() .scaledTo((int) (width * zoom), (int) (height * zoom))); // maybe this is too intrusive? /*try { PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getActivePage().showView( "ca.uwaterloo.gsd.fsml.GoToView"); } catch (PartInitException e) { e.printStackTrace(); }*/ } else { event.doit = false; } } }