/*
* 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.ircaccregwizz;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.protocol.*;
/**
* The <tt>FirstWizardPage</tt> is the page, where user could enter the user ID
* and the password of the account.
*
* @author Lionel Ferreira & Michael Tarantino
* @author Danny van Heumen
*/
public class FirstWizardPage
extends TransparentPanel
implements WizardPage,
DocumentListener,
ActionListener
{
/**
* Serial version UID.
*/
private static final long serialVersionUID = 0L;
/**
* The identifier of this wizard page.
*/
public static final String FIRST_PAGE_IDENTIFIER = "FirstPageIdentifier";
/**
* Example of IRC nick name.
*/
public static final String USER_NAME_EXAMPLE = Resources
.getString("plugin.ircaccregwizz.EXAMPLE_USERNAME");
/**
* Example of IRC server name.
*/
public static final String SERVER_EXAMPLE = Resources
.getString("plugin.ircaccregwizz.EXAMPLE_SERVER");
private static final String DEFAULT_PLAINTEXT_PORT = "6667";
private static final String DEFAULT_SECURE_PORT = "6697";
private JPanel userPassPanel = new TransparentPanel(new BorderLayout(10, 10));
private JPanel serverPanel = new TransparentPanel(new BorderLayout(10, 10));
private JPanel optionsPanel = new TransparentPanel(new BorderLayout(10, 10));
private JPanel saslPanel = new TransparentPanel(new BorderLayout(10, 10));
private JPanel labelsPanel = new TransparentPanel();
private JPanel valuesPanel = new TransparentPanel();
private JPanel labelsServerPanel = new TransparentPanel();
private JPanel valuesServerPanel = new TransparentPanel();
private JPanel labelsOptionsPanel = new TransparentPanel();
private JPanel valuesOptionsPanel = new TransparentPanel();
private JLabel infoPassword
= new JLabel(Resources.getString("plugin.ircaccregwizz.INFO_PASSWORD"));
private JLabel nick = new JLabel(
Resources.getString("plugin.ircaccregwizz.USERNAME") + ":");
private JLabel passLabel = new JLabel(
Resources.getString("service.gui.PASSWORD") + ":");
private JLabel server
= new JLabel(Resources.getString("plugin.ircaccregwizz.HOST"));
private JLabel port = new JLabel(Resources.getString("service.gui.PORT")
+ ":");
private JPanel emptyPanel = new TransparentPanel();
private JPanel emptyPanel2 = new TransparentPanel();
private JLabel nickExampleLabel = new JLabel(USER_NAME_EXAMPLE);
private JLabel serverExampleLabel = new JLabel(SERVER_EXAMPLE);
private JTextField userIDField = new TrimTextField();
private JPasswordField passField = new JPasswordField();
private JTextField serverField = new JTextField();
private JTextField portField = new JTextField();
private JCheckBox rememberPassBox
= new SIPCommCheckBox(Resources.getString("service.gui.REMEMBER_PASSWORD"));
private JCheckBox autoNickChange
= new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.AUTO_NICK_CHANGE"));
private JCheckBox resolveDnsThroughProxy = new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.RESOLVE_DNS_THROUGH_PROXY"));
private JCheckBox defaultPort = new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.USE_DEFAULT_PORT"));
private JCheckBox passwordNotRequired = new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.PASSWORD_NOT_REQUIRED"));
private JCheckBox useSecureConnection = new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.USE_SECURE_CONNECTION"));
private JCheckBox enableContactPresenceTask = new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.ENABLE_CONTACT_PRESENCE"));
private JCheckBox enableChatRoomPresenceTask = new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.ENABLE_CHAT_ROOM_PRESENCE"));
private JCheckBox saslEnabled = new SIPCommCheckBox(
Resources.getString("plugin.ircaccregwizz.ENABLE_SASL_AUTHENTICATION"));
private JTextField saslUserIdField = new JTextField();
private JTextField saslRoleField = new JTextField();
private JPanel mainPanel = new TransparentPanel();
private Object nextPageIdentifier = WizardPage.SUMMARY_PAGE_IDENTIFIER;
private IrcAccountRegistrationWizard wizard;
private boolean isCommitted = false;
/**
* Creates an instance of <tt>FirstWizardPage</tt>.
*
* @param wizard the parent wizard
*/
public FirstWizardPage(IrcAccountRegistrationWizard wizard, String userId, String server)
{
super(new BorderLayout());
this.wizard = wizard;
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
this.init(userId, server);
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
this.labelsPanel.setLayout(
new BoxLayout(labelsPanel, BoxLayout.Y_AXIS));
this.valuesPanel.setLayout(
new BoxLayout(valuesPanel, BoxLayout.Y_AXIS));
this.labelsServerPanel.setLayout(
new BoxLayout(labelsServerPanel, BoxLayout.Y_AXIS));
this.valuesServerPanel.setLayout(
new BoxLayout(valuesServerPanel, BoxLayout.Y_AXIS));
this.labelsOptionsPanel.setLayout(
new BoxLayout(labelsOptionsPanel, BoxLayout.Y_AXIS));
this.valuesOptionsPanel.setLayout(
new BoxLayout(valuesOptionsPanel, BoxLayout.Y_AXIS));
this.portField.setEnabled(false);
this.rememberPassBox.setEnabled(false);
this.useSecureConnection.setEnabled(true);
this.resolveDnsThroughProxy.setEnabled(true);
}
/**
* Initializes all panels, buttons, etc.
*/
private void init(String userId, String server)
{
this.mainPanel.setOpaque(false);
this.labelsPanel.setOpaque(false);
this.valuesPanel.setOpaque(false);
this.emptyPanel.setOpaque(false);
this.userIDField.getDocument().addDocumentListener(this);
this.serverField.getDocument().addDocumentListener(this);
this.passField.getDocument().addDocumentListener(this);
this.defaultPort.addActionListener(this);
this.passwordNotRequired.addActionListener(this);
this.useSecureConnection.addActionListener(this);
this.saslEnabled.addActionListener(this);
this.userIDField.setText(userId);
this.serverField.setText(server);
this.passField.setEnabled(false);
this.rememberPassBox.setSelected(true);
this.autoNickChange.setSelected(true);
this.resolveDnsThroughProxy.setSelected(true);
this.defaultPort.setSelected(true);
this.passwordNotRequired.setSelected(true);
this.useSecureConnection.setSelected(true);
this.enableContactPresenceTask.setSelected(true);
this.enableChatRoomPresenceTask.setSelected(true);
this.portField
.setText(this.useSecureConnection.isSelected() ? DEFAULT_SECURE_PORT
: DEFAULT_PLAINTEXT_PORT);
this.nickExampleLabel.setForeground(Color.GRAY);
this.nickExampleLabel.setFont(
nickExampleLabel.getFont().deriveFont(8));
this.serverExampleLabel.setForeground(Color.GRAY);
this.serverExampleLabel.setFont(
serverExampleLabel.getFont().deriveFont(8));
this.emptyPanel.setMaximumSize(new Dimension(40, 35));
this.emptyPanel2.setMaximumSize(new Dimension(40, 35));
this.nickExampleLabel.setBorder(
BorderFactory.createEmptyBorder(0, 0, 8,0));
this.serverExampleLabel.setBorder(
BorderFactory.createEmptyBorder(0, 0, 8,0));
labelsPanel.add(nick);
labelsPanel.add(emptyPanel);
labelsPanel.add(passLabel);
valuesPanel.add(userIDField);
valuesPanel.add(nickExampleLabel);
valuesPanel.add(passField);
userPassPanel.add(infoPassword, BorderLayout.NORTH);
userPassPanel.add(labelsPanel, BorderLayout.WEST);
userPassPanel.add(valuesPanel, BorderLayout.CENTER);
userPassPanel.add(passwordNotRequired, BorderLayout.SOUTH);
userPassPanel.setBorder(BorderFactory
.createTitledBorder(Resources.getString(
"plugin.ircaccregwizz.USERNAME_AND_PASSWORD")));
labelsServerPanel.add(this.server);
labelsServerPanel.add(emptyPanel2);
labelsServerPanel.add(port);
valuesServerPanel.add(serverField);
valuesServerPanel.add(serverExampleLabel);
valuesServerPanel.add(portField);
serverPanel.add(labelsServerPanel, BorderLayout.WEST);
serverPanel.add(valuesServerPanel, BorderLayout.CENTER);
JPanel serverSubPanel = new JPanel(new BorderLayout());
serverSubPanel.setOpaque(false);
serverSubPanel.add(defaultPort, BorderLayout.WEST);
serverSubPanel.add(useSecureConnection, BorderLayout.EAST);
serverPanel.add(serverSubPanel, BorderLayout.SOUTH);
serverPanel.setBorder(BorderFactory.createTitledBorder(
Resources.getString("plugin.ircaccregwizz.IRC_SERVER")));
final JPanel optionsSubPanel = new TransparentPanel();
optionsSubPanel.setLayout(new BoxLayout(optionsSubPanel, BoxLayout.Y_AXIS));
optionsPanel.add(optionsSubPanel, BorderLayout.WEST);
optionsSubPanel.add(rememberPassBox);
optionsSubPanel.add(autoNickChange);
final JPanel partition = new TransparentPanel();
optionsSubPanel.add(resolveDnsThroughProxy);
optionsPanel.add(partition, BorderLayout.SOUTH);
partition.setLayout(new BorderLayout());
partition.add(enableContactPresenceTask, BorderLayout.WEST);
partition.add(enableChatRoomPresenceTask, BorderLayout.EAST);
optionsPanel.setBorder(BorderFactory.createTitledBorder(
Resources.getString("service.gui.OPTIONS")));
saslPanel.add(this.saslEnabled, BorderLayout.NORTH);
TransparentPanel saslControlsPanel = new TransparentPanel();
saslControlsPanel.setLayout(new BoxLayout(saslControlsPanel,
BoxLayout.Y_AXIS));
saslPanel.add(saslControlsPanel, BorderLayout.CENTER);
JLabel saslUserLabel = new JLabel(
Resources.getString("plugin.ircaccregwizz.SASL_USERNAME") + ":");
saslControlsPanel.add(horizontal(100,
saslUserLabel, this.saslUserIdField));
JLabel saslPassLabel = new JLabel(
Resources.getString("service.gui.PASSWORD") + ":");
saslControlsPanel.add(horizontal(100, saslPassLabel, new JLabel(
Resources.getString("plugin.ircaccregwizz.SASL_IRC_PASSWORD_USED"))));
JLabel saslRoleLabel = new JLabel(
Resources.getString("plugin.ircaccregwizz.SASL_AUTHZ_ROLE") + ":");
saslControlsPanel
.add(horizontal(100, saslRoleLabel, this.saslRoleField));
saslPanel.setBorder(BorderFactory.createTitledBorder(Resources
.getString("plugin.ircaccregwizz.SASL_AUTHENTICATION_TITLE")));
mainPanel.add(userPassPanel);
mainPanel.add(serverPanel);
mainPanel.add(optionsPanel);
mainPanel.add(saslPanel);
this.add(mainPanel, BorderLayout.NORTH);
}
private JPanel horizontal(int width, Component cmp1, Component cmp2) {
TransparentPanel panel = new TransparentPanel(new BorderLayout(10, 10));
cmp1.setPreferredSize(new Dimension(width, cmp1.getHeight()));
panel.add(cmp1, BorderLayout.WEST);
panel.add(cmp2, BorderLayout.CENTER);
return panel;
}
/**
* Implements the <code>WizardPage.getIdentifier</code> to return
* this page identifier.
*
* @return the Identifier of the first page in this wizard.
*/
public Object getIdentifier()
{
return FIRST_PAGE_IDENTIFIER;
}
/**
* Implements the <code>WizardPage.getNextPageIdentifier</code> to return
* the next page identifier - the summary page.
*
* @return the identifier of the page following this one.
*/
public Object getNextPageIdentifier()
{
return nextPageIdentifier;
}
/**
* Implements the <code>WizardPage.getBackPageIdentifier</code> to return
* the back identifier. In this case it's null because this is the first
* wizard page.
*
* @return the identifier of the previous wizard page
*/
public Object getBackPageIdentifier()
{
return null;
}
/**
* Implements the <code>WizardPage.getWizardForm</code> to return
* this panel.
*
* @return the component to be displayed in this wizard page.
*/
public Object getWizardForm()
{
return this;
}
/**
* Before this page is displayed enables or disables the "Next" wizard
* button according to whether the UserID field is empty.
*/
public void pageShowing()
{
this.setNextButtonAccordingToUserID();
}
/**
* Saves the user input when the "Next" wizard buttons is clicked.
*/
public void commitPage()
{
nextPageIdentifier = SUMMARY_PAGE_IDENTIFIER;
IrcAccountRegistration registration = wizard.getRegistration();
String userID = userIDField.getText();
if(userID == null || userID.trim().length() == 0)
throw new IllegalStateException("No user ID provided.");
registration.setUserID(userID);
if (passField.getPassword() != null)
registration.setPassword(new String(passField.getPassword()));
registration.setServer(serverField.getText());
registration.setPort(portField.getText());
registration.setRememberPassword(rememberPassBox.isSelected());
registration.setAutoChangeNick(autoNickChange.isSelected());
registration.setRequiredPassword(!passwordNotRequired.isSelected());
registration.setSecureConnection(useSecureConnection.isSelected());
registration
.setContactPresenceTaskEnabled(this.enableContactPresenceTask
.isSelected());
registration.setChatRoomPresenceTaskEnabled(enableChatRoomPresenceTask
.isSelected());
registration.setSaslEnabled(!this.passwordNotRequired.isSelected()
&& this.saslEnabled.isSelected());
registration.setSaslUser(this.saslUserIdField.getText());
registration.setSaslRole(this.saslRoleField.getText());
registration.setResolveDnsThroughProxy(this.resolveDnsThroughProxy
.isSelected());
isCommitted = true;
}
/**
* Enables or disables the "Next" wizard button according to whether the
* User ID field is empty.
*/
private void setNextButtonAccordingToUserID()
{
if (userIDField.getText() == null
|| userIDField.getText().equals("")
|| serverField.getText() == null
|| serverField.getText().equals("")
|| (!passwordNotRequired.isSelected() && isEmpty(passField)))
{
wizard.getWizardContainer().setNextFinishButtonEnabled(false);
}
else
{
wizard.getWizardContainer().setNextFinishButtonEnabled(true);
}
}
private boolean isEmpty(JPasswordField passField)
{
if (passField.getDocument() != null)
{
char[] pass = passField.getPassword();
if (pass != null)
{
/*
* The Javadoc of JPasswordField.getPassword() recommends
* clearing the returned character array for stronger security
* by setting each character to zero
*/
Arrays.fill(pass, '\0');
return (pass.length <= 0);
}
}
return true;
}
/**
* Handles the <tt>DocumentEvent</tt> triggered when user types in the
* User ID field. Enables or disables the "Next" wizard button according to
* whether the User ID field is empty.
*
* @param event the event containing the update.
*/
public void insertUpdate(DocumentEvent event)
{
this.setNextButtonAccordingToUserID();
}
/**
* Handles the <tt>DocumentEvent</tt> triggered when user deletes letters
* from the UserID field. Enables or disables the "Next" wizard button
* according to whether the UserID field is empty.
*
* @param event the event containing the update.
*/
public void removeUpdate(DocumentEvent event)
{
this.setNextButtonAccordingToUserID();
}
/**
* Fills the UserID and Password fields in this panel with the data coming
* from the given protocolProvider.
*
* @param protocolProvider The <tt>ProtocolProviderService</tt> to load the
* data from.
*/
public void loadAccount(ProtocolProviderService protocolProvider)
{
AccountID accountID = protocolProvider.getAccountID();
String password = IrcAccRegWizzActivator.getIrcProtocolProviderFactory()
.loadPassword(accountID);
String server =
accountID
.getAccountPropertyString(ProtocolProviderFactory.SERVER_ADDRESS);
String port =
accountID
.getAccountPropertyString(ProtocolProviderFactory.SERVER_PORT);
String autoNickChange =
accountID
.getAccountPropertyString(ProtocolProviderFactory.AUTO_CHANGE_USER_NAME);
String noPasswordRequired =
accountID
.getAccountPropertyString(ProtocolProviderFactory.NO_PASSWORD_REQUIRED);
boolean useSecureConnection =
accountID.getAccountPropertyBoolean(
ProtocolProviderFactory.DEFAULT_ENCRYPTION, true);
boolean resolveDnsThroughProxy =
accountID.getAccountPropertyBoolean(
IrcAccountRegistrationWizard.RESOLVE_DNS_THROUGH_PROXY, true);
boolean contactPresenceTaskEnabled =
accountID.getAccountPropertyBoolean(
IrcAccountRegistrationWizard.CONTACT_PRESENCE_TASK, true);
boolean chatRoomPresenceTaskEnabled =
accountID.getAccountPropertyBoolean(
IrcAccountRegistrationWizard.CHAT_ROOM_PRESENCE_TASK, true);
final boolean enableSaslAuthentication =
accountID.getAccountPropertyBoolean(
IrcAccountRegistrationWizard.SASL_ENABLED, false);
final String saslUser =
accountID.getAccountPropertyString(
IrcAccountRegistrationWizard.SASL_USERNAME, "");
final String saslRole =
accountID.getAccountPropertyString(
IrcAccountRegistrationWizard.SASL_ROLE, "");
this.userIDField.setEnabled(false);
this.userIDField.setText(accountID.getUserID());
this.serverField.setText(server);
if (password != null)
{
this.passField.setText(password);
this.rememberPassBox.setSelected(true);
}
if (port != null)
{
this.portField.setText(port);
boolean defaultPort =
(useSecureConnection && DEFAULT_SECURE_PORT.equals(port))
|| DEFAULT_PLAINTEXT_PORT.equals(port);
this.portField.setEnabled(!defaultPort);
this.defaultPort.setSelected(defaultPort);
}
if (autoNickChange != null)
{
this.autoNickChange.setSelected(
new Boolean(autoNickChange).booleanValue());
}
this.resolveDnsThroughProxy.setSelected(resolveDnsThroughProxy);
if (noPasswordRequired != null)
{
boolean isPassRequired = !Boolean.valueOf(noPasswordRequired);
this.passwordNotRequired.setSelected(!isPassRequired);
this.rememberPassBox.setEnabled(isPassRequired);
passField.setEnabled(isPassRequired);
}
this.useSecureConnection.setSelected(useSecureConnection);
this.enableContactPresenceTask.setSelected(contactPresenceTaskEnabled);
this.enableChatRoomPresenceTask
.setSelected(chatRoomPresenceTaskEnabled);
this.saslEnabled.setSelected(enableSaslAuthentication);
this.saslUserIdField.setText(saslUser);
this.saslRoleField.setText(saslRole);
}
/**
* Indicates when the default port check box and the passwordNotRequired
* check box are selected.
*/
public void actionPerformed(ActionEvent event)
{
if (defaultPort.isSelected())
{
portField
.setText(useSecureConnection.isSelected() ? DEFAULT_SECURE_PORT
: DEFAULT_PLAINTEXT_PORT);
portField.setEnabled(false);
}
else
{
portField.setEnabled(true);
}
boolean passwordRequired = !this.passwordNotRequired.isSelected();
if (passwordRequired)
{
passField.setEnabled(true);
rememberPassBox.setEnabled(true);
this.saslEnabled.setEnabled(true);
}
else
{
passField.setText("");
passField.setEnabled(false);
rememberPassBox.setEnabled(false);
this.saslEnabled.setEnabled(false);
}
boolean enableSaslControls =
passwordRequired && this.saslEnabled.isSelected();
saslUserIdField.setEnabled(enableSaslControls);
saslRoleField.setEnabled(enableSaslControls);
setNextButtonAccordingToUserID();
}
public void changedUpdate(DocumentEvent event){}
public void pageHiding(){}
public void pageShown(){}
public void pageBack(){}
public Object getSimpleForm()
{
JPanel simplePanel = new TransparentPanel(new BorderLayout());
JPanel labelsPanel = new TransparentPanel(new GridLayout(0, 1));
JPanel valuesPanel = new TransparentPanel(new GridLayout(0, 1));
simplePanel.setOpaque(false);
labelsPanel.setOpaque(false);
valuesPanel.setOpaque(false);
emptyPanel2.setOpaque(false);
simplePanel.add(labelsPanel, BorderLayout.WEST);
simplePanel.add(valuesPanel, BorderLayout.CENTER);
labelsPanel.add(nick);
labelsPanel.add(emptyPanel);
labelsPanel.add(server);
labelsPanel.add(emptyPanel2);
valuesPanel.add(userIDField);
valuesPanel.add(nickExampleLabel);
valuesPanel.add(serverField);
valuesPanel.add(serverExampleLabel);
return simplePanel;
}
public boolean isCommitted()
{
return isCommitted;
}
public String getCurrentUserId()
{
return this.userIDField.getText();
}
public String getCurrentServer()
{
return this.serverField.getText();
}
}