package net.classicube.launcher.gui; import java.awt.Color; import java.awt.event.ItemEvent; import java.util.logging.Level; import java.util.prefs.BackingStoreException; import javax.swing.JFrame; import javax.swing.JRadioButton; import javax.swing.JRootPane; import javax.swing.border.EmptyBorder; import net.classicube.launcher.AccountManager; import net.classicube.launcher.DiagnosticInfoUploader; import net.classicube.launcher.GameServiceType; import net.classicube.launcher.LogUtil; import net.classicube.launcher.Prefs; import net.classicube.launcher.SessionManager; import net.classicube.launcher.UpdateMode; final class PreferencesScreen extends javax.swing.JDialog { // ============================================================================================= // INITIALIZATION // ============================================================================================= PreferencesScreen(final JFrame parent) { super(parent, "Preferences", true); final JRootPane root = getRootPane(); root.setBorder(new EmptyBorder(8, 8, 8, 8)); initComponents(); root.setDefaultButton(bSave); // tweak BG colors root.setBackground(new Color(247, 247, 247)); getContentPane().setBackground(new Color(247, 247, 247)); // match save and cancel buttons' sizes bSave.setPreferredSize(bCancel.getSize()); // fix for ugly spinner border nMemory.getEditor().setOpaque(false); // hook up context menu CutCopyPasteAdapter.addToComponent(this.tJavaArgs, true, true); // Set icon, pack and center this.setIconImages(Resources.getWindowIcons()); pack(); setLocationRelativeTo(parent); // Fill in the values loadPreferences(); checkIfForgetButtonsShouldBeEnabled(); } void checkIfForgetButtonsShouldBeEnabled() { AccountManager curManager = SessionManager.getAccountManager(); AccountManager otherManager; if (SessionManager.getSession().getServiceType() == GameServiceType.ClassiCubeNetService) { otherManager = new AccountManager(GameServiceType.MinecraftNetService); } else { otherManager = new AccountManager(GameServiceType.ClassiCubeNetService); } boolean hasUsers = curManager.hasAccounts() || otherManager.hasAccounts(); boolean hasPasswords = hasUsers && (curManager.hasPasswords() || otherManager.hasPasswords()); boolean hasResume; try { hasResume = SessionManager.hasAnyResumeInfo() || (Prefs.getRememberedExternalIPs().keys().length > 0); } catch (BackingStoreException ex) { LogUtil.getLogger().log(Level.WARNING, "Error checking stored external IPs", ex); hasResume = SessionManager.hasAnyResumeInfo(); } this.bForgetUsers.setEnabled(hasUsers); this.bForgetPasswords.setEnabled(hasPasswords); this.bForgetServers.setEnabled(hasResume); } // ============================================================================================= // LOADING/STORING PREFS // ============================================================================================= private void loadPreferences() { xFullscreen.setSelected(Prefs.getFullscreen()); loadUpdateMode(Prefs.getUpdateMode()); xRememberPasswords.setSelected(Prefs.getRememberPasswords()); xRememberUsers.setSelected(Prefs.getRememberUsers()); // should be loaded AFTER password xRememberServer.setSelected(Prefs.getRememberServer()); tJavaArgs.setText(Prefs.getJavaArgs()); nMemory.setValue(Prefs.getMaxMemory()); xDebugMode.setSelected(Prefs.getDebugMode()); xKeepOpen.setSelected(Prefs.getKeepOpen()); } private void loadUpdateMode(final UpdateMode val) { final JRadioButton btn; switch (val) { case DISABLED: btn = rUpdateDisabled; break; case AUTOMATIC: btn = rUpdateAutomatic; break; default: // NOTIFY btn = rUpdateNotify; break; } rgUpdateMode.setSelected(btn.getModel(), true); } private void loadDefaults() { xFullscreen.setSelected(Prefs.FullscreenDefault); loadUpdateMode(Prefs.UpdateModeDefault); xRememberUsers.setSelected(Prefs.RememberUsersDefault); xRememberPasswords.setSelected(Prefs.RememberPasswordsDefault); xRememberServer.setSelected(Prefs.RememberServerDefault); tJavaArgs.setText(Prefs.JavaArgsDefault); nMemory.setValue(Prefs.MaxMemoryDefault); xDebugMode.setSelected(Prefs.DebugModeDefault); xKeepOpen.setSelected(Prefs.KeepOpenDefault); } private void storePreferences() { Prefs.setFullscreen(xFullscreen.isSelected()); Prefs.setUpdateMode(storeUpdateMode()); Prefs.setRememberUsers(xRememberUsers.isSelected()); Prefs.setRememberPasswords(xRememberPasswords.isSelected()); Prefs.setRememberServer(xRememberServer.isSelected()); Prefs.setJavaArgs(tJavaArgs.getText()); Prefs.setMaxMemory((int) nMemory.getValue()); Prefs.setDebugMode(xDebugMode.isSelected()); Prefs.setKeepOpen(xKeepOpen.isSelected()); } private UpdateMode storeUpdateMode() { final UpdateMode val; if (rUpdateDisabled.isSelected()) { val = UpdateMode.DISABLED; } else if (rUpdateAutomatic.isSelected()) { val = UpdateMode.AUTOMATIC; } else { val = UpdateMode.NOTIFY; } return val; } // ============================================================================================= // FORGETTING // ============================================================================================= private void bForgetUsersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bForgetUsersActionPerformed if (ConfirmScreen.show("Warning", "Really erase all stored user information?")) { LogUtil.getLogger().log(Level.INFO, "[Forget Users]"); SessionManager.getAccountManager().clear(); checkIfForgetButtonsShouldBeEnabled(); } }//GEN-LAST:event_bForgetUsersActionPerformed private void bForgetPasswordsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bForgetPasswordsActionPerformed if (ConfirmScreen.show("Warning", "Really erase all stored user passwords?")) { LogUtil.getLogger().log(Level.INFO, "[Forget Passwords]"); SessionManager.getAccountManager().clearPasswords(); checkIfForgetButtonsShouldBeEnabled(); } }//GEN-LAST:event_bForgetPasswordsActionPerformed private void bForgetServersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bForgetServersActionPerformed if (ConfirmScreen.show("Warning", "Really erase stored information about the servers you joined?")) { LogUtil.getLogger().log(Level.INFO, "[Forget Servers]"); SessionManager.clearAllResumeInfo(); try { Prefs.getRememberedExternalIPs().clear(); } catch (BackingStoreException ex) { LogUtil.getLogger().log(Level.SEVERE, "Error erasing preferences.", ex); } checkIfForgetButtonsShouldBeEnabled(); } }//GEN-LAST:event_bForgetServersActionPerformed // ============================================================================================= // GUI EVENT LISTENERS // ============================================================================================= private void bCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bCancelActionPerformed LogUtil.getLogger().log(Level.FINE, "[Cancel]"); dispose(); }//GEN-LAST:event_bCancelActionPerformed private void bDefaultsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bDefaultsActionPerformed LogUtil.getLogger().log(Level.FINE, "[Defaults]"); loadDefaults(); }//GEN-LAST:event_bDefaultsActionPerformed private void bSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bSaveActionPerformed LogUtil.getLogger().log(Level.FINE, "[Save]"); storePreferences(); if (!this.xRememberUsers.isSelected()) { SessionManager.getAccountManager().clear(); } if (!this.xRememberPasswords.isSelected()) { SessionManager.getAccountManager().clearPasswords(); } if (!this.xRememberServer.isSelected()) { SessionManager.clearAllResumeInfo(); } if (this.xDebugMode.isSelected()) { DebugWindow.showWindow(); } else { DebugWindow.hideWindow(); } dispose(); }//GEN-LAST:event_bSaveActionPerformed private void xRememberUsersItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_xRememberUsersItemStateChanged if (evt.getStateChange() == ItemEvent.DESELECTED) { this.xRememberPasswords.setEnabled(false); this.xRememberPasswords.setSelected(false); this.bForgetPasswords.setEnabled(false); this.bForgetUsers.setEnabled(false); } else { this.xRememberPasswords.setEnabled(true); this.bForgetUsers.setEnabled(true); this.bForgetPasswords.setEnabled(xRememberPasswords.isSelected()); } }//GEN-LAST:event_xRememberUsersItemStateChanged private void xRememberPasswordsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_xRememberPasswordsItemStateChanged if (evt.getStateChange() == ItemEvent.DESELECTED) { this.bForgetPasswords.setEnabled(false); } else { this.bForgetPasswords.setEnabled(true); } }//GEN-LAST:event_xRememberPasswordsItemStateChanged private void bSubmitDiagInfoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bSubmitDiagInfoActionPerformed LogUtil.getLogger().log(Level.FINE, "[Submit diagnostic information]"); try { String url = DiagnosticInfoUploader.uploadToGist(); PromptScreen.show("Diagnostic information submitted!", "Please provide this link to the ClassiCube developers.", url, false); } catch (Exception ex) { ErrorScreen.show("Error uploading diagnostic information", "Diagnostic information could not be uploaded. " + "Make sure that you are connected to the Internet.", ex); } }//GEN-LAST:event_bSubmitDiagInfoActionPerformed // ============================================================================================= // GENERATED GUI CODE // ============================================================================================= /** * 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. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; rgUpdateMode = new javax.swing.ButtonGroup(); xFullscreen = new javax.swing.JCheckBox(); jSeparator1 = new javax.swing.JSeparator(); javax.swing.JLabel lUpdateMode = new javax.swing.JLabel(); rUpdateDisabled = new javax.swing.JRadioButton(); rUpdateNotify = new javax.swing.JRadioButton(); rUpdateAutomatic = new javax.swing.JRadioButton(); javax.swing.JSeparator jSeparator2 = new javax.swing.JSeparator(); xRememberUsers = new javax.swing.JCheckBox(); bForgetUsers = new net.classicube.launcher.gui.JNiceLookingButton(); xRememberPasswords = new javax.swing.JCheckBox(); bForgetPasswords = new net.classicube.launcher.gui.JNiceLookingButton(); xRememberServer = new javax.swing.JCheckBox(); bForgetServers = new net.classicube.launcher.gui.JNiceLookingButton(); javax.swing.JSeparator jSeparator3 = new javax.swing.JSeparator(); javax.swing.JLabel lParameters = new javax.swing.JLabel(); tJavaArgs = new javax.swing.JTextField(); javax.swing.JLabel lMemory = new javax.swing.JLabel(); nMemory = new javax.swing.JSpinner(); javax.swing.JSeparator jSeparator4 = new javax.swing.JSeparator(); bDefaults = new net.classicube.launcher.gui.JNiceLookingButton(); bSave = new net.classicube.launcher.gui.JNiceLookingButton(); bCancel = new net.classicube.launcher.gui.JNiceLookingButton(); javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); xDebugMode = new javax.swing.JCheckBox(); bSubmitDiagInfo = new net.classicube.launcher.gui.JNiceLookingButton(); xKeepOpen = new javax.swing.JCheckBox(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(new java.awt.GridBagLayout()); xFullscreen.setText("Start the game in fullscreen"); xFullscreen.setToolTipText("<html>Choose whether ClassiCube games should start in fullscreen mode.<br>\nYou can also toggle fullscreen mode in-game by pressing <b>F11</b>.<br>\nDefault is OFF."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; getContentPane().add(xFullscreen, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(8, 0, 8, 0); getContentPane().add(jSeparator1, gridBagConstraints); lUpdateMode.setText("Install game updates..."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 0, 4, 0); getContentPane().add(lUpdateMode, gridBagConstraints); rgUpdateMode.add(rUpdateDisabled); rUpdateDisabled.setText("Disable"); rUpdateDisabled.setToolTipText("<html><b>Disable</b>: No game updates will ever be downloaded or installed."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 20, 0, 0); getContentPane().add(rUpdateDisabled, gridBagConstraints); rgUpdateMode.add(rUpdateNotify); rUpdateNotify.setText("Enable (notify me)"); rUpdateNotify.setToolTipText("<html><b>Enable (notify me)</b>: Game updates will be downloaded and installed.<br>\nYou will be notified when that happens, and you'll have an option to review changes in the latest update.<br>\nThis is the default option."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 20, 0, 0); getContentPane().add(rUpdateNotify, gridBagConstraints); rgUpdateMode.add(rUpdateAutomatic); rUpdateAutomatic.setText("Enable (automatic)"); rUpdateAutomatic.setToolTipText("<html><b>Enable (automatic)</b>: Game updates will be installed automatically and silently."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 20, 0, 0); getContentPane().add(rUpdateAutomatic, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 7; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(8, 0, 8, 0); getContentPane().add(jSeparator2, gridBagConstraints); xRememberUsers.setText("Remember usernames"); xRememberUsers.setToolTipText("<html>Choose whether the launcher should remember usernames of players who sign in.<br>\nWhen enabled (default), most-recently-used name is filled in when the launcher starts,<br>\nand names of other accounts are available from a drop-down menu. When disabled,<br>\nyou will have to re-enter both username and password every time you sign in."); xRememberUsers.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { xRememberUsersItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 8; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; getContentPane().add(xRememberUsers, gridBagConstraints); bForgetUsers.setText("Forget all users"); bForgetUsers.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bForgetUsersActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 8; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; getContentPane().add(bForgetUsers, gridBagConstraints); xRememberPasswords.setText("Remember passwords"); xRememberPasswords.setToolTipText("<html>Choose whether the launcher should remember passwords of players who sign in.<br>\nWhen enabled, selecting a previously-used username will fill in the password field.<br>\nWhen disabled (default), you will have to re-enter the password every time you sign in.<br>\nNote that entered passwords are stored on your PC in plain text."); xRememberPasswords.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { xRememberPasswordsItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 9; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; getContentPane().add(xRememberPasswords, gridBagConstraints); bForgetPasswords.setText("Forget all passwords"); bForgetPasswords.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bForgetPasswordsActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 9; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; getContentPane().add(bForgetPasswords, gridBagConstraints); xRememberServer.setText("Remember last-joined server"); xRememberServer.setToolTipText("<html>Choose whether the launcher should remember last-joined server.<br>\nWhen enabled, the [Resume] button will become available, which will reconnect<br>\nyou to the most-recently-joined server using the same username/credentials as last time."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 10; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 8); getContentPane().add(xRememberServer, gridBagConstraints); bForgetServers.setText("Forget servers"); bForgetServers.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bForgetServersActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 10; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; getContentPane().add(bForgetServers, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 11; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(8, 0, 8, 0); getContentPane().add(jSeparator3, gridBagConstraints); lParameters.setText("Java args"); lParameters.setToolTipText(""); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 12; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4); getContentPane().add(lParameters, gridBagConstraints); tJavaArgs.setToolTipText("<html>Command-line arguments to pass to the client's Java runtime.<br>\nDon't mess with these unless you know exactly what you're doing!"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 12; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; getContentPane().add(tJavaArgs, gridBagConstraints); lMemory.setText("Max memory"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 13; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4); getContentPane().add(lMemory, gridBagConstraints); nMemory.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(64), Integer.valueOf(64), null, Integer.valueOf(16))); nMemory.setToolTipText("<html>The maximum amount of memory, in megabytes, that the game is allowed to use.<br>\nDon't raise this amount unless your game keeps running out of memory on large maps.<br>\nDefault is 800 MB. Going any lower may cause lag and/or crashes."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 13; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.1; getContentPane().add(nMemory, gridBagConstraints); jSeparator4.setBorder(javax.swing.BorderFactory.createEmptyBorder(8, 0, 8, 0)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 15; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(8, 0, 8, 0); getContentPane().add(jSeparator4, gridBagConstraints); bDefaults.setText("Defaults"); bDefaults.setToolTipText("Reset all preferences to their default values."); bDefaults.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bDefaultsActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 16; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_START; getContentPane().add(bDefaults, gridBagConstraints); bSave.setText("Save"); bSave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bSaveActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 16; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_END; getContentPane().add(bSave, gridBagConstraints); bCancel.setText("Cancel"); bCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bCancelActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 16; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_END; getContentPane().add(bCancel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 13; gridBagConstraints.weightx = 0.1; getContentPane().add(filler1, gridBagConstraints); xDebugMode.setText("Debug mode"); xDebugMode.setToolTipText("Enables debug console (requires launcher restart)."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 13; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; getContentPane().add(xDebugMode, gridBagConstraints); bSubmitDiagInfo.setText("Submit diagnostic information"); bSubmitDiagInfo.setToolTipText("<html>Upload information needed for diagnosing problems in ClassiCube software.<br>\nInformation includes log files, your preferences, some basic system information<br>\n(Java version, operating system, etc), and a list of files in your client's directory.<br>\n<b>Logs may contain your username, but NOT your password or any other personal info."); bSubmitDiagInfo.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bSubmitDiagInfoActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 14; gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); getContentPane().add(bSubmitDiagInfo, gridBagConstraints); xKeepOpen.setText("Keep launcher open"); xKeepOpen.setToolTipText("Keep launcher open after the game client starts."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; getContentPane().add(xKeepOpen, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private net.classicube.launcher.gui.JNiceLookingButton bCancel; private net.classicube.launcher.gui.JNiceLookingButton bDefaults; private net.classicube.launcher.gui.JNiceLookingButton bForgetPasswords; private net.classicube.launcher.gui.JNiceLookingButton bForgetServers; private net.classicube.launcher.gui.JNiceLookingButton bForgetUsers; private net.classicube.launcher.gui.JNiceLookingButton bSave; private net.classicube.launcher.gui.JNiceLookingButton bSubmitDiagInfo; private javax.swing.JSeparator jSeparator1; private javax.swing.JSpinner nMemory; private javax.swing.JRadioButton rUpdateAutomatic; private javax.swing.JRadioButton rUpdateDisabled; private javax.swing.JRadioButton rUpdateNotify; private javax.swing.ButtonGroup rgUpdateMode; private javax.swing.JTextField tJavaArgs; private javax.swing.JCheckBox xDebugMode; private javax.swing.JCheckBox xFullscreen; private javax.swing.JCheckBox xKeepOpen; private javax.swing.JCheckBox xRememberPasswords; private javax.swing.JCheckBox xRememberServer; private javax.swing.JCheckBox xRememberUsers; // End of variables declaration//GEN-END:variables }