package org.jboss.tools.windup.ui.internal.markers;
import static org.jboss.tools.windup.model.domain.WindupMarker.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.FileEditorInput;
import org.jboss.tools.windup.ui.WindupUIPlugin;
public class MarkerMenuContribution extends ContributionItem
{
private EditorPart editor;
private IVerticalRulerInfo rulerInfo;
private List<IMarker> markers;
public MarkerMenuContribution(EditorPart editor)
{
this.editor = editor;
this.rulerInfo = getRulerInfo();
this.markers = getMarkers();
}
private IVerticalRulerInfo getRulerInfo()
{
return (IVerticalRulerInfo) editor.getAdapter(IVerticalRulerInfo.class);
}
private List<IMarker> getMarkers()
{
List<IMarker> clickedOnMarkers = new ArrayList<IMarker>();
for (IMarker marker : getAllMarkers())
{
if (markerHasBeenClicked(marker))
{
clickedOnMarkers.add(marker);
}
}
return clickedOnMarkers;
}
// Determine whether the marker has been clicked using the ruler's mouse listener
private boolean markerHasBeenClicked(IMarker marker)
{
return (marker.getAttribute(IMarker.LINE_NUMBER, 0)) == (rulerInfo.getLineOfLastMouseButtonActivity() + 1);
}
// Get all My Markers for this source file
private IMarker[] getAllMarkers()
{
try
{
IMarker[] classificationMarkers = ((FileEditorInput) editor.getEditorInput()).getFile()
.findMarkers(WINDUP_CLASSIFICATION_MARKER_ID, true, IResource.DEPTH_ZERO);
IMarker[] hintMarkers = ((FileEditorInput) editor.getEditorInput()).getFile()
.findMarkers(WINDUP_HINT_MARKER_ID, true, IResource.DEPTH_ZERO);
Set<IMarker> all = new HashSet<>(Arrays.asList(classificationMarkers));
all.addAll(Arrays.asList(hintMarkers));
return all.toArray(new IMarker[all.size()]);
}
catch (CoreException e)
{
throw new RuntimeException(e);
}
}
@Override
// Create a menu item for each marker on the line clicked on
public void fill(Menu menu, int index)
{
for (final IMarker marker : markers)
{
MenuItem menuItem = new MenuItem(menu, SWT.PUSH, index);
menuItem.setText("Remove Migration Task: '" + marker.getAttribute(IMarker.MESSAGE, "") + "'");
menuItem.addSelectionListener(createDynamicSelectionListener(marker));
}
}
// Action to be performed when clicking on the menu item is defined here
private SelectionAdapter createDynamicSelectionListener(final IMarker marker)
{
return new SelectionAdapter()
{
public void widgetSelected(SelectionEvent event)
{
String message = marker.getAttribute(IMarker.MESSAGE, "");
try
{
marker.delete();
}
catch (CoreException e)
{
WindupUIPlugin.logError("Failed to remove marker: " + message + " due to: " + e, e);
}
}
};
}
}