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 if (!Platform.isJS())
552 loadLastSavedBackupsOptions();
557 * A helper method that sets the items and initial selection in a character
558 * rendering option list (Prompt each time/Lineart/Text)
563 protected void setupOutputCombo(JComboBox<Object> comboBox,
566 comboBox.addItem(promptEachTimeOpt);
567 comboBox.addItem(lineArtOpt);
568 comboBox.addItem(textOpt);
571 * JalviewJS doesn't support Lineart so force it to Text
573 String defaultOption = Platform.isJS() ? "Text"
574 : Cache.getDefault(propertyKey, "Prompt each time");
575 if (defaultOption.equalsIgnoreCase("Text"))
577 comboBox.setSelectedItem(textOpt);
579 else if (defaultOption.equalsIgnoreCase("Lineart"))
581 comboBox.setSelectedItem(lineArtOpt);
585 comboBox.setSelectedItem(promptEachTimeOpt);
590 * Save user selections on the Preferences tabs to the Cache and write out to
596 public void ok_actionPerformed(ActionEvent e)
598 if (!validateSettings())
604 * Save Visual settings
606 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
607 Boolean.toString(seqLimit.isSelected()));
608 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
609 Boolean.toString(rightAlign.isSelected()));
610 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
611 Boolean.toString(fullScreen.isSelected()));
612 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
613 Boolean.toString(openoverv.isSelected()));
614 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
615 Boolean.toString(annotations.isSelected()));
616 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
617 Boolean.toString(conservation.isSelected()));
618 Cache.applicationProperties.setProperty("SHOW_QUALITY",
619 Boolean.toString(quality.isSelected()));
620 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
621 Boolean.toString(identity.isSelected()));
623 Cache.applicationProperties.setProperty("GAP_SYMBOL",
624 gapSymbolCB.getSelectedItem().toString());
626 Cache.applicationProperties.setProperty("FONT_NAME",
627 fontNameCB.getSelectedItem().toString());
628 Cache.applicationProperties.setProperty("FONT_STYLE",
629 fontStyleCB.getSelectedItem().toString());
630 Cache.applicationProperties.setProperty("FONT_SIZE",
631 fontSizeCB.getSelectedItem().toString());
633 Cache.applicationProperties.setProperty("ID_ITALICS",
634 Boolean.toString(idItalics.isSelected()));
635 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
636 Boolean.toString(showUnconserved.isSelected()));
637 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
638 Boolean.toString(showOccupancy.isSelected()));
639 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
640 Boolean.toString(showGroupConsensus.isSelected()));
641 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
642 Boolean.toString(showGroupConservation.isSelected()));
643 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
644 Boolean.toString(showConsensHistogram.isSelected()));
645 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
646 Boolean.toString(showConsensLogo.isSelected()));
647 Cache.applicationProperties.setProperty("ANTI_ALIAS",
648 Boolean.toString(smoothFont.isSelected()));
649 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
650 Boolean.toString(scaleProteinToCdna.isSelected()));
651 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
652 Boolean.toString(showNpTooltip.isSelected()));
653 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
654 Boolean.toString(showDbRefTooltip.isSelected()));
656 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
657 Boolean.toString(wrap.isSelected()));
659 Cache.applicationProperties.setProperty("STARTUP_FILE",
660 startupFileTextfield.getText());
661 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
662 Boolean.toString(startupCheckbox.isSelected()));
664 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
665 sortby.getSelectedItem().toString());
667 // convert description of sort order to enum name for save
668 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
669 .forDescription(sortAnnBy.getSelectedItem().toString());
670 if (annSortOrder != null)
672 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
673 annSortOrder.name());
676 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
677 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
678 Boolean.valueOf(showAutocalcFirst).toString());
681 * Save Colours settings
683 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
684 protColour.getSelectedItem().toString());
685 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
686 nucColour.getSelectedItem().toString());
687 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
688 minColour.getBackground());
689 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
690 maxColour.getBackground());
693 * Save Overview settings
695 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
696 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
697 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
698 Boolean.toString(useLegacyGap.isSelected()));
699 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
700 Boolean.toString(showHiddenAtStart.isSelected()));
703 * Save Structure settings
705 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
706 Boolean.toString(addTempFactor.isSelected()));
707 Cache.applicationProperties.setProperty(ADD_SS_ANN,
708 Boolean.toString(addSecondaryStructure.isSelected()));
709 Cache.applicationProperties.setProperty(USE_RNAVIEW,
710 Boolean.toString(useRnaView.isSelected()));
711 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
712 Boolean.toString(structFromPdb.isSelected()));
713 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
714 structViewer.getSelectedItem().toString());
715 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
716 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
717 Boolean.toString(siftsMapping.isSelected()));
718 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
721 * Save Output settings
723 Cache.applicationProperties.setProperty("EPS_RENDERING",
724 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
725 Cache.applicationProperties.setProperty("HTML_RENDERING",
726 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
727 Cache.applicationProperties.setProperty("SVG_RENDERING",
728 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
731 * Save Connections settings
733 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
735 jalview.util.BrowserLauncher.resetBrowser();
737 // save user-defined and selected links
738 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
739 if (menuLinks.isEmpty())
741 Cache.applicationProperties.remove("SEQUENCE_LINKS");
745 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
746 menuLinks.toString());
749 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
750 if (nonMenuLinks.isEmpty())
752 Cache.applicationProperties.remove("STORED_LINKS");
756 Cache.applicationProperties.setProperty("STORED_LINKS",
757 nonMenuLinks.toString());
760 Cache.applicationProperties.setProperty("DEFAULT_URL",
761 sequenceUrlLinks.getPrimaryUrlId());
763 Cache.applicationProperties.setProperty("USE_PROXY",
764 Boolean.toString(useProxy.isSelected()));
766 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
768 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
770 if (useProxy.isSelected())
772 System.setProperty("http.proxyHost", proxyServerTB.getText());
773 System.setProperty("http.proxyPort", proxyPortTB.getText());
777 System.setProperty("http.proxyHost", "");
778 System.setProperty("http.proxyPort", "");
780 Cache.setProperty("VERSION_CHECK",
781 Boolean.toString(versioncheck.isSelected()));
782 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
784 // default is false - we only set this if the user has actively agreed
785 Cache.setProperty("USAGESTATS",
786 Boolean.toString(usagestats.isSelected()));
788 if (!questionnaire.isSelected())
790 Cache.setProperty("NOQUESTIONNAIRES", "true");
794 // special - made easy to edit a property file to disable questionnaires
795 // by just adding the given line
796 Cache.removeProperty("NOQUESTIONNAIRES");
800 * Save Output settings
802 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
803 Boolean.toString(blcjv.isSelected()));
804 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
805 Boolean.toString(clustaljv.isSelected()));
806 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
807 Boolean.toString(fastajv.isSelected()));
808 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
809 Boolean.toString(msfjv.isSelected()));
810 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
811 Boolean.toString(pfamjv.isSelected()));
812 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
813 Boolean.toString(pileupjv.isSelected()));
814 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
815 Boolean.toString(pirjv.isSelected()));
816 Cache.applicationProperties.setProperty("PIR_MODELLER",
817 Boolean.toString(modellerOutput.isSelected()));
818 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
819 Boolean.toString(embbedBioJSON.isSelected()));
820 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
822 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
823 Boolean.toString(autoIdWidth.isSelected()));
824 userIdWidth_actionPerformed();
825 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
826 userIdWidth.getText());
829 * Save Editing settings
831 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
832 Boolean.toString(autoCalculateConsCheck.isSelected()));
833 Cache.applicationProperties.setProperty("SORT_BY_TREE",
834 Boolean.toString(sortByTree.isSelected()));
835 Cache.applicationProperties.setProperty("PAD_GAPS",
836 Boolean.toString(padGaps.isSelected()));
838 if (!Platform.isJS())
840 wsPrefs.updateAndRefreshWsMenuConfig(false);
844 * Save Backups settings
846 Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
847 Boolean.toString(enableBackupFiles.isSelected()));
848 int preset = getComboIntStringKey(backupfilesPresetsCombo);
849 Cache.applicationProperties.setProperty(BackupFiles.NS + "_PRESET", Integer.toString(preset));
851 if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
853 BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
854 BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
855 BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
856 Cache.applicationProperties
857 .setProperty(BackupFilesPresetEntry.CUSTOMCONFIG,
858 customBFPE.toString());
861 BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
863 Cache.applicationProperties.setProperty(
864 BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
866 Cache.saveProperties();
867 Desktop.instance.doConfigureStructurePrefs();
870 frame.setClosed(true);
871 } catch (Exception ex)
877 * Do any necessary validation before saving settings. Return focus to the
878 * first tab which fails validation.
882 private boolean validateSettings()
884 if (!validateStructure())
886 structureTab.requestFocusInWindow();
893 protected boolean validateStructure()
895 return validateChimeraPath();
903 public void startupFileTextfield_mouseClicked()
905 // TODO: JAL-3048 not needed for Jalview-JS
906 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
907 JalviewFileChooser chooser = JalviewFileChooser
908 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
909 chooser.setFileView(new JalviewFileView());
910 chooser.setDialogTitle(
911 MessageManager.getString("label.select_startup_file"));
913 int value = chooser.showOpenDialog(this);
915 if (value == JalviewFileChooser.APPROVE_OPTION)
917 FileFormatI format = chooser.getSelectedFormat();
920 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
924 .setText(chooser.getSelectedFile().getAbsolutePath());
935 public void cancel_actionPerformed(ActionEvent e)
939 if (!Platform.isJS())
941 wsPrefs.updateWsMenuConfig(true);
942 wsPrefs.refreshWs_actionPerformed(e);
944 frame.setClosed(true);
945 } catch (Exception ex)
957 public void annotations_actionPerformed(ActionEvent e)
959 conservation.setEnabled(annotations.isSelected());
960 quality.setEnabled(annotations.isSelected());
961 identity.setEnabled(annotations.isSelected());
962 showOccupancy.setEnabled(annotations.isSelected());
963 showGroupConsensus.setEnabled(annotations.isSelected());
964 showGroupConservation.setEnabled(annotations.isSelected());
965 showConsensHistogram.setEnabled(annotations.isSelected()
966 && (identity.isSelected() || showGroupConsensus.isSelected()));
967 showConsensLogo.setEnabled(annotations.isSelected()
968 && (identity.isSelected() || showGroupConsensus.isSelected()));
972 public void newLink_actionPerformed(ActionEvent e)
974 GSequenceLink link = new GSequenceLink();
975 boolean valid = false;
978 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
979 MessageManager.getString("label.new_sequence_url_link"),
980 JvOptionPane.OK_CANCEL_OPTION, -1,
981 null) == JvOptionPane.OK_OPTION)
983 if (link.checkValid())
985 if (((UrlLinkTableModel) linkUrlTable.getModel())
986 .isUniqueName(link.getName()))
988 ((UrlLinkTableModel) linkUrlTable.getModel())
989 .insertRow(link.getName(), link.getURL());
994 link.notifyDuplicate();
1007 public void editLink_actionPerformed(ActionEvent e)
1009 GSequenceLink link = new GSequenceLink();
1011 int index = linkUrlTable.getSelectedRow();
1014 // button no longer enabled if row is not selected
1015 Cache.log.debug("Edit with no row selected in linkUrlTable");
1019 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1021 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1023 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1024 link.setName(oldName);
1025 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1027 boolean valid = false;
1030 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1031 MessageManager.getString("label.edit_sequence_url_link"),
1032 JvOptionPane.OK_CANCEL_OPTION, -1,
1033 null) == JvOptionPane.OK_OPTION)
1035 if (link.checkValid())
1037 if ((oldName.equals(link.getName()))
1038 || (((UrlLinkTableModel) linkUrlTable.getModel())
1039 .isUniqueName(link.getName())))
1041 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1042 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1047 link.notifyDuplicate();
1060 public void deleteLink_actionPerformed(ActionEvent e)
1062 int index = linkUrlTable.getSelectedRow();
1063 int modelIndex = -1;
1066 // button no longer enabled if row is not selected
1067 Cache.log.debug("Delete with no row selected in linkUrlTable");
1072 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1075 // make sure we use the model index to delete, and not the table index
1076 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1080 public void defaultBrowser_mouseClicked(MouseEvent e)
1082 // TODO: JAL-3048 not needed for j2s
1083 if (!Platform.isJS()) // BH 2019
1090 JFileChooser chooser = new JFileChooser(".");
1091 chooser.setDialogTitle(
1092 MessageManager.getString("label.select_default_browser"));
1094 int value = chooser.showOpenDialog(this);
1096 if (value == JFileChooser.APPROVE_OPTION)
1098 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1107 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1111 protected void showunconserved_actionPerformed(ActionEvent e)
1113 // TODO Auto-generated method stub
1114 super.showunconserved_actionPerformed(e);
1117 public static List<String> getGroupURLLinks()
1119 return groupURLLinks;
1123 public void minColour_actionPerformed(JPanel panel)
1125 JalviewColourChooser.showColourChooser(this,
1126 MessageManager.getString("label.select_colour_minimum_value"),
1131 public void maxColour_actionPerformed(JPanel panel)
1133 JalviewColourChooser.showColourChooser(this,
1134 MessageManager.getString("label.select_colour_maximum_value"),
1139 public void gapColour_actionPerformed(JPanel gap)
1141 if (!useLegacyGap.isSelected())
1143 JalviewColourChooser.showColourChooser(this,
1144 MessageManager.getString("label.select_gap_colour"),
1150 public void hiddenColour_actionPerformed(JPanel hidden)
1152 JalviewColourChooser.showColourChooser(this,
1153 MessageManager.getString("label.select_hidden_colour"),
1158 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1160 boolean enabled = useLegacyGap.isSelected();
1163 gapColour.setBackground(
1164 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1168 gapColour.setBackground(
1169 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1171 gapColour.setEnabled(!enabled);
1172 gapLabel.setEnabled(!enabled);
1176 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1178 useLegacyGap.setSelected(false);
1179 useLegacyGaps_actionPerformed(null);
1180 showHiddenAtStart.setSelected(false);
1181 hiddenColour.setBackground(
1182 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1186 protected void userIdWidth_actionPerformed()
1190 String val = userIdWidth.getText().trim();
1191 if (val.length() > 0)
1193 Integer iw = Integer.parseInt(val);
1194 if (iw.intValue() < 12)
1196 throw new NumberFormatException();
1198 userIdWidth.setText(iw.toString());
1200 } catch (NumberFormatException x)
1202 userIdWidth.setText("");
1203 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1205 .getString("warn.user_defined_width_requirements"),
1206 MessageManager.getString("label.invalid_id_column_width"),
1207 JvOptionPane.WARNING_MESSAGE);
1212 protected void autoIdWidth_actionPerformed()
1214 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1215 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1219 * Returns true if chimera path is to a valid executable, else show an error
1222 private boolean validateChimeraPath()
1224 if (chimeraPath.getText().trim().length() > 0)
1226 File f = new File(chimeraPath.getText());
1227 if (!f.canExecute())
1229 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1230 MessageManager.getString("label.invalid_chimera_path"),
1231 MessageManager.getString("label.invalid_name"),
1232 JvOptionPane.ERROR_MESSAGE);
1240 * If Chimera is selected, check it can be found on default or user-specified
1241 * path, if not show a warning/help dialog.
1244 protected void structureViewer_actionPerformed(String selectedItem)
1246 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1250 boolean found = false;
1253 * Try user-specified and standard paths for Chimera executable.
1255 List<String> paths = StructureManager.getChimeraPaths();
1256 paths.add(0, chimeraPath.getText());
1257 for (String path : paths)
1259 if (new File(path.trim()).canExecute())
1267 String[] options = { "OK", "Help" };
1268 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1269 JvSwingUtils.wrapTooltip(true,
1270 MessageManager.getString("label.chimera_missing")),
1271 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1272 null, options, options[0]);
1273 if (showHelp == JvOptionPane.NO_OPTION)
1277 Help.showHelpWindow(HelpId.StructureViewer);
1278 } catch (HelpSetException e)
1280 e.printStackTrace();
1286 public class OptionsParam
1288 private String name;
1290 private String code;
1292 public OptionsParam(String name, String code)
1298 public String getName()
1303 public void setName(String name)
1308 public String getCode()
1313 public void setCode(String code)
1319 public String toString()
1325 public boolean equals(Object that)
1327 if (!(that instanceof OptionsParam))
1331 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1335 public int hashCode()
1337 return name.hashCode() + code.hashCode();
1341 private class UrlListSelectionHandler implements ListSelectionListener
1345 public void valueChanged(ListSelectionEvent e)
1347 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1349 int index = lsm.getMinSelectionIndex();
1352 // no selection, so disable delete/edit buttons
1353 editLink.setEnabled(false);
1354 deleteLink.setEnabled(false);
1357 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1359 // enable/disable edit and delete link buttons
1360 if (((UrlLinkTableModel) linkUrlTable.getModel())
1361 .isRowDeletable(modelIndex))
1363 deleteLink.setEnabled(true);
1367 deleteLink.setEnabled(false);
1370 if (((UrlLinkTableModel) linkUrlTable.getModel())
1371 .isRowEditable(modelIndex))
1373 editLink.setEnabled(true);
1377 editLink.setEnabled(false);