protected SelectListParameter<GenomicIntervalTypeEnum> createIntervalTypeParameter() {
   OptionList<GenomicIntervalTypeEnum> options = new OptionList<GenomicIntervalTypeEnum>();
   options.addOption(
       GenomicIntervalTypeEnum.GENE_NAME.getValue(), GenomicIntervalTypeEnum.GENE_NAME);
   options.addOption(
       GenomicIntervalTypeEnum.CHROMOSOME_COORDINATES.getValue(),
       GenomicIntervalTypeEnum.CHROMOSOME_COORDINATES);
   ValueSelectedHandler<GenomicIntervalTypeEnum> handler =
       new ValueSelectedHandler<GenomicIntervalTypeEnum>() {
         @Override
         public void valueSelected(GenomicIntervalTypeEnum value) {
           criterion.setGenomicIntervalType(value);
           setIntervalParameters();
         }
       };
   SelectListParameter<GenomicIntervalTypeEnum> intervalTypeParameter =
       new SelectListParameter<GenomicIntervalTypeEnum>(
           getParameters().size(),
           getRow().getRowIndex(),
           options,
           handler,
           criterion.getGenomicIntervalType());
   intervalTypeParameter.setLabel("Genome Interval");
   intervalTypeParameter.setUpdateFormOnChange(true);
   return intervalTypeParameter;
 }
 /**
  * Store nv list to hash map.
  *
  * @param filename the filename
  * @param options the options
  * @param dstMap the dst map
  */
 public static void storeNVListToHashMap(
     String filename, OptionList options, Map<String, String> dstMap) {
   if (options == null || options.getOption() == null || options.getOption().isEmpty()) {
     return;
   }
   List<NameValue> optionNvList = options.getOption();
   for (int i = 0; i < optionNvList.size(); i++) {
     NameValue nv = optionNvList.get(i);
     dstMap.put(nv.getName(), nv.getValue());
   }
 }
 /**
  * Gets the option list.
  *
  * @param filename the filename
  * @param parent the parent
  * @param childName the child name
  * @return the option list
  * @throws Exception the exception
  */
 public static OptionList getOptionList(String filename, Element parent, String childName)
     throws Exception {
   if (parent == null) {
     return null;
   }
   OptionList result = new OptionList();
   Element optionContainer = DomParseUtil.getSingleElement(filename, parent, childName);
   if (optionContainer == null) {
     return null;
   }
   List<NameValue> outList = result.getOption();
   putNVList(filename, childName, optionContainer, outList);
   return result;
 }
  public void draw() {
    JPanel current = new JPanel(new GridLayout(0, 1));
    for (final Score s : this.scores) {
      JPanel pane = new JPanel(new FlowLayout());
      pane.add(new JLabel("|" + s.name + "|Type:" + s.type + "|DefaultValue:" + s.defVal + "|"));
      JButton remove = new JButton("Remove!");
      remove.setAction(
          new Action() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
              delScore(s);
              draw();
            }

            @Override
            public void addPropertyChangeListener(PropertyChangeListener arg0) {}

            @Override
            public Object getValue(String arg0) {
              return null;
            }

            @Override
            public boolean isEnabled() {
              return true;
            }

            @Override
            public void putValue(String arg0, Object arg1) {}

            @Override
            public void removePropertyChangeListener(PropertyChangeListener arg0) {}

            @Override
            public void setEnabled(boolean arg0) {}
          });
      remove.setText("remove!");
      pane.add(remove);
      current.add(pane);
    }
    final JTextField name = new JTextField(16);
    final OptionList type = new OptionList(this.window);
    ArrayList<String> types = new ArrayList<String>();
    for (ScoreType v : ScoreType.values()) {
      types.add(v.toString().toLowerCase());
    }
    type.setVals(types);
    type.draw();
    type.setSelectedItem("string");
    final JPanel val = new JPanel(new FlowLayout());
    type.setAction(
        new Action() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            // change the value object accordingly
            OptionList type = (OptionList) arg0.getSource();
            String ty = (String) type.getSelectedItem();
            Component value = new JTextField(16);
            if (ty.equalsIgnoreCase("boolean")) {
              value = new OptionList(window);
              ArrayList<String> vals = new ArrayList<String>();
              vals.add("true");
              vals.add("false");
              ((OptionList) value).setVals(vals);
              ((OptionList) value).draw();
              value.setName("value");
            } else if (ty.equalsIgnoreCase("string")) {
              value = new JTextField(16);
              ((JTextComponent) value).setEditable(true);
              value.setName("value");
            } else if (ty.equalsIgnoreCase("num")) {
              value = new JTextField(16);
              ((JTextComponent) value).setEditable(true);
              value.setName("valuet:num");
            } else if (ty.equalsIgnoreCase("int")) {
              value = new JTextField(16);
              ((JTextComponent) value).setEditable(true);
              value.setName("valuet:int");
            }
            val.removeAll();
            val.add(value);
            window.refresh();
          }

          @Override
          public void addPropertyChangeListener(PropertyChangeListener arg0) {}

          @Override
          public Object getValue(String arg0) {
            return null;
          }

          @Override
          public boolean isEnabled() {
            return true;
          }

          @Override
          public void putValue(String arg0, Object arg1) {}

          @Override
          public void removePropertyChangeListener(PropertyChangeListener arg0) {}

          @Override
          public void setEnabled(boolean arg0) {}
        });
    JTextField value = new JTextField(16);
    value.setName("value");
    value.setEditable(true);
    val.add(value);
    JPanel newS = new JPanel(new FlowLayout());
    newS.add(new JLabel("Name:"));
    newS.add(name);
    type.draw();
    newS.add(new JLabel("Type:"));
    newS.add(type);
    type.setSelectedItem("string");
    newS.add(new JLabel("Default Value"));
    newS.add(val);
    JButton add = new JButton("Add!");
    add.setName("Add!");
    add.setAction(
        new Action() {

          @Override
          public void actionPerformed(ActionEvent arg0) {
            // add it
            ScoreType ty = ScoreType.STRING;
            String t = (String) type.getSelectedItem();
            if (t.equalsIgnoreCase("boolean")) {
              ty = ScoreType.BOOLEAN;
            } else if (t.equalsIgnoreCase("string")) {
              ty = ScoreType.STRING;
            } else if (t.equalsIgnoreCase("int")) {
              ty = ScoreType.INT;
            } else if (t.equalsIgnoreCase("num")) {
              ty = ScoreType.NUM;
            }
            Component[] comps = val.getComponents();
            Object value = null;
            for (Component comp : comps) {
              if (comp.getName().toLowerCase().contains("value")) {
                if (comp instanceof JTextField && comp.getName().toLowerCase().contains("t:num")) {
                  try {
                    value = Double.parseDouble(((JTextField) comp).getText());
                  } catch (NumberFormatException e) {
                    window.popUpMsg("Score value must be a number", "ERROR");
                    return;
                  }
                }
                if (comp instanceof JTextField && comp.getName().toLowerCase().contains("t:int")) {
                  try {
                    value = Integer.parseInt(((JTextField) comp).getText());
                  } catch (NumberFormatException e) {
                    window.popUpMsg("Score value must be an integer", "ERROR");
                    return;
                  }
                }
                if (comp instanceof OptionList) {
                  String v = ((String) ((OptionList) comp).getSelectedItem());
                  if (v.equalsIgnoreCase("true")) {
                    value = true;
                  } else {
                    value = false;
                  }
                }
                if (comp instanceof JTextField) {
                  value = ((JTextField) comp).getText();
                }
              }
            }
            Score score = new Score(name.getText(), value, ty);
            addScore(score);
            draw();
          }

          @Override
          public void addPropertyChangeListener(PropertyChangeListener arg0) {}

          @Override
          public Object getValue(String arg0) {
            return null;
          }

          @Override
          public boolean isEnabled() {
            return true;
          }

          @Override
          public void putValue(String arg0, Object arg1) {}

          @Override
          public void removePropertyChangeListener(PropertyChangeListener arg0) {}

          @Override
          public void setEnabled(boolean arg0) {}
        });
    add.setText("Add");
    add.setVisible(true);
    newS.add(add);
    current.add(newS);
    this.removeAll();
    this.add(current);
    this.window.refresh();
    return;
  }