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.BackupFiles;
28 import jalview.io.FileFormatI;
29 import jalview.io.JalviewFileChooser;
30 import jalview.io.JalviewFileView;
31 import jalview.jbgui.GPreferences;
32 import jalview.jbgui.GSequenceLink;
33 import jalview.schemes.ColourSchemeI;
34 import jalview.schemes.ColourSchemes;
35 import jalview.schemes.ResidueColourScheme;
36 import jalview.urls.UrlLinkTableModel;
37 import jalview.urls.api.UrlProviderFactoryI;
38 import jalview.urls.api.UrlProviderI;
39 import jalview.urls.desktop.DesktopUrlProviderFactory;
40 import jalview.util.BrowserLauncher;
41 import jalview.util.MessageManager;
42 import jalview.util.Platform;
43 import jalview.util.UrlConstants;
44 import jalview.ws.sifts.SiftsSettings;
46 import java.awt.BorderLayout;
47 import java.awt.Color;
48 import java.awt.Component;
49 import java.awt.Dimension;
51 import java.awt.event.ActionEvent;
52 import java.awt.event.ActionListener;
53 import java.awt.event.MouseEvent;
55 import java.util.ArrayList;
56 import java.util.List;
58 import javax.help.HelpSetException;
59 import javax.swing.JComboBox;
60 import javax.swing.JFileChooser;
61 import javax.swing.JInternalFrame;
62 import javax.swing.JPanel;
63 import javax.swing.ListSelectionModel;
64 import javax.swing.RowFilter;
65 import javax.swing.RowSorter;
66 import javax.swing.SortOrder;
67 import javax.swing.event.DocumentEvent;
68 import javax.swing.event.DocumentListener;
69 import javax.swing.event.ListSelectionEvent;
70 import javax.swing.event.ListSelectionListener;
71 import javax.swing.table.TableCellRenderer;
72 import javax.swing.table.TableColumn;
73 import javax.swing.table.TableModel;
74 import javax.swing.table.TableRowSorter;
76 import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
84 @SuppressWarnings("serial")
85 public class Preferences extends GPreferences
87 public static final String ADD_SS_ANN = "ADD_SS_ANN";
89 public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
91 public static final String ALLOW_UNPUBLISHED_PDB_QUERYING = "ALLOW_UNPUBLISHED_PDB_QUERYING";
93 public static final String ANNOTATIONCOLOUR_MAX = "ANNOTATIONCOLOUR_MAX";
95 public static final String ANNOTATIONCOLOUR_MIN = "ANNOTATIONCOLOUR_MIN";
97 public static final String ANTI_ALIAS = "ANTI_ALIAS";
99 public static final String AUTO_CALC_CONSENSUS = "AUTO_CALC_CONSENSUS";
101 public static final String AUTOASSOCIATE_PDBANDSEQS = "AUTOASSOCIATE_PDBANDSEQS";
103 public static final String BLOSUM62_PCA_FOR_NUCLEOTIDE = "BLOSUM62_PCA_FOR_NUCLEOTIDE";
105 public static final String CENTRE_COLUMN_LABELS = "CENTRE_COLUMN_LABELS";
107 public static final String CHIMERA_PATH = "CHIMERA_PATH";
109 public static final String DBREFFETCH_USEPICR = "DBREFFETCH_USEPICR";
111 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
113 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
115 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
117 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
119 public static final String FIGURE_AUTOIDWIDTH = "FIGURE_AUTOIDWIDTH";
121 public static final String FIGURE_FIXEDIDWIDTH = "FIGURE_FIXEDIDWIDTH";
123 public static final String FOLLOW_SELECTIONS = "FOLLOW_SELECTIONS";
125 public static final String FONT_NAME = "FONT_NAME";
127 public static final String FONT_SIZE = "FONT_SIZE";
129 public static final String FONT_STYLE = "FONT_STYLE";
131 public static final String GAP_COLOUR = "GAP_COLOUR";
133 public static final String GAP_SYMBOL = "GAP_SYMBOL";
135 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
137 public static final String HIDE_INTRONS = "HIDE_INTRONS";
139 public static final String ID_ITALICS = "ID_ITALICS";
141 public static final String ID_ORG_HOSTURL = "ID_ORG_HOSTURL";
143 public static final String MAP_WITH_SIFTS = "MAP_WITH_SIFTS";
145 public static final String NOQUESTIONNAIRES = "NOQUESTIONNAIRES";
147 public static final String NORMALISE_CONSENSUS_LOGO = "NORMALISE_CONSENSUS_LOGO";
149 public static final String NORMALISE_LOGO = "NORMALISE_LOGO";
151 public static final String PAD_GAPS = "PAD_GAPS";
153 public static final String PDB_DOWNLOAD_FORMAT = "PDB_DOWNLOAD_FORMAT";
155 public static final String QUESTIONNAIRE = "QUESTIONNAIRE";
157 public static final String RELAXEDSEQIDMATCHING = "RELAXEDSEQIDMATCHING";
159 public static final String RIGHT_ALIGN_IDS = "RIGHT_ALIGN_IDS";
161 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
163 public static final String SHOW_ANNOTATIONS = "SHOW_ANNOTATIONS";
165 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
167 public static final String SHOW_CONSENSUS = "SHOW_CONSENSUS";
169 public static final String SHOW_CONSENSUS_HISTOGRAM = "SHOW_CONSENSUS_HISTOGRAM";
171 public static final String SHOW_CONSENSUS_LOGO = "SHOW_CONSENSUS_LOGO";
173 public static final String SHOW_CONSERVATION = "SHOW_CONSERVATION";
175 public static final String SHOW_DBREFS_TOOLTIP = "SHOW_DBREFS_TOOLTIP";
177 public static final String SHOW_GROUP_CONSENSUS = "SHOW_GROUP_CONSENSUS";
179 public static final String SHOW_GROUP_CONSERVATION = "SHOW_GROUP_CONSERVATION";
181 public static final String SHOW_JVSUFFIX = "SHOW_JVSUFFIX";
183 public static final String SHOW_NPFEATS_TOOLTIP = "SHOW_NPFEATS_TOOLTIP";
185 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
187 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
189 public static final String SHOW_OVERVIEW = "SHOW_OVERVIEW";
191 public static final String SHOW_QUALITY = "SHOW_QUALITY";
193 public static final String SHOW_UNCONSERVED = "SHOW_UNCONSERVED";
195 public static final String SORT_ALIGNMENT = "SORT_ALIGNMENT";
197 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
199 public static final String SORT_BY_TREE = "SORT_BY_TREE";
201 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
203 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
205 public static final String STRUCTURE_DIMENSIONS = "STRUCTURE_DIMENSIONS";
207 public static final String UNIPROT_DOMAIN = "UNIPROT_DOMAIN";
209 public static final String USE_FULL_SO = "USE_FULL_SO";
211 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
213 public static final String USE_RNAVIEW = "USE_RNAVIEW";
215 public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
217 public static final String WRAP_ALIGNMENT = "WRAP_ALIGNMENT";
220 private static final int MIN_FONT_SIZE = 1;
222 private static final int MAX_FONT_SIZE = 30;
225 * Holds name and link separated with | character. Sequence ID must be
226 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
228 public static UrlProviderI sequenceUrlLinks; // must be nonfinal for test
230 public final static UrlLinkTableModel dataModel;
233 * Holds name and link separated with | character. Sequence IDS and Sequences
234 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
235 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
236 * for first and second token specified after a pipe character at end |,|.
237 * (TODO: proper escape for using | to separate ids or sequences
240 public static final List<String> groupURLLinks; // not implemented
242 public static final String SHOW_IDENTITY = "SHOW_IDENTITY";
244 public static final String SHOW_FULLSCREEN = "SHOW_FULLSCREEN";
246 public static final Dimension DEFAULT_STRUCTURE_DIMENSIONS = new Dimension(
251 // get links selected to be in the menu (SEQUENCE_LINKS)
252 // and links entered by the user but not selected (STORED_LINKS)
253 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
254 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
255 String defaultUrl = Cache.getDefault("DEFAULT_URL",
256 UrlConstants.DEFAULT_LABEL);
258 // if both links lists are empty, add the DEFAULT_URL link
259 // otherwise we assume the default link is in one of the lists
260 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
262 inMenuString = UrlConstants.DEFAULT_STRING;
264 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
265 inMenuString, notInMenuString);
266 sequenceUrlLinks = factory.createUrlProvider();
267 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
270 * TODO: reformulate groupURL encoding so two or more can be stored in the
271 * .properties file as '|' separated strings
274 groupURLLinks = new ArrayList<>(); // not implemented
277 JInternalFrame frame;
279 private WsPreferences wsPrefs;
281 private OptionsParam promptEachTimeOpt = new OptionsParam(
282 MessageManager.getString("label.prompt_each_time"),
285 private OptionsParam lineArtOpt = new OptionsParam(
286 MessageManager.getString("label.lineart"), "Lineart");
288 private OptionsParam textOpt = new OptionsParam(
289 MessageManager.getString("action.text"), "Text");
292 * Creates a new Preferences object.
297 frame = new JInternalFrame();
298 frame.setContentPane(this);
299 if (!Platform.isJS())
306 wsPrefs = new WsPreferences();
307 wsTab.add(wsPrefs, BorderLayout.CENTER);
309 int width = 700, height = 510; // BH 2019.07.12 added 60 to height and 40 to
310 // width (for Visual check boxes and Links
311 // "Double Click" header)
312 // BH 2019.09.24 added 20 to width
313 // (structure panel was too small anyway, and I added a default dimension
315 if (Platform.isAMacAndNotJS())
318 height = 540; // BH 2019.07.12 added 30
321 Desktop.addInternalFrame(frame,
322 MessageManager.getString("label.preferences"), width, height);
323 frame.setMinimumSize(new Dimension(width, height));
326 * Set Visual tab defaults
328 seqLimit.setSelected(Cache.getDefault(SHOW_JVSUFFIX, true));
329 rightAlign.setSelected(Cache.getDefault(RIGHT_ALIGN_IDS, false));
330 fullScreen.setSelected(Cache.getDefault(SHOW_FULLSCREEN, false));
331 annotations.setSelected(Cache.getDefault(SHOW_ANNOTATIONS, true));
333 conservation.setSelected(Cache.getDefault(SHOW_CONSERVATION, true));
334 quality.setSelected(Cache.getDefault(SHOW_QUALITY, true));
335 identity.setSelected(Cache.getDefault(SHOW_IDENTITY, true));
336 openoverv.setSelected(Cache.getDefault(SHOW_OVERVIEW, false));
338 .setSelected(Cache.getDefault(SHOW_UNCONSERVED, false));
339 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
341 .setSelected(Cache.getDefault(SHOW_GROUP_CONSENSUS, false));
342 showGroupConservation.setSelected(
343 Cache.getDefault(SHOW_GROUP_CONSERVATION, false));
344 showConsensHistogram.setSelected(
345 Cache.getDefault(SHOW_CONSENSUS_HISTOGRAM, true));
347 .setSelected(Cache.getDefault(SHOW_CONSENSUS_LOGO, false));
349 .setSelected(Cache.getDefault(SHOW_NPFEATS_TOOLTIP, true));
351 .setSelected(Cache.getDefault(SHOW_DBREFS_TOOLTIP, true));
353 String[] fonts = java.awt.GraphicsEnvironment
354 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
355 for (int i = 0; i < fonts.length; i++)
357 fontNameCB.addItem(fonts[i]);
360 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
362 fontSizeCB.addItem(i + "");
365 fontStyleCB.addItem("plain");
366 fontStyleCB.addItem("bold");
367 fontStyleCB.addItem("italic");
369 fontNameCB.setSelectedItem(Cache.getDefault(FONT_NAME, "SansSerif"));
370 fontSizeCB.setSelectedItem(Cache.getDefault(FONT_SIZE, "10"));
371 fontStyleCB.setSelectedItem(
372 Cache.getDefault(FONT_STYLE, Font.PLAIN + ""));
374 smoothFont.setSelected(Cache.getDefault(ANTI_ALIAS, false));
376 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
378 idItalics.setSelected(Cache.getDefault(ID_ITALICS, true));
380 wrap.setSelected(Cache.getDefault(WRAP_ALIGNMENT, false));
382 gapSymbolCB.addItem("-");
383 gapSymbolCB.addItem(".");
385 gapSymbolCB.setSelectedItem(Cache.getDefault(GAP_SYMBOL, "-"));
387 sortby.addItem("No sort");
388 sortby.addItem("Id");
389 sortby.addItem("Pairwise Identity");
390 sortby.setSelectedItem(Cache.getDefault(SORT_ALIGNMENT, "No sort"));
392 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
394 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
396 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
397 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
398 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
399 SequenceAnnotationOrder.NONE.name()));
400 sortAnnBy.setSelectedItem(savedSort.toString());
402 sortAutocalc.addItem("Autocalculated first");
403 sortAutocalc.addItem("Autocalculated last");
404 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
405 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
406 : sortAutocalc.getItemAt(1));
408 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
409 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
410 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
411 + "/examples/exampleFile_2_3.jar"));
414 * Set Colours tab defaults
416 protColour.addItem(ResidueColourScheme.NONE);
417 nucColour.addItem(ResidueColourScheme.NONE);
418 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
420 String name = cs.getSchemeName();
421 protColour.addItem(name);
422 nucColour.addItem(name);
424 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
425 ResidueColourScheme.NONE);
426 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
427 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
428 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
429 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
430 minColour.setBackground(
431 Cache.getDefaultColour(ANNOTATIONCOLOUR_MIN, Color.orange));
432 maxColour.setBackground(
433 Cache.getDefaultColour(ANNOTATIONCOLOUR_MAX, Color.red));
436 * Set overview panel defaults
438 gapColour.setBackground(
439 Cache.getDefaultColour(GAP_COLOUR,
440 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
441 hiddenColour.setBackground(
442 Cache.getDefaultColour(HIDDEN_COLOUR,
443 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
444 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
445 gapLabel.setEnabled(!useLegacyGap.isSelected());
446 gapColour.setEnabled(!useLegacyGap.isSelected());
448 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
451 * Set Structure tab defaults.
453 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
454 structFromPdb.setSelected(structSelected);
455 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
456 useRnaView.setEnabled(structSelected);
457 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
458 addSecondaryStructure.setEnabled(structSelected);
459 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
460 addTempFactor.setEnabled(structSelected);
461 if (!Platform.isJS())
463 structViewer.setSelectedItem(
464 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
466 Dimension d = Cache.getDefaultDim(STRUCTURE_DIMENSIONS,
467 DEFAULT_STRUCTURE_DIMENSIONS);
468 String s = d.width + "," + d.height;
469 structureDimensions.setText(s);
470 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
471 chimeraPath.addActionListener(new ActionListener()
474 public void actionPerformed(ActionEvent e)
476 validateChimeraPath();
480 if (Cache.getDefault(MAP_WITH_SIFTS, false))
482 siftsMapping.setSelected(true);
486 nwMapping.setSelected(true);
490 .setMapWithSifts(Cache.getDefault(MAP_WITH_SIFTS, false));
493 * Set Connections tab defaults
497 linkUrlTable.setModel(dataModel);
498 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
499 linkUrlTable.getModel());
500 linkUrlTable.setRowSorter(sorter);
501 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
503 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
504 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
505 SortOrder.DESCENDING));
506 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
507 SortOrder.DESCENDING));
509 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
511 sorter.setSortKeys(sortKeys);
512 // BH 2018 setSortKeys will do the sort
516 ActionListener onReset;
517 onReset = new ActionListener()
520 public void actionPerformed(ActionEvent e)
522 filterTB.setText("");
523 sorter.setRowFilter(RowFilter.regexFilter(""));
527 doReset.addActionListener(onReset);
529 // filter to display only custom urls
530 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
533 public boolean include(
534 Entry<? extends TableModel, ? extends Object> entry)
536 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
540 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
541 linkUrlTable.getModel());
542 customSorter.setRowFilter(customUrlFilter);
544 ActionListener onCustomOnly;
545 onCustomOnly = new ActionListener()
548 public void actionPerformed(ActionEvent e)
550 filterTB.setText("");
551 sorter.setRowFilter(customUrlFilter);
554 userOnly.addActionListener(onCustomOnly);
556 filterTB.getDocument().addDocumentListener(new DocumentListener()
558 String caseInsensitiveFlag = "(?i)";
561 public void changedUpdate(DocumentEvent e)
563 sorter.setRowFilter(RowFilter
564 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
568 public void removeUpdate(DocumentEvent e)
570 sorter.setRowFilter(RowFilter
571 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
575 public void insertUpdate(DocumentEvent e)
577 sorter.setRowFilter(RowFilter
578 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
582 // set up list selection functionality
583 linkUrlTable.getSelectionModel()
584 .addListSelectionListener(new UrlListSelectionHandler());
586 // set up radio buttons
587 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
589 String onClickName = linkUrlTable.getColumnName(onClickCol);
590 linkUrlTable.getColumn(onClickName)
591 .setCellRenderer(new RadioButtonRenderer());
592 linkUrlTable.getColumn(onClickName)
593 .setCellEditor(new RadioButtonEditor());
595 // get boolean columns and resize those to min possible
596 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
598 if (linkUrlTable.getModel().getColumnClass(column)
599 .equals(Boolean.class))
601 TableColumn tableColumn = linkUrlTable.getColumnModel()
603 int preferredWidth = tableColumn.getMinWidth();
605 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
607 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
608 int cwidth = c.getPreferredSize().width
609 + linkUrlTable.getIntercellSpacing().width;
610 preferredWidth = Math.max(preferredWidth, cwidth);
612 tableColumn.setPreferredWidth(preferredWidth);
616 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
617 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
618 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
619 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
621 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
623 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
624 // note antisense here: default is true
626 .setSelected(Cache.getProperty(NOQUESTIONNAIRES) == null);
627 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
630 * Set Output tab defaults
632 setupOutputCombo(epsRendering, "EPS_RENDERING");
633 setupOutputCombo(htmlRendering, "HTML_RENDERING");
634 setupOutputCombo(svgRendering, "SVG_RENDERING");
635 autoIdWidth.setSelected(Cache.getDefault(FIGURE_AUTOIDWIDTH, false));
636 userIdWidth.setEnabled(!autoIdWidth.isSelected());
637 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
638 Integer wi = Cache.getIntegerProperty(FIGURE_FIXEDIDWIDTH);
639 userIdWidth.setText(wi == null ? "" : wi.toString());
640 // TODO: refactor to use common enum via FormatAdapter and allow extension
641 // for new flat file formats
642 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
643 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
644 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
645 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
646 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
647 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
648 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
649 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
651 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
654 * Set Editing tab defaults
656 autoCalculateConsCheck
657 .setSelected(Cache.getDefault(AUTO_CALC_CONSENSUS, true));
658 padGaps.setSelected(Cache.getDefault(PAD_GAPS, false));
659 sortByTree.setSelected(Cache.getDefault(SORT_BY_TREE, false));
661 annotations_actionPerformed(null); // update the display of the annotation
666 * Set Backups tab defaults
668 if (!Platform.isJS())
670 loadLastSavedBackupsOptions();
676 * A helper method that sets the items and initial selection in a character
677 * rendering option list (Prompt each time/Lineart/Text)
682 protected void setupOutputCombo(JComboBox<Object> comboBox,
685 comboBox.addItem(promptEachTimeOpt);
686 comboBox.addItem(lineArtOpt);
687 comboBox.addItem(textOpt);
690 * JalviewJS doesn't support Lineart so force it to Text
692 String defaultOption = Platform.isJS() ? "Text"
693 : Cache.getDefault(propertyKey, "Prompt each time");
694 if (defaultOption.equalsIgnoreCase("Text"))
696 comboBox.setSelectedItem(textOpt);
698 else if (defaultOption.equalsIgnoreCase("Lineart"))
700 comboBox.setSelectedItem(lineArtOpt);
704 comboBox.setSelectedItem(promptEachTimeOpt);
709 * Save user selections on the Preferences tabs to the Cache and write out to
715 public void ok_actionPerformed(ActionEvent e)
717 if (!validateSettings())
723 * Save Visual settings
725 Cache.setPropertyNoSave(SHOW_JVSUFFIX,
726 Boolean.toString(seqLimit.isSelected()));
727 Cache.setPropertyNoSave(RIGHT_ALIGN_IDS,
728 Boolean.toString(rightAlign.isSelected()));
729 Cache.setPropertyNoSave(SHOW_FULLSCREEN,
730 Boolean.toString(fullScreen.isSelected()));
731 Cache.setPropertyNoSave(SHOW_OVERVIEW,
732 Boolean.toString(openoverv.isSelected()));
733 Cache.setPropertyNoSave(SHOW_ANNOTATIONS,
734 Boolean.toString(annotations.isSelected()));
735 Cache.setPropertyNoSave(SHOW_CONSERVATION,
736 Boolean.toString(conservation.isSelected()));
737 Cache.setPropertyNoSave(SHOW_QUALITY,
738 Boolean.toString(quality.isSelected()));
739 Cache.setPropertyNoSave(SHOW_IDENTITY,
740 Boolean.toString(identity.isSelected()));
742 Cache.setPropertyNoSave(GAP_SYMBOL,
743 gapSymbolCB.getSelectedItem().toString());
745 Cache.setPropertyNoSave(FONT_NAME,
746 fontNameCB.getSelectedItem().toString());
747 Cache.setPropertyNoSave(FONT_STYLE,
748 fontStyleCB.getSelectedItem().toString());
749 Cache.setPropertyNoSave(FONT_SIZE,
750 fontSizeCB.getSelectedItem().toString());
752 Cache.setPropertyNoSave(ID_ITALICS,
753 Boolean.toString(idItalics.isSelected()));
754 Cache.setPropertyNoSave(SHOW_UNCONSERVED,
755 Boolean.toString(showUnconserved.isSelected()));
756 Cache.setPropertyNoSave(SHOW_OCCUPANCY,
757 Boolean.toString(showOccupancy.isSelected()));
758 Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS,
759 Boolean.toString(showGroupConsensus.isSelected()));
760 Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION,
761 Boolean.toString(showGroupConservation.isSelected()));
762 Cache.setPropertyNoSave(SHOW_CONSENSUS_HISTOGRAM,
763 Boolean.toString(showConsensHistogram.isSelected()));
764 Cache.setPropertyNoSave(SHOW_CONSENSUS_LOGO,
765 Boolean.toString(showConsensLogo.isSelected()));
766 Cache.setPropertyNoSave(ANTI_ALIAS,
767 Boolean.toString(smoothFont.isSelected()));
768 Cache.setPropertyNoSave(SCALE_PROTEIN_TO_CDNA,
769 Boolean.toString(scaleProteinToCdna.isSelected()));
770 Cache.setPropertyNoSave(SHOW_NPFEATS_TOOLTIP,
771 Boolean.toString(showNpTooltip.isSelected()));
772 Cache.setPropertyNoSave(SHOW_DBREFS_TOOLTIP,
773 Boolean.toString(showDbRefTooltip.isSelected()));
775 Cache.setPropertyNoSave(WRAP_ALIGNMENT,
776 Boolean.toString(wrap.isSelected()));
778 Cache.setPropertyNoSave("STARTUP_FILE", startupFileTextfield.getText());
779 Cache.setPropertyNoSave("SHOW_STARTUP_FILE",
780 Boolean.toString(startupCheckbox.isSelected()));
782 Cache.setPropertyNoSave(SORT_ALIGNMENT,
783 sortby.getSelectedItem().toString());
785 // convert description of sort order to enum name for save
786 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
787 .forDescription(sortAnnBy.getSelectedItem().toString());
788 if (annSortOrder != null)
790 Cache.setPropertyNoSave(SORT_ANNOTATIONS, annSortOrder.name());
793 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
794 Cache.setPropertyNoSave(SHOW_AUTOCALC_ABOVE,
795 Boolean.valueOf(showAutocalcFirst).toString());
798 * Save Colours settings
800 Cache.setPropertyNoSave(DEFAULT_COLOUR_PROT,
801 protColour.getSelectedItem().toString());
802 Cache.setPropertyNoSave(DEFAULT_COLOUR_NUC,
803 nucColour.getSelectedItem().toString());
804 Cache.setColourPropertyNoSave(ANNOTATIONCOLOUR_MIN,
805 minColour.getBackground());
806 Cache.setColourPropertyNoSave(ANNOTATIONCOLOUR_MAX,
807 maxColour.getBackground());
810 * Save Overview settings
812 Cache.setColourPropertyNoSave(GAP_COLOUR, gapColour.getBackground());
813 Cache.setColourPropertyNoSave(HIDDEN_COLOUR,
814 hiddenColour.getBackground());
815 Cache.setPropertyNoSave(USE_LEGACY_GAP,
816 Boolean.toString(useLegacyGap.isSelected()));
817 Cache.setPropertyNoSave(SHOW_OV_HIDDEN_AT_START,
818 Boolean.toString(showHiddenAtStart.isSelected()));
821 * Save Structure settings
823 Cache.setPropertyNoSave(ADD_TEMPFACT_ANN,
824 Boolean.toString(addTempFactor.isSelected()));
825 Cache.setPropertyNoSave(ADD_SS_ANN,
826 Boolean.toString(addSecondaryStructure.isSelected()));
827 Cache.setPropertyNoSave(USE_RNAVIEW,
828 Boolean.toString(useRnaView.isSelected()));
829 Cache.setPropertyNoSave(STRUCT_FROM_PDB,
830 Boolean.toString(structFromPdb.isSelected()));
831 Cache.setPropertyNoSave(STRUCTURE_DISPLAY,
832 structViewer.getSelectedItem().toString());
833 Cache.setPropertyNoSave(STRUCTURE_DIMENSIONS,
834 structureDimensions.getText()); // BH 2019.07.12
835 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
836 Cache.setPropertyNoSave(MAP_WITH_SIFTS,
837 Boolean.toString(siftsMapping.isSelected()));
838 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
841 * Save Output settings
843 Cache.setPropertyNoSave("EPS_RENDERING",
844 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
845 Cache.setPropertyNoSave("HTML_RENDERING",
846 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
847 Cache.setPropertyNoSave("SVG_RENDERING",
848 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
850 if (!Platform.isJS())
856 // Save Connections settings
857 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
858 BrowserLauncher.resetBrowser();
861 // save user-defined and selected links
862 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
863 if (menuLinks.isEmpty())
865 Cache.removePropertyNoSave("SEQUENCE_LINKS");
869 Cache.setPropertyNoSave("SEQUENCE_LINKS", menuLinks.toString());
872 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
873 if (nonMenuLinks.isEmpty())
875 Cache.removePropertyNoSave("STORED_LINKS");
879 Cache.setPropertyNoSave("STORED_LINKS", nonMenuLinks.toString());
882 Cache.setPropertyNoSave("DEFAULT_URL",
883 sequenceUrlLinks.getPrimaryUrlId());
885 Cache.setPropertyNoSave("USE_PROXY",
886 Boolean.toString(useProxy.isSelected()));
888 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
890 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
892 if (useProxy.isSelected())
894 System.setProperty("http.proxyHost", proxyServerTB.getText());
895 System.setProperty("http.proxyPort", proxyPortTB.getText());
899 System.setProperty("http.proxyHost", "");
900 System.setProperty("http.proxyPort", "");
902 Cache.setProperty("VERSION_CHECK",
903 Boolean.toString(versioncheck.isSelected()));
904 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
906 // default is false - we only set this if the user has actively agreed
907 Cache.setProperty("USAGESTATS",
908 Boolean.toString(usagestats.isSelected()));
910 if (!questionnaire.isSelected())
912 Cache.setProperty(NOQUESTIONNAIRES, "true");
916 // special - made easy to edit a property file to disable questionnaires
917 // by just adding the given line
918 Cache.removeProperty(NOQUESTIONNAIRES);
922 * Save Output settings
924 Cache.setPropertyNoSave("BLC_JVSUFFIX",
925 Boolean.toString(blcjv.isSelected()));
926 Cache.setPropertyNoSave("CLUSTAL_JVSUFFIX",
927 Boolean.toString(clustaljv.isSelected()));
928 Cache.setPropertyNoSave("FASTA_JVSUFFIX",
929 Boolean.toString(fastajv.isSelected()));
930 Cache.setPropertyNoSave("MSF_JVSUFFIX",
931 Boolean.toString(msfjv.isSelected()));
932 Cache.setPropertyNoSave("PFAM_JVSUFFIX",
933 Boolean.toString(pfamjv.isSelected()));
934 Cache.setPropertyNoSave("PILEUP_JVSUFFIX",
935 Boolean.toString(pileupjv.isSelected()));
936 Cache.setPropertyNoSave("PIR_JVSUFFIX",
937 Boolean.toString(pirjv.isSelected()));
938 Cache.setPropertyNoSave("PIR_MODELLER",
939 Boolean.toString(modellerOutput.isSelected()));
940 Cache.setPropertyNoSave("EXPORT_EMBBED_BIOJSON",
941 Boolean.toString(embbedBioJSON.isSelected()));
942 Cache.setPropertyNoSave(FIGURE_AUTOIDWIDTH,
943 Boolean.toString(autoIdWidth.isSelected()));
944 userIdWidth_actionPerformed();
945 Cache.setPropertyNoSave("FIGURE_FIXEDIDWIDTH", userIdWidth.getText());
948 * Save Editing settings
950 Cache.setPropertyNoSave(AUTO_CALC_CONSENSUS,
951 Boolean.toString(autoCalculateConsCheck.isSelected()));
952 Cache.setPropertyNoSave(SORT_BY_TREE,
953 Boolean.toString(sortByTree.isSelected()));
954 Cache.setPropertyNoSave(PAD_GAPS,
955 Boolean.toString(padGaps.isSelected()));
957 if (!Platform.isJS())
959 wsPrefs.updateAndRefreshWsMenuConfig(false);
961 * Save Backups settings
963 Cache.setPropertyNoSave(BackupFiles.CONFIRM_DELETE_OLD,
964 Boolean.toString(backupfilesConfirmDelete.isSelected()));
965 Cache.setPropertyNoSave(BackupFiles.ENABLED,
966 Boolean.toString(enableBackupFiles.isSelected()));
967 Cache.setPropertyNoSave(BackupFiles.NO_MAX,
968 Boolean.toString(backupfilesKeepAll.isSelected()));
969 Cache.setPropertyNoSave(BackupFiles.REVERSE_ORDER,
970 Boolean.toString(suffixReverse.isSelected()));
971 Cache.setPropertyNoSave(BackupFiles.SUFFIX, suffixTemplate.getText());
972 Cache.setPropertyNoSave(BackupFiles.ROLL_MAX, Integer
973 .toString(getSpinnerInt(backupfilesRollMaxSpinner, 4)));
974 Cache.setPropertyNoSave(BackupFiles.SUFFIX_DIGITS,
975 Integer.toString(getSpinnerInt(suffixDigitsSpinner, 3)));
976 Cache.setPropertyNoSave(BackupFiles.NS + "_PRESET", Integer
977 .toString(getComboIntStringKey(backupfilesPresetsCombo)));
981 Cache.saveProperties();
982 Desktop.getInstance().doConfigureStructurePrefs();
985 frame.setClosed(true);
986 } catch (Exception ex)
991 public static void setAppletDefaults()
994 // http://www.jalview.org/old/v2_8/examples/appletParameters.html
996 // showConservation true or false Default is true.
997 // showQuality true or false Default is true.
998 // showConsensus true or false Default is true.
999 // showFeatureSettings true or false Shows the feature settings window when
1001 // showTreeBootstraps true or false (default is true) show or hide branch
1003 // showTreeDistances true or false (default is true) show or hide branch
1005 // showUnlinkedTreeNodes true or false (default is false) indicate if
1006 // unassociated nodes should be highlighted in the tree view
1007 // showUnconserved true of false (default is false) When true, only gaps and
1008 // symbols different to the consensus sequence ions of the alignment
1009 // showGroupConsensus true of false (default is false) When true, shows
1010 // consensus annotation row for any groups on the alignment. (since 2.7)
1011 // showGroupConservation true of false (default is false) When true, shows
1012 // amino-acid property conservation annotation row for any groups on the
1013 // showConsensusHistogram true of false (default is true) When true, shows
1014 // the percentage occurence of the consensus symbol for each column as a
1015 // showSequenceLogo true of false (default is false) When true, shows a
1016 // sequence logo above the consensus sequence (overlaid above the Consensus
1018 Cache.setPropertyNoSave(SHOW_CONSERVATION, "true");
1019 Cache.setPropertyNoSave(SHOW_QUALITY, "false");
1020 Cache.setPropertyNoSave(SHOW_CONSENSUS, "true");
1021 Cache.setPropertyNoSave(SHOW_UNCONSERVED, "false");
1022 Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION, "false");
1023 Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS, "false");
1025 // TODO -- just a start here
1029 * Do any necessary validation before saving settings. Return focus to the
1030 * first tab which fails validation.
1034 private boolean validateSettings()
1036 if (!validateStructure())
1038 structureTab.requestFocusInWindow();
1045 protected boolean validateStructure()
1047 return validateChimeraPath();
1052 * Opens a file browser, and if a file is chosen, sets its path as the text of
1053 * the 'startup file' text field
1056 public void startupFileTextfield_mouseClicked()
1058 // TODO: JAL-3048 not needed for Jalview-JS
1059 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
1060 JalviewFileChooser chooser = JalviewFileChooser
1061 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
1062 chooser.setFileView(new JalviewFileView());
1063 chooser.setDialogTitle(
1064 MessageManager.getString("label.select_startup_file"));
1066 int value = chooser.showOpenDialog(this);
1068 if (value == JalviewFileChooser.APPROVE_OPTION)
1070 FileFormatI format = chooser.getSelectedFormat();
1074 * saving properties to file is deferred to the 'OK' action
1076 Cache.setPropertyNoSave("DEFAULT_FILE_FORMAT", format.getName());
1078 startupFileTextfield
1079 .setText(chooser.getSelectedFile().getAbsolutePath());
1090 public void cancel_actionPerformed(ActionEvent e)
1094 if (!Platform.isJS())
1096 wsPrefs.updateWsMenuConfig(true);
1097 wsPrefs.refreshWs_actionPerformed(e);
1099 frame.setClosed(true);
1100 } catch (Exception ex)
1112 public void annotations_actionPerformed(ActionEvent e)
1114 conservation.setEnabled(annotations.isSelected());
1115 quality.setEnabled(annotations.isSelected());
1116 identity.setEnabled(annotations.isSelected());
1117 showOccupancy.setEnabled(annotations.isSelected());
1118 showGroupConsensus.setEnabled(annotations.isSelected());
1119 showGroupConservation.setEnabled(annotations.isSelected());
1120 showConsensHistogram.setEnabled(annotations.isSelected()
1121 && (identity.isSelected() || showGroupConsensus.isSelected()));
1122 showConsensLogo.setEnabled(annotations.isSelected()
1123 && (identity.isSelected() || showGroupConsensus.isSelected()));
1127 public void newLink_actionPerformed(ActionEvent e)
1129 GSequenceLink link = new GSequenceLink();
1130 boolean valid = false;
1133 if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
1134 MessageManager.getString("label.new_sequence_url_link"),
1135 JvOptionPane.OK_CANCEL_OPTION, -1,
1136 null) == JvOptionPane.OK_OPTION)
1138 if (link.checkValid())
1140 if (((UrlLinkTableModel) linkUrlTable.getModel())
1141 .isUniqueName(link.getName()))
1143 ((UrlLinkTableModel) linkUrlTable.getModel())
1144 .insertRow(link.getName(), link.getURL());
1149 link.notifyDuplicate();
1162 public void editLink_actionPerformed(ActionEvent e)
1164 GSequenceLink link = new GSequenceLink();
1166 int index = linkUrlTable.getSelectedRow();
1169 // button no longer enabled if row is not selected
1170 Cache.log.debug("Edit with no row selected in linkUrlTable");
1174 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1176 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1178 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1179 link.setName(oldName);
1180 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1182 boolean valid = false;
1185 if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
1186 MessageManager.getString("label.edit_sequence_url_link"),
1187 JvOptionPane.OK_CANCEL_OPTION, -1,
1188 null) == JvOptionPane.OK_OPTION)
1190 if (link.checkValid())
1192 if ((oldName.equals(link.getName()))
1193 || (((UrlLinkTableModel) linkUrlTable.getModel())
1194 .isUniqueName(link.getName())))
1196 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1197 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1202 link.notifyDuplicate();
1215 public void deleteLink_actionPerformed(ActionEvent e)
1217 int index = linkUrlTable.getSelectedRow();
1218 int modelIndex = -1;
1221 // button no longer enabled if row is not selected
1222 Cache.log.debug("Delete with no row selected in linkUrlTable");
1227 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1230 // make sure we use the model index to delete, and not the table index
1231 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1235 public void defaultBrowser_mouseClicked(MouseEvent e)
1237 // TODO: JAL-3048 not needed for j2s
1238 if (!Platform.isJS()) // BH 2019
1245 JFileChooser chooser = new JFileChooser(".");
1246 chooser.setDialogTitle(
1247 MessageManager.getString("label.select_default_browser"));
1249 int value = chooser.showOpenDialog(this);
1251 if (value == JFileChooser.APPROVE_OPTION)
1253 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1262 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1266 protected void showunconserved_actionPerformed(ActionEvent e)
1268 // TODO Auto-generated method stub
1269 super.showunconserved_actionPerformed(e);
1273 * not implemented -- returns empty list
1277 public static List<String> getGroupURLLinks()
1279 return groupURLLinks;
1283 public void minColour_actionPerformed(JPanel panel)
1285 JalviewColourChooser.showColourChooser(this,
1286 MessageManager.getString("label.select_colour_minimum_value"),
1291 public void maxColour_actionPerformed(JPanel panel)
1293 JalviewColourChooser.showColourChooser(this,
1294 MessageManager.getString("label.select_colour_maximum_value"),
1299 public void gapColour_actionPerformed(JPanel gap)
1301 if (!useLegacyGap.isSelected())
1303 JalviewColourChooser.showColourChooser(this,
1304 MessageManager.getString("label.select_gap_colour"),
1310 public void hiddenColour_actionPerformed(JPanel hidden)
1312 JalviewColourChooser.showColourChooser(this,
1313 MessageManager.getString("label.select_hidden_colour"),
1318 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1320 boolean enabled = useLegacyGap.isSelected();
1323 gapColour.setBackground(
1324 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1328 gapColour.setBackground(
1329 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1331 gapColour.setEnabled(!enabled);
1332 gapLabel.setEnabled(!enabled);
1336 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1338 useLegacyGap.setSelected(false);
1339 useLegacyGaps_actionPerformed(null);
1340 showHiddenAtStart.setSelected(false);
1341 hiddenColour.setBackground(
1342 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1346 protected void userIdWidth_actionPerformed()
1350 String val = userIdWidth.getText().trim();
1351 if (val.length() > 0)
1353 Integer iw = Integer.parseInt(val);
1354 if (iw.intValue() < 12)
1356 throw new NumberFormatException();
1358 userIdWidth.setText(iw.toString());
1360 } catch (NumberFormatException x)
1362 userIdWidth.setText("");
1363 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
1365 .getString("warn.user_defined_width_requirements"),
1366 MessageManager.getString("label.invalid_id_column_width"),
1367 JvOptionPane.WARNING_MESSAGE);
1372 protected void autoIdWidth_actionPerformed()
1374 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1375 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1379 * Returns true if chimera path is to a valid executable, else show an error
1382 protected boolean validateChimeraPath()
1384 if (chimeraPath.getText().trim().length() > 0)
1386 File f = new File(chimeraPath.getText());
1387 if (!f.canExecute())
1389 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
1390 MessageManager.getString("label.invalid_chimera_path"),
1391 MessageManager.getString("label.invalid_name"),
1392 JvOptionPane.ERROR_MESSAGE);
1400 * If Chimera is selected, check it can be found on default or user-specified
1401 * path, if not show a warning/help dialog.
1404 protected void structureViewer_actionPerformed(String selectedItem)
1406 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1410 boolean found = false;
1413 * Try user-specified and standard paths for Chimera executable.
1415 List<String> paths = StructureManager.getChimeraPaths();
1416 paths.add(0, chimeraPath.getText());
1417 for (String path : paths)
1419 if (new File(path.trim()).canExecute())
1427 String[] options = { "OK", "Help" };
1428 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
1429 JvSwingUtils.wrapTooltip(true,
1430 MessageManager.getString("label.chimera_missing")),
1431 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1432 null, options, options[0]);
1433 if (showHelp == JvOptionPane.NO_OPTION)
1437 Help.showHelpWindow(HelpId.StructureViewer);
1438 } catch (HelpSetException e)
1440 e.printStackTrace();
1446 public class OptionsParam
1448 private String name;
1450 private String code;
1452 public OptionsParam(String name, String code)
1458 public String getName()
1463 public void setName(String name)
1468 public String getCode()
1473 public void setCode(String code)
1479 public String toString()
1485 public boolean equals(Object that)
1487 if (!(that instanceof OptionsParam))
1491 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1495 public int hashCode()
1497 return name.hashCode() + code.hashCode();
1501 protected class UrlListSelectionHandler implements ListSelectionListener
1505 public void valueChanged(ListSelectionEvent e)
1507 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1509 int index = lsm.getMinSelectionIndex();
1512 // no selection, so disable delete/edit buttons
1513 editLink.setEnabled(false);
1514 deleteLink.setEnabled(false);
1517 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1519 // enable/disable edit and delete link buttons
1520 if (((UrlLinkTableModel) linkUrlTable.getModel())
1521 .isRowDeletable(modelIndex))
1523 deleteLink.setEnabled(true);
1527 deleteLink.setEnabled(false);
1530 if (((UrlLinkTableModel) linkUrlTable.getModel())
1531 .isRowEditable(modelIndex))
1533 editLink.setEnabled(true);
1537 editLink.setEnabled(false);