package net.sourceforge.pmd.eclipse.ui.preferences.br;
import java.util.Comparator;
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences;
import net.sourceforge.pmd.eclipse.ui.AbstractColumnDescriptor;
import net.sourceforge.pmd.eclipse.ui.BasicTableLabelProvider;
import net.sourceforge.pmd.eclipse.ui.ColumnDescriptor;
import net.sourceforge.pmd.eclipse.ui.ItemColumnDescriptor;
import net.sourceforge.pmd.eclipse.ui.ItemFieldAccessor;
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.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
*
* @author Brian Remedios
*
* @param <T>
*/
public class BasicTableManager <T extends Object> extends AbstractTableManager<T> {
protected TableViewer tableViewer;
private static final int DefaultTableStyle = SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION;
public BasicTableManager(String theWidgetId, IPreferences thePreferences, ColumnDescriptor[] theColumns) {
super(theWidgetId, thePreferences, theColumns);
}
// public interface Predicate0 {
// boolean value();
// }
// TODO move to util
public static int columnIndexAt(TableItem item, int xPosition) {
TableColumn[] cols = item.getParent().getColumns();
Rectangle bounds;
for(int i = 0; i < cols.length; i++){
bounds = item.getBounds(i);
if (bounds.x < xPosition && xPosition < (bounds.x + bounds.width)) {
return i;
}
}
return -1;
}
// public void setStyle(int columnNo, Predicate0 predicate, TextStyle ifTrue, TextStyle ifFalse) {
//
// }
protected String idFor(Object column) {
return ((TableColumn)column).getToolTipText();
}
protected ColumnWidthAdapter columnAdapterFor(ColumnDescriptor desc) {
TableColumn column = columnFor(desc);
return adapterFor(column);
}
private TableColumn columnFor(ColumnDescriptor desc) {
for (TableColumn column : tableViewer.getTable().getColumns()) {
if ((column.getData(AbstractColumnDescriptor.DescriptorKey)) == desc) return column;
}
return null;
}
private TableColumn columnFor(String tooltipText) {
for (TableColumn column : tableViewer.getTable().getColumns()) {
if (String.valueOf(column.getToolTipText()).equals(tooltipText)) return column;
}
return null;
}
@SuppressWarnings("rawtypes")
private ViewerSorter createSorter() {
return new ViewerSorter() {
public int compare(Viewer viewer, Object e1, Object e2) {
ItemFieldAccessor<?,T> acc = (ItemFieldAccessor<?,T>)columnSorter;
Comparator comp = acc.comparator();
if (comp == null) return 0;
Object v1 = acc.valueFor((T)e1);
Object v2 = acc.valueFor((T)e2);
if (v1 == null) {
return v2 == null ? 0 : -1;
} else {
if (v2 == null) {
return v1 == null ? 0 : 1;
}
}
int result = comp.compare(v1, v2);
return sortDescending ? 0 - result : result;
}
};
}
protected void redrawTable(String sortColumnLabel, int sortDir) {
Table table = tableViewer.getTable();
tableViewer.setComparator( createSorter() );
TableColumn sortColumn = columnFor(sortColumnLabel);
table.setSortColumn(sortColumn);
table.setSortDirection(sortDir);
}
public TableViewer buildTableViewer(Composite parent) {
return buildTableViewer(parent, DefaultTableStyle);
}
public TableViewer buildTableViewer(Composite parent, int tableStyle) {
tableViewer = new TableViewer(parent, tableStyle);
tableViewer.setUseHashlookup(true);
final Table table = tableViewer.getTable();
table.setLinesVisible(true);
table.setHeaderVisible(true);
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
selectedItems(selection.toArray());
}
});
addDeleteListener(table);
table.addListener(SWT.MouseMove, new Listener() {
public void handleEvent(Event event) {
Point point = new Point(event.x, event.y);
TableItem item = table.getItem(point);
if (item != null) {
int columnIndex = columnIndexAt(item, event.x);
updateTooltipFor(item, columnIndex);
}
}
});
setupMenusFor(table);
return tableViewer;
}
/**
*
* @param columnDescs RuleColumnDescriptor[]
* @param groupingField RuleFieldAccessor
*/
public void setupColumns(ItemColumnDescriptor[] columnDescs) {
Table table = tableViewer.getTable();
for (int i=0; i<columnDescs.length; i++) {
columnDescs[i].buildTableColumn(table, this);
}
tableViewer.setLabelProvider( new BasicTableLabelProvider(columnDescs) );
TableColumn[] columns = table.getColumns();
for (TableColumn column : columns) column.pack();
}
protected void updateTooltipFor(TableItem item, int columnIndex) {
}
protected void selectedItems(Object[] items) {
// TODO
}
@Override
protected void removeSelectedItems() {
// TODO Auto-generated method stub
}
protected int headerHeightFor(Control control) {
return ((Table)control).getHeaderHeight();
}
protected void setMenu(Control control, Menu menu) {
((Table)control).setMenu(menu);
}
protected Rectangle clientAreaFor(Control control) {
return ((Table)control).getClientArea();
}
@Override
protected void saveItemSelections() {
// TODO Auto-generated method stub
}
}