/*
* HalfNES by Andrew Hoffman
* Licensed under the GNU GPL Version 3. See LICENSE file
*/
package com.grapeshot.halfnes.cheats;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import static com.grapeshot.halfnes.utils.*;
/**
* Dialog box to configure and apply Pro Action Replay cheat codes.
*
* @author Thomas Lorblanches
*/
public class ActionReplayGui extends javax.swing.JDialog {
private static final int ADDRESS_LENGTH = 6;
private static final int DATA_LENGTH = 2;
private static final int CODE_LENGTH = ADDRESS_LENGTH + DATA_LENGTH;
private Patch patch = null;
private final ActionReplay actionReplay;
/**
* Creates new form ActionReplayGui
*/
public ActionReplayGui(java.awt.Frame parent, boolean modal, ActionReplay actionReplay) {
super(parent, modal);
initComponents();
setLocationRelativeTo(null);
textCode.requestFocusInWindow();
textCode.setDocument(new PlainDocument() {
@Override
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
if (str == null) {
return;
}
if (((getLength() + str.length()) <= CODE_LENGTH) && (str.matches("[0-9a-fA-FAEGIKLNOPSTUVXYZaegiklnopstuvxyz]*"))) {
super.insertString(offset, str, attr);
}
}
});
textFindData.setDocument(new PlainDocument() {
@Override
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
if (str == null) {
return;
}
if (((getLength() + str.length()) <= 3) && (str.matches("[0-9]*"))) {
super.insertString(offset, str, attr);
}
}
});
listPossibleAddresses.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
if (listPossibleAddresses.getSelectedIndex() == -1) {
btnTry.setEnabled(false);
} else {
btnTry.setEnabled(true);
}
}
});
this.actionReplay = actionReplay;
updateCurrentCodesList();
updateListPossibleCodes();
}
private void updateCurrentCodesList() {
final Patch[] patches = actionReplay.getPatches().values().toArray(new Patch[0]);
final String[] patchesStr = new String[patches.length];
for (int i = 0; i < patches.length; i++) {
patchesStr[i] = patches[i].toString().toUpperCase();
}
currentCodesList.setListData(patchesStr);
}
private void updateListPossibleCodes() {
List<String> adrStr = new ArrayList<>();
for (Integer adr : actionReplay.getFoundAddresses()) {
String str = Integer.toHexString(adr).toUpperCase();
while (str.length() < ADDRESS_LENGTH) {
str = "0" + str;
}
adrStr.add(str);
}
listPossibleAddresses.setListData(adrStr.toArray());
}
private boolean isCodeValid() {
final String code = textCode.getText();
if ((code.length() == 8) && code.matches("[0-9a-fA-F]*")) {
btnApply.setEnabled(true);
final int data = (Integer.parseInt(textCode.getText().substring(textCode.getText().length() - 2), 16) & 0xFF);
final int address = Integer.parseInt(textCode.getText().substring(0, textCode.getText().length() - 2), 16);
patch = new Patch(address, data);
return true;
} else if ((code.length() == 6) && code.matches("[AEGIKLNOPSTUVXYZaegiklnopstuvxyz]*")) {
//game genie type 1 code
long c = GGtoHex(code);
if (!((c & (BIT15)) != 0)) { //check bit 15 is false
//now descramble this value into address and data
final int address = 0x8000
| ((int) ((c >> 10) & 1) << 14)
| ((int) ((c >> 9) & 1) << 13)
| ((int) ((c >> 8) & 1) << 12)
| ((int) ((c >> 7) & 1) << 11)
| ((int) ((c >> 2) & 1) << 10)
| ((int) ((c >> 1) & 1) << 9)
| ((int) ((c >> 0) & 1) << 8)
| ((int) ((c >> 19) & 1) << 7)
| ((int) ((c >> 14) & 1) << 6)
| ((int) ((c >> 13) & 1) << 5)
| ((int) ((c >> 12) & 1) << 4)
| ((int) ((c >> 11) & 1) << 3)
| ((int) ((c >> 6) & 1) << 2)
| ((int) ((c >> 5) & 1) << 1)
| ((int) ((c >> 4) & 1));
final int data = ((int) ((c >> 23) & 1) << 7)
| ((int) ((c >> 18) & 1) << 6)
| ((int) ((c >> 17) & 1) << 5)
| ((int) ((c >> 16) & 1) << 4)
| ((int) ((c >> 3) & 1) << 3)
| ((int) ((c >> 22) & 1) << 2)
| ((int) ((c >> 21) & 1) << 1)
| (int) ((c >> 20) & 1);
btnApply.setEnabled(true);
patch = new Patch(address, data);
return true;
}
} else if ((code.length() == 8) && code.matches("[AEGIKLNOPSTUVXYZaegiklnopstuvxyz]*")) {
//game genie type 2 code
long c = GGtoHex(code);
if (((c & (1 << 23)) != 0)) { //check bit 15 is true
//now descramble this value into address and data
final int address
= 0x8000
| ((int) ((c >> 18) & 1) << 14)
| ((int) ((c >> 17) & 1) << 13)
| ((int) ((c >> 16) & 1) << 12)
| ((int) ((c >> 15) & 1) << 11)
| ((int) ((c >> 10) & 1) << 10)
| ((int) ((c >> 9) & 1) << 9)
| ((int) ((c >> 8) & 1) << 8)
| ((int) ((c >> 27) & 1) << 7)
| ((int) ((c >> 22) & 1) << 6)
| ((int) ((c >> 21) & 1) << 5)
| ((int) ((c >> 20) & 1) << 4)
| ((int) ((c >> 19) & 1) << 3)
| ((int) ((c >> 14) & 1) << 2)
| ((int) ((c >> 13) & 1) << 1)
| ((int) ((c >> 12) & 1));
final int data
= ((int) ((c >> 31) & 1) << 7)
| ((int) ((c >> 26) & 1) << 6)
| ((int) ((c >> 25) & 1) << 5)
| ((int) ((c >> 24) & 1) << 4)
| ((int) ((c >> 3) & 1) << 3)
| ((int) ((c >> 30) & 1) << 2)
| ((int) ((c >> 29) & 1) << 1)
| ((int) ((c >> 28) & 1));
final int check
= //8 char game genie codes use a check byte so val is only
//patched when rom value matches this.
((int) ((c >> 7) & 1) << 7)
| ((int) ((c >> 2) & 1) << 6)
| ((int) ((c >> 1) & 1) << 5)
| ((int) ((c >> 0) & 1) << 4)
| ((int) ((c >> 11) & 1) << 3)
| ((int) ((c >> 6) & 1) << 2)
| ((int) ((c >> 5) & 1) << 1)
| ((int) ((c >> 4) & 1));
btnApply.setEnabled(true);
patch = new Patch(address, data, check);
return true;
}
}
btnApply.setEnabled(false);
patch = null;
return false;
}
private final static String ggMap = "APZLGITYEOXUKSVN";
private long GGtoHex(String code) {
//converts a game genie code to a hex string
//the individual bits still need to be unscrambled
code = code.toUpperCase(Locale.ENGLISH);
long ret = 0;
for (int i = 0; i < code.length(); ++i) {
ret *= 16;
ret += ggMap.indexOf(code.charAt(i));
}
return ret;
}
/**
* 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() {
jScrollPane2 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
tabbedPan = new javax.swing.JTabbedPane();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
panelApplyCode = new javax.swing.JPanel();
textCode = new javax.swing.JTextField();
btnApply = new javax.swing.JButton();
jPanel3 = new javax.swing.JPanel();
jScrollPane4 = new javax.swing.JScrollPane();
currentCodesList = new javax.swing.JList();
btnRemoveAll = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
jScrollPane3 = new javax.swing.JScrollPane();
jTextArea2 = new javax.swing.JTextArea();
jPanel4 = new javax.swing.JPanel();
textFindData = new javax.swing.JTextField();
btnSearch = new javax.swing.JButton();
btnReset = new javax.swing.JButton();
jPanel5 = new javax.swing.JPanel();
jScrollPane5 = new javax.swing.JScrollPane();
listPossibleAddresses = new javax.swing.JList();
btnTry = new javax.swing.JButton();
btnClose = new javax.swing.JButton();
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
jScrollPane2.setViewportView(jTable1);
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Cheat Codes");
setModal(true);
setName("actionReplayDialog"); // NOI18N
setResizable(false);
tabbedPan.setMinimumSize(new java.awt.Dimension(10, 128));
jTextArea1.setEditable(false);
jTextArea1.setBackground(new java.awt.Color(240, 240, 240));
jTextArea1.setColumns(20);
jTextArea1.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
jTextArea1.setRows(5);
jTextArea1.setText("Enter a Game Genie or Pro Action Replay cheat code.\nA Pro Action Replay code is composed of 8 hexadecimal characters\n(numbers from 0 to 9 and letters from A to F).\nThe first 6 characters represent the in-memory address, and the last two the value to write in.\nIt is used to patch the NES memory to give you extra lives, ammo, time etc...");
jScrollPane1.setViewportView(jTextArea1);
panelApplyCode.setBorder(javax.swing.BorderFactory.createTitledBorder("Add new code"));
textCode.setColumns(8);
textCode.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
textCode.addCaretListener(new javax.swing.event.CaretListener() {
public void caretUpdate(javax.swing.event.CaretEvent evt) {
textCodeCaretUpdate(evt);
}
});
btnApply.setText("Apply");
btnApply.setEnabled(false);
btnApply.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnApplyActionPerformed(evt);
}
});
javax.swing.GroupLayout panelApplyCodeLayout = new javax.swing.GroupLayout(panelApplyCode);
panelApplyCode.setLayout(panelApplyCodeLayout);
panelApplyCodeLayout.setHorizontalGroup(
panelApplyCodeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelApplyCodeLayout.createSequentialGroup()
.addContainerGap()
.addComponent(textCode, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnApply)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
panelApplyCodeLayout.setVerticalGroup(
panelApplyCodeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelApplyCodeLayout.createSequentialGroup()
.addContainerGap()
.addGroup(panelApplyCodeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
.addComponent(textCode, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnApply))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Currently applied codes"));
currentCodesList.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
currentCodesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jScrollPane4.setViewportView(currentCodesList);
btnRemoveAll.setText("Remove all");
btnRemoveAll.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRemoveAllActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(btnRemoveAll)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(btnRemoveAll)
.addGap(0, 96, Short.MAX_VALUE))
.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
.addContainerGap())
);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 468, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(panelApplyCode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(20, 20, 20)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addContainerGap(13, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panelApplyCode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(16, Short.MAX_VALUE))
);
tabbedPan.addTab("Apply", jPanel1);
jTextArea2.setEditable(false);
jTextArea2.setBackground(new java.awt.Color(240, 240, 240));
jTextArea2.setColumns(20);
jTextArea2.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
jTextArea2.setRows(5);
jTextArea2.setText("You can find new Pro Action Replay codes by searching into memory the location of\nsome data like remaining lives, time left, etc...\nStart a new search with the current value you want to search, then continue the search\nwith new values of the same data until the number of locations found is low, and then\ntry the codes until you found the good one!");
jScrollPane3.setViewportView(jTextArea2);
jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Search"));
textFindData.setColumns(8);
textFindData.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
textFindData.addCaretListener(new javax.swing.event.CaretListener() {
public void caretUpdate(javax.swing.event.CaretEvent evt) {
textFindDataCaretUpdate(evt);
}
});
btnSearch.setText("Search");
btnSearch.setEnabled(false);
btnSearch.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSearchActionPerformed(evt);
}
});
btnReset.setText("Reset Search");
btnReset.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnResetActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
jPanel4.setLayout(jPanel4Layout);
jPanel4Layout.setHorizontalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup()
.addContainerGap()
.addComponent(textFindData, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnSearch)
.addContainerGap(42, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnReset)
.addContainerGap())
);
jPanel4Layout.setVerticalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup()
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
.addComponent(textFindData, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnSearch))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE)
.addComponent(btnReset)
.addContainerGap())
);
jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder("Possible addresses"));
listPossibleAddresses.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
listPossibleAddresses.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jScrollPane5.setViewportView(listPossibleAddresses);
btnTry.setText("Try");
btnTry.setEnabled(false);
btnTry.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnTryActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
jPanel5.setLayout(jPanel5Layout);
jPanel5Layout.setHorizontalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel5Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE)
.addComponent(btnTry)
.addGap(18, 18, 18))
);
jPanel5Layout.setVerticalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane5, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE)
.addGroup(jPanel5Layout.createSequentialGroup()
.addContainerGap()
.addComponent(btnTry)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 468, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(13, Short.MAX_VALUE))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
tabbedPan.addTab("Find", jPanel2);
btnClose.setText("Close");
btnClose.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCloseActionPerformed(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()
.addComponent(tabbedPan, javax.swing.GroupLayout.PREFERRED_SIZE, 496, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnClose)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(tabbedPan, javax.swing.GroupLayout.PREFERRED_SIZE, 315, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnClose)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
tabbedPan.getAccessibleContext().setAccessibleName("");
pack();
}// </editor-fold>//GEN-END:initComponents
private void btnCloseActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnCloseActionPerformed
{//GEN-HEADEREND:event_btnCloseActionPerformed
this.dispose();
}//GEN-LAST:event_btnCloseActionPerformed
private void btnApplyActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnApplyActionPerformed
{//GEN-HEADEREND:event_btnApplyActionPerformed
if (isCodeValid()) {
actionReplay.addMemoryPatch(patch);
this.setVisible(false);
}
}//GEN-LAST:event_btnApplyActionPerformed
private void textCodeCaretUpdate(javax.swing.event.CaretEvent evt)//GEN-FIRST:event_textCodeCaretUpdate
{//GEN-HEADEREND:event_textCodeCaretUpdate
isCodeValid();
}//GEN-LAST:event_textCodeCaretUpdate
private void btnRemoveAllActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnRemoveAllActionPerformed
{//GEN-HEADEREND:event_btnRemoveAllActionPerformed
actionReplay.clear();
updateCurrentCodesList();
}//GEN-LAST:event_btnRemoveAllActionPerformed
private void btnResetActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnResetActionPerformed
{//GEN-HEADEREND:event_btnResetActionPerformed
actionReplay.getFoundAddresses().clear();
updateListPossibleCodes();
}//GEN-LAST:event_btnResetActionPerformed
private void textFindDataCaretUpdate(javax.swing.event.CaretEvent evt)//GEN-FIRST:event_textFindDataCaretUpdate
{//GEN-HEADEREND:event_textFindDataCaretUpdate
if (textFindData.getText().matches("[0-9]+")) {
btnSearch.setEnabled(true);
} else {
btnSearch.setEnabled(false);
}
}//GEN-LAST:event_textFindDataCaretUpdate
private void btnSearchActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnSearchActionPerformed
{//GEN-HEADEREND:event_btnSearchActionPerformed
if (actionReplay.getFoundAddresses().isEmpty()) {
actionReplay.newSearchInMemory((byte) Integer.parseInt(textFindData.getText(), 16));
} else {
actionReplay.continueSearch((byte) Integer.parseInt(textFindData.getText(), 16));
}
updateListPossibleCodes();
}//GEN-LAST:event_btnSearchActionPerformed
private void btnTryActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnTryActionPerformed
{//GEN-HEADEREND:event_btnTryActionPerformed
textCode.setText(listPossibleAddresses.getSelectedValue().toString());
tabbedPan.setSelectedIndex(0);
}//GEN-LAST:event_btnTryActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnApply;
private javax.swing.JButton btnClose;
private javax.swing.JButton btnRemoveAll;
private javax.swing.JButton btnReset;
private javax.swing.JButton btnSearch;
private javax.swing.JButton btnTry;
private javax.swing.JList currentCodesList;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
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.JTable jTable1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextArea jTextArea2;
private javax.swing.JList listPossibleAddresses;
private javax.swing.JPanel panelApplyCode;
private javax.swing.JTabbedPane tabbedPan;
private javax.swing.JTextField textCode;
private javax.swing.JTextField textFindData;
// End of variables declaration//GEN-END:variables
}