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 = 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 structViewer.setSelectedItem(
462 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
463 Dimension d = Cache.getDefaultDim(STRUCTURE_DIMENSIONS,
464 DEFAULT_STRUCTURE_DIMENSIONS);
465 String s = d.width + "," + d.height;
466 structureDimensions.setText(s);
467 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
468 chimeraPath.addActionListener(new ActionListener()
471 public void actionPerformed(ActionEvent e)
473 validateChimeraPath();
477 if (Cache.getDefault(MAP_WITH_SIFTS, false))
479 siftsMapping.setSelected(true);
483 nwMapping.setSelected(true);
487 .setMapWithSifts(Cache.getDefault(MAP_WITH_SIFTS, false));
490 * Set Connections tab defaults
494 linkUrlTable.setModel(dataModel);
495 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
496 linkUrlTable.getModel());
497 linkUrlTable.setRowSorter(sorter);
498 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
500 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
501 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
502 SortOrder.DESCENDING));
503 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
504 SortOrder.DESCENDING));
506 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
508 sorter.setSortKeys(sortKeys);
509 // BH 2018 setSortKeys will do the sort
513 ActionListener onReset;
514 onReset = new ActionListener()
517 public void actionPerformed(ActionEvent e)
519 filterTB.setText("");
520 sorter.setRowFilter(RowFilter.regexFilter(""));
524 doReset.addActionListener(onReset);
526 // filter to display only custom urls
527 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
530 public boolean include(
531 Entry<? extends TableModel, ? extends Object> entry)
533 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
537 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
538 linkUrlTable.getModel());
539 customSorter.setRowFilter(customUrlFilter);
541 ActionListener onCustomOnly;
542 onCustomOnly = new ActionListener()
545 public void actionPerformed(ActionEvent e)
547 filterTB.setText("");
548 sorter.setRowFilter(customUrlFilter);
551 userOnly.addActionListener(onCustomOnly);
553 filterTB.getDocument().addDocumentListener(new DocumentListener()
555 String caseInsensitiveFlag = "(?i)";
558 public void changedUpdate(DocumentEvent e)
560 sorter.setRowFilter(RowFilter
561 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
565 public void removeUpdate(DocumentEvent e)
567 sorter.setRowFilter(RowFilter
568 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
572 public void insertUpdate(DocumentEvent e)
574 sorter.setRowFilter(RowFilter
575 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
579 // set up list selection functionality
580 linkUrlTable.getSelectionModel()
581 .addListSelectionListener(new UrlListSelectionHandler());
583 // set up radio buttons
584 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
586 String onClickName = linkUrlTable.getColumnName(onClickCol);
587 linkUrlTable.getColumn(onClickName)
588 .setCellRenderer(new RadioButtonRenderer());
589 linkUrlTable.getColumn(onClickName)
590 .setCellEditor(new RadioButtonEditor());
592 // get boolean columns and resize those to min possible
593 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
595 if (linkUrlTable.getModel().getColumnClass(column)
596 .equals(Boolean.class))
598 TableColumn tableColumn = linkUrlTable.getColumnModel()
600 int preferredWidth = tableColumn.getMinWidth();
602 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
604 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
605 int cwidth = c.getPreferredSize().width
606 + linkUrlTable.getIntercellSpacing().width;
607 preferredWidth = Math.max(preferredWidth, cwidth);
609 tableColumn.setPreferredWidth(preferredWidth);
613 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
614 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
615 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
616 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
618 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
620 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
621 // note antisense here: default is true
623 .setSelected(Cache.getProperty(NOQUESTIONNAIRES) == null);
624 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
627 * Set Output tab defaults
629 setupOutputCombo(epsRendering, "EPS_RENDERING");
630 setupOutputCombo(htmlRendering, "HTML_RENDERING");
631 setupOutputCombo(svgRendering, "SVG_RENDERING");
632 autoIdWidth.setSelected(Cache.getDefault(FIGURE_AUTOIDWIDTH, false));
633 userIdWidth.setEnabled(!autoIdWidth.isSelected());
634 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
635 Integer wi = Cache.getIntegerProperty(FIGURE_FIXEDIDWIDTH);
636 userIdWidth.setText(wi == null ? "" : wi.toString());
637 // TODO: refactor to use common enum via FormatAdapter and allow extension
638 // for new flat file formats
639 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
640 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
641 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
642 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
643 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
644 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
645 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
646 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
648 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
651 * Set Editing tab defaults
653 autoCalculateConsCheck
654 .setSelected(Cache.getDefault(AUTO_CALC_CONSENSUS, true));
655 padGaps.setSelected(Cache.getDefault(PAD_GAPS, false));
656 sortByTree.setSelected(Cache.getDefault(SORT_BY_TREE, false));
658 annotations_actionPerformed(null); // update the display of the annotation
663 * Set Backups tab defaults
665 if (!Platform.isJS())
667 loadLastSavedBackupsOptions();
673 * A helper method that sets the items and initial selection in a character
674 * rendering option list (Prompt each time/Lineart/Text)
679 protected void setupOutputCombo(JComboBox<Object> comboBox,
682 comboBox.addItem(promptEachTimeOpt);
683 comboBox.addItem(lineArtOpt);
684 comboBox.addItem(textOpt);
687 * JalviewJS doesn't support Lineart so force it to Text
689 String defaultOption = Platform.isJS() ? "Text"
690 : Cache.getDefault(propertyKey, "Prompt each time");
691 if (defaultOption.equalsIgnoreCase("Text"))
693 comboBox.setSelectedItem(textOpt);
695 else if (defaultOption.equalsIgnoreCase("Lineart"))
697 comboBox.setSelectedItem(lineArtOpt);
701 comboBox.setSelectedItem(promptEachTimeOpt);
706 * Save user selections on the Preferences tabs to the Cache and write out to
712 public void ok_actionPerformed(ActionEvent e)
714 if (!validateSettings())
720 * Save Visual settings
722 Cache.setPropertyNoSave(SHOW_JVSUFFIX,
723 Boolean.toString(seqLimit.isSelected()));
724 Cache.setPropertyNoSave(RIGHT_ALIGN_IDS,
725 Boolean.toString(rightAlign.isSelected()));
726 Cache.setPropertyNoSave(SHOW_FULLSCREEN,
727 Boolean.toString(fullScreen.isSelected()));
728 Cache.setPropertyNoSave(SHOW_OVERVIEW,
729 Boolean.toString(openoverv.isSelected()));
730 Cache.setPropertyNoSave(SHOW_ANNOTATIONS,
731 Boolean.toString(annotations.isSelected()));
732 Cache.setPropertyNoSave(SHOW_CONSERVATION,
733 Boolean.toString(conservation.isSelected()));
734 Cache.setPropertyNoSave(SHOW_QUALITY,
735 Boolean.toString(quality.isSelected()));
736 Cache.setPropertyNoSave(SHOW_IDENTITY,
737 Boolean.toString(identity.isSelected()));
739 Cache.setPropertyNoSave(GAP_SYMBOL,
740 gapSymbolCB.getSelectedItem().toString());
742 Cache.setPropertyNoSave(FONT_NAME,
743 fontNameCB.getSelectedItem().toString());
744 Cache.setPropertyNoSave(FONT_STYLE,
745 fontStyleCB.getSelectedItem().toString());
746 Cache.setPropertyNoSave(FONT_SIZE,
747 fontSizeCB.getSelectedItem().toString());
749 Cache.setPropertyNoSave(ID_ITALICS,
750 Boolean.toString(idItalics.isSelected()));
751 Cache.setPropertyNoSave(SHOW_UNCONSERVED,
752 Boolean.toString(showUnconserved.isSelected()));
753 Cache.setPropertyNoSave(SHOW_OCCUPANCY,
754 Boolean.toString(showOccupancy.isSelected()));
755 Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS,
756 Boolean.toString(showGroupConsensus.isSelected()));
757 Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION,
758 Boolean.toString(showGroupConservation.isSelected()));
759 Cache.setPropertyNoSave(SHOW_CONSENSUS_HISTOGRAM,
760 Boolean.toString(showConsensHistogram.isSelected()));
761 Cache.setPropertyNoSave(SHOW_CONSENSUS_LOGO,
762 Boolean.toString(showConsensLogo.isSelected()));
763 Cache.setPropertyNoSave(ANTI_ALIAS,
764 Boolean.toString(smoothFont.isSelected()));
765 Cache.setPropertyNoSave(SCALE_PROTEIN_TO_CDNA,
766 Boolean.toString(scaleProteinToCdna.isSelected()));
767 Cache.setPropertyNoSave(SHOW_NPFEATS_TOOLTIP,
768 Boolean.toString(showNpTooltip.isSelected()));
769 Cache.setPropertyNoSave(SHOW_DBREFS_TOOLTIP,
770 Boolean.toString(showDbRefTooltip.isSelected()));
772 Cache.setPropertyNoSave(WRAP_ALIGNMENT,
773 Boolean.toString(wrap.isSelected()));
775 Cache.setPropertyNoSave("STARTUP_FILE", startupFileTextfield.getText());
776 Cache.setPropertyNoSave("SHOW_STARTUP_FILE",
777 Boolean.toString(startupCheckbox.isSelected()));
779 Cache.setPropertyNoSave(SORT_ALIGNMENT,
780 sortby.getSelectedItem().toString());
782 // convert description of sort order to enum name for save
783 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
784 .forDescription(sortAnnBy.getSelectedItem().toString());
785 if (annSortOrder != null)
787 Cache.setPropertyNoSave(SORT_ANNOTATIONS, annSortOrder.name());
790 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
791 Cache.setPropertyNoSave(SHOW_AUTOCALC_ABOVE,
792 Boolean.valueOf(showAutocalcFirst).toString());
795 * Save Colours settings
797 Cache.setPropertyNoSave(DEFAULT_COLOUR_PROT,
798 protColour.getSelectedItem().toString());
799 Cache.setPropertyNoSave(DEFAULT_COLOUR_NUC,
800 nucColour.getSelectedItem().toString());
801 Cache.setColourProperty(ANNOTATIONCOLOUR_MIN,
802 minColour.getBackground());
803 Cache.setColourProperty(ANNOTATIONCOLOUR_MAX,
804 maxColour.getBackground());
807 * Save Overview settings
809 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
810 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
811 Cache.setPropertyNoSave(USE_LEGACY_GAP,
812 Boolean.toString(useLegacyGap.isSelected()));
813 Cache.setPropertyNoSave(SHOW_OV_HIDDEN_AT_START,
814 Boolean.toString(showHiddenAtStart.isSelected()));
817 * Save Structure settings
819 Cache.setPropertyNoSave(ADD_TEMPFACT_ANN,
820 Boolean.toString(addTempFactor.isSelected()));
821 Cache.setPropertyNoSave(ADD_SS_ANN,
822 Boolean.toString(addSecondaryStructure.isSelected()));
823 Cache.setPropertyNoSave(USE_RNAVIEW,
824 Boolean.toString(useRnaView.isSelected()));
825 Cache.setPropertyNoSave(STRUCT_FROM_PDB,
826 Boolean.toString(structFromPdb.isSelected()));
827 Cache.setPropertyNoSave(STRUCTURE_DISPLAY,
828 structViewer.getSelectedItem().toString());
829 Cache.setPropertyNoSave(STRUCTURE_DIMENSIONS,
830 structureDimensions.getText()); // BH 2019.07.12
831 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
832 Cache.setPropertyNoSave(MAP_WITH_SIFTS,
833 Boolean.toString(siftsMapping.isSelected()));
834 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
837 * Save Output settings
839 Cache.setPropertyNoSave("EPS_RENDERING",
840 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
841 Cache.setPropertyNoSave("HTML_RENDERING",
842 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
843 Cache.setPropertyNoSave("SVG_RENDERING",
844 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
846 if (!Platform.isJS())
852 // Save Connections settings
853 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
854 BrowserLauncher.resetBrowser();
857 // save user-defined and selected links
858 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
859 if (menuLinks.isEmpty())
861 Cache.removePropertyNoSave("SEQUENCE_LINKS");
865 Cache.setPropertyNoSave("SEQUENCE_LINKS", menuLinks.toString());
868 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
869 if (nonMenuLinks.isEmpty())
871 Cache.removePropertyNoSave("STORED_LINKS");
875 Cache.setPropertyNoSave("STORED_LINKS", nonMenuLinks.toString());
878 Cache.setPropertyNoSave("DEFAULT_URL",
879 sequenceUrlLinks.getPrimaryUrlId());
881 Cache.setPropertyNoSave("USE_PROXY",
882 Boolean.toString(useProxy.isSelected()));
884 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
886 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
888 if (useProxy.isSelected())
890 System.setProperty("http.proxyHost", proxyServerTB.getText());
891 System.setProperty("http.proxyPort", proxyPortTB.getText());
895 System.setProperty("http.proxyHost", "");
896 System.setProperty("http.proxyPort", "");
898 Cache.setProperty("VERSION_CHECK",
899 Boolean.toString(versioncheck.isSelected()));
900 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
902 // default is false - we only set this if the user has actively agreed
903 Cache.setProperty("USAGESTATS",
904 Boolean.toString(usagestats.isSelected()));
906 if (!questionnaire.isSelected())
908 Cache.setProperty(NOQUESTIONNAIRES, "true");
912 // special - made easy to edit a property file to disable questionnaires
913 // by just adding the given line
914 Cache.removeProperty(NOQUESTIONNAIRES);
918 * Save Output settings
920 Cache.setPropertyNoSave("BLC_JVSUFFIX",
921 Boolean.toString(blcjv.isSelected()));
922 Cache.setPropertyNoSave("CLUSTAL_JVSUFFIX",
923 Boolean.toString(clustaljv.isSelected()));
924 Cache.setPropertyNoSave("FASTA_JVSUFFIX",
925 Boolean.toString(fastajv.isSelected()));
926 Cache.setPropertyNoSave("MSF_JVSUFFIX",
927 Boolean.toString(msfjv.isSelected()));
928 Cache.setPropertyNoSave("PFAM_JVSUFFIX",
929 Boolean.toString(pfamjv.isSelected()));
930 Cache.setPropertyNoSave("PILEUP_JVSUFFIX",
931 Boolean.toString(pileupjv.isSelected()));
932 Cache.setPropertyNoSave("PIR_JVSUFFIX",
933 Boolean.toString(pirjv.isSelected()));
934 Cache.setPropertyNoSave("PIR_MODELLER",
935 Boolean.toString(modellerOutput.isSelected()));
936 Cache.setPropertyNoSave("EXPORT_EMBBED_BIOJSON",
937 Boolean.toString(embbedBioJSON.isSelected()));
938 Cache.setPropertyNoSave(FIGURE_AUTOIDWIDTH,
939 Boolean.toString(autoIdWidth.isSelected()));
940 userIdWidth_actionPerformed();
941 Cache.setPropertyNoSave("FIGURE_FIXEDIDWIDTH", userIdWidth.getText());
944 * Save Editing settings
946 Cache.setPropertyNoSave(AUTO_CALC_CONSENSUS,
947 Boolean.toString(autoCalculateConsCheck.isSelected()));
948 Cache.setPropertyNoSave(SORT_BY_TREE,
949 Boolean.toString(sortByTree.isSelected()));
950 Cache.setPropertyNoSave(PAD_GAPS,
951 Boolean.toString(padGaps.isSelected()));
953 if (!Platform.isJS())
955 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, suffixTemplate.getText());
968 Cache.setPropertyNoSave(BackupFiles.ROLL_MAX, Integer
969 .toString(getSpinnerInt(backupfilesRollMaxSpinner, 4)));
970 Cache.setPropertyNoSave(BackupFiles.SUFFIX_DIGITS,
971 Integer.toString(getSpinnerInt(suffixDigitsSpinner, 3)));
972 Cache.setPropertyNoSave(BackupFiles.NS + "_PRESET", Integer
973 .toString(getComboIntStringKey(backupfilesPresetsCombo)));
977 Cache.saveProperties();
978 Desktop.getInstance().doConfigureStructurePrefs();
981 frame.setClosed(true);
982 } catch (Exception ex)
987 public static void setAppletDefaults()
990 // http://www.jalview.org/old/v2_8/examples/appletParameters.html
992 // showConservation true or false Default is true.
993 // showQuality true or false Default is true.
994 // showConsensus true or false Default is true.
995 // showFeatureSettings true or false Shows the feature settings window when
997 // showTreeBootstraps true or false (default is true) show or hide branch
999 // showTreeDistances true or false (default is true) show or hide branch
1001 // showUnlinkedTreeNodes true or false (default is false) indicate if
1002 // unassociated nodes should be highlighted in the tree view
1003 // showUnconserved true of false (default is false) When true, only gaps and
1004 // symbols different to the consensus sequence ions of the alignment
1005 // showGroupConsensus true of false (default is false) When true, shows
1006 // consensus annotation row for any groups on the alignment. (since 2.7)
1007 // showGroupConservation true of false (default is false) When true, shows
1008 // amino-acid property conservation annotation row for any groups on the
1009 // showConsensusHistogram true of false (default is true) When true, shows
1010 // the percentage occurence of the consensus symbol for each column as a
1011 // showSequenceLogo true of false (default is false) When true, shows a
1012 // sequence logo above the consensus sequence (overlaid above the Consensus
1014 Cache.setPropertyNoSave(SHOW_CONSERVATION, "true");
1015 Cache.setPropertyNoSave(SHOW_QUALITY, "false");
1016 Cache.setPropertyNoSave(SHOW_CONSENSUS, "true");
1017 Cache.setPropertyNoSave(SHOW_UNCONSERVED, "false");
1018 Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION, "false");
1019 Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS, "false");
1021 // TODO -- just a start here
1025 * Do any necessary validation before saving settings. Return focus to the
1026 * first tab which fails validation.
1030 private boolean validateSettings()
1032 if (!validateStructure())
1034 structureTab.requestFocusInWindow();
1041 protected boolean validateStructure()
1043 return validateChimeraPath();
1051 public void startupFileTextfield_mouseClicked()
1053 // TODO: JAL-3048 not needed for Jalview-JS
1054 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
1055 JalviewFileChooser chooser = JalviewFileChooser
1056 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
1057 chooser.setFileView(new JalviewFileView());
1058 chooser.setDialogTitle(
1059 MessageManager.getString("label.select_startup_file"));
1061 int value = chooser.showOpenDialog(this);
1063 if (value == JalviewFileChooser.APPROVE_OPTION)
1065 FileFormatI format = chooser.getSelectedFormat();
1068 Cache.setPropertyNoSave("DEFAULT_FILE_FORMAT",
1071 startupFileTextfield
1072 .setText(chooser.getSelectedFile().getAbsolutePath());
1083 public void cancel_actionPerformed(ActionEvent e)
1087 if (!Platform.isJS())
1089 wsPrefs.updateWsMenuConfig(true);
1090 wsPrefs.refreshWs_actionPerformed(e);
1092 frame.setClosed(true);
1093 } catch (Exception ex)
1105 public void annotations_actionPerformed(ActionEvent e)
1107 conservation.setEnabled(annotations.isSelected());
1108 quality.setEnabled(annotations.isSelected());
1109 identity.setEnabled(annotations.isSelected());
1110 showOccupancy.setEnabled(annotations.isSelected());
1111 showGroupConsensus.setEnabled(annotations.isSelected());
1112 showGroupConservation.setEnabled(annotations.isSelected());
1113 showConsensHistogram.setEnabled(annotations.isSelected()
1114 && (identity.isSelected() || showGroupConsensus.isSelected()));
1115 showConsensLogo.setEnabled(annotations.isSelected()
1116 && (identity.isSelected() || showGroupConsensus.isSelected()));
1120 public void newLink_actionPerformed(ActionEvent e)
1122 GSequenceLink link = new GSequenceLink();
1123 boolean valid = false;
1126 if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
1127 MessageManager.getString("label.new_sequence_url_link"),
1128 JvOptionPane.OK_CANCEL_OPTION, -1,
1129 null) == JvOptionPane.OK_OPTION)
1131 if (link.checkValid())
1133 if (((UrlLinkTableModel) linkUrlTable.getModel())
1134 .isUniqueName(link.getName()))
1136 ((UrlLinkTableModel) linkUrlTable.getModel())
1137 .insertRow(link.getName(), link.getURL());
1142 link.notifyDuplicate();
1155 public void editLink_actionPerformed(ActionEvent e)
1157 GSequenceLink link = new GSequenceLink();
1159 int index = linkUrlTable.getSelectedRow();
1162 // button no longer enabled if row is not selected
1163 Cache.log.debug("Edit with no row selected in linkUrlTable");
1167 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1169 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1171 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1172 link.setName(oldName);
1173 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1175 boolean valid = false;
1178 if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
1179 MessageManager.getString("label.edit_sequence_url_link"),
1180 JvOptionPane.OK_CANCEL_OPTION, -1,
1181 null) == JvOptionPane.OK_OPTION)
1183 if (link.checkValid())
1185 if ((oldName.equals(link.getName()))
1186 || (((UrlLinkTableModel) linkUrlTable.getModel())
1187 .isUniqueName(link.getName())))
1189 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1190 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1195 link.notifyDuplicate();
1208 public void deleteLink_actionPerformed(ActionEvent e)
1210 int index = linkUrlTable.getSelectedRow();
1211 int modelIndex = -1;
1214 // button no longer enabled if row is not selected
1215 Cache.log.debug("Delete with no row selected in linkUrlTable");
1220 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1223 // make sure we use the model index to delete, and not the table index
1224 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1228 public void defaultBrowser_mouseClicked(MouseEvent e)
1230 // TODO: JAL-3048 not needed for j2s
1231 if (!Platform.isJS()) // BH 2019
1238 JFileChooser chooser = new JFileChooser(".");
1239 chooser.setDialogTitle(
1240 MessageManager.getString("label.select_default_browser"));
1242 int value = chooser.showOpenDialog(this);
1244 if (value == JFileChooser.APPROVE_OPTION)
1246 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1255 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1259 protected void showunconserved_actionPerformed(ActionEvent e)
1261 // TODO Auto-generated method stub
1262 super.showunconserved_actionPerformed(e);
1266 * not implemented -- returns empty list
1270 public static List<String> getGroupURLLinks()
1272 return groupURLLinks;
1276 public void minColour_actionPerformed(JPanel panel)
1278 JalviewColourChooser.showColourChooser(this,
1279 MessageManager.getString("label.select_colour_minimum_value"),
1284 public void maxColour_actionPerformed(JPanel panel)
1286 JalviewColourChooser.showColourChooser(this,
1287 MessageManager.getString("label.select_colour_maximum_value"),
1292 public void gapColour_actionPerformed(JPanel gap)
1294 if (!useLegacyGap.isSelected())
1296 JalviewColourChooser.showColourChooser(this,
1297 MessageManager.getString("label.select_gap_colour"),
1303 public void hiddenColour_actionPerformed(JPanel hidden)
1305 JalviewColourChooser.showColourChooser(this,
1306 MessageManager.getString("label.select_hidden_colour"),
1311 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1313 boolean enabled = useLegacyGap.isSelected();
1316 gapColour.setBackground(
1317 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1321 gapColour.setBackground(
1322 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1324 gapColour.setEnabled(!enabled);
1325 gapLabel.setEnabled(!enabled);
1329 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1331 useLegacyGap.setSelected(false);
1332 useLegacyGaps_actionPerformed(null);
1333 showHiddenAtStart.setSelected(false);
1334 hiddenColour.setBackground(
1335 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1339 protected void userIdWidth_actionPerformed()
1343 String val = userIdWidth.getText().trim();
1344 if (val.length() > 0)
1346 Integer iw = Integer.parseInt(val);
1347 if (iw.intValue() < 12)
1349 throw new NumberFormatException();
1351 userIdWidth.setText(iw.toString());
1353 } catch (NumberFormatException x)
1355 userIdWidth.setText("");
1356 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
1358 .getString("warn.user_defined_width_requirements"),
1359 MessageManager.getString("label.invalid_id_column_width"),
1360 JvOptionPane.WARNING_MESSAGE);
1365 protected void autoIdWidth_actionPerformed()
1367 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1368 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1372 * Returns true if chimera path is to a valid executable, else show an error
1375 protected boolean validateChimeraPath()
1377 if (chimeraPath.getText().trim().length() > 0)
1379 File f = new File(chimeraPath.getText());
1380 if (!f.canExecute())
1382 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
1383 MessageManager.getString("label.invalid_chimera_path"),
1384 MessageManager.getString("label.invalid_name"),
1385 JvOptionPane.ERROR_MESSAGE);
1393 * If Chimera is selected, check it can be found on default or user-specified
1394 * path, if not show a warning/help dialog.
1397 protected void structureViewer_actionPerformed(String selectedItem)
1399 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1403 boolean found = false;
1406 * Try user-specified and standard paths for Chimera executable.
1408 List<String> paths = StructureManager.getChimeraPaths();
1409 paths.add(0, chimeraPath.getText());
1410 for (String path : paths)
1412 if (new File(path.trim()).canExecute())
1420 String[] options = { "OK", "Help" };
1421 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
1422 JvSwingUtils.wrapTooltip(true,
1423 MessageManager.getString("label.chimera_missing")),
1424 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1425 null, options, options[0]);
1426 if (showHelp == JvOptionPane.NO_OPTION)
1430 Help.showHelpWindow(HelpId.StructureViewer);
1431 } catch (HelpSetException e)
1433 e.printStackTrace();
1439 public class OptionsParam
1441 private String name;
1443 private String code;
1445 public OptionsParam(String name, String code)
1451 public String getName()
1456 public void setName(String name)
1461 public String getCode()
1466 public void setCode(String code)
1472 public String toString()
1478 public boolean equals(Object that)
1480 if (!(that instanceof OptionsParam))
1484 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1488 public int hashCode()
1490 return name.hashCode() + code.hashCode();
1494 protected class UrlListSelectionHandler implements ListSelectionListener
1498 public void valueChanged(ListSelectionEvent e)
1500 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1502 int index = lsm.getMinSelectionIndex();
1505 // no selection, so disable delete/edit buttons
1506 editLink.setEnabled(false);
1507 deleteLink.setEnabled(false);
1510 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1512 // enable/disable edit and delete link buttons
1513 if (((UrlLinkTableModel) linkUrlTable.getModel())
1514 .isRowDeletable(modelIndex))
1516 deleteLink.setEnabled(true);
1520 deleteLink.setEnabled(false);
1523 if (((UrlLinkTableModel) linkUrlTable.getModel())
1524 .isRowEditable(modelIndex))
1526 editLink.setEnabled(true);
1530 editLink.setEnabled(false);