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.FileFormatI;
29 import jalview.io.JalviewFileChooser;
30 import jalview.io.JalviewFileView;
31 import jalview.jbgui.GPreferences;
32 import jalview.jbgui.GSequenceLink;
33 import jalview.schemes.ColourSchemeI;
34 import jalview.schemes.ColourSchemes;
35 import jalview.schemes.ResidueColourScheme;
36 import jalview.urls.UrlLinkTableModel;
37 import jalview.urls.api.UrlProviderFactoryI;
38 import jalview.urls.api.UrlProviderI;
39 import jalview.urls.desktop.DesktopUrlProviderFactory;
40 import jalview.util.MessageManager;
41 import jalview.util.Platform;
42 import jalview.util.UrlConstants;
43 import jalview.ws.sifts.SiftsSettings;
45 import java.awt.BorderLayout;
46 import java.awt.Color;
47 import java.awt.Component;
48 import java.awt.Dimension;
50 import java.awt.event.ActionEvent;
51 import java.awt.event.ActionListener;
52 import java.awt.event.MouseEvent;
54 import java.util.ArrayList;
55 import java.util.List;
57 import javax.help.HelpSetException;
58 import javax.swing.JComboBox;
59 import javax.swing.JFileChooser;
60 import javax.swing.JInternalFrame;
61 import javax.swing.JPanel;
62 import javax.swing.ListSelectionModel;
63 import javax.swing.RowFilter;
64 import javax.swing.RowSorter;
65 import javax.swing.SortOrder;
66 import javax.swing.event.DocumentEvent;
67 import javax.swing.event.DocumentListener;
68 import javax.swing.event.ListSelectionEvent;
69 import javax.swing.event.ListSelectionListener;
70 import javax.swing.table.TableCellRenderer;
71 import javax.swing.table.TableColumn;
72 import javax.swing.table.TableModel;
73 import javax.swing.table.TableRowSorter;
75 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
83 public class Preferences extends GPreferences
85 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
87 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
89 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
91 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
93 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
95 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
97 public static final String ADD_SS_ANN = "ADD_SS_ANN";
99 public static final String USE_RNAVIEW = "USE_RNAVIEW";
101 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
103 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
105 public static final String CHIMERA_PATH = "CHIMERA_PATH";
107 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
109 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
111 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
113 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
115 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
117 public static final String GAP_COLOUR = "GAP_COLOUR";
119 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
121 private static final int MIN_FONT_SIZE = 1;
123 private static final int MAX_FONT_SIZE = 30;
126 * Holds name and link separated with | character. Sequence ID must be
127 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
129 public static UrlProviderI sequenceUrlLinks;
131 public static UrlLinkTableModel dataModel;
134 * Holds name and link separated with | character. Sequence IDS and Sequences
135 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
136 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
137 * for first and second token specified after a pipe character at end |,|.
138 * (TODO: proper escape for using | to separate ids or sequences
141 public static List<String> groupURLLinks;
144 // get links selected to be in the menu (SEQUENCE_LINKS)
145 // and links entered by the user but not selected (STORED_LINKS)
146 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
147 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
148 String defaultUrl = Cache.getDefault("DEFAULT_URL",
149 UrlConstants.DEFAULT_LABEL);
151 // if both links lists are empty, add the DEFAULT_URL link
152 // otherwise we assume the default link is in one of the lists
153 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
155 inMenuString = UrlConstants.DEFAULT_STRING;
157 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
158 inMenuString, notInMenuString);
159 sequenceUrlLinks = factory.createUrlProvider();
160 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
163 * TODO: reformulate groupURL encoding so two or more can be stored in the
164 * .properties file as '|' separated strings
167 groupURLLinks = new ArrayList<>();
170 JInternalFrame frame;
172 private WsPreferences wsPrefs;
174 private OptionsParam promptEachTimeOpt = new OptionsParam(
175 MessageManager.getString("label.prompt_each_time"),
178 private OptionsParam lineArtOpt = new OptionsParam(
179 MessageManager.getString("label.lineart"), "Lineart");
181 private OptionsParam textOpt = new OptionsParam(
182 MessageManager.getString("action.text"), "Text");
185 * Creates a new Preferences object.
190 frame = new JInternalFrame();
191 frame.setContentPane(this);
192 if (!Platform.isJS())
194 wsPrefs = new WsPreferences();
195 wsTab.add(wsPrefs, BorderLayout.CENTER);
197 int width = 500, height = 450;
198 if (Platform.isAMacAndNotJS())
204 Desktop.addInternalFrame(frame,
205 MessageManager.getString("label.preferences"), width, height);
206 frame.setMinimumSize(new Dimension(width, height));
209 * Set Visual tab defaults
211 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
212 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
213 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
214 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
216 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
217 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
218 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
219 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
221 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
222 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
224 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
225 showGroupConservation.setSelected(
226 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
227 showConsensHistogram.setSelected(
228 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
230 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
232 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
234 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
236 String[] fonts = java.awt.GraphicsEnvironment
237 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
238 for (int i = 0; i < fonts.length; i++)
240 fontNameCB.addItem(fonts[i]);
243 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
245 fontSizeCB.addItem(i + "");
248 fontStyleCB.addItem("plain");
249 fontStyleCB.addItem("bold");
250 fontStyleCB.addItem("italic");
252 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
253 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
254 fontStyleCB.setSelectedItem(
255 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
257 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
259 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
261 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
263 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
265 gapSymbolCB.addItem("-");
266 gapSymbolCB.addItem(".");
268 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
270 sortby.addItem("No sort");
271 sortby.addItem("Id");
272 sortby.addItem("Pairwise Identity");
273 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
275 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
277 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
279 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
280 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
281 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
282 SequenceAnnotationOrder.NONE.name()));
283 sortAnnBy.setSelectedItem(savedSort.toString());
285 sortAutocalc.addItem("Autocalculated first");
286 sortAutocalc.addItem("Autocalculated last");
287 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
288 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
289 : sortAutocalc.getItemAt(1));
291 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
292 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
293 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
294 + "/examples/exampleFile_2_3.jar"));
297 * Set Colours tab defaults
299 protColour.addItem(ResidueColourScheme.NONE);
300 nucColour.addItem(ResidueColourScheme.NONE);
301 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
303 String name = cs.getSchemeName();
304 protColour.addItem(name);
305 nucColour.addItem(name);
307 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
308 ResidueColourScheme.NONE);
309 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
310 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
311 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
312 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
313 minColour.setBackground(
314 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
315 maxColour.setBackground(
316 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
319 * Set overview panel defaults
321 gapColour.setBackground(
322 Cache.getDefaultColour(GAP_COLOUR,
323 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
324 hiddenColour.setBackground(
325 Cache.getDefaultColour(HIDDEN_COLOUR,
326 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
327 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
328 gapLabel.setEnabled(!useLegacyGap.isSelected());
329 gapColour.setEnabled(!useLegacyGap.isSelected());
331 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
334 * Set Structure tab defaults.
336 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
337 structFromPdb.setSelected(structSelected);
338 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
339 useRnaView.setEnabled(structSelected);
340 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
341 addSecondaryStructure.setEnabled(structSelected);
342 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
343 addTempFactor.setEnabled(structSelected);
344 structViewer.setSelectedItem(
345 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
346 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
347 chimeraPath.addActionListener(new ActionListener()
350 public void actionPerformed(ActionEvent e)
352 validateChimeraPath();
356 if (Cache.getDefault("MAP_WITH_SIFTS", false))
358 siftsMapping.setSelected(true);
362 nwMapping.setSelected(true);
366 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
369 * Set Connections tab defaults
373 linkUrlTable.setModel(dataModel);
374 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
375 linkUrlTable.getModel());
376 linkUrlTable.setRowSorter(sorter);
377 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
379 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
380 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
381 SortOrder.DESCENDING));
382 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
383 SortOrder.DESCENDING));
385 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
387 sorter.setSortKeys(sortKeys);
388 // BH 2018 setSortKeys will do the sort
392 ActionListener onReset;
393 onReset = new ActionListener()
396 public void actionPerformed(ActionEvent e)
398 filterTB.setText("");
399 sorter.setRowFilter(RowFilter.regexFilter(""));
403 doReset.addActionListener(onReset);
405 // filter to display only custom urls
406 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
409 public boolean include(
410 Entry<? extends TableModel, ? extends Object> entry)
412 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
416 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
417 linkUrlTable.getModel());
418 customSorter.setRowFilter(customUrlFilter);
420 ActionListener onCustomOnly;
421 onCustomOnly = new ActionListener()
424 public void actionPerformed(ActionEvent e)
426 filterTB.setText("");
427 sorter.setRowFilter(customUrlFilter);
430 userOnly.addActionListener(onCustomOnly);
432 filterTB.getDocument().addDocumentListener(new DocumentListener()
434 String caseInsensitiveFlag = "(?i)";
437 public void changedUpdate(DocumentEvent e)
439 sorter.setRowFilter(RowFilter
440 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
444 public void removeUpdate(DocumentEvent e)
446 sorter.setRowFilter(RowFilter
447 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
451 public void insertUpdate(DocumentEvent e)
453 sorter.setRowFilter(RowFilter
454 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
458 // set up list selection functionality
459 linkUrlTable.getSelectionModel()
460 .addListSelectionListener(new UrlListSelectionHandler());
462 // set up radio buttons
463 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
465 String onClickName = linkUrlTable.getColumnName(onClickCol);
466 linkUrlTable.getColumn(onClickName)
467 .setCellRenderer(new RadioButtonRenderer());
468 linkUrlTable.getColumn(onClickName)
469 .setCellEditor(new RadioButtonEditor());
471 // get boolean columns and resize those to min possible
472 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
474 if (linkUrlTable.getModel().getColumnClass(column)
475 .equals(Boolean.class))
477 TableColumn tableColumn = linkUrlTable.getColumnModel()
479 int preferredWidth = tableColumn.getMinWidth();
481 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
483 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
484 int cwidth = c.getPreferredSize().width
485 + linkUrlTable.getIntercellSpacing().width;
486 preferredWidth = Math.max(preferredWidth, cwidth);
488 tableColumn.setPreferredWidth(preferredWidth);
492 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
493 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
494 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
495 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
497 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
499 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
500 // note antisense here: default is true
502 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
503 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
506 * Set Output tab defaults
508 setupOutputCombo(epsRendering, "EPS_RENDERING");
509 setupOutputCombo(htmlRendering, "HTML_RENDERING");
510 setupOutputCombo(svgRendering, "SVG_RENDERING");
511 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
512 userIdWidth.setEnabled(!autoIdWidth.isSelected());
513 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
514 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
515 userIdWidth.setText(wi == null ? "" : wi.toString());
516 // TODO: refactor to use common enum via FormatAdapter and allow extension
517 // for new flat file formats
518 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
519 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
520 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
521 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
522 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
523 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
524 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
525 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
527 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
530 * Set Editing tab defaults
532 autoCalculateConsCheck
533 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
534 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
535 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
537 annotations_actionPerformed(null); // update the display of the annotation
542 * Set Backups tab defaults
544 loadLastSavedBackupsOptions();
548 * A helper method that sets the items and initial selection in a character
549 * rendering option list (Prompt each time/Lineart/Text)
554 protected void setupOutputCombo(JComboBox<Object> comboBox,
557 comboBox.addItem(promptEachTimeOpt);
558 comboBox.addItem(lineArtOpt);
559 comboBox.addItem(textOpt);
562 * JalviewJS doesn't support Lineart so force it to Text
564 String defaultOption = Platform.isJS() ? "Text"
565 : Cache.getDefault(propertyKey, "Prompt each time");
566 if (defaultOption.equalsIgnoreCase("Text"))
568 comboBox.setSelectedItem(textOpt);
570 else if (defaultOption.equalsIgnoreCase("Lineart"))
572 comboBox.setSelectedItem(lineArtOpt);
576 comboBox.setSelectedItem(promptEachTimeOpt);
581 * Save user selections on the Preferences tabs to the Cache and write out to
587 public void ok_actionPerformed(ActionEvent e)
589 if (!validateSettings())
595 * Save Visual settings
597 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
598 Boolean.toString(seqLimit.isSelected()));
599 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
600 Boolean.toString(rightAlign.isSelected()));
601 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
602 Boolean.toString(fullScreen.isSelected()));
603 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
604 Boolean.toString(openoverv.isSelected()));
605 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
606 Boolean.toString(annotations.isSelected()));
607 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
608 Boolean.toString(conservation.isSelected()));
609 Cache.applicationProperties.setProperty("SHOW_QUALITY",
610 Boolean.toString(quality.isSelected()));
611 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
612 Boolean.toString(identity.isSelected()));
614 Cache.applicationProperties.setProperty("GAP_SYMBOL",
615 gapSymbolCB.getSelectedItem().toString());
617 Cache.applicationProperties.setProperty("FONT_NAME",
618 fontNameCB.getSelectedItem().toString());
619 Cache.applicationProperties.setProperty("FONT_STYLE",
620 fontStyleCB.getSelectedItem().toString());
621 Cache.applicationProperties.setProperty("FONT_SIZE",
622 fontSizeCB.getSelectedItem().toString());
624 Cache.applicationProperties.setProperty("ID_ITALICS",
625 Boolean.toString(idItalics.isSelected()));
626 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
627 Boolean.toString(showUnconserved.isSelected()));
628 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
629 Boolean.toString(showOccupancy.isSelected()));
630 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
631 Boolean.toString(showGroupConsensus.isSelected()));
632 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
633 Boolean.toString(showGroupConservation.isSelected()));
634 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
635 Boolean.toString(showConsensHistogram.isSelected()));
636 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
637 Boolean.toString(showConsensLogo.isSelected()));
638 Cache.applicationProperties.setProperty("ANTI_ALIAS",
639 Boolean.toString(smoothFont.isSelected()));
640 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
641 Boolean.toString(scaleProteinToCdna.isSelected()));
642 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
643 Boolean.toString(showNpTooltip.isSelected()));
644 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
645 Boolean.toString(showDbRefTooltip.isSelected()));
647 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
648 Boolean.toString(wrap.isSelected()));
650 Cache.applicationProperties.setProperty("STARTUP_FILE",
651 startupFileTextfield.getText());
652 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
653 Boolean.toString(startupCheckbox.isSelected()));
655 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
656 sortby.getSelectedItem().toString());
658 // convert description of sort order to enum name for save
659 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
660 .forDescription(sortAnnBy.getSelectedItem().toString());
661 if (annSortOrder != null)
663 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
664 annSortOrder.name());
667 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
668 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
669 Boolean.valueOf(showAutocalcFirst).toString());
672 * Save Colours settings
674 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
675 protColour.getSelectedItem().toString());
676 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
677 nucColour.getSelectedItem().toString());
678 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
679 minColour.getBackground());
680 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
681 maxColour.getBackground());
684 * Save Overview settings
686 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
687 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
688 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
689 Boolean.toString(useLegacyGap.isSelected()));
690 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
691 Boolean.toString(showHiddenAtStart.isSelected()));
694 * Save Structure settings
696 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
697 Boolean.toString(addTempFactor.isSelected()));
698 Cache.applicationProperties.setProperty(ADD_SS_ANN,
699 Boolean.toString(addSecondaryStructure.isSelected()));
700 Cache.applicationProperties.setProperty(USE_RNAVIEW,
701 Boolean.toString(useRnaView.isSelected()));
702 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
703 Boolean.toString(structFromPdb.isSelected()));
704 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
705 structViewer.getSelectedItem().toString());
706 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
707 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
708 Boolean.toString(siftsMapping.isSelected()));
709 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
712 * Save Output settings
714 Cache.applicationProperties.setProperty("EPS_RENDERING",
715 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
716 Cache.applicationProperties.setProperty("HTML_RENDERING",
717 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
718 Cache.applicationProperties.setProperty("SVG_RENDERING",
719 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
722 * Save Connections settings
724 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
726 jalview.util.BrowserLauncher.resetBrowser();
728 // save user-defined and selected links
729 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
730 if (menuLinks.isEmpty())
732 Cache.applicationProperties.remove("SEQUENCE_LINKS");
736 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
737 menuLinks.toString());
740 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
741 if (nonMenuLinks.isEmpty())
743 Cache.applicationProperties.remove("STORED_LINKS");
747 Cache.applicationProperties.setProperty("STORED_LINKS",
748 nonMenuLinks.toString());
751 Cache.applicationProperties.setProperty("DEFAULT_URL",
752 sequenceUrlLinks.getPrimaryUrlId());
754 Cache.applicationProperties.setProperty("USE_PROXY",
755 Boolean.toString(useProxy.isSelected()));
757 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
759 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
761 if (useProxy.isSelected())
763 System.setProperty("http.proxyHost", proxyServerTB.getText());
764 System.setProperty("http.proxyPort", proxyPortTB.getText());
768 System.setProperty("http.proxyHost", "");
769 System.setProperty("http.proxyPort", "");
771 Cache.setProperty("VERSION_CHECK",
772 Boolean.toString(versioncheck.isSelected()));
773 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
775 // default is false - we only set this if the user has actively agreed
776 Cache.setProperty("USAGESTATS",
777 Boolean.toString(usagestats.isSelected()));
779 if (!questionnaire.isSelected())
781 Cache.setProperty("NOQUESTIONNAIRES", "true");
785 // special - made easy to edit a property file to disable questionnaires
786 // by just adding the given line
787 Cache.removeProperty("NOQUESTIONNAIRES");
791 * Save Output settings
793 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
794 Boolean.toString(blcjv.isSelected()));
795 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
796 Boolean.toString(clustaljv.isSelected()));
797 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
798 Boolean.toString(fastajv.isSelected()));
799 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
800 Boolean.toString(msfjv.isSelected()));
801 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
802 Boolean.toString(pfamjv.isSelected()));
803 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
804 Boolean.toString(pileupjv.isSelected()));
805 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
806 Boolean.toString(pirjv.isSelected()));
807 Cache.applicationProperties.setProperty("PIR_MODELLER",
808 Boolean.toString(modellerOutput.isSelected()));
809 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
810 Boolean.toString(embbedBioJSON.isSelected()));
811 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
813 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
814 Boolean.toString(autoIdWidth.isSelected()));
815 userIdWidth_actionPerformed();
816 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
817 userIdWidth.getText());
820 * Save Editing settings
822 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
823 Boolean.toString(autoCalculateConsCheck.isSelected()));
824 Cache.applicationProperties.setProperty("SORT_BY_TREE",
825 Boolean.toString(sortByTree.isSelected()));
826 Cache.applicationProperties.setProperty("PAD_GAPS",
827 Boolean.toString(padGaps.isSelected()));
829 if (!Platform.isJS())
831 wsPrefs.updateAndRefreshWsMenuConfig(false);
835 * Save Backups settings
837 Cache.applicationProperties.setProperty(BackupFiles.CONFIRM_DELETE_OLD,
838 Boolean.toString(backupfilesConfirmDelete.isSelected()));
839 Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
840 Boolean.toString(enableBackupFiles.isSelected()));
841 Cache.applicationProperties.setProperty(BackupFiles.NO_MAX,
842 Boolean.toString(backupfilesKeepAll.isSelected()));
843 Cache.applicationProperties.setProperty(BackupFiles.REVERSE_ORDER,
844 Boolean.toString(suffixReverse.isSelected()));
845 Cache.applicationProperties.setProperty(BackupFiles.SUFFIX,
846 suffixTemplate.getText());
847 Cache.applicationProperties.setProperty(BackupFiles.ROLL_MAX,
848 Integer.toString(getSpinnerInt(backupfilesRollMaxSpinner, 4)));
849 Cache.applicationProperties.setProperty(BackupFiles.SUFFIX_DIGITS,
850 Integer.toString(getSpinnerInt(suffixDigitsSpinner, 3)));
851 Cache.applicationProperties.setProperty(BackupFiles.NS+"_PRESET",
852 Integer.toString(getComboIntStringKey(backupfilesPresetsCombo)));
854 Cache.saveProperties();
855 Desktop.instance.doConfigureStructurePrefs();
858 frame.setClosed(true);
859 } catch (Exception ex)
865 * Do any necessary validation before saving settings. Return focus to the
866 * first tab which fails validation.
870 private boolean validateSettings()
872 if (!validateStructure())
874 structureTab.requestFocusInWindow();
881 protected boolean validateStructure()
883 return validateChimeraPath();
891 public void startupFileTextfield_mouseClicked()
893 // TODO: JAL-3048 not needed for Jalview-JS
894 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
895 JalviewFileChooser chooser = JalviewFileChooser
896 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
897 chooser.setFileView(new JalviewFileView());
898 chooser.setDialogTitle(
899 MessageManager.getString("label.select_startup_file"));
901 int value = chooser.showOpenDialog(this);
903 if (value == JalviewFileChooser.APPROVE_OPTION)
905 FileFormatI format = chooser.getSelectedFormat();
908 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
912 .setText(chooser.getSelectedFile().getAbsolutePath());
923 public void cancel_actionPerformed(ActionEvent e)
927 if (!Platform.isJS())
929 wsPrefs.updateWsMenuConfig(true);
930 wsPrefs.refreshWs_actionPerformed(e);
932 frame.setClosed(true);
933 } catch (Exception ex)
945 public void annotations_actionPerformed(ActionEvent e)
947 conservation.setEnabled(annotations.isSelected());
948 quality.setEnabled(annotations.isSelected());
949 identity.setEnabled(annotations.isSelected());
950 showOccupancy.setEnabled(annotations.isSelected());
951 showGroupConsensus.setEnabled(annotations.isSelected());
952 showGroupConservation.setEnabled(annotations.isSelected());
953 showConsensHistogram.setEnabled(annotations.isSelected()
954 && (identity.isSelected() || showGroupConsensus.isSelected()));
955 showConsensLogo.setEnabled(annotations.isSelected()
956 && (identity.isSelected() || showGroupConsensus.isSelected()));
960 public void newLink_actionPerformed(ActionEvent e)
962 GSequenceLink link = new GSequenceLink();
963 boolean valid = false;
966 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
967 MessageManager.getString("label.new_sequence_url_link"),
968 JvOptionPane.OK_CANCEL_OPTION, -1,
969 null) == JvOptionPane.OK_OPTION)
971 if (link.checkValid())
973 if (((UrlLinkTableModel) linkUrlTable.getModel())
974 .isUniqueName(link.getName()))
976 ((UrlLinkTableModel) linkUrlTable.getModel())
977 .insertRow(link.getName(), link.getURL());
982 link.notifyDuplicate();
995 public void editLink_actionPerformed(ActionEvent e)
997 GSequenceLink link = new GSequenceLink();
999 int index = linkUrlTable.getSelectedRow();
1002 // button no longer enabled if row is not selected
1003 Cache.log.debug("Edit with no row selected in linkUrlTable");
1007 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1009 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1011 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1012 link.setName(oldName);
1013 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1015 boolean valid = false;
1018 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1019 MessageManager.getString("label.edit_sequence_url_link"),
1020 JvOptionPane.OK_CANCEL_OPTION, -1,
1021 null) == JvOptionPane.OK_OPTION)
1023 if (link.checkValid())
1025 if ((oldName.equals(link.getName()))
1026 || (((UrlLinkTableModel) linkUrlTable.getModel())
1027 .isUniqueName(link.getName())))
1029 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1030 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1035 link.notifyDuplicate();
1048 public void deleteLink_actionPerformed(ActionEvent e)
1050 int index = linkUrlTable.getSelectedRow();
1051 int modelIndex = -1;
1054 // button no longer enabled if row is not selected
1055 Cache.log.debug("Delete with no row selected in linkUrlTable");
1060 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1063 // make sure we use the model index to delete, and not the table index
1064 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1068 public void defaultBrowser_mouseClicked(MouseEvent e)
1070 // TODO: JAL-3048 not needed for j2s
1075 JFileChooser chooser = new JFileChooser(".");
1076 chooser.setDialogTitle(
1077 MessageManager.getString("label.select_default_browser"));
1079 int value = chooser.showOpenDialog(this);
1081 if (value == JFileChooser.APPROVE_OPTION)
1083 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1092 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1096 protected void showunconserved_actionPerformed(ActionEvent e)
1098 // TODO Auto-generated method stub
1099 super.showunconserved_actionPerformed(e);
1102 public static List<String> getGroupURLLinks()
1104 return groupURLLinks;
1108 public void minColour_actionPerformed(JPanel panel)
1110 JalviewColourChooser.showColourChooser(this,
1111 MessageManager.getString("label.select_colour_minimum_value"),
1116 public void maxColour_actionPerformed(JPanel panel)
1118 JalviewColourChooser.showColourChooser(this,
1119 MessageManager.getString("label.select_colour_maximum_value"),
1124 public void gapColour_actionPerformed(JPanel gap)
1126 if (!useLegacyGap.isSelected())
1128 JalviewColourChooser.showColourChooser(this,
1129 MessageManager.getString("label.select_gap_colour"),
1135 public void hiddenColour_actionPerformed(JPanel hidden)
1137 JalviewColourChooser.showColourChooser(this,
1138 MessageManager.getString("label.select_hidden_colour"),
1143 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1145 boolean enabled = useLegacyGap.isSelected();
1148 gapColour.setBackground(
1149 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1153 gapColour.setBackground(
1154 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1156 gapColour.setEnabled(!enabled);
1157 gapLabel.setEnabled(!enabled);
1161 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1163 useLegacyGap.setSelected(false);
1164 useLegacyGaps_actionPerformed(null);
1165 showHiddenAtStart.setSelected(false);
1166 hiddenColour.setBackground(
1167 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1171 protected void userIdWidth_actionPerformed()
1175 String val = userIdWidth.getText().trim();
1176 if (val.length() > 0)
1178 Integer iw = Integer.parseInt(val);
1179 if (iw.intValue() < 12)
1181 throw new NumberFormatException();
1183 userIdWidth.setText(iw.toString());
1185 } catch (NumberFormatException x)
1187 userIdWidth.setText("");
1188 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1190 .getString("warn.user_defined_width_requirements"),
1191 MessageManager.getString("label.invalid_id_column_width"),
1192 JvOptionPane.WARNING_MESSAGE);
1197 protected void autoIdWidth_actionPerformed()
1199 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1200 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1204 * Returns true if chimera path is to a valid executable, else show an error
1207 private boolean validateChimeraPath()
1209 if (chimeraPath.getText().trim().length() > 0)
1211 File f = new File(chimeraPath.getText());
1212 if (!f.canExecute())
1214 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1215 MessageManager.getString("label.invalid_chimera_path"),
1216 MessageManager.getString("label.invalid_name"),
1217 JvOptionPane.ERROR_MESSAGE);
1225 * If Chimera is selected, check it can be found on default or user-specified
1226 * path, if not show a warning/help dialog.
1229 protected void structureViewer_actionPerformed(String selectedItem)
1231 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1235 boolean found = false;
1238 * Try user-specified and standard paths for Chimera executable.
1240 List<String> paths = StructureManager.getChimeraPaths();
1241 paths.add(0, chimeraPath.getText());
1242 for (String path : paths)
1244 if (new File(path.trim()).canExecute())
1252 String[] options = { "OK", "Help" };
1253 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1254 JvSwingUtils.wrapTooltip(true,
1255 MessageManager.getString("label.chimera_missing")),
1256 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1257 null, options, options[0]);
1258 if (showHelp == JvOptionPane.NO_OPTION)
1262 Help.showHelpWindow(HelpId.StructureViewer);
1263 } catch (HelpSetException e)
1265 e.printStackTrace();
1271 public class OptionsParam
1273 private String name;
1275 private String code;
1277 public OptionsParam(String name, String code)
1283 public String getName()
1288 public void setName(String name)
1293 public String getCode()
1298 public void setCode(String code)
1304 public String toString()
1310 public boolean equals(Object that)
1312 if (!(that instanceof OptionsParam))
1316 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1320 public int hashCode()
1322 return name.hashCode() + code.hashCode();
1326 private class UrlListSelectionHandler implements ListSelectionListener
1330 public void valueChanged(ListSelectionEvent e)
1332 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1334 int index = lsm.getMinSelectionIndex();
1337 // no selection, so disable delete/edit buttons
1338 editLink.setEnabled(false);
1339 deleteLink.setEnabled(false);
1342 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1344 // enable/disable edit and delete link buttons
1345 if (((UrlLinkTableModel) linkUrlTable.getModel())
1346 .isRowDeletable(modelIndex))
1348 deleteLink.setEnabled(true);
1352 deleteLink.setEnabled(false);
1355 if (((UrlLinkTableModel) linkUrlTable.getModel())
1356 .isRowEditable(modelIndex))
1358 editLink.setEnabled(true);
1362 editLink.setEnabled(false);