/*
* 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.sipaccregwizz;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.plugin.desktoputil.*;
/**
* The panel containing all account related information like user name and
* password.
*
* @author Yana Stamcheva
*/
public class AccountPanel
extends TransparentPanel
implements DocumentListener,
ValidatingPanel
{
/**
* Serial version UID.
*/
private static final long serialVersionUID = 0L;
private final Logger logger = Logger.getLogger(AccountPanel.class);
private final JPanel labelsPanel
= new TransparentPanel(new GridLayout(0, 1));
private final JPanel valuesPanel
= new TransparentPanel(new GridLayout(0, 1));
private final JPanel emptyPanel = new TransparentPanel();
private final JTextField userIDField = new TrimTextField();
private final JPasswordField passField = new JPasswordField();
private final JTextField displayNameField = new JTextField();
private final JCheckBox rememberPassBox
= new SIPCommCheckBox(
Resources.getString("service.gui.REMEMBER_PASSWORD"));
private final JLabel displayNameLabel
= new JLabel(Resources.getString("plugin.sipaccregwizz.DISPLAY_NAME"));
private final JRadioButton existingAccountButton;
private final JRadioButton createAccountButton;
private final JPanel uinPassPanel
= new TransparentPanel(new BorderLayout(10, 10));
private final JPanel mainPanel
= new TransparentPanel(new BorderLayout(5, 5));
private final SIPAccountRegistrationForm regform;
private Component registrationForm;
private boolean isSimpleForm;
private Component registerChoicePanel;
/**
* Creates an instance of the <tt>AccountPanel</tt>.
* @param regform the parent registration form
*/
public AccountPanel(SIPAccountRegistrationForm regform)
{
super(new BorderLayout());
this.regform = regform;
this.regform.addValidatingPanel(this);
this.userIDField.getDocument().addDocumentListener(this);
this.rememberPassBox.setSelected(true);
existingAccountButton = new JRadioButton(
regform.getExistingAccountLabel());
createAccountButton = new JRadioButton(
regform.getCreateAccountLabel());
JLabel uinExampleLabel = new JLabel(regform.getUsernameExample());
uinExampleLabel.setForeground(Color.GRAY);
uinExampleLabel.setFont(uinExampleLabel.getFont().deriveFont(8));
emptyPanel.setMaximumSize(new Dimension(40, 35));
uinExampleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 8, 0));
JLabel uinLabel
= new JLabel(regform.getUsernameLabel());
JLabel passLabel
= new JLabel(Resources.getString("service.gui.PASSWORD"));
labelsPanel.add(uinLabel);
labelsPanel.add(emptyPanel);
labelsPanel.add(passLabel);
valuesPanel.add(userIDField);
valuesPanel.add(uinExampleLabel);
valuesPanel.add(passField);
TransparentPanel southPanel
= new TransparentPanel(new GridLayout(1, 2));
uinPassPanel.add(labelsPanel, BorderLayout.WEST);
uinPassPanel.add(valuesPanel, BorderLayout.CENTER);
uinPassPanel.add(southPanel, BorderLayout.SOUTH);
southPanel.add(rememberPassBox);
String webSignupLinkText = regform.getWebSignupLinkName();
if (webSignupLinkText != null && webSignupLinkText.length() > 0)
southPanel.add(createWebSignupLabel(webSignupLinkText));
else
{
String forgotPassLinkText = regform.getForgotPasswordLinkName();
if (forgotPassLinkText != null && forgotPassLinkText.length() > 0)
southPanel.add(createForgotPasswordLabel(forgotPassLinkText));
}
uinPassPanel.setBorder(BorderFactory.createTitledBorder(Resources
.getString("plugin.sipaccregwizz.USERNAME_AND_PASSWORD")));
SIPAccountCreationFormService createAccountService
= regform.getCreateAccountService();
if (createAccountService != null && isSimpleForm)
{
registrationForm = createAccountService.getForm();
registerChoicePanel = createRegisterChoicePanel();
mainPanel.add(registerChoicePanel, BorderLayout.NORTH);
}
else
mainPanel.add(uinPassPanel, BorderLayout.NORTH);
this.add(mainPanel, BorderLayout.NORTH);
}
/**
* Initializes the advanced account panel.
*/
void initAdvancedForm()
{
// If it's not yet added.
if (displayNameLabel.getParent() == null)
labelsPanel.add(displayNameLabel);
// If it's not yet added.
if (displayNameField.getParent() == null)
valuesPanel.add(displayNameField);
// Select the existing account radio button by default.
existingAccountButton.setSelected(true);
// Indicate that this panel is opened in a simple form.
setSimpleForm(false);
}
/**
* Handles the <tt>DocumentEvent</tt> triggered when user types in the UIN
* field. Enables or disables the "Next" wizard button according to whether
* the UIN field is empty.
* @param e the <tt>DocumentEvent</tt> that notified us
*/
public void insertUpdate(DocumentEvent e)
{
regform.setServerFieldAccordingToUIN(userIDField.getText());
regform.reValidateInput();
}
/**
* Handles the <tt>DocumentEvent</tt> triggered when user deletes letters
* from the UIN field. Enables or disables the "Next" wizard button
* according to whether the UIN field is empty.
* @param e the <tt>DocumentEvent</tt> that notified us
*/
public void removeUpdate(DocumentEvent e)
{
regform.setServerFieldAccordingToUIN(userIDField.getText());
regform.reValidateInput();
}
public void changedUpdate(DocumentEvent e) {}
/**
* Returns the user identifier entered by the user.
* @return the user identifier
*/
String getUserID()
{
String userID = userIDField.getText();
if(userID.startsWith("sip:"))
return userID.substring(4);
return userID;
}
/**
* Returns the password entered by the user.
* @return the password
*/
char[] getPassword()
{
return passField.getPassword();
}
/**
* Indicates if the "remember password" check box is selected.
* @return <tt>true</tt> if the "remember password" check box is selected,
* otherwise returns <tt>false</tt>
*/
boolean isRememberPassword()
{
return rememberPassBox.isSelected();
}
/**
* Returns the display name of the account.
* @return the display name of the account
*/
String getDisplayName()
{
return displayNameField.getText();
}
/**
* Sets the display name of the account.
* @param displayName the display name of the account
*/
void setDisplayName(String displayName)
{
displayNameField.setText(displayName);
}
/**
* Enables/disables the user id text field.
* @param isEnabled <tt>true</tt> to enable the user id text field,
* <tt>false</tt> - otherwise
*/
void setUserIDEnabled(boolean isEnabled)
{
userIDField.setEnabled(isEnabled);
}
/**
* Sets the user id.
* @param userID the user id to set
*/
void setUserID(String userID)
{
userIDField.setText(userID);
regform.reValidateInput();
}
/**
* Sets the password
* @param password the password
*/
void setPassword(String password)
{
this.passField.setText(password);
}
/**
* Sets the password remember check box.
* @param isRememberPassword <tt>true</tt> to select the remember password
* check box, <tt>false</tt> - otherwise
*/
void setRememberPassword(boolean isRememberPassword)
{
rememberPassBox.setSelected(isRememberPassword);
}
/**
* Creates the subscribe label.
* @param linkName the link name
* @return the newly created subscribe label
*/
private Component createWebSignupLabel(String linkName)
{
JLabel subscribeLabel =
new JLabel("<html><a href=''>"
+ linkName
+ "</a></html>",
JLabel.RIGHT);
subscribeLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
subscribeLabel.setToolTipText(
Resources.getString("plugin.simpleaccregwizz.SPECIAL_SIGNUP"));
subscribeLabel.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
try
{
regform.webSignup();
}
catch (UnsupportedOperationException ex)
{
// This should not happen, because we check if the
// operation is supported, before adding the sign
// up.
logger.error("The web sign up is not supported.",
ex);
}
}
});
return subscribeLabel;
}
/**
* Creates the subscribe label.
* @param linkName the link name
* @return the newly created subscribe label
*/
private Component createForgotPasswordLabel(String linkName)
{
JLabel subscribeLabel =
new JLabel("<html><a href=''>"
+ linkName
+ "</a></html>",
JLabel.RIGHT);
subscribeLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
subscribeLabel.setToolTipText(
Resources.getString("plugin.simpleaccregwizz.FORGOT_PASSWORD"));
subscribeLabel.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
try
{
SIPAccRegWizzActivator.getBrowserLauncher()
.openURL(regform.getForgotPasswordLink());
}
catch (UnsupportedOperationException ex)
{
// This should not happen, because we check if the
// operation is supported, before adding the sign
// up.
logger.error("The web sign up is not supported.",
ex);
}
}
});
return subscribeLabel;
}
/**
* Creates a register choice panel.
* @return the created component
*/
private Component createRegisterChoicePanel()
{
JPanel registerChoicePanel = new TransparentPanel(new GridLayout(0, 1));
existingAccountButton.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (existingAccountButton.isSelected())
{
mainPanel.remove(registrationForm);
mainPanel.add(uinPassPanel, BorderLayout.CENTER);
Window window
= SwingUtilities.getWindowAncestor(AccountPanel.this);
if (window != null)
window.pack();
}
}
});
createAccountButton.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (createAccountButton.isSelected())
{
mainPanel.remove(uinPassPanel);
mainPanel.add(registrationForm, BorderLayout.CENTER);
SwingUtilities.getWindowAncestor(AccountPanel.this).pack();
}
}
});
ButtonGroup buttonGroup = new ButtonGroup();
existingAccountButton.setOpaque(false);
createAccountButton.setOpaque(false);
buttonGroup.add(existingAccountButton);
buttonGroup.add(createAccountButton);
registerChoicePanel.add(existingAccountButton);
registerChoicePanel.add(createAccountButton);
// By default we select the existing account button.
existingAccountButton.setSelected(true);
return registerChoicePanel;
}
/**
* Indicates if the account information provided by this form is for new
* account or an existing one.
* @return <tt>true</tt> if the account information provided by this form
* is for new account or <tt>false</tt> if it's for an existing one
*/
boolean isCreateAccount()
{
return createAccountButton.isSelected();
}
/**
* Whether current inserted values into the panel are valid and enough
* to continue with account creation/modification.
*
* @return whether the input values are ok to continue with account
* creation/modification.
*/
public boolean isValidated()
{
return userIDField.getText() != null
&& userIDField.getText().length() > 0;
}
/**
* Sets to <tt>true</tt> if this panel is opened in a simple form and
* <tt>false</tt> if it's opened in an advanced form.
*
* @param isSimpleForm indicates if this panel is opened in a simple form or
* in an advanced form
*/
void setSimpleForm(boolean isSimpleForm)
{
this.isSimpleForm = isSimpleForm;
SIPAccountCreationFormService createAccountService
= regform.getCreateAccountService();
if (createAccountService != null && isSimpleForm)
{
registrationForm = createAccountService.getForm();
if (uinPassPanel != null)
mainPanel.remove(uinPassPanel);
registerChoicePanel = createRegisterChoicePanel();
mainPanel.add(registerChoicePanel, BorderLayout.NORTH);
}
else
{
if (registerChoicePanel != null)
mainPanel.remove(registerChoicePanel);
mainPanel.add(uinPassPanel, BorderLayout.NORTH);
}
}
/**
* Returns <tt>true</tt> if this panel is opened in a simple form and
* <tt>false</tt> if it's opened in an advanced form.
*
* @return <tt>true</tt> if this panel is opened in a simple form and
* <tt>false</tt> if it's opened in an advanced form
*/
boolean isSimpleForm()
{
return isSimpleForm;
}
/**
* Selects the create account button.
*/
void setCreateButtonSelected()
{
createAccountButton.setSelected(true);
}
}