// NetworkPanel
package org.javamoney.examples.ez.money.gui.dialog.preferences;
import static org.javamoney.examples.ez.common.utility.BorderHelper.createTitledBorder;
import static org.javamoney.examples.ez.common.utility.ButtonHelper.buildButton;
import static org.javamoney.examples.ez.money.ApplicationProperties.getProxy;
import static org.javamoney.examples.ez.money.ApplicationProperties.setProxyAddress;
import static org.javamoney.examples.ez.money.ApplicationProperties.setProxyConnectionType;
import static org.javamoney.examples.ez.money.ApplicationProperties.setProxyPort;
import static org.javamoney.examples.ez.money.ApplicationProperties.setProxyType;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.net.Proxy;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JTextField;
import org.javamoney.examples.ez.common.gui.ComboBox;
import org.javamoney.examples.ez.common.gui.Panel;
import org.javamoney.examples.ez.common.gui.RadioButton;
import org.javamoney.examples.ez.common.net.ProxyConnectionTypeKeys;
import org.javamoney.examples.ez.common.net.ProxyWrapper;
import org.javamoney.examples.ez.common.utility.ClipboardMenuController;
import org.javamoney.examples.ez.common.utility.I18NHelper;
import org.javamoney.examples.ez.common.utility.TextConstrainer;
/**
* This class facilitates configuring the network.
*/
public
final
class
NetworkPanel
extends PreferencesPanel
{
/**
* Constructs a new preferences panel.
*/
public
NetworkPanel()
{
super(PreferencesKeys.NETWORK);
setProxyTypeChooser(new ComboBox(PROXY_TYPES));
createLabels();
createRadioButtons();
createFields();
initializeForm();
buildPanel();
// Add listeners.
getProxyTypeChooser().addActionListener(new ActionHandler());
}
//////////////////////////////////////////////////////////////////////////////
// Start of private methods.
//////////////////////////////////////////////////////////////////////////////
private
void
buildPanel()
{
// Build panel.
setFill(GridBagConstraints.BOTH);
addEmptyCellAt(0, 0);
add(createProxyPanel(), 0, 1, 1, 1, 100, 100);
}
private
void
createFields()
{
itsFields = new JTextField[2];
for(int len = 0; len < getFields().length; ++len)
{
getFields()[len] = new JTextField();
// Add listeners.
getFields()[len].addFocusListener(new FocusHandler());
new ClipboardMenuController(getFields()[len]);
}
getFields()[MANUAL_PORT].setDocument(new TextConstrainer(5, "0123456789"));
}
private
void
createLabels()
{
String gap = ": ";
itsLabels = new JLabel[3];
getLabels()[MANUAL_ADDRESS] = new JLabel(getProperty("manual.address") + gap);
getLabels()[MANUAL_PORT] = new JLabel(getProperty("manual.port") + gap);
getLabels()[MANUAL_TYPE] = new JLabel(getProperty("manual.type") + gap);
}
private
Panel
createManualProxyPanel()
{
Panel panel = new Panel();
// Build panel.
panel.setAnchor(GridBagConstraints.NORTHEAST);
panel.add(getLabels()[MANUAL_ADDRESS], 0, 0, 1, 1, 75, 25);
panel.add(getLabels()[MANUAL_PORT], 3, 0, 1, 1, 25, 0);
panel.add(createManualProxyTypePanel(), 0, 2, 4, 1, 0, 75);
panel.setFill(GridBagConstraints.HORIZONTAL);
panel.add(getFields()[MANUAL_ADDRESS], 1, 0, 1, 1, 0, 0);
panel.add(getFields()[MANUAL_PORT], 4, 0, 1, 1, 0, 0);
// Aesthetic spacers.
panel.addEmptyCellAt(1, 1, 25);
panel.addEmptyCellAt(2, 1);
panel.addEmptyCellAt(4, 1, 8);
return panel;
}
private
Panel
createManualProxyTypePanel()
{
Panel panel = new Panel();
// Build panel.
panel.setAnchor(GridBagConstraints.NORTHEAST);
panel.add(getLabels()[MANUAL_TYPE], 0, 0, 1, 1, 100, 100);
panel.setFill(GridBagConstraints.HORIZONTAL);
panel.add(getProxyTypeChooser(), 1, 0, 1, 1, 0, 0);
// Ensure enough width for the chooser.
panel.addEmptyCellAt(1, 0, 8);
return panel;
}
private
Panel
createProxyPanel()
{
Panel panel = new Panel();
// Build panel.
panel.setAnchor(GridBagConstraints.WEST);
panel.add(getRadioButtons()[DIRECT], 0, 0, 1, 1, 100, 25);
panel.add(getRadioButtons()[MANUAL], 0, 1, 1, 1, 0, 25);
panel.setFill(GridBagConstraints.BOTH);
panel.add(createManualProxyPanel(), 0, 2, 1, 1, 0, 50);
panel.setBorder(createTitledBorder(getProperty("title"), false));
panel.setInsets(new Insets(25, 25, 100, 200));
return panel;
}
private
void
createRadioButtons()
{
ActionHandler handler = new ActionHandler();
ButtonGroup group = new ButtonGroup();
itsRadioButtons = new RadioButton[2];
for(int len = 0; len < getRadioButtons().length; ++len)
{
getRadioButtons()[len] = new RadioButton();
}
// Build buttons.
buildButton(getRadioButtons()[MANUAL], getProperty("manual"), handler, group);
buildButton(getRadioButtons()[DIRECT], getProperty("direct"), handler, group);
}
private
void
enableForm(RadioButton selectedRadioButton)
{
boolean enable = (selectedRadioButton == getRadioButtons()[MANUAL]);
for(int len = 0; len < getLabels().length; ++len)
{
getLabels()[len].setEnabled(enable);
}
for(int len = 0; len < getFields().length; ++len)
{
getFields()[len].setEnabled(enable);
}
getProxyTypeChooser().setEnabled(enable);
}
private
JTextField[]
getFields()
{
return itsFields;
}
private
JLabel[]
getLabels()
{
return itsLabels;
}
private
static
String
getProperty(String key)
{
return I18NHelper.getProperty("NetworkPanel." + key);
}
private
ComboBox
getProxyTypeChooser()
{
return itsProxyTypeChooser;
}
private
RadioButton[]
getRadioButtons()
{
return itsRadioButtons;
}
private
void
initializeForm()
{
ProxyWrapper proxyWrapper = getProxy();
// Fill out form.
getProxyTypeChooser().setSelectedItem(proxyWrapper.getType().toString());
getFields()[MANUAL_ADDRESS].setText(proxyWrapper.getAddress());
getFields()[MANUAL_PORT].setText("" + proxyWrapper.getPort());
// Select the current proxy setting and enable the form.
getRadioButtons()[proxyWrapper.getConnectionType().ordinal()].setSelected(true);
enableForm(getRadioButtons()[proxyWrapper.getConnectionType().ordinal()]);
}
private
void
setProxyTypeChooser(ComboBox chooser)
{
itsProxyTypeChooser = chooser;
}
//////////////////////////////////////////////////////////////////////////////
// Start of inner classes.
//////////////////////////////////////////////////////////////////////////////
private
class
ActionHandler
implements ActionListener
{
public
void
actionPerformed(ActionEvent event)
{
Object source = event.getSource();
if(source == getProxyTypeChooser())
{
Proxy.Type type = Proxy.Type.valueOf(PROXY_TYPES[getProxyTypeChooser().getSelectedIndex()]);
setProxyType(type);
}
else
{
enableForm((RadioButton)source);
if(source == getRadioButtons()[DIRECT])
{
setProxyConnectionType(ProxyConnectionTypeKeys.DIRECT);
}
else
{
setProxyConnectionType(ProxyConnectionTypeKeys.MANUAL);
}
}
}
}
private
class
FocusHandler
extends FocusAdapter
{
@Override
public
void
focusLost(FocusEvent event)
{
if(event.getSource() == getFields()[MANUAL_ADDRESS])
{
setProxyAddress(getFields()[MANUAL_ADDRESS].getText());
}
else
{
int port = -1;
try
{
port = Integer.parseInt(getFields()[MANUAL_PORT].getText());
}
catch(Exception exception)
{
// Ignored.
}
setProxyPort(port);
}
}
}
//////////////////////////////////////////////////////////////////////////////
// Start of class members.
//////////////////////////////////////////////////////////////////////////////
private JTextField[] itsFields;
private JLabel[] itsLabels;
private ComboBox itsProxyTypeChooser;
private RadioButton[] itsRadioButtons;
private static final int DIRECT = 0;
private static final int MANUAL = 1;
private static final int MANUAL_ADDRESS = 0;
private static final int MANUAL_PORT = 1;
private static final int MANUAL_TYPE = 2;
private static final String[] PROXY_TYPES = {"HTTP", "SOCKS"};
}