/*
* This file is part of FTB Launcher.
*
* Copyright © 2012-2016, FTB Launcher Contributors <https://github.com/Slowpoke101/FTBLaunch/>
* FTB Launcher is licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.ftb.gui.panes;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Map;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.ftb.data.Settings;
import net.ftb.download.Locations;
import net.ftb.gui.ChooseDir;
import net.ftb.gui.LaunchFrame;
import net.ftb.gui.dialogs.AdvancedOptionsDialog;
import net.ftb.locale.I18N;
import net.ftb.log.Logger;
import net.ftb.util.OSUtils;
import net.ftb.util.OSUtils.OS;
import net.ftb.util.winreg.JavaFinder;
import net.ftb.util.winreg.JavaInfo;
import net.ftb.util.winreg.JavaVersion;
@SuppressWarnings("serial")
public class OptionsPane extends JPanel implements ILauncherPane
{
private JToggleButton tglbtnForceUpdate;
private JButton installBrowseBtn, advancedOptionsBtn, btnInstallJava = new JButton();
private JLabel lblJavaVersion, lblInstallFolder, lblRamMaximum, lblLocale, currentRam, lbl32BitWarning = new JLabel();
private JSlider ramMaximum;
private JComboBox locale;
private JTextField installFolderTextField;
private JCheckBox chckbxShowConsole, keepLauncherOpen, optJavaArgs, useSystemProxy;
private final Settings settings;
private JPanel fitterPane;
private FocusListener settingsChangeListener = new FocusListener()
{
@Override
public void focusLost (FocusEvent e)
{
saveSettingsInto(settings);
}
@Override
public void focusGained (FocusEvent e)
{}
};
public OptionsPane (Settings settings)
{
this.settings = settings;
fitterPane = new JPanel();
fitterPane.setMinimumSize(new Dimension(840, 320));
fitterPane.setMaximumSize(new Dimension(840, 320));
fitterPane.setLayout(null);
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.add(fitterPane);
installBrowseBtn = new JButton("...");
installBrowseBtn.setBounds(786, 11, 49, 28);
installBrowseBtn.addActionListener(new ChooseDir(this));
fitterPane.add(installBrowseBtn);
lblInstallFolder = new JLabel(I18N.getLocaleString("INSTALL_FOLDER"));
lblInstallFolder.setBounds(10, 11, 127, 28);
fitterPane.add(lblInstallFolder);
installFolderTextField = new JTextField();
installFolderTextField.setBounds(147, 11, 629, 28);
installFolderTextField.addFocusListener(settingsChangeListener);
installFolderTextField.setColumns(10);
installFolderTextField.setText(settings.getInstallPath());
fitterPane.add(installFolderTextField);
tglbtnForceUpdate = new JToggleButton(I18N.getLocaleString("FORCE_UPDATE"));
tglbtnForceUpdate.setBounds(147, 48, 629, 29);
tglbtnForceUpdate.addActionListener(new ActionListener()
{
@Override
public void actionPerformed (ActionEvent arg0)
{
saveSettingsInto(OptionsPane.this.settings);
}
});
tglbtnForceUpdate.getModel().setPressed(settings.isForceUpdateEnabled());
fitterPane.add(tglbtnForceUpdate);
currentRam = new JLabel();
currentRam.setBounds(427, 95, 85, 25);
long ram = OSUtils.getOSTotalMemory();
long freeram = OSUtils.getOSFreeMemory();
ramMaximum = new JSlider();
ramMaximum.setBounds(190, 95, 222, 25);
ramMaximum.setSnapToTicks(true);
ramMaximum.setMajorTickSpacing(256);
ramMaximum.setMinorTickSpacing(256);
ramMaximum.setMinimum(256);
Boolean vm64Bits = Settings.getSettings().getCurrentJava().is64bits;
if (vm64Bits != null)
{
if (vm64Bits)
{
ramMaximum.setMaximum((int)ram);
}
else
{
if (ram < 1024)
{
ramMaximum.setMaximum((int)ram);
}
else
{
if (freeram > 2046)
{
ramMaximum.setMaximum(1536);
}
else
{
ramMaximum.setMaximum(1024);
}
}
}
}
int ramMax = (Integer.parseInt(settings.getRamMax()) > ramMaximum.getMaximum()) ? ramMaximum.getMaximum() : Integer.parseInt(settings.getRamMax());
ramMaximum.setValue(ramMax);
currentRam.setText(getAmount());
ramMaximum.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged (ChangeEvent arg0)
{
currentRam.setText(getAmount());
}
});
ramMaximum.addFocusListener(settingsChangeListener);
lblRamMaximum = new JLabel(I18N.getLocaleString("RAM_MAX"));
lblRamMaximum.setBounds(10, 95, 195, 25);
fitterPane.add(lblRamMaximum);
fitterPane.add(ramMaximum);
fitterPane.add(currentRam);
String[] locales;
synchronized (I18N.localeIndices)
{
locales = new String[I18N.localeIndices.size()];
for(Map.Entry<Integer, String> entry : I18N.localeIndices.entrySet())
{
Logger.logInfo("[i18n] Added " + entry.getKey().toString() + " " + entry.getValue() + " to options pane");
locales[entry.getKey()] = I18N.localeFiles.get(entry.getValue());
}
}
locale = new JComboBox(locales);
locale.setBounds(190, 130, 222, 25);
locale.addActionListener(new ActionListener()
{
@Override
public void actionPerformed (ActionEvent e)
{
I18N.setLocale(I18N.localeIndices.get(locale.getSelectedIndex()));
if (LaunchFrame.getInstance() != null)
{
LaunchFrame.getInstance().updateLocale();
}
}
});
locale.addFocusListener(settingsChangeListener);
locale.setSelectedItem(I18N.localeFiles.get(settings.getLocale()));
lblLocale = new JLabel(I18N.getLocaleString("LANGUAGE"));
lblLocale.setBounds(10, 130, 195, 25);
fitterPane.add(lblLocale);
fitterPane.add(locale);
updateJavaLabels();
chckbxShowConsole = new JCheckBox(I18N.getLocaleString("SHOW_CONSOLE"));
chckbxShowConsole.addFocusListener(settingsChangeListener);
chckbxShowConsole.setSelected(settings.getConsoleActive());
chckbxShowConsole.setBounds(540, 95, 183, 25);
fitterPane.add(chckbxShowConsole);
keepLauncherOpen = new JCheckBox(I18N.getLocaleString("REOPEN_LAUNCHER"));
keepLauncherOpen.setBounds(540, 130, 300, 25);
keepLauncherOpen.setSelected(settings.getKeepLauncherOpen());
keepLauncherOpen.addFocusListener(settingsChangeListener);
fitterPane.add(keepLauncherOpen);
optJavaArgs = new JCheckBox(I18N.getLocaleString("OPT_JAVA_ARGS"));
optJavaArgs.setBounds(540, 165, 300, 25);
optJavaArgs.setSelected(settings.getOptJavaArgs());
optJavaArgs.addFocusListener(settingsChangeListener);
fitterPane.add(optJavaArgs);
useSystemProxy = new JCheckBox(I18N.getLocaleString("USE_SYSTEM_PROXY"));
useSystemProxy.setBounds(540, 200, 300, 25);
useSystemProxy.setSelected(settings.getUseSystemProxy());
useSystemProxy.addFocusListener(settingsChangeListener);
fitterPane.add(useSystemProxy);
advancedOptionsBtn = new JButton(I18N.getLocaleString("ADVANCED_OPTIONS"));
advancedOptionsBtn.setBounds(147, 275, 629, 29);
advancedOptionsBtn.addActionListener(new ActionListener()
{
@Override
public void actionPerformed (ActionEvent arg0)
{
AdvancedOptionsDialog aod = new AdvancedOptionsDialog();
aod.setVisible(true);
}
});
advancedOptionsBtn.getModel().setPressed(settings.isForceUpdateEnabled());
fitterPane.add(advancedOptionsBtn);
if ((OSUtils.getCurrentOS().equals(OS.WINDOWS) || OSUtils.getCurrentOS().equals(OS.MACOSX)) && JavaFinder.parseJavaVersion() != null && JavaFinder.parseJavaVersion().path != null)
{
lblJavaVersion = new JLabel("Java version: " + JavaFinder.parseJavaVersion().origVersion);
lblJavaVersion.setBounds(15, 276, 250, 25);
fitterPane.add(lblJavaVersion);
}
}
public void setInstallFolderText (String text)
{
installFolderTextField.setText(text);
saveSettingsInto(settings);
}
public void saveSettingsInto (Settings settings)
{
settings.setInstallPath(installFolderTextField.getText());
settings.setForceUpdateEnabled(tglbtnForceUpdate.isSelected());
settings.setRamMax(String.valueOf(ramMaximum.getValue()));
settings.setLocale(I18N.localeIndices.get(locale.getSelectedIndex()));
settings.setConsoleActive(chckbxShowConsole.isSelected());
settings.setOptJavaArgs(optJavaArgs.isSelected());
settings.setKeepLauncherOpen(keepLauncherOpen.isSelected());
settings.setUseSystemProxy(useSystemProxy.isSelected());
settings.save();
}
public void updateLocale ()
{
lblInstallFolder.setText(I18N.getLocaleString("INSTALL_FOLDER"));
tglbtnForceUpdate.setText(I18N.getLocaleString("FORCE_UPDATE"));
lblRamMaximum.setText(I18N.getLocaleString("RAM_MAX"));
lblLocale.setText(I18N.getLocaleString("LANGUAGE"));
}
private String getAmount ()
{
int ramMax = ramMaximum.getValue();
return (ramMax >= 1024) ? Math.round((ramMax / 256) / 4) + "." + (((ramMax / 256) % 4) * 25) + " GB" : ramMax + " MB";
}
@Override
public void onVisible ()
{}
public void addUpdateJREButton (final String webLink, String unlocMessage)
{
btnInstallJava.setText(I18N.getLocaleString(unlocMessage));
btnInstallJava.addActionListener(new ActionListener()
{
@Override
public void actionPerformed (ActionEvent arg0)
{
OSUtils.browse(webLink);
}
});
btnInstallJava.setBounds(345, 210, 150, 28);
fitterPane.add(btnInstallJava);
}
public void addUpdateLabel (final String unlocMessage)
{
lbl32BitWarning.setText(I18N.getLocaleString(unlocMessage));
lbl32BitWarning.setBounds(147, 180, 600, 25);
lbl32BitWarning.setForeground(Color.red);
fitterPane.add(lbl32BitWarning);
}
public void offerJava7 (String reason)
{
if (OSUtils.getCurrentOS().equals(OS.MACOSX))
{
if (OSUtils.canRun7OnMac())
{
addUpdateJREButton(Locations.jreMac, "DOWNLOAD_JAVAGOOD");
addUpdateLabel(reason);
}
else
{
// TODO deal with old mac's that can't run java 7
}
}
else if (OSUtils.is64BitOS())
{
if (OSUtils.getCurrentOS().equals(OS.WINDOWS))
{
addUpdateJREButton(Locations.java64Win, "DOWNLOAD_JAVA64");
addUpdateLabel(reason);
}
else if (OSUtils.getCurrentOS().equals(OS.UNIX))
{
addUpdateJREButton(Locations.java64Lin, "DOWNLOAD_JAVA64");
addUpdateLabel(reason);
}
}
else
{
if (OSUtils.getCurrentOS().equals(OS.WINDOWS))
{
addUpdateJREButton(Locations.java32Win, "DOWNLOAD_JAVA32");
addUpdateLabel(reason);
}
else if (OSUtils.getCurrentOS().equals(OS.UNIX))
{
addUpdateJREButton(Locations.java32Lin, "DOWNLOAD_JAVA32");
addUpdateLabel(reason);
}
}
}
public void updateJavaLabels ()
{
remove(lbl32BitWarning);
remove(btnInstallJava);
// Dependant on vmType from earlier RAM calculations to detect 64 bit JVM
JavaInfo java = Settings.getSettings().getCurrentJava();
JavaVersion java7 = JavaVersion.createJavaVersion("1.7.0");
// offer java 7 if java 6 or older is detected
if (java.isOlder(java7))
{
offerJava7("JAVA_OLD_Warning");
}
// offer 64-bit java if 32-bit java detected in 64-bit OS
else if (!Settings.getSettings().getCurrentJava().is64bits)
{// needs to use proper bit's
addUpdateLabel("JAVA_32BIT_WARNING");
if (OSUtils.getCurrentOS().equals(OS.WINDOWS))
{
if (OSUtils.is64BitWindows())
{
addUpdateJREButton(Locations.java64Win, "DOWNLOAD_JAVA64");
}
}
}
repaint();
}
public void updateShowConsole ()
{
chckbxShowConsole.setSelected(settings.getConsoleActive());
}
}