/*
* ATLauncher - https://github.com/ATLauncher/ATLauncher
* Copyright (C) 2013 ATLauncher
*
* 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 com.atlauncher.gui.tabs.settings;
import com.atlauncher.App;
import com.atlauncher.data.Language;
import com.atlauncher.data.Server;
import com.atlauncher.evnt.listener.RelocalizationListener;
import com.atlauncher.evnt.manager.RelocalizationManager;
import com.atlauncher.gui.components.JLabelWithHover;
import com.atlauncher.gui.dialogs.ProgressDialog;
import com.atlauncher.utils.Utils;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
@SuppressWarnings("serial")
public class NetworkSettingsTab extends AbstractSettingsTab implements RelocalizationListener {
private JLabelWithHover downloadServerLabel;
private JComboBox<Server> server;
private JLabelWithHover concurrentConnectionsLabel;
private JTextField concurrentConnections;
private JLabelWithHover enableProxyLabel;
private JCheckBox enableProxy;
private JLabelWithHover proxyHostLabel;
private JTextField proxyHost;
private JLabelWithHover proxyPortLabel;
private JTextField proxyPort;
private JLabelWithHover proxyTypeLabel;
private JComboBox<String> proxyType;
public NetworkSettingsTab() {
RelocalizationManager.addListener(this);
// Download Server
gbc.gridx = 0;
gbc.gridy++;
gbc.insets = LABEL_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
downloadServerLabel = new JLabelWithHover(Language.INSTANCE.localize("settings.downloadserver") + ":",
HELP_ICON, Language.INSTANCE.localize("settings.downloadserverhelp"));
add(downloadServerLabel, gbc);
gbc.gridx++;
gbc.insets = FIELD_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
server = new JComboBox<Server>();
for (Server serverr : App.settings.getServers()) {
if (serverr.isUserSelectable()) {
server.addItem(serverr);
}
}
server.setSelectedItem(App.settings.getOriginalServer());
add(server, gbc);
// Concurrent Connection Settings
gbc.gridx = 0;
gbc.gridy++;
gbc.insets = LABEL_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
concurrentConnectionsLabel = new JLabelWithHover(Language.INSTANCE.localize("settings" + "" +
".concurrentconnections") + ":", HELP_ICON, "<html>" + Language.INSTANCE.localizeWithReplace
("settings" + "" +
".concurrentconnectionshelp", "<br/><br/>") + "</html>");
add(concurrentConnectionsLabel, gbc);
gbc.gridx++;
gbc.insets = FIELD_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
concurrentConnections = new JTextField(4);
concurrentConnections.setText(App.settings.getConcurrentConnections() + "");
add(concurrentConnections, gbc);
// Enable Proxy
gbc.gridx = 0;
gbc.gridy++;
gbc.insets = LABEL_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
enableProxyLabel = new JLabelWithHover(Language.INSTANCE.localize("settings.enableproxy") + "?", HELP_ICON,
Language.INSTANCE.localize("settings.enableproxyhelp"));
add(enableProxyLabel, gbc);
gbc.gridx++;
gbc.insets = FIELD_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
enableProxy = new JCheckBox();
if (App.settings.getEnableProxy()) {
enableProxy.setSelected(true);
}
enableProxy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!enableProxy.isSelected()) {
proxyHost.setEnabled(false);
proxyPort.setEnabled(false);
proxyType.setEnabled(false);
} else {
proxyHost.setEnabled(true);
proxyPort.setEnabled(true);
proxyType.setEnabled(true);
}
}
});
add(enableProxy, gbc);
// Proxy Host Settings
gbc.gridx = 0;
gbc.gridy++;
gbc.insets = LABEL_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
proxyHostLabel = new JLabelWithHover(Language.INSTANCE.localize("settings.proxyhost") + ":", HELP_ICON,
Language.INSTANCE.localize("settings.proxyhosthelp"));
add(proxyHostLabel, gbc);
gbc.gridx++;
gbc.insets = FIELD_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
proxyHost = new JTextField(20);
proxyHost.setText(App.settings.getProxyHost());
if (!enableProxy.isSelected()) {
proxyHost.setEnabled(false);
}
add(proxyHost, gbc);
// Proxy Port Settings
gbc.gridx = 0;
gbc.gridy++;
gbc.insets = LABEL_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
proxyPortLabel = new JLabelWithHover(Language.INSTANCE.localize("settings.proxyport") + ":", HELP_ICON,
Language.INSTANCE.localize("settings.proxyporthelp"));
add(proxyPortLabel, gbc);
gbc.gridx++;
gbc.insets = FIELD_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
proxyPort = new JTextField(4);
proxyPort.setText((App.settings.getProxyPort() == 0 ? "" : App.settings.getProxyPort()) + "");
if (!enableProxy.isSelected()) {
proxyPort.setEnabled(false);
}
add(proxyPort, gbc);
// Proxy Type Settings
gbc.gridx = 0;
gbc.gridy++;
gbc.insets = LABEL_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
proxyTypeLabel = new JLabelWithHover(Language.INSTANCE.localize("settings.proxytype") + ":", HELP_ICON,
Language.INSTANCE.localize("settings.proxytypehelp"));
add(proxyTypeLabel, gbc);
gbc.gridx++;
gbc.insets = FIELD_INSETS;
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
proxyType = new JComboBox<String>();
proxyType.addItem("HTTP");
proxyType.addItem("SOCKS");
proxyType.addItem("DIRECT");
proxyType.setSelectedItem(App.settings.getProxyType());
if (!enableProxy.isSelected()) {
proxyType.setEnabled(false);
}
add(proxyType, gbc);
}
public boolean isValidConcurrentConnections() {
if (Integer.parseInt(concurrentConnections.getText().replaceAll("[^0-9]", "")) < 1) {
JOptionPane.showMessageDialog(App.settings.getParent(), Language.INSTANCE.localize("settings" + "" +
".concurrentconnectionsinvalid"), Language.INSTANCE.localize("settings.help"),
JOptionPane.PLAIN_MESSAGE);
return false;
}
return true;
}
public boolean isValidProxyPort() {
if (!enableProxy.isSelected()) {
return true;
}
if (proxyPort.getText().isEmpty() || Integer.parseInt(proxyPort.getText().replaceAll("[^0-9]",
"")) < 1 || Integer.parseInt(proxyPort.getText().replaceAll("[^0-9]", "")) > 65535) {
JOptionPane.showMessageDialog(App.settings.getParent(), Language.INSTANCE.localize("settings" + "" +
".proxyportinvalid"), Language.INSTANCE.localize("settings.help"), JOptionPane.PLAIN_MESSAGE);
return false;
}
return true;
}
public boolean canConnectWithProxy() {
if (!enableProxy.isSelected()) {
return true;
}
Type type = null;
if (proxyType.getSelectedItem().equals("HTTP")) {
type = Proxy.Type.HTTP;
} else if (proxyType.getSelectedItem().equals("SOCKS")) {
type = Proxy.Type.SOCKS;
} else if (proxyType.getSelectedItem().equals("DIRECT")) {
type = Proxy.Type.DIRECT;
}
if (type == null) {
return false;
}
final Type theType = type;
final ProgressDialog dialog = new ProgressDialog(Language.INSTANCE.localize("settings" + "" +
".checkingproxytitle"), 0, Language.INSTANCE.localize("settings.checkingproxy"),
"Cancelled Proxy Test!");
dialog.addThread(new Thread() {
@Override
public void run() {
dialog.setReturnValue(Utils.testProxy(new Proxy(theType, new InetSocketAddress(proxyHost.getText(),
Integer.parseInt(proxyPort.getText().replaceAll("[^0-9]", ""))))));
dialog.close();
}
});
dialog.start();
if (dialog.getReturnValue() == null) {
return false;
}
if (!(Boolean) dialog.getReturnValue()) {
JOptionPane.showMessageDialog(App.settings.getParent(), Language.INSTANCE.localize("settings" + "" +
".proxycannotconnect"), Language.INSTANCE.localize("settings.help"),
JOptionPane.PLAIN_MESSAGE);
return false;
}
return true;
}
public void save() {
App.settings.setServer((Server) server.getSelectedItem());
App.settings.setConcurrentConnections(Integer.parseInt(concurrentConnections.getText().replaceAll("[^0-9]",
"")));
App.settings.setEnableProxy(enableProxy.isSelected());
if (enableProxy.isSelected()) {
App.settings.setProxyHost(proxyHost.getText());
App.settings.setProxyPort(Integer.parseInt(proxyPort.getText().replaceAll("[^0-9]", "")));
App.settings.setProxyType(((String) proxyType.getSelectedItem()));
}
}
@Override
public String getTitle() {
return Language.INSTANCE.localize("settings.networktab");
}
@Override
public void onRelocalization() {
this.downloadServerLabel.setText(Language.INSTANCE.localize("settings.downloadserver") + ":");
this.downloadServerLabel.setToolTipText(Language.INSTANCE.localize("settings.downloadserverhelp"));
this.concurrentConnectionsLabel.setText(Language.INSTANCE.localize("settings" + "" +
".concurrentconnections") + ":");
this.concurrentConnectionsLabel.setToolTipText("<html>" + Language.INSTANCE.localizeWithReplace("settings" +
"" +
".concurrentconnectionshelp", "<br/><br/>") + "</html>");
this.enableProxyLabel.setText(Language.INSTANCE.localize("settings.enableproxy") + "?");
this.enableProxyLabel.setToolTipText(Language.INSTANCE.localize("settings.enableproxyhelp"));
this.proxyHostLabel.setText(Language.INSTANCE.localize("settings.proxyhost") + ":");
this.proxyHostLabel.setToolTipText(Language.INSTANCE.localize("settings.proxyhosthelp"));
this.proxyPortLabel.setText(Language.INSTANCE.localize("settings.proxyport") + ":");
this.proxyPortLabel.setToolTipText(Language.INSTANCE.localize("settings.proxyporthelp"));
this.proxyTypeLabel.setText(Language.INSTANCE.localize("settings.proxytype") + ":");
this.proxyTypeLabel.setToolTipText(Language.INSTANCE.localize("settings.proxytypehelp"));
}
}