X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGPreferences.java;h=37ba654f0b4634f84f5e5967661d4fb26b4fbf5d;hb=b26fefd329b60deb2025aa28cdbaae30bfb58382;hp=fb0b2a4039d35e9669cfc2850ba569fc6682b3f0;hpb=7664ccad29d55ad2355d72feeac23d8bdd49a2a7;p=jalview.git diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index fb0b2a4..37ba654 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -43,6 +43,7 @@ import java.util.List; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; +import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; @@ -54,6 +55,7 @@ import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JScrollPane; +import javax.swing.JSlider; import javax.swing.JSpinner; import javax.swing.JTabbedPane; import javax.swing.JTable; @@ -69,10 +71,13 @@ import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import jalview.bin.Cache; +import jalview.bin.MemorySetting; import jalview.fts.core.FTSDataColumnPreferences; import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource; import jalview.fts.service.pdb.PDBFTSRestClient; @@ -87,6 +92,7 @@ import jalview.io.BackupFilesPresetEntry; import jalview.io.IntKeyStringValueEntry; import jalview.util.MessageManager; import jalview.util.Platform; +import jalview.util.StringUtils; /** * Base class for the Preferences panel. @@ -173,8 +179,6 @@ public class GPreferences extends JPanel protected JCheckBox structFromPdb = new JCheckBox(); - protected JCheckBox useRnaView = new JCheckBox(); - protected JCheckBox addSecondaryStructure = new JCheckBox(); protected JCheckBox addTempFactor = new JCheckBox(); @@ -262,7 +266,7 @@ public class GPreferences extends JPanel protected JTextField proxyAuthUsernameTB = new JTextField(); - protected JPasswordField proxyAuthPasswordTB = new JPasswordField(); + protected JPasswordField proxyAuthPasswordPB = new JPasswordField(); protected JTextField defaultBrowser = new JTextField(); @@ -274,6 +278,8 @@ public class GPreferences extends JPanel protected JRadioButton customProxy = new JRadioButton(); + protected JButton applyProxyButton = new JButton(); + protected JCheckBox usagestats = new JCheckBox(); protected JCheckBox questionnaire = new JCheckBox(); @@ -373,24 +379,42 @@ public class GPreferences extends JPanel protected JTextArea backupfilesExampleLabel = new JTextArea(); + private final JTabbedPane tabbedPane = new JTabbedPane(); + + private JLabel messageLabel = new JLabel("", JLabel.CENTER); + + /* + * Startup tab components + */ + + protected JCheckBox customiseMemorySetting = new JCheckBox(); + + protected JLabel exampleMemoryLabel = new JLabel(); + + protected JTextArea exampleMemoryMessageTextArea = new JTextArea(); + + protected JLabel maxMemoryLabel = new JLabel(); + + protected JLabel jvmMemoryPercentLabel = new JLabel(); + + protected JSlider jvmMemoryPercentSlider = new JSlider(); + + protected JLabel jvmMemoryPercentDisplay = new JLabel(); + + protected JLabel jvmMemoryMaxLabel = new JLabel(); + + protected JTextField jvmMemoryMaxTextField = new JTextField(null, 8); + + protected JComboBox lafCombo = new JComboBox<>(); + /** * Creates a new GPreferences object. */ public GPreferences() { - new GPreferences(0); - } - - public GPreferences(int selectTab) - { - new GPreferences(selectTab, null); - } - - public GPreferences(int selectTab, String message) - { try { - jbInit(selectTab, message); + jbInit(); } catch (Exception ex) { ex.printStackTrace(); @@ -404,28 +428,11 @@ public class GPreferences extends JPanel */ private void jbInit() throws Exception { - jbInit(0); - } - - private void jbInit(int selectTab) throws Exception - { - jbInit(selectTab, null); - } - - public final static int CONNECTIONS_TAB = 5; - - private void jbInit(int selectTab, String message) throws Exception - { - final JTabbedPane tabbedPane = new JTabbedPane(); + // final JTabbedPane tabbedPane = new JTabbedPane(); this.setLayout(new BorderLayout()); - if (message != null) - { - JLabel messageLabel = new JLabel(message, JLabel.CENTER); - messageLabel.setFont(LABEL_FONT_BOLD); - messageLabel.setForeground(Color.RED.darker()); - this.add(messageLabel, BorderLayout.NORTH); - } + // message label at top + this.add(messageLabel, BorderLayout.NORTH); JPanel okCancelPanel = initOkCancelPanel(); this.add(tabbedPane, BorderLayout.CENTER); @@ -446,11 +453,11 @@ public class GPreferences extends JPanel tabbedPane.add(initConnectionsTab(), MessageManager.getString("label.connections")); - if (!Platform.isJS()) - { - tabbedPane.add(initBackupsTab(), - MessageManager.getString("label.backups")); - } + if (!Platform.isJS()) + { + tabbedPane.add(initBackupsTab(), + MessageManager.getString("label.backups")); + } tabbedPane.add(initLinksTab(), MessageManager.getString("label.urllinks")); @@ -461,6 +468,9 @@ public class GPreferences extends JPanel tabbedPane.add(initEditingTab(), MessageManager.getString("label.editing")); + tabbedPane.add(initStartupTab(), + MessageManager.getString("label.startup")); + /* * See WsPreferences for the real work of configuring this tab. */ @@ -473,6 +483,7 @@ public class GPreferences extends JPanel /* * Handler to validate a tab before leaving it - currently only for * Structure. + * Adding a clearMessage() so messages are cleared when changing tabs. */ tabbedPane.addChangeListener(new ChangeListener() { @@ -491,19 +502,61 @@ public class GPreferences extends JPanel } } lastTab = tabbedPane.getSelectedComponent(); + + clearMessage(); } }); + } + public void setMessage(String message) + { + if (message != null) + { + messageLabel.setText(message); + messageLabel.setFont(LABEL_FONT_BOLD); + messageLabel.setForeground(Color.RED.darker()); + messageLabel.revalidate(); + messageLabel.repaint(); + } + // note message not cleared if message is null. call clearMessage() + // directly. + this.revalidate(); + this.repaint(); + } + + public void clearMessage() + { + // only repaint if message exists + if (messageLabel.getText() != null + && messageLabel.getText().length() > 0) + { + messageLabel.setText(""); + messageLabel.revalidate(); + messageLabel.repaint(); + this.revalidate(); + this.repaint(); + } + } + + public static enum TabRef + { + CONNECTIONS_TAB, STRUCTURE_TAB + }; + + public void selectTab(TabRef selectTab) + { // select a given tab - currently only for Connections switch (selectTab) { case CONNECTIONS_TAB: tabbedPane.setSelectedComponent(connectTab); break; + case STRUCTURE_TAB: + tabbedPane.setSelectedComponent(structureTab); + break; default: } - } /** @@ -972,8 +1025,60 @@ public class GPreferences extends JPanel proxyPortHttpsTB.setColumns(4); proxyAuthUsernameTB.setFont(LABEL_FONT); proxyAuthUsernameTB.setColumns(30); - proxyAuthPasswordTB.setFont(LABEL_FONT); - proxyAuthPasswordTB.setColumns(30); + + // check for any change to enable applyProxyButton + DocumentListener d = new DocumentListener() + { + @Override + public void changedUpdate(DocumentEvent e) + { + applyProxyButtonEnabled(true); + } + + @Override + public void insertUpdate(DocumentEvent e) + { + applyProxyButtonEnabled(true); + } + + @Override + public void removeUpdate(DocumentEvent e) + { + applyProxyButtonEnabled(true); + } + }; + proxyServerHttpTB.getDocument().addDocumentListener(d); + proxyPortHttpTB.getDocument().addDocumentListener(d); + proxyServerHttpsTB.getDocument().addDocumentListener(d); + proxyPortHttpsTB.getDocument().addDocumentListener(d); + proxyAuthUsernameTB.getDocument().addDocumentListener(d); + proxyAuthPasswordPB.setFont(LABEL_FONT); + proxyAuthPasswordPB.setColumns(30); + proxyAuthPasswordPB.getDocument() + .addDocumentListener(new DocumentListener() + { + @Override + public void changedUpdate(DocumentEvent e) + { + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + @Override + public void insertUpdate(DocumentEvent e) + { + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + @Override + public void removeUpdate(DocumentEvent e) + { + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + }); // Label for Port text box portLabel.setFont(LABEL_FONT); @@ -1135,47 +1240,106 @@ public class GPreferences extends JPanel gbc.gridy++; proxyPanel.add(hpPanel, gbc); - // Require authentication checkbox + if (!Platform.isJS()) + /** + * java.net.Authenticator is not implemented in SwingJS. Not displaying the + * Authentication options in Preferences. + * + * @j2sIgnore + * + */ + { + // Require authentication checkbox + gbc.gridy++; + proxyPanel.add(proxyAuth, gbc); + + // username and password + JPanel upPanel = new JPanel(); + upPanel.setLayout(new GridBagLayout()); + // username row + c.gridy = 0; + c.gridx = 0; + c.gridwidth = 1; + c.weightx = 0.4; + c.anchor = GridBagConstraints.LINE_END; + upPanel.add(proxyAuthUsernameLabel, c); + + c.gridx++; + c.weightx = 1.0; + c.anchor = GridBagConstraints.LINE_START; + upPanel.add(proxyAuthUsernameTB, c); + + // password row + c.gridy++; + c.gridx = 0; + c.weightx = 0.4; + c.anchor = GridBagConstraints.LINE_END; + upPanel.add(proxyAuthPasswordLabel, c); + + c.gridx++; + c.weightx = 1.0; + c.anchor = GridBagConstraints.LINE_START; + upPanel.add(proxyAuthPasswordPB, c); + + c.gridx++; + c.weightx = 0.4; + c.anchor = GridBagConstraints.LINE_START; + upPanel.add(passwordNotStoredLabel, c); + + gbc.gridy++; + proxyPanel.add(upPanel, gbc); + + } // end j2sIgnore + + applyProxyButton.setText(MessageManager.getString("action.apply")); + applyProxyButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + saveProxySettings(); + applyProxyButton.setEnabled(false); + } + }); gbc.gridy++; - proxyPanel.add(proxyAuth, gbc); - - // username and password - JPanel upPanel = new JPanel(); - upPanel.setLayout(new GridBagLayout()); - // username row - c.gridy = 0; - c.gridx = 0; - c.gridwidth = 1; - c.weightx = 0.4; - c.anchor = GridBagConstraints.LINE_END; - upPanel.add(proxyAuthUsernameLabel, c); - - c.gridx++; - c.weightx = 1.0; - c.anchor = GridBagConstraints.LINE_START; - upPanel.add(proxyAuthUsernameTB, c); + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.LINE_END; + proxyPanel.add(applyProxyButton, gbc); - // password row - c.gridy++; - c.gridx = 0; - c.weightx = 0.4; - c.anchor = GridBagConstraints.LINE_END; - upPanel.add(proxyAuthPasswordLabel, c); + return proxyPanel; + } - c.gridx++; - c.weightx = 1.0; - c.anchor = GridBagConstraints.LINE_START; - upPanel.add(proxyAuthPasswordTB, c); + public void proxyAuthPasswordCheckHighlight(boolean enabled) + { + proxyAuthPasswordCheckHighlight(enabled, false); + } - c.gridx++; - c.weightx = 0.4; - c.anchor = GridBagConstraints.LINE_START; - upPanel.add(passwordNotStoredLabel, c); + public void proxyAuthPasswordCheckHighlight(boolean enabled, + boolean grabFocus) + { + if (enabled && proxyType.isSelected(customProxy.getModel()) + && proxyAuth.isSelected() + && !proxyAuthUsernameTB.getText().isEmpty() + && proxyAuthPasswordPB.getDocument().getLength() == 0) + { + if (grabFocus) + proxyAuthPasswordPB.grabFocus(); + proxyAuthPasswordPB.setBackground(Color.PINK); + } + else + { + proxyAuthPasswordPB.setBackground(Color.WHITE); + } + } - gbc.gridy++; - proxyPanel.add(upPanel, gbc); + public void applyProxyButtonEnabled(boolean enabled) + { + applyProxyButton.setEnabled(enabled); + } - return proxyPanel; + public void saveProxySettings() + { + // overridden in Preferences } private String displayUserHostPort(String user, String host, String port) @@ -1517,7 +1681,6 @@ public class GPreferences extends JPanel { boolean selected = structFromPdb.isSelected(); // enable other options only when the first is checked - useRnaView.setEnabled(selected); addSecondaryStructure.setEnabled(selected); addTempFactor.setEnabled(selected); } @@ -1526,12 +1689,6 @@ public class GPreferences extends JPanel // indent checkboxes that are conditional on the first one ypos += lineSpacing; - useRnaView.setFont(LABEL_FONT); - useRnaView.setText(MessageManager.getString("label.use_rnaview")); - useRnaView.setBounds(new Rectangle(25, ypos, width, height)); - structureTab.add(useRnaView); - - ypos += lineSpacing; addSecondaryStructure.setFont(LABEL_FONT); addSecondaryStructure .setText(MessageManager.getString("label.autoadd_secstr")); @@ -1575,11 +1732,13 @@ public class GPreferences extends JPanel ypos += lineSpacing; structureViewerPathLabel = new JLabel(); - structureViewerPathLabel.setFont(LABEL_FONT);// new Font("SansSerif", 0, 11)); + structureViewerPathLabel.setFont(LABEL_FONT);// new Font("SansSerif", 0, + // 11)); structureViewerPathLabel.setHorizontalAlignment(SwingConstants.LEFT); structureViewerPathLabel.setText(MessageManager .formatMessage("label.viewer_path", "Chimera(X)")); - structureViewerPathLabel.setBounds(new Rectangle(10, ypos, 170, height)); + structureViewerPathLabel + .setBounds(new Rectangle(10, ypos, 170, height)); structureViewerPathLabel.setEnabled(false); structureTab.add(structureViewerPathLabel); @@ -1637,14 +1796,14 @@ public class GPreferences extends JPanel /* * hide Chimera options in JalviewJS */ - if (Platform.isJS()) + if (Platform.isJS()) { structureViewerPathLabel.setVisible(false); structureViewerPath.setVisible(false); viewerLabel.setVisible(false); structViewer.setVisible(false); } - + return structureTab; } @@ -1658,8 +1817,8 @@ public class GPreferences extends JPanel } /** - * Show a dialog for the user to choose a file. Returns the chosen path, or - * null on Cancel. + * Show a dialog for the user to choose a file. Returns the chosen path, or null + * on Cancel. * * @return */ @@ -1668,6 +1827,14 @@ public class GPreferences extends JPanel String choice = null; JFileChooser chooser = new JFileChooser(); + // Enable appBundleIsTraversable in macOS FileChooser to allow selecting + // hidden executables within .app dirs + if (Platform.isMac()) + { + chooser.putClientProperty("JFileChooser.appBundleIsTraversable", + true); + } + // chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.getString("label.open_local_file")); @@ -2021,13 +2188,13 @@ 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; } @@ -2039,8 +2206,8 @@ public class GPreferences extends JPanel { BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry .getSavedBackupEntry(); - enableBackupFiles - .setSelected(Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS())); + enableBackupFiles.setSelected( + Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS())); BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry .createBackupFilesPresetEntry(Cache @@ -2064,6 +2231,19 @@ public class GPreferences extends JPanel updateBackupFilesExampleLabel(); } + /* + * Load the saved Memory settings + */ + protected void loadLastSavedMemorySettings() + { + customiseMemorySetting.setSelected( + Cache.getDefault(MemorySetting.CUSTOMISED_SETTINGS, false)); + jvmMemoryPercentSlider + .setValue(Cache.getDefault(MemorySetting.MEMORY_JVMMEMPC, 90)); + jvmMemoryMaxTextField.setText( + Cache.getDefault(MemorySetting.MEMORY_JVMMEMMAX, "32g")); + } + private boolean warnAboutSuffixReverseChange() { BackupFilesPresetEntry bfpe = BackupFilesPresetEntry @@ -2081,6 +2261,285 @@ public class GPreferences extends JPanel && nowSuffixTemplate.equals(savedSuffixTemplate); } + /* Initialises the Startup tabbed panel. + * + * @return + * */ + + private JPanel initStartupTab() + { + JPanel startupTab = new JPanel(); + startupTab.setBorder( + new TitledBorder(MessageManager.getString("label.memory"))); + startupTab.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 0.0; + gbc.weighty = 0.0; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + gbc.fill = GridBagConstraints.NONE; + + initMemoryPanel(); + + gbc.gridheight = 1; + gbc.gridwidth = 3; + + gbc.gridy = 0; // row 1 + gbc.gridx = 0; + JLabel memoryText = new JLabel(); + memoryText.setFont(LABEL_FONT_ITALIC); + memoryText + .setText(MessageManager.getString("label.memory_setting_text")); + startupTab.add(memoryText, gbc); + + gbc.gridy++; // row 2 + gbc.gridx = 0; + JPanel exampleMemoryPanel = new JPanel(); + exampleMemoryPanel + .setLayout(new BoxLayout(exampleMemoryPanel, BoxLayout.Y_AXIS)); + exampleMemoryPanel.setToolTipText(JvSwingUtils.wrapTooltip(true, + MessageManager.getString("label.memory_example_tooltip"))); + JLabel exampleTextLabel = new JLabel(); + exampleTextLabel + .setText(MessageManager.getString("label.memory_example_text")); + exampleTextLabel.setForeground(Color.GRAY); + exampleTextLabel.setFont(LABEL_FONT); + exampleMemoryPanel.add(exampleTextLabel); + exampleMemoryPanel.add(exampleMemoryLabel); + exampleMemoryPanel.setBackground(Color.WHITE); + exampleMemoryPanel.setBorder(BorderFactory.createEtchedBorder()); + startupTab.add(exampleMemoryPanel, gbc); + + gbc.gridy++; // row 3 + gbc.gridx = 0; + startupTab.add(customiseMemorySetting, gbc); + + gbc.gridy += 2; // row 4 with a gap + gbc.gridx = 0; + startupTab.add(maxMemoryLabel, gbc); + + gbc.gridy += 2; // row 5 + gbc.gridx = 0; + gbc.gridwidth = 1; + startupTab.add(jvmMemoryPercentLabel, gbc); + gbc.gridx++; + startupTab.add(jvmMemoryPercentSlider, gbc); + gbc.gridx++; + // gbc.weightx = 0.1; + startupTab.add(jvmMemoryPercentDisplay, gbc); + // gbc.weightx = 1.0; + gbc.gridwidth = 3; + + gbc.gridy++; // row 6 + gbc.gridx = 0; + startupTab.add(jvmMemoryMaxLabel, gbc); + gbc.gridx++; + startupTab.add(jvmMemoryMaxTextField, gbc); + + gbc.gridy++; // row 7 + gbc.gridx = 0; + gbc.gridwidth = 4; + exampleMemoryMessageTextArea.setBackground(startupTab.getBackground()); + JScrollPane sp = new JScrollPane(exampleMemoryMessageTextArea); + sp.setBorder(BorderFactory.createEmptyBorder()); + sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + startupTab.add(sp, gbc); + + // fill empty space to push widget to top left + gbc.gridy++; + gbc.weighty = 1.0; + gbc.gridx = 100; + gbc.gridwidth = 1; + gbc.weightx = 1.0; + startupTab.add(new JPanel(), gbc); + + setMemoryPercentDisplay(); + memoryOptionsSetEnabled(); + return startupTab; + } + + private void initMemoryPanel() + { + // Enable memory settings checkbox + customiseMemorySetting.setFont(LABEL_FONT_BOLD); + customiseMemorySetting.setText( + MessageManager.getString("label.customise_memory_settings")); + customiseMemorySetting.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + memoryOptionsSetEnabled(); + } + }); + + loadLastSavedMemorySettings(); + + exampleMemoryLabel.setFont(LABEL_FONT_BOLD); + exampleMemoryLabel.setBackground(Color.WHITE); + + maxMemoryLabel = new JLabel( + MessageManager.getString("label.maximum_memory_used")); + maxMemoryLabel.setFont(LABEL_FONT_BOLD); + + // Maximum memory percentage slider + jvmMemoryPercentLabel.setFont(LABEL_FONT); + jvmMemoryPercentLabel.setText( + MessageManager.getString("label.percent_of_physical_memory")); + jvmMemoryPercentSlider.setPaintLabels(true); + jvmMemoryPercentSlider.setPaintTicks(true); + jvmMemoryPercentSlider.setPaintTrack(true); + jvmMemoryPercentSlider.setMajorTickSpacing(50); + jvmMemoryPercentSlider.setMinorTickSpacing(10); + jvmMemoryPercentSlider.addChangeListener(new ChangeListener() + { + @Override + public void stateChanged(ChangeEvent e) + { + setMemoryPercentDisplay(); + } + }); + jvmMemoryPercentDisplay.setFont(LABEL_FONT); + setMemoryPercentDisplay(); + + // Maximum memory cap textbox + jvmMemoryMaxLabel.setFont(LABEL_FONT); + jvmMemoryMaxLabel + .setText(MessageManager.getString("label.maximum_memory")); + initMemoryMaxTextField(); + + exampleMemoryMessageTextArea.setFont(LABEL_FONT_ITALIC); + exampleMemoryMessageTextArea.setForeground(Color.GRAY); + exampleMemoryMessageTextArea.setEditable(false); + exampleMemoryMessageTextArea.setLineWrap(true); + exampleMemoryMessageTextArea.setWrapStyleWord(true); + exampleMemoryMessageTextArea.setText(" "); + exampleMemoryMessageTextArea.setRows(2); + exampleMemoryMessageTextArea.setColumns(40); + + setExampleMemoryLabel(); + } + + private void initMemoryMaxTextField() + { + jvmMemoryMaxTextField.setToolTipText( + MessageManager.getString("label.maximum_memory_tooltip")); + jvmMemoryMaxTextField.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent arg0) + { + validateMemoryMaxTextField(); + setExampleMemoryLabel(); + } + }); + + jvmMemoryMaxTextField.addKeyListener(new KeyListener() + { + @Override + public void keyReleased(KeyEvent e) + { + validateMemoryMaxTextField(); + setExampleMemoryLabel(); + } + + @Override + public void keyPressed(KeyEvent e) + { + } + + // try and stop invalid typing + @Override + public void keyTyped(KeyEvent e) + { + char c = Character.toLowerCase(e.getKeyChar()); + String text = jvmMemoryMaxTextField.getText(); + String suffixes = "tgmkb"; + int pos = jvmMemoryMaxTextField.getCaretPosition(); + int suffixPos = StringUtils.firstCharPosIgnoreCase(text, suffixes); + if (!((('0' <= c && c <= '9') + && (suffixPos == -1 || pos <= suffixPos)) // digits only allowed + // before suffix + || (suffixes.indexOf(Character.toLowerCase(c)) >= 0 // valid + // suffix + && pos == text.length() // at end of text and + && suffixPos == -1) // there isn't already one + )) + { + // don't process + e.consume(); + } + } + }); + } + + private boolean isMemoryMaxTextFieldValid() + { + return MemorySetting + .isValidMemoryString(jvmMemoryMaxTextField.getText()); + } + + private void validateMemoryMaxTextField() + { + if (isMemoryMaxTextFieldValid()) + { + jvmMemoryMaxTextField.setBackground(Color.WHITE); + } + else + { + jvmMemoryMaxTextField.setBackground(Color.PINK); + } + } + + private void setMemoryPercentDisplay() + { + jvmMemoryPercentDisplay + .setText(jvmMemoryPercentSlider.getValue() + "%"); + setExampleMemoryLabel(); + } + + private void setExampleMemoryLabel() + { + boolean selected = customiseMemorySetting.isSelected(); + int jvmmempc = jvmMemoryPercentSlider.getValue(); + String jvmmemmax = jvmMemoryMaxTextField.getText(); + + long mem; + if (selected && (0 <= jvmmempc && jvmmempc <= 100) + && MemorySetting.isValidMemoryString(jvmmemmax)) + { + mem = MemorySetting.getMemorySetting(jvmmemmax, + String.valueOf(jvmmempc), false, true); + } + else + { + mem = MemorySetting.getMemorySetting(null, null, false, true); + } + exampleMemoryLabel.setText(MemorySetting.memoryLongToString(mem)); + String message = MemorySetting.getAdjustmentMessage(); + exampleMemoryMessageTextArea.setText( + MessageManager.getString("label.adjustments_for_this_computer") + + ": " + + (message == null + ? MessageManager.getString("label.none") + : message)); + } + + private void memoryOptionsSetEnabled() + { + boolean enabled = customiseMemorySetting.isSelected(); + // leave exampleMemoryLabel enabled always + maxMemoryLabel.setEnabled(enabled); + jvmMemoryPercentLabel.setEnabled(enabled); + jvmMemoryPercentSlider.setEnabled(enabled); + jvmMemoryPercentDisplay.setEnabled(enabled); + jvmMemoryMaxLabel.setEnabled(enabled); + jvmMemoryMaxTextField.setEnabled(enabled); + exampleMemoryMessageTextArea.setEnabled(enabled); + setExampleMemoryLabel(); + } + /** * Initialises the Backups tabbed panel. * @@ -2117,7 +2576,6 @@ public class GPreferences extends JPanel } }); - // enable checkbox 1 col gbc.gridwidth = 1; gbc.gridheight = 1; @@ -2190,8 +2648,8 @@ public class GPreferences extends JPanel presetsComboLabel = new JLabel(title + ":"); presetsPanel.add(presetsComboLabel, gbc); - List entries = Arrays - .asList((Object[]) BackupFilesPresetEntry.backupfilesPresetEntries); + List entries = Arrays.asList( + (Object[]) BackupFilesPresetEntry.backupfilesPresetEntries); List tooltips = Arrays.asList( BackupFilesPresetEntry.backupfilesPresetEntryDescriptions); backupfilesPresetsCombo = JvSwingUtils.buildComboWithTooltips(entries, @@ -2218,7 +2676,8 @@ public class GPreferences extends JPanel { if (customiseCheckbox.isSelected()) { - // got here by clicking on customiseCheckbox so don't change the values + // got here by clicking on customiseCheckbox so don't change the + // values backupfilesCustomOptionsSetEnabled(); } else @@ -2297,13 +2756,11 @@ public class GPreferences extends JPanel private JPanel initBackupsTabFilenameExamplesPanel() { - String title = MessageManager - .getString("label.scheme_examples"); + 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()); @@ -2364,8 +2821,7 @@ public class GPreferences extends JPanel } protected void setComboIntStringKey( - JComboBox backupfilesPresetsCombo2, - int key) + JComboBox backupfilesPresetsCombo2, int key) { for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++) { @@ -2635,9 +3091,8 @@ public class GPreferences extends JPanel JPanel jp = new JPanel(); jp.setLayout(new FlowLayout()); - oldBackupFilesLabel - .setText(MessageManager - .getString("label.autodelete_old_backup_files")); + oldBackupFilesLabel.setText( + MessageManager.getString("label.autodelete_old_backup_files")); oldBackupFilesLabel.setFont(LABEL_FONT); oldBackupFilesLabel.setHorizontalAlignment(SwingConstants.LEFT); jp.add(oldBackupFilesLabel); @@ -2797,7 +3252,8 @@ public class GPreferences extends JPanel } - // add some extra empty lines to pad out the example files box. ugh, please tell + // 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) @@ -2876,8 +3332,7 @@ public class GPreferences extends JPanel private void backupfilesKeepAllSetEnabled(boolean tryEnabled) { boolean enabled = tryEnabled && enableBackupFiles.isSelected() - && customiseCheckbox.isSelected() - && suffixTemplate.getText() + && customiseCheckbox.isSelected() && suffixTemplate.getText() .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1; keepfilesPanel.setEnabled(enabled); backupfilesKeepAll.setEnabled(enabled); @@ -3031,7 +3486,7 @@ public class GPreferences extends JPanel * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void ok_actionPerformed(ActionEvent e) { @@ -3041,7 +3496,7 @@ public class GPreferences extends JPanel * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void cancel_actionPerformed(ActionEvent e) { @@ -3051,7 +3506,7 @@ public class GPreferences extends JPanel * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void annotations_actionPerformed(ActionEvent e) { @@ -3096,7 +3551,7 @@ public class GPreferences extends JPanel proxyAuthPasswordLabel.setEnabled(enabled); passwordNotStoredLabel.setEnabled(enabled); proxyAuthUsernameTB.setEnabled(enabled); - proxyAuthPasswordTB.setEnabled(enabled); + proxyAuthPasswordPB.setEnabled(enabled); } public void setCustomProxyEnabled() @@ -3119,11 +3574,15 @@ public class GPreferences extends JPanel public void proxyType_actionPerformed() { setCustomProxyEnabled(); + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); } public void proxyAuth_actionPerformed() { setProxyAuthEnabled(); + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); } /** @@ -3198,4 +3657,3 @@ public class GPreferences extends JPanel } } -