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 CENTRE_COLUMN_LABELS = "CENTRE_COLUMN_LABELS";
105 public static final String CHIMERA_PATH = "CHIMERA_PATH";
107 public static final String DBREFFETCH_USEPICR = "DBREFFETCH_USEPICR";
109 public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
111 public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
113 public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
115 public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
117 public static final String FIGURE_AUTOIDWIDTH = "FIGURE_AUTOIDWIDTH";
119 public static final String FIGURE_FIXEDIDWIDTH = "FIGURE_FIXEDIDWIDTH";
121 public static final String FOLLOW_SELECTIONS = "FOLLOW_SELECTIONS";
123 public static final String FONT_NAME = "FONT_NAME";
125 public static final String FONT_SIZE = "FONT_SIZE";
127 public static final String FONT_STYLE = "FONT_STYLE";
129 public static final String GAP_COLOUR = "GAP_COLOUR";
131 public static final String GAP_SYMBOL = "GAP_SYMBOL";
133 public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
135 public static final String HIDE_INTRONS = "HIDE_INTRONS";
137 public static final String ID_ITALICS = "ID_ITALICS";
139 public static final String ID_ORG_HOSTURL = "ID_ORG_HOSTURL";
141 public static final String MAP_WITH_SIFTS = "MAP_WITH_SIFTS";
143 public static final String NOQUESTIONNAIRES = "NOQUESTIONNAIRES";
145 public static final String NORMALISE_CONSENSUS_LOGO = "NORMALISE_CONSENSUS_LOGO";
147 public static final String NORMALISE_LOGO = "NORMALISE_LOGO";
149 public static final String PAD_GAPS = "PAD_GAPS";
151 public static final String PDB_DOWNLOAD_FORMAT = "PDB_DOWNLOAD_FORMAT";
153 public static final String QUESTIONNAIRE = "QUESTIONNAIRE";
155 public static final String RELAXEDSEQIDMATCHING = "RELAXEDSEQIDMATCHING";
157 public static final String RIGHT_ALIGN_IDS = "RIGHT_ALIGN_IDS";
159 public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
161 public static final String SHOW_ANNOTATIONS = "SHOW_ANNOTATIONS";
163 public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
165 public static final String SHOW_CONSENSUS = "SHOW_CONSENSUS";
167 public static final String SHOW_CONSENSUS_HISTOGRAM = "SHOW_CONSENSUS_HISTOGRAM";
169 public static final String SHOW_CONSENSUS_LOGO = "SHOW_CONSENSUS_LOGO";
171 public static final String SHOW_CONSERVATION = "SHOW_CONSERVATION";
173 public static final String SHOW_DBREFS_TOOLTIP = "SHOW_DBREFS_TOOLTIP";
175 public static final String SHOW_GROUP_CONSENSUS = "SHOW_GROUP_CONSENSUS";
177 public static final String SHOW_GROUP_CONSERVATION = "SHOW_GROUP_CONSERVATION";
179 public static final String SHOW_JVSUFFIX = "SHOW_JVSUFFIX";
181 public static final String SHOW_NPFEATS_TOOLTIP = "SHOW_NPFEATS_TOOLTIP";
183 public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
185 public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
187 public static final String SHOW_OVERVIEW = "SHOW_OVERVIEW";
189 public static final String SHOW_QUALITY = "SHOW_QUALITY";
191 public static final String SHOW_UNCONSERVED = "SHOW_UNCONSERVED";
193 public static final String SORT_ALIGNMENT = "SORT_ALIGNMENT";
195 public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
197 public static final String SORT_BY_TREE = "SORT_BY_TREE";
199 public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
201 public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
203 public static final String STRUCTURE_DIMENSIONS = "STRUCTURE_DIMENSIONS";
205 public static final String UNIPROT_DOMAIN = "UNIPROT_DOMAIN";
207 public static final String USE_FULL_SO = "USE_FULL_SO";
209 public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
211 public static final String USE_RNAVIEW = "USE_RNAVIEW";
213 public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
215 public static final String WRAP_ALIGNMENT = "WRAP_ALIGNMENT";
218 private static final int MIN_FONT_SIZE = 1;
220 private static final int MAX_FONT_SIZE = 30;
223 * Holds name and link separated with | character. Sequence ID must be
224 * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
226 public static UrlProviderI sequenceUrlLinks; // must be nonfinal for test
228 public final static UrlLinkTableModel dataModel;
231 * Holds name and link separated with | character. Sequence IDS and Sequences
232 * must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
233 * $SEQUENCES$ or $SEQUENCES=/.possible | chars ./=$ and separation character
234 * for first and second token specified after a pipe character at end |,|.
235 * (TODO: proper escape for using | to separate ids or sequences
238 public static final List<String> groupURLLinks; // not implemented
240 public static final String BLOSUM62_PCA_FOR_NUCLEOTIDE = "BLOSUM62_PCA_FOR_NUCLEOTIDE";
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 = 500, height = 510; // BH 2019.07.12 added 60 to height
310 // (structure panel was too small anyway, and I added a default dimension
312 if (Platform.isAMacAndNotJS())
315 height = 540; // BH 2019.07.12 added 30
318 Desktop.addInternalFrame(frame,
319 MessageManager.getString("label.preferences"), width, height);
320 frame.setMinimumSize(new Dimension(width, height));
323 * Set Visual tab defaults
325 seqLimit.setSelected(Cache.getDefault(SHOW_JVSUFFIX, true));
326 rightAlign.setSelected(Cache.getDefault(RIGHT_ALIGN_IDS, false));
327 fullScreen.setSelected(Cache.getDefault(SHOW_FULLSCREEN, false));
328 annotations.setSelected(Cache.getDefault(SHOW_ANNOTATIONS, true));
330 conservation.setSelected(Cache.getDefault(SHOW_CONSERVATION, true));
331 quality.setSelected(Cache.getDefault(SHOW_QUALITY, true));
332 identity.setSelected(Cache.getDefault(SHOW_IDENTITY, true));
333 openoverv.setSelected(Cache.getDefault(SHOW_OVERVIEW, false));
335 .setSelected(Cache.getDefault(SHOW_UNCONSERVED, false));
336 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
338 .setSelected(Cache.getDefault(SHOW_GROUP_CONSENSUS, false));
339 showGroupConservation.setSelected(
340 Cache.getDefault(SHOW_GROUP_CONSERVATION, false));
341 showConsensHistogram.setSelected(
342 Cache.getDefault(SHOW_CONSENSUS_HISTOGRAM, true));
344 .setSelected(Cache.getDefault(SHOW_CONSENSUS_LOGO, false));
346 .setSelected(Cache.getDefault(SHOW_NPFEATS_TOOLTIP, true));
348 .setSelected(Cache.getDefault(SHOW_DBREFS_TOOLTIP, true));
350 String[] fonts = java.awt.GraphicsEnvironment
351 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
352 for (int i = 0; i < fonts.length; i++)
354 fontNameCB.addItem(fonts[i]);
357 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
359 fontSizeCB.addItem(i + "");
362 fontStyleCB.addItem("plain");
363 fontStyleCB.addItem("bold");
364 fontStyleCB.addItem("italic");
366 fontNameCB.setSelectedItem(Cache.getDefault(FONT_NAME, "SansSerif"));
367 fontSizeCB.setSelectedItem(Cache.getDefault(FONT_SIZE, "10"));
368 fontStyleCB.setSelectedItem(
369 Cache.getDefault(FONT_STYLE, Font.PLAIN + ""));
371 smoothFont.setSelected(Cache.getDefault(ANTI_ALIAS, false));
373 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
375 idItalics.setSelected(Cache.getDefault(ID_ITALICS, true));
377 wrap.setSelected(Cache.getDefault(WRAP_ALIGNMENT, false));
379 gapSymbolCB.addItem("-");
380 gapSymbolCB.addItem(".");
382 gapSymbolCB.setSelectedItem(Cache.getDefault(GAP_SYMBOL, "-"));
384 sortby.addItem("No sort");
385 sortby.addItem("Id");
386 sortby.addItem("Pairwise Identity");
387 sortby.setSelectedItem(Cache.getDefault(SORT_ALIGNMENT, "No sort"));
389 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
391 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
393 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
394 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
395 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
396 SequenceAnnotationOrder.NONE.name()));
397 sortAnnBy.setSelectedItem(savedSort.toString());
399 sortAutocalc.addItem("Autocalculated first");
400 sortAutocalc.addItem("Autocalculated last");
401 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
402 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
403 : sortAutocalc.getItemAt(1));
405 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
406 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
407 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
408 + "/examples/exampleFile_2_3.jar"));
411 * Set Colours tab defaults
413 protColour.addItem(ResidueColourScheme.NONE);
414 nucColour.addItem(ResidueColourScheme.NONE);
415 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
417 String name = cs.getSchemeName();
418 protColour.addItem(name);
419 nucColour.addItem(name);
421 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
422 ResidueColourScheme.NONE);
423 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
424 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
425 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
426 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
427 minColour.setBackground(
428 Cache.getDefaultColour(ANNOTATIONCOLOUR_MIN, Color.orange));
429 maxColour.setBackground(
430 Cache.getDefaultColour(ANNOTATIONCOLOUR_MAX, Color.red));
433 * Set overview panel defaults
435 gapColour.setBackground(
436 Cache.getDefaultColour(GAP_COLOUR,
437 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
438 hiddenColour.setBackground(
439 Cache.getDefaultColour(HIDDEN_COLOUR,
440 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
441 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
442 gapLabel.setEnabled(!useLegacyGap.isSelected());
443 gapColour.setEnabled(!useLegacyGap.isSelected());
445 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
448 * Set Structure tab defaults.
450 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
451 structFromPdb.setSelected(structSelected);
452 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
453 useRnaView.setEnabled(structSelected);
454 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
455 addSecondaryStructure.setEnabled(structSelected);
456 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
457 addTempFactor.setEnabled(structSelected);
458 structViewer.setSelectedItem(
459 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
460 Dimension d = Cache.getDefaultDim(STRUCTURE_DIMENSIONS,
461 DEFAULT_STRUCTURE_DIMENSIONS);
462 String s = d.width + "," + d.height;
463 structureDimensions.setText(s);
464 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
465 chimeraPath.addActionListener(new ActionListener()
468 public void actionPerformed(ActionEvent e)
470 validateChimeraPath();
474 if (Cache.getDefault(MAP_WITH_SIFTS, false))
476 siftsMapping.setSelected(true);
480 nwMapping.setSelected(true);
484 .setMapWithSifts(Cache.getDefault(MAP_WITH_SIFTS, false));
487 * Set Connections tab defaults
491 linkUrlTable.setModel(dataModel);
492 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
493 linkUrlTable.getModel());
494 linkUrlTable.setRowSorter(sorter);
495 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
497 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
498 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
499 SortOrder.DESCENDING));
500 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
501 SortOrder.DESCENDING));
503 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
505 sorter.setSortKeys(sortKeys);
506 // BH 2018 setSortKeys will do the sort
510 ActionListener onReset;
511 onReset = new ActionListener()
514 public void actionPerformed(ActionEvent e)
516 filterTB.setText("");
517 sorter.setRowFilter(RowFilter.regexFilter(""));
521 doReset.addActionListener(onReset);
523 // filter to display only custom urls
524 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
527 public boolean include(
528 Entry<? extends TableModel, ? extends Object> entry)
530 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
534 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
535 linkUrlTable.getModel());
536 customSorter.setRowFilter(customUrlFilter);
538 ActionListener onCustomOnly;
539 onCustomOnly = new ActionListener()
542 public void actionPerformed(ActionEvent e)
544 filterTB.setText("");
545 sorter.setRowFilter(customUrlFilter);
548 userOnly.addActionListener(onCustomOnly);
550 filterTB.getDocument().addDocumentListener(new DocumentListener()
552 String caseInsensitiveFlag = "(?i)";
555 public void changedUpdate(DocumentEvent e)
557 sorter.setRowFilter(RowFilter
558 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
562 public void removeUpdate(DocumentEvent e)
564 sorter.setRowFilter(RowFilter
565 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
569 public void insertUpdate(DocumentEvent e)
571 sorter.setRowFilter(RowFilter
572 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
576 // set up list selection functionality
577 linkUrlTable.getSelectionModel()
578 .addListSelectionListener(new UrlListSelectionHandler());
580 // set up radio buttons
581 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
583 String onClickName = linkUrlTable.getColumnName(onClickCol);
584 linkUrlTable.getColumn(onClickName)
585 .setCellRenderer(new RadioButtonRenderer());
586 linkUrlTable.getColumn(onClickName)
587 .setCellEditor(new RadioButtonEditor());
589 // get boolean columns and resize those to min possible
590 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
592 if (linkUrlTable.getModel().getColumnClass(column)
593 .equals(Boolean.class))
595 TableColumn tableColumn = linkUrlTable.getColumnModel()
597 int preferredWidth = tableColumn.getMinWidth();
599 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
601 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
602 int cwidth = c.getPreferredSize().width
603 + linkUrlTable.getIntercellSpacing().width;
604 preferredWidth = Math.max(preferredWidth, cwidth);
606 tableColumn.setPreferredWidth(preferredWidth);
610 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
611 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
612 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
613 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
615 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
617 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
618 // note antisense here: default is true
620 .setSelected(Cache.getProperty(NOQUESTIONNAIRES) == null);
621 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
624 * Set Output tab defaults
626 setupOutputCombo(epsRendering, "EPS_RENDERING");
627 setupOutputCombo(htmlRendering, "HTML_RENDERING");
628 setupOutputCombo(svgRendering, "SVG_RENDERING");
629 autoIdWidth.setSelected(Cache.getDefault(FIGURE_AUTOIDWIDTH, false));
630 userIdWidth.setEnabled(!autoIdWidth.isSelected());
631 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
632 Integer wi = Cache.getIntegerProperty(FIGURE_FIXEDIDWIDTH);
633 userIdWidth.setText(wi == null ? "" : wi.toString());
634 // TODO: refactor to use common enum via FormatAdapter and allow extension
635 // for new flat file formats
636 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
637 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
638 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
639 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
640 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
641 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
642 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
643 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
645 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
648 * Set Editing tab defaults
650 autoCalculateConsCheck
651 .setSelected(Cache.getDefault(AUTO_CALC_CONSENSUS, true));
652 padGaps.setSelected(Cache.getDefault(PAD_GAPS, false));
653 sortByTree.setSelected(Cache.getDefault(SORT_BY_TREE, false));
655 annotations_actionPerformed(null); // update the display of the annotation
660 * Set Backups tab defaults
662 loadLastSavedBackupsOptions();
666 * A helper method that sets the items and initial selection in a character
667 * rendering option list (Prompt each time/Lineart/Text)
672 protected void setupOutputCombo(JComboBox<Object> comboBox,
675 comboBox.addItem(promptEachTimeOpt);
676 comboBox.addItem(lineArtOpt);
677 comboBox.addItem(textOpt);
680 * JalviewJS doesn't support Lineart so force it to Text
682 String defaultOption = Platform.isJS() ? "Text"
683 : Cache.getDefault(propertyKey, "Prompt each time");
684 if (defaultOption.equalsIgnoreCase("Text"))
686 comboBox.setSelectedItem(textOpt);
688 else if (defaultOption.equalsIgnoreCase("Lineart"))
690 comboBox.setSelectedItem(lineArtOpt);
694 comboBox.setSelectedItem(promptEachTimeOpt);
699 * Save user selections on the Preferences tabs to the Cache and write out to
705 public void ok_actionPerformed(ActionEvent e)
707 if (!validateSettings())
713 * Save Visual settings
715 Cache.setPropertyNoSave(SHOW_JVSUFFIX,
716 Boolean.toString(seqLimit.isSelected()));
717 Cache.setPropertyNoSave(RIGHT_ALIGN_IDS,
718 Boolean.toString(rightAlign.isSelected()));
719 Cache.setPropertyNoSave(SHOW_FULLSCREEN,
720 Boolean.toString(fullScreen.isSelected()));
721 Cache.setPropertyNoSave(SHOW_OVERVIEW,
722 Boolean.toString(openoverv.isSelected()));
723 Cache.setPropertyNoSave(SHOW_ANNOTATIONS,
724 Boolean.toString(annotations.isSelected()));
725 Cache.setPropertyNoSave(SHOW_CONSERVATION,
726 Boolean.toString(conservation.isSelected()));
727 Cache.setPropertyNoSave(SHOW_QUALITY,
728 Boolean.toString(quality.isSelected()));
729 Cache.setPropertyNoSave(SHOW_IDENTITY,
730 Boolean.toString(identity.isSelected()));
732 Cache.setPropertyNoSave(GAP_SYMBOL,
733 gapSymbolCB.getSelectedItem().toString());
735 Cache.setPropertyNoSave(FONT_NAME,
736 fontNameCB.getSelectedItem().toString());
737 Cache.setPropertyNoSave(FONT_STYLE,
738 fontStyleCB.getSelectedItem().toString());
739 Cache.setPropertyNoSave(FONT_SIZE,
740 fontSizeCB.getSelectedItem().toString());
742 Cache.setPropertyNoSave(ID_ITALICS,
743 Boolean.toString(idItalics.isSelected()));
744 Cache.setPropertyNoSave(SHOW_UNCONSERVED,
745 Boolean.toString(showUnconserved.isSelected()));
746 Cache.setPropertyNoSave(SHOW_OCCUPANCY,
747 Boolean.toString(showOccupancy.isSelected()));
748 Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS,
749 Boolean.toString(showGroupConsensus.isSelected()));
750 Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION,
751 Boolean.toString(showGroupConservation.isSelected()));
752 Cache.setPropertyNoSave(SHOW_CONSENSUS_HISTOGRAM,
753 Boolean.toString(showConsensHistogram.isSelected()));
754 Cache.setPropertyNoSave(SHOW_CONSENSUS_LOGO,
755 Boolean.toString(showConsensLogo.isSelected()));
756 Cache.setPropertyNoSave(ANTI_ALIAS,
757 Boolean.toString(smoothFont.isSelected()));
758 Cache.setPropertyNoSave(SCALE_PROTEIN_TO_CDNA,
759 Boolean.toString(scaleProteinToCdna.isSelected()));
760 Cache.setPropertyNoSave(SHOW_NPFEATS_TOOLTIP,
761 Boolean.toString(showNpTooltip.isSelected()));
762 Cache.setPropertyNoSave(SHOW_DBREFS_TOOLTIP,
763 Boolean.toString(showDbRefTooltip.isSelected()));
765 Cache.setPropertyNoSave(WRAP_ALIGNMENT,
766 Boolean.toString(wrap.isSelected()));
768 Cache.setPropertyNoSave("STARTUP_FILE",
769 startupFileTextfield.getText());
770 Cache.setPropertyNoSave("SHOW_STARTUP_FILE",
771 Boolean.toString(startupCheckbox.isSelected()));
773 Cache.setPropertyNoSave(SORT_ALIGNMENT,
774 sortby.getSelectedItem().toString());
776 // convert description of sort order to enum name for save
777 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
778 .forDescription(sortAnnBy.getSelectedItem().toString());
779 if (annSortOrder != null)
781 Cache.setPropertyNoSave(SORT_ANNOTATIONS,
782 annSortOrder.name());
785 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
786 Cache.setPropertyNoSave(SHOW_AUTOCALC_ABOVE,
787 Boolean.valueOf(showAutocalcFirst).toString());
790 * Save Colours settings
792 Cache.setPropertyNoSave(DEFAULT_COLOUR_PROT,
793 protColour.getSelectedItem().toString());
794 Cache.setPropertyNoSave(DEFAULT_COLOUR_NUC,
795 nucColour.getSelectedItem().toString());
796 Cache.setColourProperty(ANNOTATIONCOLOUR_MIN,
797 minColour.getBackground());
798 Cache.setColourProperty(ANNOTATIONCOLOUR_MAX,
799 maxColour.getBackground());
802 * Save Overview settings
804 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
805 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
806 Cache.setPropertyNoSave(USE_LEGACY_GAP,
807 Boolean.toString(useLegacyGap.isSelected()));
808 Cache.setPropertyNoSave(SHOW_OV_HIDDEN_AT_START,
809 Boolean.toString(showHiddenAtStart.isSelected()));
812 * Save Structure settings
814 Cache.setPropertyNoSave(ADD_TEMPFACT_ANN,
815 Boolean.toString(addTempFactor.isSelected()));
816 Cache.setPropertyNoSave(ADD_SS_ANN,
817 Boolean.toString(addSecondaryStructure.isSelected()));
818 Cache.setPropertyNoSave(USE_RNAVIEW,
819 Boolean.toString(useRnaView.isSelected()));
820 Cache.setPropertyNoSave(STRUCT_FROM_PDB,
821 Boolean.toString(structFromPdb.isSelected()));
822 Cache.setPropertyNoSave(STRUCTURE_DISPLAY,
823 structViewer.getSelectedItem().toString());
824 Cache.setPropertyNoSave(STRUCTURE_DIMENSIONS,
825 structureDimensions.getText()); // BH 2019.07.12
826 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
827 Cache.setPropertyNoSave(MAP_WITH_SIFTS,
828 Boolean.toString(siftsMapping.isSelected()));
829 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
832 * Save Output settings
834 Cache.setPropertyNoSave("EPS_RENDERING",
835 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
836 Cache.setPropertyNoSave("HTML_RENDERING",
837 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
838 Cache.setPropertyNoSave("SVG_RENDERING",
839 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
841 if (!Platform.isJS())
847 // Save Connections settings
848 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
849 BrowserLauncher.resetBrowser();
852 // save user-defined and selected links
853 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
854 if (menuLinks.isEmpty())
856 Cache.removePropertyNoSave("SEQUENCE_LINKS");
860 Cache.setPropertyNoSave("SEQUENCE_LINKS",
861 menuLinks.toString());
864 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
865 if (nonMenuLinks.isEmpty())
867 Cache.removePropertyNoSave("STORED_LINKS");
871 Cache.setPropertyNoSave("STORED_LINKS",
872 nonMenuLinks.toString());
875 Cache.setPropertyNoSave("DEFAULT_URL",
876 sequenceUrlLinks.getPrimaryUrlId());
878 Cache.setPropertyNoSave("USE_PROXY",
879 Boolean.toString(useProxy.isSelected()));
881 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
883 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
885 if (useProxy.isSelected())
887 System.setProperty("http.proxyHost", proxyServerTB.getText());
888 System.setProperty("http.proxyPort", proxyPortTB.getText());
892 System.setProperty("http.proxyHost", "");
893 System.setProperty("http.proxyPort", "");
895 Cache.setProperty("VERSION_CHECK",
896 Boolean.toString(versioncheck.isSelected()));
897 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
899 // default is false - we only set this if the user has actively agreed
900 Cache.setProperty("USAGESTATS",
901 Boolean.toString(usagestats.isSelected()));
903 if (!questionnaire.isSelected())
905 Cache.setProperty(NOQUESTIONNAIRES, "true");
909 // special - made easy to edit a property file to disable questionnaires
910 // by just adding the given line
911 Cache.removeProperty(NOQUESTIONNAIRES);
915 * Save Output settings
917 Cache.setPropertyNoSave("BLC_JVSUFFIX",
918 Boolean.toString(blcjv.isSelected()));
919 Cache.setPropertyNoSave("CLUSTAL_JVSUFFIX",
920 Boolean.toString(clustaljv.isSelected()));
921 Cache.setPropertyNoSave("FASTA_JVSUFFIX",
922 Boolean.toString(fastajv.isSelected()));
923 Cache.setPropertyNoSave("MSF_JVSUFFIX",
924 Boolean.toString(msfjv.isSelected()));
925 Cache.setPropertyNoSave("PFAM_JVSUFFIX",
926 Boolean.toString(pfamjv.isSelected()));
927 Cache.setPropertyNoSave("PILEUP_JVSUFFIX",
928 Boolean.toString(pileupjv.isSelected()));
929 Cache.setPropertyNoSave("PIR_JVSUFFIX",
930 Boolean.toString(pirjv.isSelected()));
931 Cache.setPropertyNoSave("PIR_MODELLER",
932 Boolean.toString(modellerOutput.isSelected()));
933 Cache.setPropertyNoSave("EXPORT_EMBBED_BIOJSON",
934 Boolean.toString(embbedBioJSON.isSelected()));
935 Cache.setPropertyNoSave(FIGURE_AUTOIDWIDTH,
936 Boolean.toString(autoIdWidth.isSelected()));
937 userIdWidth_actionPerformed();
938 Cache.setPropertyNoSave("FIGURE_FIXEDIDWIDTH",
939 userIdWidth.getText());
942 * Save Editing settings
944 Cache.setPropertyNoSave(AUTO_CALC_CONSENSUS,
945 Boolean.toString(autoCalculateConsCheck.isSelected()));
946 Cache.setPropertyNoSave(SORT_BY_TREE,
947 Boolean.toString(sortByTree.isSelected()));
948 Cache.setPropertyNoSave(PAD_GAPS,
949 Boolean.toString(padGaps.isSelected()));
951 if (!Platform.isJS())
953 wsPrefs.updateAndRefreshWsMenuConfig(false);
957 * Save Backups settings
959 Cache.setPropertyNoSave(BackupFiles.CONFIRM_DELETE_OLD,
960 Boolean.toString(backupfilesConfirmDelete.isSelected()));
961 Cache.setPropertyNoSave(BackupFiles.ENABLED,
962 Boolean.toString(enableBackupFiles.isSelected()));
963 Cache.setPropertyNoSave(BackupFiles.NO_MAX,
964 Boolean.toString(backupfilesKeepAll.isSelected()));
965 Cache.setPropertyNoSave(BackupFiles.REVERSE_ORDER,
966 Boolean.toString(suffixReverse.isSelected()));
967 Cache.setPropertyNoSave(BackupFiles.SUFFIX,
968 suffixTemplate.getText());
969 Cache.setPropertyNoSave(BackupFiles.ROLL_MAX,
970 Integer.toString(getSpinnerInt(backupfilesRollMaxSpinner, 4)));
971 Cache.setPropertyNoSave(BackupFiles.SUFFIX_DIGITS,
972 Integer.toString(getSpinnerInt(suffixDigitsSpinner, 3)));
973 Cache.setPropertyNoSave(BackupFiles.NS + "_PRESET",
974 Integer.toString(getComboIntStringKey(backupfilesPresetsCombo)));
976 Cache.saveProperties();
977 Desktop.getInstance().doConfigureStructurePrefs();
980 frame.setClosed(true);
981 } catch (Exception ex)
986 public static void setAppletDefaults()
989 // http://www.jalview.org/old/v2_8/examples/appletParameters.html
991 // showConservation true or false Default is true.
992 // showQuality true or false Default is true.
993 // showConsensus true or false Default is true.
994 // showFeatureSettings true or false Shows the feature settings window when
996 // showTreeBootstraps true or false (default is true) show or hide branch
998 // showTreeDistances true or false (default is true) show or hide branch
1000 // showUnlinkedTreeNodes true or false (default is false) indicate if
1001 // unassociated nodes should be highlighted in the tree view
1002 // showUnconserved true of false (default is false) When true, only gaps and
1003 // symbols different to the consensus sequence ions of the alignment
1004 // showGroupConsensus true of false (default is false) When true, shows
1005 // consensus annotation row for any groups on the alignment. (since 2.7)
1006 // showGroupConservation true of false (default is false) When true, shows
1007 // amino-acid property conservation annotation row for any groups on the
1008 // showConsensusHistogram true of false (default is true) When true, shows
1009 // the percentage occurence of the consensus symbol for each column as a
1010 // showSequenceLogo true of false (default is false) When true, shows a
1011 // sequence logo above the consensus sequence (overlaid above the Consensus
1013 Cache.setPropertyNoSave(SHOW_CONSERVATION, "true");
1014 Cache.setPropertyNoSave(SHOW_QUALITY, "false");
1015 Cache.setPropertyNoSave(SHOW_CONSENSUS, "true");
1016 Cache.setPropertyNoSave(SHOW_UNCONSERVED, "false");
1017 Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION, "false");
1018 Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS, "false");
1020 // TODO -- just a start here
1024 * Do any necessary validation before saving settings. Return focus to the
1025 * first tab which fails validation.
1029 private boolean validateSettings()
1031 if (!validateStructure())
1033 structureTab.requestFocusInWindow();
1040 protected boolean validateStructure()
1042 return validateChimeraPath();
1050 public void startupFileTextfield_mouseClicked()
1052 // TODO: JAL-3048 not needed for Jalview-JS
1053 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
1054 JalviewFileChooser chooser = JalviewFileChooser
1055 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
1056 chooser.setFileView(new JalviewFileView());
1057 chooser.setDialogTitle(
1058 MessageManager.getString("label.select_startup_file"));
1060 int value = chooser.showOpenDialog(this);
1062 if (value == JalviewFileChooser.APPROVE_OPTION)
1064 FileFormatI format = chooser.getSelectedFormat();
1067 Cache.setPropertyNoSave("DEFAULT_FILE_FORMAT",
1070 startupFileTextfield
1071 .setText(chooser.getSelectedFile().getAbsolutePath());
1082 public void cancel_actionPerformed(ActionEvent e)
1086 if (!Platform.isJS())
1088 wsPrefs.updateWsMenuConfig(true);
1089 wsPrefs.refreshWs_actionPerformed(e);
1091 frame.setClosed(true);
1092 } catch (Exception ex)
1104 public void annotations_actionPerformed(ActionEvent e)
1106 conservation.setEnabled(annotations.isSelected());
1107 quality.setEnabled(annotations.isSelected());
1108 identity.setEnabled(annotations.isSelected());
1109 showOccupancy.setEnabled(annotations.isSelected());
1110 showGroupConsensus.setEnabled(annotations.isSelected());
1111 showGroupConservation.setEnabled(annotations.isSelected());
1112 showConsensHistogram.setEnabled(annotations.isSelected()
1113 && (identity.isSelected() || showGroupConsensus.isSelected()));
1114 showConsensLogo.setEnabled(annotations.isSelected()
1115 && (identity.isSelected() || showGroupConsensus.isSelected()));
1119 public void newLink_actionPerformed(ActionEvent e)
1121 GSequenceLink link = new GSequenceLink();
1122 boolean valid = false;
1125 if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
1126 MessageManager.getString("label.new_sequence_url_link"),
1127 JvOptionPane.OK_CANCEL_OPTION, -1,
1128 null) == JvOptionPane.OK_OPTION)
1130 if (link.checkValid())
1132 if (((UrlLinkTableModel) linkUrlTable.getModel())
1133 .isUniqueName(link.getName()))
1135 ((UrlLinkTableModel) linkUrlTable.getModel())
1136 .insertRow(link.getName(), link.getURL());
1141 link.notifyDuplicate();
1154 public void editLink_actionPerformed(ActionEvent e)
1156 GSequenceLink link = new GSequenceLink();
1158 int index = linkUrlTable.getSelectedRow();
1161 // button no longer enabled if row is not selected
1162 Cache.log.debug("Edit with no row selected in linkUrlTable");
1166 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1168 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1170 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1171 link.setName(oldName);
1172 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1174 boolean valid = false;
1177 if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
1178 MessageManager.getString("label.edit_sequence_url_link"),
1179 JvOptionPane.OK_CANCEL_OPTION, -1,
1180 null) == JvOptionPane.OK_OPTION)
1182 if (link.checkValid())
1184 if ((oldName.equals(link.getName()))
1185 || (((UrlLinkTableModel) linkUrlTable.getModel())
1186 .isUniqueName(link.getName())))
1188 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1189 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1194 link.notifyDuplicate();
1207 public void deleteLink_actionPerformed(ActionEvent e)
1209 int index = linkUrlTable.getSelectedRow();
1210 int modelIndex = -1;
1213 // button no longer enabled if row is not selected
1214 Cache.log.debug("Delete with no row selected in linkUrlTable");
1219 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1222 // make sure we use the model index to delete, and not the table index
1223 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1227 public void defaultBrowser_mouseClicked(MouseEvent e)
1229 // TODO: JAL-3048 not needed for j2s
1230 if (!Platform.isJS()) // BH 2019
1237 JFileChooser chooser = new JFileChooser(".");
1238 chooser.setDialogTitle(
1239 MessageManager.getString("label.select_default_browser"));
1241 int value = chooser.showOpenDialog(this);
1243 if (value == JFileChooser.APPROVE_OPTION)
1245 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1254 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1258 protected void showunconserved_actionPerformed(ActionEvent e)
1260 // TODO Auto-generated method stub
1261 super.showunconserved_actionPerformed(e);
1265 * not implemented -- returns empty list
1269 public static List<String> getGroupURLLinks()
1271 return groupURLLinks;
1275 public void minColour_actionPerformed(JPanel panel)
1277 JalviewColourChooser.showColourChooser(this,
1278 MessageManager.getString("label.select_colour_minimum_value"),
1283 public void maxColour_actionPerformed(JPanel panel)
1285 JalviewColourChooser.showColourChooser(this,
1286 MessageManager.getString("label.select_colour_maximum_value"),
1291 public void gapColour_actionPerformed(JPanel gap)
1293 if (!useLegacyGap.isSelected())
1295 JalviewColourChooser.showColourChooser(this,
1296 MessageManager.getString("label.select_gap_colour"),
1302 public void hiddenColour_actionPerformed(JPanel hidden)
1304 JalviewColourChooser.showColourChooser(this,
1305 MessageManager.getString("label.select_hidden_colour"),
1310 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1312 boolean enabled = useLegacyGap.isSelected();
1315 gapColour.setBackground(
1316 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1320 gapColour.setBackground(
1321 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1323 gapColour.setEnabled(!enabled);
1324 gapLabel.setEnabled(!enabled);
1328 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1330 useLegacyGap.setSelected(false);
1331 useLegacyGaps_actionPerformed(null);
1332 showHiddenAtStart.setSelected(false);
1333 hiddenColour.setBackground(
1334 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1338 protected void userIdWidth_actionPerformed()
1342 String val = userIdWidth.getText().trim();
1343 if (val.length() > 0)
1345 Integer iw = Integer.parseInt(val);
1346 if (iw.intValue() < 12)
1348 throw new NumberFormatException();
1350 userIdWidth.setText(iw.toString());
1352 } catch (NumberFormatException x)
1354 userIdWidth.setText("");
1355 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
1357 .getString("warn.user_defined_width_requirements"),
1358 MessageManager.getString("label.invalid_id_column_width"),
1359 JvOptionPane.WARNING_MESSAGE);
1364 protected void autoIdWidth_actionPerformed()
1366 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1367 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1371 * Returns true if chimera path is to a valid executable, else show an error
1374 protected boolean validateChimeraPath()
1376 if (chimeraPath.getText().trim().length() > 0)
1378 File f = new File(chimeraPath.getText());
1379 if (!f.canExecute())
1381 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
1382 MessageManager.getString("label.invalid_chimera_path"),
1383 MessageManager.getString("label.invalid_name"),
1384 JvOptionPane.ERROR_MESSAGE);
1392 * If Chimera is selected, check it can be found on default or user-specified
1393 * path, if not show a warning/help dialog.
1396 protected void structureViewer_actionPerformed(String selectedItem)
1398 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1402 boolean found = false;
1405 * Try user-specified and standard paths for Chimera executable.
1407 List<String> paths = StructureManager.getChimeraPaths();
1408 paths.add(0, chimeraPath.getText());
1409 for (String path : paths)
1411 if (new File(path.trim()).canExecute())
1419 String[] options = { "OK", "Help" };
1420 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
1421 JvSwingUtils.wrapTooltip(true,
1422 MessageManager.getString("label.chimera_missing")),
1423 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1424 null, options, options[0]);
1425 if (showHelp == JvOptionPane.NO_OPTION)
1429 Help.showHelpWindow(HelpId.StructureViewer);
1430 } catch (HelpSetException e)
1432 e.printStackTrace();
1438 public class OptionsParam
1440 private String name;
1442 private String code;
1444 public OptionsParam(String name, String code)
1450 public String getName()
1455 public void setName(String name)
1460 public String getCode()
1465 public void setCode(String code)
1471 public String toString()
1477 public boolean equals(Object that)
1479 if (!(that instanceof OptionsParam))
1483 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1487 public int hashCode()
1489 return name.hashCode() + code.hashCode();
1493 protected class UrlListSelectionHandler implements ListSelectionListener
1497 public void valueChanged(ListSelectionEvent e)
1499 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1501 int index = lsm.getMinSelectionIndex();
1504 // no selection, so disable delete/edit buttons
1505 editLink.setEnabled(false);
1506 deleteLink.setEnabled(false);
1509 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1511 // enable/disable edit and delete link buttons
1512 if (((UrlLinkTableModel) linkUrlTable.getModel())
1513 .isRowDeletable(modelIndex))
1515 deleteLink.setEnabled(true);
1519 deleteLink.setEnabled(false);
1522 if (((UrlLinkTableModel) linkUrlTable.getModel())
1523 .isRowEditable(modelIndex))
1525 editLink.setEnabled(true);
1529 editLink.setEnabled(false);