| /********************************************************************** |
| * Copyright (c) 2007 IBM Corporation. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.ptp.pldt.mpi.analysis.popup.actions; |
| |
| import java.util.ArrayList; |
| import java.util.Enumeration; |
| import java.util.Iterator; |
| import java.util.LinkedList; |
| |
| import org.eclipse.cdt.core.dom.ast.IASTNode; |
| import org.eclipse.cdt.internal.ui.editor.CEditor; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.text.Position; |
| import org.eclipse.jface.text.TextSelection; |
| import org.eclipse.jface.text.source.Annotation; |
| import org.eclipse.jface.text.source.IAnnotationModel; |
| import org.eclipse.ptp.pldt.common.ScanReturn; |
| import org.eclipse.ptp.pldt.common.util.SourceInfo; |
| import org.eclipse.ptp.pldt.common.util.Utility; |
| import org.eclipse.ptp.pldt.common.util.ViewActivater; |
| import org.eclipse.ptp.pldt.mpi.analysis.IDs; |
| import org.eclipse.ptp.pldt.mpi.analysis.analysis.BarrierTable; |
| import org.eclipse.ptp.pldt.mpi.analysis.analysis.MPIBarrierAnalysisResults; |
| import org.eclipse.ptp.pldt.mpi.analysis.analysis.BarrierTable.BarrierInfo; |
| import org.eclipse.ptp.pldt.mpi.analysis.view.MPIArtifactMarkingVisitor; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.ui.IEditorActionDelegate; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IFileEditorInput; |
| import org.eclipse.ui.actions.ActionDelegate; |
| |
| /** |
| * Action to show the matching set for a barrier.<br> |
| * Most methods in this class are borrowed from |
| * org.eclipse.ptp.pldt.openmp.analysis.textview.ShowConcurrencyAction.java |
| */ |
| |
| public class ShowMatchSet extends ActionDelegate |
| implements IEditorActionDelegate{ |
| |
| protected CEditor editor_ = null; |
| protected MPIBarrierAnalysisResults results_ = null; |
| private static final boolean traceOn=false; |
| |
| |
| protected static final String TITLE = "Show Match Set"; |
| |
| public ShowMatchSet(){ |
| if(traceOn)System.out.println("ShowMatchSet() constructed..."); |
| } |
| |
| public void setActiveEditor(IAction action, IEditorPart targetEditor){ |
| if (targetEditor instanceof CEditor) |
| editor_ = (CEditor)targetEditor; |
| } |
| |
| public void runWithEvent(IAction action, Event event) { |
| TextSelection selection = null; |
| if (editor_!=null && |
| editor_.getSelectionProvider().getSelection() instanceof TextSelection) { |
| selection = (TextSelection)editor_.getSelectionProvider().getSelection(); |
| } |
| |
| if (selection!=null) { |
| showMatchSet(selection); |
| } |
| else |
| showMessage(TITLE, "No selections made"); |
| } |
| |
| protected void showMessage(String title, String message){ |
| MessageDialog.openInformation(getStandardDisplay().getActiveShell(), title, message); |
| } |
| |
| public static Display getStandardDisplay() { |
| Display display= Display.getCurrent(); |
| if (display == null) { |
| display= Display.getDefault(); |
| } |
| return display; |
| } |
| |
| protected void showMatchSet(TextSelection selection){ |
| if (selection.getOffset()==0 && selection.getLength()==0) { |
| showMessage(TITLE, "No selections made"); |
| return; |
| } |
| |
| /* first clear all existing markers */ |
| IWorkspaceRoot wsResource = ResourcesPlugin.getWorkspace().getRoot(); |
| try { |
| int depth = IResource.DEPTH_INFINITE; |
| wsResource.deleteMarkers(IDs.matchingSetMarkerID, false, depth); |
| |
| } catch (CoreException e) { |
| System.out.println("RM: exception deleting markers."); |
| e.printStackTrace(); |
| } |
| |
| results_ = MPIBarrierAnalysisResults.getAnalysisResults(); |
| if (results_ == null) { |
| showMessage(TITLE, "No Barrier Analysis has been performed"); |
| return; |
| } |
| IEditorInput ieu = editor_.getEditorInput(); |
| IFile file= null; |
| if(ieu instanceof IFileEditorInput){ |
| file=((IFileEditorInput)ieu).getFile(); // cdt40 |
| } |
| //IFile file = editor_.getInputFile();//cdt31 |
| String fileName = file.getFullPath().toOSString(); |
| //String filename2 = Utility.getInputFile(editor_); |
| /* This filename may not contain the FULL path information */ |
| |
| BarrierInfo barrier = findSelectedBarrier(fileName, selection.getOffset()); |
| if(barrier == null){ |
| showMessage(TITLE, "Please select a barrier"); |
| return; |
| } |
| |
| removeMarkers(editor_.getDocumentProvider().getAnnotationModel(editor_.getEditorInput())); |
| //refresh the view later and these deleted markers should disappear |
| //Use common shared variable for markerID |
| //String markerID = "org.eclipse.ptp.pldt.mpi.analysis.mpiBarrierMatchingSetMarker"; |
| MPIArtifactMarkingVisitor visitor = new MPIArtifactMarkingVisitor(IDs.matchingSetMarkerID); |
| |
| /* Display all matched barriers */ |
| // create the markers for all the matched barriers |
| String parentName="BarrierSetName"; // change to something that makes sense |
| for(Iterator i = barrier.getMatchingSet().iterator(); i.hasNext();){ |
| BarrierInfo matchedBar = (BarrierInfo)i.next(); |
| showNode(matchedBar.getFunc().getFunctionNameExpression(), "org.eclipse.ptp.pldt.mpi.analysis.matchset"); |
| ScanReturn sr = new ScanReturn(); |
| |
| SourceInfo sourceInfo = matchedBar.getSourceInfo(); |
| int col=1; |
| String filename=matchedBar.getFileName(); |
| int line=sourceInfo.getStartingLine(); |
| String fn=matchedBar.getEnclosingFunc(); |
| //ArtifactWithParent a = new ArtifactWithParent(filename, line, col, fn,"Artifact Call",sourceInfo,parentName); |
| //sr.addArtifact(a); |
| visitor.visitFile(matchedBar.getResource(), sr.getArtifactList()); |
| } |
| // Done creating markers, now show the view |
| ViewActivater.activateView(IDs.matchingSetViewID); |
| } |
| |
| protected BarrierInfo findSelectedBarrier(String filename, int offset){ |
| BarrierTable table = results_.getBarrierTable(); |
| for(Enumeration e = table.getTable().elements(); e.hasMoreElements();){ |
| ArrayList list = (ArrayList)e.nextElement(); |
| for(Iterator i = list.iterator(); i.hasNext();){ |
| BarrierInfo bar = (BarrierInfo)i.next(); |
| if(traceOn)System.out.println(bar.getFileName()); |
| if(traceOn)System.out.println(bar.getSourceInfo().getStart()); |
| if(!bar.getFileName().endsWith(filename)) continue; |
| if(bar.getSourceInfo().getStart() == offset) |
| return bar; |
| } |
| } |
| return null; |
| } |
| |
| /* Don Pazel's code Utility.removeConcurrencyMarkers() */ |
| protected void removeMarkers(IAnnotationModel am) |
| { |
| LinkedList ais = new LinkedList(); |
| for(Iterator ai=am.getAnnotationIterator(); ai.hasNext();) { ais.add(ai.next()); } |
| for(Iterator it=ais.iterator(); it.hasNext();) { |
| Annotation a = (Annotation)it.next(); |
| if (a.getType().equals("org.eclipse.ptp.pldt.mpi.analysis.matchset")) { |
| am.removeAnnotation(a); |
| } |
| } |
| } |
| |
| protected void showNode(IASTNode node, String markerType) |
| { |
| Utility.Location l = Utility.getLocation(node); |
| |
| |
| IAnnotationModel am = editor_.getDocumentProvider().getAnnotationModel(editor_.getEditorInput()); |
| |
| // We need to add an annotation type to the annotation painter (see SourceViewerDecorationSupport) |
| Annotation a = new Annotation(markerType, true, "Hi"); |
| int end = l.high_-l.low_+1; |
| Position p = new Position(l.low_, end); |
| am.addAnnotation(a, p); |
| } |
| |
| } |