/***************************************************************************** * Copyright (c) 2008 Bioclipse Project * 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 * *****************************************************************************/ package net.bioclipse.specmol.editor; import java.io.ByteArrayInputStream; import java.util.List; import net.bioclipse.cdk.jchempaint.widgets.JChemPaintEditorWidget; import net.bioclipse.specmol.listeners.SpecMolListener; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.openscience.cdk.DefaultChemObjectBuilder; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.interfaces.IAtomContainer; import org.openscience.cdk.interfaces.IChemFile; import org.openscience.cdk.interfaces.IChemModel; import org.openscience.cdk.io.CMLReader; import org.xmlcml.cml.base.CMLElement; /** * @author hel, Stefan Kuhn * */ public class SpecMolDrawingComposite extends Composite implements SpecMolListener{ private boolean ret; private JChemPaintEditorWidget drawingPanel; public JChemPaintEditorWidget getDrawingPanel() { return drawingPanel; } private AssignmentPage page; private IAtomContainer atomContainer; /** * Constructor * * @param Composite parent * @param int style * @param AssignmentPage page */ public SpecMolDrawingComposite(Composite parent, int style, AssignmentPage page) { super(parent, style); this.page = page; this.init(page); } /** * initializes the composite itself (creates drawingPanel and jcpModel..) * * @param AssignmentPage page */ private void init(AssignmentPage page) { this.setLayout(new FillLayout()); drawingPanel=new JChemPaintEditorWidget(this,SWT.NONE); IChemModel model = null; try { List<CMLElement> moleculeList = page.getCmlcml().getDescendants("molecule", null, true); String moleculestring=moleculeList.get(0).toXML(); CMLReader reader = new CMLReader(new ByteArrayInputStream(moleculestring.getBytes())); IChemFile chemfile = (IChemFile)reader.read(new org.openscience.cdk.ChemFile()); model=chemfile.getChemSequence(0).getChemModel(0); } catch (CDKException e) { throw new RuntimeException(e); } //TODO all input drawingPanel.setAtomContainer(model.getMoleculeSet().getAtomContainer(0) ); SelectByClickModule selectByClickModule=new SelectByClickModule(drawingPanel.getControllerHub(),page.getAssignmentController(),this); drawingPanel.setActiveDrawModule(selectByClickModule); this.atomContainer=model.getMoleculeSet().getAtomContainer(0) ; drawingPanel.addKeyListener(selectByClickModule); } public IAtomContainer getAtomContainer() { return atomContainer; } /* (non-Javadoc) * @see bc_specmol.listener.SpecMolListener#selectionChanged(bc_specmol.editors.AssignmentController) */ public void selectionChanged(AssignmentController controller) { IAtomContainer atomsAndBonds = controller.getSelectedSubstructure(); drawingPanel.getRenderer2DModel().getExternalSelectedPart().add(atomsAndBonds); drawingPanel.redraw(); } /** * get the assignment editor page * * @return AssignmentPage page */ public AssignmentPage getPage() { return page; } /** * deselect all selected atoms/bonds */ public void unselect() { drawingPanel.getRenderer2DModel().setExternalSelectedPart( DefaultChemObjectBuilder.getInstance().newInstance( IAtomContainer.class ) ); if (page.getAssignmentController().getSelectedSubstructure() != null) { page.getAssignmentController().getSelectedSubstructure().removeAllElements(); } } /* (non-Javadoc) * @see org.eclipse.swt.widgets.Composite#setFocus() */ @Override public boolean setFocus() { Display.getDefault().syncExec(new Runnable() { public void run() { ret = SpecMolDrawingComposite.super.setFocus(); } }); return ret; } }