package net.technicpack.launcher.ui.components;
import net.technicpack.launcher.ui.LauncherFrame;
import net.technicpack.launchercore.launch.java.IJavaVersion;
import net.technicpack.launchercore.launch.java.JavaVersionRepository;
import net.technicpack.launchercore.modpacks.RunData;
import net.technicpack.ui.controls.LauncherDialog;
import net.technicpack.ui.controls.RoundedButton;
import net.technicpack.ui.controls.borders.RoundBorder;
import net.technicpack.ui.lang.ResourceLoader;
import net.technicpack.utilslib.Memory;
import javax.swing.*;
import javax.swing.text.View;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FixRunDataDialog extends LauncherDialog {
private static final int DIALOG_WIDTH = 620;
private ResourceLoader resourceLoader;
private RunData runData;
private JavaVersionRepository javaVersionRepository;
private Memory attemptedMemory;
private boolean shouldAskFirst;
private IJavaVersion recommendedVersion;
private Memory recommendedMemory;
private JCheckBox rememberThis;
private Result result = Result.OK;
public enum Result {
OK,
ACCEPT,
CANCEL
}
public FixRunDataDialog(Frame owner, ResourceLoader resourceLoader, RunData runData, JavaVersionRepository javaVersionRepository, Memory attemptedMemory, boolean shouldAskFirst) {
super(owner);
this.runData = runData;
this.javaVersionRepository = javaVersionRepository;
this.attemptedMemory = attemptedMemory;
this.resourceLoader = resourceLoader;
this.shouldAskFirst = shouldAskFirst;
recommendSettings();
initComponents();
}
@Override
public void setVisible(boolean visible) {
if ((recommendedVersion != null && recommendedMemory != null && javaVersionRepository.getSelectedVersion().equals(recommendedVersion) && attemptedMemory.getMemoryMB() == recommendedMemory.getMemoryMB()) ||
(!shouldAskFirst && recommendedMemory != null && recommendedVersion != null)) {
result = Result.ACCEPT;
dispose();
return;
}
super.setVisible(visible);
}
public Result getResult() {
return result;
}
public boolean shouldRemember() {
if (rememberThis == null)
return false;
return rememberThis.isSelected();
}
public Memory getRecommendedMemory() {
return recommendedMemory;
}
public IJavaVersion getRecommendedJavaVersion() {
return recommendedVersion;
}
protected void recommendSettings() {
if (!runData.isJavaValid(javaVersionRepository.getSelectedVersion().getVersionNumber())) {
recommendedVersion = runData.getValidJavaVersion(javaVersionRepository);
} else {
recommendedVersion = javaVersionRepository.getSelectedVersion();
}
if (!runData.isMemoryValid(attemptedMemory.getMemoryMB())) {
recommendedMemory = runData.getValidMemory(javaVersionRepository);
} else {
recommendedMemory = attemptedMemory;
}
}
private void initComponents() {
setLayout(new BorderLayout());
createHeader(resourceLoader.getString("fixRunData.title"));
JPanel centerPanel = new JPanel() {
@Override
public Dimension getMaximumSize() {
Dimension dim = super.getMaximumSize();
dim.width = DIALOG_WIDTH;
return dim;
}
@Override
public Dimension getPreferredSize() {
Dimension dim = super.getPreferredSize();
dim.width = DIALOG_WIDTH;
return dim;
}
};
centerPanel.setBackground(LauncherFrame.COLOR_CENTRAL_BACK_OPAQUE);
centerPanel.setOpaque(true);
centerPanel.setBorder(BorderFactory.createEmptyBorder(15,15,15,15));
add(centerPanel, BorderLayout.CENTER);
centerPanel.setLayout(new GridBagLayout());
Font font = resourceLoader.getFont(ResourceLoader.FONT_OPENSANS, 16);
JLabel label = new JLabel(
"<html>" +
"<body style=\"font-family:"+font.getFamily()+";font-size:11px;font-color:#D0D0D0\">" +
resourceLoader.getString("fixRunData.header") +
"</body>" +
"</html>");
label.setFont(font);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
centerPanel.add(label, new GridBagConstraints(0, 0, 1, 1, 1.0f, 0, GridBagConstraints.NORTH, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH-5));
buildSuccessFailPanels(centerPanel, font.getFamily());
boolean isFailure = recommendedMemory == null || recommendedVersion == null;
int gridBagIndex = 3;
if (isFailure) {
gridBagIndex = buildFailureReasons(centerPanel, gridBagIndex, font.getFamily());
} else {
label = new JLabel(
"<html>" +
"<body style=\"font-family:" + font.getFamily() + ";font-size:11px;font-color:#D0D0D0\">" +
resourceLoader.getString("fixRunData.changeSettings") +
"</body>" +
"</html>");
label.setFont(font);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
centerPanel.add(label, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 0, GridBagConstraints.SOUTH, GridBagConstraints.BOTH, new Insets(8, 0, 8, 0), 0, 0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH - 5));
}
JSeparator separator = new JSeparator();
separator.setForeground(LauncherFrame.COLOR_REQUIREMENT_SEPARATOR);
separator.setBackground(LauncherFrame.COLOR_REQUIREMENT_SEPARATOR);
centerPanel.add(separator, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(isFailure?14:0, 0, 0,0),0,0));
if (isFailure) {
buildFailureButtons(centerPanel, gridBagIndex, font);
} else {
buildRecommendedButtons(centerPanel, gridBagIndex, font);
}
pack();
setLocationRelativeTo(getParent());
}
private void createHeader(String text) {
JPanel header = new JPanel();
header.setBackground(Color.black);
header.setLayout(new BoxLayout(header, BoxLayout.LINE_AXIS));
header.setBorder(BorderFactory.createEmptyBorder(4,8,4,8));
add(header, BorderLayout.PAGE_START);
JLabel title = new JLabel(text);
title.setFont(resourceLoader.getFont(ResourceLoader.FONT_RALEWAY, 26));
title.setBorder(BorderFactory.createEmptyBorder(5,0,5,0));
title.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
title.setOpaque(false);
title.setIcon(resourceLoader.getIcon("options_cog.png"));
header.add(title);
header.add(Box.createHorizontalGlue());
JButton closeButton = new JButton();
closeButton.setIcon(resourceLoader.getIcon("close.png"));
closeButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
closeButton.setContentAreaFilled(false);
closeButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
closeDialog();
}
});
closeButton.setFocusPainted(false);
header.add(closeButton);
}
private void buildSuccessFailPanels(JPanel centerPanel, String fontFamily) {
boolean memorySuccess = runData.isMemoryValid(attemptedMemory.getMemoryMB());
boolean javaSuccess = runData.isJavaValid(javaVersionRepository.getSelectedVersion().getVersionNumber());
String memRequirement = resourceLoader.getString("fixRunData.reqMemory", runData.getMemoryObject().toString());
String javaRequirement = resourceLoader.getString("fixRunData.reqJava", runData.getJava());
String currentMem = resourceLoader.getString("fixRunData.currentMemory", attemptedMemory.toString());
String currentJavaBitness = javaVersionRepository.getSelectedVersion().is64Bit()?resourceLoader.getString("launcheroptions.java.64bit"):resourceLoader.getString("launcheroptions.java.32bit");
String currentJava = resourceLoader.getString("fixRunData.currentJava", javaVersionRepository.getSelectedVersion().getVersionNumber(), currentJavaBitness);
if (!memorySuccess && recommendedMemory != null) {
currentMem += resourceLoader.getString("fixRunData.bestOption", recommendedMemory.toString());
}
if (!javaSuccess && recommendedVersion != null) {
String javaVersion = recommendedVersion.getVersionNumber();
String javaBitness = recommendedVersion.is64Bit()?resourceLoader.getString("launcheroptions.java.64bit"):resourceLoader.getString("launcheroptions.java.32bit");
if (javaVersionRepository.getBest64BitVersion() == recommendedVersion)
javaVersion = resourceLoader.getString("launcheroptions.java.best64version", javaVersion + " " + javaBitness);
currentJava += resourceLoader.getString("fixRunData.bestOption", javaVersion);
}
addSuccessFailPanel(centerPanel, fontFamily, 1, memorySuccess, recommendedMemory != null, memRequirement, currentMem);
addSuccessFailPanel(centerPanel, fontFamily, 2, javaSuccess, recommendedVersion != null, javaRequirement, currentJava);
}
private int buildFailureReasons(JPanel centerPanel, int gridBagIndex, String fontFamily) {
JLabel label = new JLabel(
"<html>" +
"<body style=\"font-family:"+fontFamily+";font-size:11px;font-color:#D0D0D0\">" +
resourceLoader.getString("fixRunData.cannotRun") +
"</body>" +
"</html>");
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
centerPanel.add(label, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 0, GridBagConstraints.SOUTH, GridBagConstraints.BOTH, new Insets(8,0,4,0), 0,0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH-5));
boolean javaVersionGood = recommendedVersion != null;
boolean memoryGood = recommendedMemory != null;
boolean requires64Bit = runData.getMemory() > Memory.MAX_32_BIT_MEMORY;
boolean has64Bit = javaVersionRepository.getBest64BitVersion() != null;
boolean get64BitJava = requires64Bit && !has64Bit;
boolean getBetterJava = !javaVersionGood && !get64BitJava;
boolean getMoreRam = !memoryGood && !get64BitJava;
if (getBetterJava) {
label = new JLabel(
"<html>" +
"<head><link rel=\"stylesheet\" type=\"text/css\" href=\"http://www.technicpack.net/assets/css/launcher.css\" /></head>" +
"<body style=\"font-family:" + fontFamily + ";font-size:11px;font-color:#D0D0D0\">" +
resourceLoader.getString("fixRunData.needBetterJava") +
"</body>" +
"</html>", resourceLoader.getIcon("danger_icon.png"), SwingConstants.LEFT);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
centerPanel.add(label, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 0, GridBagConstraints.SOUTH, GridBagConstraints.BOTH, new Insets(0, 8, 0, 0), 0, 0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH - 5));
}
if (get64BitJava) {
label = new JLabel(
"<html>" +
"<head><link rel=\"stylesheet\" type=\"text/css\" href=\"http://www.technicpack.net/assets/css/launcher.css\" /></head>" +
"<body style=\"font-family:" + fontFamily + ";font-size:11px;font-color:#D0D0D0\">" +
resourceLoader.getString("fixRunData.need64BitJava") +
"</body>" +
"</html>", resourceLoader.getIcon("danger_icon.png"), SwingConstants.LEFT);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
centerPanel.add(label, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 0, GridBagConstraints.SOUTH, GridBagConstraints.BOTH, new Insets(0, 8, 0, 0), 0, 0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH - 5));
}
if (getMoreRam) {
label = new JLabel(
"<html>" +
"<body style=\"font-family:" + fontFamily + ";font-size:11px;font-color:#D0D0D0\">" +
resourceLoader.getString("fixRunData.needMoreRAM") +
"</body>" +
"</html>", resourceLoader.getIcon("danger_icon.png"), SwingConstants.LEFT);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
centerPanel.add(label, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 0, GridBagConstraints.SOUTH, GridBagConstraints.BOTH, new Insets(0, 8, 0, 0), 0, 0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH - 5));
}
return gridBagIndex;
}
private void addSuccessFailPanel(JPanel centerPanel, String fontFamily, int gridBagRow, boolean isSuccess, boolean hasRecommendation, String compareText, String contrastText) {
JPanel successFailPanel = new JPanel();
successFailPanel.setBorder(new RoundBorder(getPanelColor(isSuccess, hasRecommendation)));
successFailPanel.setBackground(getPanelColor(isSuccess, hasRecommendation));
centerPanel.add(successFailPanel, new GridBagConstraints(0, gridBagRow, 1, 1, 1.0f, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(8,0,10,0),0,0));
successFailPanel.setLayout(new GridBagLayout());
JLabel checkbox = new JLabel(resourceLoader.getIcon(getPanelIcon(isSuccess, hasRecommendation)));
successFailPanel.add(checkbox, new GridBagConstraints(0, 0, 1, 2, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,14,0,0), 0,0));
JLabel label = new JLabel(
"<html>" +
"<body style=\"font-family:"+fontFamily+";font-size:12px;font-color:#D0D0D0\">" +
compareText +
"</body>" +
"</html>"
);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
successFailPanel.add(label, new GridBagConstraints(1, 0, 1, 1, 1.0f, 0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(8,10,6,0),0,0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH - 125));
label = new JLabel(
"<html>" +
"<body style=\"font-family:"+fontFamily+";font-size:12px;font-color:#D0D0D0\">" +
contrastText +
"</body>" +
"</html>"
);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
successFailPanel.add(label, new GridBagConstraints(1, 1, 1, 1, 1.0f, 0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0,10,8,0),0,0));
label.setPreferredSize(getPreferredSize(label.getText(), DIALOG_WIDTH - 125));
}
private void buildFailureButtons(JPanel centerPanel, int gridBagIndex, Font font) {
JPanel buttonPanel = new JPanel();
buttonPanel.setOpaque(false);
centerPanel.add(buttonPanel, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 1.0f, GridBagConstraints.NORTH, GridBagConstraints.BOTH, new Insets(8, 0, 0, 0), 0, 0));
RoundedButton okButton = new RoundedButton(resourceLoader.getString("fixRunData.OK"));
okButton.setFont(resourceLoader.getFont(ResourceLoader.FONT_OPENSANS, 16));
okButton.setContentAreaFilled(false);
okButton.setBorder(BorderFactory.createEmptyBorder(5, 25, 5, 25));
okButton.setForeground(LauncherFrame.COLOR_BUTTON_BLUE);
okButton.setHoverForeground(LauncherFrame.COLOR_BLUE);
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
result = Result.OK;
dispose();
}
});
buttonPanel.add(okButton);
}
private void buildRecommendedButtons(JPanel centerPanel, int gridBagIndex, Font font) {
JPanel checkPanel = new JPanel();
checkPanel.setOpaque(false);
centerPanel.add(checkPanel, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
JLabel label = new JLabel(resourceLoader.getString("fixRunData.dontAskAgain"));
label.setFont(font);
label.setForeground(LauncherFrame.COLOR_WHITE_TEXT);
checkPanel.add(label);
rememberThis = new JCheckBox("", false);
rememberThis.setHorizontalAlignment(SwingConstants.RIGHT);
rememberThis.setBorder(BorderFactory.createEmptyBorder());
rememberThis.setIconTextGap(0);
rememberThis.setSelectedIcon(resourceLoader.getIcon("checkbox_closed.png"));
rememberThis.setIcon(resourceLoader.getIcon("checkbox_open.png"));
rememberThis.setFocusPainted(false);
checkPanel.add(rememberThis);
JPanel buttonPanel = new JPanel();
buttonPanel.setOpaque(false);
centerPanel.add(buttonPanel, new GridBagConstraints(0, gridBagIndex++, 1, 1, 1.0f, 1.0f, GridBagConstraints.NORTH, GridBagConstraints.BOTH, new Insets(8, 0, 0, 0), 0, 0));
RoundedButton cancelButton = new RoundedButton(resourceLoader.getString("fixRunData.cancel"));
cancelButton.setFont(resourceLoader.getFont(ResourceLoader.FONT_OPENSANS, 16));
cancelButton.setContentAreaFilled(false);
cancelButton.setForeground(LauncherFrame.COLOR_BUTTON_BLUE);
cancelButton.setHoverForeground(LauncherFrame.COLOR_BLUE);
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
result = Result.CANCEL;
dispose();
}
});
buttonPanel.add(cancelButton);
buttonPanel.add(Box.createHorizontalGlue());
RoundedButton okButton = new RoundedButton(resourceLoader.getString("fixRunData.OK"));
okButton.setFont(resourceLoader.getFont(ResourceLoader.FONT_OPENSANS, 16));
okButton.setContentAreaFilled(false);
okButton.setForeground(LauncherFrame.COLOR_BUTTON_BLUE);
okButton.setHoverForeground(LauncherFrame.COLOR_BLUE);
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
result = Result.ACCEPT;
dispose();
}
});
buttonPanel.add(okButton);
}
private Color getPanelColor(boolean isSuccess, boolean hasRecommended) {
return isSuccess?LauncherFrame.COLOR_REQUIREMENT_SUCCEED:(hasRecommended?LauncherFrame.COLOR_REQUIREMENT_WARNING:LauncherFrame.COLOR_REQUIREMENT_FAIL);
}
public String getPanelIcon(boolean isSuccess, boolean hasRecommended) {
return isSuccess?"req_success.png":(hasRecommended?"req_warning.png":"req_failed.png");
}
/**Returns the preferred size to set a component at in order to render
* an html string. You can specify the size of one dimension.*/
private static JLabel resizer = new JLabel();
private java.awt.Dimension getPreferredSize(String html, int width) {
resizer.setText(html);
View view = (View) resizer.getClientProperty(
javax.swing.plaf.basic.BasicHTML.propertyKey);
view.setSize(width,0);
float w = view.getPreferredSpan(View.X_AXIS);
float h = view.getPreferredSpan(View.Y_AXIS);
return new java.awt.Dimension((int) Math.ceil(w),
(int) Math.ceil(h));
}
protected void closeDialog() {
dispose();
}
}