package org.rascalmpl.eclipse.navigator;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionConstants;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
import org.rascalmpl.eclipse.editor.EditorUtil;
import org.rascalmpl.eclipse.library.util.Clipboard;
import org.rascalmpl.eclipse.navigator.NavigatorContentProvider.URIContent;
import org.rascalmpl.uri.URIResolverRegistry;
import org.rascalmpl.values.ValueFactoryFactory;
import io.usethesource.vallang.ISourceLocation;
import io.usethesource.vallang.IValueFactory;
public class NavigatorActionProvider extends CommonActionProvider {
public static class OpenFileStoreAction extends Action {
private final ISelectionProvider sp;
private ISourceLocation store;
public OpenFileStoreAction(ISelectionProvider selectionProvider) {
this.sp = selectionProvider;
}
@Override
public String getText() {
return "Open";
}
@Override
public void run() {
if (store != null) {
if (!URIResolverRegistry.getInstance().isDirectory(store)) {
EditorUtil.openAndSelectURI(store);
}
}
}
public boolean isEnabled() {
ISelection selection = sp.getSelection();
if (!selection.isEmpty()) {
IStructuredSelection sSelection = (IStructuredSelection) selection;
if(sSelection.size() == 1 && sSelection.getFirstElement() instanceof URIContent) {
store = ((URIContent) sSelection.getFirstElement()).getURI();
return true;
}
}
return false;
}
}
public static class CopySourceLocationAction extends Action {
private final ISelectionProvider sp;
private ISourceLocation store;
private final IValueFactory vf = ValueFactoryFactory.getValueFactory();
private final Clipboard cb = new Clipboard(vf);
public CopySourceLocationAction(ISelectionProvider selectionProvider) {
this.sp = selectionProvider;
}
@Override
public String getText() {
return "Copy Location";
}
@Override
public void run() {
if (store != null) {
cb.copy(store);
}
}
public boolean isEnabled() {
ISelection selection = sp.getSelection();
if (!selection.isEmpty()) {
IStructuredSelection sSelection = (IStructuredSelection) selection;
if(sSelection.size() == 1 && sSelection.getFirstElement() instanceof URIContent) {
store = ((URIContent) sSelection.getFirstElement()).getURI();
return true;
}
}
return false;
}
}
private OpenFileStoreAction openAction;
private CopySourceLocationAction copyAction;
public NavigatorActionProvider() {
}
public void init(ICommonActionExtensionSite aSite) {
ICommonViewerSite viewSite = aSite.getViewSite();
if (viewSite instanceof ICommonViewerWorkbenchSite) {
ICommonViewerWorkbenchSite workbenchSite = (ICommonViewerWorkbenchSite) viewSite;
openAction = new OpenFileStoreAction(workbenchSite.getSelectionProvider());
copyAction = new CopySourceLocationAction(workbenchSite.getSelectionProvider());
}
}
public void fillActionBars(IActionBars actionBars) {
if (openAction.isEnabled()) {
actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction);
actionBars.getMenuManager().add(openAction);
}
if (copyAction.isEnabled()) {
actionBars.getMenuManager().add(copyAction);
}
}
public void fillContextMenu(IMenuManager menu) {
if (openAction.isEnabled()) {
menu.add(openAction);
}
if (copyAction.isEnabled()) {
menu.add(copyAction);
}
}
}