package org.rascalmpl.eclipse.actions;
import java.net.URI;
import java.net.URISyntaxException;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.rascalmpl.eclipse.Activator;
import org.rascalmpl.eclipse.library.util.Clipboard;
import org.rascalmpl.uri.URIUtil;
import io.usethesource.vallang.IValueFactory;
import org.rascalmpl.values.ValueFactoryFactory;
public class ResourceContributionItem extends ContributionItem {
public ResourceContributionItem() {
}
public ResourceContributionItem(String id) {
super(id);
}
@Override
public void fill(Menu menu, int index) {
new ActionContributionItem(new CopySourceLocAction()).fill(menu, index);
}
private static class CopySourceLocAction extends Action {
final IValueFactory vf = ValueFactoryFactory.getValueFactory();
final Clipboard cb = new Clipboard(vf);
public CopySourceLocAction() {
super("Copy source location");
}
@Override
public ImageDescriptor getImageDescriptor() {
return Activator.getRascalImage();
}
@Override
public void run() {
try {
final IResource val = getSelectedValue();
if (val != null) {
URI uri = URIUtil.create("project", val.getProject().getName(), "/" + val.getProjectRelativePath().toPortableString());
cb.copy(vf.sourceLocation(uri));
}
} catch (URISyntaxException e) {
// s
}
}
private IResource getSelectedValue() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
ISelection sel = window.getSelectionService().getSelection();
if (sel instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection) sel;
Object firstElement = selection.getFirstElement();
if (firstElement instanceof IResource) {
return ((IResource) firstElement);
}
}
}
return null;
}
}
}