package net.sourceforge.pmd.eclipse.ui.views;
import java.util.Arrays;
import java.util.List;
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.ui.ItemColumnDescriptor;
import net.sourceforge.pmd.eclipse.ui.model.FileRecord;
import net.sourceforge.pmd.eclipse.ui.preferences.br.BasicTableManager;
import net.sourceforge.pmd.eclipse.ui.preferences.br.MarkerColumnsUI;
import net.sourceforge.pmd.eclipse.ui.views.actions.RemoveViolationAction;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.Page;
/**
* Creates a Page for the Violation Outline
*
* @author Brian Remedios
*/
public class ViolationOutlinePageBR extends Page implements IPage, ISelectionChangedListener, RefreshableTablePage {
private TableViewer tableViewer;
private ViolationOutline violationOutline;
private ViewerFilter viewerFilter;
private FileRecord resource;
private Integer[] columnWidths;
private Integer[] sorterProperties;
private BasicTableManager<IMarker> tableManager;
private ItemColumnDescriptor<?,IMarker>[] initialColumns = new ItemColumnDescriptor[] {
MarkerColumnsUI.priority,
MarkerColumnsUI.lineNumber,
// MarkerColumnsUI.done,
MarkerColumnsUI.created,
MarkerColumnsUI.ruleName,
MarkerColumnsUI.message
};
/**
* Constructor
*
* @param resourceRecord, the FileRecord
* @param outline, the parent Outline
*/
public ViolationOutlinePageBR(FileRecord resourceRecord, ViolationOutline outline) {
resource = resourceRecord;
violationOutline = outline;
ViewerFilter[] filters = outline.getFilters();
for (int i = 0; i < filters.length; i++) {
if (filters[i] instanceof PriorityFilter)
viewerFilter = filters[i];
}
}
public TableViewer tableViewer() { return tableViewer; }
public void createControl(Composite parent) {
tableManager = new BasicTableManager<IMarker>("rscViolations", PMDPlugin.getDefault().loadPreferences(), initialColumns);
tableViewer = tableManager.buildTableViewer(parent);
tableManager.setupColumns(initialColumns);
tableManager.setTableMenu(violationOutline.createContextMenu(tableViewer));
columnWidths = new Integer[initialColumns.length];
for (int i = 0; i < initialColumns.length; i++) {
columnWidths[i] = initialColumns[i].defaultWidth();
final int columnIndex = i;
tableViewer.getTable().getColumn(i).addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
columnWidths[columnIndex] = tableViewer.getTable().getColumn(columnIndex).getWidth();
}
});
tableViewer.getTable().getColumn(i).addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
sorterProperties[0] = columnIndex;
sorterProperties[1] = tableManager.getSortDirection();
}
});
}
sorterProperties = new Integer[2];
sorterProperties[0] = null;
sorterProperties[1] = SWT.NONE;
// create the Table
createActionBars();
// set the Input
tableViewer.setContentProvider(new ViolationOutlineContentProvider(this));
tableViewer.setInput(resource);
// add the Filter and Listener
tableViewer.addFilter(viewerFilter);
tableViewer.addSelectionChangedListener(this);
}
/**
* Creates the ActionBars
*/
private void createActionBars() {
IToolBarManager manager = getSite().getActionBars().getToolBarManager();
Action removeViolationAction = new RemoveViolationAction(tableViewer);
manager.add(removeViolationAction);
manager.add(new Separator());
}
/**
* @return the Viewer
*/
public TableViewer getTableViewer() {
return tableViewer;
}
/* @see org.eclipse.ui.part.IPage#getControl() */
public Control getControl() {
return tableViewer.getControl();
}
/* @see org.eclipse.ui.part.IPage#setFocus() */
public void setFocus() {
tableViewer.getTable().setFocus();
}
/**
* @return the underlying FileRecord
*/
public FileRecord getResource() {
return resource;
}
/**
* Refreshes the View
*/
public void refresh() {
if (!tableViewer.getControl().isDisposed()) {
tableViewer.getControl().setRedraw(false);
tableViewer.refresh();
tableViewer.getControl().setRedraw(true);
}
}
/* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
IMarker marker = (IMarker) selection.getFirstElement();
if (marker == null) return;
IEditorPart editor = getSite().getPage().getActiveEditor();
if (editor == null) return;
IEditorInput input = editor.getEditorInput();
if (input instanceof IFileEditorInput) {
IFile file = ((IFileEditorInput) input).getFile();
if (marker.getResource().equals(file)) {
IDE.gotoMarker(editor, marker);
}
}
}
public List<Integer> getColumnWidths() {
return Arrays.asList(columnWidths);
}
public void setColumnWidths(List<Integer> widths) {
if (widths == null || widths.isEmpty())
return;
if (tableViewer.getTable().isDisposed())
return;
columnWidths = widths.toArray(new Integer[widths.size()]);
TableColumn[] columns = tableViewer.getTable().getColumns();
for (int i = 0; i < columns.length && i < widths.size() && i < initialColumns.length; i++) {
int width = initialColumns[i].defaultWidth();
if (widths.get(i) != null) {
width = widths.get(i).intValue();
}
columns[i].setWidth(width);
}
}
/**
* first: column index
* second: ascending/descending: UP, DOWN or NONE
*/
public List<Integer> getSorterProperties() {
return Arrays.asList(sorterProperties);
}
public void setSorterProperties(List<Integer> sorterProps) {
if (sorterProps == null || sorterProps.isEmpty())
return;
Table table = tableViewer.getTable();
if (table.isDisposed()) {
return;
}
sorterProperties = sorterProps.toArray(new Integer[sorterProps.size()]);
TableColumn sortColumn = null;
int direction = SWT.NONE;
if (sorterProps.size() == 2) {
if (sorterProps.get(0) != null && sorterProps.get(0).intValue() >= 0 && sorterProps.get(0).intValue() < table.getColumnCount()) {
sortColumn = table.getColumn(sorterProps.get(0).intValue());
}
if (sorterProps.get(1) != null) {
direction = sorterProps.get(1).intValue();
}
}
if (sortColumn != null) {
tableManager.setSortDirection(sortColumn, initialColumns[sorterProperties[0]].getAccessor(), direction);
}
}
}