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 for (AlignFrame frame : frames)
702 frame.updateHMMERStatus(hmmerStatus);
706 trimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
707 if (Cache.getDefault("USE_UNIPROT", false))
709 uniprot.setSelected(true);
713 alignment.setSelected(true);
715 numberOfSequencesToKeepField
716 .setText(Cache.getProperty("SEQUENCES_TO_KEEP"));
717 hmmerPath.setText(Cache.getProperty(HMMER_PATH));
720 * Save Structure settings
722 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
723 Boolean.toString(addTempFactor.isSelected()));
724 Cache.applicationProperties.setProperty(ADD_SS_ANN,
725 Boolean.toString(addSecondaryStructure.isSelected()));
726 Cache.applicationProperties.setProperty(USE_RNAVIEW,
727 Boolean.toString(useRnaView.isSelected()));
728 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
729 Boolean.toString(structFromPdb.isSelected()));
730 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
731 structViewer.getSelectedItem().toString());
732 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
733 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
734 Boolean.toString(siftsMapping.isSelected()));
735 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
738 * Save Output settings
740 Cache.applicationProperties.setProperty("EPS_RENDERING",
741 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
744 * Save Connections settings
746 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
748 jalview.util.BrowserLauncher.resetBrowser();
750 // save user-defined and selected links
751 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
752 if (menuLinks.isEmpty())
754 Cache.applicationProperties.remove("SEQUENCE_LINKS");
758 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
759 menuLinks.toString());
762 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
763 if (nonMenuLinks.isEmpty())
765 Cache.applicationProperties.remove("STORED_LINKS");
769 Cache.applicationProperties.setProperty("STORED_LINKS",
770 nonMenuLinks.toString());
773 Cache.applicationProperties.setProperty("DEFAULT_URL",
774 sequenceUrlLinks.getPrimaryUrlId());
776 Cache.applicationProperties.setProperty("USE_PROXY",
777 Boolean.toString(useProxy.isSelected()));
779 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
781 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
783 if (useProxy.isSelected())
785 System.setProperty("http.proxyHost", proxyServerTB.getText());
786 System.setProperty("http.proxyPort", proxyPortTB.getText());
790 System.setProperty("http.proxyHost", "");
791 System.setProperty("http.proxyPort", "");
793 Cache.setProperty("VERSION_CHECK",
794 Boolean.toString(versioncheck.isSelected()));
795 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
797 // default is false - we only set this if the user has actively agreed
798 Cache.setProperty("USAGESTATS",
799 Boolean.toString(usagestats.isSelected()));
801 if (!questionnaire.isSelected())
803 Cache.setProperty("NOQUESTIONNAIRES", "true");
807 // special - made easy to edit a property file to disable questionnaires
808 // by just adding the given line
809 Cache.removeProperty("NOQUESTIONNAIRES");
813 * Save Output settings
815 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
816 Boolean.toString(blcjv.isSelected()));
817 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
818 Boolean.toString(clustaljv.isSelected()));
819 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
820 Boolean.toString(fastajv.isSelected()));
821 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
822 Boolean.toString(msfjv.isSelected()));
823 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
824 Boolean.toString(pfamjv.isSelected()));
825 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
826 Boolean.toString(pileupjv.isSelected()));
827 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
828 Boolean.toString(pirjv.isSelected()));
829 Cache.applicationProperties.setProperty("PIR_MODELLER",
830 Boolean.toString(modellerOutput.isSelected()));
831 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
832 Boolean.toString(embbedBioJSON.isSelected()));
833 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
835 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
836 Boolean.toString(autoIdWidth.isSelected()));
837 userIdWidth_actionPerformed();
838 Cache.applicationProperties.setProperty("FIGURE_USERIDWIDTH",
839 userIdWidth.getText());
842 * Save Editing settings
844 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
845 Boolean.toString(autoCalculateConsCheck.isSelected()));
846 Cache.applicationProperties.setProperty("SORT_BY_TREE",
847 Boolean.toString(sortByTree.isSelected()));
848 Cache.applicationProperties.setProperty("PAD_GAPS",
849 Boolean.toString(padGaps.isSelected()));
851 dasSource.saveProperties(Cache.applicationProperties);
852 wsPrefs.updateAndRefreshWsMenuConfig(false);
853 Cache.saveProperties();
854 Desktop.instance.doConfigureStructurePrefs();
857 frame.setClosed(true);
858 } catch (Exception ex)
864 * Do any necessary validation before saving settings. Return focus to the
865 * first tab which fails validation.
869 private boolean validateSettings()
871 if (!validateStructure())
873 structureTab.requestFocusInWindow();
876 if (isHMMERInstalled.isSelected())
878 if (!validateHMMER())
880 hmmerTab.requestFocusInWindow();
888 protected boolean validateStructure()
890 return validateChimeraPath();
895 protected boolean validateHMMER()
897 return validateHMMERPath();
905 public void startupFileTextfield_mouseClicked()
907 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
908 JalviewFileChooser chooser = JalviewFileChooser
909 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
910 chooser.setFileView(new JalviewFileView());
911 chooser.setDialogTitle(
912 MessageManager.getString("label.select_startup_file"));
914 int value = chooser.showOpenDialog(this);
916 if (value == JalviewFileChooser.APPROVE_OPTION)
918 FileFormatI format = chooser.getSelectedFormat();
921 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
925 .setText(chooser.getSelectedFile().getAbsolutePath());
936 public void cancel_actionPerformed(ActionEvent e)
940 wsPrefs.updateWsMenuConfig(true);
941 wsPrefs.refreshWs_actionPerformed(e);
942 frame.setClosed(true);
943 } catch (Exception ex)
955 public void annotations_actionPerformed(ActionEvent e)
957 conservation.setEnabled(annotations.isSelected());
958 quality.setEnabled(annotations.isSelected());
959 identity.setEnabled(annotations.isSelected());
960 showOccupancy.setEnabled(annotations.isSelected());
961 showGroupConsensus.setEnabled(annotations.isSelected());
962 showGroupConservation.setEnabled(annotations.isSelected());
963 showConsensHistogram.setEnabled(annotations.isSelected()
964 && (identity.isSelected() || showGroupConsensus.isSelected()));
965 showConsensLogo.setEnabled(annotations.isSelected()
966 && (identity.isSelected() || showGroupConsensus.isSelected()));
967 showInformationHistogram.setEnabled(annotations.isSelected());
968 showHMMLogo.setEnabled(annotations.isSelected());
972 public void newLink_actionPerformed(ActionEvent e)
974 GSequenceLink link = new GSequenceLink();
975 boolean valid = false;
978 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
979 MessageManager.getString("label.new_sequence_url_link"),
980 JvOptionPane.OK_CANCEL_OPTION, -1,
981 null) == JvOptionPane.OK_OPTION)
983 if (link.checkValid())
985 if (((UrlLinkTableModel) linkUrlTable.getModel())
986 .isUniqueName(link.getName()))
988 ((UrlLinkTableModel) linkUrlTable.getModel())
989 .insertRow(link.getName(), link.getURL());
994 link.notifyDuplicate();
1007 public void editLink_actionPerformed(ActionEvent e)
1009 GSequenceLink link = new GSequenceLink();
1011 int index = linkUrlTable.getSelectedRow();
1014 // button no longer enabled if row is not selected
1015 Cache.log.debug("Edit with no row selected in linkUrlTable");
1019 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1021 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1023 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1024 link.setName(oldName);
1025 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1027 boolean valid = false;
1030 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1031 MessageManager.getString("label.edit_sequence_url_link"),
1032 JvOptionPane.OK_CANCEL_OPTION, -1,
1033 null) == JvOptionPane.OK_OPTION)
1035 if (link.checkValid())
1037 if ((oldName.equals(link.getName()))
1038 || (((UrlLinkTableModel) linkUrlTable.getModel())
1039 .isUniqueName(link.getName())))
1041 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1042 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1047 link.notifyDuplicate();
1060 public void deleteLink_actionPerformed(ActionEvent e)
1062 int index = linkUrlTable.getSelectedRow();
1063 int modelIndex = -1;
1066 // button no longer enabled if row is not selected
1067 Cache.log.debug("Delete with no row selected in linkUrlTable");
1072 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1075 // make sure we use the model index to delete, and not the table index
1076 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1080 public void defaultBrowser_mouseClicked(MouseEvent e)
1082 JFileChooser chooser = new JFileChooser(".");
1083 chooser.setDialogTitle(
1084 MessageManager.getString("label.select_default_browser"));
1086 int value = chooser.showOpenDialog(this);
1088 if (value == JFileChooser.APPROVE_OPTION)
1090 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1099 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1103 protected void showunconserved_actionPerformed(ActionEvent e)
1105 // TODO Auto-generated method stub
1106 super.showunconserved_actionPerformed(e);
1109 public static List<String> getGroupURLLinks()
1111 return groupURLLinks;
1115 public void minColour_actionPerformed(JPanel panel)
1117 Color col = JColorChooser.showDialog(this,
1118 MessageManager.getString("label.select_colour_minimum_value"),
1119 minColour.getBackground());
1122 panel.setBackground(col);
1128 public void maxColour_actionPerformed(JPanel panel)
1130 Color col = JColorChooser.showDialog(this,
1131 MessageManager.getString("label.select_colour_maximum_value"),
1132 maxColour.getBackground());
1135 panel.setBackground(col);
1141 protected void userIdWidth_actionPerformed()
1145 String val = userIdWidth.getText().trim();
1146 if (val.length() > 0)
1148 Integer iw = Integer.parseInt(val);
1149 if (iw.intValue() < 12)
1151 throw new NumberFormatException();
1153 userIdWidth.setText(iw.toString());
1155 } catch (NumberFormatException x)
1157 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1159 .getString("warn.user_defined_width_requirements"),
1160 MessageManager.getString("label.invalid_id_column_width"),
1161 JvOptionPane.WARNING_MESSAGE);
1162 userIdWidth.setText("");
1167 protected void autoIdWidth_actionPerformed()
1169 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1170 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1174 * Returns true if chimera path is to a valid executable, else show an error
1177 private boolean validateChimeraPath()
1179 if (chimeraPath.getText().trim().length() > 0)
1181 File f = new File(chimeraPath.getText());
1182 if (!f.canExecute())
1184 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1185 MessageManager.getString("label.invalid_chimera_path"),
1186 MessageManager.getString("label.invalid_name"),
1187 JvOptionPane.ERROR_MESSAGE);
1195 * Returns true if hmmer path contains the necessary valid executables, else
1196 * show an error dialog (if showing dialog).
1198 private boolean validateHMMERPath(boolean showDialog)
1201 String message = "";
1202 String folder = hmmerPath.getText().trim();
1203 if (folder.length() > 0)
1205 File f = new File(folder);
1210 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1211 MessageManager.getString("label.folder_not_exists"),
1212 MessageManager.getString("label.invalid_folder"),
1213 JvOptionPane.ERROR_MESSAGE);
1217 AlignmentI alignment = new Alignment(
1219 { new Sequence("test", "WLWL", 0, 3) });
1220 if (canExecute(folder + "/hmmbuild"))
1222 validateHMMBuild(alignment);
1226 message += MessageManager.getString("label.hmmbuild_not_found")
1232 if (canExecute(folder + "/hmmalign"))
1238 message += MessageManager.getString("label.hmmalign_not_found")
1244 if (canExecute(folder + "/hmmsearch"))
1250 message += MessageManager.getString("label.hmmsearch_not_found")
1262 JvOptionPane.showInternalMessageDialog(Desktop.desktop, message,
1263 MessageManager.getString("label.invalid_folder"),
1264 JvOptionPane.ERROR_MESSAGE);
1272 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1273 MessageManager.getString("label.no_binaries"),
1274 MessageManager.getString("label.invalid_folder"),
1275 JvOptionPane.ERROR_MESSAGE);
1286 * Checks if a file can be executed
1289 * the path to the file
1292 public boolean canExecute(String path)
1294 File file = new File(path);
1295 if (!file.canExecute())
1297 file = new File(path + ".exe");
1299 if (!file.canExecute())
1309 * Runs hmmbuild to check if it is working. While doing this it parses the
1315 public boolean validateHMMBuild(AlignmentI alignment)
1317 HMMBuildThread hmmbuild = new HMMBuildThread(alignment);
1318 hmmbuild.hmmbuildWaitTillComplete();
1319 SequenceI hmmSeq = alignment.getSequenceAt(0);
1320 HiddenMarkovModel hmm;
1321 if (hmmSeq.isHMMConsensusSequence() && hmmSeq.getHMM() != null)
1323 hmm = hmmSeq.getHMM();
1325 if (hmm.getNumberOfSymbols() < 1)
1335 String header = hmm.getFileHeader();
1342 Scanner scanner = new Scanner(header);
1344 String string = scanner.next();
1345 String version = string.substring(1);
1346 Cache.setProperty("HMMER_VERSION", version);
1354 private boolean validateHMMERPath()
1356 return validateHMMERPath(true);
1360 * If Chimera is selected, check it can be found on default or user-specified
1361 * path, if not show a warning/help dialog.
1364 protected void structureViewer_actionPerformed(String selectedItem)
1366 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1370 boolean found = false;
1373 * Try user-specified and standard paths for Chimera executable.
1375 List<String> paths = StructureManager.getChimeraPaths();
1376 paths.add(0, chimeraPath.getText());
1377 for (String path : paths)
1379 if (new File(path.trim()).canExecute())
1387 String[] options = { "OK", "Help" };
1388 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1389 JvSwingUtils.wrapTooltip(true,
1390 MessageManager.getString("label.chimera_missing")),
1391 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1392 null, options, options[0]);
1393 if (showHelp == JvOptionPane.NO_OPTION)
1397 Help.showHelpWindow(HelpId.StructureViewer);
1398 } catch (HelpSetException e)
1400 e.printStackTrace();
1406 public class OptionsParam
1408 private String name;
1410 private String code;
1412 public OptionsParam(String name, String code)
1418 public String getName()
1423 public void setName(String name)
1428 public String getCode()
1433 public void setCode(String code)
1439 public String toString()
1445 public boolean equals(Object that)
1447 if (!(that instanceof OptionsParam))
1451 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1455 public int hashCode()
1457 return name.hashCode() + code.hashCode();
1461 private class UrlListSelectionHandler implements ListSelectionListener
1465 public void valueChanged(ListSelectionEvent e)
1467 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1469 int index = lsm.getMinSelectionIndex();
1472 // no selection, so disable delete/edit buttons
1473 editLink.setEnabled(false);
1474 deleteLink.setEnabled(false);
1477 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1479 // enable/disable edit and delete link buttons
1480 if (((UrlLinkTableModel) linkUrlTable.getModel())
1481 .isRowDeletable(modelIndex))
1483 deleteLink.setEnabled(true);
1487 deleteLink.setEnabled(false);
1490 if (((UrlLinkTableModel) linkUrlTable.getModel())
1491 .isRowEditable(modelIndex))
1493 editLink.setEnabled(true);
1497 editLink.setEnabled(false);