/*
 * Copyright 2000-2010 JetBrains s.r.o.
 *
 * 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 com.intellij.util.net;

import org.jetbrains.annotations.Nullable;

import javax.swing.*;

/**
 * Panel for authentication - contains text fields for login and password, and a checkbox to remember
 * password in the Password Safe.
 * 
 * @author stathik
 * @author Kirill Likhodedov
 */
public class AuthenticationPanel extends JPanel {
  private JPanel myMainPanel;
  private JLabel myDescriptionLabel;
  private JTextField myLoginTextField;
  private JPasswordField myPasswordTextField;
  private JCheckBox rememberPasswordCheckBox;

  /**
   * @param description       Description text above the text fields.
   * @param login             Initial login value.
   * @param password          Initial password value.
   * @param rememberPassword  Default value for the 'remember password' checkbox.
   * If true, the checkbox will be selected; if false, the checkbox won't be selected; if null, there will be no checkbox for remembering
   * password.
   */
  public AuthenticationPanel(@Nullable String description, @Nullable String login, @Nullable String password, @Nullable Boolean rememberPassword) {
    add(myMainPanel);
    myDescriptionLabel.setText(description);
    myLoginTextField.setText(login);
    myPasswordTextField.setText(password);
    if (rememberPassword == null) {
      rememberPasswordCheckBox.setVisible(false);
    } else {
      rememberPasswordCheckBox.setSelected(rememberPassword);
    }
  }

  public String getLogin () {
    return myLoginTextField.getText();
  }

  public char[] getPassword () {
    return myPasswordTextField.getPassword();
  }

  public boolean isRememberPassword () {
    return rememberPasswordCheckBox.isSelected();
  }

  /**
   * @return the component which should be focused when the dialog appears on the screen. May be used in dialogs.
   * @see com.intellij.openapi.ui.DialogWrapper#getPreferredFocusedComponent()
   */
  public JComponent getPreferredFocusedComponent() {
    return getLogin().isEmpty() ? myLoginTextField : myPasswordTextField;
  }

}
