X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGPreferences.java;h=f1a94fc8ec529925c81ae31f958744d675f00345;hb=fac1e8688bbf17fc6138c2a0c21ef12f90ee4c5a;hp=b40380a6189852ab415b70e6ec36f27383c4e60e;hpb=a934d28336923f2966aeac29f7d1a877e5db1cec;p=jalview.git diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index b40380a..f1a94fc 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -51,6 +51,7 @@ 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.JSpinner; @@ -68,6 +69,8 @@ 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; @@ -217,6 +220,8 @@ public class GPreferences extends JPanel /* * Connections tab components */ + protected JPanel connectTab; + protected JTable linkUrlTable = new JTable(); protected JButton editLink = new JButton(); @@ -241,6 +246,12 @@ public class GPreferences extends JPanel 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(); @@ -249,6 +260,12 @@ public class GPreferences extends JPanel 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 ButtonGroup proxyType = new ButtonGroup(); @@ -259,6 +276,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(); @@ -358,6 +377,10 @@ public class GPreferences extends JPanel protected JTextArea backupfilesExampleLabel = new JTextArea(); + private final JTabbedPane tabbedPane = new JTabbedPane(); + + private JLabel messageLabel = new JLabel("", JLabel.CENTER); + /** * Creates a new GPreferences object. */ @@ -379,8 +402,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); @@ -427,6 +454,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() { @@ -445,11 +473,57 @@ 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 final static int CONNECTIONS_TAB = 5; + + public void selectTab(int selectTab) + { + // select a given tab - currently only for Connections + switch (selectTab) + { + case CONNECTIONS_TAB: + tabbedPane.setSelectedComponent(connectTab); + break; + default: + } + } + /** * Initialises the Editing tabbed panel. * @@ -627,7 +701,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 @@ -914,6 +988,62 @@ public class GPreferences extends JPanel 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); @@ -930,139 +1060,243 @@ public class GPreferences extends JPanel 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.setHorizontalTextPosition(SwingConstants.LEADING); noProxy.setText(MessageManager.getString("label.no_proxy")); systemProxy.setFont(LABEL_FONT); systemProxy.setHorizontalAlignment(SwingConstants.LEFT); - // systemProxy.setHorizontalTextPosition(SwingConstants.LEADING); systemProxy.setText(MessageManager.formatMessage("label.system_proxy", - displayHostPort(Cache.startupProxyProperties[0], + displayUserHostPort(Cache.startupProxyProperties[4], + Cache.startupProxyProperties[0], Cache.startupProxyProperties[1]), - displayHostPort(Cache.startupProxyProperties[2], + displayUserHostPort(Cache.startupProxyProperties[6], + Cache.startupProxyProperties[2], Cache.startupProxyProperties[3]))); customProxy.setFont(LABEL_FONT); customProxy.setHorizontalAlignment(SwingConstants.LEFT); - // customProxy.setHorizontalTextPosition(SwingConstants.LEADING); - customProxy.addActionListener(new ActionListener() + customProxy.setText( + MessageManager.getString("label.use_proxy_server") + ":"); + ActionListener al = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - customProxy_actionPerformed(); + proxyType_actionPerformed(); } - }); - customProxy.setText( - MessageManager.getString("label.use_proxy_server") + ":"); + }; + 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); - GridBagConstraints gbc = new GridBagConstraints(); proxyPanel.setLayout(new GridBagLayout()); - - gbc.gridx = 0; - gbc.gridy = 0; + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1.0; - gbc.gridheight = 1; - gbc.anchor = GridBagConstraints.WEST; - gbc.fill = GridBagConstraints.BOTH; - gbc.gridwidth = 5; - proxyPanel.add(noProxy, gbc); + 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++; - proxyPanel.add(systemProxy, gbc); + 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(customProxy, gbc); + proxyPanel.add(hpPanel, gbc); - gbc.gridwidth = 1; + // Require authentication checkbox gbc.gridy++; - gbc.gridx = 0; - gbc.weightx = 0.1; - proxyPanel.add(httpLabel, gbc); - - gbc.gridx++; - gbc.anchor = GridBagConstraints.EAST; - gbc.weightx = 0.15; - proxyPanel.add(serverLabel, gbc); - - gbc.gridx++; - gbc.anchor = GridBagConstraints.WEST; - gbc.weightx = 0.5; - proxyPanel.add(proxyServerHttpTB, gbc); - - gbc.gridx++; - gbc.anchor = GridBagConstraints.EAST; - gbc.weightx = 0.15; - proxyPanel.add(portLabel, gbc); - - gbc.gridx++; - gbc.anchor = GridBagConstraints.WEST; - gbc.weightx = 0.1; - proxyPanel.add(proxyPortHttpTB, gbc); + 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++; - gbc.gridx = 0; - gbc.anchor = GridBagConstraints.WEST; - gbc.weightx = 0.1; - proxyPanel.add(httpsLabel, gbc); + proxyPanel.add(upPanel, gbc); - gbc.gridx++; - gbc.anchor = GridBagConstraints.EAST; - gbc.weightx = 0.15; - proxyPanel.add(serverLabel2, gbc); + 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); - gbc.gridx++; - gbc.anchor = GridBagConstraints.WEST; - gbc.weightx = 0.5; - proxyPanel.add(proxyServerHttpsTB, gbc); + return proxyPanel; + } - gbc.gridx++; - gbc.anchor = GridBagConstraints.EAST; - gbc.weightx = 0.15; - proxyPanel.add(portLabel2, gbc); + public void proxyAuthPasswordCheckHighlight(boolean enabled) + { + proxyAuthPasswordCheckHighlight(enabled, false); + } - gbc.gridx++; - gbc.anchor = GridBagConstraints.WEST; - gbc.weightx = 0.1; - proxyPanel.add(proxyPortHttpsTB, gbc); + 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); + } + } - /* - 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)); - */ + public void applyProxyButtonEnabled(boolean enabled) + { + applyProxyButton.setEnabled(enabled); + } - return proxyPanel; + public void saveProxySettings() + { + // overridden in Preferences } - private String displayHostPort(String host, String port) + private String displayUserHostPort(String user, String host, String port) { boolean hostBlank = (host == null || host.isEmpty()); boolean portBlank = (port == null || port.isEmpty()); @@ -1072,6 +1306,12 @@ public class GPreferences extends JPanel } StringBuilder sb = new StringBuilder(); + if (user != null) + { + sb.append(user.isEmpty() || user.indexOf(" ") > -1 ? '"' + user + '"' + : user); + sb.append("@"); + } sb.append(hostBlank ? "" : host); if (!portBlank) { @@ -2967,17 +3207,45 @@ public class GPreferences extends JPanel } - public void customProxy_actionPerformed() + public void setProxyAuthEnabled() + { + 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); + 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); } /**