2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import java.awt.BorderLayout;
24 import java.awt.Color;
25 import java.awt.Component;
26 import java.awt.Dimension;
28 import java.awt.event.ActionEvent;
29 import java.awt.event.ActionListener;
30 import java.awt.event.MouseEvent;
32 import java.util.ArrayList;
33 import java.util.List;
35 import javax.help.HelpSetException;
36 import javax.swing.JColorChooser;
37 import javax.swing.JFileChooser;
38 import javax.swing.JInternalFrame;
39 import javax.swing.JPanel;
40 import javax.swing.ListSelectionModel;
41 import javax.swing.RowFilter;
42 import javax.swing.RowSorter;
43 import javax.swing.SortOrder;
44 import javax.swing.event.DocumentEvent;
45 import javax.swing.event.DocumentListener;
46 import javax.swing.event.ListSelectionEvent;
47 import javax.swing.event.ListSelectionListener;
48 import javax.swing.table.TableCellRenderer;
49 import javax.swing.table.TableColumn;
50 import javax.swing.table.TableModel;
51 import javax.swing.table.TableRowSorter;
53 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
54 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
55 import jalview.bin.Cache;
56 import jalview.gui.Help.HelpId;
57 import jalview.gui.StructureViewer.ViewerType;
58 import jalview.io.BackupFiles;
59 import jalview.io.BackupFilesPresetEntry;
60 import jalview.io.FileFormatI;
61 import jalview.io.JalviewFileChooser;
62 import jalview.io.JalviewFileView;
63 import jalview.jbgui.GPreferences;
64 import jalview.jbgui.GSequenceLink;
65 import jalview.schemes.ColourSchemeI;
66 import jalview.schemes.ColourSchemes;
67 import jalview.schemes.ResidueColourScheme;
68 import jalview.urls.UrlLinkTableModel;
69 import jalview.urls.api.UrlProviderFactoryI;
70 import jalview.urls.api.UrlProviderI;
71 import jalview.urls.desktop.DesktopUrlProviderFactory;
72 import jalview.util.MessageManager;
73 import jalview.util.Platform;
74 import jalview.util.UrlConstants;
75 import jalview.ws.sifts.SiftsSettings;
83 public class Preferences extends GPreferences
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;
125 private String previousProxyType;
128 * Holds name and link separated with | character. Sequence ID must be
129 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
131 public static UrlProviderI sequenceUrlLinks;
133 public static UrlLinkTableModel dataModel;
136 * Holds name and link separated with | character. Sequence IDS and Sequences
137 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
138 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
139 * for first and second token specified after a pipe character at end |,|.
140 * (TODO: proper escape for using | to separate ids or sequences
143 public static List<String> groupURLLinks;
146 // get links selected to be in the menu (SEQUENCE_LINKS)
147 // and links entered by the user but not selected (STORED_LINKS)
148 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
149 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
150 String defaultUrl = Cache.getDefault("DEFAULT_URL",
151 UrlConstants.DEFAULT_LABEL);
153 // if both links lists are empty, add the DEFAULT_URL link
154 // otherwise we assume the default link is in one of the lists
155 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
157 inMenuString = UrlConstants.DEFAULT_STRING;
159 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
160 inMenuString, notInMenuString);
161 sequenceUrlLinks = factory.createUrlProvider();
162 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
165 * TODO: reformulate groupURL encoding so two or more can be stored in the
166 * .properties file as '|' separated strings
169 groupURLLinks = new ArrayList<>();
172 JInternalFrame frame;
174 private WsPreferences wsPrefs;
176 private OptionsParam promptEachTimeOpt = new OptionsParam(
177 MessageManager.getString("label.prompt_each_time"),
180 private OptionsParam lineArtOpt = new OptionsParam(
181 MessageManager.getString("label.lineart"), "Lineart");
183 private OptionsParam textOpt = new OptionsParam(
184 MessageManager.getString("action.text"), "Text");
187 * Creates a new Preferences object.
194 public Preferences(int selectTab)
197 frame = new JInternalFrame();
198 frame.setContentPane(this);
199 wsPrefs = new WsPreferences();
200 wsTab.add(wsPrefs, BorderLayout.CENTER);
201 int width = 500, height = 450;
202 new jalview.util.Platform();
203 if (Platform.isAMac())
209 Desktop.addInternalFrame(frame,
210 MessageManager.getString("label.preferences"), width, height);
211 frame.setMinimumSize(new Dimension(width, height));
214 * Set Visual tab defaults
216 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
217 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
218 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
219 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
221 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
222 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
223 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
224 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
226 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
227 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
229 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
230 showGroupConservation.setSelected(
231 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
232 showConsensHistogram.setSelected(
233 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
235 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
237 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
239 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
241 String[] fonts = java.awt.GraphicsEnvironment
242 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
243 for (int i = 0; i < fonts.length; i++)
245 fontNameCB.addItem(fonts[i]);
248 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
250 fontSizeCB.addItem(i + "");
253 fontStyleCB.addItem("plain");
254 fontStyleCB.addItem("bold");
255 fontStyleCB.addItem("italic");
257 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
258 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
259 fontStyleCB.setSelectedItem(
260 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
262 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", true));
264 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
266 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
268 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
270 gapSymbolCB.addItem("-");
271 gapSymbolCB.addItem(".");
273 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
275 sortby.addItem("No sort");
276 sortby.addItem("Id");
277 sortby.addItem("Pairwise Identity");
278 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
280 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
282 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
284 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
285 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
286 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
287 SequenceAnnotationOrder.NONE.name()));
288 sortAnnBy.setSelectedItem(savedSort.toString());
290 sortAutocalc.addItem("Autocalculated first");
291 sortAutocalc.addItem("Autocalculated last");
292 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
293 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
294 : sortAutocalc.getItemAt(1));
296 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
297 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
298 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
299 + "/examples/exampleFile_2_3.jar"));
302 * Set Colours tab defaults
304 protColour.addItem(ResidueColourScheme.NONE);
305 nucColour.addItem(ResidueColourScheme.NONE);
306 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
308 String name = cs.getSchemeName();
309 protColour.addItem(name);
310 nucColour.addItem(name);
312 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
313 ResidueColourScheme.NONE);
314 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
315 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
316 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
317 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
318 minColour.setBackground(
319 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
320 maxColour.setBackground(
321 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
324 * Set overview panel defaults
326 gapColour.setBackground(Cache.getDefaultColour(GAP_COLOUR,
327 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
328 hiddenColour.setBackground(Cache.getDefaultColour(HIDDEN_COLOUR,
329 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
330 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
331 gapLabel.setEnabled(!useLegacyGap.isSelected());
332 gapColour.setEnabled(!useLegacyGap.isSelected());
334 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
337 * Set Structure tab defaults.
339 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
340 structFromPdb.setSelected(structSelected);
341 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
342 useRnaView.setEnabled(structSelected);
343 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
344 addSecondaryStructure.setEnabled(structSelected);
345 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
346 addTempFactor.setEnabled(structSelected);
347 structViewer.setSelectedItem(
348 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
349 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
350 chimeraPath.addActionListener(new ActionListener()
353 public void actionPerformed(ActionEvent e)
355 validateChimeraPath();
359 if (Cache.getDefault("MAP_WITH_SIFTS", false))
361 siftsMapping.setSelected(true);
365 nwMapping.setSelected(true);
369 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
372 * Set Connections tab defaults
376 linkUrlTable.setModel(dataModel);
377 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
378 linkUrlTable.getModel());
379 linkUrlTable.setRowSorter(sorter);
380 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
382 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
383 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
384 SortOrder.DESCENDING));
385 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
386 SortOrder.DESCENDING));
388 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
390 sorter.setSortKeys(sortKeys);
394 ActionListener onReset;
395 onReset = new ActionListener()
398 public void actionPerformed(ActionEvent e)
400 filterTB.setText("");
401 sorter.setRowFilter(RowFilter.regexFilter(""));
405 doReset.addActionListener(onReset);
407 // filter to display only custom urls
408 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
411 public boolean include(
412 Entry<? extends TableModel, ? extends Object> entry)
414 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
418 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
419 linkUrlTable.getModel());
420 customSorter.setRowFilter(customUrlFilter);
422 ActionListener onCustomOnly;
423 onCustomOnly = new ActionListener()
426 public void actionPerformed(ActionEvent e)
428 filterTB.setText("");
429 sorter.setRowFilter(customUrlFilter);
432 userOnly.addActionListener(onCustomOnly);
434 filterTB.getDocument().addDocumentListener(new DocumentListener()
436 String caseInsensitiveFlag = "(?i)";
439 public void changedUpdate(DocumentEvent e)
441 sorter.setRowFilter(RowFilter
442 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
446 public void removeUpdate(DocumentEvent e)
448 sorter.setRowFilter(RowFilter
449 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
453 public void insertUpdate(DocumentEvent e)
455 sorter.setRowFilter(RowFilter
456 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
460 // set up list selection functionality
461 linkUrlTable.getSelectionModel()
462 .addListSelectionListener(new UrlListSelectionHandler());
464 // set up radio buttons
465 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
467 String onClickName = linkUrlTable.getColumnName(onClickCol);
468 linkUrlTable.getColumn(onClickName)
469 .setCellRenderer(new RadioButtonRenderer());
470 linkUrlTable.getColumn(onClickName)
471 .setCellEditor(new RadioButtonEditor());
473 // get boolean columns and resize those to min possible
474 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
476 if (linkUrlTable.getModel().getColumnClass(column)
477 .equals(Boolean.class))
479 TableColumn tableColumn = linkUrlTable.getColumnModel()
481 int preferredWidth = tableColumn.getMinWidth();
483 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
485 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
486 int cwidth = c.getPreferredSize().width
487 + linkUrlTable.getIntercellSpacing().width;
488 preferredWidth = Math.max(preferredWidth, cwidth);
490 tableColumn.setPreferredWidth(preferredWidth);
494 String proxyTypeString = Cache.getDefault("USE_PROXY", "false");
495 previousProxyType = proxyTypeString;
496 switch (proxyTypeString)
498 case Cache.PROXYTYPE_NONE:
499 proxyType.setSelected(noProxy.getModel(), true);
501 case Cache.PROXYTYPE_SYSTEM:
502 proxyType.setSelected(systemProxy.getModel(), true);
504 case Cache.PROXYTYPE_CUSTOM:
505 proxyType.setSelected(customProxy.getModel(), true);
508 String message = "Incorrect PROXY_TYPE - should be 'none' (clear proxy properties), 'false' (system settings), 'true' (custom settings): "
510 Cache.log.warn(message);
512 proxyServerHttpTB.setText(Cache.getDefault("PROXY_SERVER", ""));
513 proxyPortHttpTB.setText(Cache.getDefault("PROXY_PORT", ""));
514 proxyServerHttpsTB.setText(Cache.getDefault("PROXY_SERVER_HTTPS", ""));
515 proxyPortHttpsTB.setText(Cache.getDefault("PROXY_PORT_HTTPS", ""));
516 proxyAuth.setSelected(Cache.getDefault("PROXY_AUTH", false));
518 .setText(Cache.getDefault("PROXY_AUTH_USERNAME", ""));
519 // we are not storing or retrieving proxy password from .jalview_properties
520 proxyAuthPasswordTB.setText(Cache.proxyAuthPassword == null ? ""
521 : Cache.proxyAuthPassword.toString());
522 setCustomProxyEnabled();
524 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
526 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
527 // note antisense here: default is true
529 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
530 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
533 * Set Output tab defaults
535 epsRendering.addItem(promptEachTimeOpt);
536 epsRendering.addItem(lineArtOpt);
537 epsRendering.addItem(textOpt);
538 String defaultEPS = Cache.getDefault("EPS_RENDERING",
540 if (defaultEPS.equalsIgnoreCase("Text"))
542 epsRendering.setSelectedItem(textOpt);
544 else if (defaultEPS.equalsIgnoreCase("Lineart"))
546 epsRendering.setSelectedItem(lineArtOpt);
550 epsRendering.setSelectedItem(promptEachTimeOpt);
552 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
553 userIdWidth.setEnabled(!autoIdWidth.isSelected());
554 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
555 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
556 userIdWidth.setText(wi == null ? "" : wi.toString());
557 // TODO: refactor to use common enum via FormatAdapter and allow extension
558 // for new flat file formats
559 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
560 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
561 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
562 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
563 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
564 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
565 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
566 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
568 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
571 * Set Editing tab defaults
573 autoCalculateConsCheck
574 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
575 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
576 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
578 annotations_actionPerformed(null); // update the display of the annotation
582 * Set Backups tab defaults
584 loadLastSavedBackupsOptions();
588 * Save user selections on the Preferences tabs to the Cache and write out to
594 public void ok_actionPerformed(ActionEvent e)
596 if (!validateSettings())
602 * Save Visual settings
604 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
605 Boolean.toString(seqLimit.isSelected()));
606 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
607 Boolean.toString(rightAlign.isSelected()));
608 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
609 Boolean.toString(fullScreen.isSelected()));
610 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
611 Boolean.toString(openoverv.isSelected()));
612 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
613 Boolean.toString(annotations.isSelected()));
614 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
615 Boolean.toString(conservation.isSelected()));
616 Cache.applicationProperties.setProperty("SHOW_QUALITY",
617 Boolean.toString(quality.isSelected()));
618 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
619 Boolean.toString(identity.isSelected()));
621 Cache.applicationProperties.setProperty("GAP_SYMBOL",
622 gapSymbolCB.getSelectedItem().toString());
624 Cache.applicationProperties.setProperty("FONT_NAME",
625 fontNameCB.getSelectedItem().toString());
626 Cache.applicationProperties.setProperty("FONT_STYLE",
627 fontStyleCB.getSelectedItem().toString());
628 Cache.applicationProperties.setProperty("FONT_SIZE",
629 fontSizeCB.getSelectedItem().toString());
631 Cache.applicationProperties.setProperty("ID_ITALICS",
632 Boolean.toString(idItalics.isSelected()));
633 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
634 Boolean.toString(showUnconserved.isSelected()));
635 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
636 Boolean.toString(showOccupancy.isSelected()));
637 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
638 Boolean.toString(showGroupConsensus.isSelected()));
639 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
640 Boolean.toString(showGroupConservation.isSelected()));
641 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
642 Boolean.toString(showConsensHistogram.isSelected()));
643 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
644 Boolean.toString(showConsensLogo.isSelected()));
645 Cache.applicationProperties.setProperty("ANTI_ALIAS",
646 Boolean.toString(smoothFont.isSelected()));
647 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
648 Boolean.toString(scaleProteinToCdna.isSelected()));
649 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
650 Boolean.toString(showNpTooltip.isSelected()));
651 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
652 Boolean.toString(showDbRefTooltip.isSelected()));
654 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
655 Boolean.toString(wrap.isSelected()));
657 Cache.applicationProperties.setProperty("STARTUP_FILE",
658 startupFileTextfield.getText());
659 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
660 Boolean.toString(startupCheckbox.isSelected()));
662 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
663 sortby.getSelectedItem().toString());
665 // convert description of sort order to enum name for save
666 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
667 .forDescription(sortAnnBy.getSelectedItem().toString());
668 if (annSortOrder != null)
670 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
671 annSortOrder.name());
674 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
675 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
676 Boolean.valueOf(showAutocalcFirst).toString());
679 * Save Colours settings
681 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
682 protColour.getSelectedItem().toString());
683 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
684 nucColour.getSelectedItem().toString());
685 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
686 minColour.getBackground());
687 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
688 maxColour.getBackground());
691 * Save Overview settings
693 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
694 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
695 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
696 Boolean.toString(useLegacyGap.isSelected()));
697 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
698 Boolean.toString(showHiddenAtStart.isSelected()));
701 * Save Structure settings
703 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
704 Boolean.toString(addTempFactor.isSelected()));
705 Cache.applicationProperties.setProperty(ADD_SS_ANN,
706 Boolean.toString(addSecondaryStructure.isSelected()));
707 Cache.applicationProperties.setProperty(USE_RNAVIEW,
708 Boolean.toString(useRnaView.isSelected()));
709 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
710 Boolean.toString(structFromPdb.isSelected()));
711 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
712 structViewer.getSelectedItem().toString());
713 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
714 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
715 Boolean.toString(siftsMapping.isSelected()));
716 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
719 * Save Output settings
721 Cache.applicationProperties.setProperty("EPS_RENDERING",
722 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
725 * Save Connections settings
727 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
729 jalview.util.BrowserLauncher.resetBrowser();
731 // save user-defined and selected links
732 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
733 if (menuLinks.isEmpty())
735 Cache.applicationProperties.remove("SEQUENCE_LINKS");
739 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
740 menuLinks.toString());
743 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
744 if (nonMenuLinks.isEmpty())
746 Cache.applicationProperties.remove("STORED_LINKS");
750 Cache.applicationProperties.setProperty("STORED_LINKS",
751 nonMenuLinks.toString());
754 Cache.applicationProperties.setProperty("DEFAULT_URL",
755 sequenceUrlLinks.getPrimaryUrlId());
760 Cache.setProperty("VERSION_CHECK",
761 Boolean.toString(versioncheck.isSelected()));
762 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
764 // default is false - we only set this if the user has actively agreed
765 Cache.setProperty("USAGESTATS",
766 Boolean.toString(usagestats.isSelected()));
768 if (!questionnaire.isSelected())
770 Cache.setProperty("NOQUESTIONNAIRES", "true");
774 // special - made easy to edit a property file to disable questionnaires
775 // by just adding the given line
776 Cache.removeProperty("NOQUESTIONNAIRES");
780 * Save Output settings
782 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
783 Boolean.toString(blcjv.isSelected()));
784 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
785 Boolean.toString(clustaljv.isSelected()));
786 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
787 Boolean.toString(fastajv.isSelected()));
788 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
789 Boolean.toString(msfjv.isSelected()));
790 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
791 Boolean.toString(pfamjv.isSelected()));
792 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
793 Boolean.toString(pileupjv.isSelected()));
794 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
795 Boolean.toString(pirjv.isSelected()));
796 Cache.applicationProperties.setProperty("PIR_MODELLER",
797 Boolean.toString(modellerOutput.isSelected()));
798 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
799 Boolean.toString(embbedBioJSON.isSelected()));
800 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
802 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
803 Boolean.toString(autoIdWidth.isSelected()));
804 userIdWidth_actionPerformed();
805 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
806 userIdWidth.getText());
809 * Save Editing settings
811 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
812 Boolean.toString(autoCalculateConsCheck.isSelected()));
813 Cache.applicationProperties.setProperty("SORT_BY_TREE",
814 Boolean.toString(sortByTree.isSelected()));
815 Cache.applicationProperties.setProperty("PAD_GAPS",
816 Boolean.toString(padGaps.isSelected()));
818 wsPrefs.updateAndRefreshWsMenuConfig(false);
821 * Save Backups settings
823 Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
824 Boolean.toString(enableBackupFiles.isSelected()));
825 int preset = getComboIntStringKey(backupfilesPresetsCombo);
826 Cache.applicationProperties.setProperty(BackupFiles.NS + "_PRESET",
827 Integer.toString(preset));
829 if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
831 BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
832 BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
833 BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
834 Cache.applicationProperties.setProperty(
835 BackupFilesPresetEntry.CUSTOMCONFIG, customBFPE.toString());
838 BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
840 Cache.applicationProperties.setProperty(
841 BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
843 Cache.saveProperties();
844 Desktop.instance.doConfigureStructurePrefs();
847 frame.setClosed(true);
848 } catch (Exception ex)
853 public void setProxyFromSettings()
855 String proxyType = Cache.getDefault("USE_PROXY",
856 Cache.PROXYTYPE_SYSTEM);
857 if (proxyType.equals(Cache.PROXYTYPE_NONE))
859 if (!previousProxyType.equals(proxyType))
860 Cache.log.info("Setting no proxy settings");
861 Cache.setProxyProperties(null, null, null, null, null, null, null,
864 else if (proxyType.equals(Cache.PROXYTYPE_CUSTOM))
866 if (!previousProxyType.equals(proxyType))
867 Cache.log.info("Setting custom proxy settings");
868 boolean proxyAuthSet = Cache.getDefault("PROXY_AUTH", false);
869 Cache.setProxyProperties(Cache.getDefault("PROXY_SERVER", null),
870 Cache.getDefault("PROXY_PORT", null),
871 Cache.getDefault("PROXY_SERVER_HTTPS", null),
872 Cache.getDefault("PROXY_PORT_HTTPS", null),
873 proxyAuthSet ? Cache.getDefault("PROXY_AUTH_USERNAME", "")
875 proxyAuthSet ? Cache.proxyAuthPassword : null,
876 proxyAuthSet ? Cache.getDefault("PROXY_AUTH_USERNAME", "")
878 proxyAuthSet ? Cache.proxyAuthPassword : null, "localhost");
880 else // systemProxy should be selected and is sensible default anyway
882 if (!previousProxyType.equals(proxyType))
883 Cache.log.info("Setting system proxy settings");
884 Cache.resetProxyProperties();
888 public void saveProxySettings()
890 Cache.applicationProperties.setProperty("USE_PROXY",
891 customProxy.isSelected() ? Cache.PROXYTYPE_CUSTOM
892 : noProxy.isSelected() ? Cache.PROXYTYPE_NONE
893 : Cache.PROXYTYPE_SYSTEM);
894 Cache.setOrRemove("PROXY_SERVER", proxyServerHttpTB.getText());
895 Cache.setOrRemove("PROXY_PORT", proxyPortHttpTB.getText());
896 Cache.setOrRemove("PROXY_SERVER_HTTPS", proxyServerHttpsTB.getText());
897 Cache.setOrRemove("PROXY_PORT_HTTPS", proxyPortHttpsTB.getText());
898 Cache.setOrRemove("PROXY_AUTH",
899 Boolean.toString(proxyAuth.isSelected()));
900 Cache.setOrRemove("PROXY_AUTH_USERNAME", proxyAuthUsernameTB.getText());
901 Cache.proxyAuthPassword = proxyAuthPasswordTB.getPassword();
902 setProxyFromSettings();
906 * Do any necessary validation before saving settings. Return focus to the
907 * first tab which fails validation.
911 private boolean validateSettings()
913 if (!validateStructure())
915 structureTab.requestFocusInWindow();
922 protected boolean validateStructure()
924 return validateChimeraPath();
932 public void startupFileTextfield_mouseClicked()
934 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
935 JalviewFileChooser chooser = JalviewFileChooser
936 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
937 chooser.setFileView(new JalviewFileView());
938 chooser.setDialogTitle(
939 MessageManager.getString("label.select_startup_file"));
941 int value = chooser.showOpenDialog(this);
943 if (value == JalviewFileChooser.APPROVE_OPTION)
945 FileFormatI format = chooser.getSelectedFormat();
948 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
952 .setText(chooser.getSelectedFile().getAbsolutePath());
963 public void cancel_actionPerformed(ActionEvent e)
967 wsPrefs.updateWsMenuConfig(true);
968 wsPrefs.refreshWs_actionPerformed(e);
969 frame.setClosed(true);
970 } catch (Exception ex)
982 public void annotations_actionPerformed(ActionEvent e)
984 conservation.setEnabled(annotations.isSelected());
985 quality.setEnabled(annotations.isSelected());
986 identity.setEnabled(annotations.isSelected());
987 showOccupancy.setEnabled(annotations.isSelected());
988 showGroupConsensus.setEnabled(annotations.isSelected());
989 showGroupConservation.setEnabled(annotations.isSelected());
990 showConsensHistogram.setEnabled(annotations.isSelected()
991 && (identity.isSelected() || showGroupConsensus.isSelected()));
992 showConsensLogo.setEnabled(annotations.isSelected()
993 && (identity.isSelected() || showGroupConsensus.isSelected()));
997 public void newLink_actionPerformed(ActionEvent e)
999 GSequenceLink link = new GSequenceLink();
1000 boolean valid = false;
1003 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1004 MessageManager.getString("label.new_sequence_url_link"),
1005 JvOptionPane.OK_CANCEL_OPTION, -1,
1006 null) == JvOptionPane.OK_OPTION)
1008 if (link.checkValid())
1010 if (((UrlLinkTableModel) linkUrlTable.getModel())
1011 .isUniqueName(link.getName()))
1013 ((UrlLinkTableModel) linkUrlTable.getModel())
1014 .insertRow(link.getName(), link.getURL());
1019 link.notifyDuplicate();
1032 public void editLink_actionPerformed(ActionEvent e)
1034 GSequenceLink link = new GSequenceLink();
1036 int index = linkUrlTable.getSelectedRow();
1039 // button no longer enabled if row is not selected
1040 Cache.log.debug("Edit with no row selected in linkUrlTable");
1044 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1046 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1048 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1049 link.setName(oldName);
1050 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1052 boolean valid = false;
1055 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1056 MessageManager.getString("label.edit_sequence_url_link"),
1057 JvOptionPane.OK_CANCEL_OPTION, -1,
1058 null) == JvOptionPane.OK_OPTION)
1060 if (link.checkValid())
1062 if ((oldName.equals(link.getName()))
1063 || (((UrlLinkTableModel) linkUrlTable.getModel())
1064 .isUniqueName(link.getName())))
1066 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1067 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1072 link.notifyDuplicate();
1085 public void deleteLink_actionPerformed(ActionEvent e)
1087 int index = linkUrlTable.getSelectedRow();
1088 int modelIndex = -1;
1091 // button no longer enabled if row is not selected
1092 Cache.log.debug("Delete with no row selected in linkUrlTable");
1097 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1100 // make sure we use the model index to delete, and not the table index
1101 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1105 public void defaultBrowser_mouseClicked(MouseEvent e)
1107 JFileChooser chooser = new JFileChooser(".");
1108 chooser.setDialogTitle(
1109 MessageManager.getString("label.select_default_browser"));
1111 int value = chooser.showOpenDialog(this);
1113 if (value == JFileChooser.APPROVE_OPTION)
1115 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1124 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1128 protected void showunconserved_actionPerformed(ActionEvent e)
1130 // TODO Auto-generated method stub
1131 super.showunconserved_actionPerformed(e);
1134 public static List<String> getGroupURLLinks()
1136 return groupURLLinks;
1140 public void minColour_actionPerformed(JPanel panel)
1142 Color col = JColorChooser.showDialog(this,
1143 MessageManager.getString("label.select_colour_minimum_value"),
1144 minColour.getBackground());
1147 panel.setBackground(col);
1153 public void maxColour_actionPerformed(JPanel panel)
1155 Color col = JColorChooser.showDialog(this,
1156 MessageManager.getString("label.select_colour_maximum_value"),
1157 maxColour.getBackground());
1160 panel.setBackground(col);
1166 public void gapColour_actionPerformed(JPanel gap)
1168 if (!useLegacyGap.isSelected())
1170 Color col = JColorChooser.showDialog(this,
1171 MessageManager.getString("label.select_gap_colour"),
1172 gapColour.getBackground());
1175 gap.setBackground(col);
1182 public void hiddenColour_actionPerformed(JPanel hidden)
1184 Color col = JColorChooser.showDialog(this,
1185 MessageManager.getString("label.select_hidden_colour"),
1186 hiddenColour.getBackground());
1189 hidden.setBackground(col);
1195 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1197 boolean enabled = useLegacyGap.isSelected();
1200 gapColour.setBackground(
1201 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1205 gapColour.setBackground(
1206 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1208 gapColour.setEnabled(!enabled);
1209 gapLabel.setEnabled(!enabled);
1213 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1215 useLegacyGap.setSelected(false);
1216 useLegacyGaps_actionPerformed(null);
1217 showHiddenAtStart.setSelected(false);
1218 hiddenColour.setBackground(
1219 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1223 protected void userIdWidth_actionPerformed()
1227 String val = userIdWidth.getText().trim();
1228 if (val.length() > 0)
1230 Integer iw = Integer.parseInt(val);
1231 if (iw.intValue() < 12)
1233 throw new NumberFormatException();
1235 userIdWidth.setText(iw.toString());
1237 } catch (NumberFormatException x)
1239 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1241 .getString("warn.user_defined_width_requirements"),
1242 MessageManager.getString("label.invalid_id_column_width"),
1243 JvOptionPane.WARNING_MESSAGE);
1244 userIdWidth.setText("");
1249 protected void autoIdWidth_actionPerformed()
1251 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1252 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1256 * Returns true if chimera path is to a valid executable, else show an error
1259 private boolean validateChimeraPath()
1261 if (chimeraPath.getText().trim().length() > 0)
1263 File f = new File(chimeraPath.getText());
1264 if (!f.canExecute())
1266 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1267 MessageManager.getString("label.invalid_chimera_path"),
1268 MessageManager.getString("label.invalid_name"),
1269 JvOptionPane.ERROR_MESSAGE);
1277 * If Chimera is selected, check it can be found on default or user-specified
1278 * path, if not show a warning/help dialog.
1281 protected void structureViewer_actionPerformed(String selectedItem)
1283 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1287 boolean found = false;
1290 * Try user-specified and standard paths for Chimera executable.
1292 List<String> paths = StructureManager.getChimeraPaths();
1293 paths.add(0, chimeraPath.getText());
1294 for (String path : paths)
1296 if (new File(path.trim()).canExecute())
1304 String[] options = { "OK", "Help" };
1305 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1306 JvSwingUtils.wrapTooltip(true,
1307 MessageManager.getString("label.chimera_missing")),
1308 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1309 null, options, options[0]);
1310 if (showHelp == JvOptionPane.NO_OPTION)
1314 Help.showHelpWindow(HelpId.StructureViewer);
1315 } catch (HelpSetException e)
1317 e.printStackTrace();
1323 public class OptionsParam
1325 private String name;
1327 private String code;
1329 public OptionsParam(String name, String code)
1335 public String getName()
1340 public void setName(String name)
1345 public String getCode()
1350 public void setCode(String code)
1356 public String toString()
1362 public boolean equals(Object that)
1364 if (!(that instanceof OptionsParam))
1368 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1372 public int hashCode()
1374 return name.hashCode() + code.hashCode();
1378 private class UrlListSelectionHandler implements ListSelectionListener
1382 public void valueChanged(ListSelectionEvent e)
1384 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1386 int index = lsm.getMinSelectionIndex();
1389 // no selection, so disable delete/edit buttons
1390 editLink.setEnabled(false);
1391 deleteLink.setEnabled(false);
1394 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1396 // enable/disable edit and delete link buttons
1397 if (((UrlLinkTableModel) linkUrlTable.getModel())
1398 .isRowDeletable(modelIndex))
1400 deleteLink.setEnabled(true);
1404 deleteLink.setEnabled(false);
1407 if (((UrlLinkTableModel) linkUrlTable.getModel())
1408 .isRowEditable(modelIndex))
1410 editLink.setEnabled(true);
1414 editLink.setEnabled(false);