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

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (c) 2008 The Bioclipse Project and others.
 * 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>.
 *
 * Contributors:
 *      Arvid Berg
 *
 *
 ******************************************************************************/
package net.bioclipse.cdk.ui.sdfeditor.editor;

import java.awt.geom.Rectangle2D;
import java.awt.geom.Rectangle2D.Double;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

import javax.vecmath.Point2d;
import javax.vecmath.Point3d;

import net.bioclipse.cdk.business.Activator;
import net.bioclipse.cdk.domain.ICDKMolecule;
import net.bioclipse.cdk.domain.SDFElement;
import net.bioclipse.cdk.jchempaint.view.SWTFontManager;
import net.bioclipse.cdk.jchempaint.view.SWTRenderer;

import org.apache.log4j.Logger;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.progress.PendingUpdateAdapter;
import org.openscience.cdk.geometry.GeometryTools;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.renderer.Renderer;
import org.openscience.cdk.renderer.RendererModel;
import org.openscience.cdk.renderer.font.IFontManager;
import org.openscience.cdk.renderer.generators.BasicAtomGenerator;
import org.openscience.cdk.renderer.generators.BasicBondGenerator;
import org.openscience.cdk.renderer.generators.HighlightAtomGenerator;
import org.openscience.cdk.renderer.generators.HighlightBondGenerator;
import org.openscience.cdk.renderer.generators.IGenerator;
import org.openscience.cdk.renderer.generators.RingGenerator;

public class MoleculesEditorLabelProvider implements ITableLabelProvider {

    public Logger logger = Logger.getLogger(MoleculesEditorLabelProvider.class);
    public List<String> propertyHeaders;
    public Renderer renderer;
    public int imageWidth;
    private IRenderer2DConfigurator renderer2DConfigurator;
    Color greenScreen;
    Color generatedColor;
    Font generatedFont;

    Collection<ILabelProviderListener> listeners = new HashSet<ILabelProviderListener>();
    private Double imageBounds;
    private Image tempImage;
    private Rectangle imageBoundsSWT;

    public MoleculesEditorLabelProvider(int width) {

        imageWidth = width;
        setupRenderer();
    }

    public IRenderer2DConfigurator getRenderer2DConfigurator() {
        return renderer2DConfigurator;
    }

    public void setRenderer2DConfigurator(IRenderer2DConfigurator renderer2DConfigurator) {
        this.renderer2DConfigurator = renderer2DConfigurator;
    }

    public void setPropertyHeaders(List<String> headers) {
        propertyHeaders = headers;
    }

    private void setupRenderer() {

        IFontManager fontManager = new SWTFontManager(Display.getCurrent());

        List<IGenerator> generators = new ArrayList<IGenerator>();
        generators.add(new BasicBondGenerator());
        generators.add(new BasicAtomGenerator());
        generators.add(new RingGenerator());
        generators.add(new HighlightAtomGenerator());
        generators.add(new HighlightBondGenerator());

        renderer = new Renderer(generators, fontManager);

        RendererModel rModel = renderer.getRenderer2DModel();
        rModel.setDrawNumbers(false);
        rModel.setIsCompact(true);
        //        rModel.setUseAntiAliasing(true );

        rModel.setShowExplicitHydrogens(false);
        rModel.setBackColor(new java.awt.Color(252, 253, 254));
        rModel.setFitToScreen(true);

        greenScreen = new Color(Display.getCurrent(), 252, 253, 254);
        generatedColor = new Color(Display.getCurrent(), 200, 100, 100);
        generatedFont = new Font(Display.getCurrent(), "Arial", 16, SWT.BOLD);
        imageBounds = new Rectangle2D.Double(0, 0, imageWidth, imageWidth);
        tempImage = new Image(Display.getDefault(), imageWidth, imageWidth);
        imageBoundsSWT = tempImage.getBounds();

    }

    private boolean retriveAtomContainer(IAdaptable element, IAtomContainer[] result) {

        Assert.isTrue(result != null && result.length > 0);
        ICDKMolecule mol = (ICDKMolecule) element.getAdapter(ICDKMolecule.class);
        if (mol == null)
            return false;

        // If no 2D coordinates
        if (!GeometryTools.has2DCoordinates(mol.getAtomContainer())) {
            // Test if 3D coordinates
            IAtomContainer generatedAC = null;
            try {

                generatedAC = ((ICDKMolecule) Activator.getDefault().getJavaCDKManager().generate2dCoordinates(mol))
                        .getAtomContainer();
                result[0] = generatedAC;
            } catch (Exception e) {
                logger.info("Failed to generate 2D-coordinates");
            }
            return true;
        } else
            result[0] = mol.getAtomContainer();
        return false;
    }

    public Image getColumnImage(Object element, int columnIndex) {
        boolean generated = false;

        if (columnIndex == 1 && element instanceof IAdaptable) {

            IAtomContainer[] acArray = new IAtomContainer[1];
            generated = retriveAtomContainer((IAdaptable) element, acArray);
            if (acArray[0] == null)
                return null;

            //            if (renderer2DConfigurator!=null){
            //                renderer2DConfigurator.configure( renderer.getRenderer2DModel(),
            //                                                  mol );
            //            }

            GC gc = new GC(tempImage);

            gc.setBackground(generatedColor);
            gc.fillRectangle(imageBoundsSWT);

            if (generated) {
                gc.setFont(generatedFont);
                int h = imageBoundsSWT.height - gc.getFontMetrics().getHeight();
                gc.setForeground(generatedColor);
                gc.drawText("Generated", 0, h);
            }

            SWTRenderer drawVisitor = new SWTRenderer(gc);
            renderer.paintMolecule(acArray[0], drawVisitor, imageBounds, true);
            gc.dispose();

            ImageData imageData = tempImage.getImageData();
            imageData.transparentPixel = imageData.palette.getPixel(greenScreen.getRGB());
            return new Image(Display.getDefault(), imageData);
        }
        return null;
    }

    public String getColumnText(Object element, int columnIndex) {

        // offset the index to the properties so get(x) works
        int propertyindex = columnIndex - 2;
        String text = null;
        if (columnIndex == 0 && element instanceof PendingUpdateAdapter) {
            return "Pending...";
        }
        if (element instanceof IAdaptable) {
            IAdaptable row = (IAdaptable) element;
            ICDKMolecule molecule = (ICDKMolecule) row.getAdapter(ICDKMolecule.class);

            // if(propertyHeaders==null && molecule!=null)
            // createPropertyHeaders( molecule.getAtomContainer());

            switch (columnIndex) {
            case 0:
                if (row instanceof SDFElement)
                    text = Integer.toString(((SDFElement) row).getNumber());
                else
                    text = "NA";//text = Integer.toString( row.getNumber() );
                break;
            case 1:
                // text = Long.toString(row.getPosition());
                break;
            default:
                if (molecule == null || propertyindex >= propertyHeaders.size())
                    return null;
                IAtomContainer atomContainer = molecule.getAtomContainer();
                Object o = atomContainer.getProperty(propertyHeaders.get(propertyindex));
                text = (o != null ? o.toString() : null);
            }
        }
        return text;
    }

    public void addListener(ILabelProviderListener listener) {

        listeners.add(listener);
    }

    public void dispose() {
        greenScreen.dispose();
        generatedColor.dispose();
        generatedFont.dispose();
        tempImage.dispose();
        listeners.clear();
    }

    public boolean isLabelProperty(Object element, String property) {

        // TODO Auto-generated method stub
        return false;
    }

    public void removeListener(ILabelProviderListener listener) {

        listeners.remove(listener);
    }

    /*
     * Utility method for copying 3D x,y to 2D coordinates
     */
    public static IAtomContainer generate2Dfrom3D(IAtomContainer atomContainer) {

        try {
            atomContainer = (IAtomContainer) atomContainer.clone();

            // For each molecule,
            for (int i = 0; i < atomContainer.getAtomCount(); i++) {
                IAtom atom = atomContainer.getAtom(i);
                Point3d p3 = atom.getPoint3d();
                Point2d p2 = new Point2d();
                p2.x = p3.x;
                p2.y = p3.y;
                atom.setPoint3d(null);
                atom.setPoint2d(p2);
            }
        } catch (CloneNotSupportedException e) {
            return null;
        }
        return atomContainer;
    }

}