/*-
* Copyright © 2009 Diamond Light Source Ltd.
*
* This file is part of GDA.
*
* GDA is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License version 3 as published by the Free
* Software Foundation.
*
* GDA 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 General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with GDA. If not, see <http://www.gnu.org/licenses/>.
*/
package uk.ac.gda.ui.doe;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.IContentProvider;
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.ViewerCell;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.part.ViewPart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.gda.doe.DOEUtils;
import uk.ac.gda.doe.RangeInfo;
public class DOEView extends ViewPart {
private static Logger logger = LoggerFactory.getLogger(DOEView.class);
public static final String ID = "uk.ac.gda.ui.doe.DOEView"; //$NON-NLS-1$
private TableViewer tableViewer;
private List<RangeInfo> info;
private DOEBeanProvider beansProvider;
public DOEView() throws CoreException {
IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor("uk.ac.common.doe.beans");
for (IConfigurationElement e : config) {
this.beansProvider = (DOEBeanProvider)e.createExecutableExtension("class");
break;
}
}
/**
* Create contents of the view part.
* @param parent
*/
@Override
public void createPartControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new GridLayout());
final Table table = new Table(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.horizontalSpan = 3;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
this.tableViewer = new TableViewer(table);
tableViewer.setUseHashlookup(true);
tableViewer.setContentProvider(createContentProvider());
ColumnViewerToolTipSupport.enableFor(tableViewer,ToolTip.NO_RECREATE);
createRightClickMenu();
getSite().setSelectionProvider(tableViewer);
getSite().getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
refresh();
}
});
}
private void createTableColumns() {
// Dispose columns not the first.
for(;tableViewer.getTable().getColumnCount()>1;)
tableViewer.getTable().getColumns()[1].dispose();
// Create experiment name column if required.
if (tableViewer.getTable().getColumnCount()<1) {
final TableViewerColumn col = new TableViewerColumn(tableViewer, SWT.NONE, 0);
col.getColumn().setText("Experiment");
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public void update(ViewerCell cell) {
final TableItem item = (TableItem)cell.getViewerRow().getItem();
final Table table= tableViewer.getTable();
int row = table.indexOf(item)+1;
cell.setText(" "+row);
}
});
col.getColumn().setWidth(120);
}
if (info == null) return;
final Map<String,Class<?>> columns = new LinkedHashMap<String,Class<?>>();
for (RangeInfo i : info) columns.putAll(i.getColumnClasses());
final String[] columnLabels = getColumnLabels(columns);
final String[] columnProperties = getColumnProperties(columns);
for (int icolumn = 1; icolumn < columnLabels.length; icolumn++) {
final TableViewerColumn col = new TableViewerColumn(tableViewer, SWT.NONE, icolumn);
col.getColumn().setText(columnLabels[icolumn]);
col.setLabelProvider(new FieldColumnProvider(columnProperties));
col.getColumn().setWidth(100);
}
tableViewer.setColumnProperties(columnProperties);
tableViewer.setInput(new Object());
}
private String[] getColumnLabels(Map<String, Class<?>> columns) {
final List<String> columnLabels = new ArrayList<String>(columns.size()+1);
columnLabels.add("Run"); // The experiment number column
for (String name : columns.keySet()) {
String label = beansProvider.getColumnLabel(name, columns.get(name));
if (label==null) label = name;
columnLabels.add(label);
}
return columnLabels.toArray(new String[columnLabels.size()]);
}
private String[] getColumnProperties(Map<String, Class<?>> columns) {
final List<String> columnNames = new ArrayList<String>(columns.size()+1);
columnNames.add("Run"); // The experiment number column
for (String name : columns.keySet()) columnNames.add(name);
return columnNames.toArray(new String[columnNames.size()]);
}
private IContentProvider createContentProvider() {
return new IStructuredContentProvider() {
@Override
public void dispose() {}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
@Override
public Object[] getElements(Object inputElement) {
try {
return info.toArray(new RangeInfo[info.size()]);
} catch (Exception e) {
logger.error("Cannot get info from list", e);
return null;
}
}
};
}
private void createInfo() throws Exception {
final List<Object> obs = beansProvider.getBeans();
DOEView.this.info = DOEUtils.getInfoFromList(obs);
}
@Override
public void setFocus() {
tableViewer.getControl().setFocus();
}
private void createRightClickMenu() {
final MenuManager menuManager = new MenuManager();
tableViewer.getControl().setMenu (menuManager.createContextMenu(tableViewer.getControl()));
getSite().registerContextMenu(menuManager, tableViewer);
}
public void refresh() {
try {
createInfo();
createTableColumns();
tableViewer.refresh();
} catch (Exception e) {
logger.error("Cannot read ranges", e);
}
}
}