package com.sneed.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 --*/
/*-- 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.CustomNamesSet;
import com.sneed.pkrandom.FileFunctions;
import com.sneed.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 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 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 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")
// //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/sneed/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();
}// //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 */
}