Files
i2p.itoopie/src/net/i2p/itoopie/gui/ConfigurationTab.java
zzz 9fc4c2b821 Change build target to Java 8
Change translation tag from deprecated _ to _t
Add support for faster translation bundle generation
Change bundle format from java to java2
2022-01-01 09:31:42 -05:00

441 lines
14 KiB
Java

package net.i2p.itoopie.gui;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map.Entry;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException;
import net.i2p.itoopie.gui.StatusHandler.DEFAULT_STATUS;
import net.i2p.itoopie.gui.component.LogoPanel;
import net.i2p.itoopie.gui.component.TabLogoPanel;
import net.i2p.itoopie.i18n.Transl;
import net.i2p.itoopie.i2pcontrol.InvalidParametersException;
import net.i2p.itoopie.i2pcontrol.InvalidPasswordException;
import net.i2p.itoopie.i2pcontrol.methods.GetNetworkSetting;
import net.i2p.itoopie.i2pcontrol.methods.RouterManager.ROUTER_MANAGER;
import net.i2p.itoopie.i2pcontrol.methods.SetRouterManager;
import net.i2p.itoopie.i2pcontrol.methods.NetworkSetting.NETWORK_SETTING;
import net.i2p.itoopie.i2pcontrol.methods.SetNetworkSetting;
// The width of this panel (on ubuntu) will be the width of the main menu -24px.
public class ConfigurationTab extends TabLogoPanel {
private final static String SETTINGS_READ = Transl._t("Settings read from I2P router.");
private static enum SAVE_STATUS{
SAVE_FAILED_LOCALLY { public String toString(){return Transl._t("Settings aren't valid, not saving.");} },
SAVE_FAILED_REMOTELY { public String toString(){return Transl._t("I2P router rejected settings.");} },
SAVE_FAILED_NO_CONN { public String toString(){return Transl._t("Not connected, unable to save.");} },
SAVED_OK { public String toString(){return Transl._t("Saved settings on I2P router.");} },
SAVED_RESTART_NEEDED { public String toString(){return Transl._t("Saved settings on I2P router. I2P router needs to be restarted.");} }
};
// Components for the network panel
private JLabel lblNetwork;
private JLabel lblTCPPort;
private JTextField txtTCPPort;
private JLabel lblUDPPort;
private JTextField txtUDPPort;
private JLabel lblUPNP;
private JCheckBox chkbxUPNP;
// Components for the bandwidth panel
private JLabel lblBW;
private JLabel lblDownload;
private JTextField txtDownload;
private JLabel lblDownloadUnit;
private JLabel lblUpload;
private JTextField txtUpload;
private JLabel lblUploadUnit;
private JLabel lblShare;
private JTextField txtShare;
private JLabel lblShareUnit;
private static final long serialVersionUID = 328657255717753899L;
public ConfigurationTab(String imageName) {
super(imageName);
setLayout(null);
JPanel networkPanel = new JPanel();
add(networkPanel);
networkPanel.setLayout(null);
networkPanel.setOpaque(false);
networkPanel.setBounds(0, 110, 262, 115);
setupNetworkPanel(networkPanel);
JPanel bwPanel = new JPanel();
add(bwPanel);
bwPanel.setLayout(null);
bwPanel.setOpaque(false);
bwPanel.setBounds(0, 5, 262, 105);
setupBandwidthPanel(bwPanel);
final JButton btnApply = new JButton(Transl._t("Apply"));
add(btnApply);
btnApply.setBounds(442, 269, 82, 24);
btnApply.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
applyNewSettings();
}
});
}
});
btnApply.addMouseListener(new MouseAdapter(){
@Override
public void mouseEntered(MouseEvent arg0) {
getRootPane().repaint(); // Removes a transparent ring around button after mouse hovering.
}
@Override
public void mouseExited(MouseEvent arg0) {
getRootPane().repaint(); // Removes a transparent ring around button after mouse hovering.
}
});
validate();
}
/**
* Setup bandwidth panel
*/
private void setupBandwidthPanel(JPanel bwPanel){
lblBW = new JLabel();
bwPanel.add(lblBW);
lblBW.setBounds(10, 10, 120, 15);
lblBW.setText(Transl._t("Bandwidth:"));
lblDownload = new JLabel();
bwPanel.add(lblDownload);
lblDownload.setBounds(40, 35, 100, 15);
lblDownload.setText(Transl._t("Download:"));
txtDownload = new JTextField();
bwPanel.add(txtDownload);
txtDownload.setBounds(130, 35, 55, 20);
lblDownloadUnit = new JLabel();
bwPanel.add(lblDownloadUnit);
lblDownloadUnit.setBounds(190, 37, 35, 15);
lblDownloadUnit.setText(Transl._t("KB/s"));
lblUpload = new JLabel();
bwPanel.add(lblUpload);
lblUpload.setBounds(40, 60, 100, 15);
lblUpload.setText(Transl._t("Upload:"));
txtUpload = new JTextField();
bwPanel.add(txtUpload);
txtUpload.setBounds(130, 60, 55, 20);
lblUploadUnit = new JLabel();
bwPanel.add(lblUploadUnit);
lblUploadUnit.setBounds(190, 62, 35, 15);
lblUploadUnit.setText(Transl._t("KB/s"));
lblShare = new JLabel();
bwPanel.add(lblShare);
lblShare.setBounds(40, 85, 100, 15);
lblShare.setText(Transl._t("Share:"));
txtShare = new JTextField();
bwPanel.add(txtShare);
txtShare.setBounds(130, 85, 55, 20);
lblShareUnit = new JLabel();
bwPanel.add(lblShareUnit);
lblShareUnit.setBounds(190, 87, 35, 15);
lblShareUnit.setText("%");
}
/**
* Setup network panel
*/
private void setupNetworkPanel(JPanel networkPanel){
lblNetwork = new JLabel();
networkPanel.add(lblNetwork);
lblNetwork.setBounds(10, 10, 75, 15);
lblNetwork.setText(Transl._t("Network:"));
lblTCPPort = new JLabel();
networkPanel.add(lblTCPPort);
lblTCPPort.setBounds(40, 35, 75, 15);
lblTCPPort.setText(Transl._t("TCP port:"));
txtTCPPort = new JTextField();
networkPanel.add(txtTCPPort);
txtTCPPort.setBounds(130, 35, 55, 20);
txtTCPPort.setColumns(5);
lblUDPPort = new JLabel();
networkPanel.add(lblUDPPort);
lblUDPPort.setBounds(40, 60, 75, 15);
lblUDPPort.setText(Transl._t("UDP port:"));
txtUDPPort = new JTextField();
networkPanel.add(txtUDPPort);
txtUDPPort.setBounds(130, 60, 55, 20);
lblUPNP = new JLabel();
networkPanel.add(lblUPNP);
lblUPNP.setBounds(40, 85, 75, 15);
lblUPNP.setText(Transl._t("UPNP:"));
chkbxUPNP = new JCheckBox(Transl._t("Enable UPNP"));
chkbxUPNP.setOpaque(false);
networkPanel.add(chkbxUPNP);
chkbxUPNP.setBounds(127, 85, 120, 15);
}
private void populateSettings(){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
try {
EnumMap<NETWORK_SETTING, Object> em = GetNetworkSetting.execute(NETWORK_SETTING.TCP_PORT, NETWORK_SETTING.UDP_PORT,
NETWORK_SETTING.UPNP, NETWORK_SETTING.BW_IN, NETWORK_SETTING.BW_OUT, NETWORK_SETTING.BW_SHARE);
txtTCPPort.setText((String) em.get(NETWORK_SETTING.TCP_PORT));
txtUDPPort.setText((String) em.get(NETWORK_SETTING.UDP_PORT));
boolean upnpValue = Boolean.parseBoolean((String) em.get(NETWORK_SETTING.UPNP));
chkbxUPNP.setSelected(upnpValue);
txtDownload.setText((String) em.get(NETWORK_SETTING.BW_IN));
txtUpload.setText((String) em.get(NETWORK_SETTING.BW_OUT));
txtShare.setText((String) em.get(NETWORK_SETTING.BW_SHARE));
StatusHandler.setStatus(SETTINGS_READ);
} catch (InvalidPasswordException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.INVALID_PASSWORD);
} catch (JSONRPC2SessionException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.NOT_CONNECTED);
}
}
});
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JFrame frame = new JFrame();
frame.setBounds(0, 0, Main.FRAME_WIDTH, Main.FRAME_HEIGHT);
ConfigurationTab window = new ConfigurationTab("itoopie-opaque12");
frame.add(window);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private SAVE_STATUS saveSettings(){
String tcpPort = txtTCPPort.getText();
String udpPort = txtUDPPort.getText();
String upnp = Boolean.toString(chkbxUPNP.isSelected());
String download = txtDownload.getText();
String upload = txtUpload.getText();
String share = txtShare.getText();
int tcpPortOutput = -1; // Not a valid value.
int udpPortOutput = -1; // Not a valid value.
int downloadOutput;
int uploadOutput;
int shareOutput = -1; // Not a valid value.
//Check TCP port
try {
tcpPortOutput = Integer.parseInt(tcpPort);
if (tcpPortOutput < 1 || tcpPortOutput > 65535){
throw new NumberFormatException();
}
} catch (NumberFormatException e){
JOptionPane.showConfirmDialog(
this,
Transl._t("\"{0}\" cannot be interpreted as a port.", tcpPort) + "\n\n" +
Transl._t("Port must be a number in the range 1-65535."),
Transl._t("Invalid port."),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
return SAVE_STATUS.SAVE_FAILED_LOCALLY;
}
//Check UDP port
try {
udpPortOutput = Integer.parseInt(udpPort);
if (udpPortOutput < 1 || udpPortOutput > 65535){
throw new NumberFormatException();
}
} catch (NumberFormatException e){
JOptionPane.showConfirmDialog(
this,
Transl._t("\"{0}\" cannot be interpreted as a port.", udpPort) + "\n\n" +
Transl._t("Port must be a number in the range 1-65535."),
Transl._t("Invalid port."),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
return SAVE_STATUS.SAVE_FAILED_LOCALLY;
}
//Check download
try {
downloadOutput = Integer.parseInt(download);
if (downloadOutput < 1){
throw new NumberFormatException();
}
} catch (NumberFormatException e){
JOptionPane.showConfirmDialog(
this,
Transl._t("\"{0}\" cannot be interpreted as a speed.", download) + "\n\n" +
Transl._t("Speed must be a number larger than 0."),
Transl._t("Invalid download speed."),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
return SAVE_STATUS.SAVE_FAILED_LOCALLY;
}
//Check Upload
try {
uploadOutput = Integer.parseInt(upload);
if (uploadOutput < 1){
throw new NumberFormatException();
}
} catch (NumberFormatException e){
JOptionPane.showConfirmDialog(
this,
Transl._t("\"{0}\" cannot be interpreted as a speed.", upload) + "\n\n" +
Transl._t("Speed must be a number larger than 0."),
Transl._t("Invalid upload speed."),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
return SAVE_STATUS.SAVE_FAILED_LOCALLY;
}
//Check share
try {
shareOutput = Integer.parseInt(share);
if (shareOutput < 0 || shareOutput > 100){
throw new NumberFormatException();
}
} catch (NumberFormatException e){
JOptionPane.showConfirmDialog(
this,
Transl._t("\"{0}\" cannot be interpreted as a percentage.", share) + "\n\n" +
Transl._t("Percentage must be a number in the range 0-100."),
Transl._t("Invalid share percentage."),
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
}
HashMap<NETWORK_SETTING, String> output = new HashMap<NETWORK_SETTING, String>();
output.put(NETWORK_SETTING.TCP_PORT, tcpPortOutput+"");
output.put(NETWORK_SETTING.UDP_PORT, udpPortOutput+"");
output.put(NETWORK_SETTING.BW_IN, downloadOutput+"");
output.put(NETWORK_SETTING.BW_OUT, uploadOutput+"");
output.put(NETWORK_SETTING.BW_SHARE, shareOutput+"");
try {
EnumMap<NETWORK_SETTING, Object> em = SetNetworkSetting.execute(output);
StatusHandler.setDefaultStatus(DEFAULT_STATUS.CONNECTED);
boolean settingsSaved = (Boolean) em.get(NETWORK_SETTING.SETTINGS_SAVED);
boolean restartNeeded = (Boolean) em.get(NETWORK_SETTING.RESTART_NEEDED);
if (settingsSaved && restartNeeded){
return SAVE_STATUS.SAVED_RESTART_NEEDED;
} else if (settingsSaved){
return SAVE_STATUS.SAVED_OK;
} else {
return SAVE_STATUS.SAVE_FAILED_REMOTELY;
}
} catch (InvalidPasswordException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.INVALID_PASSWORD);
return SAVE_STATUS.SAVE_FAILED_LOCALLY;
} catch (JSONRPC2SessionException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.NOT_CONNECTED);
return SAVE_STATUS.SAVE_FAILED_NO_CONN;
} catch (InvalidParametersException e) {
return SAVE_STATUS.SAVE_FAILED_REMOTELY;
}
}
private void applyNewSettings(){
switch (saveSettings()){
case SAVED_RESTART_NEEDED:
StatusHandler.setStatus(SAVE_STATUS.SAVED_RESTART_NEEDED.toString());
int n = JOptionPane.showConfirmDialog(
this,
Transl._t("The new settings have been applied,\n" + "" +
"but the I2P router needs to be restarted for some to take effect.\n" +
"\nWould you like to restart the I2P router now?"),
Transl._t("Restart needed for new settings."),
JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE);
if (n == JOptionPane.YES_OPTION){
try {
HashMap<ROUTER_MANAGER, String> hm = new HashMap<ROUTER_MANAGER,String>();
hm.put(ROUTER_MANAGER.RESTART, null);
SetRouterManager.execute(hm);
StatusHandler.setStatus(Transl._t("Restarting I2P node"));
} catch (InvalidPasswordException e) {
StatusHandler.setStatus(Transl._t("Restart failed") + ": " + DEFAULT_STATUS.INVALID_PASSWORD);
} catch (JSONRPC2SessionException e) {
StatusHandler.setStatus(Transl._t("Restart failed") + ": " + DEFAULT_STATUS.NOT_CONNECTED);
}
}
break;
case SAVED_OK:
StatusHandler.setStatus(SAVE_STATUS.SAVED_OK.toString());
break;
case SAVE_FAILED_REMOTELY:
StatusHandler.setStatus(SAVE_STATUS.SAVE_FAILED_REMOTELY.toString());
break;
case SAVE_FAILED_LOCALLY:
StatusHandler.setStatus(SAVE_STATUS.SAVE_FAILED_LOCALLY.toString());
break;
case SAVE_FAILED_NO_CONN:
StatusHandler.setStatus(SAVE_STATUS.SAVE_FAILED_NO_CONN.toString());
break;
}
}
@Override
public void onTabFocus(ChangeEvent e) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
populateSettings();
}
});
}
}