package husacct.control.presentation.util;
import husacct.ServiceProvider;
import husacct.common.locale.ILocaleService;
import husacct.common.services.IServiceListener;
import husacct.control.task.MainController;
import husacct.control.task.configuration.ConfigPanel;
import husacct.control.task.configuration.ConfigurationManager;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import org.apache.log4j.Logger;
@SuppressWarnings("serial")
public class GeneralConfigurationPanel extends ConfigPanel {
final JTextField location = new JTextField();
final JFileChooser fileChooser = new JFileChooser();
private JCheckBox enableExternalCodeviewer, enableActionLogger;
private JButton selectFile = new JButton();
private JPanel languagePanel, codeviewerPanel, actionLoggerPanel;
private ILocaleService localeService = ServiceProvider.getInstance().getLocaleService();
private Logger logger = Logger.getLogger(GeneralConfigurationPanel.class);
private ButtonGroup languageGroup = new ButtonGroup();
private GridBagConstraints constraints = new GridBagConstraints();
private String language;
public GeneralConfigurationPanel(MainController mainController) {
this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
initialiseLanguage();
initialiseCodeviewer();
initialiseActionLogger();
setComponentText();
setListeners();
loadDefaults();
}
private void initialiseLanguage() {
language = localeService.getLocale().getLanguage();
languagePanel = new JPanel();
for(final Locale locale : localeService.getAvailableLocales()){
String language = locale.getDisplayLanguage();
final JRadioButton languageItem = new JRadioButton(language);
languageItem.setName(locale.getLanguage());
if(language.equals(localeService.getLocale().getDisplayLanguage())){
languageItem.setSelected(true);
}
languageItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setLanguage(locale.getLanguage());
}
});
localeService.addServiceListener(new IServiceListener() {
@Override
public void update() {
if(localeService.getLocale().getDisplayLanguage().equals(languageItem.getText())){
languageItem.setSelected(true);
} else {
languageItem.setSelected(false);
}
}
});
languageGroup.add(languageItem);
languagePanel.add(languageItem);
}
this.add(languagePanel);
}
private void initialiseCodeviewer() {
codeviewerPanel = new JPanel(new GridBagLayout());
enableExternalCodeviewer = new JCheckBox();
enableExternalCodeviewer.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent event) {
if(event.getStateChange() == ItemEvent.SELECTED) {
location.setEnabled(true);
selectFile.setEnabled(true);
} else {
location.setEnabled(false);
selectFile.setEnabled(false);
}
}
});
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 0;
constraints.gridy = 0;
codeviewerPanel.add(enableExternalCodeviewer, constraints);
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 0;
constraints.gridy = 1;
location.setPreferredSize(new Dimension(260, 20));
codeviewerPanel.add(location, constraints);
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 1;
constraints.gridy = 1;
codeviewerPanel.add(selectFile, constraints);
this.add(codeviewerPanel);
}
private void initialiseActionLogger() {
actionLoggerPanel = new JPanel();
enableActionLogger = new JCheckBox();
actionLoggerPanel.add(enableActionLogger);
this.add(actionLoggerPanel);
}
private void setListeners() {
localeService.addServiceListener(new IServiceListener() {
@Override
public void update() {
setComponentText();
}
});
selectFile.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
int result = fileChooser.showOpenDialog(GeneralConfigurationPanel.this);
if(result == JFileChooser.APPROVE_OPTION) {
location.setText(fileChooser.getSelectedFile().getAbsolutePath());
}
}
});
}
private void setLocaleFromString(String locale){
logger.info("User sets language to: " + locale);
localeService.setLocale(new Locale(locale, locale));
}
public JPanel getGUI() {
return this;
}
protected void setComponentText() {
languagePanel.setBorder(BorderFactory.createTitledBorder(localeService.getTranslatedString("ConfigGeneralLanguage")));
codeviewerPanel.setBorder(BorderFactory.createTitledBorder(localeService.getTranslatedString("ConfigGeneralCodeviewer")));
actionLoggerPanel.setBorder(BorderFactory.createTitledBorder(localeService.getTranslatedString("ConfigGeneralActionLogger")));
enableExternalCodeviewer.setText(localeService.getTranslatedString("ConfigGeneralCodeviewerEnable"));
enableActionLogger.setText(localeService.getTranslatedString("ConfigGeneralActionLoggerEnable"));
selectFile.setText(localeService.getTranslatedString("ConfigGeneralCodeviewerBrowse"));
}
public void loadDefaults() {
String ExternalCodeviewer = ConfigurationManager.getProperty("ExternalCodeviewer");
String ActionLogger = ConfigurationManager.getProperty("ActionLogger");
boolean external = false;
boolean logger = false;
external = Boolean.valueOf(ExternalCodeviewer);
logger = Boolean.valueOf(ActionLogger);
enableExternalCodeviewer.setSelected(external);
enableActionLogger.setSelected(logger);
location.setEnabled(external);
selectFile.setEnabled(external);
location.setText(ConfigurationManager.getProperty("IDELocation"));
}
private void setLanguage(String language) {
this.language = language;
}
@Override
public void SaveSettings() {
ConfigurationManager.setProperty("ExternalCodeviewer", String.valueOf(enableExternalCodeviewer.isSelected()));
ConfigurationManager.setProperty("IDELocation", location.getText());
ConfigurationManager.setProperty("Language", language);
boolean showActionLogger = enableActionLogger.isSelected();
ConfigurationManager.setProperty("ActionLogger", String.valueOf(showActionLogger));
setLocaleFromString(language);
}
@Override
public void ResetSettings() {
loadDefaults();
}
}