/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.sneed.pkrandom.newgui; /*----------------------------------------------------------------------------*/ /*-- PresetLoadDialog.java - a dialog to allow use of preset files or --*/ /*-- random seed/config string pairs to produce --*/ /*-- premade ROMs. --*/ /*-- --*/ /*-- Part of "Universal Pokemon Randomizer ZX" by the UPR-ZX team --*/ /*-- Originally part of "Universal Pokemon Randomizer" by sneed --*/ /*-- Pokemon and any associated names and the like are --*/ /*-- trademark and (C) Nintendo 1996-2020. --*/ /*-- --*/ /*-- The custom code written here is licensed under the terms of the GPL: --*/ /*-- --*/ /*-- This program is free software: you can redistribute it and/or modify --*/ /*-- it under the terms of the GNU General Public License as published by --*/ /*-- the Free Software Foundation, either version 3 of the License, or --*/ /*-- (at your option) any later version. --*/ /*-- --*/ /*-- This program is distributed in the hope that it will be useful, --*/ /*-- but WITHOUT ANY WARRANTY; without even the implied warranty of --*/ /*-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --*/ /*-- GNU General Public License for more details. --*/ /*-- --*/ /*-- You should have received a copy of the GNU General Public License --*/ /*-- along with this program. If not, see . --*/ /*----------------------------------------------------------------------------*/ import com.sneed.pkrandom.*; import com.sneed.pkrandom.exceptions.InvalidSupplementFilesException; import com.sneed.pkrandom.romhandlers.Abstract3DSRomHandler; import com.sneed.pkrandom.romhandlers.RomHandler; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * * @author Stewart */ public class PresetLoadDialog extends JDialog { /** * */ private static final long serialVersionUID = -7898067118947765260L; private NewRandomizerGUI parentGUI; private RomHandler currentROM; private boolean completed = false; private String requiredName = null; private volatile boolean changeFieldsWithoutCheck = false; private CustomNamesSet customNames; private java.util.ResourceBundle bundle; /** * Creates new form PresetLoadDialog */ public PresetLoadDialog(NewRandomizerGUI parent, JFrame frame) { super(frame, true); bundle = java.util.ResourceBundle.getBundle("com/sneed/pkrandom/newgui/Bundle"); // NOI18N initComponents(); this.parentGUI = parent; this.presetFileChooser.setCurrentDirectory(new File("./")); this.romFileChooser.setCurrentDirectory(new File("./")); initialState(); setLocationRelativeTo(frame); setVisible(true); } private void initialState() { this.romFileButton.setEnabled(false); this.acceptButton.setEnabled(false); addChangeListener(this.randomSeedField); addChangeListener(this.configStringField); } private void addChangeListener(JTextField field) { field.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { if (!changeFieldsWithoutCheck) PresetLoadDialog.this.checkValues(); } @Override public void removeUpdate(DocumentEvent e) { if (!changeFieldsWithoutCheck) PresetLoadDialog.this.checkValues(); } @Override public void changedUpdate(DocumentEvent e) { if (!changeFieldsWithoutCheck) PresetLoadDialog.this.checkValues(); } }); } private boolean checkValues() { String name; try { Long.parseLong(this.randomSeedField.getText()); } catch (NumberFormatException ex) { invalidValues(); return false; } // 161 onwards: look for version number String configString = this.configStringField.getText(); if (configString.length() < 3) { invalidValues(); return false; } try { int presetVersionNumber = Integer.parseInt(configString.substring(0, 3)); if (presetVersionNumber != Version.VERSION) { promptForDifferentRandomizerVersion(presetVersionNumber); safelyClearFields(); invalidValues(); return false; } } catch (NumberFormatException ex) { invalidValues(); return false; } try { name = this.parentGUI.getValidRequiredROMName(configString.substring(3), customNames); } catch (InvalidSupplementFilesException ex) { safelyClearFields(); invalidValues(); return false; } catch (Exception ex) { // other exception, just call it invalid for now invalidValues(); return false; } if (name == null) { invalidValues(); return false; } requiredName = name; this.romRequiredLabel.setText(String.format(bundle.getString("PresetLoadDialog.romRequiredLabel.textWithROM"), name)); this.romFileButton.setEnabled(true); if (currentROM != null && !currentROM.getROMName().equals(name)) { this.currentROM = null; this.acceptButton.setEnabled(false); this.romFileField.setText(""); } return true; } private void promptForDifferentRandomizerVersion(int presetVN) { // so what version number was it? if (presetVN > Version.VERSION) { // it's for a newer version JOptionPane.showMessageDialog(this, bundle.getString("PresetLoadDialog.newerVersionRequired")); } else { // tell them which older version to use to load this preset // this should be the newest version that used that value // for the constant PRESET_FILE_VERSION String versionWanted = Version.oldVersions.getOrDefault(presetVN,"Unknown"); JOptionPane.showMessageDialog(this, String.format(bundle.getString("PresetLoadDialog.olderVersionRequired"), versionWanted)); } } private void safelyClearFields() { SwingUtilities.invokeLater(() -> { changeFieldsWithoutCheck = true; configStringField.setText(""); randomSeedField.setText(""); changeFieldsWithoutCheck = false; }); } private void invalidValues() { this.currentROM = null; this.romFileField.setText(""); this.romRequiredLabel.setText(bundle.getString("PresetLoadDialog.romRequiredLabel.text")); this.romFileButton.setEnabled(false); this.acceptButton.setEnabled(false); this.requiredName = null; } public boolean isCompleted() { return completed; } public RomHandler getROM() { return currentROM; } public long getSeed() { return Long.parseLong(this.randomSeedField.getText()); } public String getConfigString() { return this.configStringField.getText().substring(3); } public CustomNamesSet getCustomNames() { return customNames; } private void presetFileButtonActionPerformed() {// GEN-FIRST:event_presetFileButtonActionPerformed presetFileChooser.setSelectedFile(null); int returnVal = presetFileChooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File fh = presetFileChooser.getSelectedFile(); try { DataInputStream dis = new DataInputStream(new FileInputStream(fh)); int checkInt = dis.readInt(); if (checkInt != Version.VERSION) { dis.close(); promptForDifferentRandomizerVersion(checkInt); return; } long seed = dis.readLong(); String preset = dis.readUTF(); customNames = new CustomNamesSet(dis); changeFieldsWithoutCheck = true; this.randomSeedField.setText(Long.toString(seed)); this.configStringField.setText(checkInt + "" + preset); changeFieldsWithoutCheck = false; if (checkValues()) { this.randomSeedField.setEnabled(false); this.configStringField.setEnabled(false); this.presetFileField.setText(fh.getAbsolutePath()); } else { this.randomSeedField.setText(""); this.configStringField.setText(""); this.randomSeedField.setEnabled(true); this.configStringField.setEnabled(true); this.presetFileField.setText(""); customNames = null; JOptionPane.showMessageDialog(this, bundle.getString("PresetLoadDialog.invalidSeedFile")); } dis.close(); } catch (IOException ex) { JOptionPane.showMessageDialog(this, bundle.getString("PresetLoadDialog.loadingSeedFileFailed")); } } }// GEN-LAST:event_presetFileButtonActionPerformed private void romFileButtonActionPerformed() {// GEN-FIRST:event_romFileButtonActionPerformed romFileChooser.setSelectedFile(null); int returnVal = romFileChooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { final File fh = romFileChooser.getSelectedFile(); for (RomHandler.Factory rhf : parentGUI.checkHandlers) { if (rhf.isLoadable(fh.getAbsolutePath())) { final RomHandler checkHandler = rhf.create(RandomSource.instance()); if (!NewRandomizerGUI.usedLauncher && checkHandler instanceof Abstract3DSRomHandler) { String message = bundle.getString("GUI.pleaseUseTheLauncher"); Object[] messages = {message}; JOptionPane.showMessageDialog(this, messages); return; } final JDialog opDialog = new OperationDialog(bundle.getString("GUI.loadingText"), this, true); Thread t = new Thread(() -> { SwingUtilities.invokeLater(() -> opDialog.setVisible(true)); try { checkHandler.loadRom(fh.getAbsolutePath()); } catch (Exception ex) { JOptionPane.showMessageDialog(PresetLoadDialog.this, bundle.getString("GUI.loadFailedNoLog")); } SwingUtilities.invokeLater(() -> { opDialog.setVisible(false); if (checkHandler.getROMName().equals(requiredName)) { // Got it romFileField.setText(fh.getAbsolutePath()); currentROM = checkHandler; acceptButton.setEnabled(true); return; } else { JOptionPane.showMessageDialog(PresetLoadDialog.this, String.format( bundle.getString("PresetLoadDialog.notRequiredROM"), requiredName, checkHandler.getROMName())); return; } }); }); t.start(); return; } } JOptionPane.showMessageDialog(this, String.format(bundle.getString("GUI.unsupportedRom"), fh.getName())); } }// GEN-LAST:event_romFileButtonActionPerformed private void acceptButtonActionPerformed() {// GEN-FIRST:event_acceptButtonActionPerformed if (customNames == null) { try { customNames = FileFunctions.getCustomNames(); } catch (IOException e) { e.printStackTrace(); } } completed = true; this.setVisible(false); }// GEN-LAST:event_acceptButtonActionPerformed private void cancelButtonActionPerformed() {// GEN-FIRST:event_cancelButtonActionPerformed completed = false; this.setVisible(false); }// GEN-LAST:event_cancelButtonActionPerformed /** * 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. */ // //GEN-BEGIN:initComponents private void initComponents() { presetFileChooser = new JFileChooser(); romFileChooser = new JFileChooser(); presetFileLabel = new javax.swing.JLabel(); presetFileField = new JTextField(); presetFileButton = new javax.swing.JButton(); orLabel = new javax.swing.JLabel(); seedBoxLabel = new javax.swing.JLabel(); randomSeedField = new JTextField(); configStringBoxLabel = new javax.swing.JLabel(); configStringField = new JTextField(); romRequiredLabel = new javax.swing.JLabel(); romFileBoxLabel = new javax.swing.JLabel(); romFileField = new JTextField(); romFileButton = new javax.swing.JButton(); acceptButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); presetFileChooser.setFileFilter(new PresetFileFilter()); romFileChooser.setFileFilter(new ROMFilter()); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("com/sneed/pkrandom/newgui/Bundle"); // NOI18N setTitle(bundle.getString("PresetLoadDialog.title")); // NOI18N setModal(true); setResizable(false); presetFileLabel.setText(bundle.getString("PresetLoadDialog.presetFileLabel.text")); // NOI18N presetFileField.setEditable(false); presetFileButton.setText(bundle.getString("PresetLoadDialog.presetFileButton.text")); // NOI18N presetFileButton.addActionListener(evt -> presetFileButtonActionPerformed()); orLabel.setFont(new java.awt.Font("Tahoma", Font.BOLD, 11)); // NOI18N orLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); orLabel.setText(bundle.getString("PresetLoadDialog.orLabel.text")); // NOI18N seedBoxLabel.setText(bundle.getString("PresetLoadDialog.seedBoxLabel.text")); // NOI18N configStringBoxLabel.setText(bundle.getString("PresetLoadDialog.configStringBoxLabel.text")); // NOI18N romRequiredLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); romRequiredLabel.setText(bundle.getString("PresetLoadDialog.romRequiredLabel.text")); // NOI18N romFileBoxLabel.setText(bundle.getString("PresetLoadDialog.romFileBoxLabel.text")); // NOI18N romFileField.setEditable(false); romFileButton.setText(bundle.getString("PresetLoadDialog.romFileButton.text")); // NOI18N romFileButton.addActionListener(evt -> romFileButtonActionPerformed()); acceptButton.setText(bundle.getString("PresetLoadDialog.acceptButton.text")); // NOI18N acceptButton.addActionListener(evt -> acceptButtonActionPerformed()); cancelButton.setText(bundle.getString("PresetLoadDialog.cancelButton.text")); // NOI18N cancelButton.addActionListener(evt -> cancelButtonActionPerformed()); 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.TRAILING, false) .addComponent(romFileBoxLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(presetFileLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(seedBoxLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(configStringBoxLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(18, 18, 18) .addGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup( layout.createSequentialGroup() .addComponent(acceptButton) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.RELATED, 169, Short.MAX_VALUE) .addComponent(cancelButton)) .addComponent(randomSeedField).addComponent(configStringField) .addComponent(presetFileField).addComponent(romFileField)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(presetFileButton, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(romFileButton, javax.swing.GroupLayout.PREFERRED_SIZE, 1, Short.MAX_VALUE)).addGap(12, 12, 12)) .addComponent(orLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(romRequiredLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup( layout.createSequentialGroup() .addContainerGap() .addGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(presetFileLabel) .addComponent(presetFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(presetFileButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(orLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(seedBoxLabel) .addComponent(randomSeedField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(configStringBoxLabel) .addComponent(configStringField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(romRequiredLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(romFileBoxLabel) .addComponent(romFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(romFileButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 23, Short.MAX_VALUE) .addGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(acceptButton).addComponent(cancelButton)).addContainerGap())); pack(); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton acceptButton; private javax.swing.JButton cancelButton; private javax.swing.JLabel configStringBoxLabel; private JTextField configStringField; private javax.swing.JLabel orLabel; private javax.swing.JButton presetFileButton; private JFileChooser presetFileChooser; private JTextField presetFileField; private javax.swing.JLabel presetFileLabel; private JTextField randomSeedField; private javax.swing.JLabel romFileBoxLabel; private javax.swing.JButton romFileButton; private JFileChooser romFileChooser; private JTextField romFileField; private javax.swing.JLabel romRequiredLabel; private javax.swing.JLabel seedBoxLabel; // End of variables declaration//GEN-END:variables }