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.JColorChooser;
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 wsPrefs = new WsPreferences();
193 wsTab.add(wsPrefs, BorderLayout.CENTER);
194 int width = 500, height = 450;
195 new jalview.util.Platform();
196 if (Platform.isAMac())
202 Desktop.addInternalFrame(frame,
203 MessageManager.getString("label.preferences"), width, height);
204 frame.setMinimumSize(new Dimension(width, height));
207 * Set Visual tab defaults
209 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
210 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
211 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
212 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
214 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
215 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
216 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
217 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
219 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
220 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
222 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
223 showGroupConservation.setSelected(
224 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
225 showConsensHistogram.setSelected(
226 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
228 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
230 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
232 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
234 String[] fonts = java.awt.GraphicsEnvironment
235 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
236 for (int i = 0; i < fonts.length; i++)
238 fontNameCB.addItem(fonts[i]);
241 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
243 fontSizeCB.addItem(i + "");
246 fontStyleCB.addItem("plain");
247 fontStyleCB.addItem("bold");
248 fontStyleCB.addItem("italic");
250 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
251 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
252 fontStyleCB.setSelectedItem(
253 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
255 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
257 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
259 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
261 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
263 gapSymbolCB.addItem("-");
264 gapSymbolCB.addItem(".");
266 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
268 sortby.addItem("No sort");
269 sortby.addItem("Id");
270 sortby.addItem("Pairwise Identity");
271 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
273 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
275 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
277 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
278 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
279 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
280 SequenceAnnotationOrder.NONE.name()));
281 sortAnnBy.setSelectedItem(savedSort.toString());
283 sortAutocalc.addItem("Autocalculated first");
284 sortAutocalc.addItem("Autocalculated last");
285 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
286 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
287 : sortAutocalc.getItemAt(1));
289 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
290 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
291 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
292 + "/examples/exampleFile_2_3.jar"));
295 * Set Colours tab defaults
297 protColour.addItem(ResidueColourScheme.NONE);
298 nucColour.addItem(ResidueColourScheme.NONE);
299 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
301 String name = cs.getSchemeName();
302 protColour.addItem(name);
303 nucColour.addItem(name);
305 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
306 ResidueColourScheme.NONE);
307 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
308 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
309 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
310 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
311 minColour.setBackground(
312 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
313 maxColour.setBackground(
314 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
317 * Set overview panel defaults
319 gapColour.setBackground(
320 Cache.getDefaultColour(GAP_COLOUR,
321 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
322 hiddenColour.setBackground(
323 Cache.getDefaultColour(HIDDEN_COLOUR,
324 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
325 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
326 gapLabel.setEnabled(!useLegacyGap.isSelected());
327 gapColour.setEnabled(!useLegacyGap.isSelected());
329 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, true));
332 * Set Structure tab defaults.
334 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
335 structFromPdb.setSelected(structSelected);
336 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
337 useRnaView.setEnabled(structSelected);
338 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
339 addSecondaryStructure.setEnabled(structSelected);
340 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
341 addTempFactor.setEnabled(structSelected);
342 structViewer.setSelectedItem(
343 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
344 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
345 chimeraPath.addActionListener(new ActionListener()
348 public void actionPerformed(ActionEvent e)
350 validateChimeraPath();
354 if (Cache.getDefault("MAP_WITH_SIFTS", false))
356 siftsMapping.setSelected(true);
360 nwMapping.setSelected(true);
364 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
367 * Set Connections tab defaults
371 linkUrlTable.setModel(dataModel);
372 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
373 linkUrlTable.getModel());
374 linkUrlTable.setRowSorter(sorter);
375 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
377 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
378 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
379 SortOrder.DESCENDING));
380 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
381 SortOrder.DESCENDING));
383 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
385 sorter.setSortKeys(sortKeys);
389 ActionListener onReset;
390 onReset = new ActionListener()
393 public void actionPerformed(ActionEvent e)
395 filterTB.setText("");
396 sorter.setRowFilter(RowFilter.regexFilter(""));
400 doReset.addActionListener(onReset);
402 // filter to display only custom urls
403 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
406 public boolean include(
407 Entry<? extends TableModel, ? extends Object> entry)
409 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
413 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
414 linkUrlTable.getModel());
415 customSorter.setRowFilter(customUrlFilter);
417 ActionListener onCustomOnly;
418 onCustomOnly = new ActionListener()
421 public void actionPerformed(ActionEvent e)
423 filterTB.setText("");
424 sorter.setRowFilter(customUrlFilter);
427 userOnly.addActionListener(onCustomOnly);
429 filterTB.getDocument().addDocumentListener(new DocumentListener()
431 String caseInsensitiveFlag = "(?i)";
434 public void changedUpdate(DocumentEvent e)
436 sorter.setRowFilter(RowFilter
437 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
441 public void removeUpdate(DocumentEvent e)
443 sorter.setRowFilter(RowFilter
444 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
448 public void insertUpdate(DocumentEvent e)
450 sorter.setRowFilter(RowFilter
451 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
455 // set up list selection functionality
456 linkUrlTable.getSelectionModel()
457 .addListSelectionListener(new UrlListSelectionHandler());
459 // set up radio buttons
460 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
462 String onClickName = linkUrlTable.getColumnName(onClickCol);
463 linkUrlTable.getColumn(onClickName)
464 .setCellRenderer(new RadioButtonRenderer());
465 linkUrlTable.getColumn(onClickName)
466 .setCellEditor(new RadioButtonEditor());
468 // get boolean columns and resize those to min possible
469 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
471 if (linkUrlTable.getModel().getColumnClass(column)
472 .equals(Boolean.class))
474 TableColumn tableColumn = linkUrlTable.getColumnModel()
476 int preferredWidth = tableColumn.getMinWidth();
478 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
480 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
481 int cwidth = c.getPreferredSize().width
482 + linkUrlTable.getIntercellSpacing().width;
483 preferredWidth = Math.max(preferredWidth, cwidth);
485 tableColumn.setPreferredWidth(preferredWidth);
489 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
490 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
491 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
492 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
494 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
496 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
497 // note antisense here: default is true
499 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
500 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
503 * Set Output tab defaults
505 epsRendering.addItem(promptEachTimeOpt);
506 epsRendering.addItem(lineArtOpt);
507 epsRendering.addItem(textOpt);
508 String defaultEPS = Cache.getDefault("EPS_RENDERING",
510 if (defaultEPS.equalsIgnoreCase("Text"))
512 epsRendering.setSelectedItem(textOpt);
514 else if (defaultEPS.equalsIgnoreCase("Lineart"))
516 epsRendering.setSelectedItem(lineArtOpt);
520 epsRendering.setSelectedItem(promptEachTimeOpt);
522 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
523 userIdWidth.setEnabled(!autoIdWidth.isSelected());
524 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
525 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
526 userIdWidth.setText(wi == null ? "" : wi.toString());
527 // TODO: refactor to use common enum via FormatAdapter and allow extension
528 // for new flat file formats
529 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
530 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
531 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
532 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
533 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
534 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
535 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
536 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
538 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
541 * Set Editing tab defaults
543 autoCalculateConsCheck
544 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
545 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
546 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
548 annotations_actionPerformed(null); // update the display of the annotation
553 * Set Backups tab defaults
556 .setSelected(Cache.getDefault(BackupFiles.ENABLED, true));
557 suffixTemplate.setText(Cache.getDefault(BackupFiles.SUFFIX, "-v"+BackupFiles.getNumPlaceHolder()));
558 suffixDigitsSpinner.setValue(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3));
559 suffixReverse.setSelected(
560 Cache.getDefault(BackupFiles.REVERSE_ORDER, false));
562 .setSelected(Cache.getDefault(BackupFiles.NO_MAX, false));
563 backupfilesRollMaxSpinner
564 .setValue(Cache.getDefault(BackupFiles.ROLL_MAX, 4));
565 backupfilesConfirmDelete.setSelected(
566 Cache.getDefault(BackupFiles.CONFIRM_DELETE_OLD, true));
567 backupsOptionsSetEnabled(enableBackupFiles.isSelected());
569 suffixPanel.setPreferredSize(
570 new Dimension(width, suffixPanel.getHeight()));
571 keepfilesPanel.setPreferredSize(
572 new Dimension(width, keepfilesPanel.getHeight()));
573 exampleFilesPanel.setPreferredSize(
574 new Dimension(width, exampleFilesPanel.getHeight()));
580 * Save user selections on the Preferences tabs to the Cache and write out to
586 public void ok_actionPerformed(ActionEvent e)
588 if (!validateSettings())
594 * Save Visual settings
596 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
597 Boolean.toString(seqLimit.isSelected()));
598 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
599 Boolean.toString(rightAlign.isSelected()));
600 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
601 Boolean.toString(fullScreen.isSelected()));
602 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
603 Boolean.toString(openoverv.isSelected()));
604 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
605 Boolean.toString(annotations.isSelected()));
606 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
607 Boolean.toString(conservation.isSelected()));
608 Cache.applicationProperties.setProperty("SHOW_QUALITY",
609 Boolean.toString(quality.isSelected()));
610 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
611 Boolean.toString(identity.isSelected()));
613 Cache.applicationProperties.setProperty("GAP_SYMBOL",
614 gapSymbolCB.getSelectedItem().toString());
616 Cache.applicationProperties.setProperty("FONT_NAME",
617 fontNameCB.getSelectedItem().toString());
618 Cache.applicationProperties.setProperty("FONT_STYLE",
619 fontStyleCB.getSelectedItem().toString());
620 Cache.applicationProperties.setProperty("FONT_SIZE",
621 fontSizeCB.getSelectedItem().toString());
623 Cache.applicationProperties.setProperty("ID_ITALICS",
624 Boolean.toString(idItalics.isSelected()));
625 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
626 Boolean.toString(showUnconserved.isSelected()));
627 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
628 Boolean.toString(showOccupancy.isSelected()));
629 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
630 Boolean.toString(showGroupConsensus.isSelected()));
631 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
632 Boolean.toString(showGroupConservation.isSelected()));
633 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
634 Boolean.toString(showConsensHistogram.isSelected()));
635 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
636 Boolean.toString(showConsensLogo.isSelected()));
637 Cache.applicationProperties.setProperty("ANTI_ALIAS",
638 Boolean.toString(smoothFont.isSelected()));
639 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
640 Boolean.toString(scaleProteinToCdna.isSelected()));
641 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
642 Boolean.toString(showNpTooltip.isSelected()));
643 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
644 Boolean.toString(showDbRefTooltip.isSelected()));
646 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
647 Boolean.toString(wrap.isSelected()));
649 Cache.applicationProperties.setProperty("STARTUP_FILE",
650 startupFileTextfield.getText());
651 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
652 Boolean.toString(startupCheckbox.isSelected()));
654 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
655 sortby.getSelectedItem().toString());
657 // convert description of sort order to enum name for save
658 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
659 .forDescription(sortAnnBy.getSelectedItem().toString());
660 if (annSortOrder != null)
662 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
663 annSortOrder.name());
666 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
667 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
668 Boolean.valueOf(showAutocalcFirst).toString());
671 * Save Colours settings
673 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
674 protColour.getSelectedItem().toString());
675 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
676 nucColour.getSelectedItem().toString());
677 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
678 minColour.getBackground());
679 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
680 maxColour.getBackground());
683 * Save Overview settings
685 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
686 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
687 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
688 Boolean.toString(useLegacyGap.isSelected()));
689 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
690 Boolean.toString(showHiddenAtStart.isSelected()));
693 * Save Structure settings
695 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
696 Boolean.toString(addTempFactor.isSelected()));
697 Cache.applicationProperties.setProperty(ADD_SS_ANN,
698 Boolean.toString(addSecondaryStructure.isSelected()));
699 Cache.applicationProperties.setProperty(USE_RNAVIEW,
700 Boolean.toString(useRnaView.isSelected()));
701 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
702 Boolean.toString(structFromPdb.isSelected()));
703 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
704 structViewer.getSelectedItem().toString());
705 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
706 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
707 Boolean.toString(siftsMapping.isSelected()));
708 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
711 * Save Output settings
713 Cache.applicationProperties.setProperty("EPS_RENDERING",
714 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
717 * Save Connections settings
719 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
721 jalview.util.BrowserLauncher.resetBrowser();
723 // save user-defined and selected links
724 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
725 if (menuLinks.isEmpty())
727 Cache.applicationProperties.remove("SEQUENCE_LINKS");
731 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
732 menuLinks.toString());
735 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
736 if (nonMenuLinks.isEmpty())
738 Cache.applicationProperties.remove("STORED_LINKS");
742 Cache.applicationProperties.setProperty("STORED_LINKS",
743 nonMenuLinks.toString());
746 Cache.applicationProperties.setProperty("DEFAULT_URL",
747 sequenceUrlLinks.getPrimaryUrlId());
749 Cache.applicationProperties.setProperty("USE_PROXY",
750 Boolean.toString(useProxy.isSelected()));
752 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
754 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
756 if (useProxy.isSelected())
758 System.setProperty("http.proxyHost", proxyServerTB.getText());
759 System.setProperty("http.proxyPort", proxyPortTB.getText());
763 System.setProperty("http.proxyHost", "");
764 System.setProperty("http.proxyPort", "");
766 Cache.setProperty("VERSION_CHECK",
767 Boolean.toString(versioncheck.isSelected()));
768 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
770 // default is false - we only set this if the user has actively agreed
771 Cache.setProperty("USAGESTATS",
772 Boolean.toString(usagestats.isSelected()));
774 if (!questionnaire.isSelected())
776 Cache.setProperty("NOQUESTIONNAIRES", "true");
780 // special - made easy to edit a property file to disable questionnaires
781 // by just adding the given line
782 Cache.removeProperty("NOQUESTIONNAIRES");
786 * Save Output settings
788 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
789 Boolean.toString(blcjv.isSelected()));
790 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
791 Boolean.toString(clustaljv.isSelected()));
792 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
793 Boolean.toString(fastajv.isSelected()));
794 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
795 Boolean.toString(msfjv.isSelected()));
796 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
797 Boolean.toString(pfamjv.isSelected()));
798 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
799 Boolean.toString(pileupjv.isSelected()));
800 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
801 Boolean.toString(pirjv.isSelected()));
802 Cache.applicationProperties.setProperty("PIR_MODELLER",
803 Boolean.toString(modellerOutput.isSelected()));
804 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
805 Boolean.toString(embbedBioJSON.isSelected()));
806 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
808 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
809 Boolean.toString(autoIdWidth.isSelected()));
810 userIdWidth_actionPerformed();
811 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
812 userIdWidth.getText());
815 * Save Editing settings
817 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
818 Boolean.toString(autoCalculateConsCheck.isSelected()));
819 Cache.applicationProperties.setProperty("SORT_BY_TREE",
820 Boolean.toString(sortByTree.isSelected()));
821 Cache.applicationProperties.setProperty("PAD_GAPS",
822 Boolean.toString(padGaps.isSelected()));
824 wsPrefs.updateAndRefreshWsMenuConfig(false);
827 * Save Backups settings
829 Cache.applicationProperties.setProperty(BackupFiles.CONFIRM_DELETE_OLD,
830 Boolean.toString(backupfilesConfirmDelete.isSelected()));
831 Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
832 Boolean.toString(enableBackupFiles.isSelected()));
833 Cache.applicationProperties.setProperty(BackupFiles.NO_MAX,
834 Boolean.toString(backupfilesKeepAll.isSelected()));
835 Cache.applicationProperties.setProperty(BackupFiles.REVERSE_ORDER,
836 Boolean.toString(suffixReverse.isSelected()));
837 Cache.applicationProperties.setProperty(BackupFiles.SUFFIX,
838 suffixTemplate.getText());
839 Cache.applicationProperties.setProperty(BackupFiles.ROLL_MAX,
840 Integer.toString(getSpinnerInt(backupfilesRollMaxSpinner, 4)));
841 Cache.applicationProperties.setProperty(BackupFiles.SUFFIX_DIGITS,
842 Integer.toString(getSpinnerInt(suffixDigitsSpinner, 3)));
844 Cache.saveProperties();
845 Desktop.instance.doConfigureStructurePrefs();
848 frame.setClosed(true);
849 } catch (Exception ex)
855 * Do any necessary validation before saving settings. Return focus to the
856 * first tab which fails validation.
860 private boolean validateSettings()
862 if (!validateStructure())
864 structureTab.requestFocusInWindow();
871 protected boolean validateStructure()
873 return validateChimeraPath();
881 public void startupFileTextfield_mouseClicked()
883 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
884 JalviewFileChooser chooser = JalviewFileChooser
885 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
886 chooser.setFileView(new JalviewFileView());
887 chooser.setDialogTitle(
888 MessageManager.getString("label.select_startup_file"));
890 int value = chooser.showOpenDialog(this);
892 if (value == JalviewFileChooser.APPROVE_OPTION)
894 FileFormatI format = chooser.getSelectedFormat();
897 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
901 .setText(chooser.getSelectedFile().getAbsolutePath());
912 public void cancel_actionPerformed(ActionEvent e)
916 wsPrefs.updateWsMenuConfig(true);
917 wsPrefs.refreshWs_actionPerformed(e);
918 frame.setClosed(true);
919 } catch (Exception ex)
931 public void annotations_actionPerformed(ActionEvent e)
933 conservation.setEnabled(annotations.isSelected());
934 quality.setEnabled(annotations.isSelected());
935 identity.setEnabled(annotations.isSelected());
936 showOccupancy.setEnabled(annotations.isSelected());
937 showGroupConsensus.setEnabled(annotations.isSelected());
938 showGroupConservation.setEnabled(annotations.isSelected());
939 showConsensHistogram.setEnabled(annotations.isSelected()
940 && (identity.isSelected() || showGroupConsensus.isSelected()));
941 showConsensLogo.setEnabled(annotations.isSelected()
942 && (identity.isSelected() || showGroupConsensus.isSelected()));
946 public void newLink_actionPerformed(ActionEvent e)
948 GSequenceLink link = new GSequenceLink();
949 boolean valid = false;
952 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
953 MessageManager.getString("label.new_sequence_url_link"),
954 JvOptionPane.OK_CANCEL_OPTION, -1,
955 null) == JvOptionPane.OK_OPTION)
957 if (link.checkValid())
959 if (((UrlLinkTableModel) linkUrlTable.getModel())
960 .isUniqueName(link.getName()))
962 ((UrlLinkTableModel) linkUrlTable.getModel())
963 .insertRow(link.getName(), link.getURL());
968 link.notifyDuplicate();
981 public void editLink_actionPerformed(ActionEvent e)
983 GSequenceLink link = new GSequenceLink();
985 int index = linkUrlTable.getSelectedRow();
988 // button no longer enabled if row is not selected
989 Cache.log.debug("Edit with no row selected in linkUrlTable");
993 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
995 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
997 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
998 link.setName(oldName);
999 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1001 boolean valid = false;
1004 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1005 MessageManager.getString("label.edit_sequence_url_link"),
1006 JvOptionPane.OK_CANCEL_OPTION, -1,
1007 null) == JvOptionPane.OK_OPTION)
1009 if (link.checkValid())
1011 if ((oldName.equals(link.getName()))
1012 || (((UrlLinkTableModel) linkUrlTable.getModel())
1013 .isUniqueName(link.getName())))
1015 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1016 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1021 link.notifyDuplicate();
1034 public void deleteLink_actionPerformed(ActionEvent e)
1036 int index = linkUrlTable.getSelectedRow();
1037 int modelIndex = -1;
1040 // button no longer enabled if row is not selected
1041 Cache.log.debug("Delete with no row selected in linkUrlTable");
1046 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1049 // make sure we use the model index to delete, and not the table index
1050 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1054 public void defaultBrowser_mouseClicked(MouseEvent e)
1056 JFileChooser chooser = new JFileChooser(".");
1057 chooser.setDialogTitle(
1058 MessageManager.getString("label.select_default_browser"));
1060 int value = chooser.showOpenDialog(this);
1062 if (value == JFileChooser.APPROVE_OPTION)
1064 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1073 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1077 protected void showunconserved_actionPerformed(ActionEvent e)
1079 // TODO Auto-generated method stub
1080 super.showunconserved_actionPerformed(e);
1083 public static List<String> getGroupURLLinks()
1085 return groupURLLinks;
1089 public void minColour_actionPerformed(JPanel panel)
1091 Color col = JColorChooser.showDialog(this,
1092 MessageManager.getString("label.select_colour_minimum_value"),
1093 minColour.getBackground());
1096 panel.setBackground(col);
1102 public void maxColour_actionPerformed(JPanel panel)
1104 Color col = JColorChooser.showDialog(this,
1105 MessageManager.getString("label.select_colour_maximum_value"),
1106 maxColour.getBackground());
1109 panel.setBackground(col);
1115 public void gapColour_actionPerformed(JPanel gap)
1117 if (!useLegacyGap.isSelected())
1119 Color col = JColorChooser.showDialog(this,
1120 MessageManager.getString("label.select_gap_colour"),
1121 gapColour.getBackground());
1124 gap.setBackground(col);
1131 public void hiddenColour_actionPerformed(JPanel hidden)
1133 Color col = JColorChooser.showDialog(this,
1134 MessageManager.getString("label.select_hidden_colour"),
1135 hiddenColour.getBackground());
1138 hidden.setBackground(col);
1144 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1146 boolean enabled = useLegacyGap.isSelected();
1149 gapColour.setBackground(
1150 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1154 gapColour.setBackground(
1155 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1157 gapColour.setEnabled(!enabled);
1158 gapLabel.setEnabled(!enabled);
1162 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1164 useLegacyGap.setSelected(false);
1165 useLegacyGaps_actionPerformed(null);
1166 showHiddenAtStart.setSelected(true);
1167 hiddenColour.setBackground(
1168 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1172 protected void userIdWidth_actionPerformed()
1176 String val = userIdWidth.getText().trim();
1177 if (val.length() > 0)
1179 Integer iw = Integer.parseInt(val);
1180 if (iw.intValue() < 12)
1182 throw new NumberFormatException();
1184 userIdWidth.setText(iw.toString());
1186 } catch (NumberFormatException x)
1188 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1190 .getString("warn.user_defined_width_requirements"),
1191 MessageManager.getString("label.invalid_id_column_width"),
1192 JvOptionPane.WARNING_MESSAGE);
1193 userIdWidth.setText("");
1198 protected void autoIdWidth_actionPerformed()
1200 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1201 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1205 * Returns true if chimera path is to a valid executable, else show an error
1208 private boolean validateChimeraPath()
1210 if (chimeraPath.getText().trim().length() > 0)
1212 File f = new File(chimeraPath.getText());
1213 if (!f.canExecute())
1215 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1216 MessageManager.getString("label.invalid_chimera_path"),
1217 MessageManager.getString("label.invalid_name"),
1218 JvOptionPane.ERROR_MESSAGE);
1226 * If Chimera is selected, check it can be found on default or user-specified
1227 * path, if not show a warning/help dialog.
1230 protected void structureViewer_actionPerformed(String selectedItem)
1232 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1236 boolean found = false;
1239 * Try user-specified and standard paths for Chimera executable.
1241 List<String> paths = StructureManager.getChimeraPaths();
1242 paths.add(0, chimeraPath.getText());
1243 for (String path : paths)
1245 if (new File(path.trim()).canExecute())
1253 String[] options = { "OK", "Help" };
1254 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1255 JvSwingUtils.wrapTooltip(true,
1256 MessageManager.getString("label.chimera_missing")),
1257 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1258 null, options, options[0]);
1259 if (showHelp == JvOptionPane.NO_OPTION)
1263 Help.showHelpWindow(HelpId.StructureViewer);
1264 } catch (HelpSetException e)
1266 e.printStackTrace();
1272 public class OptionsParam
1274 private String name;
1276 private String code;
1278 public OptionsParam(String name, String code)
1284 public String getName()
1289 public void setName(String name)
1294 public String getCode()
1299 public void setCode(String code)
1305 public String toString()
1311 public boolean equals(Object that)
1313 if (!(that instanceof OptionsParam))
1317 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1321 public int hashCode()
1323 return name.hashCode() + code.hashCode();
1327 private class UrlListSelectionHandler implements ListSelectionListener
1331 public void valueChanged(ListSelectionEvent e)
1333 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1335 int index = lsm.getMinSelectionIndex();
1338 // no selection, so disable delete/edit buttons
1339 editLink.setEnabled(false);
1340 deleteLink.setEnabled(false);
1343 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1345 // enable/disable edit and delete link buttons
1346 if (((UrlLinkTableModel) linkUrlTable.getModel())
1347 .isRowDeletable(modelIndex))
1349 deleteLink.setEnabled(true);
1353 deleteLink.setEnabled(false);
1356 if (((UrlLinkTableModel) linkUrlTable.getModel())
1357 .isRowEditable(modelIndex))
1359 editLink.setEnabled(true);
1363 editLink.setEnabled(false);