net.bioclipse.cdk.ui.sdfeditor.editor.MoleculeTableViewer.java Source code

Java tutorial

Introduction

Here is the source code for net.bioclipse.cdk.ui.sdfeditor.editor.MoleculeTableViewer.java

Source

/*******************************************************************************
 * Copyright (c) 2009  Arvid Berg <goglepox@users.sourceforge.net>
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * <http://www.eclipse.org/legal/epl-v10.html>
 *
 * Contact: http://www.bioclipse.net/
 ******************************************************************************/
package net.bioclipse.cdk.ui.sdfeditor.editor;

import java.util.List;

import net.bioclipse.cdk.domain.CDKMolecule;
import net.bioclipse.cdk.domain.CDKMoleculePropertySource;
import net.bioclipse.cdk.domain.ICDKMolecule;
import net.bioclipse.cdk.ui.views.IMoleculesEditorModel;
import net.sourceforge.nattable.GridRegionEnum;
import net.sourceforge.nattable.NatTable;
import net.sourceforge.nattable.action.SelectCellAction;
import net.sourceforge.nattable.config.DefaultBodyConfig;
import net.sourceforge.nattable.config.DefaultColumnHeaderConfig;
import net.sourceforge.nattable.config.DefaultRowHeaderConfig;
import net.sourceforge.nattable.config.SizeConfig;
import net.sourceforge.nattable.data.IColumnHeaderLabelProvider;
import net.sourceforge.nattable.data.IDataProvider;
import net.sourceforge.nattable.event.matcher.MouseEventMatcher;
import net.sourceforge.nattable.model.DefaultNatTableModel;
import net.sourceforge.nattable.painter.cell.ICellPainter;
import net.sourceforge.nattable.renderer.AbstractCellRenderer;
import net.sourceforge.nattable.support.EventBindingSupport;
import net.sourceforge.nattable.typeconfig.style.DefaultStyleConfig;
import net.sourceforge.nattable.typeconfig.style.DisplayModeEnum;
import net.sourceforge.nattable.typeconfig.style.IStyleConfig;
import net.sourceforge.nattable.util.GUIHelper;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
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.ScrollBar;
import org.eclipse.ui.views.properties.IPropertySource;

public class MoleculeTableViewer extends ContentViewer {

    public final static int STRUCTURE_COLUMN_WIDTH = 200;

    NatTable table;
    JCPCellPainter cellPainter;

    private int currentSelected;

    private Runnable dblClickHook;

    public MoleculeTableViewer(Composite parent, int style) {

        cellPainter = new JCPCellPainter();

        DefaultNatTableModel model = new DefaultNatTableModel();

        IColumnHeaderLabelProvider columnHeaderLabelProvider = new IColumnHeaderLabelProvider() {

            public String getColumnHeaderLabel(int col) {
                List<Object> prop = getColumnHandler().getProperties();
                if (col == 0)
                    return "2D-structure";
                if (col < prop.size() + 1)
                    return prop.get(col - 1).toString();
                return "";
            }
        };

        DefaultRowHeaderConfig rowHeaderConfig = new DefaultRowHeaderConfig();
        rowHeaderConfig.setRowHeaderColumnCount(1);
        SizeConfig rowHeaderColumnWidthConfig = new SizeConfig();
        rowHeaderColumnWidthConfig.setDefaultSize(STRUCTURE_COLUMN_WIDTH / 3);
        //              columnWidthConfig.setDefaultSize(150);
        rowHeaderColumnWidthConfig.setDefaultResizable(true);
        rowHeaderColumnWidthConfig.setIndexResizable(1, true);
        rowHeaderConfig.setRowHeaderColumnWidthConfig(rowHeaderColumnWidthConfig);

        DefaultBodyConfig bodyConfig = new DefaultBodyConfig(new IDataProvider() {

            public int getColumnCount() {
                if (getDataProvider() == null)
                    return 0;
                return getDataProvider().getColumnCount();
            }

            public int getRowCount() {
                if (getDataProvider() == null)
                    return 0;
                return getDataProvider().getRowCount() + 1;
            }

            public Object getValue(int row, int col) {
                if (getDataProvider() == null)
                    return null;
                return getDataProvider().getValue(row, col);
            }

        });

        bodyConfig.setCellRenderer(new AbstractCellRenderer() {

            ICellPainter textPainter = new TextCellPainter();

            DefaultStyleConfig selectedStyle = new DefaultStyleConfig(ICellPainter.COLOR_LIST_SELECTION,
                    GUIHelper.COLOR_WHITE, null, null);

            @Override
            public IStyleConfig getStyleConfig(String displayMode, int row, int col) {
                if (DisplayModeEnum.SELECT.name().equals(displayMode)) {
                    return selectedStyle;
                }
                return super.getStyleConfig(displayMode, row, col);
            }

            @Override
            public ICellPainter getCellPainter(int row, int col) {

                if (col == 0)
                    return cellPainter;
                return textPainter;
            }

            public String getDisplayText(int row, int col) {

                return getDataProvider().getValue(row, col).toString();
            }

            public Object getValue(int row, int col) {

                return getDataProvider().getValue(row, col);
            }

        });

        model.setBodyConfig(bodyConfig);
        model.setRowHeaderConfig(rowHeaderConfig);
        model.setColumnHeaderConfig(new DefaultColumnHeaderConfig(columnHeaderLabelProvider));

        model.setSingleCellSelection(false);
        model.setMultipleSelection(true);
        //        model.setMultipleSelection( true );
        //        model.

        SizeConfig columnWidthConfig = model.getBodyConfig().getColumnWidthConfig();
        columnWidthConfig.setDefaultSize(STRUCTURE_COLUMN_WIDTH / 2);
        columnWidthConfig.setInitialSize(0, STRUCTURE_COLUMN_WIDTH);
        //              columnWidthConfig.setDefaultSize(150);
        columnWidthConfig.setDefaultResizable(true);
        columnWidthConfig.setIndexResizable(1, true);

        // Row heights
        SizeConfig rowHeightConfig = model.getBodyConfig().getRowHeightConfig();
        rowHeightConfig.setDefaultSize(STRUCTURE_COLUMN_WIDTH);
        rowHeightConfig.setDefaultResizable(true);
        //                rowHeightConfig.setIndexResizable(1, false);

        // NatTable
        table = new NatTable(parent,
                SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED | SWT.V_SCROLL | SWT.H_SCROLL,
                model);

        EventBindingSupport eventBindingSupport = table.getEventBindingSupport();
        eventBindingSupport.registerSingleClickBinding(
                new MouseEventMatcher(SWT.COMMAND, GridRegionEnum.BODY.toString(), 1),
                new SelectCellAction(table, false, true));

        Listener listener = new Listener() {

            public void handleEvent(Event event) {

                switch (event.type) {
                case SWT.MouseDoubleClick:
                    doubleClickHook();
                    break;
                case SWT.SELECTED:
                case SWT.MouseUp:
                    updateSelection(getSelection());
                }
            }
        };
        table.addListener(SWT.SELECTED, listener);
        table.addListener(SWT.MouseUp, listener);
        table.addListener(SWT.MouseDoubleClick, listener);
        ScrollBar vSb = table.getVerticalBar();
        vSb.setIncrement(1);
        vSb.setPageIncrement(1);
        table.scrollVBarUpdate(vSb);
    }

    @Override
    public Control getControl() {

        return table;
    }

    public static class MolTableElement implements IAdaptable {

        final IMoleculesEditorModel model;
        final int index;

        CDKMoleculePropertySource pSource;

        public MolTableElement(int index, IMoleculesEditorModel model) {
            this.model = model;
            this.index = index;
        }

        @SuppressWarnings("unchecked")
        public Object getAdapter(Class adapter) {

            if (adapter.isAssignableFrom(ICDKMolecule.class)) {
                return model.getMoleculeAt(index);
            }
            if (adapter.isAssignableFrom(IPropertySource.class)) {
                ICDKMolecule mol = model.getMoleculeAt(index);
                if (mol instanceof CDKMolecule) {
                    if (pSource == null)
                        pSource = new CDKMoleculePropertySource((CDKMolecule) mol);
                    return pSource;
                } else
                    return null;
            }
            return Platform.getAdapterManager().getAdapter(this, adapter);
        }
    }

    public static class MolTableSelection implements ISelection, IAdaptable {

        IMoleculesEditorModel model;
        int[] selection;

        public MolTableSelection(int[] selection, IMoleculesEditorModel model) {
            this.selection = selection;
            this.model = model;
        }

        public boolean isEmpty() {
            return selection.length == 0;
        }

        @SuppressWarnings("unchecked")
        public Object getAdapter(Class adapter) {

            if (adapter.isAssignableFrom(IMoleculesEditorModel.class)) {
                final IMoleculesEditorModel editorModel = new IMoleculesEditorModel() {

                    public ICDKMolecule getMoleculeAt(int index) {
                        return model.getMoleculeAt(selection[index]);
                    }

                    public int getNumberOfMolecules() {
                        return selection.length;
                    }

                    public void markDirty(int index, ICDKMolecule moleculeToSave) {

                        throw new UnsupportedOperationException();

                    }

                    public void save() {
                        throw new UnsupportedOperationException();
                    }

                };
                return editorModel;
            }
            return null;
        }
    }

    @Override
    public ISelection getSelection() {

        if (getContentProvider() instanceof MoleculeTableContentProvider) {

            int[] selected = table.getSelectionModel().getSelectedRows();
            int max = getDataProvider().getRowCount();

            if (selected.length == 0) {
                currentSelected = -1;
                return StructuredSelection.EMPTY;
            }
            currentSelected = selected[0];

            IMoleculesEditorModel model;
            if (getInput() instanceof IMoleculesEditorModel) {
                model = (IMoleculesEditorModel) getInput();
                if (selected.length == 1) {
                    return new StructuredSelection(new MolTableElement(selected[0], model));
                } else {

                    return new StructuredSelection(new MolTableSelection(selected, model));
                }
            }
        }

        return StructuredSelection.EMPTY;
    }

    private IDataProvider getDataProvider() {
        return (IDataProvider) getContentProvider();
    }

    private IMoleculeTableColumnHandler getColumnHandler() {
        return (IMoleculeTableColumnHandler) getContentProvider();
    }

    @Override
    public void refresh() {
        if (!table.isDisposed()) {
            table.reset();
            table.redraw();
            table.updateResize();
            table.update();
        }
    }

    @Override
    public void setSelection(ISelection selection, boolean reveal) {

        // TODO Auto-generated method stub

    }

    IRenderer2DConfigurator getRenderer2DConfigurator() {
        return cellPainter.getRenderer2DConfigurator();
    }

    void setRenderer2DConfigurator(IRenderer2DConfigurator renderer2DConfigurator) {
        cellPainter.setRenderer2DConfigurator(renderer2DConfigurator);
    }

    protected void updateSelection(ISelection selection) {
        SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
        fireSelectionChanged(event);
    }

    public int getFirstSelected() {

        return currentSelected;
    }

    public void setDoubleClickHook(Runnable hook) {
        dblClickHook = hook;
    }

    protected void doubleClickHook() {
        if (dblClickHook != null) {
            dblClickHook.run();
        }
    }
}