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.datamodel.Alignment;
26 import jalview.datamodel.AlignmentI;
27 import jalview.datamodel.HiddenMarkovModel;
28 import jalview.datamodel.Sequence;
29 import jalview.datamodel.SequenceI;
30 import jalview.gui.Help.HelpId;
31 import jalview.gui.StructureViewer.ViewerType;
32 import jalview.hmmer.HMMBuildThread;
33 import jalview.io.FileFormatI;
34 import jalview.io.JalviewFileChooser;
35 import jalview.io.JalviewFileView;
36 import jalview.jbgui.GPreferences;
37 import jalview.jbgui.GSequenceLink;
38 import jalview.schemes.ColourSchemeI;
39 import jalview.schemes.ColourSchemes;
40 import jalview.schemes.ResidueColourScheme;
41 import jalview.urls.UrlLinkTableModel;
42 import jalview.urls.api.UrlProviderFactoryI;
43 import jalview.urls.api.UrlProviderI;
44 import jalview.urls.desktop.DesktopUrlProviderFactory;
45 import jalview.util.MessageManager;
46 import jalview.util.Platform;
47 import jalview.util.UrlConstants;
48 import jalview.ws.sifts.SiftsSettings;
50 import java.awt.BorderLayout;
51 import java.awt.Color;
52 import java.awt.Component;
53 import java.awt.Dimension;
55 import java.awt.event.ActionEvent;
56 import java.awt.event.ActionListener;
57 import java.awt.event.MouseEvent;
59 import java.util.ArrayList;
60 import java.util.List;
61 import java.util.Scanner;
63 import javax.help.HelpSetException;
64 import javax.swing.JColorChooser;
65 import javax.swing.JFileChooser;
66 import javax.swing.JInternalFrame;
67 import javax.swing.JPanel;
68 import javax.swing.ListSelectionModel;
69 import javax.swing.RowFilter;
70 import javax.swing.RowSorter;
71 import javax.swing.SortOrder;
72 import javax.swing.event.DocumentEvent;
73 import javax.swing.event.DocumentListener;
74 import javax.swing.event.ListSelectionEvent;
75 import javax.swing.event.ListSelectionListener;
76 import javax.swing.table.TableCellRenderer;
77 import javax.swing.table.TableColumn;
78 import javax.swing.table.TableModel;
79 import javax.swing.table.TableRowSorter;
81 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
89 public class Preferences extends GPreferences
91 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
93 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
95 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
97 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
99 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
101 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
103 public static final String ADD_SS_ANN = "ADD_SS_ANN";
105 public static final String USE_RNAVIEW = "USE_RNAVIEW";
107 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
109 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
111 public static final String CHIMERA_PATH = "CHIMERA_PATH";
113 public static final String HMMER_PATH = "HMMER_PATH";
115 public static final String HMMSEARCH_DB_PATHS = "HMMSEARCH_DB_PATHS";
117 public static final String HMMSEARCH_DBS = "HMMSEARCH_DBS";
119 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
121 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
123 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
125 private static final int MIN_FONT_SIZE = 1;
127 private static final int MAX_FONT_SIZE = 30;
130 * Holds name and link separated with | character. Sequence ID must be
131 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
133 public static UrlProviderI sequenceUrlLinks;
135 public static UrlLinkTableModel dataModel;
138 * Holds name and link separated with | character. Sequence IDS and Sequences
139 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
140 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
141 * for first and second token specified after a pipe character at end |,|.
142 * (TODO: proper escape for using | to separate ids or sequences
145 public static List<String> groupURLLinks;
148 // get links selected to be in the menu (SEQUENCE_LINKS)
149 // and links entered by the user but not selected (STORED_LINKS)
150 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
151 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
152 String defaultUrl = Cache.getDefault("DEFAULT_URL",
153 UrlConstants.DEFAULT_LABEL);
155 // if both links lists are empty, add the DEFAULT_URL link
156 // otherwise we assume the default link is in one of the lists
157 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
159 inMenuString = UrlConstants.DEFAULT_STRING;
161 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
162 inMenuString, notInMenuString);
163 sequenceUrlLinks = factory.createUrlProvider();
164 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
167 * TODO: reformulate groupURL encoding so two or more can be stored in the
168 * .properties file as '|' separated strings
171 groupURLLinks = new ArrayList<>();
174 JInternalFrame frame;
176 DasSourceBrowser dasSource;
178 private WsPreferences wsPrefs;
180 private OptionsParam promptEachTimeOpt = new OptionsParam(
181 MessageManager.getString("label.prompt_each_time"),
184 private OptionsParam lineArtOpt = new OptionsParam(
185 MessageManager.getString("label.lineart"), "Lineart");
187 private OptionsParam textOpt = new OptionsParam(
188 MessageManager.getString("action.text"), "Text");
191 * Creates a new Preferences object.
196 frame = new JInternalFrame();
197 frame.setContentPane(this);
198 dasSource = new DasSourceBrowser();
199 dasTab.add(dasSource, BorderLayout.CENTER);
200 wsPrefs = new WsPreferences();
201 wsTab.add(wsPrefs, BorderLayout.CENTER);
202 int width = 500, height = 450;
203 new jalview.util.Platform();
204 if (Platform.isAMac())
210 Desktop.addInternalFrame(frame,
211 MessageManager.getString("label.preferences"), width, height);
212 frame.setMinimumSize(new Dimension(width, height));
215 * Set HMMER tab defaults
217 trimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
219 .setSelected(Cache.getDefault("HMMER_INSTALLED", false));
220 if (Cache.getDefault("USE_UNIPROT", false))
222 uniprot.setSelected(true);
226 alignment.setSelected(true);
228 numberOfSequencesToKeepField
229 .setText(Cache.getProperty("SEQUENCES_TO_KEEP"));
230 installationLocation.setEnabled(isHMMERInstalled.isSelected());
231 hmmerPath.setEnabled(isHMMERInstalled.isSelected());
232 hmmerPath.setText(Cache.getProperty(HMMER_PATH));
233 hmmerPath.addActionListener(new ActionListener()
236 public void actionPerformed(ActionEvent e)
243 * Set Visual tab defaults
245 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
246 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
247 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
248 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
250 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
251 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
252 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
253 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
255 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
256 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
258 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
259 showGroupConservation.setSelected(
260 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
261 showConsensHistogram.setSelected(
262 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
264 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
265 showInformationHistogram.setSelected(
266 Cache.getDefault("SHOW_INFORMATION_HISTOGRAM", true));
267 showHMMLogo.setSelected(Cache.getDefault("SHOW_HMM_LOGO", false));
269 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
271 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
273 String[] fonts = java.awt.GraphicsEnvironment
274 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
275 for (int i = 0; i < fonts.length; i++)
277 fontNameCB.addItem(fonts[i]);
280 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
282 fontSizeCB.addItem(i + "");
285 fontStyleCB.addItem("plain");
286 fontStyleCB.addItem("bold");
287 fontStyleCB.addItem("italic");
289 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
290 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
291 fontStyleCB.setSelectedItem(
292 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
294 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
296 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
298 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
300 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
302 gapSymbolCB.addItem("-");
303 gapSymbolCB.addItem(".");
305 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
307 sortby.addItem("No sort");
308 sortby.addItem("Id");
309 sortby.addItem("Pairwise Identity");
310 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
312 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
314 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
316 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
317 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
318 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
319 SequenceAnnotationOrder.NONE.name()));
320 sortAnnBy.setSelectedItem(savedSort.toString());
322 sortAutocalc.addItem("Autocalculated first");
323 sortAutocalc.addItem("Autocalculated last");
324 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
325 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
326 : sortAutocalc.getItemAt(1));
328 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
329 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
330 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
331 + "/examples/exampleFile_2_3.jar"));
334 * Set Colours tab defaults
336 protColour.addItem(ResidueColourScheme.NONE);
337 nucColour.addItem(ResidueColourScheme.NONE);
338 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
340 String name = cs.getSchemeName();
341 protColour.addItem(name);
342 nucColour.addItem(name);
344 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
345 ResidueColourScheme.NONE);
346 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
347 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
348 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
349 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
350 minColour.setBackground(
351 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
352 maxColour.setBackground(
353 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
356 * Set Structure tab defaults.
358 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
359 structFromPdb.setSelected(structSelected);
360 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
361 useRnaView.setEnabled(structSelected);
362 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
363 addSecondaryStructure.setEnabled(structSelected);
364 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
365 addTempFactor.setEnabled(structSelected);
366 structViewer.setSelectedItem(
367 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
368 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
369 chimeraPath.addActionListener(new ActionListener()
372 public void actionPerformed(ActionEvent e)
374 validateChimeraPath();
378 if (Cache.getDefault("MAP_WITH_SIFTS", false))
380 siftsMapping.setSelected(true);
384 nwMapping.setSelected(true);
388 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
391 * Set Connections tab defaults
395 linkUrlTable.setModel(dataModel);
396 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
397 linkUrlTable.getModel());
398 linkUrlTable.setRowSorter(sorter);
399 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
401 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
402 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
403 SortOrder.DESCENDING));
404 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
405 SortOrder.DESCENDING));
407 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
409 sorter.setSortKeys(sortKeys);
413 ActionListener onReset;
414 onReset = new ActionListener()
417 public void actionPerformed(ActionEvent e)
419 filterTB.setText("");
420 sorter.setRowFilter(RowFilter.regexFilter(""));
424 doReset.addActionListener(onReset);
426 // filter to display only custom urls
427 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
430 public boolean include(
431 Entry<? extends TableModel, ? extends Object> entry)
433 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
437 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
438 linkUrlTable.getModel());
439 customSorter.setRowFilter(customUrlFilter);
441 ActionListener onCustomOnly;
442 onCustomOnly = new ActionListener()
445 public void actionPerformed(ActionEvent e)
447 filterTB.setText("");
448 sorter.setRowFilter(customUrlFilter);
451 userOnly.addActionListener(onCustomOnly);
453 filterTB.getDocument().addDocumentListener(new DocumentListener()
455 String caseInsensitiveFlag = "(?i)";
458 public void changedUpdate(DocumentEvent e)
460 sorter.setRowFilter(RowFilter
461 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
465 public void removeUpdate(DocumentEvent e)
467 sorter.setRowFilter(RowFilter
468 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
472 public void insertUpdate(DocumentEvent e)
474 sorter.setRowFilter(RowFilter
475 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
479 // set up list selection functionality
480 linkUrlTable.getSelectionModel()
481 .addListSelectionListener(new UrlListSelectionHandler());
483 // set up radio buttons
484 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
486 String onClickName = linkUrlTable.getColumnName(onClickCol);
487 linkUrlTable.getColumn(onClickName)
488 .setCellRenderer(new RadioButtonRenderer());
489 linkUrlTable.getColumn(onClickName)
490 .setCellEditor(new RadioButtonEditor());
492 // get boolean columns and resize those to min possible
493 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
495 if (linkUrlTable.getModel().getColumnClass(column)
496 .equals(Boolean.class))
498 TableColumn tableColumn = linkUrlTable.getColumnModel()
500 int preferredWidth = tableColumn.getMinWidth();
502 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
504 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
505 int cwidth = c.getPreferredSize().width
506 + linkUrlTable.getIntercellSpacing().width;
507 preferredWidth = Math.max(preferredWidth, cwidth);
509 tableColumn.setPreferredWidth(preferredWidth);
513 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
514 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
515 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
516 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
518 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
520 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
521 // note antisense here: default is true
523 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
524 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
527 * Set Output tab defaults
529 epsRendering.addItem(promptEachTimeOpt);
530 epsRendering.addItem(lineArtOpt);
531 epsRendering.addItem(textOpt);
532 String defaultEPS = Cache.getDefault("EPS_RENDERING",
534 if (defaultEPS.equalsIgnoreCase("Text"))
536 epsRendering.setSelectedItem(textOpt);
538 else if (defaultEPS.equalsIgnoreCase("Lineart"))
540 epsRendering.setSelectedItem(lineArtOpt);
544 epsRendering.setSelectedItem(promptEachTimeOpt);
546 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
547 userIdWidth.setEnabled(!autoIdWidth.isSelected());
548 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
549 Integer wi = Cache.getIntegerProperty("FIGURE_USERIDWIDTH");
550 userIdWidth.setText(wi == null ? "" : wi.toString());
551 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
552 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
553 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
554 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
555 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
556 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
557 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
558 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
560 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
563 * Set Editing tab defaults
565 autoCalculateConsCheck
566 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
567 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
568 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
570 annotations_actionPerformed(null); // update the display of the annotation
575 * Save user selections on the Preferences tabs to the Cache and write out to
581 public void ok_actionPerformed(ActionEvent e)
583 if (!validateSettings())
589 * Save Visual settings
591 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
592 Boolean.toString(seqLimit.isSelected()));
593 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
594 Boolean.toString(rightAlign.isSelected()));
595 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
596 Boolean.toString(fullScreen.isSelected()));
597 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
598 Boolean.toString(openoverv.isSelected()));
599 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
600 Boolean.toString(annotations.isSelected()));
601 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
602 Boolean.toString(conservation.isSelected()));
603 Cache.applicationProperties.setProperty("SHOW_QUALITY",
604 Boolean.toString(quality.isSelected()));
605 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
606 Boolean.toString(identity.isSelected()));
608 Cache.applicationProperties.setProperty("GAP_SYMBOL",
609 gapSymbolCB.getSelectedItem().toString());
611 Cache.applicationProperties.setProperty("FONT_NAME",
612 fontNameCB.getSelectedItem().toString());
613 Cache.applicationProperties.setProperty("FONT_STYLE",
614 fontStyleCB.getSelectedItem().toString());
615 Cache.applicationProperties.setProperty("FONT_SIZE",
616 fontSizeCB.getSelectedItem().toString());
618 Cache.applicationProperties.setProperty("ID_ITALICS",
619 Boolean.toString(idItalics.isSelected()));
620 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
621 Boolean.toString(showUnconserved.isSelected()));
622 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
623 Boolean.toString(showOccupancy.isSelected()));
624 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
625 Boolean.toString(showGroupConsensus.isSelected()));
626 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
627 Boolean.toString(showGroupConservation.isSelected()));
628 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
629 Boolean.toString(showConsensHistogram.isSelected()));
630 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
631 Boolean.toString(showConsensLogo.isSelected()));
632 Cache.applicationProperties.setProperty("SHOW_INFORMATION_HISTOGRAM",
633 Boolean.toString(showConsensHistogram.isSelected()));
634 Cache.applicationProperties.setProperty("SHOW_HMM_LOGO",
635 Boolean.toString(showHMMLogo.isSelected()));
636 Cache.applicationProperties.setProperty("ANTI_ALIAS",
637 Boolean.toString(smoothFont.isSelected()));
638 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
639 Boolean.toString(scaleProteinToCdna.isSelected()));
640 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
641 Boolean.toString(showNpTooltip.isSelected()));
642 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
643 Boolean.toString(showDbRefTooltip.isSelected()));
645 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
646 Boolean.toString(wrap.isSelected()));
648 Cache.applicationProperties.setProperty("STARTUP_FILE",
649 startupFileTextfield.getText());
650 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
651 Boolean.toString(startupCheckbox.isSelected()));
653 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
654 sortby.getSelectedItem().toString());
656 // convert description of sort order to enum name for save
657 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
658 .forDescription(sortAnnBy.getSelectedItem().toString());
659 if (annSortOrder != null)
661 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
662 annSortOrder.name());
665 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
666 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
667 Boolean.valueOf(showAutocalcFirst).toString());
670 * Save Colours settings
672 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
673 protColour.getSelectedItem().toString());
674 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
675 nucColour.getSelectedItem().toString());
676 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
677 minColour.getBackground());
678 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
679 maxColour.getBackground());
682 * Save HMMER settings
684 Cache.applicationProperties.setProperty("TRIM_TERMINI",
685 Boolean.toString(trimTermini.isSelected()));
686 Cache.applicationProperties.setProperty("USE_UNIPROT",
687 Boolean.toString(uniprot.isSelected()));
688 Cache.applicationProperties.setProperty("SEQUENCES_TO_KEEP",
689 numberOfSequencesToKeepField.getText());
690 Cache.applicationProperties.setProperty(HMMER_PATH,
691 hmmerPath.getText());
692 boolean hmmerInstalled = isHMMERInstalled.isSelected();
693 Cache.applicationProperties.setProperty("HMMER_INSTALLED",
694 Boolean.toString(hmmerInstalled));
695 boolean hmmerFunctioning = validateHMMERPath(false);
696 Cache.applicationProperties.setProperty("HMMER_FUNCTIONING",
697 Boolean.toString(hmmerFunctioning));
698 AlignFrame[] frames = Desktop.getAlignFrames();
699 boolean hmmerStatus = hmmerFunctioning && hmmerInstalled ? true : false;
700 if (frames != null && frames.length > 0)
702 for (AlignFrame frame : frames)
704 frame.updateHMMERStatus(hmmerStatus);
708 trimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
709 if (Cache.getDefault("USE_UNIPROT", false))
711 uniprot.setSelected(true);
715 alignment.setSelected(true);
717 numberOfSequencesToKeepField
718 .setText(Cache.getProperty("SEQUENCES_TO_KEEP"));
719 hmmerPath.setText(Cache.getProperty(HMMER_PATH));
722 * Save Structure settings
724 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
725 Boolean.toString(addTempFactor.isSelected()));
726 Cache.applicationProperties.setProperty(ADD_SS_ANN,
727 Boolean.toString(addSecondaryStructure.isSelected()));
728 Cache.applicationProperties.setProperty(USE_RNAVIEW,
729 Boolean.toString(useRnaView.isSelected()));
730 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
731 Boolean.toString(structFromPdb.isSelected()));
732 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
733 structViewer.getSelectedItem().toString());
734 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
735 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
736 Boolean.toString(siftsMapping.isSelected()));
737 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
740 * Save Output settings
742 Cache.applicationProperties.setProperty("EPS_RENDERING",
743 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
746 * Save Connections settings
748 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
750 jalview.util.BrowserLauncher.resetBrowser();
752 // save user-defined and selected links
753 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
754 if (menuLinks.isEmpty())
756 Cache.applicationProperties.remove("SEQUENCE_LINKS");
760 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
761 menuLinks.toString());
764 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
765 if (nonMenuLinks.isEmpty())
767 Cache.applicationProperties.remove("STORED_LINKS");
771 Cache.applicationProperties.setProperty("STORED_LINKS",
772 nonMenuLinks.toString());
775 Cache.applicationProperties.setProperty("DEFAULT_URL",
776 sequenceUrlLinks.getPrimaryUrlId());
778 Cache.applicationProperties.setProperty("USE_PROXY",
779 Boolean.toString(useProxy.isSelected()));
781 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
783 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
785 if (useProxy.isSelected())
787 System.setProperty("http.proxyHost", proxyServerTB.getText());
788 System.setProperty("http.proxyPort", proxyPortTB.getText());
792 System.setProperty("http.proxyHost", "");
793 System.setProperty("http.proxyPort", "");
795 Cache.setProperty("VERSION_CHECK",
796 Boolean.toString(versioncheck.isSelected()));
797 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
799 // default is false - we only set this if the user has actively agreed
800 Cache.setProperty("USAGESTATS",
801 Boolean.toString(usagestats.isSelected()));
803 if (!questionnaire.isSelected())
805 Cache.setProperty("NOQUESTIONNAIRES", "true");
809 // special - made easy to edit a property file to disable questionnaires
810 // by just adding the given line
811 Cache.removeProperty("NOQUESTIONNAIRES");
815 * Save Output settings
817 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
818 Boolean.toString(blcjv.isSelected()));
819 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
820 Boolean.toString(clustaljv.isSelected()));
821 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
822 Boolean.toString(fastajv.isSelected()));
823 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
824 Boolean.toString(msfjv.isSelected()));
825 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
826 Boolean.toString(pfamjv.isSelected()));
827 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
828 Boolean.toString(pileupjv.isSelected()));
829 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
830 Boolean.toString(pirjv.isSelected()));
831 Cache.applicationProperties.setProperty("PIR_MODELLER",
832 Boolean.toString(modellerOutput.isSelected()));
833 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
834 Boolean.toString(embbedBioJSON.isSelected()));
835 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
837 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
838 Boolean.toString(autoIdWidth.isSelected()));
839 userIdWidth_actionPerformed();
840 Cache.applicationProperties.setProperty("FIGURE_USERIDWIDTH",
841 userIdWidth.getText());
844 * Save Editing settings
846 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
847 Boolean.toString(autoCalculateConsCheck.isSelected()));
848 Cache.applicationProperties.setProperty("SORT_BY_TREE",
849 Boolean.toString(sortByTree.isSelected()));
850 Cache.applicationProperties.setProperty("PAD_GAPS",
851 Boolean.toString(padGaps.isSelected()));
853 dasSource.saveProperties(Cache.applicationProperties);
854 wsPrefs.updateAndRefreshWsMenuConfig(false);
855 Cache.saveProperties();
856 Desktop.instance.doConfigureStructurePrefs();
859 frame.setClosed(true);
860 } catch (Exception ex)
866 * Do any necessary validation before saving settings. Return focus to the
867 * first tab which fails validation.
871 private boolean validateSettings()
873 if (!validateStructure())
875 structureTab.requestFocusInWindow();
878 if (isHMMERInstalled.isSelected())
880 if (!validateHMMER())
882 hmmerTab.requestFocusInWindow();
890 protected boolean validateStructure()
892 return validateChimeraPath();
897 protected boolean validateHMMER()
899 return validateHMMERPath();
907 public void startupFileTextfield_mouseClicked()
909 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
910 JalviewFileChooser chooser = JalviewFileChooser
911 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
912 chooser.setFileView(new JalviewFileView());
913 chooser.setDialogTitle(
914 MessageManager.getString("label.select_startup_file"));
916 int value = chooser.showOpenDialog(this);
918 if (value == JalviewFileChooser.APPROVE_OPTION)
920 FileFormatI format = chooser.getSelectedFormat();
923 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
927 .setText(chooser.getSelectedFile().getAbsolutePath());
938 public void cancel_actionPerformed(ActionEvent e)
942 wsPrefs.updateWsMenuConfig(true);
943 wsPrefs.refreshWs_actionPerformed(e);
944 frame.setClosed(true);
945 } catch (Exception ex)
957 public void annotations_actionPerformed(ActionEvent e)
959 conservation.setEnabled(annotations.isSelected());
960 quality.setEnabled(annotations.isSelected());
961 identity.setEnabled(annotations.isSelected());
962 showOccupancy.setEnabled(annotations.isSelected());
963 showGroupConsensus.setEnabled(annotations.isSelected());
964 showGroupConservation.setEnabled(annotations.isSelected());
965 showConsensHistogram.setEnabled(annotations.isSelected()
966 && (identity.isSelected() || showGroupConsensus.isSelected()));
967 showConsensLogo.setEnabled(annotations.isSelected()
968 && (identity.isSelected() || showGroupConsensus.isSelected()));
969 showInformationHistogram.setEnabled(annotations.isSelected());
970 showHMMLogo.setEnabled(annotations.isSelected());
974 public void newLink_actionPerformed(ActionEvent e)
976 GSequenceLink link = new GSequenceLink();
977 boolean valid = false;
980 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
981 MessageManager.getString("label.new_sequence_url_link"),
982 JvOptionPane.OK_CANCEL_OPTION, -1,
983 null) == JvOptionPane.OK_OPTION)
985 if (link.checkValid())
987 if (((UrlLinkTableModel) linkUrlTable.getModel())
988 .isUniqueName(link.getName()))
990 ((UrlLinkTableModel) linkUrlTable.getModel())
991 .insertRow(link.getName(), link.getURL());
996 link.notifyDuplicate();
1009 public void editLink_actionPerformed(ActionEvent e)
1011 GSequenceLink link = new GSequenceLink();
1013 int index = linkUrlTable.getSelectedRow();
1016 // button no longer enabled if row is not selected
1017 Cache.log.debug("Edit with no row selected in linkUrlTable");
1021 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1023 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1025 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1026 link.setName(oldName);
1027 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1029 boolean valid = false;
1032 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1033 MessageManager.getString("label.edit_sequence_url_link"),
1034 JvOptionPane.OK_CANCEL_OPTION, -1,
1035 null) == JvOptionPane.OK_OPTION)
1037 if (link.checkValid())
1039 if ((oldName.equals(link.getName()))
1040 || (((UrlLinkTableModel) linkUrlTable.getModel())
1041 .isUniqueName(link.getName())))
1043 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1044 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1049 link.notifyDuplicate();
1062 public void deleteLink_actionPerformed(ActionEvent e)
1064 int index = linkUrlTable.getSelectedRow();
1065 int modelIndex = -1;
1068 // button no longer enabled if row is not selected
1069 Cache.log.debug("Delete with no row selected in linkUrlTable");
1074 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1077 // make sure we use the model index to delete, and not the table index
1078 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1082 public void defaultBrowser_mouseClicked(MouseEvent e)
1084 JFileChooser chooser = new JFileChooser(".");
1085 chooser.setDialogTitle(
1086 MessageManager.getString("label.select_default_browser"));
1088 int value = chooser.showOpenDialog(this);
1090 if (value == JFileChooser.APPROVE_OPTION)
1092 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1101 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1105 protected void showunconserved_actionPerformed(ActionEvent e)
1107 // TODO Auto-generated method stub
1108 super.showunconserved_actionPerformed(e);
1111 public static List<String> getGroupURLLinks()
1113 return groupURLLinks;
1117 public void minColour_actionPerformed(JPanel panel)
1119 Color col = JColorChooser.showDialog(this,
1120 MessageManager.getString("label.select_colour_minimum_value"),
1121 minColour.getBackground());
1124 panel.setBackground(col);
1130 public void maxColour_actionPerformed(JPanel panel)
1132 Color col = JColorChooser.showDialog(this,
1133 MessageManager.getString("label.select_colour_maximum_value"),
1134 maxColour.getBackground());
1137 panel.setBackground(col);
1143 protected void userIdWidth_actionPerformed()
1147 String val = userIdWidth.getText().trim();
1148 if (val.length() > 0)
1150 Integer iw = Integer.parseInt(val);
1151 if (iw.intValue() < 12)
1153 throw new NumberFormatException();
1155 userIdWidth.setText(iw.toString());
1157 } catch (NumberFormatException x)
1159 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1161 .getString("warn.user_defined_width_requirements"),
1162 MessageManager.getString("label.invalid_id_column_width"),
1163 JvOptionPane.WARNING_MESSAGE);
1164 userIdWidth.setText("");
1169 protected void autoIdWidth_actionPerformed()
1171 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1172 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1176 * Returns true if chimera path is to a valid executable, else show an error
1179 private boolean validateChimeraPath()
1181 if (chimeraPath.getText().trim().length() > 0)
1183 File f = new File(chimeraPath.getText());
1184 if (!f.canExecute())
1186 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1187 MessageManager.getString("label.invalid_chimera_path"),
1188 MessageManager.getString("label.invalid_name"),
1189 JvOptionPane.ERROR_MESSAGE);
1197 * Returns true if hmmer path contains the necessary valid executables, else
1198 * show an error dialog (if showing dialog).
1200 private boolean validateHMMERPath(boolean showDialog)
1203 String message = "";
1204 String folder = hmmerPath.getText().trim();
1205 if (folder.length() > 0)
1207 File f = new File(folder);
1212 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1213 MessageManager.getString("label.folder_not_exists"),
1214 MessageManager.getString("label.invalid_folder"),
1215 JvOptionPane.ERROR_MESSAGE);
1219 AlignmentI alignment = new Alignment(
1221 { new Sequence("test", "WLWL", 0, 3) });
1222 if (canExecute(folder + "/hmmbuild"))
1224 validateHMMBuild(alignment);
1228 message += MessageManager.getString("label.hmmbuild_not_found")
1234 if (canExecute(folder + "/hmmalign"))
1240 message += MessageManager.getString("label.hmmalign_not_found")
1246 if (canExecute(folder + "/hmmsearch"))
1252 message += MessageManager.getString("label.hmmsearch_not_found")
1264 JvOptionPane.showInternalMessageDialog(Desktop.desktop, message,
1265 MessageManager.getString("label.invalid_folder"),
1266 JvOptionPane.ERROR_MESSAGE);
1274 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1275 MessageManager.getString("label.no_binaries"),
1276 MessageManager.getString("label.invalid_folder"),
1277 JvOptionPane.ERROR_MESSAGE);
1288 * Checks if a file can be executed
1291 * the path to the file
1294 public boolean canExecute(String path)
1296 File file = new File(path);
1297 if (!file.canExecute())
1299 file = new File(path + ".exe");
1301 if (!file.canExecute())
1311 * Runs hmmbuild to check if it is working. While doing this it parses the
1317 public boolean validateHMMBuild(AlignmentI alignment)
1319 HMMBuildThread hmmbuild = new HMMBuildThread(alignment);
1320 hmmbuild.hmmbuildWaitTillComplete();
1321 SequenceI hmmSeq = alignment.getSequenceAt(0);
1322 HiddenMarkovModel hmm;
1323 if (hmmSeq.isHMMConsensusSequence() && hmmSeq.getHMM() != null)
1325 hmm = hmmSeq.getHMM();
1327 if (hmm.getNumberOfSymbols() < 1)
1337 String header = hmm.getFileHeader();
1344 Scanner scanner = new Scanner(header);
1346 String string = scanner.next();
1347 String version = string.substring(1);
1348 Cache.setProperty("HMMER_VERSION", version);
1356 private boolean validateHMMERPath()
1358 return validateHMMERPath(true);
1362 * If Chimera is selected, check it can be found on default or user-specified
1363 * path, if not show a warning/help dialog.
1366 protected void structureViewer_actionPerformed(String selectedItem)
1368 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1372 boolean found = false;
1375 * Try user-specified and standard paths for Chimera executable.
1377 List<String> paths = StructureManager.getChimeraPaths();
1378 paths.add(0, chimeraPath.getText());
1379 for (String path : paths)
1381 if (new File(path.trim()).canExecute())
1389 String[] options = { "OK", "Help" };
1390 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1391 JvSwingUtils.wrapTooltip(true,
1392 MessageManager.getString("label.chimera_missing")),
1393 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1394 null, options, options[0]);
1395 if (showHelp == JvOptionPane.NO_OPTION)
1399 Help.showHelpWindow(HelpId.StructureViewer);
1400 } catch (HelpSetException e)
1402 e.printStackTrace();
1408 public class OptionsParam
1410 private String name;
1412 private String code;
1414 public OptionsParam(String name, String code)
1420 public String getName()
1425 public void setName(String name)
1430 public String getCode()
1435 public void setCode(String code)
1441 public String toString()
1447 public boolean equals(Object that)
1449 if (!(that instanceof OptionsParam))
1453 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1457 public int hashCode()
1459 return name.hashCode() + code.hashCode();
1463 private class UrlListSelectionHandler implements ListSelectionListener
1467 public void valueChanged(ListSelectionEvent e)
1469 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1471 int index = lsm.getMinSelectionIndex();
1474 // no selection, so disable delete/edit buttons
1475 editLink.setEnabled(false);
1476 deleteLink.setEnabled(false);
1479 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1481 // enable/disable edit and delete link buttons
1482 if (((UrlLinkTableModel) linkUrlTable.getModel())
1483 .isRowDeletable(modelIndex))
1485 deleteLink.setEnabled(true);
1489 deleteLink.setEnabled(false);
1492 if (((UrlLinkTableModel) linkUrlTable.getModel())
1493 .isRowEditable(modelIndex))
1495 editLink.setEnabled(true);
1499 editLink.setEnabled(false);