summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ConfigWindow.java
blob: c8c0d9d044fb0549273bf537dd03f241ffa7a2d6 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                      
                       

                                     
                             
 

                                  
                             

                                        

                               

                                                         

                                           
                                  
                                         

                                                 
                                                               


                                              
 
                           
                                                                                            

                                                                                  
                                                      
                                                        
 
                                                 
                                   
                                          
 
                              
                                                    










                                                       
                 

                                                     



                                                                                 

                                                          
                        







                                                                                             
                 
                                        
 
                                                                      



                                                                 



                                                      

                                                              


                                                                                                                   







                                                                                                                                  

                                                        








                                                                            



                                                                                        
 


                                                                             
 
                                       

                                                 
                                           
                       
         
 


                                                    
                                                                                              
                                                                                        
                                       

                                        
                                      

                                         
                                  
                 
         
 




                                                           
                                                          
 
                                                                   


                                                                                     
                                       
                                                                                                                      
                                       
                                                                         
                                       
                                                                                                    
                                       

                                                                                                   
                 
 


                                             
 





                                                                                                             
                                                                
                                                                                                                   


                                  
 





                                                                                                        
                                            
                                        
                                                                
                                                                                                                           



                                     
 
                                    
                                                







                                                      
                                                                                                   

                                                          

                                              



                                                                                               
                                                                                   
 
                                                      


                                                                                                            
                                                 
                 
 





                                                                                                                                   




                                                                                                                    
         
 
                                               


                            
                                                     



                                                                 












                                          
 
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();
	}
}