package org.archstudio.prolog.archstudio; import java.lang.reflect.InvocationTargetException; import java.util.List; import org.archstudio.archipelago2.AbstractArchipelago2MenuContributor; import org.archstudio.archipelago2.Archipelago2Utils; import org.archstudio.archipelago2.IArchipelago2MenuContributor; import org.archstudio.archipelago2.IArchipelago2Outline; import org.archstudio.prolog.console.PrologConsoleFactory; import org.archstudio.prolog.engine.ProofContext; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTProxy; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.ui.PlatformUI; public class ArchipelagoTreeMenuContributor extends AbstractArchipelago2MenuContributor implements IArchipelago2MenuContributor { public ArchipelagoTreeMenuContributor() { } @Override public void fillMenu(IArchipelago2Outline outline, List<Object> element, IMenuManager menuManager) { final ObjRef objRef = Archipelago2Utils.getLastObjRef(element); if (objRef != null) { IAction newStructureAction = new Action("Generate Prolog Facts") { @Override public void run() { ProofContext proofContext = process(XArchADTProxy.<EObject> proxy(xarch, objRef)); PrologConsoleFactory.openConsole(proofContext); } }; menuManager.add(newStructureAction); } } public ProofContext process(final EObject eObject) { final ProofContext[] proofContextResult = new ProofContext[1]; try { PlatformUI.getWorkbench().getProgressService().run(true, true, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { SubMonitor subMonitor = SubMonitor.convert(monitor, "Prolog", 1); try { ProofContext proofContext = new ProofContext(); proofContext.add(PrologUtils.getFacts(proofContext, subMonitor.newChild(1), eObject)); proofContextResult[0] = proofContext; } catch (Throwable t) { throw new InvocationTargetException(t); } } }); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } if (proofContextResult[0] == null) { throw new NullPointerException(); } return proofContextResult[0]; } }