X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGPreferences.java;h=d281c8d824ce70476d2a3184da97d6baf55fbb2a;hb=cb8e52fbbc5f725e3f7f48c672cdddb0690bd978;hp=5685e844bb8bd7220f1a7ec1e1c3996f8f458fa5;hpb=e0eedaf4fedaaa46439f40226637376c8eb268be;p=jalview.git diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index 5685e84..d281c8d 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -20,21 +20,6 @@ */ 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.BackupFilenameParts; -import jalview.io.BackupFiles; -import jalview.io.BackupFilesPresetEntry; -import jalview.io.IntKeyStringValueEntry; -import jalview.util.MessageManager; - import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -53,9 +38,12 @@ 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.AbstractCellEditor; import javax.swing.BorderFactory; +import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; @@ -64,8 +52,10 @@ import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; 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; @@ -81,9 +71,30 @@ 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.Console; +import jalview.bin.MemorySetting; +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.BackupFilenameParts; +import jalview.io.BackupFiles; +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. * @@ -169,15 +180,15 @@ 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(); protected JComboBox structViewer = new JComboBox<>(); - protected JTextField chimeraPath = new JTextField(); + protected JLabel structureViewerPathLabel; + + protected JTextField structureViewerPath = new JTextField(); protected ButtonGroup mappingMethod = new ButtonGroup(); @@ -212,6 +223,8 @@ public class GPreferences extends JPanel /* * Connections tab components */ + protected JPanel connectTab; + protected JTable linkUrlTable = new JTable(); protected JButton editLink = new JButton(); @@ -224,17 +237,49 @@ public class GPreferences extends JPanel protected JButton userOnly = new JButton(); + protected JLabel httpLabel = new JLabel(); + + protected JLabel httpsLabel = new JLabel(); + protected JLabel portLabel = new JLabel(); protected JLabel serverLabel = new JLabel(); - protected JTextField proxyServerTB = new JTextField(); + protected JLabel portLabel2 = new JLabel(); + + protected JLabel serverLabel2 = new JLabel(); + + protected JLabel proxyAuthUsernameLabel = new JLabel(); + + protected JLabel proxyAuthPasswordLabel = new JLabel(); + + protected JLabel passwordNotStoredLabel = new JLabel(); + + protected JTextField proxyServerHttpTB = new JTextField(); + + protected JTextField proxyPortHttpTB = new JTextField(); - protected JTextField proxyPortTB = new JTextField(); + protected JTextField proxyServerHttpsTB = new JTextField(); + + protected JTextField proxyPortHttpsTB = new JTextField(); + + protected JCheckBox proxyAuth = new JCheckBox(); + + protected JTextField proxyAuthUsernameTB = new JTextField(); + + protected JPasswordField proxyAuthPasswordPB = new JPasswordField(); protected JTextField defaultBrowser = new JTextField(); - protected JCheckBox useProxy = new JCheckBox(); + protected ButtonGroup proxyType = new ButtonGroup(); + + protected JRadioButton noProxy = new JRadioButton(); + + protected JRadioButton systemProxy = new JRadioButton(); + + protected JRadioButton customProxy = new JRadioButton(); + + protected JButton applyProxyButton = new JButton(); protected JCheckBox usagestats = new JCheckBox(); @@ -247,6 +292,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(); @@ -301,7 +350,7 @@ public class GPreferences extends JPanel protected JButton revertButton = new JButton(); - protected JComboBox backupfilesPresetsCombo = new JComboBox<>(); + protected JComboBox backupfilesPresetsCombo = new JComboBox<>(); private int backupfilesPresetsComboLastSelected = 0; @@ -331,6 +380,34 @@ 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. */ @@ -352,8 +429,12 @@ public class GPreferences extends JPanel */ private void jbInit() throws Exception { - final JTabbedPane tabbedPane = new JTabbedPane(); + // final JTabbedPane tabbedPane = new JTabbedPane(); this.setLayout(new BorderLayout()); + + // message label at top + this.add(messageLabel, BorderLayout.NORTH); + JPanel okCancelPanel = initOkCancelPanel(); this.add(tabbedPane, BorderLayout.CENTER); this.add(okCancelPanel, BorderLayout.SOUTH); @@ -373,8 +454,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")); @@ -385,15 +469,22 @@ 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. */ - 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 * Structure. + * Adding a clearMessage() so messages are cleared when changing tabs. */ tabbedPane.addChangeListener(new ChangeListener() { @@ -412,11 +503,63 @@ 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: + } + } + /** * Initialises the Editing tabbed panel. * @@ -447,7 +590,7 @@ public class GPreferences extends JPanel } /** - * Initialises the Output tabbed panel. + * Initialises the Output tab * * @return */ @@ -455,18 +598,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") + " "); @@ -483,7 +643,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); @@ -502,7 +662,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() { @@ -520,10 +680,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() { @@ -536,10 +696,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)); + embbedBioJSON.setBounds(new Rectangle(228, 248, 250, 23)); jPanel11.add(jLabel1); jPanel11.add(blcjv); @@ -553,9 +713,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; } @@ -567,7 +737,7 @@ public class GPreferences extends JPanel */ private JPanel initConnectionsTab() { - JPanel connectTab = new JPanel(); + connectTab = new JPanel(); connectTab.setLayout(new GridBagLayout()); // Label for browser text box @@ -627,6 +797,8 @@ public class GPreferences extends JPanel GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 2, 5, 5), 70, 1)); + versioncheck.setVisible(false); + // Add padding so the panel doesn't look ridiculous JPanel spacePanel = new JPanel(); connectTab.add(spacePanel, @@ -836,63 +1008,366 @@ public class GPreferences extends JPanel private JPanel initConnTabProxyPanel() { // Label for server text box - serverLabel.setText(MessageManager.getString("label.address")); + serverLabel.setText(MessageManager.getString("label.host") + ": "); serverLabel.setHorizontalAlignment(SwingConstants.RIGHT); serverLabel.setFont(LABEL_FONT); + serverLabel2.setText(MessageManager.getString("label.host") + ": "); + serverLabel2.setHorizontalAlignment(SwingConstants.RIGHT); + serverLabel2.setFont(LABEL_FONT); // Proxy server and port text boxes - proxyServerTB.setFont(LABEL_FONT); - proxyPortTB.setFont(LABEL_FONT); + proxyServerHttpTB.setFont(LABEL_FONT); + proxyServerHttpTB.setColumns(40); + proxyPortHttpTB.setFont(LABEL_FONT); + proxyPortHttpTB.setColumns(4); + proxyServerHttpsTB.setFont(LABEL_FONT); + proxyServerHttpsTB.setColumns(40); + proxyPortHttpsTB.setFont(LABEL_FONT); + proxyPortHttpsTB.setColumns(4); + proxyAuthUsernameTB.setFont(LABEL_FONT); + proxyAuthUsernameTB.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); portLabel.setHorizontalAlignment(SwingConstants.RIGHT); - portLabel.setText(MessageManager.getString("label.port")); - - // Use proxy server checkbox - useProxy.setFont(LABEL_FONT); - useProxy.setHorizontalAlignment(SwingConstants.RIGHT); - useProxy.setHorizontalTextPosition(SwingConstants.LEADING); - useProxy.setText(MessageManager.getString("label.use_proxy_server")); - useProxy.addActionListener(new ActionListener() + portLabel.setText(MessageManager.getString("label.port") + ": "); + portLabel2.setFont(LABEL_FONT); + portLabel2.setHorizontalAlignment(SwingConstants.RIGHT); + portLabel2.setText(MessageManager.getString("label.port") + ": "); + + httpLabel.setText("HTTP"); + httpLabel.setFont(LABEL_FONT_BOLD); + httpLabel.setHorizontalAlignment(SwingConstants.LEFT); + httpsLabel.setText("HTTPS"); + httpsLabel.setFont(LABEL_FONT_BOLD); + httpsLabel.setHorizontalAlignment(SwingConstants.LEFT); + + proxyAuthUsernameLabel + .setText(MessageManager.getString("label.username") + ": "); + proxyAuthUsernameLabel.setFont(LABEL_FONT); + proxyAuthUsernameLabel.setHorizontalAlignment(SwingConstants.RIGHT); + proxyAuthPasswordLabel + .setText(MessageManager.getString("label.password") + ": "); + proxyAuthPasswordLabel.setFont(LABEL_FONT); + proxyAuthPasswordLabel.setHorizontalAlignment(SwingConstants.RIGHT); + passwordNotStoredLabel.setText( + "(" + MessageManager.getString("label.not_stored") + ")"); + passwordNotStoredLabel.setFont(LABEL_FONT_ITALIC); + passwordNotStoredLabel.setHorizontalAlignment(SwingConstants.LEFT); + + // Proxy type radio buttons + noProxy.setFont(LABEL_FONT); + noProxy.setHorizontalAlignment(SwingConstants.LEFT); + noProxy.setText(MessageManager.getString("label.no_proxy")); + systemProxy.setFont(LABEL_FONT); + systemProxy.setHorizontalAlignment(SwingConstants.LEFT); + systemProxy.setText(MessageManager.formatMessage("label.system_proxy", + displayUserHostPort(Cache.startupProxyProperties[4], + Cache.startupProxyProperties[0], + Cache.startupProxyProperties[1]), + displayUserHostPort(Cache.startupProxyProperties[6], + Cache.startupProxyProperties[2], + Cache.startupProxyProperties[3]))); + customProxy.setFont(LABEL_FONT); + customProxy.setHorizontalAlignment(SwingConstants.LEFT); + customProxy.setText( + MessageManager.getString("label.use_proxy_server") + ":"); + ActionListener al = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - useProxy_actionPerformed(); + proxyType_actionPerformed(); + } + }; + noProxy.addActionListener(al); + systemProxy.addActionListener(al); + customProxy.addActionListener(al); + proxyType.add(noProxy); + proxyType.add(systemProxy); + proxyType.add(customProxy); + + proxyAuth.setFont(LABEL_FONT); + proxyAuth.setHorizontalAlignment(SwingConstants.LEFT); + proxyAuth.setText(MessageManager.getString("label.auth_required")); + proxyAuth.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + proxyAuth_actionPerformed(); } }); + setCustomProxyEnabled(); + // Make proxy server panel JPanel proxyPanel = new JPanel(); TitledBorder titledBorder1 = new TitledBorder( - MessageManager.getString("label.proxy_server")); + MessageManager.getString("label.proxy_servers")); proxyPanel.setBorder(titledBorder1); proxyPanel.setLayout(new GridBagLayout()); - proxyPanel.add(serverLabel, - new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 2, 2, 0), 5, 0)); - proxyPanel.add(portLabel, - new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 0, 2, 0), 11, 0)); - proxyPanel.add(useProxy, - new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 2, 5, 185), 2, -4)); - proxyPanel.add(proxyPortTB, - new GridBagConstraints(3, 1, 1, 1, 1.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 2, 2, 2), 54, 1)); - proxyPanel.add(proxyServerTB, - new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 2, 2, 0), 263, 1)); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.weightx = 1.0; + + GridBagConstraints c = new GridBagConstraints(); + // Proxy type radio buttons (3) + JPanel ptPanel = new JPanel(); + ptPanel.setLayout(new GridBagLayout()); + c.weightx = 1.0; + c.gridy = 0; + c.gridx = 0; + c.gridwidth = 1; + c.fill = GridBagConstraints.HORIZONTAL; + ptPanel.add(noProxy, c); + c.gridy++; + ptPanel.add(systemProxy, c); + c.gridy++; + ptPanel.add(customProxy, c); + + gbc.gridy = 0; + proxyPanel.add(ptPanel, gbc); + + // host and port text boxes + JPanel hpPanel = new JPanel(); + hpPanel.setLayout(new GridBagLayout()); + // HTTP host port row + c.gridy = 0; + c.gridx = 0; + + c.weightx = 0.1; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(httpLabel, c); + + c.gridx++; + c.weightx = 0.1; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(serverLabel, c); + + c.gridx++; + c.weightx = 1.0; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyServerHttpTB, c); + + c.gridx++; + c.weightx = 0.1; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(portLabel, c); + + c.gridx++; + c.weightx = 0.2; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyPortHttpTB, c); + + // HTTPS host port row + c.gridy++; + c.gridx = 0; + c.gridwidth = 1; + + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(httpsLabel, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(serverLabel2, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyServerHttpsTB, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(portLabel2, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyPortHttpsTB, c); + + gbc.gridy++; + proxyPanel.add(hpPanel, gbc); + + 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++; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.LINE_END; + proxyPanel.add(applyProxyButton, gbc); return proxyPanel; } + public void proxyAuthPasswordCheckHighlight(boolean enabled) + { + proxyAuthPasswordCheckHighlight(enabled, false); + } + + 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); + } + } + + public void applyProxyButtonEnabled(boolean enabled) + { + applyProxyButton.setEnabled(enabled); + } + + public void saveProxySettings() + { + // overridden in Preferences + } + + private String displayUserHostPort(String user, String host, String port) + { + boolean hostBlank = (host == null || host.isEmpty()); + boolean portBlank = (port == null || port.isEmpty()); + if (hostBlank && portBlank) + { + return MessageManager.getString("label.none"); + } + + StringBuilder sb = new StringBuilder(); + if (user != null) + { + sb.append(user.isEmpty() || user.indexOf(" ") > -1 ? '"' + user + '"' + : user); + sb.append("@"); + } + sb.append(hostBlank ? "" : host); + if (!portBlank) + { + sb.append(":"); + sb.append(port); + } + return sb.toString(); + } + /** * Initialises the checkboxes in the Connections tab */ @@ -1191,7 +1666,7 @@ public class GPreferences extends JPanel structureTab.setBorder(new TitledBorder( MessageManager.getString("label.structure_options"))); structureTab.setLayout(null); - final int width = 400; + final int width = 420; final int height = 22; final int lineSpacing = 25; int ypos = 15; @@ -1207,7 +1682,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); } @@ -1216,12 +1690,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")); @@ -1239,13 +1707,19 @@ public class GPreferences extends JPanel viewerLabel.setFont(LABEL_FONT); viewerLabel.setHorizontalAlignment(SwingConstants.LEFT); viewerLabel.setText(MessageManager.getString("label.structure_viewer")); - viewerLabel.setBounds(new Rectangle(10, ypos, 200, height)); + viewerLabel.setBounds(new Rectangle(10, ypos, 220, height)); structureTab.add(viewerLabel); + /* + * add all external viewers as options here - check + * when selected whether the program is installed + */ structViewer.setFont(LABEL_FONT); - structViewer.setBounds(new Rectangle(160, ypos, 120, height)); + structViewer.setBounds(new Rectangle(190, ypos, 120, height)); structViewer.addItem(ViewerType.JMOL.name()); structViewer.addItem(ViewerType.CHIMERA.name()); + structViewer.addItem(ViewerType.CHIMERAX.name()); + structViewer.addItem(ViewerType.PYMOL.name()); structViewer.addActionListener(new ActionListener() { @Override @@ -1258,35 +1732,40 @@ public class GPreferences extends JPanel structureTab.add(structViewer); ypos += lineSpacing; - JLabel pathLabel = new JLabel(); - pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11)); - pathLabel.setHorizontalAlignment(SwingConstants.LEFT); - pathLabel.setText(MessageManager.getString("label.chimera_path")); - pathLabel.setBounds(new Rectangle(10, ypos, 140, height)); - structureTab.add(pathLabel); - - chimeraPath.setFont(LABEL_FONT); - chimeraPath.setText(""); + structureViewerPathLabel = new JLabel(); + 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.setEnabled(false); + structureTab.add(structureViewerPathLabel); + + structureViewerPath.setFont(LABEL_FONT); + structureViewerPath.setText(""); + structureViewerPath.setEnabled(false); final String tooltip = JvSwingUtils.wrapTooltip(true, - MessageManager.getString("label.chimera_path_tip")); - chimeraPath.setToolTipText(tooltip); - chimeraPath.setBounds(new Rectangle(160, ypos, 300, height)); - chimeraPath.addMouseListener(new MouseAdapter() + MessageManager.getString("label.viewer_path_tip")); + structureViewerPath.setToolTipText(tooltip); + structureViewerPath.setBounds(new Rectangle(190, ypos, 290, height)); + structureViewerPath.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) + if (structureViewerPath.isEnabled() && e.getClickCount() == 2) { String chosen = openFileChooser(); if (chosen != null) { - chimeraPath.setText(chosen); + structureViewerPath.setText(chosen); } } } }); - structureTab.add(chimeraPath); + structureTab.add(structureViewerPath); ypos += lineSpacing; nwMapping.setFont(LABEL_FONT); @@ -1301,7 +1780,7 @@ public class GPreferences extends JPanel MessageManager.getString("label.mapping_method")); mmTitledBorder.setTitleFont(LABEL_FONT); mappingPanel.setBorder(mmTitledBorder); - mappingPanel.setBounds(new Rectangle(10, ypos, 452, 45)); + mappingPanel.setBounds(new Rectangle(10, ypos, 472, 45)); // GridLayout mappingLayout = new GridLayout(); mappingPanel.setLayout(new GridLayout()); mappingPanel.add(nwMapping); @@ -1312,9 +1791,20 @@ public class GPreferences extends JPanel ypos += lineSpacing; FTSDataColumnPreferences docFieldPref = new FTSDataColumnPreferences( PreferenceSource.PREFERENCES, PDBFTSRestClient.getInstance()); - docFieldPref.setBounds(new Rectangle(10, ypos, 450, 120)); + docFieldPref.setBounds(new Rectangle(10, ypos, 470, 120)); structureTab.add(docFieldPref); + /* + * hide Chimera options in JalviewJS + */ + if (Platform.isJS()) + { + structureViewerPathLabel.setVisible(false); + structureViewerPath.setVisible(false); + viewerLabel.setVisible(false); + structViewer.setVisible(false); + } + return structureTab; } @@ -1328,8 +1818,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 */ @@ -1338,6 +1828,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")); @@ -1691,6 +2189,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; } @@ -1702,8 +2207,8 @@ public class GPreferences extends JPanel { BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry .getSavedBackupEntry(); - enableBackupFiles - .setSelected(Cache.getDefault(BackupFiles.ENABLED, true)); + enableBackupFiles.setSelected( + Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS())); BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry .createBackupFilesPresetEntry(Cache @@ -1720,25 +2225,24 @@ public class GPreferences extends JPanel setComboIntStringKey(backupfilesPresetsCombo, Cache.getDefault(BackupFiles.NS + "_PRESET", BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT)); - // backupsTabUpdatePresets(); - System.out - .println("LOADLASTSAVEDBACKUPSOPTIONS SETTING BACKUPS OPTIONS"); backupsSetOptions(savedPreset); backupsOptionsSetEnabled(); updateBackupFilesExampleLabel(); } - private void setBackupfilesCustomPreset() + /* + * Load the saved Memory settings + */ + protected void loadLastSavedMemorySettings() { - if (customiseCheckbox.isSelected() && getComboIntStringKey( - backupfilesPresetsCombo) == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM) - { - BackupFilesPresetEntry.backupfilesPresetEntriesValues - .put(BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, - getBackupfilesCurrentEntry()); - } + 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() @@ -1758,6 +2262,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. * @@ -1794,7 +2577,6 @@ public class GPreferences extends JPanel } }); - // enable checkbox 1 col gbc.gridwidth = 1; gbc.gridheight = 1; @@ -1867,11 +2649,19 @@ public class GPreferences extends JPanel 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); + /* for (int i = 0; i < BackupFilesPresetEntry.backupfilesPresetEntries.length; i++) { backupfilesPresetsCombo .addItem(BackupFilesPresetEntry.backupfilesPresetEntries[i]); } + */ backupfilesPresetsCombo.addActionListener(new ActionListener() { @@ -1887,7 +2677,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 @@ -1910,6 +2701,8 @@ public class GPreferences extends JPanel presetsPanel.add(backupfilesPresetsCombo, gbc); revertButton.setText(MessageManager.getString("label.cancel_changes")); + revertButton.setToolTipText( + MessageManager.getString("label.cancel_changes_description")); revertButton.addActionListener(new ActionListener() { @Override @@ -1947,6 +2740,8 @@ public class GPreferences extends JPanel backupfilesCustomOptionsSetEnabled(); } }); + customiseCheckbox.setToolTipText( + MessageManager.getString("label.customise_description")); // customise checkbox gbc.gridx = 0; @@ -1962,13 +2757,11 @@ public class GPreferences extends JPanel private JPanel initBackupsTabFilenameExamplesPanel() { - String title = MessageManager - .getString("label.summary_of_backups_scheme"); + 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()); @@ -1989,8 +2782,8 @@ public class GPreferences extends JPanel { IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo .getSelectedItem(); - int key = entry.getKey(); - String value = entry.getValue(); + int key = entry.k; + String value = entry.v; if (BackupFilesPresetEntry.backupfilesPresetEntriesValues .containsKey(key)) @@ -2001,7 +2794,7 @@ public class GPreferences extends JPanel } else { - System.out.println( + Console.error( "Preset '" + value + "' [key:" + key + "] not implemented"); } @@ -2011,21 +2804,41 @@ public class GPreferences extends JPanel updateBackupFilesExampleLabel(); } - protected int getComboIntStringKey(JComboBox c) + protected int getComboIntStringKey( + JComboBox backupfilesPresetsCombo2) { - IntKeyStringValueEntry e = (IntKeyStringValueEntry) c.getSelectedItem(); - return e != null ? e.getKey() : 0; + IntKeyStringValueEntry e; + try + { + e = (IntKeyStringValueEntry) backupfilesPresetsCombo2 + .getSelectedItem(); + } catch (Exception ex) + { + Console.error( + "Problem casting Combo entry to IntKeyStringValueEntry."); + e = null; + } + return e != null ? e.k : 0; } - protected void setComboIntStringKey(JComboBox c, - int key) + protected void setComboIntStringKey( + JComboBox backupfilesPresetsCombo2, int key) { - for (int i = 0; i < c.getItemCount(); i++) + for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++) { - IntKeyStringValueEntry e = c.getItemAt(i); - if (e.getKey() == key) + IntKeyStringValueEntry e; + try { - c.setSelectedIndex(i); + e = (IntKeyStringValueEntry) backupfilesPresetsCombo2.getItemAt(i); + } catch (Exception ex) + { + Console.error( + "Problem casting Combo entry to IntKeyStringValueEntry. Skipping item. "); + continue; + } + if (e.k == key) + { + backupfilesPresetsCombo2.setSelectedIndex(i); break; } } @@ -2076,7 +2889,6 @@ public class GPreferences extends JPanel @Override public void keyTyped(KeyEvent e) { - int count = 300; char c = e.getKeyChar(); if (c == ':' || c == '/' || c == '\\') { @@ -2280,9 +3092,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); @@ -2442,7 +3253,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) @@ -2465,10 +3277,10 @@ public class GPreferences extends JPanel { try { - i = Integer.parseInt((String) s.getValue()); + i = ((Integer) s.getValue()).intValue(); } catch (Exception e) { - System.out.println( + Console.error( "Exception casting the initial value of s.getValue()"); } } @@ -2484,6 +3296,10 @@ public class GPreferences extends JPanel { max = def; } + if (def < min) + { + def = min; + } SpinnerModel sModel = new SpinnerNumberModel(def, min, max, 1); s.setModel(sModel); @@ -2500,7 +3316,7 @@ public class GPreferences extends JPanel i = (Integer) s.getValue(); } catch (Exception e) { - System.out.println("Failed casting (Integer) JSpinner s.getValue()"); + Console.error("Failed casting (Integer) JSpinner s.getValue()"); } return i; } @@ -2517,8 +3333,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); @@ -2672,7 +3487,7 @@ public class GPreferences extends JPanel * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void ok_actionPerformed(ActionEvent e) { @@ -2682,7 +3497,7 @@ public class GPreferences extends JPanel * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void cancel_actionPerformed(ActionEvent e) { @@ -2692,7 +3507,7 @@ public class GPreferences extends JPanel * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void annotations_actionPerformed(ActionEvent e) { @@ -2730,13 +3545,45 @@ public class GPreferences extends JPanel } - public void useProxy_actionPerformed() + public void setProxyAuthEnabled() { - boolean enabled = useProxy.isSelected(); + boolean enabled = proxyAuth.isSelected() && proxyAuth.isEnabled(); + proxyAuthUsernameLabel.setEnabled(enabled); + proxyAuthPasswordLabel.setEnabled(enabled); + passwordNotStoredLabel.setEnabled(enabled); + proxyAuthUsernameTB.setEnabled(enabled); + proxyAuthPasswordPB.setEnabled(enabled); + } + + public void setCustomProxyEnabled() + { + boolean enabled = customProxy.isSelected(); portLabel.setEnabled(enabled); serverLabel.setEnabled(enabled); - proxyServerTB.setEnabled(enabled); - proxyPortTB.setEnabled(enabled); + portLabel2.setEnabled(enabled); + serverLabel2.setEnabled(enabled); + httpLabel.setEnabled(enabled); + httpsLabel.setEnabled(enabled); + proxyServerHttpTB.setEnabled(enabled); + proxyPortHttpTB.setEnabled(enabled); + proxyServerHttpsTB.setEnabled(enabled); + proxyPortHttpsTB.setEnabled(enabled); + proxyAuth.setEnabled(enabled); + setProxyAuthEnabled(); + } + + public void proxyType_actionPerformed() + { + setCustomProxyEnabled(); + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + public void proxyAuth_actionPerformed() + { + setProxyAuthEnabled(); + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); } /** @@ -2811,4 +3658,3 @@ public class GPreferences extends JPanel } } -