2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
24 import jalview.bin.Cache;
25 import jalview.gui.Help.HelpId;
26 import jalview.gui.StructureViewer.ViewerType;
27 import jalview.io.BackupFiles;
28 import jalview.io.BackupFilesPresetEntry;
29 import jalview.io.FileFormatI;
30 import jalview.io.JalviewFileChooser;
31 import jalview.io.JalviewFileView;
32 import jalview.jbgui.GPreferences;
33 import jalview.jbgui.GSequenceLink;
34 import jalview.schemes.ColourSchemeI;
35 import jalview.schemes.ColourSchemes;
36 import jalview.schemes.ResidueColourScheme;
37 import jalview.urls.UrlLinkTableModel;
38 import jalview.urls.api.UrlProviderFactoryI;
39 import jalview.urls.api.UrlProviderI;
40 import jalview.urls.desktop.DesktopUrlProviderFactory;
41 import jalview.util.MessageManager;
42 import jalview.util.Platform;
43 import jalview.util.UrlConstants;
44 import jalview.ws.sifts.SiftsSettings;
46 import java.awt.BorderLayout;
47 import java.awt.Color;
48 import java.awt.Component;
49 import java.awt.Dimension;
51 import java.awt.event.ActionEvent;
52 import java.awt.event.ActionListener;
53 import java.awt.event.MouseEvent;
55 import java.util.ArrayList;
56 import java.util.List;
58 import javax.help.HelpSetException;
59 import javax.swing.JComboBox;
60 import javax.swing.JFileChooser;
61 import javax.swing.JInternalFrame;
62 import javax.swing.JPanel;
63 import javax.swing.ListSelectionModel;
64 import javax.swing.RowFilter;
65 import javax.swing.RowSorter;
66 import javax.swing.SortOrder;
67 import javax.swing.event.DocumentEvent;
68 import javax.swing.event.DocumentListener;
69 import javax.swing.event.ListSelectionEvent;
70 import javax.swing.event.ListSelectionListener;
71 import javax.swing.table.TableCellRenderer;
72 import javax.swing.table.TableColumn;
73 import javax.swing.table.TableModel;
74 import javax.swing.table.TableRowSorter;
76 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
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 SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
110 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
112 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
114 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
116 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
118 public static final String GAP_COLOUR = "GAP_COLOUR";
120 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
122 private static final int MIN_FONT_SIZE = 1;
124 private static final int MAX_FONT_SIZE = 30;
127 * Holds name and link separated with | character. Sequence ID must be
128 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
130 public static UrlProviderI sequenceUrlLinks;
132 public static UrlLinkTableModel dataModel;
135 * Holds name and link separated with | character. Sequence IDS and Sequences
136 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
137 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
138 * for first and second token specified after a pipe character at end |,|.
139 * (TODO: proper escape for using | to separate ids or sequences
142 public static List<String> groupURLLinks;
145 // get links selected to be in the menu (SEQUENCE_LINKS)
146 // and links entered by the user but not selected (STORED_LINKS)
147 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
148 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
149 String defaultUrl = Cache.getDefault("DEFAULT_URL",
150 UrlConstants.DEFAULT_LABEL);
152 // if both links lists are empty, add the DEFAULT_URL link
153 // otherwise we assume the default link is in one of the lists
154 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
156 inMenuString = UrlConstants.DEFAULT_STRING;
158 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
159 inMenuString, notInMenuString);
160 sequenceUrlLinks = factory.createUrlProvider();
161 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
164 * TODO: reformulate groupURL encoding so two or more can be stored in the
165 * .properties file as '|' separated strings
168 groupURLLinks = new ArrayList<>();
171 JInternalFrame frame;
173 private WsPreferences wsPrefs;
175 private OptionsParam promptEachTimeOpt = new OptionsParam(
176 MessageManager.getString("label.prompt_each_time"),
179 private OptionsParam lineArtOpt = new OptionsParam(
180 MessageManager.getString("label.lineart"), "Lineart");
182 private OptionsParam textOpt = new OptionsParam(
183 MessageManager.getString("action.text"), "Text");
186 * Creates a new Preferences object.
191 frame = new JInternalFrame();
192 frame.setContentPane(this);
193 if (!Platform.isJS())
200 wsPrefs = new WsPreferences();
201 wsTab.add(wsPrefs, BorderLayout.CENTER);
203 int width = 500, height = 450;
204 if (Platform.isAMacAndNotJS())
210 Desktop.addInternalFrame(frame,
211 MessageManager.getString("label.preferences"), width, height);
212 frame.setMinimumSize(new Dimension(width, height));
215 * Set Visual tab defaults
217 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
218 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
219 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
220 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
222 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
223 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
224 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
225 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
227 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
228 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
230 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
231 showGroupConservation.setSelected(
232 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
233 showConsensHistogram.setSelected(
234 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
236 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
238 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
240 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
242 String[] fonts = java.awt.GraphicsEnvironment
243 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
244 for (int i = 0; i < fonts.length; i++)
246 fontNameCB.addItem(fonts[i]);
249 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
251 fontSizeCB.addItem(i + "");
254 fontStyleCB.addItem("plain");
255 fontStyleCB.addItem("bold");
256 fontStyleCB.addItem("italic");
258 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
259 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
260 fontStyleCB.setSelectedItem(
261 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
263 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
265 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
267 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
269 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
271 gapSymbolCB.addItem("-");
272 gapSymbolCB.addItem(".");
274 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
276 sortby.addItem("No sort");
277 sortby.addItem("Id");
278 sortby.addItem("Pairwise Identity");
279 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
281 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
283 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
285 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
286 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
287 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
288 SequenceAnnotationOrder.NONE.name()));
289 sortAnnBy.setSelectedItem(savedSort.toString());
291 sortAutocalc.addItem("Autocalculated first");
292 sortAutocalc.addItem("Autocalculated last");
293 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
294 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
295 : sortAutocalc.getItemAt(1));
297 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
298 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
299 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
300 + "/examples/exampleFile_2_3.jar"));
303 * Set Colours tab defaults
305 protColour.addItem(ResidueColourScheme.NONE);
306 nucColour.addItem(ResidueColourScheme.NONE);
307 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
309 String name = cs.getSchemeName();
310 protColour.addItem(name);
311 nucColour.addItem(name);
313 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
314 ResidueColourScheme.NONE);
315 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
316 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
317 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
318 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
319 minColour.setBackground(
320 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
321 maxColour.setBackground(
322 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
325 * Set overview panel defaults
327 gapColour.setBackground(
328 Cache.getDefaultColour(GAP_COLOUR,
329 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
330 hiddenColour.setBackground(
331 Cache.getDefaultColour(HIDDEN_COLOUR,
332 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
333 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
334 gapLabel.setEnabled(!useLegacyGap.isSelected());
335 gapColour.setEnabled(!useLegacyGap.isSelected());
337 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
340 * Set Structure tab defaults.
342 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
343 structFromPdb.setSelected(structSelected);
344 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
345 useRnaView.setEnabled(structSelected);
346 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
347 addSecondaryStructure.setEnabled(structSelected);
348 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
349 addTempFactor.setEnabled(structSelected);
350 structViewer.setSelectedItem(
351 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
352 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
353 chimeraPath.addActionListener(new ActionListener()
356 public void actionPerformed(ActionEvent e)
358 validateChimeraPath();
362 if (Cache.getDefault("MAP_WITH_SIFTS", false))
364 siftsMapping.setSelected(true);
368 nwMapping.setSelected(true);
372 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
375 * Set Connections tab defaults
379 linkUrlTable.setModel(dataModel);
380 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
381 linkUrlTable.getModel());
382 linkUrlTable.setRowSorter(sorter);
383 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
385 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
386 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
387 SortOrder.DESCENDING));
388 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
389 SortOrder.DESCENDING));
391 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
393 sorter.setSortKeys(sortKeys);
394 // BH 2018 setSortKeys will do the sort
398 ActionListener onReset;
399 onReset = new ActionListener()
402 public void actionPerformed(ActionEvent e)
404 filterTB.setText("");
405 sorter.setRowFilter(RowFilter.regexFilter(""));
409 doReset.addActionListener(onReset);
411 // filter to display only custom urls
412 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
415 public boolean include(
416 Entry<? extends TableModel, ? extends Object> entry)
418 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
422 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
423 linkUrlTable.getModel());
424 customSorter.setRowFilter(customUrlFilter);
426 ActionListener onCustomOnly;
427 onCustomOnly = new ActionListener()
430 public void actionPerformed(ActionEvent e)
432 filterTB.setText("");
433 sorter.setRowFilter(customUrlFilter);
436 userOnly.addActionListener(onCustomOnly);
438 filterTB.getDocument().addDocumentListener(new DocumentListener()
440 String caseInsensitiveFlag = "(?i)";
443 public void changedUpdate(DocumentEvent e)
445 sorter.setRowFilter(RowFilter
446 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
450 public void removeUpdate(DocumentEvent e)
452 sorter.setRowFilter(RowFilter
453 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
457 public void insertUpdate(DocumentEvent e)
459 sorter.setRowFilter(RowFilter
460 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
464 // set up list selection functionality
465 linkUrlTable.getSelectionModel()
466 .addListSelectionListener(new UrlListSelectionHandler());
468 // set up radio buttons
469 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
471 String onClickName = linkUrlTable.getColumnName(onClickCol);
472 linkUrlTable.getColumn(onClickName)
473 .setCellRenderer(new RadioButtonRenderer());
474 linkUrlTable.getColumn(onClickName)
475 .setCellEditor(new RadioButtonEditor());
477 // get boolean columns and resize those to min possible
478 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
480 if (linkUrlTable.getModel().getColumnClass(column)
481 .equals(Boolean.class))
483 TableColumn tableColumn = linkUrlTable.getColumnModel()
485 int preferredWidth = tableColumn.getMinWidth();
487 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
489 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
490 int cwidth = c.getPreferredSize().width
491 + linkUrlTable.getIntercellSpacing().width;
492 preferredWidth = Math.max(preferredWidth, cwidth);
494 tableColumn.setPreferredWidth(preferredWidth);
498 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
499 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
500 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
501 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
503 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
505 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
506 // note antisense here: default is true
508 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
509 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
512 * Set Output tab defaults
514 setupOutputCombo(epsRendering, "EPS_RENDERING");
515 setupOutputCombo(htmlRendering, "HTML_RENDERING");
516 setupOutputCombo(svgRendering, "SVG_RENDERING");
517 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
518 userIdWidth.setEnabled(!autoIdWidth.isSelected());
519 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
520 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
521 userIdWidth.setText(wi == null ? "" : wi.toString());
522 // TODO: refactor to use common enum via FormatAdapter and allow extension
523 // for new flat file formats
524 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
525 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
526 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
527 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
528 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
529 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
530 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
531 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
533 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
536 * Set Editing tab defaults
538 autoCalculateConsCheck
539 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
540 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
541 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
543 annotations_actionPerformed(null); // update the display of the annotation
548 * Set Backups tab defaults
550 loadLastSavedBackupsOptions();
554 * A helper method that sets the items and initial selection in a character
555 * rendering option list (Prompt each time/Lineart/Text)
560 protected void setupOutputCombo(JComboBox<Object> comboBox,
563 comboBox.addItem(promptEachTimeOpt);
564 comboBox.addItem(lineArtOpt);
565 comboBox.addItem(textOpt);
568 * JalviewJS doesn't support Lineart so force it to Text
570 String defaultOption = Platform.isJS() ? "Text"
571 : Cache.getDefault(propertyKey, "Prompt each time");
572 if (defaultOption.equalsIgnoreCase("Text"))
574 comboBox.setSelectedItem(textOpt);
576 else if (defaultOption.equalsIgnoreCase("Lineart"))
578 comboBox.setSelectedItem(lineArtOpt);
582 comboBox.setSelectedItem(promptEachTimeOpt);
587 * Save user selections on the Preferences tabs to the Cache and write out to
593 public void ok_actionPerformed(ActionEvent e)
595 if (!validateSettings())
601 * Save Visual settings
603 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
604 Boolean.toString(seqLimit.isSelected()));
605 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
606 Boolean.toString(rightAlign.isSelected()));
607 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
608 Boolean.toString(fullScreen.isSelected()));
609 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
610 Boolean.toString(openoverv.isSelected()));
611 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
612 Boolean.toString(annotations.isSelected()));
613 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
614 Boolean.toString(conservation.isSelected()));
615 Cache.applicationProperties.setProperty("SHOW_QUALITY",
616 Boolean.toString(quality.isSelected()));
617 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
618 Boolean.toString(identity.isSelected()));
620 Cache.applicationProperties.setProperty("GAP_SYMBOL",
621 gapSymbolCB.getSelectedItem().toString());
623 Cache.applicationProperties.setProperty("FONT_NAME",
624 fontNameCB.getSelectedItem().toString());
625 Cache.applicationProperties.setProperty("FONT_STYLE",
626 fontStyleCB.getSelectedItem().toString());
627 Cache.applicationProperties.setProperty("FONT_SIZE",
628 fontSizeCB.getSelectedItem().toString());
630 Cache.applicationProperties.setProperty("ID_ITALICS",
631 Boolean.toString(idItalics.isSelected()));
632 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
633 Boolean.toString(showUnconserved.isSelected()));
634 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
635 Boolean.toString(showOccupancy.isSelected()));
636 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
637 Boolean.toString(showGroupConsensus.isSelected()));
638 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
639 Boolean.toString(showGroupConservation.isSelected()));
640 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
641 Boolean.toString(showConsensHistogram.isSelected()));
642 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
643 Boolean.toString(showConsensLogo.isSelected()));
644 Cache.applicationProperties.setProperty("ANTI_ALIAS",
645 Boolean.toString(smoothFont.isSelected()));
646 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
647 Boolean.toString(scaleProteinToCdna.isSelected()));
648 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
649 Boolean.toString(showNpTooltip.isSelected()));
650 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
651 Boolean.toString(showDbRefTooltip.isSelected()));
653 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
654 Boolean.toString(wrap.isSelected()));
656 Cache.applicationProperties.setProperty("STARTUP_FILE",
657 startupFileTextfield.getText());
658 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
659 Boolean.toString(startupCheckbox.isSelected()));
661 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
662 sortby.getSelectedItem().toString());
664 // convert description of sort order to enum name for save
665 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
666 .forDescription(sortAnnBy.getSelectedItem().toString());
667 if (annSortOrder != null)
669 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
670 annSortOrder.name());
673 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
674 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
675 Boolean.valueOf(showAutocalcFirst).toString());
678 * Save Colours settings
680 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
681 protColour.getSelectedItem().toString());
682 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
683 nucColour.getSelectedItem().toString());
684 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
685 minColour.getBackground());
686 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
687 maxColour.getBackground());
690 * Save Overview settings
692 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
693 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
694 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
695 Boolean.toString(useLegacyGap.isSelected()));
696 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
697 Boolean.toString(showHiddenAtStart.isSelected()));
700 * Save Structure settings
702 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
703 Boolean.toString(addTempFactor.isSelected()));
704 Cache.applicationProperties.setProperty(ADD_SS_ANN,
705 Boolean.toString(addSecondaryStructure.isSelected()));
706 Cache.applicationProperties.setProperty(USE_RNAVIEW,
707 Boolean.toString(useRnaView.isSelected()));
708 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
709 Boolean.toString(structFromPdb.isSelected()));
710 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
711 structViewer.getSelectedItem().toString());
712 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
713 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
714 Boolean.toString(siftsMapping.isSelected()));
715 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
718 * Save Output settings
720 Cache.applicationProperties.setProperty("EPS_RENDERING",
721 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
722 Cache.applicationProperties.setProperty("HTML_RENDERING",
723 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
724 Cache.applicationProperties.setProperty("SVG_RENDERING",
725 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
728 * Save Connections settings
730 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
732 jalview.util.BrowserLauncher.resetBrowser();
734 // save user-defined and selected links
735 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
736 if (menuLinks.isEmpty())
738 Cache.applicationProperties.remove("SEQUENCE_LINKS");
742 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
743 menuLinks.toString());
746 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
747 if (nonMenuLinks.isEmpty())
749 Cache.applicationProperties.remove("STORED_LINKS");
753 Cache.applicationProperties.setProperty("STORED_LINKS",
754 nonMenuLinks.toString());
757 Cache.applicationProperties.setProperty("DEFAULT_URL",
758 sequenceUrlLinks.getPrimaryUrlId());
760 Cache.applicationProperties.setProperty("USE_PROXY",
761 Boolean.toString(useProxy.isSelected()));
763 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
765 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
767 if (useProxy.isSelected())
769 System.setProperty("http.proxyHost", proxyServerTB.getText());
770 System.setProperty("http.proxyPort", proxyPortTB.getText());
774 System.setProperty("http.proxyHost", "");
775 System.setProperty("http.proxyPort", "");
777 Cache.setProperty("VERSION_CHECK",
778 Boolean.toString(versioncheck.isSelected()));
779 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
781 // default is false - we only set this if the user has actively agreed
782 Cache.setProperty("USAGESTATS",
783 Boolean.toString(usagestats.isSelected()));
785 if (!questionnaire.isSelected())
787 Cache.setProperty("NOQUESTIONNAIRES", "true");
791 // special - made easy to edit a property file to disable questionnaires
792 // by just adding the given line
793 Cache.removeProperty("NOQUESTIONNAIRES");
797 * Save Output settings
799 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
800 Boolean.toString(blcjv.isSelected()));
801 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
802 Boolean.toString(clustaljv.isSelected()));
803 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
804 Boolean.toString(fastajv.isSelected()));
805 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
806 Boolean.toString(msfjv.isSelected()));
807 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
808 Boolean.toString(pfamjv.isSelected()));
809 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
810 Boolean.toString(pileupjv.isSelected()));
811 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
812 Boolean.toString(pirjv.isSelected()));
813 Cache.applicationProperties.setProperty("PIR_MODELLER",
814 Boolean.toString(modellerOutput.isSelected()));
815 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
816 Boolean.toString(embbedBioJSON.isSelected()));
817 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
819 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
820 Boolean.toString(autoIdWidth.isSelected()));
821 userIdWidth_actionPerformed();
822 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
823 userIdWidth.getText());
826 * Save Editing settings
828 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
829 Boolean.toString(autoCalculateConsCheck.isSelected()));
830 Cache.applicationProperties.setProperty("SORT_BY_TREE",
831 Boolean.toString(sortByTree.isSelected()));
832 Cache.applicationProperties.setProperty("PAD_GAPS",
833 Boolean.toString(padGaps.isSelected()));
835 if (!Platform.isJS())
837 wsPrefs.updateAndRefreshWsMenuConfig(false);
841 * Save Backups settings
843 Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
844 Boolean.toString(enableBackupFiles.isSelected()));
845 int preset = getComboIntStringKey(backupfilesPresetsCombo);
846 Cache.applicationProperties.setProperty(BackupFiles.NS + "_PRESET", Integer.toString(preset));
848 if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
850 BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
851 BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
852 BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
853 Cache.applicationProperties
854 .setProperty(BackupFilesPresetEntry.CUSTOMCONFIG,
855 customBFPE.toString());
858 BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
860 Cache.applicationProperties.setProperty(
861 BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
863 Cache.saveProperties();
864 Desktop.instance.doConfigureStructurePrefs();
867 frame.setClosed(true);
868 } catch (Exception ex)
874 * Do any necessary validation before saving settings. Return focus to the
875 * first tab which fails validation.
879 private boolean validateSettings()
881 if (!validateStructure())
883 structureTab.requestFocusInWindow();
890 protected boolean validateStructure()
892 return validateChimeraPath();
900 public void startupFileTextfield_mouseClicked()
902 // TODO: JAL-3048 not needed for Jalview-JS
903 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
904 JalviewFileChooser chooser = JalviewFileChooser
905 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
906 chooser.setFileView(new JalviewFileView());
907 chooser.setDialogTitle(
908 MessageManager.getString("label.select_startup_file"));
910 int value = chooser.showOpenDialog(this);
912 if (value == JalviewFileChooser.APPROVE_OPTION)
914 FileFormatI format = chooser.getSelectedFormat();
917 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
921 .setText(chooser.getSelectedFile().getAbsolutePath());
932 public void cancel_actionPerformed(ActionEvent e)
936 if (!Platform.isJS())
938 wsPrefs.updateWsMenuConfig(true);
939 wsPrefs.refreshWs_actionPerformed(e);
941 frame.setClosed(true);
942 } catch (Exception ex)
954 public void annotations_actionPerformed(ActionEvent e)
956 conservation.setEnabled(annotations.isSelected());
957 quality.setEnabled(annotations.isSelected());
958 identity.setEnabled(annotations.isSelected());
959 showOccupancy.setEnabled(annotations.isSelected());
960 showGroupConsensus.setEnabled(annotations.isSelected());
961 showGroupConservation.setEnabled(annotations.isSelected());
962 showConsensHistogram.setEnabled(annotations.isSelected()
963 && (identity.isSelected() || showGroupConsensus.isSelected()));
964 showConsensLogo.setEnabled(annotations.isSelected()
965 && (identity.isSelected() || showGroupConsensus.isSelected()));
969 public void newLink_actionPerformed(ActionEvent e)
971 GSequenceLink link = new GSequenceLink();
972 boolean valid = false;
975 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
976 MessageManager.getString("label.new_sequence_url_link"),
977 JvOptionPane.OK_CANCEL_OPTION, -1,
978 null) == JvOptionPane.OK_OPTION)
980 if (link.checkValid())
982 if (((UrlLinkTableModel) linkUrlTable.getModel())
983 .isUniqueName(link.getName()))
985 ((UrlLinkTableModel) linkUrlTable.getModel())
986 .insertRow(link.getName(), link.getURL());
991 link.notifyDuplicate();
1004 public void editLink_actionPerformed(ActionEvent e)
1006 GSequenceLink link = new GSequenceLink();
1008 int index = linkUrlTable.getSelectedRow();
1011 // button no longer enabled if row is not selected
1012 Cache.log.debug("Edit with no row selected in linkUrlTable");
1016 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1018 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1020 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1021 link.setName(oldName);
1022 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1024 boolean valid = false;
1027 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1028 MessageManager.getString("label.edit_sequence_url_link"),
1029 JvOptionPane.OK_CANCEL_OPTION, -1,
1030 null) == JvOptionPane.OK_OPTION)
1032 if (link.checkValid())
1034 if ((oldName.equals(link.getName()))
1035 || (((UrlLinkTableModel) linkUrlTable.getModel())
1036 .isUniqueName(link.getName())))
1038 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1039 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1044 link.notifyDuplicate();
1057 public void deleteLink_actionPerformed(ActionEvent e)
1059 int index = linkUrlTable.getSelectedRow();
1060 int modelIndex = -1;
1063 // button no longer enabled if row is not selected
1064 Cache.log.debug("Delete with no row selected in linkUrlTable");
1069 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1072 // make sure we use the model index to delete, and not the table index
1073 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1077 public void defaultBrowser_mouseClicked(MouseEvent e)
1079 // TODO: JAL-3048 not needed for j2s
1080 if (!Platform.isJS()) // BH 2019
1087 JFileChooser chooser = new JFileChooser(".");
1088 chooser.setDialogTitle(
1089 MessageManager.getString("label.select_default_browser"));
1091 int value = chooser.showOpenDialog(this);
1093 if (value == JFileChooser.APPROVE_OPTION)
1095 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1104 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1108 protected void showunconserved_actionPerformed(ActionEvent e)
1110 // TODO Auto-generated method stub
1111 super.showunconserved_actionPerformed(e);
1114 public static List<String> getGroupURLLinks()
1116 return groupURLLinks;
1120 public void minColour_actionPerformed(JPanel panel)
1122 JalviewColourChooser.showColourChooser(this,
1123 MessageManager.getString("label.select_colour_minimum_value"),
1128 public void maxColour_actionPerformed(JPanel panel)
1130 JalviewColourChooser.showColourChooser(this,
1131 MessageManager.getString("label.select_colour_maximum_value"),
1136 public void gapColour_actionPerformed(JPanel gap)
1138 if (!useLegacyGap.isSelected())
1140 JalviewColourChooser.showColourChooser(this,
1141 MessageManager.getString("label.select_gap_colour"),
1147 public void hiddenColour_actionPerformed(JPanel hidden)
1149 JalviewColourChooser.showColourChooser(this,
1150 MessageManager.getString("label.select_hidden_colour"),
1155 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1157 boolean enabled = useLegacyGap.isSelected();
1160 gapColour.setBackground(
1161 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1165 gapColour.setBackground(
1166 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1168 gapColour.setEnabled(!enabled);
1169 gapLabel.setEnabled(!enabled);
1173 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1175 useLegacyGap.setSelected(false);
1176 useLegacyGaps_actionPerformed(null);
1177 showHiddenAtStart.setSelected(false);
1178 hiddenColour.setBackground(
1179 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1183 protected void userIdWidth_actionPerformed()
1187 String val = userIdWidth.getText().trim();
1188 if (val.length() > 0)
1190 Integer iw = Integer.parseInt(val);
1191 if (iw.intValue() < 12)
1193 throw new NumberFormatException();
1195 userIdWidth.setText(iw.toString());
1197 } catch (NumberFormatException x)
1199 userIdWidth.setText("");
1200 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1202 .getString("warn.user_defined_width_requirements"),
1203 MessageManager.getString("label.invalid_id_column_width"),
1204 JvOptionPane.WARNING_MESSAGE);
1209 protected void autoIdWidth_actionPerformed()
1211 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1212 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1216 * Returns true if chimera path is to a valid executable, else show an error
1219 private boolean validateChimeraPath()
1221 if (chimeraPath.getText().trim().length() > 0)
1223 File f = new File(chimeraPath.getText());
1224 if (!f.canExecute())
1226 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1227 MessageManager.getString("label.invalid_chimera_path"),
1228 MessageManager.getString("label.invalid_name"),
1229 JvOptionPane.ERROR_MESSAGE);
1237 * If Chimera is selected, check it can be found on default or user-specified
1238 * path, if not show a warning/help dialog.
1241 protected void structureViewer_actionPerformed(String selectedItem)
1243 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1247 boolean found = false;
1250 * Try user-specified and standard paths for Chimera executable.
1252 List<String> paths = StructureManager.getChimeraPaths();
1253 paths.add(0, chimeraPath.getText());
1254 for (String path : paths)
1256 if (new File(path.trim()).canExecute())
1264 String[] options = { "OK", "Help" };
1265 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1266 JvSwingUtils.wrapTooltip(true,
1267 MessageManager.getString("label.chimera_missing")),
1268 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1269 null, options, options[0]);
1270 if (showHelp == JvOptionPane.NO_OPTION)
1274 Help.showHelpWindow(HelpId.StructureViewer);
1275 } catch (HelpSetException e)
1277 e.printStackTrace();
1283 public class OptionsParam
1285 private String name;
1287 private String code;
1289 public OptionsParam(String name, String code)
1295 public String getName()
1300 public void setName(String name)
1305 public String getCode()
1310 public void setCode(String code)
1316 public String toString()
1322 public boolean equals(Object that)
1324 if (!(that instanceof OptionsParam))
1328 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1332 public int hashCode()
1334 return name.hashCode() + code.hashCode();
1338 private class UrlListSelectionHandler implements ListSelectionListener
1342 public void valueChanged(ListSelectionEvent e)
1344 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1346 int index = lsm.getMinSelectionIndex();
1349 // no selection, so disable delete/edit buttons
1350 editLink.setEnabled(false);
1351 deleteLink.setEnabled(false);
1354 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1356 // enable/disable edit and delete link buttons
1357 if (((UrlLinkTableModel) linkUrlTable.getModel())
1358 .isRowDeletable(modelIndex))
1360 deleteLink.setEnabled(true);
1364 deleteLink.setEnabled(false);
1367 if (((UrlLinkTableModel) linkUrlTable.getModel())
1368 .isRowEditable(modelIndex))
1370 editLink.setEnabled(true);
1374 editLink.setEnabled(false);