/*
This file is part of jpcsp.
Jpcsp 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.
Jpcsp 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 Jpcsp. If not, see <http://www.gnu.org/licenses/>.
*/
package jpcsp.Debugger.MemoryBreakpoints;
import java.awt.Component;
import java.awt.Font;
import java.io.File;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import jpcsp.Memory;
import jpcsp.State;
import jpcsp.memory.DebuggerMemory;
import jpcsp.Debugger.MemoryBreakpoints.MemoryBreakpoint.AccessType;
import jpcsp.util.Constants;
public class MemoryBreakpointsDialog extends javax.swing.JDialog {
private List<MemoryBreakpoint> memoryBreakpoints;
private MemoryBreakpointsModel memoryBreakpointsModel;
private final int COL_STARTADDRESS = 0;
private final int COL_ENDADDRESS = 1;
private final int COL_ACCESSTYPE = 2;
private final int COL_ACTIVE = 3;
private final int COL_LAST = 4;
private static final Font tableFont = new Font("Courier new", Font.PLAIN, 12);
public MemoryBreakpointsDialog(java.awt.Frame parent) {
super(parent);
memoryBreakpoints = ((DebuggerMemory) Memory.getInstance()).getMemoryBreakpoints();
memoryBreakpointsModel = new MemoryBreakpointsModel();
initComponents();
TableColumn accessType = tblBreakpoints.getColumnModel().getColumn(COL_ACCESSTYPE);
JComboBox combo = new JComboBox();
combo.addItem("READ");
combo.addItem("WRITE");
combo.addItem("READWRITE");
accessType.setCellEditor(new DefaultCellEditor(combo));
tblBreakpoints.getColumnModel().getColumn(COL_STARTADDRESS).setCellEditor(new AddressCellEditor());
tblBreakpoints.getColumnModel().getColumn(COL_ENDADDRESS).setCellEditor(new AddressCellEditor());
tblBreakpoints.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
btnRemove.setEnabled(!((ListSelectionModel) e.getSource()).isSelectionEmpty());
}
});
tblBreakpoints.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent tme) {
MemoryBreakpointsModel mbpm = (MemoryBreakpointsModel) tme.getSource();
btnExport.setEnabled(mbpm.getRowCount() > 0);
// validate entered addresses
if (tme.getColumn() == COL_STARTADDRESS || tme.getColumn() == COL_ENDADDRESS) {
for (int i = tme.getFirstRow(); i <= tme.getLastRow(); i++) {
int start = Integer.decode(mbpm.getValueAt(i, COL_STARTADDRESS).toString());
int end = Integer.decode(mbpm.getValueAt(i, COL_ENDADDRESS).toString());
if (tme.getColumn() == COL_STARTADDRESS && start > end) {
mbpm.setValueAt(new Integer(start), i, COL_ENDADDRESS);
}
if (tme.getColumn() == COL_ENDADDRESS && end < start) {
mbpm.setValueAt(new Integer(end), i, COL_STARTADDRESS);
}
}
}
}
});
// copy trace settings to UI
updateTraceSettings();
}
private void updateTraceSettings() {
DebuggerMemory dbgmem = ((DebuggerMemory) Memory.getInstance());
cbTraceRead.setSelected(dbgmem.traceMemoryRead);
cbTraceRead8.setSelected(dbgmem.traceMemoryRead8);
cbTraceRead16.setSelected(dbgmem.traceMemoryRead16);
cbTraceRead32.setSelected(dbgmem.traceMemoryRead32);
cbTraceWrite.setSelected(dbgmem.traceMemoryWrite);
cbTraceWrite8.setSelected(dbgmem.traceMemoryWrite8);
cbTraceWrite16.setSelected(dbgmem.traceMemoryWrite16);
cbTraceWrite32.setSelected(dbgmem.traceMemoryWrite32);
chkPauseOnHit.setSelected(dbgmem.pauseEmulatorOnMemoryBreakpoint);
}
private class AddressCellEditor extends DefaultCellEditor {
private static final long serialVersionUID = 1L;
public AddressCellEditor() {
super(new JTextField());
final JTextField tf = ((JTextField) getComponent());
tf.setFont(tableFont);
}
@Override
public Object getCellEditorValue() {
return ((JTextField) getComponent()).getText();
}
@Override
public Component getTableCellEditorComponent(
final JTable table, final Object value,
final boolean isSelected, final int row, final int column) {
final JTextField tf = ((JTextField) getComponent());
tf.setText(String.format("0x%X", Integer.decode((String) table.getModel().getValueAt(row, column))));
// needed for double-click to work, otherwise the second click
// is interpreted to position the caret
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// automatically select text after '0x'
tf.select(2, tf.getText().length());
}
});
return tf;
}
}
private class MemoryBreakpointsModel extends AbstractTableModel {
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
MemoryBreakpoint mbp = memoryBreakpoints.get(rowIndex);
switch (columnIndex) {
case COL_STARTADDRESS:
case COL_ENDADDRESS:
int address = 0;
if (aValue instanceof String) {
try {
address = Integer.decode((String) aValue);
} catch (NumberFormatException nfe) {
// do nothing - cell will revert to previous value
return;
}
} else if (aValue instanceof Integer) {
address = ((Integer) aValue).intValue();
} else {
throw new IllegalArgumentException("only String or Integer values allowed");
}
if (columnIndex == COL_STARTADDRESS) {
mbp.setStartAddress(address);
} else if (columnIndex == COL_ENDADDRESS) {
mbp.setEndAddress(address);
}
break;
case COL_ACCESSTYPE:
String value = ((String) aValue).toUpperCase();
if (value.equals("READ")) {
mbp.setAccess(AccessType.READ);
} else if (value.equals("WRITE")) {
mbp.setAccess(AccessType.WRITE);
} else if (value.equals("READWRITE")) {
mbp.setAccess(AccessType.READWRITE);
}
break;
case COL_ACTIVE:
// TODO check if ranges overlap and prevent update
mbp.setEnabled((Boolean) aValue);
break;
default:
throw new IllegalArgumentException("column out of range: " + columnIndex);
}
fireTableCellUpdated(rowIndex, columnIndex);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// all cells are editable
return true;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case COL_STARTADDRESS:
case COL_ENDADDRESS:
case COL_ACCESSTYPE:
return String.class;
case COL_ACTIVE:
return Boolean.class;
default:
throw new IllegalArgumentException("column out of range: " + columnIndex);
}
}
@Override
public String getColumnName(int column) {
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N
switch (column) {
case COL_STARTADDRESS:
return bundle.getString("MemoryBreakpointsDialog.strStartAddress.text");
case COL_ENDADDRESS:
return bundle.getString("MemoryBreakpointsDialog.strEndAddress.text");
case COL_ACCESSTYPE:
return bundle.getString("MemoryBreakpointsDialog.strAccess.text");
case COL_ACTIVE:
return bundle.getString("MemoryBreakpointsDialog.strActive.text");
default:
throw new IllegalArgumentException("column out of range: " + column);
}
}
@Override
public int getRowCount() {
return memoryBreakpoints.size();
}
@Override
public int getColumnCount() {
return COL_LAST;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
MemoryBreakpoint mbp = memoryBreakpoints.get(rowIndex);
switch (columnIndex) {
case COL_STARTADDRESS:
return String.format("0x%08X", mbp.getStartAddress());
case COL_ENDADDRESS:
return String.format("0x%08X", mbp.getEndAddress());
case COL_ACCESSTYPE:
switch (mbp.getAccess()) {
case READ:
return "READ";
case WRITE:
return "WRITE";
case READWRITE:
return "READWRITE";
default:
throw new IllegalArgumentException("unknown access type");
}
case COL_ACTIVE:
return (mbp.isEnabled()) ? Boolean.TRUE : Boolean.FALSE;
default:
throw new IllegalArgumentException("column out of range: " + columnIndex);
}
}
}
/**
* 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() {
btnAdd = new javax.swing.JButton();
btnRemove = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
jSeparator1 = new javax.swing.JSeparator();
jPanel1 = new javax.swing.JPanel();
cbTraceRead = new javax.swing.JCheckBox();
cbTraceWrite = new javax.swing.JCheckBox();
cbTraceRead8 = new javax.swing.JCheckBox();
cbTraceWrite8 = new javax.swing.JCheckBox();
cbTraceRead16 = new javax.swing.JCheckBox();
cbTraceWrite16 = new javax.swing.JCheckBox();
cbTraceRead32 = new javax.swing.JCheckBox();
cbTraceWrite32 = new javax.swing.JCheckBox();
chkPauseOnHit = new javax.swing.JCheckBox();
btnClose = new javax.swing.JButton();
btnExport = new javax.swing.JButton();
btnImport = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
tblBreakpoints = new javax.swing.JTable();
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N
setTitle(bundle.getString("MemoryBreakpointsDialog.title")); // NOI18N
setLocationByPlatform(true);
setName("dialog"); // NOI18N
btnAdd.setText(bundle.getString("MemoryBreakpointsDialog.btnAdd.text")); // NOI18N
btnAdd.setMaximumSize(new java.awt.Dimension(140, 25));
btnAdd.setMinimumSize(new java.awt.Dimension(140, 25));
btnAdd.setPreferredSize(new java.awt.Dimension(140, 25));
btnAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAddActionPerformed(evt);
}
});
btnRemove.setText(bundle.getString("MemoryBreakpointsDialog.btnRemove.text")); // NOI18N
btnRemove.setEnabled(false);
btnRemove.setMaximumSize(new java.awt.Dimension(140, 25));
btnRemove.setMinimumSize(new java.awt.Dimension(140, 25));
btnRemove.setPreferredSize(new java.awt.Dimension(140, 25));
btnRemove.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRemoveActionPerformed(evt);
}
});
jPanel1.setLayout(new java.awt.GridLayout(5, 2));
cbTraceRead.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceRead.text")); // NOI18N
cbTraceRead.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceReadItemStateChanged(evt);
}
});
jPanel1.add(cbTraceRead);
cbTraceWrite.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceWrite.text")); // NOI18N
cbTraceWrite.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceWriteItemStateChanged(evt);
}
});
jPanel1.add(cbTraceWrite);
cbTraceRead8.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceRead8.text")); // NOI18N
cbTraceRead8.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceRead8ItemStateChanged(evt);
}
});
jPanel1.add(cbTraceRead8);
cbTraceWrite8.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceWrite8.text")); // NOI18N
cbTraceWrite8.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceWrite8ItemStateChanged(evt);
}
});
jPanel1.add(cbTraceWrite8);
cbTraceRead16.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceRead16.text")); // NOI18N
cbTraceRead16.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceRead16ItemStateChanged(evt);
}
});
jPanel1.add(cbTraceRead16);
cbTraceWrite16.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceWrite16.text")); // NOI18N
cbTraceWrite16.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceWrite16ItemStateChanged(evt);
}
});
jPanel1.add(cbTraceWrite16);
cbTraceRead32.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceRead32.text")); // NOI18N
cbTraceRead32.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceRead32ItemStateChanged(evt);
}
});
jPanel1.add(cbTraceRead32);
cbTraceWrite32.setText(bundle.getString("MemoryBreakpointsDialog.cbTraceWrite32.text")); // NOI18N
cbTraceWrite32.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbTraceWrite32ItemStateChanged(evt);
}
});
jPanel1.add(cbTraceWrite32);
chkPauseOnHit.setSelected(((DebuggerMemory)Memory.getInstance()).pauseEmulatorOnMemoryBreakpoint);
chkPauseOnHit.setText(bundle.getString("MemoryBreakpointsDialog.chkPauseOnHit.text")); // NOI18N
chkPauseOnHit.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
chkPauseOnHitItemStateChanged(evt);
}
});
jPanel1.add(chkPauseOnHit);
btnClose.setText(bundle.getString("CloseButton.text")); // NOI18N
btnClose.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCloseActionPerformed(evt);
}
});
btnExport.setText(bundle.getString("MemoryBreakpointsDialog.btnExport.text")); // NOI18N
btnExport.setEnabled(false);
btnExport.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnExportActionPerformed(evt);
}
});
btnImport.setText(bundle.getString("MemoryBreakpointsDialog.btnImport.text")); // NOI18N
btnImport.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnImportActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSeparator1)
.addGroup(jPanel2Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(btnImport)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnExport)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnClose))
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 576, Short.MAX_VALUE)
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnExport)
.addComponent(btnClose)
.addComponent(btnImport))
.addGap(31, 31, 31))
);
tblBreakpoints.setFont(new java.awt.Font("Courier New", 0, 12)); // NOI18N
tblBreakpoints.setModel(memoryBreakpointsModel);
tblBreakpoints.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jScrollPane2.setViewportView(tblBreakpoints);
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)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(btnAdd, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnRemove, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 104, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnAdd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnRemove, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCloseActionPerformed
setVisible(false);
}//GEN-LAST:event_btnCloseActionPerformed
private void chkPauseOnHitItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkPauseOnHitItemStateChanged
((DebuggerMemory) Memory.getInstance()).pauseEmulatorOnMemoryBreakpoint = chkPauseOnHit.isSelected();
}//GEN-LAST:event_chkPauseOnHitItemStateChanged
private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddActionPerformed
MemoryBreakpoint mbp = new MemoryBreakpoint();
memoryBreakpoints.add(mbp);
memoryBreakpointsModel.fireTableRowsInserted(memoryBreakpoints.size() - 1, memoryBreakpoints.size() - 1);
}//GEN-LAST:event_btnAddActionPerformed
private void btnRemoveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveActionPerformed
int row = tblBreakpoints.getSelectedRow();
MemoryBreakpoint mbp = memoryBreakpoints.remove(row);
// make sure breakpoint is uninstalled after being removed
mbp.setEnabled(false);
memoryBreakpointsModel.fireTableRowsDeleted(row, row);
// after removal no item is selected - so disable the button once again
btnRemove.setEnabled(false);
}//GEN-LAST:event_btnRemoveActionPerformed
private void cbTraceReadItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceReadItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryRead = cbTraceRead.isSelected();
}//GEN-LAST:event_cbTraceReadItemStateChanged
private void cbTraceRead8ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceRead8ItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryRead8 = cbTraceRead8.isSelected();
}//GEN-LAST:event_cbTraceRead8ItemStateChanged
private void cbTraceRead16ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceRead16ItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryRead16 = cbTraceRead16.isSelected();
}//GEN-LAST:event_cbTraceRead16ItemStateChanged
private void cbTraceRead32ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceRead32ItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryRead32 = cbTraceRead32.isSelected();
}//GEN-LAST:event_cbTraceRead32ItemStateChanged
private void cbTraceWriteItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceWriteItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryWrite = cbTraceWrite.isSelected();
}//GEN-LAST:event_cbTraceWriteItemStateChanged
private void cbTraceWrite8ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceWrite8ItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryWrite8 = cbTraceWrite8.isSelected();
}//GEN-LAST:event_cbTraceWrite8ItemStateChanged
private void cbTraceWrite16ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceWrite16ItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryWrite16 = cbTraceWrite16.isSelected();
}//GEN-LAST:event_cbTraceWrite16ItemStateChanged
private void cbTraceWrite32ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbTraceWrite32ItemStateChanged
((DebuggerMemory) Memory.getInstance()).traceMemoryWrite32 = cbTraceWrite32.isSelected();
}//GEN-LAST:event_cbTraceWrite32ItemStateChanged
private void btnExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExportActionPerformed
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp");
final JFileChooser fc = new JFileChooser();
fc.setDialogTitle(bundle.getString("MemoryBreakpointsDialog.dlgExport.title"));
fc.setSelectedFile(new File(State.discId + ".mbrk"));
fc.setCurrentDirectory(new java.io.File("."));
fc.addChoosableFileFilter(Constants.fltMemoryBreakpointFiles);
fc.setFileFilter(Constants.fltMemoryBreakpointFiles);
if (fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
File f = fc.getSelectedFile();
if (f.exists()) {
int rc = JOptionPane.showConfirmDialog(
this,
bundle.getString("ConsoleWindow.strFileExists.text"),
bundle.getString("ConsoleWindow.strFileExistsTitle.text"),
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (rc != JOptionPane.YES_OPTION) {
return;
}
}
((DebuggerMemory) Memory.getInstance()).exportBreakpoints(fc.getSelectedFile());
}
}//GEN-LAST:event_btnExportActionPerformed
private void btnImportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnImportActionPerformed
final JFileChooser fc = new JFileChooser();
fc.setDialogTitle(java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp").getString("MemoryBreakpointsDialog.dlgImport.title"));
fc.setSelectedFile(new File(State.discId + ".mbrk"));
fc.setCurrentDirectory(new java.io.File("."));
fc.addChoosableFileFilter(Constants.fltMemoryBreakpointFiles);
fc.setFileFilter(Constants.fltMemoryBreakpointFiles);
if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
((DebuggerMemory) Memory.getInstance()).importBreakpoints(fc.getSelectedFile());
}
memoryBreakpointsModel.fireTableDataChanged();
updateTraceSettings();
}//GEN-LAST:event_btnImportActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnAdd;
private javax.swing.JButton btnClose;
private javax.swing.JButton btnExport;
private javax.swing.JButton btnImport;
private javax.swing.JButton btnRemove;
private javax.swing.JCheckBox cbTraceRead;
private javax.swing.JCheckBox cbTraceRead16;
private javax.swing.JCheckBox cbTraceRead32;
private javax.swing.JCheckBox cbTraceRead8;
private javax.swing.JCheckBox cbTraceWrite;
private javax.swing.JCheckBox cbTraceWrite16;
private javax.swing.JCheckBox cbTraceWrite32;
private javax.swing.JCheckBox cbTraceWrite8;
private javax.swing.JCheckBox chkPauseOnHit;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JTable tblBreakpoints;
// End of variables declaration//GEN-END:variables
}