/**
* UPnP PortMapper - A tool for managing port forwardings via UPnP
* Copyright (C) 2015 Christoph Pirkl <christoph at users.sourceforge.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.chris.portmapper.gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import javax.swing.ActionMap;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import net.miginfocom.swing.MigLayout;
import org.chris.portmapper.PortMapperApp;
import org.chris.portmapper.Settings;
import org.chris.portmapper.router.cling.ClingRouterFactory;
import org.chris.portmapper.router.dummy.DummyRouterFactory;
import org.chris.portmapper.router.sbbi.SBBIRouterFactory;
import org.chris.portmapper.router.weupnp.WeUPnPRouterFactory;
import org.jdesktop.application.Action;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
/**
* This class represents the settings dialog.
*/
public class SettingsDialog extends JDialog {
private static final List<String> AVAILABLE_ROUTER_FACTORIES = Arrays.asList(ClingRouterFactory.class.getName(),
SBBIRouterFactory.class.getName(), WeUPnPRouterFactory.class.getName(), DummyRouterFactory.class.getName());
private static final List<Level> AVAILABLE_LOG_LEVELS = Arrays.asList(Level.ALL, Level.TRACE, Level.DEBUG,
Level.INFO, Level.WARN, Level.ERROR, Level.OFF);
private static final long serialVersionUID = 1L;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final static String DIALOG_NAME = "settings_dialog";
private final static String ACTION_SAVE = DIALOG_NAME + ".save";
private final static String ACTION_CANCEL = DIALOG_NAME + ".cancel";
private JCheckBox useEntityEncoding;
private JComboBox<Level> logLevelComboBox;
private JComboBox<String> routerFactoryClassComboBox;
private JButton okButton;
private final PortMapperApp app;
public SettingsDialog(final PortMapperApp app) {
super(app.getMainFrame(), true);
this.app = app;
logger.debug("Create settings dialog");
this.setContentPane(this.getDialogPane());
this.getRootPane().setDefaultButton(okButton);
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
this.setName(DIALOG_NAME);
this.setModal(true);
this.pack();
// Register an action listener that closes the window when the ESC
// button is pressed
final KeyStroke escKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true);
final ActionListener windowCloseActionListener = new ActionListener() {
@Override
public final void actionPerformed(final ActionEvent e) {
cancel();
}
};
getRootPane().registerKeyboardAction(windowCloseActionListener, escKeyStroke,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
}
private static JLabel createLabel(final String name) {
final JLabel newLabel = new JLabel(name);
newLabel.setName(name);
return newLabel;
}
private JPanel getDialogPane() {
final ActionMap actionMap = app.getContext().getActionMap(this.getClass(), this);
final Settings settings = app.getSettings();
final JPanel dialogPane = new JPanel(new MigLayout("", // Layout
// Constraints
"[right]rel[left,grow 100]", // Column Constraints
"")); // Row Constraints
logger.debug("Use entity encoding is " + settings.isUseEntityEncoding());
useEntityEncoding = new JCheckBox("settings_dialog.use_entity_encoding", settings.isUseEntityEncoding());
useEntityEncoding.setName("settings_dialog.use_entity_encoding");
dialogPane.add(useEntityEncoding, "span 2, wrap");
dialogPane.add(createLabel("settings_dialog.log_level"));
logLevelComboBox = new JComboBox<>(new Vector<>(AVAILABLE_LOG_LEVELS));
logLevelComboBox.setSelectedItem(Level.toLevel(settings.getLogLevel()));
dialogPane.add(logLevelComboBox, "wrap");
dialogPane.add(createLabel("settings_dialog.upnp_lib"));
routerFactoryClassComboBox = new JComboBox<>(new Vector<>(AVAILABLE_ROUTER_FACTORIES));
routerFactoryClassComboBox.setSelectedItem(settings.getRouterFactoryClassName());
dialogPane.add(routerFactoryClassComboBox, "span 2, wrap");
dialogPane.add(new JButton(actionMap.get(ACTION_CANCEL)), "tag cancel, span 2");
okButton = new JButton(actionMap.get(ACTION_SAVE));
dialogPane.add(okButton, "tag ok, wrap");
return dialogPane;
}
/**
* This method is executed when the user clicks the save button. The method saves the entered preset
*/
@Action(name = ACTION_SAVE)
public void save() {
final Settings settings = app.getSettings();
settings.setUseEntityEncoding(useEntityEncoding.isSelected());
settings.setLogLevel(((Level) logLevelComboBox.getSelectedItem()).toString());
settings.setRouterFactoryClassName(routerFactoryClassComboBox.getSelectedItem().toString());
app.setLogLevel(settings.getLogLevel());
logger.debug("Saved settings " + settings);
this.dispose();
}
@Action(name = ACTION_CANCEL)
public void cancel() {
this.dispose();
}
}