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.ColourSchemeProperty;
33 import jalview.urls.UrlLinkTableModel;
34 import jalview.urls.api.UrlProviderFactoryI;
35 import jalview.urls.api.UrlProviderI;
36 import jalview.urls.desktop.DesktopUrlProviderFactory;
37 import jalview.util.MessageManager;
38 import jalview.util.Platform;
39 import jalview.util.UrlConstants;
40 import jalview.ws.sifts.SiftsSettings;
42 import java.awt.BorderLayout;
43 import java.awt.Color;
44 import java.awt.Component;
45 import java.awt.Dimension;
47 import java.awt.event.ActionEvent;
48 import java.awt.event.ActionListener;
49 import java.awt.event.MouseEvent;
51 import java.util.ArrayList;
52 import java.util.List;
54 import javax.help.HelpSetException;
55 import javax.swing.JColorChooser;
56 import javax.swing.JFileChooser;
57 import javax.swing.JInternalFrame;
58 import javax.swing.JPanel;
59 import javax.swing.ListSelectionModel;
60 import javax.swing.RowFilter;
61 import javax.swing.RowSorter;
62 import javax.swing.SortOrder;
63 import javax.swing.event.DocumentEvent;
64 import javax.swing.event.DocumentListener;
65 import javax.swing.event.ListSelectionEvent;
66 import javax.swing.event.ListSelectionListener;
67 import javax.swing.table.TableCellRenderer;
68 import javax.swing.table.TableColumn;
69 import javax.swing.table.TableModel;
70 import javax.swing.table.TableRowSorter;
72 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
80 public class Preferences extends GPreferences
82 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
84 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
86 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
88 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
90 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
92 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
94 public static final String ADD_SS_ANN = "ADD_SS_ANN";
96 public static final String USE_RNAVIEW = "USE_RNAVIEW";
98 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
100 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
102 public static final String CHIMERA_PATH = "CHIMERA_PATH";
104 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
106 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
108 private static final int MIN_FONT_SIZE = 1;
110 private static final int MAX_FONT_SIZE = 30;
113 * Holds name and link separated with | character. Sequence ID must be
114 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
116 public static UrlProviderI sequenceUrlLinks;
118 public static UrlLinkTableModel dataModel;
121 * Holds name and link separated with | character. Sequence IDS and Sequences
122 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
123 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
124 * for first and second token specified after a pipe character at end |,|.
125 * (TODO: proper escape for using | to separate ids or sequences
128 public static List<String> groupURLLinks;
131 // get links selected to be in the menu (SEQUENCE_LINKS)
132 // and links entered by the user but not selected (STORED_LINKS)
133 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
134 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
135 String defaultUrl = Cache.getDefault("DEFAULT_URL",
136 UrlConstants.DEFAULT_LABEL);
138 // if both links lists are empty, add the DEFAULT_URL link
139 // otherwise we assume the default link is in one of the lists
140 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
142 inMenuString = UrlConstants.DEFAULT_STRING;
144 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
145 inMenuString, notInMenuString);
146 sequenceUrlLinks = factory.createUrlProvider();
147 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
150 * TODO: reformulate groupURL encoding so two or more can be stored in the
151 * .properties file as '|' separated strings
154 groupURLLinks = new ArrayList<String>();
157 JInternalFrame frame;
159 DasSourceBrowser dasSource;
161 private WsPreferences wsPrefs;
163 private OptionsParam promptEachTimeOpt = new OptionsParam(
164 MessageManager.getString("label.prompt_each_time"),
167 private OptionsParam lineArtOpt = new OptionsParam(
168 MessageManager.getString("label.lineart"), "Lineart");
170 private OptionsParam textOpt = new OptionsParam(
171 MessageManager.getString("action.text"), "Text");
174 * Creates a new Preferences object.
179 frame = new JInternalFrame();
180 frame.setContentPane(this);
181 dasSource = new DasSourceBrowser();
182 dasTab.add(dasSource, BorderLayout.CENTER);
183 wsPrefs = new WsPreferences();
184 wsTab.add(wsPrefs, BorderLayout.CENTER);
185 int width = 500, height = 450;
186 new jalview.util.Platform();
187 if (Platform.isAMac())
193 Desktop.addInternalFrame(frame,
194 MessageManager.getString("label.preferences"), width, height);
195 frame.setMinimumSize(new Dimension(width, height));
198 * Set Visual tab defaults
200 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
201 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
202 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
203 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
205 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
206 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
207 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
208 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
210 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
211 showGroupConsensus.setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS",
213 showGroupConservation.setSelected(Cache.getDefault(
214 "SHOW_GROUP_CONSERVATION", false));
215 showConsensHistogram.setSelected(Cache.getDefault(
216 "SHOW_CONSENSUS_HISTOGRAM", true));
217 showConsensLogo.setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO",
219 showNpTooltip.setSelected(Cache
220 .getDefault("SHOW_NPFEATS_TOOLTIP", true));
221 showDbRefTooltip.setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP",
224 String[] fonts = java.awt.GraphicsEnvironment
225 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
226 for (int i = 0; i < fonts.length; i++)
228 fontNameCB.addItem(fonts[i]);
231 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
233 fontSizeCB.addItem(i + "");
236 fontStyleCB.addItem("plain");
237 fontStyleCB.addItem("bold");
238 fontStyleCB.addItem("italic");
240 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
241 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
242 fontStyleCB.setSelectedItem(Cache.getDefault("FONT_STYLE", Font.PLAIN
245 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
246 scaleProteinToCdna.setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA,
249 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
251 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
253 gapSymbolCB.addItem("-");
254 gapSymbolCB.addItem(".");
256 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
258 sortby.addItem("No sort");
259 sortby.addItem("Id");
260 sortby.addItem("Pairwise Identity");
261 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
263 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
265 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
267 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
268 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
269 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
270 SequenceAnnotationOrder.NONE.name()));
271 sortAnnBy.setSelectedItem(savedSort.toString());
273 sortAutocalc.addItem("Autocalculated first");
274 sortAutocalc.addItem("Autocalculated last");
275 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
276 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
277 : sortAutocalc.getItemAt(1));
279 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
280 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
281 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
282 + "/examples/exampleFile_2_3.jar"));
285 * Set Colours tab defaults
287 for (int i = ColourSchemeProperty.FIRST_COLOUR; i <= ColourSchemeProperty.LAST_COLOUR; i++)
289 protColour.addItem(ColourSchemeProperty.getColourName(i));
290 nucColour.addItem(ColourSchemeProperty.getColourName(i));
292 String oldProp = Cache.getDefault(DEFAULT_COLOUR, "None");
293 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
294 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
295 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
296 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
297 minColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN",
299 maxColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX",
303 * Set Structure tab defaults.
305 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
306 structFromPdb.setSelected(structSelected);
307 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
308 useRnaView.setEnabled(structSelected);
309 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
310 addSecondaryStructure.setEnabled(structSelected);
311 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
312 addTempFactor.setEnabled(structSelected);
313 structViewer.setSelectedItem(Cache.getDefault(STRUCTURE_DISPLAY,
314 ViewerType.JMOL.name()));
315 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
316 chimeraPath.addActionListener(new ActionListener()
319 public void actionPerformed(ActionEvent e)
321 validateChimeraPath();
325 if (Cache.getDefault("MAP_WITH_SIFTS", false))
327 siftsMapping.setSelected(true);
331 nwMapping.setSelected(true);
335 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
338 * Set Connections tab defaults
342 linkUrlTable.setModel(dataModel);
343 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
344 linkUrlTable.getModel());
345 linkUrlTable.setRowSorter(sorter);
346 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
348 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
349 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
350 SortOrder.DESCENDING));
351 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
352 SortOrder.DESCENDING));
353 sortKeys.add(new RowSorter.SortKey(m.getNameColumn(),
354 SortOrder.ASCENDING));
356 sorter.setSortKeys(sortKeys);
360 ActionListener onReset;
361 onReset = new ActionListener()
364 public void actionPerformed(ActionEvent e)
366 filterTB.setText("");
367 sorter.setRowFilter(RowFilter.regexFilter(""));
371 doReset.addActionListener(onReset);
373 // filter to display only custom urls
374 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
377 public boolean include(
378 Entry<? extends TableModel, ? extends Object> entry)
380 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
384 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
385 linkUrlTable.getModel());
386 customSorter.setRowFilter(customUrlFilter);
388 ActionListener onCustomOnly;
389 onCustomOnly = new ActionListener()
392 public void actionPerformed(ActionEvent e)
394 filterTB.setText("");
395 sorter.setRowFilter(customUrlFilter);
398 userOnly.addActionListener(onCustomOnly);
400 filterTB.getDocument().addDocumentListener(new DocumentListener()
402 String caseInsensitiveFlag = "(?i)";
405 public void changedUpdate(DocumentEvent e)
407 sorter.setRowFilter(RowFilter.regexFilter(caseInsensitiveFlag
408 + filterTB.getText()));
412 public void removeUpdate(DocumentEvent e)
414 sorter.setRowFilter(RowFilter.regexFilter(caseInsensitiveFlag
415 + filterTB.getText()));
419 public void insertUpdate(DocumentEvent e)
421 sorter.setRowFilter(RowFilter.regexFilter(caseInsensitiveFlag
422 + filterTB.getText()));
426 // set up list selection functionality
427 linkUrlTable.getSelectionModel().addListSelectionListener(
428 new UrlListSelectionHandler());
430 // set up radio buttons
431 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
433 String onClickName = linkUrlTable.getColumnName(onClickCol);
434 linkUrlTable.getColumn(onClickName).setCellRenderer(
435 new RadioButtonRenderer());
436 linkUrlTable.getColumn(onClickName)
437 .setCellEditor(new RadioButtonEditor());
439 // get boolean columns and resize those to min possible
440 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
442 if (linkUrlTable.getModel().getColumnClass(column)
443 .equals(Boolean.class))
445 TableColumn tableColumn = linkUrlTable.getColumnModel().getColumn(
447 int preferredWidth = tableColumn.getMinWidth();
449 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
451 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
452 int cwidth = c.getPreferredSize().width
453 + linkUrlTable.getIntercellSpacing().width;
454 preferredWidth = Math.max(preferredWidth, cwidth);
456 tableColumn.setPreferredWidth(preferredWidth);
460 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
461 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
462 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
463 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
465 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
467 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
468 // note antisense here: default is true
470 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
471 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
474 * Set Output tab defaults
476 epsRendering.addItem(promptEachTimeOpt);
477 epsRendering.addItem(lineArtOpt);
478 epsRendering.addItem(textOpt);
479 String defaultEPS = Cache.getDefault("EPS_RENDERING",
481 if (defaultEPS.equalsIgnoreCase("Text"))
483 epsRendering.setSelectedItem(textOpt);
485 else if (defaultEPS.equalsIgnoreCase("Lineart"))
487 epsRendering.setSelectedItem(lineArtOpt);
491 epsRendering.setSelectedItem(promptEachTimeOpt);
493 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
494 userIdWidth.setEnabled(!autoIdWidth.isSelected());
495 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
496 Integer wi = Cache.getIntegerProperty("FIGURE_USERIDWIDTH");
497 userIdWidth.setText(wi == null ? "" : wi.toString());
498 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
499 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
500 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
501 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
502 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
503 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
504 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
505 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
506 embbedBioJSON.setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON",
510 * Set Editing tab defaults
512 autoCalculateConsCheck.setSelected(Cache.getDefault(
513 "AUTO_CALC_CONSENSUS", true));
514 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
515 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
517 annotations_actionPerformed(null); // update the display of the annotation
522 * Save user selections on the Preferences tabs to the Cache and write out to
528 public void ok_actionPerformed(ActionEvent e)
530 if (!validateSettings())
536 * Save Visual settings
538 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
539 Boolean.toString(seqLimit.isSelected()));
540 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
541 Boolean.toString(rightAlign.isSelected()));
542 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
543 Boolean.toString(fullScreen.isSelected()));
544 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
545 Boolean.toString(openoverv.isSelected()));
546 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
547 Boolean.toString(annotations.isSelected()));
548 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
549 Boolean.toString(conservation.isSelected()));
550 Cache.applicationProperties.setProperty("SHOW_QUALITY",
551 Boolean.toString(quality.isSelected()));
552 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
553 Boolean.toString(identity.isSelected()));
555 Cache.applicationProperties.setProperty("GAP_SYMBOL", gapSymbolCB
556 .getSelectedItem().toString());
558 Cache.applicationProperties.setProperty("FONT_NAME", fontNameCB
559 .getSelectedItem().toString());
560 Cache.applicationProperties.setProperty("FONT_STYLE", fontStyleCB
561 .getSelectedItem().toString());
562 Cache.applicationProperties.setProperty("FONT_SIZE", fontSizeCB
563 .getSelectedItem().toString());
565 Cache.applicationProperties.setProperty("ID_ITALICS",
566 Boolean.toString(idItalics.isSelected()));
567 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
568 Boolean.toString(showUnconserved.isSelected()));
569 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
570 Boolean.toString(showGroupConsensus.isSelected()));
571 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
572 Boolean.toString(showGroupConservation.isSelected()));
573 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
574 Boolean.toString(showConsensHistogram.isSelected()));
575 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
576 Boolean.toString(showConsensLogo.isSelected()));
577 Cache.applicationProperties.setProperty("ANTI_ALIAS",
578 Boolean.toString(smoothFont.isSelected()));
579 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
580 Boolean.toString(scaleProteinToCdna.isSelected()));
581 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
582 Boolean.toString(showNpTooltip.isSelected()));
583 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
584 Boolean.toString(showDbRefTooltip.isSelected()));
586 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
587 Boolean.toString(wrap.isSelected()));
589 Cache.applicationProperties.setProperty("STARTUP_FILE",
590 startupFileTextfield.getText());
591 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
592 Boolean.toString(startupCheckbox.isSelected()));
594 Cache.applicationProperties.setProperty("SORT_ALIGNMENT", sortby
595 .getSelectedItem().toString());
597 // convert description of sort order to enum name for save
598 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
599 .forDescription(sortAnnBy.getSelectedItem().toString());
600 if (annSortOrder != null)
602 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
603 annSortOrder.name());
606 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
607 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE, Boolean
608 .valueOf(showAutocalcFirst).toString());
611 * Save Colours settings
613 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT, protColour
614 .getSelectedItem().toString());
615 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC, nucColour
616 .getSelectedItem().toString());
617 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
618 minColour.getBackground());
619 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
620 maxColour.getBackground());
623 * Save Structure settings
625 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
626 Boolean.toString(addTempFactor.isSelected()));
627 Cache.applicationProperties.setProperty(ADD_SS_ANN,
628 Boolean.toString(addSecondaryStructure.isSelected()));
629 Cache.applicationProperties.setProperty(USE_RNAVIEW,
630 Boolean.toString(useRnaView.isSelected()));
631 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
632 Boolean.toString(structFromPdb.isSelected()));
633 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY, structViewer
634 .getSelectedItem().toString());
635 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
636 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
637 Boolean.toString(siftsMapping.isSelected()));
638 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
641 * Save Output settings
643 Cache.applicationProperties.setProperty("EPS_RENDERING",
644 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
647 * Save Connections settings
649 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
651 jalview.util.BrowserLauncher.resetBrowser();
653 // save user-defined and selected links
654 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
655 if (menuLinks.isEmpty())
657 Cache.applicationProperties.remove("SEQUENCE_LINKS");
661 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
662 menuLinks.toString());
665 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
666 if (nonMenuLinks.isEmpty())
668 Cache.applicationProperties.remove("STORED_LINKS");
672 Cache.applicationProperties.setProperty("STORED_LINKS",
673 nonMenuLinks.toString());
676 Cache.applicationProperties.setProperty("DEFAULT_URL",
677 sequenceUrlLinks.getPrimaryUrlId());
679 Cache.applicationProperties.setProperty("USE_PROXY",
680 Boolean.toString(useProxy.isSelected()));
682 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
684 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
686 if (useProxy.isSelected())
688 System.setProperty("http.proxyHost", proxyServerTB.getText());
689 System.setProperty("http.proxyPort", proxyPortTB.getText());
693 System.setProperty("http.proxyHost", "");
694 System.setProperty("http.proxyPort", "");
696 Cache.setProperty("VERSION_CHECK",
697 Boolean.toString(versioncheck.isSelected()));
698 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
700 // default is false - we only set this if the user has actively agreed
701 Cache.setProperty("USAGESTATS",
702 Boolean.toString(usagestats.isSelected()));
704 if (!questionnaire.isSelected())
706 Cache.setProperty("NOQUESTIONNAIRES", "true");
710 // special - made easy to edit a property file to disable questionnaires
711 // by just adding the given line
712 Cache.removeProperty("NOQUESTIONNAIRES");
716 * Save Output settings
718 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
719 Boolean.toString(blcjv.isSelected()));
720 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
721 Boolean.toString(clustaljv.isSelected()));
722 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
723 Boolean.toString(fastajv.isSelected()));
724 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
725 Boolean.toString(msfjv.isSelected()));
726 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
727 Boolean.toString(pfamjv.isSelected()));
728 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
729 Boolean.toString(pileupjv.isSelected()));
730 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
731 Boolean.toString(pirjv.isSelected()));
732 Cache.applicationProperties.setProperty("PIR_MODELLER",
733 Boolean.toString(modellerOutput.isSelected()));
734 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
735 Boolean.toString(embbedBioJSON.isSelected()));
736 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
738 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
739 Boolean.toString(autoIdWidth.isSelected()));
740 userIdWidth_actionPerformed();
741 Cache.applicationProperties.setProperty("FIGURE_USERIDWIDTH",
742 userIdWidth.getText());
745 * Save Editing settings
747 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
748 Boolean.toString(autoCalculateConsCheck.isSelected()));
749 Cache.applicationProperties.setProperty("SORT_BY_TREE",
750 Boolean.toString(sortByTree.isSelected()));
751 Cache.applicationProperties.setProperty("PAD_GAPS",
752 Boolean.toString(padGaps.isSelected()));
754 dasSource.saveProperties(Cache.applicationProperties);
755 wsPrefs.updateAndRefreshWsMenuConfig(false);
756 Cache.saveProperties();
757 Desktop.instance.doConfigureStructurePrefs();
760 frame.setClosed(true);
761 } catch (Exception ex)
767 * Do any necessary validation before saving settings. Return focus to the
768 * first tab which fails validation.
772 private boolean validateSettings()
774 if (!validateStructure())
776 structureTab.requestFocusInWindow();
783 protected boolean validateStructure()
785 return validateChimeraPath();
793 public void startupFileTextfield_mouseClicked()
795 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
796 JalviewFileChooser chooser = JalviewFileChooser.forRead(
797 Cache.getProperty("LAST_DIRECTORY"), fileFormat);
798 chooser.setFileView(new JalviewFileView());
799 chooser.setDialogTitle(MessageManager
800 .getString("label.select_startup_file"));
802 int value = chooser.showOpenDialog(this);
804 if (value == JalviewFileChooser.APPROVE_OPTION)
806 FileFormatI format = chooser.getSelectedFormat();
809 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
812 startupFileTextfield.setText(chooser.getSelectedFile()
824 public void cancel_actionPerformed(ActionEvent e)
828 wsPrefs.updateWsMenuConfig(true);
829 wsPrefs.refreshWs_actionPerformed(e);
830 frame.setClosed(true);
831 } catch (Exception ex)
843 public void annotations_actionPerformed(ActionEvent e)
845 conservation.setEnabled(annotations.isSelected());
846 quality.setEnabled(annotations.isSelected());
847 identity.setEnabled(annotations.isSelected());
848 showGroupConsensus.setEnabled(annotations.isSelected());
849 showGroupConservation.setEnabled(annotations.isSelected());
850 showConsensHistogram.setEnabled(annotations.isSelected()
851 && (identity.isSelected() || showGroupConsensus.isSelected()));
852 showConsensLogo.setEnabled(annotations.isSelected()
853 && (identity.isSelected() || showGroupConsensus.isSelected()));
857 public void newLink_actionPerformed(ActionEvent e)
859 GSequenceLink link = new GSequenceLink();
860 boolean valid = false;
863 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
864 MessageManager.getString("label.new_sequence_url_link"),
865 JvOptionPane.OK_CANCEL_OPTION, -1, null) == JvOptionPane.OK_OPTION)
867 if (link.checkValid())
869 if (((UrlLinkTableModel) linkUrlTable.getModel())
870 .isUniqueName(link.getName()))
872 ((UrlLinkTableModel) linkUrlTable.getModel()).insertRow(
873 link.getName(), link.getURL());
878 link.notifyDuplicate();
891 public void editLink_actionPerformed(ActionEvent e)
893 GSequenceLink link = new GSequenceLink();
895 int index = linkUrlTable.getSelectedRow();
898 // button no longer enabled if row is not selected
899 Cache.log.debug("Edit with no row selected in linkUrlTable");
903 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
905 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
907 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
908 link.setName(oldName);
909 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
911 boolean valid = false;
914 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
915 MessageManager.getString("label.edit_sequence_url_link"),
916 JvOptionPane.OK_CANCEL_OPTION, -1, null) == JvOptionPane.OK_OPTION)
918 if (link.checkValid())
920 if ((oldName.equals(link.getName()))
921 || (((UrlLinkTableModel) linkUrlTable.getModel())
922 .isUniqueName(link.getName())))
924 linkUrlTable.setValueAt(link.getName(), index, nameCol);
925 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
930 link.notifyDuplicate();
943 public void deleteLink_actionPerformed(ActionEvent e)
945 int index = linkUrlTable.getSelectedRow();
949 // button no longer enabled if row is not selected
950 Cache.log.debug("Delete with no row selected in linkUrlTable");
955 modelIndex = linkUrlTable.convertRowIndexToModel(index);
958 // make sure we use the model index to delete, and not the table index
959 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
964 public void defaultBrowser_mouseClicked(MouseEvent e)
966 JFileChooser chooser = new JFileChooser(".");
967 chooser.setDialogTitle(MessageManager
968 .getString("label.select_default_browser"));
970 int value = chooser.showOpenDialog(this);
972 if (value == JFileChooser.APPROVE_OPTION)
974 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
983 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
987 protected void showunconserved_actionPerformed(ActionEvent e)
989 // TODO Auto-generated method stub
990 super.showunconserved_actionPerformed(e);
993 public static List<String> getGroupURLLinks()
995 return groupURLLinks;
999 public void minColour_actionPerformed(JPanel panel)
1001 Color col = JColorChooser.showDialog(this,
1002 MessageManager.getString("label.select_colour_minimum_value"),
1003 minColour.getBackground());
1006 panel.setBackground(col);
1012 public void maxColour_actionPerformed(JPanel panel)
1014 Color col = JColorChooser.showDialog(this,
1015 MessageManager.getString("label.select_colour_maximum_value"),
1016 maxColour.getBackground());
1019 panel.setBackground(col);
1025 protected void userIdWidth_actionPerformed()
1029 String val = userIdWidth.getText().trim();
1030 if (val.length() > 0)
1032 Integer iw = Integer.parseInt(val);
1033 if (iw.intValue() < 12)
1035 throw new NumberFormatException();
1037 userIdWidth.setText(iw.toString());
1039 } catch (NumberFormatException x)
1041 JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
1042 .getString("warn.user_defined_width_requirements"),
1043 MessageManager.getString("label.invalid_id_column_width"),
1044 JvOptionPane.WARNING_MESSAGE);
1045 userIdWidth.setText("");
1050 protected void autoIdWidth_actionPerformed()
1052 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1053 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1057 * Returns true if chimera path is to a valid executable, else show an error
1060 private boolean validateChimeraPath()
1062 if (chimeraPath.getText().trim().length() > 0)
1064 File f = new File(chimeraPath.getText());
1065 if (!f.canExecute())
1067 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1068 MessageManager.getString("label.invalid_chimera_path"),
1069 MessageManager.getString("label.invalid_name"),
1070 JvOptionPane.ERROR_MESSAGE);
1078 * If Chimera is selected, check it can be found on default or user-specified
1079 * path, if not show a warning/help dialog.
1082 protected void structureViewer_actionPerformed(String selectedItem)
1084 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1088 boolean found = false;
1091 * Try user-specified and standard paths for Chimera executable.
1093 List<String> paths = StructureManager.getChimeraPaths();
1094 paths.add(0, chimeraPath.getText());
1095 for (String path : paths)
1097 if (new File(path.trim()).canExecute())
1105 String[] options = { "OK", "Help" };
1106 int showHelp = JvOptionPane.showInternalOptionDialog(
1108 JvSwingUtils.wrapTooltip(true,
1109 MessageManager.getString("label.chimera_missing")),
1110 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1111 null, options, options[0]);
1112 if (showHelp == JvOptionPane.NO_OPTION)
1116 Help.showHelpWindow(HelpId.StructureViewer);
1117 } catch (HelpSetException e)
1119 e.printStackTrace();
1125 public class OptionsParam
1127 private String name;
1129 private String code;
1131 public OptionsParam(String name, String code)
1137 public String getName()
1142 public void setName(String name)
1147 public String getCode()
1152 public void setCode(String code)
1158 public String toString()
1164 public boolean equals(Object that)
1166 if (!(that instanceof OptionsParam))
1170 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1174 public int hashCode()
1176 return name.hashCode() + code.hashCode();
1180 private class UrlListSelectionHandler implements ListSelectionListener
1184 public void valueChanged(ListSelectionEvent e)
1186 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1188 int index = lsm.getMinSelectionIndex();
1191 // no selection, so disable delete/edit buttons
1192 editLink.setEnabled(false);
1193 deleteLink.setEnabled(false);
1196 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1198 // enable/disable edit and delete link buttons
1199 if (((UrlLinkTableModel) linkUrlTable.getModel())
1200 .isRowDeletable(modelIndex))
1202 deleteLink.setEnabled(true);
1206 deleteLink.setEnabled(false);
1209 if (((UrlLinkTableModel) linkUrlTable.getModel())
1210 .isRowEditable(modelIndex))
1212 editLink.setEnabled(true);
1216 editLink.setEnabled(false);