// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.gui;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Window;
import java.awt.event.KeyEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public final class NewChrSettings extends NewAbstractSettings
{
private JTextField tfName;
private ChrConfig config;
public NewChrSettings(Window parent)
{
super(parent, "CHR settings");
config = new ChrConfig();
initDialog(parent);
}
public NewChrSettings(Window parent, String name)
{
super(parent, "CHR settings");
config = new ChrConfig(name);
initDialog(parent);
}
@Override
public ChrConfig getConfig()
{
return config;
}
@Override
protected void accept()
{
config.setName(tfName.getText());
super.accept();
}
private void initDialog(Window parent)
{
tfName = new JTextField();
tfName.setColumns(32); // visible space for 32 characters
tfName.setDocument(new FixedDocument(tfName, 32));
JLabel label = new JLabel("Enter character name (max. 32 chars):");
label.setLabelFor(tfName);
label.setDisplayedMnemonic(KeyEvent.VK_E);
JPanel panel = new JPanel(new GridBagLayout());
Container pane = getContentPane();
pane.add(panel);
GridBagConstraints gbc = new GridBagConstraints();
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
buttonPanel.add(acceptButton());
buttonPanel.add(rejectButton());
gbc.insets = new Insets(10, 10, 3, 10);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.NONE;
panel.add(label, gbc);
gbc.insets = new Insets(0, 10, 10, 10);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
panel.add(tfName, gbc);
gbc.insets = new Insets(0, 5, 5, 5);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.SOUTHEAST;
gbc.fill = GridBagConstraints.NONE;
panel.add(buttonPanel, gbc);
pack();
setMinimumSize(getPreferredSize());
setLocationRelativeTo(parent);
setCancelOnEscape(true);
setVisible(true);
}
//-------------------------- INNER CLASSES --------------------------
public class ChrConfig
{
private String name; // field at offset 0x08
public ChrConfig()
{
setName("");
}
public ChrConfig(String newName)
{
setName(newName);
}
public String getName()
{
return name;
}
private void setName(String newName)
{
if (newName != null)
name = (newName.length() <= 32) ? newName : newName.substring(0, 32);
else
name = "";
}
}
// Ensures a size limit on byte level
private class FixedDocument extends PlainDocument
{
private int maxLength;
private JTextField textField;
FixedDocument(JTextField text, int length)
{
super();
textField = text;
maxLength = length >= 0 ? length : 0;
}
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
{
if (str == null || textField == null ||
textField.getText().getBytes().length + str.getBytes().length > maxLength)
return;
super.insertString(offs, str, a);
}
}
}