2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
24 import jalview.bin.Cache;
25 import jalview.gui.Help.HelpId;
26 import jalview.gui.StructureViewer.ViewerType;
27 import jalview.io.FileFormatI;
28 import jalview.io.JalviewFileChooser;
29 import jalview.io.JalviewFileView;
30 import jalview.jbgui.GPreferences;
31 import jalview.jbgui.GSequenceLink;
32 import jalview.schemes.ColourSchemeI;
33 import jalview.schemes.ColourSchemes;
34 import jalview.schemes.ResidueColourScheme;
35 import jalview.urls.UrlLinkTableModel;
36 import jalview.urls.api.UrlProviderFactoryI;
37 import jalview.urls.api.UrlProviderI;
38 import jalview.urls.desktop.DesktopUrlProviderFactory;
39 import jalview.util.MessageManager;
40 import jalview.util.Platform;
41 import jalview.util.UrlConstants;
42 import jalview.ws.sifts.SiftsSettings;
44 import java.awt.BorderLayout;
45 import java.awt.Color;
46 import java.awt.Component;
47 import java.awt.Dimension;
49 import java.awt.event.ActionEvent;
50 import java.awt.event.ActionListener;
51 import java.awt.event.MouseEvent;
53 import java.util.ArrayList;
54 import java.util.List;
56 import javax.help.HelpSetException;
57 import javax.swing.JColorChooser;
58 import javax.swing.JFileChooser;
59 import javax.swing.JInternalFrame;
60 import javax.swing.JPanel;
61 import javax.swing.ListSelectionModel;
62 import javax.swing.RowFilter;
63 import javax.swing.RowSorter;
64 import javax.swing.SortOrder;
65 import javax.swing.event.DocumentEvent;
66 import javax.swing.event.DocumentListener;
67 import javax.swing.event.ListSelectionEvent;
68 import javax.swing.event.ListSelectionListener;
69 import javax.swing.table.TableCellRenderer;
70 import javax.swing.table.TableColumn;
71 import javax.swing.table.TableModel;
72 import javax.swing.table.TableRowSorter;
74 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
82 public class Preferences extends GPreferences
84 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
86 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
88 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
90 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
92 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
94 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
96 public static final String ADD_SS_ANN = "ADD_SS_ANN";
98 public static final String USE_RNAVIEW = "USE_RNAVIEW";
100 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
102 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
104 public static final String CHIMERA_PATH = "CHIMERA_PATH";
106 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
108 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
110 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
112 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
114 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
116 public static final String GAP_COLOUR = "GAP_COLOUR";
118 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
120 private static final int MIN_FONT_SIZE = 1;
122 private static final int MAX_FONT_SIZE = 30;
125 * Holds name and link separated with | character. Sequence ID must be
126 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
128 public static UrlProviderI sequenceUrlLinks;
130 public static UrlLinkTableModel dataModel;
133 * Holds name and link separated with | character. Sequence IDS and Sequences
134 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
135 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
136 * for first and second token specified after a pipe character at end |,|.
137 * (TODO: proper escape for using | to separate ids or sequences
140 public static List<String> groupURLLinks;
143 // get links selected to be in the menu (SEQUENCE_LINKS)
144 // and links entered by the user but not selected (STORED_LINKS)
145 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
146 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
147 String defaultUrl = Cache.getDefault("DEFAULT_URL",
148 UrlConstants.DEFAULT_LABEL);
150 // if both links lists are empty, add the DEFAULT_URL link
151 // otherwise we assume the default link is in one of the lists
152 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
154 inMenuString = UrlConstants.DEFAULT_STRING;
156 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
157 inMenuString, notInMenuString);
158 sequenceUrlLinks = factory.createUrlProvider();
159 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
162 * TODO: reformulate groupURL encoding so two or more can be stored in the
163 * .properties file as '|' separated strings
166 groupURLLinks = new ArrayList<>();
169 JInternalFrame frame;
171 DasSourceBrowser dasSource;
173 private WsPreferences wsPrefs;
175 private OptionsParam promptEachTimeOpt = new OptionsParam(
176 MessageManager.getString("label.prompt_each_time"),
179 private OptionsParam lineArtOpt = new OptionsParam(
180 MessageManager.getString("label.lineart"), "Lineart");
182 private OptionsParam textOpt = new OptionsParam(
183 MessageManager.getString("action.text"), "Text");
186 * Creates a new Preferences object.
191 frame = new JInternalFrame();
192 frame.setContentPane(this);
193 dasSource = new DasSourceBrowser();
194 dasTab.add(dasSource, BorderLayout.CENTER);
195 wsPrefs = new WsPreferences();
196 wsTab.add(wsPrefs, BorderLayout.CENTER);
197 int width = 500, height = 450;
198 new jalview.util.Platform();
199 if (Platform.isAMac())
205 Desktop.addInternalFrame(frame,
206 MessageManager.getString("label.preferences"), width, height);
207 frame.setMinimumSize(new Dimension(width, height));
210 * Set Visual tab defaults
212 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
213 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
214 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
215 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
217 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
218 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
219 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
220 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
222 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
223 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
225 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
226 showGroupConservation.setSelected(
227 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
228 showConsensHistogram.setSelected(
229 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
231 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
233 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
235 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
237 String[] fonts = java.awt.GraphicsEnvironment
238 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
239 for (int i = 0; i < fonts.length; i++)
241 fontNameCB.addItem(fonts[i]);
244 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
246 fontSizeCB.addItem(i + "");
249 fontStyleCB.addItem("plain");
250 fontStyleCB.addItem("bold");
251 fontStyleCB.addItem("italic");
253 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
254 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
255 fontStyleCB.setSelectedItem(
256 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
258 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
260 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
262 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
264 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
266 gapSymbolCB.addItem("-");
267 gapSymbolCB.addItem(".");
269 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
271 sortby.addItem("No sort");
272 sortby.addItem("Id");
273 sortby.addItem("Pairwise Identity");
274 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
276 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
278 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
280 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
281 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
282 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
283 SequenceAnnotationOrder.NONE.name()));
284 sortAnnBy.setSelectedItem(savedSort.toString());
286 sortAutocalc.addItem("Autocalculated first");
287 sortAutocalc.addItem("Autocalculated last");
288 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
289 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
290 : sortAutocalc.getItemAt(1));
292 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
293 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
294 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
295 + "/examples/exampleFile_2_3.jar"));
298 * Set Colours tab defaults
300 protColour.addItem(ResidueColourScheme.NONE);
301 nucColour.addItem(ResidueColourScheme.NONE);
302 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
304 String name = cs.getSchemeName();
305 protColour.addItem(name);
306 nucColour.addItem(name);
308 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
309 ResidueColourScheme.NONE);
310 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
311 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
312 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
313 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
314 minColour.setBackground(
315 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
316 maxColour.setBackground(
317 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
320 * Set overview panel defaults
322 gapColour.setBackground(
323 Cache.getDefaultColour(GAP_COLOUR,
324 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
325 hiddenColour.setBackground(
326 Cache.getDefaultColour(HIDDEN_COLOUR,
327 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
328 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
329 gapLabel.setEnabled(!useLegacyGap.isSelected());
330 gapColour.setEnabled(!useLegacyGap.isSelected());
332 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, true));
335 * Set Structure tab defaults.
337 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
338 structFromPdb.setSelected(structSelected);
339 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
340 useRnaView.setEnabled(structSelected);
341 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
342 addSecondaryStructure.setEnabled(structSelected);
343 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
344 addTempFactor.setEnabled(structSelected);
345 structViewer.setSelectedItem(
346 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
347 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
348 chimeraPath.addActionListener(new ActionListener()
351 public void actionPerformed(ActionEvent e)
353 validateChimeraPath();
357 if (Cache.getDefault("MAP_WITH_SIFTS", false))
359 siftsMapping.setSelected(true);
363 nwMapping.setSelected(true);
367 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
370 * Set Connections tab defaults
374 linkUrlTable.setModel(dataModel);
375 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
376 linkUrlTable.getModel());
377 linkUrlTable.setRowSorter(sorter);
378 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
380 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
381 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
382 SortOrder.DESCENDING));
383 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
384 SortOrder.DESCENDING));
386 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
388 sorter.setSortKeys(sortKeys);
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 epsRendering.addItem(promptEachTimeOpt);
509 epsRendering.addItem(lineArtOpt);
510 epsRendering.addItem(textOpt);
511 String defaultEPS = Cache.getDefault("EPS_RENDERING",
513 if (defaultEPS.equalsIgnoreCase("Text"))
515 epsRendering.setSelectedItem(textOpt);
517 else if (defaultEPS.equalsIgnoreCase("Lineart"))
519 epsRendering.setSelectedItem(lineArtOpt);
523 epsRendering.setSelectedItem(promptEachTimeOpt);
525 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
526 userIdWidth.setEnabled(!autoIdWidth.isSelected());
527 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
528 Integer wi = Cache.getIntegerProperty("FIGURE_USERIDWIDTH");
529 userIdWidth.setText(wi == null ? "" : wi.toString());
530 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
531 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
532 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
533 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
534 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
535 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
536 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
537 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
539 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
542 * Set Editing tab defaults
544 autoCalculateConsCheck
545 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
546 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
547 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
549 annotations_actionPerformed(null); // update the display of the annotation
554 * Save user selections on the Preferences tabs to the Cache and write out to
560 public void ok_actionPerformed(ActionEvent e)
562 if (!validateSettings())
568 * Save Visual settings
570 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
571 Boolean.toString(seqLimit.isSelected()));
572 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
573 Boolean.toString(rightAlign.isSelected()));
574 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
575 Boolean.toString(fullScreen.isSelected()));
576 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
577 Boolean.toString(openoverv.isSelected()));
578 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
579 Boolean.toString(annotations.isSelected()));
580 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
581 Boolean.toString(conservation.isSelected()));
582 Cache.applicationProperties.setProperty("SHOW_QUALITY",
583 Boolean.toString(quality.isSelected()));
584 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
585 Boolean.toString(identity.isSelected()));
587 Cache.applicationProperties.setProperty("GAP_SYMBOL",
588 gapSymbolCB.getSelectedItem().toString());
590 Cache.applicationProperties.setProperty("FONT_NAME",
591 fontNameCB.getSelectedItem().toString());
592 Cache.applicationProperties.setProperty("FONT_STYLE",
593 fontStyleCB.getSelectedItem().toString());
594 Cache.applicationProperties.setProperty("FONT_SIZE",
595 fontSizeCB.getSelectedItem().toString());
597 Cache.applicationProperties.setProperty("ID_ITALICS",
598 Boolean.toString(idItalics.isSelected()));
599 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
600 Boolean.toString(showUnconserved.isSelected()));
601 Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
602 Boolean.toString(showOccupancy.isSelected()));
603 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
604 Boolean.toString(showGroupConsensus.isSelected()));
605 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
606 Boolean.toString(showGroupConservation.isSelected()));
607 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
608 Boolean.toString(showConsensHistogram.isSelected()));
609 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
610 Boolean.toString(showConsensLogo.isSelected()));
611 Cache.applicationProperties.setProperty("ANTI_ALIAS",
612 Boolean.toString(smoothFont.isSelected()));
613 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
614 Boolean.toString(scaleProteinToCdna.isSelected()));
615 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
616 Boolean.toString(showNpTooltip.isSelected()));
617 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
618 Boolean.toString(showDbRefTooltip.isSelected()));
620 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
621 Boolean.toString(wrap.isSelected()));
623 Cache.applicationProperties.setProperty("STARTUP_FILE",
624 startupFileTextfield.getText());
625 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
626 Boolean.toString(startupCheckbox.isSelected()));
628 Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
629 sortby.getSelectedItem().toString());
631 // convert description of sort order to enum name for save
632 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
633 .forDescription(sortAnnBy.getSelectedItem().toString());
634 if (annSortOrder != null)
636 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
637 annSortOrder.name());
640 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
641 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
642 Boolean.valueOf(showAutocalcFirst).toString());
645 * Save Colours settings
647 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
648 protColour.getSelectedItem().toString());
649 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
650 nucColour.getSelectedItem().toString());
651 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
652 minColour.getBackground());
653 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
654 maxColour.getBackground());
657 * Save Overview settings
659 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
660 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
661 Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
662 Boolean.toString(useLegacyGap.isSelected()));
663 Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
664 Boolean.toString(showHiddenAtStart.isSelected()));
667 * Save Structure settings
669 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
670 Boolean.toString(addTempFactor.isSelected()));
671 Cache.applicationProperties.setProperty(ADD_SS_ANN,
672 Boolean.toString(addSecondaryStructure.isSelected()));
673 Cache.applicationProperties.setProperty(USE_RNAVIEW,
674 Boolean.toString(useRnaView.isSelected()));
675 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
676 Boolean.toString(structFromPdb.isSelected()));
677 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
678 structViewer.getSelectedItem().toString());
679 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
680 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
681 Boolean.toString(siftsMapping.isSelected()));
682 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
685 * Save Output settings
687 Cache.applicationProperties.setProperty("EPS_RENDERING",
688 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
691 * Save Connections settings
693 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
695 jalview.util.BrowserLauncher.resetBrowser();
697 // save user-defined and selected links
698 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
699 if (menuLinks.isEmpty())
701 Cache.applicationProperties.remove("SEQUENCE_LINKS");
705 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
706 menuLinks.toString());
709 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
710 if (nonMenuLinks.isEmpty())
712 Cache.applicationProperties.remove("STORED_LINKS");
716 Cache.applicationProperties.setProperty("STORED_LINKS",
717 nonMenuLinks.toString());
720 Cache.applicationProperties.setProperty("DEFAULT_URL",
721 sequenceUrlLinks.getPrimaryUrlId());
723 Cache.applicationProperties.setProperty("USE_PROXY",
724 Boolean.toString(useProxy.isSelected()));
726 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
728 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
730 if (useProxy.isSelected())
732 System.setProperty("http.proxyHost", proxyServerTB.getText());
733 System.setProperty("http.proxyPort", proxyPortTB.getText());
737 System.setProperty("http.proxyHost", "");
738 System.setProperty("http.proxyPort", "");
740 Cache.setProperty("VERSION_CHECK",
741 Boolean.toString(versioncheck.isSelected()));
742 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
744 // default is false - we only set this if the user has actively agreed
745 Cache.setProperty("USAGESTATS",
746 Boolean.toString(usagestats.isSelected()));
748 if (!questionnaire.isSelected())
750 Cache.setProperty("NOQUESTIONNAIRES", "true");
754 // special - made easy to edit a property file to disable questionnaires
755 // by just adding the given line
756 Cache.removeProperty("NOQUESTIONNAIRES");
760 * Save Output settings
762 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
763 Boolean.toString(blcjv.isSelected()));
764 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
765 Boolean.toString(clustaljv.isSelected()));
766 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
767 Boolean.toString(fastajv.isSelected()));
768 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
769 Boolean.toString(msfjv.isSelected()));
770 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
771 Boolean.toString(pfamjv.isSelected()));
772 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
773 Boolean.toString(pileupjv.isSelected()));
774 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
775 Boolean.toString(pirjv.isSelected()));
776 Cache.applicationProperties.setProperty("PIR_MODELLER",
777 Boolean.toString(modellerOutput.isSelected()));
778 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
779 Boolean.toString(embbedBioJSON.isSelected()));
780 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
782 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
783 Boolean.toString(autoIdWidth.isSelected()));
784 userIdWidth_actionPerformed();
785 Cache.applicationProperties.setProperty("FIGURE_USERIDWIDTH",
786 userIdWidth.getText());
789 * Save Editing settings
791 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
792 Boolean.toString(autoCalculateConsCheck.isSelected()));
793 Cache.applicationProperties.setProperty("SORT_BY_TREE",
794 Boolean.toString(sortByTree.isSelected()));
795 Cache.applicationProperties.setProperty("PAD_GAPS",
796 Boolean.toString(padGaps.isSelected()));
798 dasSource.saveProperties(Cache.applicationProperties);
799 wsPrefs.updateAndRefreshWsMenuConfig(false);
800 Cache.saveProperties();
801 Desktop.instance.doConfigureStructurePrefs();
804 frame.setClosed(true);
805 } catch (Exception ex)
811 * Do any necessary validation before saving settings. Return focus to the
812 * first tab which fails validation.
816 private boolean validateSettings()
818 if (!validateStructure())
820 structureTab.requestFocusInWindow();
827 protected boolean validateStructure()
829 return validateChimeraPath();
837 public void startupFileTextfield_mouseClicked()
839 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
840 JalviewFileChooser chooser = JalviewFileChooser
841 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
842 chooser.setFileView(new JalviewFileView());
843 chooser.setDialogTitle(
844 MessageManager.getString("label.select_startup_file"));
846 int value = chooser.showOpenDialog(this);
848 if (value == JalviewFileChooser.APPROVE_OPTION)
850 FileFormatI format = chooser.getSelectedFormat();
853 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
857 .setText(chooser.getSelectedFile().getAbsolutePath());
868 public void cancel_actionPerformed(ActionEvent e)
872 wsPrefs.updateWsMenuConfig(true);
873 wsPrefs.refreshWs_actionPerformed(e);
874 frame.setClosed(true);
875 } catch (Exception ex)
887 public void annotations_actionPerformed(ActionEvent e)
889 conservation.setEnabled(annotations.isSelected());
890 quality.setEnabled(annotations.isSelected());
891 identity.setEnabled(annotations.isSelected());
892 showOccupancy.setEnabled(annotations.isSelected());
893 showGroupConsensus.setEnabled(annotations.isSelected());
894 showGroupConservation.setEnabled(annotations.isSelected());
895 showConsensHistogram.setEnabled(annotations.isSelected()
896 && (identity.isSelected() || showGroupConsensus.isSelected()));
897 showConsensLogo.setEnabled(annotations.isSelected()
898 && (identity.isSelected() || showGroupConsensus.isSelected()));
902 public void newLink_actionPerformed(ActionEvent e)
904 GSequenceLink link = new GSequenceLink();
905 boolean valid = false;
908 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
909 MessageManager.getString("label.new_sequence_url_link"),
910 JvOptionPane.OK_CANCEL_OPTION, -1,
911 null) == JvOptionPane.OK_OPTION)
913 if (link.checkValid())
915 if (((UrlLinkTableModel) linkUrlTable.getModel())
916 .isUniqueName(link.getName()))
918 ((UrlLinkTableModel) linkUrlTable.getModel())
919 .insertRow(link.getName(), link.getURL());
924 link.notifyDuplicate();
937 public void editLink_actionPerformed(ActionEvent e)
939 GSequenceLink link = new GSequenceLink();
941 int index = linkUrlTable.getSelectedRow();
944 // button no longer enabled if row is not selected
945 Cache.log.debug("Edit with no row selected in linkUrlTable");
949 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
951 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
953 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
954 link.setName(oldName);
955 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
957 boolean valid = false;
960 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
961 MessageManager.getString("label.edit_sequence_url_link"),
962 JvOptionPane.OK_CANCEL_OPTION, -1,
963 null) == JvOptionPane.OK_OPTION)
965 if (link.checkValid())
967 if ((oldName.equals(link.getName()))
968 || (((UrlLinkTableModel) linkUrlTable.getModel())
969 .isUniqueName(link.getName())))
971 linkUrlTable.setValueAt(link.getName(), index, nameCol);
972 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
977 link.notifyDuplicate();
990 public void deleteLink_actionPerformed(ActionEvent e)
992 int index = linkUrlTable.getSelectedRow();
996 // button no longer enabled if row is not selected
997 Cache.log.debug("Delete with no row selected in linkUrlTable");
1002 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1005 // make sure we use the model index to delete, and not the table index
1006 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1010 public void defaultBrowser_mouseClicked(MouseEvent e)
1012 JFileChooser chooser = new JFileChooser(".");
1013 chooser.setDialogTitle(
1014 MessageManager.getString("label.select_default_browser"));
1016 int value = chooser.showOpenDialog(this);
1018 if (value == JFileChooser.APPROVE_OPTION)
1020 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1029 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1033 protected void showunconserved_actionPerformed(ActionEvent e)
1035 // TODO Auto-generated method stub
1036 super.showunconserved_actionPerformed(e);
1039 public static List<String> getGroupURLLinks()
1041 return groupURLLinks;
1045 public void minColour_actionPerformed(JPanel panel)
1047 Color col = JColorChooser.showDialog(this,
1048 MessageManager.getString("label.select_colour_minimum_value"),
1049 minColour.getBackground());
1052 panel.setBackground(col);
1058 public void maxColour_actionPerformed(JPanel panel)
1060 Color col = JColorChooser.showDialog(this,
1061 MessageManager.getString("label.select_colour_maximum_value"),
1062 maxColour.getBackground());
1065 panel.setBackground(col);
1071 public void gapColour_actionPerformed(JPanel gap)
1073 if (!useLegacyGap.isSelected())
1075 Color col = JColorChooser.showDialog(this,
1076 MessageManager.getString("label.select_gap_colour"),
1077 gapColour.getBackground());
1080 gap.setBackground(col);
1087 public void hiddenColour_actionPerformed(JPanel hidden)
1089 Color col = JColorChooser.showDialog(this,
1090 MessageManager.getString("label.select_hidden_colour"),
1091 hiddenColour.getBackground());
1094 hidden.setBackground(col);
1100 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1102 boolean enabled = useLegacyGap.isSelected();
1105 gapColour.setBackground(
1106 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1110 gapColour.setBackground(
1111 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1113 gapColour.setEnabled(!enabled);
1114 gapLabel.setEnabled(!enabled);
1118 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1120 useLegacyGap.setSelected(false);
1121 useLegacyGaps_actionPerformed(null);
1122 showHiddenAtStart.setSelected(true);
1123 hiddenColour.setBackground(
1124 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1128 protected void userIdWidth_actionPerformed()
1132 String val = userIdWidth.getText().trim();
1133 if (val.length() > 0)
1135 Integer iw = Integer.parseInt(val);
1136 if (iw.intValue() < 12)
1138 throw new NumberFormatException();
1140 userIdWidth.setText(iw.toString());
1142 } catch (NumberFormatException x)
1144 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1146 .getString("warn.user_defined_width_requirements"),
1147 MessageManager.getString("label.invalid_id_column_width"),
1148 JvOptionPane.WARNING_MESSAGE);
1149 userIdWidth.setText("");
1154 protected void autoIdWidth_actionPerformed()
1156 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1157 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1161 * Returns true if chimera path is to a valid executable, else show an error
1164 private boolean validateChimeraPath()
1166 if (chimeraPath.getText().trim().length() > 0)
1168 File f = new File(chimeraPath.getText());
1169 if (!f.canExecute())
1171 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1172 MessageManager.getString("label.invalid_chimera_path"),
1173 MessageManager.getString("label.invalid_name"),
1174 JvOptionPane.ERROR_MESSAGE);
1182 * If Chimera is selected, check it can be found on default or user-specified
1183 * path, if not show a warning/help dialog.
1186 protected void structureViewer_actionPerformed(String selectedItem)
1188 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1192 boolean found = false;
1195 * Try user-specified and standard paths for Chimera executable.
1197 List<String> paths = StructureManager.getChimeraPaths();
1198 paths.add(0, chimeraPath.getText());
1199 for (String path : paths)
1201 if (new File(path.trim()).canExecute())
1209 String[] options = { "OK", "Help" };
1210 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1211 JvSwingUtils.wrapTooltip(true,
1212 MessageManager.getString("label.chimera_missing")),
1213 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1214 null, options, options[0]);
1215 if (showHelp == JvOptionPane.NO_OPTION)
1219 Help.showHelpWindow(HelpId.StructureViewer);
1220 } catch (HelpSetException e)
1222 e.printStackTrace();
1228 public class OptionsParam
1230 private String name;
1232 private String code;
1234 public OptionsParam(String name, String code)
1240 public String getName()
1245 public void setName(String name)
1250 public String getCode()
1255 public void setCode(String code)
1261 public String toString()
1267 public boolean equals(Object that)
1269 if (!(that instanceof OptionsParam))
1273 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1277 public int hashCode()
1279 return name.hashCode() + code.hashCode();
1283 private class UrlListSelectionHandler implements ListSelectionListener
1287 public void valueChanged(ListSelectionEvent e)
1289 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1291 int index = lsm.getMinSelectionIndex();
1294 // no selection, so disable delete/edit buttons
1295 editLink.setEnabled(false);
1296 deleteLink.setEnabled(false);
1299 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1301 // enable/disable edit and delete link buttons
1302 if (((UrlLinkTableModel) linkUrlTable.getModel())
1303 .isRowDeletable(modelIndex))
1305 deleteLink.setEnabled(true);
1309 deleteLink.setEnabled(false);
1312 if (((UrlLinkTableModel) linkUrlTable.getModel())
1313 .isRowEditable(modelIndex))
1315 editLink.setEnabled(true);
1319 editLink.setEnabled(false);