/* * ALMA - Atacama Large Millimiter Array (c) European Southern Observatory, 2010 * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package alma.acs.alarmsystemprofiler.parts; import java.util.Collection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.part.ViewPart; import alma.acs.alarmsystemprofiler.document.DocumentBase; public abstract class TableViewBase extends ViewPart { /** * The content provider * * @author acaproni * */ class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { DocumentBase container=(DocumentBase)parent; Collection<?> items=container.getNumbers(); if (items==null) { return new Object[0]; } else { return items.toArray(); } } } /** * A base class to sort the table by ascending/descending order of a column * * @author acaproni * */ public abstract class TableSorterBase extends ViewerSorter { /** * Ascending order */ public static final int ASCENDING=0; /** * Descending order */ public static final int DESCENDING=1; /** * The number of column to sort */ protected int colIndex; /** * The order ascending/descending */ protected int order; /** * Constructor * * @param colIndex The index of the column to sort * @param order The order ascending/descending */ public TableSorterBase(int colIndex, int order) { this.colIndex=colIndex; this.order=order; } /** * Set the column to order * * @param column The index of the column used for ordering */ public void setColumn(int column) { if (column==colIndex) { // Same column as last sort; toggle the direction order=1-order; } else { // New column; do an ascending sort colIndex=column; order=DESCENDING; } } @Override public abstract int compare(Viewer viewer, Object e1, Object e2); } /** * The names of the columns */ private final String colNames[]; /** * The width of the columns */ private final int colWidths[]; /** * The table viewer */ protected TableViewer tableViewer; /** * The sorter */ protected TableSorterBase sorter; public TableViewBase(String[] colNames, int[] colWidths) { this.colNames=colNames; this.colWidths=colWidths; } @Override public void createPartControl(Composite parent) { tableViewer = new TableViewer(parent,SWT.SINGLE| SWT.H_SCROLL| SWT.V_SCROLL); Table table = tableViewer.getTable(); table.setLinesVisible(true); table.setHeaderVisible(true); // Set the column for (int t=0; t<colNames.length; t++) { int style = t==0?SWT.LEFT:SWT.CENTER; final TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, style); final TableColumn column = viewerColumn.getColumn(); column.setText(colNames[t]); final int index=t; // Setting the right sorter column.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { sorter.setColumn(index); int dir = tableViewer.getTable().getSortDirection(); if (tableViewer.getTable().getSortColumn() == column) { dir = dir == SWT.UP ? SWT.DOWN : SWT.UP; } else { dir = SWT.DOWN; } tableViewer.getTable().setSortDirection(dir); tableViewer.getTable().setSortColumn(column); tableViewer.refresh(); } }); column.pack(); column.setWidth(colWidths[t]); } tableViewer.setContentProvider(new ViewContentProvider()); } @Override public void setFocus() { tableViewer.getControl().setFocus(); } }