All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.biojava.nbio.structure.align.gui.ParameterGUI Maven / Gradle / Ivy

/*
 *                    BioJava development code
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  If you do not have a copy,
 * see:
 *
 *      http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual
 * authors.  These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims,
 * or to join the biojava-l mailing list, visit the home page
 * at:
 *
 *      http://www.biojava.org/
 *
 */
package org.biojava.nbio.structure.align.gui;

import org.biojava.nbio.structure.align.ce.ConfigStrucAligParams;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * UI for {@link ConfigStrucAligParams}, for the AlignmentGUI.
 *
 * Visually parameters are displayed as a label and an input field such as a text box.
 * The following methods are used to determine which properties are accessible:
 * 
    *
  • {@link ConfigStrucAligParams#getUserConfigParameterNames() getUserConfigParameterNames()} * Parameter labels *
  • {@link ConfigStrucAligParams#getUserConfigParameters() getUserConfigParameters()} * Parameter method names, to be prepended with 'set' or 'get' *
  • {@link ConfigStrucAligParams#getUserConfigTypes() getUserConfigTypes()} * Types for each parameter (Integer, Float, Boolean, Enum, String[]) *
  • {@link ConfigStrucAligParams#getUserConfigHelp() getUserConfigHelp()} * Alt text for each parameter *
* * @author Andreas Prlic * */ public class ParameterGUI extends JFrame{ private static final long serialVersionUID = 723386061184110161L; private ConfigStrucAligParams params ; private List textFields; /** * Constructor for a ParameterGUI. Generalization for any type of * Structural Alignment algorithm that implements the parameter interface. * * @param params parameter bean * @param algorithm name of the algorithm */ @SuppressWarnings("rawtypes") public ParameterGUI(ConfigStrucAligParams params, String algorithm) { if (params == null) return; this.params = params; this.setTitle("Parameters for " + algorithm); List names = params.getUserConfigParameterNames(); List keys = params.getUserConfigParameters(); List types = params.getUserConfigTypes(); List helps = params.getUserConfigHelp(); // quick check for bugs in params assert(names.size() == keys.size()); assert(names.size() == types.size()); assert(names.size() == helps.size()); textFields = new ArrayList(); Box vBox = Box.createVerticalBox(); for (int i = 0 ; i < keys.size(); i++){ Class type = types.get(i); Box hBox = Box.createHorizontalBox(); String name = names.get(i); JLabel label = new JLabel(name); String help = helps.get(i); label.setToolTipText(help); String key = keys.get(i); Object value = getValue(key); String data = value.toString(); Component field; if ( type.isEnum() ) { Object[] values = type.getEnumConstants(); JComboBox jcbox = new JComboBox(values); jcbox.setSelectedItem(value); field = jcbox; } else if ( type == Boolean.class){ String[] values = new String[]{"true","false"}; JComboBox jcbox = new JComboBox(values); if ( data.equalsIgnoreCase("false")) jcbox.setSelectedIndex(1); else jcbox.setSelectedIndex(0); field = jcbox; //field.setToolTipText(help); } else { JTextField tfield = new JTextField(10); if ( type == String[].class) { String stuff = ""; for ( String da : (String[]) value){ stuff += da + " "; } data = stuff; } tfield.setText(data); tfield.setToolTipText(help); field = tfield; } hBox.add(label); hBox.add(Box.createGlue()); hBox.add(field); vBox.add(hBox); textFields.add(field); } JButton abort = new JButton("Cancel"); abort.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent event) { destroy(); dispose(); } }); JButton defaultB = new JButton("Default"); defaultB.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent event) { setDefault(); } }); JButton close = new JButton("Apply"); close.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent event) { storeParameters(); destroy(); dispose(); } }); Box hBox = Box.createHorizontalBox(); hBox.add(abort); hBox.add(Box.createGlue()); hBox.add(defaultB); hBox.add(Box.createGlue()); hBox.add(close); vBox.add(hBox); this.getContentPane().add(vBox); this.pack(); this.setVisible(true); } @SuppressWarnings({ "rawtypes" }) protected void setDefault() { params.reset(); List keys = params.getUserConfigParameters(); List types = params.getUserConfigTypes(); //List names = params.getUserConfigParameterNames(); for (int i = 0 ; i < keys.size(); i++){ Class type = types.get(i); Object data = getValue(keys.get(i)); if( type.isEnum()) { JComboBox field = (JComboBox) textFields.get(i); field.setSelectedItem(data); field.updateUI(); } else if ( type == Boolean.class){ JComboBox field = (JComboBox) textFields.get(i); if ( data.toString().equalsIgnoreCase("false")) field.setSelectedIndex(1); else field.setSelectedIndex(0); field.updateUI(); } else { JTextField field = (JTextField)textFields.get(i); if ( type.isArray()){ String stuff = ""; for ( String da : (String[]) data){ stuff += da + " "; } field.setText(stuff); } else { field.setText(data.toString()); } field.updateUI(); } } this.repaint(); } private void destroy(){ //avoid memory leaks... textFields = null; params = null; } @SuppressWarnings("rawtypes") protected void storeParameters() { //List names = params.getUserConfigParameterNames(); List keys = params.getUserConfigParameters(); List types = params.getUserConfigTypes(); for (int i = 0 ; i < keys.size(); i++){ Class type = types.get(i); String key = keys.get(i); // String name = keys.get(i); String value = null; System.out.println(key); if( type.isEnum() ) { JComboBox field = (JComboBox) textFields.get(i); Enum sel = (Enum)field.getSelectedItem(); value = sel.name(); } else if ( type == Boolean.class){ JComboBox field = (JComboBox) textFields.get(i); int sel = field.getSelectedIndex(); Boolean flag = true; if ( sel == 1 ) flag = false; value = flag.toString(); } else { JTextField field = (JTextField)textFields.get(i); value = field.getText(); } setValue(key, type, value); } System.out.println("new parameters: " + params.toString()); } @SuppressWarnings({ "unchecked" }) private void setValue(String name, Class type, String value) { try { String methodName = "set" + name; Class paramC = params.getClass(); Method m =paramC.getMethod(methodName,type); Object data = null; if ( type == Integer.class){ data = Integer.parseInt(value); } else if ( type == Double.class){ data = Double.parseDouble(value); } else if ( type == Float.class) { data = Float.parseFloat(value); } else if ( type == Boolean.class) { data = Boolean.parseBoolean(value); } else if ( type == Short.class) { data = Short.parseShort(value); } else if ( type == String[].class) { data = value.split(" "); } else if ( type.isEnum() ) { data = Enum.valueOf(type, value); } if (data == null){ System.err.println("Could not set value " + value + " for field " + name); return; } m.invoke(params, data); } catch (Exception e){ e.printStackTrace(); } } @SuppressWarnings("unchecked") private Object getValue(String name){ // first try with get form try { String methodName = "get" + name; Class paramC = params.getClass(); Method m; try { //try boolean getter m = paramC.getMethod(methodName,(Class[])null); } catch(NoSuchMethodException e) { //try boolean getter methodName = "is" + name; m = paramC.getMethod(methodName,(Class[])null); } Object value = m.invoke(params); return value; } catch (Exception e){ e.printStackTrace(); return null; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy