/*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
package com.l2jserver.configurator;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.List;
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;
/**
*
*
* @author KenM
*/
public class JIPTextField extends JPanel implements FocusListener
{
/**
* Comment for serialVersionUID
*/
private static final long serialVersionUID = 1L;
private JTextField[] _textFields;
private List _focusListeners;
public JIPTextField(String textIp)
{
super.addFocusListener(this);
initIPTextField(textIp);
for (int i = 0; i < _textFields.length; i++)
{
_textFields[i].addFocusListener(this);
}
}
public JIPTextField()
{
this("...");
}
/**
* @param value
*/
public JIPTextField(Inet4Address value)
{
this(value.getHostAddress());
}
private void initIPTextField(String textIp)
{
final ActionListener nextfocusaction = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
((Component) evt.getSource()).transferFocus();
}
};
this.setLayout(new GridBagLayout());
_textFields = new JTextField[4];
GridBagConstraints cons = new GridBagConstraints();
cons.anchor = GridBagConstraints.PAGE_START;
cons.fill = GridBagConstraints.HORIZONTAL;
cons.insets = new Insets(1, 1, 1, 1);
cons.gridx = 0;
cons.gridy = 0;
MaxLengthDocument previous = null;
String[] parts = textIp.split("\\.");
for (int i = 0; i < 4; i++)
{
String str = parts[i];
if (i > 0)
{
JLabel dot = new JLabel(".");
cons.weightx = 0;
add(dot, cons);
cons.gridx++;
}
MaxLengthDocument maxDoc = new MaxLengthDocument(3);
_textFields[i] = new JTextField(maxDoc, str, 3);
if (previous != null)
{
previous.setNext(_textFields[i]);
}
previous = maxDoc;
//ic.weightx = 1;
add(_textFields[i], cons);
_textFields[i].addActionListener(nextfocusaction);
cons.gridx++;
}
}
@Override
public void addFocusListener(FocusListener fl)
{
if (_focusListeners == null)
{
_focusListeners = new LinkedList();
}
if (fl != null && !_focusListeners.contains(fl))
{
_focusListeners.add(fl);
}
}
@Override
public void removeFocusListener(FocusListener fl)
{
if (_focusListeners != null)
{
_focusListeners.remove(fl);
}
}
public String getText()
{
String str = "";
for (int i = 0; i < 4; i++)
{
if (_textFields[i].getText().length() == 0)
{
str += "0";
}
else
{
str += _textFields[i].getText();
}
if (i < 3)
{
str += ".";
}
}
return str;
}
public void setText(String str)
{
try
{
// make sure string is not null; throw a NullPointerException otherwise
str.length();
InetAddress ip = InetAddress.getByName(str);
byte b[] = ip.getAddress();
for (int i = 0; i < 4; i++)
{
// byte always have a sign in Java, IP addresses aren't
if (b[i] >= 0)
{
_textFields[i].setText(Byte.toString(b[i]));
}
else
{
_textFields[i].setText(Integer.toString(b[i] + 256));
}
}
return;
}
catch (UnknownHostException ex)
{
}
catch (NullPointerException npe)
{
}
for (int i = 0; i < 4; i++)
{
_textFields[i].setText("");
}
}
@Override
public void setEnabled(boolean enabled)
{
for(int i=0;i<_textFields.length;i++)
{
if(_textFields[i] != null)
{
_textFields[i].setEnabled(enabled);
}
}
}
public boolean isEmpty()
{
for (int i = 0; i < 4; i++)
{
if (_textFields[i].getText().length() != 0)
{
return false;
}
}
return true;
}
public boolean isCorrect()
{
for (int i = 0; i < 4; i++)
{
if (_textFields[i].getText().length() == 0)
{
return false;
}
}
return true;
}
public void focusGained(FocusEvent event)
{
if (_focusListeners != null)
{
for (FocusListener fl : _focusListeners)
{
fl.focusGained(event);
}
}
}
public void focusLost(FocusEvent event)
{
if (isCorrect() || isEmpty())
{
if (_focusListeners != null)
{
for (FocusListener fl : _focusListeners)
{
fl.focusLost(event);
}
}
}
}
public class MaxLengthDocument extends PlainDocument
{
/**
* Comment for serialVersionUID
*/
private static final long serialVersionUID = 1L;
private int _max;
private JTextField _next;
public MaxLengthDocument(int maxLength)
{
this(maxLength, null);
}
public MaxLengthDocument(int maxLength, JTextField next)
{
_max = maxLength;
setNext(next);
}
@Override
public void insertString(int offset, String str, AttributeSet a) throws BadLocationException
{
if (getLength() + str.length() > _max)
{
if (getNext() != null)
{
if (this.getNext().getText().length() > 0)
{
this.getNext().select(0, this.getNext().getText().length());
}
else
{
this.getNext().getDocument().insertString(0, str, a);
}
getNext().requestFocusInWindow();
}
else
{
Toolkit.getDefaultToolkit().beep();
}
}
else
{
super.insertString(offset, str, a);
}
}
/**
* @param next The next to set.
*/
public void setNext(JTextField next)
{
_next = next;
}
/**
* @return Returns the next.
*/
public JTextField getNext()
{
return _next;
}
}
}