package games.strategy.engine.framework.startup.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import games.strategy.engine.ClientFileSystemHelper;
import games.strategy.engine.framework.GameRunner;
import games.strategy.ui.IntTextField;
import games.strategy.ui.SwingAction;
/**
* UI for choosing server options.
*/
public class ServerOptions extends JDialog {
private static final long serialVersionUID = -9074816386666798281L;
private JTextField m_nameField;
private IntTextField m_portField;
private JPasswordField m_passwordField;
private boolean m_okPressed;
private JCheckBox m_requirePasswordCheckBox;
private JTextField m_comment;
private boolean m_showComment = false;
/**
* Creates a new instance of ServerOptions.
*/
public ServerOptions(final Component owner, final String defaultName, final int defaultPort,
final boolean showComment) {
super(owner == null ? null : JOptionPane.getFrameForComponent(owner), "Server options", true);
m_showComment = showComment;
initComponents();
layoutComponents();
setupActions();
m_nameField.setText(defaultName);
m_portField.setValue(defaultPort);
setWidgetActivation();
pack();
}
public void setNameEditable(final boolean editable) {
m_nameField.setEditable(editable);
}
private void setupActions() {
m_requirePasswordCheckBox.addActionListener(e -> setWidgetActivation());
}
@Override
public String getName() {
// fixes crash by truncating names to 20 characters
final String s = m_nameField.getText().trim();
if (s.length() > 20) {
return s.substring(0, 20);
}
return s;
}
public String getPassword() {
if (!m_requirePasswordCheckBox.isSelected()) {
return null;
}
final String password = new String(m_passwordField.getPassword());
if (password.trim().length() == 0) {
return null;
}
return password;
}
public int getPort() {
return m_portField.getValue();
}
private void initComponents() {
m_nameField = new JTextField(10);
m_portField = new IntTextField(0, Integer.MAX_VALUE);
m_portField.setColumns(7);
m_passwordField = new JPasswordField();
m_passwordField.setColumns(10);
m_comment = new JTextField();
m_comment.setColumns(20);
}
private void layoutComponents() {
final Container content = getContentPane();
content.setLayout(new BorderLayout());
final JPanel title = new JPanel();
title.add(new JLabel("Select server options"));
content.add(title, BorderLayout.NORTH);
final Insets labelSpacing = new Insets(3, 7, 0, 0);
final Insets fieldSpacing = new Insets(3, 5, 0, 7);
final GridBagConstraints labelConstraints = new GridBagConstraints();
labelConstraints.anchor = GridBagConstraints.WEST;
labelConstraints.gridx = 0;
labelConstraints.insets = labelSpacing;
final GridBagConstraints fieldConstraints = new GridBagConstraints();
fieldConstraints.anchor = GridBagConstraints.WEST;
fieldConstraints.gridx = 1;
fieldConstraints.insets = fieldSpacing;
m_requirePasswordCheckBox = new JCheckBox("");
final JLabel passwordRequiredLabel = new JLabel("Require Password:");
final JPanel fields = new JPanel();
final GridBagLayout layout = new GridBagLayout();
fields.setLayout(layout);
final JLabel nameLabel = new JLabel("Name:");
final JLabel portLabel = new JLabel("Port:");
final JLabel passwordLabel = new JLabel("Password:");
final JLabel commentLabel = new JLabel("Comments:");
layout.setConstraints(portLabel, labelConstraints);
layout.setConstraints(nameLabel, labelConstraints);
layout.setConstraints(passwordLabel, labelConstraints);
layout.setConstraints(m_portField, fieldConstraints);
layout.setConstraints(m_nameField, fieldConstraints);
layout.setConstraints(m_passwordField, fieldConstraints);
layout.setConstraints(m_requirePasswordCheckBox, fieldConstraints);
layout.setConstraints(passwordRequiredLabel, labelConstraints);
fields.add(nameLabel);
fields.add(m_nameField);
fields.add(portLabel);
fields.add(m_portField);
fields.add(passwordRequiredLabel);
fields.add(m_requirePasswordCheckBox);
fields.add(passwordLabel);
fields.add(m_passwordField);
if (m_showComment) {
layout.setConstraints(commentLabel, labelConstraints);
layout.setConstraints(m_comment, fieldConstraints);
fields.add(commentLabel);
fields.add(m_comment);
}
content.add(fields, BorderLayout.CENTER);
final JPanel buttons = new JPanel();
buttons.add(new JButton(m_okAction));
buttons.add(new JButton(m_cancelAction));
content.add(buttons, BorderLayout.SOUTH);
}
public boolean getOKPressed() {
return m_okPressed;
}
private void setWidgetActivation() {
m_passwordField.setEnabled(m_requirePasswordCheckBox.isSelected());
final Color backGround = m_passwordField.isEnabled() ? m_portField.getBackground() : getBackground();
m_passwordField.setBackground(backGround);
if (ClientFileSystemHelper.areWeOldExtraJar()
&& System.getProperty(GameRunner.TRIPLEA_SERVER_PROPERTY, "false").equalsIgnoreCase("true")) {
setNameEditable(false);
}
}
private final Action m_okAction = SwingAction.of("OK", e -> {
setVisible(false);
m_okPressed = true;
});
private final Action m_cancelAction = SwingAction.of("Cancel", e -> setVisible(false));
public String getComments() {
return m_comment.getText();
}
}