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.setEnabled(useProxy.isSelected());
463 proxyPortTB.setEnabled(useProxy.isSelected());
464 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
465 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
467 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
469 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
470 // note antisense here: default is true
472 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
473 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
476 * Set Output tab defaults
478 epsRendering.addItem(promptEachTimeOpt);
479 epsRendering.addItem(lineArtOpt);
480 epsRendering.addItem(textOpt);
481 String defaultEPS = Cache.getDefault("EPS_RENDERING",
483 if (defaultEPS.equalsIgnoreCase("Text"))
485 epsRendering.setSelectedItem(textOpt);
487 else if (defaultEPS.equalsIgnoreCase("Lineart"))
489 epsRendering.setSelectedItem(lineArtOpt);
493 epsRendering.setSelectedItem(promptEachTimeOpt);
495 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
496 userIdWidth.setEnabled(!autoIdWidth.isSelected());
497 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
498 Integer wi = Cache.getIntegerProperty("FIGURE_USERIDWIDTH");
499 userIdWidth.setText(wi == null ? "" : wi.toString());
500 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
501 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
502 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
503 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
504 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
505 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
506 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
507 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
508 embbedBioJSON.setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON",
512 * Set Editing tab defaults
514 autoCalculateConsCheck.setSelected(Cache.getDefault(
515 "AUTO_CALC_CONSENSUS", true));
516 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
517 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
519 annotations_actionPerformed(null); // update the display of the annotation
524 * Save user selections on the Preferences tabs to the Cache and write out to
530 public void ok_actionPerformed(ActionEvent e)
532 if (!validateSettings())
538 * Save Visual settings
540 Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
541 Boolean.toString(seqLimit.isSelected()));
542 Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
543 Boolean.toString(rightAlign.isSelected()));
544 Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
545 Boolean.toString(fullScreen.isSelected()));
546 Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
547 Boolean.toString(openoverv.isSelected()));
548 Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
549 Boolean.toString(annotations.isSelected()));
550 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
551 Boolean.toString(conservation.isSelected()));
552 Cache.applicationProperties.setProperty("SHOW_QUALITY",
553 Boolean.toString(quality.isSelected()));
554 Cache.applicationProperties.setProperty("SHOW_IDENTITY",
555 Boolean.toString(identity.isSelected()));
557 Cache.applicationProperties.setProperty("GAP_SYMBOL", gapSymbolCB
558 .getSelectedItem().toString());
560 Cache.applicationProperties.setProperty("FONT_NAME", fontNameCB
561 .getSelectedItem().toString());
562 Cache.applicationProperties.setProperty("FONT_STYLE", fontStyleCB
563 .getSelectedItem().toString());
564 Cache.applicationProperties.setProperty("FONT_SIZE", fontSizeCB
565 .getSelectedItem().toString());
567 Cache.applicationProperties.setProperty("ID_ITALICS",
568 Boolean.toString(idItalics.isSelected()));
569 Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
570 Boolean.toString(showUnconserved.isSelected()));
571 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
572 Boolean.toString(showGroupConsensus.isSelected()));
573 Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
574 Boolean.toString(showGroupConservation.isSelected()));
575 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
576 Boolean.toString(showConsensHistogram.isSelected()));
577 Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
578 Boolean.toString(showConsensLogo.isSelected()));
579 Cache.applicationProperties.setProperty("ANTI_ALIAS",
580 Boolean.toString(smoothFont.isSelected()));
581 Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
582 Boolean.toString(scaleProteinToCdna.isSelected()));
583 Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
584 Boolean.toString(showNpTooltip.isSelected()));
585 Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
586 Boolean.toString(showDbRefTooltip.isSelected()));
588 Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
589 Boolean.toString(wrap.isSelected()));
591 Cache.applicationProperties.setProperty("STARTUP_FILE",
592 startupFileTextfield.getText());
593 Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
594 Boolean.toString(startupCheckbox.isSelected()));
596 Cache.applicationProperties.setProperty("SORT_ALIGNMENT", sortby
597 .getSelectedItem().toString());
599 // convert description of sort order to enum name for save
600 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
601 .forDescription(sortAnnBy.getSelectedItem().toString());
602 if (annSortOrder != null)
604 Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
605 annSortOrder.name());
608 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
609 Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE, Boolean
610 .valueOf(showAutocalcFirst).toString());
613 * Save Colours settings
615 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT, protColour
616 .getSelectedItem().toString());
617 Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC, nucColour
618 .getSelectedItem().toString());
619 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
620 minColour.getBackground());
621 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
622 maxColour.getBackground());
625 * Save Structure settings
627 Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
628 Boolean.toString(addTempFactor.isSelected()));
629 Cache.applicationProperties.setProperty(ADD_SS_ANN,
630 Boolean.toString(addSecondaryStructure.isSelected()));
631 Cache.applicationProperties.setProperty(USE_RNAVIEW,
632 Boolean.toString(useRnaView.isSelected()));
633 Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
634 Boolean.toString(structFromPdb.isSelected()));
635 Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY, structViewer
636 .getSelectedItem().toString());
637 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
638 Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
639 Boolean.toString(siftsMapping.isSelected()));
640 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
643 * Save Output settings
645 Cache.applicationProperties.setProperty("EPS_RENDERING",
646 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
649 * Save Connections settings
651 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
653 jalview.util.BrowserLauncher.resetBrowser();
655 // save user-defined and selected links
656 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
657 if (menuLinks.isEmpty())
659 Cache.applicationProperties.remove("SEQUENCE_LINKS");
663 Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
664 menuLinks.toString());
667 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
668 if (nonMenuLinks.isEmpty())
670 Cache.applicationProperties.remove("STORED_LINKS");
674 Cache.applicationProperties.setProperty("STORED_LINKS",
675 nonMenuLinks.toString());
678 Cache.applicationProperties.setProperty("DEFAULT_URL",
679 sequenceUrlLinks.getPrimaryUrlId());
681 Cache.applicationProperties.setProperty("USE_PROXY",
682 Boolean.toString(useProxy.isSelected()));
684 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
686 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
688 if (useProxy.isSelected())
690 System.setProperty("http.proxyHost", proxyServerTB.getText());
691 System.setProperty("http.proxyPort", proxyPortTB.getText());
695 System.setProperty("http.proxyHost", "");
696 System.setProperty("http.proxyPort", "");
698 Cache.setProperty("VERSION_CHECK",
699 Boolean.toString(versioncheck.isSelected()));
700 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
702 // default is false - we only set this if the user has actively agreed
703 Cache.setProperty("USAGESTATS",
704 Boolean.toString(usagestats.isSelected()));
706 if (!questionnaire.isSelected())
708 Cache.setProperty("NOQUESTIONNAIRES", "true");
712 // special - made easy to edit a property file to disable questionnaires
713 // by just adding the given line
714 Cache.removeProperty("NOQUESTIONNAIRES");
718 * Save Output settings
720 Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
721 Boolean.toString(blcjv.isSelected()));
722 Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
723 Boolean.toString(clustaljv.isSelected()));
724 Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
725 Boolean.toString(fastajv.isSelected()));
726 Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
727 Boolean.toString(msfjv.isSelected()));
728 Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
729 Boolean.toString(pfamjv.isSelected()));
730 Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
731 Boolean.toString(pileupjv.isSelected()));
732 Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
733 Boolean.toString(pirjv.isSelected()));
734 Cache.applicationProperties.setProperty("PIR_MODELLER",
735 Boolean.toString(modellerOutput.isSelected()));
736 Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
737 Boolean.toString(embbedBioJSON.isSelected()));
738 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
740 Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
741 Boolean.toString(autoIdWidth.isSelected()));
742 userIdWidth_actionPerformed();
743 Cache.applicationProperties.setProperty("FIGURE_USERIDWIDTH",
744 userIdWidth.getText());
747 * Save Editing settings
749 Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
750 Boolean.toString(autoCalculateConsCheck.isSelected()));
751 Cache.applicationProperties.setProperty("SORT_BY_TREE",
752 Boolean.toString(sortByTree.isSelected()));
753 Cache.applicationProperties.setProperty("PAD_GAPS",
754 Boolean.toString(padGaps.isSelected()));
756 dasSource.saveProperties(Cache.applicationProperties);
757 wsPrefs.updateAndRefreshWsMenuConfig(false);
758 Cache.saveProperties();
759 Desktop.instance.doConfigureStructurePrefs();
762 frame.setClosed(true);
763 } catch (Exception ex)
769 * Do any necessary validation before saving settings. Return focus to the
770 * first tab which fails validation.
774 private boolean validateSettings()
776 if (!validateStructure())
778 structureTab.requestFocusInWindow();
785 protected boolean validateStructure()
787 return validateChimeraPath();
795 public void startupFileTextfield_mouseClicked()
797 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
798 JalviewFileChooser chooser = JalviewFileChooser.forRead(
799 Cache.getProperty("LAST_DIRECTORY"), fileFormat);
800 chooser.setFileView(new JalviewFileView());
801 chooser.setDialogTitle(MessageManager
802 .getString("label.select_startup_file"));
804 int value = chooser.showOpenDialog(this);
806 if (value == JalviewFileChooser.APPROVE_OPTION)
808 FileFormatI format = chooser.getSelectedFormat();
811 Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
814 startupFileTextfield.setText(chooser.getSelectedFile()
826 public void cancel_actionPerformed(ActionEvent e)
830 wsPrefs.updateWsMenuConfig(true);
831 wsPrefs.refreshWs_actionPerformed(e);
832 frame.setClosed(true);
833 } catch (Exception ex)
845 public void annotations_actionPerformed(ActionEvent e)
847 conservation.setEnabled(annotations.isSelected());
848 quality.setEnabled(annotations.isSelected());
849 identity.setEnabled(annotations.isSelected());
850 showGroupConsensus.setEnabled(annotations.isSelected());
851 showGroupConservation.setEnabled(annotations.isSelected());
852 showConsensHistogram.setEnabled(annotations.isSelected()
853 && (identity.isSelected() || showGroupConsensus.isSelected()));
854 showConsensLogo.setEnabled(annotations.isSelected()
855 && (identity.isSelected() || showGroupConsensus.isSelected()));
859 public void newLink_actionPerformed(ActionEvent e)
861 GSequenceLink link = new GSequenceLink();
862 boolean valid = false;
865 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
866 MessageManager.getString("label.new_sequence_url_link"),
867 JvOptionPane.OK_CANCEL_OPTION, -1, null) == JvOptionPane.OK_OPTION)
869 if (link.checkValid())
871 if (((UrlLinkTableModel) linkUrlTable.getModel())
872 .isUniqueName(link.getName()))
874 ((UrlLinkTableModel) linkUrlTable.getModel()).insertRow(
875 link.getName(), link.getURL());
880 link.notifyDuplicate();
893 public void editLink_actionPerformed(ActionEvent e)
895 GSequenceLink link = new GSequenceLink();
897 int index = linkUrlTable.getSelectedRow();
900 // button no longer enabled if row is not selected
901 Cache.log.debug("Edit with no row selected in linkUrlTable");
905 link.setName(linkUrlTable.getValueAt(index, 0).toString());
906 link.setURL(linkUrlTable.getValueAt(index, 1).toString());
908 boolean valid = false;
911 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
912 MessageManager.getString("label.edit_sequence_url_link"),
913 JvOptionPane.OK_CANCEL_OPTION, -1, null) == JvOptionPane.OK_OPTION)
915 if (link.checkValid())
917 if (((UrlLinkTableModel) linkUrlTable.getModel())
918 .isUniqueName(link.getName()))
920 linkUrlTable.setValueAt(link.getName(), index, 0);
921 linkUrlTable.setValueAt(link.getURL(), index, 1);
926 link.notifyDuplicate();
939 public void deleteLink_actionPerformed(ActionEvent e)
941 int index = linkUrlTable.getSelectedRow();
945 // button no longer enabled if row is not selected
946 Cache.log.debug("Delete with no row selected in linkUrlTable");
951 modelIndex = linkUrlTable.convertRowIndexToModel(index);
954 // make sure we use the model index to delete, and not the table index
955 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
960 public void defaultBrowser_mouseClicked(MouseEvent e)
962 JFileChooser chooser = new JFileChooser(".");
963 chooser.setDialogTitle(MessageManager
964 .getString("label.select_default_browser"));
966 int value = chooser.showOpenDialog(this);
968 if (value == JFileChooser.APPROVE_OPTION)
970 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
979 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
983 protected void showunconserved_actionPerformed(ActionEvent e)
985 // TODO Auto-generated method stub
986 super.showunconserved_actionPerformed(e);
989 public static List<String> getGroupURLLinks()
991 return groupURLLinks;
995 public void minColour_actionPerformed(JPanel panel)
997 Color col = JColorChooser.showDialog(this,
998 MessageManager.getString("label.select_colour_minimum_value"),
999 minColour.getBackground());
1002 panel.setBackground(col);
1008 public void maxColour_actionPerformed(JPanel panel)
1010 Color col = JColorChooser.showDialog(this,
1011 MessageManager.getString("label.select_colour_maximum_value"),
1012 maxColour.getBackground());
1015 panel.setBackground(col);
1021 protected void userIdWidth_actionPerformed()
1025 String val = userIdWidth.getText().trim();
1026 if (val.length() > 0)
1028 Integer iw = Integer.parseInt(val);
1029 if (iw.intValue() < 12)
1031 throw new NumberFormatException();
1033 userIdWidth.setText(iw.toString());
1035 } catch (NumberFormatException x)
1037 JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
1038 .getString("warn.user_defined_width_requirements"),
1039 MessageManager.getString("label.invalid_id_column_width"),
1040 JvOptionPane.WARNING_MESSAGE);
1041 userIdWidth.setText("");
1046 protected void autoIdWidth_actionPerformed()
1048 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1049 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1053 * Returns true if chimera path is to a valid executable, else show an error
1056 private boolean validateChimeraPath()
1058 if (chimeraPath.getText().trim().length() > 0)
1060 File f = new File(chimeraPath.getText());
1061 if (!f.canExecute())
1063 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1064 MessageManager.getString("label.invalid_chimera_path"),
1065 MessageManager.getString("label.invalid_name"),
1066 JvOptionPane.ERROR_MESSAGE);
1074 * If Chimera is selected, check it can be found on default or user-specified
1075 * path, if not show a warning/help dialog.
1078 protected void structureViewer_actionPerformed(String selectedItem)
1080 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1084 boolean found = false;
1087 * Try user-specified and standard paths for Chimera executable.
1089 List<String> paths = StructureManager.getChimeraPaths();
1090 paths.add(0, chimeraPath.getText());
1091 for (String path : paths)
1093 if (new File(path.trim()).canExecute())
1101 String[] options = { "OK", "Help" };
1102 int showHelp = JvOptionPane.showInternalOptionDialog(
1104 JvSwingUtils.wrapTooltip(true,
1105 MessageManager.getString("label.chimera_missing")),
1106 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1107 null, options, options[0]);
1108 if (showHelp == JvOptionPane.NO_OPTION)
1112 Help.showHelpWindow(HelpId.StructureViewer);
1113 } catch (HelpSetException e)
1115 e.printStackTrace();
1121 public class OptionsParam
1123 private String name;
1125 private String code;
1127 public OptionsParam(String name, String code)
1133 public String getName()
1138 public void setName(String name)
1143 public String getCode()
1148 public void setCode(String code)
1154 public String toString()
1160 public boolean equals(Object that)
1162 if (!(that instanceof OptionsParam))
1166 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1170 public int hashCode()
1172 return name.hashCode() + code.hashCode();
1176 private class UrlListSelectionHandler implements ListSelectionListener
1180 public void valueChanged(ListSelectionEvent e)
1182 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1184 int index = lsm.getMinSelectionIndex();
1187 // no selection, so disable delete/edit buttons
1188 editLink.setEnabled(false);
1189 deleteLink.setEnabled(false);
1192 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1194 // enable/disable edit and delete link buttons
1195 if (((UrlLinkTableModel) linkUrlTable.getModel())
1196 .isRowDeletable(modelIndex))
1198 deleteLink.setEnabled(true);
1202 deleteLink.setEnabled(false);
1205 if (((UrlLinkTableModel) linkUrlTable.getModel())
1206 .isRowEditable(modelIndex))
1208 editLink.setEnabled(true);
1212 editLink.setEnabled(false);