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 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
907 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
909 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
910 link.setName(oldName);
911 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
913 boolean valid = false;
916 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
917 MessageManager.getString("label.edit_sequence_url_link"),
918 JvOptionPane.OK_CANCEL_OPTION, -1, null) == JvOptionPane.OK_OPTION)
920 if (link.checkValid())
922 if ((oldName.equals(link.getName()))
923 || (((UrlLinkTableModel) linkUrlTable.getModel())
924 .isUniqueName(link.getName())))
926 linkUrlTable.setValueAt(link.getName(), index, nameCol);
927 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
932 link.notifyDuplicate();
945 public void deleteLink_actionPerformed(ActionEvent e)
947 int index = linkUrlTable.getSelectedRow();
951 // button no longer enabled if row is not selected
952 Cache.log.debug("Delete with no row selected in linkUrlTable");
957 modelIndex = linkUrlTable.convertRowIndexToModel(index);
960 // make sure we use the model index to delete, and not the table index
961 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
966 public void defaultBrowser_mouseClicked(MouseEvent e)
968 JFileChooser chooser = new JFileChooser(".");
969 chooser.setDialogTitle(MessageManager
970 .getString("label.select_default_browser"));
972 int value = chooser.showOpenDialog(this);
974 if (value == JFileChooser.APPROVE_OPTION)
976 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
985 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
989 protected void showunconserved_actionPerformed(ActionEvent e)
991 // TODO Auto-generated method stub
992 super.showunconserved_actionPerformed(e);
995 public static List<String> getGroupURLLinks()
997 return groupURLLinks;
1001 public void minColour_actionPerformed(JPanel panel)
1003 Color col = JColorChooser.showDialog(this,
1004 MessageManager.getString("label.select_colour_minimum_value"),
1005 minColour.getBackground());
1008 panel.setBackground(col);
1014 public void maxColour_actionPerformed(JPanel panel)
1016 Color col = JColorChooser.showDialog(this,
1017 MessageManager.getString("label.select_colour_maximum_value"),
1018 maxColour.getBackground());
1021 panel.setBackground(col);
1027 protected void userIdWidth_actionPerformed()
1031 String val = userIdWidth.getText().trim();
1032 if (val.length() > 0)
1034 Integer iw = Integer.parseInt(val);
1035 if (iw.intValue() < 12)
1037 throw new NumberFormatException();
1039 userIdWidth.setText(iw.toString());
1041 } catch (NumberFormatException x)
1043 JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
1044 .getString("warn.user_defined_width_requirements"),
1045 MessageManager.getString("label.invalid_id_column_width"),
1046 JvOptionPane.WARNING_MESSAGE);
1047 userIdWidth.setText("");
1052 protected void autoIdWidth_actionPerformed()
1054 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1055 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1059 * Returns true if chimera path is to a valid executable, else show an error
1062 private boolean validateChimeraPath()
1064 if (chimeraPath.getText().trim().length() > 0)
1066 File f = new File(chimeraPath.getText());
1067 if (!f.canExecute())
1069 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1070 MessageManager.getString("label.invalid_chimera_path"),
1071 MessageManager.getString("label.invalid_name"),
1072 JvOptionPane.ERROR_MESSAGE);
1080 * If Chimera is selected, check it can be found on default or user-specified
1081 * path, if not show a warning/help dialog.
1084 protected void structureViewer_actionPerformed(String selectedItem)
1086 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1090 boolean found = false;
1093 * Try user-specified and standard paths for Chimera executable.
1095 List<String> paths = StructureManager.getChimeraPaths();
1096 paths.add(0, chimeraPath.getText());
1097 for (String path : paths)
1099 if (new File(path.trim()).canExecute())
1107 String[] options = { "OK", "Help" };
1108 int showHelp = JvOptionPane.showInternalOptionDialog(
1110 JvSwingUtils.wrapTooltip(true,
1111 MessageManager.getString("label.chimera_missing")),
1112 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1113 null, options, options[0]);
1114 if (showHelp == JvOptionPane.NO_OPTION)
1118 Help.showHelpWindow(HelpId.StructureViewer);
1119 } catch (HelpSetException e)
1121 e.printStackTrace();
1127 public class OptionsParam
1129 private String name;
1131 private String code;
1133 public OptionsParam(String name, String code)
1139 public String getName()
1144 public void setName(String name)
1149 public String getCode()
1154 public void setCode(String code)
1160 public String toString()
1166 public boolean equals(Object that)
1168 if (!(that instanceof OptionsParam))
1172 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1176 public int hashCode()
1178 return name.hashCode() + code.hashCode();
1182 private class UrlListSelectionHandler implements ListSelectionListener
1186 public void valueChanged(ListSelectionEvent e)
1188 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1190 int index = lsm.getMinSelectionIndex();
1193 // no selection, so disable delete/edit buttons
1194 editLink.setEnabled(false);
1195 deleteLink.setEnabled(false);
1198 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1200 // enable/disable edit and delete link buttons
1201 if (((UrlLinkTableModel) linkUrlTable.getModel())
1202 .isRowDeletable(modelIndex))
1204 deleteLink.setEnabled(true);
1208 deleteLink.setEnabled(false);
1211 if (((UrlLinkTableModel) linkUrlTable.getModel())
1212 .isRowEditable(modelIndex))
1214 editLink.setEnabled(true);
1218 editLink.setEnabled(false);