X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGPreferences.java;h=7784cf402202950d6682403315947bb816949340;hb=a83adb45bdf9554e270921b4baad94defd314b36;hp=58737ee56fc904a8f2ec5143b6e9a5e5df097544;hpb=c860648463c56ba9f75e9d239e2f56edea8e31e7;p=jalview.git diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index 58737ee..7784cf4 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -20,15 +20,19 @@ */ 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.util.MessageManager; +import jalview.util.Platform; import java.awt.BorderLayout; import java.awt.Color; @@ -36,7 +40,6 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; -import java.awt.FontMetrics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; @@ -49,9 +52,8 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Map; import java.util.HashMap; +import java.util.Map; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; @@ -62,6 +64,7 @@ import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; @@ -89,6 +92,7 @@ import javax.swing.table.TableCellRenderer; * @author $author$ * @version $Revision$ */ +@SuppressWarnings("serial") public class GPreferences extends JPanel { private static final Font LABEL_FONT = JvSwingUtils.getLabelFont(); @@ -176,6 +180,8 @@ public class GPreferences extends JPanel protected JComboBox structViewer = new JComboBox<>(); + protected JTextField structureDimensions = new JTextField(); + protected JTextField chimeraPath = new JTextField(); protected ButtonGroup mappingMethod = new ButtonGroup(); @@ -211,13 +217,13 @@ public class GPreferences extends JPanel /* * Connections tab components */ - protected JTable linkUrlTable = new JTable(); + public JTable linkUrlTable = new JTable(); - protected JButton editLink = new JButton(); + public JButton editLink = new JButton(); - protected JButton deleteLink = new JButton(); + public JButton deleteLink = new JButton(); - protected JTextField filterTB = new JTextField(); + public JTextField filterTB = new JTextField(); protected JButton doReset = new JButton(); @@ -246,6 +252,10 @@ public class GPreferences extends JPanel */ protected JComboBox epsRendering = new JComboBox<>(); + protected JComboBox htmlRendering = new JComboBox<>(); + + protected JComboBox svgRendering = new JComboBox<>(); + protected JLabel userIdWidthlabel = new JLabel(); protected JCheckBox autoIdWidth = new JCheckBox(); @@ -279,7 +289,6 @@ public class GPreferences extends JPanel protected JCheckBox sortByTree = new JCheckBox(); - /* * Web Services tab */ @@ -295,6 +304,8 @@ public class GPreferences extends JPanel protected JPanel presetsPanel = new JPanel(); + protected JButton revertButton = new JButton(); + protected JComboBox backupfilesPresetsCombo = new JComboBox<>(); protected JPanel suffixPanel = new JPanel(); @@ -365,8 +376,11 @@ public class GPreferences extends JPanel tabbedPane.add(initConnectionsTab(), MessageManager.getString("label.connections")); - tabbedPane.add(initBackupsTab(), - MessageManager.getString("label.backups")); + if (!Platform.isJS()) + { + tabbedPane.add(initBackupsTab(), + MessageManager.getString("label.backups")); + } tabbedPane.add(initLinksTab(), MessageManager.getString("label.urllinks")); @@ -380,8 +394,11 @@ public class GPreferences extends JPanel /* * See WsPreferences for the real work of configuring this tab. */ - wsTab.setLayout(new BorderLayout()); - tabbedPane.add(wsTab, MessageManager.getString("label.web_services")); + if (!Platform.isJS()) + { + wsTab.setLayout(new BorderLayout()); + tabbedPane.add(wsTab, MessageManager.getString("label.web_services")); + } /* * Handler to validate a tab before leaving it - currently only for @@ -439,7 +456,7 @@ public class GPreferences extends JPanel } /** - * Initialises the Output tabbed panel. + * Initialises the Output tab * * @return */ @@ -447,18 +464,35 @@ public class GPreferences extends JPanel { JPanel outputTab = new JPanel(); outputTab.setLayout(null); - JLabel epsLabel = new JLabel(); + + JLabel epsLabel = new JLabel( + MessageManager.formatMessage("label.rendering_style", "EPS")); epsLabel.setFont(LABEL_FONT); epsLabel.setHorizontalAlignment(SwingConstants.RIGHT); - epsLabel.setText(MessageManager.getString("label.eps_rendering_style")); - epsLabel.setBounds(new Rectangle(9, 31, 140, 24)); + epsLabel.setBounds(new Rectangle(9, 31, 160, 24)); epsRendering.setFont(LABEL_FONT); - epsRendering.setBounds(new Rectangle(154, 34, 187, 21)); + epsRendering.setBounds(new Rectangle(174, 34, 187, 21)); + JLabel htmlLabel = new JLabel( + MessageManager.formatMessage("label.rendering_style", "HTML")); + htmlLabel.setFont(LABEL_FONT); + htmlLabel.setHorizontalAlignment(SwingConstants.RIGHT); + htmlLabel.setBounds(new Rectangle(9, 55, 160, 24)); + htmlRendering.setFont(LABEL_FONT); + htmlRendering.setBounds(new Rectangle(174, 58, 187, 21)); + JLabel svgLabel = new JLabel( + MessageManager.formatMessage("label.rendering_style", "SVG")); + svgLabel.setFont(LABEL_FONT); + svgLabel.setHorizontalAlignment(SwingConstants.RIGHT); + svgLabel.setBounds(new Rectangle(9, 79, 160, 24)); + svgRendering.setFont(LABEL_FONT); + svgRendering.setBounds(new Rectangle(174, 82, 187, 21)); + JLabel jLabel1 = new JLabel(); jLabel1.setFont(LABEL_FONT); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); jLabel1.setText(MessageManager.getString("label.append_start_end")); jLabel1.setFont(LABEL_FONT); + fastajv.setFont(LABEL_FONT); fastajv.setHorizontalAlignment(SwingConstants.LEFT); clustaljv.setText(MessageManager.getString("label.clustal") + " "); @@ -475,7 +509,7 @@ public class GPreferences extends JPanel TitledBorder titledBorder2 = new TitledBorder( MessageManager.getString("label.file_output")); jPanel11.setBorder(titledBorder2); - jPanel11.setBounds(new Rectangle(30, 72, 196, 182)); + jPanel11.setBounds(new Rectangle(30, 120, 196, 182)); GridLayout gridLayout3 = new GridLayout(); jPanel11.setLayout(gridLayout3); gridLayout3.setRows(8); @@ -494,7 +528,7 @@ public class GPreferences extends JPanel MessageManager.getString("label.automatically_set_id_width")); autoIdWidth.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager .getString("label.adjusts_width_generated_eps_png"))); - autoIdWidth.setBounds(new Rectangle(228, 96, 188, 23)); + autoIdWidth.setBounds(new Rectangle(228, 144, 320, 23)); autoIdWidth.addActionListener(new ActionListener() { @@ -512,10 +546,10 @@ public class GPreferences extends JPanel userIdWidthlabel.setToolTipText( JvSwingUtils.wrapTooltip(true, MessageManager.getString( "label.manually_specify_width_left_column"))); - userIdWidthlabel.setBounds(new Rectangle(236, 120, 168, 23)); + userIdWidthlabel.setBounds(new Rectangle(236, 168, 320, 23)); userIdWidth.setFont(JvSwingUtils.getTextAreaFont()); userIdWidth.setText(""); - userIdWidth.setBounds(new Rectangle(232, 144, 84, 23)); + userIdWidth.setBounds(new Rectangle(232, 192, 84, 23)); userIdWidth.addActionListener(new ActionListener() { @@ -528,16 +562,10 @@ public class GPreferences extends JPanel modellerOutput.setFont(LABEL_FONT); modellerOutput .setText(MessageManager.getString("label.use_modeller_output")); - modellerOutput.setBounds(new Rectangle(228, 226, 168, 23)); + modellerOutput.setBounds(new Rectangle(228, 274, 320, 23)); embbedBioJSON.setFont(LABEL_FONT); embbedBioJSON.setText(MessageManager.getString("label.embbed_biojson")); - embbedBioJSON.setBounds(new Rectangle(228, 200, 250, 23)); - - - TitledBorder backupFilesBorder = new TitledBorder( - MessageManager - .getString("label.backup_files")); - + embbedBioJSON.setBounds(new Rectangle(228, 248, 250, 23)); jPanel11.add(jLabel1); jPanel11.add(blcjv); @@ -551,9 +579,19 @@ public class GPreferences extends JPanel outputTab.add(userIdWidth); outputTab.add(userIdWidthlabel); outputTab.add(modellerOutput); - outputTab.add(embbedBioJSON); - outputTab.add(epsLabel); - outputTab.add(epsRendering); + if (!Platform.isJS()) + { + /* + * JalviewJS doesn't support Lineart option or SVG output + */ + outputTab.add(embbedBioJSON); + outputTab.add(epsLabel); + outputTab.add(epsRendering); + outputTab.add(htmlLabel); + outputTab.add(htmlRendering); + outputTab.add(svgLabel); + outputTab.add(svgRendering); + } outputTab.add(jPanel11); return outputTab; } @@ -646,6 +684,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); @@ -1070,14 +1109,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); @@ -1245,6 +1283,7 @@ public class GPreferences extends JPanel structViewer.addItem(ViewerType.JMOL.name()); structViewer.addItem(ViewerType.CHIMERA.name()); structViewer.addActionListener(new ActionListener() + { @Override public void actionPerformed(ActionEvent e) @@ -1255,6 +1294,20 @@ public class GPreferences extends JPanel }); structureTab.add(structViewer); + // BH 2019.07.12 + ypos += lineSpacing; + JLabel dimLabel = new JLabel(); + dimLabel.setFont(new java.awt.Font("SansSerif", 0, 11)); + dimLabel.setHorizontalAlignment(SwingConstants.LEFT); + dimLabel.setText( + MessageManager.getString("label.structure_dimensions")); + dimLabel.setBounds(new Rectangle(10, ypos, 140, height)); + structureTab.add(dimLabel); + + structureDimensions.setFont(LABEL_FONT); + structureDimensions.setBounds(new Rectangle(160, ypos, 120, height)); + structureTab.add(structureDimensions); + ypos += lineSpacing; JLabel pathLabel = new JLabel(); pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11)); @@ -1313,6 +1366,17 @@ public class GPreferences extends JPanel docFieldPref.setBounds(new Rectangle(10, ypos, 450, 120)); structureTab.add(docFieldPref); + /* + * hide Chimera options in JalviewJS + */ + if (Platform.isJS()) + { + pathLabel.setVisible(false); + chimeraPath.setVisible(false); + viewerLabel.setVisible(false); + structViewer.setVisible(false); + } + return structureTab; } @@ -1689,10 +1753,61 @@ public class GPreferences extends JPanel visualTab.add(fontNameCB); visualTab.add(fontSizeCB); visualTab.add(fontStyleCB); + + if (Platform.isJS()) + { + startupCheckbox.setVisible(false); + startupFileTextfield.setVisible(false); + } + return visualTab; } /** + * Load the saved Backups options EXCEPT "Enabled" and "Scheme" + */ + + protected void loadLastSavedBackupsOptions() + { + enableBackupFiles + .setSelected(Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS())); + setComboIntStringKey(backupfilesPresetsCombo, + Cache.getDefault(BackupFiles.NS + "_PRESET", 1)); + suffixTemplate.setText(Cache.getDefault(BackupFiles.SUFFIX, + ".bak" + BackupFiles.NUM_PLACEHOLDER)); + suffixDigitsSpinner + .setValue(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3)); + suffixReverse.setSelected( + Cache.getDefault(BackupFiles.REVERSE_ORDER, false)); + backupfilesKeepAll + .setSelected(Cache.getDefault(BackupFiles.NO_MAX, false)); + backupfilesRollMaxSpinner + .setValue(Cache.getDefault(BackupFiles.ROLL_MAX, 3)); + backupfilesConfirmDelete.setSelected( + Cache.getDefault(BackupFiles.CONFIRM_DELETE_OLD, true)); + + backupsOptionsSetEnabled(); + updateBackupFilesExampleLabel(); + } + + protected boolean warnAboutSuffixReverseChange() + { + boolean savedSuffixReverse = Cache.getDefault(BackupFiles.REVERSE_ORDER, + false); + int savedSuffixDigits = Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3); + String savedSuffixTemplate = Cache.getDefault(BackupFiles.SUFFIX, + ".bak" + BackupFiles.NUM_PLACEHOLDER); + + 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 @@ -1700,14 +1815,14 @@ 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()); GridBagConstraints gbc = new GridBagConstraints(); - gbc.weightx = 1.0; + gbc.weightx = 0.0; gbc.weighty = 0.0; - gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.fill = GridBagConstraints.NONE; initBackupsTabPresetsPanel(); @@ -1715,168 +1830,257 @@ public class GPreferences extends JPanel initBackupsTabKeepFilesPanel(); initBackupsTabFilenameExamplesPanel(); - gbc.weightx = 0.5; enableBackupFiles.setFont(LABEL_FONT_BOLD); - enableBackupFiles.setText( - MessageManager.getString("label.enable_backupfiles")); + 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(); } }); - // enable checkbox 1 row + + // enable checkbox 1 col gbc.gridwidth = 1; + gbc.gridheight = 1; gbc.gridx = 0; - gbc.gridy = 0; + gbc.gridy = 0; // row 0 backupsTab.add(enableBackupFiles, gbc); + // summary of scheme box (over two rows) gbc.gridx = 1; - gbc.weightx = 1.0; + gbc.weightx = 0.0; gbc.gridheight = 2; - //gbc.anchor = GridBagConstraints.NORTHEAST; - //gbc.fill = GridBagConstraints.HORIZONTAL; + 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 = 1; + gbc.gridy++; // row 1 backupsTab.add(presetsPanel, gbc); - gbc.anchor = GridBagConstraints.NORTHWEST; - gbc.fill = GridBagConstraints.NONE; + // gbc.anchor = GridBagConstraints.NORTHWEST; + // now using whole row gbc.gridwidth = 2; gbc.gridheight = 1; - // whole suffix panel next row + // keep files box gbc.gridx = 0; - gbc.gridy = 2; - backupsTab.add(suffixPanel, gbc); - - // keep files panel - gbc.gridy = 3; + gbc.gridy++; // row 2 backupsTab.add(keepfilesPanel, gbc); - /* - // whole examples panel next row - gbc.gridy = 3; - backupsTab.add(exampleFilesPanel, gbc); + // filename strategy box + gbc.gridy++; // row 3 + backupsTab.add(suffixPanel, gbc); // fill empty space - gbc.gridy = 4; + gbc.gridy++; // row 4 gbc.weighty = 1.0; backupsTab.add(new JPanel(), gbc); - */ - backupsOptionsSetEnabled(enableBackupFiles.isSelected()); + backupsOptionsSetEnabled(); return backupsTab; } - private final IntKeyStringValueEntry[] backupfilesPresetEntries = + protected static final int BACKUPFILESSCHEMECUSTOMISE = 0; + + private static final IntKeyStringValueEntry[] backupfilesPresetEntries = { + new IntKeyStringValueEntry(1, + MessageManager.getString("label.default")), + new IntKeyStringValueEntry(2, + MessageManager.getString("label.single_file")), + new IntKeyStringValueEntry(3, + MessageManager.getString("label.keep_all_versions")), + new IntKeyStringValueEntry(4, + MessageManager.getString("label.rolled_backups")), + // ... + // IMPORTANT, keep "Custom" entry with key 0 (even though it appears last) + new IntKeyStringValueEntry(BACKUPFILESSCHEMECUSTOMISE, + MessageManager.getString("label.customise")) }; + + private static final Map backupfilesPresetEntriesValues = new HashMap() { - new IntKeyStringValueEntry(1, MessageManager.getString("label.default")), - new IntKeyStringValueEntry(2, MessageManager.getString("label.single_file")), - new IntKeyStringValueEntry(3, MessageManager.getString("label.keep_everything")), - new IntKeyStringValueEntry(4, MessageManager.getString("label.rolled_backups")), - // ... - // IMPORTANT, keep "Custom" entry with key 0 (even though it appears last) - new IntKeyStringValueEntry(0, MessageManager.getString("label.custom")) - }; + /** + * + */ + private static final long serialVersionUID = 125L; - private final Map backupfilesPresetEntriesValues = new HashMap() - {{ - put(1, new BackupFilesPresetEntry(".v"+BackupFiles.NUM_PLACEHOLDER, 3, false, false, 4, false)); + { + put(1, new BackupFilesPresetEntry( + ".bak" + BackupFiles.NUM_PLACEHOLDER, 3, false, false, 3, + false)); put(2, new BackupFilesPresetEntry("~", 1, false, false, 1, false)); - put(3, new BackupFilesPresetEntry(".v"+BackupFiles.NUM_PLACEHOLDER, 3, false, true, 10, true)); - put(4, new BackupFilesPresetEntry("_bak."+BackupFiles.NUM_PLACEHOLDER, 1, true, false, 9, false)); - }}; + put(3, new BackupFilesPresetEntry(".v" + BackupFiles.NUM_PLACEHOLDER, + 3, false, true, 10, true)); + put(4, new BackupFilesPresetEntry( + "_bak." + BackupFiles.NUM_PLACEHOLDER, 1, true, false, 9, + false)); + } + }; private JPanel initBackupsTabPresetsPanel() { - presetsPanel.setBorder(new TitledBorder( - MessageManager.getString("label.presets"))); + + String title = MessageManager.getString("label.schemes"); + // TitledBorder tb = new TitledBorder(new EmptyBorder(0, 0, 0, 0), title); + // TitledBorder tb = new TitledBorder(title); + // tb.setTitleFont(LABEL_FONT); + // presetsPanel.setBorder(tb); + + presetsPanel.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 0.0; + gbc.weighty = 0.0; + gbc.anchor = GridBagConstraints.BASELINE_LEADING; + gbc.fill = GridBagConstraints.NONE; + gbc.gridwidth = 1; + gbc.gridheight = 1; + + // "Scheme: " + gbc.gridx = 0; + gbc.gridy = 0; + presetsPanel.add(new JLabel(title + ":"), gbc); for (int i = 0; i < backupfilesPresetEntries.length; i++) { - backupfilesPresetsCombo.addItem(backupfilesPresetEntries[i]); + backupfilesPresetsCombo.addItem(backupfilesPresetEntries[i]); } + // put "Previously saved scheme" item in italics (it's not really + // selectable, as such -- it deselects itself when selected) and + // "Customise" in bold + backupfilesPresetsCombo + .setRenderer(new BackupFilesPresetsComboBoxRenderer()); backupfilesPresetsCombo.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - backupsTabUpdatePresets(); - } - } - ); + { + @Override + public void actionPerformed(ActionEvent e) + { + backupsTabUpdatePresets(); + } + }); + + // dropdown list of preset schemes + gbc.gridx = 1; + presetsPanel.add(backupfilesPresetsCombo, gbc); + + revertButton.setText(MessageManager.getString("label.cancel_changes")); + revertButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + loadLastSavedBackupsOptions(); + } + + }); + revertButton.setFont(LABEL_FONT); + + // "Cancel changes" button (aligned with combo box above) + gbc.gridx = 1; + gbc.gridy++; + presetsPanel.add(revertButton, gbc); - presetsPanel.add(backupfilesPresetsCombo); return presetsPanel; } - private void backupsTabUpdatePresets() + private JPanel initBackupsTabFilenameExamplesPanel() { - IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo.getSelectedItem(); + String title = MessageManager + .getString("label.summary_of_backups_scheme"); + 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; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + + exampleFilesPanel.add(backupfilesExampleLabel, gbc); + return exampleFilesPanel; + } + + protected void backupsTabUpdatePresets() + { + IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo + .getSelectedItem(); int key = entry.getKey(); String value = entry.getValue(); - boolean custom = key==0; - if (custom) - { - //backupsSetCustomOptions(); - } else + // BACKUPFILESSCHEMECUSTOMISE (==0) reserved for "Custom" + if (key != BACKUPFILESSCHEMECUSTOMISE) { if (backupfilesPresetEntriesValues.containsKey(key)) { backupsSetOptions(backupfilesPresetEntriesValues.get(key)); - } else { - System.out.println("Preset '"+value+"' not implemented yet"); + } + else + { + System.out.println("Preset '" + value + "' not implemented"); } } + backupfilesCustomOptionsSetEnabled(); updateBackupFilesExampleLabel(); - backupsCustomOptionsSetEnabled(custom); } - protected int getComboIntStringKey(JComboBox c) + protected int getComboIntStringKey(JComboBox c) { IntKeyStringValueEntry e = (IntKeyStringValueEntry) c.getSelectedItem(); - return e!=null?e.getKey():0; + return e != null ? e.getKey() : 0; } - protected void setComboIntStringKey(JComboBox c, int key) + protected void setComboIntStringKey(JComboBox c, + int key) { - for (int i=0; i < c.getItemCount(); i++) + for (int i = 0; i < c.getItemCount(); i++) + { + IntKeyStringValueEntry e = c.getItemAt(i); + if (e.getKey() == key) { - IntKeyStringValueEntry e = c.getItemAt(i); - int k = e.getKey(); - String v = e.getValue(); - if (e.getKey() == key) - { - c.setSelectedIndex(i); - break; - } + c.setSelectedIndex(i); + break; } - backupsTabUpdatePresets(); + } + backupsTabUpdatePresets(); } 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() { @@ -1884,6 +2088,7 @@ public class GPreferences extends JPanel public void actionPerformed(ActionEvent e) { updateBackupFilesExampleLabel(); + backupfilesCustomOptionsSetEnabled(); } }); @@ -1893,6 +2098,7 @@ public class GPreferences extends JPanel public void keyReleased(KeyEvent e) { updateBackupFilesExampleLabel(); + backupfilesCustomOptionsSetEnabled(); } @Override @@ -1900,14 +2106,14 @@ 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(); } } @@ -1933,15 +2139,29 @@ public class GPreferences extends JPanel }; setIntegerSpinner(suffixDigitsSpinner, defaultmin, defaultmax, 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) + { + updateBackupFilesExampleLabel(); + } + else + { + boolean savedSuffixReverse = Cache + .getDefault(BackupFiles.REVERSE_ORDER, false); + suffixReverse.setSelected(savedSuffixReverse); + } } }); @@ -1956,15 +2176,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); @@ -1986,10 +2206,18 @@ public class GPreferences extends JPanel return suffixPanel; } - private void backupfilesKeepAllEnabled(boolean enabled) + protected boolean confirmSuffixReverseChange() { - backupfilesKeepAll.setEnabled(enabled); - keepRollMaxOptionsEnabled(); + boolean ret = false; + String warningMessage = MessageManager + .getString("label.warning_confirm_change_reverse"); + int confirm = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(), + warningMessage, + MessageManager.getString("label.change_increment_decrement"), + JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE); + + ret = (confirm == JvOptionPane.YES_OPTION); + return ret; } private JPanel initBackupsTabKeepFilesPanel() @@ -2015,7 +2243,6 @@ public class GPreferences extends JPanel @Override public void actionPerformed(ActionEvent e) { - boolean selected = backupfilesKeepAll.isSelected(); keepRollMaxOptionsEnabled(); updateBackupFilesExampleLabel(); } @@ -2033,7 +2260,7 @@ public class GPreferences extends JPanel setIntegerSpinner(backupfilesRollMaxSpinner, 1, 999, 4, true, c); backupfilesConfirmDelete.setLabels( - MessageManager.getString("label.confirm_delete"), + MessageManager.getString("label.always_ask"), MessageManager.getString("label.auto_delete")); // update the enabled section keepRollMaxOptionsEnabled(); @@ -2081,80 +2308,53 @@ public class GPreferences extends JPanel 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() - { - String title = MessageManager.getString("label.example_filenames"); - TitledBorder tb = new TitledBorder(title); - //tb.setTitleFont(LABEL_FONT); - exampleFilesPanel.setBorder(tb); - exampleFilesPanel.setLayout(new GridBagLayout()); - //inordinately difficult to get this titledborder the right size for the title - - backupfilesExampleLabel.setEditable(false); - backupfilesExampleLabel.setPreferredSize(new Dimension(280, 85)); - backupfilesExampleLabel.setAlignmentX(LEFT_ALIGNMENT); - backupfilesExampleLabel.setAlignmentY(TOP_ALIGNMENT); - - backupfilesExampleLabel.setFont(LABEL_FONT_ITALIC); - backupfilesExampleLabel - .setBackground(exampleFilesPanel.getBackground()); - - updateBackupFilesExampleLabel(); - exampleFilesPanel.setMinimumSize(new Dimension(280, 85)); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.EAST; - - gbc.gridy = 0; - exampleFilesPanel.add(backupfilesExampleLabel, gbc); - return exampleFilesPanel; + return keepfilesPanel; } protected void updateBackupFilesExampleLabel() { int exampleindex = 12; - String base = MessageManager.getString("label.filename"); - if (base == null || base.length() > 0) + String base = MessageManager.getString("label.filename") + ".fa"; + if (base == null || base.length() == 0) { - base = "filename.fa"; + base = "file_name.fa"; } - String suffix = suffixTemplate.getText(); - int digits = 3; - try { - suffixDigitsSpinner.commitEdit(); - digits = (Integer) suffixDigitsSpinner.getValue(); - digits = digits < 1 ? 1 : digits; - } catch (Exception e) - { - System.out.println("Failed casting (Integer) suffixTemplateSpinner.getValue()"); - } 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(); @@ -2184,7 +2384,7 @@ public class GPreferences extends JPanel { exampleSB.append("\n"); } - exampleSB.append(BackupFilenameFilter.getBackupFilename(index, + exampleSB.append(BackupFilenameParts.getBackupFilename(index, base, suffix, digits)); if (min == max) { @@ -2195,7 +2395,7 @@ public class GPreferences extends JPanel String newest = MessageManager.getString("label.braced_newest"); if (newest != null && newest.length() > 0) { - exampleSB.append(" "+newest); + exampleSB.append(" " + newest); } } else if (index == max) @@ -2203,7 +2403,7 @@ public class GPreferences extends JPanel String oldest = MessageManager.getString("label.braced_oldest"); if (oldest != null && oldest.length() > 0) { - exampleSB.append(" "+oldest); + exampleSB.append(" " + oldest); } } } @@ -2237,7 +2437,7 @@ public class GPreferences extends JPanel { exampleSB.append("\n"); } - exampleSB.append(BackupFilenameFilter.getBackupFilename(index, + exampleSB.append(BackupFilenameParts.getBackupFilename(index, base, suffix, digits)); if (min == max) { @@ -2248,7 +2448,7 @@ public class GPreferences extends JPanel String oldest = MessageManager.getString("label.braced_oldest"); if (oldest != null && oldest.length() > 0) { - exampleSB.append(" "+oldest); + exampleSB.append(" " + oldest); } } else if (index == max) @@ -2256,7 +2456,7 @@ public class GPreferences extends JPanel String newest = MessageManager.getString("label.braced_newest"); if (newest != null && newest.length() > 0) { - exampleSB.append(" "+newest); + exampleSB.append(" " + newest); } } } @@ -2317,56 +2517,77 @@ public class GPreferences extends JPanel protected void keepRollMaxOptionsEnabled() { - keepRollMaxOptionsEnabled(backupfilesKeepAll.isEnabled()); + boolean enabled = backupfilesKeepAll.isEnabled() + && !backupfilesKeepAll.isSelected(); + oldBackupFilesLabel.setEnabled(enabled); + backupfilesRollMaxSpinner.setEnabled(enabled); + backupfilesConfirmDelete.setEnabled(enabled); } - protected void keepRollMaxOptionsEnabled(boolean tryEnabled) + protected void backupfilesKeepAllSetEnabled(boolean tryEnabled) { - boolean enabled = tryEnabled && !backupfilesKeepAll.isSelected(); + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && getComboIntStringKey(backupfilesPresetsCombo) == 0 + && suffixTemplate.getText() + .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1; + keepfilesPanel.setEnabled(enabled); + backupfilesKeepAll.setEnabled(enabled); oldBackupFilesLabel.setEnabled(enabled); - backupfilesRollMaxSpinner.setEnabled(enabled); - backupfilesConfirmDelete.setEnabled(enabled); + keepRollMaxOptionsEnabled(); } - protected void backupsCustomOptionsSetEnabled(boolean enabled) + private void backupfilesSuffixTemplateDigitsSetEnabled() { - backupsOptionsSetEnabled(enabled, false); + boolean enabled = suffixTemplate.isEnabled() && suffixTemplate.getText() + .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1; + suffixDigitsLabel.setEnabled(enabled); + suffixDigitsSpinner.setEnabled(enabled); + suffixReverse.setEnabled(enabled); } - protected void backupsOptionsSetEnabled(boolean enabled) + private void backupfilesSuffixTemplateSetEnabled(boolean tryEnabled) { - backupsOptionsSetEnabled(enabled, true); + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && getComboIntStringKey(backupfilesPresetsCombo) == 0; + suffixPanel.setEnabled(enabled); + suffixTemplateLabel.setEnabled(enabled); + suffixTemplate.setEnabled(enabled); + backupfilesSuffixTemplateDigitsSetEnabled(); } - protected void backupsOptionsSetEnabled(boolean enabled, boolean all) + protected void backupfilesCustomOptionsSetEnabled() { + int scheme = getComboIntStringKey(backupfilesPresetsCombo); + boolean enabled = scheme == 0 && enableBackupFiles.isSelected(); - if (all) - { - presetsPanel.setEnabled(enabled); - exampleFilesPanel.setEnabled(enabled); + backupfilesSuffixTemplateSetEnabled(enabled); + backupfilesKeepAllSetEnabled(enabled); + } - backupfilesPresetsCombo.setEnabled(enabled); - backupfilesExampleLabel.setEnabled(enabled); - } - suffixPanel.setEnabled(enabled); - keepfilesPanel.setEnabled(enabled); + private void backupfilesSummarySetEnabled() + { + boolean enabled = enableBackupFiles.isSelected(); + backupfilesExampleLabel.setEnabled(enabled); + exampleFilesPanel.setEnabled(enabled); + } - suffixTemplate.setEnabled(enabled); - suffixTemplateLabel.setEnabled(enabled); - suffixDigitsLabel.setEnabled(enabled); - suffixDigitsSpinner.setEnabled(enabled); - suffixReverse.setEnabled(enabled); - oldBackupFilesLabel.setEnabled(enabled); - backupfilesKeepAllEnabled(enabled); + private void backupfilesPresetsSetEnabled() + { + boolean enabled = enableBackupFiles.isSelected(); + presetsPanel.setEnabled(enabled); + backupfilesPresetsCombo.setEnabled(enabled); + } - if (enabled && all) - { - backupsTabUpdatePresets(); - } + protected void backupsOptionsSetEnabled() + { + backupfilesPresetsSetEnabled(); + backupfilesSummarySetEnabled(); + backupfilesCustomOptionsSetEnabled(); } - protected void backupsSetOptions(String suffix, int digits, boolean reverse, boolean keepAll, int rollMax, boolean confirmDelete) + protected void backupsSetOptions(String suffix, int digits, + boolean reverse, boolean keepAll, int rollMax, + boolean confirmDelete) { suffixTemplate.setText(suffix); suffixDigitsSpinner.setValue(digits); @@ -2378,7 +2599,8 @@ public class GPreferences extends JPanel protected void backupsSetOptions(BackupFilesPresetEntry p) { - backupsSetOptions(p.suffix, p.digits, p.reverse, p.keepAll, p.rollMax, p.confirmDelete); + backupsSetOptions(p.suffix, p.digits, p.reverse, p.keepAll, p.rollMax, + p.confirmDelete); } protected void autoIdWidth_actionPerformed() @@ -2542,6 +2764,7 @@ public class GPreferences extends JPanel button.setHorizontalAlignment(SwingConstants.CENTER); this.button.addActionListener(new ActionListener() { + @SuppressWarnings("synthetic-access") @Override public void actionPerformed(ActionEvent e) { @@ -2567,37 +2790,51 @@ public class GPreferences extends JPanel } } -class IntKeyStringValueEntry { +class IntKeyStringValueEntry +{ int k; + String v; + public IntKeyStringValueEntry(int k, String v) { this.k = k; this.v = v; } + @Override public String toString() { return this.getValue(); } + public int getKey() { return k; } + public String getValue() { return v; } } -class BackupFilesPresetEntry { +class BackupFilesPresetEntry +{ String suffix; + int digits; + boolean reverse; + boolean keepAll; + int rollMax; + boolean confirmDelete; - public BackupFilesPresetEntry(String suffix, int digits, boolean reverse, boolean keepAll, int rollMax, boolean confirmDelete) + + public BackupFilesPresetEntry(String suffix, int digits, boolean reverse, + boolean keepAll, int rollMax, boolean confirmDelete) { this.suffix = suffix; this.digits = digits; @@ -2607,3 +2844,31 @@ class BackupFilesPresetEntry { this.confirmDelete = confirmDelete; } } + +class BackupFilesPresetsComboBoxRenderer extends DefaultListCellRenderer +{ + /** + * + */ + private static final long serialVersionUID = 88L; + + @Override + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) + { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + try { + IntKeyStringValueEntry e = (IntKeyStringValueEntry) value; + if (e.getKey() == GPreferences.BACKUPFILESSCHEMECUSTOMISE) + { + // "Customise" item + this.setFont(this.getFont().deriveFont(Font.BOLD)); + } + } catch (Exception e) { + return this; + } + + return this; + } +}