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.BackupFilesPresetEntry;
29 import jalview.io.FileFormatI;
30 import jalview.io.JalviewFileChooser;
31 import jalview.io.JalviewFileView;
32 import jalview.jbgui.GPreferences;
33 import jalview.jbgui.GSequenceLink;
34 import jalview.schemes.ColourSchemeI;
35 import jalview.schemes.ColourSchemes;
36 import jalview.schemes.ResidueColourScheme;
37 import jalview.urls.UrlLinkTableModel;
38 import jalview.urls.api.UrlProviderFactoryI;
39 import jalview.urls.api.UrlProviderI;
40 import jalview.urls.desktop.DesktopUrlProviderFactory;
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 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;
230 public 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 List<String> groupURLLinks;
243 // get links selected to be in the menu (SEQUENCE_LINKS)
244 // and links entered by the user but not selected (STORED_LINKS)
245 String inMenuString = Cache.getDefault("SEQUENCE_LINKS", "");
246 String notInMenuString = Cache.getDefault("STORED_LINKS", "");
247 String defaultUrl = Cache.getDefault("DEFAULT_URL",
248 UrlConstants.DEFAULT_LABEL);
250 // if both links lists are empty, add the DEFAULT_URL link
251 // otherwise we assume the default link is in one of the lists
252 if (inMenuString.isEmpty() && notInMenuString.isEmpty())
254 inMenuString = UrlConstants.DEFAULT_STRING;
256 UrlProviderFactoryI factory = new DesktopUrlProviderFactory(defaultUrl,
257 inMenuString, notInMenuString);
258 sequenceUrlLinks = factory.createUrlProvider();
259 dataModel = new UrlLinkTableModel(sequenceUrlLinks);
262 * TODO: reformulate groupURL encoding so two or more can be stored in the
263 * .properties file as '|' separated strings
266 groupURLLinks = new ArrayList<>();
269 JInternalFrame frame;
271 private WsPreferences wsPrefs;
273 private OptionsParam promptEachTimeOpt = new OptionsParam(
274 MessageManager.getString("label.prompt_each_time"),
277 private OptionsParam lineArtOpt = new OptionsParam(
278 MessageManager.getString("label.lineart"), "Lineart");
280 private OptionsParam textOpt = new OptionsParam(
281 MessageManager.getString("action.text"), "Text");
284 * Creates a new Preferences object.
289 frame = new JInternalFrame();
290 frame.setContentPane(this);
291 if (!Platform.isJS())
298 wsPrefs = new WsPreferences();
299 wsTab.add(wsPrefs, BorderLayout.CENTER);
301 int width = 500, height = 450;
302 if (Platform.isAMacAndNotJS())
308 Desktop.addInternalFrame(frame,
309 MessageManager.getString("label.preferences"), width, height);
310 frame.setMinimumSize(new Dimension(width, height));
313 * Set Visual tab defaults
315 seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
316 rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
317 fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
318 annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
320 conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
321 quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
322 identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
323 openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
325 .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
326 showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
328 .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
329 showGroupConservation.setSelected(
330 Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
331 showConsensHistogram.setSelected(
332 Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
334 .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
336 .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
338 .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
340 String[] fonts = java.awt.GraphicsEnvironment
341 .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
342 for (int i = 0; i < fonts.length; i++)
344 fontNameCB.addItem(fonts[i]);
347 for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++)
349 fontSizeCB.addItem(i + "");
352 fontStyleCB.addItem("plain");
353 fontStyleCB.addItem("bold");
354 fontStyleCB.addItem("italic");
356 fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
357 fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
358 fontStyleCB.setSelectedItem(
359 Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
361 smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", true));
363 .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
365 idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
367 wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
369 gapSymbolCB.addItem("-");
370 gapSymbolCB.addItem(".");
372 gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
374 sortby.addItem("No sort");
375 sortby.addItem("Id");
376 sortby.addItem("Pairwise Identity");
377 sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
379 sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
381 .addItem(SequenceAnnotationOrder.SEQUENCE_AND_LABEL.toString());
383 .addItem(SequenceAnnotationOrder.LABEL_AND_SEQUENCE.toString());
384 SequenceAnnotationOrder savedSort = SequenceAnnotationOrder
385 .valueOf(Cache.getDefault(SORT_ANNOTATIONS,
386 SequenceAnnotationOrder.NONE.name()));
387 sortAnnBy.setSelectedItem(savedSort.toString());
389 sortAutocalc.addItem("Autocalculated first");
390 sortAutocalc.addItem("Autocalculated last");
391 final boolean showAbove = Cache.getDefault(SHOW_AUTOCALC_ABOVE, true);
392 sortAutocalc.setSelectedItem(showAbove ? sortAutocalc.getItemAt(0)
393 : sortAutocalc.getItemAt(1));
395 .setSelected(Cache.getDefault("SHOW_STARTUP_FILE", true));
396 startupFileTextfield.setText(Cache.getDefault("STARTUP_FILE",
397 Cache.getDefault("www.jalview.org", "http://www.jalview.org")
398 + "/examples/exampleFile_2_3.jar"));
401 * Set Colours tab defaults
403 protColour.addItem(ResidueColourScheme.NONE);
404 nucColour.addItem(ResidueColourScheme.NONE);
405 for (ColourSchemeI cs : ColourSchemes.getInstance().getColourSchemes())
407 String name = cs.getSchemeName();
408 protColour.addItem(name);
409 nucColour.addItem(name);
411 String oldProp = Cache.getDefault(DEFAULT_COLOUR,
412 ResidueColourScheme.NONE);
413 String newProp = Cache.getDefault(DEFAULT_COLOUR_PROT, null);
414 protColour.setSelectedItem(newProp != null ? newProp : oldProp);
415 newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
416 nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
417 minColour.setBackground(
418 Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
419 maxColour.setBackground(
420 Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
423 * Set overview panel defaults
425 gapColour.setBackground(
426 Cache.getDefaultColour(GAP_COLOUR,
427 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP));
428 hiddenColour.setBackground(
429 Cache.getDefaultColour(HIDDEN_COLOUR,
430 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN));
431 useLegacyGap.setSelected(Cache.getDefault(USE_LEGACY_GAP, false));
432 gapLabel.setEnabled(!useLegacyGap.isSelected());
433 gapColour.setEnabled(!useLegacyGap.isSelected());
435 .setSelected(Cache.getDefault(SHOW_OV_HIDDEN_AT_START, false));
438 * Set Structure tab defaults.
440 final boolean structSelected = Cache.getDefault(STRUCT_FROM_PDB, false);
441 structFromPdb.setSelected(structSelected);
442 useRnaView.setSelected(Cache.getDefault(USE_RNAVIEW, false));
443 useRnaView.setEnabled(structSelected);
444 addSecondaryStructure.setSelected(Cache.getDefault(ADD_SS_ANN, false));
445 addSecondaryStructure.setEnabled(structSelected);
446 addTempFactor.setSelected(Cache.getDefault(ADD_TEMPFACT_ANN, false));
447 addTempFactor.setEnabled(structSelected);
448 structViewer.setSelectedItem(
449 Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
450 chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
451 chimeraPath.addActionListener(new ActionListener()
454 public void actionPerformed(ActionEvent e)
456 validateChimeraPath();
460 if (Cache.getDefault("MAP_WITH_SIFTS", false))
462 siftsMapping.setSelected(true);
466 nwMapping.setSelected(true);
470 .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
473 * Set Connections tab defaults
477 linkUrlTable.setModel(dataModel);
478 final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
479 linkUrlTable.getModel());
480 linkUrlTable.setRowSorter(sorter);
481 List<RowSorter.SortKey> sortKeys = new ArrayList<>();
483 UrlLinkTableModel m = (UrlLinkTableModel) linkUrlTable.getModel();
484 sortKeys.add(new RowSorter.SortKey(m.getPrimaryColumn(),
485 SortOrder.DESCENDING));
486 sortKeys.add(new RowSorter.SortKey(m.getSelectedColumn(),
487 SortOrder.DESCENDING));
489 new RowSorter.SortKey(m.getNameColumn(), SortOrder.ASCENDING));
491 sorter.setSortKeys(sortKeys);
492 // BH 2018 setSortKeys will do the sort
496 ActionListener onReset;
497 onReset = new ActionListener()
500 public void actionPerformed(ActionEvent e)
502 filterTB.setText("");
503 sorter.setRowFilter(RowFilter.regexFilter(""));
507 doReset.addActionListener(onReset);
509 // filter to display only custom urls
510 final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
513 public boolean include(
514 Entry<? extends TableModel, ? extends Object> entry)
516 return ((UrlLinkTableModel) entry.getModel()).isUserEntry(entry);
520 final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
521 linkUrlTable.getModel());
522 customSorter.setRowFilter(customUrlFilter);
524 ActionListener onCustomOnly;
525 onCustomOnly = new ActionListener()
528 public void actionPerformed(ActionEvent e)
530 filterTB.setText("");
531 sorter.setRowFilter(customUrlFilter);
534 userOnly.addActionListener(onCustomOnly);
536 filterTB.getDocument().addDocumentListener(new DocumentListener()
538 String caseInsensitiveFlag = "(?i)";
541 public void changedUpdate(DocumentEvent e)
543 sorter.setRowFilter(RowFilter
544 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
548 public void removeUpdate(DocumentEvent e)
550 sorter.setRowFilter(RowFilter
551 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
555 public void insertUpdate(DocumentEvent e)
557 sorter.setRowFilter(RowFilter
558 .regexFilter(caseInsensitiveFlag + filterTB.getText()));
562 // set up list selection functionality
563 linkUrlTable.getSelectionModel()
564 .addListSelectionListener(new UrlListSelectionHandler());
566 // set up radio buttons
567 int onClickCol = ((UrlLinkTableModel) linkUrlTable.getModel())
569 String onClickName = linkUrlTable.getColumnName(onClickCol);
570 linkUrlTable.getColumn(onClickName)
571 .setCellRenderer(new RadioButtonRenderer());
572 linkUrlTable.getColumn(onClickName)
573 .setCellEditor(new RadioButtonEditor());
575 // get boolean columns and resize those to min possible
576 for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
578 if (linkUrlTable.getModel().getColumnClass(column)
579 .equals(Boolean.class))
581 TableColumn tableColumn = linkUrlTable.getColumnModel()
583 int preferredWidth = tableColumn.getMinWidth();
585 TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
587 Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
588 int cwidth = c.getPreferredSize().width
589 + linkUrlTable.getIntercellSpacing().width;
590 preferredWidth = Math.max(preferredWidth, cwidth);
592 tableColumn.setPreferredWidth(preferredWidth);
596 useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
597 useProxy_actionPerformed(); // make sure useProxy is correctly initialised
598 proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
599 proxyPortTB.setText(Cache.getDefault("PROXY_PORT", ""));
601 defaultBrowser.setText(Cache.getDefault("DEFAULT_BROWSER", ""));
603 usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
604 // note antisense here: default is true
606 .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
607 versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
610 * Set Output tab defaults
612 setupOutputCombo(epsRendering, "EPS_RENDERING");
613 setupOutputCombo(htmlRendering, "HTML_RENDERING");
614 setupOutputCombo(svgRendering, "SVG_RENDERING");
615 autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
616 userIdWidth.setEnabled(!autoIdWidth.isSelected());
617 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
618 Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
619 userIdWidth.setText(wi == null ? "" : wi.toString());
620 // TODO: refactor to use common enum via FormatAdapter and allow extension
621 // for new flat file formats
622 blcjv.setSelected(Cache.getDefault("BLC_JVSUFFIX", true));
623 clustaljv.setSelected(Cache.getDefault("CLUSTAL_JVSUFFIX", true));
624 fastajv.setSelected(Cache.getDefault("FASTA_JVSUFFIX", true));
625 msfjv.setSelected(Cache.getDefault("MSF_JVSUFFIX", true));
626 pfamjv.setSelected(Cache.getDefault("PFAM_JVSUFFIX", true));
627 pileupjv.setSelected(Cache.getDefault("PILEUP_JVSUFFIX", true));
628 pirjv.setSelected(Cache.getDefault("PIR_JVSUFFIX", true));
629 modellerOutput.setSelected(Cache.getDefault("PIR_MODELLER", false));
631 .setSelected(Cache.getDefault("EXPORT_EMBBED_BIOJSON", true));
634 * Set Editing tab defaults
636 autoCalculateConsCheck
637 .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
638 padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
639 sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
641 annotations_actionPerformed(null); // update the display of the annotation
646 * Set Backups tab defaults
648 loadLastSavedBackupsOptions();
652 * A helper method that sets the items and initial selection in a character
653 * rendering option list (Prompt each time/Lineart/Text)
658 protected void setupOutputCombo(JComboBox<Object> comboBox,
661 comboBox.addItem(promptEachTimeOpt);
662 comboBox.addItem(lineArtOpt);
663 comboBox.addItem(textOpt);
666 * JalviewJS doesn't support Lineart so force it to Text
668 String defaultOption = Platform.isJS() ? "Text"
669 : Cache.getDefault(propertyKey, "Prompt each time");
670 if (defaultOption.equalsIgnoreCase("Text"))
672 comboBox.setSelectedItem(textOpt);
674 else if (defaultOption.equalsIgnoreCase("Lineart"))
676 comboBox.setSelectedItem(lineArtOpt);
680 comboBox.setSelectedItem(promptEachTimeOpt);
685 * Save user selections on the Preferences tabs to the Cache and write out to
691 public void ok_actionPerformed(ActionEvent e)
693 if (!validateSettings())
699 * Save Visual settings
701 Cache.setPropertyNoSave("SHOW_JVSUFFIX",
702 Boolean.toString(seqLimit.isSelected()));
703 Cache.setPropertyNoSave("RIGHT_ALIGN_IDS",
704 Boolean.toString(rightAlign.isSelected()));
705 Cache.setPropertyNoSave("SHOW_FULLSCREEN",
706 Boolean.toString(fullScreen.isSelected()));
707 Cache.setPropertyNoSave("SHOW_OVERVIEW",
708 Boolean.toString(openoverv.isSelected()));
709 Cache.setPropertyNoSave("SHOW_ANNOTATIONS",
710 Boolean.toString(annotations.isSelected()));
711 Cache.setPropertyNoSave("SHOW_CONSERVATION",
712 Boolean.toString(conservation.isSelected()));
713 Cache.setPropertyNoSave("SHOW_QUALITY",
714 Boolean.toString(quality.isSelected()));
715 Cache.setPropertyNoSave("SHOW_IDENTITY",
716 Boolean.toString(identity.isSelected()));
718 Cache.setPropertyNoSave("GAP_SYMBOL",
719 gapSymbolCB.getSelectedItem().toString());
721 Cache.setPropertyNoSave("FONT_NAME",
722 fontNameCB.getSelectedItem().toString());
723 Cache.setPropertyNoSave("FONT_STYLE",
724 fontStyleCB.getSelectedItem().toString());
725 Cache.setPropertyNoSave("FONT_SIZE",
726 fontSizeCB.getSelectedItem().toString());
728 Cache.setPropertyNoSave("ID_ITALICS",
729 Boolean.toString(idItalics.isSelected()));
730 Cache.setPropertyNoSave("SHOW_UNCONSERVED",
731 Boolean.toString(showUnconserved.isSelected()));
732 Cache.setPropertyNoSave(SHOW_OCCUPANCY,
733 Boolean.toString(showOccupancy.isSelected()));
734 Cache.setPropertyNoSave("SHOW_GROUP_CONSENSUS",
735 Boolean.toString(showGroupConsensus.isSelected()));
736 Cache.setPropertyNoSave("SHOW_GROUP_CONSERVATION",
737 Boolean.toString(showGroupConservation.isSelected()));
738 Cache.setPropertyNoSave("SHOW_CONSENSUS_HISTOGRAM",
739 Boolean.toString(showConsensHistogram.isSelected()));
740 Cache.setPropertyNoSave("SHOW_CONSENSUS_LOGO",
741 Boolean.toString(showConsensLogo.isSelected()));
742 Cache.setPropertyNoSave("ANTI_ALIAS",
743 Boolean.toString(smoothFont.isSelected()));
744 Cache.setPropertyNoSave(SCALE_PROTEIN_TO_CDNA,
745 Boolean.toString(scaleProteinToCdna.isSelected()));
746 Cache.setPropertyNoSave("SHOW_NPFEATS_TOOLTIP",
747 Boolean.toString(showNpTooltip.isSelected()));
748 Cache.setPropertyNoSave("SHOW_DBREFS_TOOLTIP",
749 Boolean.toString(showDbRefTooltip.isSelected()));
751 Cache.setPropertyNoSave("WRAP_ALIGNMENT",
752 Boolean.toString(wrap.isSelected()));
754 Cache.setPropertyNoSave("STARTUP_FILE",
755 startupFileTextfield.getText());
756 Cache.setPropertyNoSave("SHOW_STARTUP_FILE",
757 Boolean.toString(startupCheckbox.isSelected()));
759 Cache.setPropertyNoSave("SORT_ALIGNMENT",
760 sortby.getSelectedItem().toString());
762 // convert description of sort order to enum name for save
763 SequenceAnnotationOrder annSortOrder = SequenceAnnotationOrder
764 .forDescription(sortAnnBy.getSelectedItem().toString());
765 if (annSortOrder != null)
767 Cache.setPropertyNoSave(SORT_ANNOTATIONS,
768 annSortOrder.name());
771 final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
772 Cache.setPropertyNoSave(SHOW_AUTOCALC_ABOVE,
773 Boolean.valueOf(showAutocalcFirst).toString());
776 * Save Colours settings
778 Cache.setPropertyNoSave(DEFAULT_COLOUR_PROT,
779 protColour.getSelectedItem().toString());
780 Cache.setPropertyNoSave(DEFAULT_COLOUR_NUC,
781 nucColour.getSelectedItem().toString());
782 Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
783 minColour.getBackground());
784 Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
785 maxColour.getBackground());
788 * Save Overview settings
790 Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
791 Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
792 Cache.setPropertyNoSave(USE_LEGACY_GAP,
793 Boolean.toString(useLegacyGap.isSelected()));
794 Cache.setPropertyNoSave(SHOW_OV_HIDDEN_AT_START,
795 Boolean.toString(showHiddenAtStart.isSelected()));
798 * Save Structure settings
800 Cache.setPropertyNoSave(ADD_TEMPFACT_ANN,
801 Boolean.toString(addTempFactor.isSelected()));
802 Cache.setPropertyNoSave(ADD_SS_ANN,
803 Boolean.toString(addSecondaryStructure.isSelected()));
804 Cache.setPropertyNoSave(USE_RNAVIEW,
805 Boolean.toString(useRnaView.isSelected()));
806 Cache.setPropertyNoSave(STRUCT_FROM_PDB,
807 Boolean.toString(structFromPdb.isSelected()));
808 Cache.setPropertyNoSave(STRUCTURE_DISPLAY,
809 structViewer.getSelectedItem().toString());
810 Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
811 Cache.setPropertyNoSave("MAP_WITH_SIFTS",
812 Boolean.toString(siftsMapping.isSelected()));
813 SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
816 * Save Output settings
818 Cache.setPropertyNoSave("EPS_RENDERING",
819 ((OptionsParam) epsRendering.getSelectedItem()).getCode());
820 Cache.setPropertyNoSave("HTML_RENDERING",
821 ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
822 Cache.setPropertyNoSave("SVG_RENDERING",
823 ((OptionsParam) svgRendering.getSelectedItem()).getCode());
826 * Save Connections settings
828 Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
830 jalview.util.BrowserLauncher.resetBrowser();
832 // save user-defined and selected links
833 String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
834 if (menuLinks.isEmpty())
836 Cache.removeNoSave("SEQUENCE_LINKS");
840 Cache.setPropertyNoSave("SEQUENCE_LINKS",
841 menuLinks.toString());
844 String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
845 if (nonMenuLinks.isEmpty())
847 Cache.removeNoSave("STORED_LINKS");
851 Cache.setPropertyNoSave("STORED_LINKS",
852 nonMenuLinks.toString());
855 Cache.setPropertyNoSave("DEFAULT_URL",
856 sequenceUrlLinks.getPrimaryUrlId());
858 Cache.setPropertyNoSave("USE_PROXY",
859 Boolean.toString(useProxy.isSelected()));
861 Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
863 Cache.setOrRemove("PROXY_PORT", proxyPortTB.getText());
865 if (useProxy.isSelected())
867 System.setProperty("http.proxyHost", proxyServerTB.getText());
868 System.setProperty("http.proxyPort", proxyPortTB.getText());
872 System.setProperty("http.proxyHost", "");
873 System.setProperty("http.proxyPort", "");
875 Cache.setProperty("VERSION_CHECK",
876 Boolean.toString(versioncheck.isSelected()));
877 if (Cache.getProperty("USAGESTATS") != null || usagestats.isSelected())
879 // default is false - we only set this if the user has actively agreed
880 Cache.setProperty("USAGESTATS",
881 Boolean.toString(usagestats.isSelected()));
883 if (!questionnaire.isSelected())
885 Cache.setProperty("NOQUESTIONNAIRES", "true");
889 // special - made easy to edit a property file to disable questionnaires
890 // by just adding the given line
891 Cache.removeProperty("NOQUESTIONNAIRES");
895 * Save Output settings
897 Cache.setPropertyNoSave("BLC_JVSUFFIX",
898 Boolean.toString(blcjv.isSelected()));
899 Cache.setPropertyNoSave("CLUSTAL_JVSUFFIX",
900 Boolean.toString(clustaljv.isSelected()));
901 Cache.setPropertyNoSave("FASTA_JVSUFFIX",
902 Boolean.toString(fastajv.isSelected()));
903 Cache.setPropertyNoSave("MSF_JVSUFFIX",
904 Boolean.toString(msfjv.isSelected()));
905 Cache.setPropertyNoSave("PFAM_JVSUFFIX",
906 Boolean.toString(pfamjv.isSelected()));
907 Cache.setPropertyNoSave("PILEUP_JVSUFFIX",
908 Boolean.toString(pileupjv.isSelected()));
909 Cache.setPropertyNoSave("PIR_JVSUFFIX",
910 Boolean.toString(pirjv.isSelected()));
911 Cache.setPropertyNoSave("PIR_MODELLER",
912 Boolean.toString(modellerOutput.isSelected()));
913 Cache.setPropertyNoSave("EXPORT_EMBBED_BIOJSON",
914 Boolean.toString(embbedBioJSON.isSelected()));
915 jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
917 Cache.setPropertyNoSave("FIGURE_AUTOIDWIDTH",
918 Boolean.toString(autoIdWidth.isSelected()));
919 userIdWidth_actionPerformed();
920 Cache.setPropertyNoSave("FIGURE_FIXEDIDWIDTH",
921 userIdWidth.getText());
924 * Save Editing settings
926 Cache.setPropertyNoSave("AUTO_CALC_CONSENSUS",
927 Boolean.toString(autoCalculateConsCheck.isSelected()));
928 Cache.setPropertyNoSave("SORT_BY_TREE",
929 Boolean.toString(sortByTree.isSelected()));
930 Cache.setPropertyNoSave("PAD_GAPS",
931 Boolean.toString(padGaps.isSelected()));
933 if (!Platform.isJS())
935 wsPrefs.updateAndRefreshWsMenuConfig(false);
939 * Save Backups settings
941 Cache.setPropertyNoSave(BackupFiles.ENABLED,
942 Boolean.toString(enableBackupFiles.isSelected()));
943 int preset = getComboIntStringKey(backupfilesPresetsCombo);
944 Cache.setPropertyNoSave(BackupFiles.NS + "_PRESET", Integer.toString(preset));
946 if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
948 BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
949 BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
950 BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
951 Cache.applicationProperties
952 .setProperty(BackupFilesPresetEntry.CUSTOMCONFIG,
953 customBFPE.toString());
956 BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
958 Cache.setPropertyNoSave(
959 BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
961 Cache.saveProperties();
962 Desktop.instance.doConfigureStructurePrefs();
965 frame.setClosed(true);
966 } catch (Exception ex)
972 * Do any necessary validation before saving settings. Return focus to the
973 * first tab which fails validation.
977 private boolean validateSettings()
979 if (!validateStructure())
981 structureTab.requestFocusInWindow();
988 protected boolean validateStructure()
990 return validateChimeraPath();
998 public void startupFileTextfield_mouseClicked()
1000 // TODO: JAL-3048 not needed for Jalview-JS
1001 String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
1002 JalviewFileChooser chooser = JalviewFileChooser
1003 .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat);
1004 chooser.setFileView(new JalviewFileView());
1005 chooser.setDialogTitle(
1006 MessageManager.getString("label.select_startup_file"));
1008 int value = chooser.showOpenDialog(this);
1010 if (value == JalviewFileChooser.APPROVE_OPTION)
1012 FileFormatI format = chooser.getSelectedFormat();
1015 Cache.setPropertyNoSave("DEFAULT_FILE_FORMAT",
1018 startupFileTextfield
1019 .setText(chooser.getSelectedFile().getAbsolutePath());
1030 public void cancel_actionPerformed(ActionEvent e)
1034 if (!Platform.isJS())
1036 wsPrefs.updateWsMenuConfig(true);
1037 wsPrefs.refreshWs_actionPerformed(e);
1039 frame.setClosed(true);
1040 } catch (Exception ex)
1052 public void annotations_actionPerformed(ActionEvent e)
1054 conservation.setEnabled(annotations.isSelected());
1055 quality.setEnabled(annotations.isSelected());
1056 identity.setEnabled(annotations.isSelected());
1057 showOccupancy.setEnabled(annotations.isSelected());
1058 showGroupConsensus.setEnabled(annotations.isSelected());
1059 showGroupConservation.setEnabled(annotations.isSelected());
1060 showConsensHistogram.setEnabled(annotations.isSelected()
1061 && (identity.isSelected() || showGroupConsensus.isSelected()));
1062 showConsensLogo.setEnabled(annotations.isSelected()
1063 && (identity.isSelected() || showGroupConsensus.isSelected()));
1067 public void newLink_actionPerformed(ActionEvent e)
1069 GSequenceLink link = new GSequenceLink();
1070 boolean valid = false;
1073 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1074 MessageManager.getString("label.new_sequence_url_link"),
1075 JvOptionPane.OK_CANCEL_OPTION, -1,
1076 null) == JvOptionPane.OK_OPTION)
1078 if (link.checkValid())
1080 if (((UrlLinkTableModel) linkUrlTable.getModel())
1081 .isUniqueName(link.getName()))
1083 ((UrlLinkTableModel) linkUrlTable.getModel())
1084 .insertRow(link.getName(), link.getURL());
1089 link.notifyDuplicate();
1102 public void editLink_actionPerformed(ActionEvent e)
1104 GSequenceLink link = new GSequenceLink();
1106 int index = linkUrlTable.getSelectedRow();
1109 // button no longer enabled if row is not selected
1110 Cache.log.debug("Edit with no row selected in linkUrlTable");
1114 int nameCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1116 int urlCol = ((UrlLinkTableModel) linkUrlTable.getModel())
1118 String oldName = linkUrlTable.getValueAt(index, nameCol).toString();
1119 link.setName(oldName);
1120 link.setURL(linkUrlTable.getValueAt(index, urlCol).toString());
1122 boolean valid = false;
1125 if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
1126 MessageManager.getString("label.edit_sequence_url_link"),
1127 JvOptionPane.OK_CANCEL_OPTION, -1,
1128 null) == JvOptionPane.OK_OPTION)
1130 if (link.checkValid())
1132 if ((oldName.equals(link.getName()))
1133 || (((UrlLinkTableModel) linkUrlTable.getModel())
1134 .isUniqueName(link.getName())))
1136 linkUrlTable.setValueAt(link.getName(), index, nameCol);
1137 linkUrlTable.setValueAt(link.getURL(), index, urlCol);
1142 link.notifyDuplicate();
1155 public void deleteLink_actionPerformed(ActionEvent e)
1157 int index = linkUrlTable.getSelectedRow();
1158 int modelIndex = -1;
1161 // button no longer enabled if row is not selected
1162 Cache.log.debug("Delete with no row selected in linkUrlTable");
1167 modelIndex = linkUrlTable.convertRowIndexToModel(index);
1170 // make sure we use the model index to delete, and not the table index
1171 ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
1175 public void defaultBrowser_mouseClicked(MouseEvent e)
1177 // TODO: JAL-3048 not needed for j2s
1178 if (!Platform.isJS()) // BH 2019
1185 JFileChooser chooser = new JFileChooser(".");
1186 chooser.setDialogTitle(
1187 MessageManager.getString("label.select_default_browser"));
1189 int value = chooser.showOpenDialog(this);
1191 if (value == JFileChooser.APPROVE_OPTION)
1193 defaultBrowser.setText(chooser.getSelectedFile().getAbsolutePath());
1202 * jalview.jbgui.GPreferences#showunconserved_actionPerformed(java.awt.event
1206 protected void showunconserved_actionPerformed(ActionEvent e)
1208 // TODO Auto-generated method stub
1209 super.showunconserved_actionPerformed(e);
1212 public static List<String> getGroupURLLinks()
1214 return groupURLLinks;
1218 public void minColour_actionPerformed(JPanel panel)
1220 JalviewColourChooser.showColourChooser(this,
1221 MessageManager.getString("label.select_colour_minimum_value"),
1226 public void maxColour_actionPerformed(JPanel panel)
1228 JalviewColourChooser.showColourChooser(this,
1229 MessageManager.getString("label.select_colour_maximum_value"),
1234 public void gapColour_actionPerformed(JPanel gap)
1236 if (!useLegacyGap.isSelected())
1238 JalviewColourChooser.showColourChooser(this,
1239 MessageManager.getString("label.select_gap_colour"),
1245 public void hiddenColour_actionPerformed(JPanel hidden)
1247 JalviewColourChooser.showColourChooser(this,
1248 MessageManager.getString("label.select_hidden_colour"),
1253 protected void useLegacyGaps_actionPerformed(ActionEvent e)
1255 boolean enabled = useLegacyGap.isSelected();
1258 gapColour.setBackground(
1259 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_LEGACY_GAP);
1263 gapColour.setBackground(
1264 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_GAP);
1266 gapColour.setEnabled(!enabled);
1267 gapLabel.setEnabled(!enabled);
1271 protected void resetOvDefaults_actionPerformed(ActionEvent e)
1273 useLegacyGap.setSelected(false);
1274 useLegacyGaps_actionPerformed(null);
1275 showHiddenAtStart.setSelected(false);
1276 hiddenColour.setBackground(
1277 jalview.renderer.OverviewResColourFinder.OVERVIEW_DEFAULT_HIDDEN);
1281 protected void userIdWidth_actionPerformed()
1285 String val = userIdWidth.getText().trim();
1286 if (val.length() > 0)
1288 Integer iw = Integer.parseInt(val);
1289 if (iw.intValue() < 12)
1291 throw new NumberFormatException();
1293 userIdWidth.setText(iw.toString());
1295 } catch (NumberFormatException x)
1297 userIdWidth.setText("");
1298 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1300 .getString("warn.user_defined_width_requirements"),
1301 MessageManager.getString("label.invalid_id_column_width"),
1302 JvOptionPane.WARNING_MESSAGE);
1307 protected void autoIdWidth_actionPerformed()
1309 userIdWidth.setEnabled(!autoIdWidth.isSelected());
1310 userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
1314 * Returns true if chimera path is to a valid executable, else show an error
1317 private boolean validateChimeraPath()
1319 if (chimeraPath.getText().trim().length() > 0)
1321 File f = new File(chimeraPath.getText());
1322 if (!f.canExecute())
1324 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
1325 MessageManager.getString("label.invalid_chimera_path"),
1326 MessageManager.getString("label.invalid_name"),
1327 JvOptionPane.ERROR_MESSAGE);
1335 * If Chimera is selected, check it can be found on default or user-specified
1336 * path, if not show a warning/help dialog.
1339 protected void structureViewer_actionPerformed(String selectedItem)
1341 if (!selectedItem.equals(ViewerType.CHIMERA.name()))
1345 boolean found = false;
1348 * Try user-specified and standard paths for Chimera executable.
1350 List<String> paths = StructureManager.getChimeraPaths();
1351 paths.add(0, chimeraPath.getText());
1352 for (String path : paths)
1354 if (new File(path.trim()).canExecute())
1362 String[] options = { "OK", "Help" };
1363 int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
1364 JvSwingUtils.wrapTooltip(true,
1365 MessageManager.getString("label.chimera_missing")),
1366 "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
1367 null, options, options[0]);
1368 if (showHelp == JvOptionPane.NO_OPTION)
1372 Help.showHelpWindow(HelpId.StructureViewer);
1373 } catch (HelpSetException e)
1375 e.printStackTrace();
1381 public class OptionsParam
1383 private String name;
1385 private String code;
1387 public OptionsParam(String name, String code)
1393 public String getName()
1398 public void setName(String name)
1403 public String getCode()
1408 public void setCode(String code)
1414 public String toString()
1420 public boolean equals(Object that)
1422 if (!(that instanceof OptionsParam))
1426 return this.code.equalsIgnoreCase(((OptionsParam) that).code);
1430 public int hashCode()
1432 return name.hashCode() + code.hashCode();
1436 private class UrlListSelectionHandler implements ListSelectionListener
1440 public void valueChanged(ListSelectionEvent e)
1442 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
1444 int index = lsm.getMinSelectionIndex();
1447 // no selection, so disable delete/edit buttons
1448 editLink.setEnabled(false);
1449 deleteLink.setEnabled(false);
1452 int modelIndex = linkUrlTable.convertRowIndexToModel(index);
1454 // enable/disable edit and delete link buttons
1455 if (((UrlLinkTableModel) linkUrlTable.getModel())
1456 .isRowDeletable(modelIndex))
1458 deleteLink.setEnabled(true);
1462 deleteLink.setEnabled(false);
1465 if (((UrlLinkTableModel) linkUrlTable.getModel())
1466 .isRowEditable(modelIndex))
1468 editLink.setEnabled(true);
1472 editLink.setEnabled(false);