blob: c8c0d9d044fb0549273bf537dd03f241ffa7a2d6 (
plain) (
tree)
|
|
package org.openslx.dozmod.gui.window;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import javax.swing.AbstractButton;
import javax.swing.JRadioButton;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
import org.openslx.bwlp.thrift.iface.SatelliteUserConfig;
import org.openslx.dozmod.Config;
import org.openslx.dozmod.Config.ProxyMode;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.UiFeedback;
import org.openslx.dozmod.gui.window.layout.ConfigWindowLayout;
import org.openslx.dozmod.thrift.Session;
import org.openslx.dozmod.thrift.ThriftError;
import org.openslx.thrifthelper.ThriftManager;
@SuppressWarnings("serial")
public class ConfigWindow extends ConfigWindowLayout implements UiFeedback, ActionListener {
private final static Logger LOGGER = Logger.getLogger(ConfigWindow.class);
private SatelliteUserConfig userConfig = null;
private JRadioButton selectedLookAndFeel = null;
public ConfigWindow(Window modalParent) {
super(modalParent);
btnSave.setEnabled(false);
// -- PROXY --
// set proxy mode as saved in config
switch (Config.getProxyMode()) {
case NONE:
btnProxyNone.setSelected(true);
break;
case AUTO:
btnProxyAuto.setSelected(true);
break;
case HTTP_CONNECT:
case SOCKS:
default:
break;
}
btnProxyNone.addActionListener(this);
btnProxyAuto.addActionListener(this);
// -- END PROXY --
// -- SAT USER CONFIG --
// get the satellite user config and set the checkbox accordingly
if (Session.getSatelliteToken() == null) {
chkSendMeMail.setEnabled(false);
} else {
userConfig = getSatUserConfig();
if (userConfig != null) {
chkSendMeMail.setSelected(userConfig.isEmailNotifications());
} else {
chkSendMeMail.setSelected(false);
}
chkSendMeMail.addActionListener(this);
lblYourAddress.setText("Ihre Adresse ist " + Session.getEMail());
}
// -- END USER CONFIG --
ChangeListener changeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
reactToInput();
}
};
// -- FONT CONFIG --
// set font scaling as saved in config
sldFontSize.setValue(Config.getFontScaling());
sldFontSize.addChangeListener(changeListener);
// -- Look And Feel --
for (Enumeration<AbstractButton> btn = btnGroupLookAndFeel.getElements(); btn.hasMoreElements();) {
final JRadioButton b = (JRadioButton) btn.nextElement();
if (Config.getLookAndFeel() != null && !Config.getLookAndFeel().isEmpty()) {
if (b.getToolTipText().equals(Config.getLookAndFeel())) {
selectedLookAndFeel = b;
b.setSelected(true);
}
}
// check if we set from the config, if not fall back to system look and feel
if (selectedLookAndFeel == null && b.getToolTipText().equals(UIManager.getSystemLookAndFeelClassName())) {
selectedLookAndFeel = b;
b.setSelected(true);
}
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectedLookAndFeel = b;
reactToInput();
}
});
}
if (selectedLookAndFeel == null) {
// non-critical but log it anyways
LOGGER.error("Failed to detect the current look & feel theme.");
}
// Transfer connection count
sldConnections.setValue(Config.getTransferConnectionCount());
sldConnections.addChangeListener(changeListener);
// -- BOTTOM BUTTONS --
btnSave.addActionListener(this);
btnClose.addActionListener(this);
// -- END BOTTOM BUTTONS --
pack();
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == btnProxyAuto || source == btnProxyHttp || source == btnProxyNone
|| source == btnProxySocks || source == chkSendMeMail) {
reactToInput();
}
if (source == btnSave) {
saveOptions();
}
if (source == btnClose) {
dispose();
}
}
private void reactToInput() {
// our flag to en/disable the save button
boolean changed = false;
// first check our initial state
ProxyMode initMode = Config.getProxyMode();
int fontScaling = Config.getFontScaling();
// now check if the buttons represent another state
if (btnProxyNone.isSelected() && initMode != ProxyMode.NONE) {
changed = true;
} else if (btnProxyAuto.isSelected() && initMode != ProxyMode.AUTO) {
changed = true;
} else if (chkSendMeMail.isEnabled() && chkSendMeMail.isSelected() != userConfig.emailNotifications) {
changed = true;
} else if ((int) sldFontSize.getValue() != fontScaling) {
changed = true;
} else if ((int) sldConnections.getValue() != Config.getTransferConnectionCount()) {
changed = true;
} else if (!selectedLookAndFeel.getToolTipText().equals(Config.getLookAndFeel())) {
changed = true;
}
// en/disable the save button
btnSave.setEnabled(changed);
}
private SatelliteUserConfig getSatUserConfig() {
SatelliteUserConfig userConfig = null;
// set mail me stuff as saved on the sat
try {
userConfig = ThriftManager.getSatClient().getUserConfig(Session.getSatelliteToken());
} catch (TException e) {
ThriftError.showMessage(this, LOGGER, e,
"Konnte die benutzerspezifische Konfiguration nicht vom Satelliten holen");
}
return userConfig;
}
private boolean setSatUserConfig(SatelliteUserConfig config) {
if (config == null)
return false;
// set mail me stuff as saved on the sat
try {
ThriftManager.getSatClient().setUserConfig(Session.getSatelliteToken(), config);
userConfig = config;
} catch (TException e) {
ThriftError.showMessage(this, LOGGER, e,
"Konnte die benutzerspezifische Konfiguration nicht auf dem Satelliten speichern");
return false;
}
return true;
}
private void saveOptions() {
boolean restartRequired = false;
btnSave.setEnabled(false);
// save proxy mode to config
ProxyMode selectedMode = null;
if (btnProxyAuto.isSelected())
selectedMode = ProxyMode.AUTO;
if (btnProxyNone.isSelected())
selectedMode = ProxyMode.NONE;
if (selectedMode != null) {
restartRequired = restartRequired || Config.getProxyMode() != selectedMode;
Config.setProxyMode(selectedMode);
}
// save font scaling to config
int newFontScaling = (int) sldFontSize.getValue();
restartRequired = restartRequired || Config.getFontScaling() != newFontScaling;
Config.setFontScaling(newFontScaling);
// transfers
Config.setTransferConnectionCount((int) sldConnections.getValue());
// save mail notification stuff to sat
if (Session.getSatelliteToken() != null
&& !setSatUserConfig(new SatelliteUserConfig(chkSendMeMail.isSelected()))) {
// If saving failed, re-enable button
btnSave.setEnabled(true);
}
// save LookAndFeel
if (selectedLookAndFeel != null) {
restartRequired = restartRequired || !selectedLookAndFeel.getToolTipText().equals(Config.getLookAndFeel());
Config.setLookAndFeel(selectedLookAndFeel.getToolTipText());
}
if (restartRequired) {
// let the user know he needs to restart for the changes to apply
Gui.showMessageBox(this, "Die Änderungen werden erst nach einem Programmneustart wirksam.",
MessageType.INFO, null, null);
}
}
public static boolean shouldBeShown() {
return true;
}
public static void open(Window modalParent) {
ConfigWindow win = new ConfigWindow(modalParent);
MainWindow.centerShell(win);
win.setVisible(true);
}
/*
* UIFeedback Implementation
*/
@Override
public boolean wantConfirmQuit() {
return false;
}
@Override
public void escapePressed() {
dispose();
}
}
|