Implemented support for changing password and port of I2PControl in the settings frame.

This commit is contained in:
dev
2011-07-20 09:45:19 +00:00
parent d1ea42932f
commit e9071b5cf1
4 changed files with 307 additions and 73 deletions

View File

@ -128,7 +128,7 @@ public class Main {
private static void testStuff(){ private static void testStuff(){
_conf.parseConfigStr("server.hostname=127.0.0.1"); _conf.parseConfigStr("server.hostname=127.0.0.1");
_conf.parseConfigStr("server.port=7888"); _conf.parseConfigStr("server.port=5555");
_conf.parseConfigStr("server.target=jsonrpc"); _conf.parseConfigStr("server.target=jsonrpc");

View File

@ -28,6 +28,8 @@ import net.i2p.itoopie.gui.component.util.TabChangeListener;
import net.i2p.itoopie.util.IconLoader; import net.i2p.itoopie.util.IconLoader;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.Color; import java.awt.Color;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@ -36,7 +38,8 @@ import java.awt.FlowLayout;
public class Main { public class Main {
private JFrame frame; private static JFrame frame;
private static JTabbedPane tabbedPane;
private final static Color VERY_LIGHT = new Color(230,230,230); private final static Color VERY_LIGHT = new Color(230,230,230);
private final static Color LIGHT = new Color(215,215,215); private final static Color LIGHT = new Color(215,215,215);
private final static Color MEDIUM = new Color (175,175,175); private final static Color MEDIUM = new Color (175,175,175);
@ -79,7 +82,7 @@ public class Main {
frame.setResizable(false); frame.setResizable(false);
WindowHandler.registerMain(frame); WindowHandler.registerMain(frame);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); tabbedPane = new JTabbedPane(JTabbedPane.TOP);
frame.getContentPane().add(tabbedPane, BorderLayout.CENTER); frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
TabLogoPanel overviewPanel = new OverviewTab("itoopie-opaque12"); TabLogoPanel overviewPanel = new OverviewTab("itoopie-opaque12");
@ -126,4 +129,14 @@ public class Main {
frame.setVisible(true); frame.setVisible(true);
} }
/**
* Used to manually trigger updates for the tab being shown.
*/
public static void fireNewChange(){
for (ChangeListener ch : tabbedPane.getChangeListeners()){
ch.stateChanged(new ChangeEvent(tabbedPane));
}
}
} }

View File

@ -12,6 +12,7 @@ import java.awt.event.ActionListener;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.HashMap;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -22,10 +23,14 @@ import javax.swing.JSeparator;
import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException;
import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.configuration.ConfigurationManager;
import net.i2p.itoopie.gui.StatusHandler.DEFAULT_STATUS;
import net.i2p.itoopie.gui.component.RegisteredFrame; import net.i2p.itoopie.gui.component.RegisteredFrame;
import net.i2p.itoopie.i18n.Transl; import net.i2p.itoopie.i18n.Transl;
import net.i2p.itoopie.i2pcontrol.InvalidParametersException;
import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException;
import net.i2p.itoopie.i2pcontrol.JSONRPC2Interface; import net.i2p.itoopie.i2pcontrol.JSONRPC2Interface;
import net.i2p.itoopie.i2pcontrol.methods.I2PControl.I2P_CONTROL;
import net.i2p.itoopie.i2pcontrol.methods.SetI2PControl;
import net.i2p.itoopie.security.ItoopieHostnameVerifier; import net.i2p.itoopie.security.ItoopieHostnameVerifier;
import javax.swing.BoxLayout; import javax.swing.BoxLayout;
@ -38,13 +43,32 @@ import java.awt.Component;
public class SettingsFrame extends RegisteredFrame{ public class SettingsFrame extends RegisteredFrame{
private static final Log _log = LogFactory.getLog(SettingsFrame.class); private static final Log _log = LogFactory.getLog(SettingsFrame.class);
private final static int SAVE_OK = 0; private enum LOCAL_SAVE_STATUS {
private final static int SAVE_ERROR = 1; SAVE_OK,
SAVE_ERROR,
NO_CHANGES,
};
private static enum REMOTE_SAVE_STATUS{
SAVE_FAILED_LOCALLY { public String toString(){return Transl._("Settings aren't valid, not saving.");} },
SAVE_FAILED_REMOTELY { public String toString(){return Transl._("I2P router rejected settings.");} },
SAVED_OK { public String toString(){return Transl._("Saved settings on I2P router.");} },
SAVED_RESTART_NEEDED { public String toString(){return Transl._("Saved settings on I2P router. I2P router needs to be restarted.");} },
NO_CHANGES { public String toString(){return Transl._("No changes found, settings not saved.");} }
};
private static Boolean instanceShown = false; private static Boolean instanceShown = false;
private JTextField textFieldRouterIP; // NetworkPanel
private JTextField textFieldRouterPort; private JTextField txtRouterIP;
private JTextField txtRouterPort;
private JPasswordField passwordField; private JPasswordField passwordField;
// PasswordPanel
private JPasswordField txtNewPassword;
private JPasswordField txtRetypeNewPassword;
// PortPanel
private JTextField txtNewPort;
private ConfigurationManager _conf; private ConfigurationManager _conf;
/** /**
@ -95,57 +119,41 @@ public class SettingsFrame extends RegisteredFrame{
GUIHelper.setDefaultStyle(); GUIHelper.setDefaultStyle();
setTitle("itoopie Settings"); setTitle("itoopie Settings");
setBounds(100, 100, 450, 150); setBounds(0, 0, 450, 260);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); getContentPane().setLayout(null);
JPanel networkPanel = new JPanel(); JPanel networkPanel = new JPanel();
getContentPane().add(networkPanel);
networkPanel.setLayout(null); networkPanel.setLayout(null);
networkPanel.setBounds(0, 0, 426, 89);
JLabel lblI2PControl = new JLabel("Network:"); getContentPane().add(networkPanel);
lblI2PControl.setBounds(10, 10, 120, 15); setupNetworkPanel(networkPanel);
networkPanel.add(lblI2PControl);
lblI2PControl.setHorizontalAlignment(SwingConstants.RIGHT);
JLabel lblRouterIP = new JLabel("IP address:"); JSeparator separator = new JSeparator(SwingConstants.HORIZONTAL);
lblRouterIP.setBounds(138, 10, 100, 15); separator.setBounds((96)/2, 90, (getWidth()-96), 1);
networkPanel.add(lblRouterIP); getContentPane().add(separator);
lblRouterIP.setHorizontalAlignment(SwingConstants.LEFT);
textFieldRouterIP = new JTextField(); JPanel newPasswordPanel = new JPanel();
textFieldRouterIP.setBounds(240, 10, 90, 19); newPasswordPanel.setLayout(null);
networkPanel.add(textFieldRouterIP); newPasswordPanel.setBounds(0, 90, 426, 64);
textFieldRouterIP.setText("255.255.255"); getContentPane().add(newPasswordPanel);
textFieldRouterIP.setColumns(10); setupNewPasswordPanel(newPasswordPanel);
JLabel lblRouterPort = new JLabel("Port:"); separator = new JSeparator(SwingConstants.HORIZONTAL);
lblRouterPort.setBounds(138, 35, 100, 15); separator.setBounds((96)/2, 155, (getWidth()-96), 1);
networkPanel.add(lblRouterPort); getContentPane().add(separator);
lblRouterPort.setHorizontalAlignment(SwingConstants.LEFT);
textFieldRouterPort = new JTextField();
textFieldRouterPort.setBounds(240, 35, 45, 19);
networkPanel.add(textFieldRouterPort);
textFieldRouterPort.setText("65555");
textFieldRouterPort.setColumns(10);
JLabel lblRouterPassword = new JLabel("Password:"); JPanel newPortPanel = new JPanel();
lblRouterPassword.setBounds(138, 60, 100, 15); newPortPanel.setLayout(null);
networkPanel.add(lblRouterPassword); newPortPanel.setBounds(0, 155, 426, 35);
lblRouterPassword.setHorizontalAlignment(SwingConstants.LEFT); getContentPane().add(newPortPanel);
setupNewPortPanel(newPortPanel);
passwordField = new JPasswordField();
passwordField.setBounds(240, 60, 100, 19);
networkPanel.add(passwordField);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonPanel.setAlignmentY(BOTTOM_ALIGNMENT); buttonPanel.setBounds(0, 200, getWidth()-10, 35);
buttonPanel.setMaximumSize(new Dimension(2000, 24));
getContentPane().add(buttonPanel); getContentPane().add(buttonPanel);
@ -154,10 +162,47 @@ public class SettingsFrame extends RegisteredFrame{
btnDone.addActionListener(new ActionListener(){ btnDone.addActionListener(new ActionListener(){
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
if (SAVE_OK == saveSettings()){ LOCAL_SAVE_STATUS localSettingStatus = saveRemoteHostSettings();
dispose(); if (LOCAL_SAVE_STATUS.SAVE_OK == localSettingStatus){
} else {
StatusHandler.setStatus(Transl._("Settings saved."));
} else if (LOCAL_SAVE_STATUS.SAVE_ERROR == localSettingStatus){
populateSettings(); populateSettings();
} else if (LOCAL_SAVE_STATUS.NO_CHANGES == localSettingStatus){
StatusHandler.setStatus(Transl._("Settings not saved, no changes found."));
}
REMOTE_SAVE_STATUS newPortStatus = saveNewPort();
switch (newPortStatus){
case SAVED_OK:
StatusHandler.setStatus("New remote port: " + REMOTE_SAVE_STATUS.SAVED_OK);
break;
case SAVE_FAILED_LOCALLY:
StatusHandler.setStatus("New remote port: " + REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY);
break;
case SAVE_FAILED_REMOTELY:
StatusHandler.setStatus("New remote port: " + REMOTE_SAVE_STATUS.SAVE_FAILED_REMOTELY);
break;
}
REMOTE_SAVE_STATUS newPasswordStatus = saveNewPassword();
switch (newPasswordStatus){
case SAVED_OK:
StatusHandler.setStatus("New remote password: " + REMOTE_SAVE_STATUS.SAVED_OK);
break;
case SAVE_FAILED_LOCALLY:
StatusHandler.setStatus("New remote password: " + REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY);
break;
case SAVE_FAILED_REMOTELY:
StatusHandler.setStatus("New remote password: " + REMOTE_SAVE_STATUS.SAVE_FAILED_REMOTELY);
break;
}
if (localSettingStatus != LOCAL_SAVE_STATUS.SAVE_ERROR &&
newPortStatus != REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY && newPortStatus != REMOTE_SAVE_STATUS.SAVE_FAILED_REMOTELY &&
newPasswordStatus != REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY && newPasswordStatus != REMOTE_SAVE_STATUS.SAVE_FAILED_REMOTELY){
Main.fireNewChange();
dispose();
} }
} }
}); });
@ -179,29 +224,110 @@ public class SettingsFrame extends RegisteredFrame{
validate(); validate();
} }
@Override private void setupNetworkPanel(JPanel networkPanel){
public void setVisible(boolean isVisible){ JLabel lblI2PControl = new JLabel("Network:");
if (isVisible){ lblI2PControl.setBounds(10, 10, 120, 15);
populateSettings(); networkPanel.add(lblI2PControl);
} lblI2PControl.setHorizontalAlignment(SwingConstants.RIGHT);
super.setVisible(isVisible);
JLabel lblRouterIP = new JLabel("IP address:");
lblRouterIP.setBounds(138, 10, 100, 15);
networkPanel.add(lblRouterIP);
lblRouterIP.setHorizontalAlignment(SwingConstants.LEFT);
txtRouterIP = new JTextField();
txtRouterIP.setBounds(240, 10, 90, 19);
networkPanel.add(txtRouterIP);
JLabel lblRouterPort = new JLabel("Port:");
lblRouterPort.setBounds(138, 35, 100, 15);
networkPanel.add(lblRouterPort);
lblRouterPort.setHorizontalAlignment(SwingConstants.LEFT);
txtRouterPort = new JTextField();
txtRouterPort.setBounds(240, 35, 45, 19);
networkPanel.add(txtRouterPort);
JLabel lblRouterPassword = new JLabel("Password:");
lblRouterPassword.setBounds(138, 60, 100, 15);
networkPanel.add(lblRouterPassword);
lblRouterPassword.setHorizontalAlignment(SwingConstants.LEFT);
passwordField = new JPasswordField();
passwordField.setBounds(240, 60, 90, 19);
networkPanel.add(passwordField);
} }
private void setupNewPasswordPanel(JPanel pwdPanel){
JLabel lblNewPassword = new JLabel(Transl._("New password:"));
lblNewPassword.setBounds(10, 10, 120, 15);
pwdPanel.add(lblNewPassword);
lblNewPassword.setHorizontalAlignment(SwingConstants.RIGHT);
JLabel lblNewPassword2 = new JLabel(Transl._("Password:"));
lblNewPassword2.setBounds(138, 10, 100, 15);
pwdPanel.add(lblNewPassword2);
lblNewPassword2.setHorizontalAlignment(SwingConstants.LEFT);
txtNewPassword = new JPasswordField();
txtNewPassword.setBounds(240, 10, 90, 19);
pwdPanel.add(txtNewPassword);
JLabel lblRetypeNewPassword = new JLabel(Transl._("Repeat:"));
lblRetypeNewPassword.setBounds(138, 35, 100, 15);
pwdPanel.add(lblRetypeNewPassword);
lblRetypeNewPassword.setHorizontalAlignment(SwingConstants.LEFT);
txtRetypeNewPassword = new JPasswordField();
txtRetypeNewPassword.setBounds(240, 35, 90, 19);
pwdPanel.add(txtRetypeNewPassword);
}
private void setupNewPortPanel(JPanel portPanel){
JLabel lblPort = new JLabel(Transl._("New port:"));
lblPort.setBounds(10, 10, 120, 15);
portPanel.add(lblPort);
lblPort.setHorizontalAlignment(SwingConstants.RIGHT);
JLabel lblPort2 = new JLabel(Transl._("Port:"));
lblPort2.setBounds(138, 10, 100, 15);
portPanel.add(lblPort2);
lblPort2.setHorizontalAlignment(SwingConstants.LEFT);
txtNewPort = new JTextField();
txtNewPort.setBounds(240, 10, 45, 19);
portPanel.add(txtNewPort);
}
private void populateSettings(){ private void populateSettings(){
textFieldRouterIP.setText(_conf.getConf("server.hostname", "127.0.0.1")); txtRouterIP.setText(_conf.getConf("server.hostname", "127.0.0.1"));
textFieldRouterPort.setText(_conf.getConf("server.port", 7650)+""); txtRouterPort.setText(_conf.getConf("server.port", 7650)+"");
passwordField.setText(_conf.getConf("server.password", "itoopie")); passwordField.setText(_conf.getConf("server.password", "itoopie"));
} }
@SuppressWarnings("static-access") @SuppressWarnings("static-access")
private int saveSettings(){ private LOCAL_SAVE_STATUS saveRemoteHostSettings(){
ItoopieHostnameVerifier.clearRecentlyDenied(); ItoopieHostnameVerifier.clearRecentlyDenied();
String oldIP = _conf.getConf("server.hostname", "127.0.0.1"); String oldIP = _conf.getConf("server.hostname", "127.0.0.1");
int oldPort = _conf.getConf("server.port", 7650); int oldPort = _conf.getConf("server.port", 7650);
String oldPW = _conf.getConf("server.password", "itoopie"); String oldPW = _conf.getConf("server.password", "itoopie");
String ipText = txtRouterIP.getText();
String portText = txtRouterPort.getText();
String pwText = new String(passwordField.getPassword());
// // Exit SAVE_STATUS.NO_CHANGES if no changes are found. Possibly just a annoying check.
// if (ipText.equals(oldIP) && portText.equals(oldPort+"") && pwText.equals(oldPW))
// return LOCAL_SAVE_STATUS.NO_CHANGES;
String ipText = textFieldRouterIP.getText();
try { try {
InetAddress.getByName(ipText); InetAddress.getByName(ipText);
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
@ -212,10 +338,9 @@ public class SettingsFrame extends RegisteredFrame{
Transl._("Invalid ip address."), Transl._("Invalid ip address."),
JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
return SAVE_ERROR; return LOCAL_SAVE_STATUS.SAVE_ERROR;
} }
String portText = textFieldRouterPort.getText();
int port = 0; int port = 0;
try { try {
port = Integer.parseInt(portText); port = Integer.parseInt(portText);
@ -229,10 +354,9 @@ public class SettingsFrame extends RegisteredFrame{
Transl._("Invalid port."), Transl._("Invalid port."),
JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
return SAVE_ERROR; return LOCAL_SAVE_STATUS.SAVE_ERROR;
} }
String pwText = new String(passwordField.getPassword());
try { try {
_conf.setConf("server.hostname", ipText); _conf.setConf("server.hostname", ipText);
_conf.setConf("server.port", port); _conf.setConf("server.port", port);
@ -247,7 +371,7 @@ public class SettingsFrame extends RegisteredFrame{
Transl._("Rejected password."), Transl._("Rejected password."),
JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
return SAVE_ERROR; return LOCAL_SAVE_STATUS.SAVE_ERROR;
} catch (JSONRPC2SessionException e) { } catch (JSONRPC2SessionException e) {
_conf.setConf("server.hostname", oldIP); _conf.setConf("server.hostname", oldIP);
_conf.setConf("server.port", oldPort); _conf.setConf("server.port", oldPort);
@ -260,7 +384,7 @@ public class SettingsFrame extends RegisteredFrame{
Transl._("Connection failed."), Transl._("Connection failed."),
JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE); JOptionPane.ERROR_MESSAGE);
return SAVE_ERROR; return LOCAL_SAVE_STATUS.SAVE_ERROR;
} }
_conf.setConf("server.hostname", ipText); _conf.setConf("server.hostname", ipText);
@ -271,7 +395,6 @@ public class SettingsFrame extends RegisteredFrame{
_log.debug("Port old->new: \""+_conf.getConf("server.port",7650)+"\"->\"" + portText + "\""); _log.debug("Port old->new: \""+_conf.getConf("server.port",7650)+"\"->\"" + portText + "\"");
_log.debug("Password old->new: \""+oldPW+"\"->\"" + pwText + "\""); _log.debug("Password old->new: \""+oldPW+"\"->\"" + pwText + "\"");
StatusHandler.setStatus("Settings saved");
(new Thread() { (new Thread() {
@Override @Override
@ -279,7 +402,100 @@ public class SettingsFrame extends RegisteredFrame{
_conf.writeConfFile(); _conf.writeConfFile();
} }
}).start(); }).start();
return SAVE_OK; return LOCAL_SAVE_STATUS.SAVE_OK;
} }
private REMOTE_SAVE_STATUS saveNewPassword(){
String oldPW = _conf.getConf("server.password", "itoopie");
String pw = new String(txtNewPassword.getPassword());
String pwRepeat = new String(txtRetypeNewPassword.getPassword());
if ((pw.length() < 1) && (pwRepeat.length() < 1)){
return REMOTE_SAVE_STATUS.NO_CHANGES;
}
if (!pw.equals(pwRepeat)){
JOptionPane.showConfirmDialog(
this,
Transl._("The new password and the repeated new password do not match.\r\n"),
Transl._("Mistyped password."),
JOptionPane.OK_OPTION,
JOptionPane.ERROR_MESSAGE);
return REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY;
}
if (pw.equals(oldPW)){
JOptionPane.showConfirmDialog(
this,
Transl._("The new password is the same as the old password.\r\n"),
Transl._("No new password."),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.ERROR_MESSAGE);
return REMOTE_SAVE_STATUS.NO_CHANGES;
}
HashMap<I2P_CONTROL, String> hm = new HashMap<I2P_CONTROL, String>();
hm.put(I2P_CONTROL.PASSWORD, pw);
try {
SetI2PControl.execute(hm);
_conf.setConf("server.password", pw); // Reflect remote changes in local settings.
passwordField.setText(pw);
return REMOTE_SAVE_STATUS.SAVED_OK;
} catch (InvalidPasswordException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.INVALID_PASSWORD);
return REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY;
} catch (JSONRPC2SessionException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.NOT_CONNECTED);
return REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY;
} catch (InvalidParametersException e) {
return REMOTE_SAVE_STATUS.SAVE_FAILED_REMOTELY;
}
}
private REMOTE_SAVE_STATUS saveNewPort(){
String oldPort = _conf.getConf("server.port", 7650) + "";
String port = txtNewPort.getText();
if (port.length() < 1){
return REMOTE_SAVE_STATUS.NO_CHANGES;
}
if (port.equals(oldPort)){
return REMOTE_SAVE_STATUS.NO_CHANGES;
}
int nbrPort = 0;
try {
nbrPort = Integer.parseInt(port);
if (nbrPort > 65535 || nbrPort < 1)
throw new NumberFormatException();
} catch (NumberFormatException e){
JOptionPane.showConfirmDialog(
this,
Transl._(port + " can not be interpreted as a port.\r\n" +
"\r\nA port has to be a number in the range 1-65535."),
Transl._("Invalid port."),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.ERROR_MESSAGE);
return REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY;
}
HashMap<I2P_CONTROL, String> hm = new HashMap<I2P_CONTROL, String>();
hm.put(I2P_CONTROL.PORT, nbrPort + "");
try {
SetI2PControl.execute(hm);
_conf.setConf("server.port", nbrPort); // Reflect remote changes in local settings.
txtRouterPort.setText(port+"");
return REMOTE_SAVE_STATUS.SAVED_OK;
} catch (InvalidPasswordException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.INVALID_PASSWORD);
return REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY;
} catch (JSONRPC2SessionException e) {
StatusHandler.setDefaultStatus(DEFAULT_STATUS.NOT_CONNECTED);
return REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY;
} catch (InvalidParametersException e) {
return REMOTE_SAVE_STATUS.SAVE_FAILED_REMOTELY;
}
}
} }

View File

@ -26,9 +26,14 @@ public class TabChangeListener implements ChangeListener {
/** /**
* Fire onTabFocus for visible tabs when stateChanged. * Fire onTabFocus for visible tabs when stateChanged.
*/ */
public void stateChanged(ChangeEvent e) { public void stateChanged(final ChangeEvent e) {
if (adaptee.isVisible()){ if (adaptee.isVisible()){
(new Thread(){
@Override
public void run(){
adaptee.onTabFocus(e); adaptee.onTabFocus(e);
} }
}).start();
}
} }
} }