/* * Copyright (c) 2014. Matthew Campbell <matthew.campbell@mq.edu.au>, David R. Damerell <david@nixbioinf.org>. * * This file is part of GlycanBuilder Vaadin Release and its affliated projects EUROCarbDB, UniCarb-DB and UniCarbKB. * * This program is free software free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GlycanBuilder Vaadin Release 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 (LICENSE.txt) for more details. * * You should have received a copy of the GNU General Public License * along with GlycanBuilder Vaadin Release. If not, see <http ://www.gnu.org/licenses/>. */ package ac.uk.icl.dell.vaadin.glycanbuilder; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eurocarbdb.application.glycanbuilder.Glycan; import org.eurocarbdb.application.glycanbuilder.MassOptions; import com.vaadin.data.Property; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.ui.AbstractSelect; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CheckBox; import com.vaadin.ui.GridLayout; import com.vaadin.ui.Label; import com.vaadin.ui.NativeButton; import com.vaadin.ui.NativeSelect; import com.vaadin.ui.Panel; import com.vaadin.ui.TextField; public class MassOptionsDialog extends Panel implements MassOptionsConfigurator.MassInput{ private static final long serialVersionUID=8707959087794407560L; GridLayout layout=new GridLayout(3,15); Collection<Glycan> glycans; public MassOptionsDialog(Collection<Glycan> glycans, MassOptions massOptions){ setContent(layout); this.glycans=glycans; config = new MassOptionsConfigurator(glycans, massOptions, this); layout.setSpacing(true); layout.setMargin(true); } @Override public String getReducingEnd() { return (String) reducingEndSelect.getValue(); } @Override public String getOtherName() { return (String) otherNameField.getValue(); } @Override public String getOtherMass() { return (String) otherMassField.getValue(); } @Override public String getIsotope() { return (String) isotopeSelect.getValue(); } @Override public String getDerivatization() { return (String) derivatizationSelect.getValue(); } @Override public boolean isNegativeMode() { return (Boolean) negativeModeField.getValue(); } @Override public int getHIonCount() { return MassOptionsDialog.getValueAsInt(hIonCountSelect); } @Override public int getNAIonCount() { return MassOptionsDialog.getValueAsInt(naIonCountSelect); } @Override public int getLIIonCount() { return MassOptionsDialog.getValueAsInt(liIonCountSelect); } @Override public int getKIonCount() { return MassOptionsDialog.getValueAsInt(kIonCountSelect); } @Override public int getexNAIonCount() { return MassOptionsDialog.getValueAsInt(exNAIonCountSelect); } @Override public int getexLIIonCount() { return MassOptionsDialog.getValueAsInt(exLIIonCountSelect); } @Override public int getexKIonCount() { return MassOptionsDialog.getValueAsInt(exKIonCountSelect); } @Override public void setIsotopValues(String[] list) { addAllItems(isotopeSelect,list); } @Override public void setDerivatizationValues(String[] list) { addAllItems(derivatizationSelect,list); } @Override public void setReducingEndValues(String[] list) { addAllItems(reducingEndSelect,list); } @Override public void setHIonRange(Object[] list) { addAllItems(hIonCountSelect,list); } @Override public void setNAIonRange(Object[] list) { addAllItems(naIonCountSelect,list); } @Override public void setLIIonRange(Object[] list) { addAllItems(liIonCountSelect,list); } @Override public void setKIonRange(Object[] list) { addAllItems(kIonCountSelect,list); } @Override public void setexNAIonRange(Object[] list) { addAllItems(exNAIonCountSelect,list); } @Override public void setexLIIonRange(Object[] list) { addAllItems(exLIIonCountSelect,list); } @Override public void setexKIonRange(Object[] list) { addAllItems(exKIonCountSelect,list); } @Override public void setSelectedIsotope(String isotope) { isotopeSelect.setValue(isotope); } @Override public void setSelectedDerivatization(String derivatization) { derivatizationSelect.setValue(derivatization); } @Override public void setSelectedReducingEnd(String reducingEnd) { reducingEndSelect.setValue(reducingEnd); } @Override public void setOtherName(String otherName) { otherNameField.setValue(otherName); } @Override public void setOtherMass(String otherMass) { otherMassField.setValue(otherMass); } @Override public void setNegativeMode(boolean isNegative) { negativeModeField.setValue(isNegative); } @Override public void setHIonCount(int count) { hIonCountSelect.setValue(count); } @Override public void setNAIonCount(int count) { naIonCountSelect.setValue(count); } @Override public void setLIIonCount(int count) { liIonCountSelect.setValue(count); } @Override public void setKIonCount(int count) { kIonCountSelect.setValue(count); } @Override public void setexNAIonCount(int count) { exNAIonCountSelect.setValue(count); } @Override public void setexLIIonCount(int count) { exLIIonCountSelect.setValue(count); } @Override public void setexKIonCount(int count) { exKIonCountSelect.setValue(count); } @Override public void enableIsotopField(boolean enable) { isotopeSelect.setEnabled(enable); } @Override public void enableOtherMassField(boolean enable) { otherMassField.setEnabled(enable); } @Override public void enableOtherNameField(boolean enable) { otherNameField.setEnabled(enable); } NativeSelect isotopeSelect; NativeSelect derivatizationSelect; NativeSelect reducingEndSelect; TextField otherNameField; TextField otherMassField; CheckBox negativeModeField; NativeSelect hIonCountSelect, exHIonCountSelect; NativeSelect naIonCountSelect, exNAIonCountSelect; NativeSelect liIonCountSelect, exLIIonCountSelect; NativeSelect kIonCountSelect, exKIonCountSelect; NativeSelect clIonCountSelect, exClIonCountSelect; NativeSelect h2po4IonCountSelect, exH2po4IonCountSelect; private MassOptionsConfigurator config; @Override public void initComponents() { isotopeSelect=new NativeSelect(); isotopeSelect.addStyleName("igg-mass-options-panel-item"); isotopeSelect.setNullSelectionAllowed(false); isotopeSelect.setNewItemsAllowed(false); isotopeSelect.setWidth("120px"); derivatizationSelect=new NativeSelect(); derivatizationSelect.addStyleName("igg-mass-options-panel-item"); derivatizationSelect.setNullSelectionAllowed(false); derivatizationSelect.setNewItemsAllowed(false); derivatizationSelect.setWidth("120px"); reducingEndSelect=new NativeSelect(); reducingEndSelect.addStyleName("igg-mass-options-panel-item"); reducingEndSelect.setNullSelectionAllowed(false); reducingEndSelect.setImmediate(true); reducingEndSelect.setNewItemsAllowed(false); reducingEndSelect.setWidth("120px"); reducingEndSelect.addValueChangeListener(new Property.ValueChangeListener() { private static final long serialVersionUID=1067195208212460144L; @Override public void valueChange(ValueChangeEvent event) { if(((String)reducingEndSelect.getValue()).equals("Other...")){ otherNameField.setEnabled(true); otherMassField.setEnabled(true); }else{ otherNameField.setEnabled(false); otherMassField.setEnabled(false); } } }); otherNameField=new TextField(); otherNameField.addStyleName("igg-mass-options-panel-item"); otherNameField.setWidth("120px"); otherMassField=new TextField(); otherMassField.addStyleName("igg-mass-options-panel-item"); otherMassField.setWidth("120px"); negativeModeField=new CheckBox(); negativeModeField.addStyleName("igg-mass-options-panel-item"); hIonCountSelect=new NativeSelect("#H ions"); hIonCountSelect.addStyleName("igg-mass-options-panel-item"); hIonCountSelect.setNewItemsAllowed(false); hIonCountSelect.setWidth("120px"); naIonCountSelect=new NativeSelect("#Na ions"); naIonCountSelect.addStyleName("igg-mass-options-panel-item"); naIonCountSelect.setNewItemsAllowed(false); naIonCountSelect.setWidth("120px"); exNAIonCountSelect=new NativeSelect("ext. #Na ions"); exNAIonCountSelect.addStyleName("igg-mass-options-panel-item"); exNAIonCountSelect.setNewItemsAllowed(false); exNAIonCountSelect.setWidth("120px"); liIonCountSelect=new NativeSelect("#Li ions"); liIonCountSelect.addStyleName("igg-mass-options-panel-item"); liIonCountSelect.setNewItemsAllowed(false); liIonCountSelect.setWidth("120px"); exLIIonCountSelect=new NativeSelect("ext. #Li ions"); exLIIonCountSelect.addStyleName("igg-mass-options-panel-item"); exLIIonCountSelect.setNewItemsAllowed(false); exLIIonCountSelect.setWidth("120px"); kIonCountSelect=new NativeSelect("#K ions"); kIonCountSelect.addStyleName("igg-mass-options-panel-item"); kIonCountSelect.setNewItemsAllowed(false); kIonCountSelect.setWidth("120px"); exKIonCountSelect=new NativeSelect("ext. #K ions"); exKIonCountSelect.addStyleName("igg-mass-options-panel-item"); exKIonCountSelect.setNewItemsAllowed(false); exKIonCountSelect.setWidth("120px"); clIonCountSelect=new NativeSelect("#Cl ions"); clIonCountSelect.addStyleName("igg-mass-options-panel-item"); clIonCountSelect.setNewItemsAllowed(false); clIonCountSelect.setWidth("120px"); exClIonCountSelect=new NativeSelect("ext. #Cl ions"); exClIonCountSelect.addStyleName("igg-mass-options-panel-item"); exClIonCountSelect.setNewItemsAllowed(false); exClIonCountSelect.setWidth("120px"); h2po4IonCountSelect=new NativeSelect("#H2PO4 ions"); h2po4IonCountSelect.addStyleName("igg-mass-options-panel-item"); h2po4IonCountSelect.setNewItemsAllowed(false); h2po4IonCountSelect.setWidth("120px"); exH2po4IonCountSelect=new NativeSelect("ext. #H2PO4 ions"); exH2po4IonCountSelect.addStyleName("igg-mass-options-panel-item"); exH2po4IonCountSelect.setNewItemsAllowed(false); exH2po4IonCountSelect.setWidth("120px"); //column,row layout.addComponent(new Label("Isotope"),0,0,0,0); layout.addComponent(isotopeSelect,1,0,1,0); layout.addComponent(new Label("Derivatization"),0,1,0,1); layout.addComponent(derivatizationSelect,1,1,1,1); layout.addComponent(new Label("Reducing end"),0,2,0,2); layout.addComponent(reducingEndSelect,1,2,1,2); { Label nameLabel=new Label("name"); nameLabel.setWidth("40px"); layout.addComponent(nameLabel,1,3,1,3); layout.addComponent(otherNameField,2,3,2,3); layout.setComponentAlignment(nameLabel, Alignment.MIDDLE_RIGHT); } { Label massLabel=new Label("mass"); massLabel.setWidth("40px"); layout.addComponent(massLabel,1,4,1,4); layout.addComponent(otherMassField,2,4,2,4); layout.setComponentAlignment(massLabel, Alignment.MIDDLE_RIGHT); } int row=5; { Label divider=new Label("<hr/>", ContentMode.HTML); layout.addComponent(divider,0,row,2,row++); } layout.addComponent(new Label("Negative mode"),0,row,0,row); layout.addComponent(negativeModeField,1,row,1,row++); layout.addComponent(hIonCountSelect,0,row,0,row++); layout.addComponent(naIonCountSelect,0,row,0,row); layout.addComponent(exNAIonCountSelect,1,row,1,row++); layout.addComponent(liIonCountSelect,0,row,0,row); layout.addComponent(exLIIonCountSelect,1,row,1,row++); layout.addComponent(kIonCountSelect,0,row,0,row); layout.addComponent(exKIonCountSelect,1,row,1,row++); { Label divider=new Label("<hr/>", ContentMode.HTML); layout.addComponent(divider,0,row,2,row++); } layout.addComponent(clIonCountSelect,0,row,0,row); layout.addComponent(exClIonCountSelect,1,row,1,row++); layout.addComponent(h2po4IonCountSelect,0,row,0,row); layout.addComponent(exH2po4IonCountSelect,1,row,1,row++); NativeButton update=new NativeButton("Apply mass options"); update.addClickListener(new ClickListener(){ private static final long serialVersionUID=-6188200798103156691L; @Override public void buttonClick(ClickEvent event) { try { config.retrieveData(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } fireMassOptionsChanged(config.getMassOptions(),glycans); } }); layout.addComponent(update,0,row,0,row); } public void addAllItems(AbstractSelect select,Object [] objects){ for(Object obj:objects){ select.addItem(obj); } } public static int getValueAsInt(AbstractSelect select){ return (Integer) select.getValue(); } public interface MassOptionListener { public void massOptions(MassOptions massOptions,Collection<Glycan> structures); } List<MassOptionListener> massOptionListeners=new ArrayList<MassOptionListener>(); public void addMassOptionListener(MassOptionListener listener){ massOptionListeners.add(listener); } public void removeMassOptionListener(MassOptionListener listener){ massOptionListeners.remove(listener); } public void fireMassOptionsChanged(MassOptions massOptions,Collection<Glycan> structures){ for(MassOptionListener listener:massOptionListeners){ listener.massOptions(massOptions,structures); } } @Override public int getCLIonCount() { return MassOptionsDialog.getValueAsInt(clIonCountSelect); } @Override public int getexCLIonCount() { return MassOptionsDialog.getValueAsInt(exClIonCountSelect); } @Override public void setCLIonRange(Object[] list) { addAllItems(clIonCountSelect,list); } @Override public void setexCLIonRange(Object[] list) { addAllItems(exClIonCountSelect,list); } @Override public void setCLIonCount(int count) { clIonCountSelect.setValue(count); } @Override public void setexCLIonCount(int count) { exClIonCountSelect.setValue(count); } @Override public int getH2PO4IonCount() { return MassOptionsDialog.getValueAsInt(h2po4IonCountSelect); } @Override public int getexH2PO4IonCount() { return MassOptionsDialog.getValueAsInt(exH2po4IonCountSelect); } @Override public void setH2PO4IonRange(Object[] list) { addAllItems(h2po4IonCountSelect,list); } @Override public void setexH2PO4IonRange(Object[] list) { addAllItems(exH2po4IonCountSelect,list); } @Override public void setH2PO4IonCount(int count) { h2po4IonCountSelect.setValue(count); } @Override public void setexH2PO4IonCount(int count) { exH2po4IonCountSelect.setValue(count); } }