/******************************************************************************* * Copyright (c) 2009 the CHISEL group and contributors. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: the CHISEL group - initial API and implementation *******************************************************************************/ package ca.uvic.chisel.javasketch.ui.internal.presentation.commands; import java.util.Iterator; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.handlers.HandlerUtil; import ca.uvic.chisel.javasketch.IProgramSketch; import ca.uvic.chisel.javasketch.SketchPlugin; import ca.uvic.chisel.javasketch.data.model.ITrace; import ca.uvic.chisel.javasketch.data.model.ITraceModel; import ca.uvic.chisel.javasketch.data.model.ITraceModelProxy; import ca.uvic.chisel.javasketch.ui.internal.presentation.IJavaSketchPresenter; import ca.uvic.chisel.javasketch.ui.internal.presentation.JavaThreadSequenceView; /** * Reveal an activation for a given event. * * @author Del Myers * */ public class RevealActivationHandler extends AbstractHandler { public static final String THREAD_PARAMETER = "revealThread"; public static final String TRACE_PARAMETER = "revealTrace"; public static final String COMMAND_ID = "ca.uvic.chisel.javasketch.command.revealActivation"; public static final String MODEL_PARAMETER = "revealModel"; /* * (non-Javadoc) * @see * org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands. * ExecutionEvent) */ @Override public Object execute(ExecutionEvent event) throws ExecutionException { ITraceModel traceModel = getTraceModel(event); if (traceModel != null) { IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event); if (window != null) { IViewPart view = window.getActivePage().findView(JavaThreadSequenceView.VIEW_ID); if (view == null) { try { view = window.getActivePage().showView(JavaThreadSequenceView.VIEW_ID, null, IWorkbenchPage.VIEW_VISIBLE); } catch (PartInitException e) { SketchPlugin.getDefault().log(e); return null; } } if (view != null) { window.getActivePage().bringToTop(view); //make sure that the right ((IJavaSketchPresenter)view).reveal(traceModel, event.getParameter(THREAD_PARAMETER)); } } } return null; } /** * Attempts to retrieve the trace model object for the event. First, * parameters are checked to see what should be displayed. If the parameters * don't contain a trace model, then the selection is queried. * @param event * @return */ protected ITraceModel getTraceModel(ExecutionEvent event) { String traceId = event.getParameter(TRACE_PARAMETER); String modelId = event.getParameter(MODEL_PARAMETER); ITraceModel tm = null; if (modelId != null) { IProgramSketch sketch = SketchPlugin.getDefault().getSketch(traceId); if (sketch != null) { ITrace trace = sketch.getTraceData(); if (trace != null) { ITraceModelProxy proxy = trace.getElement(modelId); if (proxy != null) { tm = proxy.getElement(); } } } } if (tm == null) { tm = getTraceModelForSelection(HandlerUtil.getCurrentSelection(event), event); } return tm; } protected ITraceModel getTraceModelForSelection(ISelection selection, ExecutionEvent event) { ITraceModel tm = null; if (selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) selection; for (Iterator<?> it = ss.iterator(); it.hasNext() && tm == null;) { Object o = it.next(); if (o instanceof ITraceModel) { tm = (ITraceModel) o; } else if (o instanceof IAdaptable) { tm = (ITraceModel) ((IAdaptable)o).getAdapter(ITraceModel.class); } else { tm = (ITraceModel) Platform.getAdapterManager().getAdapter(o, ITraceModel.class); } if (tm != null) { return tm; } } } return tm; } }