Clover icon

Coverage Report

  1. Project Clover database Thu Dec 4 2025 16:11:35 GMT
  2. Package jalview.gui

File WsJobParameters.java

 

Coverage histogram

../../img/srcFileCovDistChart0.png
60% of files have more coverage

Code metrics

136
404
41
1
1,213
875
123
0.3
9.85
41
3

Classes

Class Line # Actions
WsJobParameters 84 404 123
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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.
11    *
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.
16    *
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.
20    */
21    package jalview.gui;
22   
23    import jalview.bin.Console;
24    import jalview.gui.OptsAndParamsPage.OptionBox;
25    import jalview.gui.OptsAndParamsPage.ParamBox;
26    import jalview.util.MessageManager;
27    import jalview.ws.api.UIinfo;
28    import jalview.ws.params.ArgumentI;
29    import jalview.ws.params.OptionI;
30    import jalview.ws.params.ParamDatastoreI;
31    import jalview.ws.params.ParameterI;
32    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;
37    import java.awt.Font;
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;
53   
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;
66   
67    import net.miginfocom.swing.MigLayout;
68   
69    /**
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.
80    *
81    * @author JimP
82    *
83    */
 
84    public class WsJobParameters extends JPanel implements ItemListener,
85    ActionListener, DocumentListener, OptsParametersContainerI
86    {
87    private static final int PREFERRED_WIDTH = 540;
88   
89    private static final int DEFAULT_HEIGHT = 640;
90   
91    // the default parameter set shown to the user
92    private static final String SVC_DEF = "Defaults";
93   
94    private int maxOptWidth = 200;
95   
96    // URL linkImageURL = getClass().getResource("/images/link.gif");
97   
98    // TODO ABSRACT FROM JABAWS CLASSES
99   
100    // completion stage representing whether start was clicked
101    private final CompletableFuture<Boolean> completionStage = new CompletableFuture<>();
102   
103    /**
104    * manager for options and parameters.
105    */
106    OptsAndParamsPage opanp;
107   
108    /*
109    * panel containing job options
110    */
111    JPanel optionsPanel = new JPanel();
112   
113    /*
114    * panel containing job parameters
115    */
116    JPanel paramsPanel = new JPanel();
117   
118    JPanel setNamePanel = new JPanel();
119   
120    JButton createpref = new JButton();
121   
122    JButton deletepref = new JButton();
123   
124    JButton revertpref = new JButton();
125   
126    JButton updatepref = new JButton();
127   
128    JComboBox<String> setName = new JComboBox<>();
129   
130    JTextArea setDescr = new JTextArea();
131   
132    JScrollPane paramPane = new JScrollPane();
133   
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);
142   
143    ParamDatastoreI paramStore;
144   
145    // set true when 'Start Job' is clicked
146    boolean startJob = false;
147   
148    JFrame frame = null;
149   
150    UIinfo service;
151   
152    /*
153    * list of service presets in the gui
154    */
155    Hashtable<String, String> servicePresets = null;
156   
157    /*
158    * set if dialog is being set - so handlers will avoid spurious events
159    */
160    boolean settingDialog = false;
161   
162    private Hashtable<Object, Object> modifiedElements = new Hashtable<>();
163   
164    String lastParmSet = null;
165   
 
166  0 toggle public WsJobParameters(ParamDatastoreI store, WsParamSetI preset,
167    List<ArgumentI> args)
168    {
169  0 super();
170   
171    // parameters dialog in 'compact' format (help as tooltips)
172  0 opanp = new OptsAndParamsPage(this, true);
173  0 jbInit();
174  0 this.paramStore = store;
175  0 this.service = null;
176  0 initForService(preset, args);
177  0 validate();
178    }
179   
180    /**
181    * Constructor given a set of parameters and presets, a service to be invoked,
182    * and a list of (Jabaws client) arguments
183    *
184    * @param paramStorei
185    * @param service
186    * @param preset
187    * @param jobArgset
188    */
 
189  0 toggle public WsJobParameters(ParamDatastoreI paramStorei, UIinfo service,
190    WsParamSetI preset, List<ArgumentI> jobArgset)
191    {
192  0 super();
193    // parameters dialog in 'expanded' format (help text boxes)
194  0 opanp = new OptsAndParamsPage(this, false);
195  0 jbInit();
196  0 this.paramStore = paramStorei;
197  0 if (paramStore == null && service != null)
198    {
199  0 paramStore = service.getParamStore();
200    }
201  0 this.service = service;
202  0 initForService(preset, jobArgset);
203  0 validate();
204    }
205   
206   
207    /**
208    * Shows a modal dialog containing the parameters and Start or Cancel options.
209    * Answers true if the job is started, false if cancelled.
210    *
211    * @return
212    */
 
213  0 toggle public CompletionStage<Boolean> showRunDialog()
214    {
215   
216    // Should JFrame hahve a parent of getDesktop ?
217  0 frame = new JFrame();
218  0 frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
219  0 if (service != null)
220    {
221  0 frame.setTitle(MessageManager.formatMessage("label.edit_params_for",
222    new String[] { service.getActionText() }));
223    }
224  0 Rectangle deskr = Desktop.getInstance().getBounds();
225  0 Dimension pref = this.getPreferredSize();
226  0 frame.setBounds(
227    new Rectangle((int) (deskr.getCenterX() - pref.width / 2),
228    (int) (deskr.getCenterY() - pref.height / 2),
229    pref.width, pref.height));
230  0 frame.setContentPane(this);
231   
232    // should perhaps recover defaults from user prefs.
233   
234  0 frame.validate();
235  0 javax.swing.SwingUtilities.invokeLater(new Runnable()
236    {
 
237  0 toggle @Override
238    public void run()
239    {
240    // jobPanel.setDividerLocation(0.25);
241   
242    }
243    });
244   
245  0 frame.setVisible(true);
246   
247  0 return completionStage;
248    }
249   
 
250  0 toggle private void jbInit()
251    {
252  0 this.addHierarchyBoundsListener(new HierarchyBoundsListener()
253    {
254   
 
255  0 toggle @Override
256    public void ancestorResized(HierarchyEvent arg0)
257    {
258  0 refreshParamLayout();
259    }
260   
 
261  0 toggle @Override
262    public void ancestorMoved(HierarchyEvent arg0)
263    {
264    // TODO Auto-generated method stub
265   
266    }
267    });
268  0 updatepref = JvSwingUtils.makeButton(
269    MessageManager.getString("action.update"),
270    MessageManager.getString("label.update_user_parameter_set"),
271    this::update_actionPerformed);
272  0 deletepref = JvSwingUtils.makeButton(
273    MessageManager.getString("action.delete"),
274    MessageManager.getString("label.delete_user_parameter_set"),
275    this::delete_actionPerformed);
276  0 createpref = JvSwingUtils.makeButton(
277    MessageManager.getString("action.create"),
278    MessageManager.getString("label.create_user_parameter_set"),
279    this::create_actionPerformed);
280  0 revertpref = JvSwingUtils.makeButton(
281    MessageManager.getString("action.revert"),
282    MessageManager
283    .getString("label.revert_changes_user_parameter_set"),
284    this::revert_actionPerformed);
285   
286   
287  0 JPanel setDetails = new JPanel();
288  0 setDetails.setBorder(
289    new TitledBorder(MessageManager.getString("label.details")));
290  0 setDetails.setLayout(new BorderLayout());
291  0 setDescr.setColumns(40);
292  0 setDescr.setWrapStyleWord(true);
293  0 setDescr.setLineWrap(true);
294  0 setDescr.setBackground(getBackground());
295  0 setDescr.setEditable(true);
296  0 setDescr.getDocument().addDocumentListener(this);
297  0 setDescr.setToolTipText(
298    MessageManager.getString("label.edit_notes_parameter_set"));
299  0 JScrollPane setDescrView = new JScrollPane();
300  0 setDescrView.getViewport().setView(setDescr);
301  0 setName.setEditable(true);
302  0 setName.addItemListener(this);
303  0 setName.getEditor().addActionListener(this);
304  0 JPanel setNameInfo = new JPanel(new FlowLayout(FlowLayout.LEFT));
305  0 GridBagLayout gbl = new GridBagLayout();
306  0 setNamePanel.setLayout(gbl);
307   
308  0 JLabel setNameLabel = new JLabel(
309    MessageManager.getString("label.current_parameter_set_name"));
310  0 setNameLabel.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
311   
312  0 setNameInfo.add(setNameLabel);
313  0 setNameInfo.add(setName);
314   
315    // initial button visibility
316  0 updatepref.setVisible(false);
317  0 deletepref.setVisible(false);
318  0 revertpref.setVisible(false);
319  0 createpref.setVisible(false);
320  0 JPanel setsavebuts = new JPanel();
321  0 setsavebuts.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); // GridLayout(1,2));
322  0 JPanel spacer = new JPanel();
323  0 spacer.setPreferredSize(new Dimension(2, 30));
324  0 setsavebuts.add(spacer);
325  0 setsavebuts.add(deletepref);
326  0 setsavebuts.add(revertpref);
327  0 setsavebuts.add(createpref);
328  0 setsavebuts.add(updatepref);
329    // setsavebuts.setSize(new Dimension(150, 30));
330  0 JPanel buttonArea = new JPanel(new GridLayout(1, 1));
331  0 buttonArea.add(setsavebuts);
332  0 setNamePanel.add(setNameInfo);
333  0 GridBagConstraints gbc = new GridBagConstraints();
334  0 gbc.gridheight = 2;
335  0 gbl.setConstraints(setNameInfo, gbc);
336  0 setNamePanel.add(buttonArea);
337  0 gbc = new GridBagConstraints();
338  0 gbc.gridx = 0;
339  0 gbc.gridy = 2;
340  0 gbc.gridheight = 1;
341  0 gbl.setConstraints(buttonArea, gbc);
342  0 setDetails.add(setDescrView, BorderLayout.CENTER);
343   
344    // paramPane.setPreferredSize(new Dimension(360, 400));
345    // paramPane.setPreferredSize(null);
346  0 optionsPanel.setBorder(
347    new TitledBorder(MessageManager.getString("label.options")));
348  0 optionsPanel.setOpaque(true);
349  0 paramsPanel.setBorder(
350    new TitledBorder(MessageManager.getString("label.parameters")));
351  0 paramsPanel.setOpaque(true);
352    // optsAndparams.setScrollableWidth(ScrollableSizeHint.FIT);
353    // optsAndparams.setScrollableHeight(ScrollableSizeHint.NONE);
354    // optsAndparams.setLayout(new BorderLayout());
355  0 JPanel optsAndparams = new JPanel();
356  0 optsAndparams.setLayout(new BorderLayout());
357  0 optsAndparams.add(optionsPanel, BorderLayout.NORTH);
358  0 optsAndparams.add(paramsPanel, BorderLayout.CENTER);
359  0 JPanel jp = new JPanel(new BorderLayout());
360  0 jp.add(optsAndparams, BorderLayout.CENTER);
361  0 paramPane.getViewport().setView(jp);
362  0 paramPane.setBorder(null);
363  0 setLayout(new BorderLayout());
364  0 JPanel jobPanel = new JPanel();
365  0 jobPanel.setPreferredSize(null);
366  0 jobPanel.setLayout(new BorderLayout());
367  0 jobPanel.add(setDetails, BorderLayout.NORTH);
368  0 jobPanel.add(paramPane, BorderLayout.CENTER);
369    // jobPanel.setOrientation(JSplitPane.VERTICAL_SPLIT);
370   
371  0 add(setNamePanel, BorderLayout.NORTH);
372  0 add(jobPanel, BorderLayout.CENTER);
373   
374  0 JPanel dialogpanel = new JPanel();
375  0 dialogpanel.add(startjob);
376  0 dialogpanel.add(canceljob);
377    // JAL-1580: setMaximumSize() doesn't work, so just size for the worst case:
378    // check for null is for JUnit usage
379  0 final int windowHeight = Desktop.getInstance() == null ? DEFAULT_HEIGHT
380    : Desktop.getInstance().getHeight();
381  0 setPreferredSize(new Dimension(540, windowHeight));
382  0 add(dialogpanel, BorderLayout.SOUTH);
383  0 validate();
384    }
385   
 
386  0 toggle protected void revert_actionPerformed(ActionEvent e)
387    {
388  0 reInitDialog(lastParmSet);
389  0 updateWebServiceMenus();
390    }
391   
 
392  0 toggle protected void update_actionPerformed(ActionEvent e)
393    {
394  0 if (isUserPreset)
395    {
396  0 String curname = ((String) setName.getSelectedItem()).trim();
397  0 _updatePreset(lastParmSet, curname);
398  0 lastParmSet = curname;
399  0 isUserPreset = true;
400  0 initArgSetModified();
401  0 syncSetNamesWithStore();
402    }
403    }
404   
 
405  0 toggle private void _deleteUserPreset(String lastParmSet2)
406    {
407  0 paramStore.deletePreset(lastParmSet2);
408    }
409   
 
410  0 toggle protected void delete_actionPerformed(ActionEvent e)
411    {
412  0 if (isUserPreset)
413    {
414    // delete current preset's saved entry
415  0 _deleteUserPreset(lastParmSet);
416    }
417  0 reInitDialog(null); // service default
418  0 updateWebServiceMenus();
419    }
420   
 
421  0 toggle protected void create_actionPerformed(ActionEvent e)
422    {
423  0 String curname = ((String) setName.getSelectedItem()).trim();
424  0 if (curname.length() > 0)
425    {
426  0 _storeCurrentPreset(curname);
427  0 lastParmSet = curname;
428  0 isUserPreset = true;
429  0 reInitDialog(curname);
430  0 initArgSetModified();
431  0 updateWebServiceMenus();
432    }
433    else
434    {
435    // TODO: show warning
436  0 jalview.bin.Console.errPrintln("Invalid name. Not saved.");
437    }
438    }
439   
 
440  0 toggle protected void canceljob_actionPerformed(ActionEvent e)
441    {
442  0 startJob = false;
443  0 if (frame != null)
444    {
445  0 frame.setVisible(false);
446    }
447  0 completionStage.complete(false);
448    }
449   
 
450  0 toggle protected void startjob_actionPerformed(ActionEvent e)
451    {
452  0 startJob = true;
453  0 if (frame != null)
454    {
455  0 frame.setVisible(false);
456    }
457  0 completionStage.complete(true);
458    }
459   
 
460  0 toggle void initForService(WsParamSetI paramSet, List<ArgumentI> jobArgset)
461    {
462  0 settingDialog = true;
463   
464  0 init(paramSet, jobArgset);
465   
466    }
467   
 
468  0 toggle void init(WsParamSetI p, List<ArgumentI> jobArgset)
469    {
470  0 Hashtable<String, String> exnames = new Hashtable<>();
471  0 for (int i = 0, iSize = setName.getItemCount(); i < iSize; i++)
472    {
473  0 exnames.put(setName.getItemAt(i), setName.getItemAt(i));
474    }
475  0 servicePresets = new Hashtable<>();
476    // Add the default entry - if not present already.
477  0 if (!exnames.contains(SVC_DEF))
478    {
479  0 setName.addItem(SVC_DEF);
480  0 exnames.put(SVC_DEF, SVC_DEF);
481  0 servicePresets.put(SVC_DEF, SVC_DEF);
482    }
483    // String curname = (p == null ? "" : p.getName());
484  0 for (WsParamSetI pr : paramStore.getPresets())
485    {
486  0 if (!pr.isModifiable())
487    {
488  0 servicePresets.put(pr.getName(), "preset");
489    }
490    else
491    {
492    }
493  0 if (!exnames.contains(pr.getName()))
494    {
495  0 setName.addItem(pr.getName());
496    }
497    }
498    // TODO: if initial jobArgset matches a given user setting or preset then
499    // should recover setting accordingly
500    // updateTable(p, jobArgset);
501  0 if (p != null)
502    {
503  0 reInitDialog(p.getName());
504  0 initArgSetModified();
505    }
506    else
507    {
508  0 if (jobArgset != null && jobArgset.size() > 0)
509    {
510  0 curSetName = "Supplied Settings";
511  0 isUserPreset = false;
512  0 updateTable(p, jobArgset);
513  0 setName.setSelectedItem(curSetName);
514  0 updateButtonDisplay();
515    }
516    else
517    {
518  0 curSetName = null;
519  0 reInitDialog(null);
520    }
521    }
522  0 settingDialog = false;
523   
524    }
525   
 
526  0 toggle private void updateTable(WsParamSetI p, List<ArgumentI> jobArgset)
527    {
528  0 boolean setDefaultParams = false;
529  0 if (lastParmSet == null)
530    {
531  0 isUserPreset = false;
532    // First call - so provide Service default settings
533  0 setName.setSelectedItem(lastSetName = SVC_DEF);
534    }
535  0 if (p == null && SVC_DEF.equals("" + setName.getSelectedItem()))
536    {
537    // indicate that service defaults should be set if available
538  0 setDefaultParams = true;
539    }
540    // populate table from default parameter set.
541  0 List<ArgumentI> args = paramStore.getServiceParameters();
542   
543    // split to params and required arguments
544    {
545  0 int cw = 0;
546  0 boolean optset = false;
547  0 for (ArgumentI myarg : args)
548    {
549    // Ideally, Argument would implement isRequired !
550  0 if (myarg instanceof ParameterI)
551    {
552  0 ParameterI parm = (ParameterI) myarg;
553  0 opanp.addParameter(parm).validate();
554    }
555    else
556    {
557  0 if (myarg instanceof OptionI)
558    {
559  0 OptionI opt = (OptionI) myarg;
560  0 OptionBox ob = opanp.addOption(opt);
561  0 ob.resetToDefault(setDefaultParams);
562  0 if (maxOptWidth < ob.getPreferredSize().width)
563    {
564  0 maxOptWidth = ob.getPreferredSize().width;
565    }
566  0 ob.validate();
567  0 cw += ob.getPreferredSize().width + 5;
568    }
569    else
570    {
571  0 jalview.bin.Console
572    .errPrintln("Ignoring unknown service argument type "
573    + myarg.getClass().getName());
574    }
575    }
576    }
577  0 args = null; // no more args to process.
578    }
579  0 if (p != null)
580    {
581  0 isUserPreset = false;
582    // initialise setname
583  0 setName.setSelectedItem(lastSetName = p.getName());
584  0 setDescr.setText(lastDescrText = p.getDescription());
585    // TODO - URL link
586  0 try
587    {
588  0 args = p.getArguments();
589    } catch (Exception e)
590    {
591  0 e.printStackTrace();
592    }
593    // TODO: check if args should be unselected prior to resetting using the
594    // preset
595    }
596   
597  0 if (jobArgset != null)
598    {
599  0 argSetModified(jobArgset, true);
600  0 args = jobArgset;
601    }
602    // get setargs from current object
603  0 if (args != null)
604    {
605  0 for (ArgumentI arg : args)
606    {
607  0 if (arg instanceof ParameterI)
608    {
609  0 opanp.setParameter((ParameterI) arg);
610    }
611    else
612    {
613  0 if (arg instanceof OptionI)
614    {
615    // jalview.bin.Console.outPrintln("Setting option "
616    // + System.identityHashCode(arg) + ":" + arg.getName()
617    // + " with " + arg.getDefaultValue());
618  0 opanp.selectOption((OptionI) arg, arg.getValue());
619    }
620    }
621   
622    }
623    }
624   
625  0 refreshParamLayout();
626  0 revalidate();
627    }
628   
 
629  0 toggle private boolean isModified()
630    {
631  0 return modifiedElements.size() > 0;
632    }
633   
634   
635    /**
636    * reset gui and modification state settings
637    */
 
638  0 toggle private void initArgSetModified()
639    {
640  0 curSetName = null;
641  0 modifiedElements.clear();
642  0 updateButtonDisplay();
643    }
644   
 
645  0 toggle private void updateButtonDisplay()
646    {
647  0 boolean _update = false, _create = false, _delete = false,
648    _revert = false;
649  0 if (modifiedElements.size() > 0)
650    {
651    // set modified
652  0 _revert = true;
653  0 _update = isUserPreset; // can only update user presets
654  0 if (!isUserPreset || modifiedElements.containsKey(setName))
655    {
656    // name modified - can create new preset
657  0 _create = true;
658    }
659    }
660    else
661    {
662    // set unmodified
663    }
664    // can still delete a user preset
665  0 _delete = isUserPreset;
666   
667  0 createpref.setVisible(_create);
668  0 updatepref.setVisible(_update);
669  0 deletepref.setVisible(_delete);
670  0 revertpref.setVisible(_revert);
671  0 validate();
672    }
673   
 
674  0 toggle @Override
675    public void argSetModified(Object modifiedElement, boolean b)
676    {
677  0 if (settingDialog)
678    {
679  0 return;
680    }
681  0 if (!b)
682    {
683  0 modifiedElements.remove(modifiedElement);
684    }
685    else
686    {
687  0 if (b && modifiedElement == setName
688    && modifiedElements.contains(modifiedElement))
689    {
690    // HACK! prevents iteration on makeSetNameValid
691  0 b = false;
692    }
693  0 modifiedElements.put(modifiedElement, modifiedElement);
694    }
695    // set mod status based on presence of elements in table
696  0 if (b && modifiedElements.size() > 0)
697    {
698  0 makeSetNameValid(!isUserPreset);
699  0 setNamePanel.revalidate();
700    }
701  0 updateButtonDisplay();
702    }
703   
 
704  0 toggle private boolean isServicePreset(String selectedItem)
705    {
706  0 return selectedItem.equals(SVC_DEF)
707    || servicePresets.containsKey(selectedItem);
708    }
709   
710    /**
711    * check if the current set name is a valid set name for saving, if not, then
712    * fix it.
713    */
 
714  0 toggle private void makeSetNameValid(boolean newuserset)
715    {
716  0 boolean stn = settingDialog;
717  0 boolean renamed = false;
718  0 settingDialog = true;
719  0 String nm = (curSetName != null ? curSetName
720    : (String) setName.getSelectedItem());
721    // check if the name is reserved - if it is, rename it.
722  0 if (isServicePreset(nm))
723    {
724  0 nm = "User " + nm;
725  0 renamed = true;
726    }
727  0 String tnm = nm;
728  0 if (newuserset)
729    {
730  0 int i = 0;
731  0 while (paramStore.getPreset(tnm) != null)
732    {
733  0 tnm = nm + " (" + (++i) + ")";
734  0 renamed = true;
735    }
736  0 if (i > 0)
737    {
738  0 nm = tnm;
739    }
740    }
741   
742  0 boolean makeupdate = false;
743    // sync the gui with the preset database
744  0 for (int i = 0, iS = setName.getItemCount(); i < iS; i++)
745    {
746  0 String snm = setName.getItemAt(i);
747  0 if (snm.equals(nm))
748    {
749  0 makeupdate = true;
750    // setName.setSelectedIndex(i);
751    }
752    }
753  0 if (!makeupdate)
754    {
755  0 setName.addItem(curSetName = nm);
756  0 setName.setSelectedItem(curSetName);
757    }
758  0 if (renamed)
759    {
760  0 settingDialog = false; // we need this name change to be registered.
761  0 argSetModified(setName, renamed);
762    }
763  0 settingDialog = stn;
764    }
765   
766    /**
767    * Rebuilds the Options and Parameters panels
768    */
 
769  0 toggle @Override
770    public void refreshParamLayout()
771    {
772  0 final int rightMargin = 40;
773  0 final int availableWidth = paramPane.getViewport().getSize().width
774    - rightMargin
775    - optionsPanel.getBorder().getBorderInsets(optionsPanel).left
776    + optionsPanel.getBorder().getBorderInsets(optionsPanel).right;
777   
778  0 if (opanp.getOptSet().size() > 0)
779    {
780  0 int hgap = 5;
781  0 int currentWidth = hgap;
782   
783    /*
784    * layout constraint 'nogrid' prevents vertical column alignment,
785    * allowing controls to flow without extra space inserted to align
786    */
787  0 optionsPanel.setLayout(new MigLayout("nogrid", "", ""));
788  0 optionsPanel.removeAll();
789  0 JPanel lastAdded = null;
790   
791    /*
792    * add each control in turn; if adding would overflow the right margin,
793    * remove and re-add the previous parameter with "wrap" (after)
794    * in order to start a new row
795    */
796  0 for (OptionBox pbox : opanp.getOptSet().values())
797    {
798  0 pbox.validate();
799  0 int boxWidth = pbox.getSize().width;
800  0 currentWidth += boxWidth + hgap;
801  0 boolean wrapAfterLast = currentWidth > availableWidth
802    && lastAdded != null;
803    // jalview.bin.Console.outPrintln(String.format(
804    // "%s width=%d, paneWidth=%d, currentWidth=%d, wrapAfterLast=%s",
805    // pbox.toString(), boxWidth, panewidth, currentWidth,
806    // wrapAfterLast));
807  0 if (wrapAfterLast)
808    {
809  0 optionsPanel.remove(lastAdded);
810  0 optionsPanel.add(lastAdded, "wrap");
811  0 currentWidth = hgap + boxWidth;
812    }
813  0 optionsPanel.add(pbox);
814  0 lastAdded = pbox;
815    }
816  0 optionsPanel.revalidate();
817    }
818    else
819    {
820  0 optionsPanel.setVisible(false);
821    }
822   
823  0 if (opanp.getParamSet().size() > 0)
824    {
825  0 paramsPanel.removeAll();
826  0 paramsPanel.setLayout(new MigLayout("", "", ""));
827  0 int hgap = 5;
828  0 int currentWidth = hgap;
829   
830  0 JPanel lastAdded = null;
831  0 for (ParamBox pbox : opanp.getParamSet().values())
832    {
833  0 pbox.validate();
834  0 int boxWidth = pbox.getSize().width;
835  0 currentWidth += boxWidth + hgap;
836  0 boolean wrapAfterLast = currentWidth > availableWidth
837    && lastAdded != null;
838  0 if (wrapAfterLast)
839    {
840  0 paramsPanel.remove(lastAdded);
841  0 paramsPanel.add(lastAdded, "wrap");
842  0 currentWidth = pbox.getSize().width + hgap;
843    }
844  0 paramsPanel.add(pbox);
845  0 lastAdded = pbox;
846    }
847   
848    /*
849    * s = 2 * sep; for (ParamBox pbox : opanp.getParamSet().values()) {
850    * pbox.validate(); s += sep +
851    * pbox.getPreferredSize().height+pbox.getBorder
852    * ().getBorderInsets(pbox).bottom; }
853    *
854    * // paramList.setPreferredSize(new Dimension(w, s));
855    * os+=s+2*sep+paramList
856    * .getBorder().getBorderInsets(paramList).bottom+paramList
857    * .getBorder().getBorderInsets(paramList).top;
858    */
859  0 paramsPanel.revalidate();
860    }
861    else
862    {
863  0 paramsPanel.setVisible(false);
864    }
865    // TODO: waste some time trying to eliminate any unnecessary .validate calls
866    // here
867    // jalview.bin.Console.outPrintln("Size will be : "+w+","+os);
868    // optsAndparams.setPreferredSize(null);
869    // paramPane.getViewport().setView(optsAndparams);
870  0 paramPane.getViewport().setAutoscrolls(true);
871  0 paramPane.revalidate();
872  0 revalidate();
873    }
874   
875   
 
876  0 toggle public boolean isServiceDefaults()
877    {
878  0 return (!isModified()
879    && (lastParmSet != null && lastParmSet.equals(SVC_DEF)));
880    }
881   
 
882  0 toggle public List<ArgumentI> getJobParams()
883    {
884  0 return opanp.getCurrentSettings();
885    }
886   
887   
888    /*
889    * Hashtable<String, Object[]> editedParams = new Hashtable<String,
890    * Object[]>();
891    *
892    * store the given parameters in the user parameter set database.
893    *
894    * @param storeSetName - lastParmSet
895    *
896    * @param descr - setDescr.getText()
897    *
898    * @param jobParams - getJobParams()
899    *
900    * private void _storeUserPreset(String storeSetName, String descr,
901    * List<ArgumentI> jobParams) { // this is a simple hash store. Object[] pset;
902    * editedParams.put(storeSetName, pset = new Object[3]); pset[0] =
903    * storeSetName; pset[1] = descr; pset[2] = jobParams; // writeParam("Saving "
904    * + storeSetName + ": ", jobParams); }
905    *
906    * private void writeParam(String nm, List<ArgumentI> params) { for (ArgumentI
907    * p : params) { jalview.bin.Console.outPrintln(nm + ":" + System.identityHashCode(p) +
908    * " Name: " + p.getName() + " Value: " + p.getDefaultValue()); } }
909    *
910    * private Object[] _getUserPreset(String setName) { Object[] pset =
911    * editedParams.get(setName); // if (pset != null) // writeParam("Retrieving "
912    * + setName + ": ", (List<Argument>) pset[2]); return pset; }
913    *
914    * * remove the given user preset from the preset stash
915    *
916    * @param setName
917    *
918    * private void _deleteUserPreset(String setName) {
919    * editedParams.remove(setName); }
920    */
921   
 
922  0 toggle private void syncSetNamesWithStore()
923    {
924  0 int n = 0;
925    // remove any set names in the drop down menu that aren't either a reserved
926    // setting, or a user defined or service preset.
927  0 Vector<String> items = new Vector<>();
928  0 while (n < setName.getItemCount())
929    {
930  0 String item = setName.getItemAt(n);
931  0 if (!item.equals(SVC_DEF) && !paramStore.presetExists(item))
932    {
933  0 setName.removeItemAt(n);
934    }
935    else
936    {
937  0 items.addElement(item);
938  0 n++;
939    }
940    }
941  0 if (!items.contains(SVC_DEF))
942    {
943  0 setName.addItem(SVC_DEF);
944    }
945  0 for (WsParamSetI upn : paramStore.getPresets())
946    {
947  0 if (!items.contains(upn.getName()))
948    {
949  0 setName.addItem(upn.getName());
950    }
951    }
952    }
953   
954    /**
955    * true if lastParmSet is a user preset
956    */
957    boolean isUserPreset = false;
958   
 
959  0 toggle private void reInitDialog(String nextPreset)
960    {
961  0 settingDialog = true;
962    // updateTable(null,null); // first reset to defaults
963  0 WsParamSetI pset = null;
964  0 if (nextPreset != null && nextPreset.length() > 0)
965    {
966  0 pset = paramStore.getPreset(nextPreset);
967    }
968  0 if (pset != null)
969    {
970  0 if (pset.isModifiable())
971    {
972  0 isUserPreset = true;
973  0 setDescr.setText(pset.getDescription());
974  0 updateTable(null, pset.getArguments());
975  0 lastParmSet = nextPreset;
976    }
977    else
978    {
979  0 isUserPreset = false;
980  0 setDescr.setText("");
981    // must be a default preset from service
982  0 updateTable(pset, null);
983  0 lastParmSet = nextPreset;
984    }
985    }
986    else
987    {
988  0 isUserPreset = false;
989    // Service defaults
990  0 setDescr.setText("");
991  0 updateTable(null, null);
992  0 lastParmSet = SVC_DEF;
993    }
994   
995  0 initArgSetModified();
996  0 syncSetNamesWithStore();
997  0 setName.setSelectedItem(lastParmSet);
998  0 setNamePanel.validate();
999  0 validate();
1000  0 settingDialog = false;
1001    }
1002   
1003    /**
1004    * Rebuild the AlignFrame web service menus (after add/delete of a preset
1005    * option).
1006    */
 
1007  0 toggle protected void updateWebServiceMenus()
1008    {
1009  0 if (Desktop.getInstance() == null)
1010    {
1011  0 return;
1012    }
1013  0 for (AlignFrame alignFrame : Desktop.getDesktopAlignFrames())
1014    {
1015  0 alignFrame.buildWebServicesMenu();
1016    }
1017    }
1018   
1019    String curSetName = null;
1020   
 
1021  0 toggle @Override
1022    public void itemStateChanged(ItemEvent e)
1023    {
1024  0 if (e.getSource() == setName
1025    && e.getStateChange() == ItemEvent.SELECTED)
1026    {
1027  0 final String setname = (String) setName.getSelectedItem();
1028  0 if (Console.isDebugEnabled())
1029    {
1030  0 Console.debug("Item state changed for " + setname + " (handling ? "
1031    + !settingDialog + ")");
1032    }
1033  0 if (settingDialog)
1034    {
1035    // ignore event
1036  0 return;
1037    }
1038  0 if (setname == null)
1039    {
1040  0 return;
1041    }
1042  0 javax.swing.SwingUtilities.invokeLater(new Runnable()
1043    {
 
1044  0 toggle @Override
1045    public void run()
1046    {
1047  0 doPreferenceComboStateChange(setname);
1048    }
1049    });
1050    }
1051    }
1052   
 
1053  0 toggle private void doPreferenceComboStateChange(String setname)
1054    {
1055    // user has selected a different item from combo-box
1056  0 if (isModified())
1057    {
1058  0 String lsetname = (curSetName != null) ? curSetName : lastParmSet;
1059  0 if (lsetname.equals(setname))
1060    {
1061    // setname was just edited - so ignore this event.
1062  0 return;
1063    }
1064  0 settingDialog = true;
1065  0 jalview.bin.Console.outPrintln("Prompting to save " + lsetname);
1066  0 if (JvOptionPane.showConfirmDialog(this, "Parameter set '" + lsetname
1067    + "' is modifed, and your changes will be lost.\nReally change preset ?",
1068    "Warning: Unsaved Changes",
1069    JvOptionPane.OK_CANCEL_OPTION) != JvOptionPane.OK_OPTION)
1070    {
1071    // revert the combobox to the current item
1072  0 settingDialog = true;
1073  0 setName.setSelectedItem(lsetname);
1074  0 settingDialog = false;
1075    // and leave.
1076  0 return;
1077    // jalview.bin.Console.outPrintln("Saving for " + lsetname);
1078    // _storeCurrentPreset(lsetname);
1079   
1080    }
1081    }
1082  0 settingDialog = true;
1083  0 reInitDialog(setname);
1084  0 settingDialog = false;
1085   
1086    }
1087   
1088    /**
1089    * store current settings as given name. You should then reset gui.
1090    *
1091    * @param curSetName2
1092    */
 
1093  0 toggle private void _storeCurrentPreset(String curSetName2)
1094    {
1095  0 paramStore.storePreset(curSetName2, setDescr.getText(), getJobParams());
1096    }
1097   
 
1098  0 toggle private void _updatePreset(String lastParmSet2, String curname)
1099    {
1100  0 paramStore.updatePreset(lastParmSet2, curname, setDescr.getText(),
1101    getJobParams());
1102   
1103    }
1104   
1105    /**
1106    * last saved name for this user preset
1107    */
1108    String lastSetName = null;
1109   
1110    /**
1111    * last saved value of the description text for this user preset
1112    */
1113    String lastDescrText = null;
1114   
 
1115  0 toggle @Override
1116    public void actionPerformed(ActionEvent e)
1117    {
1118  0 if (e.getSource() instanceof Component)
1119    {
1120  0 Component src = (Component) e.getSource();
1121  0 if (src.getParent() == setName)
1122    {
1123    // rename any existing records we know about for this set.
1124  0 String newname = e.getActionCommand().trim();
1125  0 String msg = null;
1126  0 if (isServicePreset(newname))
1127    {
1128  0 final String oldname = curSetName != null ? curSetName
1129    : lastParmSet;
1130  0 final Component ourframe = this;
1131  0 settingDialog = true;
1132  0 setName.getEditor().setItem(oldname);
1133  0 settingDialog = false;
1134  0 javax.swing.SwingUtilities.invokeLater(new Runnable()
1135    {
 
1136  0 toggle @Override
1137    public void run()
1138    {
1139  0 JvOptionPane.showMessageDialog(ourframe,
1140    MessageManager.getString(
1141    "label.invalid_name_preset_exists"),
1142    MessageManager.getString("label.invalid_name"),
1143    JvOptionPane.WARNING_MESSAGE);
1144    }
1145    });
1146   
1147  0 return;
1148    }
1149  0 curSetName = newname;
1150  0 jalview.bin.Console.errPrintln("New name for user setting "
1151    + curSetName + " (was " + setName.getSelectedItem() + ")");
1152  0 if (curSetName.equals(setName.getSelectedItem()))
1153    {
1154  0 curSetName = null;
1155    }
1156  0 if (curSetName != null)
1157    {
1158  0 argSetModified(setName, true);
1159  0 return;
1160    }
1161   
1162    }
1163    }
1164    }
1165   
 
1166  0 toggle private void checkDescrModified()
1167    {
1168  0 if (!settingDialog)
1169    {
1170   
1171  0 argSetModified(setDescr,
1172  0 (lastDescrText == null
1173    ? setDescr.getText().trim().length() > 0
1174    : !setDescr.getText().equals(lastDescrText)));
1175   
1176    }
1177    }
1178   
 
1179  0 toggle @Override
1180    public void insertUpdate(DocumentEvent e)
1181    {
1182  0 checkDescrModified();
1183    }
1184   
 
1185  0 toggle @Override
1186    public void removeUpdate(DocumentEvent e)
1187    {
1188  0 checkDescrModified();
1189    }
1190   
 
1191  0 toggle @Override
1192    public void changedUpdate(DocumentEvent e)
1193    {
1194  0 checkDescrModified();
1195    }
1196   
1197    /**
1198    *
1199    * @return null or the service preset selected by the user
1200    */
 
1201  0 toggle public WsParamSetI getPreset()
1202    {
1203  0 if (isUserPreset || isModified()
1204    || (lastParmSet != null && lastParmSet.equals(SVC_DEF)))
1205    {
1206  0 return null;
1207    }
1208    else
1209    {
1210  0 return paramStore.getPreset(lastParmSet);
1211    }
1212    }
1213    }