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.FileFormatI;
28 import jalview.io.JalviewFileChooser;
29 import jalview.io.JalviewFileView;
30 import jalview.jbgui.GPreferences;
31 import jalview.jbgui.GSequenceLink;
32 import jalview.schemes.ColourSchemeI;
33 import jalview.schemes.ColourSchemes;
34 import jalview.schemes.ResidueColourScheme;
35 import jalview.urls.UrlLinkTableModel;
36 import jalview.urls.api.UrlProviderFactoryI;
37 import jalview.urls.api.UrlProviderI;
38 import jalview.urls.desktop.DesktopUrlProviderFactory;
39 import jalview.util.MessageManager;
40 import jalview.util.Platform;
41 import jalview.util.UrlConstants;
42 import jalview.ws.sifts.SiftsSettings;
44 import java.awt.BorderLayout;
45 import java.awt.Color;
46 import java.awt.Component;
47 import java.awt.Dimension;
49 import java.awt.event.ActionEvent;
50 import java.awt.event.ActionListener;
51 import java.awt.event.MouseEvent;
53 import java.util.ArrayList;
54 import java.util.List;
56 import javax.help.HelpSetException;
57 import javax.swing.JColorChooser;
58 import javax.swing.JFileChooser;
59 import javax.swing.JInternalFrame;
60 import javax.swing.JPanel;
61 import javax.swing.ListSelectionModel;
62 import javax.swing.RowFilter;
63 import javax.swing.RowSorter;
64 import javax.swing.SortOrder;
65 import javax.swing.event.DocumentEvent;
66 import javax.swing.event.DocumentListener;
67 import javax.swing.event.ListSelectionEvent;
68 import javax.swing.event.ListSelectionListener;
69 import javax.swing.table.TableCellRenderer;
70 import javax.swing.table.TableColumn;
71 import javax.swing.table.TableModel;
72 import javax.swing.table.TableRowSorter;
74 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
82 public class Preferences extends GPreferences
84 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
86 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
88 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
90 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
92 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
94 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
96 public static final String ADD_SS_ANN = "ADD_SS_ANN";
98 public static final String USE_RNAVIEW = "USE_RNAVIEW";
100 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
102 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
104 public static final String CHIMERA_PATH = "CHIMERA_PATH";
106 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
108 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
110 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
112 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
114 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
116 public static final String GAP_COLOUR = "GAP_COLOUR";
118 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
120 private static final int MIN_FONT_SIZE = 1;
122 private static final int MAX_FONT_SIZE = 30;
125 * Holds name and link separated with | character. Sequence ID must be
126 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
128 public static UrlProviderI sequenceUrlLinks;
130 public static UrlLinkTableModel dataModel;
133 * Holds name and link separated with | character. Sequence IDS and Sequences
134 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
135 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
136 * for first and second token specified after a pipe character at end |,|.
137 * (TODO: proper escape for using | to separate ids or sequences
140 public static List<String> groupURLLinks;
143 // get links selected to be in the menu (SEQUENCE_LINKS)
144 // and links entered by the user but not selected (STORED_LINKS)
145 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
146 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
147 String defaultUrl = Cache.getDefault("DEFAULT_URL",
148 UrlConstants.DEFAULT_LABEL);
150 // if both links lists are empty, add the DEFAULT_URL link
151 // otherwise we assume the default link is in one of the lists
152 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
154 inMenuString = UrlConstants.DEFAULT_STRING;
156 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
157 inMenuString, notInMenuString);
158 sequenceUrlLinks = factory.createUrlProvider();
159 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
162 * TODO: reformulate groupURL encoding so two or more can be stored in the
163 * .properties file as '|' separated strings
166 groupURLLinks = new ArrayList<>();
169 JInternalFrame frame;
171 private WsPreferences wsPrefs;
173 private OptionsParam promptEachTimeOpt = new OptionsParam(
174 MessageManager.getString("label.prompt_each_time"),
177 private OptionsParam lineArtOpt = new OptionsParam(
178 MessageManager.getString("label.lineart"), "Lineart");
180 private OptionsParam textOpt = new OptionsParam(
181 MessageManager.getString("action.text"), "Text");
184 * Creates a new Preferences object.
189 frame = new JInternalFrame();
190 frame.setContentPane(this);
191 wsPrefs = new WsPreferences();
192 wsTab.add(wsPrefs, BorderLayout.CENTER);
193 int width = 500, height = 450;
194 new jalview.util.Platform();
195 if (Platform.isAMac())
201 Desktop.addInternalFrame(frame,
202 MessageManager.getString("label.preferences"), width, height);
203 frame.setMinimumSize(new Dimension(width, height));
206 * Set Visual tab defaults
208 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
209 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
210 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
211 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
213 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
214 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
215 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
216 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
218 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
219 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
221 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
222 showGroupConservation.setSelected(
223 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
224 showConsensHistogram.setSelected(
225 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
227 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
229 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
231 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
233 String[] fonts = java.awt.GraphicsEnvironment
234 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
235 for (int i = 0; i < fonts.length; i++)
237 fontNameCB.addItem(fonts[i]);
240 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
242 fontSizeCB.addItem(i + "");
245 fontStyleCB.addItem("plain");
246 fontStyleCB.addItem("bold");
247 fontStyleCB.addItem("italic");
249 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
250 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
251 fontStyleCB.setSelectedItem(
252 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
254 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
256 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
258 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
260 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
262 gapSymbolCB.addItem("-");
263 gapSymbolCB.addItem(".");
265 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
267 sortby.addItem("No sort");
268 sortby.addItem("Id");
269 sortby.addItem("Pairwise Identity");
270 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
272 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
274 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
276 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
277 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
278 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
279 SequenceAnnotationOrder.NONE.name()));
280 sortAnnBy.setSelectedItem(savedSort.toString());
282 sortAutocalc.addItem("Autocalculated first");
283 sortAutocalc.addItem("Autocalculated last");
284 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
285 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
286 : sortAutocalc.getItemAt(1));
288 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
289 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
290 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
291 + "/examples/exampleFile_2_3.jar"));
294 * Set Colours tab defaults
296 protColour.addItem(ResidueColourScheme.NONE);
297 nucColour.addItem(ResidueColourScheme.NONE);
298 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
300 String name = cs.getSchemeName();
301 protColour.addItem(name);
302 nucColour.addItem(name);
304 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
305 ResidueColourScheme.NONE);
306 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
307 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
308 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
309 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
310 minColour.setBackground(
311 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
312 maxColour.setBackground(
313 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
316 * Set overview panel defaults
318 gapColour.setBackground(
319 Cache.getDefaultColour(GAP_COLOUR,
320 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
321 hiddenColour.setBackground(
322 Cache.getDefaultColour(HIDDEN_COLOUR,
323 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
324 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
325 gapLabel.setEnabled(!useLegacyGap.isSelected());
326 gapColour.setEnabled(!useLegacyGap.isSelected());
328 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, true));
331 * Set Structure tab defaults.
333 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
334 structFromPdb.setSelected(structSelected);
335 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
336 useRnaView.setEnabled(structSelected);
337 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
338 addSecondaryStructure.setEnabled(structSelected);
339 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
340 addTempFactor.setEnabled(structSelected);
341 structViewer.setSelectedItem(
342 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
343 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
344 chimeraPath.addActionListener(new ActionListener()
347 public void actionPerformed(ActionEvent e)
349 validateChimeraPath();
353 if (Cache.getDefault("MAP_WITH_SIFTS", false))
355 siftsMapping.setSelected(true);
359 nwMapping.setSelected(true);
363 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
366 * Set Connections tab defaults
370 linkUrlTable.setModel(dataModel);
371 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
372 linkUrlTable.getModel());
373 linkUrlTable.setRowSorter(sorter);
374 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
376 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
377 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
378 SortOrder.DESCENDING));
379 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
380 SortOrder.DESCENDING));
382 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
384 sorter.setSortKeys(sortKeys);
388 ActionListener onReset;
389 onReset = new ActionListener()
392 public void actionPerformed(ActionEvent e)
394 filterTB.setText("");
395 sorter.setRowFilter(RowFilter.regexFilter(""));
399 doReset.addActionListener(onReset);
401 // filter to display only custom urls
402 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
405 public boolean include(
406 Entry<? extends TableModel, ? extends Object> entry)
408 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
412 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
413 linkUrlTable.getModel());
414 customSorter.setRowFilter(customUrlFilter);
416 ActionListener onCustomOnly;
417 onCustomOnly = new ActionListener()
420 public void actionPerformed(ActionEvent e)
422 filterTB.setText("");
423 sorter.setRowFilter(customUrlFilter);
426 userOnly.addActionListener(onCustomOnly);
428 filterTB.getDocument().addDocumentListener(new DocumentListener()
430 String caseInsensitiveFlag = "(?i)";
433 public void changedUpdate(DocumentEvent e)
435 sorter.setRowFilter(RowFilter
436 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
440 public void removeUpdate(DocumentEvent e)
442 sorter.setRowFilter(RowFilter
443 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
447 public void insertUpdate(DocumentEvent e)
449 sorter.setRowFilter(RowFilter
450 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
454 // set up list selection functionality
455 linkUrlTable.getSelectionModel()
456 .addListSelectionListener(new UrlListSelectionHandler());
458 // set up radio buttons
459 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
461 String onClickName = linkUrlTable.getColumnName(onClickCol);
462 linkUrlTable.getColumn(onClickName)
463 .setCellRenderer(new RadioButtonRenderer());
464 linkUrlTable.getColumn(onClickName)
465 .setCellEditor(new RadioButtonEditor());
467 // get boolean columns and resize those to min possible
468 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
470 if (linkUrlTable.getModel().getColumnClass(column)
471 .equals(Boolean.class))
473 TableColumn tableColumn = linkUrlTable.getColumnModel()
475 int preferredWidth = tableColumn.getMinWidth();
477 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
479 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
480 int cwidth = c.getPreferredSize().width
481 + linkUrlTable.getIntercellSpacing().width;
482 preferredWidth = Math.max(preferredWidth, cwidth);
484 tableColumn.setPreferredWidth(preferredWidth);
488 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
489 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
490 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
491 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
493 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
495 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
496 // note antisense here: default is true
498 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
499 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
502 * Set Output tab defaults
504 epsRendering.addItem(promptEachTimeOpt);
505 epsRendering.addItem(lineArtOpt);
506 epsRendering.addItem(textOpt);
507 String defaultEPS = Cache.getDefault("EPS_RENDERING",
509 if (defaultEPS.equalsIgnoreCase("Text"))
511 epsRendering.setSelectedItem(textOpt);
513 else if (defaultEPS.equalsIgnoreCase("Lineart"))
515 epsRendering.setSelectedItem(lineArtOpt);
519 epsRendering.setSelectedItem(promptEachTimeOpt);
521 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
522 userIdWidth.setEnabled(!autoIdWidth.isSelected());
523 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
524 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
525 userIdWidth.setText(wi == null ? "" : wi.toString());
526 // TODO: refactor to use common enum via FormatAdapter and allow extension
527 // for new flat file formats
528 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
529 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
530 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
531 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
532 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
533 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
534 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
535 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
537 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
540 * Set Editing tab defaults
542 autoCalculateConsCheck
543 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
544 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
545 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
547 annotations_actionPerformed(null); // update the display of the annotation
552 * Save user selections on the Preferences tabs to the Cache and write out to
558 public void ok_actionPerformed(ActionEvent e)
560 if (!validateSettings())
566 * Save Visual settings
568 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
569 Boolean.toString(seqLimit.isSelected()));
570 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
571 Boolean.toString(rightAlign.isSelected()));
572 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
573 Boolean.toString(fullScreen.isSelected()));
574 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
575 Boolean.toString(openoverv.isSelected()));
576 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
577 Boolean.toString(annotations.isSelected()));
578 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
579 Boolean.toString(conservation.isSelected()));
580 Cache.applicationProperties.setProperty("SHOW_QUALITY",
581 Boolean.toString(quality.isSelected()));
582 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
583 Boolean.toString(identity.isSelected()));
585 Cache.applicationProperties.setProperty("GAP_SYMBOL",
586 gapSymbolCB.getSelectedItem().toString());
588 Cache.applicationProperties.setProperty("FONT_NAME",
589 fontNameCB.getSelectedItem().toString());
590 Cache.applicationProperties.setProperty("FONT_STYLE",
591 fontStyleCB.getSelectedItem().toString());
592 Cache.applicationProperties.setProperty("FONT_SIZE",
593 fontSizeCB.getSelectedItem().toString());
595 Cache.applicationProperties.setProperty("ID_ITALICS",
596 Boolean.toString(idItalics.isSelected()));
597 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
598 Boolean.toString(showUnconserved.isSelected()));
599 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
600 Boolean.toString(showOccupancy.isSelected()));
601 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
602 Boolean.toString(showGroupConsensus.isSelected()));
603 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
604 Boolean.toString(showGroupConservation.isSelected()));
605 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
606 Boolean.toString(showConsensHistogram.isSelected()));
607 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
608 Boolean.toString(showConsensLogo.isSelected()));
609 Cache.applicationProperties.setProperty("ANTI_ALIAS",
610 Boolean.toString(smoothFont.isSelected()));
611 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
612 Boolean.toString(scaleProteinToCdna.isSelected()));
613 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
614 Boolean.toString(showNpTooltip.isSelected()));
615 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
616 Boolean.toString(showDbRefTooltip.isSelected()));
618 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
619 Boolean.toString(wrap.isSelected()));
621 Cache.applicationProperties.setProperty("STARTUP_FILE",
622 startupFileTextfield.getText());
623 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
624 Boolean.toString(startupCheckbox.isSelected()));
626 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
627 sortby.getSelectedItem().toString());
629 // convert description of sort order to enum name for save
630 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
631 .forDescription(sortAnnBy.getSelectedItem().toString());
632 if (annSortOrder != null)
634 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
635 annSortOrder.name());
638 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
639 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
640 Boolean.valueOf(showAutocalcFirst).toString());
643 * Save Colours settings
645 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
646 protColour.getSelectedItem().toString());
647 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
648 nucColour.getSelectedItem().toString());
649 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
650 minColour.getBackground());
651 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
652 maxColour.getBackground());
655 * Save Overview settings
657 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
658 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
659 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
660 Boolean.toString(useLegacyGap.isSelected()));
661 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
662 Boolean.toString(showHiddenAtStart.isSelected()));
665 * Save Structure settings
667 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
668 Boolean.toString(addTempFactor.isSelected()));
669 Cache.applicationProperties.setProperty(ADD_SS_ANN,
670 Boolean.toString(addSecondaryStructure.isSelected()));
671 Cache.applicationProperties.setProperty(USE_RNAVIEW,
672 Boolean.toString(useRnaView.isSelected()));
673 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
674 Boolean.toString(structFromPdb.isSelected()));
675 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
676 structViewer.getSelectedItem().toString());
677 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
678 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
679 Boolean.toString(siftsMapping.isSelected()));
680 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
683 * Save Output settings
685 Cache.applicationProperties.setProperty("EPS_RENDERING",
686 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
689 * Save Connections settings
691 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
693 jalview.util.BrowserLauncher.resetBrowser();
695 // save user-defined and selected links
696 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
697 if (menuLinks.isEmpty())
699 Cache.applicationProperties.remove("SEQUENCE_LINKS");
703 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
704 menuLinks.toString());
707 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
708 if (nonMenuLinks.isEmpty())
710 Cache.applicationProperties.remove("STORED_LINKS");
714 Cache.applicationProperties.setProperty("STORED_LINKS",
715 nonMenuLinks.toString());
718 Cache.applicationProperties.setProperty("DEFAULT_URL",
719 sequenceUrlLinks.getPrimaryUrlId());
721 Cache.applicationProperties.setProperty("USE_PROXY",
722 Boolean.toString(useProxy.isSelected()));
724 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
726 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
728 if (useProxy.isSelected())
730 System.setProperty("http.proxyHost", proxyServerTB.getText());
731 System.setProperty("http.proxyPort", proxyPortTB.getText());
735 System.setProperty("http.proxyHost", "");
736 System.setProperty("http.proxyPort", "");
738 Cache.setProperty("VERSION_CHECK",
739 Boolean.toString(versioncheck.isSelected()));
740 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
742 // default is false - we only set this if the user has actively agreed
743 Cache.setProperty("USAGESTATS",
744 Boolean.toString(usagestats.isSelected()));
746 if (!questionnaire.isSelected())
748 Cache.setProperty("NOQUESTIONNAIRES", "true");
752 // special - made easy to edit a property file to disable questionnaires
753 // by just adding the given line
754 Cache.removeProperty("NOQUESTIONNAIRES");
758 * Save Output settings
760 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
761 Boolean.toString(blcjv.isSelected()));
762 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
763 Boolean.toString(clustaljv.isSelected()));
764 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
765 Boolean.toString(fastajv.isSelected()));
766 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
767 Boolean.toString(msfjv.isSelected()));
768 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
769 Boolean.toString(pfamjv.isSelected()));
770 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
771 Boolean.toString(pileupjv.isSelected()));
772 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
773 Boolean.toString(pirjv.isSelected()));
774 Cache.applicationProperties.setProperty("PIR_MODELLER",
775 Boolean.toString(modellerOutput.isSelected()));
776 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
777 Boolean.toString(embbedBioJSON.isSelected()));
778 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
780 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
781 Boolean.toString(autoIdWidth.isSelected()));
782 userIdWidth_actionPerformed();
783 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
784 userIdWidth.getText());
787 * Save Editing settings
789 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
790 Boolean.toString(autoCalculateConsCheck.isSelected()));
791 Cache.applicationProperties.setProperty("SORT_BY_TREE",
792 Boolean.toString(sortByTree.isSelected()));
793 Cache.applicationProperties.setProperty("PAD_GAPS",
794 Boolean.toString(padGaps.isSelected()));
796 wsPrefs.updateAndRefreshWsMenuConfig(false);
797 Cache.saveProperties();
798 Desktop.instance.doConfigureStructurePrefs();
801 frame.setClosed(true);
802 } catch (Exception ex)
808 * Do any necessary validation before saving settings. Return focus to the
809 * first tab which fails validation.
813 private boolean validateSettings()
815 if (!validateStructure())
817 structureTab.requestFocusInWindow();
824 protected boolean validateStructure()
826 return validateChimeraPath();
834 public void startupFileTextfield_mouseClicked()
836 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
837 JalviewFileChooser chooser = JalviewFileChooser
838 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
839 chooser.setFileView(new JalviewFileView());
840 chooser.setDialogTitle(
841 MessageManager.getString("label.select_startup_file"));
843 int value = chooser.showOpenDialog(this);
845 if (value == JalviewFileChooser.APPROVE_OPTION)
847 FileFormatI format = chooser.getSelectedFormat();
850 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
854 .setText(chooser.getSelectedFile().getAbsolutePath());
865 public void cancel_actionPerformed(ActionEvent e)
869 wsPrefs.updateWsMenuConfig(true);
870 wsPrefs.refreshWs_actionPerformed(e);
871 frame.setClosed(true);
872 } catch (Exception ex)
884 public void annotations_actionPerformed(ActionEvent e)
886 conservation.setEnabled(annotations.isSelected());
887 quality.setEnabled(annotations.isSelected());
888 identity.setEnabled(annotations.isSelected());
889 showOccupancy.setEnabled(annotations.isSelected());
890 showGroupConsensus.setEnabled(annotations.isSelected());
891 showGroupConservation.setEnabled(annotations.isSelected());
892 showConsensHistogram.setEnabled(annotations.isSelected()
893 && (identity.isSelected() || showGroupConsensus.isSelected()));
894 showConsensLogo.setEnabled(annotations.isSelected()
895 && (identity.isSelected() || showGroupConsensus.isSelected()));
899 public void newLink_actionPerformed(ActionEvent e)
901 GSequenceLink link = new GSequenceLink();
902 boolean valid = false;
905 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
906 MessageManager.getString("label.new_sequence_url_link"),
907 JvOptionPane.OK_CANCEL_OPTION, -1,
908 null) == JvOptionPane.OK_OPTION)
910 if (link.checkValid())
912 if (((UrlLinkTableModel) linkUrlTable.getModel())
913 .isUniqueName(link.getName()))
915 ((UrlLinkTableModel) linkUrlTable.getModel())
916 .insertRow(link.getName(), link.getURL());
921 link.notifyDuplicate();
934 public void editLink_actionPerformed(ActionEvent e)
936 GSequenceLink link = new GSequenceLink();
938 int index = linkUrlTable.getSelectedRow();
941 // button no longer enabled if row is not selected
942 Cache.log.debug("Edit with no row selected in linkUrlTable");
946 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
948 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
950 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
951 link.setName(oldName);
952 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
954 boolean valid = false;
957 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
958 MessageManager.getString("label.edit_sequence_url_link"),
959 JvOptionPane.OK_CANCEL_OPTION, -1,
960 null) == JvOptionPane.OK_OPTION)
962 if (link.checkValid())
964 if ((oldName.equals(link.getName()))
965 || (((UrlLinkTableModel) linkUrlTable.getModel())
966 .isUniqueName(link.getName())))
968 linkUrlTable.setValueAt(link.getName(), index, nameCol);
969 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
974 link.notifyDuplicate();
987 public void deleteLink_actionPerformed(ActionEvent e)
989 int index = linkUrlTable.getSelectedRow();
993 // button no longer enabled if row is not selected
994 Cache.log.debug("Delete with no row selected in linkUrlTable");
999 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1002 // make sure we use the model index to delete, and not the table index
1003 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1007 public void defaultBrowser_mouseClicked(MouseEvent e)
1009 JFileChooser chooser = new JFileChooser(".");
1010 chooser.setDialogTitle(
1011 MessageManager.getString("label.select_default_browser"));
1013 int value = chooser.showOpenDialog(this);
1015 if (value == JFileChooser.APPROVE_OPTION)
1017 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1026 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1030 protected void showunconserved_actionPerformed(ActionEvent e)
1032 // TODO Auto-generated method stub
1033 super.showunconserved_actionPerformed(e);
1036 public static List<String> getGroupURLLinks()
1038 return groupURLLinks;
1042 public void minColour_actionPerformed(JPanel panel)
1044 Color col = JColorChooser.showDialog(this,
1045 MessageManager.getString("label.select_colour_minimum_value"),
1046 minColour.getBackground());
1049 panel.setBackground(col);
1055 public void maxColour_actionPerformed(JPanel panel)
1057 Color col = JColorChooser.showDialog(this,
1058 MessageManager.getString("label.select_colour_maximum_value"),
1059 maxColour.getBackground());
1062 panel.setBackground(col);
1068 public void gapColour_actionPerformed(JPanel gap)
1070 if (!useLegacyGap.isSelected())
1072 Color col = JColorChooser.showDialog(this,
1073 MessageManager.getString("label.select_gap_colour"),
1074 gapColour.getBackground());
1077 gap.setBackground(col);
1084 public void hiddenColour_actionPerformed(JPanel hidden)
1086 Color col = JColorChooser.showDialog(this,
1087 MessageManager.getString("label.select_hidden_colour"),
1088 hiddenColour.getBackground());
1091 hidden.setBackground(col);
1097 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1099 boolean enabled = useLegacyGap.isSelected();
1102 gapColour.setBackground(
1103 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1107 gapColour.setBackground(
1108 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1110 gapColour.setEnabled(!enabled);
1111 gapLabel.setEnabled(!enabled);
1115 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1117 useLegacyGap.setSelected(false);
1118 useLegacyGaps_actionPerformed(null);
1119 showHiddenAtStart.setSelected(true);
1120 hiddenColour.setBackground(
1121 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1125 protected void userIdWidth_actionPerformed()
1129 String val = userIdWidth.getText().trim();
1130 if (val.length() > 0)
1132 Integer iw = Integer.parseInt(val);
1133 if (iw.intValue() < 12)
1135 throw new NumberFormatException();
1137 userIdWidth.setText(iw.toString());
1139 } catch (NumberFormatException x)
1141 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1143 .getString("warn.user_defined_width_requirements"),
1144 MessageManager.getString("label.invalid_id_column_width"),
1145 JvOptionPane.WARNING_MESSAGE);
1146 userIdWidth.setText("");
1151 protected void autoIdWidth_actionPerformed()
1153 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1154 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1158 * Returns true if chimera path is to a valid executable, else show an error
1161 private boolean validateChimeraPath()
1163 if (chimeraPath.getText().trim().length() > 0)
1165 File f = new File(chimeraPath.getText());
1166 if (!f.canExecute())
1168 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1169 MessageManager.getString("label.invalid_chimera_path"),
1170 MessageManager.getString("label.invalid_name"),
1171 JvOptionPane.ERROR_MESSAGE);
1179 * If Chimera is selected, check it can be found on default or user-specified
1180 * path, if not show a warning/help dialog.
1183 protected void structureViewer_actionPerformed(String selectedItem)
1185 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1189 boolean found = false;
1192 * Try user-specified and standard paths for Chimera executable.
1194 List<String> paths = StructureManager.getChimeraPaths();
1195 paths.add(0, chimeraPath.getText());
1196 for (String path : paths)
1198 if (new File(path.trim()).canExecute())
1206 String[] options = { "OK", "Help" };
1207 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1208 JvSwingUtils.wrapTooltip(true,
1209 MessageManager.getString("label.chimera_missing")),
1210 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1211 null, options, options[0]);
1212 if (showHelp == JvOptionPane.NO_OPTION)
1216 Help.showHelpWindow(HelpId.StructureViewer);
1217 } catch (HelpSetException e)
1219 e.printStackTrace();
1225 public class OptionsParam
1227 private String name;
1229 private String code;
1231 public OptionsParam(String name, String code)
1237 public String getName()
1242 public void setName(String name)
1247 public String getCode()
1252 public void setCode(String code)
1258 public String toString()
1264 public boolean equals(Object that)
1266 if (!(that instanceof OptionsParam))
1270 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1274 public int hashCode()
1276 return name.hashCode() + code.hashCode();
1280 private class UrlListSelectionHandler implements ListSelectionListener
1284 public void valueChanged(ListSelectionEvent e)
1286 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1288 int index = lsm.getMinSelectionIndex();
1291 // no selection, so disable delete/edit buttons
1292 editLink.setEnabled(false);
1293 deleteLink.setEnabled(false);
1296 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1298 // enable/disable edit and delete link buttons
1299 if (((UrlLinkTableModel) linkUrlTable.getModel())
1300 .isRowDeletable(modelIndex))
1302 deleteLink.setEnabled(true);
1306 deleteLink.setEnabled(false);
1309 if (((UrlLinkTableModel) linkUrlTable.getModel())
1310 .isRowEditable(modelIndex))
1312 editLink.setEnabled(true);
1316 editLink.setEnabled(false);