X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FOptsAndParamsPage.java;h=577a1ef1d45ebe42f4b76787cec0ca092ae5bfc7;hb=747167089ecf8d6afc70d417f5a20352e029bd95;hp=298057fcac0969cf05eeb4ef1a99a7bec2c3e05a;hpb=fa18a41c0cd9438a527615cce1d49d49a426e096;p=jalview.git diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java index 298057f..577a1ef 100644 --- a/src/jalview/gui/OptsAndParamsPage.java +++ b/src/jalview/gui/OptsAndParamsPage.java @@ -20,6 +20,11 @@ */ package jalview.gui; +import jalview.bin.Cache; +import jalview.io.DataSourceType; +import jalview.io.FileLoader; +import jalview.io.JalviewFileChooser; +import jalview.io.JalviewFileView; import jalview.util.MessageManager; import jalview.ws.jws2.dm.JabaOption; import jalview.ws.params.ArgumentI; @@ -27,28 +32,35 @@ import jalview.ws.params.OptionI; import jalview.ws.params.ParameterI; import jalview.ws.params.ValueConstrainI; import jalview.ws.params.ValueConstrainI.ValueType; +import jalview.ws.params.simple.FileParameter; import jalview.ws.params.simple.LogarithmicParameter; +import jalview.ws.params.simple.RadioChoiceParameter; import jalview.ws.params.simple.StringParameter; - import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; +import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -57,6 +69,7 @@ import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; +import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTextArea; @@ -114,18 +127,19 @@ public class OptsAndParamsPage OptionI option; - JComboBox val; + JComboBox val; /** * Constructs and adds labels and controls to the panel for one Option * * @param opt */ + public OptionBox(OptionI opt) { option = opt; setLayout(new FlowLayout(FlowLayout.LEFT)); - enabled = new JCheckBox(opt.getName()); + enabled = new JCheckBox(opt.getLabel()); enabled.setSelected(opt.isRequired()); /* @@ -135,7 +149,7 @@ public class OptsAndParamsPage if (opt.isRequired() && !(opt instanceof JabaOption)) { finfo = null; - add(new JLabel(opt.getName())); + add(new JLabel(opt.getLabel())); } else { @@ -178,6 +192,7 @@ public class OptsAndParamsPage if (finfo != null) { hasLink = true; + String description = desc; if (desc == null || desc.trim().isEmpty()) { @@ -263,11 +278,13 @@ public class OptsAndParamsPage @Override public void mouseEntered(MouseEvent e) { + } @Override public void mouseExited(MouseEvent e) { + } @Override @@ -317,7 +334,6 @@ public class OptsAndParamsPage { return option == null ? super.toString() : option.toString(); } - } /** @@ -342,7 +358,15 @@ public class OptsAndParamsPage boolean adjusting; - JComboBox choicebox; + /* + * drop-down list of choice options (if applicable) + */ + JComboBox choicebox; + + /* + * radio buttons as an alternative to combo box + */ + ButtonGroup buttonGroup; JPanel controlsPanel = new JPanel(); @@ -377,14 +401,13 @@ public class OptsAndParamsPage finfo = parm.getFurtherDetails(); validator = parm.getValidValue(); parameter = parm; - isLogarithmicParameter = parm instanceof LogarithmicParameter; - if (validator != null) { ValueType type = validator.getType(); isIntegerParameter = type == ValueType.Integer; - isStringParameter = type == ValueType.String; + isStringParameter = type == ValueType.String + || type == ValueType.File; /* * ensure slider has an integer range corresponding to @@ -417,6 +440,7 @@ public class OptsAndParamsPage else { addExpandableParam(parm); + } } @@ -428,6 +452,7 @@ public class OptsAndParamsPage private void addCompactParameter(ParameterI parm) { setLayout(new MigLayout("", "[][grow]")); + String ttipText = null; controlsPanel.setLayout(new BorderLayout()); @@ -477,6 +502,7 @@ public class OptsAndParamsPage firstrow.setBounds(new Rectangle(10, 20, PARAM_WIDTH - 30, PARAM_CLOSEDHEIGHT - 30)); + if (parm.getDescription() != null && parm.getDescription().trim().length() > 0) { @@ -553,7 +579,6 @@ public class OptsAndParamsPage showDescBtn.setBounds(new Rectangle(10, 10, 16, 16)); container.add(showDescBtn); } - @Override public void actionPerformed(ActionEvent e) { @@ -561,10 +586,6 @@ public class OptsAndParamsPage { return; } - if (!isChoiceParameter) - { - updateSliderFromValueField(); - } checkIfModified(); } @@ -574,25 +595,16 @@ public class OptsAndParamsPage */ private void checkIfModified() { - if (!adjusting) + Object newValue = updateSliderFromValueField(); + boolean modified = true; + if (newValue.getClass() == lastVal.getClass()) { - try - { - adjusting = true; - Object newValue = updateSliderFromValueField(); - boolean modified = true; - if (newValue.getClass() == lastVal.getClass()) - { - modified = !newValue.equals(lastVal); - } - pmdialogbox.argSetModified(this, modified); - } finally - { - adjusting = false; - } + modified = !newValue.equals(lastVal); } + pmdialogbox.argSetModified(this, modified); } + @Override public int getBaseline(int width, int height) { @@ -616,15 +628,21 @@ public class OptsAndParamsPage public ArgumentI getParameter() { ParameterI prm = parameter.copy(); - if (isChoiceParameter) + String value = null; + if (parameter instanceof RadioChoiceParameter) + { + value = buttonGroup.getSelection().getActionCommand(); + } + else if (isChoiceParameter) { - String value = getSelectedValue(this.parameter, choicebox.getSelectedIndex()); - prm.setValue(value); + value = getSelectedValue(this.parameter, + choicebox.getSelectedIndex()); } else { - prm.setValue(valueField.getText()); + value = valueField.getText(); } + prm.setValue(value); return prm; } @@ -646,11 +664,13 @@ public class OptsAndParamsPage @Override public void mouseEntered(MouseEvent e) { + } @Override public void mouseExited(MouseEvent e) { + } @Override @@ -665,6 +685,7 @@ public class OptsAndParamsPage @Override public void mouseReleased(MouseEvent e) { + } @Override @@ -728,12 +749,18 @@ public class OptsAndParamsPage void updateControls(ParameterI parm) { adjusting = true; - boolean init = (choicebox == null && valueField == null); + boolean init = (choicebox == null && valueField == null + && buttonGroup == null); if (init) { - if (isChoiceParameter) + if (parm instanceof RadioChoiceParameter) + { + buttonGroup = addRadioButtons(parameter, controlsPanel); + } + else if (isChoiceParameter) { choicebox = buildComboBox(parm); + choicebox.addActionListener(this); controlsPanel.add(choicebox, BorderLayout.CENTER); } else @@ -745,6 +772,8 @@ public class OptsAndParamsPage valueField.addActionListener(this); valueField.addKeyListener(new KeyAdapter() { + + @Override public void keyReleased(KeyEvent e) { @@ -758,26 +787,112 @@ public class OptsAndParamsPage } } } + + }); + valueField.addFocusListener(new FocusAdapter() { + + @Override + public void focusLost(FocusEvent e) + { + actionPerformed(null); + } + }); valueField.setPreferredSize(new Dimension(65, 25)); + if (parm instanceof FileParameter) + { + valueField.setToolTipText(MessageManager + .getString("label.double_click_to_browse")); + valueField.addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + if (e.getClickCount() == 2) + { + String dir = Cache.getProperty("LAST_DIRECTORY"); + JalviewFileChooser chooser = new JalviewFileChooser(dir); + chooser.setFileView(new JalviewFileView()); + chooser.setDialogTitle( + MessageManager.getString("action.select_ddbb")); + + int val = chooser.showOpenDialog(ParamBox.this); + if (val == JalviewFileChooser.APPROVE_OPTION) + { + File choice = chooser.getSelectedFile(); + String path = choice.getPath(); + valueField.setText(path); + Cache.setProperty("LAST_DIRECTORY", choice.getParent()); + FileLoader.updateRecentlyOpened(path, + DataSourceType.FILE); + } + } + } + }); + } + controlsPanel.add(slider, BorderLayout.WEST); controlsPanel.add(valueField, BorderLayout.EAST); } } - if (!isChoiceParameter && parm != null) + String value = parm.getValue(); + if (value != null) { - valueField.setText(parm.getValue()); + if (isChoiceParameter) + { + if (!(parm instanceof RadioChoiceParameter)) + { + choicebox.setSelectedItem(value); + } + } + else + { + valueField.setText(value); + } } lastVal = updateSliderFromValueField(); adjusting = false; } /** + * Adds a panel to comp, containing a label and radio buttons for the choice + * of values of the given option. Returns a ButtonGroup whose members are + * the added radio buttons. + * + * @param option + * @param comp + * + * @return + */ + protected ButtonGroup addRadioButtons(OptionI option, Container comp) + { + ButtonGroup bg = new ButtonGroup(); + JPanel radioPanel = new JPanel(); + radioPanel.add(new JLabel(option.getDescription())); + + String value = option.getValue(); + + for (String opt : option.getPossibleValues()) + { + JRadioButton btn = new JRadioButton(opt); + btn.setActionCommand(opt); + boolean selected = opt.equals(value); + btn.setSelected(selected); + btn.addActionListener(this); + bg.add(btn); + radioPanel.add(btn); + } + comp.add(radioPanel); + + return bg; + } + + /** * Action depends on the type of the input parameter: *
    *
  • if a text input, returns the trimmed value
  • - *
  • if a choice list, returns the selected value
  • + *
  • if a choice list or radio button, returns the selected value
  • *
  • if a value slider and input field, sets the value of the slider from * the value in the text field, limiting it to any defined min-max * range.
  • @@ -793,12 +908,25 @@ public class OptsAndParamsPage { if (isChoiceParameter) { - return getSelectedValue(this.parameter, choicebox.getSelectedIndex()); + if (parameter instanceof RadioChoiceParameter) + { + return buttonGroup.getSelection().getActionCommand(); + } + else + { + return getSelectedValue(this.parameter, + choicebox.getSelectedIndex()); + } } slider.setVisible(false); return valueField.getText().trim(); } + if (validator.getMin() == null || validator.getMax() == null) + { + slider.setVisible(false); + } + valueField.setText(valueField.getText().trim()); /* @@ -824,7 +952,6 @@ public class OptsAndParamsPage valueField.setBackground(Color.yellow); return Float.NaN; } - if (isIntegerParameter) { int iVal = 0; @@ -847,16 +974,15 @@ public class OptsAndParamsPage { slider.setVisible(false); } - return new Integer(iVal); + return Integer.valueOf(iVal); } - if (isLogarithmicParameter) { double dVal = 0d; try { double eValue = Double.valueOf(valueField.getText()); - dVal = Math.log(eValue) * sliderScaleFactor; + dVal = Math.log(eValue); } catch (Exception e) { // shouldn't be possible here @@ -869,16 +995,16 @@ public class OptsAndParamsPage * sliderScaleFactor; double scaleMax = Math.log(validator.getMax().doubleValue()) * sliderScaleFactor; - slider.getModel().setRangeProperties((int) (dVal), 1, + slider.getModel().setRangeProperties( + (int) (sliderScaleFactor * dVal), 1, (int) scaleMin, 1 + (int) scaleMax, true); } else { slider.setVisible(false); } - return new Double(dVal); + return Double.valueOf(dVal); } - float fVal = 0f; try { @@ -901,7 +1027,7 @@ public class OptsAndParamsPage { slider.setVisible(false); } - return new Float(fVal); + return Float.valueOf(fVal); } } @@ -913,6 +1039,7 @@ public class OptsAndParamsPage * * @param paramContainer */ + public OptsAndParamsPage(OptsParametersContainerI paramContainer, boolean compact) { @@ -942,6 +1069,7 @@ public class OptsAndParamsPage mnu.show(invoker, x, y); } + public Map getOptSet() { return optSet; @@ -962,6 +1090,7 @@ public class OptsAndParamsPage this.paramSet = paramSet; } + OptionBox addOption(OptionI opt) { OptionBox cb = optSet.get(opt.getName()); @@ -1005,9 +1134,11 @@ public class OptsAndParamsPage } else { - throw new Error(String.format("Invalid value '%s' for option '%s'", - string, option.getName())); + throw new Error(MessageManager.formatMessage( + "error.invalid_value_for_option", new String[] + { string, option.getName() })); } + } if (option.isRequired() && !cb.enabled.isSelected()) { @@ -1068,13 +1199,15 @@ public class OptsAndParamsPage * @param opt * @return */ - protected JComboBox buildComboBox(OptionI opt) + protected static JComboBox buildComboBox(OptionI opt) { - JComboBox cb = null; + JComboBox cb = null; List displayNames = opt.getDisplayNames(); if (displayNames != null) { - cb = JvSwingUtils.buildComboWithTooltips(displayNames, + List displayNamesObjects = new ArrayList<>(); + displayNamesObjects.addAll(displayNames); + cb = JvSwingUtils.buildComboWithTooltips(displayNamesObjects, opt.getPossibleValues()); } else @@ -1088,11 +1221,10 @@ public class OptsAndParamsPage return cb; } - /* + /** * Answers the value corresponding to the selected item in the choice combo - * box. If display names were not provided, this is simply the selected - * value. If display names were provided, it is the value corresponding to - * the selected item index. + * box. Note that this returns the underlying value even if a different + * display name is used in the combo box. * * @return */ @@ -1106,16 +1238,9 @@ public class OptsAndParamsPage // one value is actually returned even if this.val is not displayed value = possibleValues.get(0); } - else + else if (sel >= 0 && sel < possibleValues.size()) { - if (sel >= 0 && sel < possibleValues.size()) - { - value = possibleValues.get(sel); - } - else - { - value = opt.getValue(); - } + value = possibleValues.get(sel); } return value; }