package ca.uvic.chisel.javasketch.ui.internal.views.java; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PlatformUI; import ca.uvic.chisel.javasketch.IProgramSketch; import ca.uvic.chisel.javasketch.SketchPlugin; import ca.uvic.chisel.javasketch.data.model.IThread; import ca.uvic.chisel.javasketch.internal.JavaSearchUtils; import ca.uvic.chisel.javasketch.ui.ISketchImageConstants; import ca.uvic.chisel.javasketch.ui.internal.presentation.commands.CommandAction; import ca.uvic.chisel.javasketch.ui.internal.presentation.commands.RevealActivationHandler; public class RevealInThreadContribution extends ContributionItem { // public class RevealInThreadAction extends Action { // // private IJavaElement element; // private IThread thread; // // /** // * @param thread // * @param selection // */ // public RevealInThreadAction(IThread thread, IJavaElement element) { // this.element = element; // this.thread = thread; // } // // /* // * (non-Javadoc) // * @see org.eclipse.jface.action.Action#run() // */ // @Override // public void run() { // IWorkbenchPage page = PlatformUI.getWorkbench() // .getActiveWorkbenchWindow().getActivePage(); // IViewPart part = page.findView(JavaSketchView.VIEW_ID); // ICommandService cs = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class); // IHandlerService hs = (IHandlerService) PlatformUI.getWorkbench().getService(ICommandService.class); // // if (part instanceof JavaSketchView) { // JavaSketchView sv = (JavaSketchView) part; // List<IActivation> activations = null; // try { // if (element instanceof IMethod) { // activations = JavaSearchUtils.findActivationsForMethod( // thread, (IMethod) element, // new NullProgressMonitor()); // } else if (element instanceof IType) { // activations = JavaSearchUtils.findActivationsForClass( // thread, (IType) element, new NullProgressMonitor()); // } // } catch (CoreException e) { // } // if (activations != null && !activations.isEmpty()) { // IActivation first = activations.get(0); // page.bringToTop(sv); // sv.reveal(first); // } // // } // } // // /* // * (non-Javadoc) // * @see org.eclipse.jface.action.Action#getText() // */ // @Override // public String getText() { // return thread.getName(); // } // } public RevealInThreadContribution() { } public RevealInThreadContribution(String id) { super(id); } /* * (non-Javadoc) * @see * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets * .Menu, int) */ @Override public void fill(Menu menu, int index) { MenuManager manager = new MenuManager(); fill(manager); IContributionItem items[] = manager.getItems(); for (int i = 0; i < items.length; i++) { items[i].fill(menu, index++); } } /** * @param manager */ private void fill(MenuManager manager) { IProgramSketch sketch = SketchPlugin.getDefault().getActiveSketch(); if (sketch != null && !sketch.isAnalysing() && !sketch.isRunning() && sketch.isConnected()) { IJavaElement selection = getActiveSelection(); IThread[] threads = JavaSearchUtils.findThreadsForElement(sketch .getTraceData(), selection); for (IThread thread : threads) { Map<String, String> parameters = new HashMap<String, String>(); parameters.put(RevealActivationHandler.TRACE_PARAMETER, sketch.getID()); parameters.put(RevealActivationHandler.THREAD_PARAMETER, thread.getIdentifier()); IAction action = new CommandAction(RevealActivationHandler.COMMAND_ID, parameters); action.setImageDescriptor(SketchPlugin.getDefault().getImageRegistry().getDescriptor(ISketchImageConstants.ICON_TRACE_EDITOR)); action.setText(thread.getName()); manager.add(action); } } // Separator separator = new Separator(org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS); // separator.setId(org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS); // manager.add(separator); } /** * @return */ private IJavaElement getActiveSelection() { IWorkbenchPartSite site = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage().getActivePart() .getSite(); ISelection selection = site.getSelectionProvider().getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) selection; for (Iterator<?> it = ss.iterator(); it.hasNext();) { Object o = it.next(); if (o instanceof IAdaptable) { return (IJavaElement) ((IAdaptable) o) .getAdapter(IJavaElement.class); } else if (o != null) { Object element = Platform.getAdapterManager().getAdapter(o, IJavaElement.class); if (element instanceof IJavaElement) { return (IJavaElement) element; } } } } return null; } }