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 }