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.
197 frame = new JInternalFrame();
198 frame.setContentPane(this);
199 if (!Platform.isJS())
206 wsPrefs = new WsPreferences();
207 wsTab.add(wsPrefs, BorderLayout.CENTER);
209 int width = 500, height = 450;
210 if (Platform.isAMacAndNotJS())
216 Desktop.addInternalFrame(frame,
217 MessageManager.getString("label.preferences"), width, height);
218 frame.setMinimumSize(new Dimension(width, height));
221 * Set Visual tab defaults
223 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
224 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
225 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
226 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
228 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
229 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
230 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
231 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
233 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
234 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
236 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
237 showGroupConservation.setSelected(
238 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
239 showConsensHistogram.setSelected(
240 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
242 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
244 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
246 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
248 String[] fonts = java.awt.GraphicsEnvironment
249 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
250 for (int i = 0; i < fonts.length; i++)
252 fontNameCB.addItem(fonts[i]);
255 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
257 fontSizeCB.addItem(i + "");
260 fontStyleCB.addItem("plain");
261 fontStyleCB.addItem("bold");
262 fontStyleCB.addItem("italic");
264 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
265 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
266 fontStyleCB.setSelectedItem(
267 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
269 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", true));
271 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
273 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
275 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
277 gapSymbolCB.addItem("-");
278 gapSymbolCB.addItem(".");
280 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
282 sortby.addItem("No sort");
283 sortby.addItem("Id");
284 sortby.addItem("Pairwise Identity");
285 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
287 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
289 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
291 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
292 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
293 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
294 SequenceAnnotationOrder.NONE.name()));
295 sortAnnBy.setSelectedItem(savedSort.toString());
297 sortAutocalc.addItem("Autocalculated first");
298 sortAutocalc.addItem("Autocalculated last");
299 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
300 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
301 : sortAutocalc.getItemAt(1));
303 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
304 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
305 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
306 + "/examples/exampleFile_2_3.jar"));
309 * Set Colours tab defaults
311 protColour.addItem(ResidueColourScheme.NONE);
312 nucColour.addItem(ResidueColourScheme.NONE);
313 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
315 String name = cs.getSchemeName();
316 protColour.addItem(name);
317 nucColour.addItem(name);
319 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
320 ResidueColourScheme.NONE);
321 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
322 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
323 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
324 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
325 minColour.setBackground(
326 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
327 maxColour.setBackground(
328 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
331 * Set overview panel defaults
333 gapColour.setBackground(
334 Cache.getDefaultColour(GAP_COLOUR,
335 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
336 hiddenColour.setBackground(
337 Cache.getDefaultColour(HIDDEN_COLOUR,
338 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
339 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
340 gapLabel.setEnabled(!useLegacyGap.isSelected());
341 gapColour.setEnabled(!useLegacyGap.isSelected());
343 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
346 * Set Structure tab defaults
348 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
349 structFromPdb.setSelected(structSelected);
350 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
351 useRnaView.setEnabled(structSelected);
352 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
353 addSecondaryStructure.setEnabled(structSelected);
354 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
355 addTempFactor.setEnabled(structSelected);
358 * set choice of structure viewer, and path if saved as a preference;
359 * default to Jmol (first choice) if an unexpected value is found
361 String viewerType = Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name());
362 structViewer.setSelectedItem(viewerType);
363 String viewerPath = "";
364 ViewerType type = null;
367 type = ViewerType.valueOf(viewerType);
373 viewerPath = Cache.getDefault(CHIMERA_PATH, "");
376 viewerPath = Cache.getDefault(CHIMERAX_PATH, "");
379 viewerPath = Cache.getDefault(PYMOL_PATH, "");
382 } catch (IllegalArgumentException e)
384 Cache.log.error("Unknown structure viewer type: " + viewerType
385 + ", defaulting to Jmol");
386 type = ViewerType.JMOL;
388 structureViewerPath.setText(viewerPath);
390 structureViewerPath.addActionListener(new ActionListener()
393 public void actionPerformed(ActionEvent e)
395 if (validateViewerPath())
397 Cache.setProperty(structViewer.getSelectedItem()
398 .equals(ViewerType.CHIMERAX.name())
400 : CHIMERA_PATH, structureViewerPath.getText());
405 if (Cache.getDefault("MAP_WITH_SIFTS", false))
407 siftsMapping.setSelected(true);
411 nwMapping.setSelected(true);
415 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
418 * Set Connections tab defaults
422 linkUrlTable.setModel(dataModel);
423 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
424 linkUrlTable.getModel());
425 linkUrlTable.setRowSorter(sorter);
426 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
428 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
429 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
430 SortOrder.DESCENDING));
431 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
432 SortOrder.DESCENDING));
434 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
436 sorter.setSortKeys(sortKeys);
437 // BH 2018 setSortKeys will do the sort
441 ActionListener onReset;
442 onReset = new ActionListener()
445 public void actionPerformed(ActionEvent e)
447 filterTB.setText("");
448 sorter.setRowFilter(RowFilter.regexFilter(""));
452 doReset.addActionListener(onReset);
454 // filter to display only custom urls
455 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
458 public boolean include(
459 Entry<? extends TableModel, ? extends Object> entry)
461 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
465 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
466 linkUrlTable.getModel());
467 customSorter.setRowFilter(customUrlFilter);
469 ActionListener onCustomOnly;
470 onCustomOnly = new ActionListener()
473 public void actionPerformed(ActionEvent e)
475 filterTB.setText("");
476 sorter.setRowFilter(customUrlFilter);
479 userOnly.addActionListener(onCustomOnly);
481 filterTB.getDocument().addDocumentListener(new DocumentListener()
483 String caseInsensitiveFlag = "(?i)";
486 public void changedUpdate(DocumentEvent e)
488 sorter.setRowFilter(RowFilter
489 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
493 public void removeUpdate(DocumentEvent e)
495 sorter.setRowFilter(RowFilter
496 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
500 public void insertUpdate(DocumentEvent e)
502 sorter.setRowFilter(RowFilter
503 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
507 // set up list selection functionality
508 linkUrlTable.getSelectionModel()
509 .addListSelectionListener(new UrlListSelectionHandler());
511 // set up radio buttons
512 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
514 String onClickName = linkUrlTable.getColumnName(onClickCol);
515 linkUrlTable.getColumn(onClickName)
516 .setCellRenderer(new RadioButtonRenderer());
517 linkUrlTable.getColumn(onClickName)
518 .setCellEditor(new RadioButtonEditor());
520 // get boolean columns and resize those to min possible
521 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
523 if (linkUrlTable.getModel().getColumnClass(column)
524 .equals(Boolean.class))
526 TableColumn tableColumn = linkUrlTable.getColumnModel()
528 int preferredWidth = tableColumn.getMinWidth();
530 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
532 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
533 int cwidth = c.getPreferredSize().width
534 + linkUrlTable.getIntercellSpacing().width;
535 preferredWidth = Math.max(preferredWidth, cwidth);
537 tableColumn.setPreferredWidth(preferredWidth);
541 String proxyTypeString = Cache.getDefault("USE_PROXY", "false");
542 previousProxyType = proxyTypeString;
543 switch (proxyTypeString)
545 case Cache.PROXYTYPE_NONE:
546 proxyType.setSelected(noProxy.getModel(), true);
548 case Cache.PROXYTYPE_SYSTEM:
549 proxyType.setSelected(systemProxy.getModel(), true);
551 case Cache.PROXYTYPE_CUSTOM:
552 proxyType.setSelected(customProxy.getModel(), true);
555 String message = "Incorrect PROXY_TYPE - should be 'none' (clear proxy properties), 'false' (system settings), 'true' (custom settings): "
557 Cache.log.warn(message);
559 proxyServerHttpTB.setText(Cache.getDefault("PROXY_SERVER", ""));
560 proxyPortHttpTB.setText(Cache.getDefault("PROXY_PORT", ""));
561 proxyServerHttpsTB.setText(Cache.getDefault("PROXY_SERVER_HTTPS", ""));
562 proxyPortHttpsTB.setText(Cache.getDefault("PROXY_PORT_HTTPS", ""));
563 proxyAuth.setSelected(Cache.getDefault("PROXY_AUTH", false));
565 .setText(Cache.getDefault("PROXY_AUTH_USERNAME", ""));
567 .setText(Cache.getDefault("PROXY_AUTH_PASSWORD", ""));
568 setCustomProxyEnabled();
570 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
572 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
573 // note antisense here: default is true
575 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
576 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
579 * Set Output tab defaults
581 setupOutputCombo(epsRendering, "EPS_RENDERING");
582 setupOutputCombo(htmlRendering, "HTML_RENDERING");
583 setupOutputCombo(svgRendering, "SVG_RENDERING");
584 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
585 userIdWidth.setEnabled(!autoIdWidth.isSelected());
586 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
587 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
588 userIdWidth.setText(wi == null ? "" : wi.toString());
589 // TODO: refactor to use common enum via FormatAdapter and allow extension
590 // for new flat file formats
591 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
592 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
593 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
594 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
595 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
596 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
597 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
598 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
600 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
603 * Set Editing tab defaults
605 autoCalculateConsCheck
606 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
607 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
608 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
610 annotations_actionPerformed(null); // update the display of the annotation
615 * Set Backups tab defaults
617 loadLastSavedBackupsOptions();
621 * A helper method that sets the items and initial selection in a character
622 * rendering option list (Prompt each time/Lineart/Text)
627 protected void setupOutputCombo(JComboBox<Object> comboBox,
630 comboBox.addItem(promptEachTimeOpt);
631 comboBox.addItem(lineArtOpt);
632 comboBox.addItem(textOpt);
635 * JalviewJS doesn't support Lineart so force it to Text
637 String defaultOption = Platform.isJS() ? "Text"
638 : Cache.getDefault(propertyKey, "Prompt each time");
639 if (defaultOption.equalsIgnoreCase("Text"))
641 comboBox.setSelectedItem(textOpt);
643 else if (defaultOption.equalsIgnoreCase("Lineart"))
645 comboBox.setSelectedItem(lineArtOpt);
649 comboBox.setSelectedItem(promptEachTimeOpt);
654 * Save user selections on the Preferences tabs to the Cache and write out to
660 public void ok_actionPerformed(ActionEvent e)
662 if (!validateSettings())
668 * Save Visual settings
670 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
671 Boolean.toString(seqLimit.isSelected()));
672 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
673 Boolean.toString(rightAlign.isSelected()));
674 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
675 Boolean.toString(fullScreen.isSelected()));
676 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
677 Boolean.toString(openoverv.isSelected()));
678 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
679 Boolean.toString(annotations.isSelected()));
680 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
681 Boolean.toString(conservation.isSelected()));
682 Cache.applicationProperties.setProperty("SHOW_QUALITY",
683 Boolean.toString(quality.isSelected()));
684 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
685 Boolean.toString(identity.isSelected()));
687 Cache.applicationProperties.setProperty("GAP_SYMBOL",
688 gapSymbolCB.getSelectedItem().toString());
690 Cache.applicationProperties.setProperty("FONT_NAME",
691 fontNameCB.getSelectedItem().toString());
692 Cache.applicationProperties.setProperty("FONT_STYLE",
693 fontStyleCB.getSelectedItem().toString());
694 Cache.applicationProperties.setProperty("FONT_SIZE",
695 fontSizeCB.getSelectedItem().toString());
697 Cache.applicationProperties.setProperty("ID_ITALICS",
698 Boolean.toString(idItalics.isSelected()));
699 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
700 Boolean.toString(showUnconserved.isSelected()));
701 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
702 Boolean.toString(showOccupancy.isSelected()));
703 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
704 Boolean.toString(showGroupConsensus.isSelected()));
705 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
706 Boolean.toString(showGroupConservation.isSelected()));
707 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
708 Boolean.toString(showConsensHistogram.isSelected()));
709 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
710 Boolean.toString(showConsensLogo.isSelected()));
711 Cache.applicationProperties.setProperty("ANTI_ALIAS",
712 Boolean.toString(smoothFont.isSelected()));
713 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
714 Boolean.toString(scaleProteinToCdna.isSelected()));
715 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
716 Boolean.toString(showNpTooltip.isSelected()));
717 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
718 Boolean.toString(showDbRefTooltip.isSelected()));
720 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
721 Boolean.toString(wrap.isSelected()));
723 Cache.applicationProperties.setProperty("STARTUP_FILE",
724 startupFileTextfield.getText());
725 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
726 Boolean.toString(startupCheckbox.isSelected()));
728 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
729 sortby.getSelectedItem().toString());
731 // convert description of sort order to enum name for save
732 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
733 .forDescription(sortAnnBy.getSelectedItem().toString());
734 if (annSortOrder != null)
736 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
737 annSortOrder.name());
740 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
741 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
742 Boolean.valueOf(showAutocalcFirst).toString());
745 * Save Colours settings
747 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
748 protColour.getSelectedItem().toString());
749 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
750 nucColour.getSelectedItem().toString());
751 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
752 minColour.getBackground());
753 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
754 maxColour.getBackground());
757 * Save Overview settings
759 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
760 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
761 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
762 Boolean.toString(useLegacyGap.isSelected()));
763 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
764 Boolean.toString(showHiddenAtStart.isSelected()));
767 * Save Structure settings
769 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
770 Boolean.toString(addTempFactor.isSelected()));
771 Cache.applicationProperties.setProperty(ADD_SS_ANN,
772 Boolean.toString(addSecondaryStructure.isSelected()));
773 Cache.applicationProperties.setProperty(USE_RNAVIEW,
774 Boolean.toString(useRnaView.isSelected()));
775 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
776 Boolean.toString(structFromPdb.isSelected()));
777 String viewer = structViewer.getSelectedItem().toString();
778 String viewerPath = structureViewerPath.getText();
779 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
781 if (viewer.equals(ViewerType.CHIMERA.name()))
783 Cache.setOrRemove(CHIMERA_PATH, viewerPath);
785 else if (viewer.equals(ViewerType.CHIMERAX.name()))
787 Cache.setOrRemove(CHIMERAX_PATH, viewerPath);
789 else if (viewer.equals(ViewerType.PYMOL.name()))
791 Cache.setOrRemove(PYMOL_PATH, viewerPath);
793 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
794 Boolean.toString(siftsMapping.isSelected()));
795 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
798 * Save Output settings
800 Cache.applicationProperties.setProperty("EPS_RENDERING",
801 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
802 Cache.applicationProperties.setProperty("HTML_RENDERING",
803 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
804 Cache.applicationProperties.setProperty("SVG_RENDERING",
805 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
808 * Save Connections settings
810 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
812 jalview.util.BrowserLauncher.resetBrowser();
814 // save user-defined and selected links
815 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
816 if (menuLinks.isEmpty())
818 Cache.applicationProperties.remove("SEQUENCE_LINKS");
822 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
823 menuLinks.toString());
826 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
827 if (nonMenuLinks.isEmpty())
829 Cache.applicationProperties.remove("STORED_LINKS");
833 Cache.applicationProperties.setProperty("STORED_LINKS",
834 nonMenuLinks.toString());
837 Cache.applicationProperties.setProperty("DEFAULT_URL",
838 sequenceUrlLinks.getPrimaryUrlId());
841 Cache.applicationProperties.setProperty("USE_PROXY",
842 customProxy.isSelected() ? Cache.PROXYTYPE_CUSTOM
843 : noProxy.isSelected() ? Cache.PROXYTYPE_NONE
844 : Cache.PROXYTYPE_SYSTEM);
845 Cache.setOrRemove("PROXY_SERVER", proxyServerHttpTB.getText());
846 Cache.setOrRemove("PROXY_PORT", proxyPortHttpTB.getText());
847 Cache.setOrRemove("PROXY_SERVER_HTTPS", proxyServerHttpsTB.getText());
848 Cache.setOrRemove("PROXY_PORT_HTTPS", proxyPortHttpsTB.getText());
849 Cache.setOrRemove("PROXY_AUTH",
850 Boolean.toString(proxyAuth.isSelected()));
851 Cache.setOrRemove("PROXY_AUTH_USERNAME", proxyAuthUsernameTB.getText());
852 Cache.setOrRemove("PROXY_AUTH_PASSWORD", proxyAuthPasswordTB.getText());
853 setProxyFromSettings();
855 Cache.setProperty("VERSION_CHECK",
856 Boolean.toString(versioncheck.isSelected()));
857 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
859 // default is false - we only set this if the user has actively agreed
860 Cache.setProperty("USAGESTATS",
861 Boolean.toString(usagestats.isSelected()));
863 if (!questionnaire.isSelected())
865 Cache.setProperty("NOQUESTIONNAIRES", "true");
869 // special - made easy to edit a property file to disable questionnaires
870 // by just adding the given line
871 Cache.removeProperty("NOQUESTIONNAIRES");
875 * Save Output settings
877 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
878 Boolean.toString(blcjv.isSelected()));
879 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
880 Boolean.toString(clustaljv.isSelected()));
881 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
882 Boolean.toString(fastajv.isSelected()));
883 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
884 Boolean.toString(msfjv.isSelected()));
885 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
886 Boolean.toString(pfamjv.isSelected()));
887 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
888 Boolean.toString(pileupjv.isSelected()));
889 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
890 Boolean.toString(pirjv.isSelected()));
891 Cache.applicationProperties.setProperty("PIR_MODELLER",
892 Boolean.toString(modellerOutput.isSelected()));
893 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
894 Boolean.toString(embbedBioJSON.isSelected()));
895 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
897 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
898 Boolean.toString(autoIdWidth.isSelected()));
899 userIdWidth_actionPerformed();
900 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
901 userIdWidth.getText());
904 * Save Editing settings
906 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
907 Boolean.toString(autoCalculateConsCheck.isSelected()));
908 Cache.applicationProperties.setProperty("SORT_BY_TREE",
909 Boolean.toString(sortByTree.isSelected()));
910 Cache.applicationProperties.setProperty("PAD_GAPS",
911 Boolean.toString(padGaps.isSelected()));
913 if (!Platform.isJS())
915 wsPrefs.updateAndRefreshWsMenuConfig(false);
919 * Save Backups settings
921 Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
922 Boolean.toString(enableBackupFiles.isSelected()));
923 int preset = getComboIntStringKey(backupfilesPresetsCombo);
924 Cache.applicationProperties.setProperty(BackupFiles.NS + "_PRESET", Integer.toString(preset));
926 if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
928 BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
929 BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
930 BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
931 Cache.applicationProperties
932 .setProperty(BackupFilesPresetEntry.CUSTOMCONFIG,
933 customBFPE.toString());
936 BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
938 Cache.applicationProperties.setProperty(
939 BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
941 Cache.saveProperties();
942 Desktop.instance.doConfigureStructurePrefs();
945 frame.setClosed(true);
946 } catch (Exception ex)
951 public void setProxyFromSettings()
953 String proxyType = Cache.getDefault("USE_PROXY",
954 Cache.PROXYTYPE_SYSTEM);
955 if (proxyType.equals(Cache.PROXYTYPE_NONE))
957 if (!previousProxyType.equals(proxyType))
958 Cache.log.info("Setting no proxy settings");
959 Cache.setProxyProperties(null, null, null, null, null, null, null,
962 else if (proxyType.equals(Cache.PROXYTYPE_CUSTOM))
964 if (!previousProxyType.equals(proxyType))
965 Cache.log.info("Setting custom proxy settings");
966 boolean proxyAuthSet = Cache.getDefault("PROXY_AUTH", false);
967 Cache.setProxyProperties(Cache.getDefault("PROXY_SERVER", null),
968 Cache.getDefault("PROXY_PORT", null),
969 Cache.getDefault("PROXY_SERVER_HTTPS", null),
970 Cache.getDefault("PROXY_PORT_HTTPS", null),
971 proxyAuthSet ? Cache.getDefault("PROXY_AUTH_USERNAME", "")
973 proxyAuthSet ? Cache.getDefault("PROXY_AUTH_PASSWORD", "")
976 else // systemProxy should be selected and is sensible default anyway
978 if (!previousProxyType.equals(proxyType))
979 Cache.log.info("Setting system proxy settings");
980 Cache.resetProxyProperties();
985 * Do any necessary validation before saving settings. Return focus to the
986 * first tab which fails validation.
990 private boolean validateSettings()
992 if (!validateStructure())
994 structureTab.requestFocusInWindow();
1001 protected boolean validateStructure()
1003 return validateViewerPath();
1011 public void startupFileTextfield_mouseClicked()
1013 // TODO: JAL-3048 not needed for Jalview-JS
1014 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
1015 JalviewFileChooser chooser = JalviewFileChooser
1016 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
1017 chooser.setFileView(new JalviewFileView());
1018 chooser.setDialogTitle(
1019 MessageManager.getString("label.select_startup_file"));
1021 int value = chooser.showOpenDialog(this);
1023 if (value == JalviewFileChooser.APPROVE_OPTION)
1025 FileFormatI format = chooser.getSelectedFormat();
1028 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
1031 startupFileTextfield
1032 .setText(chooser.getSelectedFile().getAbsolutePath());
1043 public void cancel_actionPerformed(ActionEvent e)
1047 if (!Platform.isJS())
1049 wsPrefs.updateWsMenuConfig(true);
1050 wsPrefs.refreshWs_actionPerformed(e);
1052 frame.setClosed(true);
1053 } catch (Exception ex)
1065 public void annotations_actionPerformed(ActionEvent e)
1067 conservation.setEnabled(annotations.isSelected());
1068 quality.setEnabled(annotations.isSelected());
1069 identity.setEnabled(annotations.isSelected());
1070 showOccupancy.setEnabled(annotations.isSelected());
1071 showGroupConsensus.setEnabled(annotations.isSelected());
1072 showGroupConservation.setEnabled(annotations.isSelected());
1073 showConsensHistogram.setEnabled(annotations.isSelected()
1074 && (identity.isSelected() || showGroupConsensus.isSelected()));
1075 showConsensLogo.setEnabled(annotations.isSelected()
1076 && (identity.isSelected() || showGroupConsensus.isSelected()));
1080 public void newLink_actionPerformed(ActionEvent e)
1082 GSequenceLink link = new GSequenceLink();
1083 boolean valid = false;
1086 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1087 MessageManager.getString("label.new_sequence_url_link"),
1088 JvOptionPane.OK_CANCEL_OPTION, -1,
1089 null) == JvOptionPane.OK_OPTION)
1091 if (link.checkValid())
1093 if (((UrlLinkTableModel) linkUrlTable.getModel())
1094 .isUniqueName(link.getName()))
1096 ((UrlLinkTableModel) linkUrlTable.getModel())
1097 .insertRow(link.getName(), link.getURL());
1102 link.notifyDuplicate();
1115 public void editLink_actionPerformed(ActionEvent e)
1117 GSequenceLink link = new GSequenceLink();
1119 int index = linkUrlTable.getSelectedRow();
1122 // button no longer enabled if row is not selected
1123 Cache.log.debug("Edit with no row selected in linkUrlTable");
1127 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1129 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1131 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1132 link.setName(oldName);
1133 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1135 boolean valid = false;
1138 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1139 MessageManager.getString("label.edit_sequence_url_link"),
1140 JvOptionPane.OK_CANCEL_OPTION, -1,
1141 null) == JvOptionPane.OK_OPTION)
1143 if (link.checkValid())
1145 if ((oldName.equals(link.getName()))
1146 || (((UrlLinkTableModel) linkUrlTable.getModel())
1147 .isUniqueName(link.getName())))
1149 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1150 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1155 link.notifyDuplicate();
1168 public void deleteLink_actionPerformed(ActionEvent e)
1170 int index = linkUrlTable.getSelectedRow();
1171 int modelIndex = -1;
1174 // button no longer enabled if row is not selected
1175 Cache.log.debug("Delete with no row selected in linkUrlTable");
1180 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1183 // make sure we use the model index to delete, and not the table index
1184 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1188 public void defaultBrowser_mouseClicked(MouseEvent e)
1190 // TODO: JAL-3048 not needed for j2s
1191 if (!Platform.isJS()) // BH 2019
1198 JFileChooser chooser = new JFileChooser(".");
1199 chooser.setDialogTitle(
1200 MessageManager.getString("label.select_default_browser"));
1202 int value = chooser.showOpenDialog(this);
1204 if (value == JFileChooser.APPROVE_OPTION)
1206 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1215 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1219 protected void showunconserved_actionPerformed(ActionEvent e)
1221 // TODO Auto-generated method stub
1222 super.showunconserved_actionPerformed(e);
1225 public static List<String> getGroupURLLinks()
1227 return groupURLLinks;
1231 public void minColour_actionPerformed(JPanel panel)
1233 JalviewColourChooser.showColourChooser(this,
1234 MessageManager.getString("label.select_colour_minimum_value"),
1239 public void maxColour_actionPerformed(JPanel panel)
1241 JalviewColourChooser.showColourChooser(this,
1242 MessageManager.getString("label.select_colour_maximum_value"),
1247 public void gapColour_actionPerformed(JPanel gap)
1249 if (!useLegacyGap.isSelected())
1251 JalviewColourChooser.showColourChooser(this,
1252 MessageManager.getString("label.select_gap_colour"),
1258 public void hiddenColour_actionPerformed(JPanel hidden)
1260 JalviewColourChooser.showColourChooser(this,
1261 MessageManager.getString("label.select_hidden_colour"),
1266 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1268 boolean enabled = useLegacyGap.isSelected();
1271 gapColour.setBackground(
1272 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1276 gapColour.setBackground(
1277 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1279 gapColour.setEnabled(!enabled);
1280 gapLabel.setEnabled(!enabled);
1284 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1286 useLegacyGap.setSelected(false);
1287 useLegacyGaps_actionPerformed(null);
1288 showHiddenAtStart.setSelected(false);
1289 hiddenColour.setBackground(
1290 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1294 protected void userIdWidth_actionPerformed()
1298 String val = userIdWidth.getText().trim();
1299 if (val.length() > 0)
1301 Integer iw = Integer.parseInt(val);
1302 if (iw.intValue() < 12)
1304 throw new NumberFormatException();
1306 userIdWidth.setText(iw.toString());
1308 } catch (NumberFormatException x)
1310 userIdWidth.setText("");
1311 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1313 .getString("warn.user_defined_width_requirements"),
1314 MessageManager.getString("label.invalid_id_column_width"),
1315 JvOptionPane.WARNING_MESSAGE);
1320 protected void autoIdWidth_actionPerformed()
1322 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1323 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1327 * Returns true if structure viewer path is to a valid executable, else shows
1328 * an error dialog. Does nothing if the path is empty, as is the case for Jmol
1329 * (built in to Jalview) or when Jalview is left to try default paths.
1331 private boolean validateViewerPath()
1333 if (structureViewerPath.getText().trim().length() > 0)
1335 File f = new File(structureViewerPath.getText());
1336 if (!f.canExecute())
1338 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1339 MessageManager.getString("label.invalid_viewer_path"),
1340 MessageManager.getString("label.invalid_viewer_path"),
1341 JvOptionPane.ERROR_MESSAGE);
1349 * If Chimera or ChimeraX or Pymol is selected, check it can be found on
1350 * default or user-specified path, if not show a warning/help dialog
1353 protected void structureViewer_actionPerformed(String selectedItem)
1355 if (selectedItem.equals(ViewerType.JMOL.name()))
1357 structureViewerPath.setEnabled(false);
1358 structureViewerPathLabel.setEnabled(false);
1361 boolean found = false;
1362 structureViewerPath.setEnabled(true);
1363 structureViewerPathLabel.setEnabled(true);
1364 structureViewerPathLabel.setText(MessageManager
1365 .formatMessage("label.viewer_path", selectedItem));
1368 * Try user-specified and standard paths for structure viewer executable
1370 String viewerPath = "";
1371 List<String> paths = null;
1374 ViewerType viewerType = ViewerType.valueOf(selectedItem);
1381 viewerPath = Cache.getDefault(CHIMERA_PATH, "");
1382 paths = StructureManager.getChimeraPaths(false);
1385 viewerPath = Cache.getDefault(CHIMERAX_PATH, "");
1386 paths = StructureManager.getChimeraPaths(true);
1389 viewerPath = Cache.getDefault(PYMOL_PATH, "");
1390 paths = PymolManager.getPymolPaths();
1393 } catch (IllegalArgumentException e)
1395 // only valid entries should be in the drop-down
1397 structureViewerPath.setText(viewerPath);
1399 paths.add(0, structureViewerPath.getText());
1400 for (String path : paths)
1402 if (new File(path.trim()).canExecute())
1411 String[] options = { "OK", "Help" };
1412 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1413 JvSwingUtils.wrapTooltip(true,
1414 MessageManager.getString("label.viewer_missing")),
1415 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1416 null, options, options[0]);
1417 if (showHelp == JvOptionPane.NO_OPTION)
1421 Help.showHelpWindow(HelpId.StructureViewer);
1422 } catch (HelpSetException e)
1424 e.printStackTrace();
1430 public class OptionsParam
1432 private String name;
1434 private String code;
1436 public OptionsParam(String name, String code)
1442 public String getName()
1447 public void setName(String name)
1452 public String getCode()
1457 public void setCode(String code)
1463 public String toString()
1469 public boolean equals(Object that)
1471 if (!(that instanceof OptionsParam))
1475 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1479 public int hashCode()
1481 return name.hashCode() + code.hashCode();
1485 private class UrlListSelectionHandler implements ListSelectionListener
1489 public void valueChanged(ListSelectionEvent e)
1491 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1493 int index = lsm.getMinSelectionIndex();
1496 // no selection, so disable delete/edit buttons
1497 editLink.setEnabled(false);
1498 deleteLink.setEnabled(false);
1501 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1503 // enable/disable edit and delete link buttons
1504 if (((UrlLinkTableModel) linkUrlTable.getModel())
1505 .isRowDeletable(modelIndex))
1507 deleteLink.setEnabled(true);
1511 deleteLink.setEnabled(false);
1514 if (((UrlLinkTableModel) linkUrlTable.getModel())
1515 .isRowEditable(modelIndex))
1517 editLink.setEnabled(true);
1521 editLink.setEnabled(false);