diff options
author | Rafael Marçalo <public@rafaelmarcalo.xyz> | 2024-09-05 16:31:33 +0100 |
---|---|---|
committer | Rafael Marçalo <public@rafaelmarcalo.xyz> | 2024-09-05 16:31:33 +0100 |
commit | 8b67572ad7e1508341345dc46a2597e9fa170cbb (patch) | |
tree | 8f37c4d60ce0f07b9eaf30be34f39298da97b242 /src/com/pkrandom/newgui/CustomNamesEditorDialog.java | |
parent | b65f4a80da28e7ec4de16c8b1abf906e8d7be2c5 (diff) |
Diffstat (limited to 'src/com/pkrandom/newgui/CustomNamesEditorDialog.java')
-rw-r--r-- | src/com/pkrandom/newgui/CustomNamesEditorDialog.java | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/src/com/pkrandom/newgui/CustomNamesEditorDialog.java b/src/com/pkrandom/newgui/CustomNamesEditorDialog.java new file mode 100644 index 0000000..07954ed --- /dev/null +++ b/src/com/pkrandom/newgui/CustomNamesEditorDialog.java @@ -0,0 +1,309 @@ +package com.pkrandom.newgui; + +/*----------------------------------------------------------------------------*/ +/*-- CustomNamesEditorDialog.java - a GUI interface to allow users to edit --*/ +/*-- their custom names for trainers etc. --*/ +/*-- --*/ +/*-- Part of "Universal Pokemon Randomizer ZX" by the UPR-ZX team --*/ +/*-- 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 <http://www.gnu.org/licenses/>. --*/ +/*----------------------------------------------------------------------------*/ + +import com.pkrandom.CustomNamesSet; +import com.pkrandom.FileFunctions; +import com.pkrandom.SysConstants; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class CustomNamesEditorDialog extends javax.swing.JDialog { + + private static final long serialVersionUID = -1421503126547242929L; + private boolean pendingChanges; + + /** + * Creates new form CustomNamesEditorDialog + */ + public CustomNamesEditorDialog(java.awt.Frame parent) { + super(parent, true); + initComponents(); + setLocationRelativeTo(parent); + + java.awt.EventQueue.invokeLater(() -> setVisible(true)); + + // load trainer names etc + try { + CustomNamesSet cns = FileFunctions.getCustomNames(); + populateNames(trainerNamesText, cns.getTrainerNames()); + populateNames(trainerClassesText, cns.getTrainerClasses()); + populateNames(doublesTrainerNamesText, cns.getDoublesTrainerNames()); + populateNames(doublesTrainerClassesText, cns.getDoublesTrainerClasses()); + populateNames(nicknamesText, cns.getPokemonNicknames()); + } catch (IOException ex) { + java.awt.EventQueue.invokeLater(() -> JOptionPane.showMessageDialog(CustomNamesEditorDialog.this, + "Your custom names file is for a different randomizer version or otherwise corrupt.")); + } + + // dialog if there's no custom names file yet + if (!new File(SysConstants.ROOT_PATH + SysConstants.customNamesFile).exists()) { + java.awt.EventQueue.invokeLater(() -> JOptionPane.showMessageDialog( + CustomNamesEditorDialog.this, + String.format( + "Welcome to the custom names editor!\nThis is where you can edit the names used for options like \"Randomize Trainer Names\".\nThe names are initially populated with a few default names included with the randomizer.\nYou can share your customized name sets with others, too!\nJust send them the %s file created in the randomizer directory.", + SysConstants.customNamesFile))); + } + + pendingChanges = false; + + addDocListener(trainerNamesText); + addDocListener(trainerClassesText); + addDocListener(doublesTrainerNamesText); + addDocListener(doublesTrainerClassesText); + addDocListener(nicknamesText); + } + + private void addDocListener(JTextArea textArea) { + textArea.getDocument().addDocumentListener(new DocumentListener() { + + @Override + public void insertUpdate(DocumentEvent e) { + pendingChanges = true; + } + + @Override + public void removeUpdate(DocumentEvent e) { + pendingChanges = true; + } + + @Override + public void changedUpdate(DocumentEvent e) { + pendingChanges = true; + } + }); + + } + + private void formWindowClosing() {// GEN-FIRST:event_formWindowClosing + attemptClose(); + }// GEN-LAST:event_formWindowClosing + + private void saveBtnActionPerformed() {// GEN-FIRST:event_saveBtnActionPerformed + save(); + }// GEN-LAST:event_saveBtnActionPerformed + + private void closeBtnActionPerformed() {// GEN-FIRST:event_closeBtnActionPerformed + attemptClose(); + }// GEN-LAST:event_closeBtnActionPerformed + + private boolean save() { + CustomNamesSet cns = new CustomNamesSet(); + cns.setTrainerNames(getNameList(trainerNamesText)); + cns.setTrainerClasses(getNameList(trainerClassesText)); + cns.setDoublesTrainerNames(getNameList(doublesTrainerNamesText)); + cns.setDoublesTrainerClasses(getNameList(doublesTrainerClassesText)); + cns.setPokemonNicknames(getNameList(nicknamesText)); + try { + byte[] data = cns.getBytes(); + FileFunctions.writeBytesToFile(SysConstants.ROOT_PATH + SysConstants.customNamesFile, data); + pendingChanges = false; + JOptionPane.showMessageDialog(this, "Custom names saved."); + return true; + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Could not save changes."); + return false; + } + } + + private void attemptClose() { + if (pendingChanges) { + int result = JOptionPane + .showConfirmDialog(this, + "You've made some unsaved changes to your custom names.\nDo you want to save them before closing the editor?"); + if (result == JOptionPane.YES_OPTION) { + if (save()) { + dispose(); + } + } else if (result == JOptionPane.NO_OPTION) { + dispose(); + } + } else { + dispose(); + } + } + + private List<String> getNameList(JTextArea textArea) { + String contents = textArea.getText(); + // standardize newlines + contents = contents.replace("\r\n", "\n"); + contents = contents.replace("\r", "\n"); + // split by them + String[] names = contents.split("\n"); + List<String> results = new ArrayList<>(); + for (String name : names) { + String ln = name.trim(); + if (!ln.isEmpty()) { + results.add(ln); + } + } + return results; + } + + private void populateNames(JTextArea textArea, List<String> names) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (String name : names) { + if (!first) { + sb.append(SysConstants.LINE_SEP); + } + first = false; + sb.append(name); + } + textArea.setText(sb.toString()); + } + + /* @formatter:off */ + /** + * 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() { + + editorTabsPane = new javax.swing.JTabbedPane(); + trainerNamesSP = new javax.swing.JScrollPane(); + trainerNamesText = new JTextArea(); + trainerClassesSP = new javax.swing.JScrollPane(); + trainerClassesText = new JTextArea(); + doublesTrainerNamesSP = new javax.swing.JScrollPane(); + doublesTrainerNamesText = new JTextArea(); + doublesTrainerClassesSP = new javax.swing.JScrollPane(); + doublesTrainerClassesText = new JTextArea(); + nicknamesSP = new javax.swing.JScrollPane(); + nicknamesText = new JTextArea(); + saveBtn = new javax.swing.JButton(); + closeBtn = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("com/pkrandom/newgui/Bundle"); + setTitle(bundle.getString("CustomNamesEditorDialog.title")); + setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(); + } + }); + + trainerNamesSP.setHorizontalScrollBar(null); + + trainerNamesText.setColumns(20); + trainerNamesText.setRows(5); + trainerNamesSP.setViewportView(trainerNamesText); + + editorTabsPane.addTab(bundle.getString("CustomNamesEditorDialog.trainerNamesSP.TabConstraints.tabTitle"), trainerNamesSP); + + trainerClassesSP.setHorizontalScrollBar(null); + + trainerClassesText.setColumns(20); + trainerClassesText.setRows(5); + trainerClassesSP.setViewportView(trainerClassesText); + + editorTabsPane.addTab(bundle.getString("CustomNamesEditorDialog.trainerClassesSP.TabConstraints.tabTitle"), trainerClassesSP); + + doublesTrainerNamesSP.setHorizontalScrollBar(null); + + doublesTrainerNamesText.setColumns(20); + doublesTrainerNamesText.setRows(5); + doublesTrainerNamesSP.setViewportView(doublesTrainerNamesText); + + editorTabsPane.addTab(bundle.getString("CustomNamesEditorDialog.doublesTrainerNamesSP.TabConstraints.tabTitle"), doublesTrainerNamesSP); + + doublesTrainerClassesSP.setHorizontalScrollBar(null); + + doublesTrainerClassesText.setColumns(20); + doublesTrainerClassesText.setRows(5); + doublesTrainerClassesSP.setViewportView(doublesTrainerClassesText); + + editorTabsPane.addTab(bundle.getString("CustomNamesEditorDialog.doublesTrainerClassesSP.TabConstraints.tabTitle"), doublesTrainerClassesSP); + + nicknamesSP.setHorizontalScrollBar(null); + + nicknamesText.setColumns(20); + nicknamesText.setRows(5); + nicknamesSP.setViewportView(nicknamesText); + + editorTabsPane.addTab(bundle.getString("CustomNamesEditorDialog.nicknamesSP.TabConstraints.tabTitle"), nicknamesSP); + + saveBtn.setText(bundle.getString("CustomNamesEditorDialog.saveBtn.text")); + saveBtn.addActionListener(evt -> saveBtnActionPerformed()); + + closeBtn.setText(bundle.getString("CustomNamesEditorDialog.closeBtn.text")); + closeBtn.addActionListener(evt -> closeBtnActionPerformed()); + + 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(editorTabsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 616, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(saveBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(closeBtn))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(editorTabsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 357, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(saveBtn) + .addComponent(closeBtn)) + .addContainerGap()) + ); + + pack(); + }// </editor-fold>//GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton closeBtn; + private javax.swing.JScrollPane doublesTrainerClassesSP; + private JTextArea doublesTrainerClassesText; + private javax.swing.JScrollPane doublesTrainerNamesSP; + private JTextArea doublesTrainerNamesText; + private javax.swing.JTabbedPane editorTabsPane; + private javax.swing.JScrollPane nicknamesSP; + private JTextArea nicknamesText; + private javax.swing.JButton saveBtn; + private javax.swing.JScrollPane trainerClassesSP; + private JTextArea trainerClassesText; + private javax.swing.JScrollPane trainerNamesSP; + private JTextArea trainerNamesText; + // End of variables declaration//GEN-END:variables + /* @formatter:on */ +} |