package com.redhat.ceylon.test.eclipse.plugin;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.containsCeylonTestImport;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.getModule;
import static com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil.isCeylonProject;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
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.IPartListener2;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.actions.ActionGroup;
import com.redhat.ceylon.eclipse.code.explorer.PackageExplorerActionGroup;
import com.redhat.ceylon.eclipse.code.explorer.PackageExplorerPart;
import com.redhat.ceylon.model.typechecker.model.Module;
import com.redhat.ceylon.test.eclipse.plugin.util.AddCeylonTestImport;
import com.redhat.ceylon.test.eclipse.plugin.util.CeylonTestUtil;
public class CeylonTestBuildPathMenu {
private static final String BUILD_PATH_MENU_ID = "org.eclipse.jdt.ui.buildpath.menu";
public static void install() {
IWorkbenchPage page = CeylonTestUtil.getActivePage();
IViewPart part = page.findView(PackageExplorerPart.VIEW_ID);
if (part != null) {
PackageExplorerPart packageExplorerPart = (PackageExplorerPart) part;
install(packageExplorerPart);
}
page.addPartListener(new IPartListener2() {
@Override
public void partOpened(IWorkbenchPartReference partRef) {
if (partRef.getId().equals(PackageExplorerPart.VIEW_ID)) {
IWorkbenchPart part = partRef.getPart(false);
if (part != null) {
PackageExplorerPart packageExplorerPart = (PackageExplorerPart) part;
install(packageExplorerPart);
}
}
}
@Override
public void partVisible(IWorkbenchPartReference partRef) {}
@Override
public void partInputChanged(IWorkbenchPartReference partRef) {}
@Override
public void partHidden(IWorkbenchPartReference partRef) {}
@Override
public void partDeactivated(IWorkbenchPartReference partRef) {}
@Override
public void partClosed(IWorkbenchPartReference partRef) {}
@Override
public void partBroughtToTop(IWorkbenchPartReference partRef) {}
@Override
public void partActivated(IWorkbenchPartReference partRef) {}
});
}
@SuppressWarnings("restriction")
private static void install(PackageExplorerPart packageExplorerPart) {
ISelectionProvider selectionProvider = packageExplorerPart.getSite().getSelectionProvider();
PackageExplorerActionGroup packageExplorerActionGroup = packageExplorerPart.getPackageExplorerActionGroup();
packageExplorerActionGroup.addGroup(new AddCeylonTestImportActionGroup(selectionProvider));
}
private static class AddCeylonTestImportActionGroup extends ActionGroup {
private final ISelectionProvider selectionProvider;
public AddCeylonTestImportActionGroup(ISelectionProvider selectionProvider) {
this.selectionProvider = selectionProvider;
}
@Override
public void fillContextMenu(IMenuManager menu) {
IMenuManager buildPathMenu = (IMenuManager) menu.find(BUILD_PATH_MENU_ID);
if (buildPathMenu != null) {
buildPathMenu.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
ISelection selection = selectionProvider.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
if (structuredSelection.size() == 1) {
Object firstElement = structuredSelection.getFirstElement();
if (firstElement instanceof IPackageFragment) {
IPackageFragment packageFragment = (IPackageFragment) firstElement;
IProject project = packageFragment.getJavaProject().getProject();
if (isCeylonProject(project)) {
Module module = getModule(project, packageFragment.getElementName());
if (module != null) {
manager.add(new AddCeylonTestImportAction(project, module));
}
}
}
}
}
}
});
}
}
}
private static class AddCeylonTestImportAction extends Action {
private final IProject project;
private final Module module;
public AddCeylonTestImportAction(IProject project, Module module) {
super(CeylonTestMessages.addCeylonTestImport);
this.project = project;
this.module = module;
setDescription(CeylonTestMessages.addCeylonTestImport);
setEnabled(!containsCeylonTestImport(module));
}
@Override
public void run() {
try {
AddCeylonTestImport.addCeylonTestImport(project, module);
} catch (CoreException e) {
CeylonTestPlugin.logError("", e);
}
}
}
}