blob: 39e87469b25de7ccb10ec38d20b2b13f37ceae75 [file] [log] [blame]
/**********************************************************************
* 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.Utility;
import org.eclipse.ptp.pldt.common.util.ViewActivator;
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.BarrierTable.BarrierInfo;
import org.eclipse.ptp.pldt.mpi.analysis.analysis.MPIBarrierAnalysisResults;
import org.eclipse.ptp.pldt.mpi.analysis.messages.Messages;
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 = Messages.ShowMatchSet_showMatchSet;
public ShowMatchSet(){
if(traceOn)System.out.println("ShowMatchSet() constructed..."); //$NON-NLS-1$
}
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, Messages.ShowMatchSet_noSelectionsMade);
}
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, Messages.ShowMatchSet_noSelectionsMande);
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."); //$NON-NLS-1$
e.printStackTrace();
}
results_ = MPIBarrierAnalysisResults.getAnalysisResults();
if (results_ == null) {
showMessage(TITLE, Messages.ShowMatchSet_noBarrierAnalysisHasBeenPerformed);
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, Messages.ShowMatchSet_PleaseSelectABarrier);
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 //$NON-NLS-1$
for(Iterator i = barrier.getMatchingSet().iterator(); i.hasNext();){
BarrierInfo matchedBar = (BarrierInfo)i.next();
showNode(matchedBar.getFunc().getFunctionNameExpression(), "org.eclipse.ptp.pldt.mpi.analysis.matchset"); //$NON-NLS-1$
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
ViewActivator.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")) { //$NON-NLS-1$
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"); //$NON-NLS-1$
int end = l.high_-l.low_+1;
Position p = new Position(l.low_, end);
am.addAnnotation(a, p);
}
}