package net.bioclipse.nmrshiftdb.wizards; import java.io.ByteArrayInputStream; import java.util.List; import java.util.Vector; import net.bioclipse.nmrshiftdb.util.Bc_nmrshiftdbConstants; import net.bioclipse.nmrshiftdb.util.NmrshiftdbUtils; import net.bioclipse.specmol.editor.SpecMolEditor; import net.bioclipse.spectrum.editor.MetadataUtils; import nu.xom.Elements; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; import org.openscience.cdk.ChemFile; import org.openscience.cdk.interfaces.IBond; import org.openscience.cdk.interfaces.IMolecule; import org.openscience.cdk.io.CMLReader; import org.openscience.cdk.smiles.SmilesGenerator; import org.xmlcml.cml.element.CMLBond; import org.xmlcml.cml.element.CMLCml; import org.xmlcml.cml.element.CMLMetadata; import org.xmlcml.cml.element.CMLMolecule; import org.xmlcml.cml.element.CMLSpectrum; /** * The "New" wizard page allows setting the container for the new file as well * as the file name. The page will only accept file name without the extension * OR with the extension that matches the expected one (cml). */ public class MessagePage extends WizardPage { private CMLCml cmlcml; Vector<Text> texts1=new Vector<Text>(); Vector<Text> texts2=new Vector<Text>(); Vector<Text> texts3=new Vector<Text>(); Vector<Text> texts4=new Vector<Text>(); Vector<Text> texts5=new Vector<Text>(); Vector<Text> texts6=new Vector<Text>(); Vector<Text> texts7=new Vector<Text>(); Vector<Button> selections=new Vector<Button>(); Text text1mol=null; Text text2mol=null; Text text3mol=null; Text text4mol=null; Vector<Button> doublebondconfigurations=new Vector<Button>(); private boolean allright=false; private Text textNucleus; public boolean isAllright() { return allright; } /** * Constructor for SampleNewWizardPage. * * @param pageName */ public MessagePage(CMLCml cmlcml) { super("MessagePage"); setTitle("Submit to NMRShiftDB wizard"); setDescription("Here you can check and change the conditions used for the NMRShiftDB submit. You can also enter these in the spectrum editor"); this.cmlcml=cmlcml; } /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { GridData gridData2 = new GridData(); gridData2.widthHint=400; Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 1; Elements spectra = cmlcml.getChildCMLElements("spectrum"); TabFolder folder = new TabFolder(container , SWT.NONE); TabItem tabitemmol = new TabItem(folder , SWT.NONE); Composite compositemol = new Composite(folder , SWT.NONE); tabitemmol.setControl(compositemol); tabitemmol.setText("Molecule"); GridLayout layoutmol = new GridLayout(); compositemol.setLayout(layoutmol); layoutmol.numColumns = 2; layoutmol.verticalSpacing = 9; Label label1mol=new Label(compositemol, SWT.NULL); label1mol.setText("Names (separated by ;):"); text1mol=new Text(compositemol,SWT.WRAP | SWT.BORDER); text1mol.setLayoutData(gridData2); text1mol.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); Label label3mol=new Label(compositemol, SWT.NULL); label3mol.setText("Keywords (separated by ;)"); text3mol=new Text(compositemol,SWT.WRAP | SWT.BORDER); text3mol.setLayoutData(gridData2); text3mol.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); StringBuffer keywords=new StringBuffer(); CMLMolecule molecule=((CMLMolecule)cmlcml.getChildCMLElements("molecule").get(0)); if(molecule.getChildCMLElements("metadataList").size()>0){ List<CMLMetadata> keywordmetadatas = MetadataUtils.getMetadataDescendantsByName(MetadataUtils.getAllInOneMetadataList(molecule).getMetadataDescendants(),"nmr:keyword"); for(int i=0;i<keywordmetadatas.size();i++){ keywords.append(keywordmetadatas.get(i).getContent()+"; "); } } keywords=NmrshiftdbUtils.removeLastComma(keywords); text3mol.setText(keywords.toString()); Label label4mol=new Label(compositemol, SWT.NULL); label4mol.setText("Weblinks to the structure, one per line and a comment, seperated by ;\r\nExample:\r\nwww.sample.org/sample;Mr. X's paper about this molecule\r\nwww.test.com;Also about this molecule)"); text4mol=new Text(compositemol,SWT.MULTI | SWT.BORDER); GridData gridData3 = new GridData(); gridData3.widthHint=400; gridData3.heightHint=100; text4mol.setLayoutData(gridData3); text4mol.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); StringBuffer links=new StringBuffer(); if(molecule.getChildCMLElements("metadataList").size()>0){ List<CMLMetadata> linkmetadatas = MetadataUtils.getMetadataDescendantsByName(MetadataUtils.getAllInOneMetadataList(molecule).getMetadataDescendants(),"nmr:link"); for(int i=0;i<linkmetadatas.size();i++){ links.append(linkmetadatas.get(i).getContent()+"\r\n"); } } links=NmrshiftdbUtils.removeLastComma(links); text4mol.setText(links.toString()); Label label2mol=new Label(compositemol, SWT.NULL); label2mol.setText("CAS number:"); text2mol=new Text(compositemol,SWT.WRAP | SWT.BORDER); text2mol.setLayoutData(gridData2); text2mol.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); StringBuffer names=new StringBuffer(); for(int i=0;i<molecule.getNameElements().size();i++){ if(molecule.getNameElements().get(i).getAttribute("convention")!=null && ((CMLMolecule)cmlcml.getChildCMLElements("molecule").get(0)).getNameElements().get(i).getAttribute("convention").getValue().equals("CAS")) text2mol.setText(molecule.getNameElements().get(i).getXMLContent()); else names.append(molecule.getNameElements().get(i).getXMLContent()+";"); } text1mol.setLayoutData(gridData2); text1mol.setText(names.toString()); //handle the double bond configurations Label doublebondLabel=new Label(compositemol, SWT.NULL); doublebondLabel.setText("Check if there is a valid double bond configuration round this bond"); GridData gdmol = new GridData(GridData.FILL_HORIZONTAL); gdmol.horizontalSpan = 2; doublebondLabel.setLayoutData(gdmol); try{ CMLReader cmlreader=new CMLReader(new ByteArrayInputStream(molecule.toXML().getBytes())); IMolecule cdkmol=((ChemFile)cmlreader.read(new ChemFile())).getChemSequence(0).getChemModel(0).getMoleculeSet().getMolecule(0); Iterable<IBond> bonds = cdkmol.bonds(); SmilesGenerator sg = new SmilesGenerator(); for(IBond cdkBond : bonds) { if (sg.isValidDoubleBondConfiguration(cdkmol, cdkBond)) { Button button=new Button(compositemol,SWT.CHECK); Label label=new Label(compositemol, SWT.NULL); label.setText((cdkmol.getAtomNumber(cdkBond.getAtom(0)) + 1) + " = " + (cdkmol.getAtomNumber(cdkBond.getAtom(1)) + 1)); doublebondconfigurations.add(button); CMLBond bond=molecule.getBond(molecule.getAtomById(cdkBond.getAtom(0).getID()), molecule.getAtomById(cdkBond.getAtom(1).getID())); if(bond.getFirstChildElement(Bc_nmrshiftdbConstants.doublebondconfiguration)!=null){ button.setSelection(true); } } } }catch(Exception ex){ System.err.println("Problems reading double bond configuration"); ex.printStackTrace(); } for(int h=0;h<spectra.size();h++){ CMLSpectrum spectrum=(CMLSpectrum)spectra.get(h); StringBuffer warning=new StringBuffer(); List<CMLMetadata> assignmentmetadatas = MetadataUtils.getMetadataDescendantsByName(MetadataUtils.getAllInOneMetadataList(spectrum).getMetadataDescendants(),Bc_nmrshiftdbConstants.assignment); if(assignmentmetadatas.size()>0){ List<CMLMetadata> nmridmetadatas = MetadataUtils.getMetadataDescendantsByName(MetadataUtils.getAllInOneMetadataList(spectrum).getMetadataDescendants(),Bc_nmrshiftdbConstants.nmrid); if(nmridmetadatas.size()>0) warning.append("This spectrum has already been submitted to NMRShiftDB (id: "+nmridmetadatas.get(0).getContent()+"). Your submit will be treated as an edit!"); } TabItem tabitem = new TabItem(folder , SWT.NONE); Composite composite = new Composite(folder , SWT.NONE); tabitem.setControl(composite); tabitem.setText("Spectrum "+spectrum.getId()); GridLayout layout2 = new GridLayout(); composite.setLayout(layout2); layout2.numColumns = 2; layout2.verticalSpacing = 9; Button selection = new Button(composite, SWT.CHECK); Label selectionlabel=new Label(composite, SWT.NULL); selectionlabel.setText("Include this spectrum in the submit"); selection.setSelection(true); selections.add(selection); Label warningLabel=new Label(composite, SWT.NULL); warningLabel.setText(warning.toString()); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; warningLabel.setLayoutData(gd); Label label1=new Label(composite, SWT.NULL); label1.setText("Frequency [Mhz] ("+Bc_nmrshiftdbConstants.frequency+"):"); Text text1=new Text(composite,SWT.WRAP | SWT.BORDER); text1.setLayoutData(gridData2); text1.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); text1.setText("Unreported"); if(spectrum.getConditionListElements().size()>0){ Elements els=spectrum.getConditionListElements().get(0).getChildCMLElements("scalar"); for(int i=0;i<els.size();i++){ if(els.get(i).getAttribute("dictRef")!=null && els.get(i).getAttribute("dictRef").getValue().equals(Bc_nmrshiftdbConstants.frequency)){ text1.setText(els.get(i).getValue().toString()); break; } } } Label label2=new Label(composite, SWT.NULL); label2.setText("Solvent ("+Bc_nmrshiftdbConstants.solvent+"):"); Text text2=new Text(composite,SWT.WRAP | SWT.BORDER); text2mol.setLayoutData(gridData2); text2.setText("Unreported"); text2.setLayoutData(gridData2); text2.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); if(spectrum.getConditionListElements().size()>0){ Elements els=spectrum.getConditionListElements().get(0).getChildCMLElements("scalar"); for(int i=0;i<els.size();i++){ if(els.get(i).getAttribute("dictRef")!=null && els.get(i).getAttribute("dictRef").getValue().equals(Bc_nmrshiftdbConstants.solvent)){ text2.setText(els.get(i).getValue().toString()); break; } } } Label label3=new Label(composite, SWT.NULL); label3.setText("Temperature [K]("+Bc_nmrshiftdbConstants.temperature+"):"); Text text3=new Text(composite,SWT.WRAP | SWT.BORDER); text3.setLayoutData(gridData2); text3.setText("Unreported"); text3.setLayoutData(gridData2); text3.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); if(spectrum.getConditionListElements().size()>0){ Elements els=spectrum.getConditionListElements().get(0).getChildCMLElements("scalar"); for(int i=0;i<els.size();i++){ if(els.get(i).getAttribute("dictRef")!=null && els.get(i).getAttribute("dictRef").getValue().equals(Bc_nmrshiftdbConstants.temperature)){ text3.setText(els.get(i).getValue().toString()); break; } } } Label label4=new Label(composite, SWT.NULL); label4.setText("Assignment method ("+Bc_nmrshiftdbConstants.assignment+"):"); Text text4=new Text(composite,SWT.WRAP | SWT.BORDER); text4.setLayoutData(gridData2); text4.setText("Unreported"); text4.setLayoutData(gridData2); text4.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); if(assignmentmetadatas.size()>0){ CMLMetadata metadata=assignmentmetadatas.get(0); text4.setText(metadata.getContent()); } Label label5=new Label(composite, SWT.NULL); label5.setText("Measured nucleus ("+SpecMolEditor.nucleus+"):"); textNucleus=new Text(composite,SWT.WRAP | SWT.BORDER); textNucleus.setLayoutData(gridData2); textNucleus.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); List<CMLMetadata> nucleusmetadatas = MetadataUtils.getMetadataDescendantsByName(MetadataUtils.getAllInOneMetadataList(spectrum).getMetadataDescendants(),SpecMolEditor.nucleus); if(nucleusmetadatas.size()>0){ CMLMetadata metadata=nucleusmetadatas.get(0); textNucleus.setText(metadata.getContent()); } textNucleus.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { checkForCompletion(true); } }); Label label6=new Label(composite, SWT.NULL); label6.setText("Categories (separated by ;)"); Text text6=new Text(composite,SWT.WRAP | SWT.BORDER); text6.setLayoutData(gridData2); text6.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); StringBuffer categories=new StringBuffer(); List<CMLMetadata> spectrumkeywordmetadatas = MetadataUtils.getMetadataDescendantsByName(MetadataUtils.getAllInOneMetadataList(spectrum).getMetadataDescendants(),"nmr:keyword"); for(int i=0;i<spectrumkeywordmetadatas.size();i++){ categories.append(spectrumkeywordmetadatas.get(i).getContent()+"; "); } categories=NmrshiftdbUtils.removeLastComma(categories); text6.setText(categories.toString()); Label label7=new Label(composite, SWT.NULL); label7.setText("Weblinks to the spectrum, one per line and a comment, seperated by ;\r\nExample:\r\nwww.sample.org/sample;Mr. X's paper about this molecule\r\nwww.test.com;Also about this molecule)"); Text text7=new Text(composite,SWT.MULTI | SWT.BORDER); text7.setLayoutData(gridData3); text7.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } } }); StringBuffer linksspec=new StringBuffer(); List<CMLMetadata> spectrumlinkmetadatas = MetadataUtils.getMetadataDescendantsByName(MetadataUtils.getAllInOneMetadataList(spectrum).getMetadataDescendants(),"nmr:link"); for(int i=0;i<spectrumlinkmetadatas.size();i++){ linksspec.append(spectrumlinkmetadatas.get(i).getContent()+"\r\n"); } linksspec=NmrshiftdbUtils.removeLastComma(linksspec); text7.setText(linksspec.toString()); texts1.add(text1); texts2.add(text2); texts3.add(text3); texts4.add(text4); texts5.add(textNucleus); texts6.add(text6); texts7.add(text7); } setControl(container); checkForCompletion(false); } public Vector<Text> getTexts1() { return texts1; } public Vector<Text> getTexts2() { return texts2; } public Vector<Text> getTexts3() { return texts3; } public Vector<Text> getTexts4() { return texts4; } public Vector<Text> getTexts5() { return texts5; } public Vector<Button> getSelections() { return selections; } /** * If page not complete, set error messages */ protected void checkForCompletion(boolean inoperation) { setErrorMessage(null); allright=true; if (textNucleus.getText() == null || textNucleus.getText().compareTo("") == 0){ this.setErrorMessage("Every spectrum needs to have a nucleus!"); allright=false; } if(allright){ this.setPageComplete(true); }else{ this.setPageComplete(false); } if(inoperation) getWizard().getContainer().updateButtons(); } }