/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.provisioning;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import org.jitsi.service.configuration.*;
import org.jitsi.service.resources.*;
/**
*
* @author Yana Stamcheva
* @author Lyubomir Marinov
*/
public class ProvisioningForm
extends TransparentPanel
{
/**
* Serial version UID.
*/
private static final long serialVersionUID = 0L;
/**
* The enable provisioning check box.
*/
private final JCheckBox enableCheckBox;
/**
* The DHCP provisioning discovery button.
*/
private final JRadioButton dhcpButton;
/**
* The DNS provisioning discovery button.
*/
private final JRadioButton dnsButton;
/**
* The Bonjour provisioning discovery button.
*/
private final JRadioButton bonjourButton;
/**
* The manual provisioning button.
*/
private final JRadioButton manualButton;
/**
* The URI field to specify manually a provisioning server.
*/
private final SIPCommTextField uriField;
/**
* The field used to show the username.
*/
private final JTextField usernameField;
/**
* A field to show the password.
*/
private final JPasswordField passwordField;
/**
* The button that will delete the password.
*/
private final JButton forgetPasswordButton;
/**
* Creates an instance of the <tt>ProvisioningForm</tt>.
*/
public ProvisioningForm()
{
super(new BorderLayout());
final ResourceManagementService resources
= ProvisioningActivator.getResourceService();
ConfigurationService config
= ProvisioningActivator.getConfigurationService();
enableCheckBox = new SIPCommCheckBox(
resources.getI18NString("plugin.provisioning.ENABLE_DISABLE"));
dhcpButton = new SIPCommRadioButton(
resources.getI18NString("plugin.provisioning.DHCP"));
dnsButton = new SIPCommRadioButton(
resources.getI18NString("plugin.provisioning.DNS"));
bonjourButton = new SIPCommRadioButton(
resources.getI18NString("plugin.provisioning.BONJOUR"));
manualButton = new SIPCommRadioButton(
resources.getI18NString("plugin.provisioning.MANUAL"));
uriField = new SIPCommTextField(
resources.getI18NString("plugin.provisioning.URI"));
JPanel mainPanel = new TransparentPanel();
add(mainPanel, BorderLayout.NORTH);
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
enableCheckBox.setAlignmentX(Component.LEFT_ALIGNMENT);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(0, 0, 10, 0);
mainPanel.add(enableCheckBox, c);
final ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(dhcpButton);
buttonGroup.add(bonjourButton);
buttonGroup.add(dnsButton);
buttonGroup.add(manualButton);
final JPanel radioButtonPanel
= new TransparentPanel(new GridLayout(0, 1));
radioButtonPanel.setBorder(BorderFactory.createTitledBorder(
resources.getI18NString("plugin.provisioning.AUTO")));
radioButtonPanel.add(dhcpButton);
radioButtonPanel.add(bonjourButton);
radioButtonPanel.add(dnsButton);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.insets = new Insets(0, 20, 0, 0);
c.gridx = 0;
c.gridy = 1;
mainPanel.add(radioButtonPanel, c);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.insets = new Insets(0, 26, 0, 0);
c.gridx = 0;
c.gridy = 2;
mainPanel.add(manualButton, c);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.insets = new Insets(0, 51, 0, 0);
c.gridx = 0;
c.gridy = 3;
mainPanel.add(uriField, c);
JPanel uuidPanel = new TransparentPanel(
new FlowLayout(FlowLayout.LEFT));
final JTextField uuidPane = new JTextField();
uuidPane.setEditable(false);
uuidPane.setOpaque(false);
uuidPane.setText(
config.getString(ProvisioningServiceImpl.
PROVISIONING_UUID_PROP));
uuidPanel.add(new JLabel(resources.getI18NString(
"plugin.provisioning.UUID")));
uuidPanel.add(uuidPane);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0;
c.insets = new Insets(10, 10, 0, 0);
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridx = 0;
c.gridy = 4;
mainPanel.add(uuidPanel, c);
JButton clipboardBtn = new JButton(resources.getI18NString(
"plugin.provisioning.COPYTOCLIPBOARD"));
clipboardBtn.addActionListener(new ActionListener()
{
/**
* {@inheritsDoc}
*/
public void actionPerformed(ActionEvent evt)
{
Clipboard clipboard =
Toolkit.getDefaultToolkit().getSystemClipboard();
if(clipboard != null)
{
String selection = uuidPane.getText();
StringSelection data = new StringSelection(selection);
clipboard.setContents(data, data);
}
else
{
JOptionPane.showMessageDialog(
ProvisioningForm.this,
resources.getI18NString(
"plugin.provisioning.CLIPBOARD_FAILED"),
resources.getI18NString(
"plugin.provisioning.CLIPBOARD_FAILED"),
JOptionPane.ERROR_MESSAGE);
}
}
});
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.insets = new Insets(5, 10, 0, 0);
c.gridwidth = 0;
c.gridx = 0;
c.gridy = 5;
mainPanel.add(clipboardBtn, c);
JPanel userPassPanel = new TransparentPanel(new BorderLayout());
userPassPanel.setBorder(BorderFactory.createTitledBorder(
ProvisioningActivator.getResourceService().getI18NString(
"plugin.provisioning.CREDENTIALS")));
JPanel labelPanel = new TransparentPanel(new GridLayout(0, 1));
labelPanel.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 0));
JPanel valuesPanel = new TransparentPanel(new GridLayout(0, 1));
valuesPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 0));
labelPanel.add(new JLabel(
ProvisioningActivator.getResourceService().getI18NString(
"plugin.simpleaccregwizz.LOGIN_USERNAME")));
labelPanel.add(new JLabel(
ProvisioningActivator.getResourceService().getI18NString(
"service.gui.PASSWORD")));
usernameField = new JTextField();
usernameField.setEditable(false);
passwordField = new JPasswordField();
passwordField.setEditable(false);
valuesPanel.add(usernameField);
valuesPanel.add(passwordField);
userPassPanel.add(labelPanel, BorderLayout.WEST);
userPassPanel.add(valuesPanel, BorderLayout.CENTER);
JPanel buttonPanel = new TransparentPanel(new FlowLayout(FlowLayout.RIGHT));
forgetPasswordButton = new JButton(resources
.getI18NString("plugin.provisioning.FORGET_PASSWORD"));
buttonPanel.add(forgetPasswordButton);
userPassPanel.add(buttonPanel, BorderLayout.SOUTH);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.insets = new Insets(5, 10, 0, 0);
c.gridwidth = 0;
c.gridx = 0;
c.gridy = 6;
mainPanel.add(userPassPanel, c);
JTextPane pane = new JTextPane();
pane.setForeground(Color.RED);
pane.setEditable(false);
pane.setOpaque(false);
pane.setText(ProvisioningActivator.getResourceService().getI18NString(
"plugin.provisioning.RESTART_WARNING",
new String[]{ProvisioningActivator.getResourceService()
.getSettingsString("service.gui.APPLICATION_NAME")}));
c.gridy = 7;
mainPanel.add(pane, c);
initButtonStates();
initListeners();
}
/**
* Initializes all contained components.
*/
private void initButtonStates()
{
String provMethod = ProvisioningActivator.getProvisioningService().
getProvisioningMethod();
boolean isProvEnabled
= (provMethod != null
&& provMethod.length() > 0
&& !provMethod.equals("NONE"));
enableCheckBox.setSelected(isProvEnabled);
if (isProvEnabled)
{
if (provMethod.equals("DHCP"))
dhcpButton.setSelected(true);
else if (provMethod.equals("DNS"))
dnsButton.setSelected(true);
else if (provMethod.equals("Bonjour"))
bonjourButton.setSelected(true);
else if (provMethod.equals("Manual"))
{
manualButton.setSelected(true);
String uri = ProvisioningActivator.getProvisioningService().
getProvisioningUri();
if (uri != null)
uriField.setText(uri);
}
}
dhcpButton.setEnabled(isProvEnabled);
manualButton.setEnabled(isProvEnabled);
uriField.setEnabled(manualButton.isSelected());
bonjourButton.setEnabled(isProvEnabled);
dnsButton.setEnabled(false);
// creadentials
forgetPasswordButton.setEnabled(isProvEnabled);
usernameField.setText(ProvisioningActivator.getConfigurationService()
.getString(ProvisioningServiceImpl.PROPERTY_PROVISIONING_USERNAME));
if(ProvisioningActivator.getCredentialsStorageService()
.isStoredEncrypted(
ProvisioningServiceImpl.PROPERTY_PROVISIONING_PASSWORD))
{
passwordField.setText(
ProvisioningActivator.getCredentialsStorageService()
.loadPassword(
ProvisioningServiceImpl.PROPERTY_PROVISIONING_PASSWORD));
}
}
/**
* Initializes all listeners.
*/
private void initListeners()
{
enableCheckBox.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
boolean isSelected = enableCheckBox.isSelected();
dhcpButton.setEnabled(isSelected);
bonjourButton.setEnabled(isSelected);
manualButton.setEnabled(isSelected);
forgetPasswordButton.setEnabled(isSelected);
String provisioningMethod = null;
if (isSelected)
{
if (dhcpButton.isSelected())
{
provisioningMethod = "DHCP";
}
else if (dnsButton.isSelected())
{
provisioningMethod = "DNS";
}
else if (bonjourButton.isSelected())
{
provisioningMethod = "Bonjour";
}
else if (manualButton.isSelected())
{
provisioningMethod = "Manual";
}
else
{
dhcpButton.setSelected(true);
provisioningMethod = "DHCP";
}
}
ProvisioningActivator.getProvisioningService().
setProvisioningMethod(provisioningMethod);
}
});
dhcpButton.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (dhcpButton.isSelected())
ProvisioningActivator.getProvisioningService().
setProvisioningMethod("DHCP");
}
});
dnsButton.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (dnsButton.isSelected())
ProvisioningActivator.getProvisioningService().
setProvisioningMethod("DNS");
}
});
bonjourButton.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (bonjourButton.isSelected())
ProvisioningActivator.getProvisioningService().
setProvisioningMethod("Bonjour");
}
});
manualButton.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
boolean isSelected = manualButton.isSelected();
uriField.setEnabled(isSelected);
if (isSelected)
{
ProvisioningActivator.getProvisioningService().
setProvisioningMethod("Manual");
String uriText = uriField.getText();
if (uriText != null && uriText.length() > 0)
ProvisioningActivator.getProvisioningService().
setProvisioningUri(uriText);
}
else
{
ProvisioningActivator.getProvisioningService().
setProvisioningUri(null);
}
}
});
uriField.addFocusListener(new FocusListener()
{
public void focusLost(FocusEvent e)
{
// If the manual button isn't selected we have nothing more
// to do here.
if (!manualButton.isSelected())
return;
String uriText = uriField.getText();
if (uriText != null && uriText.length() > 0)
ProvisioningActivator.getProvisioningService().
setProvisioningUri(uriText);
}
public void focusGained(FocusEvent e) {}
});
forgetPasswordButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent actionEvent)
{
if(passwordField.getPassword() == null
|| passwordField.getPassword().length == 0)
{
return;
}
int result = JOptionPane.showConfirmDialog(
(Component)ProvisioningActivator.getUIService()
.getExportedWindow(ExportedWindow.MAIN_WINDOW).
getSource(),
ProvisioningActivator.getResourceService().getI18NString(
"plugin.provisioning.REMOVE_CREDENTIALS_MESSAGE"),
ProvisioningActivator.getResourceService().getI18NString(
"service.gui.REMOVE"),
JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION)
{
ProvisioningActivator.getCredentialsStorageService()
.removePassword(ProvisioningServiceImpl.
PROPERTY_PROVISIONING_PASSWORD);
ProvisioningActivator.getConfigurationService()
.removeProperty(ProvisioningServiceImpl.
PROPERTY_PROVISIONING_USERNAME);
usernameField.setText("");
passwordField.setText("");
}
}
});
}
}