X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGPreferences.java;h=c1afbf76dd9d7a333a0c3243b5083bb3e7d754e4;hb=b5667f39acdf309cd92881b73edfda591e0acaf4;hp=7ee27d6d5d9b7f3ff563368ce28bbf57a3db023c;hpb=3069ade337eb42af30baf34a69f0a7f4cefe3948;p=jalview.git diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index 7ee27d6..c1afbf7 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -20,14 +20,21 @@ */ package jalview.jbgui; +import jalview.bin.Cache; import jalview.fts.core.FTSDataColumnPreferences; import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource; import jalview.fts.service.pdb.PDBFTSRestClient; +import jalview.gui.Desktop; import jalview.gui.JalviewBooleanRadioButtons; +import jalview.gui.JvOptionPane; import jalview.gui.JvSwingUtils; import jalview.gui.StructureViewer.ViewerType; -import jalview.io.BackupFilenameFilter; +import jalview.io.BackupFilenameParts; +import jalview.io.BackupFiles; +import jalview.io.BackupFilesPresetEntry; +import jalview.io.IntKeyStringValueEntry; import jalview.util.MessageManager; +import jalview.util.Platform; import java.awt.BorderLayout; import java.awt.Color; @@ -42,19 +49,23 @@ import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.Arrays; +import java.util.List; +import javax.swing.AbstractButton; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; +import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; +import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; @@ -78,6 +89,8 @@ import javax.swing.event.ChangeListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; +import net.miginfocom.swing.MigLayout; + /** * Base class for the Preferences panel. * @@ -91,6 +104,9 @@ public class GPreferences extends JPanel private static final Font LABEL_FONT_ITALIC = JvSwingUtils .getLabelFont(false, true); + private static final Font LABEL_FONT_BOLD = JvSwingUtils + .getLabelFont(true, false); + /* * Visual tab components */ @@ -149,10 +165,15 @@ public class GPreferences extends JPanel protected JCheckBox showConsensLogo = new JCheckBox(); + protected JCheckBox showInformationHistogram = new JCheckBox(); + + protected JCheckBox showHMMLogo = new JCheckBox(); + protected JCheckBox showDbRefTooltip = new JCheckBox(); protected JCheckBox showNpTooltip = new JCheckBox(); + /* * Structure tab and components */ @@ -271,6 +292,22 @@ public class GPreferences extends JPanel protected JCheckBox sortByTree = new JCheckBox(); + /* + * hmmer tab and components + */ + protected JPanel hmmerTab; + + protected JCheckBox hmmrTrimTermini; + + protected AbstractButton hmmerBackgroundUniprot; + + protected AbstractButton hmmerBackgroundAlignment; + + protected JTextField hmmerSequenceCount; + + protected JTextField hmmerPath; + + protected JTextField cygwinPath; /* * Web Services tab @@ -285,6 +322,18 @@ public class GPreferences extends JPanel protected JCheckBox enableBackupFiles = new JCheckBox(); + protected JPanel presetsPanel = new JPanel(); + + protected JLabel presetsComboLabel = new JLabel(); + + protected JCheckBox customiseCheckbox = new JCheckBox(); + + protected JButton revertButton = new JButton(); + + protected JComboBox backupfilesPresetsCombo = new JComboBox<>(); + + private int backupfilesPresetsComboLastSelected = 0; + protected JPanel suffixPanel = new JPanel(); protected JPanel keepfilesPanel = new JPanel(); @@ -303,14 +352,12 @@ public class GPreferences extends JPanel protected JalviewBooleanRadioButtons backupfilesKeepAll = new JalviewBooleanRadioButtons(); - protected JSpinner backupfilesRollMaxSpinner = new JSpinner(); + public JSpinner backupfilesRollMaxSpinner = new JSpinner(); protected JLabel oldBackupFilesLabel = new JLabel(); protected JalviewBooleanRadioButtons backupfilesConfirmDelete = new JalviewBooleanRadioButtons(); - protected JLabel exampleLabel = new JLabel(); - protected JTextArea backupfilesExampleLabel = new JTextArea(); /** @@ -367,6 +414,8 @@ public class GPreferences extends JPanel tabbedPane.add(initEditingTab(), MessageManager.getString("label.editing")); + tabbedPane.add(initHMMERTab(), MessageManager.getString("label.hmmer")); + /* * See WsPreferences for the real work of configuring this tab. */ @@ -375,7 +424,7 @@ public class GPreferences extends JPanel /* * Handler to validate a tab before leaving it - currently only for - * Structure. + * Structure */ tabbedPane.addChangeListener(new ChangeListener() { @@ -429,6 +478,134 @@ public class GPreferences extends JPanel } /** + * Initialises the hmmer tabbed panel + * + * @return + */ + private JPanel initHMMERTab() + { + hmmerTab = new JPanel(); + hmmerTab.setLayout(new BoxLayout(hmmerTab, BoxLayout.Y_AXIS)); + hmmerTab.setLayout(new MigLayout("flowy")); + + /* + * path to hmmer binaries folder + */ + JPanel installationPanel = new JPanel(new MigLayout("flowy")); + // new FlowLayout(FlowLayout.LEFT)); + JvSwingUtils.createTitledBorder(installationPanel, + MessageManager.getString("label.installation"), true); + hmmerTab.add(installationPanel); + JLabel hmmerLocation = new JLabel( + MessageManager.getString("label.hmmer_location")); + hmmerLocation.setFont(LABEL_FONT); + final int pathFieldLength = 40; + hmmerPath = new JTextField(pathFieldLength); + hmmerPath.addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + if (e.getClickCount() == 2) + { + String chosen = openFileChooser(true); + if (chosen != null) + { + hmmerPath.setText(chosen); + validateHmmerPath(); + } + } + } + }); + installationPanel.add(hmmerLocation); + installationPanel.add(hmmerPath); + + /* + * path to Cygwin binaries folder (for Windows) + */ + if (Platform.isWindows()) + { + JLabel cygwinLocation = new JLabel( + MessageManager.getString("label.cygwin_location")); + cygwinLocation.setFont(LABEL_FONT); + cygwinPath = new JTextField(pathFieldLength); + cygwinPath.addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + if (e.getClickCount() == 2) + { + String chosen = openFileChooser(true); + if (chosen != null) + { + cygwinPath.setText(chosen); + validateCygwinPath(); + } + } + } + }); + installationPanel.add(cygwinLocation); + installationPanel.add(cygwinPath); + } + + /* + * preferences for hmmalign + */ + JPanel alignOptionsPanel = new JPanel(new MigLayout()); + // new FlowLayout(FlowLayout.LEFT)); + JvSwingUtils.createTitledBorder(alignOptionsPanel, + MessageManager.getString("label.hmmalign_options"), true); + hmmerTab.add(alignOptionsPanel); + hmmrTrimTermini = new JCheckBox(); + hmmrTrimTermini.setFont(LABEL_FONT); + hmmrTrimTermini.setText(MessageManager.getString("label.trim_termini")); + alignOptionsPanel.add(hmmrTrimTermini); + + /* + * preferences for hmmsearch + */ + JPanel searchOptions = new JPanel(new MigLayout()); + // FlowLayout(FlowLayout.LEFT)); + JvSwingUtils.createTitledBorder(searchOptions, + MessageManager.getString("label.hmmsearch_options"), true); + hmmerTab.add(searchOptions); + JLabel sequencesToKeep = new JLabel( + MessageManager.getString("label.no_of_sequences")); + sequencesToKeep.setFont(LABEL_FONT); + searchOptions.add(sequencesToKeep); + hmmerSequenceCount = new JTextField(5); + searchOptions.add(hmmerSequenceCount); + + /* + * preferences for Information Content annotation + */ + // JPanel dummy = new JPanel(new FlowLayout(FlowLayout.LEFT)); + JPanel annotationOptions = new JPanel(new MigLayout("left")); + JvSwingUtils.createTitledBorder(annotationOptions, + MessageManager.getString("label.information_annotation"), true); + // dummy.add(annotationOptions); + hmmerTab.add(annotationOptions); + ButtonGroup backgroundOptions = new ButtonGroup(); + hmmerBackgroundUniprot = new JRadioButton( + MessageManager.getString("label.freq_uniprot")); + hmmerBackgroundUniprot.setFont(LABEL_FONT); + hmmerBackgroundAlignment = new JRadioButton( + MessageManager.getString("label.freq_alignment")); + hmmerBackgroundAlignment.setFont(LABEL_FONT); + backgroundOptions.add(hmmerBackgroundUniprot); + backgroundOptions.add(hmmerBackgroundAlignment); + backgroundOptions.setSelected(hmmerBackgroundUniprot.getModel(), true); + // disable buttons for now as annotation only uses Uniprot background + hmmerBackgroundAlignment.setEnabled(false); + hmmerBackgroundUniprot.setEnabled(false); + annotationOptions.add(hmmerBackgroundUniprot, "wrap"); + annotationOptions.add(hmmerBackgroundAlignment); + + return hmmerTab; + } + + /** * Initialises the Output tabbed panel. * * @return @@ -523,12 +700,6 @@ public class GPreferences extends JPanel embbedBioJSON.setText(MessageManager.getString("label.embbed_biojson")); embbedBioJSON.setBounds(new Rectangle(228, 200, 250, 23)); - - TitledBorder backupFilesBorder = new TitledBorder( - MessageManager - .getString("label.backup_files")); - - jPanel11.add(jLabel1); jPanel11.add(blcjv); jPanel11.add(clustaljv); @@ -636,6 +807,7 @@ public class GPreferences extends JPanel linkTab.setLayout(new GridBagLayout()); // Set up table for Url links + linkUrlTable.getTableHeader().setReorderingAllowed(false); linkUrlTable.setFillsViewportHeight(true); linkUrlTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); linkUrlTable.setAutoCreateRowSorter(true); @@ -989,7 +1161,7 @@ public class GPreferences extends JPanel protColourLabel.setHorizontalAlignment(SwingConstants.LEFT); protColourLabel.setText( MessageManager.getString("label.prot_alignment_colour") + " "); - JvSwingUtils.addtoLayout(coloursTab, + GPreferences.addtoLayout(coloursTab, MessageManager .getString("label.default_colour_scheme_for_alignment"), protColourLabel, protColour); @@ -1001,7 +1173,7 @@ public class GPreferences extends JPanel nucColourLabel.setHorizontalAlignment(SwingConstants.LEFT); nucColourLabel.setText( MessageManager.getString("label.nuc_alignment_colour") + " "); - JvSwingUtils.addtoLayout(coloursTab, + GPreferences.addtoLayout(coloursTab, MessageManager .getString("label.default_colour_scheme_for_alignment"), nucColourLabel, nucColour); @@ -1010,11 +1182,11 @@ public class GPreferences extends JPanel annotationShding.setBorder(new TitledBorder( MessageManager.getString("label.annotation_shading_default"))); annotationShding.setLayout(new GridLayout(1, 2)); - JvSwingUtils.addtoLayout(annotationShding, + GPreferences.addtoLayout(annotationShding, MessageManager.getString( "label.default_minimum_colour_annotation_shading"), mincolourLabel, minColour); - JvSwingUtils.addtoLayout(annotationShding, + GPreferences.addtoLayout(annotationShding, MessageManager.getString( "label.default_maximum_colour_annotation_shading"), maxcolourLabel, maxColour); @@ -1060,14 +1232,13 @@ public class GPreferences extends JPanel hiddenColour_actionPerformed(hiddenColour); } }); - + useLegacyGap = new JCheckBox( MessageManager.getString("label.ov_legacy_gap")); useLegacyGap.setFont(LABEL_FONT); useLegacyGap.setHorizontalAlignment(SwingConstants.LEFT); useLegacyGap.setVerticalTextPosition(SwingConstants.TOP); - gapLabel = new JLabel( - MessageManager.getString("label.gap_colour")); + gapLabel = new JLabel(MessageManager.getString("label.gap_colour")); gapLabel.setFont(LABEL_FONT); gapLabel.setHorizontalAlignment(SwingConstants.LEFT); gapLabel.setVerticalTextPosition(SwingConstants.TOP); @@ -1266,7 +1437,7 @@ public class GPreferences extends JPanel { if (e.getClickCount() == 2) { - String chosen = openFileChooser(); + String chosen = openFileChooser(false); if (chosen != null) { chimeraPath.setText(chosen); @@ -1321,10 +1492,14 @@ public class GPreferences extends JPanel * * @return */ - protected String openFileChooser() + protected String openFileChooser(boolean forFolder) { String choice = null; JFileChooser chooser = new JFileChooser(); + if (forFolder) + { + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } // chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( @@ -1340,21 +1515,6 @@ public class GPreferences extends JPanel return choice; } - /** - * Validate the structure tab preferences; if invalid, set focus on this tab. - * - * @param e - */ - protected boolean validateStructure(FocusEvent e) - { - if (!validateStructure()) - { - e.getComponent().requestFocusInWindow(); - return false; - } - return true; - } - protected boolean validateStructure() { return false; @@ -1683,6 +1843,56 @@ public class GPreferences extends JPanel } /** + * Load the saved Backups options EXCEPT "Enabled" and "Scheme" + */ + + protected void loadLastSavedBackupsOptions() + { + BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry + .getSavedBackupEntry(); + enableBackupFiles + .setSelected(Cache.getDefault(BackupFiles.ENABLED, true)); + + BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry + .createBackupFilesPresetEntry(Cache + .getDefault(BackupFilesPresetEntry.CUSTOMCONFIG, null)); + if (backupfilesCustomEntry == null) + { + backupfilesCustomEntry = BackupFilesPresetEntry.backupfilesPresetEntriesValues + .get(BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT); + } + BackupFilesPresetEntry.backupfilesPresetEntriesValues.put( + BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, + backupfilesCustomEntry); + + setComboIntStringKey(backupfilesPresetsCombo, + Cache.getDefault(BackupFiles.NS + "_PRESET", + BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT)); + + backupsSetOptions(savedPreset); + + backupsOptionsSetEnabled(); + updateBackupFilesExampleLabel(); + } + + private boolean warnAboutSuffixReverseChange() + { + BackupFilesPresetEntry bfpe = BackupFilesPresetEntry + .getSavedBackupEntry(); + boolean savedSuffixReverse = bfpe.reverse; + int savedSuffixDigits = bfpe.digits; + String savedSuffixTemplate = bfpe.suffix; + + boolean nowSuffixReverse = suffixReverse.isSelected(); + int nowSuffixDigits = getSpinnerInt(suffixDigitsSpinner, 3); + String nowSuffixTemplate = suffixTemplate.getText(); + return nowSuffixReverse != savedSuffixReverse + && nowSuffixDigits == savedSuffixDigits + && nowSuffixTemplate != null + && nowSuffixTemplate.equals(savedSuffixTemplate); + } + + /** * Initialises the Backups tabbed panel. * * @return @@ -1690,90 +1900,318 @@ public class GPreferences extends JPanel private JPanel initBackupsTab() { JPanel backupsTab = new JPanel(); - // backupsTab.setBorder(new TitledBorder(MessageManager - // .getString("label.backup_files"))); + backupsTab.setBorder(new TitledBorder( + MessageManager.getString("label.backup_files"))); backupsTab.setLayout(new GridBagLayout()); - enableBackupFiles.setFont(LABEL_FONT); - enableBackupFiles.setText( - MessageManager.getString("label.enable_backupfiles")); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 0.0; + gbc.weighty = 0.0; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + gbc.fill = GridBagConstraints.NONE; + + initBackupsTabPresetsPanel(); + initBackupsTabSuffixPanel(); + initBackupsTabKeepFilesPanel(); + initBackupsTabFilenameExamplesPanel(); + + enableBackupFiles.setFont(LABEL_FONT_BOLD); + enableBackupFiles + .setText(MessageManager.getString("label.enable_backupfiles")); enableBackupFiles.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - boolean selected = enableBackupFiles.isSelected(); // enable other options only when the first is checked - backupsOptionsSetEnabled(selected); + backupsOptionsSetEnabled(); } }); - GridBagConstraints gbc = new GridBagConstraints(); + + // enable checkbox 1 col + gbc.gridwidth = 1; + gbc.gridheight = 1; + gbc.gridx = 0; + gbc.gridy = 0; // row 0 + backupsTab.add(enableBackupFiles, gbc); + + // summary of scheme box (over two rows) + gbc.gridx = 1; + gbc.weightx = 0.0; + gbc.gridheight = 2; + gbc.anchor = GridBagConstraints.FIRST_LINE_END; + gbc.fill = GridBagConstraints.BOTH; + backupsTab.add(exampleFilesPanel, gbc); + gbc.gridheight = 1; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + gbc.fill = GridBagConstraints.NONE; + + // fill empty space on right + gbc.gridx++; gbc.weightx = 1.0; + backupsTab.add(new JPanel(), gbc); + + // schemes box + gbc.weightx = 0.0; + gbc.gridx = 0; + gbc.gridy++; // row 1 + backupsTab.add(presetsPanel, gbc); + + // now using whole row + gbc.gridwidth = 2; + gbc.gridheight = 1; + // keep files box + gbc.gridx = 0; + gbc.gridy++; // row 2 + backupsTab.add(keepfilesPanel, gbc); + + // filename strategy box + gbc.gridy++; // row 3 + backupsTab.add(suffixPanel, gbc); + + // fill empty space + gbc.gridy++; // row 4 + gbc.weighty = 1.0; + backupsTab.add(new JPanel(), gbc); + + backupsOptionsSetEnabled(); + return backupsTab; + } + + private JPanel initBackupsTabPresetsPanel() + { + + String title = MessageManager.getString("label.schemes"); + + presetsPanel.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 0.0; gbc.weighty = 0.0; - gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.anchor = GridBagConstraints.BASELINE_LEADING; gbc.fill = GridBagConstraints.NONE; - - // enable checkbox 1 row gbc.gridwidth = 1; + gbc.gridheight = 1; + + // "Scheme: " + gbc.gridx = 0; gbc.gridy = 0; - backupsTab.add(enableBackupFiles, gbc); - initBackupsTabSuffixPanel(); - initBackupsTabKeepFilesPanel(); - initBackupsTabFilenameExamplesPanel(); + presetsComboLabel = new JLabel(title + ":"); + presetsPanel.add(presetsComboLabel, gbc); + List entries = Arrays + .asList((Object[]) BackupFilesPresetEntry.backupfilesPresetEntries); + List tooltips = Arrays.asList( + BackupFilesPresetEntry.backupfilesPresetEntryDescriptions); + backupfilesPresetsCombo = JvSwingUtils.buildComboWithTooltips(entries, + tooltips); /* - // set widths of the panels to the max one - int maxw = suffixPanel.getWidth(); - if (maxw < keepfilesPanel.getWidth()) - { - maxw = keepfilesPanel.getWidth(); - } - if (maxw < exampleFilesPanel.getWidth()) + for (int i = 0; i < BackupFilesPresetEntry.backupfilesPresetEntries.length; i++) { - maxw = exampleFilesPanel.getWidth(); + backupfilesPresetsCombo + .addItem(BackupFilesPresetEntry.backupfilesPresetEntries[i]); } - suffixPanel.setSize(suffixPanel.getHeight(), maxw); - keepfilesPanel.setSize(keepfilesPanel.getHeight(), maxw); - exampleFilesPanel.setSize(exampleFilesPanel.getHeight(), maxw); */ - // whole suffix panel next row - gbc.gridy = 1; - backupsTab.add(suffixPanel, gbc); + backupfilesPresetsCombo.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + int key = getComboIntStringKey(backupfilesPresetsCombo); + if (!customiseCheckbox.isSelected()) + { + backupfilesPresetsComboLastSelected = key; + } + if (key == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM) + { + if (customiseCheckbox.isSelected()) + { + // got here by clicking on customiseCheckbox so don't change the values + backupfilesCustomOptionsSetEnabled(); + } + else + { + backupsTabUpdatePresets(); + backupfilesCustomOptionsSetEnabled(); + } + } + else + { + customiseCheckbox.setSelected(false); + backupsTabUpdatePresets(); + backupfilesCustomOptionsSetEnabled(); + } + } + }); - // keep files panel - gbc.gridy = 2; - backupsTab.add(keepfilesPanel, gbc); + // dropdown list of preset schemes + gbc.gridx = 1; + presetsPanel.add(backupfilesPresetsCombo, gbc); - // whole examples panel next row - gbc.gridy = 3; - backupsTab.add(exampleFilesPanel, gbc); + revertButton.setText(MessageManager.getString("label.cancel_changes")); + revertButton.setToolTipText( + MessageManager.getString("label.cancel_changes_description")); + revertButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + backupsSetOptions( + BackupFilesPresetEntry.backupfilesPresetEntriesValues.get( + BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)); + backupfilesCustomOptionsSetEnabled(); + } - // fill empty space - gbc.gridy = 4; + }); + revertButton.setFont(LABEL_FONT); + + customiseCheckbox.setFont(LABEL_FONT); + customiseCheckbox.setText(MessageManager.getString("label.customise")); + customiseCheckbox.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + int currently = getComboIntStringKey(backupfilesPresetsCombo); + if (customiseCheckbox.isSelected()) + { + backupfilesPresetsComboLastSelected = currently; + setComboIntStringKey(backupfilesPresetsCombo, + BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM); + } + else + { + setComboIntStringKey(backupfilesPresetsCombo, + backupfilesPresetsComboLastSelected); + + } + backupfilesCustomOptionsSetEnabled(); + } + }); + customiseCheckbox.setToolTipText( + MessageManager.getString("label.customise_description")); + + // customise checkbox + gbc.gridx = 0; + gbc.gridy++; + presetsPanel.add(customiseCheckbox, gbc); + + // "Cancel changes" button (aligned with combo box above) + gbc.gridx = 1; + presetsPanel.add(revertButton, gbc); + + return presetsPanel; + } + + private JPanel initBackupsTabFilenameExamplesPanel() + { + String title = MessageManager + .getString("label.scheme_examples"); + TitledBorder tb = new TitledBorder(title); + exampleFilesPanel.setBorder(tb); + exampleFilesPanel.setLayout(new GridBagLayout()); + + + backupfilesExampleLabel.setEditable(false); + backupfilesExampleLabel + .setBackground(exampleFilesPanel.getBackground()); + + updateBackupFilesExampleLabel(); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 1.0; gbc.weighty = 1.0; - backupsTab.add(new JPanel(), gbc); + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; - backupsOptionsSetEnabled(enableBackupFiles.isSelected()); - return backupsTab; + exampleFilesPanel.add(backupfilesExampleLabel, gbc); + return exampleFilesPanel; + } + + private void backupsTabUpdatePresets() + { + IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo + .getSelectedItem(); + int key = entry.k; + String value = entry.v; + + if (BackupFilesPresetEntry.backupfilesPresetEntriesValues + .containsKey(key)) + { + backupsSetOptions( + BackupFilesPresetEntry.backupfilesPresetEntriesValues + .get(key)); + } + else + { + Cache.log.error( + "Preset '" + value + "' [key:" + key + "] not implemented"); + } + + // Custom options will now be enabled when the customiseCheckbox is checked + // (performed above) + // backupfilesCustomOptionsSetEnabled(); + updateBackupFilesExampleLabel(); } + protected int getComboIntStringKey( + JComboBox backupfilesPresetsCombo2) + { + IntKeyStringValueEntry e; + try + { + e = (IntKeyStringValueEntry) backupfilesPresetsCombo2 + .getSelectedItem(); + } catch (Exception ex) + { + Cache.log.error( + "Problem casting Combo entry to IntKeyStringValueEntry."); + e = null; + } + return e != null ? e.k : 0; + } + + protected void setComboIntStringKey( + JComboBox backupfilesPresetsCombo2, + int key) + { + for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++) + { + IntKeyStringValueEntry e; + try + { + e = (IntKeyStringValueEntry) backupfilesPresetsCombo2.getItemAt(i); + } catch (Exception ex) + { + Cache.log.error( + "Problem casting Combo entry to IntKeyStringValueEntry. Skipping item. "); + continue; + } + if (e.k == key) + { + backupfilesPresetsCombo2.setSelectedIndex(i); + break; + } + } + // backupsTabUpdatePresets(); + } - public JPanel initBackupsTabSuffixPanel() + private JPanel initBackupsTabSuffixPanel() { suffixPanel.setBorder(new TitledBorder( - MessageManager.getString("label.suffix_format"))); + MessageManager.getString("label.backup_filename_strategy"))); suffixPanel.setLayout(new GridBagLayout()); suffixTemplateLabel - .setText(MessageManager.getString("label.suffix_template")); + .setText(MessageManager.getString("label.append_to_filename")); suffixTemplateLabel.setHorizontalAlignment(SwingConstants.LEFT); suffixTemplateLabel.setFont(LABEL_FONT); - final String tooltip = JvSwingUtils.wrapTooltip(true, MessageManager - .getString("label.suffix_template_tooltip")); + final String tooltip = JvSwingUtils.wrapTooltip(true, + MessageManager.getString("label.append_to_filename_tooltip")); suffixTemplate.setToolTipText(tooltip); suffixTemplate.addActionListener(new ActionListener() { @@ -1781,15 +2219,19 @@ public class GPreferences extends JPanel public void actionPerformed(ActionEvent e) { updateBackupFilesExampleLabel(); + backupfilesCustomOptionsSetEnabled(); + backupfilesRevertButtonSetEnabled(true); } }); - KeyListener kl = new KeyListener() + suffixTemplate.addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent e) { updateBackupFilesExampleLabel(); + backupfilesCustomOptionsSetEnabled(); + backupfilesRevertButtonSetEnabled(true); } @Override @@ -1797,48 +2239,62 @@ public class GPreferences extends JPanel { } - // disable use of ':' + // disable use of ':' or '/' or '\' @Override public void keyTyped(KeyEvent e) { char c = e.getKeyChar(); - if (c == ':') + if (c == ':' || c == '/' || c == '\\') { - // don't process ':' + // don't process ':' or '/' or '\' e.consume(); } } - }; - suffixTemplate.addKeyListener(kl); + }); // digits spinner suffixDigitsLabel .setText(MessageManager.getString("label.index_digits")); suffixDigitsLabel.setHorizontalAlignment(SwingConstants.LEFT); suffixDigitsLabel.setFont(LABEL_FONT); - int defaultmin = 1; - int defaultmax = 6; ChangeListener c = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { + backupfilesRevertButtonSetEnabled(true); updateBackupFilesExampleLabel(); } }; - setIntegerSpinner(suffixDigitsSpinner, defaultmin, defaultmax, 3, c); + setIntegerSpinner(suffixDigitsSpinner, BackupFilesPresetEntry.DIGITSMIN, + BackupFilesPresetEntry.DIGITSMAX, 3, c); - suffixReverse.setLabels( - MessageManager.getString("label.reverse_roll"), + suffixReverse.setLabels(MessageManager.getString("label.reverse_roll"), MessageManager.getString("label.increment_index")); suffixReverse.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - updateBackupFilesExampleLabel(); + boolean okay = true; + if (warnAboutSuffixReverseChange()) + { + // Warning popup + okay = confirmSuffixReverseChange(); + } + if (okay) + { + backupfilesRevertButtonSetEnabled(true); + updateBackupFilesExampleLabel(); + } + else + { + boolean savedSuffixReverse = BackupFilesPresetEntry + .getSavedBackupEntry().reverse; + suffixReverse.setSelected(savedSuffixReverse); + } } }); @@ -1853,15 +2309,15 @@ public class GPreferences extends JPanel sgbc.weightx = 1.0; sgbc.weighty = 0.0; sgbc.fill = GridBagConstraints.NONE; - suffixPanel.add(suffixTemplateLabel,sgbc); - + suffixPanel.add(suffixTemplateLabel, sgbc); + sgbc.gridx = 1; sgbc.fill = GridBagConstraints.HORIZONTAL; suffixPanel.add(suffixTemplate, sgbc); - + // second row (number of digits spinner) sgbc.gridy = 1; - + sgbc.gridx = 0; sgbc.fill = GridBagConstraints.NONE; suffixPanel.add(suffixDigitsLabel, sgbc); @@ -1883,6 +2339,20 @@ public class GPreferences extends JPanel return suffixPanel; } + private boolean confirmSuffixReverseChange() + { + boolean ret = false; + String warningMessage = MessageManager + .getString("label.warning_confirm_change_reverse"); + int confirm = JvOptionPane.showConfirmDialog(Desktop.desktop, + warningMessage, + MessageManager.getString("label.change_increment_decrement"), + JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE); + + ret = (confirm == JvOptionPane.YES_OPTION); + return ret; + } + private JPanel initBackupsTabKeepFilesPanel() { keepfilesPanel.setBorder( @@ -1898,6 +2368,7 @@ public class GPreferences extends JPanel @Override public void actionPerformed(ActionEvent e) { + backupfilesRevertButtonSetEnabled(true); updateBackupFilesExampleLabel(); } }); @@ -1906,8 +2377,8 @@ public class GPreferences extends JPanel @Override public void actionPerformed(ActionEvent e) { - boolean selected = backupfilesKeepAll.isSelected(); - keepRollMaxOptionsEnabled(!selected); + backupfilesRevertButtonSetEnabled(true); + keepRollMaxOptionsEnabled(); updateBackupFilesExampleLabel(); } }); @@ -1917,17 +2388,28 @@ public class GPreferences extends JPanel @Override public void stateChanged(ChangeEvent e) { + backupfilesRevertButtonSetEnabled(true); updateBackupFilesExampleLabel(); } }; - setIntegerSpinner(backupfilesRollMaxSpinner, 1, 999, 4, true, c); + setIntegerSpinner(backupfilesRollMaxSpinner, + BackupFilesPresetEntry.ROLLMAXMIN, + BackupFilesPresetEntry.ROLLMAXMAX, 4, true, c); backupfilesConfirmDelete.setLabels( - MessageManager.getString("label.confirm_delete"), + MessageManager.getString("label.always_ask"), MessageManager.getString("label.auto_delete")); + backupfilesConfirmDelete.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + backupfilesRevertButtonSetEnabled(true); + } + }); // update the enabled section - keepRollMaxOptionsEnabled(!backupfilesKeepAll.isSelected()); + keepRollMaxOptionsEnabled(); GridBagConstraints kgbc = new GridBagConstraints(); @@ -1961,98 +2443,62 @@ public class GPreferences extends JPanel kgbc.gridwidth = GridBagConstraints.REMAINDER; kgbc.fill = GridBagConstraints.HORIZONTAL; kgbc.weightx = 1.0; - /* - keepfilesPanel.add(backupfilesConfirmDelete.getTrueButton(), kgbc); - - // fourth row (indented) - kgbc.gridy = 3; - keepfilesPanel.add(backupfilesConfirmDelete.getFalseButton(), kgbc); - */ JPanel jp = new JPanel(); jp.setLayout(new FlowLayout()); oldBackupFilesLabel - .setText(MessageManager.getString("label.old_backup_files")); + .setText(MessageManager + .getString("label.autodelete_old_backup_files")); oldBackupFilesLabel.setFont(LABEL_FONT); oldBackupFilesLabel.setHorizontalAlignment(SwingConstants.LEFT); jp.add(oldBackupFilesLabel); jp.add(backupfilesConfirmDelete.getTrueButton()); jp.add(backupfilesConfirmDelete.getFalseButton()); keepfilesPanel.add(jp, kgbc); - - return keepfilesPanel; - } - - private JPanel initBackupsTabFilenameExamplesPanel() - { - exampleFilesPanel.setBorder(new TitledBorder( - MessageManager.getString("label.example_filenames"))); - exampleFilesPanel.setLayout(new GridBagLayout()); - - /* - exampleLabel.setText( - MessageManager.getString("label.suffix_example_filenames")); - exampleLabel.setFont(LABEL_FONT); - exampleLabel.setHorizontalAlignment(SwingConstants.LEFT); - */ - - backupfilesExampleLabel.setEditable(false); - backupfilesExampleLabel.setPreferredSize(new Dimension(400, 85)); - backupfilesExampleLabel.setAlignmentX(LEFT_ALIGNMENT); - backupfilesExampleLabel.setAlignmentY(TOP_ALIGNMENT); - - backupfilesExampleLabel.setFont(LABEL_FONT_ITALIC); - backupfilesExampleLabel.setBackground(exampleLabel.getBackground()); - - updateBackupFilesExampleLabel(); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.WEST; - gbc.fill = GridBagConstraints.NONE; - gbc.gridy = 0; - /* - exampleFilesPanel.add(exampleLabel, gbc); - gbc.gridy = 1; - */ - exampleFilesPanel.add(backupfilesExampleLabel, gbc); - return exampleFilesPanel; + return keepfilesPanel; } protected void updateBackupFilesExampleLabel() { int exampleindex = 12; - String base = "filename"; - String extension = ".fa"; - - String suffix = suffixTemplate.getText(); - int digits = 3; - try { - suffixDigitsSpinner.commitEdit(); - digits = (Integer) suffixDigitsSpinner.getValue(); - digits = digits < 1 ? 1 : digits; - } catch (Exception e) + String base = MessageManager.getString("label.filename") + ".fa"; + if (base == null || base.length() == 0) { - System.out.println("Failed casting (Integer) suffixTemplateSpinner.getValue()"); + base = "file_name.fa"; } + boolean reverse = suffixReverse.isSelected(); boolean keepAll = backupfilesKeepAll.isSelected(); int rollMax = 4; - try + String suffix = suffixTemplate.getText(); + int digits = 3; + + backupfilesExampleLabel.setFont(LABEL_FONT_ITALIC); + if (suffix == null || suffix.length() == 0) { - backupfilesRollMaxSpinner.commitEdit(); - rollMax = (Integer) backupfilesRollMaxSpinner.getValue(); - rollMax = rollMax < 1 ? 1 : rollMax; - } catch (Exception e) + backupfilesExampleLabel + .setText(MessageManager.getString("label.no_backup_files")); + backupfilesExampleLabel.setFont(LABEL_FONT_BOLD); + return; + } + + rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 4); + rollMax = rollMax < 1 ? 1 : rollMax; + + if (suffix.indexOf(BackupFiles.NUM_PLACEHOLDER) == -1) { - System.out.println( - "Failed casting (Integer) backupfilesRollMaxSpinner.getValue()"); + rollMax = 1; } + digits = getSpinnerInt(suffixDigitsSpinner, 3); + digits = digits < 1 ? 1 : digits; + int lowersurround = 2; int uppersurround = 0; StringBuilder exampleSB = new StringBuilder(); boolean firstLine = true; + int lineNumber = 0; if (reverse) { @@ -2063,6 +2509,7 @@ public class GPreferences extends JPanel if (index == min + lowersurround && index < max - uppersurround - 1) { exampleSB.append("\n..."); + lineNumber++; } else if (index > min + lowersurround && index < max - uppersurround) { @@ -2077,20 +2524,29 @@ public class GPreferences extends JPanel else { exampleSB.append("\n"); + lineNumber++; } - exampleSB.append(BackupFilenameFilter.getBackupFilename(index, - base, suffix, digits, extension)); + exampleSB.append(BackupFilenameParts.getBackupFilename(index, + base, suffix, digits)); if (min == max) { // no extra text needed } else if (index == min) { - exampleSB.append(" (most recent)"); + String newest = MessageManager.getString("label.braced_newest"); + if (newest != null && newest.length() > 0) + { + exampleSB.append(" " + newest); + } } else if (index == max) { - exampleSB.append(" (oldest)"); + String oldest = MessageManager.getString("label.braced_oldest"); + if (oldest != null && oldest.length() > 0) + { + exampleSB.append(" " + oldest); + } } } } @@ -2108,6 +2564,7 @@ public class GPreferences extends JPanel if (index == min + lowersurround && index < max - uppersurround - 1) { exampleSB.append("\n..."); + lineNumber++; } else if (index > min + lowersurround && index < max - uppersurround) { @@ -2122,26 +2579,47 @@ public class GPreferences extends JPanel else { exampleSB.append("\n"); + lineNumber++; } - exampleSB.append(BackupFilenameFilter.getBackupFilename(index, - base, suffix, digits, extension)); + exampleSB.append(BackupFilenameParts.getBackupFilename(index, + base, suffix, digits)); if (min == max) { // no extra text needed } else if (index == min) { - exampleSB.append(" (oldest)"); + String oldest = MessageManager.getString("label.braced_oldest"); + if (oldest != null && oldest.length() > 0) + { + exampleSB.append(" " + oldest); + } } else if (index == max) { - exampleSB.append(" (most recent)"); + String newest = MessageManager.getString("label.braced_newest"); + if (newest != null && newest.length() > 0) + { + exampleSB.append(" " + newest); + } } } } } + // add some extra empty lines to pad out the example files box. ugh, please tell + // me how to do this better + int remainingLines = lowersurround + uppersurround + 1 - lineNumber; + if (remainingLines > 0) + { + for (int i = 0; i < remainingLines; i++) + { + exampleSB.append("\n "); + lineNumber++; + } + } + backupfilesExampleLabel.setText(exampleSB.toString()); } @@ -2156,7 +2634,7 @@ public class GPreferences extends JPanel i = Integer.parseInt((String) s.getValue()); } catch (Exception e) { - System.out.println( + Cache.log.error( "Exception casting the initial value of s.getValue()"); } } @@ -2179,7 +2657,7 @@ public class GPreferences extends JPanel } - public static int getSpinnerInt(JSpinner s, int def) + protected static int getSpinnerInt(JSpinner s, int def) { int i = def; try @@ -2188,38 +2666,130 @@ public class GPreferences extends JPanel i = (Integer) s.getValue(); } catch (Exception e) { - System.out.println("Failed casting (Integer) JSpinner s.getValue()"); + Cache.log.error("Failed casting (Integer) JSpinner s.getValue()"); } return i; } - private void keepRollMaxOptionsEnabled(boolean enabled) + private void keepRollMaxOptionsEnabled() { + boolean enabled = backupfilesKeepAll.isEnabled() + && !backupfilesKeepAll.isSelected(); oldBackupFilesLabel.setEnabled(enabled); backupfilesRollMaxSpinner.setEnabled(enabled); backupfilesConfirmDelete.setEnabled(enabled); - } - protected void backupsOptionsSetEnabled(boolean enabled) + private void backupfilesKeepAllSetEnabled(boolean tryEnabled) { - suffixPanel.setEnabled(enabled); + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && customiseCheckbox.isSelected() + && suffixTemplate.getText() + .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1; keepfilesPanel.setEnabled(enabled); - exampleFilesPanel.setEnabled(enabled); + backupfilesKeepAll.setEnabled(enabled); + oldBackupFilesLabel.setEnabled(enabled); + keepRollMaxOptionsEnabled(); + } - suffixTemplate.setEnabled(enabled); - suffixTemplateLabel.setEnabled(enabled); + private void backupfilesSuffixTemplateDigitsSetEnabled() + { + boolean enabled = suffixTemplate.isEnabled() && suffixTemplate.getText() + .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1; suffixDigitsLabel.setEnabled(enabled); suffixDigitsSpinner.setEnabled(enabled); suffixReverse.setEnabled(enabled); - backupfilesKeepAll.setEnabled(enabled); - backupfilesRollMaxSpinner.setEnabled(enabled); - oldBackupFilesLabel.setEnabled(enabled); - backupfilesConfirmDelete.setEnabled(enabled); - exampleLabel.setEnabled(enabled); + } + + private void backupfilesSuffixTemplateSetEnabled(boolean tryEnabled) + { + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && customiseCheckbox.isSelected(); + suffixPanel.setEnabled(enabled); + suffixTemplateLabel.setEnabled(enabled); + suffixTemplate.setEnabled(enabled); + backupfilesSuffixTemplateDigitsSetEnabled(); + } + + private void backupfilesRevertButtonSetEnabled(boolean tryEnabled) + { + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && customiseCheckbox.isSelected() && backupfilesCustomChanged(); + revertButton.setEnabled(enabled); + } + + private boolean backupfilesCustomChanged() + { + BackupFilesPresetEntry custom = BackupFilesPresetEntry.backupfilesPresetEntriesValues + .get(BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM); + BackupFilesPresetEntry current = getBackupfilesCurrentEntry(); + return !custom.equals(current); + } + + protected BackupFilesPresetEntry getBackupfilesCurrentEntry() + { + String suffix = suffixTemplate.getText(); + int digits = getSpinnerInt(suffixDigitsSpinner, 3); + boolean reverse = suffixReverse.isSelected(); + boolean keepAll = backupfilesKeepAll.isSelected(); + int rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 3); + boolean confirmDelete = backupfilesConfirmDelete.isSelected(); + + BackupFilesPresetEntry bfpe = new BackupFilesPresetEntry(suffix, digits, + reverse, keepAll, rollMax, confirmDelete); + + return bfpe; + } + + protected void backupfilesCustomOptionsSetEnabled() + { + boolean enabled = customiseCheckbox.isSelected(); + + backupfilesRevertButtonSetEnabled(enabled); + backupfilesSuffixTemplateSetEnabled(enabled); + backupfilesKeepAllSetEnabled(enabled); + } + + private void backupfilesSummarySetEnabled() + { + boolean enabled = enableBackupFiles.isSelected(); backupfilesExampleLabel.setEnabled(enabled); + exampleFilesPanel.setEnabled(enabled); + } - keepRollMaxOptionsEnabled(enabled && !backupfilesKeepAll.isSelected()); + private void backupfilesPresetsSetEnabled() + { + boolean enabled = enableBackupFiles.isSelected(); + presetsPanel.setEnabled(enabled); + presetsComboLabel.setEnabled(enabled); + backupfilesPresetsCombo.setEnabled(enabled); + customiseCheckbox.setEnabled(enabled); + revertButton.setEnabled(enabled); + } + + protected void backupsOptionsSetEnabled() + { + backupfilesPresetsSetEnabled(); + backupfilesSummarySetEnabled(); + backupfilesCustomOptionsSetEnabled(); + } + + protected void backupsSetOptions(String suffix, int digits, + boolean reverse, boolean keepAll, int rollMax, + boolean confirmDelete) + { + suffixTemplate.setText(suffix); + suffixDigitsSpinner.setValue(digits); + suffixReverse.setSelected(reverse); + backupfilesKeepAll.setSelected(keepAll); + backupfilesRollMaxSpinner.setValue(rollMax); + backupfilesConfirmDelete.setSelected(confirmDelete); + } + + protected void backupsSetOptions(BackupFilesPresetEntry p) + { + backupsSetOptions(p.suffix, p.digits, p.reverse, p.keepAll, p.rollMax, + p.confirmDelete); } protected void autoIdWidth_actionPerformed() @@ -2406,4 +2976,41 @@ public class GPreferences extends JPanel } } + + protected void validateHmmerPath() + { + } + + protected void validateCygwinPath() + { + } + + /** + * A helper method to add a panel containing a label and a component to a + * panel + * + * @param panel + * @param tooltip + * @param label + * @param valBox + */ + protected static void addtoLayout(JPanel panel, String tooltip, + JComponent label, JComponent valBox) + { + JPanel laypanel = new JPanel(new GridLayout(1, 2)); + JPanel labPanel = new JPanel(new BorderLayout()); + JPanel valPanel = new JPanel(); + labPanel.setBounds(new Rectangle(7, 7, 158, 23)); + valPanel.setBounds(new Rectangle(172, 7, 270, 23)); + labPanel.add(label, BorderLayout.WEST); + valPanel.add(valBox); + laypanel.add(labPanel); + laypanel.add(valPanel); + valPanel.setToolTipText(tooltip); + labPanel.setToolTipText(tooltip); + valBox.setToolTipText(tooltip); + panel.add(laypanel); + panel.validate(); + } } +