uk.ac.gda.ui.doe.DOEView.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.gda.ui.doe.DOEView.java

Source

/*-
 * 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);
        }
    }

}