From: gmungoc Date: Wed, 30 May 2018 11:11:21 +0000 (+0100) Subject: JAL-3005 JAL-3008 render file chooser and radio button arguments X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=85ef061623b5d90777dbf04febaac30f28c0075a;p=jalview.git JAL-3005 JAL-3008 render file chooser and radio button arguments --- diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java index 4cac990..00c5a92 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,12 +32,15 @@ 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; @@ -41,14 +49,17 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; 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 +68,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; @@ -342,8 +354,16 @@ public class OptsAndParamsPage boolean adjusting; + /* + * drop-down list of choice options (if applicable) + */ JComboBox choicebox; + /* + * radio buttons as an alternative to combo box + */ + ButtonGroup buttonGroup; + JPanel controlsPanel = new JPanel(); boolean descriptionIsVisible = false; @@ -384,7 +404,8 @@ public class OptsAndParamsPage { 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 @@ -561,10 +582,6 @@ public class OptsAndParamsPage { return; } - if (!isChoiceParameter) - { - updateSliderFromValueField(); - } checkIfModified(); } @@ -606,15 +623,22 @@ 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; } @@ -718,10 +742,15 @@ 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); @@ -751,6 +780,38 @@ public class OptsAndParamsPage } }); 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); } @@ -761,7 +822,10 @@ public class OptsAndParamsPage { if (isChoiceParameter) { - choicebox.setSelectedItem(value); + if (!(parm instanceof RadioChoiceParameter)) + { + choicebox.setSelectedItem(value); + } } else { @@ -773,10 +837,43 @@ public class OptsAndParamsPage } /** + * 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: *