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.bin.Jalview;
26 import jalview.gui.Help.HelpId;
27 import jalview.gui.StructureViewer.ViewerType;
28 import jalview.io.FileFormatI;
29 import jalview.io.JalviewFileChooser;
30 import jalview.io.JalviewFileView;
31 import jalview.jbgui.GPreferences;
32 import jalview.jbgui.GSequenceLink;
33 import jalview.schemes.ColourSchemeI;
34 import jalview.schemes.ColourSchemes;
35 import jalview.schemes.ResidueColourScheme;
36 import jalview.urls.UrlLinkTableModel;
37 import jalview.urls.api.UrlProviderFactoryI;
38 import jalview.urls.api.UrlProviderI;
39 import jalview.urls.desktop.DesktopUrlProviderFactory;
40 import jalview.util.MessageManager;
41 import jalview.util.Platform;
42 import jalview.util.UrlConstants;
43 import jalview.ws.sifts.SiftsSettings;
45 import java.awt.BorderLayout;
46 import java.awt.Color;
47 import java.awt.Component;
48 import java.awt.Dimension;
50 import java.awt.event.ActionEvent;
51 import java.awt.event.ActionListener;
52 import java.awt.event.MouseEvent;
54 import java.util.ArrayList;
55 import java.util.List;
57 import javax.help.HelpSetException;
58 import javax.swing.JComboBox;
59 import javax.swing.JFileChooser;
60 import javax.swing.JInternalFrame;
61 import javax.swing.JPanel;
62 import javax.swing.ListSelectionModel;
63 import javax.swing.RowFilter;
64 import javax.swing.RowSorter;
65 import javax.swing.SortOrder;
66 import javax.swing.event.DocumentEvent;
67 import javax.swing.event.DocumentListener;
68 import javax.swing.event.ListSelectionEvent;
69 import javax.swing.event.ListSelectionListener;
70 import javax.swing.table.TableCellRenderer;
71 import javax.swing.table.TableColumn;
72 import javax.swing.table.TableModel;
73 import javax.swing.table.TableRowSorter;
75 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
83 public class Preferences extends GPreferences
85 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
87 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
89 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
91 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
93 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
95 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
97 public static final String ADD_SS_ANN = "ADD_SS_ANN";
99 public static final String USE_RNAVIEW = "USE_RNAVIEW";
101 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
103 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
105 public static final String CHIMERA_PATH = "CHIMERA_PATH";
107 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
109 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
111 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
113 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
115 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
117 public static final String GAP_COLOUR = "GAP_COLOUR";
119 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
121 private static final int MIN_FONT_SIZE = 1;
123 private static final int MAX_FONT_SIZE = 30;
126 * Holds name and link separated with | character. Sequence ID must be
127 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
129 public static UrlProviderI sequenceUrlLinks;
131 public static UrlLinkTableModel dataModel;
134 * Holds name and link separated with | character. Sequence IDS and Sequences
135 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
136 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
137 * for first and second token specified after a pipe character at end |,|.
138 * (TODO: proper escape for using | to separate ids or sequences
141 public static List<String> groupURLLinks;
144 // get links selected to be in the menu (SEQUENCE_LINKS)
145 // and links entered by the user but not selected (STORED_LINKS)
146 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
147 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
148 String defaultUrl = Cache.getDefault("DEFAULT_URL",
149 UrlConstants.DEFAULT_LABEL);
151 // if both links lists are empty, add the DEFAULT_URL link
152 // otherwise we assume the default link is in one of the lists
153 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
155 inMenuString = UrlConstants.DEFAULT_STRING;
157 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
158 inMenuString, notInMenuString);
159 sequenceUrlLinks = factory.createUrlProvider();
160 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
163 * TODO: reformulate groupURL encoding so two or more can be stored in the
164 * .properties file as '|' separated strings
167 groupURLLinks = new ArrayList<>();
170 JInternalFrame frame;
172 private WsPreferences wsPrefs;
174 private OptionsParam promptEachTimeOpt = new OptionsParam(
175 MessageManager.getString("label.prompt_each_time"),
178 private OptionsParam lineArtOpt = new OptionsParam(
179 MessageManager.getString("label.lineart"), "Lineart");
181 private OptionsParam textOpt = new OptionsParam(
182 MessageManager.getString("action.text"), "Text");
185 * Creates a new Preferences object.
190 frame = new JInternalFrame();
191 frame.setContentPane(this);
194 wsPrefs = new WsPreferences();
195 wsTab.add(wsPrefs, BorderLayout.CENTER);
197 int width = 500, height = 450;
198 if (Platform.isAMac())
204 Desktop.addInternalFrame(frame,
205 MessageManager.getString("label.preferences"), width, height);
206 frame.setMinimumSize(new Dimension(width, height));
209 * Set Visual tab defaults
211 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
212 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
213 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
214 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
216 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
217 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
218 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
219 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
221 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
222 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
224 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
225 showGroupConservation.setSelected(
226 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
227 showConsensHistogram.setSelected(
228 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
230 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
232 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
234 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
236 String[] fonts = java.awt.GraphicsEnvironment
237 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
238 for (int i = 0; i < fonts.length; i++)
240 fontNameCB.addItem(fonts[i]);
243 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
245 fontSizeCB.addItem(i + "");
248 fontStyleCB.addItem("plain");
249 fontStyleCB.addItem("bold");
250 fontStyleCB.addItem("italic");
252 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
253 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
254 fontStyleCB.setSelectedItem(
255 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
257 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
259 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
261 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
263 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
265 gapSymbolCB.addItem("-");
266 gapSymbolCB.addItem(".");
268 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
270 sortby.addItem("No sort");
271 sortby.addItem("Id");
272 sortby.addItem("Pairwise Identity");
273 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
275 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
277 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
279 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
280 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
281 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
282 SequenceAnnotationOrder.NONE.name()));
283 sortAnnBy.setSelectedItem(savedSort.toString());
285 sortAutocalc.addItem("Autocalculated first");
286 sortAutocalc.addItem("Autocalculated last");
287 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
288 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
289 : sortAutocalc.getItemAt(1));
291 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
292 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
293 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
294 + "/examples/exampleFile_2_3.jar"));
297 * Set Colours tab defaults
299 protColour.addItem(ResidueColourScheme.NONE);
300 nucColour.addItem(ResidueColourScheme.NONE);
301 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
303 String name = cs.getSchemeName();
304 protColour.addItem(name);
305 nucColour.addItem(name);
307 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
308 ResidueColourScheme.NONE);
309 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
310 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
311 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
312 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
313 minColour.setBackground(
314 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
315 maxColour.setBackground(
316 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
319 * Set overview panel defaults
321 gapColour.setBackground(
322 Cache.getDefaultColour(GAP_COLOUR,
323 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
324 hiddenColour.setBackground(
325 Cache.getDefaultColour(HIDDEN_COLOUR,
326 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
327 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
328 gapLabel.setEnabled(!useLegacyGap.isSelected());
329 gapColour.setEnabled(!useLegacyGap.isSelected());
331 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, true));
334 * Set Structure tab defaults.
336 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
337 structFromPdb.setSelected(structSelected);
338 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
339 useRnaView.setEnabled(structSelected);
340 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
341 addSecondaryStructure.setEnabled(structSelected);
342 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
343 addTempFactor.setEnabled(structSelected);
344 structViewer.setSelectedItem(
345 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
346 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
347 chimeraPath.addActionListener(new ActionListener()
350 public void actionPerformed(ActionEvent e)
352 validateChimeraPath();
356 if (Cache.getDefault("MAP_WITH_SIFTS", false))
358 siftsMapping.setSelected(true);
362 nwMapping.setSelected(true);
366 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
369 * Set Connections tab defaults
373 linkUrlTable.setModel(dataModel);
374 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
375 linkUrlTable.getModel());
376 linkUrlTable.setRowSorter(sorter);
377 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
379 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
380 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
381 SortOrder.DESCENDING));
382 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
383 SortOrder.DESCENDING));
385 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
387 sorter.setSortKeys(sortKeys);
388 // BH 2018 setSortKeys will do the sort
392 ActionListener onReset;
393 onReset = new ActionListener()
396 public void actionPerformed(ActionEvent e)
398 filterTB.setText("");
399 sorter.setRowFilter(RowFilter.regexFilter(""));
403 doReset.addActionListener(onReset);
405 // filter to display only custom urls
406 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
409 public boolean include(
410 Entry<? extends TableModel, ? extends Object> entry)
412 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
416 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
417 linkUrlTable.getModel());
418 customSorter.setRowFilter(customUrlFilter);
420 ActionListener onCustomOnly;
421 onCustomOnly = new ActionListener()
424 public void actionPerformed(ActionEvent e)
426 filterTB.setText("");
427 sorter.setRowFilter(customUrlFilter);
430 userOnly.addActionListener(onCustomOnly);
432 filterTB.getDocument().addDocumentListener(new DocumentListener()
434 String caseInsensitiveFlag = "(?i)";
437 public void changedUpdate(DocumentEvent e)
439 sorter.setRowFilter(RowFilter
440 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
444 public void removeUpdate(DocumentEvent e)
446 sorter.setRowFilter(RowFilter
447 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
451 public void insertUpdate(DocumentEvent e)
453 sorter.setRowFilter(RowFilter
454 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
458 // set up list selection functionality
459 linkUrlTable.getSelectionModel()
460 .addListSelectionListener(new UrlListSelectionHandler());
462 // set up radio buttons
463 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
465 String onClickName = linkUrlTable.getColumnName(onClickCol);
466 linkUrlTable.getColumn(onClickName)
467 .setCellRenderer(new RadioButtonRenderer());
468 linkUrlTable.getColumn(onClickName)
469 .setCellEditor(new RadioButtonEditor());
471 // get boolean columns and resize those to min possible
472 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
474 if (linkUrlTable.getModel().getColumnClass(column)
475 .equals(Boolean.class))
477 TableColumn tableColumn = linkUrlTable.getColumnModel()
479 int preferredWidth = tableColumn.getMinWidth();
481 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
483 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
484 int cwidth = c.getPreferredSize().width
485 + linkUrlTable.getIntercellSpacing().width;
486 preferredWidth = Math.max(preferredWidth, cwidth);
488 tableColumn.setPreferredWidth(preferredWidth);
492 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
493 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
494 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
495 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
497 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
499 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
500 // note antisense here: default is true
502 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
503 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
506 * Set Output tab defaults
508 setupOutputCombo(epsRendering, "EPS_RENDERING");
509 setupOutputCombo(htmlRendering, "HTML_RENDERING");
510 setupOutputCombo(svgRendering, "SVG_RENDERING");
511 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
512 userIdWidth.setEnabled(!autoIdWidth.isSelected());
513 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
514 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
515 userIdWidth.setText(wi == null ? "" : wi.toString());
516 // TODO: refactor to use common enum via FormatAdapter and allow extension
517 // for new flat file formats
518 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
519 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
520 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
521 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
522 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
523 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
524 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
525 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
527 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
530 * Set Editing tab defaults
532 autoCalculateConsCheck
533 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
534 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
535 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
537 annotations_actionPerformed(null); // update the display of the annotation
542 * A helper method that sets the items and initial selection in a character
543 * rendering option list (Prompt each time/Lineart/Text)
548 protected void setupOutputCombo(JComboBox<Object> comboBox,
551 comboBox.addItem(promptEachTimeOpt);
552 comboBox.addItem(lineArtOpt);
553 comboBox.addItem(textOpt);
554 String defaultOption = Cache.getDefault(propertyKey,
556 if (defaultOption.equalsIgnoreCase("Text"))
558 comboBox.setSelectedItem(textOpt);
560 else if (defaultOption.equalsIgnoreCase("Lineart"))
562 comboBox.setSelectedItem(lineArtOpt);
566 comboBox.setSelectedItem(promptEachTimeOpt);
571 * Save user selections on the Preferences tabs to the Cache and write out to
577 public void ok_actionPerformed(ActionEvent e)
579 if (!validateSettings())
585 * Save Visual settings
587 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
588 Boolean.toString(seqLimit.isSelected()));
589 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
590 Boolean.toString(rightAlign.isSelected()));
591 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
592 Boolean.toString(fullScreen.isSelected()));
593 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
594 Boolean.toString(openoverv.isSelected()));
595 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
596 Boolean.toString(annotations.isSelected()));
597 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
598 Boolean.toString(conservation.isSelected()));
599 Cache.applicationProperties.setProperty("SHOW_QUALITY",
600 Boolean.toString(quality.isSelected()));
601 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
602 Boolean.toString(identity.isSelected()));
604 Cache.applicationProperties.setProperty("GAP_SYMBOL",
605 gapSymbolCB.getSelectedItem().toString());
607 Cache.applicationProperties.setProperty("FONT_NAME",
608 fontNameCB.getSelectedItem().toString());
609 Cache.applicationProperties.setProperty("FONT_STYLE",
610 fontStyleCB.getSelectedItem().toString());
611 Cache.applicationProperties.setProperty("FONT_SIZE",
612 fontSizeCB.getSelectedItem().toString());
614 Cache.applicationProperties.setProperty("ID_ITALICS",
615 Boolean.toString(idItalics.isSelected()));
616 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
617 Boolean.toString(showUnconserved.isSelected()));
618 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
619 Boolean.toString(showOccupancy.isSelected()));
620 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
621 Boolean.toString(showGroupConsensus.isSelected()));
622 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
623 Boolean.toString(showGroupConservation.isSelected()));
624 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
625 Boolean.toString(showConsensHistogram.isSelected()));
626 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
627 Boolean.toString(showConsensLogo.isSelected()));
628 Cache.applicationProperties.setProperty("ANTI_ALIAS",
629 Boolean.toString(smoothFont.isSelected()));
630 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
631 Boolean.toString(scaleProteinToCdna.isSelected()));
632 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
633 Boolean.toString(showNpTooltip.isSelected()));
634 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
635 Boolean.toString(showDbRefTooltip.isSelected()));
637 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
638 Boolean.toString(wrap.isSelected()));
640 Cache.applicationProperties.setProperty("STARTUP_FILE",
641 startupFileTextfield.getText());
642 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
643 Boolean.toString(startupCheckbox.isSelected()));
645 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
646 sortby.getSelectedItem().toString());
648 // convert description of sort order to enum name for save
649 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
650 .forDescription(sortAnnBy.getSelectedItem().toString());
651 if (annSortOrder != null)
653 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
654 annSortOrder.name());
657 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
658 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
659 Boolean.valueOf(showAutocalcFirst).toString());
662 * Save Colours settings
664 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
665 protColour.getSelectedItem().toString());
666 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
667 nucColour.getSelectedItem().toString());
668 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
669 minColour.getBackground());
670 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
671 maxColour.getBackground());
674 * Save Overview settings
676 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
677 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
678 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
679 Boolean.toString(useLegacyGap.isSelected()));
680 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
681 Boolean.toString(showHiddenAtStart.isSelected()));
684 * Save Structure settings
686 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
687 Boolean.toString(addTempFactor.isSelected()));
688 Cache.applicationProperties.setProperty(ADD_SS_ANN,
689 Boolean.toString(addSecondaryStructure.isSelected()));
690 Cache.applicationProperties.setProperty(USE_RNAVIEW,
691 Boolean.toString(useRnaView.isSelected()));
692 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
693 Boolean.toString(structFromPdb.isSelected()));
694 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
695 structViewer.getSelectedItem().toString());
696 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
697 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
698 Boolean.toString(siftsMapping.isSelected()));
699 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
702 * Save Output settings
704 Cache.applicationProperties.setProperty("EPS_RENDERING",
705 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
706 Cache.applicationProperties.setProperty("HTML_RENDERING",
707 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
708 Cache.applicationProperties.setProperty("SVG_RENDERING",
709 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
712 * Save Connections settings
714 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
716 jalview.util.BrowserLauncher.resetBrowser();
718 // save user-defined and selected links
719 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
720 if (menuLinks.isEmpty())
722 Cache.applicationProperties.remove("SEQUENCE_LINKS");
726 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
727 menuLinks.toString());
730 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
731 if (nonMenuLinks.isEmpty())
733 Cache.applicationProperties.remove("STORED_LINKS");
737 Cache.applicationProperties.setProperty("STORED_LINKS",
738 nonMenuLinks.toString());
741 Cache.applicationProperties.setProperty("DEFAULT_URL",
742 sequenceUrlLinks.getPrimaryUrlId());
744 Cache.applicationProperties.setProperty("USE_PROXY",
745 Boolean.toString(useProxy.isSelected()));
747 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
749 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
751 if (useProxy.isSelected())
753 System.setProperty("http.proxyHost", proxyServerTB.getText());
754 System.setProperty("http.proxyPort", proxyPortTB.getText());
758 System.setProperty("http.proxyHost", "");
759 System.setProperty("http.proxyPort", "");
761 Cache.setProperty("VERSION_CHECK",
762 Boolean.toString(versioncheck.isSelected()));
763 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
765 // default is false - we only set this if the user has actively agreed
766 Cache.setProperty("USAGESTATS",
767 Boolean.toString(usagestats.isSelected()));
769 if (!questionnaire.isSelected())
771 Cache.setProperty("NOQUESTIONNAIRES", "true");
775 // special - made easy to edit a property file to disable questionnaires
776 // by just adding the given line
777 Cache.removeProperty("NOQUESTIONNAIRES");
781 * Save Output settings
783 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
784 Boolean.toString(blcjv.isSelected()));
785 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
786 Boolean.toString(clustaljv.isSelected()));
787 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
788 Boolean.toString(fastajv.isSelected()));
789 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
790 Boolean.toString(msfjv.isSelected()));
791 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
792 Boolean.toString(pfamjv.isSelected()));
793 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
794 Boolean.toString(pileupjv.isSelected()));
795 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
796 Boolean.toString(pirjv.isSelected()));
797 Cache.applicationProperties.setProperty("PIR_MODELLER",
798 Boolean.toString(modellerOutput.isSelected()));
799 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
800 Boolean.toString(embbedBioJSON.isSelected()));
801 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
803 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
804 Boolean.toString(autoIdWidth.isSelected()));
805 userIdWidth_actionPerformed();
806 Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
807 userIdWidth.getText());
810 * Save Editing settings
812 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
813 Boolean.toString(autoCalculateConsCheck.isSelected()));
814 Cache.applicationProperties.setProperty("SORT_BY_TREE",
815 Boolean.toString(sortByTree.isSelected()));
816 Cache.applicationProperties.setProperty("PAD_GAPS",
817 Boolean.toString(padGaps.isSelected()));
821 wsPrefs.updateAndRefreshWsMenuConfig(false);
823 Cache.saveProperties();
824 Desktop.instance.doConfigureStructurePrefs();
827 frame.setClosed(true);
828 } catch (Exception ex)
834 * Do any necessary validation before saving settings. Return focus to the
835 * first tab which fails validation.
839 private boolean validateSettings()
841 if (!validateStructure())
843 structureTab.requestFocusInWindow();
850 protected boolean validateStructure()
852 return validateChimeraPath();
860 public void startupFileTextfield_mouseClicked()
862 // TODO: JAL-3048 not needed for Jalview-JS
863 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
864 JalviewFileChooser chooser = JalviewFileChooser
865 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
866 chooser.setFileView(new JalviewFileView());
867 chooser.setDialogTitle(
868 MessageManager.getString("label.select_startup_file"));
870 int value = chooser.showOpenDialog(this);
872 if (value == JalviewFileChooser.APPROVE_OPTION)
874 FileFormatI format = chooser.getSelectedFormat();
877 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
881 .setText(chooser.getSelectedFile().getAbsolutePath());
892 public void cancel_actionPerformed(ActionEvent e)
898 wsPrefs.updateWsMenuConfig(true);
899 wsPrefs.refreshWs_actionPerformed(e);
901 frame.setClosed(true);
902 } catch (Exception ex)
914 public void annotations_actionPerformed(ActionEvent e)
916 conservation.setEnabled(annotations.isSelected());
917 quality.setEnabled(annotations.isSelected());
918 identity.setEnabled(annotations.isSelected());
919 showOccupancy.setEnabled(annotations.isSelected());
920 showGroupConsensus.setEnabled(annotations.isSelected());
921 showGroupConservation.setEnabled(annotations.isSelected());
922 showConsensHistogram.setEnabled(annotations.isSelected()
923 && (identity.isSelected() || showGroupConsensus.isSelected()));
924 showConsensLogo.setEnabled(annotations.isSelected()
925 && (identity.isSelected() || showGroupConsensus.isSelected()));
929 public void newLink_actionPerformed(ActionEvent e)
931 GSequenceLink link = new GSequenceLink();
932 boolean valid = false;
935 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
936 MessageManager.getString("label.new_sequence_url_link"),
937 JvOptionPane.OK_CANCEL_OPTION, -1,
938 null) == JvOptionPane.OK_OPTION)
940 if (link.checkValid())
942 if (((UrlLinkTableModel) linkUrlTable.getModel())
943 .isUniqueName(link.getName()))
945 ((UrlLinkTableModel) linkUrlTable.getModel())
946 .insertRow(link.getName(), link.getURL());
951 link.notifyDuplicate();
964 public void editLink_actionPerformed(ActionEvent e)
966 GSequenceLink link = new GSequenceLink();
968 int index = linkUrlTable.getSelectedRow();
971 // button no longer enabled if row is not selected
972 Cache.log.debug("Edit with no row selected in linkUrlTable");
976 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
978 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
980 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
981 link.setName(oldName);
982 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
984 boolean valid = false;
987 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
988 MessageManager.getString("label.edit_sequence_url_link"),
989 JvOptionPane.OK_CANCEL_OPTION, -1,
990 null) == JvOptionPane.OK_OPTION)
992 if (link.checkValid())
994 if ((oldName.equals(link.getName()))
995 || (((UrlLinkTableModel) linkUrlTable.getModel())
996 .isUniqueName(link.getName())))
998 linkUrlTable.setValueAt(link.getName(), index, nameCol);
999 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1004 link.notifyDuplicate();
1017 public void deleteLink_actionPerformed(ActionEvent e)
1019 int index = linkUrlTable.getSelectedRow();
1020 int modelIndex = -1;
1023 // button no longer enabled if row is not selected
1024 Cache.log.debug("Delete with no row selected in linkUrlTable");
1029 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1032 // make sure we use the model index to delete, and not the table index
1033 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1037 public void defaultBrowser_mouseClicked(MouseEvent e)
1039 // TODO: JAL-3048 not needed for j2s
1044 JFileChooser chooser = new JFileChooser(".");
1045 chooser.setDialogTitle(
1046 MessageManager.getString("label.select_default_browser"));
1048 int value = chooser.showOpenDialog(this);
1050 if (value == JFileChooser.APPROVE_OPTION)
1052 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1061 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1065 protected void showunconserved_actionPerformed(ActionEvent e)
1067 // TODO Auto-generated method stub
1068 super.showunconserved_actionPerformed(e);
1071 public static List<String> getGroupURLLinks()
1073 return groupURLLinks;
1077 public void minColour_actionPerformed(JPanel panel)
1079 JalviewColourChooser.showColourChooser(this,
1080 MessageManager.getString("label.select_colour_minimum_value"),
1085 public void maxColour_actionPerformed(JPanel panel)
1087 JalviewColourChooser.showColourChooser(this,
1088 MessageManager.getString("label.select_colour_maximum_value"),
1093 public void gapColour_actionPerformed(JPanel gap)
1095 if (!useLegacyGap.isSelected())
1097 JalviewColourChooser.showColourChooser(this,
1098 MessageManager.getString("label.select_gap_colour"),
1104 public void hiddenColour_actionPerformed(JPanel hidden)
1106 JalviewColourChooser.showColourChooser(this,
1107 MessageManager.getString("label.select_hidden_colour"),
1112 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1114 boolean enabled = useLegacyGap.isSelected();
1117 gapColour.setBackground(
1118 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1122 gapColour.setBackground(
1123 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1125 gapColour.setEnabled(!enabled);
1126 gapLabel.setEnabled(!enabled);
1130 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1132 useLegacyGap.setSelected(false);
1133 useLegacyGaps_actionPerformed(null);
1134 showHiddenAtStart.setSelected(true);
1135 hiddenColour.setBackground(
1136 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1140 protected void userIdWidth_actionPerformed()
1144 String val = userIdWidth.getText().trim();
1145 if (val.length() > 0)
1147 Integer iw = Integer.parseInt(val);
1148 if (iw.intValue() < 12)
1150 throw new NumberFormatException();
1152 userIdWidth.setText(iw.toString());
1154 } catch (NumberFormatException x)
1156 userIdWidth.setText("");
1157 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1159 .getString("warn.user_defined_width_requirements"),
1160 MessageManager.getString("label.invalid_id_column_width"),
1161 JvOptionPane.WARNING_MESSAGE);
1166 protected void autoIdWidth_actionPerformed()
1168 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1169 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1173 * Returns true if chimera path is to a valid executable, else show an error
1176 private boolean validateChimeraPath()
1178 if (chimeraPath.getText().trim().length() > 0)
1180 File f = new File(chimeraPath.getText());
1181 if (!f.canExecute())
1183 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1184 MessageManager.getString("label.invalid_chimera_path"),
1185 MessageManager.getString("label.invalid_name"),
1186 JvOptionPane.ERROR_MESSAGE);
1194 * If Chimera is selected, check it can be found on default or user-specified
1195 * path, if not show a warning/help dialog.
1198 protected void structureViewer_actionPerformed(String selectedItem)
1200 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1204 boolean found = false;
1207 * Try user-specified and standard paths for Chimera executable.
1209 List<String> paths = StructureManager.getChimeraPaths();
1210 paths.add(0, chimeraPath.getText());
1211 for (String path : paths)
1213 if (new File(path.trim()).canExecute())
1221 String[] options = { "OK", "Help" };
1222 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1223 JvSwingUtils.wrapTooltip(true,
1224 MessageManager.getString("label.chimera_missing")),
1225 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1226 null, options, options[0]);
1227 if (showHelp == JvOptionPane.NO_OPTION)
1231 Help.showHelpWindow(HelpId.StructureViewer);
1232 } catch (HelpSetException e)
1234 e.printStackTrace();
1240 public class OptionsParam
1242 private String name;
1244 private String code;
1246 public OptionsParam(String name, String code)
1252 public String getName()
1257 public void setName(String name)
1262 public String getCode()
1267 public void setCode(String code)
1273 public String toString()
1279 public boolean equals(Object that)
1281 if (!(that instanceof OptionsParam))
1285 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1289 public int hashCode()
1291 return name.hashCode() + code.hashCode();
1295 private class UrlListSelectionHandler implements ListSelectionListener
1299 public void valueChanged(ListSelectionEvent e)
1301 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1303 int index = lsm.getMinSelectionIndex();
1306 // no selection, so disable delete/edit buttons
1307 editLink.setEnabled(false);
1308 deleteLink.setEnabled(false);
1311 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1313 // enable/disable edit and delete link buttons
1314 if (((UrlLinkTableModel) linkUrlTable.getModel())
1315 .isRowDeletable(modelIndex))
1317 deleteLink.setEnabled(true);
1321 deleteLink.setEnabled(false);
1324 if (((UrlLinkTableModel) linkUrlTable.getModel())
1325 .isRowEditable(modelIndex))
1327 editLink.setEnabled(true);
1331 editLink.setEnabled(false);