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 java.awt.BorderLayout;
24 import java.awt.Color;
25 import java.awt.Component;
26 import java.awt.Dimension;
28 import java.awt.event.ActionEvent;
29 import java.awt.event.ActionListener;
30 import java.awt.event.MouseEvent;
32 import java.util.ArrayList;
33 import java.util.List;
35 import javax.help.HelpSetException;
36 import javax.swing.JComboBox;
37 import javax.swing.JFileChooser;
38 import javax.swing.JInternalFrame;
39 import javax.swing.JPanel;
40 import javax.swing.ListSelectionModel;
41 import javax.swing.RowFilter;
42 import javax.swing.RowSorter;
43 import javax.swing.SortOrder;
44 import javax.swing.event.DocumentEvent;
45 import javax.swing.event.DocumentListener;
46 import javax.swing.event.ListSelectionEvent;
47 import javax.swing.event.ListSelectionListener;
48 import javax.swing.table.TableCellRenderer;
49 import javax.swing.table.TableColumn;
50 import javax.swing.table.TableModel;
51 import javax.swing.table.TableRowSorter;
53 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
54 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
55 import jalview.bin.Cache;
56 import jalview.ext.pymol.PymolManager;
57 import jalview.gui.Help.HelpId;
58 import jalview.gui.StructureViewer.ViewerType;
59 import jalview.io.BackupFiles;
60 import jalview.io.BackupFilesPresetEntry;
61 import jalview.io.FileFormatI;
62 import jalview.io.JalviewFileChooser;
63 import jalview.io.JalviewFileView;
64 import jalview.jbgui.GPreferences;
65 import jalview.jbgui.GSequenceLink;
66 import jalview.schemes.ColourSchemeI;
67 import jalview.schemes.ColourSchemes;
68 import jalview.schemes.ResidueColourScheme;
69 import jalview.urls.UrlLinkTableModel;
70 import jalview.urls.api.UrlProviderFactoryI;
71 import jalview.urls.api.UrlProviderI;
72 import jalview.urls.desktop.DesktopUrlProviderFactory;
73 import jalview.util.MessageManager;
74 import jalview.util.Platform;
75 import jalview.util.UrlConstants;
76 import jalview.ws.sifts.SiftsSettings;
84 public class Preferences extends GPreferences
86 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
88 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
90 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
92 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
94 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
96 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
98 public static final String ADD_SS_ANN = "ADD_SS_ANN";
100 public static final String USE_RNAVIEW = "USE_RNAVIEW";
102 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
104 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
106 public static final String CHIMERA_PATH = "CHIMERA_PATH";
108 public static final String CHIMERAX_PATH = "CHIMERAX_PATH";
110 public static final String PYMOL_PATH = "PYMOL_PATH";
112 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
114 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
116 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
118 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
120 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
122 public static final String GAP_COLOUR = "GAP_COLOUR";
124 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
126 private static final int MIN_FONT_SIZE = 1;
128 private static final int MAX_FONT_SIZE = 30;
130 private String previousProxyType;
133 * Holds name and link separated with | character. Sequence ID must be
134 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
136 public static UrlProviderI sequenceUrlLinks;
138 public static UrlLinkTableModel dataModel;
141 * Holds name and link separated with | character. Sequence IDS and Sequences
142 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
143 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
144 * for first and second token specified after a pipe character at end |,|.
145 * (TODO: proper escape for using | to separate ids or sequences
148 public static List<String> groupURLLinks;
151 // get links selected to be in the menu (SEQUENCE_LINKS)
152 // and links entered by the user but not selected (STORED_LINKS)
153 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
154 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
155 String defaultUrl = Cache.getDefault("DEFAULT_URL",
156 UrlConstants.DEFAULT_LABEL);
158 // if both links lists are empty, add the DEFAULT_URL link
159 // otherwise we assume the default link is in one of the lists
160 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
162 inMenuString = UrlConstants.DEFAULT_STRING;
164 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
165 inMenuString, notInMenuString);
166 sequenceUrlLinks = factory.createUrlProvider();
167 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
170 * TODO: reformulate groupURL encoding so two or more can be stored in the
171 * .properties file as '|' separated strings
174 groupURLLinks = new ArrayList<>();
177 JInternalFrame frame;
179 private WsPreferences wsPrefs;
181 private OptionsParam promptEachTimeOpt = new OptionsParam(
182 MessageManager.getString("label.prompt_each_time"),
185 private OptionsParam lineArtOpt = new OptionsParam(
186 MessageManager.getString("label.lineart"), "Lineart");
188 private OptionsParam textOpt = new OptionsParam(
189 MessageManager.getString("action.text"), "Text");
192 * Creates a new Preferences object.
199 public Preferences(int selectTab)
202 frame = new JInternalFrame();
203 frame.setContentPane(this);
204 if (!Platform.isJS())
211 wsPrefs = new WsPreferences();
212 wsTab.add(wsPrefs, BorderLayout.CENTER);
214 int width = 500, height = 450;
215 if (Platform.isAMacAndNotJS())
221 Desktop.addInternalFrame(frame,
222 MessageManager.getString("label.preferences"), width, height);
223 frame.setMinimumSize(new Dimension(width, height));
226 * Set Visual tab defaults
228 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
229 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
230 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
231 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
233 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
234 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
235 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
236 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
238 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
239 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
241 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
242 showGroupConservation.setSelected(
243 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
244 showConsensHistogram.setSelected(
245 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
247 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
249 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
251 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
253 String[] fonts = java.awt.GraphicsEnvironment
254 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
255 for (int i = 0; i < fonts.length; i++)
257 fontNameCB.addItem(fonts[i]);
260 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
262 fontSizeCB.addItem(i + "");
265 fontStyleCB.addItem("plain");
266 fontStyleCB.addItem("bold");
267 fontStyleCB.addItem("italic");
269 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
270 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
271 fontStyleCB.setSelectedItem(
272 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
274 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", true));
276 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
278 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
280 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
282 gapSymbolCB.addItem("-");
283 gapSymbolCB.addItem(".");
285 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
287 sortby.addItem("No sort");
288 sortby.addItem("Id");
289 sortby.addItem("Pairwise Identity");
290 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
292 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
294 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
296 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
297 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
298 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
299 SequenceAnnotationOrder.NONE.name()));
300 sortAnnBy.setSelectedItem(savedSort.toString());
302 sortAutocalc.addItem("Autocalculated first");
303 sortAutocalc.addItem("Autocalculated last");
304 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
305 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
306 : sortAutocalc.getItemAt(1));
308 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
309 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
310 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
311 + "/examples/exampleFile_2_3.jar"));
314 * Set Colours tab defaults
316 protColour.addItem(ResidueColourScheme.NONE);
317 nucColour.addItem(ResidueColourScheme.NONE);
318 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
320 String name = cs.getSchemeName();
321 protColour.addItem(name);
322 nucColour.addItem(name);
324 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
325 ResidueColourScheme.NONE);
326 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
327 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
328 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
329 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
330 minColour.setBackground(
331 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
332 maxColour.setBackground(
333 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
336 * Set overview panel defaults
338 gapColour.setBackground(
339 Cache.getDefaultColour(GAP_COLOUR,
340 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
341 hiddenColour.setBackground(
342 Cache.getDefaultColour(HIDDEN_COLOUR,
343 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
344 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
345 gapLabel.setEnabled(!useLegacyGap.isSelected());
346 gapColour.setEnabled(!useLegacyGap.isSelected());
348 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
351 * Set Structure tab defaults
353 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
354 structFromPdb.setSelected(structSelected);
355 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
356 useRnaView.setEnabled(structSelected);
357 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
358 addSecondaryStructure.setEnabled(structSelected);
359 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
360 addTempFactor.setEnabled(structSelected);
363 * set choice of structure viewer, and path if saved as a preference;
364 * default to Jmol (first choice) if an unexpected value is found
366 String viewerType = Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name());
367 structViewer.setSelectedItem(viewerType);
368 String viewerPath = "";
369 ViewerType type = null;
372 type = ViewerType.valueOf(viewerType);
378 viewerPath = Cache.getDefault(CHIMERA_PATH, "");
381 viewerPath = Cache.getDefault(CHIMERAX_PATH, "");
384 viewerPath = Cache.getDefault(PYMOL_PATH, "");
387 } catch (IllegalArgumentException e)
389 Cache.log.error("Unknown structure viewer type: " + viewerType
390 + ", defaulting to Jmol");
391 type = ViewerType.JMOL;
393 structureViewerPath.setText(viewerPath);
395 structureViewerPath.addActionListener(new ActionListener()
398 public void actionPerformed(ActionEvent e)
400 if (validateViewerPath())
402 Cache.setProperty(structViewer.getSelectedItem()
403 .equals(ViewerType.CHIMERAX.name())
405 : CHIMERA_PATH, structureViewerPath.getText());
410 if (Cache.getDefault("MAP_WITH_SIFTS", false))
412 siftsMapping.setSelected(true);
416 nwMapping.setSelected(true);
420 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
423 * Set Connections tab defaults
427 linkUrlTable.setModel(dataModel);
428 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
429 linkUrlTable.getModel());
430 linkUrlTable.setRowSorter(sorter);
431 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
433 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
434 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
435 SortOrder.DESCENDING));
436 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
437 SortOrder.DESCENDING));
439 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
441 sorter.setSortKeys(sortKeys);
442 // BH 2018 setSortKeys will do the sort
446 ActionListener onReset;
447 onReset = new ActionListener()
450 public void actionPerformed(ActionEvent e)
452 filterTB.setText("");
453 sorter.setRowFilter(RowFilter.regexFilter(""));
457 doReset.addActionListener(onReset);
459 // filter to display only custom urls
460 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
463 public boolean include(
464 Entry<? extends TableModel, ? extends Object> entry)
466 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
470 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
471 linkUrlTable.getModel());
472 customSorter.setRowFilter(customUrlFilter);
474 ActionListener onCustomOnly;
475 onCustomOnly = new ActionListener()
478 public void actionPerformed(ActionEvent e)
480 filterTB.setText("");
481 sorter.setRowFilter(customUrlFilter);
484 userOnly.addActionListener(onCustomOnly);
486 filterTB.getDocument().addDocumentListener(new DocumentListener()
488 String caseInsensitiveFlag = "(?i)";
491 public void changedUpdate(DocumentEvent e)
493 sorter.setRowFilter(RowFilter
494 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
498 public void removeUpdate(DocumentEvent e)
500 sorter.setRowFilter(RowFilter
501 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
505 public void insertUpdate(DocumentEvent e)
507 sorter.setRowFilter(RowFilter
508 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
512 // set up list selection functionality
513 linkUrlTable.getSelectionModel()
514 .addListSelectionListener(new UrlListSelectionHandler());
516 // set up radio buttons
517 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
519 String onClickName = linkUrlTable.getColumnName(onClickCol);
520 linkUrlTable.getColumn(onClickName)
521 .setCellRenderer(new RadioButtonRenderer());
522 linkUrlTable.getColumn(onClickName)
523 .setCellEditor(new RadioButtonEditor());
525 // get boolean columns and resize those to min possible
526 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
528 if (linkUrlTable.getModel().getColumnClass(column)
529 .equals(Boolean.class))
531 TableColumn tableColumn = linkUrlTable.getColumnModel()
533 int preferredWidth = tableColumn.getMinWidth();
535 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
537 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
538 int cwidth = c.getPreferredSize().width
539 + linkUrlTable.getIntercellSpacing().width;
540 preferredWidth = Math.max(preferredWidth, cwidth);
542 tableColumn.setPreferredWidth(preferredWidth);
546 String proxyTypeString = Cache.getDefault("USE_PROXY", "false");
547 previousProxyType = proxyTypeString;
548 switch (proxyTypeString)
550 case Cache.PROXYTYPE_NONE:
551 proxyType.setSelected(noProxy.getModel(), true);
553 case Cache.PROXYTYPE_SYSTEM:
554 proxyType.setSelected(systemProxy.getModel(), true);
556 case Cache.PROXYTYPE_CUSTOM:
557 proxyType.setSelected(customProxy.getModel(), true);
560 String message = "Incorrect PROXY_TYPE - should be 'none' (clear proxy properties), 'false' (system settings), 'true' (custom settings): "
562 Cache.log.warn(message);
564 proxyServerHttpTB.setText(Cache.getDefault("PROXY_SERVER", ""));
565 proxyPortHttpTB.setText(Cache.getDefault("PROXY_PORT", ""));
566 proxyServerHttpsTB.setText(Cache.getDefault("PROXY_SERVER_HTTPS", ""));
567 proxyPortHttpsTB.setText(Cache.getDefault("PROXY_PORT_HTTPS", ""));
568 proxyAuth.setSelected(Cache.getDefault("PROXY_AUTH", false));
570 .setText(Cache.getDefault("PROXY_AUTH_USERNAME", ""));
571 // we are not storing or retrieving proxy password from .jalview_properties
572 proxyAuthPasswordTB.setText(Cache.proxyAuthPassword == null ? ""
573 : Cache.proxyAuthPassword.toString());
574 setCustomProxyEnabled();
576 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
578 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
579 // note antisense here: default is true
581 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
582 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
585 * Set Output tab defaults
587 setupOutputCombo(epsRendering, "EPS_RENDERING");
588 setupOutputCombo(htmlRendering, "HTML_RENDERING");
589 setupOutputCombo(svgRendering, "SVG_RENDERING");
590 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
591 userIdWidth.setEnabled(!autoIdWidth.isSelected());
592 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
593 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
594 userIdWidth.setText(wi == null ? "" : wi.toString());
595 // TODO: refactor to use common enum via FormatAdapter and allow extension
596 // for new flat file formats
597 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
598 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
599 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
600 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
601 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
602 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
603 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
604 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
606 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
609 * Set Editing tab defaults
611 autoCalculateConsCheck
612 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
613 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
614 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
616 annotations_actionPerformed(null); // update the display of the annotation
621 * Set Backups tab defaults
623 loadLastSavedBackupsOptions();
627 * A helper method that sets the items and initial selection in a character
628 * rendering option list (Prompt each time/Lineart/Text)
633 protected void setupOutputCombo(JComboBox<Object> comboBox,
636 comboBox.addItem(promptEachTimeOpt);
637 comboBox.addItem(lineArtOpt);
638 comboBox.addItem(textOpt);
641 * JalviewJS doesn't support Lineart so force it to Text
643 String defaultOption = Platform.isJS() ? "Text"
644 : Cache.getDefault(propertyKey, "Prompt each time");
645 if (defaultOption.equalsIgnoreCase("Text"))
647 comboBox.setSelectedItem(textOpt);
649 else if (defaultOption.equalsIgnoreCase("Lineart"))
651 comboBox.setSelectedItem(lineArtOpt);
655 comboBox.setSelectedItem(promptEachTimeOpt);
660 * Save user selections on the Preferences tabs to the Cache and write out to
666 public void ok_actionPerformed(ActionEvent e)
668 if (!validateSettings())
674 * Save Visual settings
676 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
677 Boolean.toString(seqLimit.isSelected()));
678 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
679 Boolean.toString(rightAlign.isSelected()));
680 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
681 Boolean.toString(fullScreen.isSelected()));
682 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
683 Boolean.toString(openoverv.isSelected()));
684 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
685 Boolean.toString(annotations.isSelected()));
686 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
687 Boolean.toString(conservation.isSelected()));
688 Cache.applicationProperties.setProperty("SHOW_QUALITY",
689 Boolean.toString(quality.isSelected()));
690 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
691 Boolean.toString(identity.isSelected()));
693 Cache.applicationProperties.setProperty("GAP_SYMBOL",
694 gapSymbolCB.getSelectedItem().toString());
696 Cache.applicationProperties.setProperty("FONT_NAME",
697 fontNameCB.getSelectedItem().toString());
698 Cache.applicationProperties.setProperty("FONT_STYLE",
699 fontStyleCB.getSelectedItem().toString());
700 Cache.applicationProperties.setProperty("FONT_SIZE",
701 fontSizeCB.getSelectedItem().toString());
703 Cache.applicationProperties.setProperty("ID_ITALICS",
704 Boolean.toString(idItalics.isSelected()));
705 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
706 Boolean.toString(showUnconserved.isSelected()));
707 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
708 Boolean.toString(showOccupancy.isSelected()));
709 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
710 Boolean.toString(showGroupConsensus.isSelected()));
711 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
712 Boolean.toString(showGroupConservation.isSelected()));
713 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
714 Boolean.toString(showConsensHistogram.isSelected()));
715 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
716 Boolean.toString(showConsensLogo.isSelected()));
717 Cache.applicationProperties.setProperty("ANTI_ALIAS",
718 Boolean.toString(smoothFont.isSelected()));
719 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
720 Boolean.toString(scaleProteinToCdna.isSelected()));
721 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
722 Boolean.toString(showNpTooltip.isSelected()));
723 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
724 Boolean.toString(showDbRefTooltip.isSelected()));
726 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
727 Boolean.toString(wrap.isSelected()));
729 Cache.applicationProperties.setProperty("STARTUP_FILE",
730 startupFileTextfield.getText());
731 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
732 Boolean.toString(startupCheckbox.isSelected()));
734 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
735 sortby.getSelectedItem().toString());
737 // convert description of sort order to enum name for save
738 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
739 .forDescription(sortAnnBy.getSelectedItem().toString());
740 if (annSortOrder != null)
742 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
743 annSortOrder.name());
746 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
747 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
748 Boolean.valueOf(showAutocalcFirst).toString());
751 * Save Colours settings
753 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
754 protColour.getSelectedItem().toString());
755 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
756 nucColour.getSelectedItem().toString());
757 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
758 minColour.getBackground());
759 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
760 maxColour.getBackground());
763 * Save Overview settings
765 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
766 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
767 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
768 Boolean.toString(useLegacyGap.isSelected()));
769 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
770 Boolean.toString(showHiddenAtStart.isSelected()));
773 * Save Structure settings
775 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
776 Boolean.toString(addTempFactor.isSelected()));
777 Cache.applicationProperties.setProperty(ADD_SS_ANN,
778 Boolean.toString(addSecondaryStructure.isSelected()));
779 Cache.applicationProperties.setProperty(USE_RNAVIEW,
780 Boolean.toString(useRnaView.isSelected()));
781 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
782 Boolean.toString(structFromPdb.isSelected()));
783 String viewer = structViewer.getSelectedItem().toString();
784 String viewerPath = structureViewerPath.getText();
785 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
787 if (viewer.equals(ViewerType.CHIMERA.name()))
789 Cache.setOrRemove(CHIMERA_PATH, viewerPath);
791 else if (viewer.equals(ViewerType.CHIMERAX.name()))
793 Cache.setOrRemove(CHIMERAX_PATH, viewerPath);
795 else if (viewer.equals(ViewerType.PYMOL.name()))
797 Cache.setOrRemove(PYMOL_PATH, viewerPath);
799 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
800 Boolean.toString(siftsMapping.isSelected()));
801 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
804 * Save Output settings
806 Cache.applicationProperties.setProperty("EPS_RENDERING",
807 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
808 Cache.applicationProperties.setProperty("HTML_RENDERING",
809 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
810 Cache.applicationProperties.setProperty("SVG_RENDERING",
811 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
814 * Save Connections settings
816 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
818 jalview.util.BrowserLauncher.resetBrowser();
820 // save user-defined and selected links
821 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
822 if (menuLinks.isEmpty())
824 Cache.applicationProperties.remove("SEQUENCE_LINKS");
828 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
829 menuLinks.toString());
832 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
833 if (nonMenuLinks.isEmpty())
835 Cache.applicationProperties.remove("STORED_LINKS");
839 Cache.applicationProperties.setProperty("STORED_LINKS",
840 nonMenuLinks.toString());
843 Cache.applicationProperties.setProperty("DEFAULT_URL",
844 sequenceUrlLinks.getPrimaryUrlId());
849 Cache.setProperty("VERSION_CHECK",
850 Boolean.toString(versioncheck.isSelected()));
851 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
853 // default is false - we only set this if the user has actively agreed
854 Cache.setProperty("USAGESTATS",
855 Boolean.toString(usagestats.isSelected()));
857 if (!questionnaire.isSelected())
859 Cache.setProperty("NOQUESTIONNAIRES", "true");
863 // special - made easy to edit a property file to disable questionnaires
864 // by just adding the given line
865 Cache.removeProperty("NOQUESTIONNAIRES");
869 * Save Output settings
871 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
872 Boolean.toString(blcjv.isSelected()));
873 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
874 Boolean.toString(clustaljv.isSelected()));
875 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
876 Boolean.toString(fastajv.isSelected()));
877 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
878 Boolean.toString(msfjv.isSelected()));
879 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
880 Boolean.toString(pfamjv.isSelected()));
881 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
882 Boolean.toString(pileupjv.isSelected()));
883 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
884 Boolean.toString(pirjv.isSelected()));
885 Cache.applicationProperties.setProperty("PIR_MODELLER",
886 Boolean.toString(modellerOutput.isSelected()));
887 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
888 Boolean.toString(embbedBioJSON.isSelected()));
889 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
891 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
892 Boolean.toString(autoIdWidth.isSelected()));
893 userIdWidth_actionPerformed();
894 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
895 userIdWidth.getText());
898 * Save Editing settings
900 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
901 Boolean.toString(autoCalculateConsCheck.isSelected()));
902 Cache.applicationProperties.setProperty("SORT_BY_TREE",
903 Boolean.toString(sortByTree.isSelected()));
904 Cache.applicationProperties.setProperty("PAD_GAPS",
905 Boolean.toString(padGaps.isSelected()));
907 if (!Platform.isJS())
909 wsPrefs.updateAndRefreshWsMenuConfig(false);
913 * Save Backups settings
915 Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
916 Boolean.toString(enableBackupFiles.isSelected()));
917 int preset = getComboIntStringKey(backupfilesPresetsCombo);
918 Cache.applicationProperties.setProperty(BackupFiles.NS + "_PRESET", Integer.toString(preset));
920 if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
922 BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
923 BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
924 BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
925 Cache.applicationProperties
926 .setProperty(BackupFilesPresetEntry.CUSTOMCONFIG,
927 customBFPE.toString());
930 BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
932 Cache.applicationProperties.setProperty(
933 BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
935 Cache.saveProperties();
936 Desktop.instance.doConfigureStructurePrefs();
939 frame.setClosed(true);
940 } catch (Exception ex)
945 public void setProxyFromSettings()
947 String proxyType = Cache.getDefault("USE_PROXY",
948 Cache.PROXYTYPE_SYSTEM);
949 if (proxyType.equals(Cache.PROXYTYPE_NONE))
951 if (!previousProxyType.equals(proxyType))
952 Cache.log.info("Setting no proxy settings");
953 Cache.setProxyProperties(null, null, null, null, null, null, null,
956 else if (proxyType.equals(Cache.PROXYTYPE_CUSTOM))
958 if (!previousProxyType.equals(proxyType))
959 Cache.log.info("Setting custom proxy settings");
960 boolean proxyAuthSet = Cache.getDefault("PROXY_AUTH", false);
961 Cache.setProxyProperties(Cache.getDefault("PROXY_SERVER", null),
962 Cache.getDefault("PROXY_PORT", null),
963 Cache.getDefault("PROXY_SERVER_HTTPS", null),
964 Cache.getDefault("PROXY_PORT_HTTPS", null),
965 proxyAuthSet ? Cache.getDefault("PROXY_AUTH_USERNAME", "")
967 proxyAuthSet ? Cache.proxyAuthPassword : null,
968 proxyAuthSet ? Cache.getDefault("PROXY_AUTH_USERNAME", "")
970 proxyAuthSet ? Cache.proxyAuthPassword : null, "localhost");
972 else // systemProxy should be selected and is sensible default anyway
974 if (!previousProxyType.equals(proxyType))
975 Cache.log.info("Setting system proxy settings");
976 Cache.resetProxyProperties();
980 public void saveProxySettings()
982 Cache.applicationProperties.setProperty("USE_PROXY",
983 customProxy.isSelected() ? Cache.PROXYTYPE_CUSTOM
984 : noProxy.isSelected() ? Cache.PROXYTYPE_NONE
985 : Cache.PROXYTYPE_SYSTEM);
986 Cache.setOrRemove("PROXY_SERVER", proxyServerHttpTB.getText());
987 Cache.setOrRemove("PROXY_PORT", proxyPortHttpTB.getText());
988 Cache.setOrRemove("PROXY_SERVER_HTTPS", proxyServerHttpsTB.getText());
989 Cache.setOrRemove("PROXY_PORT_HTTPS", proxyPortHttpsTB.getText());
990 Cache.setOrRemove("PROXY_AUTH",
991 Boolean.toString(proxyAuth.isSelected()));
992 Cache.setOrRemove("PROXY_AUTH_USERNAME", proxyAuthUsernameTB.getText());
993 Cache.proxyAuthPassword = proxyAuthPasswordTB.getPassword();
994 setProxyFromSettings();
998 * Do any necessary validation before saving settings. Return focus to the
999 * first tab which fails validation.
1003 private boolean validateSettings()
1005 if (!validateStructure())
1007 structureTab.requestFocusInWindow();
1014 protected boolean validateStructure()
1016 return validateViewerPath();
1024 public void startupFileTextfield_mouseClicked()
1026 // TODO: JAL-3048 not needed for Jalview-JS
1027 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
1028 JalviewFileChooser chooser = JalviewFileChooser
1029 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
1030 chooser.setFileView(new JalviewFileView());
1031 chooser.setDialogTitle(
1032 MessageManager.getString("label.select_startup_file"));
1034 int value = chooser.showOpenDialog(this);
1036 if (value == JalviewFileChooser.APPROVE_OPTION)
1038 FileFormatI format = chooser.getSelectedFormat();
1041 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
1044 startupFileTextfield
1045 .setText(chooser.getSelectedFile().getAbsolutePath());
1056 public void cancel_actionPerformed(ActionEvent e)
1060 if (!Platform.isJS())
1062 wsPrefs.updateWsMenuConfig(true);
1063 wsPrefs.refreshWs_actionPerformed(e);
1065 frame.setClosed(true);
1066 } catch (Exception ex)
1078 public void annotations_actionPerformed(ActionEvent e)
1080 conservation.setEnabled(annotations.isSelected());
1081 quality.setEnabled(annotations.isSelected());
1082 identity.setEnabled(annotations.isSelected());
1083 showOccupancy.setEnabled(annotations.isSelected());
1084 showGroupConsensus.setEnabled(annotations.isSelected());
1085 showGroupConservation.setEnabled(annotations.isSelected());
1086 showConsensHistogram.setEnabled(annotations.isSelected()
1087 && (identity.isSelected() || showGroupConsensus.isSelected()));
1088 showConsensLogo.setEnabled(annotations.isSelected()
1089 && (identity.isSelected() || showGroupConsensus.isSelected()));
1093 public void newLink_actionPerformed(ActionEvent e)
1095 GSequenceLink link = new GSequenceLink();
1096 boolean valid = false;
1099 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1100 MessageManager.getString("label.new_sequence_url_link"),
1101 JvOptionPane.OK_CANCEL_OPTION, -1,
1102 null) == JvOptionPane.OK_OPTION)
1104 if (link.checkValid())
1106 if (((UrlLinkTableModel) linkUrlTable.getModel())
1107 .isUniqueName(link.getName()))
1109 ((UrlLinkTableModel) linkUrlTable.getModel())
1110 .insertRow(link.getName(), link.getURL());
1115 link.notifyDuplicate();
1128 public void editLink_actionPerformed(ActionEvent e)
1130 GSequenceLink link = new GSequenceLink();
1132 int index = linkUrlTable.getSelectedRow();
1135 // button no longer enabled if row is not selected
1136 Cache.log.debug("Edit with no row selected in linkUrlTable");
1140 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1142 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1144 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1145 link.setName(oldName);
1146 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1148 boolean valid = false;
1151 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1152 MessageManager.getString("label.edit_sequence_url_link"),
1153 JvOptionPane.OK_CANCEL_OPTION, -1,
1154 null) == JvOptionPane.OK_OPTION)
1156 if (link.checkValid())
1158 if ((oldName.equals(link.getName()))
1159 || (((UrlLinkTableModel) linkUrlTable.getModel())
1160 .isUniqueName(link.getName())))
1162 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1163 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1168 link.notifyDuplicate();
1181 public void deleteLink_actionPerformed(ActionEvent e)
1183 int index = linkUrlTable.getSelectedRow();
1184 int modelIndex = -1;
1187 // button no longer enabled if row is not selected
1188 Cache.log.debug("Delete with no row selected in linkUrlTable");
1193 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1196 // make sure we use the model index to delete, and not the table index
1197 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1201 public void defaultBrowser_mouseClicked(MouseEvent e)
1203 // TODO: JAL-3048 not needed for j2s
1204 if (!Platform.isJS()) // BH 2019
1211 JFileChooser chooser = new JFileChooser(".");
1212 chooser.setDialogTitle(
1213 MessageManager.getString("label.select_default_browser"));
1215 int value = chooser.showOpenDialog(this);
1217 if (value == JFileChooser.APPROVE_OPTION)
1219 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1228 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1232 protected void showunconserved_actionPerformed(ActionEvent e)
1234 // TODO Auto-generated method stub
1235 super.showunconserved_actionPerformed(e);
1238 public static List<String> getGroupURLLinks()
1240 return groupURLLinks;
1244 public void minColour_actionPerformed(JPanel panel)
1246 JalviewColourChooser.showColourChooser(this,
1247 MessageManager.getString("label.select_colour_minimum_value"),
1252 public void maxColour_actionPerformed(JPanel panel)
1254 JalviewColourChooser.showColourChooser(this,
1255 MessageManager.getString("label.select_colour_maximum_value"),
1260 public void gapColour_actionPerformed(JPanel gap)
1262 if (!useLegacyGap.isSelected())
1264 JalviewColourChooser.showColourChooser(this,
1265 MessageManager.getString("label.select_gap_colour"),
1271 public void hiddenColour_actionPerformed(JPanel hidden)
1273 JalviewColourChooser.showColourChooser(this,
1274 MessageManager.getString("label.select_hidden_colour"),
1279 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1281 boolean enabled = useLegacyGap.isSelected();
1284 gapColour.setBackground(
1285 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1289 gapColour.setBackground(
1290 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1292 gapColour.setEnabled(!enabled);
1293 gapLabel.setEnabled(!enabled);
1297 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1299 useLegacyGap.setSelected(false);
1300 useLegacyGaps_actionPerformed(null);
1301 showHiddenAtStart.setSelected(false);
1302 hiddenColour.setBackground(
1303 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1307 protected void userIdWidth_actionPerformed()
1311 String val = userIdWidth.getText().trim();
1312 if (val.length() > 0)
1314 Integer iw = Integer.parseInt(val);
1315 if (iw.intValue() < 12)
1317 throw new NumberFormatException();
1319 userIdWidth.setText(iw.toString());
1321 } catch (NumberFormatException x)
1323 userIdWidth.setText("");
1324 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1326 .getString("warn.user_defined_width_requirements"),
1327 MessageManager.getString("label.invalid_id_column_width"),
1328 JvOptionPane.WARNING_MESSAGE);
1333 protected void autoIdWidth_actionPerformed()
1335 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1336 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1340 * Returns true if structure viewer path is to a valid executable, else shows
1341 * an error dialog. Does nothing if the path is empty, as is the case for Jmol
1342 * (built in to Jalview) or when Jalview is left to try default paths.
1344 private boolean validateViewerPath()
1346 if (structureViewerPath.getText().trim().length() > 0)
1348 File f = new File(structureViewerPath.getText());
1349 if (!f.canExecute())
1351 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1352 MessageManager.getString("label.invalid_viewer_path"),
1353 MessageManager.getString("label.invalid_viewer_path"),
1354 JvOptionPane.ERROR_MESSAGE);
1362 * If Chimera or ChimeraX or Pymol is selected, check it can be found on
1363 * default or user-specified path, if not show a warning/help dialog
1366 protected void structureViewer_actionPerformed(String selectedItem)
1368 if (selectedItem.equals(ViewerType.JMOL.name()))
1370 structureViewerPath.setEnabled(false);
1371 structureViewerPathLabel.setEnabled(false);
1374 boolean found = false;
1375 structureViewerPath.setEnabled(true);
1376 structureViewerPathLabel.setEnabled(true);
1377 structureViewerPathLabel.setText(MessageManager
1378 .formatMessage("label.viewer_path", selectedItem));
1381 * Try user-specified and standard paths for structure viewer executable
1383 String viewerPath = "";
1384 List<String> paths = null;
1387 ViewerType viewerType = ViewerType.valueOf(selectedItem);
1394 viewerPath = Cache.getDefault(CHIMERA_PATH, "");
1395 paths = StructureManager.getChimeraPaths(false);
1398 viewerPath = Cache.getDefault(CHIMERAX_PATH, "");
1399 paths = StructureManager.getChimeraPaths(true);
1402 viewerPath = Cache.getDefault(PYMOL_PATH, "");
1403 paths = PymolManager.getPymolPaths();
1406 } catch (IllegalArgumentException e)
1408 // only valid entries should be in the drop-down
1410 structureViewerPath.setText(viewerPath);
1412 paths.add(0, structureViewerPath.getText());
1413 for (String path : paths)
1415 if (new File(path.trim()).canExecute())
1424 String[] options = { "OK", "Help" };
1425 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1426 JvSwingUtils.wrapTooltip(true,
1427 MessageManager.getString("label.viewer_missing")),
1428 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1429 null, options, options[0]);
1430 if (showHelp == JvOptionPane.NO_OPTION)
1434 Help.showHelpWindow(HelpId.StructureViewer);
1435 } catch (HelpSetException e)
1437 e.printStackTrace();
1443 public class OptionsParam
1445 private String name;
1447 private String code;
1449 public OptionsParam(String name, String code)
1455 public String getName()
1460 public void setName(String name)
1465 public String getCode()
1470 public void setCode(String code)
1476 public String toString()
1482 public boolean equals(Object that)
1484 if (!(that instanceof OptionsParam))
1488 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1492 public int hashCode()
1494 return name.hashCode() + code.hashCode();
1498 private class UrlListSelectionHandler implements ListSelectionListener
1502 public void valueChanged(ListSelectionEvent e)
1504 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1506 int index = lsm.getMinSelectionIndex();
1509 // no selection, so disable delete/edit buttons
1510 editLink.setEnabled(false);
1511 deleteLink.setEnabled(false);
1514 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1516 // enable/disable edit and delete link buttons
1517 if (((UrlLinkTableModel) linkUrlTable.getModel())
1518 .isRowDeletable(modelIndex))
1520 deleteLink.setEnabled(true);
1524 deleteLink.setEnabled(false);
1527 if (((UrlLinkTableModel) linkUrlTable.getModel())
1528 .isRowEditable(modelIndex))
1530 editLink.setEnabled(true);
1534 editLink.setEnabled(false);