package com.dsdev.moddle;
import com.dsdev.moddle.auth.Auth;
import com.dsdev.moddle.resources.Resources;
import com.dsdev.moddle.util.Logger;
import com.dsdev.moddle.util.SimpleSwingWorker;
import com.dsdev.moddle.util.Util;
import com.seaglasslookandfeel.SeaGlassLookAndFeel;
import java.awt.Color;
import java.awt.Component;
import java.awt.Image;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.List;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import net.lingala.zip4j.exception.ZipException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
/**
* The main GUI
*
* @author Diamond Sword Development
*/
public class MainForm extends javax.swing.JFrame {
/**
* Creates new form MainForm
*/
public MainForm() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
progressDialog = new javax.swing.JDialog();
progressDialogStatusBar = new javax.swing.JProgressBar();
progressDialogStatusLabel = new javax.swing.JLabel();
loginDialog = new javax.swing.JDialog();
loginDialogUsernameLabel = new javax.swing.JLabel();
loginDialogPasswordLabel = new javax.swing.JLabel();
loginDialogUsernameBox = new javax.swing.JTextField();
loginDialogPasswordBox = new javax.swing.JPasswordField();
loginDialogLoginButton = new javax.swing.JButton();
loginDialogCancelButton = new javax.swing.JButton();
popupDialog = new javax.swing.JDialog();
popupDialogCaptionLabel = new javax.swing.JLabel();
popupDialogOkButton = new javax.swing.JButton();
popupDialogImageLabel = new javax.swing.JLabel();
instanceDialog = new javax.swing.JDialog();
instanceDialogCreateButton = new javax.swing.JButton();
instanceDialogNameLabel = new javax.swing.JLabel();
instanceDialogNameBox = new javax.swing.JTextField();
instanceDialogModpackLabel = new javax.swing.JLabel();
instanceDialogModpackComboBox = new javax.swing.JComboBox();
instanceDialogCancelButton = new javax.swing.JButton();
instanceDialogVersionComboBox = new javax.swing.JComboBox();
instanceDialogModpackLabel1 = new javax.swing.JLabel();
consoleDialog = new javax.swing.JDialog();
jScrollPane3 = new javax.swing.JScrollPane();
consoleDialogLogPane = new javax.swing.JTextPane();
updateDialog = new javax.swing.JDialog();
updateDialogCaptionLabel = new javax.swing.JLabel();
updateDialogNoButton = new javax.swing.JButton();
updateDialogImageLabel = new javax.swing.JLabel();
updateDialogYesButton = new javax.swing.JButton();
jScrollPane6 = new javax.swing.JScrollPane();
updateDialogDescriptionPane = new javax.swing.JTextPane();
updateDialogCaptionLabel1 = new javax.swing.JLabel();
MainTabPane = new javax.swing.JTabbedPane();
ModpackPanel = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
ModpackList = new javax.swing.JList();
jScrollPane2 = new javax.swing.JScrollPane();
ModpackDescriptionPane = new javax.swing.JTextPane();
NewsPanel = new javax.swing.JPanel();
jScrollPane4 = new javax.swing.JScrollPane();
newsPane = new javax.swing.JTextPane();
NewsBannerLabel = new javax.swing.JLabel();
FollowUsLabel = new javax.swing.JLabel();
SettingsPanel = new javax.swing.JPanel();
PrefsUserLabel = new javax.swing.JLabel();
ReopenLauncherCheckbox = new javax.swing.JCheckBox();
ShowConsoleCheckbox = new javax.swing.JCheckBox();
MemoryLabel = new javax.swing.JLabel();
MemoryField = new javax.swing.JTextField();
JavaPathLabel = new javax.swing.JLabel();
JavaPathField = new javax.swing.JTextField();
MinecraftSizeLabel = new javax.swing.JLabel();
MinecraftSizeXField = new javax.swing.JTextField();
MinecraftSizeYField = new javax.swing.JTextField();
AdditionalVariablesLabel = new javax.swing.JLabel();
AdditionalVariablesWarningLabel = new javax.swing.JLabel();
jScrollPane5 = new javax.swing.JScrollPane();
AdditionalVariablesPane = new javax.swing.JTextPane();
CancelSettingsButton = new javax.swing.JButton();
SaveSettingsButton = new javax.swing.JButton();
ShowNewsCheckbox = new javax.swing.JCheckBox();
CheckForUpdatesButton = new javax.swing.JButton();
CheckUpdatesCheckbox = new javax.swing.JCheckBox();
CurrentUserLabel = new javax.swing.JLabel();
LoginButton = new javax.swing.JButton();
InstanceComboBox = new javax.swing.JComboBox();
DeleteInstanceButton = new javax.swing.JButton();
InstanceLabel = new javax.swing.JLabel();
CreateInstanceButton = new javax.swing.JButton();
ForceUpdateCheckBox = new javax.swing.JCheckBox();
PlayButton = new javax.swing.JButton();
progressDialog.setMinimumSize(new java.awt.Dimension(430, 100));
progressDialog.setResizable(false);
progressDialog.addWindowFocusListener(new java.awt.event.WindowFocusListener() {
public void windowGainedFocus(java.awt.event.WindowEvent evt) {
progressDialogWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
progressDialogWindowLostFocus(evt);
}
});
progressDialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
progressDialogWindowOpened(evt);
}
});
progressDialogStatusLabel.setText("Smoke...");
javax.swing.GroupLayout progressDialogLayout = new javax.swing.GroupLayout(progressDialog.getContentPane());
progressDialog.getContentPane().setLayout(progressDialogLayout);
progressDialogLayout.setHorizontalGroup(
progressDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(progressDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(progressDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(progressDialogStatusLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(progressDialogStatusBar, javax.swing.GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE))
.addContainerGap())
);
progressDialogLayout.setVerticalGroup(
progressDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(progressDialogLayout.createSequentialGroup()
.addContainerGap()
.addComponent(progressDialogStatusLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(progressDialogStatusBar, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
loginDialog.setTitle("Log In");
loginDialog.setMinimumSize(new java.awt.Dimension(400, 130));
loginDialog.setModal(true);
loginDialog.setResizable(false);
loginDialog.addWindowFocusListener(new java.awt.event.WindowFocusListener() {
public void windowGainedFocus(java.awt.event.WindowEvent evt) {
loginDialogWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
loginDialogWindowLostFocus(evt);
}
});
loginDialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
loginDialogWindowOpened(evt);
}
});
loginDialogUsernameLabel.setText("Username:");
loginDialogPasswordLabel.setText("Password:");
loginDialogLoginButton.setText("Log In");
loginDialogLoginButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loginDialogLoginButtonActionPerformed(evt);
}
});
loginDialogCancelButton.setText("Cancel");
loginDialogCancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loginDialogCancelButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout loginDialogLayout = new javax.swing.GroupLayout(loginDialog.getContentPane());
loginDialog.getContentPane().setLayout(loginDialogLayout);
loginDialogLayout.setHorizontalGroup(
loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(loginDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(loginDialogLayout.createSequentialGroup()
.addGroup(loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(loginDialogUsernameLabel)
.addComponent(loginDialogPasswordLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(loginDialogUsernameBox, javax.swing.GroupLayout.DEFAULT_SIZE, 318, Short.MAX_VALUE)
.addComponent(loginDialogPasswordBox)))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, loginDialogLayout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(loginDialogLoginButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(loginDialogCancelButton)))
.addContainerGap())
);
loginDialogLayout.setVerticalGroup(
loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(loginDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(loginDialogUsernameBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(loginDialogUsernameLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(loginDialogPasswordBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(loginDialogPasswordLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(loginDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(loginDialogLoginButton)
.addComponent(loginDialogCancelButton))
.addContainerGap())
);
popupDialog.setMinimumSize(new java.awt.Dimension(505, 143));
popupDialog.setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
popupDialog.setResizable(false);
popupDialog.addWindowFocusListener(new java.awt.event.WindowFocusListener() {
public void windowGainedFocus(java.awt.event.WindowEvent evt) {
popupDialogWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
popupDialogWindowLostFocus(evt);
}
});
popupDialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
popupDialogWindowOpened(evt);
}
});
popupDialogOkButton.setText("Ok");
popupDialogOkButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
popupDialogOkButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout popupDialogLayout = new javax.swing.GroupLayout(popupDialog.getContentPane());
popupDialog.getContentPane().setLayout(popupDialogLayout);
popupDialogLayout.setHorizontalGroup(
popupDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(popupDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(popupDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(popupDialogLayout.createSequentialGroup()
.addComponent(popupDialogImageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(popupDialogCaptionLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, popupDialogLayout.createSequentialGroup()
.addGap(0, 403, Short.MAX_VALUE)
.addComponent(popupDialogOkButton, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
popupDialogLayout.setVerticalGroup(
popupDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(popupDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(popupDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, popupDialogLayout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(popupDialogCaptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(popupDialogImageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(9, 9, 9)
.addComponent(popupDialogOkButton)
.addContainerGap(35, Short.MAX_VALUE))
);
instanceDialog.setMinimumSize(new java.awt.Dimension(409, 180));
instanceDialog.setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
instanceDialog.setResizable(false);
instanceDialog.addWindowFocusListener(new java.awt.event.WindowFocusListener() {
public void windowGainedFocus(java.awt.event.WindowEvent evt) {
instanceDialogWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
instanceDialogWindowLostFocus(evt);
}
});
instanceDialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
instanceDialogWindowOpened(evt);
}
});
instanceDialogCreateButton.setText("Create");
instanceDialogCreateButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
instanceDialogCreateButtonActionPerformed(evt);
}
});
instanceDialogNameLabel.setText("Instance Name:");
instanceDialogModpackLabel.setText("Modpack:");
instanceDialogModpackComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "<None>" }));
instanceDialogModpackComboBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
instanceDialogModpackComboBoxActionPerformed(evt);
}
});
instanceDialogCancelButton.setText("Cancel");
instanceDialogCancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
instanceDialogCancelButtonActionPerformed(evt);
}
});
instanceDialogVersionComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "<None>" }));
instanceDialogModpackLabel1.setText("Pack Version:");
javax.swing.GroupLayout instanceDialogLayout = new javax.swing.GroupLayout(instanceDialog.getContentPane());
instanceDialog.getContentPane().setLayout(instanceDialogLayout);
instanceDialogLayout.setHorizontalGroup(
instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(instanceDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(instanceDialogLayout.createSequentialGroup()
.addComponent(instanceDialogCreateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(instanceDialogCancelButton))
.addGroup(instanceDialogLayout.createSequentialGroup()
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(instanceDialogNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(instanceDialogModpackLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(instanceDialogModpackLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(instanceDialogModpackComboBox, 0, 300, Short.MAX_VALUE)
.addComponent(instanceDialogNameBox)
.addComponent(instanceDialogVersionComboBox, 0, 300, Short.MAX_VALUE))))
.addContainerGap(19, Short.MAX_VALUE))
);
instanceDialogLayout.setVerticalGroup(
instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, instanceDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(instanceDialogNameLabel)
.addComponent(instanceDialogNameBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(instanceDialogModpackComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(instanceDialogModpackLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(instanceDialogVersionComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(instanceDialogModpackLabel1))
.addGap(18, 18, 18)
.addGroup(instanceDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(instanceDialogCreateButton)
.addComponent(instanceDialogCancelButton))
.addContainerGap(51, Short.MAX_VALUE))
);
consoleDialog.setTitle("Moddle Console");
consoleDialog.setMinimumSize(new java.awt.Dimension(700, 350));
consoleDialogLogPane.setEditable(false);
consoleDialogLogPane.setBackground(java.awt.SystemColor.control);
consoleDialogLogPane.setContentType("text/html"); // NOI18N
consoleDialogLogPane.setForeground(new java.awt.Color(255, 255, 255));
consoleDialogLogPane.setToolTipText("");
jScrollPane3.setViewportView(consoleDialogLogPane);
javax.swing.GroupLayout consoleDialogLayout = new javax.swing.GroupLayout(consoleDialog.getContentPane());
consoleDialog.getContentPane().setLayout(consoleDialogLayout);
consoleDialogLayout.setHorizontalGroup(
consoleDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 700, Short.MAX_VALUE)
);
consoleDialogLayout.setVerticalGroup(
consoleDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)
);
updateDialog.setMinimumSize(new java.awt.Dimension(505, 355));
updateDialog.setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
updateDialog.setResizable(false);
updateDialog.addWindowFocusListener(new java.awt.event.WindowFocusListener() {
public void windowGainedFocus(java.awt.event.WindowEvent evt) {
updateDialogWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
updateDialogWindowLostFocus(evt);
}
});
updateDialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
updateDialogWindowClosed(evt);
}
public void windowOpened(java.awt.event.WindowEvent evt) {
updateDialogWindowOpened(evt);
}
});
updateDialogCaptionLabel.setText("The following updates are available for automatic installation:");
updateDialogNoButton.setText("No");
updateDialogNoButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
updateDialogNoButtonActionPerformed(evt);
}
});
updateDialogYesButton.setText("Yes");
updateDialogYesButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
updateDialogYesButtonActionPerformed(evt);
}
});
updateDialogDescriptionPane.setEditable(false);
jScrollPane6.setViewportView(updateDialogDescriptionPane);
updateDialogCaptionLabel1.setText("Would you like to download and install them now?");
javax.swing.GroupLayout updateDialogLayout = new javax.swing.GroupLayout(updateDialog.getContentPane());
updateDialog.getContentPane().setLayout(updateDialogLayout);
updateDialogLayout.setHorizontalGroup(
updateDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(updateDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(updateDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane6)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updateDialogLayout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(updateDialogYesButton, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(updateDialogNoButton, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(updateDialogLayout.createSequentialGroup()
.addComponent(updateDialogImageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(updateDialogCaptionLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(updateDialogCaptionLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE))
.addContainerGap())
);
updateDialogLayout.setVerticalGroup(
updateDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(updateDialogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(updateDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(updateDialogImageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(updateDialogCaptionLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 32, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 214, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(updateDialogCaptionLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(updateDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(updateDialogYesButton)
.addComponent(updateDialogNoButton))
.addContainerGap(38, Short.MAX_VALUE))
);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Moddle Launcher");
setMinimumSize(new java.awt.Dimension(900, 501));
addWindowFocusListener(new java.awt.event.WindowFocusListener() {
public void windowGainedFocus(java.awt.event.WindowEvent evt) {
formWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
formWindowLostFocus(evt);
}
});
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
});
MainTabPane.setTabPlacement(javax.swing.JTabbedPane.BOTTOM);
MainTabPane.setName(""); // NOI18N
ModpackList.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
ModpackList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
ModpackListValueChanged(evt);
}
});
jScrollPane1.setViewportView(ModpackList);
ModpackDescriptionPane.setEditable(false);
ModpackDescriptionPane.setContentType("text/html"); // NOI18N
jScrollPane2.setViewportView(ModpackDescriptionPane);
javax.swing.GroupLayout ModpackPanelLayout = new javax.swing.GroupLayout(ModpackPanel);
ModpackPanel.setLayout(ModpackPanelLayout);
ModpackPanelLayout.setHorizontalGroup(
ModpackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(ModpackPanelLayout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 240, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 705, Short.MAX_VALUE))
);
ModpackPanelLayout.setVerticalGroup(
ModpackPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 431, Short.MAX_VALUE)
.addComponent(jScrollPane2)
);
MainTabPane.addTab("Modpacks", ModpackPanel);
newsPane.setEditable(false);
newsPane.setBackground(java.awt.SystemColor.control);
jScrollPane4.setViewportView(newsPane);
NewsBannerLabel.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
NewsBannerLabel.setText("Moddle News");
FollowUsLabel.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
FollowUsLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
FollowUsLabel.setText("Follow Us");
javax.swing.GroupLayout NewsPanelLayout = new javax.swing.GroupLayout(NewsPanel);
NewsPanel.setLayout(NewsPanelLayout);
NewsPanelLayout.setHorizontalGroup(
NewsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(NewsPanelLayout.createSequentialGroup()
.addComponent(NewsBannerLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 351, Short.MAX_VALUE)
.addComponent(FollowUsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jScrollPane4)
);
NewsPanelLayout.setVerticalGroup(
NewsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(NewsPanelLayout.createSequentialGroup()
.addGroup(NewsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(NewsBannerLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(FollowUsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 371, Short.MAX_VALUE))
);
MainTabPane.addTab("News", NewsPanel);
PrefsUserLabel.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
PrefsUserLabel.setText("Not Logged In");
ReopenLauncherCheckbox.setText("Re-open launcher when Minecraft closes");
ShowConsoleCheckbox.setText("Show the Moddle console");
ShowConsoleCheckbox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
ShowConsoleCheckboxActionPerformed(evt);
}
});
MemoryLabel.setText("Minimum Memory (Mb):");
MemoryField.setText("1024");
JavaPathLabel.setText("Java Executable Path:");
JavaPathField.setText("default");
MinecraftSizeLabel.setText("Minecraft Window Size:");
MinecraftSizeXField.setText("default");
MinecraftSizeYField.setText("default");
AdditionalVariablesLabel.setText("Additional Launcher Variables:");
AdditionalVariablesWarningLabel.setForeground(new java.awt.Color(204, 0, 0));
AdditionalVariablesWarningLabel.setText("(Advanced!)");
jScrollPane5.setViewportView(AdditionalVariablesPane);
CancelSettingsButton.setText("Cancel");
CancelSettingsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
CancelSettingsButtonActionPerformed(evt);
}
});
SaveSettingsButton.setText("Save");
SaveSettingsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
SaveSettingsButtonActionPerformed(evt);
}
});
ShowNewsCheckbox.setSelected(true);
ShowNewsCheckbox.setText("Show the news tab on startup");
CheckForUpdatesButton.setText("Check for Updates");
CheckForUpdatesButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
CheckForUpdatesButtonActionPerformed(evt);
}
});
CheckUpdatesCheckbox.setSelected(true);
CheckUpdatesCheckbox.setText("Check for updates on startup");
javax.swing.GroupLayout SettingsPanelLayout = new javax.swing.GroupLayout(SettingsPanel);
SettingsPanel.setLayout(SettingsPanelLayout);
SettingsPanelLayout.setHorizontalGroup(
SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(PrefsUserLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(ShowConsoleCheckbox)
.addComponent(ReopenLauncherCheckbox)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(AdditionalVariablesLabel)
.addComponent(AdditionalVariablesWarningLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 397, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 208, Short.MAX_VALUE)
.addComponent(SaveSettingsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(CancelSettingsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addComponent(CheckUpdatesCheckbox)
.addGap(18, 18, 18)
.addComponent(CheckForUpdatesButton, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(ShowNewsCheckbox)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(MemoryLabel)
.addComponent(JavaPathLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(MemoryField, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(JavaPathField, javax.swing.GroupLayout.PREFERRED_SIZE, 431, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addComponent(MinecraftSizeLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(MinecraftSizeXField, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(MinecraftSizeYField, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(0, 0, Short.MAX_VALUE))))
);
SettingsPanelLayout.setVerticalGroup(
SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(PrefsUserLabel)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addGap(29, 29, 29)
.addComponent(ReopenLauncherCheckbox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(ShowConsoleCheckbox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(ShowNewsCheckbox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(CheckUpdatesCheckbox)
.addComponent(CheckForUpdatesButton))
.addGap(18, 18, 18)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(MemoryLabel)
.addComponent(MemoryField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(JavaPathField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(JavaPathLabel))
.addGap(18, 18, 18)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(MinecraftSizeXField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(MinecraftSizeLabel)
.addComponent(MinecraftSizeYField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(19, 19, 19)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addComponent(AdditionalVariablesLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(AdditionalVariablesWarningLabel)
.addGap(0, 86, Short.MAX_VALUE))
.addComponent(jScrollPane5)))
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(CancelSettingsButton)
.addComponent(SaveSettingsButton))))
.addContainerGap())
);
MainTabPane.addTab("Settings", SettingsPanel);
CurrentUserLabel.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
CurrentUserLabel.setText("Loading...");
LoginButton.setText("Log Out");
LoginButton.setEnabled(false);
LoginButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
LoginButtonActionPerformed(evt);
}
});
InstanceComboBox.setEnabled(false);
InstanceComboBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
InstanceComboBoxActionPerformed(evt);
}
});
DeleteInstanceButton.setText("Delete");
DeleteInstanceButton.setEnabled(false);
DeleteInstanceButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
DeleteInstanceButtonActionPerformed(evt);
}
});
InstanceLabel.setText("Instance:");
CreateInstanceButton.setText("Create");
CreateInstanceButton.setEnabled(false);
CreateInstanceButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
CreateInstanceButtonActionPerformed(evt);
}
});
ForceUpdateCheckBox.setText("Force Update");
PlayButton.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
PlayButton.setForeground(new java.awt.Color(0, 0, 51));
PlayButton.setText("Play");
PlayButton.setEnabled(false);
PlayButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
PlayButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(LoginButton)
.addComponent(CurrentUserLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(InstanceLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(InstanceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(CreateInstanceButton, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(DeleteInstanceButton)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(PlayButton, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(ForceUpdateCheckBox, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
.addComponent(MainTabPane)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(MainTabPane)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(CurrentUserLabel)
.addComponent(InstanceLabel)
.addComponent(InstanceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(PlayButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(LoginButton)
.addComponent(CreateInstanceButton)
.addComponent(DeleteInstanceButton)
.addComponent(ForceUpdateCheckBox))
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void loadModpackList() {
//Clear modpack ComboBox
instanceDialogModpackComboBox.removeAllItems();
DefaultListModel modpackListModel = new DefaultListModel();
if (new File("./packs").isDirectory()) {
//Populate modpack lists
for (File f : new File("./packs").listFiles()) {
if (f.isDirectory()) {
Logger.info("MainForm.loadModpackList", "Loading pack '" + f.getName() + "'");
modpackListModel.addElement(f.getName());
instanceDialogModpackComboBox.addItem(f.getName());
}
}
} else {
Logger.info("MainForm.loadModpackList", "Creating packs directory...");
//Create 'packs' directory
(new File("./packs")).mkdirs();
}
//Load ListModel into ModpackList
ModpackList.setModel(modpackListModel);
}
private void fetchNews() {
//Download news
try {
FileUtils.copyURLToFile(new URL("https://sites.google.com/site/moddlerepo/news.zip"), new File("./data/news/news.zip"));
} catch (IOException ex) {
Logger.warning("MainForm.formWindowOpened", "Could not fetch news!");
return;
}
//Delete old news
try {
FileUtils.deleteDirectory(new File("./data/news/news_content"));
} catch (IOException ex) {
//Swallow error
}
//Extract news
try {
Util.decompressZipfile("./data/news/news.zip", "./data/news/news_content");
} catch (ZipException ex) {
Logger.warning("MainForm.formWindowOpened", "Could not extract news archive!");
return;
}
}
private void loadUser(String accountName) {
//Get the 'friendly' username string (removes '@' and '.')
String friendlyAccountName = getFriendlyName(accountName);
//Clear instance ComboBox
InstanceComboBox.removeAllItems();
InstanceComboBox.addItem("<None>");
if (accountName == null) {
//Select '<None' as current instance
InstanceComboBox.setSelectedItem("<None>");
} else {
//Create user directory if necessary
Util.createDirectoryIfNeeded("./users/" + friendlyAccountName);
//Create 'lastplayed.json' file if necessary
File lastPlayedFile = new File("./users/" + friendlyAccountName + "/lastplayed.json");
if (!lastPlayedFile.isFile()) {
try {
FileUtils.writeStringToFile(lastPlayedFile, "{\"instance\":\"<None>\"}");
} catch (IOException ex) {
}
}
//Clear instance ComboBox
InstanceComboBox.removeAllItems();
InstanceComboBox.addItem("<None>");
//Populate instance ComboBox
for (File f : new File("./users/" + friendlyAccountName).listFiles()) {
if (f.isDirectory()) {
InstanceComboBox.addItem(f.getName());
}
}
//Select last played instance
try {
JSONObject lastPlayedConfig = Util.readJSONFile("./users/" + friendlyAccountName + "/lastplayed.json");
InstanceComboBox.setSelectedItem(lastPlayedConfig.get("instance").toString());
} catch (IOException ex) {
InstanceComboBox.setSelectedItem("<None>");
}
}
if (InstanceComboBox.getSelectedItem().toString().equals("<None>")) {
//Display 'no pack selected' content
loadPaneContentFromResourceImage("nopack.png", ModpackDescriptionPane);
ModpackList.setSelectedIndex(-1);
} else {
//Load pack description content
String selectedInstance = InstanceComboBox.getSelectedItem().toString();
try {
JSONObject instanceConfig = Util.readJSONFile("./users/" + friendlyAccountName + "/" + selectedInstance + "/instance.json");
ModpackList.setSelectedValue(instanceConfig.get("pack").toString(), true);
loadPaneContentFromDirectory("./packs/" + instanceConfig.get("pack").toString(), ModpackDescriptionPane);
} catch (IOException ex) {
//Load 'no description' content if content loading fails
loadPaneContentFromResourceImage("nodesc.png", ModpackDescriptionPane);
}
}
}
private void loadUserPrefs(String accountName) {
if (accountName == null) {
loadNullUserPrefs();
return;
}
//Get the 'friendly' username string (removes '@' and '.')
String friendlyAccountName = getFriendlyName(accountName);
//Load pref config
JSONObject prefConfig;
try {
prefConfig = Util.readJSONFile("./users/" + friendlyAccountName + "/prefs.json");
} catch (IOException ex) {
Logger.warning("MainForm.loadUserPrefs", "Could not load preferences file! Loading null prefs...");
loadNullUserPrefs();
PrefsUserLabel.setText(Auth.Username);
return;
}
SettingsPanel.setEnabled(true);
PrefsUserLabel.setText(Auth.Username);
ReopenLauncherCheckbox.setSelected(Boolean.parseBoolean(prefConfig.get("reopen").toString()));
ShowConsoleCheckbox.setSelected(Boolean.parseBoolean(prefConfig.get("console").toString()));
ShowNewsCheckbox.setSelected(Boolean.parseBoolean(prefConfig.get("news").toString()));
CheckUpdatesCheckbox.setSelected(Boolean.parseBoolean(prefConfig.get("update").toString()));
MemoryField.setText(prefConfig.get("memory").toString());
JavaPathField.setText(prefConfig.get("javapath").toString());
MinecraftSizeXField.setText(prefConfig.get("width").toString());
MinecraftSizeYField.setText(prefConfig.get("height").toString());
AdditionalVariablesPane.setText(prefConfig.get("variables").toString().replace("``n", "\n").replace("``q", "\""));
}
private void loadNullUserPrefs() {
SettingsPanel.setEnabled(false);
PrefsUserLabel.setText("Not Logged In");
ReopenLauncherCheckbox.setSelected(false);
ShowConsoleCheckbox.setSelected(false);
ShowNewsCheckbox.setSelected(true);
CheckUpdatesCheckbox.setSelected(true);
MemoryField.setText("1024");
JavaPathField.setText("default");
MinecraftSizeXField.setText("default");
MinecraftSizeYField.setText("default");
AdditionalVariablesPane.setText("");
}
private void saveUserPrefs(String accountName) {
//Get the 'friendly' username string (removes '@' and '.')
String friendlyAccountName = getFriendlyName(accountName);
//Create pref config
JSONObject prefConfig = new JSONObject();
prefConfig.put("reopen", Boolean.toString(ReopenLauncherCheckbox.isSelected()));
prefConfig.put("console", Boolean.toString(ShowConsoleCheckbox.isSelected()));
prefConfig.put("news", Boolean.toString(ShowNewsCheckbox.isSelected()));
prefConfig.put("update", Boolean.toString(CheckUpdatesCheckbox.isSelected()));
prefConfig.put("memory", MemoryField.getText());
prefConfig.put("javapath", JavaPathField.getText());
prefConfig.put("width", MinecraftSizeXField.getText());
prefConfig.put("height", MinecraftSizeYField.getText());
prefConfig.put("variables", AdditionalVariablesPane.getText().replace("\n", "``n").replace("\"", "``q"));
try {
FileUtils.writeStringToFile(new File("./users/" + friendlyAccountName + "/prefs.json"), prefConfig.toJSONString());
} catch (IOException ex) {
Logger.error("MainForm.saveUserPrefs", "Unable to save user preferences!", false, ex);
}
Logger.info("MainForm.saveUserPrefs", "Saved user preferences!");
}
private String getFriendlyName(String accountName) {
if (accountName == null) return null;
return accountName.replace("@", "__").replace(".", "__");
}
private void enablePlayControls() {
PlayButton.setEnabled(true);
ForceUpdateCheckBox.setEnabled(true);
InstanceLabel.setEnabled(true);
InstanceComboBox.setEnabled(true);
CreateInstanceButton.setEnabled(true);
DeleteInstanceButton.setEnabled(true);
}
private void disablePlayControls() {
PlayButton.setEnabled(false);
ForceUpdateCheckBox.setEnabled(false);
InstanceLabel.setEnabled(false);
InstanceComboBox.setEnabled(false);
CreateInstanceButton.setEnabled(false);
DeleteInstanceButton.setEnabled(false);
}
private void loadPaneContentFromDirectory(String contentLocation, JTextPane pane) {
if (!new File(contentLocation + "/description.txt").exists()) {
loadPaneContentFromResourceImage("nodesc.png", pane);
}
try {
List<String> contentLines = FileUtils.readLines(new File(contentLocation + "/description.txt"));
SimpleAttributeSet keyWord = new SimpleAttributeSet();
pane.setText("");
for (String line : contentLines) {
if (line.startsWith("$[[") && line.endsWith("]]")) {
String styleString = line.substring(3, line.length() - 2);
for (String style : styleString.split(",")) {
String styleArg = style;
String styleValue = "";
try {
styleArg = style.split(":")[0];
styleValue = style.split(":")[1];
} catch (Exception ex) { }
if (styleArg.equalsIgnoreCase("image")) {
pane.insertIcon(new ImageIcon(contentLocation + "/" + styleValue));
pane.getStyledDocument().insertString(pane.getStyledDocument().getLength(), "\n", keyWord);
} else if (styleArg.equalsIgnoreCase("imageres")) {
pane.insertIcon(new ImageIcon(this.getClass().getResource("com/dsdev/moddle/resources/" + styleValue)));
pane.getStyledDocument().insertString(pane.getStyledDocument().getLength(), "\n", keyWord);
}else if (styleArg.equalsIgnoreCase("reset")) {
keyWord = new SimpleAttributeSet();
} else {
try {
for (Method m : StyleConstants.class.getMethods()) {
if (m.getName().toLowerCase().equalsIgnoreCase("set" + styleArg)) {
if (styleValue.equalsIgnoreCase("true") || styleValue.equalsIgnoreCase("false")) {
m.invoke(null, new Object[] { keyWord, styleValue.equalsIgnoreCase("true") });
} else if (Util.isNumeric(styleValue)) {
m.invoke(null, new Object[] { keyWord, Integer.parseInt(styleValue) });
} else {
m.invoke(null, new Object[] { keyWord, styleValue });
}
}
}
} catch (Exception ex) {
}
}
}
} else {
pane.getStyledDocument().insertString(pane.getStyledDocument().getLength(), line + "\n", keyWord);
}
}
} catch (Exception ex) {
Logger.error("MainForm.loadModpackPaneContent", "Failed to load content!", false, ex);
}
pane.setCaretPosition(0);
}
private void loadPaneContentFromResourceImage(String imageName, JTextPane pane) {
try {
pane.setText("");
pane.insertIcon(Resources.getImageResource(imageName));
} catch (Exception ex) {
Logger.error("MainForm.loadModpackPaneContent", "Failed to load content!", false, ex);
}
pane.setCaretPosition(0);
}
private void redirectOutputStreams() {
//Redirect standard output
OutputStream redirectedStdOutput = new OutputStream() {
@Override
public void write(final int b) throws IOException {
updateTextPane(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextPane(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
private void updateTextPane(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Document doc = GlobalDialogs.consoleDialogLogPane.getDocument();
try {
SimpleAttributeSet sas = new SimpleAttributeSet();
if (text.contains("[Moddle]")) {
StyleConstants.setForeground(sas, Color.CYAN.darker().darker());
} else if (text.contains("INFO")) {
StyleConstants.setForeground(sas, Color.BLACK);
} else if (text.contains("WARNING")) {
StyleConstants.setForeground(sas, Color.ORANGE.darker());
} else if (text.contains("SEVERE")) {
StyleConstants.setForeground(sas, Color.RED.darker().darker());
} else {
StyleConstants.setForeground(sas, Color.CYAN.darker().darker().darker());
}
doc.insertString(doc.getLength(), text, sas);
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
GlobalDialogs.consoleDialogLogPane.setCaretPosition(doc.getLength() - 1);
}
});
}
};
System.setOut(new PrintStream(redirectedStdOutput, true));
//Redirect standard error
OutputStream redirectedStdError = new OutputStream() {
@Override
public void write(final int b) throws IOException {
updateTextPane(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextPane(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
private void updateTextPane(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Document doc = GlobalDialogs.consoleDialogLogPane.getDocument();
try {
SimpleAttributeSet sas = new SimpleAttributeSet();
StyleConstants.setForeground(sas, Color.RED.darker());
doc.insertString(doc.getLength(), text, sas);
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
GlobalDialogs.consoleDialogLogPane.setCaretPosition(doc.getLength() - 1);
}
});
}
};
System.setErr(new PrintStream(redirectedStdOutput, true));
}
private void loadUserPrefVariables() {
Variables.setSetting("launch.UseXmxArgument", "true");
Variables.setSetting("launch.XmxArgument", MemoryField.getText());
Variables.setSettingPriority("launch.XmxArgument", "int:largest");
if (!JavaPathField.getText().equalsIgnoreCase("default")) {
Variables.setSetting("launch.JavaExecutablePath", JavaPathField.getText());
}
if (!MinecraftSizeXField.getText().equalsIgnoreCase("default")) {
Variables.setSetting("launch.UseWidthArgument", "true");
Variables.setSetting("launch.WidthArgument", MinecraftSizeXField.getText());
}
if (!MinecraftSizeYField.getText().equalsIgnoreCase("default")) {
Variables.setSetting("launch.UseHeightArgument", "true");
Variables.setSetting("launch.HeightArgument", MinecraftSizeYField.getText());
}
for (String line : AdditionalVariablesPane.getText().split("\n")) {
String settingName = line.split("=")[0];
String settingValue = line.substring(settingName.length());
Variables.setSetting(settingName, settingValue);
}
}
private void loadRequiredFilesIfNecessary() {
if (!new File("./data/ids.json").isFile()) {
Util.createDirectoryIfNeeded("./data");
try {
Resources.copyFileResource("ids.json", "./data/ids.json");
} catch (IOException ex) {
Logger.error("MainForm.loadRequiredFilesIfNecessary", "Failed to copy 'ids.json' from resource!", false, ex);
}
}
if (!new File("./packs").isDirectory()) {
loadDirectoryFromResource("packs");
}
if (!new File("./update/version.json").isFile()) {
Util.createDirectoryIfNeeded("./update");
try {
Resources.copyFileResource("version.json", "./update/version.json");
} catch (IOException ex) {
Logger.error("MainForm.loadRequiredFilesIfNecessary", "Failed to copy 'version.json' from resource!", false, ex);
}
}
}
private void loadDirectoryFromResource(String name) {
Logger.info("MainForm.loadRequiredFilesIfNecessary", "Copying '" + name + ".zip'...");
try {
IOUtils.copy(this.getClass().getResourceAsStream(name + ".zip"), new FileOutputStream("./" + name + ".zip"));
} catch (IOException ex) {
Logger.error("MainForm.loadRequiredFilesIfNecessary", "Failed to copy the archive file!", true, ex);
}
Logger.info("MainForm.loadRequiredFilesIfNecessary", "Extracting '" + name + ".zip'...");
try {
Util.decompressZipfile("./" + name + ".zip", "./" + name);
} catch (ZipException ex) {
Logger.error("MainForm.loadRequiredFilesIfNecessary", "Failed to extract the archive file!", true, ex);
}
Logger.info("MainForm.loadRequiredFilesIfNecessary", "Cleaning up...");
FileUtils.deleteQuietly(new File("./" + name + ".zip"));
}
private void ModpackListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_ModpackListValueChanged
if (ModpackList.getSelectedValue() != null) {
//Load description content
loadPaneContentFromDirectory("./packs/" + ModpackList.getSelectedValue().toString(), ModpackDescriptionPane);
}
}//GEN-LAST:event_ModpackListValueChanged
private void InstanceComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_InstanceComboBoxActionPerformed
try {
if (InstanceComboBox.getSelectedItem().toString().equals("<None>")) {
//Display 'no pack selected' content
loadPaneContentFromResourceImage("nopack.png", ModpackDescriptionPane);
ModpackList.setSelectedIndex(-1);
} else {
//Load pack description content
String selectedInstance = InstanceComboBox.getSelectedItem().toString();
try {
JSONObject instanceConfig = Util.readJSONFile("./users/" + getFriendlyName(Auth.AccountName) + "/" + selectedInstance + "/instance.json");
ModpackList.setSelectedValue(instanceConfig.get("pack").toString(), true);
loadPaneContentFromDirectory("./packs/" + instanceConfig.get("pack").toString(), ModpackDescriptionPane);
} catch (IOException ex) {
//Load 'no description' content if content loading fails
loadPaneContentFromResourceImage("nodesc.png", ModpackDescriptionPane);
}
}
} catch (Exception ex) { }
}//GEN-LAST:event_InstanceComboBoxActionPerformed
private void LoginButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LoginButtonActionPerformed
if (LoginButton.getText().equals("Log In")) {
//Show login dialog
loginDialog.setVisible(true);
} else {
//Log out and save auth state
Auth.performLogout();
Auth.saveToFile();
loadUser(null);
loadUserPrefs(null);
LoginButton.setText("Log In");
CurrentUserLabel.setText("-- Not Logged In --");
disablePlayControls();
}
}//GEN-LAST:event_LoginButtonActionPerformed
private void DeleteInstanceButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DeleteInstanceButtonActionPerformed
if (!InstanceComboBox.getSelectedItem().toString().equals("<None>")) {
String instanceToBeRemoved = InstanceComboBox.getSelectedItem().toString();
//Delete instance
try {
FileUtils.deleteDirectory(new File("./users/" + getFriendlyName(Auth.AccountName) + "/" + InstanceComboBox.getSelectedItem().toString()));
} catch (IOException ex) {
return;
}
//Clear the instance ComboBoc
InstanceComboBox.removeAllItems();
InstanceComboBox.addItem("<None>");
//Populate instance ComboBox
for (File f : new File("./users/" + getFriendlyName(Auth.AccountName)).listFiles()) {
if (f.isDirectory()) {
InstanceComboBox.addItem(f.getName());
}
}
InstanceComboBox.setSelectedIndex(0);
Logger.info("MainForm.DeleteInstanceButtonActionPerformed", "Removed instance '" + instanceToBeRemoved + "'.");
}
}//GEN-LAST:event_DeleteInstanceButtonActionPerformed
private void CreateInstanceButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreateInstanceButtonActionPerformed
instanceDialog.setVisible(true);
}//GEN-LAST:event_CreateInstanceButtonActionPerformed
private void PlayButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PlayButtonActionPerformed
Logger.info("MainForm.PlayButtonActionPerformed", "Starting execution...");
GlobalDialogs.showProgressDialog();
SimpleSwingWorker worker = new SimpleSwingWorker() {
@Override
protected void task() {
//Save lastlogin data
Auth.saveToFile();
String accountname = getFriendlyName(Auth.AccountName);
String instancename = InstanceComboBox.getSelectedItem().toString();
//Save lastplayed data
File lastPlayedFile = new File("./users/" + accountname + "/lastplayed.json");
try {
FileUtils.writeStringToFile(lastPlayedFile, "{\"instance\":\"" + instancename + "\"}");
} catch (IOException ex) { }
//Check that critical fields are correctly completed
if (CurrentUserLabel.getText().startsWith("-- ")) {
Logger.error("MainForm.PlayButtonActionPerformed", "No valid login given!", true, new Exception ("Invalid Login!"));
return;
}
if (InstanceComboBox.getSelectedItem().toString().equals("<None>")) {
Logger.error("MainForm.PlayButtonActionPerformed", "No instance selected!", true, new Exception ("'<None>' instance was selected!"));
return;
}
//Clear settings
Variables.clearSettings();
Logger.info("MainForm.PlayButtonActionPerformed", "Preparing to build modpack...");
//Load settings from user preferences
loadUserPrefVariables();
//Build instance
if (!Instances.isInstanceComplete(accountname, instancename) || ForceUpdateCheckBox.isSelected()) {
if (!Instances.buildInstance(accountname, instancename)) {
GlobalDialogs.hideProgressDialog();
return;
}
}
//Clear settings
Variables.clearSettings();
//Load settings from user preferences
loadUserPrefVariables();
//Launch process
Logger.info("MainForm.PlayButtonActionPerformed", "Preparing to launch modpack...");
Process processHandle = Instances.runInstance(accountname, instancename);
if (processHandle != null) {
//Hide the launcher
setVisible(false);
GlobalDialogs.hideProgressDialog();
//Exit if neither the console is shown nor the launcher set to reopen
if (!ReopenLauncherCheckbox.isSelected() && !ShowConsoleCheckbox.isSelected()) {
System.exit(0);
}
//Wait for the process to exit
try {
processHandle.waitFor();
} catch (InterruptedException ex) {
Logger.error("MainForm.PlayButtonActionPerformed", "Something broke while waiting for the Minecraft process!", true, ex);
}
//Reopen if specified or exit
if (ReopenLauncherCheckbox.isSelected()) {
setVisible(true);
} else {
System.exit(0);
}
} else {
//Hide the progress dialog
GlobalDialogs.hideProgressDialog();
}
}
};
worker.execute();
}//GEN-LAST:event_PlayButtonActionPerformed
private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
//Set basic frame properties
this.getContentPane().setBackground(new Color(152, 174, 196));
this.setLocationRelativeTo(null);
//Load window icons
Image moddleIcon = Resources.getImageResource("icon_mb.png").getImage();
this.setIconImage(moddleIcon);
progressDialog.setIconImage(moddleIcon);
loginDialog.setIconImage(moddleIcon);
popupDialog.setIconImage(moddleIcon);
instanceDialog.setIconImage(moddleIcon);
consoleDialog.setIconImage(moddleIcon);
updateDialog.setIconImage(moddleIcon);
//Load dialog images
popupDialogImageLabel.setIcon(Resources.getImageResource("alert.png"));
updateDialogImageLabel.setIcon(Resources.getImageResource("alert_small.png"));
//Load news images
NewsBannerLabel.setText("");
NewsBannerLabel.setIcon(Resources.getImageResource("news.png"));
FollowUsLabel.setText("");
FollowUsLabel.setIcon(Resources.getImageResource("followus.png"));
//Set up custom JList rendering
ModpackList.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (new File("./packs/" + value.toString() + "/pack.png").isFile()) {
label.setIcon(new ImageIcon("./packs/" + value.toString() + "/pack.png"));
} else {
label.setIcon(Resources.getImageResource("noicon.png"));
}
return label;
}
});
//Assign global dialog objects
GlobalDialogs.popupDialog = popupDialog;
GlobalDialogs.popupDialogCaptionLabel = popupDialogCaptionLabel;
GlobalDialogs.progressDialog = progressDialog;
GlobalDialogs.progressDialogStatusBar = progressDialogStatusBar;
GlobalDialogs.progressDialogStatusLabel = progressDialogStatusLabel;
GlobalDialogs.consoleDialog = consoleDialog;
GlobalDialogs.consoleDialogLogPane = consoleDialogLogPane;
GlobalDialogs.updateDialog = updateDialog;
GlobalDialogs.updateDialogDescriptionPane = updateDialogDescriptionPane;
GlobalDialogs.updateDialogCaptionLabel = updateDialogCaptionLabel;
//Redirect stdout and begin logging
redirectOutputStreams();
Logger.begin();
//Load data directory
Logger.info("MainForm.formWindowOpened", "Loading self-extracting data...");
loadRequiredFilesIfNecessary();
//Load modpacks
Logger.info("MainForm.formWindowOpened", "Loading modpacks...");
loadModpackList();
//Load auth from file
Logger.info("MainForm.formWindowOpened", "Restoring last login...");
Auth.loadFromFile();
if (Auth.isLoggedIn) {
if (Auth.performLogin(null, null)) {
CurrentUserLabel.setText(Auth.Username);
LoginButton.setText("Log Out");
enablePlayControls();
} else {
CurrentUserLabel.setText("-- Not Logged In --");
LoginButton.setText("Log In");
disablePlayControls();
}
} else {
CurrentUserLabel.setText("-- Not Logged In --");
LoginButton.setText("Log In");
disablePlayControls();
}
LoginButton.setEnabled(true);
//Load GUI
if (Auth.isLoggedIn) {
loadUser(Auth.AccountName);
loadUserPrefs(Auth.AccountName);
} else {
loadUser(null);
loadUserPrefs(null);
}
//Set console visibility
consoleDialog.setVisible(ShowConsoleCheckbox.isSelected());
toFront();
//Download and display news
Logger.info("MainForm.formWindowOpened", "Loading news...");
fetchNews();
loadPaneContentFromDirectory("./data/news/news_content", newsPane);
if (ShowNewsCheckbox.isSelected()) {
MainTabPane.setSelectedIndex(1);
}
//Check for updates
SimpleSwingWorker worker = new SimpleSwingWorker() {
@Override
protected void task() {
Updater.checkForUpdates(false);
}
};
worker.execute();
Logger.info("MainForm.formWindowOpened", "Finished loading.");
}//GEN-LAST:event_formWindowOpened
private void formWindowGainedFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowGainedFocus
this.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_formWindowGainedFocus
private void formWindowLostFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowLostFocus
this.getContentPane().setBackground(new Color(225, 225, 225));
}//GEN-LAST:event_formWindowLostFocus
private void loginDialogWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_loginDialogWindowOpened
loginDialog.setLocationRelativeTo(null);
loginDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_loginDialogWindowOpened
private void loginDialogWindowGainedFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_loginDialogWindowGainedFocus
loginDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_loginDialogWindowGainedFocus
private void loginDialogWindowLostFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_loginDialogWindowLostFocus
loginDialog.getContentPane().setBackground(new Color(225, 225, 225));
}//GEN-LAST:event_loginDialogWindowLostFocus
private void progressDialogWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_progressDialogWindowOpened
progressDialog.setLocationRelativeTo(null);
progressDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_progressDialogWindowOpened
private void progressDialogWindowGainedFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_progressDialogWindowGainedFocus
progressDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_progressDialogWindowGainedFocus
private void progressDialogWindowLostFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_progressDialogWindowLostFocus
progressDialog.getContentPane().setBackground(new Color(225, 225, 225));
}//GEN-LAST:event_progressDialogWindowLostFocus
private void popupDialogWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_popupDialogWindowOpened
popupDialog.setLocationRelativeTo(null);
popupDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_popupDialogWindowOpened
private void popupDialogWindowGainedFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_popupDialogWindowGainedFocus
popupDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_popupDialogWindowGainedFocus
private void popupDialogWindowLostFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_popupDialogWindowLostFocus
popupDialog.getContentPane().setBackground(new Color(225, 225, 225));
}//GEN-LAST:event_popupDialogWindowLostFocus
private void instanceDialogWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_instanceDialogWindowOpened
instanceDialog.setLocationRelativeTo(null);
instanceDialog.getContentPane().setBackground(new Color(152, 174, 196));
instanceDialogVersionComboBox.removeAllItems();
instanceDialogVersionComboBox.addItem("Recommended");
try {
JSONObject packConfig = Util.readJSONFile("./packs/" + instanceDialogModpackComboBox.getSelectedItem().toString() + "/pack.json");
JSONArray versionsArray = (JSONArray)packConfig.get("versions");
for (Object obj : versionsArray) {
JSONObject versionObj = (JSONObject)obj;
instanceDialogVersionComboBox.addItem(versionObj.get("name").toString());
}
} catch (IOException ex) {
Logger.warning("MainForm.instanceDialogWindowOpened", "Failed to load available pack versions!");
}
}//GEN-LAST:event_instanceDialogWindowOpened
private void instanceDialogWindowGainedFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_instanceDialogWindowGainedFocus
instanceDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_instanceDialogWindowGainedFocus
private void instanceDialogWindowLostFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_instanceDialogWindowLostFocus
instanceDialog.getContentPane().setBackground(new Color(225, 225, 225));
}//GEN-LAST:event_instanceDialogWindowLostFocus
private void loginDialogCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loginDialogCancelButtonActionPerformed
loginDialog.setVisible(false);
}//GEN-LAST:event_loginDialogCancelButtonActionPerformed
private void loginDialogLoginButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loginDialogLoginButtonActionPerformed
SimpleSwingWorker worker = new SimpleSwingWorker() {
@Override
protected void task() {
loginDialog.setVisible(false);
GlobalDialogs.showProgressDialog();
GlobalDialogs.setProgressIndeterminate(true);
GlobalDialogs.setProgressCaption("Logging in...");
Auth.performLogin(loginDialogUsernameBox.getText(), new String(loginDialogPasswordBox.getPassword()));
GlobalDialogs.hideProgressDialog();
if (Auth.isLoggedIn) {
Auth.saveToFile();
CurrentUserLabel.setText(Auth.Username);
LoginButton.setText("Log Out");
enablePlayControls();
loadUser(Auth.AccountName);
loadUserPrefs(Auth.AccountName);
Logger.info("MainForm.loginDialogLoginButtonActionPerformed", "Logged in user '" + Auth.AccountName + "'.");
} else {
GlobalDialogs.showNotification("Unable to log in successfully!");
CurrentUserLabel.setText("-- Not Logged In --");
LoginButton.setText("Log In");
disablePlayControls();
}
}
};
worker.execute();
}//GEN-LAST:event_loginDialogLoginButtonActionPerformed
private void instanceDialogCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_instanceDialogCancelButtonActionPerformed
instanceDialog.setVisible(false);
}//GEN-LAST:event_instanceDialogCancelButtonActionPerformed
private void instanceDialogCreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_instanceDialogCreateButtonActionPerformed
new File("./users/" + getFriendlyName(Auth.AccountName) + "/" + instanceDialogNameBox.getText()).mkdirs();
JSONObject instanceConfig = new JSONObject();
instanceConfig.put("name", instanceDialogNameBox.getText());
instanceConfig.put("pack", instanceDialogModpackComboBox.getSelectedItem().toString());
instanceConfig.put("version", instanceDialogVersionComboBox.getSelectedItem().toString());
try {
FileUtils.writeStringToFile(new File("./users/" + getFriendlyName(Auth.AccountName) + "/" + instanceDialogNameBox.getText() + "/instance.json"), instanceConfig.toJSONString());
} catch (IOException ex) {
Logger.error("MainForm.instanceDialogCreateButtonActionPerformed", "Could not create 'instance.json'!", false, ex);
return;
}
loadUser(Auth.AccountName);
loadUserPrefs(Auth.AccountName);
instanceDialog.setVisible(false);
Logger.info("MainForm.instanceDialogCreateButtonActionPerformed", "Created new instance '" + instanceDialogNameBox.getText() + "'.");
}//GEN-LAST:event_instanceDialogCreateButtonActionPerformed
private void popupDialogOkButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_popupDialogOkButtonActionPerformed
popupDialog.setVisible(false);
}//GEN-LAST:event_popupDialogOkButtonActionPerformed
private void instanceDialogModpackComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_instanceDialogModpackComboBoxActionPerformed
try {
instanceDialogVersionComboBox.removeAllItems();
instanceDialogVersionComboBox.addItem("Recommended");
try {
JSONObject packConfig = Util.readJSONFile("./packs/" + instanceDialogModpackComboBox.getSelectedItem().toString() + "/pack.json");
JSONArray versionsArray = (JSONArray)packConfig.get("versions");
for (Object obj : versionsArray) {
JSONObject versionObj = (JSONObject)obj;
instanceDialogVersionComboBox.addItem(versionObj.get("name").toString());
}
} catch (IOException ex) {
Logger.warning("MainForm.instanceDialogWindowOpened", "Failed to load available pack versions!");
}
} catch (Exception ex) { }
}//GEN-LAST:event_instanceDialogModpackComboBoxActionPerformed
private void SaveSettingsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveSettingsButtonActionPerformed
saveUserPrefs(Auth.AccountName);
}//GEN-LAST:event_SaveSettingsButtonActionPerformed
private void CancelSettingsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelSettingsButtonActionPerformed
loadUserPrefs(Auth.AccountName);
}//GEN-LAST:event_CancelSettingsButtonActionPerformed
private void ShowConsoleCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ShowConsoleCheckboxActionPerformed
//Update console visibility
consoleDialog.setVisible(ShowConsoleCheckbox.isSelected());
//Bring this form to front
this.setVisible(true);
}//GEN-LAST:event_ShowConsoleCheckboxActionPerformed
private void updateDialogNoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateDialogNoButtonActionPerformed
updateDialog.setVisible(false);
Updater.DialogResult = 0;
}//GEN-LAST:event_updateDialogNoButtonActionPerformed
private void updateDialogWindowGainedFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_updateDialogWindowGainedFocus
updateDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_updateDialogWindowGainedFocus
private void updateDialogWindowLostFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_updateDialogWindowLostFocus
updateDialog.getContentPane().setBackground(new Color(225, 225, 225));
}//GEN-LAST:event_updateDialogWindowLostFocus
private void updateDialogWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_updateDialogWindowOpened
updateDialog.setLocationRelativeTo(null);
updateDialog.getContentPane().setBackground(new Color(152, 174, 196));
}//GEN-LAST:event_updateDialogWindowOpened
private void updateDialogYesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateDialogYesButtonActionPerformed
updateDialog.setVisible(false);
Updater.DialogResult = 1;
}//GEN-LAST:event_updateDialogYesButtonActionPerformed
private void CheckForUpdatesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CheckForUpdatesButtonActionPerformed
//Check for updates
SimpleSwingWorker worker = new SimpleSwingWorker() {
@Override
protected void task() {
Updater.checkForUpdates(true);
}
};
worker.execute();
}//GEN-LAST:event_CheckForUpdatesButtonActionPerformed
private void updateDialogWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_updateDialogWindowClosed
if (Updater.DialogResult == -1) {
Updater.DialogResult = 0;
}
}//GEN-LAST:event_updateDialogWindowClosed
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
SeaGlassLookAndFeel laf = new SeaGlassLookAndFeel();
javax.swing.UIManager.setLookAndFeel(laf);
//javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getCrossPlatformLookAndFeelClassName());
/*for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}*/
} catch (Exception ex) {
java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainForm().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel AdditionalVariablesLabel;
private javax.swing.JTextPane AdditionalVariablesPane;
private javax.swing.JLabel AdditionalVariablesWarningLabel;
private javax.swing.JButton CancelSettingsButton;
private javax.swing.JButton CheckForUpdatesButton;
private javax.swing.JCheckBox CheckUpdatesCheckbox;
private javax.swing.JButton CreateInstanceButton;
private javax.swing.JLabel CurrentUserLabel;
private javax.swing.JButton DeleteInstanceButton;
private javax.swing.JLabel FollowUsLabel;
private javax.swing.JCheckBox ForceUpdateCheckBox;
private javax.swing.JComboBox InstanceComboBox;
private javax.swing.JLabel InstanceLabel;
private javax.swing.JTextField JavaPathField;
private javax.swing.JLabel JavaPathLabel;
private javax.swing.JButton LoginButton;
private javax.swing.JTabbedPane MainTabPane;
private javax.swing.JTextField MemoryField;
private javax.swing.JLabel MemoryLabel;
private javax.swing.JLabel MinecraftSizeLabel;
private javax.swing.JTextField MinecraftSizeXField;
private javax.swing.JTextField MinecraftSizeYField;
private javax.swing.JTextPane ModpackDescriptionPane;
private javax.swing.JList ModpackList;
private javax.swing.JPanel ModpackPanel;
private javax.swing.JLabel NewsBannerLabel;
private javax.swing.JPanel NewsPanel;
private javax.swing.JButton PlayButton;
private javax.swing.JLabel PrefsUserLabel;
private javax.swing.JCheckBox ReopenLauncherCheckbox;
private javax.swing.JButton SaveSettingsButton;
private javax.swing.JPanel SettingsPanel;
private javax.swing.JCheckBox ShowConsoleCheckbox;
private javax.swing.JCheckBox ShowNewsCheckbox;
private javax.swing.JDialog consoleDialog;
private javax.swing.JTextPane consoleDialogLogPane;
private javax.swing.JDialog instanceDialog;
private javax.swing.JButton instanceDialogCancelButton;
private javax.swing.JButton instanceDialogCreateButton;
private javax.swing.JComboBox instanceDialogModpackComboBox;
private javax.swing.JLabel instanceDialogModpackLabel;
private javax.swing.JLabel instanceDialogModpackLabel1;
private javax.swing.JTextField instanceDialogNameBox;
private javax.swing.JLabel instanceDialogNameLabel;
private javax.swing.JComboBox instanceDialogVersionComboBox;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JScrollPane jScrollPane6;
private javax.swing.JDialog loginDialog;
private javax.swing.JButton loginDialogCancelButton;
private javax.swing.JButton loginDialogLoginButton;
private javax.swing.JPasswordField loginDialogPasswordBox;
private javax.swing.JLabel loginDialogPasswordLabel;
private javax.swing.JTextField loginDialogUsernameBox;
private javax.swing.JLabel loginDialogUsernameLabel;
private javax.swing.JTextPane newsPane;
private javax.swing.JDialog popupDialog;
private javax.swing.JLabel popupDialogCaptionLabel;
private javax.swing.JLabel popupDialogImageLabel;
private javax.swing.JButton popupDialogOkButton;
public javax.swing.JDialog progressDialog;
public javax.swing.JProgressBar progressDialogStatusBar;
private javax.swing.JLabel progressDialogStatusLabel;
private javax.swing.JDialog updateDialog;
private javax.swing.JLabel updateDialogCaptionLabel;
private javax.swing.JLabel updateDialogCaptionLabel1;
private javax.swing.JTextPane updateDialogDescriptionPane;
private javax.swing.JLabel updateDialogImageLabel;
private javax.swing.JButton updateDialogNoButton;
private javax.swing.JButton updateDialogYesButton;
// End of variables declaration//GEN-END:variables
}