/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.visualvm.modules.appui.options;
import com.sun.tools.visualvm.core.options.UISupport;
import com.sun.tools.visualvm.core.ui.components.SectionSeparator;
import com.sun.tools.visualvm.core.ui.components.Spacer;
import com.sun.tools.visualvm.uisupport.JExtendedSpinner;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.openide.awt.Mnemonics;
import org.openide.util.NbBundle;
/**
*
* @author Jiri Sedlacek
*/
class NetworkOptionsPanel extends JPanel {
private final NetworkOptionsPanelController controller;
private boolean passwordChanged;
NetworkOptionsPanel(NetworkOptionsPanelController controller) {
this.controller = controller;
initComponents();
initListeners();
}
void update() {
NetworkOptionsModel model = controller.getModel();
switch (model.getProxyType()) {
case ProxySettings.DIRECT_CONNECTION:
noProxyRadio.setSelected(true);
break;
case ProxySettings.AUTO_DETECT_PROXY:
case ProxySettings.AUTO_DETECT_PAC:
systemProxyRadio.setSelected(true);
break;
case ProxySettings.MANUAL_SET_PROXY:
manualProxyRadio.setSelected(true);
break;
default:
throw new IllegalArgumentException("Unknown proxy configuration"); // NOI18N
}
httpProxyField.setText(model.getHttpProxyHost());
httpProxySpinnerModel.setValue(Integer.parseInt(model.getHttpProxyPort()));
sameSettingsCheckBox.setSelected(model.useProxyAllProtocols());
httpsProxyField.setText(model.getHttpsProxyHost());
httpsProxySpinnerModel.setValue(Integer.parseInt(model.getHttpsProxyPort()));
socksProxyField.setText(model.getSocksHost());
socksProxySpinnerModel.setValue(Integer.parseInt(model.getSocksPort()));
noProxyField.setText(model.getNonProxyHosts());
authenticationCheckBox.setSelected(model.useProxyAuthentication());
usernameField.setText(model.getProxyAuthenticationUsername());
passwordField.setText(new String(model.getProxyAuthenticationPassword()));
updateManualSettings(); // #581
}
void applyChanges() {
NetworkOptionsModel model = controller.getModel();
if (noProxyRadio.isSelected()) {
model.setProxyType(ProxySettings.DIRECT_CONNECTION);
} else if (systemProxyRadio.isSelected()) {
model.setProxyType(ProxySettings.AUTO_DETECT_PROXY);
} else if (manualProxyRadio.isSelected()) {
model.setProxyType(ProxySettings.MANUAL_SET_PROXY);
} else {
throw new IllegalArgumentException("Unknown proxy configuration"); // NOI18N
}
model.setHttpProxyHost(httpProxyField.getText().trim());
model.setHttpProxyPort(httpProxySpinnerModel.getValue().toString());
model.setUseProxyAllProtocols(sameSettingsCheckBox.isSelected());
model.setHttpsProxyHost(httpsProxyField.getText().trim());
model.setHttpsProxyPort(httpsProxySpinnerModel.getValue().toString());
model.setSocksHost(socksProxyField.getText().trim());
model.setSocksPort(socksProxySpinnerModel.getValue().toString());
model.setNonProxyHosts(noProxyField.getText().trim());
model.setUseProxyAuthentication(authenticationCheckBox.isSelected());
model.setAuthenticationUsername(usernameField.getText());
model.setAuthenticationPassword(passwordField.getPassword());
passwordChanged = false;
}
void cancel() {
}
boolean dataValid() {
return true;
}
boolean isChanged() {
NetworkOptionsModel model = controller.getModel();
int proxyType = model.getProxyType();
if (noProxyRadio.isSelected() &&
proxyType != ProxySettings.DIRECT_CONNECTION) return true;
if (systemProxyRadio.isSelected() &&
(proxyType != ProxySettings.AUTO_DETECT_PROXY || proxyType != ProxySettings.AUTO_DETECT_PAC)) return true;
if (manualProxyRadio.isSelected() &&
proxyType != ProxySettings.MANUAL_SET_PROXY) return true;
if (!httpProxyField.getText().equals(model.getHttpProxyHost())) return true;
if (!httpProxySpinnerModel.getValue().toString().equals(model.getHttpProxyPort())) return true;
if (sameSettingsCheckBox.isSelected() != model.useProxyAllProtocols()) return true;
if (!httpsProxyField.getText().equals(model.getHttpsProxyHost())) return true;
if (!httpsProxySpinnerModel.getValue().toString().equals(model.getHttpsProxyPort())) return true;
if (!socksProxyField.getText().equals(model.getSocksHost())) return true;
if (!socksProxySpinnerModel.getValue().toString().equals(model.getSocksPort())) return true;
if (!noProxyField.getText().equals(model.getNonProxyHosts())) return true;
if (authenticationCheckBox.isSelected() != model.useProxyAuthentication()) return true;
if (!usernameField.getText().equals(model.getProxyAuthenticationUsername())) return true;
if (passwordChanged) return true;
return false;
}
private void initComponents() {
ButtonGroup radiosGroup = new ButtonGroup();
GridBagConstraints c;
setLayout(new GridBagLayout());
SectionSeparator sectionSeparator = UISupport.createSectionSeparator(
NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_ProxySettingsCaption")); // NOI18N
c = new GridBagConstraints();
c.gridy = 0;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(0, 0, 5, 0);
add(sectionSeparator, c);
noProxyRadio = new JRadioButton();
Mnemonics.setLocalizedText(noProxyRadio, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_NoProxyRadio")); // NOI18N
radiosGroup.add(noProxyRadio);
c = new GridBagConstraints();
c.gridy = 1;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(2, 10, 2, 0);
add(noProxyRadio, c);
systemProxyRadio = new JRadioButton();
Mnemonics.setLocalizedText(systemProxyRadio, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_SystemProxyRadio")); // NOI18N
radiosGroup.add(systemProxyRadio);
c = new GridBagConstraints();
c.gridy = 2;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(2, 10, 2, 0);
add(systemProxyRadio, c);
manualProxyRadio = new JRadioButton();
Mnemonics.setLocalizedText(manualProxyRadio, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_ManualProxyRadio")); // NOI18N
radiosGroup.add(manualProxyRadio);
c = new GridBagConstraints();
c.gridy = 3;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(2, 10, 2, 0);
add(manualProxyRadio, c);
// --- Manual settings -------------------------------------------------
JPanel manualSettingsPanel = new JPanel(new GridBagLayout());
manualSettingsPanel.setBorder(BorderFactory.createEmptyBorder(5, 40, 0, 0));
// --- Http proxy ---
httpProxyLabel = new JLabel();
Mnemonics.setLocalizedText(httpProxyLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_HttpProxy")); // NOI18N
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 0, 3, 5);
manualSettingsPanel.add(httpProxyLabel, c);
httpProxyField = new JTextField();
httpProxyLabel.setLabelFor(httpProxyField);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 0;
c.weightx = 1;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(3, 0, 3, 0);
manualSettingsPanel.add(httpProxyField, c);
httpProxyPortLabel = new JLabel();
Mnemonics.setLocalizedText(httpProxyPortLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_HttpProxyPort")); // NOI18N
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 0;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 8, 3, 5);
manualSettingsPanel.add(httpProxyPortLabel, c);
httpProxySpinnerModel = new SpinnerNumberModel(0, 0, 65535, 1);
httpProxyPortSpinner = new JExtendedSpinner(httpProxySpinnerModel);
httpProxyPortLabel.setLabelFor(httpProxyPortSpinner);
c = new GridBagConstraints();
c.gridx = 3;
c.gridy = 0;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 0, 3, 0);
manualSettingsPanel.add(httpProxyPortSpinner, c);
// --- Use same settings ---
sameSettingsCheckBox = new JCheckBox();
Mnemonics.setLocalizedText(sameSettingsCheckBox, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_SameSettingsCheckbox")); // NOI18N
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 1;
c.anchor = GridBagConstraints.WEST;
c.gridwidth = GridBagConstraints.REMAINDER;
manualSettingsPanel.add(sameSettingsCheckBox, c);
// --- Https proxy ---
httpsProxyLabel = new JLabel();
Mnemonics.setLocalizedText(httpsProxyLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_HttpsProxy")); // NOI18N
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 2;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 0, 3, 5);
manualSettingsPanel.add(httpsProxyLabel, c);
httpsProxyField = new JTextField();
httpsProxyLabel.setLabelFor(httpsProxyField);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 2;
c.weightx = 1;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(3, 0, 3, 0);
manualSettingsPanel.add(httpsProxyField, c);
httpsProxyPortLabel = new JLabel();
Mnemonics.setLocalizedText(httpsProxyPortLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_HttpsProxyPort")); // NOI18N
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 2;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 8, 3, 5);
manualSettingsPanel.add(httpsProxyPortLabel, c);
httpsProxySpinnerModel = new SpinnerNumberModel(0, 0, 65535, 1);
httpsProxyPortSpinner = new JExtendedSpinner(httpsProxySpinnerModel);
httpsProxyPortLabel.setLabelFor(httpsProxyPortSpinner);
c = new GridBagConstraints();
c.gridx = 3;
c.gridy = 2;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 0, 3, 0);
manualSettingsPanel.add(httpsProxyPortSpinner, c);
// --- Socks proxy ---
socksProxyLabel = new JLabel();
Mnemonics.setLocalizedText(socksProxyLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_SocksProxy")); // NOI18N
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 3;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 0, 3, 5);
manualSettingsPanel.add(socksProxyLabel, c);
socksProxyField = new JTextField();
socksProxyLabel.setLabelFor(socksProxyField);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 3;
c.weightx = 1;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(3, 0, 3, 0);
manualSettingsPanel.add(socksProxyField, c);
socksProxyPortLabel = new JLabel();
Mnemonics.setLocalizedText(socksProxyPortLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_SocksProxyPort")); // NOI18N
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 3;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 8, 3, 5);
manualSettingsPanel.add(socksProxyPortLabel, c);
socksProxySpinnerModel = new SpinnerNumberModel(0, 0, 65535, 1);
socksProxyPortSpinner = new JExtendedSpinner(socksProxySpinnerModel);
socksProxyPortLabel.setLabelFor(socksProxyPortSpinner);
c = new GridBagConstraints();
c.gridx = 3;
c.gridy = 3;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 0, 3, 0);
manualSettingsPanel.add(socksProxyPortSpinner, c);
// --- No proxy ---
noProxyLabel = new JLabel();
Mnemonics.setLocalizedText(noProxyLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_NoProxyHosts")); // NOI18N
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 4;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(10, 0, 3, 5);
manualSettingsPanel.add(noProxyLabel, c);
noProxyField = new JTextField();
noProxyLabel.setLabelFor(noProxyField);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 4;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = GridBagConstraints.REMAINDER;
c.insets = new Insets(10, 0, 3, 0);
manualSettingsPanel.add(noProxyField, c);
JLabel noProxyHintLabel = new JLabel();
Mnemonics.setLocalizedText(noProxyHintLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_NoProxyHint")); // NOI18N
noProxyHintLabel.setEnabled(false);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 5;
c.anchor = GridBagConstraints.WEST;
c.gridwidth = GridBagConstraints.REMAINDER;
manualSettingsPanel.add(noProxyHintLabel, c);
// --- Authentication ---
authenticationCheckBox = new JCheckBox();
Mnemonics.setLocalizedText(authenticationCheckBox, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_AuthCheckbox")); // NOI18N
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 6;
c.anchor = GridBagConstraints.WEST;
c.gridwidth = GridBagConstraints.REMAINDER;
c.insets = new Insets(5, 0, 0, 0);
manualSettingsPanel.add(authenticationCheckBox, c);
usernameLabel = new JLabel();
Mnemonics.setLocalizedText(usernameLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_Username")); // NOI18N
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 7;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 30, 3, 5);
manualSettingsPanel.add(usernameLabel, c);
usernameField = new JTextField();
usernameLabel.setLabelFor(usernameField);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 7;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = GridBagConstraints.REMAINDER;
c.insets = new Insets(3, 0, 3, 0);
manualSettingsPanel.add(usernameField, c);
passwordLabel = new JLabel();
Mnemonics.setLocalizedText(passwordLabel, NbBundle.getMessage(NetworkOptionsPanel.class,
"NetworkOptionsPanel_Password")); // NOI18N
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 8;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(3, 30, 0, 5);
manualSettingsPanel.add(passwordLabel, c);
passwordField = new JPasswordField();
passwordLabel.setLabelFor(passwordField);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 8;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = GridBagConstraints.REMAINDER;
c.insets = new Insets(3, 0, 0, 0);
manualSettingsPanel.add(passwordField, c);
// --- Filler ---
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 9;
c.weighty = 1;
c.anchor = GridBagConstraints.NORTHWEST;
c.fill = GridBagConstraints.BOTH;
c.gridwidth = GridBagConstraints.REMAINDER;
manualSettingsPanel.add(Spacer.create(), c);
c = new GridBagConstraints();
c.gridy = 4;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.NORTHWEST;
c.fill = GridBagConstraints.BOTH;
add(manualSettingsPanel, c);
}
private void initListeners() {
manualProxyRadio.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
updateManualSettings();
}
});
httpProxyField.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
updateManualSettings();
}
public void removeUpdate(DocumentEvent e) {
updateManualSettings();
}
public void changedUpdate(DocumentEvent e) {
updateManualSettings();
}
});
httpProxySpinnerModel.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
updateManualSettings();
}
});
sameSettingsCheckBox.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
updateManualSettings();
}
});
authenticationCheckBox.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
updateManualSettings();
}
});
passwordField.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
passwordChanged = true;
}
public void removeUpdate(DocumentEvent e) {
passwordChanged = true;
}
public void changedUpdate(DocumentEvent e) {
passwordChanged = true;
}
});
}
private void updateManualSettings() {
boolean manual = manualProxyRadio.isSelected();
boolean shared = sameSettingsCheckBox.isSelected();
boolean passwd = authenticationCheckBox.isSelected();
httpProxyLabel.setEnabled(manual);
httpProxyField.setEnabled(manual);
httpProxyPortLabel.setEnabled(manual);
httpProxyPortSpinner.setEnabled(manual);
sameSettingsCheckBox.setEnabled(manual);
httpsProxyLabel.setEnabled(manual && !shared);
httpsProxyField.setEnabled(manual && !shared);
httpsProxyPortLabel.setEnabled(manual && !shared);
httpsProxyPortSpinner.setEnabled(manual && !shared);
socksProxyLabel.setEnabled(manual && !shared);
socksProxyField.setEnabled(manual && !shared);
socksProxyPortLabel.setEnabled(manual && !shared);
socksProxyPortSpinner.setEnabled(manual && !shared);
noProxyLabel.setEnabled(manual);
noProxyField.setEnabled(manual);
authenticationCheckBox.setEnabled(manual);
usernameLabel.setEnabled(manual && passwd);
usernameField.setEnabled(manual && passwd);
passwordLabel.setEnabled(manual && passwd);
passwordField.setEnabled(manual && passwd);
if (shared) {
String proxy = httpProxyField.getText();
Object port = httpProxySpinnerModel.getValue();
httpsProxyField.setText(proxy);
httpsProxySpinnerModel.setValue(port);
socksProxyField.setText(proxy);
socksProxySpinnerModel.setValue(port);
}
}
void updateTestConnectionStatus(NetworkOptionsModel.TestingStatus testingStatus, Object object) {
throw new UnsupportedOperationException("Not supported yet.");
}
private JRadioButton noProxyRadio;
private JRadioButton systemProxyRadio;
private JRadioButton manualProxyRadio;
private JCheckBox sameSettingsCheckBox;
private JLabel httpProxyLabel;
private JTextField httpProxyField;
private JLabel httpProxyPortLabel;
private SpinnerModel httpProxySpinnerModel;
private JSpinner httpProxyPortSpinner;
private JLabel httpsProxyLabel;
private JTextField httpsProxyField;
private JLabel httpsProxyPortLabel;
private SpinnerModel httpsProxySpinnerModel;
private JSpinner httpsProxyPortSpinner;
private JLabel socksProxyLabel;
private JTextField socksProxyField;
private JLabel socksProxyPortLabel;
private SpinnerModel socksProxySpinnerModel;
private JSpinner socksProxyPortSpinner;
private JLabel noProxyLabel;
private JTextField noProxyField;
private JCheckBox authenticationCheckBox;
private JLabel usernameLabel;
private JTextField usernameField;
private JLabel passwordLabel;
private JPasswordField passwordField;
}