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.gui.Help.HelpId;
57 import jalview.gui.StructureViewer.ViewerType;
58 import jalview.io.BackupFiles;
59 import jalview.io.BackupFilesPresetEntry;
60 import jalview.io.FileFormatI;
61 import jalview.io.JalviewFileChooser;
62 import jalview.io.JalviewFileView;
63 import jalview.jbgui.GPreferences;
64 import jalview.jbgui.GSequenceLink;
65 import jalview.schemes.ColourSchemeI;
66 import jalview.schemes.ColourSchemes;
67 import jalview.schemes.ResidueColourScheme;
68 import jalview.urls.UrlLinkTableModel;
69 import jalview.urls.api.UrlProviderFactoryI;
70 import jalview.urls.api.UrlProviderI;
71 import jalview.urls.desktop.DesktopUrlProviderFactory;
72 import jalview.util.MessageManager;
73 import jalview.util.Platform;
74 import jalview.util.UrlConstants;
75 import jalview.ws.sifts.SiftsSettings;
83 public class Preferences extends GPreferences
86 public static final String ADD_SS_ANN = "ADD_SS_ANN";
88 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
90 public static final String ALLOW_UNPUBLISHED_PDB_QUERYING = "ALLOW_UNPUBLISHED_PDB_QUERYING";
92 public static final String ANNOTATIONCOLOUR_MAX = "ANNOTATIONCOLOUR_MAX";
94 public static final String ANNOTATIONCOLOUR_MIN = "ANNOTATIONCOLOUR_MIN";
96 public static final String ANTI_ALIAS = "ANTI_ALIAS";
98 public static final String AUTO_CALC_CONSENSUS = "AUTO_CALC_CONSENSUS";
100 public static final String AUTOASSOCIATE_PDBANDSEQS = "AUTOASSOCIATE_PDBANDSEQS";
102 public static final String BLOSUM62_PCA_FOR_NUCLEOTIDE = "BLOSUM62_PCA_FOR_NUCLEOTIDE";
104 public static final String CENTRE_COLUMN_LABELS = "CENTRE_COLUMN_LABELS";
106 public static final String CHIMERA_PATH = "CHIMERA_PATH";
108 public static final String DBREFFETCH_USEPICR = "DBREFFETCH_USEPICR";
110 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
112 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
114 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
116 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
118 public static final String FIGURE_AUTOIDWIDTH = "FIGURE_AUTOIDWIDTH";
120 public static final String FIGURE_FIXEDIDWIDTH = "FIGURE_FIXEDIDWIDTH";
122 public static final String FOLLOW_SELECTIONS = "FOLLOW_SELECTIONS";
124 public static final String FONT_NAME = "FONT_NAME";
126 public static final String FONT_SIZE = "FONT_SIZE";
128 public static final String FONT_STYLE = "FONT_STYLE";
130 public static final String GAP_COLOUR = "GAP_COLOUR";
132 public static final String GAP_SYMBOL = "GAP_SYMBOL";
134 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
136 public static final String HIDE_INTRONS = "HIDE_INTRONS";
138 public static final String ID_ITALICS = "ID_ITALICS";
140 public static final String ID_ORG_HOSTURL = "ID_ORG_HOSTURL";
142 public static final String MAP_WITH_SIFTS = "MAP_WITH_SIFTS";
144 public static final String NOQUESTIONNAIRES = "NOQUESTIONNAIRES";
146 public static final String NORMALISE_CONSENSUS_LOGO = "NORMALISE_CONSENSUS_LOGO";
148 public static final String NORMALISE_LOGO = "NORMALISE_LOGO";
150 public static final String PAD_GAPS = "PAD_GAPS";
152 public static final String PDB_DOWNLOAD_FORMAT = "PDB_DOWNLOAD_FORMAT";
154 public static final String QUESTIONNAIRE = "QUESTIONNAIRE";
156 public static final String RELAXEDSEQIDMATCHING = "RELAXEDSEQIDMATCHING";
158 public static final String RIGHT_ALIGN_IDS = "RIGHT_ALIGN_IDS";
160 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
162 public static final String SHOW_ANNOTATIONS = "SHOW_ANNOTATIONS";
164 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
166 public static final String SHOW_CONSENSUS = "SHOW_CONSENSUS";
168 public static final String SHOW_CONSENSUS_HISTOGRAM = "SHOW_CONSENSUS_HISTOGRAM";
170 public static final String SHOW_CONSENSUS_LOGO = "SHOW_CONSENSUS_LOGO";
172 public static final String SHOW_CONSERVATION = "SHOW_CONSERVATION";
174 public static final String SHOW_DBREFS_TOOLTIP = "SHOW_DBREFS_TOOLTIP";
176 public static final String SHOW_GROUP_CONSENSUS = "SHOW_GROUP_CONSENSUS";
178 public static final String SHOW_GROUP_CONSERVATION = "SHOW_GROUP_CONSERVATION";
180 public static final String SHOW_JVSUFFIX = "SHOW_JVSUFFIX";
182 public static final String SHOW_NPFEATS_TOOLTIP = "SHOW_NPFEATS_TOOLTIP";
184 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
186 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
188 public static final String SHOW_OVERVIEW = "SHOW_OVERVIEW";
190 public static final String SHOW_QUALITY = "SHOW_QUALITY";
192 public static final String SHOW_UNCONSERVED = "SHOW_UNCONSERVED";
194 public static final String SORT_ALIGNMENT = "SORT_ALIGNMENT";
196 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
198 public static final String SORT_BY_TREE = "SORT_BY_TREE";
200 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
202 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
204 public static final String STRUCTURE_DIMENSIONS = "STRUCTURE_DIMENSIONS";
206 public static final String UNIPROT_DOMAIN = "UNIPROT_DOMAIN";
208 public static final String USE_FULL_SO = "USE_FULL_SO";
210 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
212 public static final String USE_RNAVIEW = "USE_RNAVIEW";
214 public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
216 public static final String WRAP_ALIGNMENT = "WRAP_ALIGNMENT";
219 private static final int MIN_FONT_SIZE = 1;
221 private static final int MAX_FONT_SIZE = 30;
224 * Holds name and link separated with | character. Sequence ID must be
225 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
227 public static UrlProviderI sequenceUrlLinks;
229 public static UrlLinkTableModel dataModel;
232 * Holds name and link separated with | character. Sequence IDS and Sequences
233 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
234 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
235 * for first and second token specified after a pipe character at end |,|.
236 * (TODO: proper escape for using | to separate ids or sequences
239 public static List<String> groupURLLinks;
242 // get links selected to be in the menu (SEQUENCE_LINKS)
243 // and links entered by the user but not selected (STORED_LINKS)
244 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
245 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
246 String defaultUrl = Cache.getDefault("DEFAULT_URL",
247 UrlConstants.DEFAULT_LABEL);
249 // if both links lists are empty, add the DEFAULT_URL link
250 // otherwise we assume the default link is in one of the lists
251 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
253 inMenuString = UrlConstants.DEFAULT_STRING;
255 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
256 inMenuString, notInMenuString);
257 sequenceUrlLinks = factory.createUrlProvider();
258 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
261 * TODO: reformulate groupURL encoding so two or more can be stored in the
262 * .properties file as '|' separated strings
265 groupURLLinks = new ArrayList<>();
268 JInternalFrame frame;
270 private WsPreferences wsPrefs;
272 private OptionsParam promptEachTimeOpt = new OptionsParam(
273 MessageManager.getString("label.prompt_each_time"),
276 private OptionsParam lineArtOpt = new OptionsParam(
277 MessageManager.getString("label.lineart"), "Lineart");
279 private OptionsParam textOpt = new OptionsParam(
280 MessageManager.getString("action.text"), "Text");
283 * Creates a new Preferences object.
288 frame = new JInternalFrame();
289 frame.setContentPane(this);
290 if (!Platform.isJS())
297 wsPrefs = new WsPreferences();
298 wsTab.add(wsPrefs, BorderLayout.CENTER);
300 int width = 500, height = 450;
301 if (Platform.isAMacAndNotJS())
307 Desktop.addInternalFrame(frame,
308 MessageManager.getString("label.preferences"), width, height);
309 frame.setMinimumSize(new Dimension(width, height));
312 * Set Visual tab defaults
314 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
315 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
316 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
317 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
319 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
320 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
321 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
322 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
324 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
325 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
327 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
328 showGroupConservation.setSelected(
329 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
330 showConsensHistogram.setSelected(
331 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
333 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
335 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
337 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
339 String[] fonts = java.awt.GraphicsEnvironment
340 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
341 for (int i = 0; i < fonts.length; i++)
343 fontNameCB.addItem(fonts[i]);
346 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
348 fontSizeCB.addItem(i + "");
351 fontStyleCB.addItem("plain");
352 fontStyleCB.addItem("bold");
353 fontStyleCB.addItem("italic");
355 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
356 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
357 fontStyleCB.setSelectedItem(
358 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
360 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", true));
362 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
364 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
366 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
368 gapSymbolCB.addItem("-");
369 gapSymbolCB.addItem(".");
371 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
373 sortby.addItem("No sort");
374 sortby.addItem("Id");
375 sortby.addItem("Pairwise Identity");
376 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
378 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
380 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
382 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
383 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
384 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
385 SequenceAnnotationOrder.NONE.name()));
386 sortAnnBy.setSelectedItem(savedSort.toString());
388 sortAutocalc.addItem("Autocalculated first");
389 sortAutocalc.addItem("Autocalculated last");
390 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
391 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
392 : sortAutocalc.getItemAt(1));
394 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
395 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
396 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
397 + "/examples/exampleFile_2_3.jar"));
400 * Set Colours tab defaults
402 protColour.addItem(ResidueColourScheme.NONE);
403 nucColour.addItem(ResidueColourScheme.NONE);
404 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
406 String name = cs.getSchemeName();
407 protColour.addItem(name);
408 nucColour.addItem(name);
410 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
411 ResidueColourScheme.NONE);
412 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
413 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
414 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
415 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
416 minColour.setBackground(
417 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
418 maxColour.setBackground(
419 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
422 * Set overview panel defaults
424 gapColour.setBackground(
425 Cache.getDefaultColour(GAP_COLOUR,
426 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
427 hiddenColour.setBackground(
428 Cache.getDefaultColour(HIDDEN_COLOUR,
429 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
430 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
431 gapLabel.setEnabled(!useLegacyGap.isSelected());
432 gapColour.setEnabled(!useLegacyGap.isSelected());
434 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
437 * Set Structure tab defaults.
439 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
440 structFromPdb.setSelected(structSelected);
441 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
442 useRnaView.setEnabled(structSelected);
443 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
444 addSecondaryStructure.setEnabled(structSelected);
445 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
446 addTempFactor.setEnabled(structSelected);
447 structViewer.setSelectedItem(
448 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
449 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
450 chimeraPath.addActionListener(new ActionListener()
453 public void actionPerformed(ActionEvent e)
455 validateChimeraPath();
459 if (Cache.getDefault("MAP_WITH_SIFTS", false))
461 siftsMapping.setSelected(true);
465 nwMapping.setSelected(true);
469 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
472 * Set Connections tab defaults
476 linkUrlTable.setModel(dataModel);
477 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
478 linkUrlTable.getModel());
479 linkUrlTable.setRowSorter(sorter);
480 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
482 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
483 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
484 SortOrder.DESCENDING));
485 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
486 SortOrder.DESCENDING));
488 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
490 sorter.setSortKeys(sortKeys);
491 // BH 2018 setSortKeys will do the sort
495 ActionListener onReset;
496 onReset = new ActionListener()
499 public void actionPerformed(ActionEvent e)
501 filterTB.setText("");
502 sorter.setRowFilter(RowFilter.regexFilter(""));
506 doReset.addActionListener(onReset);
508 // filter to display only custom urls
509 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
512 public boolean include(
513 Entry<? extends TableModel, ? extends Object> entry)
515 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
519 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
520 linkUrlTable.getModel());
521 customSorter.setRowFilter(customUrlFilter);
523 ActionListener onCustomOnly;
524 onCustomOnly = new ActionListener()
527 public void actionPerformed(ActionEvent e)
529 filterTB.setText("");
530 sorter.setRowFilter(customUrlFilter);
533 userOnly.addActionListener(onCustomOnly);
535 filterTB.getDocument().addDocumentListener(new DocumentListener()
537 String caseInsensitiveFlag = "(?i)";
540 public void changedUpdate(DocumentEvent e)
542 sorter.setRowFilter(RowFilter
543 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
547 public void removeUpdate(DocumentEvent e)
549 sorter.setRowFilter(RowFilter
550 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
554 public void insertUpdate(DocumentEvent e)
556 sorter.setRowFilter(RowFilter
557 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
561 // set up list selection functionality
562 linkUrlTable.getSelectionModel()
563 .addListSelectionListener(new UrlListSelectionHandler());
565 // set up radio buttons
566 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
568 String onClickName = linkUrlTable.getColumnName(onClickCol);
569 linkUrlTable.getColumn(onClickName)
570 .setCellRenderer(new RadioButtonRenderer());
571 linkUrlTable.getColumn(onClickName)
572 .setCellEditor(new RadioButtonEditor());
574 // get boolean columns and resize those to min possible
575 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
577 if (linkUrlTable.getModel().getColumnClass(column)
578 .equals(Boolean.class))
580 TableColumn tableColumn = linkUrlTable.getColumnModel()
582 int preferredWidth = tableColumn.getMinWidth();
584 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
586 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
587 int cwidth = c.getPreferredSize().width
588 + linkUrlTable.getIntercellSpacing().width;
589 preferredWidth = Math.max(preferredWidth, cwidth);
591 tableColumn.setPreferredWidth(preferredWidth);
595 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
596 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
597 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
598 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
600 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
602 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
603 // note antisense here: default is true
605 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
606 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
609 * Set Output tab defaults
611 setupOutputCombo(epsRendering, "EPS_RENDERING");
612 setupOutputCombo(htmlRendering, "HTML_RENDERING");
613 setupOutputCombo(svgRendering, "SVG_RENDERING");
614 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
615 userIdWidth.setEnabled(!autoIdWidth.isSelected());
616 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
617 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
618 userIdWidth.setText(wi == null ? "" : wi.toString());
619 // TODO: refactor to use common enum via FormatAdapter and allow extension
620 // for new flat file formats
621 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
622 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
623 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
624 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
625 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
626 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
627 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
628 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
630 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
633 * Set Editing tab defaults
635 autoCalculateConsCheck
636 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
637 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
638 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
640 annotations_actionPerformed(null); // update the display of the annotation
645 * Set Backups tab defaults
647 loadLastSavedBackupsOptions();
651 * A helper method that sets the items and initial selection in a character
652 * rendering option list (Prompt each time/Lineart/Text)
657 protected void setupOutputCombo(JComboBox<Object> comboBox,
660 comboBox.addItem(promptEachTimeOpt);
661 comboBox.addItem(lineArtOpt);
662 comboBox.addItem(textOpt);
665 * JalviewJS doesn't support Lineart so force it to Text
667 String defaultOption = Platform.isJS() ? "Text"
668 : Cache.getDefault(propertyKey, "Prompt each time");
669 if (defaultOption.equalsIgnoreCase("Text"))
671 comboBox.setSelectedItem(textOpt);
673 else if (defaultOption.equalsIgnoreCase("Lineart"))
675 comboBox.setSelectedItem(lineArtOpt);
679 comboBox.setSelectedItem(promptEachTimeOpt);
684 * Save user selections on the Preferences tabs to the Cache and write out to
690 public void ok_actionPerformed(ActionEvent e)
692 if (!validateSettings())
698 * Save Visual settings
700 Cache.setPropertyNoSave("SHOW_JVSUFFIX",
701 Boolean.toString(seqLimit.isSelected()));
702 Cache.setPropertyNoSave("RIGHT_ALIGN_IDS",
703 Boolean.toString(rightAlign.isSelected()));
704 Cache.setPropertyNoSave("SHOW_FULLSCREEN",
705 Boolean.toString(fullScreen.isSelected()));
706 Cache.setPropertyNoSave("SHOW_OVERVIEW",
707 Boolean.toString(openoverv.isSelected()));
708 Cache.setPropertyNoSave("SHOW_ANNOTATIONS",
709 Boolean.toString(annotations.isSelected()));
710 Cache.setPropertyNoSave("SHOW_CONSERVATION",
711 Boolean.toString(conservation.isSelected()));
712 Cache.setPropertyNoSave("SHOW_QUALITY",
713 Boolean.toString(quality.isSelected()));
714 Cache.setPropertyNoSave("SHOW_IDENTITY",
715 Boolean.toString(identity.isSelected()));
717 Cache.setPropertyNoSave("GAP_SYMBOL",
718 gapSymbolCB.getSelectedItem().toString());
720 Cache.setPropertyNoSave("FONT_NAME",
721 fontNameCB.getSelectedItem().toString());
722 Cache.setPropertyNoSave("FONT_STYLE",
723 fontStyleCB.getSelectedItem().toString());
724 Cache.setPropertyNoSave("FONT_SIZE",
725 fontSizeCB.getSelectedItem().toString());
727 Cache.setPropertyNoSave("ID_ITALICS",
728 Boolean.toString(idItalics.isSelected()));
729 Cache.setPropertyNoSave("SHOW_UNCONSERVED",
730 Boolean.toString(showUnconserved.isSelected()));
731 Cache.setPropertyNoSave(SHOW_OCCUPANCY,
732 Boolean.toString(showOccupancy.isSelected()));
733 Cache.setPropertyNoSave("SHOW_GROUP_CONSENSUS",
734 Boolean.toString(showGroupConsensus.isSelected()));
735 Cache.setPropertyNoSave("SHOW_GROUP_CONSERVATION",
736 Boolean.toString(showGroupConservation.isSelected()));
737 Cache.setPropertyNoSave("SHOW_CONSENSUS_HISTOGRAM",
738 Boolean.toString(showConsensHistogram.isSelected()));
739 Cache.setPropertyNoSave("SHOW_CONSENSUS_LOGO",
740 Boolean.toString(showConsensLogo.isSelected()));
741 Cache.setPropertyNoSave("ANTI_ALIAS",
742 Boolean.toString(smoothFont.isSelected()));
743 Cache.setPropertyNoSave(SCALE_PROTEIN_TO_CDNA,
744 Boolean.toString(scaleProteinToCdna.isSelected()));
745 Cache.setPropertyNoSave("SHOW_NPFEATS_TOOLTIP",
746 Boolean.toString(showNpTooltip.isSelected()));
747 Cache.setPropertyNoSave("SHOW_DBREFS_TOOLTIP",
748 Boolean.toString(showDbRefTooltip.isSelected()));
750 Cache.setPropertyNoSave("WRAP_ALIGNMENT",
751 Boolean.toString(wrap.isSelected()));
753 Cache.setPropertyNoSave("STARTUP_FILE",
754 startupFileTextfield.getText());
755 Cache.setPropertyNoSave("SHOW_STARTUP_FILE",
756 Boolean.toString(startupCheckbox.isSelected()));
758 Cache.setPropertyNoSave("SORT_ALIGNMENT",
759 sortby.getSelectedItem().toString());
761 // convert description of sort order to enum name for save
762 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
763 .forDescription(sortAnnBy.getSelectedItem().toString());
764 if (annSortOrder != null)
766 Cache.setPropertyNoSave(SORT_ANNOTATIONS,
767 annSortOrder.name());
770 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
771 Cache.setPropertyNoSave(SHOW_AUTOCALC_ABOVE,
772 Boolean.valueOf(showAutocalcFirst).toString());
775 * Save Colours settings
777 Cache.setPropertyNoSave(DEFAULT_COLOUR_PROT,
778 protColour.getSelectedItem().toString());
779 Cache.setPropertyNoSave(DEFAULT_COLOUR_NUC,
780 nucColour.getSelectedItem().toString());
781 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
782 minColour.getBackground());
783 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
784 maxColour.getBackground());
787 * Save Overview settings
789 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
790 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
791 Cache.setPropertyNoSave(USE_LEGACY_GAP,
792 Boolean.toString(useLegacyGap.isSelected()));
793 Cache.setPropertyNoSave(SHOW_OV_HIDDEN_AT_START,
794 Boolean.toString(showHiddenAtStart.isSelected()));
797 * Save Structure settings
799 Cache.setPropertyNoSave(ADD_TEMPFACT_ANN,
800 Boolean.toString(addTempFactor.isSelected()));
801 Cache.setPropertyNoSave(ADD_SS_ANN,
802 Boolean.toString(addSecondaryStructure.isSelected()));
803 Cache.setPropertyNoSave(USE_RNAVIEW,
804 Boolean.toString(useRnaView.isSelected()));
805 Cache.setPropertyNoSave(STRUCT_FROM_PDB,
806 Boolean.toString(structFromPdb.isSelected()));
807 Cache.setPropertyNoSave(STRUCTURE_DISPLAY,
808 structViewer.getSelectedItem().toString());
809 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
810 Cache.setPropertyNoSave("MAP_WITH_SIFTS",
811 Boolean.toString(siftsMapping.isSelected()));
812 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
815 * Save Output settings
817 Cache.setPropertyNoSave("EPS_RENDERING",
818 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
819 Cache.setPropertyNoSave("HTML_RENDERING",
820 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
821 Cache.setPropertyNoSave("SVG_RENDERING",
822 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
825 * Save Connections settings
827 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
829 jalview.util.BrowserLauncher.resetBrowser();
831 // save user-defined and selected links
832 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
833 if (menuLinks.isEmpty())
835 Cache.removePropertyNoSave("SEQUENCE_LINKS");
839 Cache.setPropertyNoSave("SEQUENCE_LINKS",
840 menuLinks.toString());
843 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
844 if (nonMenuLinks.isEmpty())
846 Cache.removePropertyNoSave("STORED_LINKS");
850 Cache.setPropertyNoSave("STORED_LINKS",
851 nonMenuLinks.toString());
854 Cache.setPropertyNoSave("DEFAULT_URL",
855 sequenceUrlLinks.getPrimaryUrlId());
857 Cache.setPropertyNoSave("USE_PROXY",
858 Boolean.toString(useProxy.isSelected()));
860 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
862 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
864 if (useProxy.isSelected())
866 System.setProperty("http.proxyHost", proxyServerTB.getText());
867 System.setProperty("http.proxyPort", proxyPortTB.getText());
871 System.setProperty("http.proxyHost", "");
872 System.setProperty("http.proxyPort", "");
874 Cache.setProperty("VERSION_CHECK",
875 Boolean.toString(versioncheck.isSelected()));
876 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
878 // default is false - we only set this if the user has actively agreed
879 Cache.setProperty("USAGESTATS",
880 Boolean.toString(usagestats.isSelected()));
882 if (!questionnaire.isSelected())
884 Cache.setProperty("NOQUESTIONNAIRES", "true");
888 // special - made easy to edit a property file to disable questionnaires
889 // by just adding the given line
890 Cache.removeProperty("NOQUESTIONNAIRES");
894 * Save Output settings
896 Cache.setPropertyNoSave("BLC_JVSUFFIX",
897 Boolean.toString(blcjv.isSelected()));
898 Cache.setPropertyNoSave("CLUSTAL_JVSUFFIX",
899 Boolean.toString(clustaljv.isSelected()));
900 Cache.setPropertyNoSave("FASTA_JVSUFFIX",
901 Boolean.toString(fastajv.isSelected()));
902 Cache.setPropertyNoSave("MSF_JVSUFFIX",
903 Boolean.toString(msfjv.isSelected()));
904 Cache.setPropertyNoSave("PFAM_JVSUFFIX",
905 Boolean.toString(pfamjv.isSelected()));
906 Cache.setPropertyNoSave("PILEUP_JVSUFFIX",
907 Boolean.toString(pileupjv.isSelected()));
908 Cache.setPropertyNoSave("PIR_JVSUFFIX",
909 Boolean.toString(pirjv.isSelected()));
910 Cache.setPropertyNoSave("PIR_MODELLER",
911 Boolean.toString(modellerOutput.isSelected()));
912 Cache.setPropertyNoSave("EXPORT_EMBBED_BIOJSON",
913 Boolean.toString(embbedBioJSON.isSelected()));
914 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
916 Cache.setPropertyNoSave("FIGURE_AUTOIDWIDTH",
917 Boolean.toString(autoIdWidth.isSelected()));
918 userIdWidth_actionPerformed();
919 Cache.setPropertyNoSave("FIGURE_FIXEDIDWIDTH",
920 userIdWidth.getText());
923 * Save Editing settings
925 Cache.setPropertyNoSave("AUTO_CALC_CONSENSUS",
926 Boolean.toString(autoCalculateConsCheck.isSelected()));
927 Cache.setPropertyNoSave("SORT_BY_TREE",
928 Boolean.toString(sortByTree.isSelected()));
929 Cache.setPropertyNoSave("PAD_GAPS",
930 Boolean.toString(padGaps.isSelected()));
932 if (!Platform.isJS())
934 wsPrefs.updateAndRefreshWsMenuConfig(false);
938 * Save Backups settings
940 Cache.setPropertyNoSave(BackupFiles.ENABLED,
941 Boolean.toString(enableBackupFiles.isSelected()));
942 int preset = getComboIntStringKey(backupfilesPresetsCombo);
943 Cache.setPropertyNoSave(BackupFiles.NS + "_PRESET", Integer.toString(preset));
945 if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
947 BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
948 BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
949 BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
950 Cache.setPropertyNoSave(BackupFilesPresetEntry.CUSTOMCONFIG,
951 customBFPE.toString());
954 BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
956 Cache.setPropertyNoSave(
957 BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
959 Cache.saveProperties();
960 Desktop.instance.doConfigureStructurePrefs();
963 frame.setClosed(true);
964 } catch (Exception ex)
969 public static void setAppletDefaults()
972 // http://www.jalview.org/old/v2_8/examples/appletParameters.html
974 // showConservation true or false Default is true.
975 // showQuality true or false Default is true.
976 // showConsensus true or false Default is true.
977 // showFeatureSettings true or false Shows the feature settings window when
979 // showTreeBootstraps true or false (default is true) show or hide branch
981 // showTreeDistances true or false (default is true) show or hide branch
983 // showUnlinkedTreeNodes true or false (default is false) indicate if
984 // unassociated nodes should be highlighted in the tree view
985 // showUnconserved true of false (default is false) When true, only gaps and
986 // symbols different to the consensus sequence ions of the alignment
987 // showGroupConsensus true of false (default is false) When true, shows
988 // consensus annotation row for any groups on the alignment. (since 2.7)
989 // showGroupConservation true of false (default is false) When true, shows
990 // amino-acid property conservation annotation row for any groups on the
991 // showConsensusHistogram true of false (default is true) When true, shows
992 // the percentage occurence of the consensus symbol for each column as a
993 // showSequenceLogo true of false (default is false) When true, shows a
994 // sequence logo above the consensus sequence (overlaid above the Consensus
996 Cache.setPropertyNoSave(SHOW_CONSERVATION, "true");
997 Cache.setPropertyNoSave(SHOW_QUALITY, "false");
998 Cache.setPropertyNoSave(SHOW_CONSENSUS, "true");
999 Cache.setPropertyNoSave(SHOW_UNCONSERVED, "false");
1000 Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION, "false");
1001 Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS, "false");
1003 // TODO -- just a start here
1006 * Do any necessary validation before saving settings. Return focus to the
1007 * first tab which fails validation.
1011 private boolean validateSettings()
1013 if (!validateStructure())
1015 structureTab.requestFocusInWindow();
1022 protected boolean validateStructure()
1024 return validateChimeraPath();
1032 public void startupFileTextfield_mouseClicked()
1034 // TODO: JAL-3048 not needed for Jalview-JS
1035 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
1036 JalviewFileChooser chooser = JalviewFileChooser
1037 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
1038 chooser.setFileView(new JalviewFileView());
1039 chooser.setDialogTitle(
1040 MessageManager.getString("label.select_startup_file"));
1042 int value = chooser.showOpenDialog(this);
1044 if (value == JalviewFileChooser.APPROVE_OPTION)
1046 FileFormatI format = chooser.getSelectedFormat();
1049 Cache.setPropertyNoSave("DEFAULT_FILE_FORMAT",
1052 startupFileTextfield
1053 .setText(chooser.getSelectedFile().getAbsolutePath());
1064 public void cancel_actionPerformed(ActionEvent e)
1068 if (!Platform.isJS())
1070 wsPrefs.updateWsMenuConfig(true);
1071 wsPrefs.refreshWs_actionPerformed(e);
1073 frame.setClosed(true);
1074 } catch (Exception ex)
1086 public void annotations_actionPerformed(ActionEvent e)
1088 conservation.setEnabled(annotations.isSelected());
1089 quality.setEnabled(annotations.isSelected());
1090 identity.setEnabled(annotations.isSelected());
1091 showOccupancy.setEnabled(annotations.isSelected());
1092 showGroupConsensus.setEnabled(annotations.isSelected());
1093 showGroupConservation.setEnabled(annotations.isSelected());
1094 showConsensHistogram.setEnabled(annotations.isSelected()
1095 && (identity.isSelected() || showGroupConsensus.isSelected()));
1096 showConsensLogo.setEnabled(annotations.isSelected()
1097 && (identity.isSelected() || showGroupConsensus.isSelected()));
1101 public void newLink_actionPerformed(ActionEvent e)
1103 GSequenceLink link = new GSequenceLink();
1104 boolean valid = false;
1107 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1108 MessageManager.getString("label.new_sequence_url_link"),
1109 JvOptionPane.OK_CANCEL_OPTION, -1,
1110 null) == JvOptionPane.OK_OPTION)
1112 if (link.checkValid())
1114 if (((UrlLinkTableModel) linkUrlTable.getModel())
1115 .isUniqueName(link.getName()))
1117 ((UrlLinkTableModel) linkUrlTable.getModel())
1118 .insertRow(link.getName(), link.getURL());
1123 link.notifyDuplicate();
1136 public void editLink_actionPerformed(ActionEvent e)
1138 GSequenceLink link = new GSequenceLink();
1140 int index = linkUrlTable.getSelectedRow();
1143 // button no longer enabled if row is not selected
1144 Cache.log.debug("Edit with no row selected in linkUrlTable");
1148 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1150 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1152 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1153 link.setName(oldName);
1154 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1156 boolean valid = false;
1159 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1160 MessageManager.getString("label.edit_sequence_url_link"),
1161 JvOptionPane.OK_CANCEL_OPTION, -1,
1162 null) == JvOptionPane.OK_OPTION)
1164 if (link.checkValid())
1166 if ((oldName.equals(link.getName()))
1167 || (((UrlLinkTableModel) linkUrlTable.getModel())
1168 .isUniqueName(link.getName())))
1170 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1171 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1176 link.notifyDuplicate();
1189 public void deleteLink_actionPerformed(ActionEvent e)
1191 int index = linkUrlTable.getSelectedRow();
1192 int modelIndex = -1;
1195 // button no longer enabled if row is not selected
1196 Cache.log.debug("Delete with no row selected in linkUrlTable");
1201 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1204 // make sure we use the model index to delete, and not the table index
1205 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1209 public void defaultBrowser_mouseClicked(MouseEvent e)
1211 // TODO: JAL-3048 not needed for j2s
1212 if (!Platform.isJS()) // BH 2019
1219 JFileChooser chooser = new JFileChooser(".");
1220 chooser.setDialogTitle(
1221 MessageManager.getString("label.select_default_browser"));
1223 int value = chooser.showOpenDialog(this);
1225 if (value == JFileChooser.APPROVE_OPTION)
1227 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1236 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1240 protected void showunconserved_actionPerformed(ActionEvent e)
1242 // TODO Auto-generated method stub
1243 super.showunconserved_actionPerformed(e);
1246 public static List<String> getGroupURLLinks()
1248 return groupURLLinks;
1252 public void minColour_actionPerformed(JPanel panel)
1254 JalviewColourChooser.showColourChooser(this,
1255 MessageManager.getString("label.select_colour_minimum_value"),
1260 public void maxColour_actionPerformed(JPanel panel)
1262 JalviewColourChooser.showColourChooser(this,
1263 MessageManager.getString("label.select_colour_maximum_value"),
1268 public void gapColour_actionPerformed(JPanel gap)
1270 if (!useLegacyGap.isSelected())
1272 JalviewColourChooser.showColourChooser(this,
1273 MessageManager.getString("label.select_gap_colour"),
1279 public void hiddenColour_actionPerformed(JPanel hidden)
1281 JalviewColourChooser.showColourChooser(this,
1282 MessageManager.getString("label.select_hidden_colour"),
1287 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1289 boolean enabled = useLegacyGap.isSelected();
1292 gapColour.setBackground(
1293 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1297 gapColour.setBackground(
1298 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1300 gapColour.setEnabled(!enabled);
1301 gapLabel.setEnabled(!enabled);
1305 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1307 useLegacyGap.setSelected(false);
1308 useLegacyGaps_actionPerformed(null);
1309 showHiddenAtStart.setSelected(false);
1310 hiddenColour.setBackground(
1311 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1315 protected void userIdWidth_actionPerformed()
1319 String val = userIdWidth.getText().trim();
1320 if (val.length() > 0)
1322 Integer iw = Integer.parseInt(val);
1323 if (iw.intValue() < 12)
1325 throw new NumberFormatException();
1327 userIdWidth.setText(iw.toString());
1329 } catch (NumberFormatException x)
1331 userIdWidth.setText("");
1332 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1334 .getString("warn.user_defined_width_requirements"),
1335 MessageManager.getString("label.invalid_id_column_width"),
1336 JvOptionPane.WARNING_MESSAGE);
1341 protected void autoIdWidth_actionPerformed()
1343 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1344 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1348 * Returns true if chimera path is to a valid executable, else show an error
1351 private boolean validateChimeraPath()
1353 if (chimeraPath.getText().trim().length() > 0)
1355 File f = new File(chimeraPath.getText());
1356 if (!f.canExecute())
1358 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1359 MessageManager.getString("label.invalid_chimera_path"),
1360 MessageManager.getString("label.invalid_name"),
1361 JvOptionPane.ERROR_MESSAGE);
1369 * If Chimera is selected, check it can be found on default or user-specified
1370 * path, if not show a warning/help dialog.
1373 protected void structureViewer_actionPerformed(String selectedItem)
1375 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1379 boolean found = false;
1382 * Try user-specified and standard paths for Chimera executable.
1384 List<String> paths = StructureManager.getChimeraPaths();
1385 paths.add(0, chimeraPath.getText());
1386 for (String path : paths)
1388 if (new File(path.trim()).canExecute())
1396 String[] options = { "OK", "Help" };
1397 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1398 JvSwingUtils.wrapTooltip(true,
1399 MessageManager.getString("label.chimera_missing")),
1400 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1401 null, options, options[0]);
1402 if (showHelp == JvOptionPane.NO_OPTION)
1406 Help.showHelpWindow(HelpId.StructureViewer);
1407 } catch (HelpSetException e)
1409 e.printStackTrace();
1415 public class OptionsParam
1417 private String name;
1419 private String code;
1421 public OptionsParam(String name, String code)
1427 public String getName()
1432 public void setName(String name)
1437 public String getCode()
1442 public void setCode(String code)
1448 public String toString()
1454 public boolean equals(Object that)
1456 if (!(that instanceof OptionsParam))
1460 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1464 public int hashCode()
1466 return name.hashCode() + code.hashCode();
1470 private class UrlListSelectionHandler implements ListSelectionListener
1474 public void valueChanged(ListSelectionEvent e)
1476 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1478 int index = lsm.getMinSelectionIndex();
1481 // no selection, so disable delete/edit buttons
1482 editLink.setEnabled(false);
1483 deleteLink.setEnabled(false);
1486 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1488 // enable/disable edit and delete link buttons
1489 if (((UrlLinkTableModel) linkUrlTable.getModel())
1490 .isRowDeletable(modelIndex))
1492 deleteLink.setEnabled(true);
1496 deleteLink.setEnabled(false);
1499 if (((UrlLinkTableModel) linkUrlTable.getModel())
1500 .isRowEditable(modelIndex))
1502 editLink.setEnabled(true);
1506 editLink.setEnabled(false);