2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.gui.OptsAndParamsPage.OptionBox;
24 import jalview.gui.OptsAndParamsPage.ParamBox;
25 import jalview.util.MessageManager;
26 import jalview.ws.api.UIinfo;
27 import jalview.ws.params.ArgumentI;
28 import jalview.ws.params.OptionI;
29 import jalview.ws.params.ParamDatastoreI;
30 import jalview.ws.params.ParameterI;
31 import jalview.ws.params.WsParamSetI;
33 import java.awt.BorderLayout;
34 import java.awt.Component;
35 import java.awt.Dimension;
36 import java.awt.FlowLayout;
38 import java.awt.GridBagConstraints;
39 import java.awt.GridBagLayout;
40 import java.awt.GridLayout;
41 import java.awt.Rectangle;
42 import java.awt.event.ActionEvent;
43 import java.awt.event.ActionListener;
44 import java.awt.event.HierarchyBoundsListener;
45 import java.awt.event.HierarchyEvent;
46 import java.awt.event.ItemEvent;
47 import java.awt.event.ItemListener;
48 import java.util.Hashtable;
49 import java.util.List;
50 import java.util.Vector;
51 import java.util.concurrent.CompletableFuture;
52 import java.util.concurrent.CompletionStage;
54 import javax.swing.JButton;
55 import javax.swing.JComboBox;
56 import javax.swing.JDialog;
57 import javax.swing.JFrame;
58 import javax.swing.JLabel;
59 import javax.swing.JPanel;
60 import javax.swing.JScrollPane;
61 import javax.swing.JTextArea;
62 import javax.swing.WindowConstants;
63 import javax.swing.border.TitledBorder;
64 import javax.swing.event.DocumentEvent;
65 import javax.swing.event.DocumentListener;
67 import net.miginfocom.swing.MigLayout;
70 * job parameter editing/browsing dialog box. User can browse existing settings
71 * (user + presets + Defaults), and any changes to parameters creates a modified
72 * user parameter set. LOGIC: If the parameter set is modified, and its name is
73 * a valid, non-existant user parameter set, then a save button is shown. If the
74 * parameter set is modified and its name is a valid, extant user parameter set,
75 * then an update button is shown. If user parameter set's name is edited, and
76 * old name exists as a writable user parameter set, then rename button is
77 * shown. If current parameter set is associated with a user defined parameter
78 * set, then : if set is modifed, a 'revert' button is shown. if set is not
79 * modified, a 'delete' button is shown.
84 public class WsJobParameters extends JPanel implements ItemListener,
85 ActionListener, DocumentListener, OptsParametersContainerI
87 private static final int PREFERRED_WIDTH = 540;
89 private static final int DEFAULT_HEIGHT = 640;
91 // the default parameter set shown to the user
92 private static final String SVC_DEF = "Defaults";
94 private int maxOptWidth = 200;
96 // URL linkImageURL = getClass().getResource("/images/link.gif");
98 // TODO ABSRACT FROM JABAWS CLASSES
100 // completion stage representing whether start was clicked
101 private final CompletableFuture<Boolean> completionStage = new CompletableFuture<>();
104 * manager for options and parameters.
106 OptsAndParamsPage opanp;
109 * panel containing job options
111 JPanel optionsPanel = new JPanel();
114 * panel containing job parameters
116 JPanel paramsPanel = new JPanel();
118 JPanel setNamePanel = new JPanel();
120 JButton createpref = new JButton();
122 JButton deletepref = new JButton();
124 JButton revertpref = new JButton();
126 JButton updatepref = new JButton();
128 JComboBox<String> setName = new JComboBox<>();
130 JTextArea setDescr = new JTextArea();
132 JScrollPane paramPane = new JScrollPane();
134 JButton startjob = JvSwingUtils.makeButton(
135 MessageManager.getString("action.start_job"),
136 MessageManager.getString("label.start_job_current_settings"),
137 this::startjob_actionPerformed);
138 JButton canceljob = JvSwingUtils.makeButton(
139 MessageManager.getString("action.cancel_job"),
140 MessageManager.getString("label.cancel_job_close_dialog"),
141 this::canceljob_actionPerformed);
143 ParamDatastoreI paramStore;
145 // set true when 'Start Job' is clicked
146 boolean startJob = false;
153 * list of service presets in the gui
155 Hashtable<String, String> servicePresets = null;
158 * set if dialog is being set - so handlers will avoid spurious events
160 boolean settingDialog = false;
162 private Hashtable<Object, Object> modifiedElements = new Hashtable<>();
164 String lastParmSet = null;
166 public WsJobParameters(ParamDatastoreI store, WsParamSetI preset,
167 List<ArgumentI> args)
171 // parameters dialog in 'compact' format (help as tooltips)
172 opanp = new OptsAndParamsPage(this, true);
174 this.paramStore = store;
181 * Constructor given a set of parameters and presets, a service to be invoked,
182 * and a list of (Jabaws client) arguments
189 public WsJobParameters(ParamDatastoreI paramStorei, UIinfo service,
190 WsParamSetI preset, List<ArgumentI> jobArgset)
194 // parameters dialog in 'expanded' format (help text boxes)
195 opanp = new OptsAndParamsPage(this, false);
198 this.paramStore = paramStorei;
199 if (paramStore == null && service != null)
201 paramStore = service.getParamStore();
203 this.service = service;
204 initForService(preset, jobArgset);
209 * Shows a modal dialog containing the parameters and Start or Cancel options.
210 * Answers true if the job is started, false if cancelled.
214 public CompletionStage<Boolean> showRunDialog()
216 frame = new JFrame();
217 frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
220 frame.setTitle(MessageManager.formatMessage("label.edit_params_for",
222 { service.getActionText() }));
224 frame.setTitle(MessageManager.formatMessage("label.edit_params_for",
226 { service.getActionText() }));
227 Rectangle deskr = Desktop.getInstance().getBounds();
228 Dimension pref = this.getPreferredSize();
230 new Rectangle((int) (deskr.getCenterX() - pref.width / 2),
231 (int) (deskr.getCenterY() - pref.height / 2),
232 pref.width, pref.height));
233 frame.setContentPane(this);
235 // should perhaps recover defaults from user prefs.
238 javax.swing.SwingUtilities.invokeLater(new Runnable()
243 // jobPanel.setDividerLocation(0.25);
248 frame.setVisible(true);
249 return completionStage;
252 private void jbInit()
254 this.addHierarchyBoundsListener(new HierarchyBoundsListener()
258 public void ancestorResized(HierarchyEvent arg0)
260 refreshParamLayout();
264 public void ancestorMoved(HierarchyEvent arg0)
266 // TODO Auto-generated method stub
270 updatepref = JvSwingUtils.makeButton(
271 MessageManager.getString("action.update"),
272 MessageManager.getString("label.update_user_parameter_set"),
273 this::update_actionPerformed);
274 deletepref = JvSwingUtils.makeButton(
275 MessageManager.getString("action.delete"),
276 MessageManager.getString("label.delete_user_parameter_set"),
277 this::delete_actionPerformed);
278 createpref = JvSwingUtils.makeButton(
279 MessageManager.getString("action.create"),
280 MessageManager.getString("label.create_user_parameter_set"),
281 this::create_actionPerformed);
282 revertpref = JvSwingUtils.makeButton(
283 MessageManager.getString("action.revert"),
285 .getString("label.revert_changes_user_parameter_set"),
286 this::revert_actionPerformed);
289 JPanel setDetails = new JPanel();
290 setDetails.setBorder(
291 new TitledBorder(MessageManager.getString("label.details")));
292 setDetails.setLayout(new BorderLayout());
293 setDescr.setColumns(40);
294 setDescr.setWrapStyleWord(true);
295 setDescr.setLineWrap(true);
296 setDescr.setBackground(getBackground());
297 setDescr.setEditable(true);
298 setDescr.getDocument().addDocumentListener(this);
299 setDescr.setToolTipText(
300 MessageManager.getString("label.edit_notes_parameter_set"));
301 JScrollPane setDescrView = new JScrollPane();
302 setDescrView.getViewport().setView(setDescr);
303 setName.setEditable(true);
304 setName.addItemListener(this);
305 setName.getEditor().addActionListener(this);
306 JPanel setNameInfo = new JPanel(new FlowLayout(FlowLayout.LEFT));
307 GridBagLayout gbl = new GridBagLayout();
308 setNamePanel.setLayout(gbl);
310 JLabel setNameLabel = new JLabel(
311 MessageManager.getString("label.current_parameter_set_name"));
312 setNameLabel.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
314 setNameInfo.add(setNameLabel);
315 setNameInfo.add(setName);
317 // initial button visibility
318 updatepref.setVisible(false);
319 deletepref.setVisible(false);
320 revertpref.setVisible(false);
321 createpref.setVisible(false);
322 JPanel setsavebuts = new JPanel();
323 setsavebuts.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); // GridLayout(1,2));
324 JPanel spacer = new JPanel();
325 spacer.setPreferredSize(new Dimension(2, 30));
326 setsavebuts.add(spacer);
327 setsavebuts.add(deletepref);
328 setsavebuts.add(revertpref);
329 setsavebuts.add(createpref);
330 setsavebuts.add(updatepref);
331 // setsavebuts.setSize(new Dimension(150, 30));
332 JPanel buttonArea = new JPanel(new GridLayout(1, 1));
333 buttonArea.add(setsavebuts);
334 setNamePanel.add(setNameInfo);
335 GridBagConstraints gbc = new GridBagConstraints();
337 gbl.setConstraints(setNameInfo, gbc);
338 setNamePanel.add(buttonArea);
339 gbc = new GridBagConstraints();
343 gbl.setConstraints(buttonArea, gbc);
344 setDetails.add(setDescrView, BorderLayout.CENTER);
346 // paramPane.setPreferredSize(new Dimension(360, 400));
347 // paramPane.setPreferredSize(null);
348 optionsPanel.setBorder(
349 new TitledBorder(MessageManager.getString("label.options")));
350 optionsPanel.setOpaque(true);
351 paramsPanel.setBorder(
352 new TitledBorder(MessageManager.getString("label.parameters")));
353 paramsPanel.setOpaque(true);
354 // optsAndparams.setScrollableWidth(ScrollableSizeHint.FIT);
355 // optsAndparams.setScrollableHeight(ScrollableSizeHint.NONE);
356 // optsAndparams.setLayout(new BorderLayout());
357 JPanel optsAndparams = new JPanel();
358 optsAndparams.setLayout(new BorderLayout());
359 optsAndparams.add(optionsPanel, BorderLayout.NORTH);
360 optsAndparams.add(paramsPanel, BorderLayout.CENTER);
361 JPanel jp = new JPanel(new BorderLayout());
362 jp.add(optsAndparams, BorderLayout.CENTER);
363 paramPane.getViewport().setView(jp);
364 paramPane.setBorder(null);
365 setLayout(new BorderLayout());
367 JPanel jobPanel = new JPanel();
368 jobPanel.setPreferredSize(null);
369 jobPanel.setLayout(new BorderLayout());
370 jobPanel.add(setDetails, BorderLayout.NORTH);
371 jobPanel.add(paramPane, BorderLayout.CENTER);
372 // jobPanel.setOrientation(JSplitPane.VERTICAL_SPLIT);
374 add(setNamePanel, BorderLayout.NORTH);
375 add(jobPanel, BorderLayout.CENTER);
377 JPanel dialogpanel = new JPanel();
378 dialogpanel.add(startjob);
379 dialogpanel.add(canceljob);
380 // JAL-1580: setMaximumSize() doesn't work, so just size for the worst case:
381 // check for null is for JUnit usage
382 final int windowHeight = Desktop.getInstance() == null ? DEFAULT_HEIGHT
383 : Desktop.getInstance().getHeight();
384 setPreferredSize(new Dimension(540, windowHeight));
385 add(dialogpanel, BorderLayout.SOUTH);
389 protected void revert_actionPerformed(ActionEvent e)
391 reInitDialog(lastParmSet);
392 updateWebServiceMenus();
395 protected void update_actionPerformed(ActionEvent e)
399 String curname = ((String) setName.getSelectedItem()).trim();
400 _updatePreset(lastParmSet, curname);
401 lastParmSet = curname;
403 initArgSetModified();
404 syncSetNamesWithStore();
408 private void _deleteUserPreset(String lastParmSet2)
410 paramStore.deletePreset(lastParmSet2);
413 protected void delete_actionPerformed(ActionEvent e)
417 // delete current preset's saved entry
418 _deleteUserPreset(lastParmSet);
420 reInitDialog(null); // service default
421 updateWebServiceMenus();
424 protected void create_actionPerformed(ActionEvent e)
426 String curname = ((String) setName.getSelectedItem()).trim();
427 if (curname.length() > 0)
429 _storeCurrentPreset(curname);
430 lastParmSet = curname;
432 reInitDialog(curname);
433 initArgSetModified();
434 updateWebServiceMenus();
438 // TODO: show warning
439 System.err.println("Invalid name. Not saved.");
443 protected void canceljob_actionPerformed(ActionEvent e)
448 frame.setVisible(false);
450 completionStage.complete(false);
453 protected void startjob_actionPerformed(ActionEvent e)
458 frame.setVisible(false);
460 completionStage.complete(true);
463 void initForService(WsParamSetI paramSet, List<ArgumentI> jobArgset)
465 settingDialog = true;
467 init(paramSet, jobArgset);
471 void init(WsParamSetI p, List<ArgumentI> jobArgset)
473 Hashtable<String, String> exnames = new Hashtable<>();
474 for (int i = 0, iSize = setName.getItemCount(); i < iSize; i++)
476 exnames.put(setName.getItemAt(i), setName.getItemAt(i));
478 servicePresets = new Hashtable<>();
479 // Add the default entry - if not present already.
480 if (!exnames.contains(SVC_DEF))
482 setName.addItem(SVC_DEF);
483 exnames.put(SVC_DEF, SVC_DEF);
484 servicePresets.put(SVC_DEF, SVC_DEF);
487 // String curname = (p == null ? "" : p.getName());
488 for (WsParamSetI pr : paramStore.getPresets())
490 if (!pr.isModifiable())
492 servicePresets.put(pr.getName(), "preset");
497 if (!exnames.contains(pr.getName()))
499 setName.addItem(pr.getName());
502 // TODO: if initial jobArgset matches a given user setting or preset then
503 // should recover setting accordingly
504 // updateTable(p, jobArgset);
507 reInitDialog(p.getName());
508 initArgSetModified();
512 if (jobArgset != null && jobArgset.size() > 0)
514 curSetName = "Supplied Settings";
515 isUserPreset = false;
516 updateTable(p, jobArgset);
517 setName.setSelectedItem(curSetName);
518 updateButtonDisplay();
526 settingDialog = false;
529 private void updateTable(WsParamSetI p, List<ArgumentI> jobArgset)
531 boolean setDefaultParams = false;
532 if (lastParmSet == null)
534 isUserPreset = false;
535 // First call - so provide Service default settings
536 setName.setSelectedItem(lastSetName = SVC_DEF);
538 if (p == null && SVC_DEF.equals("" + setName.getSelectedItem()))
540 // indicate that service defaults should be set if available
541 setDefaultParams = true;
543 // populate table from default parameter set.
544 List<ArgumentI> args = paramStore.getServiceParameters();
546 // split to params and required arguments
549 boolean optset = false;
550 for (ArgumentI myarg : args)
552 // Ideally, Argument would implement isRequired !
553 if (myarg instanceof ParameterI)
555 ParameterI parm = (ParameterI) myarg;
556 opanp.addParameter(parm).validate();
560 if (myarg instanceof OptionI)
562 OptionI opt = (OptionI) myarg;
563 OptionBox ob = opanp.addOption(opt);
564 ob.resetToDefault(setDefaultParams);
565 if (maxOptWidth < ob.getPreferredSize().width)
567 maxOptWidth = ob.getPreferredSize().width;
570 cw += ob.getPreferredSize().width + 5;
574 System.err.println("Ignoring unknown service argument type "
575 + myarg.getClass().getName());
579 args = null; // no more args to process.
583 isUserPreset = false;
584 // initialise setname
585 setName.setSelectedItem(lastSetName = p.getName());
586 setDescr.setText(lastDescrText = p.getDescription());
590 args = p.getArguments();
591 } catch (Exception e)
595 // TODO: check if args should be unselected prior to resetting using the
599 if (jobArgset != null)
601 argSetModified(jobArgset, true);
604 // get setargs from current object
607 for (ArgumentI arg : args)
609 if (arg instanceof ParameterI)
611 opanp.setParameter((ParameterI) arg);
615 if (arg instanceof OptionI)
617 // System.out.println("Setting option "
618 // + System.identityHashCode(arg) + ":" + arg.getName()
619 // + " with " + arg.getDefaultValue());
620 opanp.selectOption((OptionI) arg, arg.getValue());
627 refreshParamLayout();
631 private boolean isModified()
633 return modifiedElements.size() > 0;
637 * reset gui and modification state settings
639 private void initArgSetModified()
642 modifiedElements.clear();
643 updateButtonDisplay();
646 private void updateButtonDisplay()
648 boolean _update = false, _create = false, _delete = false,
650 if (modifiedElements.size() > 0)
654 _update = isUserPreset; // can only update user presets
655 if (!isUserPreset || modifiedElements.containsKey(setName))
657 // name modified - can create new preset
665 // can still delete a user preset
666 _delete = isUserPreset;
668 createpref.setVisible(_create);
669 updatepref.setVisible(_update);
670 deletepref.setVisible(_delete);
671 revertpref.setVisible(_revert);
676 public void argSetModified(Object modifiedElement, boolean b)
684 modifiedElements.remove(modifiedElement);
688 if (b && modifiedElement == setName
689 && modifiedElements.contains(modifiedElement))
691 // HACK! prevents iteration on makeSetNameValid
694 modifiedElements.put(modifiedElement, modifiedElement);
696 // set mod status based on presence of elements in table
697 if (b && modifiedElements.size() > 0)
699 makeSetNameValid(!isUserPreset);
700 setNamePanel.revalidate();
702 updateButtonDisplay();
705 private boolean isServicePreset(String selectedItem)
707 return selectedItem.equals(SVC_DEF)
708 || servicePresets.containsKey(selectedItem);
712 * check if the current set name is a valid set name for saving, if not, then
715 private void makeSetNameValid(boolean newuserset)
717 boolean stn = settingDialog;
718 boolean renamed = false;
719 settingDialog = true;
720 String nm = (curSetName != null ? curSetName
721 : (String) setName.getSelectedItem());
722 // check if the name is reserved - if it is, rename it.
723 if (isServicePreset(nm))
732 while (paramStore.getPreset(tnm) != null)
734 tnm = nm + " (" + (++i) + ")";
743 boolean makeupdate = false;
744 // sync the gui with the preset database
745 for (int i = 0, iS = setName.getItemCount(); i < iS; i++)
747 String snm = setName.getItemAt(i);
751 // setName.setSelectedIndex(i);
756 setName.addItem(curSetName = nm);
757 setName.setSelectedItem(curSetName);
761 settingDialog = false; // we need this name change to be registered.
762 argSetModified(setName, renamed);
768 * Rebuilds the Options and Parameters panels
771 public void refreshParamLayout()
773 final int rightMargin = 40;
774 final int availableWidth = paramPane.getViewport().getSize().width
776 - optionsPanel.getBorder().getBorderInsets(optionsPanel).left
777 + optionsPanel.getBorder().getBorderInsets(optionsPanel).right;
779 if (opanp.getOptSet().size() > 0)
782 int currentWidth = hgap;
785 * layout constraint 'nogrid' prevents vertical column alignment,
786 * allowing controls to flow without extra space inserted to align
788 optionsPanel.setLayout(new MigLayout("nogrid", "", ""));
789 optionsPanel.removeAll();
790 JPanel lastAdded = null;
793 * add each control in turn; if adding would overflow the right margin,
794 * remove and re-add the previous parameter with "wrap" (after)
795 * in order to start a new row
797 for (OptionBox pbox : opanp.getOptSet().values())
800 int boxWidth = pbox.getSize().width;
801 currentWidth += boxWidth + hgap;
802 boolean wrapAfterLast = currentWidth > availableWidth
803 && lastAdded != null;
804 // System.out.println(String.format(
805 // "%s width=%d, paneWidth=%d, currentWidth=%d, wrapAfterLast=%s",
806 // pbox.toString(), boxWidth, panewidth, currentWidth,
810 optionsPanel.remove(lastAdded);
811 optionsPanel.add(lastAdded, "wrap");
812 currentWidth = hgap + boxWidth;
814 optionsPanel.add(pbox);
817 optionsPanel.revalidate();
821 optionsPanel.setVisible(false);
824 if (opanp.getParamSet().size() > 0)
826 paramsPanel.removeAll();
827 paramsPanel.setLayout(new MigLayout("", "", ""));
829 int currentWidth = hgap;
831 JPanel lastAdded = null;
832 for (ParamBox pbox : opanp.getParamSet().values())
835 int boxWidth = pbox.getSize().width;
836 currentWidth += boxWidth + hgap;
837 boolean wrapAfterLast = currentWidth > availableWidth
838 && lastAdded != null;
841 paramsPanel.remove(lastAdded);
842 paramsPanel.add(lastAdded, "wrap");
843 currentWidth = pbox.getSize().width + hgap;
845 paramsPanel.add(pbox);
850 * s = 2 * sep; for (ParamBox pbox : opanp.getParamSet().values()) {
851 * pbox.validate(); s += sep +
852 * pbox.getPreferredSize().height+pbox.getBorder
853 * ().getBorderInsets(pbox).bottom; }
855 * // paramList.setPreferredSize(new Dimension(w, s));
856 * os+=s+2*sep+paramList
857 * .getBorder().getBorderInsets(paramList).bottom+paramList
858 * .getBorder().getBorderInsets(paramList).top;
860 paramsPanel.revalidate();
864 paramsPanel.setVisible(false);
866 // TODO: waste some time trying to eliminate any unnecessary .validate calls
868 // System.out.println("Size will be : "+w+","+os);
869 // optsAndparams.setPreferredSize(null);
870 // paramPane.getViewport().setView(optsAndparams);
871 paramPane.getViewport().setAutoscrolls(true);
872 paramPane.revalidate();
875 public boolean isServiceDefaults()
877 return (!isModified()
878 && (lastParmSet != null && lastParmSet.equals(SVC_DEF)));
881 public List<ArgumentI> getJobParams()
883 return opanp.getCurrentSettings();
887 * Hashtable<String, Object[]> editedParams = new Hashtable<String,
890 * store the given parameters in the user parameter set database.
892 * @param storeSetName - lastParmSet
894 * @param descr - setDescr.getText()
896 * @param jobParams - getJobParams()
898 * private void _storeUserPreset(String storeSetName, String descr,
899 * List<ArgumentI> jobParams) { // this is a simple hash store. Object[] pset;
900 * editedParams.put(storeSetName, pset = new Object[3]); pset[0] =
901 * storeSetName; pset[1] = descr; pset[2] = jobParams; // writeParam("Saving "
902 * + storeSetName + ": ", jobParams); }
904 * private void writeParam(String nm, List<ArgumentI> params) { for (ArgumentI
905 * p : params) { System.out.println(nm + ":" + System.identityHashCode(p) +
906 * " Name: " + p.getName() + " Value: " + p.getDefaultValue()); } }
908 * private Object[] _getUserPreset(String setName) { Object[] pset =
909 * editedParams.get(setName); // if (pset != null) // writeParam("Retrieving "
910 * + setName + ": ", (List<Argument>) pset[2]); return pset; }
912 * * remove the given user preset from the preset stash
916 * private void _deleteUserPreset(String setName) {
917 * editedParams.remove(setName); }
920 private void syncSetNamesWithStore()
923 // remove any set names in the drop down menu that aren't either a reserved
924 // setting, or a user defined or service preset.
925 Vector<String> items = new Vector<>();
926 while (n < setName.getItemCount())
928 String item = setName.getItemAt(n);
929 if (!item.equals(SVC_DEF) && !paramStore.presetExists(item))
931 setName.removeItemAt(n);
935 items.addElement(item);
939 if (!items.contains(SVC_DEF))
941 setName.addItem(SVC_DEF);
943 for (WsParamSetI upn : paramStore.getPresets())
945 if (!items.contains(upn.getName()))
947 setName.addItem(upn.getName());
953 * true if lastParmSet is a user preset
955 boolean isUserPreset = false;
957 private void reInitDialog(String nextPreset)
959 settingDialog = true;
960 // updateTable(null,null); // first reset to defaults
961 WsParamSetI pset = null;
962 if (nextPreset != null && nextPreset.length() > 0)
964 pset = paramStore.getPreset(nextPreset);
968 if (pset.isModifiable())
971 setDescr.setText(pset.getDescription());
972 updateTable(null, pset.getArguments());
973 lastParmSet = nextPreset;
977 isUserPreset = false;
978 setDescr.setText("");
979 // must be a default preset from service
980 updateTable(pset, null);
981 lastParmSet = nextPreset;
986 isUserPreset = false;
988 setDescr.setText("");
989 updateTable(null, null);
990 lastParmSet = SVC_DEF;
993 initArgSetModified();
994 syncSetNamesWithStore();
995 setName.setSelectedItem(lastParmSet);
996 setNamePanel.validate();
998 settingDialog = false;
1002 * Rebuild the AlignFrame web service menus (after add/delete of a preset
1005 protected void updateWebServiceMenus()
1007 if (Desktop.getInstance() == null)
1011 for (AlignFrame alignFrame : Desktop.getAlignFrames())
1013 alignFrame.buildWebServicesMenu();
1017 String curSetName = null;
1020 public void itemStateChanged(ItemEvent e)
1022 if (e.getSource() == setName
1023 && e.getStateChange() == ItemEvent.SELECTED)
1025 final String setname = (String) setName.getSelectedItem();
1026 // System.out.println("Item state changed for " + setname
1027 // + " (handling ? " + !settingDialog + ")");
1033 if (setname == null)
1037 javax.swing.SwingUtilities.invokeLater(new Runnable()
1042 doPreferenceComboStateChange(setname);
1048 private void doPreferenceComboStateChange(String setname)
1050 // user has selected a different item from combo-box
1053 String lsetname = (curSetName != null) ? curSetName : lastParmSet;
1054 if (lsetname.equals(setname))
1056 // setname was just edited - so ignore this event.
1059 settingDialog = true;
1060 System.out.println("Prompting to save " + lsetname);
1061 if (JvOptionPane.showConfirmDialog(this, "Parameter set '" + lsetname
1062 + "' is modifed, and your changes will be lost.\nReally change preset ?",
1063 "Warning: Unsaved Changes",
1064 JvOptionPane.OK_CANCEL_OPTION) != JvOptionPane.OK_OPTION)
1066 // revert the combobox to the current item
1067 settingDialog = true;
1068 setName.setSelectedItem(lsetname);
1069 settingDialog = false;
1072 // System.out.println("Saving for " + lsetname);
1073 // _storeCurrentPreset(lsetname);
1077 settingDialog = true;
1078 reInitDialog(setname);
1079 settingDialog = false;
1084 * store current settings as given name. You should then reset gui.
1086 * @param curSetName2
1088 private void _storeCurrentPreset(String curSetName2)
1090 paramStore.storePreset(curSetName2, setDescr.getText(), getJobParams());
1093 private void _updatePreset(String lastParmSet2, String curname)
1095 paramStore.updatePreset(lastParmSet2, curname, setDescr.getText(),
1101 * last saved name for this user preset
1103 String lastSetName = null;
1106 * last saved value of the description text for this user preset
1108 String lastDescrText = null;
1111 public void actionPerformed(ActionEvent e)
1113 if (e.getSource() instanceof Component)
1115 Component src = (Component) e.getSource();
1116 if (src.getParent() == setName)
1118 // rename any existing records we know about for this set.
1119 String newname = e.getActionCommand().trim();
1121 if (isServicePreset(newname))
1123 final String oldname = curSetName != null ? curSetName
1125 final Component ourframe = this;
1126 settingDialog = true;
1127 setName.getEditor().setItem(oldname);
1128 settingDialog = false;
1129 javax.swing.SwingUtilities.invokeLater(new Runnable()
1134 JvOptionPane.showMessageDialog(ourframe,
1135 MessageManager.getString(
1136 "label.invalid_name_preset_exists"),
1137 MessageManager.getString("label.invalid_name"),
1138 JvOptionPane.WARNING_MESSAGE);
1144 curSetName = newname;
1145 System.err.println("New name for user setting " + curSetName
1146 + " (was " + setName.getSelectedItem() + ")");
1147 if (curSetName.equals(setName.getSelectedItem()))
1151 if (curSetName != null)
1153 argSetModified(setName, true);
1161 private void checkDescrModified()
1166 argSetModified(setDescr,
1167 (lastDescrText == null
1168 ? setDescr.getText().trim().length() > 0
1169 : !setDescr.getText().equals(lastDescrText)));
1175 public void insertUpdate(DocumentEvent e)
1177 checkDescrModified();
1181 public void removeUpdate(DocumentEvent e)
1183 checkDescrModified();
1187 public void changedUpdate(DocumentEvent e)
1189 checkDescrModified();
1194 * @return null or the service preset selected by the user
1196 public WsParamSetI getPreset()
1198 if (isUserPreset || isModified()
1199 || (lastParmSet != null && lastParmSet.equals(SVC_DEF)))
1205 return paramStore.getPreset(lastParmSet);